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 5a9a96456a10677d03266f1856ec1b41eb90960a..ba9d954911de39b0dfa8bd526d8924d77988ae7d 100644 --- a/bin/external/ozwillo/OzwilloScript.php +++ b/bin/external/ozwillo/OzwilloScript.php @@ -34,7 +34,7 @@ class OzwilloScript exit(); } 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; @@ -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; } @@ -110,7 +110,7 @@ class OzwilloScript exit(); } 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; diff --git a/rest/index.php b/rest/index.php index 7db6f2220d83de7d53832a5fe5dac4b33edeb864..2493c04bc64b19132566be0aac6d7aed147a7ac7 100755 --- a/rest/index.php +++ b/rest/index.php @@ -104,8 +104,8 @@ $app->delete('/baskets/{id}/groups/{groupId}', \Basket\controllers\BasketControl $app->get('/sortedBaskets', \Basket\controllers\BasketController::class . ':getSorted'); $app->put('/sortedBaskets/{id}', \Basket\controllers\BasketController::class . ':updateSort'); -//BatchHistories -$app->get('/batchHistories', \History\controllers\BatchHistoryController::class . ':get'); +//BatchHistory +$app->get('/batchHistory', \History\controllers\BatchHistoryController::class . ':get'); //Configurations $app->get('/configurations/{service}', \Configuration\controllers\ConfigurationController::class . ':getByService'); @@ -393,7 +393,6 @@ $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}/checkValidateParallelOpinionDiffusion', \Action\controllers\PreProcessActionController::class . ':checkValidateParallelOpinionDiffusion'); $app->post('/resourcesList/users/{userId}/groups/{groupId}/baskets/{basketId}/actions/{actionId}/checkInterruptRejectResetVisa', \Action\controllers\PreProcessActionController::class . ':checkInterruptRejectResetVisa'); //Search diff --git a/src/app/history/controllers/BatchHistoryController.php b/src/app/history/controllers/BatchHistoryController.php index d9c58930ca98f001fb2d4521513b348189181ce4..20f4f8645650f3719bfef7c93a4d643d7d4db80d 100755 --- a/src/app/history/controllers/BatchHistoryController.php +++ b/src/app/history/controllers/BatchHistoryController.php @@ -16,7 +16,6 @@ namespace History\controllers; use Group\controllers\PrivilegeController; use History\models\BatchHistoryModel; -use Respect\Validation\Validator; use Slim\Http\Request; use Slim\Http\Response; @@ -28,26 +27,46 @@ class BatchHistoryController return $response->withStatus(403)->withJson(['errors' => 'Service forbidden']); } - $data = $request->getQueryParams(); + $queryParams = $request->getQueryParams(); - $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']); + $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']; + } + + $where = []; + $data = []; + + 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']); } - $maxRequestSize = 25000; + $order = !in_array($queryParams['order'], ['asc', 'desc']) ? '' : $queryParams['order']; + $orderBy = !in_array($queryParams['orderBy'], ['event_date', 'module_name', 'total_processed', 'total_errors', 'info']) ? ['event_date DESC'] : ["{$queryParams['orderBy']} {$order}"]; - $batchHistories = BatchHistoryModel::get([ - 'select' => ['event_date', 'module_name', 'total_processed', 'total_errors', 'info'], - '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 = BatchHistoryModel::get([ + 'select' => ['event_date', 'module_name', 'total_processed', 'total_errors', 'info', 'count(1) OVER()'], + 'where' => $where, + 'data' => $data, + 'orderBy' => $orderBy, + 'offset' => $offset, + 'limit' => $limit ]); - $limitExceeded = (count($batchHistories) == $maxRequestSize); + $total = $history[0]['count'] ?? 0; + foreach ($history as $key => $value) { + unset($history[$key]['count']); + } - return $response->withJson(['batchHistories' => $batchHistories, 'limitExceeded' => $limitExceeded]); + return $response->withJson(['history' => $history, 'count' => $total]); } } diff --git a/src/app/history/controllers/HistoryController.php b/src/app/history/controllers/HistoryController.php index 095bb48a39706cc3d4a375ab997a02b1f8d41431..23841f72e3f6a953dbde0eeb148bffaade19516f 100755 --- a/src/app/history/controllers/HistoryController.php +++ b/src/app/history/controllers/HistoryController.php @@ -66,6 +66,7 @@ class HistoryController $where[] = 'user_id in (?)'; $data[] = $users; } + if (!empty($queryParams['startDate'])) { $where[] = 'event_date > ?'; $data[] = date('Y-m-d H:i:s', $queryParams['startDate']); @@ -74,17 +75,19 @@ class HistoryController $where[] = 'event_date < ?'; $data[] = date('Y-m-d H:i:s', $queryParams['endDate']); } + + $eventTypes = []; if (!empty($queryParams['actions']) && is_array($queryParams['actions'])) { - $actions = []; foreach ($queryParams['actions'] as $action) { - if (is_numeric($action)) { - $actions[] = "ACTION#{$action}"; - } else { - $actions[] = $action; - } + $eventTypes[] = "ACTION#{$action}"; } + } + if (!empty($queryParams['systemActions']) && is_array($queryParams['systemActions'])) { + $eventTypes = array_merge($eventTypes, $queryParams['systemActions']); + } + if (!empty($eventTypes)) { $where[] = 'event_type in (?)'; - $data[] = $actions; + $data[] = $eventTypes; } $order = !in_array($queryParams['order'], ['asc', 'desc']) ? '' : $queryParams['order']; diff --git a/src/app/history/models/BatchHistoryModelAbstract.php b/src/app/history/models/BatchHistoryModelAbstract.php index 2d665a34c543f2c34e6c10047050077b64fd91d8..d1707a058c7c189b74695403973458a9da0ecab6 100755 --- a/src/app/history/models/BatchHistoryModelAbstract.php +++ b/src/app/history/models/BatchHistoryModelAbstract.php @@ -19,21 +19,22 @@ use SrcCore\models\DatabaseModel; abstract class BatchHistoryModelAbstract { - 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'], + $history = DatabaseModel::select([ + 'select' => $args['select'], 'table' => ['history_batch'], - 'where' => $aArgs['where'], - 'data' => $aArgs['data'], - 'order_by' => $aArgs['orderBy'], - 'limit' => $aArgs['limit'] + 'where' => $args['where'] ?? [], + 'data' => $args['data'] ?? [], + 'order_by' => $args['orderBy'] ?? [], + 'offset' => $args['offset'] ?? 0, + 'limit' => $args['limit'] ?? 0 ]); - return $aHistories; + return $history; } } 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/frontend/app/actions/avis-parallel-send-action/send-avis-parallel-action.component.ts b/src/frontend/app/actions/avis-parallel-send-action/send-avis-parallel-action.component.ts index 978f9514b752f89eb77a9b634b728bde5e777670..e5163d39524eb02915c59983fce5aa8fdd7ffe21 100644 --- a/src/frontend/app/actions/avis-parallel-send-action/send-avis-parallel-action.component.ts +++ b/src/frontend/app/actions/avis-parallel-send-action/send-avis-parallel-action.component.ts @@ -87,7 +87,7 @@ export class SendAvisParallelComponent implements AfterViewInit { executeAction(realResSelected: number[]) { const noteContent: string = `[${this.lang.avisUserAsk.toUpperCase()}] ${this.noteEditor.getNoteContent()}`; - this.http.put(this.data.processActionRoute, { resources: realResSelected, note: noteContent, data: { opinionLimitDate: this.functions.formatDateObjectToFrenchDateString(this.opinionLimitDate, true), opinionCircuit : this.appAvisWorkflow.getWorkflow() } }).pipe( + this.http.put(this.data.processActionRoute, { resources: realResSelected, note: noteContent, data: { opinionLimitDate: this.functions.formatDateObjectToDateString(this.opinionLimitDate, true, 'yyyy-mm-dd'), opinionCircuit : this.appAvisWorkflow.getWorkflow() } }).pipe( tap((data: any) => { if (!data) { this.dialogRef.close('success'); @@ -105,7 +105,7 @@ export class SendAvisParallelComponent implements AfterViewInit { } isValidAction() { - if (!this.noResourceToProcess && this.appAvisWorkflow !== undefined && !this.appAvisWorkflow.emptyWorkflow() && !this.appAvisWorkflow.workflowEnd() && !this.functions.empty(this.noteEditor.getNoteContent()) && !this.functions.empty(this.functions.formatDateObjectToFrenchDateString(this.opinionLimitDate))) { + if (!this.noResourceToProcess && this.appAvisWorkflow !== undefined && !this.appAvisWorkflow.emptyWorkflow() && !this.appAvisWorkflow.workflowEnd() && !this.functions.empty(this.noteEditor.getNoteContent()) && !this.functions.empty(this.functions.formatDateObjectToDateString(this.opinionLimitDate))) { return true; } else { return false; diff --git a/src/frontend/app/actions/avis-parallel-validate-action/validate-avis-parallel-action.component.ts b/src/frontend/app/actions/avis-parallel-validate-action/validate-avis-parallel-action.component.ts index 08fa0fa1661bce3c07557ecdd669e613caeb7d5e..ec018d4dec001b95b5a6309be7ee17de7e52cc40 100644 --- a/src/frontend/app/actions/avis-parallel-validate-action/validate-avis-parallel-action.component.ts +++ b/src/frontend/app/actions/avis-parallel-validate-action/validate-avis-parallel-action.component.ts @@ -94,7 +94,7 @@ export class ValidateAvisParallelComponent implements AfterViewInit { executeAction(realResSelected: number[]) { const noteContent: string = `[${this.lang.avisUserAsk.toUpperCase()}] ${this.noteEditor.getNoteContent()} ↠${this.lang.validateBy} ${this.headerService.user.firstname} ${this.headerService.user.lastname}`; - this.http.put(this.data.processActionRoute, { resources: realResSelected, data: { note: noteContent, opinionLimitDate: this.functions.formatDateObjectToFrenchDateString(this.opinionLimitDate, true), opinionCircuit: this.appAvisWorkflow.getWorkflow() } }).pipe( + this.http.put(this.data.processActionRoute, { resources: realResSelected, data: { note: noteContent, opinionLimitDate: this.functions.formatDateObjectToDateString(this.opinionLimitDate, true), opinionCircuit: this.appAvisWorkflow.getWorkflow() } }).pipe( tap((data: any) => { if (!data) { this.dialogRef.close('success'); @@ -113,7 +113,7 @@ export class ValidateAvisParallelComponent implements AfterViewInit { isValidAction() { if (this.data.resIds.length === 1) { - if (!this.noResourceToProcess && this.noteEditor !== undefined && this.appAvisWorkflow !== undefined && !this.appAvisWorkflow.emptyWorkflow() && !this.appAvisWorkflow.workflowEnd() && !this.functions.empty(this.noteEditor.getNoteContent()) && !this.functions.empty(this.functions.formatDateObjectToFrenchDateString(this.opinionLimitDate))) { + if (!this.noResourceToProcess && this.noteEditor !== undefined && this.appAvisWorkflow !== undefined && !this.appAvisWorkflow.emptyWorkflow() && !this.appAvisWorkflow.workflowEnd() && !this.functions.empty(this.noteEditor.getNoteContent()) && !this.functions.empty(this.functions.formatDateObjectToDateString(this.opinionLimitDate))) { return true; } else { return false; diff --git a/src/frontend/app/actions/avis-workflow-send-action/send-avis-workflow-action.component.ts b/src/frontend/app/actions/avis-workflow-send-action/send-avis-workflow-action.component.ts index 695a9af27ecb450d7dab6ffb887077fb5afe4df7..895d494314b161d40baa5ae6ca3de838a03b6c09 100644 --- a/src/frontend/app/actions/avis-workflow-send-action/send-avis-workflow-action.component.ts +++ b/src/frontend/app/actions/avis-workflow-send-action/send-avis-workflow-action.component.ts @@ -85,7 +85,7 @@ export class SendAvisWorkflowComponent implements AfterViewInit { executeAction(realResSelected: number[]) { const noteContent: string = `[${this.lang.avisUserAsk.toUpperCase()}] ${this.noteEditor.getNoteContent()}`; - this.http.put(this.data.processActionRoute, { resources: realResSelected, note: noteContent, data: { opinionLimitDate: this.functions.formatDateObjectToFrenchDateString(this.opinionLimitDate, true) } }).pipe( + this.http.put(this.data.processActionRoute, { resources: realResSelected, note: noteContent, data: { opinionLimitDate: this.functions.formatDateObjectToDateString(this.opinionLimitDate, true) } }).pipe( tap((data: any) => { if (!data) { this.dialogRef.close('success'); @@ -103,7 +103,7 @@ export class SendAvisWorkflowComponent implements AfterViewInit { } isValidAction() { - if (!this.noResourceToProcess && this.appAvisWorkflow !== undefined && !this.appAvisWorkflow.emptyWorkflow() && !this.appAvisWorkflow.workflowEnd() && !this.functions.empty(this.noteEditor.getNoteContent()) && !this.functions.empty(this.functions.formatDateObjectToFrenchDateString(this.opinionLimitDate))) { + if (!this.noResourceToProcess && this.appAvisWorkflow !== undefined && !this.appAvisWorkflow.emptyWorkflow() && !this.appAvisWorkflow.workflowEnd() && !this.functions.empty(this.noteEditor.getNoteContent()) && !this.functions.empty(this.functions.formatDateObjectToDateString(this.opinionLimitDate))) { return true; } else { return false; diff --git a/src/frontend/app/administration/administration-routing.module.ts b/src/frontend/app/administration/administration-routing.module.ts index 735427b23cf201255892e50fd0d770916bddb4df..09528a92f8adaa25e6186c0e9e583a1ba2cb64f3 100755 --- a/src/frontend/app/administration/administration-routing.module.ts +++ b/src/frontend/app/administration/administration-routing.module.ts @@ -24,6 +24,7 @@ import { ReportsAdministrationComponent } from './report/reports-a import { NotificationsAdministrationComponent } from './notification/notifications-administration.component'; import { NotificationAdministrationComponent } from './notification/notification-administration.component'; import { HistoryAdministrationComponent } from './history/history-administration.component'; +import { HistoryBatchAdministrationComponent } from './history/batch/history-batch-administration.component'; import { UpdateStatusAdministrationComponent } from './updateStatus/update-status-administration.component'; import { ContactsGroupsAdministrationComponent } from './contact/group/contacts-groups-administration.component'; import { ContactsGroupAdministrationComponent } from './contact/group/contacts-group-administration.component'; @@ -81,6 +82,7 @@ import { ContactsPageAdministrationComponent } from './contact/page/contacts-pag { path: 'administration/notifications/new', canActivate: [AppGuard], component: NotificationAdministrationComponent }, { path: 'administration/notifications/:identifier', canActivate: [AppGuard], component: NotificationAdministrationComponent }, { path: 'administration/history', canActivate: [AppGuard], component: HistoryAdministrationComponent }, + { path: 'administration/history-batch', canActivate: [AppGuard], component: HistoryBatchAdministrationComponent }, { path: 'administration/update-status', canActivate: [AppGuard], component: UpdateStatusAdministrationComponent }, { path: 'administration/contacts', canActivate: [AppGuard], component: ContactsListAdministrationComponent }, { path: 'administration/contacts/list', redirectTo: 'administration/contacts', pathMatch: 'full' }, diff --git a/src/frontend/app/administration/administration.module.ts b/src/frontend/app/administration/administration.module.ts index f35bd496b960eb3315c14ce1c41498dce49d09f3..20ded5a9545d703167c81f1f3f5597000162c05c 100755 --- a/src/frontend/app/administration/administration.module.ts +++ b/src/frontend/app/administration/administration.module.ts @@ -27,6 +27,7 @@ import { PrioritiesAdministrationComponent } from './priority/priorit import { PriorityAdministrationComponent } from './priority/priority-administration.component'; import { ReportsAdministrationComponent } from './report/reports-administration.component'; import { HistoryAdministrationComponent } from './history/history-administration.component'; +import { HistoryBatchAdministrationComponent } from './history/batch/history-batch-administration.component'; import { UpdateStatusAdministrationComponent } from './updateStatus/update-status-administration.component'; import { NotificationsAdministrationComponent } from './notification/notifications-administration.component'; import { NotificationAdministrationComponent } from './notification/notification-administration.component'; @@ -79,6 +80,7 @@ import { ContactsPageAdministrationComponent } from './contact/page PriorityAdministrationComponent, ReportsAdministrationComponent, HistoryAdministrationComponent, + HistoryBatchAdministrationComponent, UpdateStatusAdministrationComponent, ContactsGroupsAdministrationComponent, ContactsGroupAdministrationComponent, diff --git a/src/frontend/app/administration/contact/customField/contacts-custom-fields-administration.component.html b/src/frontend/app/administration/contact/customField/contacts-custom-fields-administration.component.html index 7d5b1c352fd0e41c73e498e368cb8bbae024ca61..0e6c26eba082d6fef55b9a08e15f0c729d7022df 100644 --- a/src/frontend/app/administration/contact/customField/contacts-custom-fields-administration.component.html +++ b/src/frontend/app/administration/contact/customField/contacts-custom-fields-administration.component.html @@ -1,6 +1,6 @@ <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"> + [opened]="appService.getViewMode() ? false : true"> <header-panel [snavLeft]="snav"></header-panel> <menu-shortcut></menu-shortcut> <menu-nav></menu-nav> @@ -104,7 +104,7 @@ </div> </mat-sidenav-content> <mat-sidenav #snav2 [mode]="appService.getViewMode() ? 'over' : 'side'" [fixedInViewport]="appService.getViewMode()" - fixedTopGap="56" position='end' opened class="col-md-4 col-sm-12 customFielsdPanel"> + position='end' opened class="col-md-4 col-sm-12 customFielsdPanel"> <mat-tab-group> <mat-tab [label]="lang.customFieldsTypesAvailable"> <div class="customFieldsTypesItem" *ngFor="let customField of customFieldsTypes"> diff --git a/src/frontend/app/administration/contact/group/contacts-group-administration.component.html b/src/frontend/app/administration/contact/group/contacts-group-administration.component.html index 19f3bb006410ce640898cd84b1d62cb3b8ed808e..08d0b74a327e8a846af66c4d5b72a75df442a9ab 100644 --- a/src/frontend/app/administration/contact/group/contacts-group-administration.component.html +++ b/src/frontend/app/administration/contact/group/contacts-group-administration.component.html @@ -1,6 +1,6 @@ <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"> + [opened]="appService.getViewMode() ? false : true"> <header-panel [snavLeft]="snav"></header-panel> <menu-shortcut></menu-shortcut> <menu-nav></menu-nav> @@ -135,7 +135,7 @@ </div> </mat-sidenav-content> <mat-sidenav #snav2 [mode]="appService.getViewMode() ? 'over' : 'side'" [fixedInViewport]="appService.getViewMode()" - fixedTopGap="56" position='end' [opened]="appService.getViewMode() || creationMode ? false : true" style="overflow-x:hidden;width:40%;"> + position='end' [opened]="appService.getViewMode() || creationMode ? false : true" style="overflow-x:hidden;width:40%;"> <mat-list> <h3 mat-subheader>{{nbContact}} {{lang.relatedContacts}} : </h3> </mat-list> diff --git a/src/frontend/app/administration/contact/group/contacts-groups-administration.component.html b/src/frontend/app/administration/contact/group/contacts-groups-administration.component.html index 81e1d2d0326e7e4f6d8b965305b1618b3d3a9337..c994ed6e01a1de971d11c22114ec6c504ce6a755 100644 --- a/src/frontend/app/administration/contact/group/contacts-groups-administration.component.html +++ b/src/frontend/app/administration/contact/group/contacts-groups-administration.component.html @@ -1,6 +1,6 @@ <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"> + [opened]="appService.getViewMode() ? false : true"> <header-panel [snavLeft]="snav"></header-panel> <menu-shortcut></menu-shortcut> <menu-nav></menu-nav> @@ -115,6 +115,6 @@ </div> </mat-sidenav-content> <mat-sidenav #snav2 [mode]="appService.getViewMode() ? 'over' : 'side'" [fixedInViewport]="appService.getViewMode()" - fixedTopGap="56" position='end'> + position='end'> </mat-sidenav> </mat-sidenav-container> \ No newline at end of file diff --git a/src/frontend/app/administration/contact/list/contacts-list-administration.component.html b/src/frontend/app/administration/contact/list/contacts-list-administration.component.html index 9ecb707d2e5d8bc52a21e7fe0628dedfa0b744f4..473f458553b89dc790b77b24dfedef7a7020ba6d 100644 --- a/src/frontend/app/administration/contact/list/contacts-list-administration.component.html +++ b/src/frontend/app/administration/contact/list/contacts-list-administration.component.html @@ -1,6 +1,6 @@ <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"> + [opened]="appService.getViewMode() ? false : true"> <header-panel [snavLeft]="snav"></header-panel> <menu-shortcut></menu-shortcut> <menu-nav></menu-nav> @@ -66,22 +66,19 @@ </mat-cell> </ng-container> <ng-container matColumnDef="firstname"> - <mat-header-cell *matHeaderCellDef mat-sort-header - [class.hide-for-mobile]="appService.getViewMode()">{{lang.firstname}}</mat-header-cell> - <mat-cell mat-cell *matCellDef="let element" [class.hide-for-mobile]="appService.getViewMode()"> + <mat-header-cell *matHeaderCellDef mat-sort-header>{{lang.firstname}}</mat-header-cell> + <mat-cell mat-cell *matCellDef="let element"> {{element.firstname}} </mat-cell> </ng-container> <ng-container matColumnDef="lastname"> - <mat-header-cell *matHeaderCellDef mat-sort-header - [class.hide-for-mobile]="appService.getViewMode()">{{lang.lastname}}</mat-header-cell> - <mat-cell *matCellDef="let element" [class.hide-for-mobile]="appService.getViewMode()"> + <mat-header-cell *matHeaderCellDef mat-sort-header>{{lang.lastname}}</mat-header-cell> + <mat-cell *matCellDef="let element"> {{element.lastname}} </mat-cell> </ng-container> <ng-container matColumnDef="company"> - <mat-header-cell *matHeaderCellDef mat-sort-header - [class.hide-for-mobile]="appService.getViewMode()">{{lang.contactsParameters_company}} + <mat-header-cell *matHeaderCellDef mat-sort-header>{{lang.contactsParameters_company}} </mat-header-cell> - <mat-cell *matCellDef="let element" [class.hide-for-mobile]="appService.getViewMode()"> + <mat-cell *matCellDef="let element"> {{element.company}} </mat-cell> </ng-container> <ng-container matColumnDef="formatedAddress"> @@ -123,7 +120,4 @@ </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/contact/page/contacts-page-administration.component.html b/src/frontend/app/administration/contact/page/contacts-page-administration.component.html index 1e69337cc666b033c70e0ee9307f549d479e9bd7..5b503e599bc53b4a983519aa4be7d321b3ed738f 100644 --- a/src/frontend/app/administration/contact/page/contacts-page-administration.component.html +++ b/src/frontend/app/administration/contact/page/contacts-page-administration.component.html @@ -1,6 +1,6 @@ <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"> + [opened]="appService.getViewMode() ? false : true"> <header-panel [snavLeft]="snav"></header-panel> <menu-shortcut></menu-shortcut> <menu-nav></menu-nav> @@ -32,7 +32,4 @@ </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/contact/page/form/contacts-form.component.ts b/src/frontend/app/administration/contact/page/form/contacts-form.component.ts index 9395ba18bad1a552ed0300f211443d872e1eb740..4a50925405a4f70b08c89f98734bd0052bac4376 100644 --- a/src/frontend/app/administration/contact/page/form/contacts-form.component.ts +++ b/src/frontend/app/administration/contact/page/form/contacts-form.component.ts @@ -609,7 +609,7 @@ export class ContactsFormComponent implements OnInit { this.contactForm.filter(field => field.display).forEach(element => { if (element.type === 'date' && !this.functions.empty(element.control.value)) { const date = new Date(element.control.value); - element.control.value = this.functions.formatDateObjectToFrenchDateString(date); + element.control.value = this.functions.formatDateObjectToDateString(date); } if (element.id.match(regex) !== null) { contact['customFields'][element.id.split(/_(.+)/)[1]] = element.control.value; diff --git a/src/frontend/app/administration/contact/parameter/contacts-parameters-administration.component.html b/src/frontend/app/administration/contact/parameter/contacts-parameters-administration.component.html index 02fa2b36dde718a938ab1545d2f045b2fa452262..ef6514056a7e60793c86521cbe6105de7e30a2eb 100644 --- a/src/frontend/app/administration/contact/parameter/contacts-parameters-administration.component.html +++ b/src/frontend/app/administration/contact/parameter/contacts-parameters-administration.component.html @@ -1,6 +1,6 @@ <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"> + [opened]="appService.getViewMode() ? false : true"> <header-panel [snavLeft]="snav"></header-panel> <menu-shortcut></menu-shortcut> <menu-nav></menu-nav> @@ -156,7 +156,4 @@ </div> </div> </mat-sidenav-content> - <mat-sidenav #snav2 [mode]="appService.getViewMode() ? 'over' : 'side'" [fixedInViewport]="appService.getViewMode()" - fixedTopGap="56" position='end'> - </mat-sidenav> </mat-sidenav-container> \ No newline at end of file diff --git a/src/frontend/app/administration/history/batch/history-batch-administration.component.html b/src/frontend/app/administration/history/batch/history-batch-administration.component.html new file mode 100644 index 0000000000000000000000000000000000000000..6a496d78dbbfe4427601f74d1e000eec68ed51c4 --- /dev/null +++ b/src/frontend/app/administration/history/batch/history-batch-administration.component.html @@ -0,0 +1,161 @@ +<mat-sidenav-container autosize class="maarch-container"> + <mat-sidenav #snav [mode]="appService.getViewMode() ? 'over' : 'side'" [fixedInViewport]="appService.getViewMode()" + [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> + <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-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>{{lang.event}}</mat-header-cell> + <mat-cell mat-cell *matCellDef="let element" [title]="element.event_date | fullDate"> + {{element.event_date | timeAgo : 'full' | ucfirst}} </mat-cell> + </ng-container> + <ng-container matColumnDef="total_processed"> + <mat-header-cell *matHeaderCellDef mat-sort-header>{{lang.totalProcessed | ucfirst}} + </mat-header-cell> + <mat-cell *matCellDef="let element" [class.empty]="element.total_processed === 0"> + {{element.total_processed}} </mat-cell> + </ng-container> + <ng-container matColumnDef="total_errors"> + <mat-header-cell *matHeaderCellDef mat-sort-header>{{lang.totalErrors}} + </mat-header-cell> + <mat-cell *matCellDef="let element" [class.empty]="element.total_errors === 0" [class.error]="element.total_errors > 0"> + {{element.total_errors}} </mat-cell> + </ng-container> + <ng-container matColumnDef="info"> + <mat-header-cell *matHeaderCellDef mat-sort-header style="flex: 2;">{{lang.information}} + </mat-header-cell> + <mat-cell *matCellDef="let element" style="flex: 2;"> + {{element.info}} </mat-cell> + </ng-container> + <ng-container matColumnDef="module_name"> + <mat-header-cell *matHeaderCellDef mat-sort-header>{{lang.module}} + </mat-header-cell> + <mat-cell *matCellDef="let element"> + {{element.module_name}} </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-container> \ No newline at end of file diff --git a/src/frontend/app/administration/history/batch/history-batch-administration.component.scss b/src/frontend/app/administration/history/batch/history-batch-administration.component.scss new file mode 100644 index 0000000000000000000000000000000000000000..475b4db09906860d44e9a9c17179493482fc825b --- /dev/null +++ b/src/frontend/app/administration/history/batch/history-batch-administration.component.scss @@ -0,0 +1,63 @@ +@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; + } +} + +.empty { + opacity: 0.5; +} + +.error { + color: $warn; + font-weight: bold; +} \ No newline at end of file diff --git a/src/frontend/app/administration/history/batch/history-batch-administration.component.ts b/src/frontend/app/administration/history/batch/history-batch-administration.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..193237f3cf2f29a62add29328274481035f45563 --- /dev/null +++ b/src/frontend/app/administration/history/batch/history-batch-administration.component.ts @@ -0,0 +1,294 @@ +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 { AppService } from '../../../../service/app.service'; +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 { FormControl } from '@angular/forms'; +import { FunctionsService } from '../../../../service/functions.service'; +import { LatinisePipe } from 'ngx-pipes'; +import { PrivilegeService } from '../../../../service/privileges.service'; + +@Component({ + templateUrl: "history-batch-administration.component.html", + styleUrls: ['history-batch-administration.component.scss'], + providers: [AppService] +}) +export class HistoryBatchAdministrationComponent implements OnInit { + + @ViewChild('snav', { static: true }) public sidenavLeft: MatSidenav; + @ViewChild('snav2', { static: true }) public sidenavRight: MatSidenav; + + lang: any = LANG; + loading: boolean = false; + + filtersChange = new EventEmitter(); + + data: any; + + displayedColumnsHistory: string[] = ['event_date', 'total_processed', 'total_errors', 'info', 'module_name']; + + isLoadingResults = true; + routeUrl: string = '../../rest/batchHistory'; + resultListDatabase: HistoryListHttpDao | null; + resultsLength = 0; + + searchHistory = new FormControl(); + startDateFilter: any = ''; + endDateFilter: any = ''; + filterUrl: string = ''; + filterList: any = null; + filteredList: any = {}; + filterUsed: any = {}; + + filterColor = { + startDate: '#b5cfd8', + endDate: '#7393a7', + errors: '#7d5ba6' + }; + + 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[] = []; + + constructor( + public http: HttpClient, + private notify: NotificationService, + private headerService: HeaderService, + public appService: AppService, + public dialog: MatDialog, + public functions: FunctionsService, + private latinisePipe: LatinisePipe, + private privilegeService: PrivilegeService) { } + + ngOnInit(): void { + if (this.privilegeService.hasCurrentUserPrivilege('view_history')) { + this.subMenus = [ + { + icon: 'fa fa-history', + route: '/administration/history', + label: this.lang.history, + current: false + }, + { + icon: 'fa fa-history', + route: '/administration/history-batch', + label: this.lang.historyBatch, + current: true + } + ]; + } else { + this.subMenus = [ + { + icon: 'fa fa-history', + route: '/administration/history-batch', + label: this.lang.historyBatch, + current: true + } + ]; + } + 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); + + // 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.historyBatch.toLowerCase(), '', ''); + return data.history; + }), + catchError((err: any) => { + this.notify.handleErrors(err); + this.isLoadingResults = false; + return observableOf([]); + }) + ).subscribe(data => this.data = data); + } + + processPostData(data: any) { + data.history = data.history.map((item: any) => { + return { + ...item, + total_errors : item.total_errors === null ? 0 : item.total_errors + } + }) + return data; + } + + + refreshDao() { + this.paginator.pageIndex = 0; + this.filtersChange.emit(); + } + + initFilterListHistory() { + + if (this.filterList === null) { + this.filterList = {}; + this.loadingFilters = true; + + this.http.get("../../rest/history/availableFilters").pipe( + map((data: any) => { + data = {}; + data.modules = [ + { + id : 'retrieveMailsFromSignatoryBook', + label : 'retrieveMailsFromSignatoryBook' + } + ]; + + data.totalErrors = [ + { + id : 'errorElement', + label : 'Éléments en erreur' + } + ]; + + 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(); + + } + } + + + filterStartDate() { + if (this.functions.empty(this.filterUsed['startDate'])) { + this.filterUsed['startDate'] = []; + } + this.filterUsed['startDate'][0] = { + id: this.functions.empty(this.startDateFilter) ? '' : this.functions.formatDateObjectToDateString(this.startDateFilter), + label: this.functions.empty(this.startDateFilter) ? '' : this.functions.formatDateObjectToDateString(this.startDateFilter) + }; + this.generateUrlFilter(); + this.refreshDao(); + } + + filterEndDate() { + if (this.functions.empty(this.filterUsed['endDate'])) { + this.filterUsed['endDate'] = []; + } + this.filterUsed['endDate'][0] = { + id: this.functions.empty(this.endDateFilter) ? '' : this.functions.formatDateObjectToDateString(this.endDateFilter, true), + label: this.functions.empty(this.endDateFilter) ? '' : this.functions.formatDateObjectToDateString(this.endDateFilter) + }; + this.generateUrlFilter(); + this.refreshDao(); + } + + 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 { + 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/history/history-administration.component.html b/src/frontend/app/administration/history/history-administration.component.html index 8dc4e5f7e4ed7c8a886d72e062470d289f1db9a8..c925ddd0b7a262e93080cad12d51a511980103e8 100755 --- a/src/frontend/app/administration/history/history-administration.component.html +++ b/src/frontend/app/administration/history/history-administration.component.html @@ -1,144 +1,156 @@ -<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()" + [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>{{lang.event}}</mat-header-cell> + <mat-cell mat-cell *matCellDef="let element" + [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>{{lang.user | ucfirst}}</mat-header-cell> + <mat-cell *matCellDef="let element"> + {{element.userLabel}} </mat-cell> + </ng-container> + <ng-container matColumnDef="info"> + <mat-header-cell *matHeaderCellDef mat-sort-header + style="flex: 2;">{{lang.information}} + </mat-header-cell> + <mat-cell *matCellDef="let element" + style="flex: 2;"> + {{element.info}} </mat-cell> + </ng-container> + <ng-container matColumnDef="remote_ip"> + <mat-header-cell *matHeaderCellDef mat-sort-header + >{{lang.ip}} + </mat-header-cell> + <mat-cell *matCellDef="let element"> + {{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-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 1c898e27e561629e505c7efabc8e83007e4a28c4..b17a5ac2d5f21572394d4568479d71f6920c4d7b 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/history', {params: {"startDate" : (this.startDate.getTime() / 1000).toString(), "endDate" : (this.endDate.getTime() / 1000).toString()}}) - .subscribe((data: any) => { - this.data = data['history']; - 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.formatDateObjectToDateString(this.startDateFilter), + label: this.functions.empty(this.startDateFilter) ? '' : this.functions.formatDateObjectToDateString(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.formatDateObjectToDateString(this.endDateFilter, true), + label: this.functions.empty(this.endDateFilter) ? '' : this.functions.formatDateObjectToDateString(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/history', {params: {"startDate" : (this.startDate.getTime() / 1000).toString(), "endDate" : (this.endDate.getTime() / 1000).toString()}}) - .subscribe((data: any) => { - this.data = data['history']; - 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/home/administration.component.html b/src/frontend/app/administration/home/administration.component.html index a37c47a9ab02caef7778a77fbcf1033bd3a027bf..7fa9df6d118afee825de57797536e1642eee6c45 100644 --- a/src/frontend/app/administration/home/administration.component.html +++ b/src/frontend/app/administration/home/administration.component.html @@ -26,7 +26,7 @@ <mat-spinner style="margin:auto;"></mat-spinner> </div> <div *ngIf="!loading" class="row adminArea"> - <div class="col-md-6 adminArea_1" *ngIf="organisationServices"> + <div class="col-md-6 col-sm-12 col-xs-12 adminArea_1" *ngIf="organisationServices"> <div class="adminArea-label">{{lang.organization}}</div> <button class="col-md-4 col-xs-6 adminArea-button" mat-button color="primary" matTooltip="{{modService.comment}}" *ngFor="let modService of organisationServices | sortBy : 'label'" @@ -35,7 +35,7 @@ <br />{{modService.label}}</button> </div> - <div class="col-md-6 adminArea_2" *ngIf="productionServices"> + <div class="col-md-6 col-sm-12 col-xs-12 adminArea_2" *ngIf="productionServices"> <div class="adminArea-label">{{lang.production}}</div> <button class="col-md-4 col-xs-6 adminArea-button" mat-button color="primary" matTooltip="{{modService.comment}}" *ngFor="let modService of productionServices | sortBy : 'label'" @@ -43,7 +43,7 @@ <i class="{{modService.style}} fa-4x"></i> <br />{{modService.label}}</button> </div> - <div class="col-md-6 adminArea_3" *ngIf="classementServices"> + <div class="col-md-6 col-sm-12 col-xs-12 adminArea_3" *ngIf="classementServices"> <div class="adminArea-label">{{lang.classifying}}</div> <button class="col-md-4 col-xs-6 adminArea-button" mat-button color="primary" matTooltip="{{modService.comment}}" *ngFor="let modService of classementServices | sortBy : 'label'" @@ -51,7 +51,7 @@ <i class="{{modService.style}} fa-4x"></i> <br />{{modService.label}}</button> </div> - <div class="col-md-6 adminArea_4" *ngIf="supervisionServices"> + <div class="col-md-6 col-sm-12 col-xs-12 adminArea_4" *ngIf="supervisionServices"> <div class="adminArea-label">{{lang.supervision}}</div> <ng-container> <button class="col-md-4 col-xs-6 adminArea-button" diff --git a/src/frontend/app/avis/avis-workflow.component.html b/src/frontend/app/avis/avis-workflow.component.html index 0f2e86ccf285c7eaac5460aab19c9b768d51e4d4..76af5f1360e215c19b78e7d33598dad469ceef69 100644 --- a/src/frontend/app/avis/avis-workflow.component.html +++ b/src/frontend/app/avis/avis-workflow.component.html @@ -1,6 +1,6 @@ <mat-list *ngIf="!loading"> <mat-form-field appearance="outline" *ngIf="adminMode && !linkedToMaarchParapheur"> - <input type="text" matInput placeholder="Ajouter des personnes" id="searchAvisUserInput" + <input type="text" #searchAvisUserInput matInput placeholder="Ajouter des personnes" id="searchAvisUserInput" [formControl]="searchAvisUser" [matAutocomplete]="autoGroup"> <mat-autocomplete #autoGroup="matAutocomplete" (optionSelected)="addItemToWorkflow($event.option.value)" (opened)="initFilterAvisModelList()"> diff --git a/src/frontend/app/avis/avis-workflow.component.ts b/src/frontend/app/avis/avis-workflow.component.ts index 1ca989e78dad4f394cb5955858ba0be60f0c06e6..534b3a723e4a5c2d7dfde5b26afd817e98997417 100644 --- a/src/frontend/app/avis/avis-workflow.component.ts +++ b/src/frontend/app/avis/avis-workflow.component.ts @@ -12,8 +12,6 @@ import { MatDialog } from '@angular/material'; import { AddAvisModelModalComponent } from './addAvisModel/add-avis-model-modal.component'; import { ConfirmComponent } from '../../plugins/modal/confirm.component'; -declare function $j(selector: any): any; - @Component({ selector: 'app-avis-workflow', templateUrl: 'avis-workflow.component.html', @@ -49,7 +47,7 @@ export class AvisWorkflowComponent implements OnInit { @Input('mode') mode: 'parallel' | 'circuit' = 'circuit'; - @ViewChild('searchAvisUserInput', { static: true }) searchAvisUserInput: ElementRef; + @ViewChild('searchAvisUserInput', { static: false }) searchAvisUserInput: ElementRef; searchAvisUser = new FormControl(); @@ -432,6 +430,7 @@ export class AvisWorkflowComponent implements OnInit { difflist_type: this.mode === 'circuit' ? 'AVIS_CIRCUIT' : 'entity_id' }); this.searchAvisUser.reset(); + this.searchAvisUserInput.nativeElement.blur(); } else if (item.type === 'entity') { this.http.get(`../../rest/listTemplates/${item.id}`).pipe( tap((data: any) => { @@ -448,6 +447,7 @@ export class AvisWorkflowComponent implements OnInit { }) ); this.searchAvisUser.reset(); + this.searchAvisUserInput.nativeElement.blur(); }) ).subscribe(); } diff --git a/src/frontend/app/folder/document-list/folder-document-list.component.html b/src/frontend/app/folder/document-list/folder-document-list.component.html index 5514a09d88af49da3c365c469d4983557358df6f..481c1d5294da7e2e6698e664f2be6ba9ed702a72 100644 --- a/src/frontend/app/folder/document-list/folder-document-list.component.html +++ b/src/frontend/app/folder/document-list/folder-document-list.component.html @@ -72,11 +72,11 @@ {{lang.selected}}</small> </div> <div class="table-head-tool"> - <span style="float:right;height: 56px;margin-top: 5px;"> + <span> <mat-paginator #paginatorResultList [length]="resultsLength" [pageSizeOptions]="[10, 25, 50, 100, 150]" class="paginatorResultList"></mat-paginator> </span> - <span style="float:right;height: 56px;margin-top: 11px;"> + <span> <app-folder-action-list #actionsList [contextMode]="false" [currentFolderInfo]="folderInfo" [totalRes]="allResInBasket.length" [selectedRes]="selectedRes" (refreshEvent)="refreshDaoAfterAction()" @@ -195,7 +195,7 @@ <div *ngIf="innerHtml" [matTooltip]="currentChrono" [innerHTML]="innerHtml" style="height: 100%;overflow: hidden;"></div> - <div style="display:flex;"> + <div style="display:flex;position: sticky;top: 0px;z-index: 2;"> <button mat-icon-button (click)="snav2.close()" style="font-size: 20px;color:#666;"> <mat-icon class="fa fa-arrow-right"></mat-icon> </button> diff --git a/src/frontend/app/home/followed-list/followed-document-list.component.html b/src/frontend/app/home/followed-list/followed-document-list.component.html index f48fd2a4f04569c4e8d3a3834fd4fa772a2de369..147df8f3ed198c02fe92a0af4cb9d4b2291ed5c0 100644 --- a/src/frontend/app/home/followed-list/followed-document-list.component.html +++ b/src/frontend/app/home/followed-list/followed-document-list.component.html @@ -48,11 +48,11 @@ {{lang.selected}}</small> </div> <div class="table-head-tool"> - <span style="float:right;height: 56px;margin-top: 5px;"> + <span> <mat-paginator #paginatorResultList [length]="resultsLength" [pageSizeOptions]="[10, 25, 50, 100, 150]" class="paginatorResultList"></mat-paginator> </span> - <span style="float:right;height: 56px;margin-top: 11px;"> + <span> <app-followed-action-list #actionsList [contextMode]="false" [currentFolderInfo]="folderInfo" [totalRes]="allResInBasket.length" [selectedRes]="selectedRes" [menuShortcut]="menuShortcut" (refreshEvent)="refreshDaoAfterAction()"> @@ -170,7 +170,7 @@ <div *ngIf="innerHtml" [matTooltip]="currentChrono" [innerHTML]="innerHtml" style="height: 100%;overflow: hidden;"></div> - <div style="display:flex;"> + <div style="display:flex;position: sticky;top: 0px;z-index: 2;"> <button mat-icon-button (click)="snav2.close()" style="font-size: 20px;color:#666;"> <mat-icon class="fa fa-arrow-right"></mat-icon> </button> 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 fa9f248c599915c8843d5757d05408da94142828..b605a59c510985ef4e9d4102d3d6541bb9a04393 100644 --- a/src/frontend/app/indexation/indexing-form/indexing-form.component.ts +++ b/src/frontend/app/indexation/indexing-form/indexing-form.component.ts @@ -296,15 +296,15 @@ export class IndexingFormComponent implements OnInit { if (element.today === true) { if (!this.adminMode) { const now = new Date(); - element.default_value = this.functions.formatDateObjectToFrenchDateString(now, false); + element.default_value = this.functions.formatDateObjectToDateString(now, false); } else { element.default_value = '_TODAY'; } } else { if (element.identifier === 'processLimitDate') { - element.default_value = this.functions.formatDateObjectToFrenchDateString(this.arrFormControl[element.identifier].value, true); + element.default_value = this.functions.formatDateObjectToDateString(this.arrFormControl[element.identifier].value, true); } else { - element.default_value = this.functions.formatDateObjectToFrenchDateString(this.arrFormControl[element.identifier].value, false); + element.default_value = this.functions.formatDateObjectToDateString(this.arrFormControl[element.identifier].value, false); } } } else { diff --git a/src/frontend/app/list/basket-list.component.html b/src/frontend/app/list/basket-list.component.html index 76a78c37eed40408fa4e71fdfda7a9a63a199821..d5eb5f9f12087d26f0876dda92c22aeec4cfa960 100644 --- a/src/frontend/app/list/basket-list.component.html +++ b/src/frontend/app/list/basket-list.component.html @@ -46,15 +46,15 @@ {{lang.selected}}</small> </div> <div class="table-head-tool"> - <span style="float:right;height: 56px;margin-top: 5px;"> + <span> <mat-paginator #paginatorResultList [length]="resultsLength" [pageSizeOptions]="[10, 25, 50, 100, 150]" class="paginatorResultList"></mat-paginator> </span> - <span style="float:right;height: 56px;margin-top: 11px;"> + <span> <app-tools-list #actionsList [selectedRes]="selectedRes" [currentBasketInfo]="currentBasketInfo"></app-tools-list> </span> - <span style="float:right;height: 56px;margin-top: 11px;"> + <span> <app-actions-list #actionsList (refreshEvent)="refreshDao()" [contextMode]="false" [totalRes]="allResInBasket.length" [selectedRes]="selectedRes" [currentBasketInfo]="currentBasketInfo" [currentResource]="currentResource" (refreshPanelFolders)="panelFolder.refreshFoldersTree()"></app-actions-list> @@ -199,8 +199,8 @@ <div *ngIf="innerHtml && !filtersListService.filterMode" [matTooltip]="currentChrono" [innerHTML]="innerHtml" style="height: 100%;overflow: hidden;"></div> - <div style="display:flex;"> - <button mat-icon-button (click)="snav2.close()" style="font-size: 20px;color:#666;"> + <div style="display:flex;position: sticky;top: 0px;z-index: 2;"> + <button mat-icon-button (click)="snav2.close()" style="font-size: 20px;color:#666;"> <mat-icon class="fa fa-arrow-right"></mat-icon> </button> </div> 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/list/panel/panel-list.component.html b/src/frontend/app/list/panel/panel-list.component.html index 54517a60a43dcc4f56528ee0eb8aaeda20675a72..afb3f529c3b552ac2b015e35edfa11171b71449c 100644 --- a/src/frontend/app/list/panel/panel-list.component.html +++ b/src/frontend/app/list/panel/panel-list.component.html @@ -1,7 +1,7 @@ <div style="font-size: 60px;opacity: 0.1;padding-bottom: 30px;text-align: center;"> <mat-icon fontSet="fas" fontIcon="{{icon}} fa-2x"></mat-icon> </div> -<div style="display:flex;justify-content: center;align-items: center;color: #666;padding-bottom: 10px;"> +<div style="position: sticky;top: 0px;background:white;z-index: 1;display:flex;justify-content: center;align-items: center;color: #666;padding: 10px;"> <mat-icon *ngIf="this.currentResource.statusImage !== undefined" [ngStyle]="{'color': this.currentResource.priorityColor}" color="primary" class="{{this.currentResource.statusImage.charAt(0)}}{{this.currentResource.statusImage.charAt(1)}} {{this.currentResource.statusImage}} {{this.currentResource.statusImage.charAt(0)}}{{this.currentResource.statusImage.charAt(1)}}-2x"> diff --git a/src/frontend/app/process/process.component.html b/src/frontend/app/process/process.component.html index c6adb1efe15c3bba556f11a22b0797691b75e331..91c824c2083bee28ae6b3062388208159a43f29c 100644 --- a/src/frontend/app/process/process.component.html +++ b/src/frontend/app/process/process.component.html @@ -12,7 +12,7 @@ (click)="changeTab(module.id)"> <i *ngIf="module.count > 0" class="fas fa-circle haveContent"></i> <i [class]="module.icon"></i> - <span *ngIf="!appService.getViewMode()">{{module.label}}</span> + <span>{{module.label}}</span> </div> </div> </div> diff --git a/src/frontend/app/process/process.component.ts b/src/frontend/app/process/process.component.ts index f6d81b3f386c610dc69eceb1c889ef8222fa6f8f..5ef4c40a4693685f074092a1ad88d34e017129ff 100755 --- a/src/frontend/app/process/process.component.ts +++ b/src/frontend/app/process/process.component.ts @@ -190,6 +190,12 @@ export class ProcessComponent implements OnInit { this.loadBadges(); this.loadResource(); + if (this.appService.getViewMode()) { + setTimeout(() => { + this.sidenavLeft.open(); + }, 800); + } + this.http.get(`../../rest/resources/${this.currentResourceInformations.resId}/users/${this.currentUserId}/groups/${this.currentGroupId}/baskets/${this.currentBasketId}/processingData`).pipe( tap((data: any) => { if (data.listEventData !== null) { diff --git a/src/frontend/app/visa/visa-workflow.component.html b/src/frontend/app/visa/visa-workflow.component.html index effba69fdb328760992900d93c25cd4575c5a7d7..2b5a7f3235cb2fe23ce25173f0c4f8e3cc82d9e8 100644 --- a/src/frontend/app/visa/visa-workflow.component.html +++ b/src/frontend/app/visa/visa-workflow.component.html @@ -1,7 +1,7 @@ <mat-list *ngIf="!loading"> <mat-form-field appearance="outline" *ngIf="adminMode && !linkedToMaarchParapheur"> - <input type="text" matInput placeholder="Ajouter des personnes" id="searchVisaSignUserInput" + <input type="text" #searchVisaSignUserInput matInput placeholder="Ajouter des personnes" id="searchVisaSignUserInput" [formControl]="searchVisaSignUser" [matAutocomplete]="autoGroup"> <mat-autocomplete #autoGroup="matAutocomplete" (optionSelected)="addItemToWorkflow($event.option.value)" (opened)="initFilterVisaModelList()"> <mat-option disabled *ngIf="visaModelListNotLoaded"> diff --git a/src/frontend/app/visa/visa-workflow.component.ts b/src/frontend/app/visa/visa-workflow.component.ts index 6998ac09d1ec4026469e39af2081f241e632d9d2..3b593f5c047f012f80b0a9ce4dfc585a855ac384 100644 --- a/src/frontend/app/visa/visa-workflow.component.ts +++ b/src/frontend/app/visa/visa-workflow.component.ts @@ -47,7 +47,7 @@ export class VisaWorkflowComponent implements OnInit { @Input('linkedToMaarchParapheur') linkedToMaarchParapheur: boolean = false; - @ViewChild('searchVisaSignUserInput', { static: true }) searchVisaSignUserInput: ElementRef; + @ViewChild('searchVisaSignUserInput', { static: false }) searchVisaSignUserInput: ElementRef; searchVisaSignUser = new FormControl(); @@ -420,6 +420,8 @@ export class VisaWorkflowComponent implements OnInit { if (this.linkedToMaarchParapheur) { this.getMaarchParapheurUserAvatar(item.externalId.maarchParapheur, this.visaWorkflow.items.length - 1); } + this.searchVisaSignUser.reset(); + this.searchVisaSignUserInput.nativeElement.blur(); } else if (item.type === 'user') { @@ -438,6 +440,7 @@ export class VisaWorkflowComponent implements OnInit { this.getMaarchParapheurUserAvatar(item.externalId.maarchParapheur, this.visaWorkflow.items.length - 1); } this.searchVisaSignUser.reset(); + this.searchVisaSignUserInput.nativeElement.blur(); } else if (item.type === 'entity') { this.http.get(`../../rest/listTemplates/${item.id}`).pipe( tap((data: any) => { @@ -455,6 +458,7 @@ export class VisaWorkflowComponent implements OnInit { }) ); this.searchVisaSignUser.reset(); + this.searchVisaSignUserInput.nativeElement.blur(); }) ).subscribe(); } diff --git a/src/frontend/css/engine_2.scss b/src/frontend/css/engine_2.scss index 82055653c526c0990f22af376b3dbd2f1050a15f..b1b642390ffb01d66bc7a51406345eb7f1364556 100644 --- a/src/frontend/css/engine_2.scss +++ b/src/frontend/css/engine_2.scss @@ -96,6 +96,7 @@ html,body { .table-head { overflow: auto; + overflow-y: hidden; display: flex; padding-left: 25px; padding-right: 25px; @@ -125,8 +126,9 @@ html,body { } &-tool { - justify-content: flex-end; - + justify-content: flex-start; + display: flex; + flex-direction: row-reverse; span { padding-left: 5px; padding-right: 5px; @@ -134,6 +136,11 @@ html,body { } } +.mat-paginator { + .mat-paginator-container { + flex-wrap: initial !important; + } +} .mat-icon { height: auto; } 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 43cf240eb0ad583a8ad9ff7b69234bbada6fe330..68a9a5eb784e7a60968715064a708078de91eb99 100755 --- a/src/frontend/lang/lang-en.ts +++ b/src/frontend/lang/lang-en.ts @@ -1439,4 +1439,12 @@ export const LANG_EN = { "circuitNotStarted": "The workflow has not yet started", "searchCommunicationMean": "Search communication mean", "searchExternalIdM2M": "Search M2GEC Identifier", + "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 9c2003316eda6d82d8ebce99f971278a5ecad570..79eda385c5244f8e28ae1ef0991031b0763d632a 100755 --- a/src/frontend/lang/lang-fr.ts +++ b/src/frontend/lang/lang-fr.ts @@ -1479,4 +1479,12 @@ export const LANG_FR = { "circuitNotStarted": "Le circuit n'a pas encore commencé", "searchCommunicationMean": "Recherchez un moyen de communication", "searchExternalIdM2M": "Recherchez un identifiant M2GEC", + "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 5db84f11afa687d7d32f64430dd16804c89e9892..f363d668ce22c1e6d3302aded45339bc20d06bdd 100755 --- a/src/frontend/lang/lang-nl.ts +++ b/src/frontend/lang/lang-nl.ts @@ -1464,4 +1464,12 @@ export const LANG_NL = { "circuitNotStarted": "The workflow has not yet started", //_TO_TRANSLATE "searchCommunicationMean": "Search communication mean", //_TO_TRANSLATE "searchExternalIdM2M": "Search M2GEC Identifier", //_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/src/frontend/service/functions.service.ts b/src/frontend/service/functions.service.ts index c1e9b1bbf5b4c7c7803a976d6d4689bfc881c6ee..13b94132655ba902f193da8278930fd8b560906e 100644 --- a/src/frontend/service/functions.service.ts +++ b/src/frontend/service/functions.service.ts @@ -43,16 +43,29 @@ export class FunctionsService { } } - formatDateObjectToFrenchDateString(date: Date, limitMode: boolean = false) { + formatDateObjectToDateString(date: Date, limitMode: boolean = false, format:string = 'dd-mm-yyyy') { if (date !== null) { - let day = date.getDate(); - let month = date.getMonth() + 1; - let year = date.getFullYear(); + let formatDate: any[] = []; + format.split('-').forEach((element: any) => { + if (element === 'dd') { + let day: any = date.getDate(); + day = ('00' + day).slice(-2); + formatDate.push(day); + } else if (element === 'mm') { + let month: any = date.getMonth() + 1; + month = ('00' + month).slice(-2); + formatDate.push(month); + } else if (element === 'yyyy') { + let year: any = date.getFullYear(); + formatDate.push(year); + } + }); + let limit = ''; if (limitMode) { limit = ' 23:59:59'; } - return `${('00' + day).slice(-2)}-${('00' + month).slice(-2)}-${year}${limit}`; + return `${formatDate.join('-')}${limit}`; } else { return date; } diff --git a/src/frontend/service/privileges.service.ts b/src/frontend/service/privileges.service.ts index 68b7ca039f59da2f6337fa36c3de2155dd5af3ae..6e4a731180841859ebcfc84adf482b61d9535cb4 100644 --- a/src/frontend/service/privileges.service.ts +++ b/src/frontend/service/privileges.service.ts @@ -271,7 +271,7 @@ export class PrivilegeService { "id": "view_history_batch", "label": this.lang.historyBatch, "comment": this.lang.historyBatchAdmin, - "route": "/administration/history", + "route": "/administration/history-batch", "unit": "supervision", "style": "fa fa-history", "angular" : true,