Nom du fichier : Sans nom
<?php
class TaskChatPage
{
private $controllerObj;
private $controllerType;
private $taskDetails;
private $msgList;
private $chatTasksData;
private $TasksData;
private $taskId;
private $sessionId;
private $sessionTache;
public function __construct($controllerObj, $controllerType, $sessionId, $sessionTache)
{
$this->controllerObj = $controllerObj;
$this->controllerType = $controllerType;
$this->sessionId = $sessionId;
$this->sessionTache = $sessionTache;
$this->msgList = $this->fetchMessageList($this->sessionTache);
$this->TasksData = $this->fetchTasksData();
$this->chatTasksData = $this->fetchTasksChatData();
}
public function fetchTaskDetails($taskID)
{
$this->taskId = htmlspecialchars($taskID);
$this->taskDetails = $this->taskId ? $this->controllerObj->with_tache($this->taskId) ?? [] : null;
}
private function fetchMessageList($sessionTache)
{
if ($_SESSION['Users_types'] == SUPERADMIN_USERSTYPE) {
return $this->controllerObj->Tache_chat_all();
} else {
// Pour les autres utilisateurs, récupérez les chats par référence de tâche
$result = $this->controllerObj->getChatsParReferencesTaches($sessionTache);
// Vérifiez si le résultat est valide
if ($result !== false) {
return $result; // Retourne le résultat si valide
} else {
// Retourne un tableau vide si le résultat est faux
return []; // Ou une autre gestion d'erreur appropriée
}
}
}
private function fetchTasksChatData()
{
if ($_SESSION['Users_types'] == SUPERADMIN_USERSTYPE) {
$taches_chat = $this->controllerObj->Tache_chat_all();
} else {
$result = $this->controllerObj->getChatsParReferencesTaches($this->sessionTache);
if ($result !== false) {
$taches_chat = $result;
} else {
$taches_chat = []; // Ou une autre gestion d'erreur appropriée
}
}
$chatTasksData = [];
foreach ($taches_chat as $row) {
$tache = $this->controllerObj->with_taches_nom($row['Id_tache_a_faire']) ?? [];
$user = $this->controllerObj->Select_One_user($row["Id_users"])[0] ?? [];
$attachment = $this->controllerObj->one_Tache_chat_Attachment($row['Code_attachement'] ?? null);
$chatTasksData[] = [
'id' => $row['Id'],
'id_tache_a_faire' => $row['Id_tache_a_faire'],
'title' => $tache['Designation'] ?? 'Titre non disponible',
'Id_users' => $row['Id_users'] ?? 'user non disponible',
'Message' => $row['Message'] ?? 'Message non disponible',
'Sending_Date' => $this->controllerObj->wkDateTimeFormat($row['Sending_Date']) ?? 'Sending_Date non disponible',
'user' => ($user['Prenom'] ?? 'N/A') . " " . ($user['Nom'] ?? 'N/A'),
'attachment' => $attachment['Destination'] ?? 'N/A',
];
}
return $chatTasksData;
}
private function fetchTasksData()
{
if ($_SESSION['Users_types'] == SUPERADMIN_USERSTYPE) {
$taches = $this->controllerObj->tache_a_faire_all();
} else {
$result = $this->controllerObj->getTachesParReferences($this->sessionTache);
if ($result !== false) {
$taches = $result;
} else {
$taches = []; // Ou une autre gestion d'erreur appropriée
}
}
$TasksData = [];
foreach ($taches as $row) {
$tache = $this->controllerObj->with_taches_nom($row['Id_tache']) ?? [];
$Admin_user = $this->controllerObj->getUserById($row["Id_admin"]) ?? [];
$Service = $this->controllerObj->reference_service($row['Id_service']) ?? [];
$enteprise = $this->controllerObj->one_entreprise($row['Id_entreprise']) ?? [];
$contrat = $this->controllerObj->reference_contrat($row['Reference_contrat']) ?? [];
$livrable = $this->controllerObj->reference_livrable($row["Reference_livrable"]) ?? [];
$TasksData[] = [
'id' => $row['Id'],
'reference' => $row['Reference'],
'title' => $tache['Designation'] ?? 'Titre non disponible',
'id_livrable' => $row["Reference_livrable"],
'livrable' => $livrable["Nom_livrable"] ?? "Livrable non définie",
'admin' => ($Admin_user['Prenom'] ?? 'N/A') . " " . ($Admin_user['Nom'] ?? 'N/A'),
'contrat' => $contrat['Designation'] ?? 'N/A',
'service' => $Service["Designation"] ?? 'N/A',
'id_entreprise' => $row['Id_entreprise'],
'entreprise' => $enteprise["Denomination_sociale"] ?? 'N/A',
'start' => date("Y-m-d", strtotime($row['Date_de_fin'] ?? date("Y-m-d"))),
'end' => date("Y-m-d", strtotime($row['Date_de_fin'] ?? date("Y-m-d"))),
'url' => '?controller=Admin&task=tache_report&IdF=' . $row['Id'] . '&IdT=' . $row['Id_tache']
];
}
return $TasksData;
}
private function generateHead()
{
return <<<HTML
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Modern Messaging Interface</title>
<link rel="stylesheet" href="views/common/css/Taches_chat_detail.css">
<link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js" defer></script>
<style>
.selected {
background-color: #e0f7fa;
color: #007bff;
}
</style>
</head>
HTML;
}
// Function to generate the page header
private function generateHeader()
{
$dashboard = Dashboard;
$MESSAGERIE = MESSAGERIE;
return <<<HTML
<div class="page-header">
<div class="breadcrumb-nav">
<i class="fas fa-home"></i>
<a href="index.php?controller=Admin&task=dashboard">{$dashboard}</a>
<i class="fas fa-chevron-right"></i>
<span class="active" style="color: var(--bg-sidebar);">
<i class="fa-solid fa-envelope me-2"></i>
{$MESSAGERIE}
</span>
</div>
</div>
HTML;
}
// Function to generate the sidebar
private function generateSidebar()
{
$messages = [];
if (!empty($this->msgList) && is_array($this->msgList)) {
foreach ($this->msgList as $tmp) {
$messages[] = $tmp;
}
} else {
// Handle the case where $msgReq is not valid
$No_messages_available = No_messages_available;
error_log("Invalid result set provided to generateSidebar.");
return <<<HTML
<div class="w-2/5 border-r p-4 sidebar" :class="{ 'hidden': !isSidebarOpen }">
<div class="mb-4 flex items-center space-x-2 shadow-md rounded-b-lg">
<div class="text-lg font-bold text-center flex-1">INBOX</div>
<div class="search-container w-1/2">
<input type="text" placeholder="Search messages..." class="w-full p-2 border rounded">
</div>
</div>
<div class="space-y-2 overflow-y-auto max-h-150 shadow-md rounded-b-lg" id="taskList">
<div class="p-2 text-red-500">$No_messages_available</div>
</div>
</div>
HTML;
}
// Sort messages by date (newest first)
usort($messages, function ($a, $b) {
return strtotime($b['Sending_Date']) - strtotime($a['Sending_Date']);
});
// Group messages by task and company
$groupedTasks = [];
foreach ($messages as $msgList) {
$taskToDoId = $msgList["Id_tache_a_faire"];
$companyId = $msgList["Id_entreprise"];
$key = $taskToDoId . '_' . $companyId;
if (!isset($groupedTasks[$key])) {
$groupedTasks[$key] = $msgList;
}
}
// Generate sidebar content
$sidebarContent = '';
foreach ($groupedTasks as $msgList) {
$gettaskDetails = $this->controllerObj->with_tache_a_faire($msgList["Id_tache_a_faire"]) ?? [];
$taskDetails = null;
if (!empty($gettaskDetails) && !empty($gettaskDetails['Id_tache'])) {
$result = $this->controllerObj->with_taches_nom($gettaskDetails['Id_tache']);
$taskDetails = $result ? $result ?? [] : null;
}
$designation = isset($taskDetails["Designation"]) ? htmlspecialchars($taskDetails["Designation"]) : "Tâche non définie";
$sendingDate = isset($msgList['Sending_Date']) ? $this->controllerObj->wkDateTimeFormat($msgList['Sending_Date']) : "Date inconnue";
$taskToDoId = htmlspecialchars($msgList["Id_tache_a_faire"]);
$companyId = htmlspecialchars($msgList["Id_entreprise"]);
$sidebarContent .= <<<HTML
<div class="p-2 hover:bg-gray-100 rounded shadow-md rounded-b-lg cursor-pointer task-item" data-task-id="{$taskToDoId}" data-company-id="{$companyId}">
<div class="flex justify-between items-center">
<h6 class="truncate flex-1">$designation</h6>
<h6 class="font-semibold whitespace-nowrap ml-2">$sendingDate</h6>
</div>
</div>
HTML;
}
return <<<HTML
<div class="w-2/5 border-r p-4 sidebar" :class="{ 'hidden': !isSidebarOpen }">
<div class="mb-4 flex items-center shadow-md rounded-b-lg">
<div class="search-container w-full">
<input type="text" id="messageSearch" placeholder="Search messages..." class="w-full p-3 border rounded text-lg" >
</div>
</div>
<div class="space-y-2 shadow-md rounded-b-lg sidebar" id="taskList" style="max-height: 480px; overflow-y: auto; margin-bottom:10px; background: linear-gradient(180deg, var(--primary-color), var(--primary-dark)); padding: 1rem;">
$sidebarContent
</div>
</div>
HTML;
}
private function generateMessageInput(): string
{
return <<<HTML
<div class="new-message bg-light p-3 border-top position-relative">
<div id="emoji-picker" class="emoji-picker"></div>
<form action="" method="POST" enctype="multipart/form-data" class="d-flex align-items-stretch">
<input type="hidden" name="Id_tache_a_faire" value="" id="tache_id">
<input type="hidden" name="Id_entreprise" value="" id="tache_id_entreprise">
<div class="textarea-content flex-grow-1 me-3">
<textarea name="Message" id="messageIcon" class="form-control" rows="6" maxlength="5000"
placeholder="{$this->controllerObj->escapeHtml(WRITE_MESSAGE)}" required></textarea>
</div>
<div class="button-group d-flex flex-column justify-content-between">
<div class="file-upload mb-2">
<label for="attachments" class="btn btn-outline-secondary btn-sm">
<i class="fa-solid fa-paperclip"></i>
<span id="file-name">{$this->controllerObj->escapeHtml(ATTACH_FILE)}</span>
<input type="file" id="attachments" name="myfile" style="display:none;" onchange="displayFileName()">
</label>
</div>
<button type="submit" name="send_message" class="btn btn-primary align-self-end">
{$this->controllerObj->escapeHtml(SEND_MESSAGE)}
</button>
</div>
</form>
</div>
HTML;
}
private function generate_select_options($data, $selectedValue, $displayName, $valueName)
{
$options = "<option value=''>Choose</option>";
foreach ($data as $item) {
$selected = ($item[$valueName] == $selectedValue) ? 'selected' : '';
$displayText = htmlspecialchars($item[$displayName], ENT_QUOTES, 'UTF-8');
$options .= "<option value='{$item[$valueName]}' {$selected}>{$displayText}</option>";
}
return $options;
}
public function handleFormSubmission()
{
if (isset($_POST["action"]) && $_POST["action"] == "supprimerMessageSeul") {
$messageId = $_POST["messageId"];
// Vous devez créer cette méthode dans votre contrôleur
$this->controllerObj->supprimerMessage($messageId);
header('Location: ' . $_SERVER['REQUEST_URI']);
exit();
}
if (isset($_POST["Envoyer"])) {
$taskToDoId = $_POST["Id_tache_a_faire"] ?? $this->taskDetails["Id"];
$companyId = $_POST["Id_entreprise"] ?? null;
$message = $_POST["Message"] ?? null;
$gettaskDetails = $this->controllerObj->with_tache_a_faire($taskToDoId) ?? [];
$error = $this->controllerObj->add_tache_chat($companyId, $taskToDoId, $message, $gettaskDetails['Reference']);
header('Location: index.php?controller=' . $this->controllerType . '&task=tache_report');
exit();
}
if (isset($_POST["send_message"])) {
$taskToDoId = $_POST["Id_tache_a_faire"] ?? $this->taskDetails["Id"];
$companyId = $_POST["Id_entreprise"] ?? null;
$message = $_POST["Message"] ?? null;
$gettaskDetails = $this->controllerObj->with_tache_a_faire($taskToDoId) ?? [];
$error = $this->controllerObj->add_tache_chat($companyId, $taskToDoId, $message, $gettaskDetails['Reference']);
header("Refresh: 0");
//header('Refresh: 0; url=index.php?controller=' . $this->controllerType . '&task=tache_report');
// exit();
}
if (isset($_POST["download"])) {
$this->controllerObj->download_attachement();
header("Refresh: 0");
exit();
}
}
public function rendertemplate()
{
$this->handleFormSubmission();
$pageHead = $this->generateHead();
$headerContent = $this->generateHeader();
$sidebarContent = $this->generateSidebar();
// Générer le modal
$modalContent = $this->generateMyModal($this->controllerObj);
echo $pageHead;
?>
<!DOCTYPE html>
<html>
<body class="bg-gray-100">
<div class="w-full p-4" x-data="{ isSidebarOpen: true }">
<?php echo $headerContent; ?>
<div class="flex mt-4 bg-white" style="height: 82vh;">
<?php echo $sidebarContent; ?>
<div class="main-content">
<div class="header flex items-center w-full shadow-md rounded-b-lg " id="message-header"></div>
<div id="message-container" class="flex-1 overflow-y-auto space-y-4 p-4" style="max-height: 70vh;"></div>
<?php echo $this->generateMessageInput(); ?>
</div>
</div>
</div>
<!-- Intégrer le modal généré par PHP -->
<?php echo $modalContent; ?>
<!-- Pass PHP variables to JavaScript -->
<script>
// Pass data to JavaScript
const tasksData = <?= json_encode($this->chatTasksData) ?>;
const tasksFaire = <?= json_encode($this->TasksData) ?>;
const SESSION_USER_ID = <?= json_encode($this->sessionId) ?>;
</script>
<!-- Inclure le fichier JS externe -->
<script src="<?= VIEWS_COMMON ?>/js/Taches_chat_detail.js" defer></script>
</body>
</html>
<?php
}
public function generateMyModal($controllerObj)
{
ob_start();
?>
<div class="modal fade" id="myModal" tabindex="-1" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header text-center" style="background-color: var(--bg-sidebar);">
<h5 class="modal-title" id="myModalLabel"><?= Add_Messages ?></h5>
<button type="button" class="btn-close bg-white" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<form action="#" method="POST">
<?php
$Id_tache_a_faire = isset($_GET["IdT"]) && is_numeric($_GET["IdT"])
? (int) $_GET["IdT"]
: null;
$Id_entreprise = isset($_GET["Id_entreprise"])
? htmlspecialchars($_GET["Id_entreprise"])
: null;
$taches = $Id_tache_a_faire !== null
? $controllerObj->with_tache($Id_tache_a_faire)
: [];
$nomtaches = null;
// Vérifie que "Id_tache" existe et est numérique
if (!empty($taches) && isset($taches['Id_tache']) && is_numeric($taches['Id_tache'])) {
$detailsNom = $controllerObj->with_taches_nom((int)$taches['Id_tache']);
$nomtaches = $detailsNom['Designation'] ?? null;
}
?>
<input type="hidden" name="Id_tache_a_faire" value="<?= $Id_tache_a_faire ?? '' ?>">
<input type="hidden" name="Id_entreprise" value="<?= $Id_entreprise ?? '' ?>">
<div class="w-full">
<label for="depone" class="form-label text-sm font-medium text-gray-700"> <?= Objet ?></label>
<input type="text" class="form-control mt-1 block w-full p-3 rounded-lg border border-gray-300 focus:ring-2 focus:ring-blue-500" name="" id="depone_objet" readonly value="<?= isset($nomtaches) ? htmlspecialchars($nomtaches, ENT_QUOTES, 'UTF-8') : ''; ?>">
</div>
<div class="mt-4">
<label for="Description" class="form-label text-sm font-medium text-gray-700"><?= MESSAGE ?></label>
<textarea name="Message" id="Description" class="form-control mt-1 block w-full p-3 rounded-lg border border-gray-300 focus:ring-2 focus:ring-blue-500" rows="5" required></textarea>
</div>
</div>
<div class="modal-footer bg-gray-100 rounded-b-lg">
<button type="submit" name="Envoyer" class="btn btn-success"> <?= Send ?></button>
</div>
</form>
</div>
</div>
</div>
<?php
return ob_get_clean();
}
}
?>