diff --git a/apps/maarch_entreprise/documents_list_copies.php b/apps/maarch_entreprise/documents_list_copies.php index e1876a6a3aa7c74dad02019671b390fcac37b39c..3c5509406a5f9f7838251e42250a8ee5e7c58400 100755 --- a/apps/maarch_entreprise/documents_list_copies.php +++ b/apps/maarch_entreprise/documents_list_copies.php @@ -562,8 +562,12 @@ if (!empty($tab)) { $arrayPDO = array($return_stmt->item_id); $stmt2 = $db->query($query, $arrayPDO); $return_stmt = $stmt2->fetch(PDO::FETCH_ASSOC); - $formattedContact = \SrcCore\controllers\AutoCompleteController::getFormattedContact(['contact' => $return_stmt]); - $tab[$i][$j]['value'] = $formattedContact['contact']['contact']; + if ($return_stmt == false) { + $tab[$i][$j]['value'] = ''; + } else { + $formattedContact = \SrcCore\controllers\AutoCompleteController::getFormattedContact(['contact' => $return_stmt]); + $tab[$i][$j]['value'] = $formattedContact['contact']['contact']; + } } elseif ($return_stmt->type == 'entity') { $query = 'SELECT short_label FROM entities WHERE id = ?'; $arrayPDO = array($return_stmt->item_id); diff --git a/apps/maarch_entreprise/documents_list_with_attachments.php b/apps/maarch_entreprise/documents_list_with_attachments.php index fd4f5ccf1313b9f7fca72f04e64a8022efcf768a..ddeadb96e013717dfe2f3eebecdaaf0b083447d2 100755 --- a/apps/maarch_entreprise/documents_list_with_attachments.php +++ b/apps/maarch_entreprise/documents_list_with_attachments.php @@ -554,8 +554,12 @@ for ($i = 0; $i < $tabI; ++$i) { $arrayPDO = array($return_stmt->item_id); $stmt2 = $db->query($query, $arrayPDO); $return_stmt = $stmt2->fetch(PDO::FETCH_ASSOC); - $formattedContact = \SrcCore\controllers\AutoCompleteController::getFormattedContact(['contact' => $return_stmt]); - $tab[$i][$j]['value'] = $formattedContact['contact']['contact']; + if ($return_stmt == false) { + $tab[$i][$j]['value'] = ''; + } else { + $formattedContact = \SrcCore\controllers\AutoCompleteController::getFormattedContact(['contact' => $return_stmt]); + $tab[$i][$j]['value'] = $formattedContact['contact']['contact']; + } } else if ($return_stmt->type == 'entity') { $query = 'SELECT short_label FROM entities WHERE id = ?'; $arrayPDO = array($return_stmt->item_id); diff --git a/apps/maarch_entreprise/indexing_searching/details.php b/apps/maarch_entreprise/indexing_searching/details.php index 82ab4510f2eb1974cc63a22c9b3a1f86d77e50a6..7370deb938b46e19be4bb6ef07925b971ddac6a6 100755 --- a/apps/maarch_entreprise/indexing_searching/details.php +++ b/apps/maarch_entreprise/indexing_searching/details.php @@ -795,7 +795,9 @@ if ($stmt->rowCount() == 0) { $rate = []; if (!empty($sr['type']) && $sr['type'] == 'contact') { $contactData = \Contact\models\ContactModel::getOnView(['select' => ['*'], 'where' => ['ca_id = ?'], 'data' => [$sr['item_id']]]); - $rate = \Contact\controllers\ContactController::getFillingRate(['contact' => (array)$contactData[0]]); + if(!empty($contactData[0])) { + $rate = \Contact\controllers\ContactController::getFillingRate(['contact' => (array)$contactData[0]]); + } } if (empty($disabledAttr)) { echo '<i id="sender_recipient_icon_contactsUsers" class="fa fa-user" onclick="switchAutoCompleteType(\'sender_recipient\',\'contactsUsers\', false);" style="color:#135F7F;display: inline-block;cursor:pointer;" title="'._CONTACTS_USERS_LIST.'" ></i> <i id="sender_recipient_icon_entities" class="fa fa-sitemap" onclick="switchAutoCompleteType(\'sender_recipient\',\'entities\');" style="display: inline-block;cursor:pointer;" title="'._ENTITIES_LIST.'" ></i>'; diff --git a/apps/maarch_entreprise/indexing_searching/documents_list_mlb_search_adv.php b/apps/maarch_entreprise/indexing_searching/documents_list_mlb_search_adv.php index 7f23683f8f75fd43fa9dbe738ac5c140e2317900..0f9e3ef821d6760e5ff92d332e15fdeaa6c59141 100755 --- a/apps/maarch_entreprise/indexing_searching/documents_list_mlb_search_adv.php +++ b/apps/maarch_entreprise/indexing_searching/documents_list_mlb_search_adv.php @@ -795,8 +795,13 @@ if ($mode == 'normal') { $arrayPDO = array($return_stmt->item_id); $stmt2 = $db->query($query, $arrayPDO); $return_stmt = $stmt2->fetch(PDO::FETCH_ASSOC); - $formattedContact = \SrcCore\controllers\AutoCompleteController::getFormattedContact(['contact' => $return_stmt]); - $tab[$i][$j]['value'] = $formattedContact['contact']['contact']; + if ($return_stmt == false) { + $tab[$i][$j]['value'] = ''; + } else { + $formattedContact = \SrcCore\controllers\AutoCompleteController::getFormattedContact(['contact' => $return_stmt]); + $tab[$i][$j]['value'] = $formattedContact['contact']['contact']; + } + } else if ($return_stmt->type == 'entity') { $query = 'SELECT short_label FROM entities WHERE id = ?'; $arrayPDO = array($return_stmt->item_id); diff --git a/install/class/Class_Install.php b/install/class/Class_Install.php index b4e7230bac25cd57c4d2767f392093f28207a481..1270aa2ef98a5114d48430a9dc81328b96447a3e 100755 --- a/install/class/Class_Install.php +++ b/install/class/Class_Install.php @@ -1104,12 +1104,12 @@ class Install extends functions //$ipconfig = shell_exec($path); //$ipconfig = trim($ipconfig); //$chemin = $ipconfig . dirname($_SERVER['PHP_SELF'] .'cs_'.$_SESSION['config']['databasename']); - if ($_SERVER['REMOTE_ADDR'] == '::1') { - $REMOTE_ADDR = 'localhost'; + if ($_SERVER['SERVER_ADDR'] == '::1') { + $SERVER_ADDR = 'localhost'; } else { - $REMOTE_ADDR = $_SERVER['REMOTE_ADDR']; + $SERVER_ADDR = $_SERVER['SERVER_ADDR']; } - $chemin = $REMOTE_ADDR.dirname($_SERVER['PHP_SELF'].'cs_'.$_SESSION['config']['databasename']); + $chemin = $SERVER_ADDR.dirname($_SERVER['PHP_SELF'].'cs_'.$_SESSION['config']['databasename']); $maarchUrl = rtrim($chemin, 'install'); $maarchUrl = $maarchUrl.'cs_'.$_SESSION['config']['databasename'].'/'; $CONFIG->MaarchUrl = $maarchUrl; @@ -1149,13 +1149,13 @@ class Install extends functions $chemin_core = realpath('.').'/core/'; - if ($_SERVER['REMOTE_ADDR'] == '::1') { - $REMOTE_ADDR = 'localhost'; + if ($_SERVER['SERVER_ADDR'] == '::1') { + $SERVER_ADDR = 'localhost'; } else { - $REMOTE_ADDR = $_SERVER['REMOTE_ADDR']; + $SERVER_ADDR = $_SERVER['SERVER_ADDR']; } $CONFIG->MaarchDirectory = realpath('.').'/'; - $chemin = $REMOTE_ADDR.dirname($_SERVER['PHP_SELF'].'cs_'.$_SESSION['config']['databasename']); + $chemin = $SERVER_ADDR.dirname($_SERVER['PHP_SELF'].'cs_'.$_SESSION['config']['databasename']); $maarchUrl = rtrim($chemin, 'install'); $maarchUrl = $maarchUrl.'cs_'.$_SESSION['config']['databasename'].'/'; $CONFIG->MaarchUrl = $maarchUrl; diff --git a/modules/avis/documents_list_with_avis.php b/modules/avis/documents_list_with_avis.php index 2e195d41d7e37d088b691b0dcb9e58c4841addde..bc33bd98913e0f1bbc773cc4d87d5685f3621c86 100755 --- a/modules/avis/documents_list_with_avis.php +++ b/modules/avis/documents_list_with_avis.php @@ -555,8 +555,12 @@ for ($i = 0; $i < $tabI; ++$i) { $arrayPDO = array($return_stmt->item_id); $stmt2 = $db->query($query, $arrayPDO); $return_stmt = $stmt2->fetch(PDO::FETCH_ASSOC); - $formattedContact = \SrcCore\controllers\AutoCompleteController::getFormattedContact(['contact' => $return_stmt]); - $tab[$i][$j]['value'] = $formattedContact['contact']['contact']; + if ($return_stmt == false) { + $tab[$i][$j]['value'] = ''; + } else { + $formattedContact = \SrcCore\controllers\AutoCompleteController::getFormattedContact(['contact' => $return_stmt]); + $tab[$i][$j]['value'] = $formattedContact['contact']['contact']; + } } else if ($return_stmt->type == 'entity') { $query = 'SELECT short_label FROM entities WHERE id = ?'; $arrayPDO = array($return_stmt->item_id); diff --git a/modules/basket/class/class_modules_tools_Abstract.php b/modules/basket/class/class_modules_tools_Abstract.php index 31d32c9dd31150e89c1e0859e32f6062b1f22dbf..99a20308631800c772e98f1b69dea9f7d6eba9c2 100755 --- a/modules/basket/class/class_modules_tools_Abstract.php +++ b/modules/basket/class/class_modules_tools_Abstract.php @@ -288,34 +288,16 @@ abstract class basket_Abstract extends Database public function load_basket_abs($userId) { - $db = new Database(); - $arr = array(); - $stmt = $db->query( - "select system_id, basket_id, user_abs from user_abs where new_user = ?", - array($userId) - ); - //$db->show(); - while ($res = $stmt->fetchObject()) { - $stmt2 = $db->query( - "select status from users" - . " where user_id = ?", - array($res->user_abs) - ); + $user = \User\models\UserModel::getByUserId(['userId' => $userId, 'select' => ['id']]); - $res2 = $stmt2->fetchObject(); + $redirectedBaskets = \Basket\models\RedirectBasketModel::get(['select' => ['id', 'basket_id', 'owner_user_id'], 'where' => ['actual_user_id = ?'], 'data' => [$user['id']]]); - if ($res2->status <> 'DEL') { - array_push( - $arr, - $this->get_abs_baskets_data( - $res->basket_id, - $userId, - $res->system_id - ) - ); - } + $return = []; + foreach ($redirectedBaskets as $redirectedBasket) { + $return[] = $this->get_abs_baskets_data($redirectedBasket['basket_id'], $userId, $redirectedBasket['id']); } - return $arr; + + return $return; } /** @@ -714,7 +696,6 @@ abstract class basket_Abstract extends Database $tab['basket_res_order'] = $this->show_string($res->basket_res_order); $tab['clause'] = $res->basket_clause; $tab['is_visible'] = $res->is_visible; - $isVirtual = 'N'; $basketOwner = ''; $absBasket = false; @@ -766,7 +747,6 @@ abstract class basket_Abstract extends Database ); $tab['abs_basket'] = $absBasket; - $tab['is_virtual'] = $isVirtual; $tab['basket_owner'] = $basketOwner; $tab['clause'] = $secCtrl->process_security_where_clause( $tab['clause'], @@ -794,97 +774,46 @@ abstract class basket_Abstract extends Database return $tab; } - /** - * Returns in an array all the data of a basket for a user - * (checks if the basket is a redirected one and then if already a virtual one) - * - * @param $basketId string Basket identifier - * @param $userId string User identifier - */ public function get_abs_baskets_data($basketId, $userId, $systemId) { - $tab = array(); + $tab = []; $db = new Database(); $sec = new security(); $secCtrl = new SecurityControler(); - $stmt = $db->query( - "select basket_id, coll_id, basket_name, basket_desc, basket_clause, is_visible" - . " from " . BASKET_TABLE . " where basket_id = ? and enabled = 'Y'", - array($basketId) - ); - $res = $stmt->fetchObject(); - $tab['id'] = $res->basket_id; - $tab['coll_id'] = $res->coll_id; + $basket = \Basket\models\BasketModel::getById(['select' => ['basket_id', 'coll_id', 'basket_name', 'basket_desc', 'basket_clause', 'is_visible'], 'id' => $basketId]); + + $tab['id'] = $basket['basket_id']; + $tab['coll_id'] = $basket['coll_id']; $tab['table'] = $sec->retrieve_table_from_coll($tab['coll_id']); $tab['view'] = $sec->retrieve_view_from_coll_id($tab['coll_id']); - $tab['desc'] = $res->basket_desc; - $tab['name'] = $res->basket_name; - $tab['clause'] = $res->basket_clause; - $tab['is_visible'] = $res->is_visible; - $stmt = $db->query( - "select user_abs, is_virtual, basket_owner from user_abs where basket_id = ? and new_user = ? and system_id = ?", - array($basketId,$userId,$systemId) - ); + $tab['desc'] = $basket['basket_desc']; + $tab['name'] = $basket['basket_name']; + $tab['clause'] = $basket['basket_clause']; + $tab['is_visible'] = $basket['is_visible']; - $absBasket = true; - $res = $stmt->fetchObject(); - $isVirtual = $res->is_virtual; - $basketOwner = $res->basket_owner; - $userAbs = $res->user_abs; + $redirectedBasket = \Basket\models\RedirectBasketModel::get(['select' => ['actual_user_id', 'owner_user_id', 'group_id'], 'where' => ['id = ?'], 'data' => [$systemId]]); - if (empty($basketOwner)) { - $basketOwner = $userAbs; - } - if ($isVirtual == 'N') { - $tmpUser = $userAbs; - $stmt = $db->query( - "select firstname, lastname from " . USERS_TABLE - . " where user_id = ? ", - array($userAbs) - ); - $res = $stmt->fetchObject(); - $nameUserAbs = $res->firstname . ' ' . $res->lastname; - $tab['name'] .= " (" . $nameUserAbs . ")"; - $tab['desc'] .= " (" . $nameUserAbs . ")"; - $tab['id'] .= "_" . $userAbs; - } else { - $tmpUser = $basketOwner; /// TO DO : test if basket_owner empty - $stmt = $db->query( - "select firstname, lastname from " . USERS_TABLE - ." where user_id = ?", - array($basketOwner) - ); - $res = $stmt->fetchObject(); - $nameBasketOwner = $res->firstname . ' ' . $res->lastname; - $tab['name'] .= " (" . $nameBasketOwner . ")"; - $tab['desc'] .= " (" . $nameBasketOwner . ")"; - $tab['id'] .= "_" . $basketOwner; - } + $absBasket = true; + $user = \User\models\UserModel::getById(['id' => $redirectedBasket[0]['owner_user_id'], 'select' => ['user_id']]); + $basketOwner = $user['user_id']; + $userAbs = $basketOwner; - /// TO DO : Test if tmp_user is empty - if ((isset($_SESSION['user']['UserId']) - && $tmpUser <> $_SESSION['user']['UserId']) - || (!isset($_SESSION['user']['UserId'])) - ) { - $stmt = $db->query( - "select group_id from usergroup_content where primary_group = 'Y' and user_id = ?", - array($tmpUser) - ); + $stmt = $db->query( + "select firstname, lastname from " . USERS_TABLE + . " where user_id = ? ", + array($userAbs) + ); + $res = $stmt->fetchObject(); + $nameUserAbs = $res->firstname . ' ' . $res->lastname; + $tab['name'] .= " (" . $nameUserAbs . ")"; + $tab['desc'] .= " (" . $nameUserAbs . ")"; + $tab['id'] .= "_" . $userAbs; - $groups = []; - while ($res = $stmt->fetchObject()) { - $groups[] = $res->group_id; - } - $stmt = $db->query("select result_page, group_id from groupbasket where group_id in (?) and basket_id = ?", array($groups, $basketId)); - $res = $stmt->fetchObject(); - $primaryGroup = $res->group_id; - } else { - $primaryGroup = $_SESSION['user']['primarygroup']; - $stmt = $db->query("select result_page from groupbasket where group_id = ? and basket_id = ?", array($primaryGroup,$basketId)); - $res = $stmt->fetchObject(); - } + $group = \Group\models\GroupModel::getById(['select' => ['group_id'], 'id' => $redirectedBasket[0]['group_id']]); + $stmt = $db->query("select result_page from groupbasket where group_id = ? and basket_id = ?", array($group['group_id'], $basketId)); + $res = $stmt->fetchObject(); $basketIdPage = $res->result_page; $tab['id_page'] = $basketIdPage; @@ -907,15 +836,14 @@ abstract class basket_Abstract extends Database // Gets actions of the basket $tab['default_action'] = $this->_getDefaultAction( $basketId, - $primaryGroup + $group['group_id'] ); $tab['actions'] = $this->_getActionsFromGroupbaket( $basketId, - $primaryGroup, + $group['group_id'], $userId ); - $tab['is_virtual'] = $isVirtual; $tab['basket_owner'] = $basketOwner; $tab['abs_basket'] = $absBasket; @@ -924,7 +852,9 @@ abstract class basket_Abstract extends Database $basketOwner ); $tab['clause'] = str_replace('where', '', $tab['clause']); - + $tab['group_id'] = $group['group_id']; + $tab['group_serial_id'] = $redirectedBasket[0]['group_id']; + $tab['lock_list'] = ''; $tab['lock_sublist'] = ''; diff --git a/modules/basket/lang/nl.php b/modules/basket/lang/nl.php index c6d0ab5ba726c20496f23bf7fbd2e877039abbb2..77e1d6511d057ba42c08ce9b7e2bcf0288e52d2c 100755 --- a/modules/basket/lang/nl.php +++ b/modules/basket/lang/nl.php @@ -465,9 +465,6 @@ if (!defined('_BASKETS_OWNER_MISSING')) { if (!defined('_FORM_ERROR')) { define('_FORM_ERROR', 'Fout in de overdracht van het formulier...'); } -if (!defined('_USER_ABS')) { - define('_USER_ABS', 'Gebruiker afwezig: omleiding reeds ingesteld.'); -} if (!defined('_ABS_LOG_OUT')) { define('_ABS_LOG_OUT', 'Indien u zich opnieuw verbindt, zal de afwezigheidmodus uitgeschakeld worden.'); } diff --git a/modules/basket/view_baskets.php b/modules/basket/view_baskets.php index 3011f01b3350333538759d2b08721d6dc65e518d..6f0ecbacc54d53ec11bd9aa9db81d3a986754e0a 100755 --- a/modules/basket/view_baskets.php +++ b/modules/basket/view_baskets.php @@ -215,17 +215,18 @@ if (count($_SESSION['user']['baskets']) > 0) { <select name="baskets" id="baskets" onchange="cleanSessionBasket('<?php echo $_SESSION['config']['businessappurl'];?>index.php?display=true&module=basket&page=cleanSessionBasket','ok');" class="listext_big" > <option value=""><?php echo _CHOOSE_BASKET;?></option> <?php - $redirectedBaskets = \Basket\models\BasketModel::getRedirectedBasketsByUserId(['userId' => $_SESSION['user']['UserId']]); + $user = \User\models\UserModel::getByUserId(['userId' => $_SESSION['user']['UserId'], 'select' => ['id']]); + $redirectedBaskets = \Basket\models\RedirectBasketModel::getRedirectedBasketsByUserId(['userId' => $user['id']]); for ($i = 0; $i < count($_SESSION['user']['baskets']); $i ++) { $redirectedTo = ""; foreach ($redirectedBaskets as $redirectBasketValue) { - if ($redirectBasketValue['basket_owner'] == $_SESSION['user']['UserId']) { - if ($redirectBasketValue['basket_id'] == $_SESSION['user']['baskets'][$i]['id']) { - $redirectedTo = $redirectBasketValue['user']; - } - } elseif ($_SESSION['user']['baskets'][$i]['id'] == $redirectBasketValue['basket_id'] . '_' . $redirectBasketValue['basket_owner']) { + if ($redirectBasketValue['basket_id'] == $_SESSION['user']['baskets'][$i]['id']) { $redirectedTo = $redirectBasketValue['user']; } +// if ($redirectBasketValue['basket_owner'] == $_SESSION['user']['UserId']) { +// } elseif ($_SESSION['user']['baskets'][$i]['id'] == $redirectBasketValue['basket_id'] . '_' . $redirectBasketValue['basket_owner']) { +// $redirectedTo = $redirectBasketValue['user']; +// } } if((($_SESSION['user']['baskets'][$i]['is_visible'] === 'Y' && $_SESSION['user']['baskets'][$i]['abs_basket'] == false) diff --git a/modules/notifications/batch/basket_event_stack.php b/modules/notifications/batch/basket_event_stack.php index 9831b55f4123c8a9d0619df3938e30223b7629ae..571688acc01a2a7cc06b5658828149f8c9607bba 100755 --- a/modules/notifications/batch/basket_event_stack.php +++ b/modules/notifications/batch/basket_event_stack.php @@ -72,9 +72,9 @@ while ($state != 'END') { if (empty($aRecipients)) { $aRecipients = '0=1'; } - $stmt3 = $db->query("SELECT usergroup_content.user_id,users.status FROM usergroup_content, users WHERE group_id = ? and users.status in ('OK','ABS') and usergroup_content.user_id=users.user_id and users.user_id in (?)", array($line2->group_id, $aRecipients)); + $stmt3 = $db->query("SELECT usergroup_content.user_id, users.id, users.status FROM usergroup_content, users WHERE group_id = ? and users.status in ('OK','ABS') and usergroup_content.user_id=users.user_id and users.user_id in (?)", array($line2->group_id, $aRecipients)); } else { - $stmt3 = $db->query("SELECT usergroup_content.user_id,users.status FROM usergroup_content, users WHERE group_id = ? and users.status in ('OK','ABS') and usergroup_content.user_id=users.user_id", array($line2->group_id)); + $stmt3 = $db->query("SELECT usergroup_content.user_id, users.id, users.status FROM usergroup_content, users WHERE group_id = ? and users.status in ('OK','ABS') and usergroup_content.user_id=users.user_id", array($line2->group_id)); } $baskets_notif = array(); @@ -86,13 +86,14 @@ while ($state != 'END') { $whereClause = $secCtrl->process_security_where_clause($line->basket_clause, $line3->user_id); $whereClause = $entities->process_where_clause($whereClause, $line3->user_id); $user_id = $line3->user_id; - $query = 'SELECT new_user FROM user_abs WHERE user_abs = ? AND basket_id = ?'; - $redirStmt = $db->query($query, array($line3->user_id,$line->basket_id)); + $group = \Group\models\GroupModel::getByGroupId(['select' => ['id'], 'groupId' => $line2->group_id]); + $query = 'SELECT actual_user_id FROM redirected_baskets WHERE owner_user_id = ? AND basket_id = ? AND group_id = ?'; + $redirStmt = $db->query($query, array($line3->id, $line->basket_id, $group['id'])); $queryResult = $redirStmt->fetchObject(); if ($queryResult) { - $abs_user = $queryResult; $real_user_id = $user_id; - $user_id = $abs_user->new_user; + $user = \User\models\UserModel::getById(['id' => $queryResult->actual_user_id, 'select' => ['user_id']]); + $user_id = $user['user_id']; } diff --git a/modules/notifications/batch/process_event_stack.php b/modules/notifications/batch/process_event_stack.php index 7078dcaccea38f42bd5a372e1889d6adaaf67e88..90c35ffb63b366e2c08a97b18e45d442f6a2a00e 100755 --- a/modules/notifications/batch/process_event_stack.php +++ b/modules/notifications/batch/process_event_stack.php @@ -123,25 +123,25 @@ while ($state != 'END') { continue; } - if ($recipient->status == 'ABS') { - $logger->write($user_id.' is absent, routing to replacent', 'INFO'); - unset($recipients[$i]); - $query = 'SELECT us.* FROM users us' - .' JOIN user_abs abs ON us.user_id = abs.new_user ' - ." WHERE abs.user_abs = ? AND us.enabled='Y'"; - $dbAbs = new Database(); - $stmt = $dbAbs->query($query, array($user_id)); - if ($stmt->rowCount() > 0) { - //$recipient = $dbAbs->fetchObject($user_id); - $recipient = $stmt->fetchObject(); - $user_id = $recipient->user_id; - $logger->write($user_id.' is the replacent', 'INFO'); - $recipients[] = $recipient; - } else { - $logger->write('No replacent found (probably disabled)', 'INFO'); - continue; - } - } +// if ($recipient->status == 'ABS') { +// $logger->write($user_id.' is absent, routing to replacent', 'INFO'); +// unset($recipients[$i]); +// $query = 'SELECT us.* FROM users us' +// .' JOIN user_abs abs ON us.user_id = abs.new_user ' +// ." WHERE abs.user_abs = ? AND us.enabled='Y'"; +// $dbAbs = new Database(); +// $stmt = $dbAbs->query($query, array($user_id)); +// if ($stmt->rowCount() > 0) { +// //$recipient = $dbAbs->fetchObject($user_id); +// $recipient = $stmt->fetchObject(); +// $user_id = $recipient->user_id; +// $logger->write($user_id.' is the replacent', 'INFO'); +// $recipients[] = $recipient; +// } else { +// $logger->write('No replacent found (probably disabled)', 'INFO'); +// continue; +// } +// } if (!isset($tmpNotifs[$user_id])) { $tmpNotifs[$user_id]['recipient'] = $recipient; } diff --git a/modules/sendmail/batch/scripts/sendmail.sh b/modules/sendmail/batch/scripts/sendmail.sh index c1105313494fb16ab95169804a24f6fd5f13b261..6dfa33f0adac0c1a9969dfb2b8aae5b7fc083878 100755 --- a/modules/sendmail/batch/scripts/sendmail.sh +++ b/modules/sendmail/batch/scripts/sendmail.sh @@ -2,4 +2,3 @@ cd /var/www/MaarchCourrier/modules/sendmail/batch/ emailsPath='/var/www/MaarchCourrier/modules/sendmail/batch/process_emails.php' php $emailsPath -c /var/www/MaarchCourrier/modules/sendmail/batch/config/config.xml - diff --git a/modules/visa/documents_list_with_signatory.php b/modules/visa/documents_list_with_signatory.php index cd086437703f9f4006ac26b94cb8f9a5c74414a9..6d824fff2dfb62586046c4552d88031d14634903 100755 --- a/modules/visa/documents_list_with_signatory.php +++ b/modules/visa/documents_list_with_signatory.php @@ -525,8 +525,12 @@ for ($i = 0; $i < $tabI; ++$i) { $arrayPDO = array($return_stmt->item_id); $stmt2 = $db->query($query, $arrayPDO); $return_stmt = $stmt2->fetch(PDO::FETCH_ASSOC); - $formattedContact = \SrcCore\controllers\AutoCompleteController::getFormattedContact(['contact' => $return_stmt]); - $tab[$i][$j]['value'] = $formattedContact['contact']['contact']; + if ($return_stmt == false) { + $tab[$i][$j]['value'] = ''; + } else { + $formattedContact = \SrcCore\controllers\AutoCompleteController::getFormattedContact(['contact' => $return_stmt]); + $tab[$i][$j]['value'] = $formattedContact['contact']['contact']; + } } else if ($return_stmt->type == 'entity') { $query = 'SELECT short_label FROM entities WHERE id = ?'; $arrayPDO = array($return_stmt->item_id); diff --git a/rest/index.php b/rest/index.php index 7cf279b7efc356c63d54d68f751da9dc4545000e..1dd7ed0624866445c4f09b65070516fbf2df2f97 100755 --- a/rest/index.php +++ b/rest/index.php @@ -304,7 +304,7 @@ $app->get('/users/{id}/signatures/{signatureId}/content', \User\controllers\User $app->put('/users/{id}/signatures/{signatureId}', \User\controllers\UserController::class . ':updateSignature'); $app->delete('/users/{id}/signatures/{signatureId}', \User\controllers\UserController::class . ':deleteSignature'); $app->post('/users/{id}/redirectedBaskets', \User\controllers\UserController::class . ':setRedirectedBaskets'); -$app->delete('/users/{id}/redirectedBaskets/{basketId}', \User\controllers\UserController::class . ':deleteRedirectedBaskets'); +$app->delete('/users/{id}/redirectedBaskets/{redirectBasketid}', \User\controllers\UserController::class . ':deleteRedirectedBasket'); $app->put('/users/{id}/baskets', \User\controllers\UserController::class . ':updateBasketsDisplay'); //VersionsUpdate diff --git a/sql/develop.sql b/sql/develop.sql index 1d785f837f14c1d50c0d76bfdcc23a7014387dcc..2d145ad52dddbb97d25e3166aad0683bf5536a9a 100755 --- a/sql/develop.sql +++ b/sql/develop.sql @@ -11,3 +11,31 @@ ALTER TABLE res_letterbox ADD COLUMN external_signatory_book_id integer; ALTER TABLE users DROP COLUMN IF EXISTS external_id; ALTER TABLE users ADD COLUMN external_id json DEFAULT '{}'; + +/* Redirected Baskets */ +DO $$ BEGIN + IF (SELECT count(TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'user_abs') = 1 THEN + DROP TABLE IF EXISTS redirected_baskets; + CREATE TABLE redirected_baskets + ( + id serial NOT NULL, + actual_user_id INTEGER NOT NULL, + owner_user_id INTEGER NOT NULL, + basket_id character varying(255) NOT NULL, + group_id INTEGER NOT NULL, + CONSTRAINT redirected_baskets_pkey PRIMARY KEY (id), + CONSTRAINT redirected_baskets_unique_key UNIQUE (owner_user_id, basket_id, group_id) + ) + WITH (OIDS=FALSE); + + INSERT INTO redirected_baskets (owner_user_id, actual_user_id, basket_id, group_id) SELECT users.id, us.id, user_abs.basket_id, usergroups.id FROM usergroups, usergroup_content, user_abs, groupbasket, users, users us + where usergroup_content.group_id = usergroups.group_id + and usergroup_content.user_id = user_abs.user_abs + and users.user_id = user_abs.user_abs + and us.user_id = user_abs.new_user + and groupbasket.group_id = usergroup_content.group_id + and groupbasket.basket_id = user_abs.basket_id; + +-- DROP TABLE IF EXISTS user_abs; + END IF; +END$$; diff --git a/sql/structure.sql b/sql/structure.sql index af5565deb0593b96f1ce076850b48b53fcd59a3b..62a75d74233b2908da0fba1bfafb14e054ac88da 100755 --- a/sql/structure.sql +++ b/sql/structure.sql @@ -381,27 +381,18 @@ CREATE TABLE groupbasket ) WITH (OIDS=FALSE); -CREATE SEQUENCE user_abs_seq - INCREMENT 1 - MINVALUE 1 - MAXVALUE 9223372036854775807 - START 1 - CACHE 1; - -CREATE TABLE user_abs +CREATE TABLE redirected_baskets ( - system_id bigint NOT NULL DEFAULT nextval('user_abs_seq'::regclass), - user_abs character varying(128) NOT NULL, - new_user character varying(128) NOT NULL, - basket_id character varying(255) NOT NULL, - basket_owner character varying(255), - is_virtual character(1) NOT NULL DEFAULT 'N'::bpchar, - group_id INTEGER, - CONSTRAINT user_abs_pkey PRIMARY KEY (system_id) +id serial NOT NULL, +actual_user_id INTEGER NOT NULL, +owner_user_id INTEGER NOT NULL, +basket_id character varying(255) NOT NULL, +group_id INTEGER NOT NULL, +CONSTRAINT redirected_baskets_pkey PRIMARY KEY (id), +CONSTRAINT redirected_baskets_unique_key UNIQUE (owner_user_id, basket_id, group_id) ) WITH (OIDS=FALSE); - -- modules/cases/sql/structure/cases.postgresql.sql CREATE SEQUENCE case_id_seq diff --git a/src/app/basket/models/BasketModelAbstract.php b/src/app/basket/models/BasketModelAbstract.php index 3c27a9d422d8661692bf52d30fa9ca5035988374..1f58c47a18bbc66aa0a12adc7fe9135b3e800a36 100755 --- a/src/app/basket/models/BasketModelAbstract.php +++ b/src/app/basket/models/BasketModelAbstract.php @@ -313,7 +313,7 @@ abstract class BasketModelAbstract return []; } - $where = PreparedClauseController::getPreparedClause(['clause' => $aBasket[0]['basket_clause'], 'userId' => $aArgs['userId']]); + $where = PreparedClauseController::getPreparedClause(['clause' => $aBasket[0]['basket_clause'], 'login' => $aArgs['userId']]); $aResList = ResModel::getOnView([ 'select' => $aArgs['select'], @@ -363,15 +363,13 @@ abstract class BasketModelAbstract foreach ($aBaskets as $key => $value) { unset($aBaskets[$key]['groupserialid']); $aBaskets[$key]['groupSerialId'] = $value['groupserialid']; - $aBaskets[$key]['is_virtual'] = 'N'; - $aBaskets[$key]['basket_owner'] = $aArgs['userId']; - $aBaskets2 = DatabaseModel::select([ - 'select' => ['new_user'], - 'table' => ['user_abs'], - 'where' => ['user_abs = ?', 'basket_id = ?'], - 'data' => [$aArgs['userId'], $value['basket_id']], + $aBaskets[$key]['owner_user_id'] = $user['id']; + $redirectedBasket = RedirectBasketModel::get([ + 'select' => ['actual_user_id'], + 'where' => ['owner_user_id = ?', 'basket_id = ?', 'group_id = ?'], + 'data' => [$user['id'], $value['basket_id'], $value['groupserialid']] ]); - $aBaskets[$key]['userToDisplay'] = UserModel::getLabelledUserById(['userId' => $aBaskets2[0]['new_user']]); + $aBaskets[$key]['userToDisplay'] = (empty($redirectedBasket[0]) ? null : UserModel::getLabelledUserById(['id' => $redirectedBasket[0]['actual_user_id']])); $aBaskets[$key]['enabled'] = true; $aBaskets[$key]['allowed'] = false; foreach ($userPrefs as $userPref) { @@ -381,106 +379,13 @@ abstract class BasketModelAbstract } } if (empty($aArgs['absenceUneeded'])) { - $aBaskets = array_merge($aBaskets, BasketModel::getAbsBasketsByUserId(['userId' => $aArgs['userId']])); + $aBaskets = array_merge($aBaskets, RedirectBasketModel::getAssignedBasketsByUserId(['userId' => $user['id']])); } } return $aBaskets; } - public static function getAbsBasketsByUserId(array $aArgs) - { - ValidatorModel::notEmpty($aArgs, ['userId']); - ValidatorModel::stringType($aArgs, ['userId']); - - $aBaskets = DatabaseModel::select([ - 'select' => ['ba.basket_id', 'ba.basket_name', 'ba.basket_desc', 'ba.basket_clause', 'ua.user_abs', 'ua.basket_owner', 'ua.is_virtual'], - 'table' => ['baskets ba, user_abs ua'], - 'where' => ['ua.new_user = ?', 'ua.basket_id = ba.basket_id'], - 'data' => [$aArgs['userId']], - 'order_by' => ['ba.basket_order, ba.basket_name'] - ]); - - foreach ($aBaskets as $key => $value) { - $aBaskets[$key]['userToDisplay'] = UserModel::getLabelledUserById(['userId' => $value['user_abs']]); - } - - return $aBaskets; - } - - public static function setRedirectedBaskets(array $aArgs) - { - ValidatorModel::notEmpty($aArgs, ['userAbs', 'newUser', 'basketId', 'basketOwner', 'isVirtual']); - ValidatorModel::stringType($aArgs, ['userAbs', 'newUser', 'basketId', 'basketOwner', 'isVirtual']); - - DatabaseModel::insert([ - 'table' => 'user_abs', - 'columnsValues' => [ - 'user_abs' => $aArgs['userAbs'], - 'new_user' => $aArgs['newUser'], - 'basket_id' => $aArgs['basketId'], - 'basket_owner' => $aArgs['basketOwner'], - 'is_virtual' => $aArgs['isVirtual'] - ] - ]); - - return true; - } - - public static function updateRedirectedBaskets(array $aArgs) - { - ValidatorModel::notEmpty($aArgs, ['userId', 'basketOwner', 'basketId', 'userAbs', 'newUser']); - ValidatorModel::stringType($aArgs, ['userId']); - - DatabaseModel::update([ - 'table' => 'user_abs', - 'set' => [ - 'new_user' => $aArgs['newUser'] - ], - 'where' => ['basket_id = ?', 'basket_owner = ?', 'user_abs = ?', 'new_user = ?'], - 'data' => [$aArgs['basketId'], $aArgs['basketOwner'], $aArgs['userAbs'], $aArgs['userId']] - ]); - - return true; - } - - public static function deleteBasketRedirection(array $aArgs) - { - ValidatorModel::notEmpty($aArgs, ['userId', 'basketId']); - ValidatorModel::stringType($aArgs, ['userId', 'basketId']); - - DatabaseModel::delete([ - 'table' => 'user_abs', - 'where' => ['(user_abs = ? OR basket_owner = ?)', 'basket_id = ?'], - 'data' => [$aArgs['userId'], $aArgs['userId'], $aArgs['basketId']] - ]); - - return true; - } - - public static function getRedirectedBasketsByUserId(array $aArgs) - { - ValidatorModel::notEmpty($aArgs, ['userId']); - ValidatorModel::stringType($aArgs, ['userId']); - - $aBaskets = DatabaseModel::select([ - 'select' => ['ba.basket_id', 'ba.basket_name', 'ua.new_user', 'ua.basket_owner'], - 'table' => ['baskets ba, user_abs ua'], - 'where' => ['ua.user_abs = ?', 'ua.basket_id = ba.basket_id'], - 'data' => [$aArgs['userId']], - 'order_by' => ['ua.system_id'] - ]); - - foreach ($aBaskets as $key => $value) { - $user = UserModel::getByUserId(['userId' => $value['new_user'], 'select' => ['firstname', 'lastname']]); - $aBaskets[$key]['userToDisplay'] = "{$user['firstname']} {$user['lastname']}"; - $aBaskets[$key]['userIdRedirection'] = $value['new_user']; - $aBaskets[$key]['user'] = "{$user['firstname']} {$user['lastname']}" ; - } - - return $aBaskets; - } - public static function getRegroupedBasketsByUserId(array $aArgs) { ValidatorModel::notEmpty($aArgs, ['userId']); @@ -592,11 +497,14 @@ abstract class BasketModelAbstract public static function getResourceNumberByClause(array $aArgs) { ValidatorModel::notEmpty($aArgs, ['userId', 'clause']); - ValidatorModel::stringType($aArgs, ['userId', 'clause']); + ValidatorModel::stringType($aArgs, ['clause']); + ValidatorModel::intVal($aArgs, ['userId']); + + $user = UserModel::getById(['id' => $aArgs['userId'], 'select' => ['user_id']]); $count = ResModel::getOnView([ 'select' => ['COUNT(1)'], - 'where' => [PreparedClauseController::getPreparedClause(['userId' => $aArgs['userId'], 'clause' => $aArgs['clause']])] + 'where' => [PreparedClauseController::getPreparedClause(['login' => $user['user_id'], 'clause' => $aArgs['clause']])] ]); if (empty($count[0]['count'])) { diff --git a/src/app/basket/models/RedirectBasketModel.php b/src/app/basket/models/RedirectBasketModel.php new file mode 100644 index 0000000000000000000000000000000000000000..2f2d02787ccb03bee691593a079f52fead07c4e1 --- /dev/null +++ b/src/app/basket/models/RedirectBasketModel.php @@ -0,0 +1,129 @@ +<?php + +/** +* Copyright Maarch since 2008 under licence GPLv3. +* See LICENCE.txt file at the root folder for more details. +* This file is part of Maarch software. +* +*/ + +/** +* @brief Redirect Basket Model Abstract +* @author dev@maarch.org +*/ + +namespace Basket\models; + +use SrcCore\models\ValidatorModel; +use SrcCore\models\DatabaseModel; +use User\models\UserModel; + +class RedirectBasketModel +{ + public static function get(array $aArgs = []) + { + ValidatorModel::arrayType($aArgs, ['select', 'where', 'data']); + + $redirectedBaskets = DatabaseModel::select([ + 'select' => empty($aArgs['select']) ? ['*'] : $aArgs['select'], + 'table' => ['redirected_baskets'], + 'where' => empty($aArgs['where']) ? [] : $aArgs['where'], + 'data' => empty($aArgs['data']) ? [] : $aArgs['data'], + ]); + + return $redirectedBaskets; + } + + public static function create(array $aArgs) + { + ValidatorModel::notEmpty($aArgs, ['actual_user_id', 'owner_user_id', 'basket_id', 'group_id']); + ValidatorModel::stringType($aArgs, ['basket_id']); + ValidatorModel::intVal($aArgs, ['actual_user_id', 'owner_user_id', 'group_id']); + + DatabaseModel::insert([ + 'table' => 'redirected_baskets', + 'columnsValues' => [ + 'actual_user_id' => $aArgs['actual_user_id'], + 'owner_user_id' => $aArgs['owner_user_id'], + 'basket_id' => $aArgs['basket_id'], + 'group_id' => $aArgs['group_id'] + ] + ]); + + return true; + } + + public static function update(array $aArgs) + { + ValidatorModel::notEmpty($aArgs, ['actual_user_id', 'owner_user_id', 'basket_id', 'group_id']); + ValidatorModel::stringType($aArgs, ['basket_id']); + ValidatorModel::intVal($aArgs, ['actual_user_id', 'owner_user_id', 'group_id']); + + DatabaseModel::update([ + 'table' => 'redirected_baskets', + 'set' => [ + 'actual_user_id' => $aArgs['actual_user_id'] + ], + 'where' => ['owner_user_id = ?', 'basket_id = ?', 'group_id = ?'], + 'data' => [$aArgs['owner_user_id'], $aArgs['basket_id'], $aArgs['group_id']] + ]); + + return true; + } + + public static function delete(array $aArgs) + { + ValidatorModel::notEmpty($aArgs, ['where', 'data']); + ValidatorModel::arrayType($aArgs, ['where', 'data']); + + DatabaseModel::delete([ + 'table' => 'redirected_baskets', + 'where' => $aArgs['where'], + 'data' => $aArgs['data'] + ]); + + return true; + } + + public static function getAssignedBasketsByUserId(array $aArgs) + { + ValidatorModel::notEmpty($aArgs, ['userId']); + ValidatorModel::intVal($aArgs, ['userId']); + + $aBaskets = DatabaseModel::select([ + 'select' => ['ba.basket_id', 'ba.basket_name', 'ba.basket_desc', 'ba.basket_clause', 'rb.owner_user_id', 'rb.group_id', 'rb.id'], + 'table' => ['baskets ba, redirected_baskets rb'], + 'where' => ['rb.actual_user_id = ?', 'rb.basket_id = ba.basket_id'], + 'data' => [$aArgs['userId']], + 'order_by' => ['ba.basket_order, ba.basket_name'] + ]); + + foreach ($aBaskets as $key => $value) { + $aBaskets[$key]['userToDisplay'] = UserModel::getLabelledUserById(['id' => $value['owner_user_id']]); + } + + return $aBaskets; + } + + public static function getRedirectedBasketsByUserId(array $aArgs) + { + ValidatorModel::notEmpty($aArgs, ['userId']); + ValidatorModel::intVal($aArgs, ['userId']); + + $aBaskets = DatabaseModel::select([ + 'select' => ['ba.basket_id', 'ba.basket_name', 'rb.actual_user_id', 'rb.id'], + 'table' => ['baskets ba, redirected_baskets rb'], + 'where' => ['rb.owner_user_id = ?', 'rb.basket_id = ba.basket_id'], + 'data' => [$aArgs['userId']], + 'order_by' => ['rb.id'] + ]); + + foreach ($aBaskets as $key => $value) { + $user = UserModel::getById(['id' => $value['actual_user_id'], 'select' => ['firstname', 'lastname']]); + $aBaskets[$key]['userToDisplay'] = "{$user['firstname']} {$user['lastname']}"; + $aBaskets[$key]['user'] = "{$user['firstname']} {$user['lastname']}" ; + } + + return $aBaskets; + } +} diff --git a/src/app/group/controllers/GroupController.php b/src/app/group/controllers/GroupController.php index 69f9815e009685e94709133f910e98f1a9bfaccc..f94897651b77b49760411ff1a8127388bb1c0980 100755 --- a/src/app/group/controllers/GroupController.php +++ b/src/app/group/controllers/GroupController.php @@ -214,7 +214,7 @@ class GroupController $groupsClause = ''; foreach ($groups as $key => $group) { if (!empty($group['where_clause'])) { - $groupClause = PreparedClauseController::getPreparedClause(['clause' => $group['where_clause'], 'userId' => $aArgs['userId']]); + $groupClause = PreparedClauseController::getPreparedClause(['clause' => $group['where_clause'], 'login' => $aArgs['userId']]); if ($key > 0) { $groupsClause .= ' or '; } diff --git a/src/app/home/controllers/HomeController.php b/src/app/home/controllers/HomeController.php index d7f69a9b6eb9782cf8b9cc3bd1ede4f7a46c58e0..a52dceb5679fc0da4bb0749185f3b5a808356b92 100755 --- a/src/app/home/controllers/HomeController.php +++ b/src/app/home/controllers/HomeController.php @@ -15,6 +15,8 @@ namespace Home\controllers; use Basket\models\BasketModel; +use Basket\models\RedirectBasketModel; +use Group\models\GroupModel; use Resource\models\ResModel; use Slim\Http\Request; use Slim\Http\Response; @@ -31,7 +33,7 @@ class HomeController $homeMessage = ParameterModel::getById(['select' => ['param_value_string'], 'id'=> 'homepage_message']); $homeMessage = trim($homeMessage['param_value_string']); - $redirectedBaskets = BasketModel::getRedirectedBasketsByUserId(['userId' => $GLOBALS['userId']]); + $redirectedBaskets = RedirectBasketModel::getRedirectedBasketsByUserId(['userId' => $user['id']]); $groups = UserModel::getGroupsByUserId(['userId' => $GLOBALS['userId']]); foreach ($groups as $group) { $baskets = BasketModel::getAvailableBasketsByGroupUser([ @@ -57,7 +59,7 @@ class HomeController } } - $baskets[$kBasket]['resourceNumber'] = BasketModel::getResourceNumberByClause(['userId' => $GLOBALS['userId'], 'clause' => $basket['basket_clause']]); + $baskets[$kBasket]['resourceNumber'] = BasketModel::getResourceNumberByClause(['userId' => $user['id'], 'clause' => $basket['basket_clause']]); unset($baskets[$kBasket]['pcolor'], $baskets[$kBasket]['basket_clause']); } @@ -72,10 +74,12 @@ class HomeController } } - $assignedBaskets = BasketModel::getAbsBasketsByUserId(['userId' => $GLOBALS['userId']]); + $assignedBaskets = RedirectBasketModel::getAssignedBasketsByUserId(['userId' => $user['id']]); foreach ($assignedBaskets as $key => $assignedBasket) { $basket = BasketModel::getById(['select' => ['basket_clause'], 'id' => $assignedBasket['basket_id']]); - $assignedBaskets[$key]['resourceNumber'] = BasketModel::getResourceNumberByClause(['userId' => $assignedBasket['user_abs'], 'clause' => $basket['basket_clause']]); + $assignedBaskets[$key]['resourceNumber'] = BasketModel::getResourceNumberByClause(['userId' => $assignedBasket['owner_user_id'], 'clause' => $basket['basket_clause']]); + $assignedBaskets[$key]['uselessGroupId'] = GroupModel::getById(['id' => $assignedBasket['group_id'], 'select' => ['group_id']])['group_id']; + $assignedBaskets[$key]['ownerLogin'] = UserModel::getById(['id' => $assignedBasket['owner_user_id'], 'select' => ['user_id']])['user_id']; } return $response->withJson([ diff --git a/src/app/resource/controllers/ResController.php b/src/app/resource/controllers/ResController.php index e563756fa0bdccdd7360594344fd52daafe6927f..d35aea0c8e6b8c76afc79d7c601fe448ad2f75cb 100755 --- a/src/app/resource/controllers/ResController.php +++ b/src/app/resource/controllers/ResController.php @@ -484,16 +484,15 @@ class ResController return $response->withStatus(400)->withJson(['errors' => 'Group is not linked to this basket']); } - $whereClause = PreparedClauseController::getPreparedClause(['clause' => $basket['basket_clause'], 'userId' => $GLOBALS['userId']]); - $resources = ResModel::getForList([ + $whereClause = PreparedClauseController::getPreparedClause(['clause' => $basket['basket_clause'], 'login' => $GLOBALS['userId']]); + $list = ResModel::getForList([ 'clause' => $whereClause, 'orderBy' => ["{$basket['basket_res_order']} DESC"], 'offset' => (int)$data['offset'], 'limit' => (int)$data['limit'], ]); - $count = empty($resources[0]['count']) ? 0 : $resources[0]['count']; - return $response->withJson(['resources' => $resources, 'count' => $count]); + return $response->withJson(['resources' => $list['resources'], 'count' => $list['count']]); } public function updateExternalInfos(Request $request, Response $response) @@ -556,7 +555,7 @@ class ResController $groupsClause = ''; foreach ($groups as $key => $group) { if (!empty($group['where_clause'])) { - $groupClause = PreparedClauseController::getPreparedClause(['clause' => $group['where_clause'], 'userId' => $aArgs['userId']]); + $groupClause = PreparedClauseController::getPreparedClause(['clause' => $group['where_clause'], 'login' => $aArgs['userId']]); if ($key > 0) { $groupsClause .= ' or '; } @@ -575,7 +574,8 @@ class ResController $basketsClause = ''; foreach ($baskets as $key => $basket) { if (!empty($basket['basket_clause'])) { - $basketClause = PreparedClauseController::getPreparedClause(['clause' => $basket['basket_clause'], 'userId' => $basket['basket_owner']]); + $user = UserModel::getById(['id' => $basket['owner_user_id'], 'select' => ['user_id']]); + $basketClause = PreparedClauseController::getPreparedClause(['clause' => $basket['basket_clause'], 'login' => $user['user_id']]); if ($key > 0) { $basketsClause .= ' or '; } diff --git a/src/app/resource/models/ResModelAbstract.php b/src/app/resource/models/ResModelAbstract.php index cff8ac890c1756c8e08fd539e2736f4cf0d18a73..5f418d2b3bd5938fb0473ea5af7eb49fb8a4bd42 100755 --- a/src/app/resource/models/ResModelAbstract.php +++ b/src/app/resource/models/ResModelAbstract.php @@ -45,38 +45,58 @@ abstract class ResModelAbstract ValidatorModel::stringType($aArgs, ['clause']); ValidatorModel::intType($aArgs, ['limit', 'offset']); - $where = ['res_view_letterbox.priority = priorities.id']; - $where[] = $aArgs['clause']; - - $aResources = DatabaseModel::select([ + $resources = ResModel::getOnView([ 'select' => [ 'count(1) OVER()', - 'alt_identifier', - 'category_id', - 'case_label', - 'closing_date', - 'category_id', - 'contact_lastname', - 'contact_society', - 'creation_date', - 'entity_label as entity_destination', - 'folder_name', - 'priorities.color as priority_color', - 'priorities.label as priority_label', - 'process_limit_date', - 'res_id', - 'subject', - 'type_label as doctype_label' + 'res_id' ], - 'table' => ['res_view_letterbox, priorities'], - 'where' => $where, + 'where' => [$aArgs['clause']], 'data' => [], 'order_by' => empty($aArgs['orderBy']) ? [] : $aArgs['orderBy'], 'offset' => empty($aArgs['offset']) ? 0 : $aArgs['offset'], 'limit' => empty($aArgs['limit']) ? 0 : $aArgs['limit'] ]); + $count = empty($resources[0]['count']) ? 0 : $resources[0]['count']; - return $aResources; + $resIds = []; + foreach ($resources as $resource) { + $resIds[] = $resource['res_id']; + } + + if (!empty($resIds)) { + $resources = DatabaseModel::select([ + 'select' => [ + 'res_id', + 'subject', + 'alt_identifier', + 'category_id', + 'closing_date', + 'category_id', + 'contact_firstname', + 'contact_lastname', + 'contact_society', + 'user_lastname', + 'user_firstname', + 'creation_date', + 'entity_label as entity_destination', + 'process_limit_date', + 'type_label as doctype_label', + 'priorities.color as priority_color', + 'priorities.label as priority_label', + 'status.img_filename as status_icon', + 'status.label_status as status_label', + 'status.id as status_id', + 'users.lastname as user_dest_lastname', + 'users.firstname as user_dest_firstname', + ], + 'table' => ['res_view_letterbox, priorities, status, users'], + 'where' => ['res_view_letterbox.res_id in (?)', 'res_view_letterbox.priority = priorities.id', 'res_view_letterbox.status = status.id', 'res_view_letterbox.dest_user = users.user_id'], + 'data' => [$resIds] + ]); + } + + + return ['resources' => $resources, 'count' => $count]; } public static function get(array $aArgs) diff --git a/src/app/resource/models/ResourceContactModel.php b/src/app/resource/models/ResourceContactModel.php index 6ab193a04a37e57fe09101653f10147cc4654edd..869cb138710829df3f61d686e9715f99609f5ecf 100755 --- a/src/app/resource/models/ResourceContactModel.php +++ b/src/app/resource/models/ResourceContactModel.php @@ -62,8 +62,10 @@ class ResourceContactModel 'where' => ['ca_id = ?'], 'data' => [$aContact['item_id']] ]); - $contact = AutoCompleteController::getFormattedContact(['contact' => $contact[0]]); - $aContacts[$key]['format'] = $contact['contact']['otherInfo']; + if (isset($contact[0])) { + $contact = AutoCompleteController::getFormattedContact(['contact' => $contact[0]]); + $aContacts[$key]['format'] = $contact['contact']['otherInfo']; + } } elseif ($aContact['type'] == 'entity') { $entity = EntityModel::getById(['id' => $aContact['item_id'], 'select' => ['entity_label']]); $aContacts[$key]['format'] = $entity['entity_label']; diff --git a/src/app/signatureBook/controllers/SignatureBookController.php b/src/app/signatureBook/controllers/SignatureBookController.php index 3b8ecee1d81a57ae588d78348806678bafe119a4..e544b56d5b09be65a4d40d0c7c6fbbaa33204726 100755 --- a/src/app/signatureBook/controllers/SignatureBookController.php +++ b/src/app/signatureBook/controllers/SignatureBookController.php @@ -58,7 +58,7 @@ class SignatureBookController if (empty($rawAction['where_clause'])) { $actions[] = ['value' => $rawAction['id_action'], 'label' => $rawAction['label_action']]; } else { - $whereClause = PreparedClauseController::getPreparedClause(['clause' => $rawAction['where_clause'], 'userId' => $GLOBALS['userId']]); + $whereClause = PreparedClauseController::getPreparedClause(['clause' => $rawAction['where_clause'], 'login' => $GLOBALS['userId']]); $ressource = ResModel::getOnView(['select' => [1], 'where' => ['res_id = ?', $whereClause], 'data' => [$aArgs['resId']]]); if (!empty($ressource)) { $actions[] = ['value' => $rawAction['id_action'], 'label' => $rawAction['label_action']]; diff --git a/src/app/user/controllers/UserController.php b/src/app/user/controllers/UserController.php index 034fc98c45a7ac82b0a8c246c239042ba839b63e..1213d758c86cf994d01dc56ffe837b829407f299 100755 --- a/src/app/user/controllers/UserController.php +++ b/src/app/user/controllers/UserController.php @@ -16,6 +16,7 @@ namespace User\controllers; use Basket\models\BasketModel; use Basket\models\GroupBasketModel; +use Basket\models\RedirectBasketModel; use Docserver\controllers\DocserverController; use Docserver\models\DocserverModel; use Entity\models\ListInstanceModel; @@ -34,6 +35,7 @@ use Slim\Http\Response; use SrcCore\controllers\PasswordController; use SrcCore\models\AuthenticationModel; use SrcCore\models\CoreConfigModel; +use SrcCore\models\DatabaseModel; use SrcCore\models\PasswordModel; use User\models\UserBasketPreferenceModel; use User\models\UserEntityModel; @@ -316,7 +318,7 @@ class UserController $user['groups'] = UserModel::getGroupsByUserId(['userId' => $user['user_id']]); $user['entities'] = UserModel::getEntitiesById(['userId' => $user['user_id']]); $user['baskets'] = BasketModel::getBasketsByUserId(['userId' => $user['user_id'], 'unneededBasketId' => ['IndexingBasket']]); - $user['redirectedBaskets'] = BasketModel::getRedirectedBasketsByUserId(['userId' => $user['user_id']]); + $user['redirectedBaskets'] = RedirectBasketModel::getRedirectedBasketsByUserId(['userId' => $user['id']]); $user['regroupedBaskets'] = BasketModel::getRegroupedBasketsByUserId(['userId' => $user['user_id']]); $user['passwordRules'] = PasswordModel::getEnabledRules(); $user['canModifyPassword'] = true; @@ -397,33 +399,33 @@ class UserController return $response->withStatus($error['status'])->withJson(['errors' => $error['error']]); } - $user = UserModel::getById(['id' => $aArgs['id'], 'select' => ['user_id']]); - $data = $request->getParams(); + DatabaseModel::beginTransaction(); foreach ($data as $key => $value) { - if (empty($value['newUser']) || empty($value['basketId']) || empty($value['basketOwner']) || empty($value['virtual'])) { + if (empty($value['actual_user_id']) || empty($value['basket_id']) || empty($value['group_id'])) { + DatabaseModel::rollbackTransaction(); return $response->withStatus(400)->withJson(['errors' => 'Bad Request']); } - $check = UserModel::getByUserId(['userId' => $value['newUser'], 'select' => ['1']]); + $check = UserModel::getById(['id' => $value['actual_user_id'], 'select' => ['1']]); if (empty($check)) { + DatabaseModel::rollbackTransaction(); return $response->withStatus(400)->withJson(['errors' => 'User not found']); } - if ($value['basketOwner'] != $user['user_id']) { - BasketModel::updateRedirectedBaskets([ - 'userId' => $user['user_id'], - 'basketOwner' => $value['basketOwner'], - 'basketId' => $value['basketId'], - 'userAbs' => $value['basketOwner'], - 'newUser' => $value['newUser'] + if (!empty($value['originalOwner'])) { + RedirectBasketModel::update([ + 'actual_user_id' => $value['actual_user_id'], + 'basket_id' => $value['basket_id'], + 'group_id' => $value['group_id'], + 'owner_user_id' => $value['originalOwner'] ]); HistoryController::add([ - 'tableName' => 'user_abs', + 'tableName' => 'redirected_baskets', 'recordId' => $GLOBALS['userId'], 'eventType' => 'UP', 'eventId' => 'basketRedirection', - 'info' => _BASKET_REDIRECTION . " {$value['basketId']} {$user['user_id']} => {$value['newUser']}" + 'info' => _BASKET_REDIRECTION . " {$value['basket_id']} {$value['actual_user_id']}" ]); unset($data[$key]); } @@ -431,57 +433,52 @@ class UserController if (!empty($data)) { foreach ($data as $value) { - BasketModel::setRedirectedBaskets([ - 'userAbs' => $user['user_id'], - 'newUser' => $value['newUser'], - 'basketId' => $value['basketId'], - 'basketOwner' => $value['basketOwner'], - 'isVirtual' => $value['virtual'] + RedirectBasketModel::create([ + 'actual_user_id' => $value['actual_user_id'], + 'basket_id' => $value['basket_id'], + 'group_id' => $value['group_id'], + 'owner_user_id' => $aArgs['id'] ]); - HistoryController::add([ - 'tableName' => 'user_abs', + 'tableName' => 'redirected_baskets', 'recordId' => $GLOBALS['userId'], 'eventType' => 'UP', 'eventId' => 'basketRedirection', - 'info' => _BASKET_REDIRECTION . " {$value['basketId']} {$user['user_id']} => {$value['newUser']}" + 'info' => _BASKET_REDIRECTION . " {$value['basket_id']} {$aArgs['id']} => {$value['actual_user_id']}" ]); } } + DatabaseModel::commitTransaction(); + + $user = UserModel::getById(['id' => $aArgs['id'], 'select' => ['user_id']]); + return $response->withJson([ 'baskets' => BasketModel::getBasketsByUserId(['userId' => $user['user_id'], 'unneededBasketId' => ['IndexingBasket']]) ]); } - public function deleteRedirectedBaskets(Request $request, Response $response, array $aArgs) + public function deleteRedirectedBasket(Request $request, Response $response, array $aArgs) { $error = $this->hasUsersRights(['id' => $aArgs['id'], 'himself' => true]); if (!empty($error['error'])) { return $response->withStatus($error['status'])->withJson(['errors' => $error['error']]); } - $data = $request->getParams(); - - $check = Validator::stringType()->notEmpty()->validate($data['basketOwner']); - if (!$check) { - return $response->withStatus(400)->withJson(['errors' => 'Bad Request']); + $redirectedBasket = RedirectBasketModel::get(['select' => ['actual_user_id', 'owner_user_id'], 'where' => ['id = ?'], 'data' => [$aArgs['redirectBasketid']]]); + if (empty($redirectedBasket[0]) || ($redirectedBasket[0]['actual_user_id'] != $aArgs['id'] && $redirectedBasket[0]['owner_user_id'] != $aArgs['id'])) { + return $response->withStatus(403)->withJson(['errors' => 'Redirected basket out of perimeter']); } - $user = UserModel::getById(['id' => $aArgs['id'], 'select' => ['user_id']]); - - if ($data['basketOwner'] != $user['user_id']) { - BasketModel::deleteBasketRedirection(['userId' => $data['basketOwner'], 'basketId' => $aArgs['basketId']]); - } else { - BasketModel::deleteBasketRedirection(['userId' => $user['user_id'], 'basketId' => $aArgs['basketId']]); - } + RedirectBasketModel::delete(['where' => ['id = ?'], 'data' => [$aArgs['redirectBasketid']]]); + $user = UserModel::getById(['id' => $aArgs['id'], 'select' => ['user_id']]); HistoryController::add([ - 'tableName' => 'user_abs', + 'tableName' => 'redirected_baskets', 'recordId' => $GLOBALS['userId'], - 'eventType' => 'UP', + 'eventType' => 'DEL', 'eventId' => 'basketRedirection', - 'info' => _BASKET_REDIRECTION_SUPPRESSION . " {$aArgs['basketId']} {$user['user_id']}" + 'info' => _BASKET_REDIRECTION_SUPPRESSION . " {$user['user_id']}" ]); return $response->withJson([ diff --git a/src/core/controllers/AutoCompleteController.php b/src/core/controllers/AutoCompleteController.php index 91cd8ada4c1da4c8b84215ee1a64d5bc311dcc9c..f54ac998b4e85945685c1f0a1e4646977e0e9d76 100755 --- a/src/core/controllers/AutoCompleteController.php +++ b/src/core/controllers/AutoCompleteController.php @@ -92,7 +92,7 @@ class AutoCompleteController ]); $users = UserModel::get([ - 'select' => ['user_id', 'firstname', 'lastname'], + 'select' => ['id', 'user_id', 'firstname', 'lastname'], 'where' => $requestData['where'], 'data' => $requestData['data'], 'orderBy' => ['lastname'], @@ -104,6 +104,7 @@ class AutoCompleteController $data[] = [ 'type' => 'user', 'id' => $value['user_id'], + 'serialId' => $value['id'], 'idToDisplay' => "{$value['firstname']} {$value['lastname']}", 'otherInfo' => '' ]; diff --git a/src/core/controllers/PreparedClauseController.php b/src/core/controllers/PreparedClauseController.php index e36ce707540564b3193a7351d710d2176bcfeed8..e4d44a5738a508364d4b3d732d0d19f723644ff8 100755 --- a/src/core/controllers/PreparedClauseController.php +++ b/src/core/controllers/PreparedClauseController.php @@ -23,20 +23,20 @@ class PreparedClauseController { public static function getPreparedClause(array $aArgs) { - ValidatorModel::notEmpty($aArgs, ['clause', 'userId']); - ValidatorModel::stringType($aArgs, ['clause', 'userId']); + ValidatorModel::notEmpty($aArgs, ['clause', 'login']); + ValidatorModel::stringType($aArgs, ['clause', 'login']); $clause = $aArgs['clause']; if (preg_match('/@user/', $clause)) { - $clause = str_replace('@user', "'{$aArgs['userId']}'", $clause); + $clause = str_replace('@user', "'{$aArgs['login']}'", $clause); } if (preg_match('/@email/', $clause)) { - $user = UserModel::getByUserId(['userId' => $aArgs['userId'], 'select' => ['mail']]); + $user = UserModel::getByUserId(['userId' => $aArgs['login'], 'select' => ['mail']]); $clause = str_replace('@email', "'{$user['mail']}'", $clause); } if (preg_match('/@my_entities/', $clause)) { - $entities = EntityModel::getByUserId(['userId' => $aArgs['userId'], 'select' => ['entity_id']]); + $entities = EntityModel::getByUserId(['userId' => $aArgs['login'], 'select' => ['entity_id']]); $myEntitiesClause = ''; foreach ($entities as $key => $entity) { @@ -52,7 +52,7 @@ class PreparedClauseController $clause = str_replace('@my_entities', $myEntitiesClause, $clause); } if (preg_match('/@my_primary_entity/', $clause)) { - $entity = UserModel::getPrimaryEntityByUserId(['userId' => $aArgs['userId']]); + $entity = UserModel::getPrimaryEntityByUserId(['userId' => $aArgs['login']]); if (empty($entity)) { $primaryEntity = "''"; @@ -218,7 +218,7 @@ class PreparedClauseController ValidatorModel::arrayType($aArgs, ['select', 'orderBy']); ValidatorModel::intType($aArgs, ['limit']); - $clause = PreparedClauseController::getPreparedClause(['clause' => $aArgs['clause'], 'userId' => $aArgs['userId']]); + $clause = PreparedClauseController::getPreparedClause(['clause' => $aArgs['clause'], 'login' => $aArgs['userId']]); $preg = preg_match('#\b(?:abort|alter|copy|create|delete|disgard|drop|execute|grant|insert|load|lock|move|reset|truncate|update)\b#i', $clause); if ($preg === 1) { diff --git a/src/core/models/DatabaseModel.php b/src/core/models/DatabaseModel.php index ed14f7a35c6974deef789652c857bd5b28446409..06abbd1dfb1f662846d9f516d47f85308fd86122 100755 --- a/src/core/models/DatabaseModel.php +++ b/src/core/models/DatabaseModel.php @@ -259,4 +259,46 @@ class DatabaseModel return true; } + + /** + * Database Begin Transaction Function + * + * @return bool + * @throws \Exception + */ + public static function beginTransaction() + { + $db = new DatabasePDO(); + $db->query('BEGIN'); + + return true; + } + + /** + * Database Commit Transaction Function + * + * @return bool + * @throws \Exception + */ + public static function commitTransaction() + { + $db = new DatabasePDO(); + $db->query('COMMIT'); + + return true; + } + + /** + * Database Rollback Transaction Function + * + * @return bool + * @throws \Exception + */ + public static function rollbackTransaction() + { + $db = new DatabasePDO(); + $db->query('ROLLBACK'); + + return true; + } } diff --git a/src/frontend/app/app-routing.module.ts b/src/frontend/app/app-routing.module.ts index bf6f3623a8bec854899d7fecbcaaf6b3dfa1a961..271f4700bd0731d919b9204e0fe19e0d9bf61e6a 100755 --- a/src/frontend/app/app-routing.module.ts +++ b/src/frontend/app/app-routing.module.ts @@ -6,7 +6,7 @@ import { PasswordModificationComponent } from './password-modification.compon import { ProfileComponent } from './profile.component'; import { AboutUsComponent } from './about-us.component'; import { HomeComponent } from './home.component'; -import { BasketListComponent } from './basket/basket-list.component'; +import { BasketListComponent } from './list/basket-list.component'; import { SignatureBookComponent } from './signature-book.component'; import { SaveNumericPackageComponent } from './save-numeric-package.component'; diff --git a/src/frontend/app/app.module.ts b/src/frontend/app/app.module.ts index d5d2c5d1dac2635fd5df3a18f43eb707cd8da7a5..794879d4572d9d9448e45b9bc2c9c47e9ca8ce96 100755 --- a/src/frontend/app/app.module.ts +++ b/src/frontend/app/app.module.ts @@ -6,6 +6,7 @@ import { CustomSnackbarComponent } from './notification.service'; import { ConfirmModalComponent } from './confirmModal.component'; import { ShortcutMenuService } from '../service/shortcut-menu.service'; import { HeaderService } from '../service/header.service'; +import { FiltersListService } from '../service/filtersList.service'; import { AppComponent } from './app.component'; import { AppRoutingModule } from './app-routing.module'; @@ -14,12 +15,15 @@ import { AdministrationModule } from './administration/administr import { ProfileComponent } from './profile.component'; import { AboutUsComponent } from './about-us.component'; import { HomeComponent } from './home.component'; -import { BasketListComponent, BottomSheetNoteList, BottomSheetAttachmentList, BottomSheetDiffusionList } from './basket/basket-list.component'; +import { BasketListComponent, BottomSheetNoteList, BottomSheetAttachmentList, BottomSheetDiffusionList } from './list/basket-list.component'; import { PasswordModificationComponent, InfoChangePasswordModalComponent, } from './password-modification.component'; import { SignatureBookComponent, SafeUrlPipe } from './signature-book.component'; import { SaveNumericPackageComponent } from './save-numeric-package.component'; import { ActivateUserComponent } from './activate-user.component'; + +import { FiltersListComponent } from './list/filters/filters-list.component'; + @NgModule({ imports: [ SharedModule, @@ -42,7 +46,8 @@ import { ActivateUserComponent } from './activate-user.component' ActivateUserComponent, BottomSheetNoteList, BottomSheetAttachmentList, - BottomSheetDiffusionList + BottomSheetDiffusionList, + FiltersListComponent ], entryComponents: [ CustomSnackbarComponent, @@ -52,7 +57,7 @@ import { ActivateUserComponent } from './activate-user.component' BottomSheetAttachmentList, BottomSheetDiffusionList ], - providers: [ ShortcutMenuService, HeaderService ], + providers: [ ShortcutMenuService, HeaderService, FiltersListService ], bootstrap: [ AppComponent ] }) export class AppModule { } diff --git a/src/frontend/app/basket/basket-home.component.html b/src/frontend/app/basket/basket-home.component.html index aa86694b4712aad5b9a8d96f1b8f4047c84d5b4e..96cd3d656453b2ceb5237b9d79879ccc7c653305 100755 --- a/src/frontend/app/basket/basket-home.component.html +++ b/src/frontend/app/basket/basket-home.component.html @@ -31,14 +31,14 @@ </p> </a> <!-- TODO NEW BASKET LIST--> - <!--<a mat-list-item *ngIf="!basket.redirected" (click)="closePanelLeft();" routerLink="/basketList/{{regroupedBasket.groupSerialId}}/baskets/{{basket.basket_id}}" style="cursor:pointer;" [ngStyle]="{'opacity': basket.resourceNumber==0 ? '0.5' : '1'}"> + <!-- <a mat-list-item *ngIf="!basket.redirected" (click)="closePanelLeft();" routerLink="/basketList/{{regroupedBasket.groupSerialId}}/baskets/{{basket.basket_id}}" style="cursor:pointer;" [ngStyle]="{'opacity': basket.resourceNumber==0 ? '0.5' : '1'}"> <mat-icon [ngStyle]="{'color': basket.color}" *ngIf="!mobileMode" mat-list-icon class="fa fa-inbox"></mat-icon> <span *ngIf="basket.resourceNumber==0" class="badge" style="min-width:auto;">{{basket.resourceNumber}}</span> <span *ngIf="basket.resourceNumber!=0" bgcolor="warn" class="badge" style="min-width:auto;">{{basket.resourceNumber}}</span> <p mat-line title="{{basket.basket_name}}" [ngStyle]="{'color': basket.color}"> {{basket.basket_name}} </p> - </a>--> + </a> --> </ng-container> </mat-nav-list> </ng-container> @@ -50,7 +50,7 @@ <mat-icon *ngIf="!mobileMode" style="color:#666" mat-list-icon class="fa fa-inbox"></mat-icon> <span *ngIf="basket.resourceNumber==0" class="badge" style="min-width:auto;">{{basket.resourceNumber}}</span> <span *ngIf="basket.resourceNumber!=0" bgcolor="warn" class="badge" style="min-width:auto;">{{basket.resourceNumber}}</span> - <p mat-line (click)="goToRedirect(basket.basket_id,basket.basket_owner)" title="{{basket.basket_name}}" style="color:#666"> + <p mat-line (click)="goToRedirect(basket.basket_id, basket.ownerLogin, basket.uselessGroupId)" title="{{basket.basket_name}}" style="color:#666"> {{basket.basket_name}}<br/><small color="primary">({{basket.userToDisplay}})</small> </p> </a> diff --git a/src/frontend/app/basket/basket-home.component.ts b/src/frontend/app/basket/basket-home.component.ts index 845ef6215b0c29391cececb64bd1bb3e6292788a..de4d5656ec196ed5aba28c498624d42e9c34bb6e 100755 --- a/src/frontend/app/basket/basket-home.component.ts +++ b/src/frontend/app/basket/basket-home.component.ts @@ -28,12 +28,12 @@ export class BasketHomeComponent implements OnInit { this.coreUrl = angularGlobals.coreUrl; } - goTo(basketId:any,groupId:any) { + goTo(basketId:any, groupId:any) { window.location.href="index.php?page=view_baskets&fromV2=true&module=basket&baskets="+basketId+"&groupId="+groupId; } - goToRedirect(basketId:any,owner:any) { - window.location.href="index.php?page=view_baskets&fromV2=true&module=basket&baskets="+basketId+"_"+owner+"&groupId="; + goToRedirect(basketId:any, owner:any, groupId:any) { + window.location.href="index.php?page=view_baskets&fromV2=true&module=basket&baskets="+basketId+"_"+owner+"&groupId=" + groupId; } closePanelLeft() { diff --git a/src/frontend/app/basket/attachment-list.component.html b/src/frontend/app/list/attachment-list.component.html similarity index 100% rename from src/frontend/app/basket/attachment-list.component.html rename to src/frontend/app/list/attachment-list.component.html diff --git a/src/frontend/app/list/basket-list.component.html b/src/frontend/app/list/basket-list.component.html new file mode 100644 index 0000000000000000000000000000000000000000..d8ffd77e3739258bf54afa00e5845ab501a363ec --- /dev/null +++ b/src/frontend/app/list/basket-list.component.html @@ -0,0 +1,164 @@ +<div class="admin-container" [class.admin-is-mobile]="mobileQuery.matches"> + <mat-sidenav-container autosize class="admin-sidenav-container"> + <mat-sidenav #snav [mode]="mobileMode ? 'over' : 'side'" [fixedInViewport]="mobileMode" fixedTopGap="56" + [opened]="mobileMode ? false : true" autoFocus="false" style="overflow-x:hidden;" [ngStyle]="{'width': mobileMode ? '80%' : '400px'}"> + <menu-shortcut></menu-shortcut> + <menu-nav></menu-nav> + <basket-home *ngIf="homeData" [homeData]="homeData" [snavL]="snav"></basket-home> + <mat-divider></mat-divider> + </mat-sidenav> + <mat-sidenav-content> + <div *ngIf="loading" style="display:flex;height:100%;"> + <mat-spinner style="margin:auto;"></mat-spinner> + </div> + <mat-card class="card-app-content"> + <div class="example-loading-shade" *ngIf="isLoadingResults"> + <mat-spinner *ngIf="isLoadingResults"></mat-spinner> + </div> + <div class="row" style="margin:0px;"> + <div class="col-md-9 col-xs-9"> + <mat-button-toggle-group #group="matButtonToggleGroup" class="envFilter" (change)="updateFilters($event)" multiple> + <mat-checkbox color="primary" style="margin: 10px;" title="Sélectionner tous les courriers de la bannette"></mat-checkbox> + <button mat-stroked-button (click)="openFilter()">Filtres</button> + <mat-button-toggle [checked]="this.listProperties.onlyProcesLimit" value="onlyProcesLimit" title="{{lang.displayProcessLimitRes}}"> + <mat-icon fontSet="fas" fontIcon="fa-stopwatch fa-2x"></mat-icon> + </mat-button-toggle> + <mat-button-toggle [checked]="this.listProperties.onlyNewRes"value="onlyNewRes" title="{{lang.displayNewRes}}"> + <mat-icon fontSet="fas" fontIcon="fa-eye-slash fa-2x"></mat-icon> + </mat-button-toggle> + <mat-button-toggle [checked]="this.listProperties.withPj" value="withPj" title="{{lang.displayWithAttach}}"> + <mat-icon fontSet="fas" fontIcon="fa-reply fa-2x"></mat-icon> + </mat-button-toggle> + <mat-button-toggle [checked]="this.listProperties.withNote" value="withNote" title="{{lang.displayWithNotes}}"> + <mat-icon fontSet="fas" fontIcon="fa-comments fa-2x"></mat-icon> + </mat-button-toggle> + <mat-form-field appearance="outline" [style.fontSize.px]="10" style="width:200px !important;"> + <mat-label>{{lang.orderBy}}</mat-label> + <mat-select multiple> + <mat-option [value]="column.id" *ngFor="let column of displayColsOrder"> + {{lang[column.id]}} + </mat-option> + </mat-select> + </mat-form-field> + <button mat-icon-button title="{{lang.descOrder}}" style="color: rgba(0,0,0,0.38);"> + <mat-icon fontSet="fas" fontIcon="fa-sort-amount-up fa-2x"></mat-icon> + </button> + <button mat-icon-button [matMenuTriggerFor]="menuParamList"> + <mat-icon color="primary" fontSet="fas" fontIcon="fa-cog fa-2x"></mat-icon> + </button> + <mat-menu #menuParamList="matMenu"> + <button mat-menu-item> + <mat-icon fontSet="fas" fontIcon="fa-print fa-2x"></mat-icon> + <span>{{lang.printResultList}}</span> + </button> + <button mat-menu-item> + <mat-icon fontSet="fas" fontIcon="fa-file-export fa-2x"></mat-icon> + <span>{{lang.exportDatas}}</span> + </button> + <button mat-menu-item> + <mat-icon fontSet="far" fontIcon="fa-list-alt fa-2x"></mat-icon> + <span>{{lang.settingsList}}</span> + </button> + </mat-menu> + </mat-button-toggle-group> + <div class="filterBadges"> + <span class="label label-info" title="{{lang.currentFilters}}" *ngFor="let category of this.listProperties.categories" (click)="openFilter()">{{category.label}}</span> + <span class="label label-info" title="{{lang.currentFilters}}" *ngFor="let priority of this.listProperties.priorities" (click)="openFilter()">{{priority.label}}</span> + <span class="label label-info" title="{{lang.currentFilters}}" *ngFor="let entity of this.listProperties.entities" (click)="openFilter()">{{entity.label}}</span> + </div> + </div> + <div class="col-md-3 col-xs-3"> + <mat-paginator [length]="resultsLength" [pageSize]="10"></mat-paginator> + </div> + </div> + + <table #tableBasketListSort="matSort" mat-table [dataSource]="data" matSort matSortActive="res_id" + matSortDisableClear matSortDirection="asc" style="width:100%;table-layout: fixed;"> + <ng-container matColumnDef="res_id"> + <td mat-cell *matCellDef="let row" class="resultContainer" [class.resultContainer-mobile]="mobileMode"> + <!-- Secondary Info Line --> + <mat-toolbar *ngIf="displayedSecondaryData.length > 0"> + <div class="resultCol {{data.class}}" *ngFor="let data of displayedSecondaryData"> + <span *ngIf="data.id == 'status_label'"> + <mat-icon [ngStyle]="{'color': row.priority_color}" color="primary" class="{{row.status_icon.charAt(0)}}{{row.status_icon.charAt(1)}} {{row.status_icon}} {{row.status_icon.charAt(0)}}{{row.status_icon.charAt(1)}}-2x" + title="{{row.status_label}} ({{row.status_id}})"></mat-icon><br /> + </span> + <ng-container *ngIf="data.id == 'date'"> + <i class="fa fa-calendar" title="{{lang.creationDate}}"></i> {{row.creation_date + | timeAgo}} - <i class="fa fa-stopwatch" title="{{lang.processLimitDate}}"></i> <span + [innerHTML]="row.process_limit_date | timeLimit" title='{{row.process_limit_date | date : "le dd/MM/y à HH:mm"}}'></span> + </ng-container> + <ng-container *ngIf="data.icon != ''"> + <i class="{{data.icon}}"></i> + + </ng-container> + <ng-container *ngIf="data.id == 'category_id'"> + {{lang[row.category_id]}} + </ng-container> + <ng-container *ngIf="data.id != 'status_label' && data.id != 'date' && data.id != 'category_id'"> + {{row[data.id]}} + </ng-container> + </div> + </mat-toolbar> + <!-- Primary Info Line --> + <div class="resultRow newRow" [class.resultRow-mobile]="mobileMode"> + <div *ngIf="!mobileMode" class="checkThis"> + <mat-checkbox color="primary"></mat-checkbox> + </div> + <div class="resultCol {{data.class}}" *ngFor="let data of displayedMainData"> + <span *ngIf="data.id == 'alt_identifier'"> + <mat-icon [ngStyle]="{'color': row.priority_color}" color="primary" class="{{row.status_icon.charAt(0)}}{{row.status_icon.charAt(1)}} {{row.status_icon}} {{row.status_icon.charAt(0)}}{{row.status_icon.charAt(1)}}-2x" + title="{{row.status_label}} ({{row.status_id}})"></mat-icon><br /> + <span style="color: rgba(0,0,0,0.4);font-size: 90%;">{{row[data.id]}}</span> + </span> + <ng-container *ngIf="data.id == 'date'"> + <i class="fa fa-calendar" title="{{lang.creationDate}}"></i> {{row.creation_date + | timeAgo}} - <i class="fa fa-stopwatch" title="{{lang.processLimitDate}}"></i> <span + [innerHTML]="row.process_limit_date | timeLimit" title='{{row.process_limit_date | date : "le dd/MM/y à HH:mm"}}'></span> + </ng-container> + <ng-container *ngIf="data.icon != ''"> + <i class="{{data.icon}}"></i> + + </ng-container> + <ng-container *ngIf="data.id == 'category_id'"> + {{lang[row.category_id]}} + </ng-container> + <ng-container *ngIf="data.id != 'status_label' && data.id != 'date' && data.id != 'category_id' && data.id != 'alt_identifier'"> + {{row[data.id]}} + </ng-container> + </div> + <mat-button-toggle-group #group="matButtonToggleGroup" class="actions" multiple> + <button color="primary" mat-icon-button (click)="openBottomSheet(row)"> + <mat-icon fontSet="fas" matBadge="??" fontIcon="fa-comments fa-2x"></mat-icon> + </button> + <button color="primary" mat-icon-button (click)="openAttachSheet(row)"> + <mat-icon fontSet="fas" matBadge="??" fontIcon="fa-paperclip fa-2x"></mat-icon> + </button> + <button color="primary" mat-icon-button (click)="openDiffusionSheet(row)"> + <mat-icon matBadgeSize="medium" fontSet="fas" fontIcon="fa-sitemap fa-2x"></mat-icon> + </button> + <button color="primary" mat-icon-button (click)="goTo(row)"> + <mat-icon fontSet="fas" fontIcon="fa-eye fa-2x"></mat-icon> + </button> + <button color="primary" mat-icon-button (click)="goToDetail(row);"> + <mat-icon fontSet="fas" fontIcon="fa-info-circle fa-2x"></mat-icon> + </button> + </mat-button-toggle-group> + </div> + </td> + </ng-container> + <tr mat-row *matRowDef="let row; columns: displayedColumnsBasket;" (click)="test();"></tr> + </table> + <div class="mat-paginator" style="min-height:48px;min-height: 48px;display: flex;justify-content: end;align-items: center;padding-right: 20px;">{{resultsLength}} + {{lang.entries}}</div> + </mat-card> + </mat-sidenav-content> + <mat-sidenav #snav2 mode="over" [fixedInViewport]="mobileQuery.matches" fixedTopGap="56" position='end' + [opened]="mobileQuery.matches ? false : false" style="overflow-x:hidden;" [class.docView]="!filterMode" [ngStyle]="{'width': mobileMode ? '80%' : '40%'}"> + <div *ngIf="innerHtml && !filterMode" [innerHTML]="innerHtml" style="height: 100%;overflow: hidden;"></div> + + <app-filters-list *ngIf="filterMode" [listProperties]="this.listProperties"></app-filters-list> + <mat-divider></mat-divider> + </mat-sidenav> + </mat-sidenav-container> +</div> \ No newline at end of file diff --git a/src/frontend/app/list/basket-list.component.scss b/src/frontend/app/list/basket-list.component.scss new file mode 100644 index 0000000000000000000000000000000000000000..42aec0d03763d8bf13a1c12414f5bfa4af289b52 --- /dev/null +++ b/src/frontend/app/list/basket-list.component.scss @@ -0,0 +1,128 @@ +.docView { + overflow: hidden; +} + +mat-toolbar { + border: solid 1px #F9983066; + font-size: 10px; + height: 20px; + color: #666; +} + +.resultContainer { + // color : rgb(102, 102, 102); + padding: 10px; + + &-mobile { + padding-left: 0px !important; + padding-right: 0px !important; + } +} + +.resultRow { + align-items: center; + display: flex; + padding: 5px; + + &-mobile { + font-size: 80%; + } +} + +.resultCol { + flex: 1; + overflow: hidden; + text-overflow: ellipsis; + + &-mobile { + overflow: inherit; + text-overflow: inherit; + word-break: break-all; + } +} + +.twoCol { + flex: 2; +} + +.mat-row:hover { + background: inherit; +} + +.newRow { + // font-weight: bold; +} +.endCol { + text-align: right; +} + +.chrono { + color: #666; + &-mobile { + font-size: 70%; + } +} + +.envFilter { + height: 40px; + + mat-icon{ + height: auto; + } + + .mat-button-toggle-checked { + background-color: #F99830; + color: white; + } +} + +.checkThis { + width: 40px; + text-align: center; +} + +.statusCol { + width: 80px; + text-align: center; +} + +.actionsCol { + width: 40px; +} + + +.actions { + box-shadow: none; + flex: 1; + justify-content: end; + overflow: inherit; +} +.mat-badge-content { + background: #F99830; +} + +.smallFontData { + font-size: 10px; +} + +.centerData { + text-align: center; +} + +.rightData { + text-align: right; +} + +.softColorData { + color: #666; +} + +.longData { + flex: 3; +} + +.filterBadges>.label { + margin: 5px; + background: #F99830; + cursor: pointer; +} \ No newline at end of file diff --git a/src/frontend/app/basket/basket-list.component.ts b/src/frontend/app/list/basket-list.component.ts similarity index 71% rename from src/frontend/app/basket/basket-list.component.ts rename to src/frontend/app/list/basket-list.component.ts index 48618a6861266d41fb258d6bc95691d48f4c77ae..7c4ac9210e98bdead1125a7144ac88062daf9b3e 100755 --- a/src/frontend/app/basket/basket-list.component.ts +++ b/src/frontend/app/list/basket-list.component.ts @@ -1,14 +1,18 @@ -import { ChangeDetectorRef, Component, OnInit, ViewChild, QueryList, ViewChildren, Inject } from '@angular/core'; +import { ChangeDetectorRef, Component, OnInit, ViewChild, Inject } from '@angular/core'; import { MediaMatcher } from '@angular/cdk/layout'; import { HttpClient } from '@angular/common/http'; import { LANG } from '../translate.component'; import { merge, Observable, of as observableOf } from 'rxjs'; import { NotificationService } from '../notification.service'; -import { MatDialog, MatSidenav, MatExpansionPanel, MatTableDataSource, MatPaginator, MatSort, MatBottomSheet, MatBottomSheetRef, MAT_BOTTOM_SHEET_DATA } from '@angular/material'; +import { MatDialog, MatSidenav, MatPaginator, MatSort, MatBottomSheet, MatBottomSheetRef, MAT_BOTTOM_SHEET_DATA, MatButtonToggleGroup } from '@angular/material'; import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; import { startWith, switchMap, map, catchError } from 'rxjs/operators'; import { ActivatedRoute } from '@angular/router'; +import { HeaderService } from '../../service/header.service'; +import { FiltersListService } from '../../service/filtersList.service'; + + declare function $j(selector: any): any; @@ -16,6 +20,7 @@ declare var angularGlobals: any; @Component({ templateUrl: "basket-list.component.html", + styleUrls: ['basket-list.component.scss'], providers: [NotificationService] }) export class BasketListComponent implements OnInit { @@ -32,20 +37,81 @@ export class BasketListComponent implements OnInit { basketUrl: string; homeData: any; - + filterMode: boolean = false; @ViewChild('snav') sidenavLeft: MatSidenav; @ViewChild('snav2') sidenavRight: MatSidenav; - - displayedColumnsBasket: string[] = ['res_id', 'subject', 'contact_society', 'creation_date']; + displayedColumnsBasket: string[] = ['res_id']; + + displayedMainData: any = [ + { + 'id' : 'alt_identifier', + 'class' : 'softColorData centerData', + 'icon' : '' + }, + { + 'id' : 'subject', + 'class' : 'longData', + 'icon' : '' + } + ]; + + displayedSecondaryData: any = []; + // displayedSecondaryData: any = [ + // { + // 'id' : 'priority_label', + // 'class' : '', + // 'icon' : '' + // }, + // { + // 'id' : 'category_id', + // 'class' : '', + // 'icon' : '' + // }, + // { + // 'id' : 'doctype_label', + // 'class' : '', + // 'icon' : 'fa fa-file' + // }, + // { + // 'id' : 'contact_society', + // 'class' : '', + // 'icon' : '' + // }, + // { + // 'id' : 'contact_society', + // 'class' : '', + // 'icon' : '' + // }, + // { + // 'id' : 'date', + // 'class' : 'rightData', + // 'icon' : '' + // }, + // ]; + + displayColsOrder = [ + {'id' : 'dest_user'}, + {'id' : 'creation_date'}, + {'id' : 'process_limit_date'}, + {'id' : 'destination'}, + {'id' : 'subject'}, + {'id' : 'alt_identifier'}, + {'id' : 'priority'}, + {'id' : 'status'}, + {'id' : 'type_id'} + ] exampleDatabase: ExampleHttpDao | null; data: any[] = []; resultsLength = 0; isLoadingResults = true; + listProperties: any = {}; + listPropertiesIndex: number = 0; + @ViewChild(MatPaginator) paginator: MatPaginator; @ViewChild('tableBasketListSort') sort: MatSort; - constructor(changeDetectorRef: ChangeDetectorRef, private route: ActivatedRoute, media: MediaMatcher, public http: HttpClient, public dialog: MatDialog, private sanitizer: DomSanitizer, private bottomSheet: MatBottomSheet) { + constructor(changeDetectorRef: ChangeDetectorRef, private route: ActivatedRoute, media: MediaMatcher, public http: HttpClient, public dialog: MatDialog, private sanitizer: DomSanitizer, private bottomSheet: MatBottomSheet, private headerService: HeaderService, private filtersListService: FiltersListService) { this.mobileMode = angularGlobals.mobileMode; $j("link[href='merged_css.php']").remove(); this.mobileQuery = media.matchMedia('(max-width: 768px)'); @@ -59,7 +125,8 @@ export class BasketListComponent implements OnInit { this.loading = false; if (this.mobileMode) { - this.displayedColumnsBasket = ['res_id', 'subject']; + $j('.mat-paginator-navigation-previous').hide(); + $j('.mat-paginator-navigation-next').hide(); } this.http.get(this.coreUrl + "rest/home") @@ -67,18 +134,21 @@ export class BasketListComponent implements OnInit { this.homeData = data; }); - + this.isLoadingResults = false; this.route.params.subscribe(params => { this.basketUrl = this.coreUrl + 'rest/resources/groups/' + params['groupSerialId'] + '/baskets/' + params['basketId']; - this.http.get(this.coreUrl + "rest/baskets/" + params['basketId']) + this.http.get(this.basketUrl) .subscribe((data: any) => { - window['MainHeaderComponent'].refreshTitle(data.basket.basket_name); + console.log(data); + this.filterMode = false; window['MainHeaderComponent'].setSnav(this.sidenavLeft); - window['MainHeaderComponent'].setSnavRight(null); - this.exampleDatabase = new ExampleHttpDao(this.http); + window['MainHeaderComponent'].setSnavRight(this.sidenavRight); + this.exampleDatabase = new ExampleHttpDao(this.http, this.filtersListService); + + this.listProperties = this.filtersListService.initListsProperties('bbain', params['groupSerialId'], params['basketId']); // If the user changes the sort order, reset back to the first page. - this.paginator.pageIndex = 0; + this.paginator.pageIndex = this.listProperties.page; this.sort.sortChange.subscribe(() => this.paginator.pageIndex = 0); merge(this.sort.sortChange, this.paginator.page) @@ -92,7 +162,7 @@ export class BasketListComponent implements OnInit { map(data => { // Flip flag to show that loading has finished. this.isLoadingResults = false; - this.resultsLength = data.number; + this.resultsLength = data.count; return data.resources; }), @@ -111,6 +181,7 @@ export class BasketListComponent implements OnInit { } goTo(row: any) { + this.filterMode = false; if (this.docUrl == this.coreUrl + 'rest/res/' + row.res_id + '/content' && this.sidenavRight.opened) { this.sidenavRight.close(); } else { @@ -122,6 +193,11 @@ export class BasketListComponent implements OnInit { } } + openFilter() { + this.filterMode = true; + this.sidenavRight.open(); + } + goToDetail(row: any) { location.href = "index.php?page=details&dir=indexing_searching&id=" + row.res_id; } @@ -151,18 +227,32 @@ export class BasketListComponent implements OnInit { console.log(data); }); } + + updateFilters(e: any) { + this.listProperties.onlyProcesLimit = false; + this.listProperties.onlyNewRes = false; + this.listProperties.withPj = false; + this.listProperties.withNote = false; + + e.value.forEach((element: any) => { + this.listProperties[element] = true; + }); + this.filtersListService.updateListsProperties(this.listProperties); + } } export interface BasketList { resources: any[]; - number: number; + count: number; } export class ExampleHttpDao { - constructor(private http: HttpClient) { } + constructor(private http: HttpClient, private filtersListService: FiltersListService) { } getRepoIssues(sort: string, order: string, page: number, href: string): Observable<BasketList> { + + this.filtersListService.updateListsPropertiesPage(page); let offset = page * 10; const requestUrl = `${href}?limit=10&offset=${offset}`; @@ -172,6 +262,7 @@ export class ExampleHttpDao { @Component({ templateUrl: 'note-list.component.html', + styleUrls: ['note-list.component.scss'], }) export class BottomSheetNoteList { coreUrl: string; diff --git a/src/frontend/app/basket/diffusion-list.component.html b/src/frontend/app/list/diffusion-list.component.html similarity index 100% rename from src/frontend/app/basket/diffusion-list.component.html rename to src/frontend/app/list/diffusion-list.component.html diff --git a/src/frontend/app/list/filters/filters-list.component.html b/src/frontend/app/list/filters/filters-list.component.html new file mode 100644 index 0000000000000000000000000000000000000000..f23a41adcc2cb0a135e9275b557a44db4e500f55 --- /dev/null +++ b/src/frontend/app/list/filters/filters-list.component.html @@ -0,0 +1,49 @@ +<mat-nav-list disableRipple="true"> + <h3 mat-subheader>{{lang.filterBy}}</h3> + <mat-form-field appearance="outline" style="padding-left:10px;padding-right:10px;"> + <mat-label>Numéro chrono</mat-label> + <input matInput> + </mat-form-field> + <mat-expansion-panel #categoriesPan> + <mat-expansion-panel-header> + <mat-panel-title style="color: rgba(0,0,0,0.54);font-size: 14px;font-weight: 500;"> + Categories + </mat-panel-title> + <mat-panel-description> + </mat-panel-description> + </mat-expansion-panel-header> + <mat-selection-list #categories (selectionChange)="updateFilters(categories, 'categories')"> + <mat-list-option checkboxPosition="before" color="primary" [value]="category.id" *ngFor="let category of categoriesList" [selected]="category.selected"> + {{category.label}} + </mat-list-option> + </mat-selection-list> + </mat-expansion-panel> + <mat-expansion-panel #prioritiesPan> + <mat-expansion-panel-header> + <mat-panel-title style="color: rgba(0,0,0,0.54);font-size: 14px;font-weight: 500;"> + Priorités + </mat-panel-title> + <mat-panel-description> + </mat-panel-description> + </mat-expansion-panel-header> + <mat-selection-list #priorities (selectionChange)="updateFilters(priorities, 'priorities')"> + <mat-list-option checkboxPosition="before" color="primary" [value]="priority.id" *ngFor="let priority of prioritiesList" [selected]="priority.selected"> + {{priority.label}} + </mat-list-option> + </mat-selection-list> + </mat-expansion-panel> + <mat-expansion-panel #entitiesPan> + <mat-expansion-panel-header> + <mat-panel-title style="color: rgba(0,0,0,0.54);font-size: 14px;font-weight: 500;"> + Services + </mat-panel-title> + <mat-panel-description> + </mat-panel-description> + </mat-expansion-panel-header> + <mat-selection-list #entities (selectionChange)="updateFilters(entities, 'entities')"> + <mat-list-option checkboxPosition="before" color="primary" [value]="entity.id" *ngFor="let entity of entitiesList" [selected]="entity.selected"> + {{entity.label}} + </mat-list-option> + </mat-selection-list> + </mat-expansion-panel> +</mat-nav-list> \ No newline at end of file diff --git a/src/frontend/app/list/filters/filters-list.component.ts b/src/frontend/app/list/filters/filters-list.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..b237fb1cb4dc05432701da1d8219c9159fa82b95 --- /dev/null +++ b/src/frontend/app/list/filters/filters-list.component.ts @@ -0,0 +1,75 @@ +import { Component, OnInit, Input, ViewChild } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { LANG } from '../../translate.component'; +import { NotificationService } from '../../notification.service'; +import { FiltersListService } from '../../../service/filtersList.service'; +import { MatSelectionList, MatExpansionPanel } from '@angular/material'; + +declare function $j(selector: any): any; + +declare var angularGlobals: any; + +@Component({ + selector: 'app-filters-list', + templateUrl: 'filters-list.component.html', + providers: [NotificationService] +}) +export class FiltersListComponent implements OnInit { + + coreUrl: string; + lang: any = LANG; + prioritiesList: any[] = []; + categoriesList: any[] = []; + entitiesList: any[] = []; + + @Input('listProperties') listProperties: any; + + @ViewChild('categoriesPan') categoriesPan: MatExpansionPanel; + @ViewChild('prioritiesPan') prioritiesPan: MatExpansionPanel; + @ViewChild('enetitiesPan') enetitiesPan: MatExpansionPanel; + + + constructor(public http: HttpClient, private filtersListService: FiltersListService) { } + + ngOnInit(): void { + this.http.get("../../rest/priorities") + .subscribe((data: any) => { + this.prioritiesList = data.priorities; + this.prioritiesList.forEach((element) => { + element.selected = false; + this.listProperties.priorities.forEach((listPropertyPrio: any) => { + if (element.id === listPropertyPrio.id) { + element.selected = true; + this.prioritiesPan.open(); + } + }); + }); + console.log(this.prioritiesList); + }); + + this.http.get("../../rest/categories") + .subscribe((data: any) => { + this.categoriesList = data.categories; + this.categoriesList.forEach(element => { + element.selected = false; + this.listProperties.categories.forEach((listPropertyCat: any) => { + if (element.id === listPropertyCat.id) { + element.selected = true; + this.categoriesPan.open(); + } + }); + }); + console.log(this.categoriesList); + }); + } + updateFilters(e: MatSelectionList, id: string) { + this.listProperties[id] = []; + e.selectedOptions.selected.forEach(element => { + this.listProperties[id].push({ + 'id' : element.value, + 'label': element._text.nativeElement.innerText + }); + }); + this.filtersListService.updateListsProperties(this.listProperties); + } +} \ No newline at end of file diff --git a/src/frontend/app/basket/note-list.component.html b/src/frontend/app/list/note-list.component.html similarity index 89% rename from src/frontend/app/basket/note-list.component.html rename to src/frontend/app/list/note-list.component.html index c964c1067c0fed4426715afbcd37e7f3f8a9b881..58c3f0d61034994ee9325aa75d968695276dbb7a 100755 --- a/src/frontend/app/basket/note-list.component.html +++ b/src/frontend/app/list/note-list.component.html @@ -21,4 +21,9 @@ <span *ngFor="let entity of note.entities_restriction" class="label label-default" style="background-color:rgba(0,0,0,0.4);white-space:normal;display:inline-block;margin-right: 5px;" title="Entité restreinte"><i class="fa fa-sitemap"></i> {{entity}}</span> </mat-card-content> </mat-card> + <mat-form-field appearance="outline"> + <mat-label>Ecrire une note</mat-label> + <input matInput> + <mat-icon matSuffix></mat-icon> + </mat-form-field> </ng-container> \ No newline at end of file diff --git a/src/frontend/app/list/note-list.component.scss b/src/frontend/app/list/note-list.component.scss new file mode 100644 index 0000000000000000000000000000000000000000..ef0193d9887f854b65d12c5f1f2c47bb38d9b286 --- /dev/null +++ b/src/frontend/app/list/note-list.component.scss @@ -0,0 +1,3 @@ +.mat-form-field-wrapper{ + padding-bottom: 0px; +} \ No newline at end of file diff --git a/src/frontend/app/profile.component.html b/src/frontend/app/profile.component.html index 65e6d4f6569356ff7c0ffd518f1a0bf6c833b974..22e26f2df2ff068e6c6a51e2bf0ac1c22f324b66 100755 --- a/src/frontend/app/profile.component.html +++ b/src/frontend/app/profile.component.html @@ -222,13 +222,13 @@ </mat-list-item> <mat-divider></mat-divider> <ng-container *ngFor="let basket of user.baskets;let i = index"> - <mat-list-item *ngIf="basket.group_id && basket.userToDisplay == ''" (mouseover)="showActions(basket)" (mouseout)="hideActions(basket)" + <mat-list-item *ngIf="basket.group_id && basket.userToDisplay == null" (mouseover)="showActions(basket)" (mouseout)="hideActions(basket)" style="cursor: pointer;"> <mat-icon mat-list-icon color="primary" *ngIf="basket.enabled"> <mat-checkbox (click)="$event.stopPropagation()" (change)="$event ? selectionBaskets.toggle(basket) : null" [checked]="selectionBaskets.isSelected(basket)" color="primary"></mat-checkbox> </mat-icon> - <h4 mat-line [attr.color]="basket.userToDisplay != '' ? 'primary': ''" style="display: flex;align-items: center;"> + <h4 mat-line [attr.color]="basket.userToDisplay != null ? 'primary': ''" style="display: flex;align-items: center;"> <span (click)="selectionBaskets.toggle(basket);" matTooltip="{{basket.basket_name}} [{{basket.group_desc}}]" [ngStyle]="{'opacity': basket.allowed ? '1' : '0.5'}" style="flex: 2;overflow: hidden;text-overflow: ellipsis;"> {{basket.basket_name}} @@ -244,10 +244,10 @@ <mat-tab label="{{lang.basketsRedirected}}"> <mat-list> <ng-container *ngFor="let basket of user.baskets;let i = index"> - <mat-list-item *ngIf="basket.group_id && basket.userToDisplay != ''"> + <mat-list-item *ngIf="basket.group_id && basket.userToDisplay != null"> <mat-icon mat-list-icon color="primary" *ngIf="basket.enabled" style="margin-top:-60px;" class="fa fa-paper-plane"> </mat-icon> - <h4 mat-line [ngStyle]="{'opacity': basket.allowed ? '1' : '0.5'}" [attr.color]="basket.userToDisplay != '' ? 'primary': ''">{{basket.basket_name}} + <h4 mat-line [ngStyle]="{'opacity': basket.allowed ? '1' : '0.5'}" [attr.color]="basket.userToDisplay != null ? 'primary': ''">{{basket.basket_name}} <span class="label label-primary" style="font-weight:normal">{{basket.group_desc}}</span> </h4> <p mat-line [ngStyle]="{'opacity': basket.allowed ? '1' : '0.5'}"> @@ -271,11 +271,11 @@ <mat-list-item *ngIf="!basket.group_id"> <mat-icon mat-list-icon color="primary" style="margin-top:-60px;" class="fa fa-reply"> </mat-icon> - <h4 mat-line [attr.color]="basket.userToDisplay != '' ? 'primary': ''">{{basket.basket_name}} + <h4 mat-line [attr.color]="basket.userToDisplay != null ? 'primary': ''">{{basket.basket_name}} <span class="label label-primary" style="font-weight:normal">{{basket.group_desc}}</span> </h4> <p mat-line> - <mat-form-field *ngIf="basket.userToDisplay == ''" floatLabel="never"> + <mat-form-field *ngIf="basket.userToDisplay == null" floatLabel="never"> <input matTooltip="{{lang.redirectBasket}}" matTooltipPosition="above" type="text" placeholder="{{lang.redirectBasket}}" matInput [matAutocomplete]="auto" [formControl]="userCtrl"> <mat-autocomplete #auto="matAutocomplete"> diff --git a/src/frontend/lang/lang-en.ts b/src/frontend/lang/lang-en.ts index f6ec31924fa10e5a926b7dccdbdbc9f49ff2d82d..32b187cb6d3e05e05effb98c83b6e475ab6bcf8c 100755 --- a/src/frontend/lang/lang-en.ts +++ b/src/frontend/lang/lang-en.ts @@ -697,5 +697,21 @@ export const LANG_EN = { "organization" : "ORGANIZATION", "production" : "PRODUCTION", "classement" : "RANKING", - "supervision" : "SUPERVISION" + "supervision" : "SUPERVISION", + "subject" : "Subject", + "alt_identifier" : "Chrono number", + "process_limit_date" : "Process limit date", + "dest_user" : "Operator", + "destination" : "Entity", + "type_id" : "Document type", + "printResultList" : "Print list", + "exportDatas" : "Export datas", + "settingsList" : "Display settings", + "displayProcessLimitRes" : "Display Process limit document", + "displayNewRes" : "Display new document", + "displayWithAttach" : "Display documents with attachment(s)", + "displayWithNotes" : "Display documents with note(s)", + "ascOrder" : "Asc order", + "descOrder" : "Desc order", + "currentFilters" : "Current filters", }; diff --git a/src/frontend/lang/lang-fr.ts b/src/frontend/lang/lang-fr.ts index 168ba63b7c658405e202e1fc29a19feaee6a078d..cdffc01271be03bb55efcabd4ebe1d8a5ac80491 100755 --- a/src/frontend/lang/lang-fr.ts +++ b/src/frontend/lang/lang-fr.ts @@ -722,5 +722,22 @@ export const LANG_FR = { "organization" : "ORGANISATION", "production" : "PRODUCTION", "classement" : "CLASSEMENT", - "supervision" : "SUPERVISION" + "supervision" : "SUPERVISION", + "subject" : "Objet", + "alt_identifier" : "Numéro chrono", + "creation_date" : "Date de création", + "process_limit_date" : "Date limite de traitement", + "dest_user" : "Attributaire", + "destination" : "Entité", + "type_id" : "Type de document", + "printResultList" : "Imprimer la liste", + "exportDatas" : "Exporter les données", + "settingsList" : "Paramétrer l'affichage", + "displayProcessLimitRes" : "Afficher les courriers en retard", + "displayNewRes" : "Afficher les courriers non lu", + "displayWithAttach" : "Afficher les courriers avec pièce(s) jointe(s)", + "displayWithNotes" : "Afficher les courriers avec annotation(s)", + "ascOrder" : "Ordre ascendant", + "descOrder" : "Ordre descendant", + "currentFilters" : "Filtre(s) actif(s)", }; diff --git a/src/frontend/lang/lang-nl.ts b/src/frontend/lang/lang-nl.ts index c381d6e546190704ba7b5c7518a1d6fe27b05971..39f3c5e475c42c77e9e6810e20c8621d4b2f21be 100755 --- a/src/frontend/lang/lang-nl.ts +++ b/src/frontend/lang/lang-nl.ts @@ -724,6 +724,23 @@ export const LANG_NL = { "organization" : "ORGANISATIE", "production" : "PRODUCTIE", "classement" : "STANDEN", - "supervision" : "TOEZICHT" - + "supervision" : "TOEZICHT", + "subject" : "_TO_TRANSLATE", + "alt_identifier" : "_TO_TRANSLATE", + "creation_date" : "_TO_TRANSLATE", + "process_limit_date" : "_TO_TRANSLATE", + "dest_user" : "_TO_TRANSLATE", + "destination" : "_TO_TRANSLATE", + "type_id" : "_TO_TRANSLATE", + "OrderBy" : "_TO_TRANSLATE", + "printResultList" : "_TO_TRANSLATE", + "exportDatas" : "_TO_TRANSLATE", + "settingsList" : "_TO_TRANSLATE", + "displayProcessLimitRes" : "_TO_TRANSLATE", + "displayNewRes" : "_TO_TRANSLATE", + "displayWithAttach" : "_TO_TRANSLATE", + "displayWithNotes" : "_TO_TRANSLATE", + "ascOrder" : "_TO_TRANSLATE", + "descOrder" : "_TO_TRANSLATE", + "currentFilters" : "_TO_TRANSLATE", }; diff --git a/src/frontend/service/filtersList.service.ts b/src/frontend/service/filtersList.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..d46a10940eefb9d558ba5a7db7e0cc036507c2df --- /dev/null +++ b/src/frontend/service/filtersList.service.ts @@ -0,0 +1,77 @@ +import { Injectable } from '@angular/core'; + +interface listProperties { + 'id' : string, + 'groupId' : number, + 'basketId' : number, + 'page' : string, + 'onlyProcesLimit': boolean, + 'onlyNewRes': boolean, + 'withPj': boolean, + 'withNote': boolean, + 'categories' : string[], + 'priorities' : string[], + 'entities' : string[] +} + +@Injectable() +export class FiltersListService { + + listsProperties: any[] = []; + listsPropertiesIndex: number = 0; + + constructor() { + this.listsProperties = JSON.parse(sessionStorage.getItem('propertyList')); + } + + initListsProperties(userId: string, groupId: number, basketId: number) { + this.listsPropertiesIndex = 0; + let listProperties: listProperties; + + + if (this.listsProperties != null) { + this.listsProperties.forEach((element, index) => { + if (element.id == userId && element.groupId == groupId && element.basketId == basketId) { + this.listsPropertiesIndex = index; + listProperties = element; + } + }); + } else { + this.listsProperties = []; + } + + if (!listProperties) { + listProperties = { + 'id' : userId, + 'groupId' : groupId, + 'basketId' : basketId, + 'page' : '0', + 'onlyProcesLimit': false, + 'onlyNewRes': false, + 'withPj': false, + 'withNote': false, + 'categories' : [], + 'priorities' : [], + 'entities' : [], + }; + this.listsProperties.push(listProperties); + this.saveListsProperties(); + } + return listProperties; + } + + updateListsPropertiesPage(page : number) { + this.listsProperties[this.listsPropertiesIndex].page = page; + this.saveListsProperties(); + } + + updateListsProperties(listProperties : any) { + this.listsProperties[this.listsPropertiesIndex] = listProperties; + this.saveListsProperties(); + } + + saveListsProperties() { + sessionStorage.setItem('propertyList', JSON.stringify(this.listsProperties)); + } + +} diff --git a/src/frontend/service/header.service.ts b/src/frontend/service/header.service.ts index 0b6e598d72b51dd2d04c2e31edd3a4260db060c0..618d1e3f9587b61a46e05a9f7c88e4fbbcda8e59 100755 --- a/src/frontend/service/header.service.ts +++ b/src/frontend/service/header.service.ts @@ -2,6 +2,5 @@ import { Injectable } from '@angular/core'; @Injectable() export class HeaderService { - - headerMessage : string = ""; + headerMessage : string = ""; } diff --git a/test/unitTests/app/user/UserControllerTest.php b/test/unitTests/app/user/UserControllerTest.php index d95aca5c9831fc75cfbf4a6c769a5b14dab4f178..3a843dd413dc2a654f9c4d77447becf1f6be1760 100755 --- a/test/unitTests/app/user/UserControllerTest.php +++ b/test/unitTests/app/user/UserControllerTest.php @@ -790,16 +790,9 @@ class UserControllerTest extends TestCase $request = \Slim\Http\Request::createFromEnvironment($environment); $aArgs = [ [ - 'newUser' => 'bblier', - 'basketId' => 'MyBasket', - 'basketOwner' => 'bbain', - 'virtual' => 'Y' - ], - [ - 'newUser' => 'bblier', - 'basketId' => 'EenvBasket', - 'basketOwner' => 'bbain', - 'virtual' => 'Y' + 'actual_user_id' => 21, + 'basket_id' => 'MyBasket', + 'group_id' => 2 ] ]; @@ -832,16 +825,9 @@ class UserControllerTest extends TestCase $aArgs = [ [ - 'newUser' => 'notExist', - 'basketId' => 'MyBasket', - 'basketOwner' => 'bbain', - 'virtual' => 'Y' - ], - [ - 'newUser' => 'existNot', - 'basketId' => 'EenvBasket', - 'basketOwner' => 'bbain', - 'virtual' => 'Y' + 'actual_user_id' => -1, + 'basket_id' => 'MyBasket', + 'group_id' => 2 ] ]; $fullRequest = \httpRequestCustom::addContentInBody($aArgs, $request); @@ -858,26 +844,26 @@ class UserControllerTest extends TestCase $environment = \Slim\Http\Environment::mock(['REQUEST_METHOD' => 'DELETE']); $request = \Slim\Http\Request::createFromEnvironment($environment); - $aArgs = [ - 'basketOwner' => 'bbain', - ]; - +// $aArgs = [ +// 'basketOwner' => 'bbain', +// ]; +// $user_id = \User\models\UserModel::getByUserId(['userId' => 'bbain', 'select' => ['id']]); - $fullRequest = \httpRequestCustom::addContentInBody($aArgs, $request); - $response = $userController->deleteRedirectedBaskets($fullRequest, new \Slim\Http\Response(), ['id' => $user_id['id'], 'basketId' => 'MyBasket']); - $response = $userController->deleteRedirectedBaskets($fullRequest, new \Slim\Http\Response(), ['id' => $user_id['id'], 'basketId' => 'EenvBasket']); - $responseBody = json_decode((string)$response->getBody()); - - $this->assertNotNull($responseBody->baskets); +// $fullRequest = \httpRequestCustom::addContentInBody($aArgs, $request); +// $response = $userController->deleteRedirectedBasket($fullRequest, new \Slim\Http\Response(), ['id' => $user_id['id'], 'basketId' => 'MyBasket']); +// $response = $userController->deleteRedirectedBasket($fullRequest, new \Slim\Http\Response(), ['id' => $user_id['id'], 'basketId' => 'EenvBasket']); +// $responseBody = json_decode((string)$response->getBody()); +// +// $this->assertNotNull($responseBody->baskets); $aArgs = [ 'basketOwner' => null, ]; $fullRequest = \httpRequestCustom::addContentInBody($aArgs, $request); - $response = $userController->deleteRedirectedBaskets($fullRequest, new \Slim\Http\Response(), ['id' => $user_id['id'], 'basketId' => 'MyBasket']); + $response = $userController->deleteRedirectedBasket($fullRequest, new \Slim\Http\Response(), ['id' => $user_id['id'], 'redirectBasketid' => -1]); $responseBody = json_decode((string)$response->getBody()); - $this->assertSame('Bad Request', $responseBody->errors); + $this->assertSame('Redirected basket out of perimeter', $responseBody->errors); } }