diff --git a/apps/maarch_entreprise/actions/sendToExternalSignatureBook.php b/apps/maarch_entreprise/actions/sendToExternalSignatureBook.php index 84cc291baadd88e21052eb568d5b9c1c028742fe..945e527072bb8190e2838d56348e143bde62e529 100755 --- a/apps/maarch_entreprise/actions/sendToExternalSignatureBook.php +++ b/apps/maarch_entreprise/actions/sendToExternalSignatureBook.php @@ -226,7 +226,13 @@ function manage_form($arr_id, $history, $id_action, $label_action, $status, $col $attachmentToFreeze = IParapheurController::sendDatas(['config' => $config, 'resIdMaster' => $res_id]); } elseif ($config['id'] == 'fastParapheur') { include_once 'modules/visa/class/FastParapheurController.php'; - $attachmentToFreeze = FastParapheurController::sendDatas(['config' => $config, 'resIdMaster' => $res_id]); + $sendedInfo = FastParapheurController::sendDatas(['config' => $config, 'resIdMaster' => $res_id]); + if (!empty($sendedInfo['error'])) { + var_dump($sendedInfo['error']); + exit; + } else { + $attachmentToFreeze = $sendedInfo['sended']; + } } elseif ($config['id'] == 'maarchParapheur') { $listinstances = \Entity\models\ListInstanceModel::getVisaCircuitByResId(['select' => ['external_id', 'users.user_id', 'requested_signature'], 'id' => $res_id]); if (empty($listinstances)) { diff --git a/apps/maarch_entreprise/cas_connect.php b/apps/maarch_entreprise/cas_connect.php index 938b07cb893edc590232af90cd7c7a0362af77b1..d6848fd399913545590b90f24adf9002ac30e843 100755 --- a/apps/maarch_entreprise/cas_connect.php +++ b/apps/maarch_entreprise/cas_connect.php @@ -121,7 +121,7 @@ $trace->add( _CONNECTION_CAS_OK, $_SESSION['config']['databasetype'], "ADMIN", - false + false, 'ok', 'DEBUG', $userId ); exit(); diff --git a/apps/maarch_entreprise/lang/fr.php b/apps/maarch_entreprise/lang/fr.php index 22cbbe93e2f21ab6a446cb3a01cc0f79677f0f27..2d28ae6673364670e547f8c6ed866789574ec7df 100755 --- a/apps/maarch_entreprise/lang/fr.php +++ b/apps/maarch_entreprise/lang/fr.php @@ -1460,7 +1460,7 @@ if (!defined('_ADD_ATTACHMENT_OR_NOTE')) { define('_ADD_ATTACHMENT_OR_NOTE', 'Ajoutez une pièce jointe ou une annotation pour ce(s) courrier(s)'); } if (!defined('_CLOSE_MAIL_WITH_ATTACHMENT')) { - define('_CLOSE_MAIL_WITH_ATTACHMENT', 'Clôturer un courrier avec pièce jointe'); + define('_CLOSE_MAIL_WITH_ATTACHMENT', 'Clôturer un courrier avec pièce jointe ou annotation'); } // if (!defined('_CLOSE_MAIL_WITH_ATTACHMENT_DESC')) { // define('_CLOSE_MAIL_WITH_ATTACHMENT_DESC', "Permet de mettre à jour la date de clôture d'un courrier ('closing_date' de la table res_letterbox) avec présence OBLIGATOIRE de pièce(s) jointe(s) / annotation(s)."); @@ -4028,9 +4028,6 @@ if (!defined('_REDIRECT_WORKFLOW_ENTITY_DESC')) { if (!defined('_VISA_MAIL')) { define('_VISA_MAIL', 'Viser le courrier'); } -if (!defined('_VISA_MAIL_DESC')) { - define('_VISA_MAIL_DESC', 'Ouvre la page du parapheur afin de pouvoir viser / signer le document.'); -} if (!defined('_PREPARE_VISA')) { define('_PREPARE_VISA', 'Préparer le circuit de visa'); } diff --git a/apps/maarch_entreprise/lang/nl.php b/apps/maarch_entreprise/lang/nl.php index 425718895ca09c768c032a2f6e65fd2a3186025f..a6cce23424953a2a1615aa5bbb90a085712c8be1 100755 --- a/apps/maarch_entreprise/lang/nl.php +++ b/apps/maarch_entreprise/lang/nl.php @@ -1287,7 +1287,6 @@ if (!defined('_RESET_VISA_WORKFLOW_DESC')) { define('_RESET_VISA_WORKFLOW_DESC', if (!defined('_REJECTION_WORKFLOW_PREVIOUS')) { define('_REJECTION_WORKFLOW_PREVIOUS', 'De goedkeuring weigeren - terug naar de vorige goedkeurder');} if (!defined('_REJECTION_WORKFLOW_PREVIOUS_DESC')) { define('_REJECTION_WORKFLOW_PREVIOUS_DESC', 'Reset de datum van de vorige goedkeurder die in het goedkeuringscircuit van het brief aanwezig is (process_date van de tabel listinstance).');} if (!defined('_VISA_MAIL')) { define('_VISA_MAIL', 'De e-mail goedkeuren');} -if (!defined('_VISA_MAIL_DESC')) { define('_VISA_MAIL_DESC', 'Opent de pagina van de parafeerder om het document te kunnen goedkeuren / ondertekenen.');} if (!defined('_PREPARE_VISA')) { define('_PREPARE_VISA', 'Het goedkeuringscircuit voorbereiden');} if (!defined('_SEND_TO_VISA')) { define('_SEND_TO_VISA', 'Versturen voor goedkeuring');} if (!defined('_SEND_TO_VISA_DESC')) { define('_SEND_TO_VISA_DESC', 'Controleert of er een goedkeuringscircuit is geconfigureerd EN of er één of meerdere antwoordprojecten aan het brief gekoppeld zijn.');} diff --git a/apps/maarch_entreprise/log.php b/apps/maarch_entreprise/log.php index 48aa5afb66a7cf9336048ac2e4c097331cb23817..d3bdd15333a4491da0363508d6bbf6e0dcccee16 100755 --- a/apps/maarch_entreprise/log.php +++ b/apps/maarch_entreprise/log.php @@ -65,6 +65,7 @@ if (isset($_SESSION['web_cas_url'])) { } elseif (!empty($_SESSION['sso']['userId'])) { $login = $_SESSION['sso']['userId']; $_REQUEST['pass'] = 'maarch'; + $method = 'sso'; } elseif (isset($_REQUEST['login'])) { $login = $func->wash($_REQUEST['login'], 'no', _THE_ID, 'yes'); } else { diff --git a/apps/maarch_entreprise/ozwilloConnect.php b/apps/maarch_entreprise/ozwilloConnect.php index 40e87de79e33c2cbb350ce5bbd185271a00796d4..88b256dea37433314d97fbac5d1ff2ff9d3056bd 100755 --- a/apps/maarch_entreprise/ozwilloConnect.php +++ b/apps/maarch_entreprise/ozwilloConnect.php @@ -50,4 +50,4 @@ unset($_REQUEST['state']); header("location: log.php"); $trace = new history(); -$trace->add('users', $idToken->sub, 'LOGIN', 'userlogin', 'Ozwillo Connection', $_SESSION['config']['databasetype'], 'ADMIN', false); +$trace->add('users', $idToken->sub, 'LOGIN', 'userlogin', 'Ozwillo Connection', $_SESSION['config']['databasetype'], 'ADMIN', false, 'ok', 'DEBUG', $_SESSION['ozwillo']['userId']); diff --git a/bin/external/localeo/LocaleoScript.php b/bin/external/localeo/LocaleoScript.php new file mode 100644 index 0000000000000000000000000000000000000000..bbf8755df56ad834e14726ab81f41cc875e9282b --- /dev/null +++ b/bin/external/localeo/LocaleoScript.php @@ -0,0 +1,320 @@ +<?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 Localeo Script + * @author dev@maarch.org + */ + +chdir('../../..'); + +require 'vendor/autoload.php'; + +LocaleoScript::sendContact($argv); +LocaleoScript::updateContact($argv); + +class LocaleoScript +{ + const MAPPING_CONTACT = [ + 'civility' => 'civility', + 'company' => 'company', + 'firstname' => 'firstname', + 'familyName' => 'lastname', + 'email' => 'email', + 'phone' => 'phone', + 'num' => 'address_number', + 'street' => 'address_street', + 'ZC' => 'address_postcode', + 'additionalAddress' => 'address_additional1', + 'city' => 'address_town', + 'country' => 'address_country', + 'externalId' => 'id' + ]; + + public static function sendContact(array $args) + { + $customId = null; + if (!empty($args[1]) && $args[1] == '--customId' && !empty($args[2])) { + $customId = $args[2]; + } + + $configuration = LocaleoScript::getXmlLoaded(['path' => 'bin/external/localeo/config.xml', 'customId' => $customId]); + if (empty($configuration)) { + self::writeLog(['message' => "[SEND_CONTACT] File bin/external/localeo/config.xml does not exist"]); + exit(); + } elseif (empty($configuration->apiKey) || empty($configuration->appName) || empty($configuration->sendContact)) { + self::writeLog(['message' => "[SEND_CONTACT] File bin/external/localeo/config.xml is not filled enough"]); + return; + } + if ((string)$configuration->sendContact->enabled == 'false') { + return; + } + + $apiKey = (string)$configuration->apiKey; + $appName = (string)$configuration->appName; + $url = (string)$configuration->sendContact->url; + if (empty($url)) { + self::writeLog(['message' => "[SEND_CONTACT] File bin/external/localeo/config.xml is not filled enough"]); + return; + } + + $dataToMerge = []; + if (!empty($configuration->sendContact->data)) { + foreach ($configuration->sendContact->data as $value) { + $dataToMerge[(string)$value->key] = (string)$value->value; + } + } + + \SrcCore\models\DatabasePDO::reset(); + new \SrcCore\models\DatabasePDO(['customId' => $customId]); + + $contacts = \Contact\models\ContactModel::get([ + 'select' => ['*'], + 'where' => ['enabled = ?', "external_id->>'localeoId' is null"], + 'data' => [true] + ]); + + foreach ($contacts as $contact) { + $body = []; + foreach (self::MAPPING_CONTACT as $key => $value) { + $body[$key] = $contact[$value] ?? ''; + } + $body = array_merge($body, $dataToMerge); + + $response = \SrcCore\models\CurlModel::execSimple([ + 'url' => $url, + 'method' => 'NO-METHOD', + 'headers' => ["Api-Key: {$apiKey}", "appName: {$appName}"], + 'body' => ['citoyen' => json_encode($body)], + 'noLogs' => true + ]); + + if (!empty($response['errors'])) { + self::writeLog(['message' => "[SEND_CONTACT] Contact {$contact['id']} : curl call failed"]); + self::writeLog(['message' => $response['errors']]); + continue; + } elseif (empty($response['response']['id'])) { + self::writeLog(['message' => "[SEND_CONTACT] Contact {$contact['id']} : id is missing"]); + self::writeLog(['message' => json_encode($response['response'])]); + continue; + } + + $externalId = json_decode($contact['external_id'], true); + $externalId['localeoId'] = $response['response']['id']; + \Contact\models\ContactModel::update(['set' => ['external_id' => json_encode($externalId)], 'where' => ['id = ?'], 'data' => [$contact['id']]]); + + self::writeLog(['message' => "[SEND_CONTACT] Contact {$contact['id']} : successfully sent to localeo"]); + } + } + + public static function updateContact(array $args) + { + $customId = null; + if (!empty($args[1]) && $args[1] == '--customId' && !empty($args[2])) { + $customId = $args[2]; + } + + $configuration = LocaleoScript::getXmlLoaded(['path' => 'bin/external/localeo/config.xml', 'customId' => $customId]); + if (empty($configuration)) { + self::writeLog(['message' => "[UPDATE_CONTACT] File bin/external/localeo/config.xml does not exist"]); + exit(); + } elseif (empty($configuration->apiKey) || empty($configuration->appName) || empty($configuration->updateContact)) { + self::writeLog(['message' => "[UPDATE_CONTACT] File bin/external/localeo/config.xml is not filled enough"]); + return; + } + if ((string)$configuration->updateContact->enabled == 'false') { + return; + } + + $apiKey = (string)$configuration->apiKey; + $appName = (string)$configuration->appName; + $url = (string)$configuration->updateContact->url; + if (empty($url)) { + self::writeLog(['message' => "[UPDATE_CONTACT] File bin/external/localeo/config.xml is not filled enough"]); + return; + } + + $dataToMerge = []; + if (!empty($configuration->updateContact->data)) { + foreach ($configuration->updateContact->data as $value) { + $dataToMerge[(string)$value->key] = (string)$value->value; + } + } + + \SrcCore\models\DatabasePDO::reset(); + new \SrcCore\models\DatabasePDO(['customId' => $customId]); + + $where = ['enabled = ?', "external_id->>'localeoId' is not null"]; + $data = [true]; + if (file_exists('bin/external/localeo/updateContact.timestamp')) { + $time = file_get_contents('bin/external/localeo/updateContact.timestamp'); + $where[] = 'modification_date > ?'; + $data[] = date('Y-m-d H:i:s', $time); + + } + $file = fopen('bin/external/localeo/updateContact.timestamp', 'w'); + fwrite($file, time()); + fclose($file); + + $contacts = \Contact\models\ContactModel::get([ + 'select' => ['*'], + 'where' => $where, + 'data' => $data + ]); + + foreach ($contacts as $contact) { + $externalId = json_decode($contact['external_id'], true); + + $body = []; + foreach (self::MAPPING_CONTACT as $key => $value) { + $body[$key] = $contact[$value] ?? ''; + } + $body['id'] = $externalId['localeoId']; + $body = array_merge($body, $dataToMerge); + + $response = \SrcCore\models\CurlModel::execSimple([ + 'url' => $url, + 'method' => 'NO-METHOD', + 'headers' => ["Api-Key: {$apiKey}", "appName: {$appName}"], + 'body' => ['citoyen' => json_encode($body)], + 'noLogs' => true + ]); + + if (!empty($response['errors'])) { + self::writeLog(['message' => "[UPDATE_CONTACT] Contact {$contact['id']} : curl call failed"]); + self::writeLog(['message' => $response['errors']]); + continue; + } elseif (empty($response['response']['id'])) { + self::writeLog(['message' => "[UPDATE_CONTACT] Contact {$contact['id']} : id is missing"]); + self::writeLog(['message' => json_encode($response['response'])]); + continue; + } + + self::writeLog(['message' => "[UPDATE_CONTACT] Contact {$contact['id']} : successfully sent to localeo"]); + } + } + +// public static function sendResource(array $args) +// { +// $customId = null; +// if (!empty($args[1]) && $args[1] == '--customId' && !empty($args[2])) { +// $customId = $args[2]; +// } +// +// $configuration = LocaleoScript::getXmlLoaded(['path' => 'bin/external/localeo/config.xml', 'customId' => $customId]); +// if (empty($configuration)) { +// self::writeLog(['message' => "[SEND_RESOURCE] File bin/external/localeo/config.xml does not exist"]); +// exit(); +// } elseif (empty($configuration->apiKey) || empty($configuration->appName) || empty($configuration->sendResource)) { +// self::writeLog(['message' => "[SEND_RESOURCE] File bin/external/localeo/config.xml is not filled enough"]); +// return; +// } +// if ((string)$configuration->sendResource->enabled == 'false') { +// return; +// } +// +// $apiKey = (string)$configuration->apiKey; +// $appName = (string)$configuration->appName; +// $url = (string)$configuration->sendResource->url; +// if (empty($url)) { +// self::writeLog(['message' => "[SEND_RESOURCE] File bin/external/localeo/config.xml is not filled enough"]); +// return; +// } +// +// $dataToMerge = []; +// if (!empty($configuration->sendResource->data)) { +// foreach ($configuration->sendResource->data as $value) { +// $dataToMerge[(string)$value->key] = (string)$value->value; +// } +// } +// +// \SrcCore\models\DatabasePDO::reset(); +// new \SrcCore\models\DatabasePDO(['customId' => $customId]); +// +// $resources = \Resource\models\ResModel::get([ +// 'select' => ['res_id', 'subject', 'format', 'path', 'filename', 'docserver_id', 'external_id'], +// 'where' => ["external_id->>'localeoId' is null"] +// ]); +// +// foreach ($resources as $resource) { +// if (empty($resource['filename'])) { +// self::writeLog(['message' => "[SEND_FILE] Resource {$resource['res_id']} : ({$resource['subject']}) has no file"]); +// continue; +// } +// +// $docserver = \Docserver\models\DocserverModel::getByDocserverId(['docserverId' => $resource['docserver_id'], 'select' => ['path_template']]); +// $file = file_get_contents($docserver['path_template'] . str_replace('#', '/', $resource['path']) . $resource['filename']); +// if (empty($file)) { +// self::writeLog(['message' => "[SEND_FILE] Resource {$resource['res_id']} : ({$resource['subject']}) file is missing"]); +// continue; +// } +// +// $encodedFile = base64_encode($file); +// +// if (!empty($config['file'])) { +// $docserver = \Docserver\models\DocserverModel::getByDocserverId(['docserverId' => $_SESSION['indexing']['docserver_id'], 'select' => ['path_template']]); +// $bodyData[$config['file']] = \SrcCore\models\CurlModel::makeCurlFile(['path' => $docserver['path_template'] . str_replace('#', '/', $_SESSION['indexing']['destination_dir']) . $_SESSION['indexing']['file_destination_name']]); +// } +// +// $body = []; +// foreach (self::MAPPING_CONTACT as $key => $value) { +// $body[$key] = $contact[$value] ?? ''; +// } +// $body = array_merge($body, $dataToMerge); +// +// $response = \SrcCore\models\CurlModel::execSimple([ +// 'url' => $url, +// 'method' => 'NO-METHOD', +// 'headers' => ["Api-Key: {$apiKey}", "appName: {$appName}"], +// 'body' => [$objectName => json_encode($body)], +// 'noLogs' => true +// ]); +// +// if (!empty($response['errors'])) { +// self::writeLog(['message' => "[SEND_CONTACT] Contact {$contact['id']} : curl call failed"]); +// self::writeLog(['message' => $response['errors']]); +// continue; +// } elseif (empty($response['response']['id'])) { +// self::writeLog(['message' => "[SEND_CONTACT] Contact {$contact['id']} : id is missing"]); +// self::writeLog(['message' => json_encode($response['response'])]); +// continue; +// } +// +// $externalId = json_decode($contact['external_id'], true); +// $externalId['localeoId'] = $response['response']['id']; +// \Contact\models\ContactModel::update(['set' => ['external_id' => json_encode($externalId)], 'where' => ['id = ?'], 'data' => [$contact['id']]]); +// +// self::writeLog(['message' => "[SEND_CONTACT] Contact {$contact['id']} : successfully sent to localeo"]); +// } +// } + + public static function getXmlLoaded(array $args) + { + if (!empty($args['customId']) && file_exists("custom/{$args['customId']}/{$args['path']}")) { + $path = "custom/{$args['customId']}/{$args['path']}"; + } + if (empty($path)) { + $path = $args['path']; + } + + $xmlfile = null; + if (file_exists($path)) { + $xmlfile = simplexml_load_file($path); + } + + return $xmlfile; + } + + public static function writeLog(array $args) + { + $file = fopen('bin/external/localeo/localeoScript.log', 'a'); + fwrite($file, '[' . date('Y-m-d H:i:s') . '] ' . $args['message'] . PHP_EOL); + fclose($file); + } +} diff --git a/bin/external/localeo/config.xml b/bin/external/localeo/config.xml new file mode 100644 index 0000000000000000000000000000000000000000..92bc3cd2a0322e2fa4904a308b31450981110d23 --- /dev/null +++ b/bin/external/localeo/config.xml @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="utf-8"?> +<ROOT> + <apiKey></apiKey> + <appName></appName> + <sendContact> + <enabled>false</enabled> + <url></url> + <data> + <key>cityId</key> + <value>73</value> + </data> + </sendContact> + <updateContact> + <enabled>true</enabled> + <url></url> + <data> + <key>cityId</key> + <value>73</value> + </data> + </updateContact> + <sendResource> + <enabled>false</enabled> + <url></url> + <data> + <key>cityId</key> + <value>73</value> + </data> + <data> + <key>servId</key> + <value>4129</value> + </data> + <data> + <key>sqrtId</key> + <value>12178</value> + </data> + <data> + <key>qrtId</key> + <value>125</value> + </data> + </sendResource> +</ROOT> diff --git a/bin/external/localeo/localeo.sh b/bin/external/localeo/localeo.sh new file mode 100644 index 0000000000000000000000000000000000000000..a5beb1392a64f89660cbdcd0524dac4a829dd2a1 --- /dev/null +++ b/bin/external/localeo/localeo.sh @@ -0,0 +1,3 @@ +#!/bin/sh +cd /var/www/html/maarch_trunk/bin/external/localeo/ +php LocaleoScript.php --customId diff --git a/bin/external/ozwillo/OzwilloScript.php b/bin/external/ozwillo/OzwilloScript.php index e54bc2c3cf9395f845d74c51e9428c3909be7ca5..ba9d954911de39b0dfa8bd526d8924d77988ae7d 100644 --- a/bin/external/ozwillo/OzwilloScript.php +++ b/bin/external/ozwillo/OzwilloScript.php @@ -32,14 +32,14 @@ class OzwilloScript if (empty($configuration)) { self::writeLog(['message' => "[SEND_FILE] File bin/external/ozwillo/config.xml does not exist"]); exit(); - } elseif (empty($configuration->user) || empty($configuration->password) || empty($configuration->uri) || empty($configuration->triggerStatuses->sendFile)) { + } elseif (empty($configuration->user) || empty($configuration->password) || empty($configuration->sendFile->uri) || empty($configuration->sendFile->status)) { self::writeLog(['message' => "[SEND_FILE] File bin/external/ozwillo/config.xml is not filled enough"]); - exit(); + return; } $user = (string)$configuration->user; $password = (string)$configuration->password; - $uri = (string)$configuration->uri; - $status = (string)$configuration->triggerStatuses->sendFile; + $uri = (string)$configuration->sendFile->uri; + $status = (string)$configuration->sendFile->status; \SrcCore\models\DatabasePDO::reset(); new \SrcCore\models\DatabasePDO(['customId' => $customId]); @@ -85,7 +85,7 @@ class OzwilloScript continue; } elseif (empty($response['response']['publikId'])) { self::writeLog(['message' => "[SEND_FILE] Resource {$resource['res_id']} : ({$resource['subject']}) publikId is missing"]); - self::writeLog(['message' => $response['response']]); + self::writeLog(['message' => json_encode($response['response'])]); continue; } @@ -108,14 +108,14 @@ class OzwilloScript if (empty($configuration)) { self::writeLog(['message' => "[SEND_DATA] File bin/external/ozwillo/config.xml does not exist"]); exit(); - } elseif (empty($configuration->user) || empty($configuration->password) || empty($configuration->uri) || empty($configuration->triggerStatuses->sendData)) { + } elseif (empty($configuration->user) || empty($configuration->password) || empty($configuration->sendData->uri) || empty($configuration->sendData->status)) { self::writeLog(['message' => "[SEND_DATA] File bin/external/ozwillo/config.xml is not filled enough"]); - exit(); + return; } $user = (string)$configuration->user; $password = (string)$configuration->password; - $uri = (string)$configuration->uri; - $status = (string)$configuration->triggerStatuses->sendData; + $uri = (string)$configuration->sendData->uri; + $status = (string)$configuration->sendData->status; \SrcCore\models\DatabasePDO::reset(); new \SrcCore\models\DatabasePDO(['customId' => $customId]); diff --git a/bin/external/ozwillo/config.xml b/bin/external/ozwillo/config.xml index 959ad8388b7e3b8a1a2be28e7a02426e3ec91228..d60b6cd7f6ef55a24e3579ada6f73c87a248fa21 100644 --- a/bin/external/ozwillo/config.xml +++ b/bin/external/ozwillo/config.xml @@ -2,9 +2,12 @@ <ROOT> <user>superadmin</user> <password>maarch</password> - <uri></uri> - <triggerStatuses> - <sendFile>OZWILLOSF</sendFile> - <sendData>OZWILLOSD</sendData> - </triggerStatuses> + <sendFile> + <uri></uri> + <status>OZWILLOSF</status> + </sendFile> + <sendData> + <uri></uri> + <status>OZWILLOSD</status> + </sendData> </ROOT> diff --git a/bin/external/ozwillo/ozwillo.sh b/bin/external/ozwillo/ozwillo.sh index f2e8bd38662d666024168a9085fb70e1d71712a5..00bacb93988cb012b8deb3d33fa62bd29a41dcb9 100644 --- a/bin/external/ozwillo/ozwillo.sh +++ b/bin/external/ozwillo/ozwillo.sh @@ -1,3 +1,3 @@ #!/bin/sh cd /var/www/html/MaarchCourrier/bin/external/ozwillo/ -php OzwilloScript.php --customId +php OzwilloScript.php --customId monCustom diff --git a/core/class/class_history.php b/core/class/class_history.php index 84d722595f16cd35650f5cd8bef504521339a23d..bc5ec4db62a6dacc65d86dd0fd4ebd21b59ce0e7 100755 --- a/core/class/class_history.php +++ b/core/class/class_history.php @@ -112,10 +112,13 @@ class history } $remote_ip = $REMOTE_ADDR; - $user = ''; + if (empty($user)) { + $user = ''; + } if (isset($_SESSION['user']['UserId'])) { $user = $_SESSION['user']['UserId']; } + \SrcCore\models\ValidatorModel::notEmpty(['user' => $user], ['user']); $traceInformations = array( 'WHERE' => $table_name, diff --git a/core/class/class_security.php b/core/class/class_security.php index b8e25ac98d2552debd119fa5c485460c7d453b68..e3f275eb497a3f495d42da8863a823e7a53137a4 100755 --- a/core/class/class_security.php +++ b/core/class/class_security.php @@ -125,7 +125,7 @@ class security extends Database } $check = \SrcCore\models\AuthenticationModel::authentication(['userId' => $s_login, 'password' => $pass]); - if ($check || (in_array($method, ['ldap', 'shibboleth', 'cas']) && $standardConnect == 'false')) { + if ($check || (in_array($method, ['ldap', 'shibboleth', 'cas', 'sso']) && $standardConnect == 'false')) { $user = $uc->getWithComp($s_login, $comp, $params); } diff --git a/core/xml/actions_pages.xml b/core/xml/actions_pages.xml index 4bb476d01aa01d547fa2f2a65078ab380ad56e71..cfa85089cca9bda8213be6f10a018e96f1586e0b 100755 --- a/core/xml/actions_pages.xml +++ b/core/xml/actions_pages.xml @@ -199,19 +199,6 @@ An action page is described in a ACTIONPAGE tag : <COLLECTIONS> <COLL_ID>letterbox_coll</COLL_ID> </COLLECTIONS> - </ACTIONPAGE> - <ACTIONPAGE> - <ID>visa_mail</ID> - <LABEL>_VISA_MAIL</LABEL> - <NAME>visa_mail</NAME> - <DESC>_VISA_MAIL_DESC</DESC> - <component>signatureBookAction</component> - <ORIGIN>module</ORIGIN> - <MODULE>visa</MODULE> - <FLAG_CREATE>false</FLAG_CREATE> - <COLLECTIONS> - <COLL_ID>letterbox_coll</COLL_ID> - </COLLECTIONS> </ACTIONPAGE> <ACTIONPAGE> <ID>visa_workflow</ID> diff --git a/migration/19.04/1904.sql b/migration/19.04/1904.sql index 514e5e5604846a8907fb2b9776a06fa045ee719a..73a53032aa47af84ae382fe4095788f8c972dfab 100644 --- a/migration/19.04/1904.sql +++ b/migration/19.04/1904.sql @@ -38,8 +38,8 @@ DO $$ BEGIN 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 usergroup_content.user_id = user_abs.basket_owner + and users.user_id = user_abs.basket_owner and us.user_id = user_abs.new_user and groupbasket.group_id = usergroup_content.group_id and groupbasket.basket_id = user_abs.basket_id; diff --git a/migration/20.03/2003.sql b/migration/20.03/2003.sql index 1b65b6487b715802a1a49235acbc0c26e8e132b1..99efcccfe4f56abccfb8fcc0f71ce8542ba8dcde 100644 --- a/migration/20.03/2003.sql +++ b/migration/20.03/2003.sql @@ -83,6 +83,9 @@ where group_id in ( ); -- /!\ Do not move : update actions AFTER all updates on groupbasket +DELETE FROM actions_categories WHERE action_id in (SELECT id FROM actions WHERE component = 'viewDoc' OR action_page in ('view', 'validate_mail', 'process', 'visa_mail')); +DELETE FROM actions_groupbaskets WHERE id_action in (SELECT id FROM actions WHERE component = 'viewDoc' OR action_page in ('view', 'validate_mail', 'process', 'visa_mail')); +DELETE FROM groupbasket_redirect WHERE action_id in (SELECT id FROM actions WHERE component = 'viewDoc' OR action_page in ('view', 'validate_mail', 'process', 'visa_mail')); DELETE FROM actions WHERE component = 'viewDoc' OR action_page in ('view', 'validate_mail', 'process', 'visa_mail'); UPDATE actions SET component = 'rejectVisaBackToPreviousAction' WHERE action_page = 'rejection_visa_previous'; @@ -727,6 +730,8 @@ DO $$ BEGIN END$$; UPDATE baskets set basket_clause = replace(basket_clause, 'nature_id' , 'custom_fields->>''1'''); +UPDATE history SET user_id = (select user_id from users order by user_id='superadmin' desc limit 1) where user_id = ''; + /* users followed resources */ DROP TABLE IF EXISTS users_followed_resources; CREATE TABLE users_followed_resources diff --git a/modules/visa/class/FastParapheurController.php b/modules/visa/class/FastParapheurController.php index 781ba8f02a4bc7cdbdf849237c8eb2aff36bf27d..1310907a50540ad1b8b2b487d0822205c8b7ff28 100755 --- a/modules/visa/class/FastParapheurController.php +++ b/modules/visa/class/FastParapheurController.php @@ -16,7 +16,7 @@ class FastParapheurController { public static function retrieveSignedMails($aArgs) { - foreach($aArgs['idsToRetrieve']['noVersion'] as $noVersion){ + foreach ($aArgs['idsToRetrieve']['noVersion'] as $noVersion) { $xmlPostString = '<?xml version="1.0" encoding="utf-8"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sei="http://sei.ws.fast.cdc.com/"> <soapenv:Header/> @@ -38,23 +38,23 @@ class FastParapheurController ]); $isError = $curlReturn['response']->children('http://schemas.xmlsoap.org/soap/envelope/')->Body; - if(!empty($isError ->Fault[0])){ + if (!empty($isError ->Fault[0])) { // TODO gestion des erreurs - echo _PJ_NUMBER . $noVersion->res_id . ' ' . _AND_DOC_ORIG . $noVersion->res_id_master . ' : ' . (string)$curlReturn['response']->children('http://schemas.xmlsoap.org/soap/envelope/')->Body->Fault[0]->children()->faultstring . PHP_EOL; + echo 'PJ n° ' . $noVersion->res_id . ' et document original n° ' . $noVersion->res_id_master . ' : ' . (string)$curlReturn['response']->children('http://schemas.xmlsoap.org/soap/envelope/')->Body->Fault[0]->children()->faultstring . PHP_EOL; continue; } $response = $curlReturn['response']->children('http://schemas.xmlsoap.org/soap/envelope/')->Body->children('http://sei.ws.fast.cdc.com/')->historyResponse->children(); - foreach ($response->return as $res){ // Loop on all steps of the documents (prepared, send to signature, signed etc...) + foreach ($response->return as $res) { // Loop on all steps of the documents (prepared, send to signature, signed etc...) $state = (string) $res->stateName; - if($state == $aArgs['config']['data']['validatedState']){ + if ($state == $aArgs['config']['data']['validatedState']) { $response = self::download(['config' => $aArgs['config'], 'documentId' => $noVersion->external_id]); $aArgs['idsToRetrieve']['noVersion'][$noVersion->res_id]->status = 'validated'; $aArgs['idsToRetrieve']['noVersion'][$noVersion->res_id]->format = 'pdf'; $aArgs['idsToRetrieve']['noVersion'][$noVersion->res_id]->encodedFile = $response['b64FileContent']; break; - }else if($state == $aArgs['config']['data']['refusedState']){ + } elseif ($state == $aArgs['config']['data']['refusedState']) { $GLOBALS['db'] = new \SrcCore\models\DatabasePDO(['customId' => $GLOBALS['CustomId']]); $query = $GLOBALS['db']->query( "SELECT user_id, firstname, lastname FROM listinstance LEFT JOIN users ON item_id = user_id WHERE res_id = ? AND item_mode = ?", @@ -66,7 +66,7 @@ class FastParapheurController $aArgs['idsToRetrieve']['noVersion'][$noVersion->res_id]->status = 'refused'; $aArgs['idsToRetrieve']['noVersion'][$noVersion->res_id]->noteContent = $res->lastname . ' ' . $res->firstname . ' : ' . $response; break; - }else{ + } else { $aArgs['idsToRetrieve']['noVersion'][$noVersion->res_id]->status = 'waiting'; } } @@ -74,8 +74,9 @@ class FastParapheurController return $aArgs['idsToRetrieve']; } - public static function upload($aArgs){ - $circuitId = $aArgs['circuitId']; + public static function upload($aArgs) + { + $circuitId = $aArgs['circuitId']; $label = $aArgs['label']; $subscriberId = $aArgs['businessId']; @@ -87,7 +88,7 @@ class FastParapheurController 'data' => [$aArgs['resIdMaster']] ]); - if($annexes['letterbox'][0]['category_id'] !== 'outgoing'){ + if ($annexes['letterbox'][0]['category_id'] !== 'outgoing') { $letterboxPath = \Docserver\models\DocserverModel::getByDocserverId(['docserverId' => $annexes['letterbox'][0]['docserver_id'], 'select' => ['path_template']]); $annexes['letterbox'][0]['filePath'] = $letterboxPath['path_template'] . str_replace('#', DIRECTORY_SEPARATOR, $annexes['letterbox'][0]['path']) . $annexes['letterbox'][0]['filename']; } @@ -109,7 +110,7 @@ class FastParapheurController $attachments = \Attachment\models\AttachmentModel::get([ 'select' => ['res_id', 'title', 'attachment_type','path', 'res_id_master', 'format'], - 'where' => ['res_id_master = ?', 'attachment_type not in (?)', "status not in ('DEL', 'OBS')", 'in_signature_book = TRUE'], + 'where' => ['res_id_master = ?', 'attachment_type not in (?)', "status not in ('DEL', 'OBS', 'FRZ')", 'in_signature_book = TRUE'], 'data' => [$aArgs['resIdMaster'], ['converted_pdf', 'incoming_mail_attachment', 'print_folder', 'signed_response']] ]); @@ -122,25 +123,26 @@ class FastParapheurController $attachmentPath = \Docserver\models\DocserverModel::getByDocserverId(['docserverId' => $adrInfo['docserver_id'], 'select' => ['path_template']]); $attachmentFilePath = $attachmentPath['path_template'] . str_replace('#', DIRECTORY_SEPARATOR, $adrInfo['path']) . $adrInfo['filename']; - $attachmentFileName = 'projet_courrier_' . $attachments[$i]['res_id_master'] . '_' . rand(0001,9999) . '.pdf'; + $attachmentFileName = 'projet_courrier_' . $attachments[$i]['res_id_master'] . '_' . rand(0001, 9999) . '.pdf'; $zip = new ZipArchive(); $tmpPath = \SrcCore\models\CoreConfigModel::getTmpPath(); $zipFilePath = $tmpPath . DIRECTORY_SEPARATOR . $attachmentFileName . '.zip'; // The zip file need to have the same name as the attachment we want to sign - if ($zip->open($zipFilePath, ZipArchive::CREATE)!==TRUE) { + if ($zip->open($zipFilePath, ZipArchive::CREATE)!==true) { exit(_ERROR_CREATE_ZIP . "<$zipFilePath>\n"); } $zip->addFile($attachmentFilePath, $attachmentFileName); - if($annexes['letterbox'][0]['category_id'] !== 'outgoing'){ + if ($annexes['letterbox'][0]['category_id'] !== 'outgoing') { $zip->addFile($annexes['letterbox'][0]['filePath'], 'document_principal.' . $annexes['letterbox'][0]['format']); } - if(isset($annexes['attachments'])) { + if (isset($annexes['attachments'])) { for ($j = 0; $j < count($annexes['attachments']); $j++) { - $zip->addFile($annexes['attachments'][$j]['filePath'], + $zip->addFile( + $annexes['attachments'][$j]['filePath'], 'PJ_' . ($j + 1) . '.' . $annexes['attachments'][$j]['format'] ); } @@ -178,20 +180,22 @@ class FastParapheurController ] ]); - $isError = $curlReturn['response']->children('http://schemas.xmlsoap.org/soap/envelope/')->Body; - if(!empty($isError ->Fault[0])){ - // TODO gestion des erreurs - //echo (string)$curlReturn['response']->children('http://schemas.xmlsoap.org/soap/envelope/')->Body->Fault[0]->children()->faultstring . PHP_EOL; - return false; - }else{ + if (!empty($curlReturn['error'])) { + return ['error' => $curlReturn['error']]; + } elseif (!empty($curlReturn['response']->children('http://schemas.xmlsoap.org/soap/envelope/')->Body->Fault[0])) { + $error = (string)$curlReturn['response']->children('http://schemas.xmlsoap.org/soap/envelope/')->Body->Fault[0]->children()->faultstring . PHP_EOL; + return ['error' => $error]; + } else { $documentId = $curlReturn['response']->children('http://schemas.xmlsoap.org/soap/envelope/')->Body->children('http://sei.ws.fast.cdc.com/')->uploadResponse->children(); $attachmentToFreeze[$collId][$resId] = (string) $documentId; } } - return $attachmentToFreeze; + + return ['sended' => $attachmentToFreeze]; } - public static function download($aArgs){ + public static function download($aArgs) + { $xmlPostString = '<?xml version="1.0" encoding="utf-8"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sei="http://sei.ws.fast.cdc.com/"> <soapenv:Header/> @@ -213,17 +217,17 @@ class FastParapheurController ]); $isError = $curlReturn['response']->children('http://schemas.xmlsoap.org/soap/envelope/')->Body; - if(!empty($isError ->Fault[0])){ + if (!empty($isError ->Fault[0])) { // TODO gestion des erreurs echo (string)$curlReturn['response']->children('http://schemas.xmlsoap.org/soap/envelope/')->Body->Fault[0]->children()->faultstring . PHP_EOL; return false; - }else{ + } else { $response = $curlReturn['response']->children('http://schemas.xmlsoap.org/soap/envelope/')->Body->children('http://sei.ws.fast.cdc.com/')->downloadResponse->children()->return; $returnedDocumentId = (string) $response->documentId; - if($aArgs['documentId'] !== $returnedDocumentId){ + if ($aArgs['documentId'] !== $returnedDocumentId) { // TODO gestion d'une potentiel erreur return false; - }else{ + } else { $b64FileContent = $response->content; return ['b64FileContent' => (string)$b64FileContent, 'documentId' => $returnedDocumentId]; } @@ -255,7 +259,7 @@ class FastParapheurController 'data' => [$aArgs['resIdMaster']] ])[0]; - if(empty($signatory['business_id']) || substr($signatory['business_id'], 0, 3) == 'org'){ + if (empty($signatory['business_id']) || substr($signatory['business_id'], 0, 3) == 'org') { $signatory['business_id'] = $config['data']['subscriberId']; } @@ -288,5 +292,4 @@ class FastParapheurController return $response; } - } diff --git a/package.json b/package.json index 946e50e2496fa629c9e0ca86c71a188dc94b5732..b2c6ff986f8b4cf047ae8a06ba147f9bc57b8618 100755 --- a/package.json +++ b/package.json @@ -53,7 +53,7 @@ "@types/datatables.net": "^1.10.18", "@types/jquery": "^2.0.53", "@types/node": "^7.10.8", - "ajv": "^6.10.2", + "ajv": "^6.11.0", "hammerjs": "^2.0.8", "html-minifier": "^3.5.21", "ng2-dnd": "^5.0.2", diff --git a/rest/index.php b/rest/index.php index 865cb1802d1cb74d159f08426d54f9cdc7b49088..72c5561ac708a5e7b57aae7f2f149964b64bb2e5 100755 --- a/rest/index.php +++ b/rest/index.php @@ -250,11 +250,12 @@ $app->delete('/groups/{id}/privileges/{privilegeId}', \Group\controllers\Privile $app->put('/groups/{id}/privileges/{privilegeId}/parameters', \Group\controllers\PrivilegeController::class . ':updateParameters'); $app->get('/groups/{id}/privileges/{privilegeId}/parameters', \Group\controllers\PrivilegeController::class . ':getParameters'); -//Histories -$app->get('/histories', \History\controllers\HistoryController::class . ':get'); -$app->get('/histories/users/{userSerialId}', \History\controllers\HistoryController::class . ':getByUserId'); -$app->get('/histories/resources/{resId}', \History\controllers\HistoryController::class . ':getByResourceId'); -$app->get('/histories/resources/{resId}/workflow', \History\controllers\HistoryController::class . ':getWorkflowByResourceId'); +//History +$app->get('/history', \History\controllers\HistoryController::class . ':get'); +$app->get('/history/availableFilters', \History\controllers\HistoryController::class . ':getAvailableFilters'); +$app->get('/history/users/{userSerialId}', \History\controllers\HistoryController::class . ':getByUserId'); +$app->get('/history/resources/{resId}', \History\controllers\HistoryController::class . ':getByResourceId'); +$app->get('/history/resources/{resId}/workflow', \History\controllers\HistoryController::class . ':getWorkflowByResourceId'); //Header $app->get('/header', \SrcCore\controllers\CoreController::class . ':getHeader'); @@ -392,6 +393,7 @@ $app->post('/resourcesList/users/{userId}/groups/{groupId}/baskets/{basketId}/ac $app->post('/resourcesList/users/{userId}/groups/{groupId}/baskets/{basketId}/actions/{actionId}/checkValidateParallelOpinion', \Action\controllers\PreProcessActionController::class . ':checkValidateParallelOpinion'); $app->post('/resourcesList/users/{userId}/groups/{groupId}/baskets/{basketId}/actions/{actionId}/checkContinueOpinionCircuit', \Action\controllers\PreProcessActionController::class . ':checkContinueOpinionCircuit'); $app->post('/resourcesList/users/{userId}/groups/{groupId}/baskets/{basketId}/actions/{actionId}/checkGiveParallelOpinion', \Action\controllers\PreProcessActionController::class . ':checkGiveParallelOpinion'); +$app->post('/resourcesList/users/{userId}/groups/{groupId}/baskets/{basketId}/actions/{actionId}/checkInterruptRejectResetVisa', \Action\controllers\PreProcessActionController::class . ':checkInterruptRejectResetVisa'); //Search $app->get('/search', \Search\controllers\SearchController::class . ':get'); diff --git a/src/app/action/controllers/ActionMethodController.php b/src/app/action/controllers/ActionMethodController.php index dd3c0685aed9b5fb6fc8931f5d5d576f50839533..ba24fd07f4f125280093a62cc3b8c2828b3d2bdb 100644 --- a/src/app/action/controllers/ActionMethodController.php +++ b/src/app/action/controllers/ActionMethodController.php @@ -673,7 +673,7 @@ class ActionMethodController 'limit' => 1 ]); - if (empty($currentStep) || empty($currentStep[0])) { + if (empty($currentStep)) { return ['errors' => ['No workflow or workflow finished']]; } $currentStep = $currentStep[0]; diff --git a/src/app/action/controllers/PreProcessActionController.php b/src/app/action/controllers/PreProcessActionController.php index e2fbfc23c5afe8aebc835243876cdc5b70796bb3..31851fd86b423c72dd0cd3e14883a4f6b90fc460 100755 --- a/src/app/action/controllers/PreProcessActionController.php +++ b/src/app/action/controllers/PreProcessActionController.php @@ -985,6 +985,66 @@ class PreProcessActionController return $response->withJson(['resourcesInformations' => $resourcesInformations]); } + public function checkInterruptRejectResetVisa(Request $request, Response $response, array $args) + { + $body = $request->getParsedBody(); + + if (!Validator::arrayType()->notEmpty()->validate($body['resources'])) { + return $response->withStatus(400)->withJson(['errors' => 'Body resources is empty or not an array']); + } + + $errors = ResourceListController::listControl(['groupId' => $args['groupId'], 'userId' => $args['userId'], 'basketId' => $args['basketId'], 'currentUserId' => $GLOBALS['id']]); + if (!empty($errors['errors'])) { + return $response->withStatus($errors['code'])->withJson(['errors' => $errors['errors']]); + } + + $body['resources'] = array_slice($body['resources'], 0, 500); + if (!ResController::hasRightByResId(['resId' => $body['resources'], 'userId' => $GLOBALS['id']])) { + return $response->withStatus(403)->withJson(['errors' => 'Document out of perimeter']); + } + + $signableAttachmentsTypes = []; + $attachmentsTypes = AttachmentModel::getAttachmentsTypesByXML(); + foreach ($attachmentsTypes as $key => $type) { + if ($type['sign']) { + $signableAttachmentsTypes[] = $key; + } + } + + $resourcesInformation = []; + foreach ($body['resources'] as $resId) { + $resource = ResModel::getById(['resId' => $resId, 'select' => ['alt_identifier']]); + if (empty($resource['alt_identifier'])) { + $resource['alt_identifier'] = _UNDEFINED; + } + + $isSignatory = ListInstanceModel::get(['select' => ['signatory', 'requested_signature'], 'where' => ['res_id = ?', 'difflist_type = ?', 'process_date is null'], 'data' => [$resId, 'VISA_CIRCUIT'], 'orderBy' => ['listinstance_id'], 'limit' => 1]); + if (empty($isSignatory[0])) { + $hasCircuit = ListInstanceModel::get(['select' => [1], 'where' => ['res_id = ?', 'difflist_type = ?'], 'data' => [$resId, 'VISA_CIRCUIT']]); + if (!empty($hasCircuit)) { + $resourcesInformation['error'][] = ['alt_identifier' => $resource['alt_identifier'], 'res_id' => $resId, 'reason' => 'endedCircuit']; + } else { + $resourcesInformation['error'][] = ['alt_identifier' => $resource['alt_identifier'], 'res_id' => $resId, 'reason' => 'noCircuitAvailable']; + } + } else { + $hasPrevious = ListInstanceModel::get([ + 'select' => [1], + 'where' => ['res_id = ?', 'difflist_type = ?', 'process_date is not null'], + 'data' => [$resId, 'VISA_CIRCUIT'], + 'orderBy' => ['listinstance_id'], + 'limit' => 1 + ]); + if (!empty($hasPrevious)) { + $resourcesInformation['success'][] = ['alt_identifier' => $resource['alt_identifier'], 'res_id' => $resId]; + } else { + $resourcesInformation['error'][] = ['alt_identifier' => $resource['alt_identifier'], 'res_id' => $resId, 'reason' => 'circuitNotStarted']; + } + } + } + + return $response->withJson(['resourcesInformations' => $resourcesInformation]); + } + public function checkValidateParallelOpinion(Request $request, Response $response, array $args) { $body = $request->getParsedBody(); @@ -1030,7 +1090,7 @@ class PreProcessActionController continue; } - $note = str_replace('['._TO_AVIS.']', '', $opinionNote[0]['note_text']); + $note = str_replace('['._TO_AVIS.'] ', '', $opinionNote[0]['note_text']); $userInfo = UserModel::getLabelledUserById(['id' => $opinionNote[0]['user_id']]); $resourcesInformation['success'][] = ['alt_identifier' => $resource['alt_identifier'], 'res_id' => $resource['res_id'], 'avisUserAsk' => $userInfo, 'note' => $note, 'opinionLimitDate' => $resource['opinion_limit_date']]; } @@ -1175,67 +1235,6 @@ class PreProcessActionController return $response->withJson(['resourcesInformations' => $resourcesInformation]); } - public function checkValidateRecommendation(Request $request, Response $response, array $args) - { - $body = $request->getParsedBody(); - - if (!Validator::arrayType()->notEmpty()->validate($body['resources'])) { - return $response->withStatus(400)->withJson(['errors' => 'Body resources is empty or not an array']); - } - - $errors = ResourceListController::listControl(['groupId' => $args['groupId'], 'userId' => $args['userId'], 'basketId' => $args['basketId'], 'currentUserId' => $GLOBALS['id']]); - if (!empty($errors['errors'])) { - return $response->withStatus($errors['code'])->withJson(['errors' => $errors['errors']]); - } - - $body['resources'] = array_slice($body['resources'], 0, 500); - if (!ResController::hasRightByResId(['resId' => $body['resources'], 'userId' => $GLOBALS['id']])) { - return $response->withStatus(403)->withJson(['errors' => 'Document out of perimeter']); - } - - $resourcesInformation = []; - foreach ($body['resources'] as $resId) { - $resource = ResModel::getById(['resId' => $resId, 'select' => ['alt_identifier', 'opinion_limit_date']]); - - if (empty($resource['alt_identifier'])) { - $resource['alt_identifier'] = _UNDEFINED; - } - - if (empty($resource['opinion_limit_date'])) { - return $response->withStatus(400)->withJson(['errors' => 'No opinion limit date for resource ' . $resource['alt_identifier']]); - } - - $opinionNote = NoteModel::get([ - 'where' => ['identifier = ?', "note_text ilike '[" . _TO_AVIS . "]%'"], - 'data' => [$resId] - ]); - - if (empty($opinionNote)) { - return $response->withStatus(400)->withJson(['errors' => 'No opinion note for resource ' . $resource['alt_identifier']]); - } - - $isSignatory = ListInstanceModel::get([ - 'select' => [1], - 'where' => ['res_id = ?', 'difflist_type = ?', 'process_date is null'], - 'data' => [$resId, 'entity_id'], - 'orderBy' => ['listinstance_id'], - 'limit' => 1 - ]); - if (empty($isSignatory[0])) { - $hasCircuit = ListInstanceModel::get(['select' => [1], 'where' => ['res_id = ?', 'difflist_type = ?'], 'data' => [$resId, 'entity_id']]); - if (!empty($hasCircuit)) { - $resourcesInformation['error'][] = ['alt_identifier' => $resource['alt_identifier'], 'res_id' => $resId, 'reason' => 'endedCircuit']; - } else { - $resourcesInformation['error'][] = ['alt_identifier' => $resource['alt_identifier'], 'res_id' => $resId, 'reason' => 'noCircuitAvailable']; - } - } else { - $resourcesInformation['success'][] = ['alt_identifier' => $resource['alt_identifier'], 'res_id' => $resId]; - } - } - - return $response->withJson(['resourcesInformations' => $resourcesInformation]); - } - public function isDestinationChanging(Request $request, Response $response, array $args) { if (!ResController::hasRightByResId(['resId' => [$args['resId']], 'userId' => $GLOBALS['id']])) { diff --git a/src/app/basket/controllers/BasketController.php b/src/app/basket/controllers/BasketController.php index adfbfd504f5ea63020fc87a8966704ed583e2201..cc3b8c73b00a2c14bd0ac6282a5da7121d5fd733 100755 --- a/src/app/basket/controllers/BasketController.php +++ b/src/app/basket/controllers/BasketController.php @@ -533,7 +533,6 @@ class BasketController ValidatorModel::arrayType($aArgs, ['groupActions']); ValidatorModel::stringType($aArgs, ['userId']); - $defaultAction = false; $actions = ActionModel::get(['select' => ['id']]); foreach ($aArgs['groupActions'] as $key => $groupAction) { @@ -547,9 +546,6 @@ class BasketController if (!$actionExists) { return ['errors' => 'Action does not exist']; } - if ($groupAction['default_action_list'] === true) { - $defaultAction = true; - } $aArgs['groupActions'][$key]['where_clause'] = empty($groupAction['where_clause']) ? '' : $groupAction['where_clause']; $aArgs['groupActions'][$key]['used_in_basketlist'] = empty($groupAction['used_in_basketlist']) ? 'N' : 'Y'; @@ -566,9 +562,6 @@ class BasketController } } } - if (!$defaultAction) { - return ['errors' => 'Default action needed']; - } return $aArgs['groupActions']; } diff --git a/src/app/contentManagement/controllers/OnlyOfficeController.php b/src/app/contentManagement/controllers/OnlyOfficeController.php index 4b2e81fae89fe5bb19413a71487e889331461885..125b2df8cf13e8511c778b344edbc1ef2e2ed4db 100644 --- a/src/app/contentManagement/controllers/OnlyOfficeController.php +++ b/src/app/contentManagement/controllers/OnlyOfficeController.php @@ -164,7 +164,7 @@ class OnlyOfficeController $uri = (string)$loadedXml->onlyoffice->server_uri; $port = (string)$loadedXml->onlyoffice->server_port; - if (strpos($checkUrl, "{$uri}:{$port}/cache/files/") !== 0) { + if (strpos($checkUrl, "{$uri}:{$port}/cache/files/") !== 0 && ($port != 80 || strpos($checkUrl, "{$uri}/cache/files/") !== 0)) { return $response->withStatus(400)->withJson(['errors' => 'Query params url is not allowed']); } diff --git a/src/app/history/controllers/HistoryController.php b/src/app/history/controllers/HistoryController.php index 409c74c068ee6872de6166ee66f3d05567faf6c7..095bb48a39706cc3d4a375ab997a02b1f8d41431 100755 --- a/src/app/history/controllers/HistoryController.php +++ b/src/app/history/controllers/HistoryController.php @@ -14,6 +14,7 @@ namespace History\controllers; +use Action\models\ActionModel; use Group\controllers\PrivilegeController; use Resource\controllers\ResController; use Respect\Validation\Validator; @@ -33,27 +34,78 @@ class HistoryController return $response->withStatus(403)->withJson(['errors' => 'Service forbidden']); } - $data = $request->getQueryParams(); + $queryParams = $request->getQueryParams(); + + $limit = 25; + if (!empty($queryParams['limit']) && is_numeric($queryParams['limit'])) { + $limit = (int)$queryParams['limit']; + } + $offset = 0; + if (!empty($queryParams['offset']) && is_numeric($queryParams['offset'])) { + $offset = (int)$queryParams['offset']; + } - $check = Validator::floatVal()->notEmpty()->validate($data['startDate']); - $check = $check && Validator::floatVal()->notEmpty()->validate($data['endDate']); - if (!$check) { - return $response->withStatus(400)->withJson(['errors' => 'Bad Request']); + $where = []; + $data = []; + if (!empty($queryParams['users']) && is_array($queryParams['users'])) { + $userIds = []; + $userLogins = []; + foreach ($queryParams['users'] as $user) { + if (is_numeric($user)) { + $userIds[] = $user; + } else { + $userLogins[] = $user; + } + } + $users = []; + if (!empty($userIds)) { + $users = UserModel::get(['select' => ['user_id'], 'where' => ['id in (?)'], 'data' => [$userIds]]); + $users = array_column($users, 'user_id'); + } + $users = array_merge($users, $userLogins); + $where[] = 'user_id in (?)'; + $data[] = $users; + } + if (!empty($queryParams['startDate'])) { + $where[] = 'event_date > ?'; + $data[] = date('Y-m-d H:i:s', $queryParams['startDate']); + } + if (!empty($queryParams['endDate'])) { + $where[] = 'event_date < ?'; + $data[] = date('Y-m-d H:i:s', $queryParams['endDate']); + } + if (!empty($queryParams['actions']) && is_array($queryParams['actions'])) { + $actions = []; + foreach ($queryParams['actions'] as $action) { + if (is_numeric($action)) { + $actions[] = "ACTION#{$action}"; + } else { + $actions[] = $action; + } + } + $where[] = 'event_type in (?)'; + $data[] = $actions; } - $maxRequestSize = 25000; + $order = !in_array($queryParams['order'], ['asc', 'desc']) ? '' : $queryParams['order']; + $orderBy = !in_array($queryParams['orderBy'], ['event_date', 'user_id', 'info']) ? ['event_date DESC'] : ["{$queryParams['orderBy']} {$order}"]; - $histories = HistoryModel::get([ - 'select' => ['event_date', 'event_type', 'user_id', 'info', 'remote_ip'], - 'where' => ['event_date > ?', 'event_date < ?'], - 'data' => [date('Y-m-d H:i:s', $data['startDate']), date('Y-m-d H:i:s', $data['endDate'])], - 'orderBy' => ['event_date DESC'], - 'limit' => $maxRequestSize + $history = HistoryModel::get([ + 'select' => ['event_date', 'user_id', 'info', 'remote_ip', 'count(1) OVER()'], + 'where' => $where, + 'data' => $data, + 'orderBy' => $orderBy, + 'offset' => $offset, + 'limit' => $limit ]); - $limitExceeded = (count($histories) == $maxRequestSize); + $total = $history[0]['count'] ?? 0; + foreach ($history as $key => $value) { + $history[$key]['userLabel'] = UserModel::getLabelledUserById(['login' => $value['user_id']]); + unset($history[$key]['count']); + } - return $response->withJson(['histories' => $histories, 'limitExceeded' => $limitExceeded]); + return $response->withJson(['history' => $history, 'count' => $total]); } public static function add(array $aArgs) @@ -134,4 +186,43 @@ class HistoryController return $response->withJson(['history' => $history]); } + + public function getAvailableFilters(Request $request, Response $response) + { + if (!PrivilegeController::hasPrivilege(['privilegeId' => 'view_history', 'userId' => $GLOBALS['id']])) { + return $response->withStatus(403)->withJson(['errors' => 'Service forbidden']); + } + + $eventTypes = HistoryModel::get([ + 'select' => ['DISTINCT(event_type)'] + ]); + + $actions = []; + $systemActions = []; + foreach ($eventTypes as $eventType) { + if (strpos($eventType['event_type'], 'ACTION#') === 0) { + $exp = explode('#', $eventType['event_type']); + if (!empty($exp[1])) { + $action = ActionModel::getById(['select' => ['label_action'], 'id' => $exp[1]]); + } + $label = !empty($action) ? $action['label_action'] : null; + $actions[] = ['id' => $exp[1], 'label' => $label]; + } else { + $systemActions[] = ['id' => $eventType['event_type'], 'label' => null]; + } + } + + $usersInHistory = HistoryModel::get([ + 'select' => ['DISTINCT(user_id)'] + ]); + + $users = []; + foreach ($usersInHistory as $value) { + $user = UserModel::getByLogin(['login' => $value['user_id'], 'select' => ['id', 'firstname', 'lastname']]); + + $users[] = ['id' => $user['id'] ?? null, 'login' => $value['user_id'], 'label' => !empty($user['id']) ? "{$user['firstname']} {$user['lastname']}" : null]; + } + + return $response->withJson(['actions' => $actions, 'systemActions' => $systemActions, 'users' => $users]); + } } diff --git a/src/app/history/models/HistoryModelAbstract.php b/src/app/history/models/HistoryModelAbstract.php index 04655a19b263b874f9eb928fa711d21a25872423..923468c8601e154fc51737f51339216cd6a2c4a7 100755 --- a/src/app/history/models/HistoryModelAbstract.php +++ b/src/app/history/models/HistoryModelAbstract.php @@ -19,19 +19,20 @@ use SrcCore\models\DatabaseModel; abstract class HistoryModelAbstract { - public static function get(array $aArgs) + public static function get(array $args) { - ValidatorModel::notEmpty($aArgs, ['select']); - ValidatorModel::arrayType($aArgs, ['select', 'where', 'data', 'orderBy']); - ValidatorModel::intVal($aArgs, ['limit']); + ValidatorModel::notEmpty($args, ['select']); + ValidatorModel::arrayType($args, ['select', 'where', 'data', 'orderBy']); + ValidatorModel::intVal($args, ['offset', 'limit']); $aHistories = DatabaseModel::select([ - 'select' => $aArgs['select'], + 'select' => $args['select'], 'table' => ['history'], - 'where' => empty($aArgs['where']) ? [] : $aArgs['where'], - 'data' => empty($aArgs['data']) ? [] : $aArgs['data'], - 'order_by' => empty($aArgs['orderBy']) ? [] : $aArgs['orderBy'], - 'limit' => empty($aArgs['limit']) ? 0 : $aArgs['limit'] + 'where' => $args['where'] ?? [], + 'data' => $args['data'] ?? [], + 'order_by' => $args['orderBy'] ?? [], + 'offset' => $args['offset'] ?? 0, + 'limit' => $args['limit'] ?? 0 ]); return $aHistories; @@ -111,21 +112,4 @@ abstract class HistoryModelAbstract return $history; } - - public static function getFilter(array $aArgs = []) - { - ValidatorModel::notEmpty($aArgs, ['select','event_date']); - ValidatorModel::stringType($aArgs, ['select']); - - $aReturn = DatabaseModel::select( - [ - 'select' => ['DISTINCT('.$aArgs['select'].')'], - 'table' => ['history'], - 'where' => ["event_date >= date '".$aArgs['event_date']."'","event_date < date '".$aArgs['event_date']."' + interval '1 month'"], - 'order_by' => [$aArgs['select'].' ASC'] - ] - ); - - return $aReturn; - } } diff --git a/src/app/resource/controllers/ResourceListController.php b/src/app/resource/controllers/ResourceListController.php index 3e4a0bcd724bbda48ecaed9f43371bbde2fb8583..f29634728764d7b9de879f7f5aacbd4d6291d6d3 100644 --- a/src/app/resource/controllers/ResourceListController.php +++ b/src/app/resource/controllers/ResourceListController.php @@ -281,6 +281,17 @@ class ResourceListController $where[] = 'doctypes.type_id in (?)'; $queryData[] = explode(',', $args['data']['doctypes']); } + if (!empty($args['data']['folders'])) { + $resourcesInFolders = FolderModel::getWithResources([ + 'select' => ['resources_folders.res_id'], + 'where' => ['resources_folders.folder_id in (?)'], + 'data' => [explode(',', $args['data']['folders'])] + ]); + $resourcesInFolders = array_column($resourcesInFolders, 'res_id'); + + $where[] = 'res_id in (?)'; + $queryData[] = $resourcesInFolders; + } if (!empty($args['data']['order']) && strpos($args['data']['order'], 'alt_identifier') !== false) { $order = 'order_alphanum(alt_identifier) ' . explode(' ', $args['data']['order'])[1]; @@ -876,12 +887,14 @@ class ResourceListController $whereCategories = $where; $whereStatuses = $where; $whereEntities = $where; - $whereDocTypes = $where; + $whereDocTypes = $where; + $whereFolders = $where; $dataPriorities = $queryData; $dataCategories = $queryData; $dataStatuses = $queryData; $dataEntities = $queryData; - $dataDocTypes = $queryData; + $dataDocTypes = $queryData; + $dataFolders = $queryData; if (isset($data['priorities'])) { if (empty($data['priorities'])) { @@ -898,12 +911,14 @@ class ResourceListController $dataStatuses[] = explode(',', $replace); $dataEntities[] = explode(',', $replace); $dataDocTypes[] = explode(',', $replace); + $dataFolders[] = explode(',', $replace); } $whereCategories[] = $tmpWhere; $whereStatuses[] = $tmpWhere; $whereEntities[] = $tmpWhere; $whereDocTypes[] = $tmpWhere; + $whereFolders[] = $tmpWhere; } if (isset($data['categories'])) { if (empty($data['categories'])) { @@ -920,12 +935,14 @@ class ResourceListController $dataStatuses[] = explode(',', $replace); $dataEntities[] = explode(',', $replace); $dataDocTypes[] = explode(',', $replace); + $dataFolders[] = explode(',', $replace); } $wherePriorities[] = $tmpWhere; $whereStatuses[] = $tmpWhere; $whereEntities[] = $tmpWhere; $whereDocTypes[] = $tmpWhere; + $whereFolders[] = $tmpWhere; } if (!empty($data['statuses'])) { $wherePriorities[] = 'status in (?)'; @@ -936,6 +953,8 @@ class ResourceListController $dataEntities[] = explode(',', $data['statuses']); $whereDocTypes[] = 'status in (?)'; $dataDocTypes[] = explode(',', $data['statuses']); + $whereFolders[] = 'status in (?)'; + $dataFolders[] = explode(',', $data['statuses']); } if (!empty($data['doctypes'])) { $wherePriorities[] = 'type_id in (?)'; @@ -946,6 +965,8 @@ class ResourceListController $dataEntities[] = explode(',', $data['doctypes']); $whereStatuses[] = 'type_id in (?)'; $dataStatuses[] = explode(',', $data['doctypes']); + $whereFolders[] = 'type_id in (?)'; + $dataFolders[] = explode(',', $data['doctypes']); } if (isset($data['entities'])) { if (empty($data['entities'])) { @@ -962,12 +983,14 @@ class ResourceListController $dataCategories[] = explode(',', $replace); $dataStatuses[] = explode(',', $replace); $dataDocTypes[] = explode(',', $replace); + $dataFolders[] = explode(',', $replace); } $wherePriorities[] = $tmpWhere; $whereCategories[] = $tmpWhere; $whereStatuses[] = $tmpWhere; $whereDocTypes[] = $tmpWhere; + $whereFolders[] = $tmpWhere; } if (!empty($data['entitiesChildren'])) { $entities = explode(',', $data['entitiesChildren']); @@ -985,6 +1008,8 @@ class ResourceListController $dataStatuses[] = $entitiesChildren; $whereDocTypes[] = 'destination in (?)'; $dataDocTypes[] = $entitiesChildren; + $whereFolders[] = 'destination in (?)'; + $dataFolders[] = $entitiesChildren; } } @@ -1084,11 +1109,42 @@ class ResourceListController ]; } + $folders = []; + + $resIds = ResModel::getOnView([ + 'select' => ['res_id'], + 'where' => $whereFolders, + 'data' => $dataFolders + ]); + $resIds = array_column($resIds, 'res_id'); + + $userEntities = EntityModel::getWithUserEntities([ + 'select' => ['entities.id'], + 'where' => ['users_entities.user_id = ?'], + 'data' => [$GLOBALS['userId']] + ]); + $userEntities = array_column($userEntities, 'id'); + + $rawFolders = FolderModel::getWithEntitiesAndResources([ + 'select' => ['folders.id', 'folders.label', 'count(resources_folders.res_id) as count'], + 'where' => ['resources_folders.res_id in (?)', '(folders.user_id = ? OR entities_folders.entity_id in (?))'], + 'data' => [$resIds, $GLOBALS['id'], $userEntities], + 'groupBy' => ['folders.id', 'folders.label'] + ]); + foreach ($rawFolders as $key => $value) { + $folders[] = [ + 'id' => empty($value['id']) ? null : $value['id'], + 'label' => empty($value['label']) ? '_UNDEFINED' : $value['label'], + 'count' => $value['count'] + ]; + } + $priorities = (count($priorities) >= 2) ? $priorities : []; $categories = (count($categories) >= 2) ? $categories : []; $statuses = (count($statuses) >= 2) ? $statuses : []; $entities = (count($entities) >= 2) ? $entities : []; $docTypes = (count($docTypes) >= 2) ? $docTypes : []; + $folders = (count($folders) >= 2) ? $folders : []; $entitiesChildren = []; foreach ($entities as $entity) { @@ -1122,14 +1178,17 @@ class ResourceListController usort($docTypes, ['Resource\controllers\ResourceListController', 'compareSortOnLabel']); + usort($folders, ['Resource\controllers\ResourceListController', 'compareSortOnLabel']); + return [ - 'entities' => $entities, - 'priorities' => $priorities, - 'categories' => $categories, - 'statuses' => $statuses, + 'entities' => $entities, + 'priorities' => $priorities, + 'categories' => $categories, + 'statuses' => $statuses, 'entitiesChildren' => $entitiesChildren, - 'doctypes' => $docTypes + 'doctypes' => $docTypes, + 'folders' => $folders ]; } diff --git a/src/app/search/controllers/SearchController.php b/src/app/search/controllers/SearchController.php index 25cf7bc92436d49df072172ab2cc87fd079a5165..5105a763463a1db2f2c43101164432c80c1f3a10 100644 --- a/src/app/search/controllers/SearchController.php +++ b/src/app/search/controllers/SearchController.php @@ -127,6 +127,13 @@ class SearchController } } + $nonSearchableStatuses = StatusModel::get(['select' => ['id'], 'where' => ['can_be_searched = ?'], 'data' => ['N']]); + if (!empty($nonSearchableStatuses)) { + $nonSearchableStatuses = array_column($nonSearchableStatuses, 'id'); + $searchWhere[] = 'status not in (?)'; + $searchData[] = $nonSearchableStatuses; + } + $limit = 25; if (!empty($queryParams['limit']) && is_numeric($queryParams['limit'])) { $limit = (int)$queryParams['limit']; @@ -183,7 +190,7 @@ class SearchController } } } - if (!empty($resource['dest_user'])) { + if (!empty($resource['destUser'])) { $resources[$key]['destUserLabel'] = UserModel::getLabelledUserById(['login' => $resource['destUser']]); } $resources[$key]['hasDocument'] = !empty($resource['filename']); diff --git a/src/app/status/models/StatusModelAbstract.php b/src/app/status/models/StatusModelAbstract.php index 51600bd30d0765de262add1e43c959a7fdc11f1a..1b91e475d86b45d5b9744c586e1c24edcacaf6e4 100755 --- a/src/app/status/models/StatusModelAbstract.php +++ b/src/app/status/models/StatusModelAbstract.php @@ -19,17 +19,19 @@ use SrcCore\models\DatabaseModel; abstract class StatusModelAbstract { - public static function get(array $aArgs = []) + public static function get(array $args = []) { - ValidatorModel::arrayType($aArgs, ['select']); + ValidatorModel::arrayType($args, ['select', 'where', 'data']); - $aReturn = DatabaseModel::select([ - 'select' => empty($aArgs['select']) ? ['*'] : $aArgs['select'], + $statuses = DatabaseModel::select([ + 'select' => empty($args['select']) ? ['*'] : $args['select'], 'table' => ['status'], + 'where' => $args['where'] ?? [], + 'data' => $args['data'] ?? [], 'order_by' => ['label_status'] ]); - return $aReturn; + return $statuses; } public static function getById(array $aArgs) diff --git a/src/app/user/controllers/UserController.php b/src/app/user/controllers/UserController.php index 0023fdb9be8ce240d2fa3173ed623cc02db49719..0585f9c5046c936de68a1421f554a3059505c1a6 100755 --- a/src/app/user/controllers/UserController.php +++ b/src/app/user/controllers/UserController.php @@ -65,7 +65,7 @@ class UserController if ($GLOBALS['userId'] == 'superadmin') { $users = UserModel::get([ - 'select' => ['id', 'user_id', 'firstname', 'lastname', 'status', 'mail'], + 'select' => ['id', 'user_id', 'firstname', 'lastname', 'status', 'mail', 'loginmode'], 'where' => ['user_id != ?', 'status != ?'], 'data' => ['superadmin', 'DEL'] ]); @@ -74,20 +74,15 @@ class UserController $users = []; if (!empty($entities)) { $users = UserEntityModel::getWithUsers([ - 'select' => ['DISTINCT users.id', 'users.user_id', 'firstname', 'lastname', 'status', 'mail'], + 'select' => ['DISTINCT users.id', 'users.user_id', 'firstname', 'lastname', 'status', 'mail', 'loginmode'], 'where' => ['users_entities.entity_id in (?)', 'status != ?'], 'data' => [$entities, 'DEL'] ]); } - $usersNoEntities = UserEntityModel::getUsersWithoutEntities(['select' => ['id', 'users.user_id', 'firstname', 'lastname', 'status', 'mail']]); + $usersNoEntities = UserEntityModel::getUsersWithoutEntities(['select' => ['id', 'users.user_id', 'firstname', 'lastname', 'status', 'mail', 'loginmode']]); $users = array_merge($users, $usersNoEntities); } - $usersIds = []; - foreach ($users as $value) { - $usersIds[] = $value['user_id']; - } - $quota = []; $userQuota = ParameterModel::getById(['id' => 'user_quota', 'select' => ['param_value_int']]); if (!empty($userQuota['param_value_int'])) { @@ -1310,7 +1305,6 @@ class UserController } if ($data['mode'] == 'reaffect') { - $listInstances = ListInstanceModel::getWithConfidentiality(['select' => ['listinstance.res_id'], 'entityId' => $aArgs['entityId'], 'userId' => $user['user_id']]); $resIdsToReplace = []; foreach ($listInstances as $listInstance) { diff --git a/src/core/lang/lang-en.php b/src/core/lang/lang-en.php index 39b3beca7efcaa9be914d2317721db51207f53fc..e84737cfd82eca75ba4a9d3a3ec96cd7c93eca46 100755 --- a/src/core/lang/lang-en.php +++ b/src/core/lang/lang-en.php @@ -253,7 +253,6 @@ define('_INTERRUPT_WORKFLOW_DESC', 'Update visa date of current supervisor / sig define('_PROCEED_WORKFLOW', 'continue the visa flow'); define('_PROCEED_WORKFLOW_DESC', 'Update visa date of current supervisor / signatory in visa circuit of mail (\'process_date\' of listinstance table).'); define('_VISA_MAIL', 'Aim the mail'); -define('_VISA_MAIL_DESC', 'Open signatory book to visa / sign the document.'); define('_SEND_TO_CONTACT_WITH_MANDATORY_ATTACHMENT', 'Send to the contact with a mandatory attachment'); define('_SEND_TO_CONTACT_WITH_MANDATORY_ATTACHMENT_DESC', 'Open sendmail modal with email of contact linked to document in recipient, attachment is MANDATORY.'); define('_SEND_ATTACHMENTS_TO_CONTACT', 'Send to the contact'); diff --git a/src/core/lang/lang-fr.php b/src/core/lang/lang-fr.php index 0ea42cb0e5bc96015dbe81eea62820da0a944084..450c772c78f5e85b740c20dbc3d1fd9bf4ffcb19 100755 --- a/src/core/lang/lang-fr.php +++ b/src/core/lang/lang-fr.php @@ -238,7 +238,7 @@ define('_SEND_TO_EXTERNAL_SB', 'Envoyer des données vers un parapheur externe') define('_SEND_TO_EXTERNAL_NOTEBOOK', 'Envoyer des courriers à annoter vers Maarch Parapheur'); define('_CLOSE_MAIL_AND_INDEX', 'Clôturer un courrier et lancer l\'indexation'); define('_CLOSE_MAIL_AND_INDEX_DESC', 'Permet de mettre à jour la date de clôture d\'un courrier ET ouvre la page d\'indexation afin d\'enregistrer un nouveau courrier.'); -define('_CLOSE_MAIL_WITH_ATTACHMENT', 'Clôturer un courrier avec pièce jointe'); +define('_CLOSE_MAIL_WITH_ATTACHMENT', 'Clôturer un courrier avec pièce jointe ou annotation'); define('_CLOSE_MAIL_WITH_ATTACHMENT_DESC', 'Permet de mettre à jour la date de clôture d\'un courrier avec présence OBLIGATOIRE de pièce(s) jointe(s) / annotation(s).'); define('_SEND_TO_VISA', 'Envoyer pour visa'); define('_SEND_TO_VISA_DESC', 'Contrôle si un circuit de visa est configuré ET si un ou plusieurs projets de réponses sont associés au courrier.'); @@ -253,7 +253,6 @@ define('_INTERRUPT_WORKFLOW_DESC', 'Met à jour la date du visa de l\'actuel vis define('_PROCEED_WORKFLOW', 'Poursuivre le circuit de visa'); define('_PROCEED_WORKFLOW_DESC', 'Met à jour la date du visa de l\'actuel viseur / signataire présent dans le circuit de visa du courrier (\'process_date\' de la table listinstance).'); define('_VISA_MAIL', 'Viser le courrier'); -define('_VISA_MAIL_DESC', 'Ouvre la page du parapheur afin de pouvoir viser / signer le document.'); define('_SEND_TO_CONTACT_WITH_MANDATORY_ATTACHMENT', 'Envoyer au contact avec une pièce jointe obligatoire et accusé de réception'); define('_SEND_TO_CONTACT_WITH_MANDATORY_ATTACHMENT_DESC', "Ouvre une modal d'envoi de mail avec l'email du contact associé au courrier en tant que destinataire, présence OBLIGATOIRE de pièce(s) jointe(s) à l'envoi."); define('_SEND_ATTACHMENTS_TO_CONTACT', 'Envoyer au contact avec accusé de réception'); diff --git a/src/core/lang/lang-nl.php b/src/core/lang/lang-nl.php index b0ee983f81255460c623f0bf7d21d832ad23644a..3aef1413da6b786527d360047c81050b50622910 100755 --- a/src/core/lang/lang-nl.php +++ b/src/core/lang/lang-nl.php @@ -252,7 +252,6 @@ define('_INTERRUPT_WORKFLOW_DESC', 'Werkt de datum bij van de huidige goedkeurde define('_PROCEED_WORKFLOW', 'Het goedkeuringscircuit verderzetten'); define('_PROCEED_WORKFLOW_DESC', 'Werkt de datum bij van de huidige goedkeurder / ondertekenaar die in het goedkeuringscircuit van het brief aanwezig is (\process_date\ van de tabel listinstance).'); define('_VISA_MAIL', 'De e-mail goedkeuren'); -define('_VISA_MAIL_DESC', 'Opent de pagina van het vloeiboek om het document te kunnen goedkeuren / ondertekenen.'); define('_SEND_TO_CONTACT_WITH_MANDATORY_ATTACHMENT', 'Verzenden naar het contact met een bijlage verplicht'); define('_SEND_TO_CONTACT_WITH_MANDATORY_ATTACHMENT_DESC', 'Opent een mailverzendingsmodaliteit met de e-mail van het aan het document gekoppelde contact als bestemmeling, VERPLICHTE aanwezigheid van bijlage(n) aan de verzending.'); define('_SEND_ATTACHMENTS_TO_CONTACT', 'Verzenden aan het contact'); diff --git a/src/frontend/app/actions/redirect-initiator-entity-action/redirect-initiator-entity-action.component.html b/src/frontend/app/actions/redirect-initiator-entity-action/redirect-initiator-entity-action.component.html index fcb3f31dd7098152e149c1a95413199b3e7ed10b..1b0b10cf9f0696d8d0b47ad4e9b011bcf7633122 100644 --- a/src/frontend/app/actions/redirect-initiator-entity-action/redirect-initiator-entity-action.component.html +++ b/src/frontend/app/actions/redirect-initiator-entity-action/redirect-initiator-entity-action.component.html @@ -10,7 +10,7 @@ <b *ngIf="data.resIds.length > 1" color="primary" class="highlight">{{data.resIds.length}} {{lang.elements}}</b> ? <div *ngIf="resourcesInfo.withoutEntity.length > 0"> - <div class="alert-message alert-message-info acknowledgementList" role="alert"> + <div class="alert-message alert-message-danger acknowledgementList" role="alert"> <p> {{lang.hasNoEntity}} : </p> diff --git a/src/frontend/app/actions/send-external-signatory-book-action/send-external-signatory-book-action.component.html b/src/frontend/app/actions/send-external-signatory-book-action/send-external-signatory-book-action.component.html index 6869206b2403a5f3bebccf286ad60effaba30740..025ae350e3fec895be7d375a18ce42c10a707fc0 100644 --- a/src/frontend/app/actions/send-external-signatory-book-action/send-external-signatory-book-action.component.html +++ b/src/frontend/app/actions/send-external-signatory-book-action/send-external-signatory-book-action.component.html @@ -13,7 +13,7 @@ <b *ngIf="data.resIds.length == 1" color="primary" class="highlight">{{data.resource.chrono}}</b> <b *ngIf="data.resIds.length > 1" color="primary" class="highlight">{{data.resIds.length}} - {{lang.elements}}</b>> ? + {{lang.elements}}</b> ? </div> <div> <app-maarch-paraph #maarchParapheur *ngIf="signatoryBookEnabled=='maarchParapheur'" diff --git a/src/frontend/app/actions/visa-interrupt-action/interrupt-visa-action.component.html b/src/frontend/app/actions/visa-interrupt-action/interrupt-visa-action.component.html index 842a678f0ae72aaf07f1896ebbab6c0399e83740..1fa9c8fd1febb1f238427f109a33506cbd58d753 100644 --- a/src/frontend/app/actions/visa-interrupt-action/interrupt-visa-action.component.html +++ b/src/frontend/app/actions/visa-interrupt-action/interrupt-visa-action.component.html @@ -11,6 +11,25 @@ {{lang.elements}}</b> ? <div class="alert-message alert-message-info" role="alert" style="margin-top: 30px;" [innerHTML]="lang.interruptVisaWorkflow"></div> + + <div *ngIf="resourcesErrors.length > 0" class="alert-message alert-message-danger mailList" role="alert"> + <p> + {{lang.canNotMakeAction}} : + </p> + <ul> + <li *ngFor="let ressource of resourcesErrors"> + <b>{{ressource.alt_identifier}}</b> : {{lang[ressource.reason]}} + </li> + </ul> + </div> + <div *ngIf="resourcesWarnings.length > 0" class="alert-message alert-message-info mailList" role="alert"> + <ul style="margin: 0;padding-bottom: 0px;"> + <li *ngFor="let ressource of resourcesWarnings"> + <b>{{ressource.alt_identifier}}</b> : {{lang[ressource.reason]}} + </li> + </ul> + </div> + <app-visa-workflow *ngIf="data.resIds.length == 1" [adminMode]="false" [resId]="data.resIds[0]" #appVisaWorkflow> </app-visa-workflow> @@ -21,7 +40,7 @@ </div> </div> <div mat-dialog-actions class="actions"> - <button mat-raised-button mat-button color="primary" [disabled]="loading" + <button mat-raised-button mat-button color="primary" [disabled]="loading || !isValidAction()" (click)="onSubmit()">{{lang.validate}}</button> <button mat-raised-button mat-button [disabled]="loading" [mat-dialog-close]="">{{lang.cancel}}</button> -</div> \ No newline at end of file +</div> diff --git a/src/frontend/app/actions/visa-interrupt-action/interrupt-visa-action.component.ts b/src/frontend/app/actions/visa-interrupt-action/interrupt-visa-action.component.ts index eceb3a4a2fb4d881034dc61d4def4649d0f11885..f5ea201140fff904241debb7345e750d70b8149e 100644 --- a/src/frontend/app/actions/visa-interrupt-action/interrupt-visa-action.component.ts +++ b/src/frontend/app/actions/visa-interrupt-action/interrupt-visa-action.component.ts @@ -6,6 +6,7 @@ import { HttpClient } from '@angular/common/http'; import { NoteEditorComponent } from '../../notes/note-editor.component'; import { tap, finalize, catchError } from 'rxjs/operators'; import { of } from 'rxjs'; +import {FunctionsService} from "../../../service/functions.service"; @Component({ templateUrl: "interrupt-visa-action.component.html", @@ -17,16 +18,48 @@ export class InterruptVisaActionComponent implements OnInit { lang: any = LANG; loading: boolean = false; + resourcesWarnings: any[] = []; + resourcesErrors: any[] = []; + + noResourceToProcess: boolean = null; + @ViewChild('noteEditor', { static: true }) noteEditor: NoteEditorComponent; constructor( public http: HttpClient, private notify: NotificationService, public dialogRef: MatDialogRef<InterruptVisaActionComponent>, - @Inject(MAT_DIALOG_DATA) public data: any + @Inject(MAT_DIALOG_DATA) public data: any, + public functions: FunctionsService ) { } - ngOnInit(): void { } + async ngOnInit() { + this.loading = true; + await this.checkInterruptVisa(); + this.loading = false; + } + + checkInterruptVisa() { + this.resourcesErrors = []; + this.resourcesWarnings = []; + + return new Promise((resolve, reject) => { + this.http.post('../../rest/resourcesList/users/' + this.data.userId + '/groups/' + this.data.groupId + '/baskets/' + this.data.basketId + '/actions/' + this.data.action.id + '/checkInterruptRejectResetVisa', { resources: this.data.resIds }) + .subscribe((data: any) => { + if (!this.functions.empty(data.resourcesInformations.warning)) { + this.resourcesWarnings = data.resourcesInformations.warning; + } + + if(!this.functions.empty(data.resourcesInformations.error)) { + this.resourcesErrors = data.resourcesInformations.error; + this.noResourceToProcess = this.resourcesErrors.length === this.data.resIds.length; + } + resolve(true); + }, (err: any) => { + this.notify.handleSoftErrors(err); + }); + }); + } onSubmit() { this.loading = true; @@ -45,4 +78,8 @@ export class InterruptVisaActionComponent implements OnInit { }) ).subscribe(); } + + isValidAction() { + return !this.noResourceToProcess; + } } diff --git a/src/frontend/app/actions/visa-reject-back-to-previous-action/reject-visa-back-to-previous-action.component.html b/src/frontend/app/actions/visa-reject-back-to-previous-action/reject-visa-back-to-previous-action.component.html index 2a1b9b13dfdbf623b0f18355ddad50dd0cb8dfb0..e1ec516307fccaf7181fb2a57bead5fd88e4c53e 100644 --- a/src/frontend/app/actions/visa-reject-back-to-previous-action/reject-visa-back-to-previous-action.component.html +++ b/src/frontend/app/actions/visa-reject-back-to-previous-action/reject-visa-back-to-previous-action.component.html @@ -11,6 +11,25 @@ {{lang.elements}}</b> ? <div *ngIf="data.resIds.length > 1" class="alert-message alert-message-info" role="alert" style="margin-top: 30px;" [innerHTML]="lang.rejectVisaBack"></div> <div *ngIf="data.resIds.length == 1 && appVisaWorkflow !== undefined && appVisaWorkflow.getLastVisaUser() !== ''" class="alert-message alert-message-info" role="alert" style="margin-top: 30px;" [innerHTML]="lang.rejectVisaBackUser + ' <b>' + appVisaWorkflow.getLastVisaUser().labelToDisplay + '</b>'"></div> + + <div *ngIf="resourcesErrors.length > 0" class="alert-message alert-message-danger mailList" role="alert"> + <p> + {{lang.canNotMakeAction}} : + </p> + <ul> + <li *ngFor="let ressource of resourcesErrors"> + <b>{{ressource.alt_identifier}}</b> : {{lang[ressource.reason]}} + </li> + </ul> + </div> + <div *ngIf="resourcesWarnings.length > 0" class="alert-message alert-message-info mailList" role="alert"> + <ul style="margin: 0;padding-bottom: 0px;"> + <li *ngFor="let ressource of resourcesWarnings"> + <b>{{ressource.alt_identifier}}</b> : {{lang[ressource.reason]}} + </li> + </ul> + </div> + <app-visa-workflow *ngIf="data.resIds.length == 1" [adminMode]="false" [resId]="data.resIds[0]" #appVisaWorkflow> </app-visa-workflow> </div> @@ -20,7 +39,7 @@ </div> </div> <div mat-dialog-actions class="actions"> - <button mat-raised-button mat-button color="primary" [disabled]="loading" + <button mat-raised-button mat-button color="primary" [disabled]="loading || !isValidAction()" (click)="onSubmit()">{{lang.validate}}</button> <button mat-raised-button mat-button [disabled]="loading" [mat-dialog-close]="">{{lang.cancel}}</button> -</div> \ No newline at end of file +</div> diff --git a/src/frontend/app/actions/visa-reject-back-to-previous-action/reject-visa-back-to-previous-action.component.ts b/src/frontend/app/actions/visa-reject-back-to-previous-action/reject-visa-back-to-previous-action.component.ts index f6bdcb4fcd9997a99b87ee87a67dd7ae056ca2ef..c43cba03b8e240460c938aeec0d74dfcd98c038f 100644 --- a/src/frontend/app/actions/visa-reject-back-to-previous-action/reject-visa-back-to-previous-action.component.ts +++ b/src/frontend/app/actions/visa-reject-back-to-previous-action/reject-visa-back-to-previous-action.component.ts @@ -7,6 +7,7 @@ import { NoteEditorComponent } from '../../notes/note-editor.component'; import { tap, finalize, catchError } from 'rxjs/operators'; import { of } from 'rxjs'; import { VisaWorkflowComponent } from '../../visa/visa-workflow.component'; +import {FunctionsService} from "../../../service/functions.service"; @Component({ templateUrl: "reject-visa-back-to-previous-action.component.html", @@ -18,6 +19,11 @@ export class RejectVisaBackToPrevousActionComponent implements OnInit { lang: any = LANG; loading: boolean = false; + resourcesWarnings: any[] = []; + resourcesErrors: any[] = []; + + noResourceToProcess: boolean = null; + @ViewChild('noteEditor', { static: true }) noteEditor: NoteEditorComponent; @ViewChild('appVisaWorkflow', { static: false }) appVisaWorkflow: VisaWorkflowComponent; @@ -25,10 +31,37 @@ export class RejectVisaBackToPrevousActionComponent implements OnInit { public http: HttpClient, private notify: NotificationService, public dialogRef: MatDialogRef<RejectVisaBackToPrevousActionComponent>, - @Inject(MAT_DIALOG_DATA) public data: any + @Inject(MAT_DIALOG_DATA) public data: any, + public functions: FunctionsService ) { } - ngOnInit() { } + async ngOnInit() { + this.loading = true; + await this.checkRejectVisaBackToPrevious(); + this.loading = false; + } + + checkRejectVisaBackToPrevious() { + this.resourcesErrors = []; + this.resourcesWarnings = []; + + return new Promise((resolve, reject) => { + this.http.post('../../rest/resourcesList/users/' + this.data.userId + '/groups/' + this.data.groupId + '/baskets/' + this.data.basketId + '/actions/' + this.data.action.id + '/checkInterruptRejectResetVisa', { resources: this.data.resIds }) + .subscribe((data: any) => { + if (!this.functions.empty(data.resourcesInformations.warning)) { + this.resourcesWarnings = data.resourcesInformations.warning; + } + + if(!this.functions.empty(data.resourcesInformations.error)) { + this.resourcesErrors = data.resourcesInformations.error; + this.noResourceToProcess = this.resourcesErrors.length === this.data.resIds.length; + } + resolve(true); + }, (err: any) => { + this.notify.handleSoftErrors(err); + }); + }); + } onSubmit() { this.loading = true; @@ -47,4 +80,8 @@ export class RejectVisaBackToPrevousActionComponent implements OnInit { }) ).subscribe(); } + + isValidAction() { + return !this.noResourceToProcess; + } } diff --git a/src/frontend/app/actions/visa-reset-action/reset-visa-action.component.html b/src/frontend/app/actions/visa-reset-action/reset-visa-action.component.html index 80131ffd6e2e6ee5d8fa4e7f6b0d84e48e114741..fef6bfd807f14055c498e1d5f49c619c5d576cc8 100644 --- a/src/frontend/app/actions/visa-reset-action/reset-visa-action.component.html +++ b/src/frontend/app/actions/visa-reset-action/reset-visa-action.component.html @@ -13,6 +13,25 @@ [innerHTML]="lang.resetVisaWorkflowUser + ' <b>' + appVisaWorkflow.getFirstVisaUser().labelToDisplay + '</b>'"></div> <div *ngIf="data.resIds.length > 1" class="alert-message alert-message-info" role="alert" style="margin-top: 30px;" [innerHTML]="lang.resetVisaWorkflow"></div> + + <div *ngIf="resourcesErrors.length > 0" class="alert-message alert-message-danger mailList" role="alert"> + <p> + {{lang.canNotMakeAction}} : + </p> + <ul> + <li *ngFor="let ressource of resourcesErrors"> + <b>{{ressource.alt_identifier}}</b> : {{lang[ressource.reason]}} + </li> + </ul> + </div> + <div *ngIf="resourcesWarnings.length > 0" class="alert-message alert-message-info mailList" role="alert"> + <ul style="margin: 0;padding-bottom: 0px;"> + <li *ngFor="let ressource of resourcesWarnings"> + <b>{{ressource.alt_identifier}}</b> : {{lang[ressource.reason]}} + </li> + </ul> + </div> + <app-visa-workflow *ngIf="data.resIds.length == 1" [adminMode]="false" [resId]="data.resIds[0]" #appVisaWorkflow> </app-visa-workflow> </div> @@ -22,7 +41,7 @@ </div> </div> <div mat-dialog-actions class="actions"> - <button mat-raised-button mat-button color="primary" [disabled]="loading" + <button mat-raised-button mat-button color="primary" [disabled]="loading || !isValidAction()" (click)="onSubmit()">{{lang.validate}}</button> <button mat-raised-button mat-button [disabled]="loading" [mat-dialog-close]="">{{lang.cancel}}</button> -</div> \ No newline at end of file +</div> diff --git a/src/frontend/app/actions/visa-reset-action/reset-visa-action.component.ts b/src/frontend/app/actions/visa-reset-action/reset-visa-action.component.ts index 0476fc8194c819986cf3bf861937ccefee854814..1046030de4246b8f80023315d4a4857acba75652 100644 --- a/src/frontend/app/actions/visa-reset-action/reset-visa-action.component.ts +++ b/src/frontend/app/actions/visa-reset-action/reset-visa-action.component.ts @@ -7,6 +7,7 @@ import { NoteEditorComponent } from '../../notes/note-editor.component'; import { tap, finalize, catchError } from 'rxjs/operators'; import { of } from 'rxjs'; import { VisaWorkflowComponent } from '../../visa/visa-workflow.component'; +import {FunctionsService} from "../../../service/functions.service"; @Component({ templateUrl: "reset-visa-action.component.html", @@ -17,6 +18,11 @@ export class ResetVisaActionComponent implements OnInit { lang: any = LANG; loading: boolean = false; + resourcesWarnings: any[] = []; + resourcesErrors: any[] = []; + + noResourceToProcess: boolean = null; + @ViewChild('noteEditor', { static: true }) noteEditor: NoteEditorComponent; @ViewChild('appVisaWorkflow', { static: false }) appVisaWorkflow: VisaWorkflowComponent; @@ -24,10 +30,37 @@ export class ResetVisaActionComponent implements OnInit { public http: HttpClient, private notify: NotificationService, public dialogRef: MatDialogRef<ResetVisaActionComponent>, - @Inject(MAT_DIALOG_DATA) public data: any + @Inject(MAT_DIALOG_DATA) public data: any, + public functions: FunctionsService ) { } - ngOnInit(): void { } + async ngOnInit() { + this.loading = true; + await this.checkResetVisa(); + this.loading = false; + } + + checkResetVisa() { + this.resourcesErrors = []; + this.resourcesWarnings = []; + + return new Promise((resolve, reject) => { + this.http.post('../../rest/resourcesList/users/' + this.data.userId + '/groups/' + this.data.groupId + '/baskets/' + this.data.basketId + '/actions/' + this.data.action.id + '/checkInterruptRejectResetVisa', { resources: this.data.resIds }) + .subscribe((data: any) => { + if (!this.functions.empty(data.resourcesInformations.warning)) { + this.resourcesWarnings = data.resourcesInformations.warning; + } + + if(!this.functions.empty(data.resourcesInformations.error)) { + this.resourcesErrors = data.resourcesInformations.error; + this.noResourceToProcess = this.resourcesErrors.length === this.data.resIds.length; + } + resolve(true); + }, (err: any) => { + this.notify.handleSoftErrors(err); + }); + }); + } onSubmit() { this.loading = true; @@ -46,4 +79,8 @@ export class ResetVisaActionComponent implements OnInit { }) ).subscribe(); } + + isValidAction() { + return !this.noResourceToProcess; + } } diff --git a/src/frontend/app/administration/contact/page/form/contacts-form.component.html b/src/frontend/app/administration/contact/page/form/contacts-form.component.html index 46078a175ce04bbe73dcc762aaf7d5fda885869c..a23c9b1095ebecb55091d7cf919484641e6a47d9 100644 --- a/src/frontend/app/administration/contact/page/form/contacts-form.component.html +++ b/src/frontend/app/administration/contact/page/form/contacts-form.component.html @@ -122,21 +122,31 @@ </mat-form-field> </ng-container> <ng-container *ngIf="field.type === 'radio'"> - <label class="labelCustom">{{field.label}}</label> + <label class="labelCustom">{{field.label}} <ng-container *ngIf="field.required">*</ng-container></label> <mat-radio-group class="radio-form" color="primary" [formControl]="field.control"> <mat-radio-button *ngFor="let value of field.values" [value]="value.id"> {{value.label}} </mat-radio-button> </mat-radio-group> + <i *ngIf="field.filling" style="position:absolute;height: auto;padding-right: 10px;right: 0px;z-index: 1;top: 50%;transform: translateY(-50%);" + [title]="lang.targetFillingField" [style.color]="fillingRate.color" + class="fas fa-circle rate"></i> + <mat-error *ngIf="field.control.status!=='VALID' && field.control.touched"> + {{getErrorMsg(field.control.errors)}}</mat-error> </ng-container> <ng-container *ngIf="field.type === 'checkbox'"> - <label class="labelCustom">{{field.label}}</label> + <label class="labelCustom">{{field.label}} <ng-container *ngIf="field.required">*</ng-container></label> <mat-selection-list #shoes class="checkbox-form" [formControl]="field.control"> <mat-list-option *ngFor="let value of field.values" [value]="value.id" color="primary" checkboxPosition="before"> {{value.label}} </mat-list-option> </mat-selection-list> + <i *ngIf="field.filling" style="position:absolute;height: auto;padding-right: 10px;right: 0px;z-index: 1;top: 50%;transform: translateY(-50%);" + [title]="lang.targetFillingField" [style.color]="fillingRate.color" + class="fas fa-circle rate"></i> + <mat-error *ngIf="field.control.status!=='VALID' && field.control.touched"> + {{getErrorMsg(field.control.errors)}}</mat-error> </ng-container> </p> <button *ngIf="field.display" [disabled]="!canDelete(field)" mat-icon-button matSuffix diff --git a/src/frontend/app/administration/contact/page/form/contacts-form.component.scss b/src/frontend/app/administration/contact/page/form/contacts-form.component.scss index 88db748170b17ef780b277a0f2caed7f2e1314f4..b51ecb17334aece0b0289afbe20c99818e36ad80 100644 --- a/src/frontend/app/administration/contact/page/form/contacts-form.component.scss +++ b/src/frontend/app/administration/contact/page/form/contacts-form.component.scss @@ -1,110 +1,117 @@ @import "../../../../../css/vars.scss"; .contact-item { - height: auto !important; + height: auto !important; } .multipleUnits div:nth-child(1) { - display: inline-grid !important; - width: 50%; + display: inline-grid !important; + width: 50%; } .multipleUnits div:nth-child(2) { - display: inline-grid !important; - width: 50%; + display: inline-grid !important; + width: 50%; } .unitTitle { - display: flex; - color: $primary; + display: flex; + color: $primary; } .contact-address { - cursor: pointer; - color: #337ab7; + cursor: pointer; + color: #337ab7; - &:hover { - .contact-content { - text-decoration: underline; + &:hover { + .contact-content { + text-decoration: underline; + } } - } +} + +.contact-content { + position: relative; } .smallInput { - font-size: 11px; - padding-left: 20px; - padding-right: 20px; - .mat-button { - width: 30px; - height: 25px; - color: $primary; + font-size: 11px; + padding-left: 20px; + padding-right: 20px; + + .mat-button { + width: 30px; + height: 25px; + color: $primary; + + ::ng-deep.mat-button-wrapper { + display: flex; + line-height: initial; + align-items: center; + } + } - ::ng-deep.mat-button-wrapper { - display: flex; - line-height: initial; - align-items: center; + ::ng-deep.mat-form-field-infix { + padding: 0px; + padding-bottom: 5px; } - } - ::ng-deep.mat-form-field-infix { - padding: 0px; - padding-bottom: 5px; - } } + .radio-form { - display: flex; + display: flex; - .mat-radio-button { - flex: 1; - } + .mat-radio-button { + flex: 1; + } } .checkbox-form { - overflow: auto; - max-height: 200px; + overflow: auto; + max-height: 200px; } .loading { - display: flex; - height: 100%; + display: flex; + height: 100%; } .fillingBar { - ::ng-deep .mat-progress-bar-buffer { - background: #e4e8eb; - } + ::ng-deep .mat-progress-bar-buffer { + background: #e4e8eb; + } } .rate { - font-size: 10px; - text-align: right; + font-size: 10px; + text-align: right; } .fillingBar.mat-warn { - ::ng-deep.mat-progress-bar-fill::after { - background-color: #e81c2b; - } + ::ng-deep.mat-progress-bar-fill::after { + background-color: #e81c2b; + } } .fillingBar.mat-primary { - ::ng-deep.mat-progress-bar-fill::after { - background-color: #f4891e; - } + ::ng-deep.mat-progress-bar-fill::after { + background-color: #f4891e; + } } .fillingBar.mat-accent { - ::ng-deep.mat-progress-bar-fill::after { - background-color: #0aa34f; - } + ::ng-deep.mat-progress-bar-fill::after { + background-color: #0aa34f; + } } .mat-error { - font-size: 10px; - text-align: right; - font-weight: bold; + font-size: 10px; + text-align: right; + font-weight: bold; } .labelCustom { - color: rgba(0, 0, 0, 0.54); - transform: scale(0.75); - font-weight: 400; -} + color: rgba(0, 0, 0, 0.54); + transform: scale(0.75); + font-weight: 400; +} \ No newline at end of file diff --git a/src/frontend/app/administration/history/history-administration.component.html b/src/frontend/app/administration/history/history-administration.component.html index 8dc4e5f7e4ed7c8a886d72e062470d289f1db9a8..04e33eb5ac9b33bd2b91a1602a621d8d34825064 100755 --- a/src/frontend/app/administration/history/history-administration.component.html +++ b/src/frontend/app/administration/history/history-administration.component.html @@ -1,144 +1,162 @@ -<div class="admin-container" [class.admin-is-mobile]="appService.getViewMode()"> - <mat-sidenav-container autosize class="admin-sidenav-container" > - <mat-sidenav #snav [mode]="appService.getViewMode() ? 'over' : 'side'" [fixedInViewport]="appService.getViewMode()" fixedTopGap="56" - [opened]="appService.getViewMode() ? false : true"> - <menu-shortcut></menu-shortcut> - <menu-nav></menu-nav> - </mat-sidenav> - <mat-sidenav-content> - <div *ngIf="loading" style="display:flex;height:100%;"> - <mat-spinner style="margin:auto;"></mat-spinner> +<mat-sidenav-container autosize class="maarch-container"> + <mat-sidenav #snav [mode]="appService.getViewMode() ? 'over' : 'side'" [fixedInViewport]="appService.getViewMode()" + fixedTopGap="56" [opened]="appService.getViewMode() ? false : true"> + <header-panel [snavLeft]="snav"></header-panel> + <menu-shortcut></menu-shortcut> + <menu-nav></menu-nav> + <mat-nav-list> + <a mat-list-item *ngFor="let menu of subMenus" [class.active]="menu.current" [routerLink]="menu.route"> + <mat-icon color="primary" mat-list-icon [class]="menu.icon"></mat-icon> + <p mat-line> + {{menu.label}} + </p> + </a> + </mat-nav-list> + <mat-divider></mat-divider> + </mat-sidenav> + <mat-sidenav-content> + <div class="bg-head"> + <div class="bg-head-title" [class.customContainerRight]="appService.getViewMode()"> + <div class="bg-head-title-label"> + <header-left [snavLeft]="snav"></header-left> + </div> + <div class="bg-head-title-tool"> + <header-right></header-right> + </div> </div> - <mat-card *ngIf="!loading" class="card-app-content"> - <mat-tab-group (selectedIndexChange)="_setDataSource($event)"> - <mat-tab label="{{lang.history}}" *ngIf="accessHistory"> - <mat-card *ngIf="!loading" class="card-app-content"> - <div class="alert alert-warning" role="alert" [innerHTML]="lang.limitDataReached" *ngIf="limitExceeded"> - </div> - <div class="row"> - <div class="col-md-6 col-xs-6"> - <mat-form-field> - <input matInput (keyup)="applyFilter($event.target.value, 'normal')" placeholder="{{lang.filterBy}}"> - </mat-form-field> - </div> - <div class="col-md-6 col-xs-6"> - <mat-paginator #paginator [length]="100" [hidePageSize]="true" [pageSize]="10"> - </mat-paginator> - </div> - </div> - - <div class="row"> - <div class="col-sm-6" style="padding-top:10px;"> - <mat-form-field> - <input matInput [(ngModel)]="startDate" [max]="endDate" [matDatepicker]="pickerStart" placeholder="{{lang.since}}" (dateChange)="refreshHistory('normal')" - (focus)="pickerStart.open()"> - <mat-datepicker-toggle matSuffix [for]="pickerStart"></mat-datepicker-toggle> - <mat-datepicker #pickerStart touchUi="true" [startAt]="startDate"></mat-datepicker> - </mat-form-field> - - </div> - <div class="col-sm-6" style="padding-top:10px;"> - <mat-form-field> - <input matInput [(ngModel)]="endDate" [min]="startDate" [matDatepicker]="pickerEnd" placeholder="{{lang.until}}" (dateChange)="refreshHistory('normal')" - (focus)="pickerEnd.open()"> - <mat-datepicker-toggle matSuffix [for]="pickerEnd"></mat-datepicker-toggle> - <mat-datepicker #pickerEnd touchUi="true" [startAt]="endDate"></mat-datepicker> - </mat-form-field> - </div> - </div> - <mat-table #table [dataSource]="dataSource" matSort matSortActive="event_date" #sort="matSort" matSortDirection="desc"> - <ng-container matColumnDef="event_date"> - <mat-header-cell *matHeaderCellDef mat-sort-header style="flex:1;">{{lang.date}}</mat-header-cell> - <mat-cell *matCellDef="let element" style="flex:1;">{{element.event_date | date : "dd/MM/y HH:mm"}}</mat-cell> - </ng-container> - <ng-container matColumnDef="event_type"> - <mat-header-cell *matHeaderCellDef mat-sort-header style="flex:1;" [class.hide-for-mobile]="appService.getViewMode()">{{lang.event}}</mat-header-cell> - <mat-cell *matCellDef="let element" style="flex:1;" [class.hide-for-mobile]="appService.getViewMode()"> {{element.event_type}} </mat-cell> - </ng-container> - <ng-container matColumnDef="user_id"> - <mat-header-cell *matHeaderCellDef mat-sort-header style="flex:1;" [class.hide-for-mobile]="appService.getViewMode()">{{lang.user}}</mat-header-cell> - <mat-cell *matCellDef="let element" style="flex:1;" [class.hide-for-mobile]="appService.getViewMode()"> {{element.user_id}} </mat-cell> - </ng-container> - <ng-container matColumnDef="info"> - <mat-header-cell *matHeaderCellDef mat-sort-header style="flex:3;">{{lang.description}}</mat-header-cell> - <mat-cell *matCellDef="let element" style="flex:3;"> {{element.info}} </mat-cell> - </ng-container> - <ng-container matColumnDef="remote_ip"> - <mat-header-cell *matHeaderCellDef mat-sort-header style="flex:1;" [class.hide-for-mobile]="appService.getViewMode()">{{lang.ip}}</mat-header-cell> - <mat-cell *matCellDef="let element" style="flex:1;" [class.hide-for-mobile]="appService.getViewMode()"> {{element.remote_ip}} </mat-cell> - </ng-container> - <mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row> - <mat-row *matRowDef="let row; columns: displayedColumns;"></mat-row> - </mat-table> - <div class="mat-paginator" style="min-height:48px;min-height: 48px;display: flex;justify-content: end;align-items: center;padding-right: 20px;">{{data.length}} {{lang.entries}}</div> - </mat-card> - </mat-tab> - <mat-tab label="{{lang.historyBatch}}" *ngIf="accessBatchHistory"> - <mat-card *ngIf="!loading" class="card-app-content"> - <div class="alert alert-warning" role="alert" [innerHTML]="lang.limitDataReached" *ngIf="limitExceeded"></div> - <div class="row"> - <div class="col-md-6 col-xs-6"> - <mat-form-field> - <input matInput (keyup)="applyFilter($event.target.value, 'batch')" placeholder="{{lang.filterBy}}"> - </mat-form-field> - </div> - <div class="col-md-6 col-xs-6"> - <mat-paginator #batchPaginator [length]="100" [hidePageSize]="true" [pageSize]="10"> - </mat-paginator> - </div> - </div> - <div class="row"> - <div class="col-sm-6" style="padding-top:10px;"> - <mat-form-field> - <input matInput [(ngModel)]="batchStartDate" [max]="batchEndDate" [matDatepicker]="pickerStart" placeholder="{{lang.since}}" - (dateChange)="refreshHistory('batch')" (focus)="pickerStart.open()"> - <mat-datepicker-toggle matSuffix [for]="pickerStart"></mat-datepicker-toggle> - <mat-datepicker #pickerStart touchUi="true" [startAt]="batchStartDate"></mat-datepicker> - </mat-form-field> - </div> - <div class="col-sm-6" style="padding-top:10px;"> - <mat-form-field> - <input matInput [(ngModel)]="batchEndDate" [min]="batchStartDate" [matDatepicker]="pickerEnd" placeholder="{{lang.until}}" - (dateChange)="refreshHistory('batch')" (focus)="pickerEnd.open()"> - <mat-datepicker-toggle matSuffix [for]="pickerEnd"></mat-datepicker-toggle> - <mat-datepicker #pickerEnd touchUi="true" [startAt]="batchEndDate"></mat-datepicker> - </mat-form-field> - </div> - </div> - <mat-table #table [dataSource]="batchDataSource" #batchSort="matSort" matSort matSortActive="event_date" matSortDirection="desc"> - <ng-container matColumnDef="event_date"> - <mat-header-cell *matHeaderCellDef mat-sort-header>{{lang.date}}</mat-header-cell> - <mat-cell *matCellDef="let element">{{element.event_date | date : "dd/MM/y HH:mm"}}</mat-cell> - </ng-container> - <ng-container matColumnDef="total_processed"> - <mat-header-cell *matHeaderCellDef mat-sort-header [class.hide-for-mobile]="appService.getViewMode()">{{lang.totalProcessed}}</mat-header-cell> - <mat-cell *matCellDef="let element" [class.hide-for-mobile]="appService.getViewMode()"> {{element.total_processed}} </mat-cell> - </ng-container> - <ng-container matColumnDef="total_errors"> - <mat-header-cell *matHeaderCellDef mat-sort-header [class.hide-for-mobile]="appService.getViewMode()">{{lang.totalErrors}}</mat-header-cell> - <mat-cell *matCellDef="let element" [class.hide-for-mobile]="appService.getViewMode()"> {{element.total_errors}} </mat-cell> - </ng-container> - <ng-container matColumnDef="info"> - <mat-header-cell *matHeaderCellDef mat-sort-header>{{lang.description}}</mat-header-cell> - <mat-cell *matCellDef="let element"> {{element.info}} </mat-cell> - </ng-container> - <ng-container matColumnDef="module_name"> - <mat-header-cell *matHeaderCellDef mat-sort-header [class.hide-for-mobile]="appService.getViewMode()">{{lang.module}}</mat-header-cell> - <mat-cell *matCellDef="let element" [class.hide-for-mobile]="appService.getViewMode()"> {{element.module_name}} </mat-cell> + <div class="bg-head-content" [class.fullContainer]="appService.getViewMode()"> + <div style="display: grid;grid-template-columns: repeat(2, 1fr);grid-gap: 10px;width: 100%;"> + <mat-form-field (click)="startPicker.open()" style="cursor:pointer;" class="dateFilter"> + <mat-label style="color:white;">{{lang.since}} + </mat-label> + <input [(ngModel)]="startDateFilter" matInput [matDatepicker]="startPicker" + [placeholder]="lang.since" [max]="endDateFilter" readonly style="cursor:pointer;" + (dateChange)="filterStartDate()"> + <mat-datepicker-toggle matSuffix [for]="startPicker" *ngIf="!startDateFilter"> + </mat-datepicker-toggle> + <mat-datepicker [touchUi]="appService.getViewMode()" #startPicker> + </mat-datepicker> + <button mat-button color="warn" matSuffix mat-icon-button *ngIf="startDateFilter" + (click)="$event.stopPropagation();startDateFilter = '';filterStartDate()" [title]="lang.eraseValue"> + <mat-icon color="warn" class="fa fa-calendar-times"> + </mat-icon> + </button> + </mat-form-field> + <mat-form-field (click)="endPicker.open()" style="cursor:pointer;" class="dateFilter"> + <mat-label style="color:white;">{{lang.until}} + </mat-label> + <input [(ngModel)]="endDateFilter" matInput [matDatepicker]="endPicker" + [placeholder]="lang.until" [min]="startDateFilter" readonly style="cursor:pointer;" + (dateChange)="filterEndDate()"> + <mat-datepicker-toggle matSuffix [for]="endPicker" *ngIf="!endDateFilter"> + </mat-datepicker-toggle> + <mat-datepicker [touchUi]="appService.getViewMode()" #endPicker> + </mat-datepicker> + <button mat-button color="warn" matSuffix mat-icon-button *ngIf="endDateFilter" + (click)="$event.stopPropagation();endDateFilter = '';filterEndDate()" [title]="lang.eraseValue"> + <mat-icon color="warn" class="fa fa-calendar-times"> + </mat-icon> + </button> + </mat-form-field> + </div> + </div> + </div> + <div class="container" [class.fullContainer]="appService.getViewMode()"> + <div class="container-content"> + <div class="example-loading-shade" *ngIf="isLoadingResults"> + <mat-spinner *ngIf="isLoadingResults"></mat-spinner> + </div> + <div class="table-head"> + <div class="table-head-result"> + <mat-form-field floatLabel="never" style="font-size: 13px;"> + <input type="text" #autoCompleteInput [matAutocomplete]="auto" [placeholder]="lang.filterBy" + matInput [formControl]="searchHistory" (click)="$event.stopPropagation()" + maxlength="128"> + <mat-autocomplete #auto="matAutocomplete" (optionSelected)="addItemFilter($event.option)" + (opened)="initFilterListHistory()"> + <mat-option disabled *ngIf="loadingFilters"> + <div style="display: flex;justify-content: center;"> + <mat-spinner diameter="35"></mat-spinner> + </div> + </mat-option> + <ng-container *ngIf="filterList!==null && !loadingFilters"> + <ng-container *ngFor="let keyVal of filterList | keyvalue"> + <mat-optgroup *ngIf="(filteredList[keyVal.key] | async)?.length > 0" + [label]="lang[keyVal.key]" class="filterList"> + <mat-option [id]="keyVal.key" + [style.color]="!filter.used ? filterColor[keyVal.key] : ''" + *ngFor="let filter of filteredList[keyVal.key] | async | sortBy : 'label'" + [value]="filter" [disabled]="filter.used"> + {{filter.label}} + </mat-option> + </mat-optgroup> + </ng-container> </ng-container> - <mat-header-row *matHeaderRowDef="batchDisplayedColumns"></mat-header-row> - <mat-row *matRowDef="let row; columns: batchDisplayedColumns;"></mat-row> - </mat-table> - </mat-card> - </mat-tab> - </mat-tab-group> - </mat-card> - </mat-sidenav-content> - <mat-sidenav #snav2 [mode]="appService.getViewMode() ? 'over' : 'side'" [fixedInViewport]="appService.getViewMode()" fixedTopGap="56" - position='end' [opened]="appService.getViewMode() ? false : false"> - <mat-nav-list> - <h3 mat-subheader>Actions</h3> - </mat-nav-list> - </mat-sidenav> - </mat-sidenav-container> -</div> \ No newline at end of file + + </mat-autocomplete> + </mat-form-field> + </div> + <div class="table-head-tool"> + <mat-paginator #paginatorHistoryList [length]="resultsLength" [hidePageSize]="true" + [pageSize]="10" class="paginatorResultList"></mat-paginator> + </div> + </div> + <div style="height:90%;overflow:auto;position:absolute;width:100%;"> + <div class="filterBadges"> + <ng-container *ngFor="let keyVal of filterUsed | keyvalue"> + <ng-container *ngIf="['startDate','endDate'].indexOf(keyVal.key) === -1"> + <span *ngFor="let filter of filterUsed[keyVal.key]; let i=index;" class="label" + [style.background]="filterColor[keyVal.key]" [title]="lang[keyVal.key]" + (click)="removeItemFilter(filter,keyVal.key,i)">{{filter.label}} + <i class="fa fa-times-circle"></i></span> + </ng-container> + </ng-container> + </div> + <mat-table id="history-list" #tableHistoryListSort="matSort" [dataSource]="data" matSort + matSortActive="event_date" matSortDirection="desc" style="width:100%;"> + <ng-container matColumnDef="event_date"> + <mat-header-cell *matHeaderCellDef mat-sort-header + [class.hide-for-mobile]="appService.getViewMode()">{{lang.event}}</mat-header-cell> + <mat-cell mat-cell *matCellDef="let element" + [class.hide-for-mobile]="appService.getViewMode()" + [title]="element.event_date | fullDate"> + {{element.event_date | timeAgo : 'full' | ucfirst}} </mat-cell> + </ng-container> + <ng-container matColumnDef="userLabel"> + <mat-header-cell *matHeaderCellDef mat-sort-header + [class.hide-for-mobile]="appService.getViewMode()">{{lang.user | ucfirst}}</mat-header-cell> + <mat-cell *matCellDef="let element" [class.hide-for-mobile]="appService.getViewMode()"> + {{element.userLabel}} </mat-cell> + </ng-container> + <ng-container matColumnDef="info"> + <mat-header-cell *matHeaderCellDef mat-sort-header + [class.hide-for-mobile]="appService.getViewMode()" style="flex: 2;">{{lang.information}} + </mat-header-cell> + <mat-cell *matCellDef="let element" [class.hide-for-mobile]="appService.getViewMode()" + style="flex: 2;"> + {{element.info}} </mat-cell> + </ng-container> + <ng-container matColumnDef="remote_ip"> + <mat-header-cell *matHeaderCellDef mat-sort-header + [class.hide-for-mobile]="appService.getViewMode()">{{lang.ip}} + </mat-header-cell> + <mat-cell *matCellDef="let element" [class.hide-for-mobile]="appService.getViewMode()"> + {{element.remote_ip}} </mat-cell> + </ng-container> + <mat-header-row *matHeaderRowDef="displayedColumnsHistory"></mat-header-row> + <mat-row *matRowDef="let row; columns: displayedColumnsHistory;"> + </mat-row> + </mat-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.elements}}</div> + </div> + <div class="table-head"> + </div> + </div> + </div> + </mat-sidenav-content> + <mat-sidenav #snav2 [mode]="appService.getViewMode() ? 'over' : 'side'" [fixedInViewport]="appService.getViewMode()" + fixedTopGap="56" position='end' [opened]="appService.getViewMode() ? false : false"> + </mat-sidenav> +</mat-sidenav-container> \ No newline at end of file diff --git a/src/frontend/app/administration/history/history-administration.component.scss b/src/frontend/app/administration/history/history-administration.component.scss new file mode 100644 index 0000000000000000000000000000000000000000..d72907097a8ff943af1669f7434e98f0ba62e4e7 --- /dev/null +++ b/src/frontend/app/administration/history/history-administration.component.scss @@ -0,0 +1,54 @@ +@import '../../../css/vars.scss'; + +.active, +.active:hover, +.active:active, +.active:focus { + color: $primary; + border-left: solid 5px $primary; + background: rgba($primary, 0.14); +} + + +.paginatorResultList { + ::ng-deep.mat-paginator-range-label { + justify-content: flex-end; + display: flex; + } +} + +.filterList { + ::ng-deep.mat-optgroup-label { + color: $primary; + position: sticky; + top: 0px; + background: white !important; + z-index: 1; + } +} + +.label { + cursor: pointer; + margin: 5px; +} + +.bg-head-content { + ::ng-deep .mat-focused .mat-form-field-label { + /*change color of label*/ + color: white !important; + } + + ::ng-deep.mat-form-field-underline { + /*change color of underline*/ + background-color: white !important; + } + + ::ng-deep.mat-form-field-ripple { + /*change color of underline when focused*/ + background-color: white !important; + } + + .mat-icon,.mat-datepicker-toggle { + color:white; + } +} \ No newline at end of file diff --git a/src/frontend/app/administration/history/history-administration.component.ts b/src/frontend/app/administration/history/history-administration.component.ts index 4a656d05dcbeaf561d5109a5ef81843d9f122484..1fd905fbc224776a55878afc72347485cab6a88a 100755 --- a/src/frontend/app/administration/history/history-administration.component.ts +++ b/src/frontend/app/administration/history/history-administration.component.ts @@ -1,184 +1,293 @@ -import { Component, OnInit, ViewChild } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; -import { MatPaginator } from '@angular/material/paginator'; +import { Component, OnInit, ViewChild, EventEmitter, ElementRef } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { LANG } from '../../translate.component'; +import { NotificationService } from '../../notification.service'; +import { HeaderService } from '../../../service/header.service'; import { MatSidenav } from '@angular/material/sidenav'; -import { MatSort } from '@angular/material/sort'; -import { MatTableDataSource } from '@angular/material/table'; -import { LANG } from '../../translate.component'; -import { HeaderService } from '../../../service/header.service'; import { AppService } from '../../../service/app.service'; - -declare function $j(selector: any): any; +import { Observable, merge, Subject, of as observableOf, of } from 'rxjs'; +import { MatPaginator, MatSort, MatDialog } from '@angular/material'; +import { takeUntil, startWith, switchMap, map, catchError, filter, exhaustMap, tap, debounceTime, distinctUntilChanged, finalize } from 'rxjs/operators'; +import { ConfirmComponent } from '../../../plugins/modal/confirm.component'; +import { FormControl } from '@angular/forms'; +import { FunctionsService } from '../../../service/functions.service'; +import { LatinisePipe } from 'ngx-pipes'; @Component({ + selector: 'contact-list', templateUrl: "history-administration.component.html", + styleUrls: ['history-administration.component.scss'], providers: [AppService] }) export class HistoryAdministrationComponent implements OnInit { - @ViewChild('snav', { static: true }) public sidenavLeft : MatSidenav; - @ViewChild('snav2', { static: true }) public sidenavRight : MatSidenav; + @ViewChild('snav', { static: true }) public sidenavLeft: MatSidenav; + @ViewChild('snav2', { static: true }) public sidenavRight: MatSidenav; - lang : any = LANG; - loading : boolean = false; - limitExceeded : boolean = false; - batchLimitExceeded : boolean = false; + lang: any = LANG; + loading: boolean = false; - data : any[] = []; - batchData : any[] = []; - startDate : Date = new Date(); - endDate : Date = new Date(); - batchStartDate : Date = new Date(); - batchEndDate : Date = new Date(); + filtersChange = new EventEmitter(); + data: any; - dataSource = new MatTableDataSource(this.data); - batchDataSource = new MatTableDataSource(this.batchData); - displayedColumns = ['event_date', 'event_type', 'user_id', 'info', 'remote_ip']; - batchDisplayedColumns = ['event_date', 'total_processed', 'total_errors', 'info', 'module_name']; + displayedColumnsHistory: string[] = ['event_date', 'userLabel', 'info', 'remote_ip']; - accessBatchHistory : boolean = true; - accessHistory : boolean = true; + isLoadingResults = true; + routeUrl: string = '../../rest/history'; + resultListDatabase: HistoryListHttpDao | null; + resultsLength = 0; + searchHistory = new FormControl(); + startDateFilter: any = ''; + endDateFilter: any = ''; + filterUrl: string = ''; + filterList: any = null; + filteredList: any = {}; + filterUsed: any = {}; - @ViewChild('paginator', { static: false }) paginator: MatPaginator; - @ViewChild('batchPaginator', { static: false }) batchPaginator: MatPaginator; - @ViewChild('sort', { static: false }) sort: MatSort; - @ViewChild('batchSort', { static: false }) batchSort: MatSort; - applyFilter(filterValue: string, historyType : string) { - filterValue = filterValue.trim(); - filterValue = filterValue.toLowerCase(); - if(historyType == 'normal'){ - this.dataSource.filter = filterValue; - } else { - this.batchDataSource.filter = filterValue - } - } + filterColor = { + startDate: '#b5cfd8', + endDate: '#7393a7', + actions: '#7d5ba6', + systemActions: '#d6716f', + users: '#009dc5', + }; + + loadingFilters: boolean = true; + + @ViewChild(MatPaginator, { static: true }) paginator: MatPaginator; + @ViewChild('tableHistoryListSort', { static: true }) sort: MatSort; + @ViewChild('autoCompleteInput', { static: true }) autoCompleteInput: ElementRef; + + private destroy$ = new Subject<boolean>(); + + subMenus: any[] = [ + { + icon: 'fa fa-history', + route: '/administration/history', + label: this.lang.history, + current: true + }, + { + icon: 'fa fa-history', + route: '/administration/history-batch', + label: this.lang.historyBatch, + current: false + } + ]; constructor( - public http: HttpClient, + public http: HttpClient, + private notify: NotificationService, private headerService: HeaderService, - public appService: AppService - ) { - $j("link[href='merged_css.php']").remove(); + public appService: AppService, + public dialog: MatDialog, + public functions: FunctionsService, + private latinisePipe: LatinisePipe) { } - this.startDate.setHours(0,0,0,0); - this.startDate.setMonth(this.endDate.getMonth()-1); - this.endDate.setHours(23,59,59,59); + ngOnInit(): void { + this.loading = true; + this.initHistoryList(); + } + + initHistoryList() { + this.resultListDatabase = new HistoryListHttpDao(this.http); + this.paginator.pageIndex = 0; + this.sort.active = 'event_date'; + this.sort.direction = 'desc'; + this.sort.sortChange.subscribe(() => this.paginator.pageIndex = 0); - this.batchStartDate.setHours(0,0,0,0); - this.batchStartDate.setMonth(this.endDate.getMonth()-1); - this.batchEndDate.setHours(23,59,59,59); + // When list is refresh (sort, page, filters) + merge(this.sort.sortChange, this.paginator.page, this.filtersChange) + .pipe( + takeUntil(this.destroy$), + startWith({}), + switchMap(() => { + this.isLoadingResults = true; + return this.resultListDatabase!.getRepoIssues( + this.sort.active, this.sort.direction, this.paginator.pageIndex, this.routeUrl, this.filterUrl); + }), + map(data => { + this.isLoadingResults = false; + data = this.processPostData(data); + this.resultsLength = data.count; + this.headerService.setHeader(this.lang.administration + ' ' + this.lang.history.toLowerCase(), '', ''); + return data.history; + }), + catchError((err: any) => { + this.notify.handleErrors(err); + this.isLoadingResults = false; + return observableOf([]); + }) + ).subscribe(data => this.data = data); } - ngOnInit(): void { - this.headerService.setHeader(this.lang.administration + ' ' + this.lang.history); - window['MainHeaderComponent'].setSnav(this.sidenavLeft); - window['MainHeaderComponent'].setSnavRight(null); + processPostData(data: any) { + data.history = data.history.map((item: any) => { + return { + ...item, + userLabel : !this.functions.empty(item.userLabel) ? item.userLabel : this.lang.userDeleted + } + }) + return data; + } - this.loading = true; - this.http.get('../../rest/histories', {params: {"startDate" : (this.startDate.getTime() / 1000).toString(), "endDate" : (this.endDate.getTime() / 1000).toString()}}) - .subscribe((data: any) => { - this.data = data['histories']; - this.limitExceeded = data['limitExceeded']; - this.loading = false; - setTimeout(() => { - this.accessHistory = true; - this.dataSource = new MatTableDataSource(this.data); - this.dataSource.paginator = this.paginator; - this.dataSource.sort = this.sort; - }, 0); - }, (data: any) => { - if(data['error'].errors == 'Service forbidden'){ - this.loading = false; - this.accessHistory = false; - } else { - location.href = "index.php"; - } - }); + refreshDao() { + this.paginator.pageIndex = 0; + this.filtersChange.emit(); + } - this.http.get('../../rest/batchHistories', {params: {"startDate" : (this.batchStartDate.getTime() / 1000).toString(), "endDate" : (this.batchEndDate.getTime() / 1000).toString()}}) - .subscribe((data: any) => { - this.batchData = data['batchHistories']; - this.batchLimitExceeded = data['limitExceeded']; - this.loading = false; - setTimeout(() => { - this.accessBatchHistory = true; - this.batchDataSource = new MatTableDataSource(this.batchData); - this.batchDataSource.paginator = this.batchPaginator; - this.batchDataSource.sort = this.batchSort; - }, 0); - }, (data: any) => { - if(data['error'].errors == 'Service forbidden'){ - this.loading = false - this.accessBatchHistory = false; - } else { - location.href = "index.php"; - } - - }); - + initFilterListHistory() { + + if (this.filterList === null) { + this.filterList = {}; + this.loadingFilters = true; + this.http.get("../../rest/history/availableFilters").pipe( + map((data: any) => { + let deletedActions = data.actions.filter((action: any) => action.label === null).map((action: any) => action.id); + let deletedUser = data.users.filter((user: any) => user.label === null).map((user: any) => user.login); + + data.actions = data.actions.filter((action: any) => action.label !== null); + if (deletedActions.length > 0) { + data.actions.push({ + id: deletedActions, + label: this.lang.actionDeleted + }); + } + + data.users = data.users.filter((user: any) => user.label !== null); + + if (deletedUser.length > 0) { + data.users.push({ + id: deletedUser, + label: this.lang.userDeleted + }); + } + + data.systemActions = data.systemActions.map((syst: any) => { + return { + id: syst.id, + label: this.lang[syst.id] + } + }); + return data; + }), + tap((data: any) => { + Object.keys(data).forEach((filterType: any) => { + if (this.functions.empty(this.filterList[filterType])) { + this.filterList[filterType] = []; + this.filteredList[filterType] = []; + } + data[filterType].forEach((element: any) => { + this.filterList[filterType].push(element); + }); + + this.filteredList[filterType] = this.searchHistory.valueChanges + .pipe( + startWith(''), + map(element => element ? this.filter(element, filterType) : this.filterList[filterType].slice()) + ); + }); + + }), + finalize(() => this.loadingFilters = false), + catchError((err: any) => { + this.notify.handleSoftErrors(err); + return of(false); + }) + ).subscribe(); + + } } - ngAfterViewInit() { - this.batchDataSource.paginator = this.batchPaginator; - this.batchDataSource.sort = this.batchSort; + filterStartDate() { + if (this.functions.empty(this.filterUsed['startDate'])) { + this.filterUsed['startDate'] = []; + } + this.filterUsed['startDate'][0] = { + id: this.functions.empty(this.startDateFilter) ? '' : this.functions.formatDateObjectToFrenchDateString(this.startDateFilter), + label: this.functions.empty(this.startDateFilter) ? '' : this.functions.formatDateObjectToFrenchDateString(this.startDateFilter) + }; + this.generateUrlFilter(); + this.refreshDao(); } - - _setDataSource(indexNumber : any) { - setTimeout(() => { - switch (indexNumber) { - case 0: - !this.dataSource.paginator ? this.dataSource.paginator = this.paginator : null; - !this.dataSource.sort ? this.dataSource.sort = this.sort : null; - break; - case 1: - !this.batchDataSource.paginator ? this.batchDataSource.paginator = this.batchPaginator : null; - !this.batchDataSource.sort ? this.batchDataSource.sort = this.batchSort : null; - } - }); + + filterEndDate() { + if (this.functions.empty(this.filterUsed['endDate'])) { + this.filterUsed['endDate'] = []; + } + this.filterUsed['endDate'][0] = { + id: this.functions.empty(this.endDateFilter) ? '' : this.functions.formatDateObjectToFrenchDateString(this.endDateFilter, true), + label: this.functions.empty(this.endDateFilter) ? '' : this.functions.formatDateObjectToFrenchDateString(this.endDateFilter) + }; + this.generateUrlFilter(); + this.refreshDao(); } - refreshHistory(historyType : string) { - if (historyType == 'normal') { - this.startDate.setHours(0,0,0,0); - this.endDate.setHours(23,59,59,59); - this.http.get('../../rest/histories', {params: {"startDate" : (this.startDate.getTime() / 1000).toString(), "endDate" : (this.endDate.getTime() / 1000).toString()}}) - .subscribe((data: any) => { - this.data = data['histories']; - this.limitExceeded = data['limitExceeded']; - this.loading = false; - setTimeout(() => { - this.dataSource = new MatTableDataSource(this.data); - this.dataSource.paginator = this.paginator; - this.dataSource.sort = this.sort; - }, 0); - }, () => { - location.href = "index.php"; - }); - } else { - this.batchStartDate.setHours(0,0,0,0); - this.batchEndDate.setHours(23,59,59,59); - this.http.get('../../rest/batchHistories', {params: {"startDate" : (this.batchStartDate.getTime() / 1000).toString(), "endDate" : (this.batchEndDate.getTime() / 1000).toString()}}) - .subscribe((data: any) => { - this.batchData = data['batchHistories']; - this.batchLimitExceeded = data['limitExceeded']; - this.loading = false; - setTimeout(() => { - this.accessBatchHistory = true; - this.batchDataSource = new MatTableDataSource(this.batchData); - this.batchDataSource.paginator = this.batchPaginator; - this.batchDataSource.sort = this.batchSort; - }, 0); - }, (data: any) => { - if(data['error'].errors == 'Service forbidden'){ - this.loading = false; - this.accessBatchHistory = false; + addItemFilter(elem: any) { + elem.value.used = true; + if (this.functions.empty(this.filterUsed[elem.id])) { + this.filterUsed[elem.id] = []; + } + this.filterUsed[elem.id].push(elem.value); + this.generateUrlFilter(); + this.searchHistory.reset(); + this.autoCompleteInput.nativeElement.blur(); + this.refreshDao(); + } + + removeItemFilter(elem: any, type: string, index: number) { + elem.used = false; + this.filterUsed[type].splice(index, 1); + this.generateUrlFilter(); + this.refreshDao(); + } + + + generateUrlFilter() { + this.filterUrl = ''; + let arrTmpUrl: any[] = []; + Object.keys(this.filterUsed).forEach((type: any) => { + this.filterUsed[type].forEach((filter: any) => { + if (!this.functions.empty(filter.id)) { + if (['startDate', 'endDate'].indexOf(type) > -1) { + arrTmpUrl.push(`${type}=${filter.id}`); } else { - location.href = "index.php"; + arrTmpUrl.push(`${type}[]=${filter.id}`); } - }); + } + }); + }); + if (arrTmpUrl.length > 0) { + this.filterUrl = '&' + arrTmpUrl.join('&'); + } + } + + private filter(value: string, type: string): any[] { + if (typeof value === 'string') { + const filterValue = this.latinisePipe.transform(value.toLowerCase()); + return this.filterList[type].filter((elem: any) => this.latinisePipe.transform(elem.label.toLowerCase()).includes(filterValue)); + } else { + return this.filterList[type]; } } } + +export interface HistoryList { + history: any[]; + count: number; +} +export class HistoryListHttpDao { + + constructor(private http: HttpClient) { } + + getRepoIssues(sort: string, order: string, page: number, href: string, search: string): Observable<HistoryList> { + + let offset = page * 10; + const requestUrl = `${href}?limit=10&offset=${offset}&order=${order}&orderBy=${sort}${search}`; + + return this.http.get<HistoryList>(requestUrl); + } +} \ No newline at end of file diff --git a/src/frontend/app/administration/user/users-administration.component.html b/src/frontend/app/administration/user/users-administration.component.html index 74f049284854964c11366c8499507698931168ea..6fbcd7b8d5200ab04274d8f46ba9e066aca4d51d 100755 --- a/src/frontend/app/administration/user/users-administration.component.html +++ b/src/frontend/app/administration/user/users-administration.component.html @@ -31,6 +31,10 @@ <div class="col-md-6 col-xs-6"> <mat-form-field> <input matInput (keyup)="applyFilter($event.target.value)" placeholder="{{lang.filterBy}}"> + <mat-button-toggle class="webserviceAccount" matSuffix (click)="$event.stopPropagation();toggleWebserviceAccount()" + [checked]="this.withWebserviceAccount" title="{{lang.displayWebserviceAccount}}" > + <mat-icon fontSet="fas" fontIcon="fa-user-shield fa-2x" style="margin-left: -2px; margin-top: -4px;"></mat-icon> + </mat-button-toggle> </mat-form-field> </div> <div class="col-md-6 col-xs-6"> diff --git a/src/frontend/app/administration/user/users-administration.component.scss b/src/frontend/app/administration/user/users-administration.component.scss index 03c8894cde0b48cf4f4c66bfde248910c1fa3d12..fe089dd18f6f8e436a112b68cad70cedfa41ce4b 100644 --- a/src/frontend/app/administration/user/users-administration.component.scss +++ b/src/frontend/app/administration/user/users-administration.component.scss @@ -11,4 +11,17 @@ button:disabled{ .statusUserLabelPrimary { color : $primary; -} \ No newline at end of file +} + +.webserviceAccount { + color: #666; + width: 37px; + height: 37px; + font-size: x-small; + border-radius: 18px !important; +} + +.mat-button-toggle-checked { + background-color: #F99830 !important; + color: white; +} diff --git a/src/frontend/app/administration/user/users-administration.component.ts b/src/frontend/app/administration/user/users-administration.component.ts index 557946e2e4c00f14e6eea27ac40bf00ad2c1dc07..6da9821f8e19b2850b825374f002c47c2f87756f 100755 --- a/src/frontend/app/administration/user/users-administration.component.ts +++ b/src/frontend/app/administration/user/users-administration.component.ts @@ -38,6 +38,9 @@ export class UsersAdministrationComponent implements OnInit { listinstances : any[] = []; quota : any = {}; user : any = {}; + withWebserviceAccount : boolean = false; + webserviceAccounts : any[] = []; + noWebserviceAccounts : any[] = []; dataSource = new MatTableDataSource(this.data); displayedColumns = ['id', 'user_id', 'lastname', 'firstname', 'status', 'mail', 'actions']; @@ -72,25 +75,35 @@ export class UsersAdministrationComponent implements OnInit { this.http.get('../../rest/users') .subscribe((data: any) => { this.data = data['users']; - this.data.forEach(element => { - element.statusLabel = this.lang['user'+element.status] + this.data.forEach(element => { + element.statusLabel = this.lang['user'+element.status]; + if (element.loginmode == 'restMode') { + this.webserviceAccounts.push(element); + } else { + this.noWebserviceAccounts.push(element); + } }); + this.data = this.noWebserviceAccounts; this.quota = data['quota']; if (this.quota.actives > this.quota.userQuota) { this.notify.error(this.lang.quotaExceeded); } this.loading = false; - setTimeout(() => { - this.dataSource = new MatTableDataSource(this.data); - this.dataSource.paginator = this.paginator; - this.dataSource.sort = this.sort; - }, 0); + this.setDatasource(); }, () => { location.href = "index.php"; }); } + setDatasource() { + setTimeout(() => { + this.dataSource = new MatTableDataSource(this.data); + this.dataSource.paginator = this.paginator; + this.dataSource.sort = this.sort; + }, 0); + } + activateUser(user: any) { let r = confirm(this.lang.confirmAction + ' ' + this.lang.authorize + ' « ' + user.user_id + ' »'); @@ -190,9 +203,7 @@ export class UsersAdministrationComponent implements OnInit { this.data.splice(Number(i), 1); } } - this.dataSource = new MatTableDataSource(this.data); - this.dataSource.paginator = this.paginator; - this.dataSource.sort = this.sort; + this.setDatasource(); if (this.quota.userQuota && user.status != 'SPD') { this.quota.actives--; @@ -244,9 +255,7 @@ export class UsersAdministrationComponent implements OnInit { this.data.splice(Number(i), 1); } } - this.dataSource = new MatTableDataSource(this.data); - this.dataSource.paginator = this.paginator; - this.dataSource.sort = this.sort; + this.setDatasource(); if (this.quota.userQuota && user.status == 'OK') { this.quota.actives--; @@ -297,9 +306,7 @@ export class UsersAdministrationComponent implements OnInit { this.data.splice(Number(i), 1); } } - this.dataSource = new MatTableDataSource(this.data); - this.dataSource.paginator = this.paginator; - this.dataSource.sort = this.sort; + this.setDatasource(); if (this.quota.userQuota && user.status == 'OK') { this.quota.actives--; @@ -346,9 +353,7 @@ export class UsersAdministrationComponent implements OnInit { this.data.splice(Number(i), 1); } } - this.dataSource = new MatTableDataSource(this.data); - this.dataSource.paginator = this.paginator; - this.dataSource.sort = this.sort; + this.setDatasource(); if (this.quota.userQuota && user.status == 'OK') { this.quota.actives--; @@ -390,6 +395,16 @@ export class UsersAdministrationComponent implements OnInit { }); } + toggleWebserviceAccount () { + this.withWebserviceAccount = !this.withWebserviceAccount; + if (this.withWebserviceAccount) { + this.data = this.webserviceAccounts; + } else { + this.data = this.noWebserviceAccounts; + } + this.setDatasource(); + } + } @Component({ templateUrl: "users-administration-redirect-modal.component.html", diff --git a/src/frontend/app/avis/avis-workflow.component.ts b/src/frontend/app/avis/avis-workflow.component.ts index 2238e47b7e210795f39a868fc021c5e30785bb9e..1ca989e78dad4f394cb5955858ba0be60f0c06e6 100644 --- a/src/frontend/app/avis/avis-workflow.component.ts +++ b/src/frontend/app/avis/avis-workflow.component.ts @@ -323,7 +323,8 @@ export class AvisWorkflowComponent implements OnInit { this.avisWorkflow.items.push( { ...element, - difflist_type: this.mode === 'circuit' ? 'AVIS_CIRCUIT' : 'entity_id' + difflist_type: this.mode === 'circuit' ? 'AVIS_CIRCUIT' : 'entity_id', + item_entity: element.descriptionToDisplay }); }); this.avisWorkflowClone = JSON.parse(JSON.stringify(this.avisWorkflow.items)) diff --git a/src/frontend/app/history/history-workflow-resume/history-workflow-resume.component.ts b/src/frontend/app/history/history-workflow-resume/history-workflow-resume.component.ts index 520465cd0e40856a6f81fe0ea660e6da6d547f84..0bfa3e74501825c783a8728f6052e102671594cf 100644 --- a/src/frontend/app/history/history-workflow-resume/history-workflow-resume.component.ts +++ b/src/frontend/app/history/history-workflow-resume/history-workflow-resume.component.ts @@ -40,7 +40,7 @@ export class HistoryWorkflowResumeComponent implements OnInit { loadHistory(resId: number) { this.loading = true; - this.http.get(`../../rest/histories/resources/${resId}/workflow?limit=3`).pipe( + this.http.get(`../../rest/history/resources/${resId}/workflow?limit=3`).pipe( tap((data: any) => { this.histories = data.history; }), @@ -55,4 +55,4 @@ export class HistoryWorkflowResumeComponent implements OnInit { showMore() { this.goTo.emit(); } -} \ No newline at end of file +} diff --git a/src/frontend/app/indexation/indexing-form/indexing-form.component.ts b/src/frontend/app/indexation/indexing-form/indexing-form.component.ts index fb437b789827dabf44f5c62b1d77ff833ba6e61e..b605a59c510985ef4e9d4102d3d6541bb9a04393 100644 --- a/src/frontend/app/indexation/indexing-form/indexing-form.component.ts +++ b/src/frontend/app/indexation/indexing-form/indexing-form.component.ts @@ -435,7 +435,9 @@ export class IndexingFormComponent implements OnInit { elem.endDate = '_TODAY'; this.fieldCategories.forEach(element => { - if (this['indexingModels_' + element].filter((field: any) => field.identifier === 'departureDate').length > 0) { + if (this['indexingModels_' + element].filter((field: any) => field.identifier === 'arrivalDate').length > 0) { + elem.endDate = 'arrivalDate'; + } else if (this['indexingModels_' + element].filter((field: any) => field.identifier === 'departureDate').length > 0) { elem.endDate = 'departureDate'; } }); diff --git a/src/frontend/app/list/filters/filters-tool.component.html b/src/frontend/app/list/filters/filters-tool.component.html index abbb8d9dbd8c1f73124b0ef4ca02859181baadcf..fd394835f3676e524abd3eb894773c43bd54ec1d 100644 --- a/src/frontend/app/list/filters/filters-tool.component.html +++ b/src/frontend/app/list/filters/filters-tool.component.html @@ -98,4 +98,8 @@ *ngFor="let doctype of this.listProperties.doctypes; let i=index" (click)="removeFilter('doctypes', i)">{{doctype.label}} <i class="fa fa-times-circle"></i></span> -</div> \ No newline at end of file + <span class="label badge-folders" title="{{lang.folders}}" + *ngFor="let folder of this.listProperties.folders; let i=index" + (click)="removeFilter('folders', i)">{{folder.label}} + <i class="fa fa-times-circle"></i></span> +</div> diff --git a/src/frontend/app/list/filters/filters-tool.component.scss b/src/frontend/app/list/filters/filters-tool.component.scss index 7c7aa866df0cab4846a58ef4951c0ecc18f70bd2..e787d4e129d251a0e737533bd15af6328d8c52a3 100644 --- a/src/frontend/app/list/filters/filters-tool.component.scss +++ b/src/frontend/app/list/filters/filters-tool.component.scss @@ -172,6 +172,12 @@ cursor: pointer; } +.filterBadges>.badge-folders { + margin: 5px; + background: #a3d627; + cursor: pointer; +} + ::ng-deep.autoCompletePanelFilter { left: 25px; min-width: 400px !important; @@ -182,4 +188,4 @@ color: #F99830; font-size: 14px; font-weight: 500; -} \ No newline at end of file +} diff --git a/src/frontend/app/list/filters/filters-tool.component.ts b/src/frontend/app/list/filters/filters-tool.component.ts index 8aa7905da1df98a189fa75c36c11168bdac4d4a2..25741890e913b6cd994b49c233e121dcf6988805 100644 --- a/src/frontend/app/list/filters/filters-tool.component.ts +++ b/src/frontend/app/list/filters/filters-tool.component.ts @@ -200,6 +200,10 @@ export class FiltersToolComponent implements OnInit { letter: this.lang.doctypes, names: [] }, + { + letter: this.lang.folders, + names: [] + }, ]; this.http.get('../..' + this.routeDatas + '?init' + this.filtersListService.getUrlFilters()) @@ -281,6 +285,19 @@ export class FiltersToolComponent implements OnInit { ) } }); + + data.folders.forEach((element: any) => { + if (this.listProperties.folders.map((doctype: any) => (doctype.id)).indexOf(element.id) === -1) { + this.stateGroups[6].names.push( + { + id: 'folders', + value: element.id, + label: (element.id !== null ? element.label : this.lang.undefined), + count: element.count + } + ) + } + }); this.isLoading = false; if (this.metaSearchInput.length > 0) { setTimeout(() => { diff --git a/src/frontend/app/profile.component.ts b/src/frontend/app/profile.component.ts index 3de50d5b0a0b74821c5ccbc55bc862ab33ee62a5..dde85ab969b069b916ebc4e35cf58ab677b2c78e 100755 --- a/src/frontend/app/profile.component.ts +++ b/src/frontend/app/profile.component.ts @@ -201,7 +201,7 @@ export class ProfileComponent implements OnInit { this.sidenavRight.open(); } //if (this.histories.length == 0) { - this.http.get('../../rest/histories/users/' + this.user.id) + this.http.get('../../rest/history/users/' + this.user.id) .subscribe((data: any) => { this.histories = data.histories; setTimeout(() => { diff --git a/src/frontend/app/visa/visa-workflow.component.html b/src/frontend/app/visa/visa-workflow.component.html index a73098da0d319a8d75cab54bb5bcd1373a3a1af5..effba69fdb328760992900d93c25cd4575c5a7d7 100644 --- a/src/frontend/app/visa/visa-workflow.component.html +++ b/src/frontend/app/visa/visa-workflow.component.html @@ -32,7 +32,7 @@ <mat-optgroup [label]="lang.visaUser + ' / ' + lang.signUser" *ngIf="(filteredSignVisaUsers | async)?.length > 0" class="visaSignList"> <mat-option *ngFor="let user of filteredSignVisaUsers | async | sortBy : 'label'" [value]="user"> - {{user.label}} <small>({{user.entity}})</small> + {{user.label}} <small>({{user.entity}})</small> </mat-option> </mat-optgroup> </mat-autocomplete> @@ -65,7 +65,7 @@ </mat-icon> <ng-container *ngIf="!adminMode || diffusion.process_date != null"> <mat-icon mat-list-icon class="fa-2x fa" - [title]="diffusion.process_comment" + [title]="diffusion.process_comment !== null ? diffusion.process_comment : ''" [class.fa-hourglass]="diffusion.process_date == null" [class.fa-thumbs-up]="diffusion.process_date != null && [lang.visaWorkflowInterrupted, lang.hasInterruptedWorkflow].indexOf(diffusion.process_comment) === -1" [class.fa-hand-paper]="diffusion.process_date != null && diffusion.process_comment === lang.hasInterruptedWorkflow" diff --git a/src/frontend/css/maarch-material.css b/src/frontend/css/maarch-material.css index dc876fd4bd081741c1a54f175bf299c8003bdd59..17ce42e60a2fd08361ca94080de8eef2c1f2eaf5 100755 --- a/src/frontend/css/maarch-material.css +++ b/src/frontend/css/maarch-material.css @@ -1 +1 @@ -.mat-badge-content{font-weight:600;font-size:12px;font-family:Roboto, "Helvetica Neue", sans-serif}.mat-badge-small .mat-badge-content{font-size:9px}.mat-badge-large .mat-badge-content{font-size:24px}.mat-h1,.mat-headline,.mat-typography h1{font:400 24px/32px Roboto, "Helvetica Neue", sans-serif;margin:0 0 16px}.mat-h2,.mat-title,.mat-typography h2{font:500 20px/32px Roboto, "Helvetica Neue", sans-serif;margin:0 0 16px}.mat-h3,.mat-subheading-2,.mat-typography h3{font:400 16px/28px Roboto, "Helvetica Neue", sans-serif;margin:0 0 16px}.mat-h4,.mat-subheading-1,.mat-typography h4{font:400 15px/24px Roboto, "Helvetica Neue", sans-serif;margin:0 0 16px}.mat-h5,.mat-typography h5{font:400 calc(14px * 0.83)/20px Roboto, "Helvetica Neue", sans-serif;margin:0 0 12px}.mat-h6,.mat-typography h6{font:400 calc(14px * 0.67)/20px Roboto, "Helvetica Neue", sans-serif;margin:0 0 12px}.mat-body-strong,.mat-body-2{font:500 14px/24px Roboto, "Helvetica Neue", sans-serif}.mat-body,.mat-body-1,.mat-typography{font:400 14px/20px Roboto, "Helvetica Neue", sans-serif}.mat-body p,.mat-body-1 p,.mat-typography p{margin:0 0 12px}.mat-small,.mat-caption{font:400 12px/20px Roboto, "Helvetica Neue", sans-serif}.mat-display-4,.mat-typography .mat-display-4{font:300 112px/112px Roboto, "Helvetica Neue", sans-serif;letter-spacing:-.05em;margin:0 0 56px}.mat-display-3,.mat-typography .mat-display-3{font:400 56px/56px Roboto, "Helvetica Neue", sans-serif;letter-spacing:-.02em;margin:0 0 64px}.mat-display-2,.mat-typography .mat-display-2{font:400 45px/48px Roboto, "Helvetica Neue", sans-serif;letter-spacing:-.005em;margin:0 0 64px}.mat-display-1,.mat-typography .mat-display-1{font:400 34px/40px Roboto, "Helvetica Neue", sans-serif;margin:0 0 64px}.mat-bottom-sheet-container{font:400 14px/20px Roboto, "Helvetica Neue", sans-serif}.mat-button,.mat-raised-button,.mat-icon-button,.mat-stroked-button,.mat-flat-button,.mat-fab,.mat-mini-fab{font-family:Roboto, "Helvetica Neue", sans-serif;font-size:14px;font-weight:500}.mat-button-toggle{font-family:Roboto, "Helvetica Neue", sans-serif}.mat-card{font-family:Roboto, "Helvetica Neue", sans-serif}.mat-card-title{font-size:24px;font-weight:500}.mat-card-header .mat-card-title{font-size:20px}.mat-card-subtitle,.mat-card-content{font-size:14px}.mat-checkbox{font-family:Roboto, "Helvetica Neue", sans-serif}.mat-checkbox-layout .mat-checkbox-label{line-height:24px}.mat-chip{font-size:14px;font-weight:500}.mat-chip .mat-chip-trailing-icon.mat-icon,.mat-chip .mat-chip-remove.mat-icon{font-size:18px}.mat-table{font-family:Roboto, "Helvetica Neue", sans-serif}.mat-header-cell{font-size:12px;font-weight:500}.mat-cell,.mat-footer-cell{font-size:14px}.mat-calendar{font-family:Roboto, "Helvetica Neue", sans-serif}.mat-calendar-body{font-size:13px}.mat-calendar-body-label,.mat-calendar-period-button{font-size:14px;font-weight:500}.mat-calendar-table-header th{font-size:11px;font-weight:400}.mat-dialog-title{font:500 20px/32px Roboto, "Helvetica Neue", sans-serif}.mat-expansion-panel-header{font-family:Roboto, "Helvetica Neue", sans-serif;font-size:15px;font-weight:400}.mat-expansion-panel-content{font:400 14px/20px Roboto, "Helvetica Neue", sans-serif}.mat-form-field{font-size:inherit;font-weight:400;line-height:1.125;font-family:Roboto, "Helvetica Neue", sans-serif}.mat-form-field-wrapper{padding-bottom:1.34375em}.mat-form-field-prefix .mat-icon,.mat-form-field-suffix .mat-icon{font-size:150%;line-height:1.125}.mat-form-field-prefix .mat-icon-button,.mat-form-field-suffix .mat-icon-button{height:1.5em;width:1.5em}.mat-form-field-prefix .mat-icon-button .mat-icon,.mat-form-field-suffix .mat-icon-button .mat-icon{height:1.125em;line-height:1.125}.mat-form-field-infix{padding:.5em 0;border-top:.84375em solid transparent}.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label,.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.34375em) scale(.75);width:133.33333%}.mat-form-field-can-float .mat-input-server[label]:not(:label-shown)+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.34374em) scale(.75);width:133.33334%}.mat-form-field-label-wrapper{top:-.84375em;padding-top:.84375em}.mat-form-field-label{top:1.34375em}.mat-form-field-underline{bottom:1.34375em}.mat-form-field-subscript-wrapper{font-size:75%;margin-top:.66667em;top:calc(100% - 1.79167em)}.mat-form-field-appearance-legacy .mat-form-field-wrapper{padding-bottom:1.25em}.mat-form-field-appearance-legacy .mat-form-field-infix{padding:.4375em 0}.mat-form-field-appearance-legacy.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label,.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(0.001px);-ms-transform:translateY(-1.28125em) scale(.75);width:133.33333%}.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-form-field-autofill-control:-webkit-autofill+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(0.00101px);-ms-transform:translateY(-1.28124em) scale(.75);width:133.33334%}.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-input-server[label]:not(:label-shown)+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(0.00102px);-ms-transform:translateY(-1.28123em) scale(.75);width:133.33335%}.mat-form-field-appearance-legacy .mat-form-field-label{top:1.28125em}.mat-form-field-appearance-legacy .mat-form-field-underline{bottom:1.25em}.mat-form-field-appearance-legacy .mat-form-field-subscript-wrapper{margin-top:.54167em;top:calc(100% - 1.66667em)}@media print{.mat-form-field-appearance-legacy.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label,.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.28122em) scale(.75)}.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-form-field-autofill-control:-webkit-autofill+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.28121em) scale(.75)}.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-input-server[label]:not(:label-shown)+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.2812em) scale(.75)}}.mat-form-field-appearance-fill .mat-form-field-infix{padding:.25em 0 .75em 0}.mat-form-field-appearance-fill .mat-form-field-label{top:1.09375em;margin-top:-.5em}.mat-form-field-appearance-fill.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label,.mat-form-field-appearance-fill.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-.59375em) scale(.75);width:133.33333%}.mat-form-field-appearance-fill.mat-form-field-can-float .mat-input-server[label]:not(:label-shown)+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-.59374em) scale(.75);width:133.33334%}.mat-form-field-appearance-outline .mat-form-field-infix{padding:1em 0 1em 0}.mat-form-field-appearance-outline .mat-form-field-label{top:1.84375em;margin-top:-.25em}.mat-form-field-appearance-outline.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label,.mat-form-field-appearance-outline.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.59375em) scale(.75);width:133.33333%}.mat-form-field-appearance-outline.mat-form-field-can-float .mat-input-server[label]:not(:label-shown)+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.59374em) scale(.75);width:133.33334%}.mat-grid-tile-header,.mat-grid-tile-footer{font-size:14px}.mat-grid-tile-header .mat-line,.mat-grid-tile-footer .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}.mat-grid-tile-header .mat-line:nth-child(n+2),.mat-grid-tile-footer .mat-line:nth-child(n+2){font-size:12px}input.mat-input-element{margin-top:-.0625em}.mat-menu-item{font-family:Roboto, "Helvetica Neue", sans-serif;font-size:14px;font-weight:400}.mat-paginator,.mat-paginator-page-size .mat-select-trigger{font-family:Roboto, "Helvetica Neue", sans-serif;font-size:12px}.mat-radio-button{font-family:Roboto, "Helvetica Neue", sans-serif}.mat-select{font-family:Roboto, "Helvetica Neue", sans-serif}.mat-select-trigger{height:1.125em}.mat-slide-toggle-content{font-family:Roboto, "Helvetica Neue", sans-serif}.mat-slider-thumb-label-text{font-family:Roboto, "Helvetica Neue", sans-serif;font-size:12px;font-weight:500}.mat-stepper-vertical,.mat-stepper-horizontal{font-family:Roboto, "Helvetica Neue", sans-serif}.mat-step-label{font-size:14px;font-weight:400}.mat-step-sub-label-error{font-weight:normal}.mat-step-label-error{font-size:14px}.mat-step-label-selected{font-size:14px;font-weight:500}.mat-tab-group{font-family:Roboto, "Helvetica Neue", sans-serif}.mat-tab-label,.mat-tab-link{font-family:Roboto, "Helvetica Neue", sans-serif;font-size:14px;font-weight:500}.mat-toolbar,.mat-toolbar h1,.mat-toolbar h2,.mat-toolbar h3,.mat-toolbar h4,.mat-toolbar h5,.mat-toolbar h6{font:500 20px/32px Roboto, "Helvetica Neue", sans-serif;margin:0}.mat-tooltip{font-family:Roboto, "Helvetica Neue", sans-serif;font-size:10px;padding-top:6px;padding-bottom:6px}.mat-tooltip-handset{font-size:14px;padding-top:8px;padding-bottom:8px}.mat-list-item{font-family:Roboto, "Helvetica Neue", sans-serif}.mat-list-option{font-family:Roboto, "Helvetica Neue", sans-serif}.mat-list-base .mat-list-item{font-size:16px}.mat-list-base .mat-list-item .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}.mat-list-base .mat-list-item .mat-line:nth-child(n+2){font-size:14px}.mat-list-base .mat-list-option{font-size:16px}.mat-list-base .mat-list-option .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}.mat-list-base .mat-list-option .mat-line:nth-child(n+2){font-size:14px}.mat-list-base .mat-subheader{font-family:Roboto, "Helvetica Neue", sans-serif;font-size:14px;font-weight:500}.mat-list-base[dense] .mat-list-item{font-size:12px}.mat-list-base[dense] .mat-list-item .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}.mat-list-base[dense] .mat-list-item .mat-line:nth-child(n+2){font-size:12px}.mat-list-base[dense] .mat-list-option{font-size:12px}.mat-list-base[dense] .mat-list-option .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}.mat-list-base[dense] .mat-list-option .mat-line:nth-child(n+2){font-size:12px}.mat-list-base[dense] .mat-subheader{font-family:Roboto, "Helvetica Neue", sans-serif;font-size:12px;font-weight:500}.mat-option{font-family:Roboto, "Helvetica Neue", sans-serif;font-size:16px}.mat-optgroup-label{font:500 14px/24px Roboto, "Helvetica Neue", sans-serif}.mat-simple-snackbar{font-family:Roboto, "Helvetica Neue", sans-serif;font-size:14px}.mat-simple-snackbar-action{line-height:1;font-family:inherit;font-size:inherit;font-weight:500}.mat-tree{font-family:Roboto, "Helvetica Neue", sans-serif}.mat-tree-node,.mat-nested-tree-node{font-weight:400;font-size:14px}.mat-ripple{overflow:hidden;position:relative}.mat-ripple.mat-ripple-unbounded{overflow:visible}.mat-ripple-element{position:absolute;border-radius:50%;pointer-events:none;transition:opacity,transform 0ms cubic-bezier(0, 0, 0.2, 1);transform:scale(0)}@media (-ms-high-contrast: active){.mat-ripple-element{display:none}}.cdk-visually-hidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;outline:0;-webkit-appearance:none;-moz-appearance:none}.cdk-overlay-container,.cdk-global-overlay-wrapper{pointer-events:none;top:0;left:0;height:100%;width:100%}.cdk-overlay-container{position:fixed;z-index:1000}.cdk-overlay-container:empty{display:none}.cdk-global-overlay-wrapper{display:flex;position:absolute;z-index:1000}.cdk-overlay-pane{position:absolute;pointer-events:auto;box-sizing:border-box;z-index:1000;display:flex;max-width:100%;max-height:100%}.cdk-overlay-backdrop{position:absolute;top:0;bottom:0;left:0;right:0;z-index:1000;pointer-events:auto;-webkit-tap-highlight-color:transparent;transition:opacity 400ms cubic-bezier(0.25, 0.8, 0.25, 1);opacity:0}.cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:1}@media screen and (-ms-high-contrast: active){.cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:0.6}}.cdk-overlay-dark-backdrop{background:rgba(0,0,0,0.32)}.cdk-overlay-transparent-backdrop,.cdk-overlay-transparent-backdrop.cdk-overlay-backdrop-showing{opacity:0}.cdk-overlay-connected-position-bounding-box{position:absolute;z-index:1000;display:flex;flex-direction:column;min-width:1px;min-height:1px}.cdk-global-scrollblock{position:fixed;width:100%;overflow-y:scroll}@keyframes cdk-text-field-autofill-start{/*!*/}@keyframes cdk-text-field-autofill-end{/*!*/}.cdk-text-field-autofill-monitored:-webkit-autofill{animation-name:cdk-text-field-autofill-start}.cdk-text-field-autofill-monitored:not(:-webkit-autofill){animation-name:cdk-text-field-autofill-end}textarea.cdk-textarea-autosize{resize:none}textarea.cdk-textarea-autosize-measuring{height:auto !important;overflow:hidden !important;padding:2px 0 !important;box-sizing:content-box !important}.mat-ripple-element{background-color:rgba(0,0,0,0.1)}.mat-option{color:rgba(0,0,0,0.87)}.mat-option:hover:not(.mat-option-disabled),.mat-option:focus:not(.mat-option-disabled){background:rgba(0,0,0,0.04)}.mat-option.mat-selected:not(.mat-option-multiple):not(.mat-option-disabled){background:rgba(0,0,0,0.04)}.mat-option.mat-active{background:rgba(0,0,0,0.04);color:rgba(0,0,0,0.87)}.mat-option.mat-option-disabled{color:rgba(0,0,0,0.38)}.mat-primary .mat-option.mat-selected:not(.mat-option-disabled){color:#135f7f}.mat-accent .mat-option.mat-selected:not(.mat-option-disabled){color:#006841}.mat-warn .mat-option.mat-selected:not(.mat-option-disabled){color:#8e3e52}.mat-optgroup-label{color:rgba(0,0,0,0.54)}.mat-optgroup-disabled .mat-optgroup-label{color:rgba(0,0,0,0.38)}.mat-pseudo-checkbox{color:rgba(0,0,0,0.54)}.mat-pseudo-checkbox::after{color:#fafafa}.mat-pseudo-checkbox-disabled{color:#b0b0b0}.mat-pseudo-checkbox-checked,.mat-pseudo-checkbox-indeterminate,.mat-accent .mat-pseudo-checkbox-checked,.mat-accent .mat-pseudo-checkbox-indeterminate{background:#006841}.mat-primary .mat-pseudo-checkbox-checked,.mat-primary .mat-pseudo-checkbox-indeterminate{background:#135f7f}.mat-warn .mat-pseudo-checkbox-checked,.mat-warn .mat-pseudo-checkbox-indeterminate{background:#8e3e52}.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled,.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled{background:#b0b0b0}.mat-elevation-z0{box-shadow:0px 0px 0px 0px rgba(0,0,0,0.2),0px 0px 0px 0px rgba(0,0,0,0.14),0px 0px 0px 0px rgba(0,0,0,0.12)}.mat-elevation-z1{box-shadow:0px 2px 1px -1px rgba(0,0,0,0.2),0px 1px 1px 0px rgba(0,0,0,0.14),0px 1px 3px 0px rgba(0,0,0,0.12)}.mat-elevation-z2{box-shadow:0px 3px 1px -2px rgba(0,0,0,0.2),0px 2px 2px 0px rgba(0,0,0,0.14),0px 1px 5px 0px rgba(0,0,0,0.12)}.mat-elevation-z3{box-shadow:0px 3px 3px -2px rgba(0,0,0,0.2),0px 3px 4px 0px rgba(0,0,0,0.14),0px 1px 8px 0px rgba(0,0,0,0.12)}.mat-elevation-z4{box-shadow:0px 2px 4px -1px rgba(0,0,0,0.2),0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12)}.mat-elevation-z5{box-shadow:0px 3px 5px -1px rgba(0,0,0,0.2),0px 5px 8px 0px rgba(0,0,0,0.14),0px 1px 14px 0px rgba(0,0,0,0.12)}.mat-elevation-z6{box-shadow:0px 3px 5px -1px rgba(0,0,0,0.2),0px 6px 10px 0px rgba(0,0,0,0.14),0px 1px 18px 0px rgba(0,0,0,0.12)}.mat-elevation-z7{box-shadow:0px 4px 5px -2px rgba(0,0,0,0.2),0px 7px 10px 1px rgba(0,0,0,0.14),0px 2px 16px 1px rgba(0,0,0,0.12)}.mat-elevation-z8{box-shadow:0px 5px 5px -3px rgba(0,0,0,0.2),0px 8px 10px 1px rgba(0,0,0,0.14),0px 3px 14px 2px rgba(0,0,0,0.12)}.mat-elevation-z9{box-shadow:0px 5px 6px -3px rgba(0,0,0,0.2),0px 9px 12px 1px rgba(0,0,0,0.14),0px 3px 16px 2px rgba(0,0,0,0.12)}.mat-elevation-z10{box-shadow:0px 6px 6px -3px rgba(0,0,0,0.2),0px 10px 14px 1px rgba(0,0,0,0.14),0px 4px 18px 3px rgba(0,0,0,0.12)}.mat-elevation-z11{box-shadow:0px 6px 7px -4px rgba(0,0,0,0.2),0px 11px 15px 1px rgba(0,0,0,0.14),0px 4px 20px 3px rgba(0,0,0,0.12)}.mat-elevation-z12{box-shadow:0px 7px 8px -4px rgba(0,0,0,0.2),0px 12px 17px 2px rgba(0,0,0,0.14),0px 5px 22px 4px rgba(0,0,0,0.12)}.mat-elevation-z13{box-shadow:0px 7px 8px -4px rgba(0,0,0,0.2),0px 13px 19px 2px rgba(0,0,0,0.14),0px 5px 24px 4px rgba(0,0,0,0.12)}.mat-elevation-z14{box-shadow:0px 7px 9px -4px rgba(0,0,0,0.2),0px 14px 21px 2px rgba(0,0,0,0.14),0px 5px 26px 4px rgba(0,0,0,0.12)}.mat-elevation-z15{box-shadow:0px 8px 9px -5px rgba(0,0,0,0.2),0px 15px 22px 2px rgba(0,0,0,0.14),0px 6px 28px 5px rgba(0,0,0,0.12)}.mat-elevation-z16{box-shadow:0px 8px 10px -5px rgba(0,0,0,0.2),0px 16px 24px 2px rgba(0,0,0,0.14),0px 6px 30px 5px rgba(0,0,0,0.12)}.mat-elevation-z17{box-shadow:0px 8px 11px -5px rgba(0,0,0,0.2),0px 17px 26px 2px rgba(0,0,0,0.14),0px 6px 32px 5px rgba(0,0,0,0.12)}.mat-elevation-z18{box-shadow:0px 9px 11px -5px rgba(0,0,0,0.2),0px 18px 28px 2px rgba(0,0,0,0.14),0px 7px 34px 6px rgba(0,0,0,0.12)}.mat-elevation-z19{box-shadow:0px 9px 12px -6px rgba(0,0,0,0.2),0px 19px 29px 2px rgba(0,0,0,0.14),0px 7px 36px 6px rgba(0,0,0,0.12)}.mat-elevation-z20{box-shadow:0px 10px 13px -6px rgba(0,0,0,0.2),0px 20px 31px 3px rgba(0,0,0,0.14),0px 8px 38px 7px rgba(0,0,0,0.12)}.mat-elevation-z21{box-shadow:0px 10px 13px -6px rgba(0,0,0,0.2),0px 21px 33px 3px rgba(0,0,0,0.14),0px 8px 40px 7px rgba(0,0,0,0.12)}.mat-elevation-z22{box-shadow:0px 10px 14px -6px rgba(0,0,0,0.2),0px 22px 35px 3px rgba(0,0,0,0.14),0px 8px 42px 7px rgba(0,0,0,0.12)}.mat-elevation-z23{box-shadow:0px 11px 14px -7px rgba(0,0,0,0.2),0px 23px 36px 3px rgba(0,0,0,0.14),0px 9px 44px 8px rgba(0,0,0,0.12)}.mat-elevation-z24{box-shadow:0px 11px 15px -7px rgba(0,0,0,0.2),0px 24px 38px 3px rgba(0,0,0,0.14),0px 9px 46px 8px rgba(0,0,0,0.12)}.mat-app-background{background-color:#fafafa;color:rgba(0,0,0,0.87)}.mat-theme-loaded-marker{display:none}.mat-autocomplete-panel{background:#fff;color:rgba(0,0,0,0.87)}.mat-autocomplete-panel:not([class*='mat-elevation-z']){box-shadow:0px 2px 4px -1px rgba(0,0,0,0.2),0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12)}.mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover){background:#fff}.mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover):not(.mat-option-disabled){color:rgba(0,0,0,0.87)}.mat-badge-content{color:#fff;background:#135f7f}@media (-ms-high-contrast: active){.mat-badge-content{outline:solid 1px;border-radius:0}}.mat-badge-accent .mat-badge-content{background:#006841;color:#fff}.mat-badge-warn .mat-badge-content{color:#fff;background:#8e3e52}.mat-badge{position:relative}.mat-badge-hidden .mat-badge-content{display:none}.mat-badge-disabled .mat-badge-content{background:#b9b9b9;color:rgba(0,0,0,0.38)}.mat-badge-content{position:absolute;text-align:center;display:inline-block;border-radius:50%;transition:transform 200ms ease-in-out;transform:scale(0.6);overflow:hidden;white-space:nowrap;text-overflow:ellipsis;pointer-events:none}.ng-animate-disabled .mat-badge-content,.mat-badge-content._mat-animation-noopable{transition:none}.mat-badge-content.mat-badge-active{transform:none}.mat-badge-small .mat-badge-content{width:16px;height:16px;line-height:16px}.mat-badge-small.mat-badge-above .mat-badge-content{top:-8px}.mat-badge-small.mat-badge-below .mat-badge-content{bottom:-8px}.mat-badge-small.mat-badge-before .mat-badge-content{left:-16px}[dir='rtl'] .mat-badge-small.mat-badge-before .mat-badge-content{left:auto;right:-16px}.mat-badge-small.mat-badge-after .mat-badge-content{right:-16px}[dir='rtl'] .mat-badge-small.mat-badge-after .mat-badge-content{right:auto;left:-16px}.mat-badge-small.mat-badge-overlap.mat-badge-before .mat-badge-content{left:-8px}[dir='rtl'] .mat-badge-small.mat-badge-overlap.mat-badge-before .mat-badge-content{left:auto;right:-8px}.mat-badge-small.mat-badge-overlap.mat-badge-after .mat-badge-content{right:-8px}[dir='rtl'] .mat-badge-small.mat-badge-overlap.mat-badge-after .mat-badge-content{right:auto;left:-8px}.mat-badge-medium .mat-badge-content{width:22px;height:22px;line-height:22px}.mat-badge-medium.mat-badge-above .mat-badge-content{top:-11px}.mat-badge-medium.mat-badge-below .mat-badge-content{bottom:-11px}.mat-badge-medium.mat-badge-before .mat-badge-content{left:-22px}[dir='rtl'] .mat-badge-medium.mat-badge-before .mat-badge-content{left:auto;right:-22px}.mat-badge-medium.mat-badge-after .mat-badge-content{right:-22px}[dir='rtl'] .mat-badge-medium.mat-badge-after .mat-badge-content{right:auto;left:-22px}.mat-badge-medium.mat-badge-overlap.mat-badge-before .mat-badge-content{left:-11px}[dir='rtl'] .mat-badge-medium.mat-badge-overlap.mat-badge-before .mat-badge-content{left:auto;right:-11px}.mat-badge-medium.mat-badge-overlap.mat-badge-after .mat-badge-content{right:-11px}[dir='rtl'] .mat-badge-medium.mat-badge-overlap.mat-badge-after .mat-badge-content{right:auto;left:-11px}.mat-badge-large .mat-badge-content{width:28px;height:28px;line-height:28px}.mat-badge-large.mat-badge-above .mat-badge-content{top:-14px}.mat-badge-large.mat-badge-below .mat-badge-content{bottom:-14px}.mat-badge-large.mat-badge-before .mat-badge-content{left:-28px}[dir='rtl'] .mat-badge-large.mat-badge-before .mat-badge-content{left:auto;right:-28px}.mat-badge-large.mat-badge-after .mat-badge-content{right:-28px}[dir='rtl'] .mat-badge-large.mat-badge-after .mat-badge-content{right:auto;left:-28px}.mat-badge-large.mat-badge-overlap.mat-badge-before .mat-badge-content{left:-14px}[dir='rtl'] .mat-badge-large.mat-badge-overlap.mat-badge-before .mat-badge-content{left:auto;right:-14px}.mat-badge-large.mat-badge-overlap.mat-badge-after .mat-badge-content{right:-14px}[dir='rtl'] .mat-badge-large.mat-badge-overlap.mat-badge-after .mat-badge-content{right:auto;left:-14px}.mat-bottom-sheet-container{box-shadow:0px 8px 10px -5px rgba(0,0,0,0.2),0px 16px 24px 2px rgba(0,0,0,0.14),0px 6px 30px 5px rgba(0,0,0,0.12);background:#fff;color:rgba(0,0,0,0.87)}.mat-button,.mat-icon-button,.mat-stroked-button{color:inherit;background:transparent}.mat-button.mat-primary,.mat-icon-button.mat-primary,.mat-stroked-button.mat-primary{color:#135f7f}.mat-button.mat-accent,.mat-icon-button.mat-accent,.mat-stroked-button.mat-accent{color:#006841}.mat-button.mat-warn,.mat-icon-button.mat-warn,.mat-stroked-button.mat-warn{color:#8e3e52}.mat-button.mat-primary[disabled],.mat-button.mat-accent[disabled],.mat-button.mat-warn[disabled],.mat-button[disabled][disabled],.mat-icon-button.mat-primary[disabled],.mat-icon-button.mat-accent[disabled],.mat-icon-button.mat-warn[disabled],.mat-icon-button[disabled][disabled],.mat-stroked-button.mat-primary[disabled],.mat-stroked-button.mat-accent[disabled],.mat-stroked-button.mat-warn[disabled],.mat-stroked-button[disabled][disabled]{color:rgba(0,0,0,0.26)}.mat-button.mat-primary .mat-button-focus-overlay,.mat-icon-button.mat-primary .mat-button-focus-overlay,.mat-stroked-button.mat-primary .mat-button-focus-overlay{background-color:#135f7f}.mat-button.mat-accent .mat-button-focus-overlay,.mat-icon-button.mat-accent .mat-button-focus-overlay,.mat-stroked-button.mat-accent .mat-button-focus-overlay{background-color:#006841}.mat-button.mat-warn .mat-button-focus-overlay,.mat-icon-button.mat-warn .mat-button-focus-overlay,.mat-stroked-button.mat-warn .mat-button-focus-overlay{background-color:#8e3e52}.mat-button[disabled] .mat-button-focus-overlay,.mat-icon-button[disabled] .mat-button-focus-overlay,.mat-stroked-button[disabled] .mat-button-focus-overlay{background-color:transparent}.mat-button .mat-ripple-element,.mat-icon-button .mat-ripple-element,.mat-stroked-button .mat-ripple-element{opacity:.1;background-color:currentColor}.mat-button-focus-overlay{background:#000}.mat-stroked-button:not([disabled]){border-color:rgba(0,0,0,0.12)}.mat-flat-button,.mat-raised-button,.mat-fab,.mat-mini-fab{color:rgba(0,0,0,0.87);background-color:#fff}.mat-flat-button.mat-primary,.mat-raised-button.mat-primary,.mat-fab.mat-primary,.mat-mini-fab.mat-primary{color:#fff}.mat-flat-button.mat-accent,.mat-raised-button.mat-accent,.mat-fab.mat-accent,.mat-mini-fab.mat-accent{color:#fff}.mat-flat-button.mat-warn,.mat-raised-button.mat-warn,.mat-fab.mat-warn,.mat-mini-fab.mat-warn{color:#fff}.mat-flat-button.mat-primary[disabled],.mat-flat-button.mat-accent[disabled],.mat-flat-button.mat-warn[disabled],.mat-flat-button[disabled][disabled],.mat-raised-button.mat-primary[disabled],.mat-raised-button.mat-accent[disabled],.mat-raised-button.mat-warn[disabled],.mat-raised-button[disabled][disabled],.mat-fab.mat-primary[disabled],.mat-fab.mat-accent[disabled],.mat-fab.mat-warn[disabled],.mat-fab[disabled][disabled],.mat-mini-fab.mat-primary[disabled],.mat-mini-fab.mat-accent[disabled],.mat-mini-fab.mat-warn[disabled],.mat-mini-fab[disabled][disabled]{color:rgba(0,0,0,0.26)}.mat-flat-button.mat-primary,.mat-raised-button.mat-primary,.mat-fab.mat-primary,.mat-mini-fab.mat-primary{background-color:#135f7f}.mat-flat-button.mat-accent,.mat-raised-button.mat-accent,.mat-fab.mat-accent,.mat-mini-fab.mat-accent{background-color:#006841}.mat-flat-button.mat-warn,.mat-raised-button.mat-warn,.mat-fab.mat-warn,.mat-mini-fab.mat-warn{background-color:#8e3e52}.mat-flat-button.mat-primary[disabled],.mat-flat-button.mat-accent[disabled],.mat-flat-button.mat-warn[disabled],.mat-flat-button[disabled][disabled],.mat-raised-button.mat-primary[disabled],.mat-raised-button.mat-accent[disabled],.mat-raised-button.mat-warn[disabled],.mat-raised-button[disabled][disabled],.mat-fab.mat-primary[disabled],.mat-fab.mat-accent[disabled],.mat-fab.mat-warn[disabled],.mat-fab[disabled][disabled],.mat-mini-fab.mat-primary[disabled],.mat-mini-fab.mat-accent[disabled],.mat-mini-fab.mat-warn[disabled],.mat-mini-fab[disabled][disabled]{background-color:rgba(0,0,0,0.12)}.mat-flat-button.mat-primary .mat-ripple-element,.mat-raised-button.mat-primary .mat-ripple-element,.mat-fab.mat-primary .mat-ripple-element,.mat-mini-fab.mat-primary .mat-ripple-element{background-color:rgba(255,255,255,0.1)}.mat-flat-button.mat-accent .mat-ripple-element,.mat-raised-button.mat-accent .mat-ripple-element,.mat-fab.mat-accent .mat-ripple-element,.mat-mini-fab.mat-accent .mat-ripple-element{background-color:rgba(255,255,255,0.1)}.mat-flat-button.mat-warn .mat-ripple-element,.mat-raised-button.mat-warn .mat-ripple-element,.mat-fab.mat-warn .mat-ripple-element,.mat-mini-fab.mat-warn .mat-ripple-element{background-color:rgba(255,255,255,0.1)}.mat-stroked-button:not([class*='mat-elevation-z']),.mat-flat-button:not([class*='mat-elevation-z']){box-shadow:0px 0px 0px 0px rgba(0,0,0,0.2),0px 0px 0px 0px rgba(0,0,0,0.14),0px 0px 0px 0px rgba(0,0,0,0.12)}.mat-raised-button:not([class*='mat-elevation-z']){box-shadow:0px 3px 1px -2px rgba(0,0,0,0.2),0px 2px 2px 0px rgba(0,0,0,0.14),0px 1px 5px 0px rgba(0,0,0,0.12)}.mat-raised-button:not([disabled]):active:not([class*='mat-elevation-z']){box-shadow:0px 5px 5px -3px rgba(0,0,0,0.2),0px 8px 10px 1px rgba(0,0,0,0.14),0px 3px 14px 2px rgba(0,0,0,0.12)}.mat-raised-button[disabled]:not([class*='mat-elevation-z']){box-shadow:0px 0px 0px 0px rgba(0,0,0,0.2),0px 0px 0px 0px rgba(0,0,0,0.14),0px 0px 0px 0px rgba(0,0,0,0.12)}.mat-fab:not([class*='mat-elevation-z']),.mat-mini-fab:not([class*='mat-elevation-z']){box-shadow:0px 3px 5px -1px rgba(0,0,0,0.2),0px 6px 10px 0px rgba(0,0,0,0.14),0px 1px 18px 0px rgba(0,0,0,0.12)}.mat-fab:not([disabled]):active:not([class*='mat-elevation-z']),.mat-mini-fab:not([disabled]):active:not([class*='mat-elevation-z']){box-shadow:0px 7px 8px -4px rgba(0,0,0,0.2),0px 12px 17px 2px rgba(0,0,0,0.14),0px 5px 22px 4px rgba(0,0,0,0.12)}.mat-fab[disabled]:not([class*='mat-elevation-z']),.mat-mini-fab[disabled]:not([class*='mat-elevation-z']){box-shadow:0px 0px 0px 0px rgba(0,0,0,0.2),0px 0px 0px 0px rgba(0,0,0,0.14),0px 0px 0px 0px rgba(0,0,0,0.12)}.mat-button-toggle-standalone,.mat-button-toggle-group{box-shadow:0px 3px 1px -2px rgba(0,0,0,0.2),0px 2px 2px 0px rgba(0,0,0,0.14),0px 1px 5px 0px rgba(0,0,0,0.12)}.mat-button-toggle-standalone.mat-button-toggle-appearance-standard,.mat-button-toggle-group-appearance-standard{box-shadow:none}.mat-button-toggle{color:rgba(0,0,0,0.38)}.mat-button-toggle .mat-button-toggle-focus-overlay{background-color:rgba(0,0,0,0.12)}.mat-button-toggle-appearance-standard{color:rgba(0,0,0,0.87);background:#fff}.mat-button-toggle-appearance-standard .mat-button-toggle-focus-overlay{background-color:#000}.mat-button-toggle-group-appearance-standard .mat-button-toggle+.mat-button-toggle{border-left:solid 1px rgba(0,0,0,0.12)}[dir='rtl'] .mat-button-toggle-group-appearance-standard .mat-button-toggle+.mat-button-toggle{border-left:none;border-right:solid 1px rgba(0,0,0,0.12)}.mat-button-toggle-group-appearance-standard.mat-button-toggle-vertical .mat-button-toggle+.mat-button-toggle{border-left:none;border-right:none;border-top:solid 1px rgba(0,0,0,0.12)}.mat-button-toggle-checked{background-color:#e0e0e0;color:rgba(0,0,0,0.54)}.mat-button-toggle-checked.mat-button-toggle-appearance-standard{color:rgba(0,0,0,0.87)}.mat-button-toggle-disabled{color:rgba(0,0,0,0.26);background-color:#eee}.mat-button-toggle-disabled.mat-button-toggle-appearance-standard{background:#fff}.mat-button-toggle-disabled.mat-button-toggle-checked{background-color:#bdbdbd}.mat-button-toggle-standalone.mat-button-toggle-appearance-standard,.mat-button-toggle-group-appearance-standard{border:solid 1px rgba(0,0,0,0.12)}.mat-card{background:#fff;color:rgba(0,0,0,0.87)}.mat-card:not([class*='mat-elevation-z']){box-shadow:0px 2px 1px -1px rgba(0,0,0,0.2),0px 1px 1px 0px rgba(0,0,0,0.14),0px 1px 3px 0px rgba(0,0,0,0.12)}.mat-card.mat-card-flat:not([class*='mat-elevation-z']){box-shadow:0px 0px 0px 0px rgba(0,0,0,0.2),0px 0px 0px 0px rgba(0,0,0,0.14),0px 0px 0px 0px rgba(0,0,0,0.12)}.mat-card-subtitle{color:rgba(0,0,0,0.54)}.mat-checkbox-frame{border-color:rgba(0,0,0,0.54)}.mat-checkbox-checkmark{fill:#fafafa}.mat-checkbox-checkmark-path{stroke:#fafafa !important}@media (-ms-high-contrast: black-on-white){.mat-checkbox-checkmark-path{stroke:#000 !important}}.mat-checkbox-mixedmark{background-color:#fafafa}.mat-checkbox-indeterminate.mat-primary .mat-checkbox-background,.mat-checkbox-checked.mat-primary .mat-checkbox-background{background-color:#135f7f}.mat-checkbox-indeterminate.mat-accent .mat-checkbox-background,.mat-checkbox-checked.mat-accent .mat-checkbox-background{background-color:#006841}.mat-checkbox-indeterminate.mat-warn .mat-checkbox-background,.mat-checkbox-checked.mat-warn .mat-checkbox-background{background-color:#8e3e52}.mat-checkbox-disabled.mat-checkbox-checked .mat-checkbox-background,.mat-checkbox-disabled.mat-checkbox-indeterminate .mat-checkbox-background{background-color:#b0b0b0}.mat-checkbox-disabled:not(.mat-checkbox-checked) .mat-checkbox-frame{border-color:#b0b0b0}.mat-checkbox-disabled .mat-checkbox-label{color:rgba(0,0,0,0.54)}@media (-ms-high-contrast: active){.mat-checkbox-disabled{opacity:0.5}}@media (-ms-high-contrast: active){.mat-checkbox-background{background:none}}.mat-checkbox .mat-ripple-element{background-color:#000}.mat-checkbox-checked:not(.mat-checkbox-disabled).mat-primary .mat-ripple-element,.mat-checkbox:active:not(.mat-checkbox-disabled).mat-primary .mat-ripple-element{background:#135f7f}.mat-checkbox-checked:not(.mat-checkbox-disabled).mat-accent .mat-ripple-element,.mat-checkbox:active:not(.mat-checkbox-disabled).mat-accent .mat-ripple-element{background:#006841}.mat-checkbox-checked:not(.mat-checkbox-disabled).mat-warn .mat-ripple-element,.mat-checkbox:active:not(.mat-checkbox-disabled).mat-warn .mat-ripple-element{background:#8e3e52}.mat-chip.mat-standard-chip{background-color:#e0e0e0;color:rgba(0,0,0,0.87)}.mat-chip.mat-standard-chip .mat-chip-remove{color:rgba(0,0,0,0.87);opacity:0.4}.mat-chip.mat-standard-chip:not(.mat-chip-disabled):active{box-shadow:0px 3px 3px -2px rgba(0,0,0,0.2),0px 3px 4px 0px rgba(0,0,0,0.14),0px 1px 8px 0px rgba(0,0,0,0.12)}.mat-chip.mat-standard-chip:not(.mat-chip-disabled) .mat-chip-remove:hover{opacity:0.54}.mat-chip.mat-standard-chip.mat-chip-disabled{opacity:0.4}.mat-chip.mat-standard-chip::after{background:#000}.mat-chip.mat-standard-chip.mat-chip-selected.mat-primary{background-color:#135f7f;color:#fff}.mat-chip.mat-standard-chip.mat-chip-selected.mat-primary .mat-chip-remove{color:#fff;opacity:0.4}.mat-chip.mat-standard-chip.mat-chip-selected.mat-primary .mat-ripple-element{background:rgba(255,255,255,0.1)}.mat-chip.mat-standard-chip.mat-chip-selected.mat-warn{background-color:#8e3e52;color:#fff}.mat-chip.mat-standard-chip.mat-chip-selected.mat-warn .mat-chip-remove{color:#fff;opacity:0.4}.mat-chip.mat-standard-chip.mat-chip-selected.mat-warn .mat-ripple-element{background:rgba(255,255,255,0.1)}.mat-chip.mat-standard-chip.mat-chip-selected.mat-accent{background-color:#006841;color:#fff}.mat-chip.mat-standard-chip.mat-chip-selected.mat-accent .mat-chip-remove{color:#fff;opacity:0.4}.mat-chip.mat-standard-chip.mat-chip-selected.mat-accent .mat-ripple-element{background:rgba(255,255,255,0.1)}.mat-table{background:#fff}.mat-table thead,.mat-table tbody,.mat-table tfoot,mat-header-row,mat-row,mat-footer-row,[mat-header-row],[mat-row],[mat-footer-row],.mat-table-sticky{background:inherit}mat-row,mat-header-row,mat-footer-row,th.mat-header-cell,td.mat-cell,td.mat-footer-cell{border-bottom-color:rgba(0,0,0,0.12)}.mat-header-cell{color:rgba(0,0,0,0.54)}.mat-cell,.mat-footer-cell{color:rgba(0,0,0,0.87)}.mat-calendar-arrow{border-top-color:rgba(0,0,0,0.54)}.mat-datepicker-toggle,.mat-datepicker-content .mat-calendar-next-button,.mat-datepicker-content .mat-calendar-previous-button{color:rgba(0,0,0,0.54)}.mat-calendar-table-header{color:rgba(0,0,0,0.38)}.mat-calendar-table-header-divider::after{background:rgba(0,0,0,0.12)}.mat-calendar-body-label{color:rgba(0,0,0,0.54)}.mat-calendar-body-cell-content{color:rgba(0,0,0,0.87);border-color:transparent}.mat-calendar-body-disabled>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected){color:rgba(0,0,0,0.38)}.mat-calendar-body-cell:not(.mat-calendar-body-disabled):hover>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected),.cdk-keyboard-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected),.cdk-program-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected){background-color:rgba(0,0,0,0.04)}.mat-calendar-body-today:not(.mat-calendar-body-selected){border-color:rgba(0,0,0,0.38)}.mat-calendar-body-disabled>.mat-calendar-body-today:not(.mat-calendar-body-selected){border-color:rgba(0,0,0,0.18)}.mat-calendar-body-selected{background-color:#135f7f;color:#fff}.mat-calendar-body-disabled>.mat-calendar-body-selected{background-color:rgba(19,95,127,0.4)}.mat-calendar-body-today.mat-calendar-body-selected{box-shadow:inset 0 0 0 1px #fff}.mat-datepicker-content{box-shadow:0px 2px 4px -1px rgba(0,0,0,0.2),0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12);background-color:#fff;color:rgba(0,0,0,0.87)}.mat-datepicker-content.mat-accent .mat-calendar-body-selected{background-color:#006841;color:#fff}.mat-datepicker-content.mat-accent .mat-calendar-body-disabled>.mat-calendar-body-selected{background-color:rgba(0,104,65,0.4)}.mat-datepicker-content.mat-accent .mat-calendar-body-today.mat-calendar-body-selected{box-shadow:inset 0 0 0 1px #fff}.mat-datepicker-content.mat-warn .mat-calendar-body-selected{background-color:#8e3e52;color:#fff}.mat-datepicker-content.mat-warn .mat-calendar-body-disabled>.mat-calendar-body-selected{background-color:rgba(142,62,82,0.4)}.mat-datepicker-content.mat-warn .mat-calendar-body-today.mat-calendar-body-selected{box-shadow:inset 0 0 0 1px #fff}.mat-datepicker-content-touch{box-shadow:0px 0px 0px 0px rgba(0,0,0,0.2),0px 0px 0px 0px rgba(0,0,0,0.14),0px 0px 0px 0px rgba(0,0,0,0.12)}.mat-datepicker-toggle-active{color:#135f7f}.mat-datepicker-toggle-active.mat-accent{color:#006841}.mat-datepicker-toggle-active.mat-warn{color:#8e3e52}.mat-dialog-container{box-shadow:0px 11px 15px -7px rgba(0,0,0,0.2),0px 24px 38px 3px rgba(0,0,0,0.14),0px 9px 46px 8px rgba(0,0,0,0.12);background:#fff;color:rgba(0,0,0,0.87)}.mat-divider{border-top-color:rgba(0,0,0,0.12)}.mat-divider-vertical{border-right-color:rgba(0,0,0,0.12)}.mat-expansion-panel{background:#fff;color:rgba(0,0,0,0.87)}.mat-expansion-panel:not([class*='mat-elevation-z']){box-shadow:0px 3px 1px -2px rgba(0,0,0,0.2),0px 2px 2px 0px rgba(0,0,0,0.14),0px 1px 5px 0px rgba(0,0,0,0.12)}.mat-action-row{border-top-color:rgba(0,0,0,0.12)}.mat-expansion-panel .mat-expansion-panel-header.cdk-keyboard-focused:not([aria-disabled='true']),.mat-expansion-panel .mat-expansion-panel-header.cdk-program-focused:not([aria-disabled='true']),.mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:hover:not([aria-disabled='true']){background:rgba(0,0,0,0.04)}@media (hover: none){.mat-expansion-panel:not(.mat-expanded):not([aria-disabled='true']) .mat-expansion-panel-header:hover{background:#fff}}.mat-expansion-panel-header-title{color:rgba(0,0,0,0.87)}.mat-expansion-panel-header-description,.mat-expansion-indicator::after{color:rgba(0,0,0,0.54)}.mat-expansion-panel-header[aria-disabled='true']{color:rgba(0,0,0,0.26)}.mat-expansion-panel-header[aria-disabled='true'] .mat-expansion-panel-header-title,.mat-expansion-panel-header[aria-disabled='true'] .mat-expansion-panel-header-description{color:inherit}.mat-form-field-label{color:rgba(0,0,0,0.6)}.mat-hint{color:rgba(0,0,0,0.6)}.mat-form-field.mat-focused .mat-form-field-label{color:#135f7f}.mat-form-field.mat-focused .mat-form-field-label.mat-accent{color:#006841}.mat-form-field.mat-focused .mat-form-field-label.mat-warn{color:#8e3e52}.mat-focused .mat-form-field-required-marker{color:#006841}.mat-form-field-ripple{background-color:rgba(0,0,0,0.87)}.mat-form-field.mat-focused .mat-form-field-ripple{background-color:#135f7f}.mat-form-field.mat-focused .mat-form-field-ripple.mat-accent{background-color:#006841}.mat-form-field.mat-focused .mat-form-field-ripple.mat-warn{background-color:#8e3e52}.mat-form-field-type-mat-native-select.mat-focused:not(.mat-form-field-invalid) .mat-form-field-infix::after{color:#135f7f}.mat-form-field-type-mat-native-select.mat-focused:not(.mat-form-field-invalid).mat-accent .mat-form-field-infix::after{color:#006841}.mat-form-field-type-mat-native-select.mat-focused:not(.mat-form-field-invalid).mat-warn .mat-form-field-infix::after{color:#8e3e52}.mat-form-field.mat-form-field-invalid .mat-form-field-label{color:#8e3e52}.mat-form-field.mat-form-field-invalid .mat-form-field-label.mat-accent,.mat-form-field.mat-form-field-invalid .mat-form-field-label .mat-form-field-required-marker{color:#8e3e52}.mat-form-field.mat-form-field-invalid .mat-form-field-ripple,.mat-form-field.mat-form-field-invalid .mat-form-field-ripple.mat-accent{background-color:#8e3e52}.mat-error{color:#8e3e52}.mat-form-field-appearance-legacy .mat-form-field-label{color:rgba(0,0,0,0.54)}.mat-form-field-appearance-legacy .mat-hint{color:rgba(0,0,0,0.54)}.mat-form-field-appearance-legacy .mat-form-field-underline{background-color:rgba(0,0,0,0.42)}.mat-form-field-appearance-legacy.mat-form-field-disabled .mat-form-field-underline{background-image:linear-gradient(to right, rgba(0,0,0,0.42) 0%, rgba(0,0,0,0.42) 33%, transparent 0%);background-size:4px 100%;background-repeat:repeat-x}.mat-form-field-appearance-standard .mat-form-field-underline{background-color:rgba(0,0,0,0.42)}.mat-form-field-appearance-standard.mat-form-field-disabled .mat-form-field-underline{background-image:linear-gradient(to right, rgba(0,0,0,0.42) 0%, rgba(0,0,0,0.42) 33%, transparent 0%);background-size:4px 100%;background-repeat:repeat-x}.mat-form-field-appearance-fill .mat-form-field-flex{background-color:rgba(0,0,0,0.04)}.mat-form-field-appearance-fill.mat-form-field-disabled .mat-form-field-flex{background-color:rgba(0,0,0,0.02)}.mat-form-field-appearance-fill .mat-form-field-underline::before{background-color:rgba(0,0,0,0.42)}.mat-form-field-appearance-fill.mat-form-field-disabled .mat-form-field-label{color:rgba(0,0,0,0.38)}.mat-form-field-appearance-fill.mat-form-field-disabled .mat-form-field-underline::before{background-color:transparent}.mat-form-field-appearance-outline .mat-form-field-outline{color:rgba(0,0,0,0.12)}.mat-form-field-appearance-outline .mat-form-field-outline-thick{color:rgba(0,0,0,0.87)}.mat-form-field-appearance-outline.mat-focused .mat-form-field-outline-thick{color:#135f7f}.mat-form-field-appearance-outline.mat-focused.mat-accent .mat-form-field-outline-thick{color:#006841}.mat-form-field-appearance-outline.mat-focused.mat-warn .mat-form-field-outline-thick{color:#8e3e52}.mat-form-field-appearance-outline.mat-form-field-invalid.mat-form-field-invalid .mat-form-field-outline-thick{color:#8e3e52}.mat-form-field-appearance-outline.mat-form-field-disabled .mat-form-field-label{color:rgba(0,0,0,0.38)}.mat-form-field-appearance-outline.mat-form-field-disabled .mat-form-field-outline{color:rgba(0,0,0,0.06)}.mat-icon.mat-primary{color:#135f7f}.mat-icon.mat-accent{color:#006841}.mat-icon.mat-warn{color:#8e3e52}.mat-form-field-type-mat-native-select .mat-form-field-infix::after{color:rgba(0,0,0,0.54)}.mat-input-element:disabled,.mat-form-field-type-mat-native-select.mat-form-field-disabled .mat-form-field-infix::after{color:rgba(0,0,0,0.38)}.mat-input-element{caret-color:#135f7f}.mat-input-element::placeholder{color:rgba(0,0,0,0.42)}.mat-input-element::-moz-placeholder{color:rgba(0,0,0,0.42)}.mat-input-element::-webkit-input-placeholder{color:rgba(0,0,0,0.42)}.mat-input-element:-ms-input-placeholder{color:rgba(0,0,0,0.42)}.mat-accent .mat-input-element{caret-color:#006841}.mat-warn .mat-input-element,.mat-form-field-invalid .mat-input-element{caret-color:#8e3e52}.mat-form-field-type-mat-native-select.mat-form-field-invalid .mat-form-field-infix::after{color:#8e3e52}.mat-list-base .mat-list-item{color:rgba(0,0,0,0.87)}.mat-list-base .mat-list-option{color:rgba(0,0,0,0.87)}.mat-list-base .mat-subheader{color:rgba(0,0,0,0.54)}.mat-list-item-disabled{background-color:#eee}.mat-list-option:hover,.mat-list-option:focus,.mat-nav-list .mat-list-item:hover,.mat-nav-list .mat-list-item:focus,.mat-action-list .mat-list-item:hover,.mat-action-list .mat-list-item:focus{background:rgba(0,0,0,0.04)}.mat-menu-panel{background:#fff}.mat-menu-panel:not([class*='mat-elevation-z']){box-shadow:0px 2px 4px -1px rgba(0,0,0,0.2),0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12)}.mat-menu-item{background:transparent;color:rgba(0,0,0,0.87)}.mat-menu-item[disabled],.mat-menu-item[disabled]::after{color:rgba(0,0,0,0.38)}.mat-menu-item .mat-icon-no-color,.mat-menu-item-submenu-trigger::after{color:rgba(0,0,0,0.54)}.mat-menu-item:hover:not([disabled]),.mat-menu-item.cdk-program-focused:not([disabled]),.mat-menu-item.cdk-keyboard-focused:not([disabled]),.mat-menu-item-highlighted:not([disabled]){background:rgba(0,0,0,0.04)}.mat-paginator{background:#fff}.mat-paginator,.mat-paginator-page-size .mat-select-trigger{color:rgba(0,0,0,0.54)}.mat-paginator-decrement,.mat-paginator-increment{border-top:2px solid rgba(0,0,0,0.54);border-right:2px solid rgba(0,0,0,0.54)}.mat-paginator-first,.mat-paginator-last{border-top:2px solid rgba(0,0,0,0.54)}.mat-icon-button[disabled] .mat-paginator-decrement,.mat-icon-button[disabled] .mat-paginator-increment,.mat-icon-button[disabled] .mat-paginator-first,.mat-icon-button[disabled] .mat-paginator-last{border-color:rgba(0,0,0,0.38)}.mat-progress-bar-background{fill:#1a80ab}.mat-progress-bar-buffer{background-color:#1a80ab}.mat-progress-bar-fill::after{background-color:#135f7f}.mat-progress-bar.mat-accent .mat-progress-bar-background{fill:#009b61}.mat-progress-bar.mat-accent .mat-progress-bar-buffer{background-color:#009b61}.mat-progress-bar.mat-accent .mat-progress-bar-fill::after{background-color:#006841}.mat-progress-bar.mat-warn .mat-progress-bar-background{fill:#b24e67}.mat-progress-bar.mat-warn .mat-progress-bar-buffer{background-color:#b24e67}.mat-progress-bar.mat-warn .mat-progress-bar-fill::after{background-color:#8e3e52}.mat-progress-spinner circle,.mat-spinner circle{stroke:#135f7f}.mat-progress-spinner.mat-accent circle,.mat-spinner.mat-accent circle{stroke:#006841}.mat-progress-spinner.mat-warn circle,.mat-spinner.mat-warn circle{stroke:#8e3e52}.mat-radio-outer-circle{border-color:rgba(0,0,0,0.54)}.mat-radio-button.mat-primary.mat-radio-checked .mat-radio-outer-circle{border-color:#135f7f}.mat-radio-button.mat-primary .mat-radio-inner-circle,.mat-radio-button.mat-primary .mat-radio-ripple .mat-ripple-element:not(.mat-radio-persistent-ripple),.mat-radio-button.mat-primary.mat-radio-checked .mat-radio-persistent-ripple,.mat-radio-button.mat-primary:active .mat-radio-persistent-ripple{background-color:#135f7f}.mat-radio-button.mat-accent.mat-radio-checked .mat-radio-outer-circle{border-color:#006841}.mat-radio-button.mat-accent .mat-radio-inner-circle,.mat-radio-button.mat-accent .mat-radio-ripple .mat-ripple-element:not(.mat-radio-persistent-ripple),.mat-radio-button.mat-accent.mat-radio-checked .mat-radio-persistent-ripple,.mat-radio-button.mat-accent:active .mat-radio-persistent-ripple{background-color:#006841}.mat-radio-button.mat-warn.mat-radio-checked .mat-radio-outer-circle{border-color:#8e3e52}.mat-radio-button.mat-warn .mat-radio-inner-circle,.mat-radio-button.mat-warn .mat-radio-ripple .mat-ripple-element:not(.mat-radio-persistent-ripple),.mat-radio-button.mat-warn.mat-radio-checked .mat-radio-persistent-ripple,.mat-radio-button.mat-warn:active .mat-radio-persistent-ripple{background-color:#8e3e52}.mat-radio-button.mat-radio-disabled.mat-radio-checked .mat-radio-outer-circle,.mat-radio-button.mat-radio-disabled .mat-radio-outer-circle{border-color:rgba(0,0,0,0.38)}.mat-radio-button.mat-radio-disabled .mat-radio-ripple .mat-ripple-element,.mat-radio-button.mat-radio-disabled .mat-radio-inner-circle{background-color:rgba(0,0,0,0.38)}.mat-radio-button.mat-radio-disabled .mat-radio-label-content{color:rgba(0,0,0,0.38)}.mat-radio-button .mat-ripple-element{background-color:#000}.mat-select-value{color:rgba(0,0,0,0.87)}.mat-select-placeholder{color:rgba(0,0,0,0.42)}.mat-select-disabled .mat-select-value{color:rgba(0,0,0,0.38)}.mat-select-arrow{color:rgba(0,0,0,0.54)}.mat-select-panel{background:#fff}.mat-select-panel:not([class*='mat-elevation-z']){box-shadow:0px 2px 4px -1px rgba(0,0,0,0.2),0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12)}.mat-select-panel .mat-option.mat-selected:not(.mat-option-multiple){background:rgba(0,0,0,0.12)}.mat-form-field.mat-focused.mat-primary .mat-select-arrow{color:#135f7f}.mat-form-field.mat-focused.mat-accent .mat-select-arrow{color:#006841}.mat-form-field.mat-focused.mat-warn .mat-select-arrow{color:#8e3e52}.mat-form-field .mat-select.mat-select-invalid .mat-select-arrow{color:#8e3e52}.mat-form-field .mat-select.mat-select-disabled .mat-select-arrow{color:rgba(0,0,0,0.38)}.mat-drawer-container{background-color:#fafafa;color:rgba(0,0,0,0.87)}.mat-drawer{background-color:#fff;color:rgba(0,0,0,0.87)}.mat-drawer.mat-drawer-push{background-color:#fff}.mat-drawer:not(.mat-drawer-side){box-shadow:0px 8px 10px -5px rgba(0,0,0,0.2),0px 16px 24px 2px rgba(0,0,0,0.14),0px 6px 30px 5px rgba(0,0,0,0.12)}.mat-drawer-side{border-right:solid 1px rgba(0,0,0,0.12)}.mat-drawer-side.mat-drawer-end{border-left:solid 1px rgba(0,0,0,0.12);border-right:none}[dir='rtl'] .mat-drawer-side{border-left:solid 1px rgba(0,0,0,0.12);border-right:none}[dir='rtl'] .mat-drawer-side.mat-drawer-end{border-left:none;border-right:solid 1px rgba(0,0,0,0.12)}.mat-drawer-backdrop.mat-drawer-shown{background-color:rgba(0,0,0,0.6)}.mat-slide-toggle.mat-checked .mat-slide-toggle-thumb{background-color:#006841}.mat-slide-toggle.mat-checked .mat-slide-toggle-bar{background-color:rgba(0,104,65,0.54)}.mat-slide-toggle.mat-checked .mat-ripple-element{background-color:#006841}.mat-slide-toggle.mat-primary.mat-checked .mat-slide-toggle-thumb{background-color:#135f7f}.mat-slide-toggle.mat-primary.mat-checked .mat-slide-toggle-bar{background-color:rgba(19,95,127,0.54)}.mat-slide-toggle.mat-primary.mat-checked .mat-ripple-element{background-color:#135f7f}.mat-slide-toggle.mat-warn.mat-checked .mat-slide-toggle-thumb{background-color:#8e3e52}.mat-slide-toggle.mat-warn.mat-checked .mat-slide-toggle-bar{background-color:rgba(142,62,82,0.54)}.mat-slide-toggle.mat-warn.mat-checked .mat-ripple-element{background-color:#8e3e52}.mat-slide-toggle:not(.mat-checked) .mat-ripple-element{background-color:#000}.mat-slide-toggle-thumb{box-shadow:0px 2px 1px -1px rgba(0,0,0,0.2),0px 1px 1px 0px rgba(0,0,0,0.14),0px 1px 3px 0px rgba(0,0,0,0.12);background-color:#fafafa}.mat-slide-toggle-bar{background-color:rgba(0,0,0,0.38)}.mat-slider-track-background{background-color:rgba(0,0,0,0.26)}.mat-primary .mat-slider-track-fill,.mat-primary .mat-slider-thumb,.mat-primary .mat-slider-thumb-label{background-color:#135f7f}.mat-primary .mat-slider-thumb-label-text{color:#fff}.mat-accent .mat-slider-track-fill,.mat-accent .mat-slider-thumb,.mat-accent .mat-slider-thumb-label{background-color:#006841}.mat-accent .mat-slider-thumb-label-text{color:#fff}.mat-warn .mat-slider-track-fill,.mat-warn .mat-slider-thumb,.mat-warn .mat-slider-thumb-label{background-color:#8e3e52}.mat-warn .mat-slider-thumb-label-text{color:#fff}.mat-slider-focus-ring{background-color:rgba(0,104,65,0.2)}.mat-slider:hover .mat-slider-track-background,.cdk-focused .mat-slider-track-background{background-color:rgba(0,0,0,0.38)}.mat-slider-disabled .mat-slider-track-background,.mat-slider-disabled .mat-slider-track-fill,.mat-slider-disabled .mat-slider-thumb{background-color:rgba(0,0,0,0.26)}.mat-slider-disabled:hover .mat-slider-track-background{background-color:rgba(0,0,0,0.26)}.mat-slider-min-value .mat-slider-focus-ring{background-color:rgba(0,0,0,0.12)}.mat-slider-min-value.mat-slider-thumb-label-showing .mat-slider-thumb,.mat-slider-min-value.mat-slider-thumb-label-showing .mat-slider-thumb-label{background-color:rgba(0,0,0,0.87)}.mat-slider-min-value.mat-slider-thumb-label-showing.cdk-focused .mat-slider-thumb,.mat-slider-min-value.mat-slider-thumb-label-showing.cdk-focused .mat-slider-thumb-label{background-color:rgba(0,0,0,0.26)}.mat-slider-min-value:not(.mat-slider-thumb-label-showing) .mat-slider-thumb{border-color:rgba(0,0,0,0.26);background-color:transparent}.mat-slider-min-value:not(.mat-slider-thumb-label-showing):hover .mat-slider-thumb,.mat-slider-min-value:not(.mat-slider-thumb-label-showing).cdk-focused .mat-slider-thumb{border-color:rgba(0,0,0,0.38)}.mat-slider-min-value:not(.mat-slider-thumb-label-showing):hover.mat-slider-disabled .mat-slider-thumb,.mat-slider-min-value:not(.mat-slider-thumb-label-showing).cdk-focused.mat-slider-disabled .mat-slider-thumb{border-color:rgba(0,0,0,0.26)}.mat-slider-has-ticks .mat-slider-wrapper::after{border-color:rgba(0,0,0,0.7)}.mat-slider-horizontal .mat-slider-ticks{background-image:repeating-linear-gradient(to right, rgba(0,0,0,0.7), rgba(0,0,0,0.7) 2px, transparent 0, transparent);background-image:-moz-repeating-linear-gradient(0.0001deg, rgba(0,0,0,0.7), rgba(0,0,0,0.7) 2px, transparent 0, transparent)}.mat-slider-vertical .mat-slider-ticks{background-image:repeating-linear-gradient(to bottom, rgba(0,0,0,0.7), rgba(0,0,0,0.7) 2px, transparent 0, transparent)}.mat-step-header.cdk-keyboard-focused,.mat-step-header.cdk-program-focused,.mat-step-header:hover{background-color:rgba(0,0,0,0.04)}@media (hover: none){.mat-step-header:hover{background:none}}.mat-step-header .mat-step-label,.mat-step-header .mat-step-optional{color:rgba(0,0,0,0.54)}.mat-step-header .mat-step-icon{background-color:rgba(0,0,0,0.54);color:#fff}.mat-step-header .mat-step-icon-selected,.mat-step-header .mat-step-icon-state-done,.mat-step-header .mat-step-icon-state-edit{background-color:#135f7f;color:#fff}.mat-step-header .mat-step-icon-state-error{background-color:transparent;color:#8e3e52}.mat-step-header .mat-step-label.mat-step-label-active{color:rgba(0,0,0,0.87)}.mat-step-header .mat-step-label.mat-step-label-error{color:#8e3e52}.mat-stepper-horizontal,.mat-stepper-vertical{background-color:#fff}.mat-stepper-vertical-line::before{border-left-color:rgba(0,0,0,0.12)}.mat-horizontal-stepper-header::before,.mat-horizontal-stepper-header::after,.mat-stepper-horizontal-line{border-top-color:rgba(0,0,0,0.12)}.mat-sort-header-arrow{color:#757575}.mat-tab-nav-bar,.mat-tab-header{border-bottom:1px solid rgba(0,0,0,0.12)}.mat-tab-group-inverted-header .mat-tab-nav-bar,.mat-tab-group-inverted-header .mat-tab-header{border-top:1px solid rgba(0,0,0,0.12);border-bottom:none}.mat-tab-label,.mat-tab-link{color:rgba(0,0,0,0.87)}.mat-tab-label.mat-tab-disabled,.mat-tab-link.mat-tab-disabled{color:rgba(0,0,0,0.38)}.mat-tab-header-pagination-chevron{border-color:rgba(0,0,0,0.87)}.mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(0,0,0,0.38)}.mat-tab-group[class*='mat-background-'] .mat-tab-header,.mat-tab-nav-bar[class*='mat-background-']{border-bottom:none;border-top:none}.mat-tab-group.mat-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(26,128,171,0.3)}.mat-tab-group.mat-primary .mat-ink-bar,.mat-tab-nav-bar.mat-primary .mat-ink-bar{background-color:#135f7f}.mat-tab-group.mat-primary.mat-background-primary .mat-ink-bar,.mat-tab-nav-bar.mat-primary.mat-background-primary .mat-ink-bar{background-color:#fff}.mat-tab-group.mat-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(0,155,97,0.3)}.mat-tab-group.mat-accent .mat-ink-bar,.mat-tab-nav-bar.mat-accent .mat-ink-bar{background-color:#006841}.mat-tab-group.mat-accent.mat-background-accent .mat-ink-bar,.mat-tab-nav-bar.mat-accent.mat-background-accent .mat-ink-bar{background-color:#fff}.mat-tab-group.mat-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(178,78,103,0.3)}.mat-tab-group.mat-warn .mat-ink-bar,.mat-tab-nav-bar.mat-warn .mat-ink-bar{background-color:#8e3e52}.mat-tab-group.mat-warn.mat-background-warn .mat-ink-bar,.mat-tab-nav-bar.mat-warn.mat-background-warn .mat-ink-bar{background-color:#fff}.mat-tab-group.mat-background-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(26,128,171,0.3)}.mat-tab-group.mat-background-primary .mat-tab-header,.mat-tab-group.mat-background-primary .mat-tab-links,.mat-tab-group.mat-background-primary .mat-tab-header-pagination,.mat-tab-nav-bar.mat-background-primary .mat-tab-header,.mat-tab-nav-bar.mat-background-primary .mat-tab-links,.mat-tab-nav-bar.mat-background-primary .mat-tab-header-pagination{background-color:#135f7f}.mat-tab-group.mat-background-primary .mat-tab-label,.mat-tab-group.mat-background-primary .mat-tab-link,.mat-tab-nav-bar.mat-background-primary .mat-tab-label,.mat-tab-nav-bar.mat-background-primary .mat-tab-link{color:#fff}.mat-tab-group.mat-background-primary .mat-tab-label.mat-tab-disabled,.mat-tab-group.mat-background-primary .mat-tab-link.mat-tab-disabled,.mat-tab-nav-bar.mat-background-primary .mat-tab-label.mat-tab-disabled,.mat-tab-nav-bar.mat-background-primary .mat-tab-link.mat-tab-disabled{color:rgba(255,255,255,0.4)}.mat-tab-group.mat-background-primary .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-primary .mat-tab-header-pagination-chevron{border-color:#fff}.mat-tab-group.mat-background-primary .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-primary .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(255,255,255,0.4)}.mat-tab-group.mat-background-primary .mat-ripple-element,.mat-tab-nav-bar.mat-background-primary .mat-ripple-element{background-color:rgba(255,255,255,0.12)}.mat-tab-group.mat-background-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(0,155,97,0.3)}.mat-tab-group.mat-background-accent .mat-tab-header,.mat-tab-group.mat-background-accent .mat-tab-links,.mat-tab-group.mat-background-accent .mat-tab-header-pagination,.mat-tab-nav-bar.mat-background-accent .mat-tab-header,.mat-tab-nav-bar.mat-background-accent .mat-tab-links,.mat-tab-nav-bar.mat-background-accent .mat-tab-header-pagination{background-color:#006841}.mat-tab-group.mat-background-accent .mat-tab-label,.mat-tab-group.mat-background-accent .mat-tab-link,.mat-tab-nav-bar.mat-background-accent .mat-tab-label,.mat-tab-nav-bar.mat-background-accent .mat-tab-link{color:#fff}.mat-tab-group.mat-background-accent .mat-tab-label.mat-tab-disabled,.mat-tab-group.mat-background-accent .mat-tab-link.mat-tab-disabled,.mat-tab-nav-bar.mat-background-accent .mat-tab-label.mat-tab-disabled,.mat-tab-nav-bar.mat-background-accent .mat-tab-link.mat-tab-disabled{color:rgba(255,255,255,0.4)}.mat-tab-group.mat-background-accent .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-accent .mat-tab-header-pagination-chevron{border-color:#fff}.mat-tab-group.mat-background-accent .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-accent .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(255,255,255,0.4)}.mat-tab-group.mat-background-accent .mat-ripple-element,.mat-tab-nav-bar.mat-background-accent .mat-ripple-element{background-color:rgba(255,255,255,0.12)}.mat-tab-group.mat-background-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(178,78,103,0.3)}.mat-tab-group.mat-background-warn .mat-tab-header,.mat-tab-group.mat-background-warn .mat-tab-links,.mat-tab-group.mat-background-warn .mat-tab-header-pagination,.mat-tab-nav-bar.mat-background-warn .mat-tab-header,.mat-tab-nav-bar.mat-background-warn .mat-tab-links,.mat-tab-nav-bar.mat-background-warn .mat-tab-header-pagination{background-color:#8e3e52}.mat-tab-group.mat-background-warn .mat-tab-label,.mat-tab-group.mat-background-warn .mat-tab-link,.mat-tab-nav-bar.mat-background-warn .mat-tab-label,.mat-tab-nav-bar.mat-background-warn .mat-tab-link{color:#fff}.mat-tab-group.mat-background-warn .mat-tab-label.mat-tab-disabled,.mat-tab-group.mat-background-warn .mat-tab-link.mat-tab-disabled,.mat-tab-nav-bar.mat-background-warn .mat-tab-label.mat-tab-disabled,.mat-tab-nav-bar.mat-background-warn .mat-tab-link.mat-tab-disabled{color:rgba(255,255,255,0.4)}.mat-tab-group.mat-background-warn .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-warn .mat-tab-header-pagination-chevron{border-color:#fff}.mat-tab-group.mat-background-warn .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-warn .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(255,255,255,0.4)}.mat-tab-group.mat-background-warn .mat-ripple-element,.mat-tab-nav-bar.mat-background-warn .mat-ripple-element{background-color:rgba(255,255,255,0.12)}.mat-toolbar{background:#f5f5f5;color:rgba(0,0,0,0.87)}.mat-toolbar.mat-primary{background:#135f7f;color:#fff}.mat-toolbar.mat-accent{background:#006841;color:#fff}.mat-toolbar.mat-warn{background:#8e3e52;color:#fff}.mat-toolbar .mat-form-field-underline,.mat-toolbar .mat-form-field-ripple,.mat-toolbar .mat-focused .mat-form-field-ripple{background-color:currentColor}.mat-toolbar .mat-form-field-label,.mat-toolbar .mat-focused .mat-form-field-label,.mat-toolbar .mat-select-value,.mat-toolbar .mat-select-arrow,.mat-toolbar .mat-form-field.mat-focused .mat-select-arrow{color:inherit}.mat-toolbar .mat-input-element{caret-color:currentColor}.mat-tooltip{background:rgba(97,97,97,0.9)}.mat-tree{background:#fff}.mat-tree-node,.mat-nested-tree-node{color:rgba(0,0,0,0.87)}.mat-snack-bar-container{color:rgba(255,255,255,0.7);background:#323232;box-shadow:0px 3px 5px -1px rgba(0,0,0,0.2),0px 6px 10px 0px rgba(0,0,0,0.14),0px 1px 18px 0px rgba(0,0,0,0.12)}.mat-simple-snackbar-action{color:#006841}[color=primary]{color:#135f7f}[color=secondary]{color:#F99830}[color=warn]{color:#8e3e52}[color=accent]{color:#006841}[bgcolor=primary]{background-color:#135f7f}[bgcolor=warn]{background-color:#8e3e52}[bgcolor=accent]{background-color:#006841}.jstree-proton .jstree-clicked{background:#1a80ab !important}.jstree-proton :not(.jstree-disabled).jstree-hovered{background:#1a80ab !important;box-shadow:inset 0 0 1px #135f7f !important}.jstree-proton .jstree-disabled:hover{cursor:not-allowed}.dndFile{border:dashed 5px grey;padding:10px;text-align:center;opacity:0.5;font-size:15px;font-weight:bolder;margin:20px}.dndFileHighlighted{opacity:1 !important;border:dashed 5px #135f7f !important;color:#135f7f}.cdk-textarea-autosize{min-height:18px !important} +.mat-badge-content{font-weight:600;font-size:12px;font-family:Roboto, "Helvetica Neue", sans-serif}.mat-badge-small .mat-badge-content{font-size:9px}.mat-badge-large .mat-badge-content{font-size:24px}.mat-h1,.mat-headline,.mat-typography h1{font:400 24px/32px Roboto, "Helvetica Neue", sans-serif;margin:0 0 16px}.mat-h2,.mat-title,.mat-typography h2{font:500 20px/32px Roboto, "Helvetica Neue", sans-serif;margin:0 0 16px}.mat-h3,.mat-subheading-2,.mat-typography h3{font:400 16px/28px Roboto, "Helvetica Neue", sans-serif;margin:0 0 16px}.mat-h4,.mat-subheading-1,.mat-typography h4{font:400 15px/24px Roboto, "Helvetica Neue", sans-serif;margin:0 0 16px}.mat-h5,.mat-typography h5{font:400 calc(14px * 0.83)/20px Roboto, "Helvetica Neue", sans-serif;margin:0 0 12px}.mat-h6,.mat-typography h6{font:400 calc(14px * 0.67)/20px Roboto, "Helvetica Neue", sans-serif;margin:0 0 12px}.mat-body-strong,.mat-body-2{font:500 14px/24px Roboto, "Helvetica Neue", sans-serif}.mat-body,.mat-body-1,.mat-typography{font:400 14px/20px Roboto, "Helvetica Neue", sans-serif}.mat-body p,.mat-body-1 p,.mat-typography p{margin:0 0 12px}.mat-small,.mat-caption{font:400 12px/20px Roboto, "Helvetica Neue", sans-serif}.mat-display-4,.mat-typography .mat-display-4{font:300 112px/112px Roboto, "Helvetica Neue", sans-serif;letter-spacing:-.05em;margin:0 0 56px}.mat-display-3,.mat-typography .mat-display-3{font:400 56px/56px Roboto, "Helvetica Neue", sans-serif;letter-spacing:-.02em;margin:0 0 64px}.mat-display-2,.mat-typography .mat-display-2{font:400 45px/48px Roboto, "Helvetica Neue", sans-serif;letter-spacing:-.005em;margin:0 0 64px}.mat-display-1,.mat-typography .mat-display-1{font:400 34px/40px Roboto, "Helvetica Neue", sans-serif;margin:0 0 64px}.mat-bottom-sheet-container{font:400 14px/20px Roboto, "Helvetica Neue", sans-serif}.mat-button,.mat-raised-button,.mat-icon-button,.mat-stroked-button,.mat-flat-button,.mat-fab,.mat-mini-fab{font-family:Roboto, "Helvetica Neue", sans-serif;font-size:14px;font-weight:500}.mat-button-toggle{font-family:Roboto, "Helvetica Neue", sans-serif}.mat-card{font-family:Roboto, "Helvetica Neue", sans-serif}.mat-card-title{font-size:24px;font-weight:500}.mat-card-header .mat-card-title{font-size:20px}.mat-card-subtitle,.mat-card-content{font-size:14px}.mat-checkbox{font-family:Roboto, "Helvetica Neue", sans-serif}.mat-checkbox-layout .mat-checkbox-label{line-height:24px}.mat-chip{font-size:14px;font-weight:500}.mat-chip .mat-chip-trailing-icon.mat-icon,.mat-chip .mat-chip-remove.mat-icon{font-size:18px}.mat-table{font-family:Roboto, "Helvetica Neue", sans-serif}.mat-header-cell{font-size:12px;font-weight:500}.mat-cell,.mat-footer-cell{font-size:14px}.mat-calendar{font-family:Roboto, "Helvetica Neue", sans-serif}.mat-calendar-body{font-size:13px}.mat-calendar-body-label,.mat-calendar-period-button{font-size:14px;font-weight:500}.mat-calendar-table-header th{font-size:11px;font-weight:400}.mat-dialog-title{font:500 20px/32px Roboto, "Helvetica Neue", sans-serif}.mat-expansion-panel-header{font-family:Roboto, "Helvetica Neue", sans-serif;font-size:15px;font-weight:400}.mat-expansion-panel-content{font:400 14px/20px Roboto, "Helvetica Neue", sans-serif}.mat-form-field{font-size:inherit;font-weight:400;line-height:1.125;font-family:Roboto, "Helvetica Neue", sans-serif}.mat-form-field-wrapper{padding-bottom:1.34375em}.mat-form-field-prefix .mat-icon,.mat-form-field-suffix .mat-icon{font-size:150%;line-height:1.125}.mat-form-field-prefix .mat-icon-button,.mat-form-field-suffix .mat-icon-button{height:1.5em;width:1.5em}.mat-form-field-prefix .mat-icon-button .mat-icon,.mat-form-field-suffix .mat-icon-button .mat-icon{height:1.125em;line-height:1.125}.mat-form-field-infix{padding:.5em 0;border-top:.84375em solid transparent}.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label,.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.34375em) scale(.75);width:133.33333%}.mat-form-field-can-float .mat-input-server[label]:not(:label-shown)+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.34374em) scale(.75);width:133.33334%}.mat-form-field-label-wrapper{top:-.84375em;padding-top:.84375em}.mat-form-field-label{top:1.34375em}.mat-form-field-underline{bottom:1.34375em}.mat-form-field-subscript-wrapper{font-size:75%;margin-top:.66667em;top:calc(100% - 1.79167em)}.mat-form-field-appearance-legacy .mat-form-field-wrapper{padding-bottom:1.25em}.mat-form-field-appearance-legacy .mat-form-field-infix{padding:.4375em 0}.mat-form-field-appearance-legacy.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label,.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(0.001px);-ms-transform:translateY(-1.28125em) scale(.75);width:133.33333%}.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-form-field-autofill-control:-webkit-autofill+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(0.00101px);-ms-transform:translateY(-1.28124em) scale(.75);width:133.33334%}.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-input-server[label]:not(:label-shown)+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(0.00102px);-ms-transform:translateY(-1.28123em) scale(.75);width:133.33335%}.mat-form-field-appearance-legacy .mat-form-field-label{top:1.28125em}.mat-form-field-appearance-legacy .mat-form-field-underline{bottom:1.25em}.mat-form-field-appearance-legacy .mat-form-field-subscript-wrapper{margin-top:.54167em;top:calc(100% - 1.66667em)}@media print{.mat-form-field-appearance-legacy.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label,.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.28122em) scale(.75)}.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-form-field-autofill-control:-webkit-autofill+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.28121em) scale(.75)}.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-input-server[label]:not(:label-shown)+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.2812em) scale(.75)}}.mat-form-field-appearance-fill .mat-form-field-infix{padding:.25em 0 .75em 0}.mat-form-field-appearance-fill .mat-form-field-label{top:1.09375em;margin-top:-.5em}.mat-form-field-appearance-fill.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label,.mat-form-field-appearance-fill.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-.59375em) scale(.75);width:133.33333%}.mat-form-field-appearance-fill.mat-form-field-can-float .mat-input-server[label]:not(:label-shown)+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-.59374em) scale(.75);width:133.33334%}.mat-form-field-appearance-outline .mat-form-field-infix{padding:1em 0 1em 0}.mat-form-field-appearance-outline .mat-form-field-label{top:1.84375em;margin-top:-.25em}.mat-form-field-appearance-outline.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label,.mat-form-field-appearance-outline.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.59375em) scale(.75);width:133.33333%}.mat-form-field-appearance-outline.mat-form-field-can-float .mat-input-server[label]:not(:label-shown)+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.59374em) scale(.75);width:133.33334%}.mat-grid-tile-header,.mat-grid-tile-footer{font-size:14px}.mat-grid-tile-header .mat-line,.mat-grid-tile-footer .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}.mat-grid-tile-header .mat-line:nth-child(n+2),.mat-grid-tile-footer .mat-line:nth-child(n+2){font-size:12px}input.mat-input-element{margin-top:-.0625em}.mat-menu-item{font-family:Roboto, "Helvetica Neue", sans-serif;font-size:14px;font-weight:400}.mat-paginator,.mat-paginator-page-size .mat-select-trigger{font-family:Roboto, "Helvetica Neue", sans-serif;font-size:12px}.mat-radio-button{font-family:Roboto, "Helvetica Neue", sans-serif}.mat-select{font-family:Roboto, "Helvetica Neue", sans-serif}.mat-select-trigger{height:1.125em}.mat-slide-toggle-content{font-family:Roboto, "Helvetica Neue", sans-serif}.mat-slider-thumb-label-text{font-family:Roboto, "Helvetica Neue", sans-serif;font-size:12px;font-weight:500}.mat-stepper-vertical,.mat-stepper-horizontal{font-family:Roboto, "Helvetica Neue", sans-serif}.mat-step-label{font-size:14px;font-weight:400}.mat-step-sub-label-error{font-weight:normal}.mat-step-label-error{font-size:14px}.mat-step-label-selected{font-size:14px;font-weight:500}.mat-tab-group{font-family:Roboto, "Helvetica Neue", sans-serif}.mat-tab-label,.mat-tab-link{font-family:Roboto, "Helvetica Neue", sans-serif;font-size:14px;font-weight:500}.mat-toolbar,.mat-toolbar h1,.mat-toolbar h2,.mat-toolbar h3,.mat-toolbar h4,.mat-toolbar h5,.mat-toolbar h6{font:500 20px/32px Roboto, "Helvetica Neue", sans-serif;margin:0}.mat-tooltip{font-family:Roboto, "Helvetica Neue", sans-serif;font-size:10px;padding-top:6px;padding-bottom:6px}.mat-tooltip-handset{font-size:14px;padding-top:8px;padding-bottom:8px}.mat-list-item{font-family:Roboto, "Helvetica Neue", sans-serif}.mat-list-option{font-family:Roboto, "Helvetica Neue", sans-serif}.mat-list-base .mat-list-item{font-size:16px}.mat-list-base .mat-list-item .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}.mat-list-base .mat-list-item .mat-line:nth-child(n+2){font-size:14px}.mat-list-base .mat-list-option{font-size:16px}.mat-list-base .mat-list-option .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}.mat-list-base .mat-list-option .mat-line:nth-child(n+2){font-size:14px}.mat-list-base .mat-subheader{font-family:Roboto, "Helvetica Neue", sans-serif;font-size:14px;font-weight:500}.mat-list-base[dense] .mat-list-item{font-size:12px}.mat-list-base[dense] .mat-list-item .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}.mat-list-base[dense] .mat-list-item .mat-line:nth-child(n+2){font-size:12px}.mat-list-base[dense] .mat-list-option{font-size:12px}.mat-list-base[dense] .mat-list-option .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}.mat-list-base[dense] .mat-list-option .mat-line:nth-child(n+2){font-size:12px}.mat-list-base[dense] .mat-subheader{font-family:Roboto, "Helvetica Neue", sans-serif;font-size:12px;font-weight:500}.mat-option{font-family:Roboto, "Helvetica Neue", sans-serif;font-size:16px}.mat-optgroup-label{font:500 14px/24px Roboto, "Helvetica Neue", sans-serif}.mat-simple-snackbar{font-family:Roboto, "Helvetica Neue", sans-serif;font-size:14px}.mat-simple-snackbar-action{line-height:1;font-family:inherit;font-size:inherit;font-weight:500}.mat-tree{font-family:Roboto, "Helvetica Neue", sans-serif}.mat-tree-node,.mat-nested-tree-node{font-weight:400;font-size:14px}.mat-ripple{overflow:hidden;position:relative}.mat-ripple.mat-ripple-unbounded{overflow:visible}.mat-ripple-element{position:absolute;border-radius:50%;pointer-events:none;transition:opacity,transform 0ms cubic-bezier(0, 0, 0.2, 1);transform:scale(0)}@media (-ms-high-contrast: active){.mat-ripple-element{display:none}}.cdk-visually-hidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;outline:0;-webkit-appearance:none;-moz-appearance:none}.cdk-overlay-container,.cdk-global-overlay-wrapper{pointer-events:none;top:0;left:0;height:100%;width:100%}.cdk-overlay-container{position:fixed;z-index:1000}.cdk-overlay-container:empty{display:none}.cdk-global-overlay-wrapper{display:flex;position:absolute;z-index:1000}.cdk-overlay-pane{position:absolute;pointer-events:auto;box-sizing:border-box;z-index:1000;display:flex;max-width:100%;max-height:100%}.cdk-overlay-backdrop{position:absolute;top:0;bottom:0;left:0;right:0;z-index:1000;pointer-events:auto;-webkit-tap-highlight-color:transparent;transition:opacity 400ms cubic-bezier(0.25, 0.8, 0.25, 1);opacity:0}.cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:1}@media screen and (-ms-high-contrast: active){.cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:0.6}}.cdk-overlay-dark-backdrop{background:rgba(0,0,0,0.32)}.cdk-overlay-transparent-backdrop,.cdk-overlay-transparent-backdrop.cdk-overlay-backdrop-showing{opacity:0}.cdk-overlay-connected-position-bounding-box{position:absolute;z-index:1000;display:flex;flex-direction:column;min-width:1px;min-height:1px}.cdk-global-scrollblock{position:fixed;width:100%;overflow-y:scroll}@keyframes cdk-text-field-autofill-start{/*!*/}@keyframes cdk-text-field-autofill-end{/*!*/}.cdk-text-field-autofill-monitored:-webkit-autofill{animation-name:cdk-text-field-autofill-start}.cdk-text-field-autofill-monitored:not(:-webkit-autofill){animation-name:cdk-text-field-autofill-end}textarea.cdk-textarea-autosize{resize:none}textarea.cdk-textarea-autosize-measuring{height:auto !important;overflow:hidden !important;padding:2px 0 !important;box-sizing:content-box !important}.mat-ripple-element{background-color:rgba(0,0,0,0.1)}.mat-option{color:rgba(0,0,0,0.87)}.mat-option:hover:not(.mat-option-disabled),.mat-option:focus:not(.mat-option-disabled){background:rgba(0,0,0,0.04)}.mat-option.mat-selected:not(.mat-option-multiple):not(.mat-option-disabled){background:rgba(0,0,0,0.04)}.mat-option.mat-active{background:rgba(0,0,0,0.04);color:rgba(0,0,0,0.87)}.mat-option.mat-option-disabled{color:rgba(0,0,0,0.38)}.mat-primary .mat-option.mat-selected:not(.mat-option-disabled){color:#135f7f}.mat-accent .mat-option.mat-selected:not(.mat-option-disabled){color:#006841}.mat-warn .mat-option.mat-selected:not(.mat-option-disabled){color:#8e3e52}.mat-optgroup-label{color:rgba(0,0,0,0.54)}.mat-optgroup-disabled .mat-optgroup-label{color:rgba(0,0,0,0.38)}.mat-pseudo-checkbox{color:rgba(0,0,0,0.54)}.mat-pseudo-checkbox::after{color:#fafafa}.mat-pseudo-checkbox-disabled{color:#b0b0b0}.mat-primary .mat-pseudo-checkbox-checked,.mat-primary .mat-pseudo-checkbox-indeterminate{background:#135f7f}.mat-pseudo-checkbox-checked,.mat-pseudo-checkbox-indeterminate,.mat-accent .mat-pseudo-checkbox-checked,.mat-accent .mat-pseudo-checkbox-indeterminate{background:#006841}.mat-warn .mat-pseudo-checkbox-checked,.mat-warn .mat-pseudo-checkbox-indeterminate{background:#8e3e52}.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled,.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled{background:#b0b0b0}.mat-elevation-z0{box-shadow:0px 0px 0px 0px rgba(0,0,0,0.2),0px 0px 0px 0px rgba(0,0,0,0.14),0px 0px 0px 0px rgba(0,0,0,0.12)}.mat-elevation-z1{box-shadow:0px 2px 1px -1px rgba(0,0,0,0.2),0px 1px 1px 0px rgba(0,0,0,0.14),0px 1px 3px 0px rgba(0,0,0,0.12)}.mat-elevation-z2{box-shadow:0px 3px 1px -2px rgba(0,0,0,0.2),0px 2px 2px 0px rgba(0,0,0,0.14),0px 1px 5px 0px rgba(0,0,0,0.12)}.mat-elevation-z3{box-shadow:0px 3px 3px -2px rgba(0,0,0,0.2),0px 3px 4px 0px rgba(0,0,0,0.14),0px 1px 8px 0px rgba(0,0,0,0.12)}.mat-elevation-z4{box-shadow:0px 2px 4px -1px rgba(0,0,0,0.2),0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12)}.mat-elevation-z5{box-shadow:0px 3px 5px -1px rgba(0,0,0,0.2),0px 5px 8px 0px rgba(0,0,0,0.14),0px 1px 14px 0px rgba(0,0,0,0.12)}.mat-elevation-z6{box-shadow:0px 3px 5px -1px rgba(0,0,0,0.2),0px 6px 10px 0px rgba(0,0,0,0.14),0px 1px 18px 0px rgba(0,0,0,0.12)}.mat-elevation-z7{box-shadow:0px 4px 5px -2px rgba(0,0,0,0.2),0px 7px 10px 1px rgba(0,0,0,0.14),0px 2px 16px 1px rgba(0,0,0,0.12)}.mat-elevation-z8{box-shadow:0px 5px 5px -3px rgba(0,0,0,0.2),0px 8px 10px 1px rgba(0,0,0,0.14),0px 3px 14px 2px rgba(0,0,0,0.12)}.mat-elevation-z9{box-shadow:0px 5px 6px -3px rgba(0,0,0,0.2),0px 9px 12px 1px rgba(0,0,0,0.14),0px 3px 16px 2px rgba(0,0,0,0.12)}.mat-elevation-z10{box-shadow:0px 6px 6px -3px rgba(0,0,0,0.2),0px 10px 14px 1px rgba(0,0,0,0.14),0px 4px 18px 3px rgba(0,0,0,0.12)}.mat-elevation-z11{box-shadow:0px 6px 7px -4px rgba(0,0,0,0.2),0px 11px 15px 1px rgba(0,0,0,0.14),0px 4px 20px 3px rgba(0,0,0,0.12)}.mat-elevation-z12{box-shadow:0px 7px 8px -4px rgba(0,0,0,0.2),0px 12px 17px 2px rgba(0,0,0,0.14),0px 5px 22px 4px rgba(0,0,0,0.12)}.mat-elevation-z13{box-shadow:0px 7px 8px -4px rgba(0,0,0,0.2),0px 13px 19px 2px rgba(0,0,0,0.14),0px 5px 24px 4px rgba(0,0,0,0.12)}.mat-elevation-z14{box-shadow:0px 7px 9px -4px rgba(0,0,0,0.2),0px 14px 21px 2px rgba(0,0,0,0.14),0px 5px 26px 4px rgba(0,0,0,0.12)}.mat-elevation-z15{box-shadow:0px 8px 9px -5px rgba(0,0,0,0.2),0px 15px 22px 2px rgba(0,0,0,0.14),0px 6px 28px 5px rgba(0,0,0,0.12)}.mat-elevation-z16{box-shadow:0px 8px 10px -5px rgba(0,0,0,0.2),0px 16px 24px 2px rgba(0,0,0,0.14),0px 6px 30px 5px rgba(0,0,0,0.12)}.mat-elevation-z17{box-shadow:0px 8px 11px -5px rgba(0,0,0,0.2),0px 17px 26px 2px rgba(0,0,0,0.14),0px 6px 32px 5px rgba(0,0,0,0.12)}.mat-elevation-z18{box-shadow:0px 9px 11px -5px rgba(0,0,0,0.2),0px 18px 28px 2px rgba(0,0,0,0.14),0px 7px 34px 6px rgba(0,0,0,0.12)}.mat-elevation-z19{box-shadow:0px 9px 12px -6px rgba(0,0,0,0.2),0px 19px 29px 2px rgba(0,0,0,0.14),0px 7px 36px 6px rgba(0,0,0,0.12)}.mat-elevation-z20{box-shadow:0px 10px 13px -6px rgba(0,0,0,0.2),0px 20px 31px 3px rgba(0,0,0,0.14),0px 8px 38px 7px rgba(0,0,0,0.12)}.mat-elevation-z21{box-shadow:0px 10px 13px -6px rgba(0,0,0,0.2),0px 21px 33px 3px rgba(0,0,0,0.14),0px 8px 40px 7px rgba(0,0,0,0.12)}.mat-elevation-z22{box-shadow:0px 10px 14px -6px rgba(0,0,0,0.2),0px 22px 35px 3px rgba(0,0,0,0.14),0px 8px 42px 7px rgba(0,0,0,0.12)}.mat-elevation-z23{box-shadow:0px 11px 14px -7px rgba(0,0,0,0.2),0px 23px 36px 3px rgba(0,0,0,0.14),0px 9px 44px 8px rgba(0,0,0,0.12)}.mat-elevation-z24{box-shadow:0px 11px 15px -7px rgba(0,0,0,0.2),0px 24px 38px 3px rgba(0,0,0,0.14),0px 9px 46px 8px rgba(0,0,0,0.12)}.mat-app-background{background-color:#fafafa;color:rgba(0,0,0,0.87)}.mat-theme-loaded-marker{display:none}.mat-autocomplete-panel{background:#fff;color:rgba(0,0,0,0.87)}.mat-autocomplete-panel:not([class*='mat-elevation-z']){box-shadow:0px 2px 4px -1px rgba(0,0,0,0.2),0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12)}.mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover){background:#fff}.mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover):not(.mat-option-disabled){color:rgba(0,0,0,0.87)}.mat-badge-content{color:#fff;background:#135f7f}@media (-ms-high-contrast: active){.mat-badge-content{outline:solid 1px;border-radius:0}}.mat-badge-accent .mat-badge-content{background:#006841;color:#fff}.mat-badge-warn .mat-badge-content{color:#fff;background:#8e3e52}.mat-badge{position:relative}.mat-badge-hidden .mat-badge-content{display:none}.mat-badge-disabled .mat-badge-content{background:#b9b9b9;color:rgba(0,0,0,0.38)}.mat-badge-content{position:absolute;text-align:center;display:inline-block;border-radius:50%;transition:transform 200ms ease-in-out;transform:scale(0.6);overflow:hidden;white-space:nowrap;text-overflow:ellipsis;pointer-events:none}.ng-animate-disabled .mat-badge-content,.mat-badge-content._mat-animation-noopable{transition:none}.mat-badge-content.mat-badge-active{transform:none}.mat-badge-small .mat-badge-content{width:16px;height:16px;line-height:16px}.mat-badge-small.mat-badge-above .mat-badge-content{top:-8px}.mat-badge-small.mat-badge-below .mat-badge-content{bottom:-8px}.mat-badge-small.mat-badge-before .mat-badge-content{left:-16px}[dir='rtl'] .mat-badge-small.mat-badge-before .mat-badge-content{left:auto;right:-16px}.mat-badge-small.mat-badge-after .mat-badge-content{right:-16px}[dir='rtl'] .mat-badge-small.mat-badge-after .mat-badge-content{right:auto;left:-16px}.mat-badge-small.mat-badge-overlap.mat-badge-before .mat-badge-content{left:-8px}[dir='rtl'] .mat-badge-small.mat-badge-overlap.mat-badge-before .mat-badge-content{left:auto;right:-8px}.mat-badge-small.mat-badge-overlap.mat-badge-after .mat-badge-content{right:-8px}[dir='rtl'] .mat-badge-small.mat-badge-overlap.mat-badge-after .mat-badge-content{right:auto;left:-8px}.mat-badge-medium .mat-badge-content{width:22px;height:22px;line-height:22px}.mat-badge-medium.mat-badge-above .mat-badge-content{top:-11px}.mat-badge-medium.mat-badge-below .mat-badge-content{bottom:-11px}.mat-badge-medium.mat-badge-before .mat-badge-content{left:-22px}[dir='rtl'] .mat-badge-medium.mat-badge-before .mat-badge-content{left:auto;right:-22px}.mat-badge-medium.mat-badge-after .mat-badge-content{right:-22px}[dir='rtl'] .mat-badge-medium.mat-badge-after .mat-badge-content{right:auto;left:-22px}.mat-badge-medium.mat-badge-overlap.mat-badge-before .mat-badge-content{left:-11px}[dir='rtl'] .mat-badge-medium.mat-badge-overlap.mat-badge-before .mat-badge-content{left:auto;right:-11px}.mat-badge-medium.mat-badge-overlap.mat-badge-after .mat-badge-content{right:-11px}[dir='rtl'] .mat-badge-medium.mat-badge-overlap.mat-badge-after .mat-badge-content{right:auto;left:-11px}.mat-badge-large .mat-badge-content{width:28px;height:28px;line-height:28px}.mat-badge-large.mat-badge-above .mat-badge-content{top:-14px}.mat-badge-large.mat-badge-below .mat-badge-content{bottom:-14px}.mat-badge-large.mat-badge-before .mat-badge-content{left:-28px}[dir='rtl'] .mat-badge-large.mat-badge-before .mat-badge-content{left:auto;right:-28px}.mat-badge-large.mat-badge-after .mat-badge-content{right:-28px}[dir='rtl'] .mat-badge-large.mat-badge-after .mat-badge-content{right:auto;left:-28px}.mat-badge-large.mat-badge-overlap.mat-badge-before .mat-badge-content{left:-14px}[dir='rtl'] .mat-badge-large.mat-badge-overlap.mat-badge-before .mat-badge-content{left:auto;right:-14px}.mat-badge-large.mat-badge-overlap.mat-badge-after .mat-badge-content{right:-14px}[dir='rtl'] .mat-badge-large.mat-badge-overlap.mat-badge-after .mat-badge-content{right:auto;left:-14px}.mat-bottom-sheet-container{box-shadow:0px 8px 10px -5px rgba(0,0,0,0.2),0px 16px 24px 2px rgba(0,0,0,0.14),0px 6px 30px 5px rgba(0,0,0,0.12);background:#fff;color:rgba(0,0,0,0.87)}.mat-button,.mat-icon-button,.mat-stroked-button{color:inherit;background:transparent}.mat-button.mat-primary,.mat-icon-button.mat-primary,.mat-stroked-button.mat-primary{color:#135f7f}.mat-button.mat-accent,.mat-icon-button.mat-accent,.mat-stroked-button.mat-accent{color:#006841}.mat-button.mat-warn,.mat-icon-button.mat-warn,.mat-stroked-button.mat-warn{color:#8e3e52}.mat-button.mat-primary[disabled],.mat-button.mat-accent[disabled],.mat-button.mat-warn[disabled],.mat-button[disabled][disabled],.mat-icon-button.mat-primary[disabled],.mat-icon-button.mat-accent[disabled],.mat-icon-button.mat-warn[disabled],.mat-icon-button[disabled][disabled],.mat-stroked-button.mat-primary[disabled],.mat-stroked-button.mat-accent[disabled],.mat-stroked-button.mat-warn[disabled],.mat-stroked-button[disabled][disabled]{color:rgba(0,0,0,0.26)}.mat-button.mat-primary .mat-button-focus-overlay,.mat-icon-button.mat-primary .mat-button-focus-overlay,.mat-stroked-button.mat-primary .mat-button-focus-overlay{background-color:#135f7f}.mat-button.mat-accent .mat-button-focus-overlay,.mat-icon-button.mat-accent .mat-button-focus-overlay,.mat-stroked-button.mat-accent .mat-button-focus-overlay{background-color:#006841}.mat-button.mat-warn .mat-button-focus-overlay,.mat-icon-button.mat-warn .mat-button-focus-overlay,.mat-stroked-button.mat-warn .mat-button-focus-overlay{background-color:#8e3e52}.mat-button[disabled] .mat-button-focus-overlay,.mat-icon-button[disabled] .mat-button-focus-overlay,.mat-stroked-button[disabled] .mat-button-focus-overlay{background-color:transparent}.mat-button .mat-ripple-element,.mat-icon-button .mat-ripple-element,.mat-stroked-button .mat-ripple-element{opacity:.1;background-color:currentColor}.mat-button-focus-overlay{background:#000}.mat-stroked-button:not([disabled]){border-color:rgba(0,0,0,0.12)}.mat-flat-button,.mat-raised-button,.mat-fab,.mat-mini-fab{color:rgba(0,0,0,0.87);background-color:#fff}.mat-flat-button.mat-primary,.mat-raised-button.mat-primary,.mat-fab.mat-primary,.mat-mini-fab.mat-primary{color:#fff}.mat-flat-button.mat-accent,.mat-raised-button.mat-accent,.mat-fab.mat-accent,.mat-mini-fab.mat-accent{color:#fff}.mat-flat-button.mat-warn,.mat-raised-button.mat-warn,.mat-fab.mat-warn,.mat-mini-fab.mat-warn{color:#fff}.mat-flat-button.mat-primary[disabled],.mat-flat-button.mat-accent[disabled],.mat-flat-button.mat-warn[disabled],.mat-flat-button[disabled][disabled],.mat-raised-button.mat-primary[disabled],.mat-raised-button.mat-accent[disabled],.mat-raised-button.mat-warn[disabled],.mat-raised-button[disabled][disabled],.mat-fab.mat-primary[disabled],.mat-fab.mat-accent[disabled],.mat-fab.mat-warn[disabled],.mat-fab[disabled][disabled],.mat-mini-fab.mat-primary[disabled],.mat-mini-fab.mat-accent[disabled],.mat-mini-fab.mat-warn[disabled],.mat-mini-fab[disabled][disabled]{color:rgba(0,0,0,0.26)}.mat-flat-button.mat-primary,.mat-raised-button.mat-primary,.mat-fab.mat-primary,.mat-mini-fab.mat-primary{background-color:#135f7f}.mat-flat-button.mat-accent,.mat-raised-button.mat-accent,.mat-fab.mat-accent,.mat-mini-fab.mat-accent{background-color:#006841}.mat-flat-button.mat-warn,.mat-raised-button.mat-warn,.mat-fab.mat-warn,.mat-mini-fab.mat-warn{background-color:#8e3e52}.mat-flat-button.mat-primary[disabled],.mat-flat-button.mat-accent[disabled],.mat-flat-button.mat-warn[disabled],.mat-flat-button[disabled][disabled],.mat-raised-button.mat-primary[disabled],.mat-raised-button.mat-accent[disabled],.mat-raised-button.mat-warn[disabled],.mat-raised-button[disabled][disabled],.mat-fab.mat-primary[disabled],.mat-fab.mat-accent[disabled],.mat-fab.mat-warn[disabled],.mat-fab[disabled][disabled],.mat-mini-fab.mat-primary[disabled],.mat-mini-fab.mat-accent[disabled],.mat-mini-fab.mat-warn[disabled],.mat-mini-fab[disabled][disabled]{background-color:rgba(0,0,0,0.12)}.mat-flat-button.mat-primary .mat-ripple-element,.mat-raised-button.mat-primary .mat-ripple-element,.mat-fab.mat-primary .mat-ripple-element,.mat-mini-fab.mat-primary .mat-ripple-element{background-color:rgba(255,255,255,0.1)}.mat-flat-button.mat-accent .mat-ripple-element,.mat-raised-button.mat-accent .mat-ripple-element,.mat-fab.mat-accent .mat-ripple-element,.mat-mini-fab.mat-accent .mat-ripple-element{background-color:rgba(255,255,255,0.1)}.mat-flat-button.mat-warn .mat-ripple-element,.mat-raised-button.mat-warn .mat-ripple-element,.mat-fab.mat-warn .mat-ripple-element,.mat-mini-fab.mat-warn .mat-ripple-element{background-color:rgba(255,255,255,0.1)}.mat-stroked-button:not([class*='mat-elevation-z']),.mat-flat-button:not([class*='mat-elevation-z']){box-shadow:0px 0px 0px 0px rgba(0,0,0,0.2),0px 0px 0px 0px rgba(0,0,0,0.14),0px 0px 0px 0px rgba(0,0,0,0.12)}.mat-raised-button:not([class*='mat-elevation-z']){box-shadow:0px 3px 1px -2px rgba(0,0,0,0.2),0px 2px 2px 0px rgba(0,0,0,0.14),0px 1px 5px 0px rgba(0,0,0,0.12)}.mat-raised-button:not([disabled]):active:not([class*='mat-elevation-z']){box-shadow:0px 5px 5px -3px rgba(0,0,0,0.2),0px 8px 10px 1px rgba(0,0,0,0.14),0px 3px 14px 2px rgba(0,0,0,0.12)}.mat-raised-button[disabled]:not([class*='mat-elevation-z']){box-shadow:0px 0px 0px 0px rgba(0,0,0,0.2),0px 0px 0px 0px rgba(0,0,0,0.14),0px 0px 0px 0px rgba(0,0,0,0.12)}.mat-fab:not([class*='mat-elevation-z']),.mat-mini-fab:not([class*='mat-elevation-z']){box-shadow:0px 3px 5px -1px rgba(0,0,0,0.2),0px 6px 10px 0px rgba(0,0,0,0.14),0px 1px 18px 0px rgba(0,0,0,0.12)}.mat-fab:not([disabled]):active:not([class*='mat-elevation-z']),.mat-mini-fab:not([disabled]):active:not([class*='mat-elevation-z']){box-shadow:0px 7px 8px -4px rgba(0,0,0,0.2),0px 12px 17px 2px rgba(0,0,0,0.14),0px 5px 22px 4px rgba(0,0,0,0.12)}.mat-fab[disabled]:not([class*='mat-elevation-z']),.mat-mini-fab[disabled]:not([class*='mat-elevation-z']){box-shadow:0px 0px 0px 0px rgba(0,0,0,0.2),0px 0px 0px 0px rgba(0,0,0,0.14),0px 0px 0px 0px rgba(0,0,0,0.12)}.mat-button-toggle-standalone,.mat-button-toggle-group{box-shadow:0px 3px 1px -2px rgba(0,0,0,0.2),0px 2px 2px 0px rgba(0,0,0,0.14),0px 1px 5px 0px rgba(0,0,0,0.12)}.mat-button-toggle-standalone.mat-button-toggle-appearance-standard,.mat-button-toggle-group-appearance-standard{box-shadow:none}.mat-button-toggle{color:rgba(0,0,0,0.38)}.mat-button-toggle .mat-button-toggle-focus-overlay{background-color:rgba(0,0,0,0.12)}.mat-button-toggle-appearance-standard{color:rgba(0,0,0,0.87);background:#fff}.mat-button-toggle-appearance-standard .mat-button-toggle-focus-overlay{background-color:#000}.mat-button-toggle-group-appearance-standard .mat-button-toggle+.mat-button-toggle{border-left:solid 1px rgba(0,0,0,0.12)}[dir='rtl'] .mat-button-toggle-group-appearance-standard .mat-button-toggle+.mat-button-toggle{border-left:none;border-right:solid 1px rgba(0,0,0,0.12)}.mat-button-toggle-group-appearance-standard.mat-button-toggle-vertical .mat-button-toggle+.mat-button-toggle{border-left:none;border-right:none;border-top:solid 1px rgba(0,0,0,0.12)}.mat-button-toggle-checked{background-color:#e0e0e0;color:rgba(0,0,0,0.54)}.mat-button-toggle-checked.mat-button-toggle-appearance-standard{color:rgba(0,0,0,0.87)}.mat-button-toggle-disabled{color:rgba(0,0,0,0.26);background-color:#eee}.mat-button-toggle-disabled.mat-button-toggle-appearance-standard{background:#fff}.mat-button-toggle-disabled.mat-button-toggle-checked{background-color:#bdbdbd}.mat-button-toggle-standalone.mat-button-toggle-appearance-standard,.mat-button-toggle-group-appearance-standard{border:solid 1px rgba(0,0,0,0.12)}.mat-card{background:#fff;color:rgba(0,0,0,0.87)}.mat-card:not([class*='mat-elevation-z']){box-shadow:0px 2px 1px -1px rgba(0,0,0,0.2),0px 1px 1px 0px rgba(0,0,0,0.14),0px 1px 3px 0px rgba(0,0,0,0.12)}.mat-card.mat-card-flat:not([class*='mat-elevation-z']){box-shadow:0px 0px 0px 0px rgba(0,0,0,0.2),0px 0px 0px 0px rgba(0,0,0,0.14),0px 0px 0px 0px rgba(0,0,0,0.12)}.mat-card-subtitle{color:rgba(0,0,0,0.54)}.mat-checkbox-frame{border-color:rgba(0,0,0,0.54)}.mat-checkbox-checkmark{fill:#fafafa}.mat-checkbox-checkmark-path{stroke:#fafafa !important}@media (-ms-high-contrast: black-on-white){.mat-checkbox-checkmark-path{stroke:#000 !important}}.mat-checkbox-mixedmark{background-color:#fafafa}.mat-checkbox-indeterminate.mat-primary .mat-checkbox-background,.mat-checkbox-checked.mat-primary .mat-checkbox-background{background-color:#135f7f}.mat-checkbox-indeterminate.mat-accent .mat-checkbox-background,.mat-checkbox-checked.mat-accent .mat-checkbox-background{background-color:#006841}.mat-checkbox-indeterminate.mat-warn .mat-checkbox-background,.mat-checkbox-checked.mat-warn .mat-checkbox-background{background-color:#8e3e52}.mat-checkbox-disabled.mat-checkbox-checked .mat-checkbox-background,.mat-checkbox-disabled.mat-checkbox-indeterminate .mat-checkbox-background{background-color:#b0b0b0}.mat-checkbox-disabled:not(.mat-checkbox-checked) .mat-checkbox-frame{border-color:#b0b0b0}.mat-checkbox-disabled .mat-checkbox-label{color:rgba(0,0,0,0.54)}@media (-ms-high-contrast: active){.mat-checkbox-disabled{opacity:0.5}}@media (-ms-high-contrast: active){.mat-checkbox-background{background:none}}.mat-checkbox .mat-ripple-element{background-color:#000}.mat-checkbox-checked:not(.mat-checkbox-disabled).mat-primary .mat-ripple-element,.mat-checkbox:active:not(.mat-checkbox-disabled).mat-primary .mat-ripple-element{background:#135f7f}.mat-checkbox-checked:not(.mat-checkbox-disabled).mat-accent .mat-ripple-element,.mat-checkbox:active:not(.mat-checkbox-disabled).mat-accent .mat-ripple-element{background:#006841}.mat-checkbox-checked:not(.mat-checkbox-disabled).mat-warn .mat-ripple-element,.mat-checkbox:active:not(.mat-checkbox-disabled).mat-warn .mat-ripple-element{background:#8e3e52}.mat-chip.mat-standard-chip{background-color:#e0e0e0;color:rgba(0,0,0,0.87)}.mat-chip.mat-standard-chip .mat-chip-remove{color:rgba(0,0,0,0.87);opacity:0.4}.mat-chip.mat-standard-chip:not(.mat-chip-disabled):active{box-shadow:0px 3px 3px -2px rgba(0,0,0,0.2),0px 3px 4px 0px rgba(0,0,0,0.14),0px 1px 8px 0px rgba(0,0,0,0.12)}.mat-chip.mat-standard-chip:not(.mat-chip-disabled) .mat-chip-remove:hover{opacity:0.54}.mat-chip.mat-standard-chip.mat-chip-disabled{opacity:0.4}.mat-chip.mat-standard-chip::after{background:#000}.mat-chip.mat-standard-chip.mat-chip-selected.mat-primary{background-color:#135f7f;color:#fff}.mat-chip.mat-standard-chip.mat-chip-selected.mat-primary .mat-chip-remove{color:#fff;opacity:0.4}.mat-chip.mat-standard-chip.mat-chip-selected.mat-primary .mat-ripple-element{background:rgba(255,255,255,0.1)}.mat-chip.mat-standard-chip.mat-chip-selected.mat-warn{background-color:#8e3e52;color:#fff}.mat-chip.mat-standard-chip.mat-chip-selected.mat-warn .mat-chip-remove{color:#fff;opacity:0.4}.mat-chip.mat-standard-chip.mat-chip-selected.mat-warn .mat-ripple-element{background:rgba(255,255,255,0.1)}.mat-chip.mat-standard-chip.mat-chip-selected.mat-accent{background-color:#006841;color:#fff}.mat-chip.mat-standard-chip.mat-chip-selected.mat-accent .mat-chip-remove{color:#fff;opacity:0.4}.mat-chip.mat-standard-chip.mat-chip-selected.mat-accent .mat-ripple-element{background:rgba(255,255,255,0.1)}.mat-table{background:#fff}.mat-table thead,.mat-table tbody,.mat-table tfoot,mat-header-row,mat-row,mat-footer-row,[mat-header-row],[mat-row],[mat-footer-row],.mat-table-sticky{background:inherit}mat-row,mat-header-row,mat-footer-row,th.mat-header-cell,td.mat-cell,td.mat-footer-cell{border-bottom-color:rgba(0,0,0,0.12)}.mat-header-cell{color:rgba(0,0,0,0.54)}.mat-cell,.mat-footer-cell{color:rgba(0,0,0,0.87)}.mat-calendar-arrow{border-top-color:rgba(0,0,0,0.54)}.mat-datepicker-toggle,.mat-datepicker-content .mat-calendar-next-button,.mat-datepicker-content .mat-calendar-previous-button{color:rgba(0,0,0,0.54)}.mat-calendar-table-header{color:rgba(0,0,0,0.38)}.mat-calendar-table-header-divider::after{background:rgba(0,0,0,0.12)}.mat-calendar-body-label{color:rgba(0,0,0,0.54)}.mat-calendar-body-cell-content{color:rgba(0,0,0,0.87);border-color:transparent}.mat-calendar-body-disabled>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected){color:rgba(0,0,0,0.38)}.mat-calendar-body-cell:not(.mat-calendar-body-disabled):hover>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected),.cdk-keyboard-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected),.cdk-program-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected){background-color:rgba(0,0,0,0.04)}.mat-calendar-body-today:not(.mat-calendar-body-selected){border-color:rgba(0,0,0,0.38)}.mat-calendar-body-disabled>.mat-calendar-body-today:not(.mat-calendar-body-selected){border-color:rgba(0,0,0,0.18)}.mat-calendar-body-selected{background-color:#135f7f;color:#fff}.mat-calendar-body-disabled>.mat-calendar-body-selected{background-color:rgba(19,95,127,0.4)}.mat-calendar-body-today.mat-calendar-body-selected{box-shadow:inset 0 0 0 1px #fff}.mat-datepicker-content{box-shadow:0px 2px 4px -1px rgba(0,0,0,0.2),0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12);background-color:#fff;color:rgba(0,0,0,0.87)}.mat-datepicker-content.mat-accent .mat-calendar-body-selected{background-color:#006841;color:#fff}.mat-datepicker-content.mat-accent .mat-calendar-body-disabled>.mat-calendar-body-selected{background-color:rgba(0,104,65,0.4)}.mat-datepicker-content.mat-accent .mat-calendar-body-today.mat-calendar-body-selected{box-shadow:inset 0 0 0 1px #fff}.mat-datepicker-content.mat-warn .mat-calendar-body-selected{background-color:#8e3e52;color:#fff}.mat-datepicker-content.mat-warn .mat-calendar-body-disabled>.mat-calendar-body-selected{background-color:rgba(142,62,82,0.4)}.mat-datepicker-content.mat-warn .mat-calendar-body-today.mat-calendar-body-selected{box-shadow:inset 0 0 0 1px #fff}.mat-datepicker-content-touch{box-shadow:0px 0px 0px 0px rgba(0,0,0,0.2),0px 0px 0px 0px rgba(0,0,0,0.14),0px 0px 0px 0px rgba(0,0,0,0.12)}.mat-datepicker-toggle-active{color:#135f7f}.mat-datepicker-toggle-active.mat-accent{color:#006841}.mat-datepicker-toggle-active.mat-warn{color:#8e3e52}.mat-dialog-container{box-shadow:0px 11px 15px -7px rgba(0,0,0,0.2),0px 24px 38px 3px rgba(0,0,0,0.14),0px 9px 46px 8px rgba(0,0,0,0.12);background:#fff;color:rgba(0,0,0,0.87)}.mat-divider{border-top-color:rgba(0,0,0,0.12)}.mat-divider-vertical{border-right-color:rgba(0,0,0,0.12)}.mat-expansion-panel{background:#fff;color:rgba(0,0,0,0.87)}.mat-expansion-panel:not([class*='mat-elevation-z']){box-shadow:0px 3px 1px -2px rgba(0,0,0,0.2),0px 2px 2px 0px rgba(0,0,0,0.14),0px 1px 5px 0px rgba(0,0,0,0.12)}.mat-action-row{border-top-color:rgba(0,0,0,0.12)}.mat-expansion-panel .mat-expansion-panel-header.cdk-keyboard-focused:not([aria-disabled='true']),.mat-expansion-panel .mat-expansion-panel-header.cdk-program-focused:not([aria-disabled='true']),.mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:hover:not([aria-disabled='true']){background:rgba(0,0,0,0.04)}@media (hover: none){.mat-expansion-panel:not(.mat-expanded):not([aria-disabled='true']) .mat-expansion-panel-header:hover{background:#fff}}.mat-expansion-panel-header-title{color:rgba(0,0,0,0.87)}.mat-expansion-panel-header-description,.mat-expansion-indicator::after{color:rgba(0,0,0,0.54)}.mat-expansion-panel-header[aria-disabled='true']{color:rgba(0,0,0,0.26)}.mat-expansion-panel-header[aria-disabled='true'] .mat-expansion-panel-header-title,.mat-expansion-panel-header[aria-disabled='true'] .mat-expansion-panel-header-description{color:inherit}.mat-form-field-label{color:rgba(0,0,0,0.6)}.mat-hint{color:rgba(0,0,0,0.6)}.mat-form-field.mat-focused .mat-form-field-label{color:#135f7f}.mat-form-field.mat-focused .mat-form-field-label.mat-accent{color:#006841}.mat-form-field.mat-focused .mat-form-field-label.mat-warn{color:#8e3e52}.mat-focused .mat-form-field-required-marker{color:#006841}.mat-form-field-ripple{background-color:rgba(0,0,0,0.87)}.mat-form-field.mat-focused .mat-form-field-ripple{background-color:#135f7f}.mat-form-field.mat-focused .mat-form-field-ripple.mat-accent{background-color:#006841}.mat-form-field.mat-focused .mat-form-field-ripple.mat-warn{background-color:#8e3e52}.mat-form-field-type-mat-native-select.mat-focused:not(.mat-form-field-invalid) .mat-form-field-infix::after{color:#135f7f}.mat-form-field-type-mat-native-select.mat-focused:not(.mat-form-field-invalid).mat-accent .mat-form-field-infix::after{color:#006841}.mat-form-field-type-mat-native-select.mat-focused:not(.mat-form-field-invalid).mat-warn .mat-form-field-infix::after{color:#8e3e52}.mat-form-field.mat-form-field-invalid .mat-form-field-label{color:#8e3e52}.mat-form-field.mat-form-field-invalid .mat-form-field-label.mat-accent,.mat-form-field.mat-form-field-invalid .mat-form-field-label .mat-form-field-required-marker{color:#8e3e52}.mat-form-field.mat-form-field-invalid .mat-form-field-ripple,.mat-form-field.mat-form-field-invalid .mat-form-field-ripple.mat-accent{background-color:#8e3e52}.mat-error{color:#8e3e52}.mat-form-field-appearance-legacy .mat-form-field-label{color:rgba(0,0,0,0.54)}.mat-form-field-appearance-legacy .mat-hint{color:rgba(0,0,0,0.54)}.mat-form-field-appearance-legacy .mat-form-field-underline{background-color:rgba(0,0,0,0.42)}.mat-form-field-appearance-legacy.mat-form-field-disabled .mat-form-field-underline{background-image:linear-gradient(to right, rgba(0,0,0,0.42) 0%, rgba(0,0,0,0.42) 33%, transparent 0%);background-size:4px 100%;background-repeat:repeat-x}.mat-form-field-appearance-standard .mat-form-field-underline{background-color:rgba(0,0,0,0.42)}.mat-form-field-appearance-standard.mat-form-field-disabled .mat-form-field-underline{background-image:linear-gradient(to right, rgba(0,0,0,0.42) 0%, rgba(0,0,0,0.42) 33%, transparent 0%);background-size:4px 100%;background-repeat:repeat-x}.mat-form-field-appearance-fill .mat-form-field-flex{background-color:rgba(0,0,0,0.04)}.mat-form-field-appearance-fill.mat-form-field-disabled .mat-form-field-flex{background-color:rgba(0,0,0,0.02)}.mat-form-field-appearance-fill .mat-form-field-underline::before{background-color:rgba(0,0,0,0.42)}.mat-form-field-appearance-fill.mat-form-field-disabled .mat-form-field-label{color:rgba(0,0,0,0.38)}.mat-form-field-appearance-fill.mat-form-field-disabled .mat-form-field-underline::before{background-color:transparent}.mat-form-field-appearance-outline .mat-form-field-outline{color:rgba(0,0,0,0.12)}.mat-form-field-appearance-outline .mat-form-field-outline-thick{color:rgba(0,0,0,0.87)}.mat-form-field-appearance-outline.mat-focused .mat-form-field-outline-thick{color:#135f7f}.mat-form-field-appearance-outline.mat-focused.mat-accent .mat-form-field-outline-thick{color:#006841}.mat-form-field-appearance-outline.mat-focused.mat-warn .mat-form-field-outline-thick{color:#8e3e52}.mat-form-field-appearance-outline.mat-form-field-invalid.mat-form-field-invalid .mat-form-field-outline-thick{color:#8e3e52}.mat-form-field-appearance-outline.mat-form-field-disabled .mat-form-field-label{color:rgba(0,0,0,0.38)}.mat-form-field-appearance-outline.mat-form-field-disabled .mat-form-field-outline{color:rgba(0,0,0,0.06)}.mat-icon.mat-primary{color:#135f7f}.mat-icon.mat-accent{color:#006841}.mat-icon.mat-warn{color:#8e3e52}.mat-form-field-type-mat-native-select .mat-form-field-infix::after{color:rgba(0,0,0,0.54)}.mat-input-element:disabled,.mat-form-field-type-mat-native-select.mat-form-field-disabled .mat-form-field-infix::after{color:rgba(0,0,0,0.38)}.mat-input-element{caret-color:#135f7f}.mat-input-element::placeholder{color:rgba(0,0,0,0.42)}.mat-input-element::-moz-placeholder{color:rgba(0,0,0,0.42)}.mat-input-element::-webkit-input-placeholder{color:rgba(0,0,0,0.42)}.mat-input-element:-ms-input-placeholder{color:rgba(0,0,0,0.42)}.mat-accent .mat-input-element{caret-color:#006841}.mat-warn .mat-input-element,.mat-form-field-invalid .mat-input-element{caret-color:#8e3e52}.mat-form-field-type-mat-native-select.mat-form-field-invalid .mat-form-field-infix::after{color:#8e3e52}.mat-list-base .mat-list-item{color:rgba(0,0,0,0.87)}.mat-list-base .mat-list-option{color:rgba(0,0,0,0.87)}.mat-list-base .mat-subheader{color:rgba(0,0,0,0.54)}.mat-list-item-disabled{background-color:#eee}.mat-list-option:hover,.mat-list-option:focus,.mat-nav-list .mat-list-item:hover,.mat-nav-list .mat-list-item:focus,.mat-action-list .mat-list-item:hover,.mat-action-list .mat-list-item:focus{background:rgba(0,0,0,0.04)}.mat-menu-panel{background:#fff}.mat-menu-panel:not([class*='mat-elevation-z']){box-shadow:0px 2px 4px -1px rgba(0,0,0,0.2),0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12)}.mat-menu-item{background:transparent;color:rgba(0,0,0,0.87)}.mat-menu-item[disabled],.mat-menu-item[disabled]::after{color:rgba(0,0,0,0.38)}.mat-menu-item .mat-icon-no-color,.mat-menu-item-submenu-trigger::after{color:rgba(0,0,0,0.54)}.mat-menu-item:hover:not([disabled]),.mat-menu-item.cdk-program-focused:not([disabled]),.mat-menu-item.cdk-keyboard-focused:not([disabled]),.mat-menu-item-highlighted:not([disabled]){background:rgba(0,0,0,0.04)}.mat-paginator{background:#fff}.mat-paginator,.mat-paginator-page-size .mat-select-trigger{color:rgba(0,0,0,0.54)}.mat-paginator-decrement,.mat-paginator-increment{border-top:2px solid rgba(0,0,0,0.54);border-right:2px solid rgba(0,0,0,0.54)}.mat-paginator-first,.mat-paginator-last{border-top:2px solid rgba(0,0,0,0.54)}.mat-icon-button[disabled] .mat-paginator-decrement,.mat-icon-button[disabled] .mat-paginator-increment,.mat-icon-button[disabled] .mat-paginator-first,.mat-icon-button[disabled] .mat-paginator-last{border-color:rgba(0,0,0,0.38)}.mat-progress-bar-background{fill:#1a80ab}.mat-progress-bar-buffer{background-color:#1a80ab}.mat-progress-bar-fill::after{background-color:#135f7f}.mat-progress-bar.mat-accent .mat-progress-bar-background{fill:#009b61}.mat-progress-bar.mat-accent .mat-progress-bar-buffer{background-color:#009b61}.mat-progress-bar.mat-accent .mat-progress-bar-fill::after{background-color:#006841}.mat-progress-bar.mat-warn .mat-progress-bar-background{fill:#b24e67}.mat-progress-bar.mat-warn .mat-progress-bar-buffer{background-color:#b24e67}.mat-progress-bar.mat-warn .mat-progress-bar-fill::after{background-color:#8e3e52}.mat-progress-spinner circle,.mat-spinner circle{stroke:#135f7f}.mat-progress-spinner.mat-accent circle,.mat-spinner.mat-accent circle{stroke:#006841}.mat-progress-spinner.mat-warn circle,.mat-spinner.mat-warn circle{stroke:#8e3e52}.mat-radio-outer-circle{border-color:rgba(0,0,0,0.54)}.mat-radio-button.mat-primary.mat-radio-checked .mat-radio-outer-circle{border-color:#135f7f}.mat-radio-button.mat-primary .mat-radio-inner-circle,.mat-radio-button.mat-primary .mat-radio-ripple .mat-ripple-element:not(.mat-radio-persistent-ripple),.mat-radio-button.mat-primary.mat-radio-checked .mat-radio-persistent-ripple,.mat-radio-button.mat-primary:active .mat-radio-persistent-ripple{background-color:#135f7f}.mat-radio-button.mat-accent.mat-radio-checked .mat-radio-outer-circle{border-color:#006841}.mat-radio-button.mat-accent .mat-radio-inner-circle,.mat-radio-button.mat-accent .mat-radio-ripple .mat-ripple-element:not(.mat-radio-persistent-ripple),.mat-radio-button.mat-accent.mat-radio-checked .mat-radio-persistent-ripple,.mat-radio-button.mat-accent:active .mat-radio-persistent-ripple{background-color:#006841}.mat-radio-button.mat-warn.mat-radio-checked .mat-radio-outer-circle{border-color:#8e3e52}.mat-radio-button.mat-warn .mat-radio-inner-circle,.mat-radio-button.mat-warn .mat-radio-ripple .mat-ripple-element:not(.mat-radio-persistent-ripple),.mat-radio-button.mat-warn.mat-radio-checked .mat-radio-persistent-ripple,.mat-radio-button.mat-warn:active .mat-radio-persistent-ripple{background-color:#8e3e52}.mat-radio-button.mat-radio-disabled.mat-radio-checked .mat-radio-outer-circle,.mat-radio-button.mat-radio-disabled .mat-radio-outer-circle{border-color:rgba(0,0,0,0.38)}.mat-radio-button.mat-radio-disabled .mat-radio-ripple .mat-ripple-element,.mat-radio-button.mat-radio-disabled .mat-radio-inner-circle{background-color:rgba(0,0,0,0.38)}.mat-radio-button.mat-radio-disabled .mat-radio-label-content{color:rgba(0,0,0,0.38)}.mat-radio-button .mat-ripple-element{background-color:#000}.mat-select-value{color:rgba(0,0,0,0.87)}.mat-select-placeholder{color:rgba(0,0,0,0.42)}.mat-select-disabled .mat-select-value{color:rgba(0,0,0,0.38)}.mat-select-arrow{color:rgba(0,0,0,0.54)}.mat-select-panel{background:#fff}.mat-select-panel:not([class*='mat-elevation-z']){box-shadow:0px 2px 4px -1px rgba(0,0,0,0.2),0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12)}.mat-select-panel .mat-option.mat-selected:not(.mat-option-multiple){background:rgba(0,0,0,0.12)}.mat-form-field.mat-focused.mat-primary .mat-select-arrow{color:#135f7f}.mat-form-field.mat-focused.mat-accent .mat-select-arrow{color:#006841}.mat-form-field.mat-focused.mat-warn .mat-select-arrow{color:#8e3e52}.mat-form-field .mat-select.mat-select-invalid .mat-select-arrow{color:#8e3e52}.mat-form-field .mat-select.mat-select-disabled .mat-select-arrow{color:rgba(0,0,0,0.38)}.mat-drawer-container{background-color:#fafafa;color:rgba(0,0,0,0.87)}.mat-drawer{background-color:#fff;color:rgba(0,0,0,0.87)}.mat-drawer.mat-drawer-push{background-color:#fff}.mat-drawer:not(.mat-drawer-side){box-shadow:0px 8px 10px -5px rgba(0,0,0,0.2),0px 16px 24px 2px rgba(0,0,0,0.14),0px 6px 30px 5px rgba(0,0,0,0.12)}.mat-drawer-side{border-right:solid 1px rgba(0,0,0,0.12)}.mat-drawer-side.mat-drawer-end{border-left:solid 1px rgba(0,0,0,0.12);border-right:none}[dir='rtl'] .mat-drawer-side{border-left:solid 1px rgba(0,0,0,0.12);border-right:none}[dir='rtl'] .mat-drawer-side.mat-drawer-end{border-left:none;border-right:solid 1px rgba(0,0,0,0.12)}.mat-drawer-backdrop.mat-drawer-shown{background-color:rgba(0,0,0,0.6)}.mat-slide-toggle.mat-checked .mat-slide-toggle-thumb{background-color:#006841}.mat-slide-toggle.mat-checked .mat-slide-toggle-bar{background-color:rgba(0,104,65,0.54)}.mat-slide-toggle.mat-checked .mat-ripple-element{background-color:#006841}.mat-slide-toggle.mat-primary.mat-checked .mat-slide-toggle-thumb{background-color:#135f7f}.mat-slide-toggle.mat-primary.mat-checked .mat-slide-toggle-bar{background-color:rgba(19,95,127,0.54)}.mat-slide-toggle.mat-primary.mat-checked .mat-ripple-element{background-color:#135f7f}.mat-slide-toggle.mat-warn.mat-checked .mat-slide-toggle-thumb{background-color:#8e3e52}.mat-slide-toggle.mat-warn.mat-checked .mat-slide-toggle-bar{background-color:rgba(142,62,82,0.54)}.mat-slide-toggle.mat-warn.mat-checked .mat-ripple-element{background-color:#8e3e52}.mat-slide-toggle:not(.mat-checked) .mat-ripple-element{background-color:#000}.mat-slide-toggle-thumb{box-shadow:0px 2px 1px -1px rgba(0,0,0,0.2),0px 1px 1px 0px rgba(0,0,0,0.14),0px 1px 3px 0px rgba(0,0,0,0.12);background-color:#fafafa}.mat-slide-toggle-bar{background-color:rgba(0,0,0,0.38)}.mat-slider-track-background{background-color:rgba(0,0,0,0.26)}.mat-primary .mat-slider-track-fill,.mat-primary .mat-slider-thumb,.mat-primary .mat-slider-thumb-label{background-color:#135f7f}.mat-primary .mat-slider-thumb-label-text{color:#fff}.mat-accent .mat-slider-track-fill,.mat-accent .mat-slider-thumb,.mat-accent .mat-slider-thumb-label{background-color:#006841}.mat-accent .mat-slider-thumb-label-text{color:#fff}.mat-warn .mat-slider-track-fill,.mat-warn .mat-slider-thumb,.mat-warn .mat-slider-thumb-label{background-color:#8e3e52}.mat-warn .mat-slider-thumb-label-text{color:#fff}.mat-slider-focus-ring{background-color:rgba(0,104,65,0.2)}.mat-slider:hover .mat-slider-track-background,.cdk-focused .mat-slider-track-background{background-color:rgba(0,0,0,0.38)}.mat-slider-disabled .mat-slider-track-background,.mat-slider-disabled .mat-slider-track-fill,.mat-slider-disabled .mat-slider-thumb{background-color:rgba(0,0,0,0.26)}.mat-slider-disabled:hover .mat-slider-track-background{background-color:rgba(0,0,0,0.26)}.mat-slider-min-value .mat-slider-focus-ring{background-color:rgba(0,0,0,0.12)}.mat-slider-min-value.mat-slider-thumb-label-showing .mat-slider-thumb,.mat-slider-min-value.mat-slider-thumb-label-showing .mat-slider-thumb-label{background-color:rgba(0,0,0,0.87)}.mat-slider-min-value.mat-slider-thumb-label-showing.cdk-focused .mat-slider-thumb,.mat-slider-min-value.mat-slider-thumb-label-showing.cdk-focused .mat-slider-thumb-label{background-color:rgba(0,0,0,0.26)}.mat-slider-min-value:not(.mat-slider-thumb-label-showing) .mat-slider-thumb{border-color:rgba(0,0,0,0.26);background-color:transparent}.mat-slider-min-value:not(.mat-slider-thumb-label-showing):hover .mat-slider-thumb,.mat-slider-min-value:not(.mat-slider-thumb-label-showing).cdk-focused .mat-slider-thumb{border-color:rgba(0,0,0,0.38)}.mat-slider-min-value:not(.mat-slider-thumb-label-showing):hover.mat-slider-disabled .mat-slider-thumb,.mat-slider-min-value:not(.mat-slider-thumb-label-showing).cdk-focused.mat-slider-disabled .mat-slider-thumb{border-color:rgba(0,0,0,0.26)}.mat-slider-has-ticks .mat-slider-wrapper::after{border-color:rgba(0,0,0,0.7)}.mat-slider-horizontal .mat-slider-ticks{background-image:repeating-linear-gradient(to right, rgba(0,0,0,0.7), rgba(0,0,0,0.7) 2px, transparent 0, transparent);background-image:-moz-repeating-linear-gradient(0.0001deg, rgba(0,0,0,0.7), rgba(0,0,0,0.7) 2px, transparent 0, transparent)}.mat-slider-vertical .mat-slider-ticks{background-image:repeating-linear-gradient(to bottom, rgba(0,0,0,0.7), rgba(0,0,0,0.7) 2px, transparent 0, transparent)}.mat-step-header.cdk-keyboard-focused,.mat-step-header.cdk-program-focused,.mat-step-header:hover{background-color:rgba(0,0,0,0.04)}@media (hover: none){.mat-step-header:hover{background:none}}.mat-step-header .mat-step-label,.mat-step-header .mat-step-optional{color:rgba(0,0,0,0.54)}.mat-step-header .mat-step-icon{background-color:rgba(0,0,0,0.54);color:#fff}.mat-step-header .mat-step-icon-selected,.mat-step-header .mat-step-icon-state-done,.mat-step-header .mat-step-icon-state-edit{background-color:#135f7f;color:#fff}.mat-step-header .mat-step-icon-state-error{background-color:transparent;color:#8e3e52}.mat-step-header .mat-step-label.mat-step-label-active{color:rgba(0,0,0,0.87)}.mat-step-header .mat-step-label.mat-step-label-error{color:#8e3e52}.mat-stepper-horizontal,.mat-stepper-vertical{background-color:#fff}.mat-stepper-vertical-line::before{border-left-color:rgba(0,0,0,0.12)}.mat-horizontal-stepper-header::before,.mat-horizontal-stepper-header::after,.mat-stepper-horizontal-line{border-top-color:rgba(0,0,0,0.12)}.mat-sort-header-arrow{color:#757575}.mat-tab-nav-bar,.mat-tab-header{border-bottom:1px solid rgba(0,0,0,0.12)}.mat-tab-group-inverted-header .mat-tab-nav-bar,.mat-tab-group-inverted-header .mat-tab-header{border-top:1px solid rgba(0,0,0,0.12);border-bottom:none}.mat-tab-label,.mat-tab-link{color:rgba(0,0,0,0.87)}.mat-tab-label.mat-tab-disabled,.mat-tab-link.mat-tab-disabled{color:rgba(0,0,0,0.38)}.mat-tab-header-pagination-chevron{border-color:rgba(0,0,0,0.87)}.mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(0,0,0,0.38)}.mat-tab-group[class*='mat-background-'] .mat-tab-header,.mat-tab-nav-bar[class*='mat-background-']{border-bottom:none;border-top:none}.mat-tab-group.mat-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(26,128,171,0.3)}.mat-tab-group.mat-primary .mat-ink-bar,.mat-tab-nav-bar.mat-primary .mat-ink-bar{background-color:#135f7f}.mat-tab-group.mat-primary.mat-background-primary .mat-ink-bar,.mat-tab-nav-bar.mat-primary.mat-background-primary .mat-ink-bar{background-color:#fff}.mat-tab-group.mat-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(0,155,97,0.3)}.mat-tab-group.mat-accent .mat-ink-bar,.mat-tab-nav-bar.mat-accent .mat-ink-bar{background-color:#006841}.mat-tab-group.mat-accent.mat-background-accent .mat-ink-bar,.mat-tab-nav-bar.mat-accent.mat-background-accent .mat-ink-bar{background-color:#fff}.mat-tab-group.mat-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(178,78,103,0.3)}.mat-tab-group.mat-warn .mat-ink-bar,.mat-tab-nav-bar.mat-warn .mat-ink-bar{background-color:#8e3e52}.mat-tab-group.mat-warn.mat-background-warn .mat-ink-bar,.mat-tab-nav-bar.mat-warn.mat-background-warn .mat-ink-bar{background-color:#fff}.mat-tab-group.mat-background-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(26,128,171,0.3)}.mat-tab-group.mat-background-primary .mat-tab-header,.mat-tab-group.mat-background-primary .mat-tab-links,.mat-tab-group.mat-background-primary .mat-tab-header-pagination,.mat-tab-nav-bar.mat-background-primary .mat-tab-header,.mat-tab-nav-bar.mat-background-primary .mat-tab-links,.mat-tab-nav-bar.mat-background-primary .mat-tab-header-pagination{background-color:#135f7f}.mat-tab-group.mat-background-primary .mat-tab-label,.mat-tab-group.mat-background-primary .mat-tab-link,.mat-tab-nav-bar.mat-background-primary .mat-tab-label,.mat-tab-nav-bar.mat-background-primary .mat-tab-link{color:#fff}.mat-tab-group.mat-background-primary .mat-tab-label.mat-tab-disabled,.mat-tab-group.mat-background-primary .mat-tab-link.mat-tab-disabled,.mat-tab-nav-bar.mat-background-primary .mat-tab-label.mat-tab-disabled,.mat-tab-nav-bar.mat-background-primary .mat-tab-link.mat-tab-disabled{color:rgba(255,255,255,0.4)}.mat-tab-group.mat-background-primary .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-primary .mat-tab-header-pagination-chevron{border-color:#fff}.mat-tab-group.mat-background-primary .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-primary .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(255,255,255,0.4)}.mat-tab-group.mat-background-primary .mat-ripple-element,.mat-tab-nav-bar.mat-background-primary .mat-ripple-element{background-color:rgba(255,255,255,0.12)}.mat-tab-group.mat-background-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(0,155,97,0.3)}.mat-tab-group.mat-background-accent .mat-tab-header,.mat-tab-group.mat-background-accent .mat-tab-links,.mat-tab-group.mat-background-accent .mat-tab-header-pagination,.mat-tab-nav-bar.mat-background-accent .mat-tab-header,.mat-tab-nav-bar.mat-background-accent .mat-tab-links,.mat-tab-nav-bar.mat-background-accent .mat-tab-header-pagination{background-color:#006841}.mat-tab-group.mat-background-accent .mat-tab-label,.mat-tab-group.mat-background-accent .mat-tab-link,.mat-tab-nav-bar.mat-background-accent .mat-tab-label,.mat-tab-nav-bar.mat-background-accent .mat-tab-link{color:#fff}.mat-tab-group.mat-background-accent .mat-tab-label.mat-tab-disabled,.mat-tab-group.mat-background-accent .mat-tab-link.mat-tab-disabled,.mat-tab-nav-bar.mat-background-accent .mat-tab-label.mat-tab-disabled,.mat-tab-nav-bar.mat-background-accent .mat-tab-link.mat-tab-disabled{color:rgba(255,255,255,0.4)}.mat-tab-group.mat-background-accent .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-accent .mat-tab-header-pagination-chevron{border-color:#fff}.mat-tab-group.mat-background-accent .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-accent .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(255,255,255,0.4)}.mat-tab-group.mat-background-accent .mat-ripple-element,.mat-tab-nav-bar.mat-background-accent .mat-ripple-element{background-color:rgba(255,255,255,0.12)}.mat-tab-group.mat-background-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(178,78,103,0.3)}.mat-tab-group.mat-background-warn .mat-tab-header,.mat-tab-group.mat-background-warn .mat-tab-links,.mat-tab-group.mat-background-warn .mat-tab-header-pagination,.mat-tab-nav-bar.mat-background-warn .mat-tab-header,.mat-tab-nav-bar.mat-background-warn .mat-tab-links,.mat-tab-nav-bar.mat-background-warn .mat-tab-header-pagination{background-color:#8e3e52}.mat-tab-group.mat-background-warn .mat-tab-label,.mat-tab-group.mat-background-warn .mat-tab-link,.mat-tab-nav-bar.mat-background-warn .mat-tab-label,.mat-tab-nav-bar.mat-background-warn .mat-tab-link{color:#fff}.mat-tab-group.mat-background-warn .mat-tab-label.mat-tab-disabled,.mat-tab-group.mat-background-warn .mat-tab-link.mat-tab-disabled,.mat-tab-nav-bar.mat-background-warn .mat-tab-label.mat-tab-disabled,.mat-tab-nav-bar.mat-background-warn .mat-tab-link.mat-tab-disabled{color:rgba(255,255,255,0.4)}.mat-tab-group.mat-background-warn .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-warn .mat-tab-header-pagination-chevron{border-color:#fff}.mat-tab-group.mat-background-warn .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-warn .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(255,255,255,0.4)}.mat-tab-group.mat-background-warn .mat-ripple-element,.mat-tab-nav-bar.mat-background-warn .mat-ripple-element{background-color:rgba(255,255,255,0.12)}.mat-toolbar{background:#f5f5f5;color:rgba(0,0,0,0.87)}.mat-toolbar.mat-primary{background:#135f7f;color:#fff}.mat-toolbar.mat-accent{background:#006841;color:#fff}.mat-toolbar.mat-warn{background:#8e3e52;color:#fff}.mat-toolbar .mat-form-field-underline,.mat-toolbar .mat-form-field-ripple,.mat-toolbar .mat-focused .mat-form-field-ripple{background-color:currentColor}.mat-toolbar .mat-form-field-label,.mat-toolbar .mat-focused .mat-form-field-label,.mat-toolbar .mat-select-value,.mat-toolbar .mat-select-arrow,.mat-toolbar .mat-form-field.mat-focused .mat-select-arrow{color:inherit}.mat-toolbar .mat-input-element{caret-color:currentColor}.mat-tooltip{background:rgba(97,97,97,0.9)}.mat-tree{background:#fff}.mat-tree-node,.mat-nested-tree-node{color:rgba(0,0,0,0.87)}.mat-snack-bar-container{color:rgba(255,255,255,0.7);background:#323232;box-shadow:0px 3px 5px -1px rgba(0,0,0,0.2),0px 6px 10px 0px rgba(0,0,0,0.14),0px 1px 18px 0px rgba(0,0,0,0.12)}.mat-simple-snackbar-action{color:#006841}[color=primary]{color:#135f7f}[color=secondary]{color:#F99830}[color=warn]{color:#8e3e52}[color=accent]{color:#006841}[bgcolor=primary]{background-color:#135f7f}[bgcolor=warn]{background-color:#8e3e52}[bgcolor=accent]{background-color:#006841}.jstree-proton .jstree-clicked{background:#1a80ab !important}.jstree-proton :not(.jstree-disabled).jstree-hovered{background:#1a80ab !important;box-shadow:inset 0 0 1px #135f7f !important}.jstree-proton .jstree-disabled:hover{cursor:not-allowed}.dndFile{border:dashed 5px grey;padding:10px;text-align:center;opacity:0.5;font-size:15px;font-weight:bolder;margin:20px}.dndFileHighlighted{opacity:1 !important;border:dashed 5px #135f7f !important;color:#135f7f}.cdk-textarea-autosize{min-height:18px !important} diff --git a/src/frontend/lang/lang-en.ts b/src/frontend/lang/lang-en.ts index f5071c978c8e6b5845543c7f2b572d102a80469f..64d66dc99731884266a860898f8226daa7214f39 100755 --- a/src/frontend/lang/lang-en.ts +++ b/src/frontend/lang/lang-en.ts @@ -324,7 +324,7 @@ export const LANG_EN = { "eachMinute" : "Each minute", "eachMonth" : "Each month", "editAttachment" : "Edit the attachment", - "editingAttachmentInterrupted" : "Editing of the attachment has been interrupted. <br/>><sub>Please re-edit it.</sub>", + "editingAttachmentInterrupted" : "Editing of the attachment has been interrupted. <br/><sub>Please re-edit it.</sub>", "editModelFirst" : "Please edit model first", "edtion" : "Edition", "electronicTemplate" : "Electronic template", @@ -722,7 +722,7 @@ export const LANG_EN = { "processType" : "Process type", "production" : "PRODUCTION", "progression" : "Progression", - "pswReseted" : "Password reseted", + "pswReseted" : "Password reset", "public" : "Public", "putInSendAttach" : "Put in send attachement Maileva", "putInSignatureBook" : "Put in signature book", @@ -1408,8 +1408,8 @@ export const LANG_EN = { "closeFullscreen" : "Disable fullscreen", "hasNoEntity": "Those mails do not have initiator entity", "destUserSetToDefault": "Assignee will be the assignee of the initiator entity template list", - "resetVisaWorkflow": "The workflow will be <b>reseted</b>, this document will send back to first assignee", - "resetVisaWorkflowUser": "The workflow will be <b>reseted</b>, this document will send back to", + "resetVisaWorkflow": "The workflow will be <b>reset</b>, this circuit will be reset to first assignee", + "resetVisaWorkflowUser": "The workflow will be <b>reset</b>, this circuit will be reset to", "interruptVisaWorkflow": "The following users will not be able to target mail", "rejectVisaBack": "Document will be send to the previous user", "rejectVisaBackUser": "Document will be send back to", @@ -1435,4 +1435,14 @@ export const LANG_EN = { "validateBy": "Validate by", "validateAvisParallel": "Your are validating an opinion request", "validateAvisParallelSingle": "Your are validating an opinion request of", + "displayWebserviceAccount": "Display webservice account", + "circuitNotStarted": "The workflow has not yet started", + "ADD": "Add", + "UP": "Update", + "DEL": "Delete", + "LOGIN": "Login", + "LOGOUT": "Logout", + "VIEW": "View", + "ERROR": "Error", + "systemActions": "System action(s)", }; diff --git a/src/frontend/lang/lang-fr.ts b/src/frontend/lang/lang-fr.ts index d977e78194bfe1c7e8ac6045b911923ea033b134..526bcc6ab5edd47e18111e2fc0a9234fe371e769 100755 --- a/src/frontend/lang/lang-fr.ts +++ b/src/frontend/lang/lang-fr.ts @@ -609,7 +609,7 @@ export const LANG_FR = { "next" : "Suivant", "no" : "Non", "noAction" : "Aucune action", - "noAttachment" : "Sans pièce jointe", + "noAttachment" : "Aucune pièce jointe", "noAttachmentClickToAddOne" : "Aucune pièce jointe disponible<br/><sub>Cliquez sur <i class=\"fa fa-paperclip fa-lg\" ></i><i class=\"fa fa-plus\"></i> pour en ajouter une.</sub>", "noAttachmentContact" : "Aucun contact attaché pour cette pièce jointe", "noAttachmentConversion" : "La pièce jointe n'a pas de conversion PDF", @@ -1447,16 +1447,16 @@ export const LANG_FR = { "openFullscreen" : "Activer le mode plein écran", "closeFullscreen" : "Désactiver le mode plein écran", "hasNoEntity": "Les courriers suivants n'ont pas d'entité initiatrice", - "destUserSetToDefault": "Le destinataire sera celui de la liste de diffusion de l'entité initiatrice", - "resetVisaWorkflow": "Le circuit va être <b>réinitilisé</b>, le document retournera au premier viseur", - "resetVisaWorkflowUser": "Le circuit va être <b>réinitilisé</b>, le document retournera à ", + "destUserSetToDefault": "L'attributaire sera celui de la liste de diffusion de l'entité initiatrice", + "resetVisaWorkflow": "Le circuit va être <b>réinitialisé</b>, le circuit recommencera à partir du premier viseur", + "resetVisaWorkflowUser": "Le circuit va être <b>réinitialisé</b>, le circuit recommencera à partir de", "interruptVisaWorkflow": "Les utilisateurs suivants ne pourront pas viser le courrier", "rejectVisaBack": "Le courrier sera envoyé à la dernière personne ayant visé", "rejectVisaBackUser": "Le courrier retournera à ", "sendToDocTo": "Vous allez transmettre ce document à ", "endWorkflow": "Vous allez terminer le circuit", - "hasNoAttachmentsNotes": "Les courriers suivants n'ont ni annotation, ni pièces jointes", - "closeMailAddNoteMandatory": "Certains courriers n'ont ni annotation, ni pièces jointes. Merci de saisir une annotation ci-dessous, ou ajoutez une pièce jointe aux courriers.", + "hasNoAttachmentsNotes": "Les courriers suivants n'ont ni annotation, ni pièces jointe", + "closeMailAddNoteMandatory": "Merci de saisir une annotation ci-dessous ou ajouter une pièce jointe aux courriers.", "endedCircuit": "Circuit terminé", "userHasntSigned": "Le signataire n'a pas signé de document", "noCircuitAvailable": "Aucun circuit défini", @@ -1464,15 +1464,25 @@ export const LANG_FR = { "addOpinionReason": "Veuillez renseigner le motif de l'avis", "opinionLimitDate": "Date limite de l'avis", "addOpinion": "Donner votre avis", - "askOpinion": "Des personnes vous demande votre avis", + "askOpinion": "Des personnes vous demandent votre avis", "askOpinionUser": "vous demande votre avis", "avisUserAsk": "pour avis", "avisUserState": "avis", "userNotInDiffusionList": "Vous n'êtes pas dans la liste de diffusion des avis", - "noOpinionLimitDate": "La date limite de l'avis n'est pas défini", + "noOpinionLimitDate": "La date limite de l'avis n'est pas définie", "noOpinionNote": "Aucun motif défini", - "opinionLimitDateOutdated": "La date limit de l'avis est dépassée", + "opinionLimitDateOutdated": "La date limite de l'avis est dépassée", "validateBy": "Validé par", "validateAvisParallel": "Vous allez valider des demandes d'avis", "validateAvisParallelSingle": "Vous allez valider la demande d'avis de", + "displayWebserviceAccount": "Afficher les comptes de webservice", + "circuitNotStarted": "Le circuit n'a pas encore commencé", + "ADD": "Ajout", + "UP": "Modification", + "DEL": "Suppression", + "LOGIN": "Connexion", + "LOGOUT": "Déconnexion", + "VIEW": "Visualisation", + "ERROR": "Erreur", + "systemActions": "Événement(s) système", }; diff --git a/src/frontend/lang/lang-nl.ts b/src/frontend/lang/lang-nl.ts index 06aec503a78fc7834be1c4a5bb11494ace371986..bcb562a846dedab43f98b92cfab98aaa7dce0ca1 100755 --- a/src/frontend/lang/lang-nl.ts +++ b/src/frontend/lang/lang-nl.ts @@ -330,7 +330,7 @@ export const LANG_NL = { "eachMonth" : "Maandelijks", "edirectBaskets" : "De geselecteerde bakjes doorsturen", "editAttachment" : "Edit the attachment", //_TO_TRANSLATE - "editingAttachmentInterrupted" : "Editing of the attachment has been interrupted. <br/>><sub>Please re-edit it. </sub>", //_TO_TRANSLATE + "editingAttachmentInterrupted" : "Editing of the attachment has been interrupted. <br/><sub>Please re-edit it. </sub>", //_TO_TRANSLATE "editModelFirst" : "Gelieve het model te bewerken vooraleer te bevestigen", "edtion" : "Edition", //_TO_TRANSLATE "electronicTemplate" : "Electronic template", //_TO_TRANSLATE @@ -1431,8 +1431,8 @@ export const LANG_NL = { "closeFullscreen" : "Disable fullscreen", //_TO_TRANSLATE "hasNoEntity": "Those mails do not have initiator entity", //_TO_TRANSLATE "destUserSetToDefault": "Assignee will be the assignee of the initiator entity template list", //_TO_TRANSLATE - "resetVisaWorkflow": "The workflow will be <b>reseted</b>, this document will send back to first assignee", //_TO_TRANSLATE - "resetVisaWorkflowUser": "The workflow will be <b>reseted</b>, this document will send back to", //_TO_TRANSLATE + "resetVisaWorkflow": "The workflow will be <b>reset</b>, this circuit will be reset to first assignee", //_TO_TRANSLATE + "resetVisaWorkflowUser": "The workflow will be <b>reset</b>, this circuit will be reset to", //_TO_TRANSLATE "interruptVisaWorkflow": "The following users will not be able to target mail", //_TO_TRANSLATE "rejectVisaBack": "Document will be send to the previous user", //_TO_TRANSLATE "rejectVisaBackUser": "Document will be send back to", //_TO_TRANSLATE @@ -1460,4 +1460,14 @@ export const LANG_NL = { "validateBy": "Validate by", //_TO_TRANSLATE "validateAvisParallel": "Your are validating an opinion request", //_TO_TRANSLATE "validateAvisParallelSingle": "Your are validating an opinion request of", //_TO_TRANSLATE + "displayWebserviceAccount": "Display webservice account", //_TO_TRANSLATE + "circuitNotStarted": "The workflow has not yet started", //_TO_TRANSLATE + "ADD": "Add", //_TO_TRANSLATE + "UP": "Update", //_TO_TRANSLATE + "DEL": "Delete", //_TO_TRANSLATE + "LOGIN": "Login", //_TO_TRANSLATE + "LOGOUT": "Logout", //_TO_TRANSLATE + "VIEW": "View", //_TO_TRANSLATE + "ERROR": "Error", //_TO_TRANSLATE + "systemActions": "System action(s)", //_TO_TRANSLATE }; diff --git a/src/frontend/plugins/sorting.pipe.ts b/src/frontend/plugins/sorting.pipe.ts index d88119e85dd9517026faef2a6ac1eb4b0905281e..8c60342dae8b55bf019b2efd996da4f35be6b654 100755 --- a/src/frontend/plugins/sorting.pipe.ts +++ b/src/frontend/plugins/sorting.pipe.ts @@ -1,21 +1,28 @@ import { Pipe } from '@angular/core'; import { LatinisePipe } from "ngx-pipes"; +import { FunctionsService } from '../service/functions.service'; @Pipe({ name: "sortBy" }) export class SortPipe { - constructor(private latinisePipe: LatinisePipe) { } + constructor( + private latinisePipe: LatinisePipe, + public functions: FunctionsService + ) { } transform(array: Array<string>, args: string): Array<string> { let normA = ''; let normB = ''; - if (array !== undefined && array.length > 0) { + + if (!this.functions.empty(array)) { array.sort((a: any, b: any) => { if (args === undefined) { normA = this.latinisePipe.transform(a).toLocaleLowerCase(); normB = this.latinisePipe.transform(b).toLocaleLowerCase(); } else { + a[args] = a[args] !== null ? a[args] : ''; + b[args] = b[args] !== null ? b[args] : ''; normA = this.latinisePipe.transform(a[args]).toLocaleLowerCase(); normB = this.latinisePipe.transform(b[args]).toLocaleLowerCase(); } diff --git a/src/frontend/service/filtersList.service.ts b/src/frontend/service/filtersList.service.ts index 039b9598532cc93a1c49ce4196c376170a31d4bf..70c8d677efc4bfe8c89bfae45a258ce72676c030 100644 --- a/src/frontend/service/filtersList.service.ts +++ b/src/frontend/service/filtersList.service.ts @@ -16,6 +16,7 @@ interface listProperties { 'subEntities': string[], 'statuses': string[], 'doctypes': string[], + 'folders': string[], } @Injectable() @@ -64,6 +65,7 @@ export class FiltersListService { 'subEntities': [], 'statuses': [], 'doctypes': [], + 'folders': [], }; this.listsProperties.push(listProperties); this.listsPropertiesIndex = this.listsProperties.length -1; @@ -158,6 +160,14 @@ export class FiltersListService { filters += '&doctypes=' + doct.join(','); } + if (this.listsProperties[this.listsPropertiesIndex].folders.length > 0) { + let folders: any[] = []; + this.listsProperties[this.listsPropertiesIndex].folders.forEach((element: any) => { + folders.push(element.id); + }); + + filters += '&folders=' + folders.join(','); + } } return filters; } diff --git a/test/unitTests/app/history/HistoryControllerTest.php b/test/unitTests/app/history/HistoryControllerTest.php index 5af0a9b713b0ed7724b158c178163d06142b1fc9..b264094e8c9e30dd7973a608cf93629390284741 100755 --- a/test/unitTests/app/history/HistoryControllerTest.php +++ b/test/unitTests/app/history/HistoryControllerTest.php @@ -41,11 +41,10 @@ class HistoryControllerTest extends TestCase $fullRequest = $request->withQueryParams($aArgs); $response = $history->get($fullRequest, new \Slim\Http\Response()); - $responseBody = json_decode((string)$response->getBody()); + $responseBody = json_decode((string)$response->getBody(), true); - $this->assertInternalType('array', $responseBody->histories); - $this->assertInternalType('bool', $responseBody->limitExceeded); - $this->assertNotEmpty($responseBody->histories); + $this->assertInternalType('array', $responseBody['history']); + $this->assertNotEmpty($responseBody['history']); } public function testGetBatchHistory() diff --git a/test/unitTests/app/user/UserControllerTest.php b/test/unitTests/app/user/UserControllerTest.php index bf70378369d54b719b65a4d50facc74b7c7a588d..0e85091ef2a163ef8d0cc654d55335b0c298ba8d 100755 --- a/test/unitTests/app/user/UserControllerTest.php +++ b/test/unitTests/app/user/UserControllerTest.php @@ -27,9 +27,19 @@ class UserControllerTest extends TestCase $response = $userController->get($request, new \Slim\Http\Response()); $responseBody = json_decode((string)$response->getBody()); - $this->assertInternalType('array', $responseBody->users); $this->assertNotEmpty($responseBody->users); + + foreach ($responseBody->users as $value) { + $this->assertNotNull($value->id); + $this->assertInternalType('integer', $value->id); + $this->assertNotNull($value->user_id); + $this->assertNotNull($value->firstname); + $this->assertNotNull($value->lastname); + $this->assertNotNull($value->status); + $this->assertNotNull($value->mail); + $this->assertNotNull($value->loginmode); + } } public function testCreate()