From 5efc5802b77c461a58f0fa17a9093f398ae00f9d Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 13 Apr 2021 08:39:07 +0200 Subject: [PATCH 001/403] start version 5.1.23 --- CHANGELOG | 4 ++++ SeedDMS_Core/package.xml | 39 +++++++++++++++++++++++++++------------ inc/inc.Version.php | 2 +- 3 files changed, 32 insertions(+), 13 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index db1368bde..a3b211c53 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,7 @@ +-------------------------------------------------------------------------------- + Changes in version 5.1.23 +-------------------------------------------------------------------------------- + -------------------------------------------------------------------------------- Changes in version 5.1.22 -------------------------------------------------------------------------------- diff --git a/SeedDMS_Core/package.xml b/SeedDMS_Core/package.xml index b440d3671..2d6bff551 100644 --- a/SeedDMS_Core/package.xml +++ b/SeedDMS_Core/package.xml @@ -12,11 +12,11 @@ uwe@steinmann.cx yes - 2021-03-15 + 2021-04-13 - 5.1.22 - 5.1.22 + 5.1.23 + 5.1.23 stable @@ -24,15 +24,6 @@ GPL License -- add SeedDMS_Core_DatabaseAccess::hasTable() -- add SeedDMS_Core_User->isType() and SeedDMS_Core_Group->isType() -- add SeedDMS_Core_User->getDMS() and SeedDMS_Core_Group->getDMS() -- add new parameter to SeedDMS_Core_DMS->getDocumentList() for skipping expired documents -- add parameter $incdisabled to SeedDMS_Core_Folder::getNotifyList() -- do not validate value in SeedDMS_Core_Attribute::setValue(), it should have been done before -- SeedDMS_Core_DMS::search() can search for last date of document status change -- smarter caching in SeedDMS_Core_Document::getDocumentFiles() which fixes a potential - problem when removing a document @@ -1867,5 +1858,29 @@ add method SeedDMS_Core_DatabaseAccess::setLogFp() - check if attribute definition exists when setting attributes of folders and documents + + 2021-03-15 + + + 5.1.22 + 5.1.22 + + + stable + stable + + GPL License + +- add SeedDMS_Core_DatabaseAccess::hasTable() +- add SeedDMS_Core_User->isType() and SeedDMS_Core_Group->isType() +- add SeedDMS_Core_User->getDMS() and SeedDMS_Core_Group->getDMS() +- add new parameter to SeedDMS_Core_DMS->getDocumentList() for skipping expired documents +- add parameter $incdisabled to SeedDMS_Core_Folder::getNotifyList() +- do not validate value in SeedDMS_Core_Attribute::setValue(), it should have been done before +- SeedDMS_Core_DMS::search() can search for last date of document status change +- smarter caching in SeedDMS_Core_Document::getDocumentFiles() which fixes a potential + problem when removing a document + + diff --git a/inc/inc.Version.php b/inc/inc.Version.php index 8e4db572b..a4e428ad6 100644 --- a/inc/inc.Version.php +++ b/inc/inc.Version.php @@ -20,7 +20,7 @@ class SeedDMS_Version { /* {{{ */ - const _number = "5.1.22"; + const _number = "5.1.23"; const _string = "SeedDMS"; function __construct() { From ac85cfe26da6249dcea065d934c4a455cceb0b3a Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Thu, 15 Apr 2021 10:31:37 +0200 Subject: [PATCH 002/403] fall back to bootstrap file, include theme style --- inc/inc.ClassUI.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/inc/inc.ClassUI.php b/inc/inc.ClassUI.php index 9abad35cf..c80408aca 100644 --- a/inc/inc.ClassUI.php +++ b/inc/inc.ClassUI.php @@ -102,9 +102,14 @@ class UI extends UI_Default { } if(!$filename) $filename = $settings->_rootDir."views/".$theme."/class.".$class.".php"; + /* Fall back onto the view class in bootstrap theme */ + if(!file_exists($filename)) + $filename = $settings->_rootDir."views/bootstrap/class.".$class.".php"; if(!file_exists($filename)) $filename = ''; if($filename) { + /* Always include the base class which defines class SeedDMS_Theme_Style */ + require($settings->_rootDir."views/".$theme."/class.".ucfirst($theme).".php"); require($filename); $view = new $classname($params, $theme); /* Set some configuration parameters */ From 3e81ad7654da9fe838adbfb2a072e90ee05deec1 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Thu, 15 Apr 2021 10:32:42 +0200 Subject: [PATCH 003/403] rename SeedDMS_Bootstrap_Style to SeedDMS_Theme_Style --- views/bootstrap/class.Bootstrap.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/views/bootstrap/class.Bootstrap.php b/views/bootstrap/class.Bootstrap.php index 0e291157d..fcbc8a277 100644 --- a/views/bootstrap/class.Bootstrap.php +++ b/views/bootstrap/class.Bootstrap.php @@ -20,7 +20,7 @@ // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -class SeedDMS_Bootstrap_Style extends SeedDMS_View_Common { +class SeedDMS_Theme_Style extends SeedDMS_View_Common { /** * @var string $extraheader extra html code inserted in the html header * of the page @@ -3297,3 +3297,5 @@ $("body").on("click", "span.openpopupbox", function(e) { Date: Thu, 15 Apr 2021 10:33:29 +0200 Subject: [PATCH 004/403] switch to new class name SeedDMS_Theme_Style --- views/bootstrap/class.ExtensionMgr.php | 4 ++-- views/bootstrap/class.ForcePasswordChange.php | 6 +++--- views/bootstrap/class.MyAccount.php | 4 ++-- views/bootstrap/class.ViewFolder.php | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/views/bootstrap/class.ExtensionMgr.php b/views/bootstrap/class.ExtensionMgr.php index 44850cb15..3dcd17aa0 100644 --- a/views/bootstrap/class.ExtensionMgr.php +++ b/views/bootstrap/class.ExtensionMgr.php @@ -14,7 +14,7 @@ /** * Include parent class */ -require_once("class.Bootstrap.php"); +//require_once("class.Bootstrap.php"); /** * Class which outputs the html page for ExtensionMgr view @@ -25,7 +25,7 @@ require_once("class.Bootstrap.php"); * @copyright Copyright (C) 2013 Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_View_ExtensionMgr extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_ExtensionMgr extends SeedDMS_Theme_Style { function js() { /* {{{ */ header('Content-Type: application/javascript; charset=UTF-8'); diff --git a/views/bootstrap/class.ForcePasswordChange.php b/views/bootstrap/class.ForcePasswordChange.php index 0038e466a..c1bf33a31 100644 --- a/views/bootstrap/class.ForcePasswordChange.php +++ b/views/bootstrap/class.ForcePasswordChange.php @@ -16,7 +16,7 @@ /** * Include parent class */ -require_once("class.Bootstrap.php"); +//require_once("class.Bootstrap.php"); /** * Class which outputs the html page for ForcePasswordChange view @@ -29,7 +29,7 @@ require_once("class.Bootstrap.php"); * 2010-2012 Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_View_ForcePasswordChange extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_ForcePasswordChange extends SeedDMS_Theme_Style { function js() { /* {{{ */ header('Content-Type: application/javascript; charset=UTF-8'); @@ -74,7 +74,7 @@ $(document).ready( function() { $this->globalBanner(); $this->contentStart(); $this->contentHeading(getMLText('password_expiration')); - echo "
".getMLText('password_expiration_text')."
"; + $this->warningMsg(getMLText('password_expiration_text')); $this->contentContainerStart(); ?>
diff --git a/views/bootstrap/class.MyAccount.php b/views/bootstrap/class.MyAccount.php index c145e2e0a..bc8149d26 100644 --- a/views/bootstrap/class.MyAccount.php +++ b/views/bootstrap/class.MyAccount.php @@ -16,7 +16,7 @@ /** * Include parent class */ -require_once("class.Bootstrap.php"); +//require_once("class.Bootstrap.php"); /** * Class which outputs the html page for MyAccount view @@ -29,7 +29,7 @@ require_once("class.Bootstrap.php"); * 2010-2012 Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_View_MyAccount extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_MyAccount extends SeedDMS_Theme_Style { function show() { /* {{{ */ $dms = $this->params['dms']; diff --git a/views/bootstrap/class.ViewFolder.php b/views/bootstrap/class.ViewFolder.php index 8f2fff505..334f97b97 100644 --- a/views/bootstrap/class.ViewFolder.php +++ b/views/bootstrap/class.ViewFolder.php @@ -16,7 +16,7 @@ /** * Include parent class */ -require_once("class.Bootstrap.php"); +//require_once("class.Bootstrap.php"); /** * Include class to preview documents @@ -34,7 +34,7 @@ require_once("SeedDMS/Preview.php"); * 2010-2012 Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_View_ViewFolder extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_ViewFolder extends SeedDMS_Theme_Style { function data() { /* {{{ */ $dms = $this->params['dms']; From 5a903365836ad1fa046c762cb1957bc95e775470 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Thu, 15 Apr 2021 15:35:11 +0200 Subject: [PATCH 005/403] change bootstrapDir to bootstrap4 --- Gruntfile.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gruntfile.js b/Gruntfile.js index e1015ea84..e542805a8 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -1,7 +1,7 @@ module.exports = function (grunt) { 'use strict'; - var bootstrapDir = 'views/bootstrap/vendors', + var bootstrapDir = 'views/bootstrap4/vendors', tdkDir = 'views/tdk/vendors', nodeDir = 'node_modules'; From 4a9d3666f1230c7b57bbef02f9358f12c6d1ba07 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Thu, 15 Apr 2021 15:35:53 +0200 Subject: [PATCH 006/403] move css and js files into theme directory --- views/bootstrap/class.Bootstrap.php | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/views/bootstrap/class.Bootstrap.php b/views/bootstrap/class.Bootstrap.php index fcbc8a277..36a879c23 100644 --- a/views/bootstrap/class.Bootstrap.php +++ b/views/bootstrap/class.Bootstrap.php @@ -103,8 +103,8 @@ class SeedDMS_Theme_Style extends SeedDMS_View_Common { echo ''."\n"; echo ''."\n"; echo ''."\n"; - echo ''."\n"; - echo ''."\n"; + echo ''."\n"; + echo ''."\n"; if($this->extraheader['css']) echo $this->extraheader['css']; if(method_exists($this, 'css')) @@ -118,8 +118,10 @@ class SeedDMS_Theme_Style extends SeedDMS_View_Common { echo ''."\n"; echo ''."\n"; echo ''."\n"; - echo ''."\n"; -// echo ''."\n"; + echo ''."\n"; + echo ''."\n"; +// echo ''."\n"; +// echo ''."\n"; if(!empty($this->extraheader['favicon'])) echo $this->extraheader['favicon']; else { @@ -182,13 +184,13 @@ background-image: linear-gradient(to bottom, #882222, #111111);; foreach(array('de', 'es', 'ar', 'el', 'bg', 'ru', 'hr', 'hu', 'ko', 'pl', 'ro', 'sk', 'tr', 'uk', 'ca', 'nl', 'fi', 'cs', 'it', 'fr', 'sv', 'sl', 'pt-BR', 'zh-CN', 'zh-TW') as $lang) echo ''."\n"; echo ''."\n"; - echo ''."\n"; + echo ''."\n"; parse_str($_SERVER['QUERY_STRING'], $tmp); $tmp['action'] = 'webrootjs'; if(isset($tmp['formtoken'])) unset($tmp['formtoken']); echo ''."\n"; - echo ''."\n"; + echo ''."\n"; if($this->params['enablemenutasks'] && isset($this->params['user']) && $this->params['user']) { $this->addFooterJS('SeedDMSTask.run();'); } From 1b7a5c48ba0edf6b0c8dfac572f7b017d2389377 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Thu, 15 Apr 2021 15:36:32 +0200 Subject: [PATCH 007/403] replace SeedDMS_Bootstrap_Style by SeedDMS_Theme_Style --- views/bootstrap/class.Clipboard.php | 4 ++-- views/bootstrap/class.DropFolderChooser.php | 4 ++-- views/bootstrap/class.Session.php | 4 ++-- views/bootstrap/class.Tasks.php | 4 ++-- views/bootstrap/class.ViewFolder.php | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/views/bootstrap/class.Clipboard.php b/views/bootstrap/class.Clipboard.php index ec711b891..928013494 100644 --- a/views/bootstrap/class.Clipboard.php +++ b/views/bootstrap/class.Clipboard.php @@ -16,7 +16,7 @@ /** * Include parent class */ -require_once("class.Bootstrap.php"); +//require_once("class.Bootstrap.php"); /** * Include class to preview documents @@ -34,7 +34,7 @@ require_once("SeedDMS/Preview.php"); * 2010-2012 Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_View_Clipboard extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_Clipboard extends SeedDMS_Theme_Style { /** * Returns the html needed for the clipboard list in the menu * diff --git a/views/bootstrap/class.DropFolderChooser.php b/views/bootstrap/class.DropFolderChooser.php index 477a48d25..20a140212 100644 --- a/views/bootstrap/class.DropFolderChooser.php +++ b/views/bootstrap/class.DropFolderChooser.php @@ -16,7 +16,7 @@ /** * Include parent class */ -require_once("class.Bootstrap.php"); +//require_once("class.Bootstrap.php"); /** * Include class to preview documents @@ -34,7 +34,7 @@ require_once("SeedDMS/Preview.php"); * 2010-2012 Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_View_DropFolderChooser extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_DropFolderChooser extends SeedDMS_Theme_Style { function js() { /* {{{ */ header('Content-Type: application/javascript; charset=UTF-8'); diff --git a/views/bootstrap/class.Session.php b/views/bootstrap/class.Session.php index 7c29b5431..9d2355a9f 100644 --- a/views/bootstrap/class.Session.php +++ b/views/bootstrap/class.Session.php @@ -16,7 +16,7 @@ /** * Include parent class */ -require_once("class.Bootstrap.php"); +//require_once("class.Bootstrap.php"); /** * Class which outputs the html page for clipboard view @@ -29,7 +29,7 @@ require_once("class.Bootstrap.php"); * 2010-2012 Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_View_Session extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_Session extends SeedDMS_Theme_Style { /** * Returns the html needed for the clipboard list in the menu * diff --git a/views/bootstrap/class.Tasks.php b/views/bootstrap/class.Tasks.php index 58a402cd6..f1af0f875 100644 --- a/views/bootstrap/class.Tasks.php +++ b/views/bootstrap/class.Tasks.php @@ -16,7 +16,7 @@ /** * Include parent class */ -require_once("class.Bootstrap.php"); +//require_once("class.Bootstrap.php"); /** * Include class to preview documents @@ -34,7 +34,7 @@ require_once("SeedDMS/Preview.php"); * 2010-2012 Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_View_Tasks extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_Tasks extends SeedDMS_Theme_Style { private function __myTasks() { /* {{{ */ $dms = $this->params['dms']; diff --git a/views/bootstrap/class.ViewFolder.php b/views/bootstrap/class.ViewFolder.php index 334f97b97..69581b930 100644 --- a/views/bootstrap/class.ViewFolder.php +++ b/views/bootstrap/class.ViewFolder.php @@ -563,7 +563,7 @@ $('body').on('click', '.order-btn', function(ev) { $previewer = new SeedDMS_Preview_Previewer($cachedir, $previewwidth, $timeout, $xsendfile); $previewer->setConverters($previewconverters); - $this->htmlAddHeader(''."\n", 'js'); + //$this->htmlAddHeader(''."\n", 'js'); echo $this->callHook('startPage'); $this->htmlStartPage(getMLText("folder_title", array("foldername" => htmlspecialchars($folder->getName())))); From 91a98ac6c6747d0770a3ca36c6a6b7a338ff920d Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Thu, 15 Apr 2021 17:33:18 +0200 Subject: [PATCH 008/403] copy bootstrap --- Gruntfile.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Gruntfile.js b/Gruntfile.js index e542805a8..2a37b60a9 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -152,6 +152,14 @@ module.exports = function (grunt) { ], dest: bootstrapDir + '/perfect-scrollbar', flatten: true + },{ + expand: true, + src: [ + nodeDir + '/bootstrap/dist/js/bootstrap.min.js', + nodeDir + '/bootstrap/dist/css/bootstrap.min.css' + ], + dest: bootstrapDir + '/bootstrap', + flatten: true },{ expand: true, src: [ From 888d75953ed242c8afd91d48a44ea68ea7aabb9d Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Sun, 18 Apr 2021 07:02:01 +0200 Subject: [PATCH 009/403] use require_once for style classes, set 'theme' in view --- inc/inc.ClassUI.php | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/inc/inc.ClassUI.php b/inc/inc.ClassUI.php index c80408aca..d88cd2eff 100644 --- a/inc/inc.ClassUI.php +++ b/inc/inc.ClassUI.php @@ -95,6 +95,12 @@ class UI extends UI_Default { if(file_exists($filename)) { $httpbasedir = 'ext/'.$extname.'/'; break; + } else { + $filename = $settings->_rootDir.'ext/'.$extname.'/views/bootstrap/class.'.$class.".php"; + if(file_exists($filename)) { + $httpbasedir = 'ext/'.$extname.'/'; + break; + } } $filename = ''; } @@ -109,12 +115,13 @@ class UI extends UI_Default { $filename = ''; if($filename) { /* Always include the base class which defines class SeedDMS_Theme_Style */ - require($settings->_rootDir."views/".$theme."/class.".ucfirst($theme).".php"); - require($filename); + require_once($settings->_rootDir."views/".$theme."/class.".ucfirst($theme).".php"); + require_once($filename); $view = new $classname($params, $theme); /* Set some configuration parameters */ $view->setParam('refferer', $_SERVER['REQUEST_URI']); $view->setParam('absbaseprefix', $settings->_httpRoot.$httpbasedir); + $view->setParam('theme', $theme); $view->setParam('class', $class); $view->setParam('session', $session); $view->setParam('settings', $settings); From 6c0b544446bec1c9238758be24227d0c8aafb924 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Sun, 18 Apr 2021 07:02:53 +0200 Subject: [PATCH 010/403] do not use session id in form key if not logged in --- inc/inc.Utils.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/inc/inc.Utils.php b/inc/inc.Utils.php index 92969360c..82bee8308 100644 --- a/inc/inc.Utils.php +++ b/inc/inc.Utils.php @@ -473,10 +473,10 @@ function showtree() { /* {{{ */ function createFormKey($formid='') { /* {{{ */ global $settings, $session; - if($id = $session->getId()) { + if($session && $id = $session->getId()) { return md5($id.$settings->_encryptionKey.$formid); } else { - return false; + return md5($settings->_encryptionKey.$formid); } } /* }}} */ From 2458655961d0729cf9a1e62034983e14520024e8 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Sun, 18 Apr 2021 07:03:31 +0200 Subject: [PATCH 011/403] add more packages for new bootstrap4 theme --- Gruntfile.js | 21 +++++++++++++++++++++ package.json | 6 ++++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index 2a37b60a9..1ad6013f0 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -78,6 +78,20 @@ module.exports = function (grunt) { ], dest: bootstrapDir + '/select2/css', flatten: true + },{ + expand: true, + src: [ + nodeDir + '/@ttskch/select2-bootstrap4-theme/dist/*' + ], + dest: bootstrapDir + '/select2-bootstrap4-theme', + flatten: true + },{ + expand: true, + src: [ + nodeDir + '/vis-timeline/dist/*' + ], + dest: bootstrapDir + '/vis-timeline', + flatten: true },{ expand: true, src: [ @@ -145,6 +159,13 @@ module.exports = function (grunt) { ], dest: bootstrapDir + '/moment/locale', flatten: true + },{ + expand: true, + src: [ + nodeDir + '/popper.js/dist/umd/*' + ], + dest: bootstrapDir + '/popper', + flatten: true },{ expand: true, src: [ diff --git a/package.json b/package.json index 4084e288c..8ea4d5328 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "license": "ISC", "dependencies": { "@coreui/coreui": "^3.3.0", - "@popperjs/core": "^2.5.3", + "@ttskch/select2-bootstrap4-theme": "^1.5.2", "bootstrap": "^4.5.2", "bootstrap-datepicker": "^1.9.0", "chartjs": "^0.3.24", @@ -29,6 +29,8 @@ "moment": "^2.29.1", "noty": "^2.4.1", "perfect-scrollbar": "^1.5.0", - "select2": "^4.0.13" + "popper.js": "^1.16.1", + "select2": "^4.0.13", + "vis-timeline": "^7.4.7" } } From 43567ac1d7acaacfe2ac8e477d04d0958ef6a113 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Sun, 18 Apr 2021 07:04:15 +0200 Subject: [PATCH 012/403] include missing inc.Utils.php --- out/out.ChangePassword.php | 1 + 1 file changed, 1 insertion(+) diff --git a/out/out.ChangePassword.php b/out/out.ChangePassword.php index 5e3365307..7121b40da 100644 --- a/out/out.ChangePassword.php +++ b/out/out.ChangePassword.php @@ -21,6 +21,7 @@ if(!isset($settings)) require_once("../inc/inc.Settings.php"); require_once("inc/inc.LogInit.php"); +require_once("inc/inc.Utils.php"); require_once("inc/inc.Language.php"); require_once("inc/inc.Init.php"); require_once("inc/inc.Extension.php"); From a6ac5d546a1069da3c6399812dda5303433a63aa Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Sun, 18 Apr 2021 07:05:10 +0200 Subject: [PATCH 013/403] include inc.DBInit.php --- out/out.Login.php | 1 + 1 file changed, 1 insertion(+) diff --git a/out/out.Login.php b/out/out.Login.php index 079c74c3d..77f4318ee 100644 --- a/out/out.Login.php +++ b/out/out.Login.php @@ -26,6 +26,7 @@ require_once("inc/inc.Utils.php"); require_once("inc/inc.Language.php"); require_once("inc/inc.Init.php"); require_once("inc/inc.Extension.php"); +require_once("inc/inc.DBInit.php"); require_once("inc/inc.ClassUI.php"); include $settings->_rootDir . "languages/" . $settings->_language . "/lang.inc"; From 28480a87335e109bbe86fdab6cba411e091a055c Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Sun, 18 Apr 2021 07:05:57 +0200 Subject: [PATCH 014/403] move 'new SeedDMS_AccessOperation' after document is known --- out/out.RunSubWorkflow.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/out/out.RunSubWorkflow.php b/out/out.RunSubWorkflow.php index 3980b2e0f..b54bcef87 100644 --- a/out/out.RunSubWorkflow.php +++ b/out/out.RunSubWorkflow.php @@ -33,7 +33,6 @@ require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); -$accessop = new SeedDMS_AccessOperation($dms, $document, $user, $settings); if (!isset($_GET["documentid"]) || !is_numeric($_GET["documentid"]) || intval($_GET["documentid"])<1) { UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("invalid_doc_id")); @@ -44,6 +43,8 @@ if (!is_object($document)) { UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("invalid_doc_id")); } +$accessop = new SeedDMS_AccessOperation($dms, $document, $user, $settings); + if (!isset($_GET["version"]) || !is_numeric($_GET["version"]) || intval($_GET["version"])<1) { UI::exitError(getMLText("document_title", array("documentname" => htmlspecialchars($document->getName()))),getMLText("invalid_version")); } From 871460899cb3e359da2ec91d104074af558dfbef Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Sun, 18 Apr 2021 07:08:00 +0200 Subject: [PATCH 015/403] use new SeedDMS_Theme_Style, replace plain html by methods in theme style --- views/bootstrap/class.AddDocument.php | 4 +- views/bootstrap/class.AddEvent.php | 4 +- views/bootstrap/class.AddFile.php | 4 +- views/bootstrap/class.AddSubFolder.php | 4 +- views/bootstrap/class.AdminTools.php | 4 +- views/bootstrap/class.ApprovalSummary.php | 4 +- views/bootstrap/class.ApproveDocument.php | 10 +- views/bootstrap/class.AttributeMgr.php | 6 +- views/bootstrap/class.BackupTools.php | 10 +- views/bootstrap/class.Bootstrap.php | 243 ++++++++++++------ views/bootstrap/class.Calendar.php | 4 +- views/bootstrap/class.Categories.php | 4 +- views/bootstrap/class.CategoryChooser.php | 4 +- views/bootstrap/class.ChangePassword.php | 9 +- views/bootstrap/class.Charts.php | 4 +- views/bootstrap/class.ClearCache.php | 4 +- views/bootstrap/class.Clipboard.php | 22 +- views/bootstrap/class.CreateIndex.php | 10 +- views/bootstrap/class.DefaultKeywords.php | 4 +- views/bootstrap/class.DocumentAccess.php | 8 +- views/bootstrap/class.DocumentChooser.php | 4 +- views/bootstrap/class.DocumentNotify.php | 4 +- .../bootstrap/class.DocumentVersionDetail.php | 22 +- views/bootstrap/class.DropFolderChooser.php | 26 +- views/bootstrap/class.EditAttributes.php | 4 +- views/bootstrap/class.EditComment.php | 4 +- views/bootstrap/class.EditDocument.php | 4 +- views/bootstrap/class.EditDocumentFile.php | 10 +- views/bootstrap/class.EditFolder.php | 4 +- views/bootstrap/class.EditOnline.php | 14 +- views/bootstrap/class.EditUserData.php | 4 +- views/bootstrap/class.ErrorDlg.php | 10 +- views/bootstrap/class.ExpiredDocuments.php | 4 +- views/bootstrap/class.ExtensionMgr.php | 4 +- views/bootstrap/class.FolderAccess.php | 11 +- views/bootstrap/class.FolderChooser.php | 4 +- views/bootstrap/class.FolderNotify.php | 4 +- views/bootstrap/class.GroupMgr.php | 26 +- views/bootstrap/class.GroupView.php | 4 +- views/bootstrap/class.Help.php | 4 +- views/bootstrap/class.Hooks.php | 6 +- views/bootstrap/class.ImportFS.php | 4 +- views/bootstrap/class.ImportUsers.php | 4 +- views/bootstrap/class.IndexInfo.php | 4 +- views/bootstrap/class.Indexer.php | 12 +- views/bootstrap/class.Info.php | 4 +- views/bootstrap/class.KeywordChooser.php | 4 +- views/bootstrap/class.LogManagement.php | 4 +- views/bootstrap/class.Login.php | 8 +- views/bootstrap/class.ManageNotify.php | 20 +- views/bootstrap/class.MoveDocument.php | 4 +- views/bootstrap/class.MoveFolder.php | 4 +- views/bootstrap/class.MyDocuments.php | 4 +- views/bootstrap/class.ObjectCheck.php | 4 +- views/bootstrap/class.OpensearchDesc.php | 4 +- .../bootstrap/class.OverrideContentStatus.php | 4 +- views/bootstrap/class.PasswordForgotten.php | 12 +- views/bootstrap/class.PasswordSend.php | 12 +- views/bootstrap/class.RemoveArchive.php | 10 +- views/bootstrap/class.RemoveDocument.php | 4 +- views/bootstrap/class.RemoveDocumentFile.php | 11 +- views/bootstrap/class.RemoveDump.php | 14 +- views/bootstrap/class.RemoveFolder.php | 4 +- views/bootstrap/class.RemoveGroup.php | 15 +- views/bootstrap/class.RemoveLog.php | 8 +- views/bootstrap/class.RemoveUser.php | 17 +- .../class.RemoveUserFromProcesses.php | 14 +- views/bootstrap/class.RemoveVersion.php | 6 +- views/bootstrap/class.RemoveWorkflow.php | 6 +- .../class.RemoveWorkflowFromDocument.php | 6 +- .../bootstrap/class.ReturnFromSubWorkflow.php | 12 +- views/bootstrap/class.ReviewDocument.php | 10 +- views/bootstrap/class.ReviewSummary.php | 4 +- views/bootstrap/class.RewindWorkflow.php | 10 +- views/bootstrap/class.RunSubWorkflow.php | 10 +- views/bootstrap/class.Search.php | 12 +- views/bootstrap/class.SendLoginData.php | 4 +- views/bootstrap/class.Session.php | 26 +- views/bootstrap/class.SetExpires.php | 4 +- .../bootstrap/class.SetReviewersApprovers.php | 12 +- views/bootstrap/class.SetWorkflow.php | 4 +- views/bootstrap/class.Settings.php | 4 +- views/bootstrap/class.Setup2Factor.php | 4 +- views/bootstrap/class.Statistic.php | 4 +- views/bootstrap/class.SubstituteUser.php | 6 +- views/bootstrap/class.Tasks.php | 24 +- views/bootstrap/class.Timeline.php | 10 +- views/bootstrap/class.TransferDocument.php | 8 +- views/bootstrap/class.TransferObjects.php | 4 +- views/bootstrap/class.TriggerWorkflow.php | 4 +- views/bootstrap/class.UpdateDocument.php | 4 +- views/bootstrap/class.UserDefaultKeywords.php | 4 +- views/bootstrap/class.UserList.php | 4 +- views/bootstrap/class.UsrMgr.php | 34 +-- views/bootstrap/class.UsrView.php | 6 +- views/bootstrap/class.ViewDocument.php | 62 ++--- views/bootstrap/class.ViewFolder.php | 10 +- views/bootstrap/class.WorkflowActionsMgr.php | 10 +- views/bootstrap/class.WorkflowGraph.php | 16 +- views/bootstrap/class.WorkflowMgr.php | 34 +-- views/bootstrap/class.WorkflowStatesMgr.php | 10 +- views/bootstrap/class.WorkflowSummary.php | 8 +- 102 files changed, 597 insertions(+), 551 deletions(-) diff --git a/views/bootstrap/class.AddDocument.php b/views/bootstrap/class.AddDocument.php index a4d5ca1ac..66b0296fa 100644 --- a/views/bootstrap/class.AddDocument.php +++ b/views/bootstrap/class.AddDocument.php @@ -16,7 +16,7 @@ /** * Include parent class */ -require_once("class.Bootstrap.php"); +//require_once("class.Bootstrap.php"); /** * Class which outputs the html page for AddDocument view @@ -29,7 +29,7 @@ require_once("class.Bootstrap.php"); * 2010-2012 Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_View_AddDocument extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_AddDocument extends SeedDMS_Theme_Style { function js() { /* {{{ */ $dropfolderdir = $this->params['dropfolderdir']; diff --git a/views/bootstrap/class.AddEvent.php b/views/bootstrap/class.AddEvent.php index 65d32b90e..eb7cdebab 100644 --- a/views/bootstrap/class.AddEvent.php +++ b/views/bootstrap/class.AddEvent.php @@ -16,7 +16,7 @@ /** * Include parent class */ -require_once("class.Bootstrap.php"); +//require_once("class.Bootstrap.php"); /** * Class which outputs the html page for AddEvent view @@ -29,7 +29,7 @@ require_once("class.Bootstrap.php"); * 2010-2012 Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_View_AddEvent extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_AddEvent extends SeedDMS_Theme_Style { function js() { /* {{{ */ $strictformcheck = $this->params['strictformcheck']; diff --git a/views/bootstrap/class.AddFile.php b/views/bootstrap/class.AddFile.php index 7e7acb6b2..7e7f51e2d 100644 --- a/views/bootstrap/class.AddFile.php +++ b/views/bootstrap/class.AddFile.php @@ -16,7 +16,7 @@ /** * Include parent class */ -require_once("class.Bootstrap.php"); +//require_once("class.Bootstrap.php"); /** * Class which outputs the html page for AddFile view @@ -29,7 +29,7 @@ require_once("class.Bootstrap.php"); * 2010-2012 Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_View_AddFile extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_AddFile extends SeedDMS_Theme_Style { function js() { /* {{{ */ $enablelargefileupload = $this->params['enablelargefileupload']; diff --git a/views/bootstrap/class.AddSubFolder.php b/views/bootstrap/class.AddSubFolder.php index f0b573c62..0282c54fb 100644 --- a/views/bootstrap/class.AddSubFolder.php +++ b/views/bootstrap/class.AddSubFolder.php @@ -16,7 +16,7 @@ /** * Include parent class */ -require_once("class.Bootstrap.php"); +//require_once("class.Bootstrap.php"); /** * Class which outputs the html page for AddSubFolder view @@ -29,7 +29,7 @@ require_once("class.Bootstrap.php"); * 2010-2012 Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_View_AddSubFolder extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_AddSubFolder extends SeedDMS_Theme_Style { function js() { /* {{{ */ $strictformcheck = $this->params['strictformcheck']; diff --git a/views/bootstrap/class.AdminTools.php b/views/bootstrap/class.AdminTools.php index 9d03fda18..ee856936f 100644 --- a/views/bootstrap/class.AdminTools.php +++ b/views/bootstrap/class.AdminTools.php @@ -16,7 +16,7 @@ /** * Include parent class */ -require_once("class.Bootstrap.php"); +//require_once("class.Bootstrap.php"); /** * Class which outputs the html page for AdminTools view @@ -29,7 +29,7 @@ require_once("class.Bootstrap.php"); * 2010-2012 Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_View_AdminTools extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_AdminTools extends SeedDMS_Theme_Style { static function wrapRow($content) { /* {{{ */ return self::startRow().$content.self::endRow(); diff --git a/views/bootstrap/class.ApprovalSummary.php b/views/bootstrap/class.ApprovalSummary.php index ea2c46e3c..5dba410e8 100644 --- a/views/bootstrap/class.ApprovalSummary.php +++ b/views/bootstrap/class.ApprovalSummary.php @@ -16,7 +16,7 @@ /** * Include parent class */ -require_once("class.Bootstrap.php"); +//require_once("class.Bootstrap.php"); /** * Include class to preview documents @@ -34,7 +34,7 @@ require_once("SeedDMS/Preview.php"); * 2010-2012 Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_View_ApprovalSummary extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_ApprovalSummary extends SeedDMS_Theme_Style { function js() { /* {{{ */ header('Content-Type: application/javascript; charset=UTF-8'); diff --git a/views/bootstrap/class.ApproveDocument.php b/views/bootstrap/class.ApproveDocument.php index 48528649d..fa3a31af5 100644 --- a/views/bootstrap/class.ApproveDocument.php +++ b/views/bootstrap/class.ApproveDocument.php @@ -16,7 +16,7 @@ /** * Include parent class */ -require_once("class.Bootstrap.php"); +//require_once("class.Bootstrap.php"); /** * Class which outputs the html page for ApproveDocument view @@ -29,7 +29,7 @@ require_once("class.Bootstrap.php"); * 2010-2012 Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_View_ApproveDocument extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_ApproveDocument extends SeedDMS_Theme_Style { function js() { /* {{{ */ header('Content-Type: application/javascript; charset=UTF-8'); @@ -111,8 +111,6 @@ $(document).ready(function() { $this->pageNavigation($this->getFolderPathHTML($folder, true, $document), "view_document", $document); $this->contentHeading(getMLText("add_approval")); - $this->contentContainerStart(); - // Display the Approval form. $approvaltype = ($approvalStatus['type'] == 0) ? 'ind' : 'grp'; if($approvalStatus["status"]!=0) { @@ -134,6 +132,8 @@ $(document).ready(function() { contentContainerStart(); + $this->formField( getMLText("comment"), array( @@ -160,6 +160,7 @@ $(document).ready(function() { 'options'=>$options, ) ); + $this->contentContainerEnd(); $this->formSubmit(getMLText('submit_approval'), $approvaltype.'Approval'); ?> @@ -170,7 +171,6 @@ $(document).ready(function() { contentContainerEnd(); $this->contentEnd(); $this->htmlEndPage(); } /* }}} */ diff --git a/views/bootstrap/class.AttributeMgr.php b/views/bootstrap/class.AttributeMgr.php index 28857d099..45a4a8dc4 100644 --- a/views/bootstrap/class.AttributeMgr.php +++ b/views/bootstrap/class.AttributeMgr.php @@ -16,7 +16,7 @@ /** * Include parent class */ -require_once("class.Bootstrap.php"); +//require_once("class.Bootstrap.php"); /** * Include class to preview documents @@ -34,7 +34,7 @@ require_once("SeedDMS/Preview.php"); * 2010-2012 Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_View_AttributeMgr extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_AttributeMgr extends SeedDMS_Theme_Style { function js() { /* {{{ */ $selattrdef = $this->params['selattrdef']; @@ -172,7 +172,7 @@ $(document).ready( function() { - + contentContainerStart(); print "
"; $this->printFolderChooserHtml("form1",M_READWRITE); - print ""; + print ""; print "
\n"; $this->contentContainerEnd(); @@ -81,7 +81,7 @@ class SeedDMS_View_BackupTools extends SeedDMS_Bootstrap_Style { print "
"; $this->printFolderChooserHtml("form2",M_READWRITE); print ""; - print ""; + print ""; print "
\n"; // list backup files @@ -137,7 +137,7 @@ class SeedDMS_View_BackupTools extends SeedDMS_Bootstrap_Style { $this->contentContainerStart(); print "
"; - print ""; + print ""; print "
\n"; // list backup files diff --git a/views/bootstrap/class.Bootstrap.php b/views/bootstrap/class.Bootstrap.php index 36a879c23..3a524e7a0 100644 --- a/views/bootstrap/class.Bootstrap.php +++ b/views/bootstrap/class.Bootstrap.php @@ -520,59 +520,145 @@ background-image: linear-gradient(to bottom, #882222, #111111);; return; } /* }}} */ - protected function showNavigationBar($menuitems) { /* {{{ */ + protected function showNavigationBar($menuitems, $options = array()) { /* {{{ */ + $content = ''; + $content .= "\n"; foreach($menuitems as $menuitem) { if(!empty($menuitem['children'])) { - echo "
  • \n"; - echo " ".getMLText($menuitem['label'])." \n"; - echo " \n"; } else { - echo "
  • ".getMLText($menuitem['label'])."
  • "; + if(!empty($submenuitem['divider'])) { + $content .= "
  • \n"; + } else { + $content .= "
  • "; + if(!empty($menuitem['attributes'])) + foreach($menuitem['attributes'] as $attr) + $content .= ' '.$attr[0].'="'.$attr[1].'"'; + $content .= $menuitem['label']."
  • "; + } } } + $content .= "\n"; + echo $content; + } /* }}} */ + + protected function showNavigationListWithBadges($menuitems, $options=array()) { /* {{{ */ + $content = ''; + $content .= "\n"; + foreach($menuitems as $menuitem) { + $content .= "
  • \n"; + $content .= ' "; + $content .= ' '."\n"; + $content .= "
  • \n"; + } + + $content .= "\n"; + echo $content; + } /* }}} */ + + protected function showButtonwithMenu($button, $options=array()) { /* {{{ */ + $content = ''; + $content .= ' +
    + + '.$button['label'].' + + +'; + if($button['menuitems']) { + $content .= ' + +'; + } + $content .= ' +
    +'; + echo $content; } /* }}} */ private function folderNavigationBar($folder) { /* {{{ */ $dms = $this->params['dms']; if (!is_object($folder) || !$folder->isType('folder')) { - echo "
      \n"; - echo "
    \n"; + self::showNavigationBar(array()); return; } $accessMode = $folder->getAccessMode($this->params['user']); $folderID = $folder->getID(); echo "".getMLText("folder")."\n"; echo "
    \n"; - echo "
      \n"; $menuitems = array(); if ($accessMode == M_READ && !$this->params['user']->isGuest()) { - $menuitems['edit_folder_notify'] = array('link'=>"../out/out.FolderNotify.php?folderid=".$folderID."&showtree=".showtree(), 'label'=>'edit_folder_notify'); + $menuitems['edit_folder_notify'] = array('link'=>"../out/out.FolderNotify.php?folderid=".$folderID."&showtree=".showtree(), 'label'=>getMLText('edit_folder_notify')); } else if ($accessMode >= M_READWRITE) { - $menuitems['add_subfolder'] = array('link'=>"../out/out.AddSubFolder.php?folderid=". $folderID ."&showtree=".showtree(), 'label'=>'add_subfolder'); - $menuitems['add_document'] = array('link'=>"../out/out.AddDocument.php?folderid=". $folderID ."&showtree=".showtree(), 'label'=>'add_document'); + $menuitems['add_subfolder'] = array('link'=>"../out/out.AddSubFolder.php?folderid=". $folderID ."&showtree=".showtree(), 'label'=>getMLText('add_subfolder')); + $menuitems['add_document'] = array('link'=>"../out/out.AddDocument.php?folderid=". $folderID ."&showtree=".showtree(), 'label'=>getMLText('add_document')); if(0 && $this->params['enablelargefileupload']) - $menuitems['add_multiple_documents'] = array('link'=>"../out/out.AddMultiDocument.php?folderid=". $folderID ."&showtree=".showtree(), 'label'=>'add_multiple_documents'); - $menuitems['edit_folder_props'] = array('link'=>"../out/out.EditFolder.php?folderid=". $folderID ."&showtree=".showtree(), 'label'=>'edit_folder_props'); + $menuitems['add_multiple_documents'] = array('link'=>"../out/out.AddMultiDocument.php?folderid=". $folderID ."&showtree=".showtree(), 'label'=>getMLText('add_multiple_documents')); + $menuitems['edit_folder_props'] = array('link'=>"../out/out.EditFolder.php?folderid=". $folderID ."&showtree=".showtree(), 'label'=>getMLText('edit_folder_props')); if ($folderID != $this->params['rootfolderid'] && $folder->getParent()) - $menuitems['move_folder'] = array('link'=>"../out/out.MoveFolder.php?folderid=". $folderID ."&showtree=".showtree(), 'label'=>'move_folder'); + $menuitems['move_folder'] = array('link'=>"../out/out.MoveFolder.php?folderid=". $folderID ."&showtree=".showtree(), 'label'=>getMLText('move_folder')); if ($accessMode == M_ALL) { if ($folderID != $this->params['rootfolderid'] && $folder->getParent()) - $menuitems['rm_folder'] = array('link'=>"../out/out.RemoveFolder.php?folderid=". $folderID ."&showtree=".showtree(), 'label'=>'rm_folder'); + $menuitems['rm_folder'] = array('link'=>"../out/out.RemoveFolder.php?folderid=". $folderID ."&showtree=".showtree(), 'label'=>getMLText('rm_folder')); } if ($accessMode == M_ALL) { - $menuitems['edit_folder_access'] = array('link'=>"../out/out.FolderAccess.php?folderid=".$folderID."&showtree=".showtree(), 'label'=>'edit_folder_access'); + $menuitems['edit_folder_access'] = array('link'=>"../out/out.FolderAccess.php?folderid=".$folderID."&showtree=".showtree(), 'label'=>getMLText('edit_folder_access')); } - $menuitems['edit_existing_notify'] = array('link'=>"../out/out.FolderNotify.php?folderid=". $folderID ."&showtree=". showtree(), 'label'=>'edit_existing_notify'); + $menuitems['edit_existing_notify'] = array('link'=>"../out/out.FolderNotify.php?folderid=". $folderID ."&showtree=". showtree(), 'label'=>getMLText('edit_existing_notify')); } if ($this->params['user']->isAdmin() && $this->params['enablefullsearch']) { - $menuitems['index_folder'] = array('link'=>"../out/out.Indexer.php?folderid=". $folderID."&showtree=".showtree(), 'label'=>'index_folder'); + $menuitems['index_folder'] = array('link'=>"../out/out.Indexer.php?folderid=". $folderID."&showtree=".showtree(), 'label'=>getMLText('index_folder')); } /* Check if hook exists because otherwise callHook() will override $menuitems */ @@ -581,7 +667,6 @@ background-image: linear-gradient(to bottom, #882222, #111111);; self::showNavigationBar($menuitems); - echo "
    \n"; echo "
    \n"; return; } /* }}} */ @@ -592,38 +677,37 @@ background-image: linear-gradient(to bottom, #882222, #111111);; $docid=".php?documentid=" . $document->getID(); echo "".getMLText("document")."\n"; echo "
    \n"; - echo "
      \n"; $menuitems = array(); if ($accessMode >= M_READWRITE) { if (!$document->isLocked()) { - $menuitems['update_document'] = array('link'=>"../out/out.UpdateDocument".$docid, 'label'=>'update_document'); - $menuitems['lock_document'] = array('link'=>"../op/op.LockDocument".$docid, 'label'=>'lock_document'); - $menuitems['edit_document_props'] = array('link'=>"../out/out.EditDocument".$docid , 'label'=>'edit_document_props'); - $menuitems['move_document'] = array('link'=>"../out/out.MoveDocument".$docid, 'label'=>'move_document'); + $menuitems['update_document'] = array('link'=>"../out/out.UpdateDocument".$docid, 'label'=>getMLText('update_document')); + $menuitems['lock_document'] = array('link'=>"../op/op.LockDocument".$docid, 'label'=>getMLText('lock_document')); + $menuitems['edit_document_props'] = array('link'=>"../out/out.EditDocument".$docid , 'label'=>getMLText('edit_document_props')); + $menuitems['move_document'] = array('link'=>"../out/out.MoveDocument".$docid, 'label'=>getMLText('move_document')); } else { $lockingUser = $document->getLockingUser(); if (($lockingUser->getID() == $this->params['user']->getID()) || ($document->getAccessMode($this->params['user']) == M_ALL)) { - $menuitems['update_document'] = array('link'=>"../out/out.UpdateDocument".$docid, 'label'=>'update_document'); - $menuitems['unlock_document'] = array('link'=>"../op/op.UnlockDocument".$docid, 'label'=>'unlock_document'); - $menuitems['edit_document_props'] = array('link'=>"../out/out.EditDocument".$docid, 'label'=>'edit_document_props'); - $menuitems['move_document'] = array('link'=>"../out/out.MoveDocument".$docid, 'label'=>'move_document'); + $menuitems['update_document'] = array('link'=>"../out/out.UpdateDocument".$docid, 'label'=>getMLText('update_document')); + $menuitems['unlock_document'] = array('link'=>"../op/op.UnlockDocument".$docid, 'label'=>getMLText('unlock_document')); + $menuitems['edit_document_props'] = array('link'=>"../out/out.EditDocument".$docid, 'label'=>getMLText('edit_document_props')); + $menuitems['move_document'] = array('link'=>"../out/out.MoveDocument".$docid, 'label'=>getMLText('move_document')); } } if($accessobject->maySetExpires()) { - $menuitems['expires'] = array('link'=>"../out/out.SetExpires".$docid, 'label'=>'expires'); + $menuitems['expires'] = array('link'=>"../out/out.SetExpires".$docid, 'label'=>getMLText('expires')); } } if ($accessMode == M_ALL) { - $menuitems['rm_document'] = array('link'=>"../out/out.RemoveDocument".$docid, 'label'=>'rm_document'); - $menuitems['edit_document_access'] = array('link'=>"../out/out.DocumentAccess". $docid, 'label'=>'edit_document_access'); + $menuitems['rm_document'] = array('link'=>"../out/out.RemoveDocument".$docid, 'label'=>getMLText('rm_document')); + $menuitems['edit_document_access'] = array('link'=>"../out/out.DocumentAccess". $docid, 'label'=>getMLText('edit_document_access')); } if ($accessMode >= M_READ && !$this->params['user']->isGuest()) { - $menuitems['edit_existing_notify'] = array('link'=>"../out/out.DocumentNotify". $docid, 'label'=>'edit_existing_notify'); + $menuitems['edit_existing_notify'] = array('link'=>"../out/out.DocumentNotify". $docid, 'label'=>getMLText('edit_existing_notify')); } if ($this->params['user']->isAdmin()) { - $menuitems['transfer_document'] = array('link'=>"../out/out.TransferDocument". $docid, 'label'=>'transfer_document'); + $menuitems['transfer_document'] = array('link'=>"../out/out.TransferDocument". $docid, 'label'=>getMLText('transfer_document')); } /* Check if hook exists because otherwise callHook() will override $menuitems */ @@ -644,7 +728,6 @@ background-image: linear-gradient(to bottom, #882222, #111111);; self::showNavigationBar($menuitems); - echo "
    \n"; echo "
    \n"; return; } /* }}} */ @@ -652,20 +735,19 @@ background-image: linear-gradient(to bottom, #882222, #111111);; private function accountNavigationBar() { /* {{{ */ echo "".getMLText("my_account")."\n"; echo "
    \n"; - echo "
      \n"; $menuitems = array(); if ($this->params['user']->isAdmin() || !$this->params['disableselfedit']) - $menuitems['edit_user_details'] = array('link'=>"../out/out.EditUserData.php", 'label'=>'edit_user_details'); + $menuitems['edit_user_details'] = array('link'=>"../out/out.EditUserData.php", 'label'=>getMLText('edit_user_details')); if (!$this->params['user']->isAdmin()) - $menuitems['edit_default_keywords'] = array('link'=>"../out/out.UserDefaultKeywords.php", 'label'=>'edit_default_keywords'); + $menuitems['edit_default_keywords'] = array('link'=>"../out/out.UserDefaultKeywords.php", 'label'=>getMLText('edit_default_keywords')); - $menuitems['edit_notify'] = array('link'=>"../out/out.ManageNotify.php", 'label'=>'edit_existing_notify'); + $menuitems['edit_notify'] = array('link'=>"../out/out.ManageNotify.php", 'label'=>getMLText('edit_existing_notify')); if ($this->params['enableusersview']){ - $menuitems['users'] = array('link'=>"../out/out.UsrView.php", 'label'=>'users'); - $menuitems['groups'] = array('link'=>"../out/out.GroupView.php", 'label'=>'groups'); + $menuitems['users'] = array('link'=>"../out/out.UsrView.php", 'label'=>getMLText('users')); + $menuitems['groups'] = array('link'=>"../out/out.GroupView.php", 'label'=>getMLText('groups')); } /* Check if hook exists because otherwise callHook() will override $menuitems */ @@ -674,7 +756,6 @@ background-image: linear-gradient(to bottom, #882222, #111111);; self::showNavigationBar($menuitems); - echo "
    \n"; echo "
    \n"; return; } /* }}} */ @@ -683,16 +764,15 @@ background-image: linear-gradient(to bottom, #882222, #111111);; echo "".getMLText("my_documents")."\n"; echo "
    \n"; - echo "
      \n"; $menuitems = array(); - $menuitems['inprocess'] = array('link'=>"../out/out.MyDocuments.php?inProcess=1", 'label'=>'documents_in_process'); - $menuitems['all_documents'] = array('link'=>"../out/out.MyDocuments.php", 'label'=>'all_documents'); + $menuitems['inprocess'] = array('link'=>"../out/out.MyDocuments.php?inProcess=1", 'label'=>getMLText('documents_in_process')); + $menuitems['all_documents'] = array('link'=>"../out/out.MyDocuments.php", 'label'=>getMLText('all_documents')); if($this->params['workflowmode'] == 'traditional' || $this->params['workflowmode'] == 'traditional_only_approval') { - $menuitems['review_summary'] = array('link'=>"../out/out.ReviewSummary.php", 'label'=>'review_summary'); - $menuitems['approval_summary'] = array('link'=>"../out/out.ApprovalSummary.php", 'label'=>'approval_summary'); + $menuitems['review_summary'] = array('link'=>"../out/out.ReviewSummary.php", 'label'=>getMLText('review_summary')); + $menuitems['approval_summary'] = array('link'=>"../out/out.ApprovalSummary.php", 'label'=>getMLText('approval_summary')); } else { - $menuitems['workflow_summary'] = array('link'=>"../out/out.WorkflowSummary.php", 'label'=>'workflow_summary'); + $menuitems['workflow_summary'] = array('link'=>"../out/out.WorkflowSummary.php", 'label'=>getMLText('workflow_summary')); } /* Check if hook exists because otherwise callHook() will override $menuitems */ @@ -701,7 +781,6 @@ background-image: linear-gradient(to bottom, #882222, #111111);; self::showNavigationBar($menuitems); - echo "
    \n"; echo "
    \n"; return; } /* }}} */ @@ -709,47 +788,46 @@ background-image: linear-gradient(to bottom, #882222, #111111);; private function adminToolsNavigationBar() { /* {{{ */ echo " ".getMLText("admin_tools")."\n"; echo "
    \n"; - echo "
      \n"; $menuitems = array(); - $menuitems['user_group_management'] = array('link'=>"#", 'label'=>'user_group_management'); - $menuitems['user_group_management']['children']['user_management'] = array('link'=>"../out/out.UsrMgr.php", 'label'=>'user_management'); - $menuitems['user_group_management']['children']['group_management'] = array('link'=>"../out/out.GroupMgr.php", 'label'=>'group_management'); - $menuitems['user_group_management']['children']['user_list'] = array('link'=>"../out/out.UserList.php", 'label'=>'user_list'); + $menuitems['user_group_management'] = array('link'=>"#", 'label'=>getMLText('user_group_management')); + $menuitems['user_group_management']['children']['user_management'] = array('link'=>"../out/out.UsrMgr.php", 'label'=>getMLText('user_management')); + $menuitems['user_group_management']['children']['group_management'] = array('link'=>"../out/out.GroupMgr.php", 'label'=>getMLText('group_management')); + $menuitems['user_group_management']['children']['user_list'] = array('link'=>"../out/out.UserList.php", 'label'=>getMLText('user_list')); - $menuitems['definitions'] = array('link'=>"#", 'label'=>'definitions'); - $menuitems['definitions']['children']['default_keywords'] = array('link'=>"../out/out.DefaultKeywords.php", 'label'=>'global_default_keywords'); - $menuitems['definitions']['children']['document_categories'] = array('link'=>"../out/out.Categories.php", 'label'=>'global_document_categories'); - $menuitems['definitions']['children']['attribute_definitions'] = array('link'=>"../out/out.AttributeMgr.php", 'label'=>'global_attributedefinitions'); + $menuitems['definitions'] = array('link'=>"#", 'label'=>getMLText('definitions')); + $menuitems['definitions']['children']['default_keywords'] = array('link'=>"../out/out.DefaultKeywords.php", 'label'=>getMLText('global_default_keywords')); + $menuitems['definitions']['children']['document_categories'] = array('link'=>"../out/out.Categories.php", 'label'=>getMLText('global_document_categories')); + $menuitems['definitions']['children']['attribute_definitions'] = array('link'=>"../out/out.AttributeMgr.php", 'label'=>getMLText('global_attributedefinitions')); if($this->params['workflowmode'] == 'advanced') { - $menuitems['definitions']['children']['workflows'] = array('link'=>"../out/out.WorkflowMgr.php", 'label'=>'global_workflows'); - $menuitems['definitions']['children']['workflow_states'] = array('link'=>"../out/out.WorkflowStatesMgr.php", 'label'=>'global_workflow_states'); - $menuitems['definitions']['children']['workflow_actions'] = array('link'=>"../out/out.WorkflowActionsMgr.php", 'label'=>'global_workflow_actions'); + $menuitems['definitions']['children']['workflows'] = array('link'=>"../out/out.WorkflowMgr.php", 'label'=>getMLText('global_workflows')); + $menuitems['definitions']['children']['workflow_states'] = array('link'=>"../out/out.WorkflowStatesMgr.php", 'label'=>getMLText('global_workflow_states')); + $menuitems['definitions']['children']['workflow_actions'] = array('link'=>"../out/out.WorkflowActionsMgr.php", 'label'=>getMLText('global_workflow_actions')); } if($this->params['enablefullsearch']) { - $menuitems['fulltext'] = array('link'=>"#", 'label'=>'fullsearch'); - $menuitems['fulltext']['children']['update_fulltext_index'] = array('link'=>"../out/out.Indexer.php", 'label'=>'update_fulltext_index'); - $menuitems['fulltext']['children']['create_fulltext_index'] = array('link'=>"../out/out.CreateIndex.php", 'label'=>'create_fulltext_index'); - $menuitems['fulltext']['children']['fulltext_info'] = array('link'=>"../out/out.IndexInfo.php", 'label'=>'fulltext_info'); + $menuitems['fulltext'] = array('link'=>"#", 'label'=>getMLText('fullsearch')); + $menuitems['fulltext']['children']['update_fulltext_index'] = array('link'=>"../out/out.Indexer.php", 'label'=>getMLText('update_fulltext_index')); + $menuitems['fulltext']['children']['create_fulltext_index'] = array('link'=>"../out/out.CreateIndex.php", 'label'=>getMLText('create_fulltext_index')); + $menuitems['fulltext']['children']['fulltext_info'] = array('link'=>"../out/out.IndexInfo.php", 'label'=>getMLText('fulltext_info')); } - $menuitems['backup_log_management'] = array('link'=>"#", 'label'=>'backup_log_management'); - $menuitems['backup_log_management']['children'][] = array('link'=>"../out/out.BackupTools.php", 'label'=>'backup_tools'); + $menuitems['backup_log_management'] = array('link'=>"#", 'label'=>getMLText('backup_log_management')); + $menuitems['backup_log_management']['children'][] = array('link'=>"../out/out.BackupTools.php", 'label'=>getMLText('backup_tools')); if ($this->params['logfileenable']) - $menuitems['backup_log_management']['children'][] = array('link'=>"../out/out.LogManagement.php", 'label'=>'log_management'); + $menuitems['backup_log_management']['children'][] = array('link'=>"../out/out.LogManagement.php", 'label'=>getMLText('log_management')); - $menuitems['misc'] = array('link'=>"#", 'label'=>'misc'); - $menuitems['misc']['children']['import_fs'] = array('link'=>"../out/out.ImportFS.php", 'label'=>'import_fs'); - $menuitems['misc']['children']['import_users'] = array('link'=>"../out/out.ImportUsers.php", 'label'=>'import_users'); - $menuitems['misc']['children']['folders_and_documents_statistic'] = array('link'=>"../out/out.Statistic.php", 'label'=>'folders_and_documents_statistic'); - $menuitems['misc']['children']['charts'] = array('link'=>"../out/out.Charts.php", 'label'=>'charts'); - $menuitems['misc']['children']['timeline'] = array('link'=>"../out/out.Timeline.php", 'label'=>'timeline'); - $menuitems['misc']['children']['objectcheck'] = array('link'=>"../out/out.ObjectCheck.php", 'label'=>'objectcheck'); - $menuitems['misc']['children']['documents_expired'] = array('link'=>"../out/out.ExpiredDocuments.php", 'label'=>'documents_expired'); - $menuitems['misc']['children']['extension_manager'] = array('link'=>"../out/out.ExtensionMgr.php", 'label'=>'extension_manager'); - $menuitems['misc']['children']['clear_cache'] = array('link'=>"../out/out.ClearCache.php", 'label'=>'clear_cache'); - $menuitems['misc']['children']['version_info'] = array('link'=>"../out/out.Info.php", 'label'=>'version_info'); + $menuitems['misc'] = array('link'=>"#", 'label'=>getMLText('misc')); + $menuitems['misc']['children']['import_fs'] = array('link'=>"../out/out.ImportFS.php", 'label'=>getMLText('import_fs')); + $menuitems['misc']['children']['import_users'] = array('link'=>"../out/out.ImportUsers.php", 'label'=>getMLText('import_users')); + $menuitems['misc']['children']['folders_and_documents_statistic'] = array('link'=>"../out/out.Statistic.php", 'label'=>getMLText('folders_and_documents_statistic')); + $menuitems['misc']['children']['charts'] = array('link'=>"../out/out.Charts.php", 'label'=>getMLText('charts')); + $menuitems['misc']['children']['timeline'] = array('link'=>"../out/out.Timeline.php", 'label'=>getMLText('timeline')); + $menuitems['misc']['children']['objectcheck'] = array('link'=>"../out/out.ObjectCheck.php", 'label'=>getMLText('objectcheck')); + $menuitems['misc']['children']['documents_expired'] = array('link'=>"../out/out.ExpiredDocuments.php", 'label'=>getMLText('documents_expired')); + $menuitems['misc']['children']['extension_manager'] = array('link'=>"../out/out.ExtensionMgr.php", 'label'=>getMLText('extension_manager')); + $menuitems['misc']['children']['clear_cache'] = array('link'=>"../out/out.ClearCache.php", 'label'=>getMLText('clear_cache')); + $menuitems['misc']['children']['version_info'] = array('link'=>"../out/out.Info.php", 'label'=>getMLText('version_info')); /* Check if hook exists because otherwise callHook() will override $menuitems */ if($this->hasHook('admintoolsNavigationBar')) @@ -757,7 +835,6 @@ background-image: linear-gradient(to bottom, #882222, #111111);; self::showNavigationBar($menuitems); - echo "
    \n"; echo "
    \n"; return; } /* }}} */ @@ -782,11 +859,10 @@ background-image: linear-gradient(to bottom, #882222, #111111);; private function calendarNavigationBar($d){ /* {{{ */ echo "".getMLText("calendar")."\n"; echo "
    \n"; - echo "
      \n"; $menuitems = array(); if (!$this->params['user']->isGuest()) - $menuitems['addevent'] = array('link'=>"../out/out.AddEvent.php", 'label'=>'add_event'); + $menuitems['addevent'] = array('link'=>"../out/out.AddEvent.php", 'label'=>getMLText('add_event')); /* Check if hook exists because otherwise callHook() will override $menuitems */ if($this->hasHook('calendarNavigationBar')) @@ -794,7 +870,6 @@ background-image: linear-gradient(to bottom, #882222, #111111);; self::showNavigationBar($menuitems); - echo "
    \n"; echo "
    \n"; return; diff --git a/views/bootstrap/class.Calendar.php b/views/bootstrap/class.Calendar.php index bee4fe63d..ef364f11d 100644 --- a/views/bootstrap/class.Calendar.php +++ b/views/bootstrap/class.Calendar.php @@ -16,7 +16,7 @@ /** * Include parent class */ -require_once("class.Bootstrap.php"); +//require_once("class.Bootstrap.php"); /** * Include class to preview documents @@ -34,7 +34,7 @@ require_once("SeedDMS/Preview.php"); * 2010-2012 Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_View_Calendar extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_Calendar extends SeedDMS_Theme_Style { function iteminfo() { /* {{{ */ $dms = $this->params['dms']; diff --git a/views/bootstrap/class.Categories.php b/views/bootstrap/class.Categories.php index 2dbf313ba..3931cfd80 100644 --- a/views/bootstrap/class.Categories.php +++ b/views/bootstrap/class.Categories.php @@ -16,7 +16,7 @@ /** * Include parent class */ -require_once("class.Bootstrap.php"); +//require_once("class.Bootstrap.php"); /** * Include class to preview documents @@ -34,7 +34,7 @@ require_once("SeedDMS/Preview.php"); * 2010-2012 Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_View_Categories extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_Categories extends SeedDMS_Theme_Style { function js() { /* {{{ */ $selcat = $this->params['selcategory']; diff --git a/views/bootstrap/class.CategoryChooser.php b/views/bootstrap/class.CategoryChooser.php index 737252655..5521b5a29 100644 --- a/views/bootstrap/class.CategoryChooser.php +++ b/views/bootstrap/class.CategoryChooser.php @@ -16,7 +16,7 @@ /** * Include parent class */ -require_once("class.Bootstrap.php"); +//require_once("class.Bootstrap.php"); /** * Class which outputs the html page for CategoryChooser view @@ -29,7 +29,7 @@ require_once("class.Bootstrap.php"); * 2010-2012 Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_View_CategoryChooser extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_CategoryChooser extends SeedDMS_Theme_Style { function show() { /* {{{ */ $dms = $this->params['dms']; diff --git a/views/bootstrap/class.ChangePassword.php b/views/bootstrap/class.ChangePassword.php index 41e4b4e5b..158f8e462 100644 --- a/views/bootstrap/class.ChangePassword.php +++ b/views/bootstrap/class.ChangePassword.php @@ -16,7 +16,7 @@ /** * Include parent class */ -require_once("class.Bootstrap.php"); +//require_once("class.Bootstrap.php"); /** * Class which outputs the html page for ChangePassword view @@ -29,7 +29,7 @@ require_once("class.Bootstrap.php"); * 2010-2012 Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_View_ChangePassword extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_ChangePassword extends SeedDMS_Theme_Style { function js() { /* {{{ */ header('Content-Type: application/javascript; charset=UTF-8'); @@ -48,7 +48,6 @@ document.form1.newpassword.focus(); $this->globalBanner(); $this->contentStart(); $this->pageNavigation(getMLText("change_password")); - $this->contentContainerStart(); ?>
    @@ -59,6 +58,7 @@ document.form1.newpassword.focus(); if ($hash) { echo ""; } + $this->contentContainerStart(); $this->formField( getMLText("password"), '' @@ -83,11 +83,10 @@ document.form1.newpassword.focus(); 'autocomplete'=>'off', ) ); + $this->contentContainerEnd(); $this->formSubmit(getMLText('submit_password')); ?> -
    -contentContainerEnd(); ?>

    contentEnd(); diff --git a/views/bootstrap/class.Charts.php b/views/bootstrap/class.Charts.php index 117caecc0..282b8c05f 100644 --- a/views/bootstrap/class.Charts.php +++ b/views/bootstrap/class.Charts.php @@ -16,7 +16,7 @@ /** * Include parent class */ -require_once("class.Bootstrap.php"); +//require_once("class.Bootstrap.php"); /** * Class which outputs the html page for Charts view @@ -29,7 +29,7 @@ require_once("class.Bootstrap.php"); * 2010-2012 Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_View_Charts extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_Charts extends SeedDMS_Theme_Style { function js() { /* {{{ */ $data = $this->params['data']; diff --git a/views/bootstrap/class.ClearCache.php b/views/bootstrap/class.ClearCache.php index 69ef1972e..099bcadcd 100644 --- a/views/bootstrap/class.ClearCache.php +++ b/views/bootstrap/class.ClearCache.php @@ -16,7 +16,7 @@ /** * Include parent class */ -require_once("class.Bootstrap.php"); +//require_once("class.Bootstrap.php"); /** * Class which outputs the html page for ClearCache view @@ -29,7 +29,7 @@ require_once("class.Bootstrap.php"); * 2010-2012 Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_View_ClearCache extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_ClearCache extends SeedDMS_Theme_Style { function show() { /* {{{ */ $dms = $this->params['dms']; diff --git a/views/bootstrap/class.Clipboard.php b/views/bootstrap/class.Clipboard.php index 928013494..119ca805a 100644 --- a/views/bootstrap/class.Clipboard.php +++ b/views/bootstrap/class.Clipboard.php @@ -50,29 +50,38 @@ class SeedDMS_View_Clipboard extends SeedDMS_Theme_Style { if ($this->params['user']->isGuest() || (count($clipboard['docs']) + count($clipboard['folders'])) == 0) { return ''; } + + $menuitems = []; + $content = ''; $content .= "
      \n"; $content .= "
    • \n"; $content .= " ".getMLText('clipboard')." (".count($clipboard['folders'])."/".count($clipboard['docs']).") \n"; $content .= "
        \n"; + $subitems = []; foreach($clipboard['folders'] as $folderid) { - if($folder = $this->params['dms']->getFolder($folderid)) + if($folder = $this->params['dms']->getFolder($folderid)) { $content .= "
      • getID()."\" class=\"table-row-folder droptarget\" data-droptarget=\"folder_".$folder->getID()."\" rel=\"folder_".$folder->getID()."\" data-name=\"".htmlspecialchars($folder->getName(), ENT_QUOTES)."\" data-uploadformtoken=\"".createFormKey('')."\" formtoken=\"".createFormKey('')."\"> ".htmlspecialchars($folder->getName())."
      • \n"; + $subitems[] = array('label'=>' '.$folder->getName(), 'link'=>"../out/out.ViewFolder.php?folderid=".$folder->getID(), 'class'=>"table-row-folder droptarget", 'rel'=>"folder_".$folder->getID(), 'attributes'=>array(array('data-droptarget', "folder_".$folder->getID()), array('data-name', htmlspecialchars($folder->getName(), ENT_QUOTES)))); + } } foreach($clipboard['docs'] as $docid) { if($document = $this->params['dms']->getDocument($docid)) $content .= "
      • getID()."\" class=\"table-row-document droptarget\" data-droptarget=\"document_".$document->getID()."\" rel=\"document_".$document->getID()."\" data-name=\"".htmlspecialchars($document->getName(), ENT_QUOTES)."\" formtoken=\"".createFormKey('')."\"> ".htmlspecialchars($document->getName())."
      • \n"; + $subitems[] = array('label'=>' '.$document->getName(), 'link'=>"../out/out.ViewDocument.php?documentid=".$document->getID(), 'class'=>"table-row-document droptarget", 'rel'=>"document_".$document->getID(), 'attributes'=>array(array('data-droptarget', "document_".$document->getID()), array('data-name', htmlspecialchars($document->getName(), ENT_QUOTES)))); } $content .= "
      • \n"; + $subitems[] = array('divider'=>true); if(isset($this->params['folder']) && $this->params['folder']->getAccessMode($this->params['user']) >= M_READWRITE) { $content .= "
      • params['folder']->getID()."&refferer=".urlencode('../out/out.ViewFolder.php?folderid='.$this->params['folder']->getID())."\">".getMLText("move_clipboard")."
      • \n"; + $subitems[] = array('label'=>getMLText("move_clipboard"), 'link'=>"../op/op.MoveClipboard.php?targetid=".$this->params['folder']->getID()."&refferer=".urlencode('../out/out.ViewFolder.php?folderid='.$this->params['folder']->getID())); } // $content .= "
      • params['refferer'])."\">".getMLText("clear_clipboard")."kkk
      • \n"; // $content .= "
      • ".getMLText("clear_clipboard")."
      • \n"; - $menuitems = array(); - $menuitems['clear_clipboard'] = array('label'=>'clear_clipboard', 'attributes'=>array(array('class', 'ajax-click'), array('data-href', '../op/op.Ajax.php'), array('data-param1', 'command=clearclipboard'))); + $subitems[] = array('label'=>getMLText('clear_clipboard'), 'attributes'=>array(array('class', 'ajax-click'), array('data-href', '../op/op.Ajax.php'), array('data-param1', 'command=clearclipboard'))); if($this->hasHook('clipboardMenuItems')) - $menuitems = $this->callHook('clipboardMenuItems', $clipboard, $menuitems); + $subitems = $this->callHook('clipboardMenuItems', $clipboard, $subitems); + /* foreach($menuitems as $menuitem) { $content .= "
      • "; $content .= "getMLText('clipboard')." (".count($clipboard['folders'])."/". count($clipboard['docs']).")", 'children'=>$subitems); + self::showNavigationBar($menuitems, array('right'=>true)); +// echo $content; } /* }}} */ /** diff --git a/views/bootstrap/class.CreateIndex.php b/views/bootstrap/class.CreateIndex.php index 733e5a7d7..7ec208154 100644 --- a/views/bootstrap/class.CreateIndex.php +++ b/views/bootstrap/class.CreateIndex.php @@ -16,7 +16,7 @@ /** * Include parent class */ -require_once("class.Bootstrap.php"); +//require_once("class.Bootstrap.php"); /** * Class which outputs the html page for CreateIndex view @@ -29,7 +29,7 @@ require_once("class.Bootstrap.php"); * 2010-2012 Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_View_CreateIndex extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_CreateIndex extends SeedDMS_Theme_Style { function js() { /* {{{ */ header('Content-Type: application/javascript; charset=UTF-8'); @@ -41,12 +41,10 @@ class SeedDMS_View_CreateIndex extends SeedDMS_Bootstrap_Style { $this->contentStart(); $this->pageNavigation(getMLText('admin_tools'), 'admin_tools'); $this->contentHeading(getMLText("create_fulltext_index")); - $this->contentContainerStart(); - echo '

        '.getMLText('create_fulltext_index_warning').'

        '; - echo ''.getMLText('confirm_create_fulltext_index').''; + $this->warningMsg(getMLText('create_fulltext_index_warning')); + echo '

        '.getMLText('confirm_create_fulltext_index').'

        '; - $this->contentContainerEnd(); $this->contentEnd(); $this->htmlEndPage(); } /* }}} */ diff --git a/views/bootstrap/class.DefaultKeywords.php b/views/bootstrap/class.DefaultKeywords.php index 6c891dca6..dcd12592f 100644 --- a/views/bootstrap/class.DefaultKeywords.php +++ b/views/bootstrap/class.DefaultKeywords.php @@ -16,7 +16,7 @@ /** * Include parent class */ -require_once("class.Bootstrap.php"); +//require_once("class.Bootstrap.php"); /** * Class which outputs the html page for DefaultKeywords view @@ -29,7 +29,7 @@ require_once("class.Bootstrap.php"); * 2010-2012 Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_View_DefaultKeywords extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_DefaultKeywords extends SeedDMS_Theme_Style { function js() { /* {{{ */ header('Content-Type: application/javascript; charset=UTF-8'); diff --git a/views/bootstrap/class.DocumentAccess.php b/views/bootstrap/class.DocumentAccess.php index 5c4bf6e1a..acccb932d 100644 --- a/views/bootstrap/class.DocumentAccess.php +++ b/views/bootstrap/class.DocumentAccess.php @@ -16,7 +16,7 @@ /** * Include parent class */ -require_once("class.Bootstrap.php"); +//require_once("class.Bootstrap.php"); /** * Class which outputs the html page for DocumentAccess view @@ -29,7 +29,7 @@ require_once("class.Bootstrap.php"); * 2010-2012 Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_View_DocumentAccess extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_DocumentAccess extends SeedDMS_Theme_Style { function printAccessModeSelection($defMode) { /* {{{ */ echo self::getAccessModeSelection($defMode); } /* }}} */ @@ -137,14 +137,14 @@ $(document).ready( function() { - "> + ">
        - "> + ">

        params['user']; diff --git a/views/bootstrap/class.DocumentNotify.php b/views/bootstrap/class.DocumentNotify.php index d94baf2fa..c9a1750ff 100644 --- a/views/bootstrap/class.DocumentNotify.php +++ b/views/bootstrap/class.DocumentNotify.php @@ -16,7 +16,7 @@ /** * Include parent class */ -require_once("class.Bootstrap.php"); +//require_once("class.Bootstrap.php"); /** * Class which outputs the html page for DocumentNotify view @@ -29,7 +29,7 @@ require_once("class.Bootstrap.php"); * 2010-2012 Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_View_DocumentNotify extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_DocumentNotify extends SeedDMS_Theme_Style { function js() { /* {{{ */ header('Content-Type: application/javascript; charset=UTF-8'); diff --git a/views/bootstrap/class.DocumentVersionDetail.php b/views/bootstrap/class.DocumentVersionDetail.php index 14e78b499..9c75985be 100644 --- a/views/bootstrap/class.DocumentVersionDetail.php +++ b/views/bootstrap/class.DocumentVersionDetail.php @@ -16,7 +16,7 @@ /** * Include parent class */ -require_once("class.Bootstrap.php"); +//require_once("class.Bootstrap.php"); /** * Include class to preview documents @@ -34,7 +34,7 @@ require_once("SeedDMS/Preview.php"); * 2010-2012 Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_View_DocumentVersionDetail extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_DocumentVersionDetail extends SeedDMS_Theme_Style { /** * Output a single attribute in the document info section @@ -160,9 +160,9 @@ class SeedDMS_View_DocumentVersionDetail extends SeedDMS_Bootstrap_Style { $this->rowStart(); $this->columnStart(4); $this->contentHeading(getMLText("document_infos")); - $this->contentContainerStart(); +// $this->contentContainerStart(); ?> - +
        : @@ -239,7 +239,7 @@ class SeedDMS_View_DocumentVersionDetail extends SeedDMS_Bootstrap_Style { ?>
        contentContainerEnd(); +// $this->contentContainerEnd(); $this->preview(); $this->columnEnd(); $this->columnStart(8); @@ -262,8 +262,20 @@ class SeedDMS_View_DocumentVersionDetail extends SeedDMS_Bootstrap_Style { print "
      "; $previewer = new SeedDMS_Preview_Previewer($cachedir, $previewwidthdetail, $timeout, $xsendfile); $previewer->createPreview($version); + if ($file_exists) { + if ($viewonlinefiletypes && (in_array(strtolower($version->getFileType()), $viewonlinefiletypes) || in_array(strtolower($version->getMimeType()), $viewonlinefiletypes))) { + print "getDocument()->getId()."&version=". $version->getVersion()."\">"; + } else { + print "getDocument()->getId()."&version=".$version->getVersion()."\">"; + } + } if($previewer->hasPreview($version)) { print("getID()."&version=".$version->getVersion()."&width=".$previewwidthdetail."\" title=\"".htmlspecialchars($version->getMimeType())."\">"); + } else { + print "getMimeIcon($version->getFileType())."\" title=\"".htmlspecialchars($version->getMimeType())."\">"; + } + if ($file_exists) { + print ""; } print "\n"; diff --git a/views/bootstrap/class.DropFolderChooser.php b/views/bootstrap/class.DropFolderChooser.php index 20a140212..0800c9868 100644 --- a/views/bootstrap/class.DropFolderChooser.php +++ b/views/bootstrap/class.DropFolderChooser.php @@ -66,7 +66,7 @@ $('.folderselect').click(function(ev) { $previewer = new SeedDMS_Preview_Previewer($cachedir, $previewwidth, $timeout, $xsendfile); $c = 0; // count files - $filecontent = ''; + $menuitems['dropfolder'] = array('label'=>'', 'children'=>array()); $dir = rtrim($dropfolderdir, '/').'/'.$user->getLogin(); /* Check if we are still looking in the configured directory and * not somewhere else, e.g. if the login was '../test' @@ -80,34 +80,30 @@ $('.folderselect').click(function(ev) { if($entry != '..' && $entry != '.') { if($showfolders == 0 && !is_dir($dir.'/'.$entry)) { $c++; + $subitem = array('label'=>'', 'attributes'=>array(array('title', getMLText('menu_upload_from_dropfolder')))); + if($folder) + $subitem['link'] = '../out/out.AddDocument.php?folderid='.$folder->getId()."&dropfolderfileform1=".urldecode($entry); $mimetype = finfo_file($finfo, $dir.'/'.$entry); - $filecontent .= "
    • getId()."&dropfolderfileform1=".urldecode($entry)."\" title=\"".getMLText('menu_upload_from_dropfolder')."\"" : "").">"; if($previewwidth) { $previewer->createRawPreview($dir.'/'.$entry, 'dropfolder/', $mimetype); if($previewer->hasRawPreview($dir.'/'.$entry, 'dropfolder/')) { - $filecontent .= "
      "; + $subitem['label'] .= "
      "; } } - $filecontent .= "
      ".$entry."
      ".SeedDMS_Core_File::format_filesize(filesize($dir.'/'.$entry)).", ".date('Y-m-d H:i:s', filectime($dir.'/'.$entry))."
    • \n"; + $subitem['label'] .= "
      ".$entry."
      ".SeedDMS_Core_File::format_filesize(filesize($dir.'/'.$entry)).", ".date('Y-m-d H:i:s', filectime($dir.'/'.$entry))."
      "; + $menuitems['dropfolder']['children'][] = $subitem; } elseif($showfolders && is_dir($dir.'/'.$entry)) { - $filecontent .= "
    • ".$entry."
    • "; + $subitem = array('label'=>$entry); + $menuitems['dropfolder']['children'][] = $subitem; } } } } } - $content = ''; if($c) { - $content .= " \n"; + $menuitems['dropfolder']['label'] = getMLText('menu_dropfolder')." (".$c.")"; + self::showNavigationBar($menuitems, array('id'=>'main-menu-dropfolderlist', 'right'=>true)); } - echo $content; } /* }}} */ function show() { /* {{{ */ diff --git a/views/bootstrap/class.EditAttributes.php b/views/bootstrap/class.EditAttributes.php index 7708b7515..80d4c0559 100644 --- a/views/bootstrap/class.EditAttributes.php +++ b/views/bootstrap/class.EditAttributes.php @@ -16,7 +16,7 @@ /** * Include parent class */ -require_once("class.Bootstrap.php"); +//require_once("class.Bootstrap.php"); /** * Class which outputs the html page for EditAttributes view @@ -29,7 +29,7 @@ require_once("class.Bootstrap.php"); * 2010-2012 Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_View_EditAttributes extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_EditAttributes extends SeedDMS_Theme_Style { function show() { /* {{{ */ $dms = $this->params['dms']; diff --git a/views/bootstrap/class.EditComment.php b/views/bootstrap/class.EditComment.php index 8f049b377..072c96820 100644 --- a/views/bootstrap/class.EditComment.php +++ b/views/bootstrap/class.EditComment.php @@ -16,7 +16,7 @@ /** * Include parent class */ -require_once("class.Bootstrap.php"); +//require_once("class.Bootstrap.php"); /** * Class which outputs the html page for EditComment view @@ -29,7 +29,7 @@ require_once("class.Bootstrap.php"); * 2010-2012 Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_View_EditComment extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_EditComment extends SeedDMS_Theme_Style { function js() { /* {{{ */ $strictformcheck = $this->params['strictformcheck']; diff --git a/views/bootstrap/class.EditDocument.php b/views/bootstrap/class.EditDocument.php index 41f759cd0..89f49bdde 100644 --- a/views/bootstrap/class.EditDocument.php +++ b/views/bootstrap/class.EditDocument.php @@ -16,7 +16,7 @@ /** * Include parent class */ -require_once("class.Bootstrap.php"); +//require_once("class.Bootstrap.php"); /** * Class which outputs the html page for EditDocument view @@ -29,7 +29,7 @@ require_once("class.Bootstrap.php"); * 2010-2012 Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_View_EditDocument extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_EditDocument extends SeedDMS_Theme_Style { function js() { /* {{{ */ $strictformcheck = $this->params['strictformcheck']; diff --git a/views/bootstrap/class.EditDocumentFile.php b/views/bootstrap/class.EditDocumentFile.php index 7fa5691ac..226b20b71 100644 --- a/views/bootstrap/class.EditDocumentFile.php +++ b/views/bootstrap/class.EditDocumentFile.php @@ -16,7 +16,7 @@ /** * Include parent class */ -require_once("class.Bootstrap.php"); +//require_once("class.Bootstrap.php"); /** * Class which outputs the html page for EditDocumentFile view @@ -29,7 +29,7 @@ require_once("class.Bootstrap.php"); * 2010-2012 Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_View_EditDocumentFile extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_EditDocumentFile extends SeedDMS_Theme_Style { function show() { /* {{{ */ $dms = $this->params['dms']; @@ -43,7 +43,6 @@ class SeedDMS_View_EditDocumentFile extends SeedDMS_Bootstrap_Style { $this->contentStart(); $this->pageNavigation($this->getFolderPathHTML($folder, true, $document), "view_document", $document); $this->contentHeading(getMLText("edit")); - $this->contentContainerStart(); ?>
      @@ -51,6 +50,7 @@ class SeedDMS_View_EditDocumentFile extends SeedDMS_Bootstrap_Style { contentContainerStart(); $options = array(); $options[] = array("", getMLText('document')); $versions = $document->getContent(); @@ -94,13 +94,11 @@ class SeedDMS_View_EditDocumentFile extends SeedDMS_Bootstrap_Style { 'checked'=>$file->isPublic() ) ); -?> -contentContainerEnd(); $this->formSubmit(" ".getMLText('save')); ?>
      contentContainerEnd(); $this->contentEnd(); $this->htmlEndPage(); } /* }}} */ diff --git a/views/bootstrap/class.EditFolder.php b/views/bootstrap/class.EditFolder.php index 8f64ba3d0..927a37ba7 100644 --- a/views/bootstrap/class.EditFolder.php +++ b/views/bootstrap/class.EditFolder.php @@ -16,7 +16,7 @@ /** * Include parent class */ -require_once("class.Bootstrap.php"); +//require_once("class.Bootstrap.php"); /** * Class which outputs the html page for EditFolder view @@ -29,7 +29,7 @@ require_once("class.Bootstrap.php"); * 2010-2012 Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_View_EditFolder extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_EditFolder extends SeedDMS_Theme_Style { function js() { /* {{{ */ $strictformcheck = $this->params['strictformcheck']; diff --git a/views/bootstrap/class.EditOnline.php b/views/bootstrap/class.EditOnline.php index f366e9131..5b2fe136b 100644 --- a/views/bootstrap/class.EditOnline.php +++ b/views/bootstrap/class.EditOnline.php @@ -16,7 +16,7 @@ /** * Include parent class */ -require_once("class.Bootstrap.php"); +//require_once("class.Bootstrap.php"); /** * Class which outputs the html page for EditOnline view @@ -29,7 +29,7 @@ require_once("class.Bootstrap.php"); * 2010-2012 Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_View_EditOnline extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_EditOnline extends SeedDMS_Theme_Style { var $dms; var $folder_count; var $document_count; @@ -127,10 +127,10 @@ $(document).ready(function() { $set = 'markdown'; //default or markdown $skin = 'simple'; // simple or markitup - $this->htmlAddHeader(''."\n", 'css'); - $this->htmlAddHeader(''."\n", 'css'); - $this->htmlAddHeader(''."\n", 'js'); - $this->htmlAddHeader(''."\n", 'js'); + $this->htmlAddHeader(''."\n", 'css'); + $this->htmlAddHeader(''."\n", 'css'); + $this->htmlAddHeader(''."\n", 'js'); + $this->htmlAddHeader(''."\n", 'js'); $this->htmlStartPage(getMLText("edit_online")); $this->globalNavigation(); @@ -143,7 +143,7 @@ $(document).ready(function() { ?>
      -"; break; case 'input': default: - echo '"; + switch($value['type']) { + default: + echo '"; + break; + } break; } } From 314a35b2d8bd88926ce4466dcf3d9f4172f4a56a Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Sun, 18 Apr 2021 13:01:11 +0200 Subject: [PATCH 017/403] backport check_view_access and check_controller_access for smoother migration --- inc/inc.ClassAccessOperation.php | 144 +++++++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) diff --git a/inc/inc.ClassAccessOperation.php b/inc/inc.ClassAccessOperation.php index 0b838d546..3f0b99b07 100644 --- a/inc/inc.ClassAccessOperation.php +++ b/inc/inc.ClassAccessOperation.php @@ -300,4 +300,148 @@ class SeedDMS_AccessOperation { } return false; } /* }}} */ + + protected function check_view_legacy_access($view, $get=array()) { /* {{{ */ + if($this->user->isAdmin()) + return true; + + if(is_string($view)) { + $scripts = array($view); + } elseif(is_array($view)) { + $scripts = $view; + } elseif(is_subclass_of($view, 'SeedDMS_View_Common')) { + $scripts = array($view->getParam('class')); + } else { + return false; + } + + if($this->user->isGuest()) { + $user_allowed = array( + 'Calendar', + 'ErrorDlg', + 'Help', + 'Login', + 'Search', + 'ViewDocument', + 'ViewFolder', + ); + } else { + $user_allowed = array( + 'AddDocument', + 'AddDocumentLink', + 'AddEvent', + 'AddFile', + 'AddSubFolder', + 'AddToTransmittal', + 'ApprovalSummary', + 'ApproveDocument', + 'Calendar', + 'CategoryChooser', + 'ChangePassword', + 'CheckInDocument', + 'Clipboard', + 'DocumentAccess', + 'DocumentChooser', + 'DocumentNotify', + 'DocumentVersionDetail', + 'DropFolderChooser', + 'EditAttributes', + 'EditComment', + 'EditDocumentFile', + 'EditDocument', + 'EditEvent', + 'EditFolder', + 'EditOnline', + 'EditUserData', + 'ErrorDlg', + 'FolderAccess', + 'FolderChooser', + 'FolderNotify', + 'ForcePasswordChange', + 'GroupView', + 'Help', + 'KeywordChooser', + 'Login', + 'ManageNotify', + 'MoveDocument', + 'MoveFolder', + 'MyAccount', + 'MyDocuments', + 'OpensearchDesc', + 'OverrideContentStatus', + 'PasswordForgotten', + 'PasswordSend', + 'ReceiptDocument', + 'ReceiptSummary', + 'RemoveDocumentFile', + 'RemoveDocument', + 'RemoveEvent', + 'RemoveFolderFiles', + 'RemoveFolder', + 'RemoveTransmittal', + 'RemoveVersion', + 'RemoveWorkflowFromDocument', + 'ReturnFromSubWorkflow', + 'ReviewDocument', + 'ReviewSummary', + 'ReviseDocument', + 'RevisionSummary', + 'RewindWorkflow', + 'RunSubWorkflow', + 'Search', + 'Session', + 'SetExpires', + 'SetRecipients', + 'SetReviewersApprovers', + 'SetRevisors', + 'SetWorkflow', + 'SubstituteUser', + 'Tasks', + 'TransmittalMgr', + 'TriggerWorkflow', + 'UpdateDocument', + 'UserDefaultKeywords', + 'UserImage', + 'UsrView', + 'ViewDocument', + 'ViewEvent', + 'ViewFolder', + 'WorkflowGraph', + 'WorkflowSummary'); + } + + if(array_intersect($scripts, $user_allowed)) + return true; + + return false; + } /* }}} */ + + /** + * Check for access permission on view + * + * This function will always return true because it was added to smooth + * migration from 5.1.x to 6.0.x + * + * @param mixed $view Instanz of view, name of view or array of view names + * @param string $get query parameters possible containing the element 'action' + * @return boolean true if access is allowed, false if access is disallowed + * no specific access right is set, otherwise false + */ + function check_view_access($view, $get=array()) { /* {{{ */ + return $this->check_view_legacy_access($view, $get); + } /* }}} */ + + /** + * Check for access permission on controller + * + * This function will always return true because it was added to smooth + * migration from 5.1.x to 6.0.x + * + * @param mixed $controller Instanz of controller, name of controller or array of controller names + * @param string $get query parameters + * @return boolean true if access is allowed otherwise false + */ + function check_controller_access($controller, $get=array()) { /* {{{ */ + return true; + } /* }}} */ } From 9565010cd0bc00971a99ad506991f166078ee286 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Sun, 18 Apr 2021 19:39:37 +0200 Subject: [PATCH 018/403] pass AccessOperation to view --- out/out.AddDocument.php | 3 +++ out/out.AddEvent.php | 1 + out/out.AddSubFolder.php | 3 +++ out/out.AdminTools.php | 2 ++ out/out.ApprovalSummary.php | 2 ++ out/out.AttributeMgr.php | 4 ++-- out/out.BackupTools.php | 2 ++ out/out.Calendar.php | 4 ++-- out/out.Categories.php | 2 ++ out/out.ChangePassword.php | 3 ++- out/out.Charts.php | 3 ++- out/out.ClearCache.php | 2 ++ out/out.CreateIndex.php | 2 ++ out/out.DefaultKeywords.php | 2 ++ out/out.EditEvent.php | 2 ++ out/out.EditFolder.php | 4 ++++ out/out.EditOnline.php | 1 - out/out.EditUserData.php | 2 ++ out/out.ExpiredDocuments.php | 2 ++ out/out.ExtensionMgr.php | 2 ++ out/out.FolderAccess.php | 2 ++ out/out.FolderNotify.php | 2 ++ out/out.GroupMgr.php | 2 ++ out/out.GroupView.php | 2 ++ out/out.Hooks.php | 2 ++ out/out.ImportFS.php | 2 ++ out/out.IndexInfo.php | 2 ++ out/out.Indexer.php | 2 ++ out/out.Info.php | 2 ++ out/out.LogManagement.php | 2 ++ out/out.ManageNotify.php | 3 ++- out/out.MoveFolder.php | 2 ++ out/out.MyAccount.php | 2 ++ out/out.MyDocuments.php | 2 ++ out/out.ObjectCheck.php | 3 ++- out/out.PasswordForgotten.php | 11 +++++++++-- out/out.PasswordSend.php | 4 +++- out/out.RemoveDump.php | 2 ++ out/out.RemoveFolder.php | 2 ++ out/out.RemoveFolderFiles.php | 1 + out/out.RemoveGroup.php | 2 ++ out/out.RemoveLog.php | 2 ++ out/out.RemoveUser.php | 2 ++ out/out.RemoveUserFromProcesses.php | 10 ++++++++-- out/out.RemoveWorkflow.php | 2 ++ out/out.ReturnFromSubWorkflow.php | 10 +++++++--- out/out.ReviewSummary.php | 3 ++- out/out.Session.php | 2 +- out/out.Settings.php | 2 ++ out/out.Statistic.php | 2 ++ out/out.SubstituteUser.php | 2 ++ out/out.TransferObjects.php | 9 ++++++--- out/out.UserDefaultKeywords.php | 2 ++ out/out.UserList.php | 2 ++ out/out.UsrMgr.php | 2 ++ out/out.UsrView.php | 2 ++ out/out.ViewEvent.php | 2 ++ out/out.ViewFolder.php | 2 ++ out/out.WorkflowActionsMgr.php | 2 ++ out/out.WorkflowGraph.php | 2 ++ out/out.WorkflowMgr.php | 2 ++ out/out.WorkflowStatesMgr.php | 2 ++ out/out.WorkflowSummary.php | 2 ++ 63 files changed, 148 insertions(+), 22 deletions(-) diff --git a/out/out.AddDocument.php b/out/out.AddDocument.php index cfefbf0c1..4062b943d 100644 --- a/out/out.AddDocument.php +++ b/out/out.AddDocument.php @@ -46,6 +46,8 @@ if ($folder->getAccessMode($user) < M_READWRITE) { UI::exitError(getMLText("folder_title", array("foldername" => htmlspecialchars($folder->getName()))),getMLText("access_denied")); } +$accessop = new SeedDMS_AccessOperation($dms, $folder, $user, $settings); + if($settings->_quota > 0) { $remain = checkQuota($user); if ($remain < 0) { @@ -69,6 +71,7 @@ if($view) { $view->setParam('sortusersinlist', $settings->_sortUsersInList); $view->setParam('defaultposition', $settings->_defaultDocPosition); $view->setParam('orderby', $settings->_sortFoldersDefault); + $view->setParam('accessobject', $accessop); $view($_GET); exit; } diff --git a/out/out.AddEvent.php b/out/out.AddEvent.php index 07bf8b70c..8f8f0d6d9 100644 --- a/out/out.AddEvent.php +++ b/out/out.AddEvent.php @@ -35,6 +35,7 @@ if ($user->isGuest()) { } if($view) { + $view->setParam('accessobject', $accessop); $view->setParam('strictformcheck', $settings->_strictFormCheck); $view($_GET); exit; diff --git a/out/out.AddSubFolder.php b/out/out.AddSubFolder.php index e949f345c..ad27dada0 100644 --- a/out/out.AddSubFolder.php +++ b/out/out.AddSubFolder.php @@ -45,11 +45,14 @@ if ($folder->getAccessMode($user) < M_READWRITE) { UI::exitError(getMLText("folder_title", array("foldername" => htmlspecialchars($folder->getName()))),getMLText("access_denied")); } +$accessop = new SeedDMS_AccessOperation($dms, $folder, $user, $settings); + if($view) { $view->setParam('folder', $folder); $view->setParam('strictformcheck', $settings->_strictFormCheck); $view->setParam('defaultposition', $settings->_defaultDocPosition); $view->setParam('orderby', $settings->_sortFoldersDefault); + $view->setParam('accessobject', $accessop); $view($_GET); exit; } diff --git a/out/out.AdminTools.php b/out/out.AdminTools.php index 506bcbde1..35557c271 100644 --- a/out/out.AdminTools.php +++ b/out/out.AdminTools.php @@ -29,6 +29,7 @@ require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if (!$user->isAdmin()) { UI::exitError(getMLText("admin_tools"),getMLText("access_denied")); } @@ -36,5 +37,6 @@ if (!$user->isAdmin()) { if($view) { $view->setParam('enablefullsearch', $settings->_enableFullSearch); $view->setParam('logfileenable', $settings->_logFileEnable); + $view->setParam('accessobject', $accessop); $view($_GET); } diff --git a/out/out.ApprovalSummary.php b/out/out.ApprovalSummary.php index 6c625d9eb..8fff6f38e 100644 --- a/out/out.ApprovalSummary.php +++ b/out/out.ApprovalSummary.php @@ -31,6 +31,7 @@ require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); +$accessop = new SeedDMS_AccessOperation($dms, $folder, $user, $settings); if ($user->isGuest()) { UI::exitError(getMLText("my_documents"),getMLText("access_denied")); @@ -41,6 +42,7 @@ if($view) { $view->setParam('cachedir', $settings->_cacheDir); $view->setParam('previewWidthList', $settings->_previewWidthList); $view->setParam('timeout', $settings->_cmdTimeout); + $view->setParam('accessobject', $accessop); $view->setParam('xsendfile', $settings->_enableXsendfile); $view->setParam('onepage', $settings->_onePageMode); // do most navigation by reloading areas of pages with ajax $view($_GET); diff --git a/out/out.AttributeMgr.php b/out/out.AttributeMgr.php index e4a4cfcd6..f882ec36f 100644 --- a/out/out.AttributeMgr.php +++ b/out/out.AttributeMgr.php @@ -32,12 +32,11 @@ require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if (!$user->isAdmin()) { UI::exitError(getMLText("admin_tools"),getMLText("access_denied")); } -$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); - $attrdefs = $dms->getAllAttributeDefinitions(); if(isset($_GET['attrdefid']) && $_GET['attrdefid']) { @@ -57,6 +56,7 @@ if($view) { $view->setParam('maxRecursiveCount', $settings->_maxRecursiveCount); $view->setParam('previewWidthList', $settings->_previewWidthList); $view->setParam('timeout', $settings->_cmdTimeout); + $view->setParam('accessobject', $accessop); $view->setParam('xsendfile', $settings->_enableXsendfile); $view($_GET); } diff --git a/out/out.BackupTools.php b/out/out.BackupTools.php index 1ffd6b342..105f5fa9f 100644 --- a/out/out.BackupTools.php +++ b/out/out.BackupTools.php @@ -30,6 +30,7 @@ require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user, 'contentdir'=>$settings->_contentDir)); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if (!$user->isAdmin()) { UI::exitError(getMLText("admin_tools"),getMLText("access_denied")); } @@ -42,6 +43,7 @@ if($view) { $view->setParam('backupdir', $settings->_contentDir); $view->setParam('hasbackupdir', false); } + $view->setParam('accessobject', $accessop); $view($_GET); exit; } diff --git a/out/out.Calendar.php b/out/out.Calendar.php index 9c0ddda64..fd0a2fb51 100644 --- a/out/out.Calendar.php +++ b/out/out.Calendar.php @@ -31,6 +31,7 @@ require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if (isset($_GET["start"])) $start=$_GET["start"]; else $start = ''; @@ -45,8 +46,6 @@ if(isset($_GET['documentid']) && $_GET['documentid'] && is_numeric($_GET['docume } else $document = null; -$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); - $calendar = new SeedDMS_Calendar($dms->getDB(), $user); if(isset($_GET['eventid']) && $_GET['eventid'] && is_numeric($_GET['eventid'])) { @@ -80,6 +79,7 @@ if($view) { $view->setParam('previewWidthList', $settings->_previewWidthList); $view->setParam('previewWidthDetail', $settings->_previewWidthDetail); $view->setParam('timeout', $settings->_cmdTimeout); + $view->setParam('accessobject', $accessop); $view->setParam('xsendfile', $settings->_enableXsendfile); $view($_GET); exit; diff --git a/out/out.Categories.php b/out/out.Categories.php index 35092df49..8630776d6 100644 --- a/out/out.Categories.php +++ b/out/out.Categories.php @@ -31,6 +31,7 @@ require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if (!$user->isAdmin()) { UI::exitError(getMLText("admin_tools"),getMLText("access_denied")); } @@ -46,6 +47,7 @@ if(isset($_GET['categoryid']) && $_GET['categoryid']) { if($view) { $view->setParam('categories', $categories); $view->setParam('selcategory', $selcat); + $view->setParam('accessobject', $accessop); $view->setParam('showtree', showtree()); $view->setParam('cachedir', $settings->_cacheDir); $view->setParam('previewWidthList', $settings->_previewWidthList); diff --git a/out/out.ChangePassword.php b/out/out.ChangePassword.php index 7121b40da..48003a9b9 100644 --- a/out/out.ChangePassword.php +++ b/out/out.ChangePassword.php @@ -44,7 +44,8 @@ if (isset($_REQUEST["hash"]) && strlen($_REQUEST["hash"])>0) { $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'referuri'=>$referuri, 'hash'=>$hash, 'passwordstrength'=>$settings->_passwordStrength)); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if($view) { + $view->setParam('accessobject', $accessop); $view($_GET); - exit; } diff --git a/out/out.Charts.php b/out/out.Charts.php index ad06a2d29..5dcd83c8b 100644 --- a/out/out.Charts.php +++ b/out/out.Charts.php @@ -30,7 +30,7 @@ require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); - +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if (!$user->isAdmin()) { UI::exitError(getMLText("admin_tools"),getMLText("access_denied")); } @@ -52,6 +52,7 @@ if($data = $dms->getStatisticalData($type)) { if($view) { $view->setParam('type', $type); $view->setParam('data', $data); + $view->setParam('accessobject', $accessop); $view($_GET); exit; } diff --git a/out/out.ClearCache.php b/out/out.ClearCache.php index bffd8203f..d8a5c42b3 100644 --- a/out/out.ClearCache.php +++ b/out/out.ClearCache.php @@ -32,12 +32,14 @@ require_once("inc/inc.ClassUI.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if (!$user->isAdmin()) { UI::exitError(getMLText("admin_tools"),getMLText("access_denied")); } if($view) { $view->setParam('cachedir', $settings->_cacheDir); + $view->setParam('accessobject', $accessop); $view($_GET); exit; } diff --git a/out/out.CreateIndex.php b/out/out.CreateIndex.php index ce6614e61..a17958db5 100644 --- a/out/out.CreateIndex.php +++ b/out/out.CreateIndex.php @@ -33,6 +33,7 @@ require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if (!$user->isAdmin()) { UI::exitError(getMLText("admin_tools"),getMLText("access_denied")); } @@ -43,6 +44,7 @@ if(!$settings->_enableFullSearch) { if($view) { $view->setParam('enablefullsearch', $settings->_enableFullSearch); + $view->setParam('accessobject', $accessop); $view($_GET); exit; } diff --git a/out/out.DefaultKeywords.php b/out/out.DefaultKeywords.php index 38f4d9b3a..dba41a2e5 100644 --- a/out/out.DefaultKeywords.php +++ b/out/out.DefaultKeywords.php @@ -31,6 +31,7 @@ require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if (!$user->isAdmin()) { UI::exitError(getMLText("admin_tools"),getMLText("access_denied")); } @@ -45,6 +46,7 @@ $categories = $dms->getAllUserKeywordCategories($user->getID()); if($view) { $view->setParam('categories', $categories); $view->setParam('selcategoryid', $selcategoryid); + $view->setParam('accessobject', $accessop); $view($_GET); exit; } diff --git a/out/out.EditEvent.php b/out/out.EditEvent.php index f5e382ba5..cebb0a59a 100644 --- a/out/out.EditEvent.php +++ b/out/out.EditEvent.php @@ -30,6 +30,7 @@ require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if ($user->isGuest()) { UI::exitError(getMLText("edit_event"),getMLText("access_denied")); @@ -51,6 +52,7 @@ if (($user->getID()!=$event["userID"])&&(!$user->isAdmin())){ if($view) { $view->setParam('event', $event); $view->setParam('strictformcheck', $settings->_strictFormCheck); + $view->setParam('accessobject', $accessop); $view($_GET); exit; } diff --git a/out/out.EditFolder.php b/out/out.EditFolder.php index ff359c534..0ad1245d7 100644 --- a/out/out.EditFolder.php +++ b/out/out.EditFolder.php @@ -31,6 +31,7 @@ require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if (!isset($_GET["folderid"]) || !is_numeric($_GET["folderid"]) || intval($_GET["folderid"])<1) { UI::exitError(getMLText("folder_title", array("foldername" => getMLText("invalid_folder_id"))),getMLText("invalid_folder_id")); @@ -45,6 +46,8 @@ if ($folder->getAccessMode($user) < M_READWRITE) { UI::exitError(getMLText("folder_title", array("foldername" => htmlspecialchars($folder->getName()))),getMLText("access_denied")); } +$accessop = new SeedDMS_AccessOperation($dms, $folder, $user, $settings); + $attrdefs = $dms->getAllAttributeDefinitions(array(SeedDMS_Core_AttributeDefinition::objtype_folder, SeedDMS_Core_AttributeDefinition::objtype_all)); if($view) { @@ -53,6 +56,7 @@ if($view) { $view->setParam('strictformcheck', $settings->_strictFormCheck); $view->setParam('rootfolderid', $settings->_rootFolderID); $view->setParam('orderby', $settings->_sortFoldersDefault); + $view->setParam('accessobject', $accessop); $view->setParam('defaultposition', $settings->_defaultDocPosition); $view($_GET); exit; diff --git a/out/out.EditOnline.php b/out/out.EditOnline.php index 184dae150..8f381066b 100644 --- a/out/out.EditOnline.php +++ b/out/out.EditOnline.php @@ -33,7 +33,6 @@ $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); $documentid = $_GET["documentid"]; - if (!isset($documentid) || !is_numeric($documentid) || intval($documentid)<1) { UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("invalid_doc_id")); } diff --git a/out/out.EditUserData.php b/out/out.EditUserData.php index 6f2507f8d..4694261db 100644 --- a/out/out.EditUserData.php +++ b/out/out.EditUserData.php @@ -31,6 +31,7 @@ require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if ($user->isGuest()) { UI::exitError(getMLText("edit_user_details"),getMLText("access_denied")); @@ -47,6 +48,7 @@ if($view) { $view->setParam('enablethemeselector', $settings->_enableThemeSelector); $view->setParam('passwordstrength', $settings->_passwordStrength); $view->setParam('httproot', $settings->_httpRoot); + $view->setParam('accessobject', $accessop); $view($_GET); exit; } diff --git a/out/out.ExpiredDocuments.php b/out/out.ExpiredDocuments.php index 89e296e16..9c35deadd 100644 --- a/out/out.ExpiredDocuments.php +++ b/out/out.ExpiredDocuments.php @@ -31,6 +31,7 @@ require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if ($user->isGuest()) { UI::exitError(getMLText("expired_documents"),getMLText("access_denied")); } @@ -51,6 +52,7 @@ if($view) { $view->setParam('cachedir', $settings->_cacheDir); $view->setParam('previewWidthList', $settings->_previewWidthList); $view->setParam('timeout', $settings->_cmdTimeout); + $view->setParam('accessobject', $accessop); $view->setParam('xsendfile', $settings->_enableXsendfile); $view($_GET); exit; diff --git a/out/out.ExtensionMgr.php b/out/out.ExtensionMgr.php index 1f9ebda80..f3e45fd2f 100644 --- a/out/out.ExtensionMgr.php +++ b/out/out.ExtensionMgr.php @@ -29,6 +29,7 @@ require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if (!$user->isAdmin()) { UI::exitError(getMLText("admin_tools"),getMLText("access_denied")); } @@ -50,6 +51,7 @@ if($view) { $view->setParam('httproot', $settings->_httpRoot); $view->setParam('extdir', $settings->_rootDir."/ext"); $view->setParam('version', $v); + $view->setParam('accessobject', $accessop); $view->setParam('extmgr', $extmgr); $view->setParam('currenttab', $currenttab); $view->setParam('extname', $extname); diff --git a/out/out.FolderAccess.php b/out/out.FolderAccess.php index f0f1b6abd..70172e001 100644 --- a/out/out.FolderAccess.php +++ b/out/out.FolderAccess.php @@ -32,6 +32,7 @@ require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if (!isset($_GET["folderid"]) || !is_numeric($_GET["folderid"]) || intval($_GET["folderid"])<1) { UI::exitError(getMLText("folder_title", array("foldername" => getMLText("invalid_folder_id"))),getMLText("invalid_folder_id")); @@ -54,6 +55,7 @@ if($view) { $view->setParam('allusers', $allUsers); $view->setParam('allgroups', $allGroups); $view->setParam('rootfolderid', $settings->_rootFolderID); + $view->setParam('accessobject', $accessop); $view($_GET); exit; } diff --git a/out/out.FolderNotify.php b/out/out.FolderNotify.php index 6835be081..3411eca66 100644 --- a/out/out.FolderNotify.php +++ b/out/out.FolderNotify.php @@ -31,6 +31,7 @@ require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if (!isset($_GET["folderid"]) || !is_numeric($_GET["folderid"]) || intval($_GET["folderid"])<1) { UI::exitError(getMLText("folder_title", array("foldername" => getMLText("invalid_folder_id"))),getMLText("invalid_folder_id")); @@ -52,6 +53,7 @@ if($view) { $view->setParam('folder', $folder); $view->setParam('allusers', $allUsers); $view->setParam('allgroups', $allGroups); + $view->setParam('accessobject', $accessop); $view->setParam('sortusersinlist', $settings->_sortUsersInList); $view($_GET); exit; diff --git a/out/out.GroupMgr.php b/out/out.GroupMgr.php index 1ee9cbfc7..be209d7ae 100644 --- a/out/out.GroupMgr.php +++ b/out/out.GroupMgr.php @@ -31,6 +31,7 @@ require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if (!$user->isAdmin()) { UI::exitError(getMLText("admin_tools"),getMLText("access_denied")); } @@ -60,6 +61,7 @@ if($view) { $view->setParam('previewWidthList', $settings->_previewWidthList); $view->setParam('workflowmode', $settings->_workflowMode); $view->setParam('timeout', $settings->_cmdTimeout); + $view->setParam('accessobject', $accessop); $view->setParam('xsendfile', $settings->_enableXsendfile); $view($_GET); } diff --git a/out/out.GroupView.php b/out/out.GroupView.php index 4fb8e4133..7442f8783 100644 --- a/out/out.GroupView.php +++ b/out/out.GroupView.php @@ -29,6 +29,7 @@ require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if ($user->isGuest()) { UI::exitError(getMLText("my_account"),getMLText("access_denied")); @@ -51,6 +52,7 @@ if (is_bool($allGroups)) { if($view) { $view->setParam('allusers', $allUsers); $view->setParam('allgroups', $allGroups); + $view->setParam('accessobject', $accessop); $view($_GET); exit; } diff --git a/out/out.Hooks.php b/out/out.Hooks.php index 6c4704227..6acc28c43 100644 --- a/out/out.Hooks.php +++ b/out/out.Hooks.php @@ -28,6 +28,7 @@ require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if (!$settings->_enableDebugMode) { UI::exitError(getMLText("admin_tools"),getMLText("access_denied")); } @@ -37,6 +38,7 @@ if (!$user->isAdmin()) { if($view) { $view->setParam('settings', $settings); + $view->setParam('accessobject', $accessop); $view($_GET); exit; } diff --git a/out/out.ImportFS.php b/out/out.ImportFS.php index 95095794b..782c55539 100644 --- a/out/out.ImportFS.php +++ b/out/out.ImportFS.php @@ -30,12 +30,14 @@ require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if (!$user->isAdmin()) { UI::exitError(getMLText("admin_tools"),getMLText("access_denied")); } if($view) { $view->setParam('dropfolderdir', $settings->_dropFolderDir); + $view->setParam('accessobject', $accessop); $view($_GET); exit; } diff --git a/out/out.IndexInfo.php b/out/out.IndexInfo.php index 5bfb894f6..2a08d87f5 100644 --- a/out/out.IndexInfo.php +++ b/out/out.IndexInfo.php @@ -32,6 +32,7 @@ require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if (!$user->isAdmin()) { UI::exitError(getMLText("admin_tools"),getMLText("access_denied")); } @@ -47,6 +48,7 @@ if(!$index) { if($view) { $view->setParam('index', $index); + $view->setParam('accessobject', $accessop); $view($_GET); exit; } diff --git a/out/out.Indexer.php b/out/out.Indexer.php index aeb445973..9b6fc49ca 100644 --- a/out/out.Indexer.php +++ b/out/out.Indexer.php @@ -32,6 +32,7 @@ require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if (!$user->isAdmin()) { UI::exitError(getMLText("admin_tools"),getMLText("access_denied")); } @@ -80,6 +81,7 @@ if($view) { $view->setParam('folder', $folder); $view->setParam('converters', $settings->_converters['fulltext']); $view->setParam('timeout', $settings->_cmdTimeout); + $view->setParam('accessobject', $accessop); $view($_GET); exit; } diff --git a/out/out.Info.php b/out/out.Info.php index 079fc9986..fb8fb3468 100644 --- a/out/out.Info.php +++ b/out/out.Info.php @@ -32,6 +32,7 @@ require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if (!$user->isAdmin()) { UI::exitError(getMLText("admin_tools"),getMLText("access_denied")); } @@ -53,6 +54,7 @@ $extmgr = new SeedDMS_Extension_Mgr($settings->_rootDir."/ext", $settings->_cach if($view) { $view->setParam('version', $v); $view->setParam('availversions', $versions); + $view->setParam('accessobject', $accessop); $view->setParam('extmgr', $extmgr); $view($_GET); exit; diff --git a/out/out.LogManagement.php b/out/out.LogManagement.php index 366c655b4..03a85496e 100644 --- a/out/out.LogManagement.php +++ b/out/out.LogManagement.php @@ -30,6 +30,7 @@ require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if (!$user->isAdmin()) { UI::exitError(getMLText("admin_tools"),getMLText("access_denied")); } @@ -44,6 +45,7 @@ if($view) { $view->setParam('logname', $logname); $view->setParam('mode', $mode); $view->setParam('logdir', $settings->_contentDir.'log/'); + $view->setParam('accessobject', $accessop); $view($_GET); exit; } diff --git a/out/out.ManageNotify.php b/out/out.ManageNotify.php index 5678023ba..dcf8c3840 100644 --- a/out/out.ManageNotify.php +++ b/out/out.ManageNotify.php @@ -29,7 +29,7 @@ require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); - +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if ($user->isGuest()) { UI::exitError(getMLText("my_account"),getMLText("access_denied")); } @@ -41,6 +41,7 @@ if($view) { $view->setParam('cachedir', $settings->_cacheDir); $view->setParam('previewWidthList', $settings->_previewWidthList); $view->setParam('timeout', $settings->_cmdTimeout); + $view->setParam('accessobject', $accessop); $view->setParam('onepage', $settings->_onePageMode); // do most navigation by reloading areas of pages with ajax $view->setParam('xsendfile', $settings->_enableXsendfile); $view($_GET); diff --git a/out/out.MoveFolder.php b/out/out.MoveFolder.php index 4cb369ca6..d96dca56f 100644 --- a/out/out.MoveFolder.php +++ b/out/out.MoveFolder.php @@ -31,6 +31,7 @@ require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if (!isset($_GET["folderid"]) || !is_numeric($_GET["folderid"]) || intval($_GET["folderid"])<1) { UI::exitError(getMLText("folder_title", array("foldername" => getMLText("invalid_folder_id"))),getMLText("invalid_folder_id")); @@ -70,6 +71,7 @@ if(isset($_GET['targetid']) && $_GET['targetid']) { if($view) { $view->setParam('folder', $folder); $view->setParam('target', $target); + $view->setParam('accessobject', $accessop); $view($_GET); exit; } diff --git a/out/out.MyAccount.php b/out/out.MyAccount.php index 33e713bbe..e68a70bb4 100644 --- a/out/out.MyAccount.php +++ b/out/out.MyAccount.php @@ -31,6 +31,7 @@ require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if ($user->isGuest()) { UI::exitError(getMLText("my_account"),getMLText("access_denied")); @@ -41,6 +42,7 @@ if($view) { $view->setParam('passwordexpiration', $settings->_passwordExpiration); $view->setParam('httproot', $settings->_httpRoot); $view->setParam('quota', $settings->_quota); + $view->setParam('accessobject', $accessop); $view($_GET); exit; } diff --git a/out/out.MyDocuments.php b/out/out.MyDocuments.php index fff285cdf..311488d1d 100644 --- a/out/out.MyDocuments.php +++ b/out/out.MyDocuments.php @@ -31,6 +31,7 @@ require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if ($user->isGuest()) { UI::exitError(getMLText("my_documents"),getMLText("access_denied")); @@ -56,6 +57,7 @@ if($view) { $view->setParam('cachedir', $settings->_cacheDir); $view->setParam('previewWidthList', $settings->_previewWidthList); $view->setParam('timeout', $settings->_cmdTimeout); + $view->setParam('accessobject', $accessop); $view->setParam('xsendfile', $settings->_enableXsendfile); $view->setParam('onepage', $settings->_onePageMode); // do most navigation by reloading areas of pages with ajax $view($_GET); diff --git a/out/out.ObjectCheck.php b/out/out.ObjectCheck.php index ee27b537d..144674e52 100644 --- a/out/out.ObjectCheck.php +++ b/out/out.ObjectCheck.php @@ -32,7 +32,7 @@ require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); - +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if (!$user->isAdmin()) { UI::exitError(getMLText("admin_tools"),getMLText("access_denied")); } @@ -90,6 +90,7 @@ if($view) { $view->setParam('repair', $repair); $view->setParam('showtree', showtree()); $view->setParam('rootfolder', $rootfolder); + $view->setParam('accessobject', $accessop); $view->setParam('previewWidthList', $settings->_previewWidthList); $view->setParam('previewConverters', isset($settings->_converters['preview']) ? $settings->_converters['preview'] : array()); $view->setParam('timeout', $settings->_cmdTimeout); diff --git a/out/out.PasswordForgotten.php b/out/out.PasswordForgotten.php index abfd35349..2c4f53587 100644 --- a/out/out.PasswordForgotten.php +++ b/out/out.PasswordForgotten.php @@ -24,18 +24,25 @@ require_once("inc/inc.LogInit.php"); require_once("inc/inc.Language.php"); require_once("inc/inc.Init.php"); require_once("inc/inc.Extension.php"); +require_once("inc/inc.DBInit.php"); +require_once("inc/inc.ClassAccessOperation.php"); require_once("inc/inc.ClassUI.php"); include $settings->_rootDir . "languages/" . $settings->_language . "/lang.inc"; +$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); +$view = UI::factory($theme, $tmp[1]); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); + if (isset($_REQUEST["referuri"]) && strlen($_REQUEST["referuri"])>0) { $referrer = $_REQUEST["referuri"]; } else { $referrer = ''; } -$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); -$view = UI::factory($theme, $tmp[1], array('referrer'=>$referrer)); if($view) { + $view->setParam('accessobject', $accessop); + $view->setParam('referrer', $referrer); + $view->setParam('accessobject', $accessop); $view($_GET); exit; } diff --git a/out/out.PasswordSend.php b/out/out.PasswordSend.php index abfd35349..2c45ad807 100644 --- a/out/out.PasswordSend.php +++ b/out/out.PasswordSend.php @@ -35,7 +35,9 @@ if (isset($_REQUEST["referuri"]) && strlen($_REQUEST["referuri"])>0) { } $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('referrer'=>$referrer)); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if($view) { + $view->setParam('accessobject', $accessop); + $view->setParam('referrer', $referrer); $view($_GET); - exit; } diff --git a/out/out.RemoveDump.php b/out/out.RemoveDump.php index b77a807dc..b4ef8cf65 100644 --- a/out/out.RemoveDump.php +++ b/out/out.RemoveDump.php @@ -29,6 +29,7 @@ require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if (!$user->isAdmin()) { UI::exitError(getMLText("admin_tools"),getMLText("access_denied")); } @@ -41,6 +42,7 @@ $dumpname = $_GET["dumpname"]; if($view) { $view->setParam('dumpfile', $dumpname); + $view->setParam('accessobject', $accessop); $view($_GET); exit; } diff --git a/out/out.RemoveFolder.php b/out/out.RemoveFolder.php index fbaf16f51..ad172c7d0 100644 --- a/out/out.RemoveFolder.php +++ b/out/out.RemoveFolder.php @@ -31,6 +31,7 @@ require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if (!isset($_GET["folderid"]) || !is_numeric($_GET["folderid"]) || intval($_GET["folderid"])<1) { UI::exitError(getMLText("folder_title", array("foldername" => getMLText("invalid_folder_id"))),getMLText("invalid_folder_id")); @@ -52,6 +53,7 @@ if ($folder->getAccessMode($user) < M_ALL) { if($view) { $view->setParam('folder', $folder); + $view->setParam('accessobject', $accessop); $view($_GET); exit; } diff --git a/out/out.RemoveFolderFiles.php b/out/out.RemoveFolderFiles.php index 725f44034..01bc467a2 100644 --- a/out/out.RemoveFolderFiles.php +++ b/out/out.RemoveFolderFiles.php @@ -29,6 +29,7 @@ require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if (!$user->isAdmin()) { UI::exitError(getMLText("admin_tools"),getMLText("access_denied")); } diff --git a/out/out.RemoveGroup.php b/out/out.RemoveGroup.php index 3739786d4..5956fc765 100644 --- a/out/out.RemoveGroup.php +++ b/out/out.RemoveGroup.php @@ -30,6 +30,7 @@ require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if (!$user->isAdmin()) { UI::exitError(getMLText("admin_tools"),getMLText("access_denied")); } @@ -45,6 +46,7 @@ if (!is_object($group)) { if($view) { $view->setParam('group', $group); + $view->setParam('accessobject', $accessop); $view($_GET); exit; } diff --git a/out/out.RemoveLog.php b/out/out.RemoveLog.php index 2b2728146..96002c535 100644 --- a/out/out.RemoveLog.php +++ b/out/out.RemoveLog.php @@ -29,6 +29,7 @@ require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if (!$user->isAdmin()) { UI::exitError(getMLText("admin_tools"),getMLText("access_denied")); } @@ -56,6 +57,7 @@ foreach($lognames as $file) { if($view) { $view->setParam('lognames', $lognames); $view->setParam('mode', $mode); + $view->setParam('accessobject', $accessop); $view($_GET); exit; } diff --git a/out/out.RemoveUser.php b/out/out.RemoveUser.php index 664734210..9eba8ff8d 100644 --- a/out/out.RemoveUser.php +++ b/out/out.RemoveUser.php @@ -30,6 +30,7 @@ require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if (!$user->isAdmin()) { UI::exitError(getMLText("admin_tools"),getMLText("access_denied")); } @@ -56,6 +57,7 @@ $allusers = $dms->getAllUsers($settings->_sortUsersInList); if($view) { $view->setParam('rmuser', $rmuser); $view->setParam('allusers', $allusers); + $view->setParam('accessobject', $accessop); $view($_GET); exit; } diff --git a/out/out.RemoveUserFromProcesses.php b/out/out.RemoveUserFromProcesses.php index e94be29c5..41ad60e2b 100644 --- a/out/out.RemoveUserFromProcesses.php +++ b/out/out.RemoveUserFromProcesses.php @@ -20,6 +20,7 @@ if(!isset($settings)) require_once("../inc/inc.Settings.php"); +require_once("inc/inc.LogInit.php"); require_once("inc/inc.Language.php"); require_once("inc/inc.Init.php"); require_once("inc/inc.Extension.php"); @@ -27,6 +28,9 @@ require_once("inc/inc.DBInit.php"); require_once("inc/inc.ClassUI.php"); require_once("inc/inc.Authentication.php"); +$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); +$view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if (!$user->isAdmin()) { UI::exitError(getMLText("admin_tools"),getMLText("access_denied")); } @@ -44,10 +48,12 @@ if ($rmuser->getID()==$user->getID()) { UI::exitError(getMLText("rm_user"),getMLText("cannot_delete_yourself")); } -$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); -$view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); +$allusers = $dms->getAllUsers($settings->_sortUsersInList); + if($view) { $view->setParam('rmuser', $rmuser); + $view->setParam('allusers', $allusers); + $view->setParam('accessobject', $accessop); $view($_GET); exit; } diff --git a/out/out.RemoveWorkflow.php b/out/out.RemoveWorkflow.php index b33c0b046..90606a13c 100644 --- a/out/out.RemoveWorkflow.php +++ b/out/out.RemoveWorkflow.php @@ -32,6 +32,7 @@ require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if (!$user->isAdmin()) { UI::exitError(getMLText("admin_tools"),getMLText("access_denied")); } @@ -47,6 +48,7 @@ if (!is_object($workflow)) { if($view) { $view->setParam('workflow', $workflow); + $view->setParam('accessobject', $accessop); $view($_GET); exit; } diff --git a/out/out.ReturnFromSubWorkflow.php b/out/out.ReturnFromSubWorkflow.php index 6203594fb..7313e08cd 100644 --- a/out/out.ReturnFromSubWorkflow.php +++ b/out/out.ReturnFromSubWorkflow.php @@ -24,11 +24,16 @@ if(!isset($settings)) require_once("inc/inc.LogInit.php"); require_once("inc/inc.Utils.php"); require_once("inc/inc.Language.php"); -require_once("inc/inc.Language.php"); +require_once("inc/inc.Init.php"); +require_once("inc/inc.Extension.php"); require_once("inc/inc.DBInit.php"); require_once("inc/inc.ClassUI.php"); require_once("inc/inc.Authentication.php"); +$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); +$view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); + if (!isset($_GET["documentid"]) || !is_numeric($_GET["documentid"]) || intval($_GET["documentid"])<1) { UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_doc_id"))),getMLText("invalid_doc_id")); } @@ -65,13 +70,12 @@ if(isset($_GET["transition"]) && $_GET["transition"]) { $folder = $document->getFolder(); -$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); -$view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); if($view) { $view->setParam('folder', $folder); $view->setParam('document', $document); $view->setParam('version', $version); $view->setParam('transition', $transition); + $view->setParam('accessobject', $accessop); $view($_GET); exit; } diff --git a/out/out.ReviewSummary.php b/out/out.ReviewSummary.php index 6c625d9eb..7b651594c 100644 --- a/out/out.ReviewSummary.php +++ b/out/out.ReviewSummary.php @@ -31,7 +31,7 @@ require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); - +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if ($user->isGuest()) { UI::exitError(getMLText("my_documents"),getMLText("access_denied")); } @@ -41,6 +41,7 @@ if($view) { $view->setParam('cachedir', $settings->_cacheDir); $view->setParam('previewWidthList', $settings->_previewWidthList); $view->setParam('timeout', $settings->_cmdTimeout); + $view->setParam('accessobject', $accessop); $view->setParam('xsendfile', $settings->_enableXsendfile); $view->setParam('onepage', $settings->_onePageMode); // do most navigation by reloading areas of pages with ajax $view($_GET); diff --git a/out/out.Session.php b/out/out.Session.php index 5dca7b496..0e1d9c126 100644 --- a/out/out.Session.php +++ b/out/out.Session.php @@ -21,6 +21,7 @@ if(!isset($settings)) require_once("../inc/inc.Settings.php"); +require_once("inc/inc.LogInit.php"); require_once("inc/inc.Utils.php"); require_once("inc/inc.Language.php"); require_once("inc/inc.Init.php"); @@ -28,7 +29,6 @@ require_once("inc/inc.Extension.php"); require_once("inc/inc.DBInit.php"); require_once("inc/inc.ClassUI.php"); require_once("inc/inc.Authentication.php"); -require_once("inc/inc.ClassAccessOperation.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); diff --git a/out/out.Settings.php b/out/out.Settings.php index bf9f31076..49a381598 100644 --- a/out/out.Settings.php +++ b/out/out.Settings.php @@ -29,6 +29,7 @@ require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if (!$user->isAdmin()) { UI::exitError(getMLText("admin_tools"),getMLText("access_denied")); } @@ -42,6 +43,7 @@ if($view) { $view->setParam('currenttab', (isset($_REQUEST['currenttab']) ? $_REQUEST['currenttab'] : '')); $view->setParam('allusers', $users); $view->setParam('allgroups', $groups); + $view->setParam('accessobject', $accessop); $view($_GET); exit; } diff --git a/out/out.Statistic.php b/out/out.Statistic.php index 38248a267..4de20e18d 100644 --- a/out/out.Statistic.php +++ b/out/out.Statistic.php @@ -30,6 +30,7 @@ require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if (!$user->isAdmin()) { UI::exitError(getMLText("admin_tools"),getMLText("access_denied")); } @@ -38,6 +39,7 @@ $rootfolder = $dms->getRootFolder(); if($view) { $view->setParam('rootfolder', $rootfolder); + $view->setParam('accessobject', $accessop); $view($_GET); exit; } diff --git a/out/out.SubstituteUser.php b/out/out.SubstituteUser.php index 6ff6b5572..1d6800cd7 100644 --- a/out/out.SubstituteUser.php +++ b/out/out.SubstituteUser.php @@ -30,6 +30,7 @@ require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1]); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if (!$user->isAdmin()) { UI::exitError(getMLText("admin_tools"),getMLText("access_denied")); } @@ -40,6 +41,7 @@ if($view) { $view->setParam('dms', $dms); $view->setParam('user', $user); $view->setParam('allusers', $allUsers); + $view->setParam('accessobject', $accessop); $view($_GET); exit; } diff --git a/out/out.TransferObjects.php b/out/out.TransferObjects.php index 369fb7736..a8918e107 100644 --- a/out/out.TransferObjects.php +++ b/out/out.TransferObjects.php @@ -20,6 +20,7 @@ if(!isset($settings)) require_once("../inc/inc.Settings.php"); +require_once("inc/inc.LogInit.php"); require_once("inc/inc.Language.php"); require_once("inc/inc.Init.php"); require_once("inc/inc.Extension.php"); @@ -27,6 +28,9 @@ require_once("inc/inc.DBInit.php"); require_once("inc/inc.ClassUI.php"); require_once("inc/inc.Authentication.php"); +$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); +$view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if (!$user->isAdmin()) { UI::exitError(getMLText("admin_tools"),getMLText("access_denied")); } @@ -41,16 +45,15 @@ if (!is_object($rmuser)) { } if ($rmuser->getID()==$user->getID()) { - UI::exitError(getMLText("transfer_objects"),getMLText("cannot_delete_yourself")); + UI::exitError(getMLText("transfer_objects"),getMLText("cannot_transfer_your_objects")); } $allusers = $dms->getAllUsers($settings->_sortUsersInList); -$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); -$view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); if($view) { $view->setParam('rmuser', $rmuser); $view->setParam('allusers', $allusers); + $view->setParam('accessobject', $accessop); $view($_GET); exit; } diff --git a/out/out.UserDefaultKeywords.php b/out/out.UserDefaultKeywords.php index 25682bed0..80843d9c7 100644 --- a/out/out.UserDefaultKeywords.php +++ b/out/out.UserDefaultKeywords.php @@ -30,6 +30,7 @@ require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if ($user->isGuest()) { UI::exitError(getMLText("edit_default_keywords"),getMLText("access_denied")); @@ -39,6 +40,7 @@ $categories = $dms->getAllUserKeywordCategories($user->getID()); if($view) { $view->setParam('categories', $categories); + $view->setParam('accessobject', $accessop); $view($_GET); exit; } diff --git a/out/out.UserList.php b/out/out.UserList.php index 752ce0fd4..bf7d84282 100644 --- a/out/out.UserList.php +++ b/out/out.UserList.php @@ -30,6 +30,7 @@ require_once("inc/inc.ClassPasswordStrength.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if (!$user->isAdmin()) { UI::exitError(getMLText("admin_tools"),getMLText("access_denied")); } @@ -41,6 +42,7 @@ if($view) { $view->setParam('httproot', $settings->_httpRoot); $view->setParam('quota', $settings->_quota); $view->setParam('pwdexpiration', $settings->_passwordExpiration); + $view->setParam('accessobject', $accessop); $view($_GET); exit; } diff --git a/out/out.UsrMgr.php b/out/out.UsrMgr.php index a0595a00d..e174c8cea 100644 --- a/out/out.UsrMgr.php +++ b/out/out.UsrMgr.php @@ -31,6 +31,7 @@ require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if (!$user->isAdmin()) { UI::exitError(getMLText("admin_tools"),getMLText("access_denied")); } @@ -63,6 +64,7 @@ if($view) { $view->setParam('workflowmode', $settings->_workflowMode); $view->setParam('quota', $settings->_quota); $view->setParam('strictformcheck', $settings->_strictFormCheck); + $view->setParam('accessobject', $accessop); $view->setParam('enableemail', $settings->_enableEmail); $view($_GET); } diff --git a/out/out.UsrView.php b/out/out.UsrView.php index 25dbbb8c0..1bb439728 100644 --- a/out/out.UsrView.php +++ b/out/out.UsrView.php @@ -29,6 +29,7 @@ require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if ($user->isGuest()) { UI::exitError(getMLText("my_account"),getMLText("access_denied")); @@ -47,6 +48,7 @@ if($view) { $view->setParam('allusers', $users); $view->setParam('enableuserimage', $settings->_enableUserImage); $view->setParam('httproot', $settings->_httpRoot); + $view->setParam('accessobject', $accessop); $view($_GET); exit; } diff --git a/out/out.ViewEvent.php b/out/out.ViewEvent.php index ebc8ab2d3..1dd0b214e 100644 --- a/out/out.ViewEvent.php +++ b/out/out.ViewEvent.php @@ -30,6 +30,7 @@ require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if (!isset($_GET["id"])){ UI::exitError(getMLText("event_details"),getMLText("error_occured")); } @@ -41,6 +42,7 @@ if (is_bool($event)&&!$event){ if($view) { $view->setParam('event', $event); + $view->setParam('accessobject', $accessop); $view($_GET); exit; } diff --git a/out/out.ViewFolder.php b/out/out.ViewFolder.php index af5f6db69..19fb360cb 100644 --- a/out/out.ViewFolder.php +++ b/out/out.ViewFolder.php @@ -32,6 +32,7 @@ require_once("inc/inc.ClassUI.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if (!isset($_GET["folderid"]) || !is_numeric($_GET["folderid"]) || intval($_GET["folderid"])<1) { $folder = $dms->getRootFolder(); @@ -89,6 +90,7 @@ if($view) { $view->setParam('previewWidthList', $settings->_previewWidthList); $view->setParam('previewConverters', isset($settings->_converters['preview']) ? $settings->_converters['preview'] : array()); $view->setParam('timeout', $settings->_cmdTimeout); + $view->setParam('accessobject', $accessop); $view->setParam('xsendfile', $settings->_enableXsendfile); $view->setParam('maxItemsPerPage', $settings->_maxItemsPerPage); $view->setParam('incItemsPerPage', $settings->_incItemsPerPage != 0 ? $settings->_incItemsPerPage : $settings->_maxItemsPerPage); diff --git a/out/out.WorkflowActionsMgr.php b/out/out.WorkflowActionsMgr.php index 7aec36973..e2e7fdcaa 100644 --- a/out/out.WorkflowActionsMgr.php +++ b/out/out.WorkflowActionsMgr.php @@ -31,6 +31,7 @@ require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if (!$user->isAdmin()) { UI::exitError(getMLText("admin_tools"),getMLText("access_denied")); } @@ -49,6 +50,7 @@ if (is_bool($workflowactions)) { if($view) { $view->setParam('allworkflowactions', $workflowactions); $view->setParam('selworkflowaction', $selworkflowaction); + $view->setParam('accessobject', $accessop); $view($_GET); exit; } diff --git a/out/out.WorkflowGraph.php b/out/out.WorkflowGraph.php index 184c281ba..0be7f7c33 100644 --- a/out/out.WorkflowGraph.php +++ b/out/out.WorkflowGraph.php @@ -31,6 +31,7 @@ require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); $workflow = $dms->getWorkflow($_GET['workflow']); if (is_bool($workflow)) { @@ -59,6 +60,7 @@ if($view) { $view->setParam('workflow', $workflow); $view->setParam('transitions', $transitions); $view->setParam('document', $document); + $view->setParam('accessobject', $accessop); $view($_GET); exit; } diff --git a/out/out.WorkflowMgr.php b/out/out.WorkflowMgr.php index 2f9987915..b50c79160 100644 --- a/out/out.WorkflowMgr.php +++ b/out/out.WorkflowMgr.php @@ -31,6 +31,7 @@ require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if (!$user->isAdmin()) { UI::exitError(getMLText("admin_tools"),getMLText("access_denied")); } @@ -55,6 +56,7 @@ if($view) { $view->setParam('selworkflow', $selworkflow); $view->setParam('allworkflows', $workflows); $view->setParam('allworkflowstates', $workflowstates); + $view->setParam('accessobject', $accessop); $view($_GET); exit; } diff --git a/out/out.WorkflowStatesMgr.php b/out/out.WorkflowStatesMgr.php index e2d55e34e..d5e8f056a 100644 --- a/out/out.WorkflowStatesMgr.php +++ b/out/out.WorkflowStatesMgr.php @@ -31,6 +31,7 @@ require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if (!$user->isAdmin()) { UI::exitError(getMLText("admin_tools"),getMLText("access_denied")); } @@ -43,6 +44,7 @@ if(isset($_GET['workflowstateid']) && $_GET['workflowstateid']) { if($view) { $view->setParam('selworkflowstate', $selworkflowstate); + $view->setParam('accessobject', $accessop); $view($_GET); exit; } diff --git a/out/out.WorkflowSummary.php b/out/out.WorkflowSummary.php index f31a0a3e1..88bd32ffc 100644 --- a/out/out.WorkflowSummary.php +++ b/out/out.WorkflowSummary.php @@ -31,6 +31,7 @@ require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'user'=>$user)); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if ($user->isGuest()) { UI::exitError(getMLText("my_documents"),getMLText("access_denied")); @@ -41,6 +42,7 @@ if($view) { $view->setParam('workflowmode', $settings->_workflowMode); $view->setParam('previewWidthList', $settings->_previewWidthList); $view->setParam('timeout', $settings->_cmdTimeout); + $view->setParam('accessobject', $accessop); $view->setParam('xsendfile', $settings->_enableXsendfile); $view($_GET); exit; From 91e4351cccf19fc91291713d7f11a556b3fcc02d Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Sun, 18 Apr 2021 19:40:13 +0200 Subject: [PATCH 019/403] include inc.ClassAccessOperation.php --- inc/inc.Authentication.php | 1 + 1 file changed, 1 insertion(+) diff --git a/inc/inc.Authentication.php b/inc/inc.Authentication.php index f8d734e6d..58b24a7f9 100644 --- a/inc/inc.Authentication.php +++ b/inc/inc.Authentication.php @@ -16,6 +16,7 @@ require_once("inc.Utils.php"); require_once("inc.ClassNotificationService.php"); require_once("inc.ClassEmailNotify.php"); require_once("inc.ClassSession.php"); +require_once("inc.ClassAccessOperation.php"); $refer = $_SERVER["REQUEST_URI"]; if (!strncmp("/op", $refer, 3)) { From 4d24b0a11d113ecf2dd12f5f8fda9f138712692b Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Sun, 18 Apr 2021 19:41:09 +0200 Subject: [PATCH 020/403] call dummy check_[view|controller]_access method --- views/bootstrap/class.Bootstrap.php | 147 +++++++++++++++++++++------- 1 file changed, 114 insertions(+), 33 deletions(-) diff --git a/views/bootstrap/class.Bootstrap.php b/views/bootstrap/class.Bootstrap.php index 5d8f7a542..7b332de4c 100644 --- a/views/bootstrap/class.Bootstrap.php +++ b/views/bootstrap/class.Bootstrap.php @@ -304,6 +304,7 @@ background-image: linear-gradient(to bottom, #882222, #111111);; function globalNavigation($folder=null) { /* {{{ */ $dms = $this->params['dms']; + $accessobject = $this->params['accessobject']; echo "
      \n"; echo "
      \n"; echo "
      \n"; @@ -319,8 +320,10 @@ background-image: linear-gradient(to bottom, #882222, #111111);; echo "
        \n"; if (!$this->params['user']->isGuest()) { $menuitems = array(); - $menuitems['my_documents'] = array('link'=>"../out/out.MyDocuments.php?inProcess=1", 'label'=>'my_documents'); - $menuitems['my_account'] = array('link'=>"../out/out.MyAccount.php", 'label'=>'my_account'); + if ($accessobject->check_view_access('MyDocuments')) + $menuitems['my_documents'] = array('link'=>"../out/out.MyDocuments.php?inProcess=1", 'label'=>'my_documents'); + if ($accessobject->check_view_access('MyAccount')) + $menuitems['my_account'] = array('link'=>"../out/out.MyAccount.php", 'label'=>'my_account'); $hookObjs = $this->getHookObjects('SeedDMS_View_Bootstrap'); foreach($hookObjs as $hookObj) { if (method_exists($hookObj, 'userMenuItems')) { @@ -371,15 +374,17 @@ background-image: linear-gradient(to bottom, #882222, #111111);; /* menu tasks {{{ */ if($this->params['enablemenutasks'] && !$this->params['user']->isGuest()) { - echo "
        "; - echo "
        "; -// echo "
          \n"; -// echo "
        • \n"; -// echo $this->menuTasks(array('review'=>array(), 'approval'=>array(), 'receipt'=>array(), 'revision'=>array())); -// echo "
        • \n"; -// echo "
        \n"; - echo "
        "; - //$this->addFooterJS('checkTasks();'); + if($accessobject->check_view_access('Tasks', array('action'=>'menuTasks'))) { + echo "
        "; + echo "
        "; + // echo "
          \n"; + // echo "
        • \n"; + // echo $this->menuTasks(array('review'=>array(), 'approval'=>array(), 'receipt'=>array(), 'revision'=>array())); + // echo "
        • \n"; + // echo "
        \n"; + echo "
        "; + //$this->addFooterJS('checkTasks();'); + } } /* }}} End of menu tasks */ @@ -412,7 +417,7 @@ background-image: linear-gradient(to bottom, #882222, #111111);; echo "
          \n"; $menuitems = array(); - if ($this->params['enablecalendar']) $menuitems['calendar'] = array('link'=>'../out/out.Calendar.php?mode='.$this->params['calendardefaultview'], 'label'=>"calendar"); + if ($this->params['enablecalendar'] && $accessobject->check_view_access('Calendar')) $menuitems['calendar'] = array('link'=>'../out/out.Calendar.php?mode='.$this->params['calendardefaultview'], 'label'=>"calendar"); if ($this->params['user']->isAdmin()) $menuitems['admintools'] = array('link'=>'../out/out.AdminTools.php', 'label'=>"admin_tools"); if($this->params['enablehelp']) { $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); @@ -636,6 +641,7 @@ background-image: linear-gradient(to bottom, #882222, #111111);; private function folderNavigationBar($folder) { /* {{{ */ $dms = $this->params['dms']; + $accessobject = $this->params['accessobject']; if (!is_object($folder) || !$folder->isType('folder')) { self::showNavigationBar(array()); return; @@ -647,10 +653,13 @@ background-image: linear-gradient(to bottom, #882222, #111111);; $menuitems = array(); if ($accessMode == M_READ && !$this->params['user']->isGuest()) { + if ($accessobject->check_view_access('FolderNotify')) $menuitems['edit_folder_notify'] = array('link'=>"../out/out.FolderNotify.php?folderid=".$folderID."&showtree=".showtree(), 'label'=>getMLText('edit_folder_notify')); } else if ($accessMode >= M_READWRITE) { + if ($accessobject->check_view_access('AddSubFolder')) $menuitems['add_subfolder'] = array('link'=>"../out/out.AddSubFolder.php?folderid=". $folderID ."&showtree=".showtree(), 'label'=>getMLText('add_subfolder')); + if ($accessobject->check_view_access('AddDocument')) $menuitems['add_document'] = array('link'=>"../out/out.AddDocument.php?folderid=". $folderID ."&showtree=".showtree(), 'label'=>getMLText('add_document')); if(0 && $this->params['enablelargefileupload']) $menuitems['add_multiple_documents'] = array('link'=>"../out/out.AddMultiDocument.php?folderid=". $folderID ."&showtree=".showtree(), 'label'=>getMLText('add_multiple_documents')); @@ -660,11 +669,14 @@ background-image: linear-gradient(to bottom, #882222, #111111);; if ($accessMode == M_ALL) { if ($folderID != $this->params['rootfolderid'] && $folder->getParent()) + if ($accessobject->check_view_access('RemoveFolder')) $menuitems['rm_folder'] = array('link'=>"../out/out.RemoveFolder.php?folderid=". $folderID ."&showtree=".showtree(), 'label'=>getMLText('rm_folder')); } if ($accessMode == M_ALL) { + if ($accessobject->check_view_access('FolderAccess')) $menuitems['edit_folder_access'] = array('link'=>"../out/out.FolderAccess.php?folderid=".$folderID."&showtree=".showtree(), 'label'=>getMLText('edit_folder_access')); } + if ($accessobject->check_view_access('FolderNotify')) $menuitems['edit_existing_notify'] = array('link'=>"../out/out.FolderNotify.php?folderid=". $folderID ."&showtree=". showtree(), 'label'=>getMLText('edit_existing_notify')); } if ($this->params['user']->isAdmin() && $this->params['enablefullsearch']) { @@ -690,7 +702,9 @@ background-image: linear-gradient(to bottom, #882222, #111111);; if ($accessMode >= M_READWRITE) { if (!$document->isLocked()) { + if($accessobject->check_controller_access('UpdateDocument')) $menuitems['update_document'] = array('link'=>"../out/out.UpdateDocument".$docid, 'label'=>getMLText('update_document')); + if($accessobject->check_controller_access('LockDocument')) $menuitems['lock_document'] = array('link'=>"../op/op.LockDocument".$docid, 'label'=>getMLText('lock_document')); $menuitems['edit_document_props'] = array('link'=>"../out/out.EditDocument".$docid , 'label'=>getMLText('edit_document_props')); $menuitems['move_document'] = array('link'=>"../out/out.MoveDocument".$docid, 'label'=>getMLText('move_document')); @@ -698,22 +712,28 @@ background-image: linear-gradient(to bottom, #882222, #111111);; else { $lockingUser = $document->getLockingUser(); if (($lockingUser->getID() == $this->params['user']->getID()) || ($document->getAccessMode($this->params['user']) == M_ALL)) { + if($accessobject->check_controller_access('UpdateDocument')) $menuitems['update_document'] = array('link'=>"../out/out.UpdateDocument".$docid, 'label'=>getMLText('update_document')); + if($accessobject->check_controller_access('UnlockDocument')) $menuitems['unlock_document'] = array('link'=>"../op/op.UnlockDocument".$docid, 'label'=>getMLText('unlock_document')); $menuitems['edit_document_props'] = array('link'=>"../out/out.EditDocument".$docid, 'label'=>getMLText('edit_document_props')); $menuitems['move_document'] = array('link'=>"../out/out.MoveDocument".$docid, 'label'=>getMLText('move_document')); } } if($accessobject->maySetExpires()) { - $menuitems['expires'] = array('link'=>"../out/out.SetExpires".$docid, 'label'=>getMLText('expires')); + if ($accessobject->check_view_access('SetExpires')) + $menuitems['expires'] = array('link'=>"../out/out.SetExpires".$docid, 'label'=>getMLText('expires')); } } if ($accessMode == M_ALL) { - $menuitems['rm_document'] = array('link'=>"../out/out.RemoveDocument".$docid, 'label'=>getMLText('rm_document')); - $menuitems['edit_document_access'] = array('link'=>"../out/out.DocumentAccess". $docid, 'label'=>getMLText('edit_document_access')); + if ($accessobject->check_view_access('RemoveDocument')) + $menuitems['rm_document'] = array('link'=>"../out/out.RemoveDocument".$docid, 'label'=>getMLText('rm_document')); + if ($accessobject->check_view_access('DocumentAccess')) + $menuitems['edit_document_access'] = array('link'=>"../out/out.DocumentAccess". $docid, 'label'=>getMLText('edit_document_access')); } if ($accessMode >= M_READ && !$this->params['user']->isGuest()) { - $menuitems['edit_existing_notify'] = array('link'=>"../out/out.DocumentNotify". $docid, 'label'=>getMLText('edit_existing_notify')); + if ($accessobject->check_view_access('DocumentNotify')) + $menuitems['edit_existing_notify'] = array('link'=>"../out/out.DocumentNotify". $docid, 'label'=>getMLText('edit_existing_notify')); } if ($this->params['user']->isAdmin()) { $menuitems['transfer_document'] = array('link'=>"../out/out.TransferDocument". $docid, 'label'=>getMLText('transfer_document')); @@ -741,6 +761,7 @@ background-image: linear-gradient(to bottom, #882222, #111111);; } /* }}} */ private function accountNavigationBar() { /* {{{ */ + $accessobject = $this->params['accessobject']; echo "".getMLText("my_account")."\n"; echo "
          \n"; @@ -754,7 +775,9 @@ background-image: linear-gradient(to bottom, #882222, #111111);; $menuitems['edit_notify'] = array('link'=>"../out/out.ManageNotify.php", 'label'=>getMLText('edit_existing_notify')); if ($this->params['enableusersview']){ + if ($accessobject->check_view_access('UsrView')) $menuitems['users'] = array('link'=>"../out/out.UsrView.php", 'label'=>getMLText('users')); + if ($accessobject->check_view_access('GroupView')) $menuitems['groups'] = array('link'=>"../out/out.GroupView.php", 'label'=>getMLText('groups')); } @@ -768,6 +791,7 @@ background-image: linear-gradient(to bottom, #882222, #111111);; } /* }}} */ private function myDocumentsNavigationBar() { /* {{{ */ + $accessobject = $this->params['accessobject']; echo "".getMLText("my_documents")."\n"; echo "
          \n"; @@ -776,9 +800,12 @@ background-image: linear-gradient(to bottom, #882222, #111111);; $menuitems['inprocess'] = array('link'=>"../out/out.MyDocuments.php?inProcess=1", 'label'=>getMLText('documents_in_process')); $menuitems['all_documents'] = array('link'=>"../out/out.MyDocuments.php", 'label'=>getMLText('all_documents')); if($this->params['workflowmode'] == 'traditional' || $this->params['workflowmode'] == 'traditional_only_approval') { + if ($accessobject->check_view_access('ReviewSummary')) $menuitems['review_summary'] = array('link'=>"../out/out.ReviewSummary.php", 'label'=>getMLText('review_summary')); + if ($accessobject->check_view_access('ApprovalSummary')) $menuitems['approval_summary'] = array('link'=>"../out/out.ApprovalSummary.php", 'label'=>getMLText('approval_summary')); } else { + if ($accessobject->check_view_access('WorkflowSummary')) $menuitems['workflow_summary'] = array('link'=>"../out/out.WorkflowSummary.php", 'label'=>getMLText('workflow_summary')); } @@ -792,48 +819,84 @@ background-image: linear-gradient(to bottom, #882222, #111111);; } /* }}} */ private function adminToolsNavigationBar() { /* {{{ */ + $accessobject = $this->params['accessobject']; + $settings = $this->params['settings']; echo " ".getMLText("admin_tools")."\n"; echo "
          \n"; $menuitems = array(); + if($accessobject->check_view_access(array('UsrMgr', 'GroupMgr', 'UserList'))) { $menuitems['user_group_management'] = array('link'=>"#", 'label'=>getMLText('user_group_management')); + if ($accessobject->check_view_access('UsrMgr')) $menuitems['user_group_management']['children']['user_management'] = array('link'=>"../out/out.UsrMgr.php", 'label'=>getMLText('user_management')); + if ($accessobject->check_view_access('GroupMgr')) $menuitems['user_group_management']['children']['group_management'] = array('link'=>"../out/out.GroupMgr.php", 'label'=>getMLText('group_management')); + if ($accessobject->check_view_access('UserList')) $menuitems['user_group_management']['children']['user_list'] = array('link'=>"../out/out.UserList.php", 'label'=>getMLText('user_list')); - + } + + if($accessobject->check_view_access(array('DefaultKeywords', 'Categories', 'AttributeMgr', 'WorkflowMgr', 'WorkflowStatesMgr', 'WorkflowActionsMgr'))) { $menuitems['definitions'] = array('link'=>"#", 'label'=>getMLText('definitions')); + if ($accessobject->check_view_access('DefaultKeywords')) $menuitems['definitions']['children']['default_keywords'] = array('link'=>"../out/out.DefaultKeywords.php", 'label'=>getMLText('global_default_keywords')); + if ($accessobject->check_view_access('Categories')) $menuitems['definitions']['children']['document_categories'] = array('link'=>"../out/out.Categories.php", 'label'=>getMLText('global_document_categories')); + if ($accessobject->check_view_access('AttributeMgr')) $menuitems['definitions']['children']['attribute_definitions'] = array('link'=>"../out/out.AttributeMgr.php", 'label'=>getMLText('global_attributedefinitions')); if($this->params['workflowmode'] == 'advanced') { + if ($accessobject->check_view_access('WorkflowMgr')) $menuitems['definitions']['children']['workflows'] = array('link'=>"../out/out.WorkflowMgr.php", 'label'=>getMLText('global_workflows')); + if ($accessobject->check_view_access('WorkflowStatesMgr')) $menuitems['definitions']['children']['workflow_states'] = array('link'=>"../out/out.WorkflowStatesMgr.php", 'label'=>getMLText('global_workflow_states')); + if ($accessobject->check_view_access('WorkflowActionsMgr')) $menuitems['definitions']['children']['workflow_actions'] = array('link'=>"../out/out.WorkflowActionsMgr.php", 'label'=>getMLText('global_workflow_actions')); } + } if($this->params['enablefullsearch']) { + if($accessobject->check_view_access(array('Indexer', 'CreateIndex', 'IndexInfo'))) { $menuitems['fulltext'] = array('link'=>"#", 'label'=>getMLText('fullsearch')); + if ($accessobject->check_view_access('Indexer')) $menuitems['fulltext']['children']['update_fulltext_index'] = array('link'=>"../out/out.Indexer.php", 'label'=>getMLText('update_fulltext_index')); + if ($accessobject->check_view_access('CreateIndex')) $menuitems['fulltext']['children']['create_fulltext_index'] = array('link'=>"../out/out.CreateIndex.php", 'label'=>getMLText('create_fulltext_index')); + if ($accessobject->check_view_access('IndexInfo')) $menuitems['fulltext']['children']['fulltext_info'] = array('link'=>"../out/out.IndexInfo.php", 'label'=>getMLText('fulltext_info')); } + } + if($accessobject->check_view_access(array('BackupTools', 'LogManagement'))) { $menuitems['backup_log_management'] = array('link'=>"#", 'label'=>getMLText('backup_log_management')); + if ($accessobject->check_view_access('BackupTools')) $menuitems['backup_log_management']['children'][] = array('link'=>"../out/out.BackupTools.php", 'label'=>getMLText('backup_tools')); if ($this->params['logfileenable']) + if ($accessobject->check_view_access('LogManagement')) $menuitems['backup_log_management']['children'][] = array('link'=>"../out/out.LogManagement.php", 'label'=>getMLText('log_management')); + } + if($accessobject->check_view_access(array('ImportFS', 'ImportUsers', 'Statistic', 'Charts', 'Timeline', 'ObjectCheck', 'ExtensionMgr', 'Info'))) { $menuitems['misc'] = array('link'=>"#", 'label'=>getMLText('misc')); + if ($accessobject->check_view_access('ImportFS')) $menuitems['misc']['children']['import_fs'] = array('link'=>"../out/out.ImportFS.php", 'label'=>getMLText('import_fs')); + if ($accessobject->check_view_access('ImportUsers')) $menuitems['misc']['children']['import_users'] = array('link'=>"../out/out.ImportUsers.php", 'label'=>getMLText('import_users')); + if ($accessobject->check_view_access('Statistic')) $menuitems['misc']['children']['folders_and_documents_statistic'] = array('link'=>"../out/out.Statistic.php", 'label'=>getMLText('folders_and_documents_statistic')); + if ($accessobject->check_view_access('Charts')) $menuitems['misc']['children']['charts'] = array('link'=>"../out/out.Charts.php", 'label'=>getMLText('charts')); + if ($accessobject->check_view_access('Timeline')) $menuitems['misc']['children']['timeline'] = array('link'=>"../out/out.Timeline.php", 'label'=>getMLText('timeline')); + if ($accessobject->check_view_access('ObjectCheck')) $menuitems['misc']['children']['objectcheck'] = array('link'=>"../out/out.ObjectCheck.php", 'label'=>getMLText('objectcheck')); + if ($accessobject->check_view_access('ExpiredDocuments')) $menuitems['misc']['children']['documents_expired'] = array('link'=>"../out/out.ExpiredDocuments.php", 'label'=>getMLText('documents_expired')); + if ($accessobject->check_view_access('ExtensionMgr')) $menuitems['misc']['children']['extension_manager'] = array('link'=>"../out/out.ExtensionMgr.php", 'label'=>getMLText('extension_manager')); + if ($accessobject->check_view_access('ClearCache')) $menuitems['misc']['children']['clear_cache'] = array('link'=>"../out/out.ClearCache.php", 'label'=>getMLText('clear_cache')); + if ($accessobject->check_view_access('Info')) $menuitems['misc']['children']['version_info'] = array('link'=>"../out/out.Info.php", 'label'=>getMLText('version_info')); + } /* Check if hook exists because otherwise callHook() will override $menuitems */ if($this->hasHook('admintoolsNavigationBar')) @@ -845,6 +908,7 @@ background-image: linear-gradient(to bottom, #882222, #111111);; } /* }}} */ private function calendarOldNavigationBar($d){ /* {{{ */ + $accessobject = $this->params['accessobject']; $ds="&day=".$d[0]."&month=".$d[1]."&year=".$d[2]; echo "".getMLText("calendar")."\n"; echo "
          \n"; @@ -862,6 +926,7 @@ background-image: linear-gradient(to bottom, #882222, #111111);; } /* }}} */ private function calendarNavigationBar($d){ /* {{{ */ + $accessobject = $this->params['accessobject']; echo "".getMLText("calendar")."\n"; echo "
          \n"; @@ -2354,12 +2419,17 @@ $(function() { } /* }}} */ function printLockButton($document, $msglock, $msgunlock, $return=false) { /* {{{ */ + $accessobject = $this->params['accessobject']; $docid = $document->getID(); if($document->isLocked()) { + if(!$accessobject->check_controller_access('UnlockDocument')) + return ''; $icon = 'unlock'; $msg = $msgunlock; $title = 'unlock_document'; } else { + if(!$accessobject->check_controller_access('LockDocument')) + return ''; $icon = 'lock'; $msg = $msglock; $title = 'lock_document'; @@ -2694,6 +2764,7 @@ $('body').on('click', '[id^=\"table-row-folder\"] td:nth-child(2)', function(ev) $workflowmode = $this->params['workflowmode']; $previewwidth = $this->params['previewWidthList']; $enableClipboard = $this->params['enableclipboard']; + $accessop = $this->params['accessobject']; $onepage = $this->params['onepage']; $content = ''; @@ -2742,12 +2813,14 @@ $('body').on('click', '[id^=\"table-row-folder\"] td:nth-child(2)', function(ev) $content .= ""; if (file_exists($dms->contentDir . $latestContent->getPath())) { + if($accessop->check_controller_access('Download', array('action'=>'version'))) $content .= ""; if($previewer->hasPreview($latestContent)) { $content .= "getID()."&version=".$latestContent->getVersion()."&width=".$previewwidth."\" title=\"".htmlspecialchars($latestContent->getMimeType())."\">"; } else { $content .= "getMimeIcon($latestContent->getFileType())."\" ".($previewwidth ? "width=\"".$previewwidth."\"" : "")."\" title=\"".htmlspecialchars($latestContent->getMimeType())."\">"; } + if($accessop->check_controller_access('Download', array('action'=>'version'))) $content .= ""; } else $content .= "getMimeIcon($latestContent->getFileType())."\" title=\"".htmlspecialchars($latestContent->getMimeType())."\">"; @@ -2799,10 +2872,12 @@ $('body').on('click', '[id^=\"table-row-folder\"] td:nth-child(2)', function(ev) $content .= "
          "; if(!empty($extracontent['begin_action_list'])) $content .= $extracontent['begin_action_list']; - if($document->getAccessMode($user) >= M_ALL) { - $content .= $this->printDeleteDocumentButton($document, 'splash_rm_document', true); - } else { - $content .= ''; + if($accessop->check_view_access('RemoveDocument')) { + if($document->getAccessMode($user) >= M_ALL) { + $content .= $this->printDeleteDocumentButton($document, 'splash_rm_document', true); + } else { + $content .= ''; + } } if($document->getAccessMode($user) >= M_READWRITE) { $content .= ''; @@ -2878,6 +2953,7 @@ $('body').on('click', '[id^=\"table-row-folder\"] td:nth-child(2)', function(ev) $enableRecursiveCount = $this->params['enableRecursiveCount']; $maxRecursiveCount = $this->params['maxRecursiveCount']; $enableClipboard = $this->params['enableclipboard']; + $accessop = $this->params['accessobject']; $onepage = $this->params['onepage']; $owner = $subFolder->getOwner(); @@ -2934,10 +3010,12 @@ $('body').on('click', '[id^=\"table-row-folder\"] td:nth-child(2)', function(ev) if(!empty($extracontent['begin_action_list'])) $content .= $extracontent['begin_action_list']; $subFolderAccessMode = $subFolder->getAccessMode($user); - if($subFolderAccessMode >= M_ALL) { - $content .= $this->printDeleteFolderButton($subFolder, 'splash_rm_folder', true); - } else { - $content .= ''; + if ($accessop->check_view_access('RemoveFolder')) { + if($subFolderAccessMode >= M_ALL) { + $content .= $this->printDeleteFolderButton($subFolder, 'splash_rm_folder', true); + } else { + $content .= ''; + } } if($subFolderAccessMode >= M_READWRITE) { $content .= ''; @@ -3162,6 +3240,7 @@ $(document).ready(function() { protected function printProtocol($latestContent, $type="") { /* {{{ */ $dms = $this->params['dms']; $document = $latestContent->getDocument(); + $accessop = $this->params['accessobject']; ?> @@ -3213,16 +3292,18 @@ $(document).ready(function() { echo "
          ".htmlspecialchars($rec['comment']); switch($type) { case "review": - if($rec['file']) { - echo "
          "; - echo "getID()."&reviewlogid=".$rec['reviewLogID']."\" class=\"btn btn-mini\"> ".getMLText('download').""; - } + if($accessop->check_controller_access('Download', array('action'=>'review'))) + if($rec['file']) { + echo "
          "; + echo "getID()."&reviewlogid=".$rec['reviewLogID']."\" class=\"btn btn-mini\"> ".getMLText('download').""; + } break; case "approval": - if($rec['file']) { - echo "
          "; - echo "getID()."&approvelogid=".$rec['approveLogID']."\" class=\"btn btn-mini\"> ".getMLText('download').""; - } + if($accessop->check_controller_access('Download', array('action'=>'approval'))) + if($rec['file']) { + echo "
          "; + echo "getID()."&approvelogid=".$rec['approveLogID']."\" class=\"btn btn-mini\"> ".getMLText('download').""; + } break; } echo ""; From 08e2c2d5ef86e7f91b5a5d5fa3573c070ea395b9 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Mon, 19 Apr 2021 06:25:04 +0200 Subject: [PATCH 021/403] fix line indenting --- views/bootstrap/class.Bootstrap.php | 44 +++++++++++++++-------------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/views/bootstrap/class.Bootstrap.php b/views/bootstrap/class.Bootstrap.php index 7b332de4c..6384134fa 100644 --- a/views/bootstrap/class.Bootstrap.php +++ b/views/bootstrap/class.Bootstrap.php @@ -658,9 +658,9 @@ background-image: linear-gradient(to bottom, #882222, #111111);; } else if ($accessMode >= M_READWRITE) { if ($accessobject->check_view_access('AddSubFolder')) - $menuitems['add_subfolder'] = array('link'=>"../out/out.AddSubFolder.php?folderid=". $folderID ."&showtree=".showtree(), 'label'=>getMLText('add_subfolder')); + $menuitems['add_subfolder'] = array('link'=>"../out/out.AddSubFolder.php?folderid=". $folderID ."&showtree=".showtree(), 'label'=>getMLText('add_subfolder')); if ($accessobject->check_view_access('AddDocument')) - $menuitems['add_document'] = array('link'=>"../out/out.AddDocument.php?folderid=". $folderID ."&showtree=".showtree(), 'label'=>getMLText('add_document')); + $menuitems['add_document'] = array('link'=>"../out/out.AddDocument.php?folderid=". $folderID ."&showtree=".showtree(), 'label'=>getMLText('add_document')); if(0 && $this->params['enablelargefileupload']) $menuitems['add_multiple_documents'] = array('link'=>"../out/out.AddMultiDocument.php?folderid=". $folderID ."&showtree=".showtree(), 'label'=>getMLText('add_multiple_documents')); $menuitems['edit_folder_props'] = array('link'=>"../out/out.EditFolder.php?folderid=". $folderID ."&showtree=".showtree(), 'label'=>getMLText('edit_folder_props')); @@ -670,7 +670,7 @@ background-image: linear-gradient(to bottom, #882222, #111111);; if ($accessMode == M_ALL) { if ($folderID != $this->params['rootfolderid'] && $folder->getParent()) if ($accessobject->check_view_access('RemoveFolder')) - $menuitems['rm_folder'] = array('link'=>"../out/out.RemoveFolder.php?folderid=". $folderID ."&showtree=".showtree(), 'label'=>getMLText('rm_folder')); + $menuitems['rm_folder'] = array('link'=>"../out/out.RemoveFolder.php?folderid=". $folderID ."&showtree=".showtree(), 'label'=>getMLText('rm_folder')); } if ($accessMode == M_ALL) { if ($accessobject->check_view_access('FolderAccess')) @@ -703,20 +703,22 @@ background-image: linear-gradient(to bottom, #882222, #111111);; if ($accessMode >= M_READWRITE) { if (!$document->isLocked()) { if($accessobject->check_controller_access('UpdateDocument')) - $menuitems['update_document'] = array('link'=>"../out/out.UpdateDocument".$docid, 'label'=>getMLText('update_document')); + $menuitems['update_document'] = array('link'=>"../out/out.UpdateDocument".$docid, 'label'=>getMLText('update_document')); if($accessobject->check_controller_access('LockDocument')) - $menuitems['lock_document'] = array('link'=>"../op/op.LockDocument".$docid, 'label'=>getMLText('lock_document')); - $menuitems['edit_document_props'] = array('link'=>"../out/out.EditDocument".$docid , 'label'=>getMLText('edit_document_props')); + $menuitems['lock_document'] = array('link'=>"../op/op.LockDocument".$docid, 'label'=>getMLText('lock_document')); + if($accessobject->check_controller_access('EditDocument')) + $menuitems['edit_document_props'] = array('link'=>"../out/out.EditDocument".$docid , 'label'=>getMLText('edit_document_props')); $menuitems['move_document'] = array('link'=>"../out/out.MoveDocument".$docid, 'label'=>getMLText('move_document')); } else { $lockingUser = $document->getLockingUser(); if (($lockingUser->getID() == $this->params['user']->getID()) || ($document->getAccessMode($this->params['user']) == M_ALL)) { if($accessobject->check_controller_access('UpdateDocument')) - $menuitems['update_document'] = array('link'=>"../out/out.UpdateDocument".$docid, 'label'=>getMLText('update_document')); + $menuitems['update_document'] = array('link'=>"../out/out.UpdateDocument".$docid, 'label'=>getMLText('update_document')); if($accessobject->check_controller_access('UnlockDocument')) - $menuitems['unlock_document'] = array('link'=>"../op/op.UnlockDocument".$docid, 'label'=>getMLText('unlock_document')); - $menuitems['edit_document_props'] = array('link'=>"../out/out.EditDocument".$docid, 'label'=>getMLText('edit_document_props')); + $menuitems['unlock_document'] = array('link'=>"../op/op.UnlockDocument".$docid, 'label'=>getMLText('unlock_document')); + if($accessobject->check_controller_access('EditDocument')) + $menuitems['edit_document_props'] = array('link'=>"../out/out.EditDocument".$docid, 'label'=>getMLText('edit_document_props')); $menuitems['move_document'] = array('link'=>"../out/out.MoveDocument".$docid, 'label'=>getMLText('move_document')); } } @@ -776,9 +778,9 @@ background-image: linear-gradient(to bottom, #882222, #111111);; if ($this->params['enableusersview']){ if ($accessobject->check_view_access('UsrView')) - $menuitems['users'] = array('link'=>"../out/out.UsrView.php", 'label'=>getMLText('users')); + $menuitems['users'] = array('link'=>"../out/out.UsrView.php", 'label'=>getMLText('users')); if ($accessobject->check_view_access('GroupView')) - $menuitems['groups'] = array('link'=>"../out/out.GroupView.php", 'label'=>getMLText('groups')); + $menuitems['groups'] = array('link'=>"../out/out.GroupView.php", 'label'=>getMLText('groups')); } /* Check if hook exists because otherwise callHook() will override $menuitems */ @@ -862,16 +864,16 @@ background-image: linear-gradient(to bottom, #882222, #111111);; $menuitems['fulltext']['children']['create_fulltext_index'] = array('link'=>"../out/out.CreateIndex.php", 'label'=>getMLText('create_fulltext_index')); if ($accessobject->check_view_access('IndexInfo')) $menuitems['fulltext']['children']['fulltext_info'] = array('link'=>"../out/out.IndexInfo.php", 'label'=>getMLText('fulltext_info')); - } + } } if($accessobject->check_view_access(array('BackupTools', 'LogManagement'))) { - $menuitems['backup_log_management'] = array('link'=>"#", 'label'=>getMLText('backup_log_management')); - if ($accessobject->check_view_access('BackupTools')) - $menuitems['backup_log_management']['children'][] = array('link'=>"../out/out.BackupTools.php", 'label'=>getMLText('backup_tools')); - if ($this->params['logfileenable']) - if ($accessobject->check_view_access('LogManagement')) - $menuitems['backup_log_management']['children'][] = array('link'=>"../out/out.LogManagement.php", 'label'=>getMLText('log_management')); + $menuitems['backup_log_management'] = array('link'=>"#", 'label'=>getMLText('backup_log_management')); + if ($accessobject->check_view_access('BackupTools')) + $menuitems['backup_log_management']['children'][] = array('link'=>"../out/out.BackupTools.php", 'label'=>getMLText('backup_tools')); + if ($this->params['logfileenable']) + if ($accessobject->check_view_access('LogManagement')) + $menuitems['backup_log_management']['children'][] = array('link'=>"../out/out.LogManagement.php", 'label'=>getMLText('log_management')); } if($accessobject->check_view_access(array('ImportFS', 'ImportUsers', 'Statistic', 'Charts', 'Timeline', 'ObjectCheck', 'ExtensionMgr', 'Info'))) { @@ -2284,7 +2286,7 @@ $(function() { function printDeleteDocumentButton($document, $msg, $return=false){ /* {{{ */ $docid = $document->getID(); $content = ''; - $content .= ' $document->getName())), ENT_QUOTES).'">'; + $content .= ' $document->getName())), ENT_QUOTES).'">'; if($return) return $content; else @@ -2814,14 +2816,14 @@ $('body').on('click', '[id^=\"table-row-folder\"] td:nth-child(2)', function(ev) $content .= ""; From 70985572dc2810b0e642b32a5ceabd7e8f4f76b4 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Mon, 19 Apr 2021 08:34:40 +0200 Subject: [PATCH 022/403] use colums und rows from theme style --- views/bootstrap/class.AdminTools.php | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/views/bootstrap/class.AdminTools.php b/views/bootstrap/class.AdminTools.php index ee856936f..a3ca51fde 100644 --- a/views/bootstrap/class.AdminTools.php +++ b/views/bootstrap/class.AdminTools.php @@ -35,16 +35,24 @@ class SeedDMS_View_AdminTools extends SeedDMS_Theme_Style { return self::startRow().$content.self::endRow(); } /* }}} */ - static function startRow() { /* {{{ */ - return '
          '; + public function startRow() { /* {{{ */ + ob_start(); + $this->rowStart(); + return ob_get_clean(); } /* }}} */ - static function endRow() { /* {{{ */ - return '
          '; + public function endRow() { /* {{{ */ + ob_start(); + $this->rowEnd(); + return ob_get_clean(); } /* }}} */ - static function rowButton($link, $icon, $label) { /* {{{ */ - return '
          '.getMLText($label).'
          '; + public function rowButton($link, $icon, $label) { /* {{{ */ + ob_start(); + $this->columnStart(2); + echo '
          '.getMLText($label).'
          '; + $this->columnEnd(); + return ob_get_clean(); } /* }}} */ function show() { /* {{{ */ @@ -58,7 +66,7 @@ class SeedDMS_View_AdminTools extends SeedDMS_Theme_Style { $this->contentStart(); $this->pageNavigation(getMLText("admin_tools"), "admin_tools"); // $this->contentHeading(getMLText("admin_tools")); - $this->contentContainerStart(); +// $this->contentContainerStart(); ?>
          callHook('beforeRows'); ?> @@ -126,7 +134,7 @@ class SeedDMS_View_AdminTools extends SeedDMS_Theme_Style { callHook('afterRows'); ?>
          contentContainerEnd(); +// $this->contentContainerEnd(); $this->contentEnd(); $this->htmlEndPage(); } /* }}} */ From bbe919118f72346b0fb586f352c22b2fb76b138a Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Mon, 19 Apr 2021 08:35:05 +0200 Subject: [PATCH 023/403] add class table-sm to table --- views/bootstrap/class.AttributeMgr.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/bootstrap/class.AttributeMgr.php b/views/bootstrap/class.AttributeMgr.php index 45a4a8dc4..98d4e29cc 100644 --- a/views/bootstrap/class.AttributeMgr.php +++ b/views/bootstrap/class.AttributeMgr.php @@ -79,7 +79,7 @@ $(document).ready( function() { foreach(array('document', 'folder', 'content') as $type) { $content = ''; if(isset($res['frequencies'][$type]) && $res['frequencies'][$type]) { - $content .= "
          "; if (file_exists($dms->contentDir . $latestContent->getPath())) { if($accessop->check_controller_access('Download', array('action'=>'version'))) - $content .= ""; + $content .= ""; if($previewer->hasPreview($latestContent)) { $content .= "getID()."&version=".$latestContent->getVersion()."&width=".$previewwidth."\" title=\"".htmlspecialchars($latestContent->getMimeType())."\">"; } else { $content .= "getMimeIcon($latestContent->getFileType())."\" ".($previewwidth ? "width=\"".$previewwidth."\"" : "")."\" title=\"".htmlspecialchars($latestContent->getMimeType())."\">"; } if($accessop->check_controller_access('Download', array('action'=>'version'))) - $content .= ""; + $content .= ""; } else $content .= "getMimeIcon($latestContent->getFileType())."\" title=\"".htmlspecialchars($latestContent->getMimeType())."\">"; $content .= "
          "; + $content .= "
          "; $content .= "\n\n"; $content .= "\n"; $content .= "\n"; From d57a4c69b20e93c4df19253ad94ae710fe007d02 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Mon, 19 Apr 2021 08:35:57 +0200 Subject: [PATCH 024/403] add class table-sm to table --- views/bootstrap/class.GroupMgr.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/bootstrap/class.GroupMgr.php b/views/bootstrap/class.GroupMgr.php index 178a3c564..539ad3e2f 100644 --- a/views/bootstrap/class.GroupMgr.php +++ b/views/bootstrap/class.GroupMgr.php @@ -119,7 +119,7 @@ $(document).ready( function() { if($selgroup) { $previewer = new SeedDMS_Preview_Previewer($cachedir, $previewwidth, $timeout, $xsendfile); $this->contentHeading(getMLText("group_info")); - echo "
          ".getMLText("attribute_value")."".getMLText("attribute_count")."
          \n"; + echo "
          \n"; if($workflowmode == "traditional") { $reviewstatus = $selgroup->getReviewStatus(); $i = 0; From 3d7a74ec32a260e299861d04964219f776b3ff0c Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Mon, 19 Apr 2021 08:36:07 +0200 Subject: [PATCH 025/403] fix line indenting --- views/bootstrap/class.Bootstrap.php | 156 +++++++++++++++------------- 1 file changed, 81 insertions(+), 75 deletions(-) diff --git a/views/bootstrap/class.Bootstrap.php b/views/bootstrap/class.Bootstrap.php index 6384134fa..b111e0227 100644 --- a/views/bootstrap/class.Bootstrap.php +++ b/views/bootstrap/class.Bootstrap.php @@ -312,6 +312,8 @@ background-image: linear-gradient(to bottom, #882222, #111111);; echo " \n"; echo " \n"; echo " params['dms']->getRootFolder()->getId()."\">".(strlen($this->params['sitename'])>0 ? $this->params['sitename'] : "SeedDMS")."\n"; + + /* user profile menu {{{ */ if(isset($this->params['session']) && isset($this->params['user']) && $this->params['user']) { echo "
          \n"; echo "
            \n"; @@ -371,6 +373,7 @@ background-image: linear-gradient(to bottom, #882222, #111111);; echo "
          \n"; echo " \n"; echo " \n"; + /* }}} End of user profile menu */ /* menu tasks {{{ */ if($this->params['enablemenutasks'] && !$this->params['user']->isGuest()) { @@ -443,6 +446,8 @@ background-image: linear-gradient(to bottom, #882222, #111111);; } } echo " \n"; + + /* search form {{{ */ echo " "; if ($folder!=null && is_object($folder) && $folder->isType('folder')) { echo " getID()."\" />"; @@ -456,6 +461,7 @@ background-image: linear-gradient(to bottom, #882222, #111111);; // } // echo " "; echo "\n"; + /* }}} End of search form */ echo "
          \n"; } echo " \n"; @@ -654,7 +660,7 @@ background-image: linear-gradient(to bottom, #882222, #111111);; if ($accessMode == M_READ && !$this->params['user']->isGuest()) { if ($accessobject->check_view_access('FolderNotify')) - $menuitems['edit_folder_notify'] = array('link'=>"../out/out.FolderNotify.php?folderid=".$folderID."&showtree=".showtree(), 'label'=>getMLText('edit_folder_notify')); + $menuitems['edit_folder_notify'] = array('link'=>"../out/out.FolderNotify.php?folderid=".$folderID."&showtree=".showtree(), 'label'=>getMLText('edit_folder_notify')); } else if ($accessMode >= M_READWRITE) { if ($accessobject->check_view_access('AddSubFolder')) @@ -674,10 +680,10 @@ background-image: linear-gradient(to bottom, #882222, #111111);; } if ($accessMode == M_ALL) { if ($accessobject->check_view_access('FolderAccess')) - $menuitems['edit_folder_access'] = array('link'=>"../out/out.FolderAccess.php?folderid=".$folderID."&showtree=".showtree(), 'label'=>getMLText('edit_folder_access')); + $menuitems['edit_folder_access'] = array('link'=>"../out/out.FolderAccess.php?folderid=".$folderID."&showtree=".showtree(), 'label'=>getMLText('edit_folder_access')); } if ($accessobject->check_view_access('FolderNotify')) - $menuitems['edit_existing_notify'] = array('link'=>"../out/out.FolderNotify.php?folderid=". $folderID ."&showtree=". showtree(), 'label'=>getMLText('edit_existing_notify')); + $menuitems['edit_existing_notify'] = array('link'=>"../out/out.FolderNotify.php?folderid=". $folderID ."&showtree=". showtree(), 'label'=>getMLText('edit_existing_notify')); } if ($this->params['user']->isAdmin() && $this->params['enablefullsearch']) { $menuitems['index_folder'] = array('link'=>"../out/out.Indexer.php?folderid=". $folderID."&showtree=".showtree(), 'label'=>getMLText('index_folder')); @@ -803,12 +809,12 @@ background-image: linear-gradient(to bottom, #882222, #111111);; $menuitems['all_documents'] = array('link'=>"../out/out.MyDocuments.php", 'label'=>getMLText('all_documents')); if($this->params['workflowmode'] == 'traditional' || $this->params['workflowmode'] == 'traditional_only_approval') { if ($accessobject->check_view_access('ReviewSummary')) - $menuitems['review_summary'] = array('link'=>"../out/out.ReviewSummary.php", 'label'=>getMLText('review_summary')); + $menuitems['review_summary'] = array('link'=>"../out/out.ReviewSummary.php", 'label'=>getMLText('review_summary')); if ($accessobject->check_view_access('ApprovalSummary')) - $menuitems['approval_summary'] = array('link'=>"../out/out.ApprovalSummary.php", 'label'=>getMLText('approval_summary')); + $menuitems['approval_summary'] = array('link'=>"../out/out.ApprovalSummary.php", 'label'=>getMLText('approval_summary')); } else { if ($accessobject->check_view_access('WorkflowSummary')) - $menuitems['workflow_summary'] = array('link'=>"../out/out.WorkflowSummary.php", 'label'=>getMLText('workflow_summary')); + $menuitems['workflow_summary'] = array('link'=>"../out/out.WorkflowSummary.php", 'label'=>getMLText('workflow_summary')); } /* Check if hook exists because otherwise callHook() will override $menuitems */ @@ -828,42 +834,42 @@ background-image: linear-gradient(to bottom, #882222, #111111);; $menuitems = array(); if($accessobject->check_view_access(array('UsrMgr', 'GroupMgr', 'UserList'))) { - $menuitems['user_group_management'] = array('link'=>"#", 'label'=>getMLText('user_group_management')); - if ($accessobject->check_view_access('UsrMgr')) - $menuitems['user_group_management']['children']['user_management'] = array('link'=>"../out/out.UsrMgr.php", 'label'=>getMLText('user_management')); - if ($accessobject->check_view_access('GroupMgr')) - $menuitems['user_group_management']['children']['group_management'] = array('link'=>"../out/out.GroupMgr.php", 'label'=>getMLText('group_management')); - if ($accessobject->check_view_access('UserList')) - $menuitems['user_group_management']['children']['user_list'] = array('link'=>"../out/out.UserList.php", 'label'=>getMLText('user_list')); - } + $menuitems['user_group_management'] = array('link'=>"#", 'label'=>getMLText('user_group_management')); + if ($accessobject->check_view_access('UsrMgr')) + $menuitems['user_group_management']['children']['user_management'] = array('link'=>"../out/out.UsrMgr.php", 'label'=>getMLText('user_management')); + if ($accessobject->check_view_access('GroupMgr')) + $menuitems['user_group_management']['children']['group_management'] = array('link'=>"../out/out.GroupMgr.php", 'label'=>getMLText('group_management')); + if ($accessobject->check_view_access('UserList')) + $menuitems['user_group_management']['children']['user_list'] = array('link'=>"../out/out.UserList.php", 'label'=>getMLText('user_list')); + } - if($accessobject->check_view_access(array('DefaultKeywords', 'Categories', 'AttributeMgr', 'WorkflowMgr', 'WorkflowStatesMgr', 'WorkflowActionsMgr'))) { - $menuitems['definitions'] = array('link'=>"#", 'label'=>getMLText('definitions')); - if ($accessobject->check_view_access('DefaultKeywords')) - $menuitems['definitions']['children']['default_keywords'] = array('link'=>"../out/out.DefaultKeywords.php", 'label'=>getMLText('global_default_keywords')); - if ($accessobject->check_view_access('Categories')) - $menuitems['definitions']['children']['document_categories'] = array('link'=>"../out/out.Categories.php", 'label'=>getMLText('global_document_categories')); - if ($accessobject->check_view_access('AttributeMgr')) - $menuitems['definitions']['children']['attribute_definitions'] = array('link'=>"../out/out.AttributeMgr.php", 'label'=>getMLText('global_attributedefinitions')); - if($this->params['workflowmode'] == 'advanced') { - if ($accessobject->check_view_access('WorkflowMgr')) - $menuitems['definitions']['children']['workflows'] = array('link'=>"../out/out.WorkflowMgr.php", 'label'=>getMLText('global_workflows')); - if ($accessobject->check_view_access('WorkflowStatesMgr')) - $menuitems['definitions']['children']['workflow_states'] = array('link'=>"../out/out.WorkflowStatesMgr.php", 'label'=>getMLText('global_workflow_states')); - if ($accessobject->check_view_access('WorkflowActionsMgr')) - $menuitems['definitions']['children']['workflow_actions'] = array('link'=>"../out/out.WorkflowActionsMgr.php", 'label'=>getMLText('global_workflow_actions')); - } + if($accessobject->check_view_access(array('DefaultKeywords', 'Categories', 'AttributeMgr', 'WorkflowMgr', 'WorkflowStatesMgr', 'WorkflowActionsMgr'))) { + $menuitems['definitions'] = array('link'=>"#", 'label'=>getMLText('definitions')); + if ($accessobject->check_view_access('DefaultKeywords')) + $menuitems['definitions']['children']['default_keywords'] = array('link'=>"../out/out.DefaultKeywords.php", 'label'=>getMLText('global_default_keywords')); + if ($accessobject->check_view_access('Categories')) + $menuitems['definitions']['children']['document_categories'] = array('link'=>"../out/out.Categories.php", 'label'=>getMLText('global_document_categories')); + if ($accessobject->check_view_access('AttributeMgr')) + $menuitems['definitions']['children']['attribute_definitions'] = array('link'=>"../out/out.AttributeMgr.php", 'label'=>getMLText('global_attributedefinitions')); + if($this->params['workflowmode'] == 'advanced') { + if ($accessobject->check_view_access('WorkflowMgr')) + $menuitems['definitions']['children']['workflows'] = array('link'=>"../out/out.WorkflowMgr.php", 'label'=>getMLText('global_workflows')); + if ($accessobject->check_view_access('WorkflowStatesMgr')) + $menuitems['definitions']['children']['workflow_states'] = array('link'=>"../out/out.WorkflowStatesMgr.php", 'label'=>getMLText('global_workflow_states')); + if ($accessobject->check_view_access('WorkflowActionsMgr')) + $menuitems['definitions']['children']['workflow_actions'] = array('link'=>"../out/out.WorkflowActionsMgr.php", 'label'=>getMLText('global_workflow_actions')); + } } if($this->params['enablefullsearch']) { if($accessobject->check_view_access(array('Indexer', 'CreateIndex', 'IndexInfo'))) { - $menuitems['fulltext'] = array('link'=>"#", 'label'=>getMLText('fullsearch')); + $menuitems['fulltext'] = array('link'=>"#", 'label'=>getMLText('fullsearch')); if ($accessobject->check_view_access('Indexer')) - $menuitems['fulltext']['children']['update_fulltext_index'] = array('link'=>"../out/out.Indexer.php", 'label'=>getMLText('update_fulltext_index')); + $menuitems['fulltext']['children']['update_fulltext_index'] = array('link'=>"../out/out.Indexer.php", 'label'=>getMLText('update_fulltext_index')); if ($accessobject->check_view_access('CreateIndex')) - $menuitems['fulltext']['children']['create_fulltext_index'] = array('link'=>"../out/out.CreateIndex.php", 'label'=>getMLText('create_fulltext_index')); + $menuitems['fulltext']['children']['create_fulltext_index'] = array('link'=>"../out/out.CreateIndex.php", 'label'=>getMLText('create_fulltext_index')); if ($accessobject->check_view_access('IndexInfo')) - $menuitems['fulltext']['children']['fulltext_info'] = array('link'=>"../out/out.IndexInfo.php", 'label'=>getMLText('fulltext_info')); + $menuitems['fulltext']['children']['fulltext_info'] = array('link'=>"../out/out.IndexInfo.php", 'label'=>getMLText('fulltext_info')); } } @@ -877,27 +883,27 @@ background-image: linear-gradient(to bottom, #882222, #111111);; } if($accessobject->check_view_access(array('ImportFS', 'ImportUsers', 'Statistic', 'Charts', 'Timeline', 'ObjectCheck', 'ExtensionMgr', 'Info'))) { - $menuitems['misc'] = array('link'=>"#", 'label'=>getMLText('misc')); - if ($accessobject->check_view_access('ImportFS')) - $menuitems['misc']['children']['import_fs'] = array('link'=>"../out/out.ImportFS.php", 'label'=>getMLText('import_fs')); - if ($accessobject->check_view_access('ImportUsers')) - $menuitems['misc']['children']['import_users'] = array('link'=>"../out/out.ImportUsers.php", 'label'=>getMLText('import_users')); - if ($accessobject->check_view_access('Statistic')) - $menuitems['misc']['children']['folders_and_documents_statistic'] = array('link'=>"../out/out.Statistic.php", 'label'=>getMLText('folders_and_documents_statistic')); - if ($accessobject->check_view_access('Charts')) - $menuitems['misc']['children']['charts'] = array('link'=>"../out/out.Charts.php", 'label'=>getMLText('charts')); - if ($accessobject->check_view_access('Timeline')) - $menuitems['misc']['children']['timeline'] = array('link'=>"../out/out.Timeline.php", 'label'=>getMLText('timeline')); - if ($accessobject->check_view_access('ObjectCheck')) - $menuitems['misc']['children']['objectcheck'] = array('link'=>"../out/out.ObjectCheck.php", 'label'=>getMLText('objectcheck')); - if ($accessobject->check_view_access('ExpiredDocuments')) - $menuitems['misc']['children']['documents_expired'] = array('link'=>"../out/out.ExpiredDocuments.php", 'label'=>getMLText('documents_expired')); - if ($accessobject->check_view_access('ExtensionMgr')) - $menuitems['misc']['children']['extension_manager'] = array('link'=>"../out/out.ExtensionMgr.php", 'label'=>getMLText('extension_manager')); - if ($accessobject->check_view_access('ClearCache')) - $menuitems['misc']['children']['clear_cache'] = array('link'=>"../out/out.ClearCache.php", 'label'=>getMLText('clear_cache')); - if ($accessobject->check_view_access('Info')) - $menuitems['misc']['children']['version_info'] = array('link'=>"../out/out.Info.php", 'label'=>getMLText('version_info')); + $menuitems['misc'] = array('link'=>"#", 'label'=>getMLText('misc')); + if ($accessobject->check_view_access('ImportFS')) + $menuitems['misc']['children']['import_fs'] = array('link'=>"../out/out.ImportFS.php", 'label'=>getMLText('import_fs')); + if ($accessobject->check_view_access('ImportUsers')) + $menuitems['misc']['children']['import_users'] = array('link'=>"../out/out.ImportUsers.php", 'label'=>getMLText('import_users')); + if ($accessobject->check_view_access('Statistic')) + $menuitems['misc']['children']['folders_and_documents_statistic'] = array('link'=>"../out/out.Statistic.php", 'label'=>getMLText('folders_and_documents_statistic')); + if ($accessobject->check_view_access('Charts')) + $menuitems['misc']['children']['charts'] = array('link'=>"../out/out.Charts.php", 'label'=>getMLText('charts')); + if ($accessobject->check_view_access('Timeline')) + $menuitems['misc']['children']['timeline'] = array('link'=>"../out/out.Timeline.php", 'label'=>getMLText('timeline')); + if ($accessobject->check_view_access('ObjectCheck')) + $menuitems['misc']['children']['objectcheck'] = array('link'=>"../out/out.ObjectCheck.php", 'label'=>getMLText('objectcheck')); + if ($accessobject->check_view_access('ExpiredDocuments')) + $menuitems['misc']['children']['documents_expired'] = array('link'=>"../out/out.ExpiredDocuments.php", 'label'=>getMLText('documents_expired')); + if ($accessobject->check_view_access('ExtensionMgr')) + $menuitems['misc']['children']['extension_manager'] = array('link'=>"../out/out.ExtensionMgr.php", 'label'=>getMLText('extension_manager')); + if ($accessobject->check_view_access('ClearCache')) + $menuitems['misc']['children']['clear_cache'] = array('link'=>"../out/out.ClearCache.php", 'label'=>getMLText('clear_cache')); + if ($accessobject->check_view_access('Info')) + $menuitems['misc']['children']['version_info'] = array('link'=>"../out/out.Info.php", 'label'=>getMLText('version_info')); } /* Check if hook exists because otherwise callHook() will override $menuitems */ @@ -2107,17 +2113,17 @@ $(function() { */ autoOpen: false, drapAndDrop: true, - onCreateLi: function(node, $li) { - // Add 'icon' span before title - if(node.is_folder) - $li.find('.jqtree-title').before(' ').attr('data-name', node.name).attr('rel', 'folder_' + node.id).attr('formtoken', '').attr('data-uploadformtoken', '').attr('data-droptarget', 'folder_' + node.id).addClass('droptarget'); - else - $li.find('.jqtree-title').before(' '); - } + onCreateLi: function(node, $li) { + // Add 'icon' span before title + if(node.is_folder) + $li.find('.jqtree-title').before(' ').attr('data-name', node.name).attr('rel', 'folder_' + node.id).attr('formtoken', '').attr('data-uploadformtoken', '').attr('data-droptarget', 'folder_' + node.id).addClass('droptarget'); + else + $li.find('.jqtree-title').before(' '); + } }); // Unfold node for currently selected folder $('#jqtree').tree('selectNode', $('#jqtree').tree('getNodeById', ), false, true); - $('#jqtree').on( + $('#jqtree').on( 'tree.click', function(event) { var node = event.node; @@ -2173,7 +2179,7 @@ $(function() { if(typeof node.fetched == 'undefined') { node.fetched = true; $(this).tree('loadDataFromUrl', node, function() {$(this).tree('openNode', node);}); - } + } }); }); '; + $content .= ''; if($return) return $content; else @@ -2641,7 +2647,7 @@ $(document).ready( function() { */ function printDeleteAttributeValueButton($attrdef, $value, $msg, $return=false){ /* {{{ */ $content = ''; - $content .= ' $attrdef->getName())), ENT_QUOTES).'">'; + $content .= ' $attrdef->getName())), ENT_QUOTES).'">'; if($return) return $content; else @@ -3448,21 +3454,21 @@ $("body").on("click", "span.openpopupbox", function(e) { $id = substr(md5(uniqid()), 0, 4); ?>
          -
          -
          +
          +
          - -
          + +
          -
          +
          -
          -
          -
          -
          +
          +
          + + Date: Mon, 19 Apr 2021 15:53:04 +0200 Subject: [PATCH 026/403] new theme based on bootstrap 4 --- views/bootstrap4/class.Bootstrap4.php | 3516 +++++++ views/bootstrap4/styles/application.css | 405 + views/bootstrap4/styles/application.js | 1425 +++ views/bootstrap4/styles/seeddms.css | 10899 ++++++++++++++++++++++ views/bootstrap4/styles/styles.css | 51 + 5 files changed, 16296 insertions(+) create mode 100644 views/bootstrap4/class.Bootstrap4.php create mode 100644 views/bootstrap4/styles/application.css create mode 100644 views/bootstrap4/styles/application.js create mode 100644 views/bootstrap4/styles/seeddms.css create mode 100644 views/bootstrap4/styles/styles.css diff --git a/views/bootstrap4/class.Bootstrap4.php b/views/bootstrap4/class.Bootstrap4.php new file mode 100644 index 000000000..83ce4efdd --- /dev/null +++ b/views/bootstrap4/class.Bootstrap4.php @@ -0,0 +1,3516 @@ +extraheader = array('js'=>'', 'css'=>'', 'favicon'=>''); + $this->footerjs = array(); + $this->nonces = array(); + } + + /** + * Add javascript to an internal array which is output at the + * end of the page within a document.ready() function. + * + * @param string $script javascript to be added + */ + function addFooterJS($script) { /* {{{ */ + $this->footerjs[] = $script; + } /* }}} */ + + function htmlStartPage($title="", $bodyClass="", $base="", $httpheader=array()) { /* {{{ */ + if(1 || method_exists($this, 'js')) { + /* We still need unsafe-eval, because printDocumentChooserHtml and + * printFolderChooserHtml will include a javascript file with ajax + * which is evaluated by jquery + * worker-src blob: is needed for cytoscape + * X-WebKit-CSP is deprecated, Chrome understands Content-Security-Policy + * since version 25+ + * X-Content-Security-Policy is deprecated, Firefox understands + * Content-Security-Policy since version 23+ + * 'worker-src blob:' is needed for cytoscape + */ + $csp_rules = ''; + $csp_rules .= "script-src 'self' 'unsafe-eval'"; + if($this->nonces) { + $csp_rules .= " 'nonce-".implode("' 'nonce-", $this->nonces)."'"; + } + $csp_rules .= ";"; + $csp_rules .= " worker-src blob:;"; + //$csp_rules .= "style-src 'self';"; + /* Do not allow to embed myself into frames on foreigns pages */ + $csp_rules .= " frame-ancestors 'self';"; + foreach (array("X-WebKit-CSP", "X-Content-Security-Policy", "Content-Security-Policy") as $csp) { + header($csp . ": " . $csp_rules); + } + } + header('X-Content-Type-Options: nosniff'); + header('Strict-Transport-Security: max-age=15768000; includeSubDomains; preload'); + if($httpheader) { + foreach($httpheader as $name=>$value) { + header($name . ": " . $value); + } + } + $hookObjs = $this->getHookObjects('SeedDMS_View_Bootstrap'); + foreach($hookObjs as $hookObj) { + if (method_exists($hookObj, 'startPage')) { + $hookObj->startPage($this); + } + } + echo "\n"; + echo "\n\n"; + echo "\n"; + echo ''."\n"; + if($base) + echo ''."\n"; + elseif($this->baseurl) + echo ''."\n"; + $sitename = trim(strip_tags($this->params['sitename'])); + if($this->params['session']) + echo ''."\n"; + $parenttheme = 'bootstrap'; + echo ''."\n"; + echo ''."\n"; + echo ''."\n"; + echo ''."\n"; + echo ''."\n"; + echo ''."\n"; + echo ''."\n"; + echo ''."\n"; + echo ''."\n"; + if($this->extraheader['css']) + echo $this->extraheader['css']; + if(method_exists($this, 'css')) + echo ''."\n"; + + echo ''."\n"; + if($this->extraheader['js']) + echo $this->extraheader['js']; + echo ''."\n"; + echo ''."\n"; + echo ''."\n"; + echo ''."\n"; + echo ''."\n"; + echo ''."\n"; + echo ''."\n"; + echo ''."\n"; + if(!empty($this->extraheader['favicon'])) + echo $this->extraheader['favicon']; + else { + echo ''."\n"; + echo ''."\n"; + } + if($this->params['session'] && $this->params['session']->getSu()) { +?> + +".(strlen($sitename)>0 ? $sitename : "SeedDMS").(strlen($title)>0 ? ": " : "").htmlspecialchars($title)."\n"; + echo "\n"; + echo "0 ? " class=\"".$bodyClass."\"" : "").">\n"; + if($this->params['session'] && $flashmsg = $this->params['session']->getSplashMsg()) { + $this->params['session']->clearSplashMsg(); + echo "
          ".$flashmsg['msg']."
          \n"; + } + echo "

          ".getMLText('recent_uploads')."

          \n"; + foreach($hookObjs as $hookObj) { + if (method_exists($hookObj, 'startBody')) { + $hookObj->startBody($this); + } + } + } /* }}} */ + + function htmlAddHeader($head, $type='js') { /* {{{ */ + $this->extraheader[$type] .= $head; + } /* }}} */ + + function htmlAddJsHeader($script) { /* {{{ */ + $nonce = createNonce(); + $this->nonces[] = $nonce; + $this->extraheader['js'] .= ''."\n"; + } /* }}} */ + + function htmlEndPage($nofooter=false) { /* {{{ */ + if(!$nofooter) { + $hookObjs = $this->getHookObjects('SeedDMS_View_Bootstrap'); + $html = $this->footNote(); + foreach($hookObjs as $hookObj) { + if (method_exists($hookObj, 'footNote')) { + $html = $hookObj->footNote($this, $html); + } + } + echo $html; + if($this->params['showmissingtranslations']) { + $this->missingLanguageKeys(); + } + } + $parenttheme = 'bootstrap'; + echo ''."\n"; + //echo ''."\n"; + echo ''."\n"; + echo ''."\n"; + echo ''."\n"; + foreach(array('de', 'es', 'ar', 'el', 'bg', 'ru', 'hr', 'hu', 'ko', 'pl', 'ro', 'sk', 'tr', 'uk', 'ca', 'nl', 'fi', 'cs', 'it', 'fr', 'sv', 'sl', 'pt-BR', 'zh-CN', 'zh-TW') as $lang) + echo ''."\n"; + echo ''."\n"; + echo ''."\n"; + parse_str($_SERVER['QUERY_STRING'], $tmp); + $tmp['action'] = 'webrootjs'; + if(isset($tmp['formtoken'])) + unset($tmp['formtoken']); + echo ''."\n"; + echo ''."\n"; + if($this->params['enablemenutasks'] && isset($this->params['user']) && $this->params['user']) { + $this->addFooterJS('SeedDMSTask.run();'); + } + if($this->params['enabledropfolderlist'] && isset($this->params['user']) && $this->params['user']) { + $this->addFooterJS("SeedDMSTask.add({name: 'dropfolder', interval: 30, func: function(){\$('#menu-dropfolder > div.ajax').trigger('update', {folderid: seeddms_folder});}});"); + } + if($this->footerjs) { + $jscode = "$(document).ready(function () {\n"; + foreach($this->footerjs as $script) { + $jscode .= $script."\n"; + } + $jscode .= "});\n"; + $hashjs = md5($jscode); + if(!is_dir($this->params['cachedir'].'/js')) { + SeedDMS_Core_File::makeDir($this->params['cachedir'].'/js'); + } + if(is_dir($this->params['cachedir'].'/js')) { + file_put_contents($this->params['cachedir'].'/js/'.$hashjs.'.js', $jscode); + } + $tmp['action'] = 'footerjs'; + $tmp['hashjs'] = $hashjs; + echo ''."\n"; + } + if(method_exists($this, 'js')) { + parse_str($_SERVER['QUERY_STRING'], $tmp); + $tmp['action'] = 'js'; + echo ''."\n"; + } + echo "\n\n"; + } /* }}} */ + + function webrootjs() { /* {{{ */ + header('Content-Type: application/javascript; charset=UTF-8'); + echo "var seeddms_absbaseprefix=\"".$this->params['absbaseprefix']."\";\n"; + echo "var seeddms_webroot=\"".$this->params['settings']->_httpRoot."\";\n"; + /* Place the current folder id in a js variable, just in case some js code + * needs it, e.g. for reloading parts of the page via ajax. + */ + if(!empty($_REQUEST['folderid'])) + echo "var seeddms_folder=".(int) $_REQUEST['folderid'].";\n"; + else + echo "var seeddms_folder=0;\n"; + } /* }}} */ + + function footerjs() { /* {{{ */ + header('Content-Type: application/javascript'); + if(file_exists($this->params['cachedir'].'/js/'.$_GET['hashjs'].'.js')) { + readfile($this->params['cachedir'].'/js/'.$_GET['hashjs'].'.js'); + } + } /* }}} */ + + function missingLanguageKeys() { /* {{{ */ + global $MISSING_LANG, $LANG; + if($MISSING_LANG) { + echo '
          '."\n"; + $this->rowStart(); + $this->columnStart(12); + echo $this->errorMsg("This page contains missing translations in the selected language. Please help to improve SeedDMS and provide the translation."); + echo "
          "; + echo "\n"; + foreach($MISSING_LANG as $key=>$lang) { + echo ""; + } + echo "
          Keyengl. TextYour translation
          ".$key."".(isset($LANG['en_GB'][$key]) ? $LANG['en_GB'][$key] : '')."
          "; + echo "
          There are missing translations on this page!
          Please check the bottom of the page.
          \n"; + echo "
          \n"; + $this->columnEnd(); + $this->rowEnd(); + } + } /* }}} */ + + function footNote() { /* {{{ */ + $html = "
          \n"; + $html .= '
          '."\n"; + + if ($this->params['printdisclaimer']){ + $html .= "
          ".getMLText("disclaimer")."
          "; + } + + if (isset($this->params['footnote']) && strlen((string)$this->params['footnote'])>0) { + $html .= "
          ".(string)$this->params['footnote']."
          "; + } + $html .= "
          \n"; + $html .= "
          \n"; + + return $html; + } /* }}} */ + + function contentStart() { /* {{{ */ + echo "
          \n"; + echo "
          \n"; + } /* }}} */ + + function contentEnd() { /* {{{ */ + echo "
          \n"; + echo "
          \n"; + } /* }}} */ + + function globalBanner() { /* {{{ */ + echo "\n"; + } /* }}} */ + + function globalNavigation($folder=null) { /* {{{ */ + $dms = $this->params['dms']; + $accessobject = $this->params['accessobject']; + echo "
          \n"; +// echo "
          \n"; + echo "\n"; + return; + } /* }}} */ + + function getFolderPathHTML($folder, $tagAll=false, $document=null) { /* {{{ */ + $path = $folder->getPath(); + $txtpath = ""; + for ($i = 0; $i < count($path); $i++) { + $txtpath .= "
        • "; + if ($i +1 < count($path)) { + $txtpath .= "getID()."&showtree=".showtree()."\" data-droptarget=\"folder_".$path[$i]->getID()."\" rel=\"folder_".$path[$i]->getID()."\" class=\"table-row-folder droptarget\" data-uploadformtoken=\"".createFormKey('')."\" formtoken=\"".createFormKey('')."\">". + htmlspecialchars($path[$i]->getName()).""; + } + else { + $txtpath .= ($tagAll ? "getID()."&showtree=".showtree()."\">". + htmlspecialchars($path[$i]->getName())."" : htmlspecialchars($path[$i]->getName())); + } + } + if($document) + $txtpath .= "
        • getId()."\">".htmlspecialchars($document->getName())."
        • "; + + return ''; + } /* }}} */ + + function pageNavigation($pageTitle, $pageType=null, $extra=null) { /* {{{ */ + + if ($pageType!=null && strcasecmp($pageType, "noNav")) { + echo "\n"; + if($pageType == "view_folder" || $pageType == "view_document") + echo $pageTitle."\n"; + } else { + echo "".$pageTitle."\n"; + } + + return; + } /* }}} */ + + protected function showNavigationBar($menuitems, $options=array()) { /* {{{ */ + $content = ''; + $content .= "\n"; + foreach($menuitems as $menuitem) { + if(!empty($menuitem['children'])) { + $content .= "
        • \n"; + $content .= " ".$menuitem['label']."\n"; + $content .= "
          \n"; + foreach($menuitem['children'] as $submenuitem) { + if(!empty($submenuitem['children'])) { + $content .= "
          \n"; + $content .= " ".$submenuitem['label']."\n"; + $content .= "
          \n"; + foreach($submenuitem['children'] as $subsubmenuitem) { + if(!empty($submenuitem['divider'])) { + $content .= "
          \n"; + } else { + $content .= " "; + } + } + $content .= "
          \n"; + $content .= "
          \n"; + } else { + if(!empty($submenuitem['divider'])) { + $content .= "
          \n"; + } else { + $content .= "
          \n"; + } + } + } + $content .= "
          \n"; + } else { + if(!empty($menuitem['divider'])) { + $content .= "
          \n"; + } else { + $content .= "
        • \n"; + $content .= ""; + $content .= "
        • "; + } + } + } + $content .= "
        \n"; + echo $content; + } /* }}} */ + + protected function showNavigationListWithBadges($menuitems, $options=array()) { /* {{{ */ + $content = ''; + $content .= "\n"; + foreach($menuitems as $menuitem) { + $content .= "
      • \n"; + $content .= ' "; + $content .= "
      • \n"; + } + + $content .= "
      \n"; + echo $content; + } /* }}} */ + + protected function showButtonwithMenu($button, $options=array()) { /* {{{ */ + $content = ''; + $content .= ' +
      + +'; + echo $content; + } /* }}} */ + + private function folderNavigationBar($folder) { /* {{{ */ + $dms = $this->params['dms']; + $accessobject = $this->params['accessobject']; + if (!is_object($folder) || !$folder->isType('folder')) { + self::showNavigationBar(array()); + return; + } + $accessMode = $folder->getAccessMode($this->params['user']); + $folderID = $folder->getID(); + $menuitems = array(); + + if ($accessMode == M_READ && !$this->params['user']->isGuest()) { + if ($accessobject->check_view_access('FolderNotify')) + $menuitems['edit_folder_notify'] = array('link'=>"../out/out.FolderNotify.php?folderid=".$folderID."&showtree=".showtree(), 'label'=>getMLText('edit_folder_notify')); + } + else if ($accessMode >= M_READWRITE) { + if ($accessobject->check_view_access('AddSubFolder')) + $menuitems['add_subfolder'] = array('link'=>"../out/out.AddSubFolder.php?folderid=". $folderID ."&showtree=".showtree(), 'label'=>getMLText('add_subfolder')); + if ($accessobject->check_view_access('AddDocument')) + $menuitems['add_document'] = array('link'=>"../out/out.AddDocument.php?folderid=". $folderID ."&showtree=".showtree(), 'label'=>getMLText('add_document')); + if(0 && $this->params['enablelargefileupload']) + $menuitems['add_multiple_documents'] = array('link'=>"../out/out.AddMultiDocument.php?folderid=". $folderID ."&showtree=".showtree(), 'label'=>getMLText('add_multiple_documents')); + $menuitems['edit_folder_props'] = array('link'=>"../out/out.EditFolder.php?folderid=". $folderID ."&showtree=".showtree(), 'label'=>getMLText('edit_folder_props')); + if ($folderID != $this->params['rootfolderid'] && $folder->getParent()) + $menuitems['move_folder'] = array('link'=>"../out/out.MoveFolder.php?folderid=". $folderID ."&showtree=".showtree(), 'label'=>getMLText('move_folder')); + + if ($accessMode == M_ALL) { + if ($folderID != $this->params['rootfolderid'] && $folder->getParent()) + if ($accessobject->check_view_access('RemoveFolder')) + $menuitems['rm_folder'] = array('link'=>"../out/out.RemoveFolder.php?folderid=". $folderID ."&showtree=".showtree(), 'label'=>getMLText('rm_folder')); + } + if ($accessMode == M_ALL) { + if ($accessobject->check_view_access('FolderAccess')) + $menuitems['edit_folder_access'] = array('link'=>"../out/out.FolderAccess.php?folderid=".$folderID."&showtree=".showtree(), 'label'=>getMLText('edit_folder_access')); + } + if ($accessobject->check_view_access('FolderNotify')) + $menuitems['edit_existing_notify'] = array('link'=>"../out/out.FolderNotify.php?folderid=". $folderID ."&showtree=". showtree(), 'label'=>getMLText('edit_existing_notify')); + } + if ($this->params['user']->isAdmin() && $this->params['enablefullsearch']) { + $menuitems['index_folder'] = array('link'=>"../out/out.Indexer.php?folderid=". $folderID."&showtree=".showtree(), 'label'=>getMLText('index_folder')); + } + + /* Check if hook exists because otherwise callHook() will override $menuitems */ + if($this->hasHook('folderNavigationBar')) + $menuitems = $this->callHook('folderNavigationBar', $folder, $menuitems); + + self::showNavigationBar($menuitems); + } /* }}} */ + + private function documentNavigationBar($document) { /* {{{ */ + $accessobject = $this->params['accessobject']; + $accessMode = $document->getAccessMode($this->params['user']); + $docid=".php?documentid=" . $document->getID(); + $menuitems = array(); + + if ($accessMode >= M_READWRITE) { + if (!$document->isLocked()) { + if($accessobject->check_controller_access('UpdateDocument')) + $menuitems['update_document'] = array('link'=>"../out/out.UpdateDocument".$docid, 'label'=>getMLText('update_document')); + if($accessobject->check_controller_access('LockDocument')) + $menuitems['lock_document'] = array('link'=>"../op/op.LockDocument".$docid, 'label'=>getMLText('lock_document')); + if($accessobject->check_controller_access('EditDocument')) + $menuitems['edit_document_props'] = array('link'=>"../out/out.EditDocument".$docid , 'label'=>getMLText('edit_document_props')); + $menuitems['move_document'] = array('link'=>"../out/out.MoveDocument".$docid, 'label'=>getMLText('move_document')); + } + else { + $lockingUser = $document->getLockingUser(); + if (($lockingUser->getID() == $this->params['user']->getID()) || ($document->getAccessMode($this->params['user']) == M_ALL)) { + if($accessobject->check_controller_access('UpdateDocument')) + $menuitems['update_document'] = array('link'=>"../out/out.UpdateDocument".$docid, 'label'=>getMLText('update_document')); + if($accessobject->check_controller_access('UnlockDocument')) + $menuitems['unlock_document'] = array('link'=>"../op/op.UnlockDocument".$docid, 'label'=>getMLText('unlock_document')); + if($accessobject->check_controller_access('EditDocument')) + $menuitems['edit_document_props'] = array('link'=>"../out/out.EditDocument".$docid, 'label'=>getMLText('edit_document_props')); + $menuitems['move_document'] = array('link'=>"../out/out.MoveDocument".$docid, 'label'=>getMLText('move_document')); + } + } + if($accessobject->maySetExpires()) { + if ($accessobject->check_view_access('SetExpires')) + $menuitems['expires'] = array('link'=>"../out/out.SetExpires".$docid, 'label'=>getMLText('expires')); + } + } + if ($accessMode == M_ALL) { + if ($accessobject->check_view_access('RemoveDocument')) + $menuitems['rm_document'] = array('link'=>"../out/out.RemoveDocument".$docid, 'label'=>getMLText('rm_document')); + if ($accessobject->check_view_access('DocumentAccess')) + $menuitems['edit_document_access'] = array('link'=>"../out/out.DocumentAccess". $docid, 'label'=>getMLText('edit_document_access')); + } + if ($accessMode >= M_READ && !$this->params['user']->isGuest()) { + if ($accessobject->check_view_access('DocumentNotify')) + $menuitems['edit_existing_notify'] = array('link'=>"../out/out.DocumentNotify". $docid, 'label'=>getMLText('edit_existing_notify')); + } + if ($this->params['user']->isAdmin()) { + $menuitems['transfer_document'] = array('link'=>"../out/out.TransferDocument". $docid, 'label'=>getMLText('transfer_document')); + } + + /* Check if hook exists because otherwise callHook() will override $menuitems */ + if($this->hasHook('documentNavigationBar')) + $menuitems = $this->callHook('documentNavigationBar', $document, $menuitems); + + /* Do not use $this->callHook() because $menuitems must be returned by the hook + * or left unchanged + */ + /* + $hookObjs = $this->getHookObjects(); + foreach($hookObjs as $hookObj) { + if (method_exists($hookObj, 'documentNavigationBar')) { + $menuitems = $hookObj->documentNavigationBar($this, $document, $menuitems); + } + } + */ + + self::showNavigationBar($menuitems); + } /* }}} */ + + private function accountNavigationBar() { /* {{{ */ + $accessobject = $this->params['accessobject']; + + $menuitems = array(); + if ($this->params['user']->isAdmin() || !$this->params['disableselfedit']) + $menuitems['edit_user_details'] = array('link'=>"../out/out.EditUserData.php", 'label'=>getMLText('edit_user_details')); + + if (!$this->params['user']->isAdmin()) + $menuitems['edit_default_keywords'] = array('link'=>"../out/out.UserDefaultKeywords.php", 'label'=>getMLText('edit_default_keywords')); + + $menuitems['edit_notify'] = array('link'=>"../out/out.ManageNotify.php", 'label'=>getMLText('edit_existing_notify')); + + if ($this->params['enableusersview']){ + if ($accessobject->check_view_access('UsrView')) + $menuitems['users'] = array('link'=>"../out/out.UsrView.php", 'label'=>getMLText('users')); + if ($accessobject->check_view_access('GroupView')) + $menuitems['groups'] = array('link'=>"../out/out.GroupView.php", 'label'=>getMLText('groups')); + } + + /* Check if hook exists because otherwise callHook() will override $menuitems */ + if($this->hasHook('accountNavigationBar')) + $menuitems = $this->callHook('accountNavigationBar', $menuitems); + + self::showNavigationBar($menuitems); + + } /* }}} */ + + private function myDocumentsNavigationBar() { /* {{{ */ + $accessobject = $this->params['accessobject']; + + $menuitems = array(); + $menuitems['inprocess'] = array('link'=>"../out/out.MyDocuments.php?inProcess=1", 'label'=>getMLText('documents_in_process')); + $menuitems['all_documents'] = array('link'=>"../out/out.MyDocuments.php", 'label'=>getMLText('all_documents')); + if($this->params['workflowmode'] == 'traditional' || $this->params['workflowmode'] == 'traditional_only_approval') { + if ($accessobject->check_view_access('ReviewSummary')) + $menuitems['review_summary'] = array('link'=>"../out/out.ReviewSummary.php", 'label'=>getMLText('review_summary')); + if ($accessobject->check_view_access('ApprovalSummary')) + $menuitems['approval_summary'] = array('link'=>"../out/out.ApprovalSummary.php", 'label'=>getMLText('approval_summary')); + } else { + if ($accessobject->check_view_access('WorkflowSummary')) + $menuitems['workflow_summary'] = array('link'=>"../out/out.WorkflowSummary.php", 'label'=>getMLText('workflow_summary')); + } + + /* Check if hook exists because otherwise callHook() will override $menuitems */ + if($this->hasHook('mydocumentsNavigationBar')) + $menuitems = $this->callHook('mydocumentsNavigationBar', $menuitems); + + self::showNavigationBar($menuitems); + + } /* }}} */ + + private function adminToolsNavigationBar() { /* {{{ */ + $accessobject = $this->params['accessobject']; + $settings = $this->params['settings']; + + $menuitems = array(); + if($accessobject->check_view_access(array('UsrMgr', 'GroupMgr', 'UserList'))) { + $menuitems['user_group_management'] = array('link'=>"#", 'label'=>getMLText('user_group_management')); + if ($accessobject->check_view_access('UsrMgr')) + $menuitems['user_group_management']['children']['user_management'] = array('link'=>"../out/out.UsrMgr.php", 'label'=>getMLText('user_management')); + if ($accessobject->check_view_access('GroupMgr')) + $menuitems['user_group_management']['children']['group_management'] = array('link'=>"../out/out.GroupMgr.php", 'label'=>getMLText('group_management')); + if ($accessobject->check_view_access('UserList')) + $menuitems['user_group_management']['children']['user_list'] = array('link'=>"../out/out.UserList.php", 'label'=>getMLText('user_list')); + } + + if($accessobject->check_view_access(array('DefaultKeywords', 'Categories', 'AttributeMgr', 'WorkflowMgr', 'WorkflowStatesMgr', 'WorkflowActionsMgr'))) { + $menuitems['definitions'] = array('link'=>"#", 'label'=>getMLText('definitions')); + if ($accessobject->check_view_access('DefaultKeywords')) + $menuitems['definitions']['children']['default_keywords'] = array('link'=>"../out/out.DefaultKeywords.php", 'label'=>getMLText('global_default_keywords')); + if ($accessobject->check_view_access('Categories')) + $menuitems['definitions']['children']['document_categories'] = array('link'=>"../out/out.Categories.php", 'label'=>getMLText('global_document_categories')); + if ($accessobject->check_view_access('AttributeMgr')) + $menuitems['definitions']['children']['attribute_definitions'] = array('link'=>"../out/out.AttributeMgr.php", 'label'=>getMLText('global_attributedefinitions')); + if($this->params['workflowmode'] == 'advanced') { + if ($accessobject->check_view_access('WorkflowMgr')) + $menuitems['definitions']['children']['workflows'] = array('link'=>"../out/out.WorkflowMgr.php", 'label'=>getMLText('global_workflows')); + if ($accessobject->check_view_access('WorkflowStatesMgr')) + $menuitems['definitions']['children']['workflow_states'] = array('link'=>"../out/out.WorkflowStatesMgr.php", 'label'=>getMLText('global_workflow_states')); + if ($accessobject->check_view_access('WorkflowActionsMgr')) + $menuitems['definitions']['children']['workflow_actions'] = array('link'=>"../out/out.WorkflowActionsMgr.php", 'label'=>getMLText('global_workflow_actions')); + } + } + + if($this->params['enablefullsearch']) { + if($accessobject->check_view_access(array('Indexer', 'CreateIndex', 'IndexInfo'))) { + $menuitems['fulltext'] = array('link'=>"#", 'label'=>getMLText('fullsearch')); + if ($accessobject->check_view_access('Indexer')) + $menuitems['fulltext']['children']['update_fulltext_index'] = array('link'=>"../out/out.Indexer.php", 'label'=>getMLText('update_fulltext_index')); + if ($accessobject->check_view_access('CreateIndex')) + $menuitems['fulltext']['children']['create_fulltext_index'] = array('link'=>"../out/out.CreateIndex.php", 'label'=>getMLText('create_fulltext_index')); + if ($accessobject->check_view_access('IndexInfo')) + $menuitems['fulltext']['children']['fulltext_info'] = array('link'=>"../out/out.IndexInfo.php", 'label'=>getMLText('fulltext_info')); + } + } + + if($accessobject->check_view_access(array('BackupTools', 'LogManagement'))) { + $menuitems['backup_log_management'] = array('link'=>"#", 'label'=>getMLText('backup_log_management')); + if ($accessobject->check_view_access('BackupTools')) + $menuitems['backup_log_management']['children'][] = array('link'=>"../out/out.BackupTools.php", 'label'=>getMLText('backup_tools')); + if ($this->params['logfileenable']) + if ($accessobject->check_view_access('LogManagement')) + $menuitems['backup_log_management']['children'][] = array('link'=>"../out/out.LogManagement.php", 'label'=>getMLText('log_management')); + } + + if($accessobject->check_view_access(array('ImportFS', 'ImportUsers', 'Statistic', 'Charts', 'Timeline', 'ObjectCheck', 'ExtensionMgr', 'Info'))) { + $menuitems['misc'] = array('link'=>"#", 'label'=>getMLText('misc')); + if ($accessobject->check_view_access('ImportFS')) + $menuitems['misc']['children']['import_fs'] = array('link'=>"../out/out.ImportFS.php", 'label'=>getMLText('import_fs')); + if ($accessobject->check_view_access('ImportUsers')) + $menuitems['misc']['children']['import_users'] = array('link'=>"../out/out.ImportUsers.php", 'label'=>getMLText('import_users')); + if ($accessobject->check_view_access('Statistic')) + $menuitems['misc']['children']['folders_and_documents_statistic'] = array('link'=>"../out/out.Statistic.php", 'label'=>getMLText('folders_and_documents_statistic')); + if ($accessobject->check_view_access('Charts')) + $menuitems['misc']['children']['charts'] = array('link'=>"../out/out.Charts.php", 'label'=>getMLText('charts')); + if ($accessobject->check_view_access('Timeline')) + $menuitems['misc']['children']['timeline'] = array('link'=>"../out/out.Timeline.php", 'label'=>getMLText('timeline')); + if ($accessobject->check_view_access('ObjectCheck')) + $menuitems['misc']['children']['objectcheck'] = array('link'=>"../out/out.ObjectCheck.php", 'label'=>getMLText('objectcheck')); + if ($accessobject->check_view_access('ExpiredDocuments')) + $menuitems['misc']['children']['documents_expired'] = array('link'=>"../out/out.ExpiredDocuments.php", 'label'=>getMLText('documents_expired')); + if ($accessobject->check_view_access('ExtensionMgr')) + $menuitems['misc']['children']['extension_manager'] = array('link'=>"../out/out.ExtensionMgr.php", 'label'=>getMLText('extension_manager')); + if ($accessobject->check_view_access('ClearCache')) + $menuitems['misc']['children']['clear_cache'] = array('link'=>"../out/out.ClearCache.php", 'label'=>getMLText('clear_cache')); + if ($accessobject->check_view_access('Info')) + $menuitems['misc']['children']['version_info'] = array('link'=>"../out/out.Info.php", 'label'=>getMLText('version_info')); + } + + /* Check if hook exists because otherwise callHook() will override $menuitems */ + if($this->hasHook('admintoolsNavigationBar')) + $menuitems = $this->callHook('admintoolsNavigationBar', $menuitems); + + self::showNavigationBar($menuitems); + + } /* }}} */ + + private function calendarOldNavigationBar($d){ /* {{{ */ + $accessobject = $this->params['accessobject']; + $ds="&day=".$d[0]."&month=".$d[1]."&year=".$d[2]; + echo "".getMLText("calendar")."\n"; + echo "
      \n"; + echo "\n"; + echo "
      \n"; + return; + + } /* }}} */ + + private function calendarNavigationBar($d){ /* {{{ */ + $accessobject = $this->params['accessobject']; + + $menuitems = array(); + if (!$this->params['user']->isGuest()) + $menuitems['addevent'] = array('link'=>"../out/out.AddEvent.php", 'label'=>getMLText('add_event')); + + /* Check if hook exists because otherwise callHook() will override $menuitems */ + if($this->hasHook('calendarNavigationBar')) + $menuitems = $this->callHook('calendarNavigationBar', $menuitems); + + self::showNavigationBar($menuitems); + + } /* }}} */ + + function pageList($pageNumber, $totalPages, $baseURI, $params) { /* {{{ */ + + $maxpages = 25; // skip pages when more than this is shown + $range = 5; // pages left and right of current page + if (!is_numeric($pageNumber) || !is_numeric($totalPages) || $totalPages<2) { + return; + } + + // Construct the basic URI based on the $_GET array. One could use a + // regular expression to strip out the pg (page number) variable to + // achieve the same effect. This seems to be less haphazard though... + $resultsURI = $baseURI; + unset($params['pg']); + $first=true; + if($params) { + $resultsURI .= '?'.http_build_query($params); + $first=false; + } + + echo ""; + + return; + } /* }}} */ + + function contentContainer($content) { /* {{{ */ + echo "
      \n"; + echo $content; + echo "
      \n"; + return; + } /* }}} */ + + function contentContainerStart($class='', $id='') { /* {{{ */ + echo "
      \n"; + return; + } /* }}} */ + + function contentContainerEnd() { /* {{{ */ + + echo "
      \n"; + return; + } /* }}} */ + + function contentHeading($heading, $noescape=false) { /* {{{ */ + + if($noescape) + echo "".$heading."\n"; + else + echo "".htmlspecialchars($heading)."\n"; + return; + } /* }}} */ + + function contentSubHeading($heading, $first=false) { /* {{{ */ + +// echo "
      ".htmlspecialchars($heading)."
      \n"; + echo "
      ".$heading."
      "; + return; + } /* }}} */ + + function rowStart() { /* {{{ */ + echo "
      \n"; + return; + } /* }}} */ + + function rowEnd() { /* {{{ */ + echo "
      \n"; + return; + } /* }}} */ + + function columnStart($width=6) { /* {{{ */ + echo "
      \n"; + return; + } /* }}} */ + + function columnEnd() { /* {{{ */ + echo "
      \n"; + return; + } /* }}} */ + + function formField($title, $value, $params=array()) { /* {{{ */ + if($title !== null) { + echo "
      "; + echo " "; + echo "
      "; + } + if(isset($params['field_wrap'][0])) + echo $params['field_wrap'][0]; + if(is_string($value)) { + echo $value; + } elseif(is_array($value)) { + switch($value['element']) { + case 'select': + echo '"; + if(isset($value['options']) && is_array($value['options'])) { + foreach($value['options'] as $val) { + if(is_string($val)) { + echo ''; + } elseif(is_array($val)) { + echo ''; + } + } + } + echo ''; + break; + case 'textarea': + echo '".(!empty($value['value']) ? $value['value'] : '').""; + break; + case 'input': + default: + switch($value['type']) { + case 'checkbox': + echo '
      '; + echo '"; + echo "
      "; + break; + default: + echo '"; + break; + } + break; + } + } + if(isset($params['field_wrap'][1])) + echo $params['field_wrap'][1]; + if($title !== null) { + echo "
      "; + echo "
      "; + } + return; + } /* }}} */ + + function formSubmit($value, $name='', $target='') { /* {{{ */ +// echo "
      \n"; + if(is_string($value)) { + echo "\n"; + } else { + if(is_array($value)) { + foreach($value as $i=>$v) + echo "\n"; + } + } +// echo "
      \n"; + } /* }}} */ + + function getMimeIcon($fileType) { /* {{{ */ + // for extension use LOWER CASE only + $icons = array(); + $icons["txt"] = "text-x-preview.svg"; + $icons["text"] = "text-x-preview.svg"; + $icons["tex"] = "text-x-preview.svg"; + $icons["doc"] = "office-document.svg"; + $icons["dot"] = "office-document.svg"; + $icons["docx"] = "office-document.svg"; + $icons["dotx"] = "office-document.svg"; + $icons["rtf"] = "office-document.svg"; + $icons["xls"] = "office-spreadsheet.svg"; + $icons["xlt"] = "office-spreadsheet.svg"; + $icons["xlsx"] = "office-spreadsheet.svg"; + $icons["xltx"] = "office-spreadsheet.svg"; + $icons["ppt"] = "office-presentation.svg"; + $icons["pot"] = "office-presentation.svg"; + $icons["pptx"] = "office-presentation.svg"; + $icons["potx"] = "office-presentation.svg"; + $icons["exe"] = "executable.svg"; + $icons["html"] = "web.svg"; + $icons["htm"] = "web.svg"; + $icons["gif"] = "image.svg"; + $icons["jpg"] = "image.svg"; + $icons["jpeg"] = "image.svg"; + $icons["bmp"] = "image.svg"; + $icons["png"] = "image.svg"; + $icons["tif"] = "image.svg"; + $icons["tiff"] = "image.svg"; + $icons["log"] = "text-x-preview.svg"; + $icons["midi"] = "audio.svg"; + $icons["pdf"] = "gnome-mime-application-pdf.svg"; + $icons["wav"] = "audio.svg"; + $icons["mp3"] = "audio.svg"; + $icons["m4a"] = "audio.svg"; + $icons["ogg"] = "audio.svg"; + $icons["opus"] = "audio.svg"; + $icons["c"] = "text-x-preview.svg"; + $icons["cpp"] = "text-x-preview.svg"; + $icons["h"] = "text-x-preview.svg"; + $icons["java"] = "text-x-preview.svg"; + $icons["py"] = "text-x-preview.svg"; + $icons["tar"] = "package.svg"; + $icons["gz"] = "package.svg"; + $icons["7z"] = "package.svg"; + $icons["bz"] = "package.svg"; + $icons["bz2"] = "package.svg"; + $icons["tgz"] = "package.svg"; + $icons["zip"] = "package.svg"; + $icons["rar"] = "package.svg"; + $icons["mpg"] = "video.svg"; + $icons["mp4"] = "video.svg"; + $icons["avi"] = "video.svg"; + $icons["webm"] = "video.svg"; + $icons["mkv"] = "video.svg"; + $icons["ods"] = "office-spreadsheet.svg"; + $icons["ots"] = "office-spreadsheet.svg"; + $icons["sxc"] = "office-spreadsheet.svg"; + $icons["stc"] = "office-spreadsheet.svg"; + $icons["odt"] = "office-document.svg"; + $icons["ott"] = "office-document.svg"; + $icons["sxw"] = "office-document.svg"; + $icons["stw"] = "office-document.svg"; + $icons["odp"] = "office-presentation.svg"; + $icons["otp"] = "office-presentation.svg"; + $icons["sxi"] = "office-presentation.svg"; + $icons["sti"] = "office-presentation.svg"; + $icons["odg"] = "office-drawing.svg"; + $icons["otg"] = "office-drawing.svg"; + $icons["sxd"] = "office-drawing.svg"; + $icons["std"] = "office-drawing.svg"; + $icons["odf"] = "ooo_formula.png"; + $icons["sxm"] = "ooo_formula.png"; + $icons["smf"] = "ooo_formula.png"; + $icons["mml"] = "ooo_formula.png"; + $icons["folder"] = "folder.svg"; + + $icons["default"] = "text-x-preview.svg"; //"default.png"; + + $ext = strtolower(substr($fileType, 1)); + if (isset($icons[$ext])) { + return $this->imgpath.$icons[$ext]; + } + else { + return $this->imgpath.$icons["default"]; + } + } /* }}} */ + + /** + * Get html for button opening a modal box + * + * @param array $config contains elements + * target: id of modal box + * remote: URL of data to be loaded into box + * title: text on button + * @return string + */ + function getModalBoxLink($config) { /* {{{ */ + $content = ''; + $content .= "$attrval) + $content .= ' '.$attrname.'="'.$attrval.'"'; + } + $content .= ">".$config['title']."…\n"; + return $content; + } /* }}} */ + + /** + * Get html for a modal box with buttons + * + * @param array $config contains elements + * id: id of modal box (must match target of getModalBoxLink()) + * title: title of modal box + * buttons: array of buttons, each having a title and an optional id + * @return string + */ + function getModalBox($config) { /* {{{ */ + $content = ''; + $content .= ' + +'; + return $content; + } /* }}} */ + + function printFileChooserJs() { /* {{{ */ +?> +$(document).ready(function() { + $(document).on('change', '.btn-file :file', function() { + var input = $(this), + numFiles = input.get(0).files ? input.get(0).files.length : 1, + label = input.val().replace(/\\/g, '/').replace(/.*\//, ''); + input.trigger('fileselect', [numFiles, label]); + }); + + $(document).on('fileselect', '.upload-file .btn-file :file', function(event, numFiles, label) { + var input = $(this).parents('.input-group').find(':text'), + log = numFiles > 1 ? numFiles + ' files selected' : label; + + if( input.length ) { + input.val(log); + } else { +// if( log ) alert(log); + } + }); +}); + +
      +
      + +
      + +
      +
      +
      +
      +'; + return $html; + } /* }}} */ + + function printFileChooser($varname='userfile', $multiple=false, $accept='') { /* {{{ */ + echo self::getFileChooserHtml($varname, $multiple, $accept); + } /* }}} */ + + function printDateChooser($defDate = '', $varName, $lang='', $dateformat='', $startdate='', $enddate='') { /* {{{ */ + echo self::getDateChooser($defDate, $varName, $lang, $dateformat, $startdate, $enddate); + } /* }}} */ + + function getDateChooser($defDate = '', $varName, $lang='', $dateformat='', $startdate='', $enddate='') { /* {{{ */ + if(!$dateformat) + $dateformat = getConvertDateFormat(); + $content = ' +
      + +
      + +
      +
      +'; + return $content; + } /* }}} */ + + function __printDateChooser($defDate = -1, $varName) { /* {{{ */ + + if ($defDate == -1) + $defDate = mktime(); + $day = date("d", $defDate); + $month = date("m", $defDate); + $year = date("Y", $defDate); + + print " \n"; + print " \n"; + print ""; + } /* }}} */ + + function printSequenceChooser($objArr, $keepID = -1) { /* {{{ */ + echo $this->getSequenceChooser($objArr, $keepID); + } /* }}} */ + + function getSequenceChooser($objArr, $keepID = -1) { /* {{{ */ + if (count($objArr) > 0) { + $max = $objArr[count($objArr)-1]->getSequence() + 1; + $min = $objArr[0]->getSequence() - 1; + } + else { + $max = 1.0; + } + $content = ""; + return $content; + } /* }}} */ + + function getDocumentChooserHtml($form, $default=false, $formname='', $skiptree=false) { /* {{{ */ + if(!$formname) + $formname = "docid"; + $formid = md5($formname.$form); + + $content = ''; + $content .= "getID() : "") ."\">"; + $content .= "
      \n"; + $content .= "getName()) : "") ."\" placeholder=\"".getMLText('type_to_search')."\" autocomplete=\"off\" />"; + $content .= '
      '; + $content .= ""; + if(!$skiptree) + $content .= $this->getModalBoxLink( + array( + 'target' => 'docChooser'.$formid, + 'remote' => "../out/out.DocumentChooser.php?form=".$formid."&folderid=".$this->params['dms']->getRootFolder()->getId(), + 'title' => getMLText('document') + )); + $content .= "
      \n"; + $content .= "
      \n"; + if(!$skiptree) + $content .= $this->getModalBox( + array( + 'id' => 'docChooser'.$formid, + 'title' => getMLText('choose_target_document'), + 'buttons' => array( + array('title'=>getMLText('close')) + ) + )); + return $content; + } /* }}} */ + + function printDocumentChooserHtml($formName) { /* {{{ */ + echo self::getDocumentChooserHtml($formName); + } /* }}} */ + + /** + * This function is deprecated. Don't use it anymore. There is a generic + * folderSelected and documentSelected function in application.js + * If you extra functions to be called then define them in your own js code + */ + function printDocumentChooserJs($form, $formname='') { /* {{{ */ + if(!$formname) + $formname = "docid"; + $formid = md5($formname.$form); +?> +function documentSelected(id, name) { + $('#').val(id); + $('#choosedocsearch').val(name); + $('#docChooser').modal('hide'); +} +function folderSelected(id, name) { +} +printDocumentChooserHtml($form); +?> + +getID() : "") ."\">"; + $content .= "
      \n"; + $content .= "getName()) : "") ."\" placeholder=\"".getMLText('type_to_search')."\" autocomplete=\"off\" target=\"".$formid."\"/>"; + $content .= '
      '; + $content .= ""; + if(!$skiptree) { + $content .= $this->getModalBoxLink( + array( + 'target' => 'folderChooser'.$formid, + 'remote' => "../out/out.FolderChooser.php?form=".$formid."&mode=".$accessMode."&exclude=".$exclude, + 'title' => getMLText('folder') + )); + } + $content .= "
      \n"; + $content .= "
      \n"; + if(!$skiptree) { + $content .= $this->getModalBox( + array( + 'id' => 'folderChooser'.$formid, + 'title' => getMLText('choose_target_folder'), + 'buttons' => array( + array('title'=>getMLText('close')) + ) + )); + } + return $content; + } /* }}} */ + + function printFolderChooserHtml($form, $accessMode, $exclude = -1, $default = false, $formname = '') { /* {{{ */ + echo self::getFolderChooserHtml($form, $accessMode, $exclude, $default, $formname); + } /* }}} */ + + /** + * This function is deprecated. Don't use it anymore. There is a generic + * folderSelected and documentSelected function in application.js + * If you extra functions to be called then define them in your own js code + */ + function printFolderChooserJs($form, $formname='') { /* {{{ */ + if(!$formname) + $formname = "targetid"; + $formid = md5($formname.$form); +?> +function folderSelected(id, name) { + $('#').val(id); + $('#choosefoldersearch').val(name); + $('#folderChooser').modal('hide'); +} +/* +$(document).ready(function() { + $('#clearfolder').click(function(ev) { + $('#choosefoldersearch').val(''); + $('#').val(''); + }); +}); +*/ +printFolderChooserHtml($form, $accessMode, $exclude, $default, $formname); +?> + +params['strictformcheck']; + $content = ''; + $content .= ' +
      + +
      '; + $content .= $this->getModalBoxLink( + array( + 'target' => 'keywordChooser', + 'remote' => "../out/out.KeywordChooser.php?target=".$formName, + 'title' => getMLText('keywords') + )); + $content .= ' +
      +
      +'; + $content .= $this->getModalBox( + array( + 'id' => 'keywordChooser', + 'title' => getMLText('use_default_keywords'), + 'buttons' => array( + array('id'=>'acceptkeywords', 'title'=>getMLText('save')), + array('title'=>getMLText('close')), + ) + )); + return $content; + } /* }}} */ + + function printKeywordChooserJs($formName) { /* {{{ */ +?> +$(document).ready(function() { + $('#acceptkeywords').click(function(ev) { + acceptKeywords(); + }); +}); +printKeywordChooserHtml($formName, $keywords, $fieldname); +?> + +params['dms']; + $attrdef = $attribute->getAttributeDefinition(); + switch($attrdef->getType()) { + case SeedDMS_Core_AttributeDefinition::type_url: + $attrs = $attribute->getValueAsArray(); + $tmp = array(); + foreach($attrs as $attr) { + $tmp[] = ''.htmlspecialchars($attr).''; + } + return implode('
      ', $tmp); + break; + case SeedDMS_Core_AttributeDefinition::type_email: + $attrs = $attribute->getValueAsArray(); + $tmp = array(); + foreach($attrs as $attr) { + $tmp[] = ''.htmlspecialchars($attr).''; + } + return implode('
      ', $tmp); + break; + case SeedDMS_Core_AttributeDefinition::type_folder: + $attrs = $attribute->getValueAsArray(); + $tmp = array(); + foreach($attrs as $attr) { + if($targetfolder = $dms->getFolder(intval($attr))) + $tmp[] = ''.htmlspecialchars($targetfolder->getName()).''; + } + return implode('
      ', $tmp); + break; + case SeedDMS_Core_AttributeDefinition::type_document: + $attrs = $attribute->getValueAsArray(); + $tmp = array(); + foreach($attrs as $attr) { + if($targetdoc = $dms->getDocument(intval($attr))) + $tmp[] = ''.htmlspecialchars($targetdoc->getName()).''; + } + return implode('
      ', $tmp); + break; + case SeedDMS_Core_AttributeDefinition::type_user: + $attrs = $attribute->getValueAsArray(); + $tmp = array(); + foreach($attrs as $attr) { + $curuser = $dms->getUser((int) $attr); + $tmp[] = htmlspecialchars($curuser->getFullname()." (".$curuser->getLogin().")"); + } + return implode('
      ', $tmp); + break; + case SeedDMS_Core_AttributeDefinition::type_group: + $attrs = $attribute->getValueAsArray(); + $tmp = array(); + foreach($attrs as $attr) { + $curgroup = $dms->getGroup((int) $attr); + $tmp[] = htmlspecialchars($curgroup->getName()); + } + return implode('
      ', $tmp); + break; + case SeedDMS_Core_AttributeDefinition::type_date: + $attrs = $attribute->getValueAsArray(); + $tmp = array(); + foreach($attrs as $attr) { + $tmp[] = getReadableDate($attr); + } + return implode(', ', $tmp); + break; + default: + return htmlspecialchars(implode(', ', $attribute->getValueAsArray())); + } + } /* }}} */ + + function printAttributeEditField($attrdef, $attribute, $fieldname='attributes', $norequire=false, $namepostfix='') { /* {{{ */ + echo self::getAttributeEditField($attrdef, $attribute, $fieldname, $norequire, $namepostfix); + } /* }}} */ + + function getAttributeEditField($attrdef, $attribute, $fieldname='attributes', $norequire=false, $namepostfix='') { /* {{{ */ + $dms = $this->params['dms']; + $content = ''; + switch($attrdef->getType()) { + case SeedDMS_Core_AttributeDefinition::type_boolean: + $objvalue = $attribute ? (is_object($attribute) ? $attribute->getValue() : $attribute) : ''; + $content .= "getId()."]\" value=\"\" />"; + $content .= "getId()."\" name=\"".$fieldname."[".$attrdef->getId()."]\" value=\"1\" ".($objvalue ? 'checked' : '')." />"; + break; + case SeedDMS_Core_AttributeDefinition::type_date: + $objvalue = $attribute ? (is_object($attribute) ? $attribute->getValue() : $attribute) : ''; + $dateformat = getConvertDateFormat($this->params['settings']->_dateformat); + /* + $content .= ' + + + '; + */ + $content = ' +
      + +
      + +
      +
      +'; + break; + case SeedDMS_Core_AttributeDefinition::type_email: + $objvalue = $attribute ? (is_object($attribute) ? $attribute->getValue() : $attribute) : ''; + $content .= "getId()."]\" value=\"".htmlspecialchars($objvalue)."\"".((!$norequire && $attrdef->getMinValues() > 0) ? ' required' : '').' data-rule-email="true"'." />"; + break; + case SeedDMS_Core_AttributeDefinition::type_float: + $objvalue = $attribute ? (is_object($attribute) ? $attribute->getValue() : $attribute) : ''; + $content .= "getId()."\" name=\"".$fieldname."[".$attrdef->getId()."]\" value=\"".htmlspecialchars($objvalue)."\"".((!$norequire && $attrdef->getMinValues() > 0) ? ' required' : '')." data-rule-number=\"true\"/>"; + break; + case SeedDMS_Core_AttributeDefinition::type_folder: + $objvalue = $attribute ? (is_object($attribute) ? (int) $attribute->getValue() : (int) $attribute) : 0; + if($objvalue) + $target = $dms->getFolder($objvalue); + else + $target = null; + $content .= $this->getFolderChooserHtml("attr".$attrdef->getId(), M_READWRITE, -1, $target, $fieldname."[".$attrdef->getId()."]", false); + break; + case SeedDMS_Core_AttributeDefinition::type_document: + $objvalue = $attribute ? (is_object($attribute) ? (int) $attribute->getValue() : (int) $attribute) : 0; + if($objvalue) + $target = $dms->getDocument($objvalue); + else + $target = null; + $content .= $this->getDocumentChooserHtml("attr".$attrdef->getId(), $target, $fieldname."[".$attrdef->getId()."]"); + break; + case SeedDMS_Core_AttributeDefinition::type_user: + $objvalue = $attribute ? (is_object($attribute) ? $attribute->getValueAsArray() : $attribute) : array(); + $users = $dms->getAllUsers(); + if($users) { + $allowempty = $attrdef->getMinValues() == 0; + $allowmultiple = $attrdef->getMultipleValues(); + $content .= ""; + } else { + $content .= getMLText('no_users'); + } + break; + case SeedDMS_Core_AttributeDefinition::type_group: + $objvalue = $attribute ? (is_object($attribute) ? $attribute->getValueAsArray() : $attribute) : array(); + $groups = $dms->getAllGroups(); + if($groups) { + $allowempty = $attrdef->getMinValues() == 0; + $allowmultiple = $attrdef->getMultipleValues(); + $content .= ""; + } else { + $content .= getMLText('no_groups'); + } + break; + default: + if($valueset = $attrdef->getValueSetAsArray()) { + $content .= "getId()."]\" value=\"\"/>"; + $content .= ""; + } else { + $objvalue = $attribute ? (is_object($attribute) ? $attribute->getValue() : $attribute) : ''; + if(strlen($objvalue) > 80) { + $content .= ""; + } else { + $content .= "getId()."\" name=\"".$fieldname."[".$attrdef->getId()."]\" value=\"".htmlspecialchars($objvalue)."\"".((!$norequire && $attrdef->getMinValues() > 0) ? ' required' : '').($attrdef->getType() == SeedDMS_Core_AttributeDefinition::type_int ? ' data-rule-digits="true"' : '')." />"; + } + } + break; + } + return $content; + } /* }}} */ + + function printDropFolderChooserHtml($formName, $dropfolderfile="", $showfolders=0) { /* {{{ */ + echo self::getDropFolderChooserHtml($formName, $dropfolderfile, $showfolders); + } /* }}} */ + + function getDropFolderChooserHtml($formName, $dropfolderfile="", $showfolders=0) { /* {{{ */ + $content = "
      \n"; + $content .= ""; + $content .= '
      '; + $content .= ""; + $content .= $this->getModalBoxLink( + array( + 'target' => 'dropfolderChooser', + 'remote' => "../out/out.DropFolderChooser.php?form=".$formName."&dropfolderfile=".urlencode($dropfolderfile)."&showfolders=".$showfolders, + 'title' => ($showfolders ? getMLText("choose_target_folder"): getMLText("choose_target_file")) + )); + $content .= "
      \n"; + $content .= "
      \n"; + $content .= $this->getModalBox( + array( + 'id' => 'dropfolderChooser', + 'title' => ($showfolders ? getMLText("choose_target_folder"): getMLText("choose_target_file")), + 'buttons' => array( + array('title'=>getMLText('close')), + ) + )); + return $content; + } /* }}} */ + + function printDropFolderChooserJs($formName, $showfolders=0) { /* {{{ */ +?> +/* Set up a callback which is called when a folder in the tree is selected */ +modalDropfolderChooser = $('#dropfolderChooser'); +function fileSelected(name, form) { +// $('#dropfolderfile').val(name); + $('#dropfolderfile'+form).val(name); + modalDropfolderChooser.modal('hide'); +} + +function folderSelected(name, form) { +// $('#dropfolderfile').val(name); + $('#dropfolderfile'+form).val(name); + modalDropfolderChooser.modal('hide'); +} + +$(document).ready(function() { + $('#clearfilename').click(function(ev) { + $('#dropfolderfile').val(''); + }); +}); +printDropFolderChooserHtml($formName, $dropfolderfile, $showfolders); +?> + +imgpath.$img) ) { + return $this->imgpath.$img; +// } + return ""; + } /* }}} */ + + function getCountryFlag($lang) { /* {{{ */ + switch($lang) { + case "en_GB": + return 'flags/gb.png'; + break; + default: + return 'flags/'.substr($lang, 0, 2).'.png'; + } + } /* }}} */ + + function printImgPath($img) { /* {{{ */ + print $this->getImgPath($img); + } /* }}} */ + + function infoMsg($msg) { /* {{{ */ + echo "
      \n"; + echo $msg; + echo "
      \n"; + } /* }}} */ + + function warningMsg($msg) { /* {{{ */ + echo "
      \n"; + echo $msg; + echo "
      \n"; + } /* }}} */ + + function errorMsg($msg) { /* {{{ */ + echo "
      \n"; + echo $msg; + echo "
      \n"; + } /* }}} */ + + function successMsg($msg) { /* {{{ */ + echo "
      \n"; + echo $msg; + echo "
      \n"; + } /* }}} */ + + function ___exitError($pagetitle, $error, $noexit=false, $plain=false) { /* {{{ */ + + /* This is just a hack to prevent creation of js files in an error + * case, because they will contain this error page again. It would be much + * better, if there was extra error() function similar to show() and calling + * $view() after setting the action to 'error'. This would also allow to + * set separate error pages for each view. + */ + if(!$noexit && isset($_REQUEST['action'])) { + if(in_array($_REQUEST['action'], array('js', 'footerjs'))) { + exit; + } + + if($_REQUEST['action'] == 'webrootjs') { + $this->webrootjs(); + exit; + } + } + + if(!$plain) { + $this->htmlStartPage($pagetitle); + $this->globalNavigation(); + $this->contentStart(); + } + + print "
      "; + print "

      ".getMLText('error')."!

      "; + print htmlspecialchars($error); + print "
      "; + if(!$plain) { + print "
      "; + + $this->contentEnd(); + $this->htmlEndPage(); + } + + add_log_line(" UI::exitError error=".$error." pagetitle=".$pagetitle, PEAR_LOG_ERR); + + if($noexit) + return; + + exit; + } /* }}} */ + + function printNewTreeNavigation($folderid=0, $accessmode=M_READ, $showdocs=0, $formid='form1', $expandtree=0, $orderby='') { /* {{{ */ + $this->printNewTreeNavigationHtml($folderid, $accessmode, $showdocs, $formid, $expandtree, $orderby); +?> + +
      \n"; + echo "
      \n"; + } /* }}} */ + + /** + * Create a tree of folders using jqtree. + * + * The tree can contain folders only or include documents. + * + * @param integer $folderid current folderid. If set the tree will be + * folded out and the all folders in the path will be visible + * @param integer $accessmode use this access mode when retrieving folders + * and documents shown in the tree + * @param boolean $showdocs set to true if tree shall contain documents + * as well. + * @param integer $expandtree level to which the tree shall be opened + * @param boolean $partialtree set to true if the given folder is the start folder + */ + function printNewTreeNavigationJs($folderid=0, $accessmode=M_READ, $showdocs=0, $formid='form1', $expandtree=0, $orderby='', $partialtree=false) { /* {{{ */ + function jqtree($path, $folder, $user, $accessmode, $showdocs=1, $expandtree=0, $orderby='', $level=0) { /* {{{ */ + $orderdir = (isset($orderby[1]) ? ($orderby[1] == 'd' ? 'desc' : 'asc') : 'asc'); + if($path/* || $expandtree>=$level*/) { + if($path) + $pathfolder = array_shift($path); + $children = array(); + if($expandtree) { + $subfolders = $folder->getSubFolders(isset($orderby[0]) ? $orderby[0] : '', $orderdir); + $subfolders = SeedDMS_Core_DMS::filterAccess($subfolders, $user, $accessmode); + } else { + $subfolders = array($pathfolder); + } + foreach($subfolders as $subfolder) { + $node = array('label'=>$subfolder->getName(), 'id'=>$subfolder->getID(), 'load_on_demand'=>(1 && ($subfolder->hasSubFolders() || ($subfolder->hasDocuments() && $showdocs))) ? true : false, 'is_folder'=>true); + /* if the subfolder is in the path then further unfold the tree. */ + if(/*$expandtree>=$level ||*/ $path && ($path[0]->getID() == $subfolder->getID())) { + $node['children'] = jqtree($path, $subfolder, $user, $accessmode, $showdocs, $expandtree, $orderby, $level+1); + if($showdocs) { + $documents = $subfolder->getDocuments(isset($orderby[0]) ? $orderby[0] : '', $orderdir); + $documents = SeedDMS_Core_DMS::filterAccess($documents, $user, $accessmode); + foreach($documents as $document) { + $node2 = array('label'=>$document->getName(), 'id'=>$document->getID(), 'load_on_demand'=>false, 'is_folder'=>false); + $node['children'][] = $node2; + } + } + } + $children[] = $node; + } + return $children; + } else { + $subfolders = $folder->getSubFolders(isset($orderby[0]) ? $orderby[0] : '', $orderdir); + $subfolders = SeedDMS_Core_DMS::filterAccess($subfolders, $user, $accessmode); + $children = array(); + foreach($subfolders as $subfolder) { + $node = array('label'=>$subfolder->getName(), 'id'=>$subfolder->getID(), 'load_on_demand'=>($subfolder->hasSubFolders() || ($subfolder->hasDocuments() && $showdocs)) ? true : false, 'is_folder'=>true); + $children[] = $node; + } + return $children; + } + return array(); + } /* }}} */ + + $orderdir = (isset($orderby[1]) ? ($orderby[1] == 'd' ? 'desc' : 'asc') : 'asc'); + if($folderid && ($folder = $this->params['dms']->getFolder($folderid))) { + if(!$partialtree) { + $path = $folder->getPath(); + /* Get the first folder (root folder) of path */ + $folder = array_shift($path); + } + $node = array('label'=>$folder->getName(), 'id'=>$folder->getID(), 'load_on_demand'=>false, 'is_folder'=>true); + if(!$folder->hasSubFolders()) { + $node['load_on_demand'] = true; + $node['children'] = array(); + } else { + $node['children'] = jqtree($path, $folder, $this->params['user'], $accessmode, $showdocs, 1 /*$expandtree*/, $orderby, 0); + if($showdocs) { + $documents = $folder->getDocuments(isset($orderby[0]) ? $orderby[0] : '', $orderdir); + $documents = SeedDMS_Core_DMS::filterAccess($documents, $this->params['user'], $accessmode); + foreach($documents as $document) { + $node2 = array('label'=>$document->getName(), 'id'=>$document->getID(), 'load_on_demand'=>false, 'is_folder'=>false); + $node['children'][] = $node2; + } + } + } + /* Nasty hack to remove the highest folder */ + if(isset($this->params['remove_root_from_tree']) && $this->params['remove_root_from_tree']) { + foreach($node['children'] as $n) + $tree[] = $n; + } else { + $tree[] = $node; + } + + } else { + if($root = $this->params['dms']->getFolder($this->params['rootfolderid'])) + $tree = array(array('label'=>$root->getName(), 'id'=>$root->getID(), 'load_on_demand'=>false, 'is_folder'=>true)); + else + $tree = array(); + } +?> +var data = ; +$(function() { + const $tree = $('#jqtree'); + $tree.tree({ +// saveState: false, + selectable: false, + data: data, + saveState: 'jqtree', + openedIcon: $(''), + closedIcon: $(''), +/* + _onCanSelectNode: function(node) { + if(node.is_folder) { + folderSelected(node.id, node.name); + treeFolderSelected('', node.id, node.name); + } else { + documentSelected(node.id, node.name); + treeDocumentSelected('', node.id, node.name); + } + }, +*/ + autoOpen: false, + drapAndDrop: true, + onCreateLi: function(node, $li) { + // Add 'icon' span before title + if(node.is_folder) + $li.find('.jqtree-title').before(' ').attr('data-name', node.name).attr('rel', 'folder_' + node.id).attr('formtoken', '').attr('data-uploadformtoken', '').attr('data-droptarget', 'folder_' + node.id).addClass('droptarget'); + else + $li.find('.jqtree-title').before(' '); + } + }); + // Unfold node for currently selected folder + $('#jqtree').tree('selectNode', $('#jqtree').tree('getNodeById', ), false, true); + $('#jqtree').on( + 'tree.click', + function(event) { + var node = event.node; + if(!node) + return; + if(node.is_folder) { + $('#jqtree').tree('openNode', node); + +// event.preventDefault(); + if(typeof node.fetched == 'undefined') { + node.fetched = true; + $(this).tree('loadDataFromUrl', node, function () { + $(this).tree('openNode', node); + }); + } + + /* folderSelectedXXXX() can still be set, e.g. for the main tree + * to update the folder list. + */ + if (typeof folderSelected === 'function') { + folderSelected(node.id, node.name); + } + treeFolderSelected('', node.id, node.name); + } else { + + if (typeof documentSelected === 'function') { + documentSelected(node.id, node.name); + } + treeDocumentSelected('', node.id, node.name); + + } + } + ); + $('#jqtree').on( + 'tree.contextmenu', + function(event) { + // The clicked node is 'event.node' + var node = event.node; + if(typeof node.fetched == 'undefined') { + node.fetched = true; + $(this).tree('loadDataFromUrl', node); + } + $(this).tree('openNode', node); + } + ); + $("#jqtree").on('dragenter', function (e) { + attr_rel = $(e.srcElement).attr('rel'); + if(typeof attr_rel == 'undefined') + return; + target_type = attr_rel.split("_")[0]; + target_id = attr_rel.split("_")[1]; + var node = $(this).tree('getNodeById', parseInt(target_id)); + if(typeof node.fetched == 'undefined') { + node.fetched = true; + $(this).tree('loadDataFromUrl', node, function() {$(this).tree('openNode', node);}); + } + }); +}); +params['dms']; + $user = $this->params['user']; + + $folder = $dms->getFolder($folderid); + if (!is_object($folder)) return ''; + + $subfolders = $folder->getSubFolders($orderby); + $subfolders = SeedDMS_Core_DMS::filterAccess($subfolders, $user, M_READ); + $tree = array(); + foreach($subfolders as $subfolder) { + $loadondemand = $subfolder->hasSubFolders() || ($subfolder->hasDocuments() && $showdocs); + $level = array('label'=>$subfolder->getName(), 'id'=>$subfolder->getID(), 'load_on_demand'=>$loadondemand, 'is_folder'=>true); + if(!$subfolder->hasSubFolders()) + $level['children'] = array(); + $tree[] = $level; + } + if($showdocs) { + $documents = $folder->getDocuments($orderby); + $documents = SeedDMS_Core_DMS::filterAccess($documents, $user, M_READ); + foreach($documents as $document) { + $level = array('label'=>$document->getName(), 'id'=>$document->getID(), 'load_on_demand'=>false, 'is_folder'=>false); + $tree[] = $level; + } + } + + header('Content-Type: application/json'); + echo json_encode($tree); + } /* }}} */ + + /** + * Deprecated! + */ + function __printTreeNavigation($folderid, $showtree){ /* {{{ */ + if ($showtree==1){ + $this->contentHeading("", true); + $this->contentContainerStart(); +?> + +printNewTreeNavigation($folderid, M_READ, 0, ''); + $this->contentContainerEnd(); + } else { + $this->contentHeading("", true); + } + } /* }}} */ + + /** + * Print clipboard in div container + * + * @param array clipboard + */ + function printClipboard($clipboard, $previewer){ /* {{{ */ + echo "
      \n"; + $this->contentHeading(getMLText("clipboard").'', true); + echo "
      \n"; +?> +
      +\n"; + echo "
      \n"; + } /* }}} */ + + /** + * Wrap text in inline editing tags + * + * @param string text + */ + function printInlineEdit($text, $object){ /* {{{ */ + if(!empty($this->params['settings']->_inlineEditing)) { + echo "isType('document')) + echo " data-document=\"".$object->getId()."\""; + echo ">".$text; + echo "\n"; + } else + echo $text; + } /* }}} */ + + /** + * Print button with link for deleting a document + * + * This button is used in document listings (e.g. on the ViewFolder page) + * for deleting a document. In seeddms version < 4.3.9 this was just a + * link to the out/out.RemoveDocument.php page which asks for confirmation + * an than calls op/op.RemoveDocument.php. Starting with version 4.3.9 + * the button just opens a small popup asking for confirmation and than + * calls the ajax command 'deletedocument'. The ajax call is called + * in the click function of 'button.removedocument'. That button needs + * to have two attributes: 'rel' for the id of the document, and 'msg' + * for the message shown by notify if the document could be deleted. + * + * @param object $document document to be deleted + * @param string $msg message shown in case of successful deletion + * @param boolean $return return html instead of printing it + * @return string html content if $return is true, otherwise an empty string + */ + function printDeleteDocumentButton($document, $msg, $return=false){ /* {{{ */ + $docid = $document->getID(); + $content = ''; + $content .= ' $document->getName())), ENT_QUOTES).'">'; + if($return) + return $content; + else + echo $content; + return ''; + } /* }}} */ + + function printDeleteDocumentButtonJs(){ /* {{{ */ + echo " + $(document).ready(function () { +// $('.delete-document-btn').click(function(ev) { + $('body').on('click', 'a.delete-document-btn', function(ev){ + ev.stopPropagation(); + id = $(ev.currentTarget).attr('rel'); + confirmmsg = $(ev.currentTarget).attr('confirmmsg'); + msg = $(ev.currentTarget).attr('msg'); + formtoken = '".createFormKey('removedocument')."'; + bootbox.confirm({ + \"message\": confirmmsg, + \"buttons\": { + \"confirm\": { + \"label\" : \" ".getMLText("rm_document")."\", + \"className\" : \"btn-danger\", + }, + \"cancel\": { + \"label\" : \"".getMLText("cancel")."\", + \"className\" : \"btn-secondary\", + } + }, + \"callback\": function(result) { + if(result) { + $.get('../op/op.Ajax.php', + { command: 'deletedocument', id: id, formtoken: formtoken }, + function(data) { + if(data.success) { + $('#table-row-document-'+id).hide('slow'); + noty({ + text: msg, + type: 'success', + dismissQueue: true, + layout: 'topRight', + theme: 'defaultTheme', + timeout: 1500, + }); + } else { + noty({ + text: data.message, + type: 'error', + dismissQueue: true, + layout: 'topRight', + theme: 'defaultTheme', + timeout: 3500, + }); + } + }, + 'json' + ); + } + } + }); + }); + }); + "; + } /* }}} */ + + /** + * Print button with link for deleting a folder + * + * This button works like document delete button + * {@link SeedDMS_Bootstrap_Style::printDeleteDocumentButton()} + * + * @param object $folder folder to be deleted + * @param string $msg message shown in case of successful deletion + * @param boolean $return return html instead of printing it + * @return string html content if $return is true, otherwise an empty string + */ + function printDeleteFolderButton($folder, $msg, $return=false){ /* {{{ */ + $folderid = $folder->getID(); + $content = ''; + $content .= ' $folder->getName())), ENT_QUOTES).'">'; + if($return) + return $content; + else + echo $content; + return ''; + } /* }}} */ + + function printDeleteFolderButtonJs(){ /* {{{ */ + echo " + $(document).ready(function () { +// $('.delete-folder-btn').click(function(ev) { + $('body').on('click', 'a.delete-folder-btn', function(ev){ + ev.stopPropagation(); + id = $(ev.currentTarget).attr('rel'); + confirmmsg = $(ev.currentTarget).attr('confirmmsg'); + msg = $(ev.currentTarget).attr('msg'); + formtoken = '".createFormKey('removefolder')."'; + bootbox.confirm({ + \"message\": confirmmsg, + \"buttons\": { + \"confirm\": { + \"label\" : \" ".getMLText("rm_folder")."\", + \"className\" : \"btn-danger\", + }, + \"cancel\": { + \"label\" : \"".getMLText("cancel")."\", + \"className\" : \"btn-secondary\", + } + }, + \"callback\": function(result) { + if(result) { + $.get('../op/op.Ajax.php', + { command: 'deletefolder', id: id, formtoken: formtoken }, + function(data) { + if(data.success) { + $('#table-row-folder-'+id).hide('slow'); + noty({ + text: msg, + type: 'success', + dismissQueue: true, + layout: 'topRight', + theme: 'defaultTheme', + timeout: 1500, + }); + } else { + noty({ + text: data.message, + type: 'error', + dismissQueue: true, + layout: 'topRight', + theme: 'defaultTheme', + timeout: 3500, + }); + } + }, + 'json' + ); + } + } + }); + }); + }); + "; + } /* }}} */ + + function printLockButton($document, $msglock, $msgunlock, $return=false) { /* {{{ */ + $accessobject = $this->params['accessobject']; + $docid = $document->getID(); + if($document->isLocked()) { + if(!$accessobject->check_controller_access('UnlockDocument')) + return ''; + $icon = 'unlock'; + $msg = $msgunlock; + $title = 'unlock_document'; + } else { + if(!$accessobject->check_controller_access('LockDocument')) + return ''; + $icon = 'lock'; + $msg = $msglock; + $title = 'lock_document'; + } + $content = ''; + $content .= ''; + if($return) + return $content; + else + echo $content; + return ''; + } /* }}} */ + + function printAccessButton($object, $return=false) { /* {{{ */ + $content = ''; + $objid = $object->getId(); + if($object->isType('document')) { + $content .= ''; + } elseif($object->isType('folder')) { + $content .= ''; + } + if($return) + return $content; + else + echo $content; + return ''; + } /* }}} */ + + /** + * Output left-arrow with link which takes over a number of ids into + * a select box. + * + * Clicking in the button will preset the comma seperated list of ids + * in data-ref as options in the select box with name $name + * + * @param string $name id of select box + * @param array $ids list of option values + */ + function getSelectPresetButtonHtml($name, $ids) { /* {{{ */ + return ''; + } /* }}} */ + + /** + * Output left-arrow with link which takes over a number of ids into + * a select box. + * + * Clicking in the button will preset the comma seperated list of ids + * in data-ref as options in the select box with name $name + * + * @param string $name id of select box + * @param array $ids list of option values + */ + function printSelectPresetButtonHtml($name, $ids) { /* {{{ */ + echo self::getSelectPresetButtonHtml($name, $ids); + } /* }}} */ + + /** + * Javascript code for select preset button + */ + function printSelectPresetButtonJs() { /* {{{ */ +?> +$(document).ready( function() { + $('.selectpreset_btn').click(function(ev){ + ev.preventDefault(); + if (typeof $(ev.currentTarget).data('ids') != 'undefined') { + target = $(ev.currentTarget).data('ref'); + // Use attr() instead of data() because data() converts to int which cannot be split + items = $(ev.currentTarget).attr('data-ids'); + arr = items.split(","); + for(var i in arr) { + $("#"+target+" option[value='"+arr[i]+"']").attr("selected", "selected"); + } +// $("#"+target).trigger("chosen:updated"); + $("#"+target).trigger("change"); + } + }); +}); +'; + } /* }}} */ + + /** + * Output left-arrow with link which takes over a string into + * a input field. + * + * Clicking on the button will preset the string + * in data-ref the value of the input field with name $name + * + * @param string $name id of select box + * @param string $text text + */ + function printInputPresetButtonHtml($name, $text, $sep='') { /* {{{ */ + echo self::getInputPresetButtonHtml($name, $text, $sep); + } /* }}} */ + + /** + * Javascript code for input preset button + * This code workѕ for input fields and single select fields + */ + function printInputPresetButtonJs() { /* {{{ */ +?> +$(document).ready( function() { + $('.inputpreset_btn').click(function(ev){ + ev.preventDefault(); + if (typeof $(ev.currentTarget).data('text') != 'undefined') { + target = $(ev.currentTarget).data('ref'); + value = $(ev.currentTarget).data('text'); + sep = $(ev.currentTarget).data('sep'); + if(sep) { + // Use attr() instead of data() because data() converts to int which cannot be split + arr = value.split(sep); + for(var i in arr) { + $("#"+target+" option[value='"+arr[i]+"']").attr("selected", "selected"); + } + } else { + $("#"+target).val(value); + } + } + }); +}); + + return ''; + +$(document).ready( function() { + $('.checkboxpreset_btn').click(function(ev){ + ev.preventDefault(); + if (typeof $(ev.currentTarget).data('text') != 'undefined') { + target = $(ev.currentTarget).data('ref'); + value = $(ev.currentTarget).data('text'); + if(value) { + $("#"+target).attr('checked', ''); + } else { + $("#"+target).removeAttribute('checked'); + } + } + }); +}); +getID().'" msg="'.getMLText($msg).'" attrvalue="'.htmlspecialchars($value, ENT_QUOTES).'" confirmmsg="'.htmlspecialchars(getMLText("confirm_rm_attr_value", array ("attrdefname" => $attrdef->getName())), ENT_QUOTES).'">'; + if($return) + return $content; + else + echo $content; + return ''; + } /* }}} */ + + function printDeleteAttributeValueButtonJs(){ /* {{{ */ + echo " + $(document).ready(function () { +// $('.delete-attribute-value-btn').click(function(ev) { + $('body').on('click', 'a.delete-attribute-value-btn', function(ev){ + id = $(ev.currentTarget).attr('rel'); + confirmmsg = $(ev.currentTarget).attr('confirmmsg'); + attrvalue = $(ev.currentTarget).attr('attrvalue'); + msg = $(ev.currentTarget).attr('msg'); + formtoken = '".createFormKey('removeattrvalue')."'; + bootbox.confirm({ + \"message\": confirmmsg, + \"buttons\": { + \"confirm\": { + \"label\" : \" ".getMLText("rm_attr_value")."\", + \"className\" : \"btn-danger\", + }, + \"cancel\": { + \"label\" : \"".getMLText("cancel")."\", + \"className\" : \"btn-secondary\", + } + }, + \"callback\": function(result) { + if(result) { + $.post('../op/op.AttributeMgr.php', + { action: 'removeattrvalue', attrdefid: id, attrvalue: attrvalue, formtoken: formtoken }, + function(data) { + if(data.success) { + $('#table-row-attrvalue-'+id).hide('slow'); + noty({ + text: msg, + type: 'success', + dismissQueue: true, + layout: 'topRight', + theme: 'defaultTheme', + timeout: 1500, + }); + } else { + noty({ + text: data.message, + type: 'error', + dismissQueue: true, + layout: 'topRight', + theme: 'defaultTheme', + timeout: 3500, + }); + } + }, + 'json' + ); + } + } + }); + }); + }); + "; + } /* }}} */ + + function printClickDocumentJs() { /* {{{ */ + $onepage = $this->params['onepage']; + if($onepage) { +?> +/* catch click on a document row in the list folders and documents */ +$('body').on('click', '[id^=\"table-row-document\"] td:nth-child(2)', function(ev) { + attr_id = $(ev.currentTarget).parent().attr('id').split('-')[3]; + window.location = '../out/out.ViewDocument.php?documentid=' + attr_id; +}); +params['onepage']; + if($onepage) { +?> +/* catch click on a document row in the list folders and documents */ +$('body').on('click', '[id^=\"table-row-folder\"] td:nth-child(2)', function(ev) { + attr_id = $(ev.currentTarget).parent().data('target-id'); + if(typeof attr_id == 'undefined') + attr_id = $(ev.currentTarget).parent().attr('id').split('-')[3]; + window.location = '../out/out.ViewFolder.php?folderid=' + attr_id; +}); +getID(); + return "getName(), ENT_QUOTES)."\">"; + } /* }}} */ + + function documentListRowEnd($document) { /* {{{ */ + return "\n"; + } /* }}} */ + + /** + * Return HTML of a single row in the document list table + * + * @param object $document + * @param object $previewer + * @param boolean $skipcont set to true if embrasing tr shall be skipped + */ + function documentListRow($document, $previewer, $skipcont=false, $version=0, $extracontent=array()) { /* {{{ */ + $dms = $this->params['dms']; + $user = $this->params['user']; + $showtree = $this->params['showtree']; + $workflowmode = $this->params['workflowmode']; + $previewwidth = $this->params['previewWidthList']; + $enableClipboard = $this->params['enableclipboard']; + $accessop = $this->params['accessobject']; + $onepage = $this->params['onepage']; + + $content = ''; + + $owner = $document->getOwner(); + $comment = $document->getComment(); + if (strlen($comment) > 150) $comment = substr($comment, 0, 147) . "..."; + $docID = $document->getID(); + + if($version) { + $latestContent = $this->callHook('documentContent', $document, $version); + if($latestContent === null) + $latestContent = $document->getContentByVersion($version); + } else { + $latestContent = $this->callHook('documentLatestContent', $document); + if($latestContent === null) + $latestContent = $document->getLatestContent(); + } + + if($latestContent) { + if(!$skipcont) + $content .= $this->documentListRowStart($document); + + $previewer->createPreview($latestContent); + $version = $latestContent->getVersion(); + $status = $latestContent->getStatus(); + $needwkflaction = false; + if($workflowmode == 'advanced') { + $workflow = $latestContent->getWorkflow(); + if($workflow) { + $needwkflaction = $latestContent->needsWorkflowAction($user); + } + } + + /* Retrieve attacheѕ files */ + $files = $document->getDocumentFiles($latestContent->getVersion()); + $files = SeedDMS_Core_DMS::filterDocumentFiles($user, $files); + + /* Retrieve linked documents */ + $links = $document->getDocumentLinks(); + $links = SeedDMS_Core_DMS::filterDocumentLinks($user, $links); + + /* Retrieve reverse linked documents */ + $revlinks = $document->getReverseDocumentLinks(); + $revlinks = SeedDMS_Core_DMS::filterDocumentLinks($user, $revlinks); + + $content .= ""; + if (file_exists($dms->contentDir . $latestContent->getPath())) { + if($accessop->check_controller_access('Download', array('action'=>'version'))) + $content .= ""; + if($previewer->hasPreview($latestContent)) { + $content .= "getID()."&version=".$latestContent->getVersion()."&width=".$previewwidth."\" title=\"".htmlspecialchars($latestContent->getMimeType())."\">"; + } else { + $content .= "getMimeIcon($latestContent->getFileType())."\" ".($previewwidth ? "width=\"".$previewwidth."\"" : "")."\" title=\"".htmlspecialchars($latestContent->getMimeType())."\">"; + } + if($accessop->check_controller_access('Download', array('action'=>'version'))) + $content .= ""; + } else + $content .= "getMimeIcon($latestContent->getFileType())."\" title=\"".htmlspecialchars($latestContent->getMimeType())."\">"; + $content .= ""; + + $content .= ""; + if($onepage) + $content .= "".htmlspecialchars($document->getName()) . ""; + else + $content .= "" . htmlspecialchars($document->getName()) . ""; + if(isset($extracontent['below_title'])) + $content .= $extracontent['below_title']; + $content .= "
      "; + if($belowtitle = $this->callHook('documentListRowBelowTitle', $document, $latestContent)) + $content .= $belowtitle; + else + $content .= "".getMLText('owner').": ".htmlspecialchars($owner->getFullName()).", ".getMLText('creation_date').": ".getReadableDate($document->getDate()).", ".getMLText('version')." ".$version." - ".getReadableDate($latestContent->getDate())."".($document->expires() ? ", ".getMLText('expires').": ".getReadableDate($document->getExpires())."" : "").""; + if($comment) { + $content .= "
      ".htmlspecialchars($comment).""; + } + if(!empty($extracontent['bottom_title'])) + $content .= $extracontent['bottom_title']; + $content .= "\n"; + + $content .= ""; + $attentionstr = ''; + if ( $document->isLocked() ) { + $attentionstr .= "getImgPath("lock.png")."\" title=\"". getMLText("locked_by").": ".htmlspecialchars($document->getLockingUser()->getFullName())."\"> "; + } + if ( $needwkflaction ) { + $attentionstr .= "getImgPath("attention.gif")."\" title=\"". getMLText("workflow").": ".htmlspecialchars($workflow->getName())."\"> "; + } + if($attentionstr) + $content .= $attentionstr."
      "; + $content .= ""; + if(count($files)) + $content .= count($files)." ".getMLText("linked_files")."
      "; + if(count($links) || count($revlinks)) + $content .= count($links)."/".count($revlinks)." ".getMLText("linked_documents")."
      "; + if($status["status"] == S_IN_WORKFLOW && $workflowmode == 'advanced') { + $workflowstate = $latestContent->getWorkflowState(); + $content .= 'getName()) : '').'">'.($workflowstate ? htmlspecialchars($workflowstate->getName()) : '').''; + } else { + $content .= getOverallStatusText($status["status"]); + } + $content .= "
      "; +// $content .= "".$version.""; + $content .= ""; + $content .= "
      "; + if(!empty($extracontent['begin_action_list'])) + $content .= $extracontent['begin_action_list']; + if($accessop->check_view_access('RemoveDocument')) { + if($document->getAccessMode($user) >= M_ALL) { + $content .= $this->printDeleteDocumentButton($document, 'splash_rm_document', true); + } else { + $content .= ''; + } + } + if($document->getAccessMode($user) >= M_READWRITE) { + $content .= ''; + } else { + $content .= ''; + } + if($document->getAccessMode($user) >= M_READWRITE) { + $content .= $this->printLockButton($document, 'splash_document_locked', 'splash_document_unlocked', true); + } + if($document->getAccessMode($user) >= M_READWRITE) { + $content .= $this->printAccessButton($document, true); + } + if($enableClipboard) { + $content .= ''; + } + if($onepage) + $content .= ''; + if(!empty($extracontent['end_action_list'])) + $content .= $extracontent['end_action_list']; + $content .= "
      "; + $content .= ""; + if(!$skipcont) + $content .= $this->documentListRowEnd($document); + } + return $content; + } /* }}} */ + + /** + * Start the row for a folder in list of documents and folders + * + * This method creates the starting tr tag for a new table row containing + * a folder list entry. The tr tag contains various attributes which are + * used for removing the table line and to make drap&drop work. + * + * id=table-row-folder- : used for identifying the row when removing the table + * row after deletion of the folder by clicking on the delete button in that table + * row. + * data-droptarget=folder_ : identifies the folder represented by this row + * when it used as a target of the drag&drop operation. + * If an element (either a file or a dragged item) is dropped on this row, the + * data-droptarget will be evaluated to identify the underlying dms object. + * Dropping a file on a folder will upload that file into the folder. Droping + * an item (which is currently either a document or a folder) from the page will + * move that item into the folder. + * rel=folder_ : This data is put into drag data when a drag starts. When the + * item is dropped on some other item this data will identify the source object. + * The attributes data-droptarget and rel are usually equal. At least there is + * currently no scenario where they are different. + * formtoken= : token made of key 'movefolder' + * formtoken is also placed in the drag data just like the value of attibute 'rel'. + * This is always set to a value made of 'movefolder'. + * data-uploadformtoken= : token made of key 'adddocument' + * class=table-row-folder : The class must have a class named 'table-row-folder' in + * order to be draggable and to extract the drag data from the attributes 'rel' and + * 'formtoken' + * + * @param object $folder + * @return string starting tr tag for a table + */ + function folderListRowStart($folder, $class='') { /* {{{ */ + return "getID()."\" draggable=\"true\" data-droptarget=\"folder_".$folder->getID()."\" rel=\"folder_".$folder->getID()."\" class=\"folder table-row-folder droptarget".($class ? ' '.$class : '')."\" data-uploadformtoken=\"".createFormKey('')."\" formtoken=\"".createFormKey('')."\" data-name=\"".htmlspecialchars($folder->getName(), ENT_QUOTES)."\">"; + } /* }}} */ + + function folderListRowEnd($folder) { /* {{{ */ + return "\n"; + } /* }}} */ + + function folderListRow($subFolder, $skipcont=false, $extracontent=array()) { /* {{{ */ + $dms = $this->params['dms']; + $user = $this->params['user']; +// $folder = $this->params['folder']; + $showtree = $this->params['showtree']; + $enableRecursiveCount = $this->params['enableRecursiveCount']; + $maxRecursiveCount = $this->params['maxRecursiveCount']; + $enableClipboard = $this->params['enableclipboard']; + $accessop = $this->params['accessobject']; + $onepage = $this->params['onepage']; + + $owner = $subFolder->getOwner(); + $comment = $subFolder->getComment(); + if (strlen($comment) > 150) $comment = substr($comment, 0, 147) . "..."; + + $content = ''; + if(!$skipcont) + $content .= $this->folderListRowStart($subFolder); + $content .= "getID()."&showtree=".$showtree."\">getMimeIcon(".folder")."\" width=\"24\" height=\"24\" border=0>\n"; + if($onepage) + $content .= "" . "getId()."\">".htmlspecialchars($subFolder->getName()).""; + else + $content .= "getID()."&showtree=".$showtree."\">" . htmlspecialchars($subFolder->getName()) . ""; + $content .= "
      ".getMLText('owner').": ".htmlspecialchars($owner->getFullName()).", ".getMLText('creation_date').": ".date('Y-m-d', $subFolder->getDate()).""; + if($comment) { + $content .= "
      ".htmlspecialchars($comment).""; + } + if(isset($extracontent['bottom_title'])) + $content .= $extracontent['bottom_title']; + $content .= "\n"; +// $content .= "".htmlspecialchars($owner->getFullName()).""; + $content .= ""; + if($enableRecursiveCount) { + if($user->isAdmin()) { + /* No need to check for access rights in countChildren() for + * admin. So pass 0 as the limit. + */ + $cc = $subFolder->countChildren($user, 0); + $content .= $cc['folder_count']." ".getMLText("folders")."
      ".$cc['document_count']." ".getMLText("documents"); + } else { + $cc = $subFolder->countChildren($user, $maxRecursiveCount); + if($maxRecursiveCount > 5000) + $rr = 100.0; + else + $rr = 10.0; + $content .= (!$cc['folder_precise'] ? '~'.(round($cc['folder_count']/$rr)*$rr) : $cc['folder_count'])." ".getMLText("folders")."
      ".(!$cc['document_precise'] ? '~'.(round($cc['document_count']/$rr)*$rr) : $cc['document_count'])." ".getMLText("documents"); + } + } else { + /* FIXME: the following is very inefficient for just getting the number of + * subfolders and documents. Making it more efficient is difficult, because + * the access rights need to be checked. + */ + $subsub = $subFolder->getSubFolders(); + $subsub = SeedDMS_Core_DMS::filterAccess($subsub, $user, M_READ); + $subdoc = $subFolder->getDocuments(); + $subdoc = SeedDMS_Core_DMS::filterAccess($subdoc, $user, M_READ); + $content .= count($subsub)." ".getMLText("folders")."
      ".count($subdoc)." ".getMLText("documents"); + } + $content .= "
      "; +// $content .= ""; + $content .= ""; + $content .= "
      "; + if(!empty($extracontent['begin_action_list'])) + $content .= $extracontent['begin_action_list']; + $subFolderAccessMode = $subFolder->getAccessMode($user); + if($subFolderAccessMode >= M_ALL) { + $content .= $this->printDeleteFolderButton($subFolder, 'splash_rm_folder', true); + } else { + $content .= ''; + } + if($subFolderAccessMode >= M_READWRITE) { + $content .= ''; + } else { + $content .= ''; + } + if($subFolderAccessMode >= M_READWRITE) { + $content .= $this->printAccessButton($subFolder, true); + } + if($enableClipboard) { + $content .= ''; + } + if($onepage) + $content .= ''; + if(!empty($extracontent['end_action_list'])) + $content .= $extracontent['end_action_list']; + $content .= "
      "; + $content .= ""; + if(!$skipcont) + $content .= $this->folderListRowEnd($subFolder); + return $content; + } /* }}} */ + + function show(){ /* {{{ */ + parent::show(); + } /* }}} */ + + function error(){ /* {{{ */ + parent::error(); + $dms = $this->params['dms']; + $user = $this->params['user']; + $pagetitle = $this->params['pagetitle']; + $errormsg = $this->params['errormsg']; + $plain = $this->params['plain']; + $noexit = $this->params['noexit']; + + if(!$plain) { + $this->htmlStartPage($pagetitle); + $this->globalNavigation(); + $this->contentStart(); + } + + print "
      "; + print "

      ".getMLText('error')."!

      "; + print htmlspecialchars($errormsg); + print "
      "; + print "
      "; + + $this->contentEnd(); + $this->htmlEndPage(); + + add_log_line(" UI::exitError error=".$errormsg." pagetitle=".$pagetitle, PEAR_LOG_ERR); + + if($noexit) + return; + + exit; + } /* }}} */ + + /** + * Return HTML Template for jumploader + * + * @param string $uploadurl URL where post data is send + * @param integer $folderid id of folder where document is saved + * @param integer $maxfiles maximum number of files allowed to upload + * @param array $fields list of post fields + */ + function getFineUploaderTemplate() { /* {{{ */ + return ' + +'; + } /* }}} */ + + /** + * Output HTML Code for Fine Uploader + * + * @param string $uploadurl URL where post data is send + * @param integer $folderid id of folder where document is saved + * @param integer $maxfiles maximum number of files allowed to upload + * @param array $fields list of post fields + */ + function printFineUploaderHtml($prefix='userfile') { /* {{{ */ + echo self::getFineUploaderHtml($prefix); + } /* }}} */ + + /** + * Get HTML Code for Fine Uploader + * + * @param string $uploadurl URL where post data is send + * @param integer $folderid id of folder where document is saved + * @param integer $maxfiles maximum number of files allowed to upload + * @param array $fields list of post fields + */ + function getFineUploaderHtml($prefix='userfile') { /* {{{ */ + $html = '
      + + '; + return $html; + } /* }}} */ + + /** + * Output Javascript Code for fine uploader + * + * @param string $uploadurl URL where post data is send + * @param integer $folderid id of folder where document is saved + * @param integer $maxfiles maximum number of files allowed to upload + * @param array $fields list of post fields + */ + function printFineUploaderJs($uploadurl, $partsize=0, $maxuploadsize=0, $multiple=true, $prefix='userfile', $formname='form1') { /* {{{ */ +?> +$(document).ready(function() { + uploader = new qq.FineUploader({ + debug: false, + autoUpload: false, + multiple: , + element: $('#-fine-uploader')[0], + template: 'qq-template', + request: { + endpoint: 'params['settings']->_encryptionKey.'uploadchunks'); ?>' + }, + 0 ? ' + validation: { + sizeLimit: '.$maxuploadsize.' + }, +' : ''); ?> + chunking: { + enabled: true, + + mandatory: true + }, + messages: { + sizeError: '{file} is too large, maximum file size is {sizeLimit}.' + }, + callbacks: { + onComplete: function(id, name, json, xhr) { + }, + onAllComplete: function(succeeded, failed) { + var uuids = Array(); + var names = Array(); + for (var i = 0; i < succeeded.length; i++) { + uuids.push(this.getUuid(succeeded[i])) + names.push(this.getName(succeeded[i])) + } + $('#-fine-uploader-uuids').val(uuids.join(';')); + $('#-fine-uploader-names').val(names.join(';')); + /* Run upload only if all files could be uploaded */ + if(succeeded.length > 0 && failed.length == 0) + document.getElementById('').submit(); + }, + onError: function(id, name, reason, xhr) { + noty({ + text: reason, + type: 'error', + dismissQueue: true, + layout: 'topRight', + theme: 'defaultTheme', + timeout: 3500, + }); + } + } + }); +}); +params['dms']; + $document = $latestContent->getDocument(); + $accessop = $this->params['accessobject']; +?> + + + +getReviewStatus(10); + break; + case "approval": + $statusList = $latestContent->getApprovalStatus(10); + break; + default: + $statusList = array(); + } + foreach($statusList as $rec) { + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + } +?> +
      ,
      "; + switch ($rec["type"]) { + case 0: // individual. + $required = $dms->getUser($rec["required"]); + if (!is_object($required)) { + $reqName = getMLText("unknown_user")." '".$rec["required"]."'"; + } else { + $reqName = htmlspecialchars($required->getFullName()." (".$required->getLogin().")"); + } + break; + case 1: // Approver is a group. + $required = $dms->getGroup($rec["required"]); + if (!is_object($required)) { + $reqName = getMLText("unknown_group")." '".$rec["required"]."'"; + } + else { + $reqName = "".htmlspecialchars($required->getName()).""; + } + break; + } + echo $reqName; + echo ""; + echo "".getLongReadableDate($rec['date'])." - "; + $updateuser = $dms->getUser($rec["userID"]); + if(!is_object($updateuser)) + echo getMLText("unknown_user"); + else + echo htmlspecialchars($updateuser->getFullName()." (".$updateuser->getLogin().")"); + echo ""; + if($rec['comment']) + echo "
      ".htmlspecialchars($rec['comment']); + switch($type) { + case "review": + if($accessop->check_controller_access('Download', array('action'=>'review'))) + if($rec['file']) { + echo "
      "; + echo "getID()."&reviewlogid=".$rec['reviewLogID']."\" class=\"btn btn-mini\"> ".getMLText('download').""; + } + break; + case "approval": + if($accessop->check_controller_access('Download', array('action'=>'approval'))) + if($rec['file']) { + echo "
      "; + echo "getID()."&approvelogid=".$rec['approveLogID']."\" class=\"btn btn-mini\"> ".getMLText('download').""; + } + break; + } + echo "
      "; + switch($type) { + case "review": + echo getReviewStatusText($rec["status"]); + break; + case "approval": + echo getApprovalStatusText($rec["status"]); + break; + default: + } + echo "
      + $value) { + $used = (int) ($value/$max*100.0+0.5); + $free = 100-$used; + } else { + $free = 0; + $used = 100; + } + $html = ' +
      +
      +
      +
      '; + return $html; + } /* }}} */ + + /** + * Output a timeline for a document + * + * @param object $document document + */ + protected function printTimelineJs($timelineurl, $height=300, $start='', $end='', $skip=array()) { /* {{{ */ + if(!$timelineurl) + return; +?> + var timeline; + var data; + + // specify options + var options = { + 'width': '100%', + 'height': '100%', + + 'editable': false, + 'selectable': true, + 'style': 'box', + 'locale': 'params['session']->getLanguage() ?>' + }; + + function onselect() { + var sel = timeline.getSelection(); + if (sel.length) { + if (sel[0].row != undefined) { + var row = sel[0].row; + console.log(timeline.getItem(sel[0].row)); + item = timeline.getItem(sel[0].row); + $('div.ajax').trigger('update', {documentid: item.docid, version: item.version, statusid: item.statusid, statuslogid: item.statuslogid, fileid: item.fileid}); + } + } + } + $(document).ready(function () { + // Instantiate our timeline object. + timeline = new links.Timeline(document.getElementById('timeline'), options); + links.events.addListener(timeline, 'select', onselect); + $.getJSON( + '', + function(data) { + $.each( data, function( key, val ) { + val.start = new Date(val.start); + }); + timeline.draw(data); + } + ); + }); + +
      +\n"; + $this->printTimelineJs($timelineurl, $height, $start, $end, $skip); + echo ""; + $this->printTimelineHtml($height); + } /* }}} */ + + public function printPopupBox($title, $content, $ret=false) { /* {{{ */ + $id = md5(uniqid()); + /* + $this->addFooterJS(' +$("body").on("click", "span.openpopupbox", function(e) { + $(""+$(e.target).data("href")).toggle(); +// $("div.popupbox").toggle(); +}); +'); + */ + $html = ' + '.$title.' + '; + if($ret) + return $html; + else + echo $html; + } /* }}} */ + + protected function printAccordion($title, $content) { /* {{{ */ + $id = substr(md5(uniqid()), 0, 4); +?> +
      +
      +
      + + + +
      +
      +
      + +
      +
      +
      +
      + i { + text-decoration: none; +} +ul.actions li a > i { + color: #000; + margin-right: 5px; +} +ul.actions li a.btn > i { + font-size: 200%; +} + +ul.tree, ul.tree ul { + margin-left: 20px; +} + +ul.jqtree-tree li.jqtree-selected > .jqtree-element, +ul.jqtree-tree li.jqtree-selected > .jqtree-element:hover { + background-color: #fff; + background: none; + text-shadow: none; + font-weight: bold; +} + +legend > span { + float: right; +} + +td.today { + background-color: rgb(255, 200, 0); +} + +td.event { + background-color: rgb(0, 200, 255); +} + +.wordbreak { + word-break: break-word; +} + +.btn-file { + position: relative; + overflow: hidden; +} +.btn-file input[type=file] { + position: absolute; + top: 0; + right: 0; + min-width: 100%; + min-height: 100%; + font-size: 999px; + text-align: right; + filter: alpha(opacity=0); + opacity: 0; + background: red; + cursor: inherit; + display: block; +} +input[readonly] { + background-color: white !important; + cursor: text !important; +} + +div.mandatories { + font-size: 90%; + font-style: italic; + color: #888; +} +div.mandatories span { + font-weight: bold; +} + +div.statusbar { + font-size: 80%; +} +div.statusbar div.filename { + display: inline-block; +} +div.statusbar div.filesize { + display: inline-block; + float: right; +} +div.statusbar div.progress { + margin-bottom: 10px; +} +div.statusbar a.btn { + margin-bottom: 10px; +} + +#database .chosen-container, +#fulltext .chosen-container { + width: 95% !important; +} + +.chosen-container-multi .chosen-choices { + border: 1px solid #cccccc; + border-radius: 4px; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + transition: border linear 0.2s, box-shadow linear 0.2s; + padding: 2px 6px; + height: 20px; +} + +div.help h1 { + font-size: 24px; +} + +div.help h2 { + font-size: 18px; +} + +div.help h3 { + font-size: 16px; +} + +div.splash { + display: none; +} + +div.clipboard-container { + position: fixed; + left: 10px; + top: 40px; + width: 29.8%; + background: white; + border: 1px solid #d4d4d4; + border-radius: 5px; + padding: 10px; + height: 500px; + margin: 10px; + overflow-y: auto; + overflow-x: hidden; +} + +div.statusbar-container { + display: none; + position: fixed; + right:10px; + top:60px; + width:300px; + padding:10px; + background-color: white; + border: 1px solid #E0E0E0; + border-radius: 4px; + z-index: 10; + overflow-y: scroll; + max-height: calc(100% - 100px); +} +div.statusbar-container::-webkit-scrollbar { + width: 5px; +} +div.statusbar-container::-webkit-scrollbar-track { + -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.3); + border-radius: 10px; +} + +div.statusbar-container::-webkit-scrollbar-thumb { + border-radius: 10px; + -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.5); +} + +div.statusbar-container h1 { + font-size: 21px; + line-height: 40px; + color: #333333; + font-weight: normal; +} + +ul.jqtree-tree li.jqtree_common > .jqtree-element:hover { + background-color: #E0E0E0; +} + +span.datepicker { + padding: 0px; +} +/* Sidenav for Docs + * -------------------------------------------------- */ + +.bs-docs-sidenav { + width: 100%; + margin: 0px 0 30px 0; + padding: 0; + background-color: #fff; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 1px 4px rgba(0,0,0,.065); + -moz-box-shadow: 0 1px 4px rgba(0,0,0,.065); + box-shadow: 0 1px 4px rgba(0,0,0,.065); +} +.bs-docs-sidenav > li > a { + display: block; + width: 190px \9; + margin: 0 0 -1px; + padding: 8px 14px; + border: 1px solid #e5e5e5; +} +.bs-docs-sidenav > li:first-child > a { + -webkit-border-radius: 6px 6px 0 0; + -moz-border-radius: 6px 6px 0 0; + border-radius: 6px 6px 0 0; +} +.bs-docs-sidenav > li:last-child > a { + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; +} +.bs-docs-sidenav > .active > a { + position: relative; + z-index: 2; + padding: 9px 15px; + border: 0; + text-shadow: 0 1px 0 rgba(0,0,0,.15); + -webkit-box-shadow: inset 1px 0 0 rgba(0,0,0,.1), inset -1px 0 0 rgba(0,0,0,.1); + -moz-box-shadow: inset 1px 0 0 rgba(0,0,0,.1), inset -1px 0 0 rgba(0,0,0,.1); + box-shadow: inset 1px 0 0 rgba(0,0,0,.1), inset -1px 0 0 rgba(0,0,0,.1); +} +/* Chevrons */ +.bs-docs-sidenav .badge-right { + float: right; + margin-top: 2px; + margin-right: -6px; +} +.bs-docs-sidenav > li > a:hover { + background-color: #f5f5f5; +} +.bs-docs-sidenav a:hover .icon-chevron-right { + opacity: .5; +} +.bs-docs-sidenav .active .icon-chevron-right, +.bs-docs-sidenav .active a:hover .icon-chevron-right { + background-image: url(../img/glyphicons-halflings-white.png); + opacity: 1; +} +.bs-docs-sidenav.affix { + top: 100px; +} +.bs-docs-sidenav.affix-bottom { + position: absolute; + top: auto; + bottom: 270px; +} + +i.success {color: #00b000;} +i.enabled {color: #00b000;} +i.error {color: #b00000;} +i.disabled {color: #b00000;} +i.warning {color: #ff9900;} +i.initstate {color: #ff9900;} +i.released {color: #00b000;} +i.rejected {color: #b00000;} +i.in-workflow {color: #11479e;} +i.workflow-action {color: #91479e;} +i.selected {border: 1px solid #d4d4d4;padding:3px;border-radius:3px;background-color:#fafafa;background-image: linear-gradient(to bottom, #ffffff, #f2f2f2);} + +span.editable:after { + font: normal normal normal 14px/1 FontAwesome; + content: " \f044"; +} + +span.openpopupbox { + cursor: pointer; +} + +div.popupbox { + margin-top: 5px; + background-color: #fff; + border-radius: 4px; + color: black; + text-align: left; + text-shadow: none; + border: 1px solid #ccc; + padding: 25px 15px 15px 15px; + display: none; + position: absolute; + min-width: 230px; + z-index: 10; +} + +div.popupbox dt { + font-weight: normal; + font-size: 80%; +} + +div.popupbox dd { + margin-left: 0px; + margin-bottom: 5px; +} + +div.popupbox span.closepopupbox { + position: absolute; + right: 5px; + top: 0px; +} + +ul.qq-upload-list { + /* + background-color: #fff; + border-radius: 4px; + border: 1px solid #cccccc; + */ +} + +ul.qq-upload-list li { + display: inline-block; + margin: 5px 5px 5px 0; + padding: 5px; + background-color: #fff; + border: 1px solid #cccccc; + border-radius: 4px; +} + +ul.qq-upload-list li img { + display: block; +} + +ul.qq-upload-list li span { + display: block; +} + +.qq-upload-button { + display: inline-block; +} + +.qq-upload-drop-area { + display: inline-block; + width: 200px; + height: 22px; + padding: 3px; + background-color: #fff; + border: 1px solid #cccccc; + border-radius: 4px; +} +.qq-hide, .qq-uploader dialog { + display: none; +} diff --git a/views/bootstrap4/styles/application.js b/views/bootstrap4/styles/application.js new file mode 100644 index 000000000..d6339a280 --- /dev/null +++ b/views/bootstrap4/styles/application.js @@ -0,0 +1,1425 @@ +/* Template function which outputs an option in a chzn-select + * The replace() call is required to prevent xss attacks (see CVE-2019-12745) + * Using htmlspecialchars() in php isn't sufficient because, chzn_template_func + * will receive an unescaped string + * (see https://forums.select2.org/t/propperly-escape-option-value-to-prevent-xss/788) + */ +chzn_template_func = function (state) { + var subtitle = ''; + if($(state.element).data('subtitle')) + subtitle = $(state.element).data('subtitle')+''; /* make sure it is a string */ + var warning = ''; + if($(state.element).data('warning')) + warning = $(state.element).data('warning')+''; /* make sure it is a string */ + var html = ''; + if($(state.element).data('icon-before')) + html += ' '; + html += state.text.replace(/'; + if(warning) + html += '
      '+warning+''; + html += '
      '; + var $newstate = $(html); + return $newstate; +}; +function escapeHtml(text) { + var map = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''' + }; + + return text.replace(/[&<>"']/g, function(m) { return map[m]; }); +} + +function treeFolderSelected(formid, nodeid, nodename) { + $('#'+formid).val(nodeid); + $('#choosefoldersearch'+formid).val(nodename); + $('#folderChooser'+formid).modal('hide'); +} + +function treeDocumentSelected(formid, nodeid, nodename) { + $('#'+formid).val(nodeid); + $('#choosedocsearch'+formid).val(nodename); + $('#docChooser'+formid).modal('hide'); +} + +$(document).ready( function() { +// $('.dropdown-menu a.dropdown-toggle').on('click', function(e) { + $('body').on('click', '.dropdown-menu a.dropdown-toggle', function (e) { + if (!$(this).next().hasClass('show')) { + $(this).parents('.dropdown-menu').first().find('.show').removeClass("show"); + } + var $subMenu = $(this).next(".dropdown-menu"); + $subMenu.toggleClass('show'); + + + $(this).parents('li.nav-item.dropdown.show').on('hidden.bs.dropdown', function(e) { + $('.dropdown-submenu .show').removeClass("show"); + }); + + + return false; + }); + + /* close popovers when clicking somewhere except in the popover or the + * remove icon + */ + $('html').on('click', function(e) { + if (typeof $(e.target).data('original-title') == 'undefined' && !$(e.target).parents().is('.popover.in') && !$(e.target).is('.fa fa-remove')) { + $('[data-original-title]').popover('hide'); + } + }); + + $('body').on('hidden', '.modal', function () { + $(this).removeData('modal'); + }); + + /* Bootstrap 4 does not support to the remote loading of the modal content + * anymore. This adds it by using jquery. + */ + $('body').on('click', '[data-toggle="modal"]', function(ev){ + ev.preventDefault(); + $($(this).data("target")+' .modal-body').load($(this).data("remote")); + }); + +// $('body').on('touchstart.dropdown', '.dropdown-menu', function (e) { e.stopPropagation(); }); + + $('.datepicker, #expirationdate, #createstartdate, #createenddate, #expirationstartdate, #expirationenddate') + .datepicker({todayHighlight: true, toggleActive: true, autoclose: "true"}) + /* + .on('changeDate', function(ev){ + if(ev.date && $(ev.target).data('selectmenu')) { + $("#"+$(ev.target).data('selectmenu')).val('date'); + } + $(ev.currentTarget).datepicker('hide'); + }); +*/ + + $(".chzn-select").select2({ + theme: "bootstrap4", + //width: '100%', + templateResult: chzn_template_func//, + //templateSelection: chzn_template_func + }); + + /* change the color and length of the bar graph showing the password + * strength on each change to the passwod field. + */ + $(".pwd").passStrength({ /* {{{ */ + url: "../op/op.Ajax.php", + onChange: function(data, target) { + pwsp = 100*data.score; + $('#'+target+' div.bar').width(pwsp+'%'); + if(data.ok) { + $('#'+target+' div.bar').removeClass('bg-danger'); + $('#'+target+' div.bar').addClass('bg-success'); + } else { + $('#'+target+' div.bar').removeClass('bg-success'); + $('#'+target+' div.bar').addClass('bg-danger'); + } + } + }); /* }}} */ + + /* The typeahead functionality useѕ the modified version of + * bootstrap-typeahead, which is able to set the render function. + * This was needed because the search function return json objects + * for each hit and render could only process strings. + * */ + $("#searchfield").typeahead({ /* {{{ */ + menu: '', + item: '
    • ', + minLength: 3, + items: 100, /* the query will limit the number of hits */ + source: function(query, process) { + var d = new Date(); + var pastYear = d.getFullYear() - 1; + d.setFullYear(pastYear); +// console.log(d.toISOString().split('T')[0]); + +// $.get('../restapi/index.php/search', { query: query, limit: 8, mode: 'typeahead' }, function(data) { + var data = { + query: query, + limit: 18, +// fullsearch: 1, +// creationdate: 1, +// createstart: d.toISOString().split('T')[0], + action: 'typeahead' + }; + /* Return a list of json objects, each containing + * type: type of object (D=doc, F=folder, S=searchterm) + * name: name of object + */ + $.get('../out/out.Search.php', data, function(data) { + process(data); + }); + }, + /* updater is called when the item in the list is clicked. It is + * actually provided to update the input field, but here we use + * it to set the document location. The passed value is the string + * set in data-value of the list items. + * This method relies on some changes in bootstrap-typeahead.js + * Originally, update was passed only the data-value of the li item + * which is set in the render fuction below, + * but the modified version passes all data fields. which also + * contain the 'id' and 'type' (also set in render function). + **/ + updater: function (item) { + if(item.id) { + if(item.type == 'D') + document.location = "../out/out.ViewDocument.php?documentid=" + item.id; + else + document.location = "../out/out.ViewFolder.php?folderid=" + item.id; + } else + document.location = "../out/out.Search.php?query=" + encodeURIComponent(item.value); + return item.value; + }, + sorter: function(items) { + return items; + }, + /* matcher will always return true, because the initial search returns + * matches only + */ + matcher : function (item) { + return true; + }, + /* highlighter is for modifying the 'a' tag text. It places an icon + * in front of the name and replaces a '<' within the name with an + * entity. + **/ + highlighter : function (item) { + if(item.type.charAt(0) == 'D') + return ' ' + item.name.replace(/ ' + item.name.replace(/ ' + item.name.replace(/ ' + strarr[1].replace(/ ' + strarr[1].replace(/
      '); + $.get(url, function(data) { + element.html(data); + $(".chzn-select").select2({ + theme: "bootstrap4", + width: '100%', + templateResult: chzn_template_func//, + //templateSelection: chzn_template_func + }); + $(".pwd").passStrength({ /* {{{ */ + url: "../op/op.Ajax.php", + onChange: function(data, target) { + pwsp = 100*data.score; + $('#'+target+' div.bar').width(pwsp+'%'); + if(data.ok) { + $('#'+target+' div.bar').removeClass('bar-danger'); + $('#'+target+' div.bar').addClass('bar-success'); + } else { + $('#'+target+' div.bar').removeClass('bar-success'); + $('#'+target+' div.bar').addClass('bar-danger'); + } + } + }); /* }}} */ + if(afterload) { + var func = eval(afterload); + if(typeof func === "function"){ + func(); + } + } + }); + }); /* }}} */ + + $('div.ajax').on('update', function(event, param1, callback) { /* {{{ */ + var element = $(this); + var url = ''; + var href = element.data('href'); + var base = element.data('base'); + if(typeof base == 'undefined') + base = ''; + var view = element.data('view'); + var action = element.data('action'); + var query = element.data('query'); + var afterload = $(this).data('afterload'); + if(view && action) { + url = seeddms_webroot+base+"out/out."+view+".php?action="+action; + if(query) { + url += "&"+query; + } + } else + url = href; + if(typeof param1 === 'object') { + for(var key in param1) { + if(key == 'callback') + callback = param1[key]; + else { + if($.isArray(param1[key])) { + if(param1[key].length > 0) + url += "&"+key+"[]="+param1[key].join("&"+key+"[]="); + } else + url += "&"+key+"="+param1[key]; + } + } + } else { + url += "&"+param1; + } + console.log(url); + if(!element.data('no-spinner')) + element.prepend('
      '); + $.get(url, function(data) { + element.html(data); + $(".chzn-select").select2({ + theme: "bootstrap4", + width: '100%', + templateResult: chzn_template_func//, + //templateSelection: chzn_template_func + }); + $(".pwd").passStrength({ /* {{{ */ + url: "../op/op.Ajax.php", + onChange: function(data, target) { + pwsp = 100*data.score; + $('#'+target+' div.bar').width(pwsp+'%'); + if(data.ok) { + $('#'+target+' div.bar').removeClass('bar-danger'); + $('#'+target+' div.bar').addClass('bar-success'); + } else { + $('#'+target+' div.bar').removeClass('bar-success'); + $('#'+target+' div.bar').addClass('bar-danger'); + } + } + }); /* }}} */ + if(callback) + callback.call(); + if(afterload) { + var func = eval(afterload); + if(typeof func === "function"){ + func(); + } + } + }); + }); /* }}} */ + + $("body").on("click", ".ajax-click", function() { /* {{{ */ + var element = $(this); + var url = element.data('href')+"?"+element.data('param1'); + $.ajax({ + type: 'GET', + url: url, + dataType: 'json', + success: function(data){ + if(data.success) { + if(element.data('param1') == 'command=clearclipboard') { + $("#main-clipboard").html('Loading').load('../out/out.Clipboard.php?action=mainclipboard') + $("#menu-clipboard div").html('Loading').load('../out/out.Clipboard.php?action=menuclipboard') + } + noty({ + text: data.message, + type: 'success', + dismissQueue: true, + layout: 'topRight', + theme: 'defaultTheme', + timeout: 1500 + }); + } else { + noty({ + text: data.message, + type: 'error', + dismissQueue: true, + layout: 'topRight', + theme: 'defaultTheme', + timeout: 3500 + }); + } + } + }); + }); /* }}} */ + + $('button.history-back').on('click', function(event) { /* {{{ */ + window.history.back(); + }); /* }}} */ + + $("body").on("blur", "span.editable", function(e) { /* {{{ */ + console.log($(this).data('document')); + console.log('Hallo'+$(this).text()); + e.preventDefault(); + $.post( "../op/op.Ajax.php", { command: "setdocumentname", id: $(this).data('document'), name: $(this).text() }) + .done(function( data ) { + noty({ + text: data.message, + type: data.success ? 'success' : 'error', + dismissQueue: true, + layout: 'topRight', + theme: 'defaultTheme', + timeout: 1500 + }); + }); + }); /* }}} */ + + $("body").on("keypress", "span.editable", function(e) { /* {{{ */ + if(e.which == 13) { + $(this).blur(); + } + return e.which != 13; + }); /* }}} */ +}); + +function onAddClipboard(ev) { /* {{{ */ + ev.preventDefault(); + var source_info = JSON.parse(ev.originalEvent.dataTransfer.getData("text")); + source_type = source_info.type; + source_id = source_info.id; + formtoken = source_info.formtoken; + if(source_type == 'document' || source_type == 'folder') { + $.get('../op/op.Ajax.php', + { command: 'addtoclipboard', type: source_type, id: source_id }, + function(data) { + if(data.success) { + $("#main-clipboard").html('Loading').load('../out/out.Clipboard.php?action=mainclipboard') + $("#menu-clipboard div").html('Loading').load('../out/out.Clipboard.php?action=menuclipboard') + noty({ + text: data.message, + type: 'success', + dismissQueue: true, + layout: 'topRight', + theme: 'defaultTheme', + timeout: 1500 + }); + } else { + noty({ + text: data.message, + type: 'error', + dismissQueue: true, + layout: 'topRight', + theme: 'defaultTheme', + timeout: 3500 + }); + } + }, + 'json' + ); + //url = "../op/op.AddToClipboard.php?id="+source_id+"&type="+source_type; + //document.location = url; + } +} /* }}} */ + +(function( SeedDMSUpload, $, undefined ) { /* {{{ */ + var ajaxurl = "../op/op.Ajax.php"; + var editBtnLabel = "Edit"; + var abortBtnLabel = "Abort"; + var maxFileSize = 100000; + var maxFileSizeMsg = 'File too large'; + var rowCount=0; + + SeedDMSUpload.setUrl = function(url) { + ajaxurl = url; + } + + SeedDMSUpload.setAbortBtnLabel = function(label) { + abortBtnLabel = label; + } + + SeedDMSUpload.setEditBtnLabel = function(label) { + editBtnLabel = label; + } + + SeedDMSUpload.setMaxFileSize = function(size) { + maxFileSize = size; + } + + SeedDMSUpload.setMaxFileSizeMsg = function(msg) { + maxFileSizeMsg = msg; + } + + function sendFileToServer(formData,status,callback) { + var uploadURL = ajaxurl; //Upload URL + var extraData ={}; //Extra Data. + var jqXHR=$.ajax({ + xhr: function() { + var xhrobj = $.ajaxSettings.xhr(); + if (xhrobj.upload) { + xhrobj.upload.addEventListener('progress', function(event) { + var percent = 0; + var position = event.loaded || event.position; + var total = event.total; + if (event.lengthComputable) { + percent = Math.ceil(position / total * 100); + } + //Set progress + status.setProgress(percent); + }, false); + } + return xhrobj; + }, + url: uploadURL, + type: "POST", + contentType: false, + dataType:"json", + processData: false, + cache: false, + data: formData, + success: function(data, textStatus) { + status.setProgress(100); + if(data.success) { + noty({ + text: data.message, + type: 'success', + dismissQueue: true, + layout: 'topRight', + theme: 'defaultTheme', + timeout: 1500 + }); + status.statusbar.after($('' + editBtnLabel + '')); + if(callback) { + callback(); + } + } else { + noty({ + text: data.message, + type: 'error', + dismissQueue: true, + layout: 'topRight', + theme: 'defaultTheme', + timeout: 3500 + }); + } + } + }); + + status.setAbort(jqXHR); + } + + function createStatusbar(obj) { + rowCount++; + var row="odd"; + this.obj = obj; + if(rowCount %2 ==0) row ="even"; + this.statusbar = $("
      "); + this.filename = $("
      ").appendTo(this.statusbar); + this.size = $("
      ").appendTo(this.statusbar); + this.progressBar = $("
      ").appendTo(this.statusbar); + this.abort = $("
      " + abortBtnLabel + "
      ").appendTo(this.statusbar); +// $('.statusbar').empty(); + obj.after(this.statusbar); + this.setFileNameSize = function(name,size) { + var sizeStr=""; + var sizeKB = size/1024; + if(parseInt(sizeKB) > 1024) { + var sizeMB = sizeKB/1024; + sizeStr = sizeMB.toFixed(2)+" MB"; + } else { + sizeStr = sizeKB.toFixed(2)+" KB"; + } + + this.filename.html(name); + this.size.html(sizeStr); + } + this.setProgress = function(progress) { + var progressBarWidth =progress*this.progressBar.width()/ 100; + this.progressBar.find('div').animate({ width: progressBarWidth }, 10).html(progress + "% "); + if(parseInt(progress) >= 100) { + this.abort.hide(); + } + } + this.setAbort = function(jqxhr) { + var sb = this.statusbar; + this.abort.click(function() { + jqxhr.abort(); + sb.hide(); + }); + } + } + + SeedDMSUpload.handleFileUpload = function(files,obj,statusbar) { + /* target is set for the quick upload area */ + var target_id = obj.data('target'); + var target_type = 'folder'; + /* droptarget is set for folders and documents in lists */ + var droptarget = obj.data('droptarget'); + if(droptarget) { + target_type = droptarget.split("_")[0]; + target_id = droptarget.split("_")[1]; + } + if(target_type == 'folder' && target_id) { + for (var i = 0; i < files.length; i++) { + if(files[i].size <= maxFileSize) { + var fd = new FormData(); + fd.append('targettype', target_type); + fd.append('folderid', target_id); + fd.append('formtoken', obj.data('uploadformtoken')); + fd.append('userfile', files[i]); + fd.append('command', 'uploaddocument'); +// fd.append('path', files[i].webkitRelativePath); + + statusbar.parent().show(); + var status = new createStatusbar(statusbar); + status.setFileNameSize(files[i].name,files[i].size); + sendFileToServer(fd,status,function(){ + if(target_id == seeddms_folder) + $("div.ajax[data-action='folderList']").trigger('update', {folderid: seeddms_folder}); + }); + } else { + noty({ + text: maxFileSizeMsg + '
      ' + files[i].name + ' (' + files[i].size + ' Bytes)', + type: 'error', + dismissQueue: true, + layout: 'topRight', + theme: 'defaultTheme', + timeout: 5000 + }); + } + } + } else if(target_type == 'document' && target_id) { + /* + for (var i = 0; i < files.length; i++) { + if(files[i].size <= maxFileSize) { + var fd = new FormData(); + fd.append('targettype', target_type); + fd.append('documentid', target_id); + fd.append('formtoken', obj.data('uploadformtoken')); + fd.append('userfile', files[i]); + fd.append('command', 'uploaddocument'); + + var status = new createStatusbar(statusbar); + status.setFileNameSize(files[i].name,files[i].size); + sendFileToServer(fd,status); + } else { + noty({ + text: maxFileSizeMsg + '
      ' + files[i].name + ' (' + files[i].size + ' Bytes)', + type: 'error', + dismissQueue: true, + layout: 'topRight', + theme: 'defaultTheme', + timeout: 5000 + }); + } + } + */ + } + } +}( window.SeedDMSUpload = window.SeedDMSUpload || {}, jQuery )); /* }}} */ + +$(document).ready(function() { /* {{{ */ + $(document).on('dragenter', "#draganddrophandler", function (e) { + e.stopPropagation(); + e.preventDefault(); + $(this).css('border', '2px dashed #0B85A1'); + }); + $(document).on('dragleave', "#draganddrophandler", function (e) { + $(this).css('border', '0px solid white'); + }); + $(document).on('dragover', "#draganddrophandler", function (e) { + e.stopPropagation(); + e.preventDefault(); + }); + $(document).on('drop', "#draganddrophandler", function (e) { + $(this).css('border', '0px dotted #0B85A1'); + e.preventDefault(); + var files = e.originalEvent.dataTransfer.files; + + //We need to send dropped files to Server + SeedDMSUpload.handleFileUpload(files, $(this), $(this)); + }); + + $(document).on('dragenter', '.droptarget', function (e) { + e.stopPropagation(); + e.preventDefault(); + $(e.currentTarget).css('border', '2px dashed #0B85A1'); + }); + $(document).on('dragleave', '.droptarget', function (e) { + e.stopPropagation(); + e.preventDefault(); + $(e.currentTarget).css('border', '0px solid white'); + }); + $(document).on('dragover', '.droptarget', function (e) { + e.stopPropagation(); + e.preventDefault(); + }); + $(document).on('drop', '.droptarget', function (e) { + e.preventDefault(); + e.stopPropagation(); + $(e.currentTarget).css('border', '0px solid white'); + attr_rel = $(e.currentTarget).data('droptarget'); + target_type = attr_rel.split("_")[0]; + target_id = attr_rel.split("_")[1]; + target_name = $(e.currentTarget).data('name')+''; // Force this to be a string + if(target_type == 'folder') { + var files = e.originalEvent.dataTransfer.files; + if(files.length > 0) { +// console.log('Drop '+files.length+' files on '+target_type+' '+target_id); + SeedDMSUpload.handleFileUpload(files,$(e.currentTarget),$('div.statusbar-container h1')/*$(e.currentTarget).find("span")*/); + } else { + var source_info = JSON.parse(e.originalEvent.dataTransfer.getData("text")); + source_type = source_info.type; + source_id = source_info.id; + formtoken = source_info.formtoken; +// console.log('Drop '+source_type+' '+source_id+' on '+target_type+' '+target_id); + if(source_type == 'document') { + var bootbox_message = trans.confirm_move_document; + if(source_info.name) + bootbox_message += "

      "+escapeHtml(source_info.name)+' '+escapeHtml(target_name)+"

      "; + bootbox.dialog({ + "message" : bootbox_message, + "buttons" : { + "cancel" : { + "label" : trans.cancel, + "className" : "btn-secondary", + "callback": function() { + } + }, + "move" : { + "label" : " "+trans.move_document, + "className" : "btn-danger", + "callback": function() { + $.get('../op/op.Ajax.php', + { command: 'movedocument', docid: source_id, targetfolderid: target_id, formtoken: formtoken }, + function(data) { + if(data.success) { + $('#table-row-document-'+source_id).hide('slow'); + noty({ + text: data.message, + type: 'success', + dismissQueue: true, + layout: 'topRight', + theme: 'defaultTheme', + timeout: 1500 + }); + } else { + noty({ + text: data.message, + type: 'error', + dismissQueue: true, + layout: 'topRight', + theme: 'defaultTheme', + timeout: 3500 + }); + } + }, + 'json' + ); + } + } + } + }); + + url = "../out/out.MoveDocument.php?documentid="+source_id+"&targetid="+target_id; + // document.location = url; + } else if(source_type == 'folder' && source_id != target_id) { + var bootbox_message = trans.confirm_move_folder; + if(source_info.name) + bootbox_message += "

      "+escapeHtml(source_info.name)+' '+escapeHtml(target_name)+"

      "; + bootbox.dialog({ + "message" : bootbox_message, + "buttons" : { + "cancel" : { + "label" : trans.cancel, + "className" : "btn-secondary", + "callback": function() { + } + }, + "move" : { + "label" : " "+trans.move_folder, + "className" : "btn-danger", + "callback": function() { + $.get('../op/op.Ajax.php', + { command: 'movefolder', folderid: source_id, targetfolderid: target_id, formtoken: formtoken }, + function(data) { + if(data.success) { + $('#table-row-folder-'+source_id).hide('slow'); + noty({ + text: data.message, + type: 'success', + dismissQueue: true, + layout: 'topRight', + theme: 'defaultTheme', + timeout: 1500 + }); + } else { + noty({ + text: data.message, + type: 'error', + dismissQueue: true, + layout: 'topRight', + theme: 'defaultTheme', + timeout: 3500 + }); + } + }, + 'json' + ); + } + } + } + }); + + url = "../out/out.MoveFolder.php?folderid="+source_id+"&targetid="+target_id; + // document.location = url; + } + } + } else if(target_type == 'document') { + var files = e.originalEvent.dataTransfer.files; + if(files.length > 0) { +// console.log('Drop '+files.length+' files on '+target_type+' '+target_id); + SeedDMSUpload.handleFileUpload(files,$(e.currentTarget),$('div.statusbar-container h1')/*$(e.currentTarget).find("span")*/); + } else { + var source_info = JSON.parse(e.originalEvent.dataTransfer.getData("text")); + source_type = source_info.type; + source_id = source_info.id; + formtoken = source_info.formtoken; +// console.log('Drop '+source_type+' '+source_id+' on '+target_type+' '+target_id); + if(source_type == 'document') { + if(source_id != target_id) { + bootbox.dialog({ + "message" : trans.confirm_transfer_link_document, + "buttons" : { + "cancel" : { + "label" : trans.cancel, + "className" : "btn-secondary", + "callback": function() { + } + }, + "transfer": { + "label" : " "+trans.transfer_content, + "className" : "btn-danger", + "callback": function() { + $.get('../op/op.Ajax.php', + { command: 'transfercontent', docid: source_id, targetdocumentid: target_id, formtoken: formtoken }, + function(data) { + if(data.success) { + $('#table-row-document-'+source_id).hide('slow'); + noty({ + text: data.message, + type: 'success', + dismissQueue: true, + layout: 'topRight', + theme: 'defaultTheme', + timeout: 1500 + }); + } else { + noty({ + text: data.message, + type: 'error', + dismissQueue: true, + layout: 'topRight', + theme: 'defaultTheme', + timeout: 3500 + }); + } + }, + 'json' + ); + } + }, + "link" : { + "label" : trans.link_document, + "className" : "btn-danger", + "callback": function() { + $.get('../op/op.Ajax.php', + { command: 'linkdocument', docid: source_id, targetdocumentid: target_id, formtoken: formtoken }, + function(data) { + if(data.success) { + noty({ + text: data.message, + type: 'success', + dismissQueue: true, + layout: 'topRight', + theme: 'defaultTheme', + timeout: 1500 + }); + } else { + noty({ + text: data.message, + type: 'error', + dismissQueue: true, + layout: 'topRight', + theme: 'defaultTheme', + timeout: 3500 + }); + } + }, + 'json' + ); + } + } + } + }); + } + url = "../out/out.MoveDocument.php?documentid="+source_id+"&targetid="+target_id; + // document.location = url; + } + } + } else if(target_type == 'attachment') { + console.log('attachment'); + var files = e.originalEvent.dataTransfer.files; + if(files.length > 0) { + } + } + }); + $(document).on('dragstart', '.table-row-folder', function (e) { + attr_rel = $(e.target).attr('rel'); + if(typeof attr_rel == 'undefined') + return; + var dragStartInfo = { + id : attr_rel.split("_")[1], + type : "folder", + formtoken : $(e.target).attr('formtoken'), + name: $(e.target).data('name')+'' + }; + /* Currently not used + $.ajax({url: '../out/out.ViewFolder.php', + type: 'GET', + dataType: "json", + data: {action: 'data', folderid: attr_rel.split("_")[1]}, + success: function(data) { + if(data) { + dragStartInfo.source = data; + } + }, + timeout: 3000 + }); + */ + e.originalEvent.dataTransfer.setData("text", JSON.stringify(dragStartInfo)); + }); + + $(document).on('dragstart', '.table-row-document', function (e) { + attr_rel = $(e.target).attr('rel'); + if(typeof attr_rel == 'undefined') + return; + var dragStartInfo = { + id : attr_rel.split("_")[1], + type : "document", + formtoken : $(e.target).attr('formtoken'), + name: $(e.target).data('name')+'' + }; + e.originalEvent.dataTransfer.setData("text", JSON.stringify(dragStartInfo)); + }); + + /* Dropping item on alert below clipboard */ + $(document).on('dragenter', '.add-clipboard-area', function (e) { + e.stopPropagation(); + e.preventDefault(); + $(this).css('border', '2px dashed #0B85A1'); + }); + $(document).on('dragleave', '.add-clipboard-area', function (e) { + $(this).css('border', '0px solid white'); + }); + $(document).on('dragover', '.add-clipboard-area', function (e) { + e.preventDefault(); + }); + $(document).on('drop', '.add-clipboard-area', function (e) { + $(this).css('border', '0px dotted #0B85A1'); + onAddClipboard(e); + }); + + $("#jqtree").on('dragenter', function (e) { + attr_rel = $(e.srcElement).attr('rel'); + if(typeof attr_rel == 'undefined') + return; + $(e.target).parent().css('border', '1px dashed #0B85A1'); + e.stopPropagation(); + e.preventDefault(); + }); + $("#jqtree").on('dragleave', function (e) { + attr_rel = $(e.srcElement).attr('rel'); + if(typeof attr_rel == 'undefined') + return; + $(e.target).parent().css('border', '0px solid white'); + e.stopPropagation(); + e.preventDefault(); + }); + $("#jqtree").on('dragover', function (e) { + e.stopPropagation(); + e.preventDefault(); + }); + $("#jqtree").on('drop', function (e) { + e.stopPropagation(); + e.preventDefault(); + attr_rel = $(e.target).attr('rel'); + if(typeof attr_rel == 'undefined') + return; + $(e.target).parent().css('border', '1px solid white'); + target_type = attr_rel.split("_")[0]; + target_id = attr_rel.split("_")[1]; + var source_info = JSON.parse(e.originalEvent.dataTransfer.getData("text")); + source_type = source_info.type; + source_id = source_info.id; + formtoken = source_info.formtoken; + if(source_type == 'document') { + bootbox.dialog(trans.confirm_move_document, [{ + "label" : " "+trans.move_document, + "class" : "btn-danger", + "callback": function() { + $.get('../op/op.Ajax.php', + { command: 'movedocument', docid: source_id, targetfolderid: target_id, formtoken: formtoken }, + function(data) { + if(data.success) { + $('#table-row-document-'+source_id).hide('slow'); + noty({ + text: data.message, + type: 'success', + dismissQueue: true, + layout: 'topRight', + theme: 'defaultTheme', + timeout: 1500 + }); + } else { + noty({ + text: data.message, + type: 'error', + dismissQueue: true, + layout: 'topRight', + theme: 'defaultTheme', + timeout: 3500 + }); + } + }, + 'json' + ); + } + }, { + "label" : trans.cancel, + "class" : "btn-cancel", + "callback": function() { + } + }]); + + url = "../out/out.MoveDocument.php?documentid="+source_id+"&targetid="+target_id; +// document.location = url; + } else if(source_type == 'folder' && source_id != target_id) { + bootbox.dialog(trans.confirm_move_folder, [{ + "label" : " "+trans.move_folder, + "class" : "btn-danger", + "callback": function() { + $.get('../op/op.Ajax.php', + { command: 'movefolder', folderid: source_id, targetfolderid: target_id, formtoken: formtoken }, + function(data) { + if(data.success) { + $('#table-row-folder-'+source_id).hide('slow'); + noty({ + text: data.message, + type: 'success', + dismissQueue: true, + layout: 'topRight', + theme: 'defaultTheme', + timeout: 1500 + }); + } else { + noty({ + text: data.message, + type: 'error', + dismissQueue: true, + layout: 'topRight', + theme: 'defaultTheme', + timeout: 3500 + }); + } + }, + 'json' + ); + } + }, { + "label" : trans.cancel, + "class" : "btn-cancel", + "callback": function() { + } + }]); + + url = "../out/out.MoveFolder.php?folderid="+source_id+"&targetid="+target_id; +// document.location = url; + } + }); + + $('div.splash').each(function(index) { + var element = $(this); + var msgtype = element.data('type'); + var timeout = element.data('timeout'); + var msg = element.text(); + noty({ + text: msg, + type: msgtype, + dismissQueue: true, + layout: 'topRight', + theme: 'defaultTheme', + timeout: (typeof timeout == 'undefined' ? 1500 : timeout) + }); + }); + + $("body").on("click", "span.openpopupbox", function(e) { + $(""+$(e.target).data("href")).toggle(); + e.stopPropagation(); + }); + $("body").on("click", "span.openpopupbox i", function(e) { + $(e.target).parent().click(); + }); + $("body").on("click", "span.openpopupbox span", function(e) { + $(e.target).parent().click(); + }); + $("body").on("click", "span.closepopupbox", function(e) { + $(this).parent().hide(); + e.stopPropagation(); + }); + + $("body").on("mouseenter", "#main-menu-dropfolderlist div.dropdown-menu a", function(e) { + $(e.currentTarget).find('.dropfolder-menu-img').css('display', 'inline'); + }); + $("body").on("mouseleave", "#main-menu-dropfolderlist div.dropdown-menu a", function(e) { + $(e.currentTarget).find('.dropfolder-menu-img').hide(); + }); + +}); /* }}} */ + +$(document).ready(function() { /* {{{ */ + $('body').on('click.modal.data-api', '[data-toggle="modal"]', function(){ + $($(this).data("target")+' .modal-body').load($(this).attr('href')); + }); +}); /* }}} */ + +(function( SeedDMSTask, $, undefined ) { /* {{{ */ + var approval_count, review_count, workflow_count; + var timeout = 1000; + var counter = 0; + var tasks = Array( + {name: 'checktasks', interval: 15, func: + checkTasks = function() { + $.ajax({url: '../out/out.Tasks.php', + type: 'GET', + dataType: "json", + data: {action: 'mytasks'}, + success: function(data) { + if(data) { + if((typeof data.data.approval != 'undefined' && approval_count != data.data.approval.length) || + (typeof data.data.review != 'undefined' && review_count != data.data.review.length) || + (typeof data.data.workflow != 'undefined' && workflow_count != data.data.workflow.length)) { + // $("#menu-tasks").html('Loading').hide().load('../out/out.Tasks.php?action=menutasks').fadeIn('500') + $('#menu-tasks > div.ajax').trigger('update', {folderid: seeddms_folder}); + approval_count = typeof data.data.approval != 'undefined' ? data.data.approval.length : 0; + review_count = typeof data.data.review != 'undefined' ? data.data.review.length : 0; + workflow_count = typeof data.data.workflow != 'undefined' ? data.data.workflow.length : 0; + } + } + }, + timeout: 3000 + }); + } + } + ); + + SeedDMSTask.add = function(task) { + tasks.push(task); + } + + SeedDMSTask.run = function() { + for(let task of tasks) { + if(counter % task.interval == 0) { +// console.log("Running task '" + task.name + "'"); + task.func(); + } + } + //console.log(counter); + counter++; + timeOutId = setTimeout(SeedDMSTask.run, timeout); + } +}( window.SeedDMSTask = window.SeedDMSTask || {}, jQuery )); /* }}} */ diff --git a/views/bootstrap4/styles/seeddms.css b/views/bootstrap4/styles/seeddms.css new file mode 100644 index 000000000..ea7146ca8 --- /dev/null +++ b/views/bootstrap4/styles/seeddms.css @@ -0,0 +1,10899 @@ +/*! `SeedDMS` Bootstrap 4 theme */ +/* +@import url(https://fonts.googleapis.com/css?family=Nunito:200,300,400,700); +$font-family-base: "Nunito"; +*/ +@import url(https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,300,400,700); +@import url(https://fonts.googleapis.com/css?family=Crete+Round:200,300,400,700); +/* +$theme-colors: ( + "primary": #04c, + "danger": #ff4136, + "custom-color": #900 +); +*/ +/*! + * Bootstrap v4.5.2 (https://getbootstrap.com/) + * Copyright 2011-2020 The Bootstrap Authors + * Copyright 2011-2020 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +:root { + --blue: #007bff; + --indigo: #6610f2; + --purple: #6f42c1; + --pink: #e83e8c; + --red: #dc3545; + --orange: #fd7e14; + --yellow: #ffc107; + --green: #28a745; + --teal: #20c997; + --cyan: #17a2b8; + --white: #fff; + --gray: #6c757d; + --gray-dark: #343a40; + --primary: #083358; + --secondary: #b8b8b8; + --success: #008a29; + --info: #74dbef; + --warning: #e6d200; + --danger: #e13737; + --light: #f4f4f4; + --dark: #072247; + --breakpoint-xs: 0; + --breakpoint-sm: 576px; + --breakpoint-md: 768px; + --breakpoint-lg: 992px; + --breakpoint-xl: 1200px; + --font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; +} + +*, +*::before, +*::after { + box-sizing: border-box; +} + +html { + font-family: sans-serif; + line-height: 1.15; + -webkit-text-size-adjust: 100%; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} + +article, aside, figcaption, figure, footer, header, hgroup, main, nav, section { + display: block; +} + +body { + margin: 0; + font-family: "Source Sans Pro"; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #212529; + text-align: left; + background-color: #fff; +} + +[tabindex="-1"]:focus:not(:focus-visible) { + outline: 0 !important; +} + +hr { + box-sizing: content-box; + height: 0; + overflow: visible; +} + +h1, h2, h3, h4, h5, h6 { + margin-top: 0; + margin-bottom: 0.25rem; +} + +p { + margin-top: 0; + margin-bottom: 1rem; +} + +abbr[title], +abbr[data-original-title] { + text-decoration: underline; + text-decoration: underline dotted; + cursor: help; + border-bottom: 0; + text-decoration-skip-ink: none; +} + +address { + margin-bottom: 1rem; + font-style: normal; + line-height: inherit; +} + +ol, +ul, +dl { + margin-top: 0; + margin-bottom: 1rem; +} + +ol ol, +ul ul, +ol ul, +ul ol { + margin-bottom: 0; +} + +dt { + font-weight: 700; +} + +dd { + margin-bottom: .5rem; + margin-left: 0; +} + +blockquote { + margin: 0 0 1rem; +} + +b, +strong { + font-weight: bolder; +} + +small { + font-size: 80%; +} + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} + +sub { + bottom: -.25em; +} + +sup { + top: -.5em; +} + +a { + color: #083358; + text-decoration: none; + background-color: transparent; +} + +a:hover { + color: #020a12; + text-decoration: underline; +} + +a:not([href]):not([class]) { + color: inherit; + text-decoration: none; +} + +a:not([href]):not([class]):hover { + color: inherit; + text-decoration: none; +} + +pre, +code, +kbd, +samp { + font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + font-size: 1em; +} + +pre { + margin-top: 0; + margin-bottom: 1rem; + overflow: auto; + -ms-overflow-style: scrollbar; +} + +figure { + margin: 0 0 1rem; +} + +img { + vertical-align: middle; + border-style: none; +} + +svg { + overflow: hidden; + vertical-align: middle; +} + +table { + border-collapse: collapse; +} + +caption { + padding-top: 0.75rem; + padding-bottom: 0.75rem; + color: #6c757d; + text-align: left; + caption-side: bottom; +} + +th { + text-align: inherit; +} + +label { + display: inline-block; + margin-bottom: 0.5rem; +} + +button { + border-radius: 0; +} + +button:focus { + outline: 1px dotted; + outline: 5px auto -webkit-focus-ring-color; +} + +input, +button, +select, +optgroup, +textarea { + margin: 0; + font-family: inherit; + font-size: inherit; + line-height: inherit; +} + +button, +input { + overflow: visible; +} + +button, +select { + text-transform: none; +} + +[role="button"] { + cursor: pointer; +} + +select { + word-wrap: normal; +} + +button, +[type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; +} + +button:not(:disabled), +[type="button"]:not(:disabled), +[type="reset"]:not(:disabled), +[type="submit"]:not(:disabled) { + cursor: pointer; +} + +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + padding: 0; + border-style: none; +} + +input[type="radio"], +input[type="checkbox"] { + box-sizing: border-box; + padding: 0; +} + +textarea { + overflow: auto; + resize: vertical; +} + +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} + +legend { + display: block; + width: 100%; + max-width: 100%; + padding: 0; + margin-bottom: .5rem; + font-size: 1.5rem; + line-height: inherit; + color: inherit; + white-space: normal; +} + +progress { + vertical-align: baseline; +} + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +[type="search"] { + outline-offset: -2px; + -webkit-appearance: none; +} + +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +::-webkit-file-upload-button { + font: inherit; + -webkit-appearance: button; +} + +output { + display: inline-block; +} + +summary { + display: list-item; + cursor: pointer; +} + +template { + display: none; +} + +[hidden] { + display: none !important; +} + +h1, h2, h3, h4, h5, h6, +.h1, .h2, .h3, .h4, .h5, .h6 { + margin-bottom: 0.25rem; + font-family: "Crete Round"; + font-weight: 500; + line-height: 1.2; +} + +h1, .h1 { + font-size: 2.5rem; +} + +h2, .h2 { + font-size: 2rem; +} + +h3, .h3 { + font-size: 1.75rem; +} + +h4, .h4 { + font-size: 1.5rem; +} + +h5, .h5 { + font-size: 1.25rem; +} + +h6, .h6 { + font-size: 1rem; +} + +.lead { + font-size: 1.25rem; + font-weight: 300; +} + +.display-1 { + font-size: 6rem; + font-weight: 300; + line-height: 1.2; +} + +.display-2 { + font-size: 5.5rem; + font-weight: 300; + line-height: 1.2; +} + +.display-3 { + font-size: 4.5rem; + font-weight: 300; + line-height: 1.2; +} + +.display-4 { + font-size: 3.5rem; + font-weight: 300; + line-height: 1.2; +} + +hr { + margin-top: 0.5rem; + margin-bottom: 0.5rem; + border: 0; + border-top: 1px solid rgba(0, 0, 0, 0.1); +} + +small, +.small { + font-size: 80%; + font-weight: 400; +} + +mark, +.mark { + padding: 0.2em; + background-color: #fcf8e3; +} + +.list-unstyled { + padding-left: 0; + list-style: none; +} + +.list-inline { + padding-left: 0; + list-style: none; +} + +.list-inline-item { + display: inline-block; +} + +.list-inline-item:not(:last-child) { + margin-right: 0.5rem; +} + +.initialism { + font-size: 90%; + text-transform: uppercase; +} + +.blockquote { + margin-bottom: 0.5rem; + font-size: 1.25rem; +} + +.blockquote-footer { + display: block; + font-size: 80%; + color: #6c757d; +} + +.blockquote-footer::before { + content: "\2014\00A0"; +} + +.img-fluid { + max-width: 100%; + height: auto; +} + +.img-thumbnail { + padding: 0.25rem; + background-color: #fff; + border: 1px solid #dee2e6; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); + max-width: 100%; + height: auto; +} + +.figure { + display: inline-block; +} + +.figure-img { + margin-bottom: 0.25rem; + line-height: 1; +} + +.figure-caption { + font-size: 90%; + color: #6c757d; +} + +code { + font-size: 87.5%; + color: #e83e8c; + word-wrap: break-word; +} + +a > code { + color: inherit; +} + +kbd { + padding: 0.2rem 0.4rem; + font-size: 87.5%; + color: #fff; + background-color: #212529; + box-shadow: inset 0 -0.1rem 0 rgba(0, 0, 0, 0.25); +} + +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: 700; + box-shadow: none; +} + +pre { + display: block; + font-size: 87.5%; + color: #212529; +} + +pre code { + font-size: inherit; + color: inherit; + word-break: normal; +} + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} + +.container, +.container-fluid, +.container-sm, +.container-md, +.container-lg, +.container-xl { + width: 100%; + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} + +@media (min-width: 576px) { + .container, .container-sm { + max-width: 540px; + } +} + +@media (min-width: 768px) { + .container, .container-sm, .container-md { + max-width: 720px; + } +} + +@media (min-width: 992px) { + .container, .container-sm, .container-md, .container-lg { + max-width: 960px; + } +} + +@media (min-width: 1200px) { + .container, .container-sm, .container-md, .container-lg, .container-xl { + max-width: 1140px; + } +} + +.row { + display: flex; + flex-wrap: wrap; + margin-right: -15px; + margin-left: -15px; +} + +.no-gutters { + margin-right: 0; + margin-left: 0; +} + +.no-gutters > .col, +.no-gutters > [class*="col-"] { + padding-right: 0; + padding-left: 0; +} + +.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col, +.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm, +.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md, +.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg, +.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl, +.col-xl-auto { + position: relative; + width: 100%; + padding-right: 15px; + padding-left: 15px; +} + +.col { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; +} + +.row-cols-1 > * { + flex: 0 0 100%; + max-width: 100%; +} + +.row-cols-2 > * { + flex: 0 0 50%; + max-width: 50%; +} + +.row-cols-3 > * { + flex: 0 0 33.333333%; + max-width: 33.333333%; +} + +.row-cols-4 > * { + flex: 0 0 25%; + max-width: 25%; +} + +.row-cols-5 > * { + flex: 0 0 20%; + max-width: 20%; +} + +.row-cols-6 > * { + flex: 0 0 16.666667%; + max-width: 16.666667%; +} + +.col-auto { + flex: 0 0 auto; + width: auto; + max-width: 100%; +} + +.col-1 { + flex: 0 0 8.333333%; + max-width: 8.333333%; +} + +.col-2 { + flex: 0 0 16.666667%; + max-width: 16.666667%; +} + +.col-3 { + flex: 0 0 25%; + max-width: 25%; +} + +.col-4 { + flex: 0 0 33.333333%; + max-width: 33.333333%; +} + +.col-5 { + flex: 0 0 41.666667%; + max-width: 41.666667%; +} + +.col-6 { + flex: 0 0 50%; + max-width: 50%; +} + +.col-7 { + flex: 0 0 58.333333%; + max-width: 58.333333%; +} + +.col-8 { + flex: 0 0 66.666667%; + max-width: 66.666667%; +} + +.col-9 { + flex: 0 0 75%; + max-width: 75%; +} + +.col-10 { + flex: 0 0 83.333333%; + max-width: 83.333333%; +} + +.col-11 { + flex: 0 0 91.666667%; + max-width: 91.666667%; +} + +.col-12 { + flex: 0 0 100%; + max-width: 100%; +} + +.order-first { + order: -1; +} + +.order-last { + order: 13; +} + +.order-0 { + order: 0; +} + +.order-1 { + order: 1; +} + +.order-2 { + order: 2; +} + +.order-3 { + order: 3; +} + +.order-4 { + order: 4; +} + +.order-5 { + order: 5; +} + +.order-6 { + order: 6; +} + +.order-7 { + order: 7; +} + +.order-8 { + order: 8; +} + +.order-9 { + order: 9; +} + +.order-10 { + order: 10; +} + +.order-11 { + order: 11; +} + +.order-12 { + order: 12; +} + +.offset-1 { + margin-left: 8.333333%; +} + +.offset-2 { + margin-left: 16.666667%; +} + +.offset-3 { + margin-left: 25%; +} + +.offset-4 { + margin-left: 33.333333%; +} + +.offset-5 { + margin-left: 41.666667%; +} + +.offset-6 { + margin-left: 50%; +} + +.offset-7 { + margin-left: 58.333333%; +} + +.offset-8 { + margin-left: 66.666667%; +} + +.offset-9 { + margin-left: 75%; +} + +.offset-10 { + margin-left: 83.333333%; +} + +.offset-11 { + margin-left: 91.666667%; +} + +@media (min-width: 576px) { + .col-sm { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; + } + .row-cols-sm-1 > * { + flex: 0 0 100%; + max-width: 100%; + } + .row-cols-sm-2 > * { + flex: 0 0 50%; + max-width: 50%; + } + .row-cols-sm-3 > * { + flex: 0 0 33.333333%; + max-width: 33.333333%; + } + .row-cols-sm-4 > * { + flex: 0 0 25%; + max-width: 25%; + } + .row-cols-sm-5 > * { + flex: 0 0 20%; + max-width: 20%; + } + .row-cols-sm-6 > * { + flex: 0 0 16.666667%; + max-width: 16.666667%; + } + .col-sm-auto { + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + .col-sm-1 { + flex: 0 0 8.333333%; + max-width: 8.333333%; + } + .col-sm-2 { + flex: 0 0 16.666667%; + max-width: 16.666667%; + } + .col-sm-3 { + flex: 0 0 25%; + max-width: 25%; + } + .col-sm-4 { + flex: 0 0 33.333333%; + max-width: 33.333333%; + } + .col-sm-5 { + flex: 0 0 41.666667%; + max-width: 41.666667%; + } + .col-sm-6 { + flex: 0 0 50%; + max-width: 50%; + } + .col-sm-7 { + flex: 0 0 58.333333%; + max-width: 58.333333%; + } + .col-sm-8 { + flex: 0 0 66.666667%; + max-width: 66.666667%; + } + .col-sm-9 { + flex: 0 0 75%; + max-width: 75%; + } + .col-sm-10 { + flex: 0 0 83.333333%; + max-width: 83.333333%; + } + .col-sm-11 { + flex: 0 0 91.666667%; + max-width: 91.666667%; + } + .col-sm-12 { + flex: 0 0 100%; + max-width: 100%; + } + .order-sm-first { + order: -1; + } + .order-sm-last { + order: 13; + } + .order-sm-0 { + order: 0; + } + .order-sm-1 { + order: 1; + } + .order-sm-2 { + order: 2; + } + .order-sm-3 { + order: 3; + } + .order-sm-4 { + order: 4; + } + .order-sm-5 { + order: 5; + } + .order-sm-6 { + order: 6; + } + .order-sm-7 { + order: 7; + } + .order-sm-8 { + order: 8; + } + .order-sm-9 { + order: 9; + } + .order-sm-10 { + order: 10; + } + .order-sm-11 { + order: 11; + } + .order-sm-12 { + order: 12; + } + .offset-sm-0 { + margin-left: 0; + } + .offset-sm-1 { + margin-left: 8.333333%; + } + .offset-sm-2 { + margin-left: 16.666667%; + } + .offset-sm-3 { + margin-left: 25%; + } + .offset-sm-4 { + margin-left: 33.333333%; + } + .offset-sm-5 { + margin-left: 41.666667%; + } + .offset-sm-6 { + margin-left: 50%; + } + .offset-sm-7 { + margin-left: 58.333333%; + } + .offset-sm-8 { + margin-left: 66.666667%; + } + .offset-sm-9 { + margin-left: 75%; + } + .offset-sm-10 { + margin-left: 83.333333%; + } + .offset-sm-11 { + margin-left: 91.666667%; + } +} + +@media (min-width: 768px) { + .col-md { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; + } + .row-cols-md-1 > * { + flex: 0 0 100%; + max-width: 100%; + } + .row-cols-md-2 > * { + flex: 0 0 50%; + max-width: 50%; + } + .row-cols-md-3 > * { + flex: 0 0 33.333333%; + max-width: 33.333333%; + } + .row-cols-md-4 > * { + flex: 0 0 25%; + max-width: 25%; + } + .row-cols-md-5 > * { + flex: 0 0 20%; + max-width: 20%; + } + .row-cols-md-6 > * { + flex: 0 0 16.666667%; + max-width: 16.666667%; + } + .col-md-auto { + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + .col-md-1 { + flex: 0 0 8.333333%; + max-width: 8.333333%; + } + .col-md-2 { + flex: 0 0 16.666667%; + max-width: 16.666667%; + } + .col-md-3 { + flex: 0 0 25%; + max-width: 25%; + } + .col-md-4 { + flex: 0 0 33.333333%; + max-width: 33.333333%; + } + .col-md-5 { + flex: 0 0 41.666667%; + max-width: 41.666667%; + } + .col-md-6 { + flex: 0 0 50%; + max-width: 50%; + } + .col-md-7 { + flex: 0 0 58.333333%; + max-width: 58.333333%; + } + .col-md-8 { + flex: 0 0 66.666667%; + max-width: 66.666667%; + } + .col-md-9 { + flex: 0 0 75%; + max-width: 75%; + } + .col-md-10 { + flex: 0 0 83.333333%; + max-width: 83.333333%; + } + .col-md-11 { + flex: 0 0 91.666667%; + max-width: 91.666667%; + } + .col-md-12 { + flex: 0 0 100%; + max-width: 100%; + } + .order-md-first { + order: -1; + } + .order-md-last { + order: 13; + } + .order-md-0 { + order: 0; + } + .order-md-1 { + order: 1; + } + .order-md-2 { + order: 2; + } + .order-md-3 { + order: 3; + } + .order-md-4 { + order: 4; + } + .order-md-5 { + order: 5; + } + .order-md-6 { + order: 6; + } + .order-md-7 { + order: 7; + } + .order-md-8 { + order: 8; + } + .order-md-9 { + order: 9; + } + .order-md-10 { + order: 10; + } + .order-md-11 { + order: 11; + } + .order-md-12 { + order: 12; + } + .offset-md-0 { + margin-left: 0; + } + .offset-md-1 { + margin-left: 8.333333%; + } + .offset-md-2 { + margin-left: 16.666667%; + } + .offset-md-3 { + margin-left: 25%; + } + .offset-md-4 { + margin-left: 33.333333%; + } + .offset-md-5 { + margin-left: 41.666667%; + } + .offset-md-6 { + margin-left: 50%; + } + .offset-md-7 { + margin-left: 58.333333%; + } + .offset-md-8 { + margin-left: 66.666667%; + } + .offset-md-9 { + margin-left: 75%; + } + .offset-md-10 { + margin-left: 83.333333%; + } + .offset-md-11 { + margin-left: 91.666667%; + } +} + +@media (min-width: 992px) { + .col-lg { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; + } + .row-cols-lg-1 > * { + flex: 0 0 100%; + max-width: 100%; + } + .row-cols-lg-2 > * { + flex: 0 0 50%; + max-width: 50%; + } + .row-cols-lg-3 > * { + flex: 0 0 33.333333%; + max-width: 33.333333%; + } + .row-cols-lg-4 > * { + flex: 0 0 25%; + max-width: 25%; + } + .row-cols-lg-5 > * { + flex: 0 0 20%; + max-width: 20%; + } + .row-cols-lg-6 > * { + flex: 0 0 16.666667%; + max-width: 16.666667%; + } + .col-lg-auto { + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + .col-lg-1 { + flex: 0 0 8.333333%; + max-width: 8.333333%; + } + .col-lg-2 { + flex: 0 0 16.666667%; + max-width: 16.666667%; + } + .col-lg-3 { + flex: 0 0 25%; + max-width: 25%; + } + .col-lg-4 { + flex: 0 0 33.333333%; + max-width: 33.333333%; + } + .col-lg-5 { + flex: 0 0 41.666667%; + max-width: 41.666667%; + } + .col-lg-6 { + flex: 0 0 50%; + max-width: 50%; + } + .col-lg-7 { + flex: 0 0 58.333333%; + max-width: 58.333333%; + } + .col-lg-8 { + flex: 0 0 66.666667%; + max-width: 66.666667%; + } + .col-lg-9 { + flex: 0 0 75%; + max-width: 75%; + } + .col-lg-10 { + flex: 0 0 83.333333%; + max-width: 83.333333%; + } + .col-lg-11 { + flex: 0 0 91.666667%; + max-width: 91.666667%; + } + .col-lg-12 { + flex: 0 0 100%; + max-width: 100%; + } + .order-lg-first { + order: -1; + } + .order-lg-last { + order: 13; + } + .order-lg-0 { + order: 0; + } + .order-lg-1 { + order: 1; + } + .order-lg-2 { + order: 2; + } + .order-lg-3 { + order: 3; + } + .order-lg-4 { + order: 4; + } + .order-lg-5 { + order: 5; + } + .order-lg-6 { + order: 6; + } + .order-lg-7 { + order: 7; + } + .order-lg-8 { + order: 8; + } + .order-lg-9 { + order: 9; + } + .order-lg-10 { + order: 10; + } + .order-lg-11 { + order: 11; + } + .order-lg-12 { + order: 12; + } + .offset-lg-0 { + margin-left: 0; + } + .offset-lg-1 { + margin-left: 8.333333%; + } + .offset-lg-2 { + margin-left: 16.666667%; + } + .offset-lg-3 { + margin-left: 25%; + } + .offset-lg-4 { + margin-left: 33.333333%; + } + .offset-lg-5 { + margin-left: 41.666667%; + } + .offset-lg-6 { + margin-left: 50%; + } + .offset-lg-7 { + margin-left: 58.333333%; + } + .offset-lg-8 { + margin-left: 66.666667%; + } + .offset-lg-9 { + margin-left: 75%; + } + .offset-lg-10 { + margin-left: 83.333333%; + } + .offset-lg-11 { + margin-left: 91.666667%; + } +} + +@media (min-width: 1200px) { + .col-xl { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; + } + .row-cols-xl-1 > * { + flex: 0 0 100%; + max-width: 100%; + } + .row-cols-xl-2 > * { + flex: 0 0 50%; + max-width: 50%; + } + .row-cols-xl-3 > * { + flex: 0 0 33.333333%; + max-width: 33.333333%; + } + .row-cols-xl-4 > * { + flex: 0 0 25%; + max-width: 25%; + } + .row-cols-xl-5 > * { + flex: 0 0 20%; + max-width: 20%; + } + .row-cols-xl-6 > * { + flex: 0 0 16.666667%; + max-width: 16.666667%; + } + .col-xl-auto { + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + .col-xl-1 { + flex: 0 0 8.333333%; + max-width: 8.333333%; + } + .col-xl-2 { + flex: 0 0 16.666667%; + max-width: 16.666667%; + } + .col-xl-3 { + flex: 0 0 25%; + max-width: 25%; + } + .col-xl-4 { + flex: 0 0 33.333333%; + max-width: 33.333333%; + } + .col-xl-5 { + flex: 0 0 41.666667%; + max-width: 41.666667%; + } + .col-xl-6 { + flex: 0 0 50%; + max-width: 50%; + } + .col-xl-7 { + flex: 0 0 58.333333%; + max-width: 58.333333%; + } + .col-xl-8 { + flex: 0 0 66.666667%; + max-width: 66.666667%; + } + .col-xl-9 { + flex: 0 0 75%; + max-width: 75%; + } + .col-xl-10 { + flex: 0 0 83.333333%; + max-width: 83.333333%; + } + .col-xl-11 { + flex: 0 0 91.666667%; + max-width: 91.666667%; + } + .col-xl-12 { + flex: 0 0 100%; + max-width: 100%; + } + .order-xl-first { + order: -1; + } + .order-xl-last { + order: 13; + } + .order-xl-0 { + order: 0; + } + .order-xl-1 { + order: 1; + } + .order-xl-2 { + order: 2; + } + .order-xl-3 { + order: 3; + } + .order-xl-4 { + order: 4; + } + .order-xl-5 { + order: 5; + } + .order-xl-6 { + order: 6; + } + .order-xl-7 { + order: 7; + } + .order-xl-8 { + order: 8; + } + .order-xl-9 { + order: 9; + } + .order-xl-10 { + order: 10; + } + .order-xl-11 { + order: 11; + } + .order-xl-12 { + order: 12; + } + .offset-xl-0 { + margin-left: 0; + } + .offset-xl-1 { + margin-left: 8.333333%; + } + .offset-xl-2 { + margin-left: 16.666667%; + } + .offset-xl-3 { + margin-left: 25%; + } + .offset-xl-4 { + margin-left: 33.333333%; + } + .offset-xl-5 { + margin-left: 41.666667%; + } + .offset-xl-6 { + margin-left: 50%; + } + .offset-xl-7 { + margin-left: 58.333333%; + } + .offset-xl-8 { + margin-left: 66.666667%; + } + .offset-xl-9 { + margin-left: 75%; + } + .offset-xl-10 { + margin-left: 83.333333%; + } + .offset-xl-11 { + margin-left: 91.666667%; + } +} + +.table { + width: 100%; + margin-bottom: 0.5rem; + color: #212529; +} + +.table th, +.table td { + padding: 0.75rem; + vertical-align: top; + border-top: 1px solid #e3e3e3; +} + +.table thead th { + vertical-align: bottom; + border-bottom: 2px solid #e3e3e3; +} + +.table tbody + tbody { + border-top: 2px solid #e3e3e3; +} + +.table-sm th, +.table-sm td { + padding: 0.3rem; +} + +.table-bordered { + border: 1px solid #e3e3e3; +} + +.table-bordered th, +.table-bordered td { + border: 1px solid #e3e3e3; +} + +.table-bordered thead th, +.table-bordered thead td { + border-bottom-width: 2px; +} + +.table-borderless th, +.table-borderless td, +.table-borderless thead th, +.table-borderless tbody + tbody { + border: 0; +} + +.table-striped tbody tr:nth-of-type(odd) { + background-color: rgba(0, 0, 0, 0.05); +} + +.table-hover tbody tr:hover { + color: #212529; + background-color: rgba(0, 0, 0, 0.075); +} + +.table-primary, +.table-primary > th, +.table-primary > td { + background-color: #bac6d0; +} + +.table-primary th, +.table-primary td, +.table-primary thead th, +.table-primary tbody + tbody { + border-color: #7f95a8; +} + +.table-hover .table-primary:hover { + background-color: #abb9c6; +} + +.table-hover .table-primary:hover > td, +.table-hover .table-primary:hover > th { + background-color: #abb9c6; +} + +.table-secondary, +.table-secondary > th, +.table-secondary > td { + background-color: #ebebeb; +} + +.table-secondary th, +.table-secondary td, +.table-secondary thead th, +.table-secondary tbody + tbody { + border-color: #dadada; +} + +.table-hover .table-secondary:hover { + background-color: #dedede; +} + +.table-hover .table-secondary:hover > td, +.table-hover .table-secondary:hover > th { + background-color: #dedede; +} + +.table-success, +.table-success > th, +.table-success > td { + background-color: #b8dec3; +} + +.table-success th, +.table-success td, +.table-success thead th, +.table-success tbody + tbody { + border-color: #7ac290; +} + +.table-hover .table-success:hover { + background-color: #a7d6b4; +} + +.table-hover .table-success:hover > td, +.table-hover .table-success:hover > th { + background-color: #a7d6b4; +} + +.table-info, +.table-info > th, +.table-info > td { + background-color: #d8f5fb; +} + +.table-info th, +.table-info td, +.table-info thead th, +.table-info tbody + tbody { + border-color: #b7ecf7; +} + +.table-hover .table-info:hover { + background-color: #c1eff9; +} + +.table-hover .table-info:hover > td, +.table-hover .table-info:hover > th { + background-color: #c1eff9; +} + +.table-warning, +.table-warning > th, +.table-warning > td { + background-color: #f8f2b8; +} + +.table-warning th, +.table-warning td, +.table-warning thead th, +.table-warning tbody + tbody { + border-color: #f2e87a; +} + +.table-hover .table-warning:hover { + background-color: #f6eea1; +} + +.table-hover .table-warning:hover > td, +.table-hover .table-warning:hover > th { + background-color: #f6eea1; +} + +.table-danger, +.table-danger > th, +.table-danger > td { + background-color: #f7c7c7; +} + +.table-danger th, +.table-danger td, +.table-danger thead th, +.table-danger tbody + tbody { + border-color: #ef9797; +} + +.table-hover .table-danger:hover { + background-color: #f4b1b1; +} + +.table-hover .table-danger:hover > td, +.table-hover .table-danger:hover > th { + background-color: #f4b1b1; +} + +.table-light, +.table-light > th, +.table-light > td { + background-color: #fcfcfc; +} + +.table-light th, +.table-light td, +.table-light thead th, +.table-light tbody + tbody { + border-color: #f9f9f9; +} + +.table-hover .table-light:hover { + background-color: #efefef; +} + +.table-hover .table-light:hover > td, +.table-hover .table-light:hover > th { + background-color: #efefef; +} + +.table-dark, +.table-dark > th, +.table-dark > td { + background-color: #bac1cb; +} + +.table-dark th, +.table-dark td, +.table-dark thead th, +.table-dark tbody + tbody { + border-color: #7e8c9f; +} + +.table-hover .table-dark:hover { + background-color: #abb4c0; +} + +.table-hover .table-dark:hover > td, +.table-hover .table-dark:hover > th { + background-color: #abb4c0; +} + +.table-active, +.table-active > th, +.table-active > td { + background-color: rgba(0, 0, 0, 0.075); +} + +.table-hover .table-active:hover { + background-color: rgba(0, 0, 0, 0.075); +} + +.table-hover .table-active:hover > td, +.table-hover .table-active:hover > th { + background-color: rgba(0, 0, 0, 0.075); +} + +.table .thead-dark th { + color: #fff; + background-color: #343a40; + border-color: #454d55; +} + +.table .thead-light th { + color: #495057; + background-color: #e9ecef; + border-color: #e3e3e3; +} + +.table-dark { + color: #fff; + background-color: #343a40; +} + +.table-dark th, +.table-dark td, +.table-dark thead th { + border-color: #454d55; +} + +.table-dark.table-bordered { + border: 0; +} + +.table-dark.table-striped tbody tr:nth-of-type(odd) { + background-color: rgba(255, 255, 255, 0.05); +} + +.table-dark.table-hover tbody tr:hover { + color: #fff; + background-color: rgba(255, 255, 255, 0.075); +} + +@media (max-width: 575.98px) { + .table-responsive-sm { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } + .table-responsive-sm > .table-bordered { + border: 0; + } +} + +@media (max-width: 767.98px) { + .table-responsive-md { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } + .table-responsive-md > .table-bordered { + border: 0; + } +} + +@media (max-width: 991.98px) { + .table-responsive-lg { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } + .table-responsive-lg > .table-bordered { + border: 0; + } +} + +@media (max-width: 1199.98px) { + .table-responsive-xl { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } + .table-responsive-xl > .table-bordered { + border: 0; + } +} + +.table-responsive { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; +} + +.table-responsive > .table-bordered { + border: 0; +} + +.form-control { + display: block; + width: 100%; + height: calc(1.5em + 0.75rem + 2px); + padding: 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #495057; + background-color: #fff; + background-clip: padding-box; + border: 1px solid #ced4da; + border-radius: 0; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} + +@media (prefers-reduced-motion: reduce) { + .form-control { + transition: none; + } +} + +.form-control::-ms-expand { + background-color: transparent; + border: 0; +} + +.form-control:-moz-focusring { + color: transparent; + text-shadow: 0 0 0 #495057; +} + +.form-control:focus { + color: #495057; + background-color: #fff; + border-color: #1377cd; + outline: 0; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 0 0.2rem rgba(8, 51, 88, 0.25); +} + +.form-control::placeholder { + color: #6c757d; + opacity: 1; +} + +.form-control:disabled, .form-control[readonly] { + background-color: #e9ecef; + opacity: 1; +} + +input[type="date"].form-control, +input[type="time"].form-control, +input[type="datetime-local"].form-control, +input[type="month"].form-control { + appearance: none; +} + +select.form-control:focus::-ms-value { + color: #495057; + background-color: #fff; +} + +.form-control-file, +.form-control-range { + display: block; + width: 100%; +} + +.col-form-label { + padding-top: calc(0.375rem + 1px); + padding-bottom: calc(0.375rem + 1px); + margin-bottom: 0; + font-size: inherit; + line-height: 1.5; +} + +.col-form-label-lg { + padding-top: calc(0.5rem + 1px); + padding-bottom: calc(0.5rem + 1px); + font-size: 1.25rem; + line-height: 1.5; +} + +.col-form-label-sm { + padding-top: calc(0.25rem + 1px); + padding-bottom: calc(0.25rem + 1px); + font-size: 0.875rem; + line-height: 1.5; +} + +.form-control-plaintext { + display: block; + width: 100%; + padding: 0.375rem 0; + margin-bottom: 0; + font-size: 1rem; + line-height: 1.5; + color: #212529; + background-color: transparent; + border: solid transparent; + border-width: 1px 0; +} + +.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg { + padding-right: 0; + padding-left: 0; +} + +.form-control-sm { + height: calc(1.5em + 0.5rem + 2px); + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; +} + +.form-control-lg { + height: calc(1.5em + 1rem + 2px); + padding: 0.5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; +} + +select.form-control[size], select.form-control[multiple] { + height: auto; +} + +textarea.form-control { + height: auto; +} + +.form-group { + margin-bottom: 1rem; +} + +.form-text { + display: block; + margin-top: 0.25rem; +} + +.form-row { + display: flex; + flex-wrap: wrap; + margin-right: -5px; + margin-left: -5px; +} + +.form-row > .col, +.form-row > [class*="col-"] { + padding-right: 5px; + padding-left: 5px; +} + +.form-check { + position: relative; + display: block; + padding-left: 1.25rem; +} + +.form-check-input { + position: absolute; + margin-top: 0.3rem; + margin-left: -1.25rem; +} + +.form-check-input[disabled] ~ .form-check-label, +.form-check-input:disabled ~ .form-check-label { + color: #6c757d; +} + +.form-check-label { + margin-bottom: 0; +} + +.form-check-inline { + display: inline-flex; + align-items: center; + padding-left: 0; + margin-right: 0.75rem; +} + +.form-check-inline .form-check-input { + position: static; + margin-top: 0; + margin-right: 0.3125rem; + margin-left: 0; +} + +.valid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 80%; + color: #008a29; +} + +.valid-tooltip { + position: absolute; + top: 100%; + left: 0; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: .1rem; + font-size: 0.875rem; + line-height: 1.5; + color: #fff; + background-color: rgba(0, 138, 41, 0.9); +} + +.was-validated :valid ~ .valid-feedback, +.was-validated :valid ~ .valid-tooltip, +.is-valid ~ .valid-feedback, +.is-valid ~ .valid-tooltip { + display: block; +} + +.was-validated .form-control:valid, .form-control.is-valid { + border-color: #008a29; + padding-right: calc(1.5em + 0.75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%23008a29' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right calc(0.375em + 0.1875rem) center; + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} + +.was-validated .form-control:valid:focus, .form-control.is-valid:focus { + border-color: #008a29; + box-shadow: 0 0 0 0.2rem rgba(0, 138, 41, 0.25); +} + +.was-validated textarea.form-control:valid, textarea.form-control.is-valid { + padding-right: calc(1.5em + 0.75rem); + background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); +} + +.was-validated .custom-select:valid, .custom-select.is-valid { + border-color: #008a29; + padding-right: calc(0.75em + 2.3125rem); + background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%23008a29' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} + +.was-validated .custom-select:valid:focus, .custom-select.is-valid:focus { + border-color: #008a29; + box-shadow: 0 0 0 0.2rem rgba(0, 138, 41, 0.25); +} + +.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label { + color: #008a29; +} + +.was-validated .form-check-input:valid ~ .valid-feedback, +.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback, +.form-check-input.is-valid ~ .valid-tooltip { + display: block; +} + +.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label { + color: #008a29; +} + +.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before { + border-color: #008a29; +} + +.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before { + border-color: #00bd38; + background: #00bd38 linear-gradient(180deg, #26c756, #00bd38) repeat-x; +} + +.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before, .custom-control-input.is-valid:focus ~ .custom-control-label::before { + box-shadow: 0 0 0 0.2rem rgba(0, 138, 41, 0.25); +} + +.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before { + border-color: #008a29; +} + +.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label { + border-color: #008a29; +} + +.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label { + border-color: #008a29; + box-shadow: 0 0 0 0.2rem rgba(0, 138, 41, 0.25); +} + +.invalid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 80%; + color: #e13737; +} + +.invalid-tooltip { + position: absolute; + top: 100%; + left: 0; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: .1rem; + font-size: 0.875rem; + line-height: 1.5; + color: #fff; + background-color: rgba(225, 55, 55, 0.9); +} + +.was-validated :invalid ~ .invalid-feedback, +.was-validated :invalid ~ .invalid-tooltip, +.is-invalid ~ .invalid-feedback, +.is-invalid ~ .invalid-tooltip { + display: block; +} + +.was-validated .form-control:invalid, .form-control.is-invalid { + border-color: #e13737; + padding-right: calc(1.5em + 0.75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23e13737' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23e13737' stroke='none'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right calc(0.375em + 0.1875rem) center; + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} + +.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus { + border-color: #e13737; + box-shadow: 0 0 0 0.2rem rgba(225, 55, 55, 0.25); +} + +.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid { + padding-right: calc(1.5em + 0.75rem); + background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); +} + +.was-validated .custom-select:invalid, .custom-select.is-invalid { + border-color: #e13737; + padding-right: calc(0.75em + 2.3125rem); + background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23e13737' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23e13737' stroke='none'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} + +.was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus { + border-color: #e13737; + box-shadow: 0 0 0 0.2rem rgba(225, 55, 55, 0.25); +} + +.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label { + color: #e13737; +} + +.was-validated .form-check-input:invalid ~ .invalid-feedback, +.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback, +.form-check-input.is-invalid ~ .invalid-tooltip { + display: block; +} + +.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label { + color: #e13737; +} + +.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before { + border-color: #e13737; +} + +.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before { + border-color: #e86363; + background: #e86363 linear-gradient(180deg, #eb7b7b, #e86363) repeat-x; +} + +.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before, .custom-control-input.is-invalid:focus ~ .custom-control-label::before { + box-shadow: 0 0 0 0.2rem rgba(225, 55, 55, 0.25); +} + +.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before { + border-color: #e13737; +} + +.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label { + border-color: #e13737; +} + +.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label { + border-color: #e13737; + box-shadow: 0 0 0 0.2rem rgba(225, 55, 55, 0.25); +} + +.form-inline { + display: flex; + flex-flow: row wrap; + align-items: center; +} + +.form-inline .form-check { + width: 100%; +} + +@media (min-width: 576px) { + .form-inline label { + display: flex; + align-items: center; + justify-content: center; + margin-bottom: 0; + } + .form-inline .form-group { + display: flex; + flex: 0 0 auto; + flex-flow: row wrap; + align-items: center; + margin-bottom: 0; + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .form-inline .form-control-plaintext { + display: inline-block; + } + .form-inline .input-group, + .form-inline .custom-select { + width: auto; + } + .form-inline .form-check { + display: flex; + align-items: center; + justify-content: center; + width: auto; + padding-left: 0; + } + .form-inline .form-check-input { + position: relative; + flex-shrink: 0; + margin-top: 0; + margin-right: 0.25rem; + margin-left: 0; + } + .form-inline .custom-control { + align-items: center; + justify-content: center; + } + .form-inline .custom-control-label { + margin-bottom: 0; + } +} + +.btn { + display: inline-block; + font-weight: 400; + color: #212529; + text-align: center; + vertical-align: middle; + user-select: none; + background-color: transparent; + border: 1px solid transparent; + padding: 0.375rem 0.75rem; + font-size: 1rem; + line-height: 1.5; + border-radius: 0; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} + +@media (prefers-reduced-motion: reduce) { + .btn { + transition: none; + } +} + +.btn:hover { + color: #212529; + text-decoration: none; +} + +.btn:focus, .btn.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(8, 51, 88, 0.25); +} + +.btn.disabled, .btn:disabled { + opacity: 0.65; + box-shadow: none; +} + +.btn:not(:disabled):not(.disabled) { + cursor: pointer; +} + +.btn:not(:disabled):not(.disabled):active, .btn:not(:disabled):not(.disabled).active { + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} + +.btn:not(:disabled):not(.disabled):active:focus, .btn:not(:disabled):not(.disabled).active:focus { + box-shadow: 0 0 0 0.2rem rgba(8, 51, 88, 0.25), inset 0 3px 5px rgba(0, 0, 0, 0.125); +} + +a.btn.disabled, +fieldset:disabled a.btn { + pointer-events: none; +} + +.btn-primary { + color: #fff; + background: #083358 linear-gradient(180deg, #2d5271, #083358) repeat-x; + border-color: #083358; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.btn-primary:hover { + color: #fff; + background: #051f35 linear-gradient(180deg, #2a4053, #051f35) repeat-x; + border-color: #041829; +} + +.btn-primary:focus, .btn-primary.focus { + color: #fff; + background: #051f35 linear-gradient(180deg, #2a4053, #051f35) repeat-x; + border-color: #041829; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 0 0.2rem rgba(45, 82, 113, 0.5); +} + +.btn-primary.disabled, .btn-primary:disabled { + color: #fff; + background-color: #083358; + border-color: #083358; + background-image: none; +} + +.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active, +.show > .btn-primary.dropdown-toggle { + color: #fff; + background-color: #041829; + background-image: none; + border-color: #03111e; +} + +.btn-primary:not(:disabled):not(.disabled):active:focus, .btn-primary:not(:disabled):not(.disabled).active:focus, +.show > .btn-primary.dropdown-toggle:focus { + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125), 0 0 0 0.2rem rgba(45, 82, 113, 0.5); +} + +.btn-secondary { + color: #212529; + background: #b8b8b8 linear-gradient(180deg, #c3c3c3, #b8b8b8) repeat-x; + border-color: #b8b8b8; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.btn-secondary:hover { + color: #212529; + background: #a5a5a5 linear-gradient(180deg, #b2b2b2, #a5a5a5) repeat-x; + border-color: #9f9f9f; +} + +.btn-secondary:focus, .btn-secondary.focus { + color: #212529; + background: #a5a5a5 linear-gradient(180deg, #b2b2b2, #a5a5a5) repeat-x; + border-color: #9f9f9f; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 0 0.2rem rgba(161, 162, 163, 0.5); +} + +.btn-secondary.disabled, .btn-secondary:disabled { + color: #212529; + background-color: #b8b8b8; + border-color: #b8b8b8; + background-image: none; +} + +.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active, +.show > .btn-secondary.dropdown-toggle { + color: #212529; + background-color: #9f9f9f; + background-image: none; + border-color: #989898; +} + +.btn-secondary:not(:disabled):not(.disabled):active:focus, .btn-secondary:not(:disabled):not(.disabled).active:focus, +.show > .btn-secondary.dropdown-toggle:focus { + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125), 0 0 0 0.2rem rgba(161, 162, 163, 0.5); +} + +.btn-success { + color: #fff; + background: #008a29 linear-gradient(180deg, #269c49, #008a29) repeat-x; + border-color: #008a29; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.btn-success:hover { + color: #fff; + background: #00641e linear-gradient(180deg, #267b3f, #00641e) repeat-x; + border-color: #00571a; +} + +.btn-success:focus, .btn-success.focus { + color: #fff; + background: #00641e linear-gradient(180deg, #267b3f, #00641e) repeat-x; + border-color: #00571a; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 0 0.2rem rgba(38, 156, 73, 0.5); +} + +.btn-success.disabled, .btn-success:disabled { + color: #fff; + background-color: #008a29; + border-color: #008a29; + background-image: none; +} + +.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active, +.show > .btn-success.dropdown-toggle { + color: #fff; + background-color: #00571a; + background-image: none; + border-color: #004a16; +} + +.btn-success:not(:disabled):not(.disabled):active:focus, .btn-success:not(:disabled):not(.disabled).active:focus, +.show > .btn-success.dropdown-toggle:focus { + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125), 0 0 0 0.2rem rgba(38, 156, 73, 0.5); +} + +.btn-info { + color: #212529; + background: #74dbef linear-gradient(180deg, #89e0f1, #74dbef) repeat-x; + border-color: #74dbef; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.btn-info:hover { + color: #212529; + background: #52d2eb linear-gradient(180deg, #6cd9ee, #52d2eb) repeat-x; + border-color: #46cfea; +} + +.btn-info:focus, .btn-info.focus { + color: #212529; + background: #52d2eb linear-gradient(180deg, #6cd9ee, #52d2eb) repeat-x; + border-color: #46cfea; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 0 0.2rem rgba(104, 192, 209, 0.5); +} + +.btn-info.disabled, .btn-info:disabled { + color: #212529; + background-color: #74dbef; + border-color: #74dbef; + background-image: none; +} + +.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active, +.show > .btn-info.dropdown-toggle { + color: #212529; + background-color: #46cfea; + background-image: none; + border-color: #3bcce8; +} + +.btn-info:not(:disabled):not(.disabled):active:focus, .btn-info:not(:disabled):not(.disabled).active:focus, +.show > .btn-info.dropdown-toggle:focus { + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125), 0 0 0 0.2rem rgba(104, 192, 209, 0.5); +} + +.btn-warning { + color: #212529; + background: #e6d200 linear-gradient(180deg, #ead926, #e6d200) repeat-x; + border-color: #e6d200; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.btn-warning:hover { + color: #212529; + background: #c0af00 linear-gradient(180deg, #c9bb26, #c0af00) repeat-x; + border-color: #b3a300; +} + +.btn-warning:focus, .btn-warning.focus { + color: #212529; + background: #c0af00 linear-gradient(180deg, #c9bb26, #c0af00) repeat-x; + border-color: #b3a300; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 0 0.2rem rgba(200, 184, 6, 0.5); +} + +.btn-warning.disabled, .btn-warning:disabled { + color: #212529; + background-color: #e6d200; + border-color: #e6d200; + background-image: none; +} + +.btn-warning:not(:disabled):not(.disabled):active, .btn-warning:not(:disabled):not(.disabled).active, +.show > .btn-warning.dropdown-toggle { + color: #fff; + background-color: #b3a300; + background-image: none; + border-color: #a69800; +} + +.btn-warning:not(:disabled):not(.disabled):active:focus, .btn-warning:not(:disabled):not(.disabled).active:focus, +.show > .btn-warning.dropdown-toggle:focus { + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125), 0 0 0 0.2rem rgba(200, 184, 6, 0.5); +} + +.btn-danger { + color: #fff; + background: #e13737 linear-gradient(180deg, #e65555, #e13737) repeat-x; + border-color: #e13737; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.btn-danger:hover { + color: #fff; + background: #d22020 linear-gradient(180deg, #d94141, #d22020) repeat-x; + border-color: #c71e1e; +} + +.btn-danger:focus, .btn-danger.focus { + color: #fff; + background: #d22020 linear-gradient(180deg, #d94141, #d22020) repeat-x; + border-color: #c71e1e; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 0 0.2rem rgba(230, 85, 85, 0.5); +} + +.btn-danger.disabled, .btn-danger:disabled { + color: #fff; + background-color: #e13737; + border-color: #e13737; + background-image: none; +} + +.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active, +.show > .btn-danger.dropdown-toggle { + color: #fff; + background-color: #c71e1e; + background-image: none; + border-color: #bc1c1c; +} + +.btn-danger:not(:disabled):not(.disabled):active:focus, .btn-danger:not(:disabled):not(.disabled).active:focus, +.show > .btn-danger.dropdown-toggle:focus { + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125), 0 0 0 0.2rem rgba(230, 85, 85, 0.5); +} + +.btn-light { + color: #212529; + background: #f4f4f4 linear-gradient(180deg, #f6f6f6, #f4f4f4) repeat-x; + border-color: #f4f4f4; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.btn-light:hover { + color: #212529; + background: #e1e1e1 linear-gradient(180deg, #e5e5e5, #e1e1e1) repeat-x; + border-color: #dbdbdb; +} + +.btn-light:focus, .btn-light.focus { + color: #212529; + background: #e1e1e1 linear-gradient(180deg, #e5e5e5, #e1e1e1) repeat-x; + border-color: #dbdbdb; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 0 0.2rem rgba(212, 213, 214, 0.5); +} + +.btn-light.disabled, .btn-light:disabled { + color: #212529; + background-color: #f4f4f4; + border-color: #f4f4f4; + background-image: none; +} + +.btn-light:not(:disabled):not(.disabled):active, .btn-light:not(:disabled):not(.disabled).active, +.show > .btn-light.dropdown-toggle { + color: #212529; + background-color: #dbdbdb; + background-image: none; + border-color: #d4d4d4; +} + +.btn-light:not(:disabled):not(.disabled):active:focus, .btn-light:not(:disabled):not(.disabled).active:focus, +.show > .btn-light.dropdown-toggle:focus { + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125), 0 0 0 0.2rem rgba(212, 213, 214, 0.5); +} + +.btn-dark { + color: #fff; + background: #072247 linear-gradient(180deg, #2c4363, #072247) repeat-x; + border-color: #072247; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.btn-dark:hover { + color: #fff; + background: #041124 linear-gradient(180deg, #293545, #041124) repeat-x; + border-color: #020c19; +} + +.btn-dark:focus, .btn-dark.focus { + color: #fff; + background: #041124 linear-gradient(180deg, #293545, #041124) repeat-x; + border-color: #020c19; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 0 0.2rem rgba(44, 67, 99, 0.5); +} + +.btn-dark.disabled, .btn-dark:disabled { + color: #fff; + background-color: #072247; + border-color: #072247; + background-image: none; +} + +.btn-dark:not(:disabled):not(.disabled):active, .btn-dark:not(:disabled):not(.disabled).active, +.show > .btn-dark.dropdown-toggle { + color: #fff; + background-color: #020c19; + background-image: none; + border-color: #01060d; +} + +.btn-dark:not(:disabled):not(.disabled):active:focus, .btn-dark:not(:disabled):not(.disabled).active:focus, +.show > .btn-dark.dropdown-toggle:focus { + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125), 0 0 0 0.2rem rgba(44, 67, 99, 0.5); +} + +.btn-outline-primary { + color: #083358; + border-color: #083358; +} + +.btn-outline-primary:hover { + color: #fff; + background-color: #083358; + border-color: #083358; +} + +.btn-outline-primary:focus, .btn-outline-primary.focus { + box-shadow: 0 0 0 0.2rem rgba(8, 51, 88, 0.5); +} + +.btn-outline-primary.disabled, .btn-outline-primary:disabled { + color: #083358; + background-color: transparent; +} + +.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active, +.show > .btn-outline-primary.dropdown-toggle { + color: #fff; + background-color: #083358; + border-color: #083358; +} + +.btn-outline-primary:not(:disabled):not(.disabled):active:focus, .btn-outline-primary:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-primary.dropdown-toggle:focus { + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125), 0 0 0 0.2rem rgba(8, 51, 88, 0.5); +} + +.btn-outline-secondary { + color: #b8b8b8; + border-color: #b8b8b8; +} + +.btn-outline-secondary:hover { + color: #212529; + background-color: #b8b8b8; + border-color: #b8b8b8; +} + +.btn-outline-secondary:focus, .btn-outline-secondary.focus { + box-shadow: 0 0 0 0.2rem rgba(184, 184, 184, 0.5); +} + +.btn-outline-secondary.disabled, .btn-outline-secondary:disabled { + color: #b8b8b8; + background-color: transparent; +} + +.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active, +.show > .btn-outline-secondary.dropdown-toggle { + color: #212529; + background-color: #b8b8b8; + border-color: #b8b8b8; +} + +.btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .btn-outline-secondary:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-secondary.dropdown-toggle:focus { + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125), 0 0 0 0.2rem rgba(184, 184, 184, 0.5); +} + +.btn-outline-success { + color: #008a29; + border-color: #008a29; +} + +.btn-outline-success:hover { + color: #fff; + background-color: #008a29; + border-color: #008a29; +} + +.btn-outline-success:focus, .btn-outline-success.focus { + box-shadow: 0 0 0 0.2rem rgba(0, 138, 41, 0.5); +} + +.btn-outline-success.disabled, .btn-outline-success:disabled { + color: #008a29; + background-color: transparent; +} + +.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active, +.show > .btn-outline-success.dropdown-toggle { + color: #fff; + background-color: #008a29; + border-color: #008a29; +} + +.btn-outline-success:not(:disabled):not(.disabled):active:focus, .btn-outline-success:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-success.dropdown-toggle:focus { + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125), 0 0 0 0.2rem rgba(0, 138, 41, 0.5); +} + +.btn-outline-info { + color: #74dbef; + border-color: #74dbef; +} + +.btn-outline-info:hover { + color: #212529; + background-color: #74dbef; + border-color: #74dbef; +} + +.btn-outline-info:focus, .btn-outline-info.focus { + box-shadow: 0 0 0 0.2rem rgba(116, 219, 239, 0.5); +} + +.btn-outline-info.disabled, .btn-outline-info:disabled { + color: #74dbef; + background-color: transparent; +} + +.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active, +.show > .btn-outline-info.dropdown-toggle { + color: #212529; + background-color: #74dbef; + border-color: #74dbef; +} + +.btn-outline-info:not(:disabled):not(.disabled):active:focus, .btn-outline-info:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-info.dropdown-toggle:focus { + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125), 0 0 0 0.2rem rgba(116, 219, 239, 0.5); +} + +.btn-outline-warning { + color: #e6d200; + border-color: #e6d200; +} + +.btn-outline-warning:hover { + color: #212529; + background-color: #e6d200; + border-color: #e6d200; +} + +.btn-outline-warning:focus, .btn-outline-warning.focus { + box-shadow: 0 0 0 0.2rem rgba(230, 210, 0, 0.5); +} + +.btn-outline-warning.disabled, .btn-outline-warning:disabled { + color: #e6d200; + background-color: transparent; +} + +.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active, +.show > .btn-outline-warning.dropdown-toggle { + color: #212529; + background-color: #e6d200; + border-color: #e6d200; +} + +.btn-outline-warning:not(:disabled):not(.disabled):active:focus, .btn-outline-warning:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-warning.dropdown-toggle:focus { + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125), 0 0 0 0.2rem rgba(230, 210, 0, 0.5); +} + +.btn-outline-danger { + color: #e13737; + border-color: #e13737; +} + +.btn-outline-danger:hover { + color: #fff; + background-color: #e13737; + border-color: #e13737; +} + +.btn-outline-danger:focus, .btn-outline-danger.focus { + box-shadow: 0 0 0 0.2rem rgba(225, 55, 55, 0.5); +} + +.btn-outline-danger.disabled, .btn-outline-danger:disabled { + color: #e13737; + background-color: transparent; +} + +.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active, +.show > .btn-outline-danger.dropdown-toggle { + color: #fff; + background-color: #e13737; + border-color: #e13737; +} + +.btn-outline-danger:not(:disabled):not(.disabled):active:focus, .btn-outline-danger:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-danger.dropdown-toggle:focus { + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125), 0 0 0 0.2rem rgba(225, 55, 55, 0.5); +} + +.btn-outline-light { + color: #f4f4f4; + border-color: #f4f4f4; +} + +.btn-outline-light:hover { + color: #212529; + background-color: #f4f4f4; + border-color: #f4f4f4; +} + +.btn-outline-light:focus, .btn-outline-light.focus { + box-shadow: 0 0 0 0.2rem rgba(244, 244, 244, 0.5); +} + +.btn-outline-light.disabled, .btn-outline-light:disabled { + color: #f4f4f4; + background-color: transparent; +} + +.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active, +.show > .btn-outline-light.dropdown-toggle { + color: #212529; + background-color: #f4f4f4; + border-color: #f4f4f4; +} + +.btn-outline-light:not(:disabled):not(.disabled):active:focus, .btn-outline-light:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-light.dropdown-toggle:focus { + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125), 0 0 0 0.2rem rgba(244, 244, 244, 0.5); +} + +.btn-outline-dark { + color: #072247; + border-color: #072247; +} + +.btn-outline-dark:hover { + color: #fff; + background-color: #072247; + border-color: #072247; +} + +.btn-outline-dark:focus, .btn-outline-dark.focus { + box-shadow: 0 0 0 0.2rem rgba(7, 34, 71, 0.5); +} + +.btn-outline-dark.disabled, .btn-outline-dark:disabled { + color: #072247; + background-color: transparent; +} + +.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active, +.show > .btn-outline-dark.dropdown-toggle { + color: #fff; + background-color: #072247; + border-color: #072247; +} + +.btn-outline-dark:not(:disabled):not(.disabled):active:focus, .btn-outline-dark:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-dark.dropdown-toggle:focus { + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125), 0 0 0 0.2rem rgba(7, 34, 71, 0.5); +} + +.btn-link { + font-weight: 400; + color: #083358; + text-decoration: none; +} + +.btn-link:hover { + color: #020a12; + text-decoration: underline; +} + +.btn-link:focus, .btn-link.focus { + text-decoration: underline; +} + +.btn-link:disabled, .btn-link.disabled { + color: #6c757d; + pointer-events: none; +} + +.btn-lg, .btn-group-lg > .btn { + padding: 0.5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; + border-radius: 0; +} + +.btn-sm, .btn-group-sm > .btn { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; + border-radius: 0; +} + +.btn-block { + display: block; + width: 100%; +} + +.btn-block + .btn-block { + margin-top: 0.5rem; +} + +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} + +.fade { + transition: opacity 0.15s linear; +} + +@media (prefers-reduced-motion: reduce) { + .fade { + transition: none; + } +} + +.fade:not(.show) { + opacity: 0; +} + +.collapse:not(.show) { + display: none; +} + +.collapsing { + position: relative; + height: 0; + overflow: hidden; + transition: height 0.35s ease; +} + +@media (prefers-reduced-motion: reduce) { + .collapsing { + transition: none; + } +} + +.dropup, +.dropright, +.dropdown, +.dropleft { + position: relative; +} + +.dropdown-toggle { + white-space: nowrap; +} + +.dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid; + border-right: 0.3em solid transparent; + border-bottom: 0; + border-left: 0.3em solid transparent; +} + +.dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 10rem; + padding: 0.5rem 0; + margin: 0.125rem 0 0; + font-size: 1rem; + color: #212529; + text-align: left; + list-style: none; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.15); + box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.175); +} + +.dropdown-menu-left { + right: auto; + left: 0; +} + +.dropdown-menu-right { + right: 0; + left: auto; +} + +@media (min-width: 576px) { + .dropdown-menu-sm-left { + right: auto; + left: 0; + } + .dropdown-menu-sm-right { + right: 0; + left: auto; + } +} + +@media (min-width: 768px) { + .dropdown-menu-md-left { + right: auto; + left: 0; + } + .dropdown-menu-md-right { + right: 0; + left: auto; + } +} + +@media (min-width: 992px) { + .dropdown-menu-lg-left { + right: auto; + left: 0; + } + .dropdown-menu-lg-right { + right: 0; + left: auto; + } +} + +@media (min-width: 1200px) { + .dropdown-menu-xl-left { + right: auto; + left: 0; + } + .dropdown-menu-xl-right { + right: 0; + left: auto; + } +} + +.dropup .dropdown-menu { + top: auto; + bottom: 100%; + margin-top: 0; + margin-bottom: 0.125rem; +} + +.dropup .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0; + border-right: 0.3em solid transparent; + border-bottom: 0.3em solid; + border-left: 0.3em solid transparent; +} + +.dropup .dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropright .dropdown-menu { + top: 0; + right: auto; + left: 100%; + margin-top: 0; + margin-left: 0.125rem; +} + +.dropright .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-right: 0; + border-bottom: 0.3em solid transparent; + border-left: 0.3em solid; +} + +.dropright .dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropright .dropdown-toggle::after { + vertical-align: 0; +} + +.dropleft .dropdown-menu { + top: 0; + right: 100%; + left: auto; + margin-top: 0; + margin-right: 0.125rem; +} + +.dropleft .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; +} + +.dropleft .dropdown-toggle::after { + display: none; +} + +.dropleft .dropdown-toggle::before { + display: inline-block; + margin-right: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-right: 0.3em solid; + border-bottom: 0.3em solid transparent; +} + +.dropleft .dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropleft .dropdown-toggle::before { + vertical-align: 0; +} + +.dropdown-menu[x-placement^="top"], .dropdown-menu[x-placement^="right"], .dropdown-menu[x-placement^="bottom"], .dropdown-menu[x-placement^="left"] { + right: auto; + bottom: auto; +} + +.dropdown-divider { + height: 0; + margin: 0.25rem 0; + overflow: hidden; + border-top: 1px solid #e9ecef; +} + +.dropdown-item { + display: block; + width: 100%; + padding: 0.25rem 1.5rem; + clear: both; + font-weight: 400; + color: #212529; + text-align: inherit; + white-space: nowrap; + background-color: transparent; + border: 0; +} + +.dropdown-item:hover, .dropdown-item:focus { + color: #16181b; + text-decoration: none; + background: #f8f9fa linear-gradient(180deg, #f9fafb, #f8f9fa) repeat-x; +} + +.dropdown-item.active, .dropdown-item:active { + color: #fff; + text-decoration: none; + background: #083358 linear-gradient(180deg, #2d5271, #083358) repeat-x; +} + +.dropdown-item.disabled, .dropdown-item:disabled { + color: #6c757d; + pointer-events: none; + background-color: transparent; + background-image: none; +} + +.dropdown-menu.show { + display: block; +} + +.dropdown-header { + display: block; + padding: 0.5rem 1.5rem; + margin-bottom: 0; + font-size: 0.875rem; + color: #6c757d; + white-space: nowrap; +} + +.dropdown-item-text { + display: block; + padding: 0.25rem 1.5rem; + color: #212529; +} + +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-flex; + vertical-align: middle; +} + +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + flex: 1 1 auto; +} + +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover { + z-index: 1; +} + +.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active, +.btn-group-vertical > .btn:focus, +.btn-group-vertical > .btn:active, +.btn-group-vertical > .btn.active { + z-index: 1; +} + +.btn-toolbar { + display: flex; + flex-wrap: wrap; + justify-content: flex-start; +} + +.btn-toolbar .input-group { + width: auto; +} + +.btn-group > .btn:not(:first-child), +.btn-group > .btn-group:not(:first-child) { + margin-left: -1px; +} + +.dropdown-toggle-split { + padding-right: 0.5625rem; + padding-left: 0.5625rem; +} + +.dropdown-toggle-split::after, +.dropup .dropdown-toggle-split::after, +.dropright .dropdown-toggle-split::after { + margin-left: 0; +} + +.dropleft .dropdown-toggle-split::before { + margin-right: 0; +} + +.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split { + padding-right: 0.375rem; + padding-left: 0.375rem; +} + +.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split { + padding-right: 0.75rem; + padding-left: 0.75rem; +} + +.btn-group.show .dropdown-toggle { + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} + +.btn-group.show .dropdown-toggle.btn-link { + box-shadow: none; +} + +.btn-group-vertical { + flex-direction: column; + align-items: flex-start; + justify-content: center; +} + +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group { + width: 100%; +} + +.btn-group-vertical > .btn:not(:first-child), +.btn-group-vertical > .btn-group:not(:first-child) { + margin-top: -1px; +} + +.btn-group-toggle > .btn, +.btn-group-toggle > .btn-group > .btn { + margin-bottom: 0; +} + +.btn-group-toggle > .btn input[type="radio"], +.btn-group-toggle > .btn input[type="checkbox"], +.btn-group-toggle > .btn-group > .btn input[type="radio"], +.btn-group-toggle > .btn-group > .btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} + +.input-group { + position: relative; + display: flex; + flex-wrap: wrap; + align-items: stretch; + width: 100%; +} + +.input-group > .form-control, +.input-group > .form-control-plaintext, +.input-group > .custom-select, +.input-group > .custom-file { + position: relative; + flex: 1 1 auto; + width: 1%; + min-width: 0; + margin-bottom: 0; +} + +.input-group > .form-control + .form-control, +.input-group > .form-control + .custom-select, +.input-group > .form-control + .custom-file, +.input-group > .form-control-plaintext + .form-control, +.input-group > .form-control-plaintext + .custom-select, +.input-group > .form-control-plaintext + .custom-file, +.input-group > .custom-select + .form-control, +.input-group > .custom-select + .custom-select, +.input-group > .custom-select + .custom-file, +.input-group > .custom-file + .form-control, +.input-group > .custom-file + .custom-select, +.input-group > .custom-file + .custom-file { + margin-left: -1px; +} + +.input-group > .form-control:focus, +.input-group > .custom-select:focus, +.input-group > .custom-file .custom-file-input:focus ~ .custom-file-label { + z-index: 3; +} + +.input-group > .custom-file .custom-file-input:focus { + z-index: 4; +} + +.input-group > .custom-file { + display: flex; + align-items: center; +} + +.input-group-prepend, +.input-group-append { + display: flex; +} + +.input-group-prepend .btn, +.input-group-append .btn { + position: relative; + z-index: 2; +} + +.input-group-prepend .btn:focus, +.input-group-append .btn:focus { + z-index: 3; +} + +.input-group-prepend .btn + .btn, +.input-group-prepend .btn + .input-group-text, +.input-group-prepend .input-group-text + .input-group-text, +.input-group-prepend .input-group-text + .btn, +.input-group-append .btn + .btn, +.input-group-append .btn + .input-group-text, +.input-group-append .input-group-text + .input-group-text, +.input-group-append .input-group-text + .btn { + margin-left: -1px; +} + +.input-group-prepend { + margin-right: -1px; +} + +.input-group-append { + margin-left: -1px; +} + +.input-group-text { + display: flex; + align-items: center; + padding: 0.375rem 0.75rem; + margin-bottom: 0; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #495057; + text-align: center; + white-space: nowrap; + background-color: #e9ecef; + border: 1px solid #ced4da; +} + +.input-group-text input[type="radio"], +.input-group-text input[type="checkbox"] { + margin-top: 0; +} + +.input-group-lg > .form-control:not(textarea), +.input-group-lg > .custom-select { + height: calc(1.5em + 1rem + 2px); +} + +.input-group-lg > .form-control, +.input-group-lg > .custom-select, +.input-group-lg > .input-group-prepend > .input-group-text, +.input-group-lg > .input-group-append > .input-group-text, +.input-group-lg > .input-group-prepend > .btn, +.input-group-lg > .input-group-append > .btn { + padding: 0.5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; +} + +.input-group-sm > .form-control:not(textarea), +.input-group-sm > .custom-select { + height: calc(1.5em + 0.5rem + 2px); +} + +.input-group-sm > .form-control, +.input-group-sm > .custom-select, +.input-group-sm > .input-group-prepend > .input-group-text, +.input-group-sm > .input-group-append > .input-group-text, +.input-group-sm > .input-group-prepend > .btn, +.input-group-sm > .input-group-append > .btn { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; +} + +.input-group-lg > .custom-select, +.input-group-sm > .custom-select { + padding-right: 1.75rem; +} + +.custom-control { + position: relative; + z-index: 1; + display: block; + min-height: 1.5rem; + padding-left: 1.5rem; +} + +.custom-control-inline { + display: inline-flex; + margin-right: 1rem; +} + +.custom-control-input { + position: absolute; + left: 0; + z-index: -1; + width: 1rem; + height: 1.25rem; + opacity: 0; +} + +.custom-control-input:checked ~ .custom-control-label::before { + color: #fff; + border-color: #083358; + background: #083358 linear-gradient(180deg, #2d5271, #083358) repeat-x; + box-shadow:; +} + +.custom-control-input:focus ~ .custom-control-label::before { + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 0 0.2rem rgba(8, 51, 88, 0.25); +} + +.custom-control-input:focus:not(:checked) ~ .custom-control-label::before { + border-color: #1377cd; +} + +.custom-control-input:not(:disabled):active ~ .custom-control-label::before { + color: #fff; + background-color: #2791eb; + border-color: #2791eb; + box-shadow:; +} + +.custom-control-input[disabled] ~ .custom-control-label, .custom-control-input:disabled ~ .custom-control-label { + color: #6c757d; +} + +.custom-control-input[disabled] ~ .custom-control-label::before, .custom-control-input:disabled ~ .custom-control-label::before { + background-color: #e9ecef; +} + +.custom-control-label { + position: relative; + margin-bottom: 0; + vertical-align: top; +} + +.custom-control-label::before { + position: absolute; + top: 0.25rem; + left: -1.5rem; + display: block; + width: 1rem; + height: 1rem; + pointer-events: none; + content: ""; + background-color: #fff; + border: #adb5bd solid 1px; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.custom-control-label::after { + position: absolute; + top: 0.25rem; + left: -1.5rem; + display: block; + width: 1rem; + height: 1rem; + content: ""; + background: no-repeat 50% / 50% 50%; +} + +.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3e%3c/svg%3e"); +} + +.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before { + border-color: #083358; + background: #083358 linear-gradient(180deg, #2d5271, #083358) repeat-x; + box-shadow:; +} + +.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e"); +} + +.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before { + background: rgba(8, 51, 88, 0.5) linear-gradient(180deg, rgba(94, 122, 146, 0.575), rgba(8, 51, 88, 0.5)) repeat-x; +} + +.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before { + background: rgba(8, 51, 88, 0.5) linear-gradient(180deg, rgba(94, 122, 146, 0.575), rgba(8, 51, 88, 0.5)) repeat-x; +} + +.custom-radio .custom-control-label::before { + border-radius: 50%; +} + +.custom-radio .custom-control-input:checked ~ .custom-control-label::after { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e"); +} + +.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before { + background: rgba(8, 51, 88, 0.5) linear-gradient(180deg, rgba(94, 122, 146, 0.575), rgba(8, 51, 88, 0.5)) repeat-x; +} + +.custom-switch { + padding-left: 2.25rem; +} + +.custom-switch .custom-control-label::before { + left: -2.25rem; + width: 1.75rem; + pointer-events: all; + border-radius: 0.5rem; +} + +.custom-switch .custom-control-label::after { + top: calc(0.25rem + 2px); + left: calc(-2.25rem + 2px); + width: calc(1rem - 4px); + height: calc(1rem - 4px); + background-color: #adb5bd; + border-radius: 0.5rem; + transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} + +@media (prefers-reduced-motion: reduce) { + .custom-switch .custom-control-label::after { + transition: none; + } +} + +.custom-switch .custom-control-input:checked ~ .custom-control-label::after { + background-color: #fff; + transform: translateX(0.75rem); +} + +.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before { + background: rgba(8, 51, 88, 0.5) linear-gradient(180deg, rgba(94, 122, 146, 0.575), rgba(8, 51, 88, 0.5)) repeat-x; +} + +.custom-select { + display: inline-block; + width: 100%; + height: calc(1.5em + 0.75rem + 2px); + padding: 0.375rem 1.75rem 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #495057; + vertical-align: middle; + background: #fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px; + border: 1px solid #ced4da; + border-radius: 0; + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075); + appearance: none; +} + +.custom-select:focus { + border-color: #1377cd; + outline: 0; + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075), 0 0 0 0.2rem rgba(8, 51, 88, 0.25); +} + +.custom-select:focus::-ms-value { + color: #495057; + background-color: #fff; +} + +.custom-select[multiple], .custom-select[size]:not([size="1"]) { + height: auto; + padding-right: 0.75rem; + background-image: none; +} + +.custom-select:disabled { + color: #6c757d; + background-color: #e9ecef; +} + +.custom-select::-ms-expand { + display: none; +} + +.custom-select:-moz-focusring { + color: transparent; + text-shadow: 0 0 0 #495057; +} + +.custom-select-sm { + height: calc(1.5em + 0.5rem + 2px); + padding-top: 0.25rem; + padding-bottom: 0.25rem; + padding-left: 0.5rem; + font-size: 0.875rem; +} + +.custom-select-lg { + height: calc(1.5em + 1rem + 2px); + padding-top: 0.5rem; + padding-bottom: 0.5rem; + padding-left: 1rem; + font-size: 1.25rem; +} + +.custom-file { + position: relative; + display: inline-block; + width: 100%; + height: calc(1.5em + 0.75rem + 2px); + margin-bottom: 0; +} + +.custom-file-input { + position: relative; + z-index: 2; + width: 100%; + height: calc(1.5em + 0.75rem + 2px); + margin: 0; + opacity: 0; +} + +.custom-file-input:focus ~ .custom-file-label { + border-color: #1377cd; + box-shadow: 0 0 0 0.2rem rgba(8, 51, 88, 0.25); +} + +.custom-file-input[disabled] ~ .custom-file-label, +.custom-file-input:disabled ~ .custom-file-label { + background-color: #e9ecef; +} + +.custom-file-input:lang(en) ~ .custom-file-label::after { + content: "Browse"; +} + +.custom-file-input ~ .custom-file-label[data-browse]::after { + content: attr(data-browse); +} + +.custom-file-label { + position: absolute; + top: 0; + right: 0; + left: 0; + z-index: 1; + height: calc(1.5em + 0.75rem + 2px); + padding: 0.375rem 0.75rem; + font-weight: 400; + line-height: 1.5; + color: #495057; + background-color: #fff; + border: 1px solid #ced4da; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.custom-file-label::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + z-index: 3; + display: block; + height: calc(1.5em + 0.75rem); + padding: 0.375rem 0.75rem; + line-height: 1.5; + color: #495057; + content: "Browse"; + background: #e9ecef linear-gradient(180deg, #eceff1, #e9ecef) repeat-x; + border-left: inherit; +} + +.custom-range { + width: 100%; + height: 1.4rem; + padding: 0; + background-color: transparent; + appearance: none; +} + +.custom-range:focus { + outline: none; +} + +.custom-range:focus::-webkit-slider-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(8, 51, 88, 0.25); +} + +.custom-range:focus::-moz-range-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(8, 51, 88, 0.25); +} + +.custom-range:focus::-ms-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(8, 51, 88, 0.25); +} + +.custom-range::-moz-focus-outer { + border: 0; +} + +.custom-range::-webkit-slider-thumb { + width: 1rem; + height: 1rem; + margin-top: -0.25rem; + background: #083358 linear-gradient(180deg, #2d5271, #083358) repeat-x; + border: 0; + box-shadow: 0 0.1rem 0.25rem rgba(0, 0, 0, 0.1); + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + appearance: none; +} + +@media (prefers-reduced-motion: reduce) { + .custom-range::-webkit-slider-thumb { + transition: none; + } +} + +.custom-range::-webkit-slider-thumb:active { + background: #2791eb linear-gradient(180deg, #48a1ee, #2791eb) repeat-x; +} + +.custom-range::-webkit-slider-runnable-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: #dee2e6; + border-color: transparent; + box-shadow: inset 0 0.25rem 0.25rem rgba(0, 0, 0, 0.1); +} + +.custom-range::-moz-range-thumb { + width: 1rem; + height: 1rem; + background: #083358 linear-gradient(180deg, #2d5271, #083358) repeat-x; + border: 0; + box-shadow: 0 0.1rem 0.25rem rgba(0, 0, 0, 0.1); + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + appearance: none; +} + +@media (prefers-reduced-motion: reduce) { + .custom-range::-moz-range-thumb { + transition: none; + } +} + +.custom-range::-moz-range-thumb:active { + background: #2791eb linear-gradient(180deg, #48a1ee, #2791eb) repeat-x; +} + +.custom-range::-moz-range-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: #dee2e6; + border-color: transparent; + box-shadow: inset 0 0.25rem 0.25rem rgba(0, 0, 0, 0.1); +} + +.custom-range::-ms-thumb { + width: 1rem; + height: 1rem; + margin-top: 0; + margin-right: 0.2rem; + margin-left: 0.2rem; + background: #083358 linear-gradient(180deg, #2d5271, #083358) repeat-x; + border: 0; + box-shadow: 0 0.1rem 0.25rem rgba(0, 0, 0, 0.1); + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + appearance: none; +} + +@media (prefers-reduced-motion: reduce) { + .custom-range::-ms-thumb { + transition: none; + } +} + +.custom-range::-ms-thumb:active { + background: #2791eb linear-gradient(180deg, #48a1ee, #2791eb) repeat-x; +} + +.custom-range::-ms-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: transparent; + border-color: transparent; + border-width: 0.5rem; + box-shadow: inset 0 0.25rem 0.25rem rgba(0, 0, 0, 0.1); +} + +.custom-range::-ms-fill-lower { + background-color: #dee2e6; +} + +.custom-range::-ms-fill-upper { + margin-right: 15px; + background-color: #dee2e6; +} + +.custom-range:disabled::-webkit-slider-thumb { + background-color: #adb5bd; +} + +.custom-range:disabled::-webkit-slider-runnable-track { + cursor: default; +} + +.custom-range:disabled::-moz-range-thumb { + background-color: #adb5bd; +} + +.custom-range:disabled::-moz-range-track { + cursor: default; +} + +.custom-range:disabled::-ms-thumb { + background-color: #adb5bd; +} + +.custom-control-label::before, +.custom-file-label, +.custom-select { + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} + +@media (prefers-reduced-motion: reduce) { + .custom-control-label::before, + .custom-file-label, + .custom-select { + transition: none; + } +} + +.nav { + display: flex; + flex-wrap: wrap; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} + +.nav-link { + display: block; + padding: 0.5rem 1rem; +} + +.nav-link:hover, .nav-link:focus { + text-decoration: none; +} + +.nav-link.disabled { + color: #6c757d; + pointer-events: none; + cursor: default; +} + +.nav-tabs { + border-bottom: 1px solid #dee2e6; +} + +.nav-tabs .nav-item { + margin-bottom: -1px; +} + +.nav-tabs .nav-link { + border: 1px solid transparent; +} + +.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus { + border-color: #e9ecef #e9ecef #dee2e6; +} + +.nav-tabs .nav-link.disabled { + color: #6c757d; + background-color: transparent; + border-color: transparent; +} + +.nav-tabs .nav-link.active, +.nav-tabs .nav-item.show .nav-link { + color: #495057; + background-color: #fff; + border-color: #dee2e6 #dee2e6 #fff; +} + +.nav-tabs .dropdown-menu { + margin-top: -1px; +} + +.nav-pills .nav-link.active, +.nav-pills .show > .nav-link { + color: #fff; + background-color: #083358; +} + +.nav-fill > .nav-link, +.nav-fill .nav-item { + flex: 1 1 auto; + text-align: center; +} + +.nav-justified > .nav-link, +.nav-justified .nav-item { + flex-basis: 0; + flex-grow: 1; + text-align: center; +} + +.tab-content > .tab-pane { + display: none; +} + +.tab-content > .active { + display: block; +} + +.navbar { + position: relative; + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; + padding: 0.25rem 0.5rem; +} + +.navbar .container, +.navbar .container-fluid, .navbar .container-sm, .navbar .container-md, .navbar .container-lg, .navbar .container-xl { + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; +} + +.navbar-brand { + display: inline-block; + padding-top: 0.3125rem; + padding-bottom: 0.3125rem; + margin-right: 0.5rem; + font-size: 1.25rem; + line-height: inherit; + white-space: nowrap; +} + +.navbar-brand:hover, .navbar-brand:focus { + text-decoration: none; +} + +.navbar-nav { + display: flex; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} + +.navbar-nav .nav-link { + padding-right: 0; + padding-left: 0; +} + +.navbar-nav .dropdown-menu { + position: static; + float: none; +} + +.navbar-text { + display: inline-block; + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} + +.navbar-collapse { + flex-basis: 100%; + flex-grow: 1; + align-items: center; +} + +.navbar-toggler { + padding: 0.25rem 0.75rem; + font-size: 1.25rem; + line-height: 1; + background-color: transparent; + border: 1px solid transparent; +} + +.navbar-toggler:hover, .navbar-toggler:focus { + text-decoration: none; +} + +.navbar-toggler-icon { + display: inline-block; + width: 1.5em; + height: 1.5em; + vertical-align: middle; + content: ""; + background: no-repeat center center; + background-size: 100% 100%; +} + +@media (max-width: 575.98px) { + .navbar-expand-sm > .container, + .navbar-expand-sm > .container-fluid, .navbar-expand-sm > .container-sm, .navbar-expand-sm > .container-md, .navbar-expand-sm > .container-lg, .navbar-expand-sm > .container-xl { + padding-right: 0; + padding-left: 0; + } +} + +@media (min-width: 576px) { + .navbar-expand-sm { + flex-flow: row nowrap; + justify-content: flex-start; + } + .navbar-expand-sm .navbar-nav { + flex-direction: row; + } + .navbar-expand-sm .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-sm .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-sm > .container, + .navbar-expand-sm > .container-fluid, .navbar-expand-sm > .container-sm, .navbar-expand-sm > .container-md, .navbar-expand-sm > .container-lg, .navbar-expand-sm > .container-xl { + flex-wrap: nowrap; + } + .navbar-expand-sm .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-sm .navbar-toggler { + display: none; + } +} + +@media (max-width: 767.98px) { + .navbar-expand-md > .container, + .navbar-expand-md > .container-fluid, .navbar-expand-md > .container-sm, .navbar-expand-md > .container-md, .navbar-expand-md > .container-lg, .navbar-expand-md > .container-xl { + padding-right: 0; + padding-left: 0; + } +} + +@media (min-width: 768px) { + .navbar-expand-md { + flex-flow: row nowrap; + justify-content: flex-start; + } + .navbar-expand-md .navbar-nav { + flex-direction: row; + } + .navbar-expand-md .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-md .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-md > .container, + .navbar-expand-md > .container-fluid, .navbar-expand-md > .container-sm, .navbar-expand-md > .container-md, .navbar-expand-md > .container-lg, .navbar-expand-md > .container-xl { + flex-wrap: nowrap; + } + .navbar-expand-md .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-md .navbar-toggler { + display: none; + } +} + +@media (max-width: 991.98px) { + .navbar-expand-lg > .container, + .navbar-expand-lg > .container-fluid, .navbar-expand-lg > .container-sm, .navbar-expand-lg > .container-md, .navbar-expand-lg > .container-lg, .navbar-expand-lg > .container-xl { + padding-right: 0; + padding-left: 0; + } +} + +@media (min-width: 992px) { + .navbar-expand-lg { + flex-flow: row nowrap; + justify-content: flex-start; + } + .navbar-expand-lg .navbar-nav { + flex-direction: row; + } + .navbar-expand-lg .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-lg .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-lg > .container, + .navbar-expand-lg > .container-fluid, .navbar-expand-lg > .container-sm, .navbar-expand-lg > .container-md, .navbar-expand-lg > .container-lg, .navbar-expand-lg > .container-xl { + flex-wrap: nowrap; + } + .navbar-expand-lg .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-lg .navbar-toggler { + display: none; + } +} + +@media (max-width: 1199.98px) { + .navbar-expand-xl > .container, + .navbar-expand-xl > .container-fluid, .navbar-expand-xl > .container-sm, .navbar-expand-xl > .container-md, .navbar-expand-xl > .container-lg, .navbar-expand-xl > .container-xl { + padding-right: 0; + padding-left: 0; + } +} + +@media (min-width: 1200px) { + .navbar-expand-xl { + flex-flow: row nowrap; + justify-content: flex-start; + } + .navbar-expand-xl .navbar-nav { + flex-direction: row; + } + .navbar-expand-xl .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-xl .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-xl > .container, + .navbar-expand-xl > .container-fluid, .navbar-expand-xl > .container-sm, .navbar-expand-xl > .container-md, .navbar-expand-xl > .container-lg, .navbar-expand-xl > .container-xl { + flex-wrap: nowrap; + } + .navbar-expand-xl .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-xl .navbar-toggler { + display: none; + } +} + +.navbar-expand { + flex-flow: row nowrap; + justify-content: flex-start; +} + +.navbar-expand > .container, +.navbar-expand > .container-fluid, .navbar-expand > .container-sm, .navbar-expand > .container-md, .navbar-expand > .container-lg, .navbar-expand > .container-xl { + padding-right: 0; + padding-left: 0; +} + +.navbar-expand .navbar-nav { + flex-direction: row; +} + +.navbar-expand .navbar-nav .dropdown-menu { + position: absolute; +} + +.navbar-expand .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; +} + +.navbar-expand > .container, +.navbar-expand > .container-fluid, .navbar-expand > .container-sm, .navbar-expand > .container-md, .navbar-expand > .container-lg, .navbar-expand > .container-xl { + flex-wrap: nowrap; +} + +.navbar-expand .navbar-collapse { + display: flex !important; + flex-basis: auto; +} + +.navbar-expand .navbar-toggler { + display: none; +} + +.navbar-light .navbar-brand { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-light .navbar-nav .nav-link { + color: rgba(0, 0, 0, 0.5); +} + +.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus { + color: rgba(0, 0, 0, 0.7); +} + +.navbar-light .navbar-nav .nav-link.disabled { + color: rgba(0, 0, 0, 0.3); +} + +.navbar-light .navbar-nav .show > .nav-link, +.navbar-light .navbar-nav .active > .nav-link, +.navbar-light .navbar-nav .nav-link.show, +.navbar-light .navbar-nav .nav-link.active { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-light .navbar-toggler { + color: rgba(0, 0, 0, 0.5); + border-color: rgba(0, 0, 0, 0.1); +} + +.navbar-light .navbar-toggler-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); +} + +.navbar-light .navbar-text { + color: rgba(0, 0, 0, 0.5); +} + +.navbar-light .navbar-text a { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-dark .navbar-brand { + color: #fff; +} + +.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus { + color: #fff; +} + +.navbar-dark .navbar-nav .nav-link { + color: rgba(255, 255, 255, 0.5); +} + +.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus { + color: rgba(255, 255, 255, 0.75); +} + +.navbar-dark .navbar-nav .nav-link.disabled { + color: rgba(255, 255, 255, 0.25); +} + +.navbar-dark .navbar-nav .show > .nav-link, +.navbar-dark .navbar-nav .active > .nav-link, +.navbar-dark .navbar-nav .nav-link.show, +.navbar-dark .navbar-nav .nav-link.active { + color: #fff; +} + +.navbar-dark .navbar-toggler { + color: rgba(255, 255, 255, 0.5); + border-color: rgba(255, 255, 255, 0.1); +} + +.navbar-dark .navbar-toggler-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); +} + +.navbar-dark .navbar-text { + color: rgba(255, 255, 255, 0.5); +} + +.navbar-dark .navbar-text a { + color: #fff; +} + +.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus { + color: #fff; +} + +.card { + position: relative; + display: flex; + flex-direction: column; + min-width: 0; + word-wrap: break-word; + background-color: #fff; + background-clip: border-box; + border: 1px solid rgba(0, 0, 0, 0.125); +} + +.card > hr { + margin-right: 0; + margin-left: 0; +} + +.card > .list-group { + border-top: inherit; + border-bottom: inherit; +} + +.card > .list-group:first-child { + border-top-width: 0; +} + +.card > .list-group:last-child { + border-bottom-width: 0; +} + +.card > .card-header + .list-group, +.card > .list-group + .card-footer { + border-top: 0; +} + +.card-body { + flex: 1 1 auto; + min-height: 1px; + padding: 1.25rem; +} + +.card-title { + margin-bottom: 0.75rem; +} + +.card-subtitle { + margin-top: -0.375rem; + margin-bottom: 0; +} + +.card-text:last-child { + margin-bottom: 0; +} + +.card-link:hover { + text-decoration: none; +} + +.card-link + .card-link { + margin-left: 1.25rem; +} + +.card-header { + padding: 0.75rem 1.25rem; + margin-bottom: 0; + background-color: rgba(0, 0, 0, 0.03); + border-bottom: 1px solid rgba(0, 0, 0, 0.125); +} + +.card-footer { + padding: 0.75rem 1.25rem; + background-color: rgba(0, 0, 0, 0.03); + border-top: 1px solid rgba(0, 0, 0, 0.125); +} + +.card-header-tabs { + margin-right: -0.625rem; + margin-bottom: -0.75rem; + margin-left: -0.625rem; + border-bottom: 0; +} + +.card-header-pills { + margin-right: -0.625rem; + margin-left: -0.625rem; +} + +.card-img-overlay { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: 1.25rem; +} + +.card-img, +.card-img-top, +.card-img-bottom { + flex-shrink: 0; + width: 100%; +} + +.card-deck .card { + margin-bottom: 15px; +} + +@media (min-width: 576px) { + .card-deck { + display: flex; + flex-flow: row wrap; + margin-right: -15px; + margin-left: -15px; + } + .card-deck .card { + flex: 1 0 0%; + margin-right: 15px; + margin-bottom: 0; + margin-left: 15px; + } +} + +.card-group > .card { + margin-bottom: 15px; +} + +@media (min-width: 576px) { + .card-group { + display: flex; + flex-flow: row wrap; + } + .card-group > .card { + flex: 1 0 0%; + margin-bottom: 0; + } + .card-group > .card + .card { + margin-left: 0; + border-left: 0; + } +} + +.card-columns .card { + margin-bottom: 0.75rem; +} + +@media (min-width: 576px) { + .card-columns { + column-count: 3; + column-gap: 1.25rem; + orphans: 1; + widows: 1; + } + .card-columns .card { + display: inline-block; + width: 100%; + } +} + +.accordion { + overflow-anchor: none; +} + +.accordion > .card { + overflow: hidden; +} + +.accordion > .card:not(:last-of-type) { + border-bottom: 0; +} + +.accordion > .card > .card-header { + margin-bottom: -1px; +} + +.breadcrumb { + display: flex; + flex-wrap: wrap; + padding: 0.5rem 1rem; + margin-bottom: 1rem; + list-style: none; + background-color: #e9ecef; +} + +.breadcrumb-item { + display: flex; +} + +.breadcrumb-item + .breadcrumb-item { + padding-left: 0.5rem; +} + +.breadcrumb-item + .breadcrumb-item::before { + display: inline-block; + padding-right: 0.5rem; + color: #6c757d; + content: "/"; +} + +.breadcrumb-item + .breadcrumb-item:hover::before { + text-decoration: underline; +} + +.breadcrumb-item + .breadcrumb-item:hover::before { + text-decoration: none; +} + +.breadcrumb-item.active { + color: #6c757d; +} + +.pagination { + display: flex; + padding-left: 0; + list-style: none; +} + +.page-link { + position: relative; + display: block; + padding: 0.5rem 0.75rem; + margin-left: -1px; + line-height: 1.25; + color: #083358; + background-color: #fff; + border: 1px solid #dee2e6; +} + +.page-link:hover { + z-index: 2; + color: #020a12; + text-decoration: none; + background-color: #e9ecef; + border-color: #dee2e6; +} + +.page-link:focus { + z-index: 3; + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(8, 51, 88, 0.25); +} + +.page-item:first-child .page-link { + margin-left: 0; +} + +.page-item.active .page-link { + z-index: 3; + color: #fff; + background-color: #083358; + border-color: #083358; +} + +.page-item.disabled .page-link { + color: #6c757d; + pointer-events: none; + cursor: auto; + background-color: #fff; + border-color: #dee2e6; +} + +.pagination-lg .page-link { + padding: 0.75rem 1.5rem; + font-size: 1.25rem; + line-height: 1.5; +} + +.pagination-sm .page-link { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; +} + +.badge { + display: inline-block; + padding: 0.25em 0.4em; + font-size: 75%; + font-weight: 700; + line-height: 1; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} + +@media (prefers-reduced-motion: reduce) { + .badge { + transition: none; + } +} + +a.badge:hover, a.badge:focus { + text-decoration: none; +} + +.badge:empty { + display: none; +} + +.btn .badge { + position: relative; + top: -1px; +} + +.badge-pill { + padding-right: 0.6em; + padding-left: 0.6em; +} + +.badge-primary { + color: #fff; + background-color: #083358; +} + +a.badge-primary:hover, a.badge-primary:focus { + color: #fff; + background-color: #041829; +} + +a.badge-primary:focus, a.badge-primary.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(8, 51, 88, 0.5); +} + +.badge-secondary { + color: #212529; + background-color: #b8b8b8; +} + +a.badge-secondary:hover, a.badge-secondary:focus { + color: #212529; + background-color: #9f9f9f; +} + +a.badge-secondary:focus, a.badge-secondary.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(184, 184, 184, 0.5); +} + +.badge-success { + color: #fff; + background-color: #008a29; +} + +a.badge-success:hover, a.badge-success:focus { + color: #fff; + background-color: #00571a; +} + +a.badge-success:focus, a.badge-success.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(0, 138, 41, 0.5); +} + +.badge-info { + color: #212529; + background-color: #74dbef; +} + +a.badge-info:hover, a.badge-info:focus { + color: #212529; + background-color: #46cfea; +} + +a.badge-info:focus, a.badge-info.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(116, 219, 239, 0.5); +} + +.badge-warning { + color: #212529; + background-color: #e6d200; +} + +a.badge-warning:hover, a.badge-warning:focus { + color: #212529; + background-color: #b3a300; +} + +a.badge-warning:focus, a.badge-warning.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(230, 210, 0, 0.5); +} + +.badge-danger { + color: #fff; + background-color: #e13737; +} + +a.badge-danger:hover, a.badge-danger:focus { + color: #fff; + background-color: #c71e1e; +} + +a.badge-danger:focus, a.badge-danger.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(225, 55, 55, 0.5); +} + +.badge-light { + color: #212529; + background-color: #f4f4f4; +} + +a.badge-light:hover, a.badge-light:focus { + color: #212529; + background-color: #dbdbdb; +} + +a.badge-light:focus, a.badge-light.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(244, 244, 244, 0.5); +} + +.badge-dark { + color: #fff; + background-color: #072247; +} + +a.badge-dark:hover, a.badge-dark:focus { + color: #fff; + background-color: #020c19; +} + +a.badge-dark:focus, a.badge-dark.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(7, 34, 71, 0.5); +} + +.jumbotron { + padding: 2rem 1rem; + margin-bottom: 2rem; + background-color: #e9ecef; +} + +@media (min-width: 576px) { + .jumbotron { + padding: 4rem 2rem; + } +} + +.jumbotron-fluid { + padding-right: 0; + padding-left: 0; +} + +.alert { + position: relative; + padding: 0.75rem 1.25rem; + margin-bottom: 1rem; + border: 1px solid transparent; +} + +.alert-heading { + color: inherit; +} + +.alert-link { + font-weight: 700; +} + +.alert-dismissible { + padding-right: 4rem; +} + +.alert-dismissible .close { + position: absolute; + top: 0; + right: 0; + padding: 0.75rem 1.25rem; + color: inherit; +} + +.alert-primary { + color: #041b2e; + background: #ced6de linear-gradient(180deg, #d5dce3, #ced6de) repeat-x; + border-color: #bac6d0; +} + +.alert-primary hr { + border-top-color: #abb9c6; +} + +.alert-primary .alert-link { + color: black; +} + +.alert-secondary { + color: #606060; + background: #f1f1f1 linear-gradient(180deg, #f3f3f3, #f1f1f1) repeat-x; + border-color: #ebebeb; +} + +.alert-secondary hr { + border-top-color: #dedede; +} + +.alert-secondary .alert-link { + color: #474747; +} + +.alert-success { + color: #004815; + background: #cce8d4 linear-gradient(180deg, #d4ebda, #cce8d4) repeat-x; + border-color: #b8dec3; +} + +.alert-success hr { + border-top-color: #a7d6b4; +} + +.alert-success .alert-link { + color: #001506; +} + +.alert-info { + color: #3c727c; + background: #e3f8fc linear-gradient(180deg, #e7f9fc, #e3f8fc) repeat-x; + border-color: #d8f5fb; +} + +.alert-info hr { + border-top-color: #c1eff9; +} + +.alert-info .alert-link { + color: #2b525a; +} + +.alert-warning { + color: #786d00; + background: #faf6cc linear-gradient(180deg, #fbf7d4, #faf6cc) repeat-x; + border-color: #f8f2b8; +} + +.alert-warning hr { + border-top-color: #f6eea1; +} + +.alert-warning .alert-link { + color: #453f00; +} + +.alert-danger { + color: #751d1d; + background: #f9d7d7 linear-gradient(180deg, #fadddd, #f9d7d7) repeat-x; + border-color: #f7c7c7; +} + +.alert-danger hr { + border-top-color: #f4b1b1; +} + +.alert-danger .alert-link { + color: #4c1313; +} + +.alert-light { + color: #7f7f7f; + background: #fdfdfd linear-gradient(180deg, #fdfdfd, #fdfdfd) repeat-x; + border-color: #fcfcfc; +} + +.alert-light hr { + border-top-color: #efefef; +} + +.alert-light .alert-link { + color: #666666; +} + +.alert-dark { + color: #041225; + background: #cdd3da linear-gradient(180deg, #d5dae0, #cdd3da) repeat-x; + border-color: #bac1cb; +} + +.alert-dark hr { + border-top-color: #abb4c0; +} + +.alert-dark .alert-link { + color: black; +} + +@keyframes progress-bar-stripes { + from { + background-position: 1rem 0; + } + to { + background-position: 0 0; + } +} + +.progress { + display: flex; + height: 1rem; + overflow: hidden; + line-height: 0; + font-size: 0.75rem; + background-color: #e9ecef; + box-shadow: inset 0 0.1rem 0.1rem rgba(0, 0, 0, 0.1); +} + +.progress-bar { + display: flex; + flex-direction: column; + justify-content: center; + overflow: hidden; + color: #fff; + text-align: center; + white-space: nowrap; + background-color: #083358; + transition: width 0.6s ease; +} + +@media (prefers-reduced-motion: reduce) { + .progress-bar { + transition: none; + } +} + +.progress-bar-striped { + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-size: 1rem 1rem; +} + +.progress-bar-animated { + animation: progress-bar-stripes 1s linear infinite; +} + +@media (prefers-reduced-motion: reduce) { + .progress-bar-animated { + animation: none; + } +} + +.media { + display: flex; + align-items: flex-start; +} + +.media-body { + flex: 1; +} + +.list-group { + display: flex; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; +} + +.list-group-item-action { + width: 100%; + color: #495057; + text-align: inherit; +} + +.list-group-item-action:hover, .list-group-item-action:focus { + z-index: 1; + color: #495057; + text-decoration: none; + background-color: #f8f9fa; +} + +.list-group-item-action:active { + color: #212529; + background-color: #e9ecef; +} + +.list-group-item { + position: relative; + display: block; + padding: 0.75rem 1.25rem; + background-color: #fff; + border: 1px solid rgba(0, 0, 0, 0.125); +} + +.list-group-item.disabled, .list-group-item:disabled { + color: #6c757d; + pointer-events: none; + background-color: #fff; +} + +.list-group-item.active { + z-index: 2; + color: #fff; + background-color: #083358; + border-color: #083358; +} + +.list-group-item + .list-group-item { + border-top-width: 0; +} + +.list-group-item + .list-group-item.active { + margin-top: -1px; + border-top-width: 1px; +} + +.list-group-horizontal { + flex-direction: row; +} + +.list-group-horizontal > .list-group-item.active { + margin-top: 0; +} + +.list-group-horizontal > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; +} + +.list-group-horizontal > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; +} + +@media (min-width: 576px) { + .list-group-horizontal-sm { + flex-direction: row; + } + .list-group-horizontal-sm > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-sm > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; + } + .list-group-horizontal-sm > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; + } +} + +@media (min-width: 768px) { + .list-group-horizontal-md { + flex-direction: row; + } + .list-group-horizontal-md > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-md > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; + } + .list-group-horizontal-md > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; + } +} + +@media (min-width: 992px) { + .list-group-horizontal-lg { + flex-direction: row; + } + .list-group-horizontal-lg > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-lg > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; + } + .list-group-horizontal-lg > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; + } +} + +@media (min-width: 1200px) { + .list-group-horizontal-xl { + flex-direction: row; + } + .list-group-horizontal-xl > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-xl > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; + } + .list-group-horizontal-xl > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; + } +} + +.list-group-flush > .list-group-item { + border-width: 0 0 1px; +} + +.list-group-flush > .list-group-item:last-child { + border-bottom-width: 0; +} + +.list-group-item-primary { + color: #041b2e; + background-color: #bac6d0; +} + +.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus { + color: #041b2e; + background-color: #abb9c6; +} + +.list-group-item-primary.list-group-item-action.active { + color: #fff; + background-color: #041b2e; + border-color: #041b2e; +} + +.list-group-item-secondary { + color: #606060; + background-color: #ebebeb; +} + +.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus { + color: #606060; + background-color: #dedede; +} + +.list-group-item-secondary.list-group-item-action.active { + color: #fff; + background-color: #606060; + border-color: #606060; +} + +.list-group-item-success { + color: #004815; + background-color: #b8dec3; +} + +.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus { + color: #004815; + background-color: #a7d6b4; +} + +.list-group-item-success.list-group-item-action.active { + color: #fff; + background-color: #004815; + border-color: #004815; +} + +.list-group-item-info { + color: #3c727c; + background-color: #d8f5fb; +} + +.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus { + color: #3c727c; + background-color: #c1eff9; +} + +.list-group-item-info.list-group-item-action.active { + color: #fff; + background-color: #3c727c; + border-color: #3c727c; +} + +.list-group-item-warning { + color: #786d00; + background-color: #f8f2b8; +} + +.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus { + color: #786d00; + background-color: #f6eea1; +} + +.list-group-item-warning.list-group-item-action.active { + color: #fff; + background-color: #786d00; + border-color: #786d00; +} + +.list-group-item-danger { + color: #751d1d; + background-color: #f7c7c7; +} + +.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus { + color: #751d1d; + background-color: #f4b1b1; +} + +.list-group-item-danger.list-group-item-action.active { + color: #fff; + background-color: #751d1d; + border-color: #751d1d; +} + +.list-group-item-light { + color: #7f7f7f; + background-color: #fcfcfc; +} + +.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus { + color: #7f7f7f; + background-color: #efefef; +} + +.list-group-item-light.list-group-item-action.active { + color: #fff; + background-color: #7f7f7f; + border-color: #7f7f7f; +} + +.list-group-item-dark { + color: #041225; + background-color: #bac1cb; +} + +.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus { + color: #041225; + background-color: #abb4c0; +} + +.list-group-item-dark.list-group-item-action.active { + color: #fff; + background-color: #041225; + border-color: #041225; +} + +.close { + float: right; + font-size: 1.5rem; + font-weight: 700; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + opacity: .5; +} + +.close:hover { + color: #000; + text-decoration: none; +} + +.close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus { + opacity: .75; +} + +button.close { + padding: 0; + background-color: transparent; + border: 0; +} + +a.close.disabled { + pointer-events: none; +} + +.toast { + flex-basis: 350px; + max-width: 350px; + font-size: 0.875rem; + background-color: rgba(255, 255, 255, 0.85); + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.1); + box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1); + opacity: 0; +} + +.toast:not(:last-child) { + margin-bottom: 0.75rem; +} + +.toast.showing { + opacity: 1; +} + +.toast.show { + display: block; + opacity: 1; +} + +.toast.hide { + display: none; +} + +.toast-header { + display: flex; + align-items: center; + padding: 0.25rem 0.75rem; + color: #6c757d; + background-color: rgba(255, 255, 255, 0.85); + background-clip: padding-box; + border-bottom: 1px solid rgba(0, 0, 0, 0.05); +} + +.toast-body { + padding: 0.75rem; +} + +.modal-open { + overflow: hidden; +} + +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} + +.modal { + position: fixed; + top: 0; + left: 0; + z-index: 1050; + display: none; + width: 100%; + height: 100%; + overflow: hidden; + outline: 0; +} + +.modal-dialog { + position: relative; + width: auto; + margin: 0.5rem; + pointer-events: none; +} + +.modal.fade .modal-dialog { + transition: transform 0.3s ease-out; + transform: translate(0, -50px); +} + +@media (prefers-reduced-motion: reduce) { + .modal.fade .modal-dialog { + transition: none; + } +} + +.modal.show .modal-dialog { + transform: none; +} + +.modal.modal-static .modal-dialog { + transform: scale(1.02); +} + +.modal-dialog-scrollable { + display: flex; + max-height: calc(100% - 1rem); +} + +.modal-dialog-scrollable .modal-content { + max-height: calc(100vh - 1rem); + overflow: hidden; +} + +.modal-dialog-scrollable .modal-header, +.modal-dialog-scrollable .modal-footer { + flex-shrink: 0; +} + +.modal-dialog-scrollable .modal-body { + overflow-y: auto; +} + +.modal-dialog-centered { + display: flex; + align-items: center; + min-height: calc(100% - 1rem); +} + +.modal-dialog-centered::before { + display: block; + height: calc(100vh - 1rem); + height: min-content; + content: ""; +} + +.modal-dialog-centered.modal-dialog-scrollable { + flex-direction: column; + justify-content: center; + height: 100%; +} + +.modal-dialog-centered.modal-dialog-scrollable .modal-content { + max-height: none; +} + +.modal-dialog-centered.modal-dialog-scrollable::before { + content: none; +} + +.modal-content { + position: relative; + display: flex; + flex-direction: column; + width: 100%; + pointer-events: auto; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.2); + box-shadow: 0 0.25rem 0.5rem rgba(0, 0, 0, 0.5); + outline: 0; +} + +.modal-backdrop { + position: fixed; + top: 0; + left: 0; + z-index: 1040; + width: 100vw; + height: 100vh; + background-color: #000; +} + +.modal-backdrop.fade { + opacity: 0; +} + +.modal-backdrop.show { + opacity: 0.5; +} + +.modal-header { + display: flex; + align-items: flex-start; + justify-content: space-between; + padding: 1rem 1rem; + border-bottom: 1px solid #e3e3e3; +} + +.modal-header .close { + padding: 1rem 1rem; + margin: -1rem -1rem -1rem auto; +} + +.modal-title { + margin-bottom: 0; + line-height: 1.5; +} + +.modal-body { + position: relative; + flex: 1 1 auto; + padding: 1rem; +} + +.modal-footer { + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: flex-end; + padding: 0.75rem; + border-top: 1px solid #e3e3e3; +} + +.modal-footer > * { + margin: 0.25rem; +} + +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} + +@media (min-width: 576px) { + .modal-dialog { + max-width: 500px; + margin: 1.75rem auto; + } + .modal-dialog-scrollable { + max-height: calc(100% - 3.5rem); + } + .modal-dialog-scrollable .modal-content { + max-height: calc(100vh - 3.5rem); + } + .modal-dialog-centered { + min-height: calc(100% - 3.5rem); + } + .modal-dialog-centered::before { + height: calc(100vh - 3.5rem); + height: min-content; + } + .modal-content { + box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.5); + } + .modal-sm { + max-width: 300px; + } +} + +@media (min-width: 992px) { + .modal-lg, + .modal-xl { + max-width: 800px; + } +} + +@media (min-width: 1200px) { + .modal-xl { + max-width: 1140px; + } +} + +.tooltip { + position: absolute; + z-index: 1070; + display: block; + margin: 0; + font-family: "Source Sans Pro"; + font-style: normal; + font-weight: 400; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + white-space: normal; + line-break: auto; + font-size: 0.875rem; + word-wrap: break-word; + opacity: 0; +} + +.tooltip.show { + opacity: 0.9; +} + +.tooltip .arrow { + position: absolute; + display: block; + width: 0.8rem; + height: 0.4rem; +} + +.tooltip .arrow::before { + position: absolute; + content: ""; + border-color: transparent; + border-style: solid; +} + +.bs-tooltip-top, .bs-tooltip-auto[x-placement^="top"] { + padding: 0.4rem 0; +} + +.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^="top"] .arrow { + bottom: 0; +} + +.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^="top"] .arrow::before { + top: 0; + border-width: 0.4rem 0.4rem 0; + border-top-color: #000; +} + +.bs-tooltip-right, .bs-tooltip-auto[x-placement^="right"] { + padding: 0 0.4rem; +} + +.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^="right"] .arrow { + left: 0; + width: 0.4rem; + height: 0.8rem; +} + +.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^="right"] .arrow::before { + right: 0; + border-width: 0.4rem 0.4rem 0.4rem 0; + border-right-color: #000; +} + +.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^="bottom"] { + padding: 0.4rem 0; +} + +.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^="bottom"] .arrow { + top: 0; +} + +.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^="bottom"] .arrow::before { + bottom: 0; + border-width: 0 0.4rem 0.4rem; + border-bottom-color: #000; +} + +.bs-tooltip-left, .bs-tooltip-auto[x-placement^="left"] { + padding: 0 0.4rem; +} + +.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^="left"] .arrow { + right: 0; + width: 0.4rem; + height: 0.8rem; +} + +.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^="left"] .arrow::before { + left: 0; + border-width: 0.4rem 0 0.4rem 0.4rem; + border-left-color: #000; +} + +.tooltip-inner { + max-width: 200px; + padding: 0.25rem 0.5rem; + color: #fff; + text-align: center; + background-color: #000; +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: block; + max-width: 276px; + font-family: "Source Sans Pro"; + font-style: normal; + font-weight: 400; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + white-space: normal; + line-break: auto; + font-size: 0.875rem; + word-wrap: break-word; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.2); + box-shadow: 0 0.25rem 0.5rem rgba(0, 0, 0, 0.2); +} + +.popover .arrow { + position: absolute; + display: block; + width: 1rem; + height: 0.5rem; + margin: 0 0.3rem; +} + +.popover .arrow::before, .popover .arrow::after { + position: absolute; + display: block; + content: ""; + border-color: transparent; + border-style: solid; +} + +.bs-popover-top, .bs-popover-auto[x-placement^="top"] { + margin-bottom: 0.5rem; +} + +.bs-popover-top > .arrow, .bs-popover-auto[x-placement^="top"] > .arrow { + bottom: calc(-0.5rem - 1px); +} + +.bs-popover-top > .arrow::before, .bs-popover-auto[x-placement^="top"] > .arrow::before { + bottom: 0; + border-width: 0.5rem 0.5rem 0; + border-top-color: rgba(0, 0, 0, 0.25); +} + +.bs-popover-top > .arrow::after, .bs-popover-auto[x-placement^="top"] > .arrow::after { + bottom: 1px; + border-width: 0.5rem 0.5rem 0; + border-top-color: #fff; +} + +.bs-popover-right, .bs-popover-auto[x-placement^="right"] { + margin-left: 0.5rem; +} + +.bs-popover-right > .arrow, .bs-popover-auto[x-placement^="right"] > .arrow { + left: calc(-0.5rem - 1px); + width: 0.5rem; + height: 1rem; + margin: 0.3rem 0; +} + +.bs-popover-right > .arrow::before, .bs-popover-auto[x-placement^="right"] > .arrow::before { + left: 0; + border-width: 0.5rem 0.5rem 0.5rem 0; + border-right-color: rgba(0, 0, 0, 0.25); +} + +.bs-popover-right > .arrow::after, .bs-popover-auto[x-placement^="right"] > .arrow::after { + left: 1px; + border-width: 0.5rem 0.5rem 0.5rem 0; + border-right-color: #fff; +} + +.bs-popover-bottom, .bs-popover-auto[x-placement^="bottom"] { + margin-top: 0.5rem; +} + +.bs-popover-bottom > .arrow, .bs-popover-auto[x-placement^="bottom"] > .arrow { + top: calc(-0.5rem - 1px); +} + +.bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^="bottom"] > .arrow::before { + top: 0; + border-width: 0 0.5rem 0.5rem 0.5rem; + border-bottom-color: rgba(0, 0, 0, 0.25); +} + +.bs-popover-bottom > .arrow::after, .bs-popover-auto[x-placement^="bottom"] > .arrow::after { + top: 1px; + border-width: 0 0.5rem 0.5rem 0.5rem; + border-bottom-color: #fff; +} + +.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^="bottom"] .popover-header::before { + position: absolute; + top: 0; + left: 50%; + display: block; + width: 1rem; + margin-left: -0.5rem; + content: ""; + border-bottom: 1px solid #f7f7f7; +} + +.bs-popover-left, .bs-popover-auto[x-placement^="left"] { + margin-right: 0.5rem; +} + +.bs-popover-left > .arrow, .bs-popover-auto[x-placement^="left"] > .arrow { + right: calc(-0.5rem - 1px); + width: 0.5rem; + height: 1rem; + margin: 0.3rem 0; +} + +.bs-popover-left > .arrow::before, .bs-popover-auto[x-placement^="left"] > .arrow::before { + right: 0; + border-width: 0.5rem 0 0.5rem 0.5rem; + border-left-color: rgba(0, 0, 0, 0.25); +} + +.bs-popover-left > .arrow::after, .bs-popover-auto[x-placement^="left"] > .arrow::after { + right: 1px; + border-width: 0.5rem 0 0.5rem 0.5rem; + border-left-color: #fff; +} + +.popover-header { + padding: 0.5rem 0.75rem; + margin-bottom: 0; + font-size: 1rem; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; +} + +.popover-header:empty { + display: none; +} + +.popover-body { + padding: 0.5rem 0.75rem; + color: #212529; +} + +.carousel { + position: relative; +} + +.carousel.pointer-event { + touch-action: pan-y; +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} + +.carousel-inner::after { + display: block; + clear: both; + content: ""; +} + +.carousel-item { + position: relative; + display: none; + float: left; + width: 100%; + margin-right: -100%; + backface-visibility: hidden; + transition: transform 0.6s ease-in-out; +} + +@media (prefers-reduced-motion: reduce) { + .carousel-item { + transition: none; + } +} + +.carousel-item.active, +.carousel-item-next, +.carousel-item-prev { + display: block; +} + +.carousel-item-next:not(.carousel-item-left), +.active.carousel-item-right { + transform: translateX(100%); +} + +.carousel-item-prev:not(.carousel-item-right), +.active.carousel-item-left { + transform: translateX(-100%); +} + +.carousel-fade .carousel-item { + opacity: 0; + transition-property: opacity; + transform: none; +} + +.carousel-fade .carousel-item.active, +.carousel-fade .carousel-item-next.carousel-item-left, +.carousel-fade .carousel-item-prev.carousel-item-right { + z-index: 1; + opacity: 1; +} + +.carousel-fade .active.carousel-item-left, +.carousel-fade .active.carousel-item-right { + z-index: 0; + opacity: 0; + transition: opacity 0s 0.6s; +} + +@media (prefers-reduced-motion: reduce) { + .carousel-fade .active.carousel-item-left, + .carousel-fade .active.carousel-item-right { + transition: none; + } +} + +.carousel-control-prev, +.carousel-control-next { + position: absolute; + top: 0; + bottom: 0; + z-index: 1; + display: flex; + align-items: center; + justify-content: center; + width: 15%; + color: #fff; + text-align: center; + opacity: 0.5; + transition: opacity 0.15s ease; +} + +@media (prefers-reduced-motion: reduce) { + .carousel-control-prev, + .carousel-control-next { + transition: none; + } +} + +.carousel-control-prev:hover, .carousel-control-prev:focus, +.carousel-control-next:hover, +.carousel-control-next:focus { + color: #fff; + text-decoration: none; + outline: 0; + opacity: 0.9; +} + +.carousel-control-prev { + left: 0; + background-image: linear-gradient(90deg, rgba(0, 0, 0, 0.25), rgba(0, 0, 0, 0.001)); +} + +.carousel-control-next { + right: 0; + background-image: linear-gradient(270deg, rgba(0, 0, 0, 0.25), rgba(0, 0, 0, 0.001)); +} + +.carousel-control-prev-icon, +.carousel-control-next-icon { + display: inline-block; + width: 20px; + height: 20px; + background: no-repeat 50% / 100% 100%; +} + +.carousel-control-prev-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3e%3c/svg%3e"); +} + +.carousel-control-next-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3e%3c/svg%3e"); +} + +.carousel-indicators { + position: absolute; + right: 0; + bottom: 0; + left: 0; + z-index: 15; + display: flex; + justify-content: center; + padding-left: 0; + margin-right: 15%; + margin-left: 15%; + list-style: none; +} + +.carousel-indicators li { + box-sizing: content-box; + flex: 0 1 auto; + width: 30px; + height: 3px; + margin-right: 3px; + margin-left: 3px; + text-indent: -999px; + cursor: pointer; + background-color: #fff; + background-clip: padding-box; + border-top: 10px solid transparent; + border-bottom: 10px solid transparent; + opacity: .5; + transition: opacity 0.6s ease; +} + +@media (prefers-reduced-motion: reduce) { + .carousel-indicators li { + transition: none; + } +} + +.carousel-indicators .active { + opacity: 1; +} + +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center; +} + +@keyframes spinner-border { + to { + transform: rotate(360deg); + } +} + +.spinner-border { + display: inline-block; + width: 2rem; + height: 2rem; + vertical-align: text-bottom; + border: 0.25em solid currentColor; + border-right-color: transparent; + border-radius: 50%; + animation: spinner-border .75s linear infinite; +} + +.spinner-border-sm { + width: 1rem; + height: 1rem; + border-width: 0.2em; +} + +@keyframes spinner-grow { + 0% { + transform: scale(0); + } + 50% { + opacity: 1; + transform: none; + } +} + +.spinner-grow { + display: inline-block; + width: 2rem; + height: 2rem; + vertical-align: text-bottom; + background-color: currentColor; + border-radius: 50%; + opacity: 0; + animation: spinner-grow .75s linear infinite; +} + +.spinner-grow-sm { + width: 1rem; + height: 1rem; +} + +.align-baseline { + vertical-align: baseline !important; +} + +.align-top { + vertical-align: top !important; +} + +.align-middle { + vertical-align: middle !important; +} + +.align-bottom { + vertical-align: bottom !important; +} + +.align-text-bottom { + vertical-align: text-bottom !important; +} + +.align-text-top { + vertical-align: text-top !important; +} + +.bg-primary { + background-color: #083358 !important; +} + +a.bg-primary:hover, a.bg-primary:focus, +button.bg-primary:hover, +button.bg-primary:focus { + background-color: #041829 !important; +} + +.bg-secondary { + background-color: #b8b8b8 !important; +} + +a.bg-secondary:hover, a.bg-secondary:focus, +button.bg-secondary:hover, +button.bg-secondary:focus { + background-color: #9f9f9f !important; +} + +.bg-success { + background-color: #008a29 !important; +} + +a.bg-success:hover, a.bg-success:focus, +button.bg-success:hover, +button.bg-success:focus { + background-color: #00571a !important; +} + +.bg-info { + background-color: #74dbef !important; +} + +a.bg-info:hover, a.bg-info:focus, +button.bg-info:hover, +button.bg-info:focus { + background-color: #46cfea !important; +} + +.bg-warning { + background-color: #e6d200 !important; +} + +a.bg-warning:hover, a.bg-warning:focus, +button.bg-warning:hover, +button.bg-warning:focus { + background-color: #b3a300 !important; +} + +.bg-danger { + background-color: #e13737 !important; +} + +a.bg-danger:hover, a.bg-danger:focus, +button.bg-danger:hover, +button.bg-danger:focus { + background-color: #c71e1e !important; +} + +.bg-light { + background-color: #f4f4f4 !important; +} + +a.bg-light:hover, a.bg-light:focus, +button.bg-light:hover, +button.bg-light:focus { + background-color: #dbdbdb !important; +} + +.bg-dark { + background-color: #072247 !important; +} + +a.bg-dark:hover, a.bg-dark:focus, +button.bg-dark:hover, +button.bg-dark:focus { + background-color: #020c19 !important; +} + +.bg-gradient-primary { + background: #083358 linear-gradient(180deg, #2d5271, #083358) repeat-x !important; +} + +.bg-gradient-secondary { + background: #b8b8b8 linear-gradient(180deg, #c3c3c3, #b8b8b8) repeat-x !important; +} + +.bg-gradient-success { + background: #008a29 linear-gradient(180deg, #269c49, #008a29) repeat-x !important; +} + +.bg-gradient-info { + background: #74dbef linear-gradient(180deg, #89e0f1, #74dbef) repeat-x !important; +} + +.bg-gradient-warning { + background: #e6d200 linear-gradient(180deg, #ead926, #e6d200) repeat-x !important; +} + +.bg-gradient-danger { + background: #e13737 linear-gradient(180deg, #e65555, #e13737) repeat-x !important; +} + +.bg-gradient-light { + background: #f4f4f4 linear-gradient(180deg, #f6f6f6, #f4f4f4) repeat-x !important; +} + +.bg-gradient-dark { + background: #072247 linear-gradient(180deg, #2c4363, #072247) repeat-x !important; +} + +.bg-white { + background-color: #fff !important; +} + +.bg-transparent { + background-color: transparent !important; +} + +.border { + border: 1px solid #e3e3e3 !important; +} + +.border-top { + border-top: 1px solid #e3e3e3 !important; +} + +.border-right { + border-right: 1px solid #e3e3e3 !important; +} + +.border-bottom { + border-bottom: 1px solid #e3e3e3 !important; +} + +.border-left { + border-left: 1px solid #e3e3e3 !important; +} + +.border-0 { + border: 0 !important; +} + +.border-top-0 { + border-top: 0 !important; +} + +.border-right-0 { + border-right: 0 !important; +} + +.border-bottom-0 { + border-bottom: 0 !important; +} + +.border-left-0 { + border-left: 0 !important; +} + +.border-primary { + border-color: #083358 !important; +} + +.border-secondary { + border-color: #b8b8b8 !important; +} + +.border-success { + border-color: #008a29 !important; +} + +.border-info { + border-color: #74dbef !important; +} + +.border-warning { + border-color: #e6d200 !important; +} + +.border-danger { + border-color: #e13737 !important; +} + +.border-light { + border-color: #f4f4f4 !important; +} + +.border-dark { + border-color: #072247 !important; +} + +.border-white { + border-color: #fff !important; +} + +.rounded-sm { + border-radius: 0.2rem !important; +} + +.rounded { + border-radius: 0.25rem !important; +} + +.rounded-top { + border-top-left-radius: 0.25rem !important; + border-top-right-radius: 0.25rem !important; +} + +.rounded-right { + border-top-right-radius: 0.25rem !important; + border-bottom-right-radius: 0.25rem !important; +} + +.rounded-bottom { + border-bottom-right-radius: 0.25rem !important; + border-bottom-left-radius: 0.25rem !important; +} + +.rounded-left { + border-top-left-radius: 0.25rem !important; + border-bottom-left-radius: 0.25rem !important; +} + +.rounded-lg { + border-radius: 0.3rem !important; +} + +.rounded-circle { + border-radius: 50% !important; +} + +.rounded-pill { + border-radius: 50rem !important; +} + +.rounded-0 { + border-radius: 0 !important; +} + +.clearfix::after { + display: block; + clear: both; + content: ""; +} + +.d-none { + display: none !important; +} + +.d-inline { + display: inline !important; +} + +.d-inline-block { + display: inline-block !important; +} + +.d-block { + display: block !important; +} + +.d-table { + display: table !important; +} + +.d-table-row { + display: table-row !important; +} + +.d-table-cell { + display: table-cell !important; +} + +.d-flex { + display: flex !important; +} + +.d-inline-flex { + display: inline-flex !important; +} + +@media (min-width: 576px) { + .d-sm-none { + display: none !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-block { + display: block !important; + } + .d-sm-table { + display: table !important; + } + .d-sm-table-row { + display: table-row !important; + } + .d-sm-table-cell { + display: table-cell !important; + } + .d-sm-flex { + display: flex !important; + } + .d-sm-inline-flex { + display: inline-flex !important; + } +} + +@media (min-width: 768px) { + .d-md-none { + display: none !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-block { + display: block !important; + } + .d-md-table { + display: table !important; + } + .d-md-table-row { + display: table-row !important; + } + .d-md-table-cell { + display: table-cell !important; + } + .d-md-flex { + display: flex !important; + } + .d-md-inline-flex { + display: inline-flex !important; + } +} + +@media (min-width: 992px) { + .d-lg-none { + display: none !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-block { + display: block !important; + } + .d-lg-table { + display: table !important; + } + .d-lg-table-row { + display: table-row !important; + } + .d-lg-table-cell { + display: table-cell !important; + } + .d-lg-flex { + display: flex !important; + } + .d-lg-inline-flex { + display: inline-flex !important; + } +} + +@media (min-width: 1200px) { + .d-xl-none { + display: none !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-block { + display: block !important; + } + .d-xl-table { + display: table !important; + } + .d-xl-table-row { + display: table-row !important; + } + .d-xl-table-cell { + display: table-cell !important; + } + .d-xl-flex { + display: flex !important; + } + .d-xl-inline-flex { + display: inline-flex !important; + } +} + +@media print { + .d-print-none { + display: none !important; + } + .d-print-inline { + display: inline !important; + } + .d-print-inline-block { + display: inline-block !important; + } + .d-print-block { + display: block !important; + } + .d-print-table { + display: table !important; + } + .d-print-table-row { + display: table-row !important; + } + .d-print-table-cell { + display: table-cell !important; + } + .d-print-flex { + display: flex !important; + } + .d-print-inline-flex { + display: inline-flex !important; + } +} + +.embed-responsive { + position: relative; + display: block; + width: 100%; + padding: 0; + overflow: hidden; +} + +.embed-responsive::before { + display: block; + content: ""; +} + +.embed-responsive .embed-responsive-item, +.embed-responsive iframe, +.embed-responsive embed, +.embed-responsive object, +.embed-responsive video { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0; +} + +.embed-responsive-21by9::before { + padding-top: 42.857143%; +} + +.embed-responsive-16by9::before { + padding-top: 56.25%; +} + +.embed-responsive-4by3::before { + padding-top: 75%; +} + +.embed-responsive-1by1::before { + padding-top: 100%; +} + +.flex-row { + flex-direction: row !important; +} + +.flex-column { + flex-direction: column !important; +} + +.flex-row-reverse { + flex-direction: row-reverse !important; +} + +.flex-column-reverse { + flex-direction: column-reverse !important; +} + +.flex-wrap { + flex-wrap: wrap !important; +} + +.flex-nowrap { + flex-wrap: nowrap !important; +} + +.flex-wrap-reverse { + flex-wrap: wrap-reverse !important; +} + +.flex-fill { + flex: 1 1 auto !important; +} + +.flex-grow-0 { + flex-grow: 0 !important; +} + +.flex-grow-1 { + flex-grow: 1 !important; +} + +.flex-shrink-0 { + flex-shrink: 0 !important; +} + +.flex-shrink-1 { + flex-shrink: 1 !important; +} + +.justify-content-start { + justify-content: flex-start !important; +} + +.justify-content-end { + justify-content: flex-end !important; +} + +.justify-content-center { + justify-content: center !important; +} + +.justify-content-between { + justify-content: space-between !important; +} + +.justify-content-around { + justify-content: space-around !important; +} + +.align-items-start { + align-items: flex-start !important; +} + +.align-items-end { + align-items: flex-end !important; +} + +.align-items-center { + align-items: center !important; +} + +.align-items-baseline { + align-items: baseline !important; +} + +.align-items-stretch { + align-items: stretch !important; +} + +.align-content-start { + align-content: flex-start !important; +} + +.align-content-end { + align-content: flex-end !important; +} + +.align-content-center { + align-content: center !important; +} + +.align-content-between { + align-content: space-between !important; +} + +.align-content-around { + align-content: space-around !important; +} + +.align-content-stretch { + align-content: stretch !important; +} + +.align-self-auto { + align-self: auto !important; +} + +.align-self-start { + align-self: flex-start !important; +} + +.align-self-end { + align-self: flex-end !important; +} + +.align-self-center { + align-self: center !important; +} + +.align-self-baseline { + align-self: baseline !important; +} + +.align-self-stretch { + align-self: stretch !important; +} + +@media (min-width: 576px) { + .flex-sm-row { + flex-direction: row !important; + } + .flex-sm-column { + flex-direction: column !important; + } + .flex-sm-row-reverse { + flex-direction: row-reverse !important; + } + .flex-sm-column-reverse { + flex-direction: column-reverse !important; + } + .flex-sm-wrap { + flex-wrap: wrap !important; + } + .flex-sm-nowrap { + flex-wrap: nowrap !important; + } + .flex-sm-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .flex-sm-fill { + flex: 1 1 auto !important; + } + .flex-sm-grow-0 { + flex-grow: 0 !important; + } + .flex-sm-grow-1 { + flex-grow: 1 !important; + } + .flex-sm-shrink-0 { + flex-shrink: 0 !important; + } + .flex-sm-shrink-1 { + flex-shrink: 1 !important; + } + .justify-content-sm-start { + justify-content: flex-start !important; + } + .justify-content-sm-end { + justify-content: flex-end !important; + } + .justify-content-sm-center { + justify-content: center !important; + } + .justify-content-sm-between { + justify-content: space-between !important; + } + .justify-content-sm-around { + justify-content: space-around !important; + } + .align-items-sm-start { + align-items: flex-start !important; + } + .align-items-sm-end { + align-items: flex-end !important; + } + .align-items-sm-center { + align-items: center !important; + } + .align-items-sm-baseline { + align-items: baseline !important; + } + .align-items-sm-stretch { + align-items: stretch !important; + } + .align-content-sm-start { + align-content: flex-start !important; + } + .align-content-sm-end { + align-content: flex-end !important; + } + .align-content-sm-center { + align-content: center !important; + } + .align-content-sm-between { + align-content: space-between !important; + } + .align-content-sm-around { + align-content: space-around !important; + } + .align-content-sm-stretch { + align-content: stretch !important; + } + .align-self-sm-auto { + align-self: auto !important; + } + .align-self-sm-start { + align-self: flex-start !important; + } + .align-self-sm-end { + align-self: flex-end !important; + } + .align-self-sm-center { + align-self: center !important; + } + .align-self-sm-baseline { + align-self: baseline !important; + } + .align-self-sm-stretch { + align-self: stretch !important; + } +} + +@media (min-width: 768px) { + .flex-md-row { + flex-direction: row !important; + } + .flex-md-column { + flex-direction: column !important; + } + .flex-md-row-reverse { + flex-direction: row-reverse !important; + } + .flex-md-column-reverse { + flex-direction: column-reverse !important; + } + .flex-md-wrap { + flex-wrap: wrap !important; + } + .flex-md-nowrap { + flex-wrap: nowrap !important; + } + .flex-md-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .flex-md-fill { + flex: 1 1 auto !important; + } + .flex-md-grow-0 { + flex-grow: 0 !important; + } + .flex-md-grow-1 { + flex-grow: 1 !important; + } + .flex-md-shrink-0 { + flex-shrink: 0 !important; + } + .flex-md-shrink-1 { + flex-shrink: 1 !important; + } + .justify-content-md-start { + justify-content: flex-start !important; + } + .justify-content-md-end { + justify-content: flex-end !important; + } + .justify-content-md-center { + justify-content: center !important; + } + .justify-content-md-between { + justify-content: space-between !important; + } + .justify-content-md-around { + justify-content: space-around !important; + } + .align-items-md-start { + align-items: flex-start !important; + } + .align-items-md-end { + align-items: flex-end !important; + } + .align-items-md-center { + align-items: center !important; + } + .align-items-md-baseline { + align-items: baseline !important; + } + .align-items-md-stretch { + align-items: stretch !important; + } + .align-content-md-start { + align-content: flex-start !important; + } + .align-content-md-end { + align-content: flex-end !important; + } + .align-content-md-center { + align-content: center !important; + } + .align-content-md-between { + align-content: space-between !important; + } + .align-content-md-around { + align-content: space-around !important; + } + .align-content-md-stretch { + align-content: stretch !important; + } + .align-self-md-auto { + align-self: auto !important; + } + .align-self-md-start { + align-self: flex-start !important; + } + .align-self-md-end { + align-self: flex-end !important; + } + .align-self-md-center { + align-self: center !important; + } + .align-self-md-baseline { + align-self: baseline !important; + } + .align-self-md-stretch { + align-self: stretch !important; + } +} + +@media (min-width: 992px) { + .flex-lg-row { + flex-direction: row !important; + } + .flex-lg-column { + flex-direction: column !important; + } + .flex-lg-row-reverse { + flex-direction: row-reverse !important; + } + .flex-lg-column-reverse { + flex-direction: column-reverse !important; + } + .flex-lg-wrap { + flex-wrap: wrap !important; + } + .flex-lg-nowrap { + flex-wrap: nowrap !important; + } + .flex-lg-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .flex-lg-fill { + flex: 1 1 auto !important; + } + .flex-lg-grow-0 { + flex-grow: 0 !important; + } + .flex-lg-grow-1 { + flex-grow: 1 !important; + } + .flex-lg-shrink-0 { + flex-shrink: 0 !important; + } + .flex-lg-shrink-1 { + flex-shrink: 1 !important; + } + .justify-content-lg-start { + justify-content: flex-start !important; + } + .justify-content-lg-end { + justify-content: flex-end !important; + } + .justify-content-lg-center { + justify-content: center !important; + } + .justify-content-lg-between { + justify-content: space-between !important; + } + .justify-content-lg-around { + justify-content: space-around !important; + } + .align-items-lg-start { + align-items: flex-start !important; + } + .align-items-lg-end { + align-items: flex-end !important; + } + .align-items-lg-center { + align-items: center !important; + } + .align-items-lg-baseline { + align-items: baseline !important; + } + .align-items-lg-stretch { + align-items: stretch !important; + } + .align-content-lg-start { + align-content: flex-start !important; + } + .align-content-lg-end { + align-content: flex-end !important; + } + .align-content-lg-center { + align-content: center !important; + } + .align-content-lg-between { + align-content: space-between !important; + } + .align-content-lg-around { + align-content: space-around !important; + } + .align-content-lg-stretch { + align-content: stretch !important; + } + .align-self-lg-auto { + align-self: auto !important; + } + .align-self-lg-start { + align-self: flex-start !important; + } + .align-self-lg-end { + align-self: flex-end !important; + } + .align-self-lg-center { + align-self: center !important; + } + .align-self-lg-baseline { + align-self: baseline !important; + } + .align-self-lg-stretch { + align-self: stretch !important; + } +} + +@media (min-width: 1200px) { + .flex-xl-row { + flex-direction: row !important; + } + .flex-xl-column { + flex-direction: column !important; + } + .flex-xl-row-reverse { + flex-direction: row-reverse !important; + } + .flex-xl-column-reverse { + flex-direction: column-reverse !important; + } + .flex-xl-wrap { + flex-wrap: wrap !important; + } + .flex-xl-nowrap { + flex-wrap: nowrap !important; + } + .flex-xl-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .flex-xl-fill { + flex: 1 1 auto !important; + } + .flex-xl-grow-0 { + flex-grow: 0 !important; + } + .flex-xl-grow-1 { + flex-grow: 1 !important; + } + .flex-xl-shrink-0 { + flex-shrink: 0 !important; + } + .flex-xl-shrink-1 { + flex-shrink: 1 !important; + } + .justify-content-xl-start { + justify-content: flex-start !important; + } + .justify-content-xl-end { + justify-content: flex-end !important; + } + .justify-content-xl-center { + justify-content: center !important; + } + .justify-content-xl-between { + justify-content: space-between !important; + } + .justify-content-xl-around { + justify-content: space-around !important; + } + .align-items-xl-start { + align-items: flex-start !important; + } + .align-items-xl-end { + align-items: flex-end !important; + } + .align-items-xl-center { + align-items: center !important; + } + .align-items-xl-baseline { + align-items: baseline !important; + } + .align-items-xl-stretch { + align-items: stretch !important; + } + .align-content-xl-start { + align-content: flex-start !important; + } + .align-content-xl-end { + align-content: flex-end !important; + } + .align-content-xl-center { + align-content: center !important; + } + .align-content-xl-between { + align-content: space-between !important; + } + .align-content-xl-around { + align-content: space-around !important; + } + .align-content-xl-stretch { + align-content: stretch !important; + } + .align-self-xl-auto { + align-self: auto !important; + } + .align-self-xl-start { + align-self: flex-start !important; + } + .align-self-xl-end { + align-self: flex-end !important; + } + .align-self-xl-center { + align-self: center !important; + } + .align-self-xl-baseline { + align-self: baseline !important; + } + .align-self-xl-stretch { + align-self: stretch !important; + } +} + +.float-left { + float: left !important; +} + +.float-right { + float: right !important; +} + +.float-none { + float: none !important; +} + +@media (min-width: 576px) { + .float-sm-left { + float: left !important; + } + .float-sm-right { + float: right !important; + } + .float-sm-none { + float: none !important; + } +} + +@media (min-width: 768px) { + .float-md-left { + float: left !important; + } + .float-md-right { + float: right !important; + } + .float-md-none { + float: none !important; + } +} + +@media (min-width: 992px) { + .float-lg-left { + float: left !important; + } + .float-lg-right { + float: right !important; + } + .float-lg-none { + float: none !important; + } +} + +@media (min-width: 1200px) { + .float-xl-left { + float: left !important; + } + .float-xl-right { + float: right !important; + } + .float-xl-none { + float: none !important; + } +} + +.user-select-all { + user-select: all !important; +} + +.user-select-auto { + user-select: auto !important; +} + +.user-select-none { + user-select: none !important; +} + +.overflow-auto { + overflow: auto !important; +} + +.overflow-hidden { + overflow: hidden !important; +} + +.position-static { + position: static !important; +} + +.position-relative { + position: relative !important; +} + +.position-absolute { + position: absolute !important; +} + +.position-fixed { + position: fixed !important; +} + +.position-sticky { + position: sticky !important; +} + +.fixed-top { + position: fixed; + top: 0; + right: 0; + left: 0; + z-index: 1030; +} + +.fixed-bottom { + position: fixed; + right: 0; + bottom: 0; + left: 0; + z-index: 1030; +} + +@supports (position: sticky) { + .sticky-top { + position: sticky; + top: 0; + z-index: 1020; + } +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; +} + +.sr-only-focusable:active, .sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + overflow: visible; + clip: auto; + white-space: normal; +} + +.shadow-sm { + box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important; +} + +.shadow { + box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important; +} + +.shadow-lg { + box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important; +} + +.shadow-none { + box-shadow: none !important; +} + +.w-25 { + width: 25% !important; +} + +.w-50 { + width: 50% !important; +} + +.w-75 { + width: 75% !important; +} + +.w-100 { + width: 100% !important; +} + +.w-auto { + width: auto !important; +} + +.h-25 { + height: 25% !important; +} + +.h-50 { + height: 50% !important; +} + +.h-75 { + height: 75% !important; +} + +.h-100 { + height: 100% !important; +} + +.h-auto { + height: auto !important; +} + +.mw-100 { + max-width: 100% !important; +} + +.mh-100 { + max-height: 100% !important; +} + +.min-vw-100 { + min-width: 100vw !important; +} + +.min-vh-100 { + min-height: 100vh !important; +} + +.vw-100 { + width: 100vw !important; +} + +.vh-100 { + height: 100vh !important; +} + +.m-0 { + margin: 0 !important; +} + +.mt-0, +.my-0 { + margin-top: 0 !important; +} + +.mr-0, +.mx-0 { + margin-right: 0 !important; +} + +.mb-0, +.my-0 { + margin-bottom: 0 !important; +} + +.ml-0, +.mx-0 { + margin-left: 0 !important; +} + +.m-1 { + margin: 0.125rem !important; +} + +.mt-1, +.my-1 { + margin-top: 0.125rem !important; +} + +.mr-1, +.mx-1 { + margin-right: 0.125rem !important; +} + +.mb-1, +.my-1 { + margin-bottom: 0.125rem !important; +} + +.ml-1, +.mx-1 { + margin-left: 0.125rem !important; +} + +.m-2 { + margin: 0.25rem !important; +} + +.mt-2, +.my-2 { + margin-top: 0.25rem !important; +} + +.mr-2, +.mx-2 { + margin-right: 0.25rem !important; +} + +.mb-2, +.my-2 { + margin-bottom: 0.25rem !important; +} + +.ml-2, +.mx-2 { + margin-left: 0.25rem !important; +} + +.m-3 { + margin: 0.5rem !important; +} + +.mt-3, +.my-3 { + margin-top: 0.5rem !important; +} + +.mr-3, +.mx-3 { + margin-right: 0.5rem !important; +} + +.mb-3, +.my-3 { + margin-bottom: 0.5rem !important; +} + +.ml-3, +.mx-3 { + margin-left: 0.5rem !important; +} + +.m-4 { + margin: 0.75rem !important; +} + +.mt-4, +.my-4 { + margin-top: 0.75rem !important; +} + +.mr-4, +.mx-4 { + margin-right: 0.75rem !important; +} + +.mb-4, +.my-4 { + margin-bottom: 0.75rem !important; +} + +.ml-4, +.mx-4 { + margin-left: 0.75rem !important; +} + +.m-5 { + margin: 1.5rem !important; +} + +.mt-5, +.my-5 { + margin-top: 1.5rem !important; +} + +.mr-5, +.mx-5 { + margin-right: 1.5rem !important; +} + +.mb-5, +.my-5 { + margin-bottom: 1.5rem !important; +} + +.ml-5, +.mx-5 { + margin-left: 1.5rem !important; +} + +.p-0 { + padding: 0 !important; +} + +.pt-0, +.py-0 { + padding-top: 0 !important; +} + +.pr-0, +.px-0 { + padding-right: 0 !important; +} + +.pb-0, +.py-0 { + padding-bottom: 0 !important; +} + +.pl-0, +.px-0 { + padding-left: 0 !important; +} + +.p-1 { + padding: 0.125rem !important; +} + +.pt-1, +.py-1 { + padding-top: 0.125rem !important; +} + +.pr-1, +.px-1 { + padding-right: 0.125rem !important; +} + +.pb-1, +.py-1 { + padding-bottom: 0.125rem !important; +} + +.pl-1, +.px-1 { + padding-left: 0.125rem !important; +} + +.p-2 { + padding: 0.25rem !important; +} + +.pt-2, +.py-2 { + padding-top: 0.25rem !important; +} + +.pr-2, +.px-2 { + padding-right: 0.25rem !important; +} + +.pb-2, +.py-2 { + padding-bottom: 0.25rem !important; +} + +.pl-2, +.px-2 { + padding-left: 0.25rem !important; +} + +.p-3 { + padding: 0.5rem !important; +} + +.pt-3, +.py-3 { + padding-top: 0.5rem !important; +} + +.pr-3, +.px-3 { + padding-right: 0.5rem !important; +} + +.pb-3, +.py-3 { + padding-bottom: 0.5rem !important; +} + +.pl-3, +.px-3 { + padding-left: 0.5rem !important; +} + +.p-4 { + padding: 0.75rem !important; +} + +.pt-4, +.py-4 { + padding-top: 0.75rem !important; +} + +.pr-4, +.px-4 { + padding-right: 0.75rem !important; +} + +.pb-4, +.py-4 { + padding-bottom: 0.75rem !important; +} + +.pl-4, +.px-4 { + padding-left: 0.75rem !important; +} + +.p-5 { + padding: 1.5rem !important; +} + +.pt-5, +.py-5 { + padding-top: 1.5rem !important; +} + +.pr-5, +.px-5 { + padding-right: 1.5rem !important; +} + +.pb-5, +.py-5 { + padding-bottom: 1.5rem !important; +} + +.pl-5, +.px-5 { + padding-left: 1.5rem !important; +} + +.m-n1 { + margin: -0.125rem !important; +} + +.mt-n1, +.my-n1 { + margin-top: -0.125rem !important; +} + +.mr-n1, +.mx-n1 { + margin-right: -0.125rem !important; +} + +.mb-n1, +.my-n1 { + margin-bottom: -0.125rem !important; +} + +.ml-n1, +.mx-n1 { + margin-left: -0.125rem !important; +} + +.m-n2 { + margin: -0.25rem !important; +} + +.mt-n2, +.my-n2 { + margin-top: -0.25rem !important; +} + +.mr-n2, +.mx-n2 { + margin-right: -0.25rem !important; +} + +.mb-n2, +.my-n2 { + margin-bottom: -0.25rem !important; +} + +.ml-n2, +.mx-n2 { + margin-left: -0.25rem !important; +} + +.m-n3 { + margin: -0.5rem !important; +} + +.mt-n3, +.my-n3 { + margin-top: -0.5rem !important; +} + +.mr-n3, +.mx-n3 { + margin-right: -0.5rem !important; +} + +.mb-n3, +.my-n3 { + margin-bottom: -0.5rem !important; +} + +.ml-n3, +.mx-n3 { + margin-left: -0.5rem !important; +} + +.m-n4 { + margin: -0.75rem !important; +} + +.mt-n4, +.my-n4 { + margin-top: -0.75rem !important; +} + +.mr-n4, +.mx-n4 { + margin-right: -0.75rem !important; +} + +.mb-n4, +.my-n4 { + margin-bottom: -0.75rem !important; +} + +.ml-n4, +.mx-n4 { + margin-left: -0.75rem !important; +} + +.m-n5 { + margin: -1.5rem !important; +} + +.mt-n5, +.my-n5 { + margin-top: -1.5rem !important; +} + +.mr-n5, +.mx-n5 { + margin-right: -1.5rem !important; +} + +.mb-n5, +.my-n5 { + margin-bottom: -1.5rem !important; +} + +.ml-n5, +.mx-n5 { + margin-left: -1.5rem !important; +} + +.m-auto { + margin: auto !important; +} + +.mt-auto, +.my-auto { + margin-top: auto !important; +} + +.mr-auto, +.mx-auto { + margin-right: auto !important; +} + +.mb-auto, +.my-auto { + margin-bottom: auto !important; +} + +.ml-auto, +.mx-auto { + margin-left: auto !important; +} + +@media (min-width: 576px) { + .m-sm-0 { + margin: 0 !important; + } + .mt-sm-0, + .my-sm-0 { + margin-top: 0 !important; + } + .mr-sm-0, + .mx-sm-0 { + margin-right: 0 !important; + } + .mb-sm-0, + .my-sm-0 { + margin-bottom: 0 !important; + } + .ml-sm-0, + .mx-sm-0 { + margin-left: 0 !important; + } + .m-sm-1 { + margin: 0.125rem !important; + } + .mt-sm-1, + .my-sm-1 { + margin-top: 0.125rem !important; + } + .mr-sm-1, + .mx-sm-1 { + margin-right: 0.125rem !important; + } + .mb-sm-1, + .my-sm-1 { + margin-bottom: 0.125rem !important; + } + .ml-sm-1, + .mx-sm-1 { + margin-left: 0.125rem !important; + } + .m-sm-2 { + margin: 0.25rem !important; + } + .mt-sm-2, + .my-sm-2 { + margin-top: 0.25rem !important; + } + .mr-sm-2, + .mx-sm-2 { + margin-right: 0.25rem !important; + } + .mb-sm-2, + .my-sm-2 { + margin-bottom: 0.25rem !important; + } + .ml-sm-2, + .mx-sm-2 { + margin-left: 0.25rem !important; + } + .m-sm-3 { + margin: 0.5rem !important; + } + .mt-sm-3, + .my-sm-3 { + margin-top: 0.5rem !important; + } + .mr-sm-3, + .mx-sm-3 { + margin-right: 0.5rem !important; + } + .mb-sm-3, + .my-sm-3 { + margin-bottom: 0.5rem !important; + } + .ml-sm-3, + .mx-sm-3 { + margin-left: 0.5rem !important; + } + .m-sm-4 { + margin: 0.75rem !important; + } + .mt-sm-4, + .my-sm-4 { + margin-top: 0.75rem !important; + } + .mr-sm-4, + .mx-sm-4 { + margin-right: 0.75rem !important; + } + .mb-sm-4, + .my-sm-4 { + margin-bottom: 0.75rem !important; + } + .ml-sm-4, + .mx-sm-4 { + margin-left: 0.75rem !important; + } + .m-sm-5 { + margin: 1.5rem !important; + } + .mt-sm-5, + .my-sm-5 { + margin-top: 1.5rem !important; + } + .mr-sm-5, + .mx-sm-5 { + margin-right: 1.5rem !important; + } + .mb-sm-5, + .my-sm-5 { + margin-bottom: 1.5rem !important; + } + .ml-sm-5, + .mx-sm-5 { + margin-left: 1.5rem !important; + } + .p-sm-0 { + padding: 0 !important; + } + .pt-sm-0, + .py-sm-0 { + padding-top: 0 !important; + } + .pr-sm-0, + .px-sm-0 { + padding-right: 0 !important; + } + .pb-sm-0, + .py-sm-0 { + padding-bottom: 0 !important; + } + .pl-sm-0, + .px-sm-0 { + padding-left: 0 !important; + } + .p-sm-1 { + padding: 0.125rem !important; + } + .pt-sm-1, + .py-sm-1 { + padding-top: 0.125rem !important; + } + .pr-sm-1, + .px-sm-1 { + padding-right: 0.125rem !important; + } + .pb-sm-1, + .py-sm-1 { + padding-bottom: 0.125rem !important; + } + .pl-sm-1, + .px-sm-1 { + padding-left: 0.125rem !important; + } + .p-sm-2 { + padding: 0.25rem !important; + } + .pt-sm-2, + .py-sm-2 { + padding-top: 0.25rem !important; + } + .pr-sm-2, + .px-sm-2 { + padding-right: 0.25rem !important; + } + .pb-sm-2, + .py-sm-2 { + padding-bottom: 0.25rem !important; + } + .pl-sm-2, + .px-sm-2 { + padding-left: 0.25rem !important; + } + .p-sm-3 { + padding: 0.5rem !important; + } + .pt-sm-3, + .py-sm-3 { + padding-top: 0.5rem !important; + } + .pr-sm-3, + .px-sm-3 { + padding-right: 0.5rem !important; + } + .pb-sm-3, + .py-sm-3 { + padding-bottom: 0.5rem !important; + } + .pl-sm-3, + .px-sm-3 { + padding-left: 0.5rem !important; + } + .p-sm-4 { + padding: 0.75rem !important; + } + .pt-sm-4, + .py-sm-4 { + padding-top: 0.75rem !important; + } + .pr-sm-4, + .px-sm-4 { + padding-right: 0.75rem !important; + } + .pb-sm-4, + .py-sm-4 { + padding-bottom: 0.75rem !important; + } + .pl-sm-4, + .px-sm-4 { + padding-left: 0.75rem !important; + } + .p-sm-5 { + padding: 1.5rem !important; + } + .pt-sm-5, + .py-sm-5 { + padding-top: 1.5rem !important; + } + .pr-sm-5, + .px-sm-5 { + padding-right: 1.5rem !important; + } + .pb-sm-5, + .py-sm-5 { + padding-bottom: 1.5rem !important; + } + .pl-sm-5, + .px-sm-5 { + padding-left: 1.5rem !important; + } + .m-sm-n1 { + margin: -0.125rem !important; + } + .mt-sm-n1, + .my-sm-n1 { + margin-top: -0.125rem !important; + } + .mr-sm-n1, + .mx-sm-n1 { + margin-right: -0.125rem !important; + } + .mb-sm-n1, + .my-sm-n1 { + margin-bottom: -0.125rem !important; + } + .ml-sm-n1, + .mx-sm-n1 { + margin-left: -0.125rem !important; + } + .m-sm-n2 { + margin: -0.25rem !important; + } + .mt-sm-n2, + .my-sm-n2 { + margin-top: -0.25rem !important; + } + .mr-sm-n2, + .mx-sm-n2 { + margin-right: -0.25rem !important; + } + .mb-sm-n2, + .my-sm-n2 { + margin-bottom: -0.25rem !important; + } + .ml-sm-n2, + .mx-sm-n2 { + margin-left: -0.25rem !important; + } + .m-sm-n3 { + margin: -0.5rem !important; + } + .mt-sm-n3, + .my-sm-n3 { + margin-top: -0.5rem !important; + } + .mr-sm-n3, + .mx-sm-n3 { + margin-right: -0.5rem !important; + } + .mb-sm-n3, + .my-sm-n3 { + margin-bottom: -0.5rem !important; + } + .ml-sm-n3, + .mx-sm-n3 { + margin-left: -0.5rem !important; + } + .m-sm-n4 { + margin: -0.75rem !important; + } + .mt-sm-n4, + .my-sm-n4 { + margin-top: -0.75rem !important; + } + .mr-sm-n4, + .mx-sm-n4 { + margin-right: -0.75rem !important; + } + .mb-sm-n4, + .my-sm-n4 { + margin-bottom: -0.75rem !important; + } + .ml-sm-n4, + .mx-sm-n4 { + margin-left: -0.75rem !important; + } + .m-sm-n5 { + margin: -1.5rem !important; + } + .mt-sm-n5, + .my-sm-n5 { + margin-top: -1.5rem !important; + } + .mr-sm-n5, + .mx-sm-n5 { + margin-right: -1.5rem !important; + } + .mb-sm-n5, + .my-sm-n5 { + margin-bottom: -1.5rem !important; + } + .ml-sm-n5, + .mx-sm-n5 { + margin-left: -1.5rem !important; + } + .m-sm-auto { + margin: auto !important; + } + .mt-sm-auto, + .my-sm-auto { + margin-top: auto !important; + } + .mr-sm-auto, + .mx-sm-auto { + margin-right: auto !important; + } + .mb-sm-auto, + .my-sm-auto { + margin-bottom: auto !important; + } + .ml-sm-auto, + .mx-sm-auto { + margin-left: auto !important; + } +} + +@media (min-width: 768px) { + .m-md-0 { + margin: 0 !important; + } + .mt-md-0, + .my-md-0 { + margin-top: 0 !important; + } + .mr-md-0, + .mx-md-0 { + margin-right: 0 !important; + } + .mb-md-0, + .my-md-0 { + margin-bottom: 0 !important; + } + .ml-md-0, + .mx-md-0 { + margin-left: 0 !important; + } + .m-md-1 { + margin: 0.125rem !important; + } + .mt-md-1, + .my-md-1 { + margin-top: 0.125rem !important; + } + .mr-md-1, + .mx-md-1 { + margin-right: 0.125rem !important; + } + .mb-md-1, + .my-md-1 { + margin-bottom: 0.125rem !important; + } + .ml-md-1, + .mx-md-1 { + margin-left: 0.125rem !important; + } + .m-md-2 { + margin: 0.25rem !important; + } + .mt-md-2, + .my-md-2 { + margin-top: 0.25rem !important; + } + .mr-md-2, + .mx-md-2 { + margin-right: 0.25rem !important; + } + .mb-md-2, + .my-md-2 { + margin-bottom: 0.25rem !important; + } + .ml-md-2, + .mx-md-2 { + margin-left: 0.25rem !important; + } + .m-md-3 { + margin: 0.5rem !important; + } + .mt-md-3, + .my-md-3 { + margin-top: 0.5rem !important; + } + .mr-md-3, + .mx-md-3 { + margin-right: 0.5rem !important; + } + .mb-md-3, + .my-md-3 { + margin-bottom: 0.5rem !important; + } + .ml-md-3, + .mx-md-3 { + margin-left: 0.5rem !important; + } + .m-md-4 { + margin: 0.75rem !important; + } + .mt-md-4, + .my-md-4 { + margin-top: 0.75rem !important; + } + .mr-md-4, + .mx-md-4 { + margin-right: 0.75rem !important; + } + .mb-md-4, + .my-md-4 { + margin-bottom: 0.75rem !important; + } + .ml-md-4, + .mx-md-4 { + margin-left: 0.75rem !important; + } + .m-md-5 { + margin: 1.5rem !important; + } + .mt-md-5, + .my-md-5 { + margin-top: 1.5rem !important; + } + .mr-md-5, + .mx-md-5 { + margin-right: 1.5rem !important; + } + .mb-md-5, + .my-md-5 { + margin-bottom: 1.5rem !important; + } + .ml-md-5, + .mx-md-5 { + margin-left: 1.5rem !important; + } + .p-md-0 { + padding: 0 !important; + } + .pt-md-0, + .py-md-0 { + padding-top: 0 !important; + } + .pr-md-0, + .px-md-0 { + padding-right: 0 !important; + } + .pb-md-0, + .py-md-0 { + padding-bottom: 0 !important; + } + .pl-md-0, + .px-md-0 { + padding-left: 0 !important; + } + .p-md-1 { + padding: 0.125rem !important; + } + .pt-md-1, + .py-md-1 { + padding-top: 0.125rem !important; + } + .pr-md-1, + .px-md-1 { + padding-right: 0.125rem !important; + } + .pb-md-1, + .py-md-1 { + padding-bottom: 0.125rem !important; + } + .pl-md-1, + .px-md-1 { + padding-left: 0.125rem !important; + } + .p-md-2 { + padding: 0.25rem !important; + } + .pt-md-2, + .py-md-2 { + padding-top: 0.25rem !important; + } + .pr-md-2, + .px-md-2 { + padding-right: 0.25rem !important; + } + .pb-md-2, + .py-md-2 { + padding-bottom: 0.25rem !important; + } + .pl-md-2, + .px-md-2 { + padding-left: 0.25rem !important; + } + .p-md-3 { + padding: 0.5rem !important; + } + .pt-md-3, + .py-md-3 { + padding-top: 0.5rem !important; + } + .pr-md-3, + .px-md-3 { + padding-right: 0.5rem !important; + } + .pb-md-3, + .py-md-3 { + padding-bottom: 0.5rem !important; + } + .pl-md-3, + .px-md-3 { + padding-left: 0.5rem !important; + } + .p-md-4 { + padding: 0.75rem !important; + } + .pt-md-4, + .py-md-4 { + padding-top: 0.75rem !important; + } + .pr-md-4, + .px-md-4 { + padding-right: 0.75rem !important; + } + .pb-md-4, + .py-md-4 { + padding-bottom: 0.75rem !important; + } + .pl-md-4, + .px-md-4 { + padding-left: 0.75rem !important; + } + .p-md-5 { + padding: 1.5rem !important; + } + .pt-md-5, + .py-md-5 { + padding-top: 1.5rem !important; + } + .pr-md-5, + .px-md-5 { + padding-right: 1.5rem !important; + } + .pb-md-5, + .py-md-5 { + padding-bottom: 1.5rem !important; + } + .pl-md-5, + .px-md-5 { + padding-left: 1.5rem !important; + } + .m-md-n1 { + margin: -0.125rem !important; + } + .mt-md-n1, + .my-md-n1 { + margin-top: -0.125rem !important; + } + .mr-md-n1, + .mx-md-n1 { + margin-right: -0.125rem !important; + } + .mb-md-n1, + .my-md-n1 { + margin-bottom: -0.125rem !important; + } + .ml-md-n1, + .mx-md-n1 { + margin-left: -0.125rem !important; + } + .m-md-n2 { + margin: -0.25rem !important; + } + .mt-md-n2, + .my-md-n2 { + margin-top: -0.25rem !important; + } + .mr-md-n2, + .mx-md-n2 { + margin-right: -0.25rem !important; + } + .mb-md-n2, + .my-md-n2 { + margin-bottom: -0.25rem !important; + } + .ml-md-n2, + .mx-md-n2 { + margin-left: -0.25rem !important; + } + .m-md-n3 { + margin: -0.5rem !important; + } + .mt-md-n3, + .my-md-n3 { + margin-top: -0.5rem !important; + } + .mr-md-n3, + .mx-md-n3 { + margin-right: -0.5rem !important; + } + .mb-md-n3, + .my-md-n3 { + margin-bottom: -0.5rem !important; + } + .ml-md-n3, + .mx-md-n3 { + margin-left: -0.5rem !important; + } + .m-md-n4 { + margin: -0.75rem !important; + } + .mt-md-n4, + .my-md-n4 { + margin-top: -0.75rem !important; + } + .mr-md-n4, + .mx-md-n4 { + margin-right: -0.75rem !important; + } + .mb-md-n4, + .my-md-n4 { + margin-bottom: -0.75rem !important; + } + .ml-md-n4, + .mx-md-n4 { + margin-left: -0.75rem !important; + } + .m-md-n5 { + margin: -1.5rem !important; + } + .mt-md-n5, + .my-md-n5 { + margin-top: -1.5rem !important; + } + .mr-md-n5, + .mx-md-n5 { + margin-right: -1.5rem !important; + } + .mb-md-n5, + .my-md-n5 { + margin-bottom: -1.5rem !important; + } + .ml-md-n5, + .mx-md-n5 { + margin-left: -1.5rem !important; + } + .m-md-auto { + margin: auto !important; + } + .mt-md-auto, + .my-md-auto { + margin-top: auto !important; + } + .mr-md-auto, + .mx-md-auto { + margin-right: auto !important; + } + .mb-md-auto, + .my-md-auto { + margin-bottom: auto !important; + } + .ml-md-auto, + .mx-md-auto { + margin-left: auto !important; + } +} + +@media (min-width: 992px) { + .m-lg-0 { + margin: 0 !important; + } + .mt-lg-0, + .my-lg-0 { + margin-top: 0 !important; + } + .mr-lg-0, + .mx-lg-0 { + margin-right: 0 !important; + } + .mb-lg-0, + .my-lg-0 { + margin-bottom: 0 !important; + } + .ml-lg-0, + .mx-lg-0 { + margin-left: 0 !important; + } + .m-lg-1 { + margin: 0.125rem !important; + } + .mt-lg-1, + .my-lg-1 { + margin-top: 0.125rem !important; + } + .mr-lg-1, + .mx-lg-1 { + margin-right: 0.125rem !important; + } + .mb-lg-1, + .my-lg-1 { + margin-bottom: 0.125rem !important; + } + .ml-lg-1, + .mx-lg-1 { + margin-left: 0.125rem !important; + } + .m-lg-2 { + margin: 0.25rem !important; + } + .mt-lg-2, + .my-lg-2 { + margin-top: 0.25rem !important; + } + .mr-lg-2, + .mx-lg-2 { + margin-right: 0.25rem !important; + } + .mb-lg-2, + .my-lg-2 { + margin-bottom: 0.25rem !important; + } + .ml-lg-2, + .mx-lg-2 { + margin-left: 0.25rem !important; + } + .m-lg-3 { + margin: 0.5rem !important; + } + .mt-lg-3, + .my-lg-3 { + margin-top: 0.5rem !important; + } + .mr-lg-3, + .mx-lg-3 { + margin-right: 0.5rem !important; + } + .mb-lg-3, + .my-lg-3 { + margin-bottom: 0.5rem !important; + } + .ml-lg-3, + .mx-lg-3 { + margin-left: 0.5rem !important; + } + .m-lg-4 { + margin: 0.75rem !important; + } + .mt-lg-4, + .my-lg-4 { + margin-top: 0.75rem !important; + } + .mr-lg-4, + .mx-lg-4 { + margin-right: 0.75rem !important; + } + .mb-lg-4, + .my-lg-4 { + margin-bottom: 0.75rem !important; + } + .ml-lg-4, + .mx-lg-4 { + margin-left: 0.75rem !important; + } + .m-lg-5 { + margin: 1.5rem !important; + } + .mt-lg-5, + .my-lg-5 { + margin-top: 1.5rem !important; + } + .mr-lg-5, + .mx-lg-5 { + margin-right: 1.5rem !important; + } + .mb-lg-5, + .my-lg-5 { + margin-bottom: 1.5rem !important; + } + .ml-lg-5, + .mx-lg-5 { + margin-left: 1.5rem !important; + } + .p-lg-0 { + padding: 0 !important; + } + .pt-lg-0, + .py-lg-0 { + padding-top: 0 !important; + } + .pr-lg-0, + .px-lg-0 { + padding-right: 0 !important; + } + .pb-lg-0, + .py-lg-0 { + padding-bottom: 0 !important; + } + .pl-lg-0, + .px-lg-0 { + padding-left: 0 !important; + } + .p-lg-1 { + padding: 0.125rem !important; + } + .pt-lg-1, + .py-lg-1 { + padding-top: 0.125rem !important; + } + .pr-lg-1, + .px-lg-1 { + padding-right: 0.125rem !important; + } + .pb-lg-1, + .py-lg-1 { + padding-bottom: 0.125rem !important; + } + .pl-lg-1, + .px-lg-1 { + padding-left: 0.125rem !important; + } + .p-lg-2 { + padding: 0.25rem !important; + } + .pt-lg-2, + .py-lg-2 { + padding-top: 0.25rem !important; + } + .pr-lg-2, + .px-lg-2 { + padding-right: 0.25rem !important; + } + .pb-lg-2, + .py-lg-2 { + padding-bottom: 0.25rem !important; + } + .pl-lg-2, + .px-lg-2 { + padding-left: 0.25rem !important; + } + .p-lg-3 { + padding: 0.5rem !important; + } + .pt-lg-3, + .py-lg-3 { + padding-top: 0.5rem !important; + } + .pr-lg-3, + .px-lg-3 { + padding-right: 0.5rem !important; + } + .pb-lg-3, + .py-lg-3 { + padding-bottom: 0.5rem !important; + } + .pl-lg-3, + .px-lg-3 { + padding-left: 0.5rem !important; + } + .p-lg-4 { + padding: 0.75rem !important; + } + .pt-lg-4, + .py-lg-4 { + padding-top: 0.75rem !important; + } + .pr-lg-4, + .px-lg-4 { + padding-right: 0.75rem !important; + } + .pb-lg-4, + .py-lg-4 { + padding-bottom: 0.75rem !important; + } + .pl-lg-4, + .px-lg-4 { + padding-left: 0.75rem !important; + } + .p-lg-5 { + padding: 1.5rem !important; + } + .pt-lg-5, + .py-lg-5 { + padding-top: 1.5rem !important; + } + .pr-lg-5, + .px-lg-5 { + padding-right: 1.5rem !important; + } + .pb-lg-5, + .py-lg-5 { + padding-bottom: 1.5rem !important; + } + .pl-lg-5, + .px-lg-5 { + padding-left: 1.5rem !important; + } + .m-lg-n1 { + margin: -0.125rem !important; + } + .mt-lg-n1, + .my-lg-n1 { + margin-top: -0.125rem !important; + } + .mr-lg-n1, + .mx-lg-n1 { + margin-right: -0.125rem !important; + } + .mb-lg-n1, + .my-lg-n1 { + margin-bottom: -0.125rem !important; + } + .ml-lg-n1, + .mx-lg-n1 { + margin-left: -0.125rem !important; + } + .m-lg-n2 { + margin: -0.25rem !important; + } + .mt-lg-n2, + .my-lg-n2 { + margin-top: -0.25rem !important; + } + .mr-lg-n2, + .mx-lg-n2 { + margin-right: -0.25rem !important; + } + .mb-lg-n2, + .my-lg-n2 { + margin-bottom: -0.25rem !important; + } + .ml-lg-n2, + .mx-lg-n2 { + margin-left: -0.25rem !important; + } + .m-lg-n3 { + margin: -0.5rem !important; + } + .mt-lg-n3, + .my-lg-n3 { + margin-top: -0.5rem !important; + } + .mr-lg-n3, + .mx-lg-n3 { + margin-right: -0.5rem !important; + } + .mb-lg-n3, + .my-lg-n3 { + margin-bottom: -0.5rem !important; + } + .ml-lg-n3, + .mx-lg-n3 { + margin-left: -0.5rem !important; + } + .m-lg-n4 { + margin: -0.75rem !important; + } + .mt-lg-n4, + .my-lg-n4 { + margin-top: -0.75rem !important; + } + .mr-lg-n4, + .mx-lg-n4 { + margin-right: -0.75rem !important; + } + .mb-lg-n4, + .my-lg-n4 { + margin-bottom: -0.75rem !important; + } + .ml-lg-n4, + .mx-lg-n4 { + margin-left: -0.75rem !important; + } + .m-lg-n5 { + margin: -1.5rem !important; + } + .mt-lg-n5, + .my-lg-n5 { + margin-top: -1.5rem !important; + } + .mr-lg-n5, + .mx-lg-n5 { + margin-right: -1.5rem !important; + } + .mb-lg-n5, + .my-lg-n5 { + margin-bottom: -1.5rem !important; + } + .ml-lg-n5, + .mx-lg-n5 { + margin-left: -1.5rem !important; + } + .m-lg-auto { + margin: auto !important; + } + .mt-lg-auto, + .my-lg-auto { + margin-top: auto !important; + } + .mr-lg-auto, + .mx-lg-auto { + margin-right: auto !important; + } + .mb-lg-auto, + .my-lg-auto { + margin-bottom: auto !important; + } + .ml-lg-auto, + .mx-lg-auto { + margin-left: auto !important; + } +} + +@media (min-width: 1200px) { + .m-xl-0 { + margin: 0 !important; + } + .mt-xl-0, + .my-xl-0 { + margin-top: 0 !important; + } + .mr-xl-0, + .mx-xl-0 { + margin-right: 0 !important; + } + .mb-xl-0, + .my-xl-0 { + margin-bottom: 0 !important; + } + .ml-xl-0, + .mx-xl-0 { + margin-left: 0 !important; + } + .m-xl-1 { + margin: 0.125rem !important; + } + .mt-xl-1, + .my-xl-1 { + margin-top: 0.125rem !important; + } + .mr-xl-1, + .mx-xl-1 { + margin-right: 0.125rem !important; + } + .mb-xl-1, + .my-xl-1 { + margin-bottom: 0.125rem !important; + } + .ml-xl-1, + .mx-xl-1 { + margin-left: 0.125rem !important; + } + .m-xl-2 { + margin: 0.25rem !important; + } + .mt-xl-2, + .my-xl-2 { + margin-top: 0.25rem !important; + } + .mr-xl-2, + .mx-xl-2 { + margin-right: 0.25rem !important; + } + .mb-xl-2, + .my-xl-2 { + margin-bottom: 0.25rem !important; + } + .ml-xl-2, + .mx-xl-2 { + margin-left: 0.25rem !important; + } + .m-xl-3 { + margin: 0.5rem !important; + } + .mt-xl-3, + .my-xl-3 { + margin-top: 0.5rem !important; + } + .mr-xl-3, + .mx-xl-3 { + margin-right: 0.5rem !important; + } + .mb-xl-3, + .my-xl-3 { + margin-bottom: 0.5rem !important; + } + .ml-xl-3, + .mx-xl-3 { + margin-left: 0.5rem !important; + } + .m-xl-4 { + margin: 0.75rem !important; + } + .mt-xl-4, + .my-xl-4 { + margin-top: 0.75rem !important; + } + .mr-xl-4, + .mx-xl-4 { + margin-right: 0.75rem !important; + } + .mb-xl-4, + .my-xl-4 { + margin-bottom: 0.75rem !important; + } + .ml-xl-4, + .mx-xl-4 { + margin-left: 0.75rem !important; + } + .m-xl-5 { + margin: 1.5rem !important; + } + .mt-xl-5, + .my-xl-5 { + margin-top: 1.5rem !important; + } + .mr-xl-5, + .mx-xl-5 { + margin-right: 1.5rem !important; + } + .mb-xl-5, + .my-xl-5 { + margin-bottom: 1.5rem !important; + } + .ml-xl-5, + .mx-xl-5 { + margin-left: 1.5rem !important; + } + .p-xl-0 { + padding: 0 !important; + } + .pt-xl-0, + .py-xl-0 { + padding-top: 0 !important; + } + .pr-xl-0, + .px-xl-0 { + padding-right: 0 !important; + } + .pb-xl-0, + .py-xl-0 { + padding-bottom: 0 !important; + } + .pl-xl-0, + .px-xl-0 { + padding-left: 0 !important; + } + .p-xl-1 { + padding: 0.125rem !important; + } + .pt-xl-1, + .py-xl-1 { + padding-top: 0.125rem !important; + } + .pr-xl-1, + .px-xl-1 { + padding-right: 0.125rem !important; + } + .pb-xl-1, + .py-xl-1 { + padding-bottom: 0.125rem !important; + } + .pl-xl-1, + .px-xl-1 { + padding-left: 0.125rem !important; + } + .p-xl-2 { + padding: 0.25rem !important; + } + .pt-xl-2, + .py-xl-2 { + padding-top: 0.25rem !important; + } + .pr-xl-2, + .px-xl-2 { + padding-right: 0.25rem !important; + } + .pb-xl-2, + .py-xl-2 { + padding-bottom: 0.25rem !important; + } + .pl-xl-2, + .px-xl-2 { + padding-left: 0.25rem !important; + } + .p-xl-3 { + padding: 0.5rem !important; + } + .pt-xl-3, + .py-xl-3 { + padding-top: 0.5rem !important; + } + .pr-xl-3, + .px-xl-3 { + padding-right: 0.5rem !important; + } + .pb-xl-3, + .py-xl-3 { + padding-bottom: 0.5rem !important; + } + .pl-xl-3, + .px-xl-3 { + padding-left: 0.5rem !important; + } + .p-xl-4 { + padding: 0.75rem !important; + } + .pt-xl-4, + .py-xl-4 { + padding-top: 0.75rem !important; + } + .pr-xl-4, + .px-xl-4 { + padding-right: 0.75rem !important; + } + .pb-xl-4, + .py-xl-4 { + padding-bottom: 0.75rem !important; + } + .pl-xl-4, + .px-xl-4 { + padding-left: 0.75rem !important; + } + .p-xl-5 { + padding: 1.5rem !important; + } + .pt-xl-5, + .py-xl-5 { + padding-top: 1.5rem !important; + } + .pr-xl-5, + .px-xl-5 { + padding-right: 1.5rem !important; + } + .pb-xl-5, + .py-xl-5 { + padding-bottom: 1.5rem !important; + } + .pl-xl-5, + .px-xl-5 { + padding-left: 1.5rem !important; + } + .m-xl-n1 { + margin: -0.125rem !important; + } + .mt-xl-n1, + .my-xl-n1 { + margin-top: -0.125rem !important; + } + .mr-xl-n1, + .mx-xl-n1 { + margin-right: -0.125rem !important; + } + .mb-xl-n1, + .my-xl-n1 { + margin-bottom: -0.125rem !important; + } + .ml-xl-n1, + .mx-xl-n1 { + margin-left: -0.125rem !important; + } + .m-xl-n2 { + margin: -0.25rem !important; + } + .mt-xl-n2, + .my-xl-n2 { + margin-top: -0.25rem !important; + } + .mr-xl-n2, + .mx-xl-n2 { + margin-right: -0.25rem !important; + } + .mb-xl-n2, + .my-xl-n2 { + margin-bottom: -0.25rem !important; + } + .ml-xl-n2, + .mx-xl-n2 { + margin-left: -0.25rem !important; + } + .m-xl-n3 { + margin: -0.5rem !important; + } + .mt-xl-n3, + .my-xl-n3 { + margin-top: -0.5rem !important; + } + .mr-xl-n3, + .mx-xl-n3 { + margin-right: -0.5rem !important; + } + .mb-xl-n3, + .my-xl-n3 { + margin-bottom: -0.5rem !important; + } + .ml-xl-n3, + .mx-xl-n3 { + margin-left: -0.5rem !important; + } + .m-xl-n4 { + margin: -0.75rem !important; + } + .mt-xl-n4, + .my-xl-n4 { + margin-top: -0.75rem !important; + } + .mr-xl-n4, + .mx-xl-n4 { + margin-right: -0.75rem !important; + } + .mb-xl-n4, + .my-xl-n4 { + margin-bottom: -0.75rem !important; + } + .ml-xl-n4, + .mx-xl-n4 { + margin-left: -0.75rem !important; + } + .m-xl-n5 { + margin: -1.5rem !important; + } + .mt-xl-n5, + .my-xl-n5 { + margin-top: -1.5rem !important; + } + .mr-xl-n5, + .mx-xl-n5 { + margin-right: -1.5rem !important; + } + .mb-xl-n5, + .my-xl-n5 { + margin-bottom: -1.5rem !important; + } + .ml-xl-n5, + .mx-xl-n5 { + margin-left: -1.5rem !important; + } + .m-xl-auto { + margin: auto !important; + } + .mt-xl-auto, + .my-xl-auto { + margin-top: auto !important; + } + .mr-xl-auto, + .mx-xl-auto { + margin-right: auto !important; + } + .mb-xl-auto, + .my-xl-auto { + margin-bottom: auto !important; + } + .ml-xl-auto, + .mx-xl-auto { + margin-left: auto !important; + } +} + +.stretched-link::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1; + pointer-events: auto; + content: ""; + background-color: rgba(0, 0, 0, 0); +} + +.text-monospace { + font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !important; +} + +.text-justify { + text-align: justify !important; +} + +.text-wrap { + white-space: normal !important; +} + +.text-nowrap { + white-space: nowrap !important; +} + +.text-truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.text-left { + text-align: left !important; +} + +.text-right { + text-align: right !important; +} + +.text-center { + text-align: center !important; +} + +@media (min-width: 576px) { + .text-sm-left { + text-align: left !important; + } + .text-sm-right { + text-align: right !important; + } + .text-sm-center { + text-align: center !important; + } +} + +@media (min-width: 768px) { + .text-md-left { + text-align: left !important; + } + .text-md-right { + text-align: right !important; + } + .text-md-center { + text-align: center !important; + } +} + +@media (min-width: 992px) { + .text-lg-left { + text-align: left !important; + } + .text-lg-right { + text-align: right !important; + } + .text-lg-center { + text-align: center !important; + } +} + +@media (min-width: 1200px) { + .text-xl-left { + text-align: left !important; + } + .text-xl-right { + text-align: right !important; + } + .text-xl-center { + text-align: center !important; + } +} + +.text-lowercase { + text-transform: lowercase !important; +} + +.text-uppercase { + text-transform: uppercase !important; +} + +.text-capitalize { + text-transform: capitalize !important; +} + +.font-weight-light { + font-weight: 300 !important; +} + +.font-weight-lighter { + font-weight: lighter !important; +} + +.font-weight-normal { + font-weight: 400 !important; +} + +.font-weight-bold { + font-weight: 700 !important; +} + +.font-weight-bolder { + font-weight: bolder !important; +} + +.font-italic { + font-style: italic !important; +} + +.text-white { + color: #fff !important; +} + +.text-primary { + color: #083358 !important; +} + +a.text-primary:hover, a.text-primary:focus { + color: #020a12 !important; +} + +.text-secondary { + color: #b8b8b8 !important; +} + +a.text-secondary:hover, a.text-secondary:focus { + color: #929292 !important; +} + +.text-success { + color: #008a29 !important; +} + +a.text-success:hover, a.text-success:focus { + color: #003e12 !important; +} + +.text-info { + color: #74dbef !important; +} + +a.text-info:hover, a.text-info:focus { + color: #2fc9e7 !important; +} + +.text-warning { + color: #e6d200 !important; +} + +a.text-warning:hover, a.text-warning:focus { + color: #9a8c00 !important; +} + +.text-danger { + color: #e13737 !important; +} + +a.text-danger:hover, a.text-danger:focus { + color: #b11b1b !important; +} + +.text-light { + color: #f4f4f4 !important; +} + +a.text-light:hover, a.text-light:focus { + color: #cecece !important; +} + +.text-dark { + color: #072247 !important; +} + +a.text-dark:hover, a.text-dark:focus { + color: #000101 !important; +} + +.text-body { + color: #212529 !important; +} + +.text-muted { + color: #6c757d !important; +} + +.text-black-50 { + color: rgba(0, 0, 0, 0.5) !important; +} + +.text-white-50 { + color: rgba(255, 255, 255, 0.5) !important; +} + +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.text-decoration-none { + text-decoration: none !important; +} + +.text-break { + word-break: break-word !important; + overflow-wrap: break-word !important; +} + +.text-reset { + color: inherit !important; +} + +.visible { + visibility: visible !important; +} + +.invisible { + visibility: hidden !important; +} + +@media print { + *, + *::before, + *::after { + text-shadow: none !important; + box-shadow: none !important; + } + a:not(.btn) { + text-decoration: underline; + } + abbr[title]::after { + content: " (" attr(title) ")"; + } + pre { + white-space: pre-wrap !important; + } + pre, + blockquote { + border: 1px solid #adb5bd; + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } + @page { + size: a3; + } + body { + min-width: 992px !important; + } + .container { + min-width: 992px !important; + } + .navbar { + display: none; + } + .badge { + border: 1px solid #000; + } + .table { + border-collapse: collapse !important; + } + .table td, + .table th { + background-color: #fff !important; + } + .table-bordered th, + .table-bordered td { + border: 1px solid #dee2e6 !important; + } + .table-dark { + color: inherit; + } + .table-dark th, + .table-dark td, + .table-dark thead th, + .table-dark tbody + tbody { + border-color: #e3e3e3; + } + .table .thead-dark th { + color: inherit; + border-color: #e3e3e3; + } +} + +.select2-container { + box-sizing: border-box; + display: inline-block; + margin: 0; + position: relative; + vertical-align: middle; +} + +.select2-container .select2-selection--single { + box-sizing: border-box; + cursor: pointer; + display: block; + height: 28px; + user-select: none; + -webkit-user-select: none; +} + +.select2-container .select2-selection--single .select2-selection__rendered { + display: block; + padding-left: 8px; + padding-right: 20px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.select2-container .select2-selection--single .select2-selection__clear { + position: relative; +} + +.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered { + padding-right: 8px; + padding-left: 20px; +} + +.select2-container .select2-selection--multiple { + box-sizing: border-box; + cursor: pointer; + display: block; + min-height: 32px; + user-select: none; + -webkit-user-select: none; +} + +.select2-container .select2-selection--multiple .select2-selection__rendered { + display: inline-block; + overflow: hidden; + padding-left: 8px; + text-overflow: ellipsis; + white-space: nowrap; +} + +.select2-container .select2-search--inline { + float: left; +} + +.select2-container .select2-search--inline .select2-search__field { + box-sizing: border-box; + border: none; + font-size: 100%; + margin-top: 5px; + padding: 0; +} + +.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button { + -webkit-appearance: none; +} + +.select2-dropdown { + background-color: white; + border: 1px solid #aaa; + border-radius: 4px; + box-sizing: border-box; + display: block; + position: absolute; + left: -100000px; + width: 100%; + z-index: 1051; +} + +.select2-results { + display: block; +} + +.select2-results__options { + list-style: none; + margin: 0; + padding: 0; +} + +.select2-results__option { + padding: 6px; + user-select: none; + -webkit-user-select: none; +} + +.select2-results__option[aria-selected] { + cursor: pointer; +} + +.select2-container--open .select2-dropdown { + left: 0; +} + +.select2-container--open .select2-dropdown--above { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} + +.select2-container--open .select2-dropdown--below { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.select2-search--dropdown { + display: block; + padding: 4px; +} + +.select2-search--dropdown .select2-search__field { + padding: 4px; + width: 100%; + box-sizing: border-box; +} + +.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button { + -webkit-appearance: none; +} + +.select2-search--dropdown.select2-search--hide { + display: none; +} + +.select2-close-mask { + border: 0; + margin: 0; + padding: 0; + display: block; + position: fixed; + left: 0; + top: 0; + min-height: 100%; + min-width: 100%; + height: auto; + width: auto; + opacity: 0; + z-index: 99; + background-color: #fff; + filter: alpha(opacity=0); +} + +.select2-hidden-accessible { + border: 0 !important; + clip: rect(0 0 0 0) !important; + -webkit-clip-path: inset(50%) !important; + clip-path: inset(50%) !important; + height: 1px !important; + overflow: hidden !important; + padding: 0 !important; + position: absolute !important; + width: 1px !important; + white-space: nowrap !important; +} + +.select2-container--default .select2-selection--single { + background-color: #fff; + border: 1px solid #aaa; + border-radius: 4px; +} + +.select2-container--default .select2-selection--single .select2-selection__rendered { + color: #444; + line-height: 28px; +} + +.select2-container--default .select2-selection--single .select2-selection__clear { + cursor: pointer; + float: right; + font-weight: bold; +} + +.select2-container--default .select2-selection--single .select2-selection__placeholder { + color: #999; +} + +.select2-container--default .select2-selection--single .select2-selection__arrow { + height: 26px; + position: absolute; + top: 1px; + right: 1px; + width: 20px; +} + +.select2-container--default .select2-selection--single .select2-selection__arrow b { + border-color: #888 transparent transparent transparent; + border-style: solid; + border-width: 5px 4px 0 4px; + height: 0; + left: 50%; + margin-left: -4px; + margin-top: -2px; + position: absolute; + top: 50%; + width: 0; +} + +.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear { + float: left; +} + +.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow { + left: 1px; + right: auto; +} + +.select2-container--default.select2-container--disabled .select2-selection--single { + background-color: #eee; + cursor: default; +} + +.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear { + display: none; +} + +.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b { + border-color: transparent transparent #888 transparent; + border-width: 0 4px 5px 4px; +} + +.select2-container--default .select2-selection--multiple { + background-color: white; + border: 1px solid #aaa; + border-radius: 4px; + cursor: text; +} + +.select2-container--default .select2-selection--multiple .select2-selection__rendered { + box-sizing: border-box; + list-style: none; + margin: 0; + padding: 0 5px; + width: 100%; +} + +.select2-container--default .select2-selection--multiple .select2-selection__rendered li { + list-style: none; +} + +.select2-container--default .select2-selection--multiple .select2-selection__clear { + cursor: pointer; + float: right; + font-weight: bold; + margin-top: 5px; + margin-right: 10px; + padding: 1px; +} + +.select2-container--default .select2-selection--multiple .select2-selection__choice { + background-color: #e4e4e4; + border: 1px solid #aaa; + border-radius: 4px; + cursor: default; + float: left; + margin-right: 5px; + margin-top: 5px; + padding: 0 5px; +} + +.select2-container--default .select2-selection--multiple .select2-selection__choice__remove { + color: #999; + cursor: pointer; + display: inline-block; + font-weight: bold; + margin-right: 2px; +} + +.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover { + color: #333; +} + +.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline { + float: right; +} + +.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice { + margin-left: 5px; + margin-right: auto; +} + +.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { + margin-left: 2px; + margin-right: auto; +} + +.select2-container--default.select2-container--focus .select2-selection--multiple { + border: solid black 1px; + outline: 0; +} + +.select2-container--default.select2-container--disabled .select2-selection--multiple { + background-color: #eee; + cursor: default; +} + +.select2-container--default.select2-container--disabled .select2-selection__choice__remove { + display: none; +} + +.select2-container--default.select2-container--open.select2-container--above .select2-selection--single, .select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple { + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.select2-container--default.select2-container--open.select2-container--below .select2-selection--single, .select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} + +.select2-container--default .select2-search--dropdown .select2-search__field { + border: 1px solid #aaa; +} + +.select2-container--default .select2-search--inline .select2-search__field { + background: transparent; + border: none; + outline: 0; + box-shadow: none; + -webkit-appearance: textfield; +} + +.select2-container--default .select2-results > .select2-results__options { + max-height: 200px; + overflow-y: auto; +} + +.select2-container--default .select2-results__option[role=group] { + padding: 0; +} + +.select2-container--default .select2-results__option[aria-disabled=true] { + color: #999; +} + +.select2-container--default .select2-results__option[aria-selected=true] { + background-color: #ddd; +} + +.select2-container--default .select2-results__option .select2-results__option { + padding-left: 1em; +} + +.select2-container--default .select2-results__option .select2-results__option .select2-results__group { + padding-left: 0; +} + +.select2-container--default .select2-results__option .select2-results__option .select2-results__option { + margin-left: -1em; + padding-left: 2em; +} + +.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -2em; + padding-left: 3em; +} + +.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -3em; + padding-left: 4em; +} + +.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -4em; + padding-left: 5em; +} + +.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -5em; + padding-left: 6em; +} + +.select2-container--default .select2-results__option--highlighted[aria-selected] { + background-color: #5897fb; + color: white; +} + +.select2-container--default .select2-results__group { + cursor: default; + display: block; + padding: 6px; +} + +.select2-container--classic .select2-selection--single { + background-color: #f7f7f7; + border: 1px solid #e3e3e3; + border-radius: 0.25rem; + outline: 0; + background-image: -webkit-linear-gradient(top, white 50%, #eeeeee 100%); + background-image: -o-linear-gradient(top, white 50%, #eeeeee 100%); + background-image: linear-gradient(to bottom, white 50%, #eeeeee 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); +} + +.select2-container--classic .select2-selection--single:focus { + border: 1px solid #5897fb; +} + +.select2-container--classic .select2-selection--single .select2-selection__rendered { + color: #444; + line-height: 28px; +} + +.select2-container--classic .select2-selection--single .select2-selection__clear { + cursor: pointer; + float: right; + font-weight: bold; + margin-right: 10px; +} + +.select2-container--classic .select2-selection--single .select2-selection__placeholder { + color: #999; +} + +.select2-container--classic .select2-selection--single .select2-selection__arrow { + background-color: #ddd; + border: none; + border-left: 1px solid #e3e3e3; + border-top-right-radius: 0.25rem; + border-bottom-right-radius: 0.25rem; + height: 26px; + position: absolute; + top: 1px; + right: 1px; + width: 20px; + background-image: -webkit-linear-gradient(top, #eeeeee 50%, #cccccc 100%); + background-image: -o-linear-gradient(top, #eeeeee 50%, #cccccc 100%); + background-image: linear-gradient(to bottom, #eeeeee 50%, #cccccc 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0); +} + +.select2-container--classic .select2-selection--single .select2-selection__arrow b { + border-color: #888 transparent transparent transparent; + border-style: solid; + border-width: 5px 4px 0 4px; + height: 0; + left: 50%; + margin-left: -4px; + margin-top: -2px; + position: absolute; + top: 50%; + width: 0; +} + +.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear { + float: left; +} + +.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow { + border: none; + border-right: 1px solid #e3e3e3; + border-radius: 0; + border-top-left-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; + left: 1px; + right: auto; +} + +.select2-container--classic.select2-container--open .select2-selection--single { + border: 1px solid #5897fb; +} + +.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow { + background: transparent; + border: none; +} + +.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b { + border-color: transparent transparent #888 transparent; + border-width: 0 4px 5px 4px; +} + +.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; + background-image: -webkit-linear-gradient(top, white 0%, #eeeeee 50%); + background-image: -o-linear-gradient(top, white 0%, #eeeeee 50%); + background-image: linear-gradient(to bottom, white 0%, #eeeeee 50%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); +} + +.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + background-image: -webkit-linear-gradient(top, #eeeeee 50%, white 100%); + background-image: -o-linear-gradient(top, #eeeeee 50%, white 100%); + background-image: linear-gradient(to bottom, #eeeeee 50%, white 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0); +} + +.select2-container--classic .select2-selection--multiple { + background-color: white; + border: 1px solid #e3e3e3; + border-radius: 0.25rem; + cursor: text; + outline: 0; +} + +.select2-container--classic .select2-selection--multiple:focus { + border: 1px solid #5897fb; +} + +.select2-container--classic .select2-selection--multiple .select2-selection__rendered { + list-style: none; + margin: 0; + padding: 0 5px; +} + +.select2-container--classic .select2-selection--multiple .select2-selection__clear { + display: none; +} + +.select2-container--classic .select2-selection--multiple .select2-selection__choice { + background-color: #e4e4e4; + border: 1px solid #e3e3e3; + border-radius: 0.25rem; + cursor: default; + float: left; + margin-right: 5px; + margin-top: 5px; + padding: 0 5px; +} + +.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove { + color: #888; + cursor: pointer; + display: inline-block; + font-weight: bold; + margin-right: 2px; +} + +.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover { + color: #555; +} + +.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice { + float: right; + margin-left: 5px; + margin-right: auto; +} + +.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { + margin-left: 2px; + margin-right: auto; +} + +.select2-container--classic.select2-container--open .select2-selection--multiple { + border: 1px solid #5897fb; +} + +.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} + +.select2-container--classic .select2-search--dropdown .select2-search__field { + border: 1px solid #e3e3e3; + outline: 0; +} + +.select2-container--classic .select2-search--inline .select2-search__field { + outline: 0; + box-shadow: none; +} + +.select2-container--classic .select2-dropdown { + background-color: white; + border: 1px solid transparent; +} + +.select2-container--classic .select2-dropdown--above { + border-bottom: none; +} + +.select2-container--classic .select2-dropdown--below { + border-top: none; +} + +.select2-container--classic .select2-results > .select2-results__options { + max-height: 200px; + overflow-y: auto; +} + +.select2-container--classic .select2-results__option[role=group] { + padding: 0; +} + +.select2-container--classic .select2-results__option[aria-disabled=true] { + color: grey; +} + +.select2-container--classic .select2-results__option--highlighted[aria-selected] { + background-color: #3875d7; + color: white; +} + +.select2-container--classic .select2-results__group { + cursor: default; + display: block; + padding: 6px; +} + +.select2-container--classic.select2-container--open .select2-dropdown { + border-color: #5897fb; +} + +/** + * We need a clone of bootstrap color-yiq mixin so we can get the same value for color + */ +.select2-container--bootstrap { + display: block; + /*------------------------------------*\ + #COMMON STYLES + \*------------------------------------*/ + /** + * Search field in the Select2 dropdown. + */ + /** + * No outline for all search fields - in the dropdown + * and inline in multi Select2s. + */ + /** + * Adjust Select2's choices hover and selected styles to match + * Bootstrap 4's default dropdown styles. + * + * @see https://getbootstrap.com/docs/4.0/components/dropdowns/ + */ + /** + * Clear the selection. + */ + /** + * Address disabled Select2 styles. + * + * @see https://select2.github.io/examples.html#disabled + * @see hhttps://getbootstrap.com/docs/4.0/components/forms/#disabled-forms + */ + /*------------------------------------*\ + #DROPDOWN + \*------------------------------------*/ + /** + * Dropdown border color and box-shadow. + */ + /** + * Limit the dropdown height. + */ + /*------------------------------------*\ + #SINGLE SELECT2 + \*------------------------------------*/ + /*------------------------------------*\ + #MULTIPLE SELECT2 + \*------------------------------------*/ + /** + * Address Bootstrap control sizing classes + * + * 1. Reset Bootstrap defaults. + * 2. Adjust the dropdown arrow button icon position. + * + * @see https://getbootstrap.com/docs/4.0/components/forms/#sizing + */ + /* 1 */ + /*------------------------------------*\ + #RTL SUPPORT + \*------------------------------------*/ +} + +.select2-container--bootstrap .select2-selection { + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + background-color: #fff; + border: 1px solid #ced4da; + color: #495057; + font-size: 1rem; + outline: 0; +} + +@media (prefers-reduced-motion: reduce) { + .select2-container--bootstrap .select2-selection { + transition: none; + } +} + +.select2-container--bootstrap .select2-search--dropdown .select2-search__field { + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + background-color: #fff; + border: 1px solid #ced4da; + color: #495057; + font-size: 1rem; +} + +@media (prefers-reduced-motion: reduce) { + .select2-container--bootstrap .select2-search--dropdown .select2-search__field { + transition: none; + } +} + +.select2-container--bootstrap .select2-search__field { + outline: 0; + /* Firefox 18- */ + /** + * Firefox 19+ + * + * @see http://stackoverflow.com/questions/24236240/color-for-styled-placeholder-text-is-muted-in-firefox + */ +} + +.select2-container--bootstrap .select2-search__field::-webkit-input-placeholder { + color: #6c757d; +} + +.select2-container--bootstrap .select2-search__field:-moz-placeholder { + color: #6c757d; +} + +.select2-container--bootstrap .select2-search__field::-moz-placeholder { + color: #6c757d; + opacity: 1; +} + +.select2-container--bootstrap .select2-search__field:-ms-input-placeholder { + color: #6c757d; +} + +.select2-container--bootstrap .select2-results__option { + padding: 0.375rem 0.75rem; + /** + * Disabled results. + * + * @see https://select2.github.io/examples.html#disabled-results + */ + /** + * Hover state. + */ + /** + * Selected state. + */ +} + +.select2-container--bootstrap .select2-results__option[role=group] { + padding: 0; +} + +.select2-container--bootstrap .select2-results__option[aria-disabled=true] { + color: #6c757d; + cursor: not-allowed; +} + +.select2-container--bootstrap .select2-results__option[aria-selected=true] { + background-color: #f8f9fa; + color: #16181b; +} + +.select2-container--bootstrap .select2-results__option--highlighted[aria-selected] { + background-color: #083358; + color: #fff; +} + +.select2-container--bootstrap .select2-results__option .select2-results__option { + padding: 0.375rem 0.75rem; +} + +.select2-container--bootstrap .select2-results__option .select2-results__option .select2-results__group { + padding-left: 0; +} + +.select2-container--bootstrap .select2-results__option .select2-results__option .select2-results__option { + margin-left: -0.75rem; + padding-left: 1.5rem; +} + +.select2-container--bootstrap .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -1.5rem; + padding-left: 2.25rem; +} + +.select2-container--bootstrap .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -2.25rem; + padding-left: 3rem; +} + +.select2-container--bootstrap .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -3rem; + padding-left: 3.75rem; +} + +.select2-container--bootstrap .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -3.75rem; + padding-left: 4.5rem; +} + +.select2-container--bootstrap .select2-results__group { + color: #6c757d; + display: block; + padding: 0.375rem 0.75rem; + font-size: 0.875rem; + line-height: 1.5; + white-space: nowrap; +} + +.select2-container--bootstrap.select2-container--focus .select2-selection, .select2-container--bootstrap.select2-container--open .select2-selection { + border-color: #1377cd; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 0 0.2rem rgba(8, 51, 88, 0.25); +} + +.select2-container--bootstrap.select2-container--open { + /** + * Make the dropdown arrow point up while the dropdown is visible. + */ + /** + * Handle border radii of the container when the dropdown is showing. + */ +} + +.select2-container--bootstrap.select2-container--open .select2-selection .select2-selection__arrow b { + border-color: transparent transparent #6c757d transparent; + border-width: 0 0.25rem 0.25rem 0.25rem; +} + +.select2-container--bootstrap.select2-container--open.select2-container--below .select2-selection { + border-bottom-color: transparent; + box-shadow: none; +} + +.select2-container--bootstrap.select2-container--open.select2-container--above .select2-selection { + border-top-color: transparent; + box-shadow: none; +} + +.select2-container--bootstrap .select2-selection__clear { + color: #6c757d; + cursor: pointer; + float: right; + font-weight: bold; + margin-right: 10px; +} + +.select2-container--bootstrap .select2-selection__clear:hover { + color: "#111"; +} + +.select2-container--bootstrap.select2-container--disabled .select2-selection { + border-color: #ced4da; + box-shadow: none; +} + +.select2-container--bootstrap.select2-container--disabled .select2-selection, +.select2-container--bootstrap.select2-container--disabled .select2-search__field { + cursor: not-allowed; +} + +.select2-container--bootstrap.select2-container--disabled .select2-selection, +.select2-container--bootstrap.select2-container--disabled .select2-selection--multiple .select2-selection__choice { + background-color: #e9ecef; +} + +.select2-container--bootstrap.select2-container--disabled .select2-selection__clear, +.select2-container--bootstrap.select2-container--disabled .select2-selection--multiple .select2-selection__choice__remove { + display: none; +} + +.select2-container--bootstrap .select2-dropdown { + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + border-color: #1377cd; + overflow-x: hidden; + margin-top: -1px; +} + +.select2-container--bootstrap .select2-dropdown--above { + box-shadow: 0px -6px 12px rgba(0, 0, 0, 0.175); + margin-top: 1px; +} + +.select2-container--bootstrap .select2-results > .select2-results__options { + max-height: 200px; + overflow-y: auto; +} + +.select2-container--bootstrap .select2-selection--single { + height: calc(1.5em + 0.75rem + 2px); + line-height: 1.5; + padding: 0.375rem 1.5rem 0.375rem 0.75rem; + /** + * Adjust the single Select2's dropdown arrow button appearance. + */ +} + +.select2-container--bootstrap .select2-selection--single .select2-selection__arrow { + position: absolute; + bottom: 0; + right: 0.75rem; + top: 0; + width: 0.25rem; +} + +.select2-container--bootstrap .select2-selection--single .select2-selection__arrow b { + border-color: #6c757d transparent transparent transparent; + border-style: solid; + border-width: 0.25rem 0.25rem 0 0.25rem; + height: 0; + left: 0; + margin-left: -0.25rem; + margin-top: -0.125rem; + position: absolute; + top: 50%; + width: 0; +} + +.select2-container--bootstrap .select2-selection--single .select2-selection__rendered { + color: #495057; + padding: 0; +} + +.select2-container--bootstrap .select2-selection--single .select2-selection__placeholder { + color: #6c757d; +} + +.select2-container--bootstrap .select2-selection--multiple { + min-height: calc(1.5em + 0.75rem + 2px); + padding: 0; + height: auto; + /** + * Make Multi Select2's choices match Bootstrap 4's default button styles. + */ + /** + * Minus 2px borders. + */ + /** + * Clear the selection. + */ +} + +.select2-container--bootstrap .select2-selection--multiple .select2-selection__rendered { + box-sizing: border-box; + display: block; + line-height: 1.5; + list-style: none; + margin: 0; + overflow: hidden; + padding: 0; + width: 100%; + text-overflow: ellipsis; + white-space: nowrap; +} + +.select2-container--bootstrap .select2-selection--multiple .select2-selection__placeholder { + color: #6c757d; + float: left; + margin-top: 5px; +} + +.select2-container--bootstrap .select2-selection--multiple .select2-selection__choice { + color: #495057; + background: #e9ecef; + border: 1px solid #b8b8b8; + border-radius: 0.25rem; + cursor: default; + float: left; + margin: calc(0.375rem - 1px) 0 0 0.375rem; + padding: 0 0.375rem; +} + +.select2-container--bootstrap .select2-selection--multiple .select2-search--inline .select2-search__field { + background: transparent; + padding: 0 0.75rem; + height: calc(1.5em + 0.75rem + 2px); + line-height: 1.5; + margin: -1px 0; + min-width: 5em; +} + +.select2-container--bootstrap .select2-selection--multiple .select2-selection__choice__remove { + color: #6c757d; + cursor: pointer; + display: inline-block; + font-weight: bold; + margin-right: 0.1875rem; +} + +.select2-container--bootstrap .select2-selection--multiple .select2-selection__choice__remove:hover { + color: "#111"; +} + +.select2-container--bootstrap .select2-selection--multiple .select2-selection__clear { + margin-top: 0.375rem; +} + +.select2-container--bootstrap .select2-selection--single.form-control-sm, +.input-group-sm .select2-container--bootstrap .select2-selection--single, +.form-group-sm .select2-container--bootstrap .select2-selection--single { + font-size: 0.875rem; + height: calc(1.5em + 0.5rem + 2px); + line-height: 1.5; + padding: 0.25rem 1.25rem 0.25rem 0.5rem; + /* 2 */ +} + +.select2-container--bootstrap .select2-selection--single.form-control-sm .select2-selection__arrow b, +.input-group-sm .select2-container--bootstrap .select2-selection--single .select2-selection__arrow b, +.form-group-sm .select2-container--bootstrap .select2-selection--single .select2-selection__arrow b { + margin-left: -0.25rem; +} + +.select2-container--bootstrap .select2-selection--multiple.form-control-sm, +.input-group-sm .select2-container--bootstrap .select2-selection--multiple, +.form-group-sm .select2-container--bootstrap .select2-selection--multiple { + min-height: calc(1.5em + 0.5rem + 2px); +} + +.select2-container--bootstrap .select2-selection--multiple.form-control-sm .select2-selection__choice, +.input-group-sm .select2-container--bootstrap .select2-selection--multiple .select2-selection__choice, +.form-group-sm .select2-container--bootstrap .select2-selection--multiple .select2-selection__choice { + font-size: 0.875rem; + line-height: 1.5; + margin: calc(0.25rem - 1px) 0 0 0.25rem; + padding: 0 0.25rem; +} + +.select2-container--bootstrap .select2-selection--multiple.form-control-sm .select2-search--inline .select2-search__field, +.input-group-sm .select2-container--bootstrap .select2-selection--multiple .select2-search--inline .select2-search__field, +.form-group-sm .select2-container--bootstrap .select2-selection--multiple .select2-search--inline .select2-search__field { + padding: 0 0.5rem; + font-size: 0.875rem; + height: calc(1.5em + 0.5rem + 2px); + line-height: 1.5; +} + +.select2-container--bootstrap .select2-selection--multiple.form-control-sm .select2-selection__clear, +.input-group-sm .select2-container--bootstrap .select2-selection--multiple .select2-selection__clear, +.form-group-sm .select2-container--bootstrap .select2-selection--multiple .select2-selection__clear { + margin-top: 0.25rem; +} + +.select2-container--bootstrap .select2-selection--single.form-control-lg, +.input-group-lg .select2-container--bootstrap .select2-selection--single, +.form-group-lg .select2-container--bootstrap .select2-selection--single { + font-size: 1.25rem; + height: calc(1.5em + 1rem + 2px); + line-height: 1.5; + padding: 0.5rem 1.9375rem 0.5rem 1rem; + /* 1 */ +} + +.select2-container--bootstrap .select2-selection--single.form-control-lg .select2-selection__arrow, +.input-group-lg .select2-container--bootstrap .select2-selection--single .select2-selection__arrow, +.form-group-lg .select2-container--bootstrap .select2-selection--single .select2-selection__arrow { + width: 0.3125rem; +} + +.select2-container--bootstrap .select2-selection--single.form-control-lg .select2-selection__arrow b, +.input-group-lg .select2-container--bootstrap .select2-selection--single .select2-selection__arrow b, +.form-group-lg .select2-container--bootstrap .select2-selection--single .select2-selection__arrow b { + border-width: 0.3125rem 0.3125rem 0 0.3125rem; + margin-left: -0.3125rem; + margin-left: -0.5rem; + margin-top: -0.15625rem; +} + +.select2-container--bootstrap .select2-selection--multiple.form-control-lg, +.input-group-lg .select2-container--bootstrap .select2-selection--multiple, +.form-group-lg .select2-container--bootstrap .select2-selection--multiple { + min-height: calc(1.5em + 1rem + 2px); + border-radius: 0.3rem; +} + +.select2-container--bootstrap .select2-selection--multiple.form-control-lg .select2-selection__choice, +.input-group-lg .select2-container--bootstrap .select2-selection--multiple .select2-selection__choice, +.form-group-lg .select2-container--bootstrap .select2-selection--multiple .select2-selection__choice { + font-size: 1.25rem; + line-height: 1.5; + border-radius: 0.25rem; + margin: calc(0.5rem - 1px) 0 0 0.5rem; + padding: 0 0.5rem; +} + +.select2-container--bootstrap .select2-selection--multiple.form-control-lg .select2-search--inline .select2-search__field, +.input-group-lg .select2-container--bootstrap .select2-selection--multiple .select2-search--inline .select2-search__field, +.form-group-lg .select2-container--bootstrap .select2-selection--multiple .select2-search--inline .select2-search__field { + padding: 0 1rem; + font-size: 1.25rem; + height: calc(1.5em + 1rem + 2px); + line-height: 1.5; +} + +.select2-container--bootstrap .select2-selection--multiple.form-control-lg .select2-selection__clear, +.input-group-lg .select2-container--bootstrap .select2-selection--multiple .select2-selection__clear, +.form-group-lg .select2-container--bootstrap .select2-selection--multiple .select2-selection__clear { + margin-top: 0.5rem; +} + +.select2-container--bootstrap .select2-selection.form-control-lg.select2-container--open .select2-selection--single { + /** + * Make the dropdown arrow point up while the dropdown is visible. + */ +} + +.select2-container--bootstrap .select2-selection.form-control-lg.select2-container--open .select2-selection--single .select2-selection__arrow b { + border-color: transparent transparent #6c757d transparent; + border-width: 0 0.3125rem 0.3125rem 0.3125rem; +} + +.input-group-lg .select2-container--bootstrap .select2-selection.select2-container--open .select2-selection--single { + /** + * Make the dropdown arrow point up while the dropdown is visible. + */ +} + +.input-group-lg .select2-container--bootstrap .select2-selection.select2-container--open .select2-selection--single .select2-selection__arrow b { + border-color: transparent transparent #6c757d transparent; + border-width: 0 0.3125rem 0.3125rem 0.3125rem; +} + +.select2-container--bootstrap[dir="rtl"] { + /** + * Single Select2 + * + * 1. Makes sure that .select2-selection__placeholder is positioned + * correctly. + */ + /** + * Multiple Select2 + */ +} + +.select2-container--bootstrap[dir="rtl"] .select2-selection--single { + padding-left: 1.5rem; + padding-right: 0.75rem; +} + +.select2-container--bootstrap[dir="rtl"] .select2-selection--single .select2-selection__rendered { + padding-right: 0; + padding-left: 0; + text-align: right; + /* 1 */ +} + +.select2-container--bootstrap[dir="rtl"] .select2-selection--single .select2-selection__clear { + float: left; +} + +.select2-container--bootstrap[dir="rtl"] .select2-selection--single .select2-selection__arrow { + left: 0.75rem; + right: auto; +} + +.select2-container--bootstrap[dir="rtl"] .select2-selection--single .select2-selection__arrow b { + margin-left: 0; +} + +.select2-container--bootstrap[dir="rtl"] .select2-selection--multiple .select2-selection__choice, +.select2-container--bootstrap[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder, +.select2-container--bootstrap[dir="rtl"] .select2-selection--multiple .select2-search--inline { + float: right; +} + +.select2-container--bootstrap[dir="rtl"] .select2-selection--multiple .select2-selection__choice { + margin-left: 0; + margin-right: 0.375rem; +} + +.select2-container--bootstrap[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { + margin-left: 2px; + margin-right: auto; +} + +.select2-container--bootstrap .select2-dropdown[dir="rtl"] .select2-results__options { + text-align: right; +} + +/*------------------------------------*\ + #ADDITIONAL GOODIES +\*------------------------------------*/ +/** + * Address Bootstrap's validation states + * + * If a Select2 widget parent has one of Bootstrap's validation state modifier + * classes, adjust Select2's border colors and focus states accordingly. + * You may apply said classes to the Select2 dropdown (body > .select2-container) + * via JavaScript match Bootstraps' to make its styles match. + * + * @see https://getbootstrap.com/docs/4.0/components/forms/#validation + */ +.is-valid .select2-dropdown, +.is-valid .select2-selection { + border-color: #008a29; +} + +.is-valid .select2-container--focus .select2-selection, +.is-valid .select2-container--open .select2-selection { + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #00f047; + border-color: #00571a; +} + +.is-valid .select2-container--focus .select2-selection:focus, +.is-valid .select2-container--open .select2-selection:focus { + box-shadow: 0 0 0 0.2rem rgba(0, 138, 41, 0.25); +} + +.is-valid.select2-drop-active { + border-color: #00571a; +} + +.is-valid.select2-drop-active.select2-drop.select2-drop-above { + border-top-color: #00571a; +} + +.is-invalid .select2-dropdown, +.is-invalid .select2-selection { + border-color: #e13737; +} + +.is-invalid .select2-container--focus .select2-selection, +.is-invalid .select2-container--open .select2-selection { + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ee9090; + border-color: #c71e1e; +} + +.is-invalid .select2-container--focus .select2-selection:focus, +.is-invalid .select2-container--open .select2-selection:focus { + box-shadow: 0 0 0 0.2rem rgba(225, 55, 55, 0.25); +} + +.is-invalid.select2-drop-active { + border-color: #c71e1e; +} + +.is-invalid.select2-drop-active.select2-drop.select2-drop-above { + border-top-color: #c71e1e; +} + +/* Validation classes on parent element. Preserved Bootstrap 3 validation classes */ +.has-warning .select2-dropdown, +.has-warning .select2-selection { + border-color: #e6d200; +} + +.has-warning .select2-container--focus .select2-selection, +.has-warning .select2-container--open .select2-selection { + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #fff04d; + border-color: #b3a300; +} + +.has-warning .select2-container--focus .select2-selection:focus, +.has-warning .select2-container--open .select2-selection:focus { + box-shadow: 0 0 0 0.2rem rgba(230, 210, 0, 0.25); +} + +.has-warning.select2-drop-active { + border-color: #b3a300; +} + +.has-warning.select2-drop-active.select2-drop.select2-drop-above { + border-top-color: #b3a300; +} + +.has-error .select2-dropdown, +.has-error .select2-selection { + border-color: #e13737; +} + +.has-error .select2-container--focus .select2-selection, +.has-error .select2-container--open .select2-selection { + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ee9090; + border-color: #c71e1e; +} + +.has-error .select2-container--focus .select2-selection:focus, +.has-error .select2-container--open .select2-selection:focus { + box-shadow: 0 0 0 0.2rem rgba(225, 55, 55, 0.25); +} + +.has-error.select2-drop-active { + border-color: #c71e1e; +} + +.has-error.select2-drop-active.select2-drop.select2-drop-above { + border-top-color: #c71e1e; +} + +.has-success .select2-dropdown, +.has-success .select2-selection { + border-color: #008a29; +} + +.has-success .select2-container--focus .select2-selection, +.has-success .select2-container--open .select2-selection { + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #00f047; + border-color: #00571a; +} + +.has-success .select2-container--focus .select2-selection:focus, +.has-success .select2-container--open .select2-selection:focus { + box-shadow: 0 0 0 0.2rem rgba(0, 138, 41, 0.25); +} + +.has-success.select2-drop-active { + border-color: #00571a; +} + +.has-success.select2-drop-active.select2-drop.select2-drop-above { + border-top-color: #00571a; +} + +/** + * Select2 widgets in Bootstrap Input Groups + * + * @see https://getbootstrap.com/docs/4.0/components/input-group/ + * @see https://github.com/twbs/bootstrap/blob/v4.4.1/scss/_input-group.scss + */ +/** + * Reset rounded corners + */ +.input-group > .select2-container--bootstrap { + flex: 1 1 auto; + position: relative; + z-index: 2; + width: 1%; + margin-bottom: 0; + /** + * Adjust z-index like Bootstrap does to show the focus-box-shadow + * above appended buttons in .input-group and .form-group. + */ + /** + * Adjust alignment of Bootstrap buttons in Bootstrap Input Groups to address + * Multi Select2's height which - depending on how many elements have been selected - + * may grow taller than its initial size. + * + * @see https://github.com/twbs/bootstrap/blob/v4.4.1/scss/_input-group.scss + */ +} + +.input-group > .select2-container--bootstrap > .selection { + display: flex; + flex: 1 1 auto; +} + +.input-group > .select2-container--bootstrap > .selection > .select2-selection.form-control { + float: none; +} + +.input-group > .select2-container--bootstrap.select2-container--open, .input-group > .select2-container--bootstrap.select2-container--focus { + z-index: 3; +} + +.input-group > .select2-container--bootstrap, +.input-group > .select2-container--bootstrap .input-group-append, +.input-group > .select2-container--bootstrap .input-group-prepend, +.input-group > .select2-container--bootstrap .input-group-append .btn, +.input-group > .select2-container--bootstrap .input-group-prepend .btn { + vertical-align: top; +} + +/** + * Temporary fix for https://github.com/select2/select2-bootstrap-theme/issues/9 + * + * Provides `!important` for certain properties of the class applied to the + * original ` -
    \n"; - $hookObjs = $this->getHookObjects('SeedDMS_View_Bootstrap'); echo "
      \n"; $menuitems = array(); /* Check if hook exists because otherwise callHook() will override $menuitems */ - foreach($hookObjs as $hookObj) { - if (method_exists($hookObj, 'globalNavigationBar')) { - $menuitems = $hookObj->globalNavigationBar($this, $menuitems); - } - } + if($this->hasHook('globalNavigationBar')) + $menuitems = $this->callHook('globalNavigationBar', $menuitems); foreach($menuitems as $menuitem) { if(!empty($menuitem['children'])) { echo "
    • \n"; @@ -409,11 +394,8 @@ background-image: linear-gradient(to bottom, #882222, #111111);; $menuitems = array(); $menuitems['my_documents'] = array('link'=>"../out/out.MyDocuments.php?inProcess=1", 'label'=>'my_documents'); $menuitems['my_account'] = array('link'=>"../out/out.MyAccount.php", 'label'=>'my_account'); - foreach($hookObjs as $hookObj) { - if (method_exists($hookObj, 'userMenuItems')) { - $menuitems = $hookObj->userMenuItems($this, $menuitems); - } - } + if($this->hasHook('userMenuItems')) + $menuitems = $this->callHook('userMenuItems', $menuitems); if($menuitems) { foreach($menuitems as $menuitem) { echo " ".getMLText($menuitem['label'])."\n"; @@ -2799,13 +2781,16 @@ $('body').on('click', '[id^=\"table-row-folder\"] td:nth-child(2)', function(ev) * @return string */ function getListRowPath($object) { /* {{{ */ - $belowtitle = "
      ".getMLText('in_folder').": /"; + $belowtitle = ''; $folder = $object->getParent(); - $path = $folder->getPath(); - for ($i = 1; $i < count($path); $i++) { - $belowtitle .= htmlspecialchars($path[$i]->getName())."/"; + if($folder) { + $belowtitle .= "
      ".getMLText('in_folder').": /"; + $path = $folder->getPath(); + for ($i = 1; $i < count($path); $i++) { + $belowtitle .= htmlspecialchars($path[$i]->getName())."/"; + } + $belowtitle .= ""; } - $belowtitle .= "
      "; return $belowtitle; } /* }}} */ @@ -3090,10 +3075,12 @@ $('body').on('click', '[id^=\"table-row-folder\"] td:nth-child(2)', function(ev) if(!empty($extracontent['begin_action_list'])) $content .= $extracontent['begin_action_list']; $subFolderAccessMode = $subFolder->getAccessMode($user); - if($subFolderAccessMode >= M_ALL) { - $content .= $this->printDeleteFolderButton($subFolder, 'splash_rm_folder', true); - } else { - $content .= ''; + if ($accessop->check_view_access('RemoveFolder')) { + if($subFolderAccessMode >= M_ALL) { + $content .= $this->printDeleteFolderButton($subFolder, 'splash_rm_folder', true); + } else { + $content .= ''; + } } if($subFolderAccessMode >= M_READWRITE) { $content .= ''; From 98f7fc85f480f80bb8d7f7439a9ce6a697708823 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 30 Apr 2021 09:27:59 +0200 Subject: [PATCH 062/403] run htmlspecialchars on workflow names --- views/bootstrap/class.ViewDocument.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/views/bootstrap/class.ViewDocument.php b/views/bootstrap/class.ViewDocument.php index 7a2bfe603..479f68198 100644 --- a/views/bootstrap/class.ViewDocument.php +++ b/views/bootstrap/class.ViewDocument.php @@ -1159,7 +1159,7 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Theme_Style { echo "getDocument()->getId()."\" />getVersion()."\" />"; echo ""; echo "
    • '.$title.'
    • '."\n"; + echo ''."\n"; } /* }}} */ protected function showStartPaneContent($name, $isactive) { /* {{{ */ echo '
      '; $this->contentContainerStart(); - echo ''; + echo '
      '; echo ''; } /* }}} */ @@ -51,7 +51,7 @@ class SeedDMS_View_Settings extends SeedDMS_Theme_Style { protected function getTextField($name, $value, $type='', $placeholder='') { /* {{{ */ $html = ''; if($type == 'textarea' || ($type != 'password' && strlen($value) > 80)) - $html .= ''; + $html .= ''; else { if(strlen($value) > 40) $class = 'input-xxlarge'; @@ -63,7 +63,7 @@ class SeedDMS_View_Settings extends SeedDMS_Theme_Style { $class = 'input-medium'; else $class = 'input-small'; - $html .= ''; + $html .= ''; } return $html; } /* }}} */ @@ -158,9 +158,9 @@ class SeedDMS_View_Settings extends SeedDMS_Theme_Style { "; - $content .= ""; + $content .= "\n"; if($onepage) - $content .= ""; - $content .= ""; + $content .= "\n"; if($onepage) - $content .= ""; print "\n"; }else print ""; @@ -179,7 +179,7 @@ $(document).ready( function() { print "\n"; print "getID()."\">\n"; print ""; print "\n"; }else print ""; diff --git a/views/bootstrap/class.FolderNotify.php b/views/bootstrap/class.FolderNotify.php index cacf287b6..c36bf01f3 100644 --- a/views/bootstrap/class.FolderNotify.php +++ b/views/bootstrap/class.FolderNotify.php @@ -162,7 +162,7 @@ $(document).ready(function() { print "\n"; print "getID()."\">\n"; print ""; print "\n"; }else print ""; @@ -179,7 +179,7 @@ $(document).ready(function() { print "\n"; print "getID()."\">\n"; print ""; print "\n"; }else print ""; From feee7732caa9b0f33686ffe2fa16226632dbe585 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Sat, 1 May 2021 14:08:50 +0200 Subject: [PATCH 077/403] fix layout of buttons, place submit button outside of container around form --- views/bootstrap/class.DocumentAccess.php | 2 +- views/bootstrap/class.DocumentNotify.php | 4 ++-- views/bootstrap/class.FolderAccess.php | 6 +++--- views/bootstrap/class.FolderNotify.php | 4 ++-- views/bootstrap/class.MoveDocument.php | 4 ++-- views/bootstrap/class.MoveFolder.php | 6 ++---- views/bootstrap/class.SetExpires.php | 4 ++-- views/bootstrap/class.TransferDocument.php | 2 +- 8 files changed, 15 insertions(+), 17 deletions(-) diff --git a/views/bootstrap/class.DocumentAccess.php b/views/bootstrap/class.DocumentAccess.php index f96ebf6c0..994017c7b 100644 --- a/views/bootstrap/class.DocumentAccess.php +++ b/views/bootstrap/class.DocumentAccess.php @@ -160,7 +160,7 @@ $(document).ready( function() { - "> + "> contentContainerEnd(); diff --git a/views/bootstrap/class.DocumentNotify.php b/views/bootstrap/class.DocumentNotify.php index fb6e2ce38..4633cc28b 100644 --- a/views/bootstrap/class.DocumentNotify.php +++ b/views/bootstrap/class.DocumentNotify.php @@ -91,7 +91,6 @@ $(document).ready( function() { $this->rowStart(); $this->columnStart(6); - $this->contentContainerStart(); ?> @@ -111,6 +110,7 @@ $(document).ready( function() { } elseif (!$user->isGuest() && !in_array($user->getID(), $userNotifyIDs)) { $options[] = array($user->getID(), htmlspecialchars($user->getLogin() . " - " .$user->getFullName())); } + $this->contentContainerStart(); $this->formField( getMLText("user"), array( @@ -139,11 +139,11 @@ $(document).ready( function() { 'options'=>$options ) ); + $this->contentContainerEnd(); $this->formSubmit(getMLText('add')); ?> contentContainerEnd(); $this->columnEnd(); $this->columnStart(6); print "
      : - - $value) { $optval = trim($isass ? $i : $value); From 35aa7f077f45ebddd50d19caa816a451f1b6c0d4 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 30 Apr 2021 14:51:26 +0200 Subject: [PATCH 067/403] add changes of 5.1.23 --- CHANGELOG | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG b/CHANGELOG index cbd3124b1..7a8d060db 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -3,6 +3,7 @@ -------------------------------------------------------------------------------- - output path of parent folder in many document/folder lists - list affected documents when transfering processes to another user +- check for quota and duplicate content in restapi -------------------------------------------------------------------------------- Changes in version 5.1.22 From 49e46a6aab8ddf3c229239cbb0254ef8d42c7f3a Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Sat, 1 May 2021 08:58:14 +0200 Subject: [PATCH 068/403] add style wordwrap to second column of folder/doc table --- views/bootstrap/class.Bootstrap.php | 6 +++--- views/bootstrap4/class.Bootstrap4.php | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/views/bootstrap/class.Bootstrap.php b/views/bootstrap/class.Bootstrap.php index 8032f59c6..f858fb1ce 100644 --- a/views/bootstrap/class.Bootstrap.php +++ b/views/bootstrap/class.Bootstrap.php @@ -2847,7 +2847,7 @@ $('body').on('click', '[id^=\"table-row-folder\"] td:nth-child(2)', function(ev) $content .= "getMimeIcon($latestContent->getFileType())."\" title=\"".htmlspecialchars($latestContent->getMimeType())."\">"; $content .= ""; if($onepage) $content .= "".htmlspecialchars($document->getName()) . ""; else @@ -2986,9 +2986,9 @@ $('body').on('click', '[id^=\"table-row-folder\"] td:nth-child(2)', function(ev) $content .= $this->folderListRowStart($subFolder); $content .= "getID()."&showtree=".$showtree."\">getMimeIcon(".folder")."\" width=\"24\" height=\"24\" border=0>" . "getId()."\">".htmlspecialchars($subFolder->getName()).""; + $content .= "" . "getId()."\">".htmlspecialchars($subFolder->getName()).""; else - $content .= "getID()."&showtree=".$showtree."\">" . htmlspecialchars($subFolder->getName()) . ""; + $content .= "getID()."&showtree=".$showtree."\">" . htmlspecialchars($subFolder->getName()) . ""; if(isset($extracontent['below_title'])) $content .= $extracontent['below_title']; $content .= "
      ".getMLText('owner').": ".htmlspecialchars($owner->getFullName()).", ".getMLText('creation_date').": ".date('Y-m-d', $subFolder->getDate()).""; diff --git a/views/bootstrap4/class.Bootstrap4.php b/views/bootstrap4/class.Bootstrap4.php index cb2e82fab..0db7730bf 100644 --- a/views/bootstrap4/class.Bootstrap4.php +++ b/views/bootstrap4/class.Bootstrap4.php @@ -2889,7 +2889,7 @@ $('body').on('click', '[id^=\"table-row-folder\"] td:nth-child(2)', function(ev) $content .= "getMimeIcon($latestContent->getFileType())."\" title=\"".htmlspecialchars($latestContent->getMimeType())."\">"; $content .= "
      "; if($onepage) $content .= "".htmlspecialchars($document->getName()) . ""; else @@ -3028,9 +3028,9 @@ $('body').on('click', '[id^=\"table-row-folder\"] td:nth-child(2)', function(ev) $content .= $this->folderListRowStart($subFolder); $content .= "getID()."&showtree=".$showtree."\">getMimeIcon(".folder")."\" width=\"24\" height=\"24\" border=0>" . "getId()."\">".htmlspecialchars($subFolder->getName()).""; + $content .= "" . "getId()."\">".htmlspecialchars($subFolder->getName()).""; else - $content .= "getID()."&showtree=".$showtree."\">" . htmlspecialchars($subFolder->getName()) . ""; + $content .= "getID()."&showtree=".$showtree."\">" . htmlspecialchars($subFolder->getName()) . ""; if(isset($extracontent['below_title'])) $content .= $extracontent['below_title']; $content .= "
      ".getMLText('owner').": ".htmlspecialchars($owner->getFullName()).", ".getMLText('creation_date').": ".date('Y-m-d', $subFolder->getDate()).""; From a3d2f844b04d70e955bbcbf8c6efc38296c6b2a1 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Sat, 1 May 2021 08:58:46 +0200 Subject: [PATCH 069/403] limit img.mimeicon in width --- views/bootstrap4/styles/application.css | 2 ++ 1 file changed, 2 insertions(+) diff --git a/views/bootstrap4/styles/application.css b/views/bootstrap4/styles/application.css index 32a172223..40a55a08c 100644 --- a/views/bootstrap4/styles/application.css +++ b/views/bootstrap4/styles/application.css @@ -39,6 +39,8 @@ img.mimeicon { border-style: solid; border-width: 1px 2px 2px 1px; background-color: white; + max-width: 100%; + min-width: 60px; } span.list-details { From 756b38a067a779ce066092ff852e191bc140b1ad Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Sat, 1 May 2021 12:46:29 +0200 Subject: [PATCH 070/403] do not declare callback function in run(), uses static method instead --- controllers/class.RemoveFolder.php | 65 +++++++++++++++++------------- 1 file changed, 36 insertions(+), 29 deletions(-) diff --git a/controllers/class.RemoveFolder.php b/controllers/class.RemoveFolder.php index 4dfd686cf..6706eb8e4 100644 --- a/controllers/class.RemoveFolder.php +++ b/controllers/class.RemoveFolder.php @@ -22,7 +22,33 @@ */ class SeedDMS_Controller_RemoveFolder extends SeedDMS_Controller_Common { - public function run() { + /* Register a callback which removes each document from the fulltext index + * The callback must return null otherwise the removal will be canceled. + */ + static function removeFromIndex($arr, $document) { /* {{{ */ + $fulltextservice = $arr[0]; + $lucenesearch = $fulltextservice->Search(); + $hit = null; + if($document->isType('document')) + $hit = $lucenesearch->getDocument($document->getID()); + elseif($document->isType('folder')) + $hit = $lucenesearch->getFolder($document->getID()); + if($hit) { + $index = $fulltextservice->Indexer(); + $index->delete($hit->id); + $index->commit(); + } + return null; + } /* }}} */ + + static function removePreviews($arr, $document) { /* {{{ */ + $previewer = $arr[0]; + + $previewer->deleteDocumentPreviews($document); + return null; + } /* }}} */ + + public function run() { /* {{{ */ $dms = $this->params['dms']; $user = $this->params['user']; $settings = $this->params['settings']; @@ -41,38 +67,19 @@ class SeedDMS_Controller_RemoveFolder extends SeedDMS_Controller_Common { $result = $this->callHook('removeFolder', $folder); if($result === null) { - /* Register a callback which removes each document from the fulltext index - * The callback must return null other the removal will be canceled. - */ - function removeFromIndex($arr, $document) { - $fulltextservice = $arr[0]; - $lucenesearch = $fulltextservice->Search(); - $hit = null; - if($document->isType('document')) - $hit = $lucenesearch->getDocument($document->getID()); - elseif($document->isType('folder')) - $hit = $lucenesearch->getFolder($document->getID()); - if($hit) { - $index = $fulltextservice->Indexer(); - $index->delete($hit->id); - $index->commit(); - } - return null; - } if($fulltextservice && ($index = $fulltextservice->Indexer())) { - $dms->addCallback('onPreRemoveDocument', 'removeFromIndex', array($fulltextservice)); - $dms->addCallback('onPreRemoveFolder', 'removeFromIndex', array($fulltextservice)); + /* Register a callback which is called by SeedDMS_Core when a folder + * or document is removed. The second parameter passed to this callback + * is the document or folder to be removed. + */ + $dms->addCallback('onPreRemoveDocument', 'SeedDMS_Controller_RemoveFolder::removeFromIndex', array($fulltextservice)); + $dms->addCallback('onPreRemoveFolder', 'SeedDMS_Controller_RemoveFolder::removeFromIndex', array($fulltextservice)); } - function removePreviews($arr, $document) { - $previewer = $arr[0]; - - $previewer->deleteDocumentPreviews($document); - return null; - } + /* Register another callback which removes the preview images of the document */ require_once("SeedDMS/Preview.php"); $previewer = new SeedDMS_Preview_Previewer($settings->_cacheDir); - $dms->addCallback('onPreRemoveDocument', 'removePreviews', array($previewer)); + $dms->addCallback('onPreRemoveDocument', 'SeedDMS_Controller_RemoveFolder::removePreviews', array($previewer)); if (!$folder->remove()) { $this->errormsg = 'error_occured'; @@ -88,5 +95,5 @@ class SeedDMS_Controller_RemoveFolder extends SeedDMS_Controller_Common { } return true; - } + } /* }}} */ } From d647b72463835867c539ada13e892b7400f23518 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Sat, 1 May 2021 12:47:04 +0200 Subject: [PATCH 071/403] remove preview images before deleting document --- controllers/class.RemoveDocument.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/controllers/class.RemoveDocument.php b/controllers/class.RemoveDocument.php index 1b78314d9..70cff8fe1 100644 --- a/controllers/class.RemoveDocument.php +++ b/controllers/class.RemoveDocument.php @@ -43,6 +43,9 @@ class SeedDMS_Controller_RemoveDocument extends SeedDMS_Controller_Common { $result = $this->callHook('removeDocument', $document); if($result === null) { + require_once("SeedDMS/Preview.php"); + $previewer = new SeedDMS_Preview_Previewer($settings->_cacheDir); + $previewer->deleteDocumentPreviews($document); if (!$document->remove()) { if($dms->lasterror) $this->errormsg = $dms->lasterror; From a27d1aabe503e8a7484e8db8e160f94689f91abf Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Sat, 1 May 2021 12:49:32 +0200 Subject: [PATCH 072/403] add changes for 5.1.23 --- CHANGELOG | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index 7a8d060db..47aaba304 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -4,6 +4,9 @@ - output path of parent folder in many document/folder lists - list affected documents when transfering processes to another user - check for quota and duplicate content in restapi +- remove preview images before removing document +- fixed error due to multiple declared function when controller method + RemoveFolder::run was called more than once -------------------------------------------------------------------------------- Changes in version 5.1.22 From 42cf1e9d054427d19d0adc3be86cf5f4385b7321 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Sat, 1 May 2021 13:19:47 +0200 Subject: [PATCH 073/403] use identical layout on all remove pages --- views/bootstrap/class.RemoveDocument.php | 6 +----- views/bootstrap/class.RemoveFolder.php | 6 +----- views/bootstrap/class.RemoveVersion.php | 4 +--- 3 files changed, 3 insertions(+), 13 deletions(-) diff --git a/views/bootstrap/class.RemoveDocument.php b/views/bootstrap/class.RemoveDocument.php index 57cb0f816..a3e43fa49 100644 --- a/views/bootstrap/class.RemoveDocument.php +++ b/views/bootstrap/class.RemoveDocument.php @@ -43,19 +43,15 @@ class SeedDMS_View_RemoveDocument extends SeedDMS_Theme_Style { $this->contentStart(); $this->pageNavigation($this->getFolderPathHTML($folder, true, $document), "view_document", $document); $this->contentHeading(getMLText("rm_document")); - $this->contentContainerStart('warning'); + $this->warningMsg(getMLText("confirm_rm_document", array ("documentname" => htmlspecialchars($document->getName())))); ?> -

      - htmlspecialchars($document->getName())));?> -

      contentContainerEnd(); $this->contentEnd(); $this->htmlEndPage(); } /* }}} */ diff --git a/views/bootstrap/class.RemoveFolder.php b/views/bootstrap/class.RemoveFolder.php index c91b9f9c2..713462875 100644 --- a/views/bootstrap/class.RemoveFolder.php +++ b/views/bootstrap/class.RemoveFolder.php @@ -41,19 +41,15 @@ class SeedDMS_View_RemoveFolder extends SeedDMS_Theme_Style { $this->contentStart(); $this->pageNavigation($this->getFolderPathHTML($folder, true), "view_folder", $folder); $this->contentHeading(getMLText("rm_folder")); - $this->contentContainerStart(); + $this->warningMsg(getMLText("confirm_rm_folder", array ("foldername" => htmlspecialchars($folder->getName())))); ?>
      -

      - htmlspecialchars($folder->getName())));?> -

      contentContainerEnd(); $this->contentEnd(); $this->htmlEndPage(); } /* }}} */ diff --git a/views/bootstrap/class.RemoveVersion.php b/views/bootstrap/class.RemoveVersion.php index 6c6f8690a..40e9869e7 100644 --- a/views/bootstrap/class.RemoveVersion.php +++ b/views/bootstrap/class.RemoveVersion.php @@ -43,17 +43,15 @@ class SeedDMS_View_RemoveVersion extends SeedDMS_Theme_Style { $this->contentStart(); $this->pageNavigation($this->getFolderPathHTML($folder, true, $document), "view_document", $document); $this->contentHeading(getMLText("rm_version")); - $this->contentContainerStart(); + $this->warningMsg(getMLText("confirm_rm_version", array ("documentname" => htmlspecialchars($document->getName()), "version" => $version->getVersion()))); ?>
      -

      htmlspecialchars($document->getName()), "version" => $version->getVersion()));?>

      contentContainerEnd(); $this->contentEnd(); $this->htmlEndPage(); } /* }}} */ From 9644153d7b38dc071835078b0d54dc2a3bd8f1d2 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Sat, 1 May 2021 13:52:21 +0200 Subject: [PATCH 074/403] fix layout of dropdown folder/document search --- views/bootstrap4/styles/application.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/views/bootstrap4/styles/application.js b/views/bootstrap4/styles/application.js index d6339a280..a94495658 100644 --- a/views/bootstrap4/styles/application.js +++ b/views/bootstrap4/styles/application.js @@ -224,6 +224,8 @@ $(document).ready( function() { /* Document chooser */ $("[id^=choosedocsearch]").typeahead({ /* {{{ */ + menu: '', + item: '
    • ', minLength: 3, source: function(query, process) { // console.log(this.options); @@ -252,6 +254,8 @@ $(document).ready( function() { /* Folder chooser */ $("[id^=choosefoldersearch]").typeahead({ /* {{{ */ + menu: '', + item: '
    • ', minLength: 3, source: function(query, process) { // console.log(this.options); From 8a4b520754c068c04746a4e72903d12cfd61ef3c Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Sat, 1 May 2021 13:54:14 +0200 Subject: [PATCH 075/403] add class form-control to select menu --- views/bootstrap/class.DocumentAccess.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/bootstrap/class.DocumentAccess.php b/views/bootstrap/class.DocumentAccess.php index acccb932d..f96ebf6c0 100644 --- a/views/bootstrap/class.DocumentAccess.php +++ b/views/bootstrap/class.DocumentAccess.php @@ -35,7 +35,7 @@ class SeedDMS_View_DocumentAccess extends SeedDMS_Theme_Style { } /* }}} */ function getAccessModeSelection($defMode) { /* {{{ */ - $content = "\n"; $content .= "\t\n"; $content .= "\t\n"; $content .= "\t\n"; From 23bc6ad49c64f12aea0d99ed8fe2c34584348661 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Sat, 1 May 2021 13:54:42 +0200 Subject: [PATCH 076/403] add class btn-danger and btn-sm to delete buttons --- views/bootstrap/class.DocumentNotify.php | 4 ++-- views/bootstrap/class.FolderNotify.php | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/views/bootstrap/class.DocumentNotify.php b/views/bootstrap/class.DocumentNotify.php index c9a1750ff..fb6e2ce38 100644 --- a/views/bootstrap/class.DocumentNotify.php +++ b/views/bootstrap/class.DocumentNotify.php @@ -162,7 +162,7 @@ $(document).ready( function() { print "\n"; print "getID()."\">\n"; print "
      "; - print ""; + print ""; print ""; - print ""; + print ""; print ""; - print ""; + print ""; print ""; - print ""; + print ""; print "
      \n"; diff --git a/views/bootstrap/class.FolderAccess.php b/views/bootstrap/class.FolderAccess.php index 9de43078d..dd77941b1 100644 --- a/views/bootstrap/class.FolderAccess.php +++ b/views/bootstrap/class.FolderAccess.php @@ -136,14 +136,14 @@ $(document).ready(function() { - "> + "> - "> + ">

      - "> + "> rowStart(); $this->columnStart(6); - $this->contentContainerStart(); ?> @@ -111,6 +110,7 @@ $(document).ready(function() { } elseif (!$user->isGuest() && !in_array($user->getID(), $userNotifyIDs)) { $options[] = array($user->getID(), htmlspecialchars($user->getLogin() . " - " .$user->getFullName())); } + $this->contentContainerStart(); $this->formField( getMLText("user"), array( @@ -139,11 +139,11 @@ $(document).ready(function() { 'options'=>$options ) ); + $this->contentContainerEnd(); $this->formSubmit(getMLText('add')); ?> contentContainerEnd(); $this->columnEnd(); $this->columnStart(6); print "
      \n"; diff --git a/views/bootstrap/class.MoveDocument.php b/views/bootstrap/class.MoveDocument.php index 7e4aa5e44..9d628d050 100644 --- a/views/bootstrap/class.MoveDocument.php +++ b/views/bootstrap/class.MoveDocument.php @@ -49,18 +49,18 @@ class SeedDMS_View_MoveDocument extends SeedDMS_Theme_Style { $this->contentStart(); $this->pageNavigation($this->getFolderPathHTML($folder, true, $document), "view_document", $document); $this->contentHeading(getMLText("move_document")); - $this->contentContainerStart('warning'); ?> contentContainerStart('warning'); $this->formField(getMLText("choose_target_folder"), $this->getFolderChooserHtml("form1", M_READWRITE, -1, $target)); + $this->contentContainerEnd(); $this->formSubmit(getMLText('move')); ?> contentContainerEnd(); $this->contentEnd(); $this->htmlEndPage(); } /* }}} */ diff --git a/views/bootstrap/class.MoveFolder.php b/views/bootstrap/class.MoveFolder.php index 576e0725e..be0e35ba3 100644 --- a/views/bootstrap/class.MoveFolder.php +++ b/views/bootstrap/class.MoveFolder.php @@ -48,7 +48,6 @@ class SeedDMS_View_MoveFolder extends SeedDMS_Theme_Style { $this->contentStart(); $this->pageNavigation($this->getFolderPathHTML($folder, true), "view_folder", $folder); $this->contentHeading(getMLText("move_folder")); - $this->contentContainerStart(); ?> @@ -56,14 +55,13 @@ class SeedDMS_View_MoveFolder extends SeedDMS_Theme_Style { contentContainerStart(); $this->formField(getMLText("choose_target_folder"), $this->getFolderChooserHtml("form1", M_READWRITE, $folder->getID(), $target)); + $this->contentContainerEnd(); $this->formSubmit(getMLText('move_folder')); ?> - - contentContainerEnd(); $this->contentEnd(); $this->htmlEndPage(); } /* }}} */ diff --git a/views/bootstrap/class.SetExpires.php b/views/bootstrap/class.SetExpires.php index 2f920195b..9c2e377aa 100644 --- a/views/bootstrap/class.SetExpires.php +++ b/views/bootstrap/class.SetExpires.php @@ -56,7 +56,6 @@ $(document).ready( function() { $this->contentStart(); $this->pageNavigation($this->getFolderPathHTML($folder, true, $document), "view_document", $document); $this->contentHeading(getMLText("set_expiry")); - $this->contentContainerStart(); if($document->expires()) $expdate = getReadableDate($document->getExpires()); @@ -68,6 +67,7 @@ $(document).ready( function() { contentContainerStart(); $options = array(); $options[] = array('never', getMLText('does_not_expire')); $options[] = array('date', getMLText('expire_by_date'), $expdate != ''); @@ -89,11 +89,11 @@ $(document).ready( function() { getMLText("expires"), $this->getDateChooser($expdate, "expdate", $this->params['session']->getLanguage()) ); + $this->contentContainerEnd(); $this->formSubmit(" ".getMLText('save')); ?> contentContainerEnd(); $this->contentEnd(); $this->htmlEndPage(); } /* }}} */ diff --git a/views/bootstrap/class.TransferDocument.php b/views/bootstrap/class.TransferDocument.php index 387f35b62..70e5b2841 100644 --- a/views/bootstrap/class.TransferDocument.php +++ b/views/bootstrap/class.TransferDocument.php @@ -67,8 +67,8 @@ class SeedDMS_View_TransferDocument extends SeedDMS_Theme_Style { getMLText("transfer_to_user"), $html ); - $this->formSubmit(" ".getMLText('transfer_document')); $this->contentContainerEnd(); + $this->formSubmit(" ".getMLText('transfer_document')); } else { $this->warningMsg('transfer_no_users'); } From 262ba1345b3dcfc6220ac4003fcf1533bd822092 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Sat, 1 May 2021 14:50:04 +0200 Subject: [PATCH 078/403] take out submit from contentContainer, add class btn-primary to buttons --- views/bootstrap/class.AttributeMgr.php | 4 ++-- views/bootstrap/class.Categories.php | 4 ++-- views/bootstrap/class.DefaultKeywords.php | 12 ++++++------ 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/views/bootstrap/class.AttributeMgr.php b/views/bootstrap/class.AttributeMgr.php index 98d4e29cc..3050b2a24 100644 --- a/views/bootstrap/class.AttributeMgr.php +++ b/views/bootstrap/class.AttributeMgr.php @@ -194,6 +194,7 @@ $(document).ready( function() { contentContainerStart(); $this->formField( getMLText("attrdef_name"), array( @@ -302,6 +303,7 @@ $(document).ready( function() { ), ['help'=>getMLText('attrdef_regex_help')] ); + $this->contentContainerEnd(); $this->formSubmit(' '.getMLText('save')); ?> @@ -401,10 +403,8 @@ $(document).ready( function() { $this->columnEnd(); $this->columnStart(6); ?> - contentContainerStart(); ?>
      getID()."\"" : "") ?>>
      contentContainerEnd(); $this->columnEnd(); $this->rowEnd(); diff --git a/views/bootstrap/class.Categories.php b/views/bootstrap/class.Categories.php index 3931cfd80..7526b56d8 100644 --- a/views/bootstrap/class.Categories.php +++ b/views/bootstrap/class.Categories.php @@ -115,6 +115,7 @@ $(document).ready( function() { contentContainerStart(); $this->formField( getMLText("name"), array( @@ -124,6 +125,7 @@ $(document).ready( function() { 'value'=>($category ? htmlspecialchars($category->getName()) : '') ) ); + $this->contentContainerEnd(); $this->formSubmit(" ".getMLText('save')); ?> @@ -170,11 +172,9 @@ $(document).ready( function() { columnEnd(); $this->columnStart(6); - $this->contentContainerStart(); ?>
      getID()."\"" : "") ?>>
      contentContainerEnd(); $this->columnEnd(); $this->rowEnd(); diff --git a/views/bootstrap/class.DefaultKeywords.php b/views/bootstrap/class.DefaultKeywords.php index dcd12592f..e90363344 100644 --- a/views/bootstrap/class.DefaultKeywords.php +++ b/views/bootstrap/class.DefaultKeywords.php @@ -166,7 +166,6 @@ $(document).ready( function() { contentContainerEnd(); } else { - $this->contentContainerStart(); $owner = $category->getOwner(); if ((!$user->isAdmin()) && ($owner->getID() != $user->getID())) return; ?> @@ -174,6 +173,7 @@ $(document).ready( function() { contentContainerStart(); $this->formField( getMLText("name"), array( @@ -183,11 +183,11 @@ $(document).ready( function() { 'value'=>$category->getName() ) ); + $this->contentContainerEnd(); $this->formSubmit(" ".getMLText('save')); ?> contentContainerEnd(); $this->contentHeading(getMLText("default_keywords")); $this->contentContainerStart(); ?> @@ -198,12 +198,12 @@ $(document).ready( function() { else foreach ($lists as $list) { ?> -
      + "> - "> + "> @@ -224,8 +224,8 @@ $(document).ready( function() { - - "> + + From 1afda0e67722e1b2eccb04325576d4f3a79da895 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Sun, 2 May 2021 07:54:38 +0200 Subject: [PATCH 079/403] add class table-sm to table --- views/bootstrap/class.Charts.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/bootstrap/class.Charts.php b/views/bootstrap/class.Charts.php index 282b8c05f..e7f5ee535 100644 --- a/views/bootstrap/class.Charts.php +++ b/views/bootstrap/class.Charts.php @@ -225,7 +225,7 @@ $(document).ready( function() {
      contentContainerEnd(); - echo "
      "; + echo "
      "; echo ""; echo ""; if(in_array($type, array('docspermonth', 'docsaccumulated'))) From 720615c17513862800d3d395029b66fb1ef3fd37 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Sun, 2 May 2021 07:56:58 +0200 Subject: [PATCH 080/403] pass enableRecursiveCount and maxRecursiveCount to view --- out/out.ObjectCheck.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/out/out.ObjectCheck.php b/out/out.ObjectCheck.php index 144674e52..3b13c1923 100644 --- a/out/out.ObjectCheck.php +++ b/out/out.ObjectCheck.php @@ -90,6 +90,8 @@ if($view) { $view->setParam('repair', $repair); $view->setParam('showtree', showtree()); $view->setParam('rootfolder', $rootfolder); + $view->setParam('enableRecursiveCount', $settings->_enableRecursiveCount); + $view->setParam('maxRecursiveCount', $settings->_maxRecursiveCount); $view->setParam('accessobject', $accessop); $view->setParam('previewWidthList', $settings->_previewWidthList); $view->setParam('previewConverters', isset($settings->_converters['preview']) ? $settings->_converters['preview'] : array()); From 258968b2c28bd88204be397c87862948d366b0a2 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Sun, 2 May 2021 12:52:30 +0200 Subject: [PATCH 081/403] minor translation updates --- languages/ar_EG/lang.inc | 1 + languages/bg_BG/lang.inc | 1 + languages/ca_ES/lang.inc | 1 + languages/cs_CZ/lang.inc | 1 + languages/de_DE/lang.inc | 11 ++++++----- languages/el_GR/lang.inc | 1 + languages/en_GB/lang.inc | 11 ++++++----- languages/es_ES/lang.inc | 1 + languages/fr_FR/lang.inc | 1 + languages/hr_HR/lang.inc | 9 +++++---- languages/hu_HU/lang.inc | 1 + languages/it_IT/lang.inc | 1 + languages/ko_KR/lang.inc | 1 + languages/lo_LA/lang.inc | 1 + languages/nb_NO/lang.inc | 1 + languages/nl_NL/lang.inc | 1 + languages/pl_PL/lang.inc | 1 + languages/pt_BR/lang.inc | 9 +++++---- languages/ro_RO/lang.inc | 1 + languages/ru_RU/lang.inc | 1 + languages/sk_SK/lang.inc | 1 + languages/sv_SE/lang.inc | 1 + languages/tr_TR/lang.inc | 1 + languages/uk_UA/lang.inc | 7 ++++--- languages/zh_CN/lang.inc | 1 + languages/zh_TW/lang.inc | 1 + 26 files changed, 47 insertions(+), 21 deletions(-) diff --git a/languages/ar_EG/lang.inc b/languages/ar_EG/lang.inc index 63364bee9..7976d05e8 100644 --- a/languages/ar_EG/lang.inc +++ b/languages/ar_EG/lang.inc @@ -694,6 +694,7 @@ URL: [url]', 'individuals' => 'افراد', 'individuals_in_groups' => 'أفراد في المجموعات', 'info_recipients_tab_not_released' => 'رابط معلومات المستلمين لم يصدر بعد', +'info_rm_user_from_processes_user' => '', 'inherited' => 'موروث', 'inherits_access_copy_msg' => 'نسخ قائمة صلاحيات موروثة.', 'inherits_access_empty_msg' => 'ابدأ بقائمة صلاحيات فارغة', diff --git a/languages/bg_BG/lang.inc b/languages/bg_BG/lang.inc index 9e5905db0..bda2b786d 100644 --- a/languages/bg_BG/lang.inc +++ b/languages/bg_BG/lang.inc @@ -623,6 +623,7 @@ $text = array( 'individuals' => 'Личности', 'individuals_in_groups' => '', 'info_recipients_tab_not_released' => '', +'info_rm_user_from_processes_user' => '', 'inherited' => 'наследен', 'inherits_access_copy_msg' => 'Изкопирай наследения список', 'inherits_access_empty_msg' => 'Започни с празен списък за достъп', diff --git a/languages/ca_ES/lang.inc b/languages/ca_ES/lang.inc index ac395ee76..d808086f3 100644 --- a/languages/ca_ES/lang.inc +++ b/languages/ca_ES/lang.inc @@ -628,6 +628,7 @@ URL: [url]', 'individuals' => 'Individuals', 'individuals_in_groups' => '', 'info_recipients_tab_not_released' => '', +'info_rm_user_from_processes_user' => '', 'inherited' => 'Heredat', 'inherits_access_copy_msg' => 'Copiar llista d\'accés heretat', 'inherits_access_empty_msg' => 'Començar amb una llista d\'accés buida', diff --git a/languages/cs_CZ/lang.inc b/languages/cs_CZ/lang.inc index a4257f7e6..90d8cf129 100644 --- a/languages/cs_CZ/lang.inc +++ b/languages/cs_CZ/lang.inc @@ -725,6 +725,7 @@ URL: [url]', 'individuals' => 'Jednotlivci', 'individuals_in_groups' => 'Členové skupiny', 'info_recipients_tab_not_released' => 'Potvrzení o příjmu této verze dokumentu není možné, protože verze není uvolněna.', +'info_rm_user_from_processes_user' => '', 'inherited' => 'Zděděno', 'inherits_access_copy_msg' => 'Zkopírovat zděděný seznam řízení přístupu', 'inherits_access_empty_msg' => 'Založit nový seznam řízení přístupu', diff --git a/languages/de_DE/lang.inc b/languages/de_DE/lang.inc index 25043edae..7c4c37b45 100644 --- a/languages/de_DE/lang.inc +++ b/languages/de_DE/lang.inc @@ -19,7 +19,7 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // -// Translators: Admin (2881), dgrutsch (22) +// Translators: Admin (2886), dgrutsch (22) $text = array( '2_factor_auth' => '2-Faktor Authentifizierung', @@ -485,8 +485,8 @@ URL: [url]', 'do_object_setfiletype' => 'Setze Dateityp', 'do_object_unlink' => 'Lösche Dokumentenversion', 'draft' => 'Entwurf', -'draft_pending_approval' => 'Entwurf - bevorstehende Freigabe', -'draft_pending_review' => 'Entwurf - bevorstehende Prüfung', +'draft_pending_approval' => 'Freigabe erforderlich', +'draft_pending_review' => 'Prüfung erforderlich', 'drag_icon_here' => 'Icon eines Ordners oder Dokuments hier hin ziehen!', 'dropfolderdir_missing' => 'Ihr persönlicher Ablageordner auf dem Server existiert nicht! Kontaktieren Sie den Administrator, um in anlegen zu lassen.', 'dropfolder_file' => 'Datei aus Ablageordner', @@ -725,6 +725,7 @@ URL: [url]', 'individuals' => 'Einzelpersonen', 'individuals_in_groups' => 'Mitglieder einer Gruppe', 'info_recipients_tab_not_released' => 'Die Bestätigung des Empfangs für diese Dokumentenversion ist nicht möglich, weil die Version nicht freigegeben ist.', +'info_rm_user_from_processes_user' => 'Nur die noch offenen Aufgaben können auf einen anderen Benutzer übertragen werden. Bei Aufgaben, die bereits bearbeitet wurden, wird der Benutzer aus der Bearbeitungshistorie gelöscht, als würde der Benutzer selbst gelöscht.', 'inherited' => 'geerbt', 'inherits_access_copy_msg' => 'Berechtigungen kopieren', 'inherits_access_empty_msg' => 'Leere Zugriffsliste', @@ -1812,7 +1813,7 @@ Name: [username] 'state_and_next_state' => 'Status/Nächster Status', 'statistic' => 'Statistik', 'status' => 'Status', -'status_approval_rejected' => 'Entwurf abgelehnt', +'status_approval_rejected' => 'abgelehnt', 'status_approved' => 'freigegeben', 'status_approver_removed' => 'Freigebender wurde vom Prozess ausgeschlossen', 'status_change' => 'Statusänderung', @@ -1825,7 +1826,7 @@ Name: [username] 'status_receipt_rejected' => 'Abgelehnt', 'status_recipient_removed' => 'Empfänger aus Liste entfernt', 'status_reviewed' => 'geprüft', -'status_reviewer_rejected' => 'Entwurf abgelehnt', +'status_reviewer_rejected' => 'abgelehnt', 'status_reviewer_removed' => 'Prüfer wurde vom Prozess ausgeschlossen', 'status_revised' => 'überprüft', 'status_revision_rejected' => 'Abgelehnt', diff --git a/languages/el_GR/lang.inc b/languages/el_GR/lang.inc index a0f86b395..e91a3c4db 100644 --- a/languages/el_GR/lang.inc +++ b/languages/el_GR/lang.inc @@ -623,6 +623,7 @@ $text = array( 'individuals' => 'Άτομα', 'individuals_in_groups' => '', 'info_recipients_tab_not_released' => '', +'info_rm_user_from_processes_user' => '', 'inherited' => 'Κληρονομημένο', 'inherits_access_copy_msg' => 'Αντιγραφή δικαιωμάτων πρόσβασης', 'inherits_access_empty_msg' => 'Έναρξη με κενή λίστα δικαιωμάτων πρόσβασης', diff --git a/languages/en_GB/lang.inc b/languages/en_GB/lang.inc index 787428c1d..fbb6a800a 100644 --- a/languages/en_GB/lang.inc +++ b/languages/en_GB/lang.inc @@ -19,7 +19,7 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // -// Translators: Admin (1990), archonwang (3), dgrutsch (9), netixw (14) +// Translators: Admin (1996), archonwang (3), dgrutsch (9), netixw (14) $text = array( '2_factor_auth' => '2-factor authentication', @@ -485,8 +485,8 @@ URL: [url]', 'do_object_setfiletype' => 'Set file type', 'do_object_unlink' => 'Delete document version', 'draft' => 'Draft', -'draft_pending_approval' => 'Draft - pending approval', -'draft_pending_review' => 'Draft - pending review', +'draft_pending_approval' => 'pending approval', +'draft_pending_review' => 'pending review', 'drag_icon_here' => 'Drag icon of folder or document here!', 'dropfolderdir_missing' => 'Your personal drop folder does not exist on the server! Please ask your administrator to create it.', 'dropfolder_file' => 'File from drop folder', @@ -725,6 +725,7 @@ URL: [url]', 'individuals' => 'Individuals', 'individuals_in_groups' => 'Members of a group', 'info_recipients_tab_not_released' => 'Acknowledgement of reception for this document version is not possible, because the version is not released.', +'info_rm_user_from_processes_user' => 'Only tasks not being touched can be transfered to another user. Task which has been taken care of, will just add an item in the history, as if the user was deleted.', 'inherited' => 'inherited', 'inherits_access_copy_msg' => 'Copy inherited access list', 'inherits_access_empty_msg' => 'Start with empty access list', @@ -1806,7 +1807,7 @@ Name: [username] 'state_and_next_state' => 'State/Next state', 'statistic' => 'Statistic', 'status' => 'Status', -'status_approval_rejected' => 'Draft rejected', +'status_approval_rejected' => 'rejected', 'status_approved' => 'Approved', 'status_approver_removed' => 'Approver removed from process', 'status_change' => 'Status change', @@ -1819,7 +1820,7 @@ Name: [username] 'status_receipt_rejected' => 'Rejected', 'status_recipient_removed' => 'Recipient removed from list', 'status_reviewed' => 'Reviewed', -'status_reviewer_rejected' => 'Draft rejected', +'status_reviewer_rejected' => 'rejected', 'status_reviewer_removed' => 'Reviewer removed from process', 'status_revised' => 'revised', 'status_revision_rejected' => 'Rejected', diff --git a/languages/es_ES/lang.inc b/languages/es_ES/lang.inc index 05183928c..4cbba0183 100644 --- a/languages/es_ES/lang.inc +++ b/languages/es_ES/lang.inc @@ -701,6 +701,7 @@ URL: [url]', 'individuals' => 'Individuales', 'individuals_in_groups' => 'Miembros del grupo', 'info_recipients_tab_not_released' => '', +'info_rm_user_from_processes_user' => '', 'inherited' => 'heredado', 'inherits_access_copy_msg' => 'Copiar lista de acceso heredado', 'inherits_access_empty_msg' => 'Empezar con una lista de acceso vacía', diff --git a/languages/fr_FR/lang.inc b/languages/fr_FR/lang.inc index 191a081e8..e3ee03f37 100644 --- a/languages/fr_FR/lang.inc +++ b/languages/fr_FR/lang.inc @@ -725,6 +725,7 @@ URL: [url]', 'individuals' => 'Individuels', 'individuals_in_groups' => 'Membres d’un groupe', 'info_recipients_tab_not_released' => 'L’accusé de réception pour cette version du document n’est pas possible car la version n’est pas en état « publié ».', +'info_rm_user_from_processes_user' => '', 'inherited' => 'hérité', 'inherits_access_copy_msg' => 'Recopier la liste des accès hérités', 'inherits_access_empty_msg' => 'Commencer avec une liste d\'accès vide', diff --git a/languages/hr_HR/lang.inc b/languages/hr_HR/lang.inc index e83a31a50..a426f9453 100644 --- a/languages/hr_HR/lang.inc +++ b/languages/hr_HR/lang.inc @@ -19,7 +19,7 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // -// Translators: Admin (1243), marbanas (16) +// Translators: Admin (1246), marbanas (16) $text = array( '2_factor_auth' => '', @@ -75,7 +75,7 @@ Internet poveznica: [url]', 'add_receipt' => 'Potvrdi prijem', 'add_review' => 'Dodaj osvrt', 'add_revision' => 'Dodaj reviziju', -'add_role' => '', +'add_role' => 'Dodaj novu rolu', 'add_subfolder' => 'Dodaj podmapu', 'add_task' => '', 'add_to_clipboard' => 'Dodaj u međuspremnik', @@ -166,7 +166,7 @@ Internet poveznica: [url]', 'attrdef_minvalues_help' => '', 'attrdef_min_greater_max' => 'Minimalni broj vrijednosti je veći od maksimalnog broja vrijednosti', 'attrdef_multiple' => 'Dozvoli više vrijednosti', -'attrdef_multiple_needs_valueset' => '', +'attrdef_multiple_needs_valueset' => 'Atribut s višestrukim vrijednostima mora imati set vrijednosti', 'attrdef_must_be_multiple' => 'Atribut mora imati više od jedne vrijednosti, ali nije postavljeno više vrijednosti', 'attrdef_name' => 'Naziv', 'attrdef_noname' => 'Nedostaje naziv za definiciju atributa', @@ -275,7 +275,7 @@ Internet poveznica: [url]', 'choose_attrdefgroup' => '', 'choose_category' => 'Molim odaberite', 'choose_group' => 'Odaberite grupu', -'choose_role' => '', +'choose_role' => 'Izaberi rolu', 'choose_target_category' => 'Odaberite kategoriju', 'choose_target_document' => 'Odaberite dokument', 'choose_target_file' => 'Odaberite datoteku', @@ -706,6 +706,7 @@ Internet poveznica: [url]', 'individuals' => 'Pojedinci', 'individuals_in_groups' => '', 'info_recipients_tab_not_released' => '', +'info_rm_user_from_processes_user' => '', 'inherited' => 'naslijeđeno', 'inherits_access_copy_msg' => 'Kopiraj listu naslijeđenih prava pristupa', 'inherits_access_empty_msg' => 'Započnite s praznim popisom pristupa', diff --git a/languages/hu_HU/lang.inc b/languages/hu_HU/lang.inc index 033aaf024..3b84ee19c 100644 --- a/languages/hu_HU/lang.inc +++ b/languages/hu_HU/lang.inc @@ -701,6 +701,7 @@ URL: [url]', 'individuals' => 'Egyedek', 'individuals_in_groups' => '', 'info_recipients_tab_not_released' => '', +'info_rm_user_from_processes_user' => '', 'inherited' => 'örökölt', 'inherits_access_copy_msg' => 'Örökített hozzáférési lista másolása', 'inherits_access_empty_msg' => 'Indulás üres hozzáférési listával', diff --git a/languages/it_IT/lang.inc b/languages/it_IT/lang.inc index 855f345c7..4e6c5d46e 100644 --- a/languages/it_IT/lang.inc +++ b/languages/it_IT/lang.inc @@ -711,6 +711,7 @@ URL: [url]', 'individuals' => 'Singoli', 'individuals_in_groups' => 'I membri de la gruppo', 'info_recipients_tab_not_released' => 'Non è possibile confermare la ricezione di questa versione del documento, poiché la versione non è stata rilasciata.', +'info_rm_user_from_processes_user' => '', 'inherited' => 'ereditato', 'inherits_access_copy_msg' => 'Copia la lista degli accessi ereditati', 'inherits_access_empty_msg' => 'Reimposta una lista di permessi vuota', diff --git a/languages/ko_KR/lang.inc b/languages/ko_KR/lang.inc index cad922e60..904e7f936 100644 --- a/languages/ko_KR/lang.inc +++ b/languages/ko_KR/lang.inc @@ -707,6 +707,7 @@ URL: [url]', 'individuals' => '개인', 'individuals_in_groups' => '개별 그룹', 'info_recipients_tab_not_released' => '', +'info_rm_user_from_processes_user' => '', 'inherited' => '상속', 'inherits_access_copy_msg' => '상속 액세스 목록 복사', 'inherits_access_empty_msg' => '빈 액세스 목록으로 시작', diff --git a/languages/lo_LA/lang.inc b/languages/lo_LA/lang.inc index 41fd5cf89..c1a0d6b3d 100644 --- a/languages/lo_LA/lang.inc +++ b/languages/lo_LA/lang.inc @@ -704,6 +704,7 @@ URL: [url]', 'individuals' => 'ບຸກຄົນ', 'individuals_in_groups' => 'ສະມາຊິກຂອງກຸ່ມ', 'info_recipients_tab_not_released' => '', +'info_rm_user_from_processes_user' => '', 'inherited' => 'ຮັບການຖ່າຍທອດ', 'inherits_access_copy_msg' => 'ຄັດລັອກລາຍການເຂົາເຖິງທີສືບທອດ', 'inherits_access_empty_msg' => 'ເລີ້ມຕົ້ນດ້ວຍລາຍການທີ່ວ່າງເປົ່າ', diff --git a/languages/nb_NO/lang.inc b/languages/nb_NO/lang.inc index 38b7e68b2..e0252b514 100644 --- a/languages/nb_NO/lang.inc +++ b/languages/nb_NO/lang.inc @@ -725,6 +725,7 @@ URL: [url]', 'individuals' => 'Personer', 'individuals_in_groups' => 'Medlemmer i en gruppe', 'info_recipients_tab_not_released' => 'Bekreftelse av mottak for denne dokumentversjonen er ikke mulig fordi versjonen ikke er utgitt.', +'info_rm_user_from_processes_user' => '', 'inherited' => 'arvet', 'inherits_access_copy_msg' => 'Kopier arvet adgangsliste', 'inherits_access_empty_msg' => 'Start med tom adgangsliste', diff --git a/languages/nl_NL/lang.inc b/languages/nl_NL/lang.inc index cc635ee8e..173f65adf 100644 --- a/languages/nl_NL/lang.inc +++ b/languages/nl_NL/lang.inc @@ -718,6 +718,7 @@ URL: [url]', 'individuals' => 'Individuen', 'individuals_in_groups' => 'Individuen in groepen', 'info_recipients_tab_not_released' => 'Ontvangstbevestiging van deze versie van het document is niet mogelijk omdat de versie nog niet is vrijgegeven.', +'info_rm_user_from_processes_user' => '', 'inherited' => 'overgeërfd', 'inherits_access_copy_msg' => 'Lijst van overgeërfde toegang', 'inherits_access_empty_msg' => 'Begin met een lege toegangslijst', diff --git a/languages/pl_PL/lang.inc b/languages/pl_PL/lang.inc index 266990f5e..598e6f979 100644 --- a/languages/pl_PL/lang.inc +++ b/languages/pl_PL/lang.inc @@ -694,6 +694,7 @@ URL: [url]', 'individuals' => 'Indywidualni', 'individuals_in_groups' => 'Członkowie grupy', 'info_recipients_tab_not_released' => 'Potwierdzenie odbioru dla tej wersji dokumentu nie jest możliwe, ponieważ wersja nie została wydana.', +'info_rm_user_from_processes_user' => '', 'inherited' => 'dziedziczony', 'inherits_access_copy_msg' => 'Kopiuj odziedziczoną listę dostępu', 'inherits_access_empty_msg' => 'Rozpocznij z pustą listą dostępu', diff --git a/languages/pt_BR/lang.inc b/languages/pt_BR/lang.inc index c371fbd03..a03ab870e 100644 --- a/languages/pt_BR/lang.inc +++ b/languages/pt_BR/lang.inc @@ -19,7 +19,7 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // -// Translators: Admin (1847), flaviove (627), lfcristofoli (352) +// Translators: Admin (1850), flaviove (627), lfcristofoli (352) $text = array( '2_factor_auth' => 'Autenticação de dois fatores', @@ -725,6 +725,7 @@ URL: [url]', 'individuals' => 'Indivíduos', 'individuals_in_groups' => 'Members of a group', 'info_recipients_tab_not_released' => 'Confirmação de recebimento para esta versão do documento não é possível, porque a versão não é liberada.', +'info_rm_user_from_processes_user' => '', 'inherited' => 'herdado', 'inherits_access_copy_msg' => 'Copiar lista de acesso herdada', 'inherits_access_empty_msg' => 'Inicie com a lista de acesso vazia', @@ -1161,7 +1162,7 @@ URL: [url]', 'review_update_failed' => 'Erro ao atualizar o status da revisão. Atualização falhou.', 'revise_document' => 'Revisar documento', 'revise_document_on' => 'Próxima revisão da versão do documento em [date]', -'revision' => '', +'revision' => 'Revisão', 'revisions_accepted' => '[no_revisions] revisões já aceitas', 'revisions_accepted_latest' => 'revisões aceitas mais recentes', 'revisions_not_touched' => '[no_revisions] revisões não sendo tocadas', @@ -1807,7 +1808,7 @@ Nome: [username] 'status_approval_rejected' => 'Rascunho rejeitado', 'status_approved' => 'Aprovado', 'status_approver_removed' => 'Aprovador removido do processo', -'status_change' => '', +'status_change' => 'Mudança de status', 'status_needs_correction' => 'Precisa de correção', 'status_not_approved' => 'Não aprovado', 'status_not_receipted' => 'Ainda não recebido', @@ -2004,7 +2005,7 @@ URL: [url]', 'version_info' => 'Informações da versão', 'view' => 'Visualizar', 'view_document' => 'Ver detalhes do documento', -'view_folder' => '', +'view_folder' => 'Ver detalhes da pasta', 'view_online' => 'Ver online', 'warning' => 'Aviso', 'webauthn_auth' => '', diff --git a/languages/ro_RO/lang.inc b/languages/ro_RO/lang.inc index 7fd0d689b..303a97f25 100644 --- a/languages/ro_RO/lang.inc +++ b/languages/ro_RO/lang.inc @@ -706,6 +706,7 @@ URL: [url]', 'individuals' => 'Individuals', 'individuals_in_groups' => '', 'info_recipients_tab_not_released' => '', +'info_rm_user_from_processes_user' => '', 'inherited' => 'moștenit', 'inherits_access_copy_msg' => 'Copie lista de acces moștenită', 'inherits_access_empty_msg' => 'Începeți cu lista de acces goală', diff --git a/languages/ru_RU/lang.inc b/languages/ru_RU/lang.inc index d6a09310f..d1632dd99 100644 --- a/languages/ru_RU/lang.inc +++ b/languages/ru_RU/lang.inc @@ -706,6 +706,7 @@ URL: [url]', 'individuals' => 'Пользователи', 'individuals_in_groups' => 'Пользователи группы', 'info_recipients_tab_not_released' => '', +'info_rm_user_from_processes_user' => '', 'inherited' => 'унаследованный', 'inherits_access_copy_msg' => 'Скопировать наследованный список', 'inherits_access_empty_msg' => 'Начать с пустого списка доступа', diff --git a/languages/sk_SK/lang.inc b/languages/sk_SK/lang.inc index 16ed9836a..2453099c3 100644 --- a/languages/sk_SK/lang.inc +++ b/languages/sk_SK/lang.inc @@ -725,6 +725,7 @@ URL: [url]', 'individuals' => 'Jednotlivci', 'individuals_in_groups' => 'Členovia skupiny', 'info_recipients_tab_not_released' => 'Acknowledgement of reception for this document version is not possible, because the version is not released.', +'info_rm_user_from_processes_user' => '', 'inherited' => 'zdedené', 'inherits_access_copy_msg' => 'Skopírovať zdedený zoznam riadenia prístupu', 'inherits_access_empty_msg' => 'Založiť nový zoznam riadenia prístupu', diff --git a/languages/sv_SE/lang.inc b/languages/sv_SE/lang.inc index 50b4ff66d..4bcf3f192 100644 --- a/languages/sv_SE/lang.inc +++ b/languages/sv_SE/lang.inc @@ -712,6 +712,7 @@ URL: [url]', 'individuals' => 'Personer', 'individuals_in_groups' => 'Medlemmar i en grupp', 'info_recipients_tab_not_released' => '', +'info_rm_user_from_processes_user' => '', 'inherited' => 'ärvd', 'inherits_access_copy_msg' => 'Kopiera lista för behörighetsarv', 'inherits_access_empty_msg' => 'Börja med tom behörighetslista', diff --git a/languages/tr_TR/lang.inc b/languages/tr_TR/lang.inc index 1796e6c3a..b597dd104 100644 --- a/languages/tr_TR/lang.inc +++ b/languages/tr_TR/lang.inc @@ -700,6 +700,7 @@ URL: [url]', 'individuals' => 'Bireysel', 'individuals_in_groups' => '', 'info_recipients_tab_not_released' => '', +'info_rm_user_from_processes_user' => '', 'inherited' => 'devralındı', 'inherits_access_copy_msg' => 'Devralınan erişim listesini kopyala', 'inherits_access_empty_msg' => 'Boş erişim listesiyle başla', diff --git a/languages/uk_UA/lang.inc b/languages/uk_UA/lang.inc index 88f84ab73..27113fab7 100644 --- a/languages/uk_UA/lang.inc +++ b/languages/uk_UA/lang.inc @@ -19,7 +19,7 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // -// Translators: Admin (1340) +// Translators: Admin (1342) $text = array( '2_factor_auth' => '', @@ -337,7 +337,7 @@ URL: [url]', 'daily' => 'Щоденно', 'databasesearch' => 'Пошук по БД', 'database_schema_version' => '', -'data_loading' => '', +'data_loading' => 'Зачекайте, дані завантажуються...', 'date' => 'Дата', 'days' => 'дні', 'debug' => '', @@ -706,6 +706,7 @@ URL: [url]', 'individuals' => 'Користувачі', 'individuals_in_groups' => 'Користувачі групи', 'info_recipients_tab_not_released' => '', +'info_rm_user_from_processes_user' => '', 'inherited' => 'успадкований', 'inherits_access_copy_msg' => 'Скопіювати успадкований список', 'inherits_access_empty_msg' => 'Почати з порожнього списку доступу', @@ -1863,7 +1864,7 @@ URL: [url]', 'total' => '', 'to_before_from' => 'Кінцева дата не може бути меншою початкової дати', 'transfer_content' => '', -'transfer_document' => '', +'transfer_document' => 'Передача документа', 'transfer_no_read_access' => '', 'transfer_no_users' => '', 'transfer_no_write_access' => '', diff --git a/languages/zh_CN/lang.inc b/languages/zh_CN/lang.inc index 2c35a8e06..d58972259 100644 --- a/languages/zh_CN/lang.inc +++ b/languages/zh_CN/lang.inc @@ -696,6 +696,7 @@ URL: [url]', 'individuals' => '个人', 'individuals_in_groups' => '组成员', 'info_recipients_tab_not_released' => '', +'info_rm_user_from_processes_user' => '', 'inherited' => '继承', 'inherits_access_copy_msg' => '复制继承访问权限列表', 'inherits_access_empty_msg' => '从访问权限空列表开始', diff --git a/languages/zh_TW/lang.inc b/languages/zh_TW/lang.inc index 388cc43cd..adb741fe0 100644 --- a/languages/zh_TW/lang.inc +++ b/languages/zh_TW/lang.inc @@ -725,6 +725,7 @@ URL: [url]', 'individuals' => '個人', 'individuals_in_groups' => '小組成員', 'info_recipients_tab_not_released' => '由於未發布該文檔版本,因此無法確認接收。', +'info_rm_user_from_processes_user' => '', 'inherited' => '繼承', 'inherits_access_copy_msg' => '複製繼承存取權限列表', 'inherits_access_empty_msg' => '從存取權限空列表開始', From db63f8526c41a9aa67cbd269e73aedd27e272c3d Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Sun, 2 May 2021 13:05:48 +0200 Subject: [PATCH 082/403] set footer height and body margin on smaller devices --- views/bootstrap4/styles/styles.css | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/views/bootstrap4/styles/styles.css b/views/bootstrap4/styles/styles.css index 9925c6347..205e5ca36 100644 --- a/views/bootstrap4/styles/styles.css +++ b/views/bootstrap4/styles/styles.css @@ -31,6 +31,12 @@ body { /* Margin bottom by footer height */ margin-bottom: 60px; } +@media (max-width: 991px) { + body { + /* Margin bottom by footer height */ + margin-bottom: 90px; + } +} .footer { font-size: 80%; position: absolute; @@ -41,6 +47,11 @@ body { _line-height: 17px; /* Vertically center the text there */ background-color: #f5f5f5; } +@media (max-width: 991px) { + .footer { + height: 108px; + } +} .footer .disclaimer { display: inline-block; padding: 15px 0px 0px 0px; From cc09cd419c2ed31ef7aa76179b1d6ab4d8644848 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Sun, 2 May 2021 14:41:03 +0200 Subject: [PATCH 083/403] fix margin of body and height of footer for small devices --- views/bootstrap4/styles/styles.css | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/views/bootstrap4/styles/styles.css b/views/bootstrap4/styles/styles.css index 205e5ca36..12f0dfaa7 100644 --- a/views/bootstrap4/styles/styles.css +++ b/views/bootstrap4/styles/styles.css @@ -37,6 +37,12 @@ body { margin-bottom: 90px; } } +@media (max-width: 767px) { + body { + /* Margin bottom by footer height */ + margin-bottom: 110px; + } +} .footer { font-size: 80%; position: absolute; @@ -52,6 +58,11 @@ body { height: 108px; } } +@media (max-width: 767px) { + .footer { + height: 126px; + } +} .footer .disclaimer { display: inline-block; padding: 15px 0px 0px 0px; From 25a7a571123d73575df47387095813d93198b16e Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Mon, 3 May 2021 08:04:54 +0200 Subject: [PATCH 084/403] make tables smaller (no column for status anymore) --- views/bootstrap/class.ViewDocument.php | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/views/bootstrap/class.ViewDocument.php b/views/bootstrap/class.ViewDocument.php index 479f68198..49d53e674 100644 --- a/views/bootstrap/class.ViewDocument.php +++ b/views/bootstrap/class.ViewDocument.php @@ -606,7 +606,6 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Theme_Style { print "\n"; // print "\n"; // print "\n"; - print "\n"; print "\n"; print "\n"; print "\n"; @@ -643,7 +642,13 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Theme_Style { print "
    • ".getMLText("uploaded_by")." getEmail())."\">".htmlspecialchars($updatingUser->getFullName())."
    • "; print "
    • ".getLongReadableDate($latestContent->getDate())."
    • "; + print "
    • ".getMLText('status').": ".getOverallStatusText($status["status"]); + if ( $status["status"]==S_DRAFT_REV || $status["status"]==S_DRAFT_APP || $status["status"]==S_IN_WORKFLOW || $status["status"]==S_EXPIRED ){ + print "
      hasExpired()?" class=\"warning\" ":"").">".(!$document->getExpires() ? getMLText("does_not_expire") : getMLText("expires").": ".getReadableDate($document->getExpires())).""; + } + print "
    • "; print "\n"; + $txt = $this->callHook('showVersionComment', $latestContent); if($txt) { echo $txt; @@ -655,13 +660,6 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Theme_Style { $this->printVersionAttributes($folder, $latestContent); print "\n"; - print ""; - print "\n"; print "\n"; print "\n"; } if ($print_header) printMLText("empty_list"); - else print "
      ".getMLText('chart_'.$type.'_title')."".getMLText('total')."".htmlspecialchars($latestContent->getOriginalFileName())."".getMLText("file")."".getMLText("comment")."".getMLText("status")."
      "; - print getOverallStatusText($status["status"]); - if ( $status["status"]==S_DRAFT_REV || $status["status"]==S_DRAFT_APP || $status["status"]==S_IN_WORKFLOW || $status["status"]==S_EXPIRED ){ - print "
      hasExpired()?" class=\"warning\" ":"").">".(!$document->getExpires() ? getMLText("does_not_expire") : getMLText("expires").": ".getReadableDate($document->getExpires())).""; - } - print "
      "; if ($file_exists){ @@ -740,14 +738,14 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Theme_Style { $this->contentContainerStart(); $statuslog = $latestContent->getStatusLog(); echo ""; - echo "\n"; + echo "\n"; echo ""; foreach($statuslog as $entry) { if($suser = $dms->getUser($entry['userID'])) $fullname = htmlspecialchars($suser->getFullName()); else $fullname = "--"; - echo "\n"; + echo "\n"; } print "\n
      ".getMLText('date')."".getMLText('status')."".getMLText('user')."".getMLText('comment')."
      ".getMLText('date')."/".getMLText('user')."".getMLText('status')."".getMLText('comment')."
      ".getLongReadableDate($entry['date'])."".getOverallStatusText($entry['status'])."".$fullname."".htmlspecialchars($entry['comment'])."
      ".getLongReadableDate($entry['date'])."
      ".$fullname."
      ".getOverallStatusText($entry['status'])."".htmlspecialchars($entry['comment'])."
      \n"; $this->contentContainerEnd(); @@ -1242,7 +1240,6 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Theme_Style { print ""; print "\n\n"; print "\n"; - print "\n"; print "\n"; print "\n\n\n"; @@ -1274,7 +1271,7 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Theme_Style { print "\n"; } print "\n"; - print "\n"; // print ""; - print ""; print ""; + echo ""; else - echo ""; + echo ""; } else { - echo ""; + echo ""; } echo ""; From a8dfcd95284d6c229ee44fe0997ddecfb64e5649 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Mon, 3 May 2021 17:49:15 +0200 Subject: [PATCH 093/403] showNavigationBar() checks if 'link' is set --- views/bootstrap4/class.Bootstrap4.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/bootstrap4/class.Bootstrap4.php b/views/bootstrap4/class.Bootstrap4.php index a450225ad..8412d7d59 100644 --- a/views/bootstrap4/class.Bootstrap4.php +++ b/views/bootstrap4/class.Bootstrap4.php @@ -560,7 +560,7 @@ background-image: linear-gradient(to bottom, #882222, #111111);; $content .= "
      \n"; } else { $content .= "
    • \n"; - $content .= " Date: Tue, 4 May 2021 09:03:10 +0200 Subject: [PATCH 094/403] typeahead search for folders can search in subfolders --- CHANGELOG | 1 + op/op.Ajax.php | 31 +++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index 5fe6ba2d8..788252e05 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -8,6 +8,7 @@ - fixed error due to multiple declared function when controller method RemoveFolder::run was called more than once - fix php error setting mandatory workflow when uploading documents via webdav +- typeahead search for folders can search in subfolders -------------------------------------------------------------------------------- Changes in version 5.1.22 diff --git a/op/op.Ajax.php b/op/op.Ajax.php index 1cc4188aa..f9b4ce487 100644 --- a/op/op.Ajax.php +++ b/op/op.Ajax.php @@ -145,6 +145,37 @@ switch($command) { if($user) { $query = $_GET['query']; + if(false !== ($pos = strpos($query, '/'))) { + $subquery = substr($query, 0, $pos); + $hits = $dms->search($subquery, $limit=0, $offset=0, $logicalmode='AND', $searchin=array(), $startFolder=$dms->getRootFolder(), $owner=null, $status = array(), $creationstartdate=array(), $creationenddate=array(), $modificationstartdate=array(), $modificationenddate=array(), $categories=array(), $attributes=array(), $mode=0x2, $expirationstartdate=array(), $expirationenddate=array()); + if($hits) { + if(count($hits['folders']) == 1) { + $hit = $hits['folders'][0]; + $basefolder = $dms->getFolder($hit->getID()); + if($subquery = substr($query, $pos+1)) { + $hits = $dms->search($subquery, $limit=0, $offset=0, $logicalmode='AND', $searchin=array(), $startFolder=$basefolder, $owner=null, $status = array(), $creationstartdate=array(), $creationenddate=array(), $modificationstartdate=array(), $modificationenddate=array(), $categories=array(), $attributes=array(), $mode=0x2, $expirationstartdate=array(), $expirationenddate=array()); + if($hits) { + $result = array(); + foreach($hits['folders'] as $hit) { + $result[] = $hit->getID().'#'.$basefolder->getName().'/'.$hit->getName(); + } + header('Content-Type: application/json'); + echo json_encode($result); + return; + } + } else { + $subfolders = $basefolder->getSubFolders(); + $result = array(); + foreach($subfolders as $subfolder) { + $result[] = $subfolder->getID().'#'.$basefolder->getName().'/'.$subfolder->getName(); + } + header('Content-Type: application/json'); + echo json_encode($result); + return; + } + } + } + } $hits = $dms->search($query, $limit=0, $offset=0, $logicalmode='AND', $searchin=array(), $startFolder=$dms->getRootFolder(), $owner=null, $status = array(), $creationstartdate=array(), $creationenddate=array(), $modificationstartdate=array(), $modificationenddate=array(), $categories=array(), $attributes=array(), $mode=0x2, $expirationstartdate=array(), $expirationenddate=array()); if($hits) { $result = array(); From 196b19d42a3e7c802b50ea94ded2873c477cb062 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 4 May 2021 09:56:56 +0200 Subject: [PATCH 095/403] enlarge margin bottom on smaller devices --- views/bootstrap4/styles/styles.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/views/bootstrap4/styles/styles.css b/views/bootstrap4/styles/styles.css index 12f0dfaa7..1ba3a5223 100644 --- a/views/bootstrap4/styles/styles.css +++ b/views/bootstrap4/styles/styles.css @@ -34,13 +34,13 @@ body { @media (max-width: 991px) { body { /* Margin bottom by footer height */ - margin-bottom: 90px; + margin-bottom: 110px; } } @media (max-width: 767px) { body { /* Margin bottom by footer height */ - margin-bottom: 110px; + margin-bottom: 130px; } } .footer { From b4b0258fbd90753c7f80e89f45d6fc1904dd7767 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 4 May 2021 09:57:23 +0200 Subject: [PATCH 096/403] use nav-pills instead of nav-tabs, set attribute role --- views/bootstrap/class.EditOnline.php | 10 ++++----- views/bootstrap/class.ExtensionMgr.php | 10 ++++----- views/bootstrap/class.LogManagement.php | 10 ++++----- views/bootstrap/class.Settings.php | 6 ++--- views/bootstrap/class.ViewDocument.php | 30 ++++++++++++------------- 5 files changed, 33 insertions(+), 33 deletions(-) diff --git a/views/bootstrap/class.EditOnline.php b/views/bootstrap/class.EditOnline.php index 5b2fe136b..effa3e0da 100644 --- a/views/bootstrap/class.EditOnline.php +++ b/views/bootstrap/class.EditOnline.php @@ -96,18 +96,18 @@ $(document).ready(function() { $document = $this->params['document']; $version = $this->params['version']; ?> -
    • \n\n"; diff --git a/views/bootstrap/class.LogManagement.php b/views/bootstrap/class.LogManagement.php index 5e8bf7ac7..86ff77c87 100644 --- a/views/bootstrap/class.LogManagement.php +++ b/views/bootstrap/class.LogManagement.php @@ -120,19 +120,19 @@ $(document).ready( function() { $wentries = array_reverse($wentries); } ?> -
      ".getMLText("status")."
        \n"; + print "
        \n"; print "
      • ".htmlspecialchars($version->getOriginalFileName())."
      • \n"; print "
      • ".getMLText('version').": ".$version->getVersion()."
      • \n"; if ($file_exists) print "
      • ". SeedDMS_Core_File::format_filesize($version->getFileSize()) .", ".htmlspecialchars($version->getMimeType())."
      • "; @@ -1282,6 +1279,7 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Theme_Style { $updatingUser = $version->getUser(); print "
      • ".getMLText("uploaded_by")." getEmail())."\">".htmlspecialchars($updatingUser->getFullName())."
      • "; print "
      • ".getLongReadableDate($version->getDate())."
      • "; + print "
      • ".getMLText('status').": ".getOverallStatusText($vstat["status"])."
      • "; print "
      \n"; $txt = $this->callHook('showVersionComment', $version); if($txt) { @@ -1294,7 +1292,6 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Theme_Style { $this->printVersionAttributes($folder, $version); print "
      ".htmlspecialchars($version->getComment())."".getOverallStatusText($vstat["status"]).""; if ($file_exists){ print "
        "; From 85992322d7e6c525cb5a45a584143aec4c1224e8 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Mon, 3 May 2021 08:05:39 +0200 Subject: [PATCH 085/403] set padding-left of ul.actions to 0 --- views/bootstrap4/styles/application.css | 1 + 1 file changed, 1 insertion(+) diff --git a/views/bootstrap4/styles/application.css b/views/bootstrap4/styles/application.css index 40a55a08c..d025f17ef 100644 --- a/views/bootstrap4/styles/application.css +++ b/views/bootstrap4/styles/application.css @@ -69,6 +69,7 @@ span.list-details { ul.actions { list-style: none; + padding-left: 0px; } ul.actions li a:hover > i { text-decoration: none; From f95c9d67953c455b38bb1503ae632ecc734380a6 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Mon, 3 May 2021 09:01:33 +0200 Subject: [PATCH 086/403] do not include bootbox.min.js, make currenttab active if none is selected --- views/bootstrap4/class.Bootstrap4.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/bootstrap4/class.Bootstrap4.php b/views/bootstrap4/class.Bootstrap4.php index 0db7730bf..a450225ad 100644 --- a/views/bootstrap4/class.Bootstrap4.php +++ b/views/bootstrap4/class.Bootstrap4.php @@ -117,7 +117,7 @@ class SeedDMS_Theme_Style extends SeedDMS_View_Common { echo ''."\n"; echo ''."\n"; echo ''."\n"; - echo ''."\n"; + echo ''."\n"; if(!empty($this->extraheader['favicon'])) echo $this->extraheader['favicon']; else { From b10c3bf9afa6181f60f6272a9ae2ba8b970736fa Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Mon, 3 May 2021 09:02:32 +0200 Subject: [PATCH 087/403] do not include bootbox.min.js, make docinfo tab active if none is selected --- views/bootstrap/class.ViewDocument.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/views/bootstrap/class.ViewDocument.php b/views/bootstrap/class.ViewDocument.php index 49d53e674..a2312ebe2 100644 --- a/views/bootstrap/class.ViewDocument.php +++ b/views/bootstrap/class.ViewDocument.php @@ -470,7 +470,7 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Theme_Style { if($versions === null) $versions = $document->getContent(); - $this->htmlAddHeader(''."\n", 'js'); +// $this->htmlAddHeader(''."\n", 'js'); $this->htmlAddHeader(''."\n", 'css'); $this->htmlAddHeader(''."\n", 'js'); $this->htmlAddHeader(''."\n", 'js'); @@ -545,7 +545,7 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Theme_Style { echo $txt; ?>
      "; if($extconf['icon']) @@ -310,9 +310,9 @@ class SeedDMS_View_ExtensionMgr extends SeedDMS_Theme_Style { echo ""; echo "".($re['icon-data'] ? ''.$re['name'].'' : '')."
      '; echo ''; @@ -265,7 +265,7 @@ if(!is_writeable($settings->_configFilePath)) { } ?> -
      \n"; + echo "
      \n"; print "\n\n"; print "\n"; print "\n"; print "\n"; - print "\n"; print "\n"; print "\n"; $list = $extmgr->getExtensionListByName($extname); @@ -124,11 +123,11 @@ class SeedDMS_View_ExtensionMgr extends SeedDMS_Theme_Style { echo ">"; echo ""; echo ""; echo ""; - echo ""; echo "
      ".getMLText('name')."".getMLText('version')."".getMLText('author')."
      ".($re['icon-data'] ? ''.$re['name'].'' : '')."".$re['title']."
      ".$re['description'].""; + echo "
      ".getMLText('author').": ".$re['author']['name'].", ".$re['author']['company'].""; if($checkmsgs) echo "
      getImgPath("attention.gif")."\"> ".implode('
      ', $checkmsgs)."
      "; echo "
      ".$re['version']."
      ".$re['releasedate']."
      ".$re['author']['name']."
      ".$re['author']['company']."
      "; echo "
      "; if(!$checkmsgs && $extmgr->isWritableExtDir()) @@ -178,12 +177,11 @@ class SeedDMS_View_ExtensionMgr extends SeedDMS_Theme_Style { $extdir = $this->params['extdir']; $extconf = $extmgr->getExtensionConfiguration(); - echo "\n"; + echo "
      \n"; print "\n\n"; print "\n"; print "\n"; print "\n"; - print "\n"; print "\n"; print "\n"; $errmsgs = array(); @@ -206,17 +204,17 @@ class SeedDMS_View_ExtensionMgr extends SeedDMS_Theme_Style { echo ""; echo ""; echo ""; - echo ""; echo ""; - print "
      ".getMLText('name')."".getMLText('version')."".getMLText('author')."
      ".$extconf['title']; echo "
      ".$extconf['description'].""; + echo "
      ".getMLText('author').": ".$extconf['author']['name'].", ".$extconf['author']['company'].""; if($errmsgs) echo "
      getImgPath("attention.gif")."\"> ".implode('
      ', $errmsgs)."
      "; echo "
      ".$extconf['version']; echo "
      ".$extconf['releasedate'].""; echo "
      ".$extconf['author']['name']."
      ".$extconf['author']['company']."
      "; echo "
      "; if(!empty($extconf['changelog']) && file_exists($extdir."/".$extname."/".$extconf['changelog'])) { - echo "\n"; + echo $this->getModalBoxLink(array('target'=>'extensionChangelog', 'remote'=>'out.ExtensionMgr.php?action=changelog&extensionname='.$extname, 'class'=>'', 'title'=>'')); } if($extconf['config']) echo ""; @@ -292,12 +290,11 @@ class SeedDMS_View_ExtensionMgr extends SeedDMS_Theme_Style {
      \n"; + echo "\n"; print "\n\n"; print "\n"; print "\n"; print "\n"; - print "\n"; print "\n"; print "\n"; $list = $extmgr->getExtensionList(); @@ -318,15 +315,15 @@ class SeedDMS_View_ExtensionMgr extends SeedDMS_Theme_Style { echo ""; echo ""; echo ""; - echo ""; echo "
      ".getMLText('name')."".getMLText('version')."".getMLText('author')."
      ".($re['icon-data'] ? ''.$re['name'].'' : '')."".$re['title']; echo "
      ".$re['description'].""; + echo "
      ".getMLText('author').": ".$re['author']['name'].", ".$re['author']['company'].""; if($checkmsgs) echo "
      getImgPath("attention.gif")."\"> ".implode('
      ', $checkmsgs)."
      "; echo "
      ".$re['version']."
      ".$re['releasedate']."
      ".$re['author']['name']."
      ".$re['author']['company']."
      "; echo "
      "; - echo "\n"; - echo "\n"; + echo $this->getModalBoxLink(array('target'=>'extensionInfo', 'remote'=>'out.ExtensionMgr.php?action=info_versions&extensionname='.$re['name'], 'class'=>'', 'title'=>'')); + echo $this->getModalBoxLink(array('target'=>'extensionChangelog', 'remote'=>'out.ExtensionMgr.php?action=info_changelog&extensionname='.$re['name'], 'class'=>'', 'title'=>'')); if(!$checkmsgs && $extmgr->isWritableExtDir()) echo "
      ".createHiddenFieldWithKey('extensionmgr')."
      "; echo "
      "; @@ -349,33 +346,8 @@ class SeedDMS_View_ExtensionMgr extends SeedDMS_Theme_Style { columnEnd(); $this->rowEnd(); -?> - - - -getModalBox(array('id'=>'extensionInfo', 'title'=>getMLText('extension_version_list'), 'content'=>'

      '.getMLText('extension_loading').'

      ', 'buttons'=>array(array('title'=>getMLText('close'))))); + echo $this->getModalBox(array('id'=>'extensionChangelog', 'title'=>getMLText('extension_changelog'), 'content'=>'

      '.getMLText('changelog_loading').'

      ', 'buttons'=>array(array('title'=>getMLText('close'))))); $this->contentEnd(); $this->htmlEndPage(); } /* }}} */ From a3caa4a0c1184f180fd566a341e451096dcaa2ed Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 4 May 2021 12:09:20 +0200 Subject: [PATCH 100/403] use getModalBox() and getModalBoxLink() --- views/bootstrap/class.LogManagement.php | 38 +++++++++---------------- 1 file changed, 13 insertions(+), 25 deletions(-) diff --git a/views/bootstrap/class.LogManagement.php b/views/bootstrap/class.LogManagement.php index 86ff77c87..c09b43dd0 100644 --- a/views/bootstrap/class.LogManagement.php +++ b/views/bootstrap/class.LogManagement.php @@ -37,7 +37,7 @@ class SeedDMS_View_LogManagement extends SeedDMS_Theme_Style { if ($print_header){ print "
      \n"; - print "\n"; + print "
      \n"; print "\n\n"; print "\n"; print "\n"; @@ -56,17 +56,17 @@ class SeedDMS_View_LogManagement extends SeedDMS_Theme_Style { print "\n"; print "\n"; print "\n"; } if ($print_header) printMLText("empty_list"); - else print "
      ".getMLText("name")."".SeedDMS_Core_File::format_filesize(filesize($this->logdir.$entry)).""; - print " ".getMLText("rm_file").""; + print "".getMLText("rm_file").""; print " "; - print " ".getMLText("download").""; + print " ".getMLText("download").""; print " "; - print " ".getMLText('view')." …"; + echo $this->getModalBoxLink(array('target'=>'logViewer', 'remote'=>'out.LogManagement.php?logname='.$entry, 'class'=>'btn btn-primary btn-mini btn-sm', 'title'=>' '.getMLText('view').'')); print "
      \n"; + else print "
      \n"; } /* }}} */ function js() { /* {{{ */ @@ -121,34 +121,22 @@ $(document).ready( function() { } ?>
      -
      contentContainerStart(); + $this->showStartPaneContent('web', (!$mode || $mode == 'web')); $this->filelist($entries, 'web'); - $this->contentContainerEnd(); -?> -
      -
      -contentContainerStart(); + $this->showEndPaneContent('web', $mode); + + $this->showStartPaneContent('webdav', (!$mode || $mode == 'webdav')); $this->filelist($wentries, 'webdav'); - $this->contentContainerEnd(); + $this->showEndPaneContent('webdav', $mode); ?> -
      - getModalBox(array('id'=>'logViewer', 'title'=>getMLText('logfile'), 'buttons'=>array(array('title'=>getMLText('close'))))); $this->contentEnd(); $this->htmlEndPage(); } elseif(file_exists($this->logdir.$logname)){ From 23b1ab9e06c49273d3f86494a407958d57ab0099 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 4 May 2021 12:09:44 +0200 Subject: [PATCH 101/403] use pane function from parent class --- views/bootstrap/class.Settings.php | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/views/bootstrap/class.Settings.php b/views/bootstrap/class.Settings.php index e4faa9921..f6be1d89f 100644 --- a/views/bootstrap/class.Settings.php +++ b/views/bootstrap/class.Settings.php @@ -31,12 +31,8 @@ */ class SeedDMS_View_Settings extends SeedDMS_Theme_Style { - protected function showPaneHeader($name, $title, $isactive) { /* {{{ */ - echo ''."\n"; - } /* }}} */ - protected function showStartPaneContent($name, $isactive) { /* {{{ */ - echo '
      '; + self::parent($name, $isactive); $this->contentContainerStart(); echo ''; echo ''; @@ -45,7 +41,7 @@ class SeedDMS_View_Settings extends SeedDMS_Theme_Style { protected function showEndPaneContent($name, $currentab) { /* {{{ */ echo '
      '; $this->contentContainerEnd(); - echo '
      '; + self::parent($name, $isactive); } /* }}} */ protected function getTextField($name, $value, $type='', $placeholder='') { /* {{{ */ From 07affc574b4942df989c6ef963f8b02366f5bb5f Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 4 May 2021 13:16:01 +0200 Subject: [PATCH 102/403] fix layout, show icon on buttons only on small devices --- views/bootstrap/class.GroupMgr.php | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/views/bootstrap/class.GroupMgr.php b/views/bootstrap/class.GroupMgr.php index 539ad3e2f..e9a4946b1 100644 --- a/views/bootstrap/class.GroupMgr.php +++ b/views/bootstrap/class.GroupMgr.php @@ -187,6 +187,7 @@ $(document).ready( function() { contentContainerStart(); $this->formField( getMLText("name"), array( @@ -207,14 +208,15 @@ $(document).ready( function() { 'value'=>($group ? htmlspecialchars($group->getComment()) : '') ) ); + $this->contentContainerEnd(); $this->formSubmit(" ".getMLText('save')); ?> contentSubHeading(getMLText("group_members")); + $this->contentHeading(getMLText("group_members")); ?> - +
      getUsers(); if (count($members) == 0) @@ -228,9 +230,9 @@ $(document).ready( function() { print ""; print ""; print ""; } } @@ -238,7 +240,7 @@ $(document).ready( function() {
      " . htmlspecialchars($member->getFullName()) . "" . ($group->isMember($member,true)?getMLText("manager"):" ") . ""; - print "
      getID()."\" />getID()."\" />".createHiddenFieldWithKey('rmmember')."
      "; + print "
      getID()."\" />getID()."\" />".createHiddenFieldWithKey('rmmember')."
      "; print " "; - print "
      getID()."\" />getID()."\" />".createHiddenFieldWithKey('tmanager')."
      "; + print "
      getID()."\" />getID()."\" />".createHiddenFieldWithKey('tmanager')."
      "; print "
      contentSubHeading(getMLText("add_member")); + $this->contentHeading(getMLText("add_member")); ?>
      @@ -246,6 +248,7 @@ $(document).ready( function() { contentContainerStart(); $options = array(); $allUsers = $dms->getAllUsers($sortusersinlist); foreach ($allUsers as $currUser) { @@ -271,6 +274,7 @@ $(document).ready( function() { 'value'=>1 ) ); + $this->contentContainerEnd(); $this->formSubmit(" ".getMLText('add')); ?>
      @@ -326,11 +330,9 @@ $(document).ready( function() { columnEnd(); $this->columnStart(8); - $this->contentContainerStart(); ?>
      getID()."\"" : "") ?>>
      contentContainerEnd(); $this->columnEnd(); $this->rowEnd(); $this->contentEnd(); From 4cb9ed294ef136e98b13eab5e4b1d46d0930dc5b Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 4 May 2021 13:16:35 +0200 Subject: [PATCH 103/403] place submit button outside of contentContainer --- views/bootstrap/class.UsrMgr.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/views/bootstrap/class.UsrMgr.php b/views/bootstrap/class.UsrMgr.php index 3cb9763b7..4cf8b1ad4 100644 --- a/views/bootstrap/class.UsrMgr.php +++ b/views/bootstrap/class.UsrMgr.php @@ -227,6 +227,7 @@ $(document).ready( function() { contentContainerStart(); $this->formField( getMLText("user_login"), array( @@ -501,6 +502,7 @@ $(document).ready( function() { ); } } + $this->contentContainerEnd(); $this->formSubmit(" ".getMLText($currUser ? "save" : "add_user")); ?> @@ -555,12 +557,10 @@ $(document).ready( function() { columnEnd(); $this->columnStart(4); - $this->contentContainerStart(); ?>
      getID()."\"" : "") ?>>
      contentContainerEnd(); $this->columnEnd(); $this->rowEnd(); $this->contentEnd(); From d3958e73f94bf98bbf3d2d984cf35430860a1977 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 4 May 2021 13:17:07 +0200 Subject: [PATCH 104/403] add border botton to contentHeading --- views/bootstrap4/class.Bootstrap4.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/views/bootstrap4/class.Bootstrap4.php b/views/bootstrap4/class.Bootstrap4.php index dfd1a4918..16bfaa4ee 100644 --- a/views/bootstrap4/class.Bootstrap4.php +++ b/views/bootstrap4/class.Bootstrap4.php @@ -1005,9 +1005,9 @@ background-image: linear-gradient(to bottom, #882222, #111111);; function contentHeading($heading, $noescape=false) { /* {{{ */ if($noescape) - echo "".$heading."\n"; + echo "".$heading."\n"; else - echo "".htmlspecialchars($heading)."\n"; + echo "".htmlspecialchars($heading)."\n"; return; } /* }}} */ From 5fe8ab1615598734174907d9a7da15fc93e5f041 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 4 May 2021 13:40:05 +0200 Subject: [PATCH 105/403] set width of pwd strength bar to 100% --- views/bootstrap/class.UsrMgr.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/bootstrap/class.UsrMgr.php b/views/bootstrap/class.UsrMgr.php index 4cf8b1ad4..67d1193ca 100644 --- a/views/bootstrap/class.UsrMgr.php +++ b/views/bootstrap/class.UsrMgr.php @@ -245,7 +245,7 @@ $(document).ready( function() { if($passwordstrength > 0) { $this->formField( getMLText("password_strength"), - '
      ' + '
      ' ); } $this->formField( From 1c6c36eb52fc1c764f99652f37166deaf7468e58 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 4 May 2021 13:40:49 +0200 Subject: [PATCH 106/403] fix update of pwd strength bar --- views/bootstrap4/styles/application.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/views/bootstrap4/styles/application.js b/views/bootstrap4/styles/application.js index a94495658..4f129e2a3 100644 --- a/views/bootstrap4/styles/application.js +++ b/views/bootstrap4/styles/application.js @@ -521,11 +521,11 @@ $(document).ready( function() { pwsp = 100*data.score; $('#'+target+' div.bar').width(pwsp+'%'); if(data.ok) { - $('#'+target+' div.bar').removeClass('bar-danger'); - $('#'+target+' div.bar').addClass('bar-success'); + $('#'+target+' div.bar').removeClass('bg-danger'); + $('#'+target+' div.bar').addClass('bg-success'); } else { - $('#'+target+' div.bar').removeClass('bar-success'); - $('#'+target+' div.bar').addClass('bar-danger'); + $('#'+target+' div.bar').removeClass('bg-success'); + $('#'+target+' div.bar').addClass('bg-danger'); } } }); /* }}} */ @@ -588,11 +588,11 @@ $(document).ready( function() { pwsp = 100*data.score; $('#'+target+' div.bar').width(pwsp+'%'); if(data.ok) { - $('#'+target+' div.bar').removeClass('bar-danger'); - $('#'+target+' div.bar').addClass('bar-success'); + $('#'+target+' div.bar').removeClass('bg-danger'); + $('#'+target+' div.bar').addClass('bg-success'); } else { - $('#'+target+' div.bar').removeClass('bar-success'); - $('#'+target+' div.bar').addClass('bar-danger'); + $('#'+target+' div.bar').removeClass('bg-success'); + $('#'+target+' div.bar').addClass('bg-danger'); } } }); /* }}} */ @@ -804,7 +804,7 @@ function onAddClipboard(ev) { /* {{{ */ this.statusbar = $("
      "); this.filename = $("
      ").appendTo(this.statusbar); this.size = $("
      ").appendTo(this.statusbar); - this.progressBar = $("
      ").appendTo(this.statusbar); + this.progressBar = $("
      ").appendTo(this.statusbar); this.abort = $("
      " + abortBtnLabel + "
      ").appendTo(this.statusbar); // $('.statusbar').empty(); obj.after(this.statusbar); From bd73b57a63963c5121d736aa81d88be717849f6c Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 4 May 2021 15:55:10 +0200 Subject: [PATCH 107/403] move submit out of contentContainer --- views/bootstrap/class.EditComment.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/views/bootstrap/class.EditComment.php b/views/bootstrap/class.EditComment.php index 072c96820..d0a049581 100644 --- a/views/bootstrap/class.EditComment.php +++ b/views/bootstrap/class.EditComment.php @@ -82,13 +82,13 @@ $(document).ready(function() { $this->pageNavigation($this->getFolderPathHTML($folder, true, $document), "view_document", $document); $this->contentHeading(getMLText("edit_comment")); - $this->contentContainerStart(); ?>
      contentContainerStart(); $this->formField( getMLText("comment"), array( @@ -99,11 +99,11 @@ $(document).ready(function() { 'value'=>htmlspecialchars($version->getComment()) ) ); + $this->contentContainerEnd(); $this->formSubmit(" ".getMLText('save')); ?>
      contentContainerEnd(); $this->contentEnd(); $this->htmlEndPage(); } /* }}} */ From 620783d17d1aa2ec10115d804a8554a6f8d3bafe Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 4 May 2021 15:55:35 +0200 Subject: [PATCH 108/403] move submit button out of contentContainer --- views/bootstrap/class.OverrideContentStatus.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/views/bootstrap/class.OverrideContentStatus.php b/views/bootstrap/class.OverrideContentStatus.php index 887738b8f..8b8aab4d3 100644 --- a/views/bootstrap/class.OverrideContentStatus.php +++ b/views/bootstrap/class.OverrideContentStatus.php @@ -80,8 +80,6 @@ $(document).ready(function() { $this->contentHeading(getMLText("change_status")); - $this->contentContainerStart(); - // Display the Review form. ?>
      @@ -89,6 +87,7 @@ $(document).ready(function() { contentContainerStart(); $this->formField( getMLText("comment"), array( @@ -111,11 +110,11 @@ $(document).ready(function() { 'options'=>$options, ) ); + $this->contentContainerEnd(); $this->formSubmit(" ".getMLText('update')); ?>
      contentContainerEnd(); $this->contentEnd(); $this->htmlEndPage(); } /* }}} */ From 10e3ae560ce47a4047a877942e93b9472848a209 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 4 May 2021 15:56:09 +0200 Subject: [PATCH 109/403] set class of ul list for attachments --- views/bootstrap/class.ViewDocument.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/bootstrap/class.ViewDocument.php b/views/bootstrap/class.ViewDocument.php index f47dac414..ba706b170 100644 --- a/views/bootstrap/class.ViewDocument.php +++ b/views/bootstrap/class.ViewDocument.php @@ -1380,7 +1380,7 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Theme_Style { } print "
        \n"; + print "
        \n"; print "
      • ".htmlspecialchars($file->getName())."
      • \n"; if($file->getName() != $file->getOriginalFileName()) print "
      • ".htmlspecialchars($file->getOriginalFileName())."
      • \n"; From 6b0b72a0621fcd537f4bdb54304ecaeda63672b2 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 4 May 2021 15:56:43 +0200 Subject: [PATCH 110/403] move all init function into one function and call after loading html --- views/bootstrap4/styles/application.js | 128 +++++++++---------------- 1 file changed, 47 insertions(+), 81 deletions(-) diff --git a/views/bootstrap4/styles/application.js b/views/bootstrap4/styles/application.js index 4f129e2a3..38201aae2 100644 --- a/views/bootstrap4/styles/application.js +++ b/views/bootstrap4/styles/application.js @@ -47,47 +47,7 @@ function treeDocumentSelected(formid, nodeid, nodename) { $('#docChooser'+formid).modal('hide'); } -$(document).ready( function() { -// $('.dropdown-menu a.dropdown-toggle').on('click', function(e) { - $('body').on('click', '.dropdown-menu a.dropdown-toggle', function (e) { - if (!$(this).next().hasClass('show')) { - $(this).parents('.dropdown-menu').first().find('.show').removeClass("show"); - } - var $subMenu = $(this).next(".dropdown-menu"); - $subMenu.toggleClass('show'); - - - $(this).parents('li.nav-item.dropdown.show').on('hidden.bs.dropdown', function(e) { - $('.dropdown-submenu .show').removeClass("show"); - }); - - - return false; - }); - - /* close popovers when clicking somewhere except in the popover or the - * remove icon - */ - $('html').on('click', function(e) { - if (typeof $(e.target).data('original-title') == 'undefined' && !$(e.target).parents().is('.popover.in') && !$(e.target).is('.fa fa-remove')) { - $('[data-original-title]').popover('hide'); - } - }); - - $('body').on('hidden', '.modal', function () { - $(this).removeData('modal'); - }); - - /* Bootstrap 4 does not support to the remote loading of the modal content - * anymore. This adds it by using jquery. - */ - $('body').on('click', '[data-toggle="modal"]', function(ev){ - ev.preventDefault(); - $($(this).data("target")+' .modal-body').load($(this).data("remote")); - }); - -// $('body').on('touchstart.dropdown', '.dropdown-menu', function (e) { e.stopPropagation(); }); - +function initMost() { $('.datepicker, #expirationdate, #createstartdate, #createenddate, #expirationstartdate, #expirationenddate') .datepicker({todayHighlight: true, toggleActive: true, autoclose: "true"}) /* @@ -282,6 +242,50 @@ $(document).ready( function() { return ' ' + strarr[1].replace(/
        '); $.get(url, function(data) { element.html(data); - $(".chzn-select").select2({ - theme: "bootstrap4", - width: '100%', - templateResult: chzn_template_func//, - //templateSelection: chzn_template_func - }); - $(".pwd").passStrength({ /* {{{ */ - url: "../op/op.Ajax.php", - onChange: function(data, target) { - pwsp = 100*data.score; - $('#'+target+' div.bar').width(pwsp+'%'); - if(data.ok) { - $('#'+target+' div.bar').removeClass('bg-danger'); - $('#'+target+' div.bar').addClass('bg-success'); - } else { - $('#'+target+' div.bar').removeClass('bg-success'); - $('#'+target+' div.bar').addClass('bg-danger'); - } - } - }); /* }}} */ if(afterload) { var func = eval(afterload); if(typeof func === "function"){ func(); } } + initMost(); }); }); /* }}} */ @@ -576,26 +561,6 @@ $(document).ready( function() { element.prepend('
        '); $.get(url, function(data) { element.html(data); - $(".chzn-select").select2({ - theme: "bootstrap4", - width: '100%', - templateResult: chzn_template_func//, - //templateSelection: chzn_template_func - }); - $(".pwd").passStrength({ /* {{{ */ - url: "../op/op.Ajax.php", - onChange: function(data, target) { - pwsp = 100*data.score; - $('#'+target+' div.bar').width(pwsp+'%'); - if(data.ok) { - $('#'+target+' div.bar').removeClass('bg-danger'); - $('#'+target+' div.bar').addClass('bg-success'); - } else { - $('#'+target+' div.bar').removeClass('bg-success'); - $('#'+target+' div.bar').addClass('bg-danger'); - } - } - }); /* }}} */ if(callback) callback.call(); if(afterload) { @@ -604,6 +569,7 @@ $(document).ready( function() { func(); } } + initMost(); }); }); /* }}} */ From ef42392e7f53584013af783e74871fd407288564 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 4 May 2021 17:27:27 +0200 Subject: [PATCH 111/403] add formField of type 'plain' --- views/bootstrap/class.Bootstrap.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/views/bootstrap/class.Bootstrap.php b/views/bootstrap/class.Bootstrap.php index fd62d6b8c..d62d831dd 100644 --- a/views/bootstrap/class.Bootstrap.php +++ b/views/bootstrap/class.Bootstrap.php @@ -1111,6 +1111,9 @@ background-image: linear-gradient(to bottom, #882222, #111111);; (!empty($value['cols']) ? ' rows="'.$value['cols'].'"' : ''). (!empty($value['required']) ? ' required' : '').">".(!empty($value['value']) ? $value['value'] : '').""; break; + case 'plain': + echo $value['value']; + break; case 'input': default: switch($value['type']) { From 62d8197751bcb49822a767260a70bedee558c3b1 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 4 May 2021 17:28:04 +0200 Subject: [PATCH 112/403] add formField of type 'plain', fix printAccordion() --- views/bootstrap4/class.Bootstrap4.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/views/bootstrap4/class.Bootstrap4.php b/views/bootstrap4/class.Bootstrap4.php index 16bfaa4ee..cd9b50caf 100644 --- a/views/bootstrap4/class.Bootstrap4.php +++ b/views/bootstrap4/class.Bootstrap4.php @@ -1085,6 +1085,9 @@ background-image: linear-gradient(to bottom, #882222, #111111);; (!empty($value['cols']) ? ' rows="'.$value['cols'].'"' : ''). (!empty($value['required']) ? ' required' : '').">".(!empty($value['value']) ? $value['value'] : '').""; break; + case 'plain': + echo $value['value']; + break; case 'input': default: switch($value['type']) { @@ -3523,8 +3526,8 @@ $("body").on("click", "span.openpopupbox", function(e) { $id = substr(md5(uniqid()), 0, 4); ?>
        -
        -
        +
        +
        From 9990fdb57d5624b625c54a8574513a813fce3e90 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 4 May 2021 17:29:07 +0200 Subject: [PATCH 113/403] replace table with form controll --- views/bootstrap/class.KeywordChooser.php | 171 +++++++++++------------ 1 file changed, 81 insertions(+), 90 deletions(-) diff --git a/views/bootstrap/class.KeywordChooser.php b/views/bootstrap/class.KeywordChooser.php index 9d648a730..e73199984 100644 --- a/views/bootstrap/class.KeywordChooser.php +++ b/views/bootstrap/class.KeywordChooser.php @@ -115,99 +115,90 @@ myTA.focus();
        contentContainerStart(); -?> - - - - - - - - - - - - -getOwner(); - if (!$owner->isAdmin()) - continue; -?> - - - - - - - - - -formField( + getMLText("keywords"), + array( + 'element'=>'textarea', + 'id'=>'keywordta', + 'rows'=>4, + ) + ); + $options = array(); + $options[] = array('-1', getMLText('choose_category')); foreach ($categories as $category) { $owner = $category->getOwner(); - if ($owner->isAdmin()) - continue; -?> - - - - - -
        :
        : - -
        : - -
        - -getId().'" style="display: none;">'; + $this->formField( + getMLText("default_keywords"), + array( + 'element'=>'plain', + 'name'=>'categories0', + 'value'=>implode(' ', $kw), + ) + ); + echo '
        '; + } + } + } + $options = array(); + $options[] = array('-1', getMLText('choose_category')); + foreach ($categories as $category) { + $owner = $category->getOwner(); + if(!$owner->isAdmin()) + $options[] = array(''.$category->getID(), htmlspecialchars($category->getName())); + } + $this->formField( + getMLText("personal_default_keywords"), + array( + 'element'=>'select', + 'id'=>'categories1', + 'options'=>$options, + ) + ); + foreach ($categories as $category) { + $owner = $category->getOwner(); + if(!$owner->isAdmin()) { + $lists = $category->getKeywordLists(); + if(count($lists) == 0) print getMLText("no_default_keywords"); + else { + $kw = array(); + foreach ($lists as $list) { + $kw[] = "".htmlspecialchars($list["keywords"]).""; + } + echo ''; + } + } + } $this->contentContainerEnd(); echo ''."\n"; // $this->htmlEndPage(); From 7da093ff4eaf3b066f39b09b7ff07241075dcfae Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 4 May 2021 17:29:30 +0200 Subject: [PATCH 114/403] replace most of the html --- views/bootstrap/class.AttributeMgr.php | 4 +-- views/bootstrap/class.Categories.php | 27 +++++++++------ views/bootstrap/class.DefaultKeywords.php | 42 ++++++++++++----------- 3 files changed, 40 insertions(+), 33 deletions(-) diff --git a/views/bootstrap/class.AttributeMgr.php b/views/bootstrap/class.AttributeMgr.php index 3050b2a24..4bc5d844f 100644 --- a/views/bootstrap/class.AttributeMgr.php +++ b/views/bootstrap/class.AttributeMgr.php @@ -322,8 +322,6 @@ $(document).ready( function() { $attrdefs = $this->params['attrdefs']; $selattrdef = $this->params['selattrdef']; - $this->htmlAddHeader(''."\n", 'js'); - $this->htmlStartPage(getMLText("admin_tools")); $this->globalNavigation(); $this->contentStart(); @@ -333,7 +331,7 @@ $(document).ready( function() { $this->columnStart(6); ?>
        - contentHeading(getMLText("category_info")); $c = $selcat->countDocumentsByCategory(); - echo "\n"; + echo "
        \n"; echo "\n"; echo "
        ".getMLText('document_count')."".($c)."
        "; @@ -145,8 +145,6 @@ $(document).ready( function() { $categories = $this->params['categories']; $selcat = $this->params['selcategory']; - $this->htmlAddHeader(''."\n", 'js'); - $this->htmlStartPage(getMLText("admin_tools")); $this->globalNavigation(); $this->contentStart(); @@ -157,15 +155,24 @@ $(document).ready( function() { $this->columnStart(6); ?> -
        getID()."\"" : "") ?>>
        getID()."\"" : "") ?>>
        diff --git a/views/bootstrap/class.DefaultKeywords.php b/views/bootstrap/class.DefaultKeywords.php index e9e32e97d..7ee55f052 100644 --- a/views/bootstrap/class.DefaultKeywords.php +++ b/views/bootstrap/class.DefaultKeywords.php @@ -120,13 +120,13 @@ $(document).ready( function() { function actionmenu() { /* {{{ */ $dms = $this->params['dms']; $user = $this->params['user']; - $selcategoryid = $this->params['selcategoryid']; + $selcategory = $this->params['selcategory']; - if($selcategoryid && $selcategoryid > 0) { + if($selcategory && $selcategory->getId() > 0) { ?>
        - +
        @@ -137,7 +137,7 @@ $(document).ready( function() { function form() { /* {{{ */ $dms = $this->params['dms']; $user = $this->params['user']; - $category = $dms->getKeywordCategory($this->params['selcategoryid']); + $category = $this->params['selcategory']; $this->showKeywordForm($category, $user); } /* }}} */ @@ -240,7 +240,7 @@ $(document).ready( function() { $dms = $this->params['dms']; $user = $this->params['user']; $categories = $this->params['categories']; - $selcategoryid = $this->params['selcategoryid']; + $selcategory = $this->params['selcategory']; $this->htmlStartPage(getMLText("admin_tools")); $this->globalNavigation(); @@ -252,31 +252,33 @@ $(document).ready( function() { $this->columnStart(4); ?>
        -
        -
        >
        +
        getId()."\"" : "") ?>>
        columnEnd(); $this->columnStart(8); ?> -
        >
        +
        getId()."\"" : "") ?>>
        columnEnd(); From c5b5ac07db1fee635f4431e39f2879480b4de2ae Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 4 May 2021 17:29:55 +0200 Subject: [PATCH 115/403] set 'setcategory' in view --- out/out.DefaultKeywords.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/out/out.DefaultKeywords.php b/out/out.DefaultKeywords.php index dba41a2e5..a1a3d4a21 100644 --- a/out/out.DefaultKeywords.php +++ b/out/out.DefaultKeywords.php @@ -37,15 +37,15 @@ if (!$user->isAdmin()) { } if(isset($_GET['categoryid'])) - $selcategoryid = $_GET['categoryid']; + $selcategory = $dms->getKeywordCategory($_GET['categoryid']); else - $selcategoryid = 0; + $selcategory = null; $categories = $dms->getAllUserKeywordCategories($user->getID()); if($view) { $view->setParam('categories', $categories); - $view->setParam('selcategoryid', $selcategoryid); + $view->setParam('selcategory', $selcategory); $view->setParam('accessobject', $accessop); $view($_GET); exit; From f6fbcbadfa78fb8dcc1ee52dbf165d916e4d5141 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 4 May 2021 17:35:24 +0200 Subject: [PATCH 116/403] do not show message anymore, if keyword list is empty --- views/bootstrap/class.KeywordChooser.php | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/views/bootstrap/class.KeywordChooser.php b/views/bootstrap/class.KeywordChooser.php index e73199984..bf0f5d888 100644 --- a/views/bootstrap/class.KeywordChooser.php +++ b/views/bootstrap/class.KeywordChooser.php @@ -142,8 +142,7 @@ myTA.focus(); $owner = $category->getOwner(); if($owner->isAdmin()) { $lists = $category->getKeywordLists(); - if(count($lists) == 0) print getMLText("no_default_keywords"); - else { + if(count($lists)) { $kw = array(); foreach ($lists as $list) { $kw[] = "".htmlspecialchars($list["keywords"]).""; @@ -180,8 +179,7 @@ myTA.focus(); $owner = $category->getOwner(); if(!$owner->isAdmin()) { $lists = $category->getKeywordLists(); - if(count($lists) == 0) print getMLText("no_default_keywords"); - else { + if(count($lists)) { $kw = array(); foreach ($lists as $list) { $kw[] = "".htmlspecialchars($list["keywords"]).""; From 585fa964d576fb6cf2529ed6ab2c4952bb5eb114 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 4 May 2021 17:41:21 +0200 Subject: [PATCH 117/403] add class 'form-control' to some select tags --- views/bootstrap4/class.Bootstrap4.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/views/bootstrap4/class.Bootstrap4.php b/views/bootstrap4/class.Bootstrap4.php index cd9b50caf..d8209cf9a 100644 --- a/views/bootstrap4/class.Bootstrap4.php +++ b/views/bootstrap4/class.Bootstrap4.php @@ -1780,7 +1780,7 @@ $(document).ready(function() { if($users) { $allowempty = $attrdef->getMinValues() == 0; $allowmultiple = $attrdef->getMultipleValues(); - $content .= "getId()."]".($allowmultiple ? '[]' : '')."\"".($allowmultiple ? " multiple" : "")." data-placeholder=\"".getMLText("select_user")."\">"; if($allowempty) $content .= ""; foreach($users as $curuser) { @@ -1800,7 +1800,7 @@ $(document).ready(function() { if($groups) { $allowempty = $attrdef->getMinValues() == 0; $allowmultiple = $attrdef->getMultipleValues(); - $content .= "getId()."]".($allowmultiple ? '[]' : '')."\"".($allowmultiple ? " multiple" : "")." data-placeholder=\"".getMLText("select_group")."\">"; if($allowempty) $content .= ""; foreach($groups as $curgroup) { @@ -1823,7 +1823,7 @@ $(document).ready(function() { } else { $content .= "\" data-allow-clear=\"true\""; } - $content .= "".((!$norequire && $attrdef->getMinValues() > 0) ? ' required' : '')." class=\"chzn-select\" data-placeholder=\"".getMLText("select_value")."\">"; + $content .= "".((!$norequire && $attrdef->getMinValues() > 0) ? ' required' : '')." class=\"form-control chzn-select\" data-placeholder=\"".getMLText("select_value")."\">"; if(!$attrdef->getMultipleValues()) { $content .= ""; } From b5116e3c1b06e4ce914b377e442dfef4affefcf5 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 4 May 2021 17:49:36 +0200 Subject: [PATCH 118/403] place submit button outside of contentContainer --- views/bootstrap/class.AddEvent.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/views/bootstrap/class.AddEvent.php b/views/bootstrap/class.AddEvent.php index eb7cdebab..b013885d7 100644 --- a/views/bootstrap/class.AddEvent.php +++ b/views/bootstrap/class.AddEvent.php @@ -78,7 +78,6 @@ $(document).ready(function() { $this->pageNavigation("", "calendar"); $this->contentHeading(getMLText("add_event")); - $this->contentContainerStart(); $expdate = getReadableDate(); ?> @@ -87,6 +86,7 @@ $(document).ready(function() { contentContainerStart(); $this->formField( getMLText("from"), $this->getDateChooser($expdate, "from", $this->params['session']->getLanguage()) @@ -114,13 +114,13 @@ $(document).ready(function() { 'cols'=>80 ) ); + $this->contentContainerEnd(); $this->formSubmit(getMLText('add_event')); ?> contentContainerEnd(); $this->contentEnd(); $this->htmlEndPage(); } /* }}} */ From 073ba8281ccdcf16f86abdac5a7305722e3f4478 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 4 May 2021 17:50:18 +0200 Subject: [PATCH 119/403] place submit button outside of contentContainer --- views/bootstrap/class.Calendar.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/views/bootstrap/class.Calendar.php b/views/bootstrap/class.Calendar.php index ef364f11d..d59f8d1b8 100644 --- a/views/bootstrap/class.Calendar.php +++ b/views/bootstrap/class.Calendar.php @@ -65,13 +65,13 @@ class SeedDMS_View_Calendar extends SeedDMS_Theme_Style { if($event) { // print_r($event); $this->contentHeading(getMLText('edit_event')); - $this->contentContainerStart(); ?>
        "> contentContainerStart(); $this->formField( getMLText("from"), $this->getDateChooser(getReadableDate($event["start"]), "from") @@ -100,11 +100,11 @@ class SeedDMS_View_Calendar extends SeedDMS_Theme_Style { 'required'=>$strictformcheck ) ); + $this->contentContainerEnd(); $this->formSubmit(" ".getMLText('save')); ?>
        contentContainerEnd(); $this->contentHeading(getMLText('rm_event')); $this->contentContainerStart(); ?> From 22882e2634adbcc3bc76645958f9e7b46b62e688 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 4 May 2021 17:50:36 +0200 Subject: [PATCH 120/403] pass access object to view --- out/out.AddEvent.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/out/out.AddEvent.php b/out/out.AddEvent.php index 8f8f0d6d9..3f81697bb 100644 --- a/out/out.AddEvent.php +++ b/out/out.AddEvent.php @@ -25,6 +25,7 @@ require_once("inc/inc.Init.php"); require_once("inc/inc.Extension.php"); require_once("inc/inc.DBInit.php"); require_once("inc/inc.ClassUI.php"); +require_once("inc/inc.ClassAccessOperation.php"); require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); @@ -34,6 +35,8 @@ if ($user->isGuest()) { UI::exitError(getMLText("edit_event"),getMLText("access_denied")); } +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); + if($view) { $view->setParam('accessobject', $accessop); $view->setParam('strictformcheck', $settings->_strictFormCheck); From 26b376296278c38eeefca0b63b8e5deae9cbafea Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 4 May 2021 18:11:18 +0200 Subject: [PATCH 121/403] fix layout --- views/bootstrap/class.EditUserData.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/views/bootstrap/class.EditUserData.php b/views/bootstrap/class.EditUserData.php index f84d4cefa..2c79c39d9 100644 --- a/views/bootstrap/class.EditUserData.php +++ b/views/bootstrap/class.EditUserData.php @@ -100,11 +100,11 @@ $(document).ready( function() { $this->pageNavigation(getMLText("my_account"), "my_account"); $this->contentHeading(getMLText("edit_user_details")); - $this->contentContainerStart(); ?>
        contentContainerStart(); $this->formField( getMLText("current_password"), array( @@ -118,12 +118,12 @@ $(document).ready( function() { ); $this->formField( getMLText("new_password"), - '' + '' ); if($passwordstrength) { $this->formField( getMLText("password_strength"), - '
        ' + '
        ' ); } $this->formField( @@ -206,12 +206,12 @@ $(document).ready( function() { ) ); } + $this->contentContainerEnd(); $this->formSubmit(" ".getMLText('save')); ?>
        contentContainerEnd(); $this->contentEnd(); $this->htmlEndPage(); } /* }}} */ From edd60363f363abc45828632ab9dacee5a8275467 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Wed, 5 May 2021 13:43:40 +0200 Subject: [PATCH 122/403] return false if query fails --- SeedDMS_SQLiteFTS/SQLiteFTS/Indexer.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/SeedDMS_SQLiteFTS/SQLiteFTS/Indexer.php b/SeedDMS_SQLiteFTS/SQLiteFTS/Indexer.php index 2eb15428b..cc5b39119 100644 --- a/SeedDMS_SQLiteFTS/SQLiteFTS/Indexer.php +++ b/SeedDMS_SQLiteFTS/SQLiteFTS/Indexer.php @@ -175,6 +175,8 @@ class SeedDMS_SQLiteFTS_Indexer { if($query) $sql .= " WHERE docs MATCH ".$this->_conn->quote($query); $res = $this->_conn->query($sql); + if(!$res) + return false; $row = $res->fetch(); $sql = "SELECT ".$this->_rawid.", documentid FROM docs"; From 1e08ea06e9c0acf487ac31c4d451719ccb879e6e Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Wed, 5 May 2021 13:44:02 +0200 Subject: [PATCH 123/403] add missing ' AND ' in query string --- SeedDMS_SQLiteFTS/SQLiteFTS/Search.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/SeedDMS_SQLiteFTS/SQLiteFTS/Search.php b/SeedDMS_SQLiteFTS/SQLiteFTS/Search.php index 78b5ed86c..77b3993f6 100644 --- a/SeedDMS_SQLiteFTS/SQLiteFTS/Search.php +++ b/SeedDMS_SQLiteFTS/SQLiteFTS/Search.php @@ -79,11 +79,11 @@ class SeedDMS_SQliteFTS_Search { if(!empty($fields['owner'])) { if(is_string($fields['owner'])) { if($querystr) - $querystr .= ' '; + $querystr .= ' AND '; $querystr .= 'owner:'.$fields['owner']; } elseif(is_array($fields['owner'])) { if($querystr) - $querystr .= ' '; + $querystr .= ' AND '; $querystr .= '(owner:'; $querystr .= implode(' OR owner:', $fields['owner']); $querystr .= ')'; @@ -91,14 +91,14 @@ class SeedDMS_SQliteFTS_Search { } if(!empty($fields['category'])) { if($querystr) - $querystr .= ' '; + $querystr .= ' AND '; $querystr .= '(category:'; $querystr .= implode(' OR category:', $fields['category']); $querystr .= ')'; } if(!empty($fields['status'])) { if($querystr) - $querystr .= ' '; + $querystr .= ' AND '; $status = array_map(function($v){return $v+10;}, $fields['status']); $querystr .= '(status:'; $querystr .= implode(' OR status:', $status); @@ -106,21 +106,21 @@ class SeedDMS_SQliteFTS_Search { } if(!empty($fields['user'])) { if($querystr) - $querystr .= ' '; + $querystr .= ' AND '; $querystr .= '(users:'; $querystr .= implode(' OR users:', $fields['user']); $querystr .= ')'; } if(!empty($fields['rootFolder']) && $fields['rootFolder']->getFolderList()) { if($querystr) - $querystr .= ' '; + $querystr .= ' AND '; $querystr .= '(path:'; $querystr .= str_replace(':', 'x', $fields['rootFolder']->getFolderList().$fields['rootFolder']->getID().':'); $querystr .= ')'; } if(!empty($fields['startFolder']) && $fields['startFolder']->getFolderList()) { if($querystr) - $querystr .= ' '; + $querystr .= ' AND '; $querystr .= '(path:'; $querystr .= str_replace(':', 'x', $fields['startFolder']->getFolderList().$fields['startFolder']->getID().':'); $querystr .= ')'; From 805dbe212ade0440427676f37861837a86032fa7 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Wed, 5 May 2021 13:46:05 +0200 Subject: [PATCH 124/403] fix html for date picker and accordion --- views/bootstrap4/class.Bootstrap4.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/views/bootstrap4/class.Bootstrap4.php b/views/bootstrap4/class.Bootstrap4.php index d8209cf9a..1a181e7f3 100644 --- a/views/bootstrap4/class.Bootstrap4.php +++ b/views/bootstrap4/class.Bootstrap4.php @@ -1366,7 +1366,7 @@ $(document).ready(function() { $dateformat = getConvertDateFormat(); $content = '
        - +
        @@ -1743,7 +1743,7 @@ $(document).ready(function() { */ $content = '
        - +
        @@ -3527,13 +3527,13 @@ $("body").on("click", "span.openpopupbox", function(e) { ?>
        -
        - + -
        -
        +
        +
        From e870e2071b9131a32ab3c4d091a2ef4c0c3bb539 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Wed, 5 May 2021 13:47:38 +0200 Subject: [PATCH 125/403] redo the search form --- out/out.Search.php | 189 ++++------- views/bootstrap/class.Search.php | 559 ++++++++++++++----------------- 2 files changed, 313 insertions(+), 435 deletions(-) diff --git a/out/out.Search.php b/out/out.Search.php index d34d3b572..1b0b00e41 100644 --- a/out/out.Search.php +++ b/out/out.Search.php @@ -64,15 +64,7 @@ if(((!isset($_GET["fullsearch"]) && $settings->_defaultSearchMethod == 'fulltext $categories = array(); $categorynames = array(); if(isset($_GET['category']) && $_GET['category']) { - foreach($_GET['category'] as $catname) { - if($catname) { - $cat = $dms->getDocumentCategoryByName($catname); - $categories[] = $cat; - $categorynames[] = $cat->getName(); - } - } - } elseif(isset($_GET['categoryids']) && $_GET['categoryids']) { - foreach($_GET['categoryids'] as $catid) { + foreach($_GET['category'] as $catid) { if($catid) { $cat = $dms->getDocumentCategory($catid); $categories[] = $cat; @@ -104,16 +96,18 @@ if(((!isset($_GET["fullsearch"]) && $settings->_defaultSearchMethod == 'fulltext // Check to see if the search has been restricted to a particular // document owner. $owner = []; + $ownernames = []; if (isset($_GET["owner"])) { + $owner = $_GET['owner']; if (!is_array($_GET['owner'])) { - if(!empty($_GET['owner']) && $o = $dms->getUserByLogin($_GET['owner'])) - $owner[] = $o->getLogin(); + if(!empty($_GET['owner']) && $o = $dms->getUser($_GET['owner'])) + $ownernames[] = $o->getLogin(); else UI::exitError(getMLText("search"),getMLText("unknown_owner")); } else { foreach($_GET["owner"] as $l) { - if($l && $o = $dms->getUserByLogin($l)) - $owner[] = $o->getLogin(); + if($l && $o = $dms->getUser($l)) + $ownernames[] = $o->getLogin(); } } } @@ -134,34 +128,16 @@ if(((!isset($_GET["fullsearch"]) && $settings->_defaultSearchMethod == 'fulltext } // status - $status = array(); - if (isset($_GET["pendingReview"])){ - $status[] = S_DRAFT_REV; - } - if (isset($_GET["pendingApproval"])){ - $status[] = S_DRAFT_APP; - } - if (isset($_GET["inWorkflow"])){ - $status[] = S_IN_WORKFLOW; - } - if (isset($_GET["released"])){ - $status[] = S_RELEASED; - } - if (isset($_GET["rejected"])){ - $status[] = S_REJECTED; - } - if (isset($_GET["obsolete"])){ - $status[] = S_OBSOLETE; - } - if (isset($_GET["expired"])){ - $status[] = S_EXPIRED; - } + if(isset($_GET['status'])) + $status = $_GET['status']; + else + $status = array(); // Check to see if the search has been restricted to a particular sub-tree in // the folder hierarchy. $startFolder = null; - if (isset($_GET["targetid"]) && is_numeric($_GET["targetid"]) && $_GET["targetid"]>0) { - $targetid = $_GET["targetid"]; + if (isset($_GET["folderfullsearchid"]) && is_numeric($_GET["folderfullsearchid"]) && $_GET["folderfullsearchid"]>0) { + $targetid = $_GET["folderfullsearchid"]; $startFolder = $dms->getFolder($targetid); if (!is_object($startFolder)) { UI::exitError(getMLText("search"),getMLText("invalid_folder_id")); @@ -188,7 +164,7 @@ if(((!isset($_GET["fullsearch"]) && $settings->_defaultSearchMethod == 'fulltext $index = $fulltextservice->Indexer(); if($index) { $lucenesearch = $fulltextservice->Search(); - $searchresult = $lucenesearch->search($query, array('owner'=>$owner, 'status'=>$status, 'category'=>$categorynames, 'user'=>$user->isAdmin() ? [] : [$user->getLogin()], 'mimetype'=>$mimetype, 'startFolder'=>$startFolder, 'rootFolder'=>$rootFolder), ($pageNumber == 'all' ? array() : array('limit'=>$limit, 'offset'=>$limit * ($pageNumber-1)))); + $searchresult = $lucenesearch->search($query, array('owner'=>$ownernames, 'status'=>$status, 'category'=>$categorynames, 'user'=>$user->isAdmin() ? [] : [$user->getLogin()], 'mimetype'=>$mimetype, 'startFolder'=>$startFolder, 'rootFolder'=>$rootFolder), ($pageNumber == 'all' ? array() : array('limit'=>$limit, 'offset'=>$limit * ($pageNumber-1)))); if($searchresult === false) { $session->setSplashMsg(array('type'=>'error', 'msg'=>getMLText('splash_invalid_searchterm'))); $dcount = 0; @@ -313,105 +289,81 @@ if(((!isset($_GET["fullsearch"]) && $settings->_defaultSearchMethod == 'fulltext $owner = array(); $ownerobjs = array(); if (isset($_GET["owner"])) { + $owner = $_GET['owner']; if (!is_array($_GET['owner'])) { - if(!empty($_GET['owner']) && $o = $dms->getUserByLogin($_GET['owner'])) { + if(!empty($_GET['owner']) && $o = $dms->getUser($_GET['owner'])) { $ownerobjs[] = $o; - $owner = $o->getLogin(); } else UI::exitError(getMLText("search"),getMLText("unknown_owner")); } else { foreach($_GET["owner"] as $l) { - if($o = $dms->getUserByLogin($l)) { + if($o = $dms->getUser($l)) { $ownerobjs[] = $o; - $owner[] = $o->getLogin(); } } } } - // Is the search restricted to documents created between two specific dates? - $startdate = array(); - $stopdate = array(); - if (isset($_GET["creationdate"]) && $_GET["creationdate"]!=null) { - $creationdate = true; - } else { - $creationdate = false; + /* Creation date {{{ */ + $createstartdate = array(); + $createenddate = array(); + if(!empty($_GET["createstart"])) { + $createstartts = makeTsFromDate($_GET["createstart"]); + $createstartdate = array('year'=>(int)date('Y', $createstartts), 'month'=>(int)date('m', $createstartts), 'day'=>(int)date('d', $createstartts), 'hour'=>0, 'minute'=>0, 'second'=>0); } - - if(isset($_GET["createstart"])) { - $tmp = explode("-", $_GET["createstart"]); - $startdate = array('year'=>(int)$tmp[0], 'month'=>(int)$tmp[1], 'day'=>(int)$tmp[2], 'hour'=>0, 'minute'=>0, 'second'=>0); - } else { - if(isset($_GET["createstartyear"])) - $startdate = array('year'=>$_GET["createstartyear"], 'month'=>$_GET["createstartmonth"], 'day'=>$_GET["createstartday"], 'hour'=>0, 'minute'=>0, 'second'=>0); - } - if ($startdate && !checkdate($startdate['month'], $startdate['day'], $startdate['year'])) { + if ($createstartdate && !checkdate($createstartdate['month'], $createstartdate['day'], $createstartdate['year'])) { UI::exitError(getMLText("search"),getMLText("invalid_create_date_end")); } - if(isset($_GET["createend"])) { - $tmp = explode("-", $_GET["createend"]); - $stopdate = array('year'=>(int)$tmp[0], 'month'=>(int)$tmp[1], 'day'=>(int)$tmp[2], 'hour'=>23, 'minute'=>59, 'second'=>59); - } else { - if(isset($_GET["createendyear"])) - $stopdate = array('year'=>$_GET["createendyear"], 'month'=>$_GET["createendmonth"], 'day'=>$_GET["createendday"], 'hour'=>23, 'minute'=>59, 'second'=>59); + if(!empty($_GET["createend"])) { + $createendts = makeTsFromDate($_GET["createend"]); + $createenddate = array('year'=>(int)date('Y', $createendts), 'month'=>(int)date('m', $createendts), 'day'=>(int)date('d', $createendts), 'hour'=>23, 'minute'=>59, 'second'=>59); } - if ($stopdate && !checkdate($stopdate['month'], $stopdate['day'], $stopdate['year'])) { + if ($createenddate && !checkdate($createenddate['month'], $createenddate['day'], $createenddate['year'])) { UI::exitError(getMLText("search"),getMLText("invalid_create_date_end")); } + /* }}} */ + /* Status date {{{ */ $statusstartdate = array(); - $statusstopdate = array(); - if (isset($_GET["statusdate"]) && $_GET["statusdate"]!=null) { - $statusdate = true; - } else { - $statusdate = false; + $statusenddate = array(); + if(!empty($_GET["statusdatestart"])) { + $statusstartts = makeTsFromDate($_GET["statusdatestart"]); + $statusstartdate = array('year'=>(int)date('Y', $statusstartts), 'month'=>(int)date('m', $statusstartts), 'day'=>(int)date('d', $statusstartts), 'hour'=>0, 'minute'=>0, 'second'=>0); } - - if(isset($_GET["statusstart"])) { - $tmp = explode("-", $_GET["statusstart"]); - $statusstartdate = array('year'=>(int)$tmp[0], 'month'=>(int)$tmp[1], 'day'=>(int)$tmp[2], 'hour'=>0, 'minute'=>0, 'second'=>0); + if ($statusstartdate && !checkdate($statusstartdate['month'], $statusstartdate['day'], $statusstartdate['year'])) { + UI::exitError(getMLText("search"),getMLText("invalid_status_date_start")); } - if ($statusstartdate && !checkdate($statusstartdate['month'], $startdate['day'], $startdate['year'])) { - UI::exitError(getMLText("search"),getMLText("invalid_status_date_end")); - } - if(isset($_GET["statusend"])) { - $tmp = explode("-", $_GET["statusend"]); - $statusstopdate = array('year'=>(int)$tmp[0], 'month'=>(int)$tmp[1], 'day'=>(int)$tmp[2], 'hour'=>23, 'minute'=>59, 'second'=>59); - } - if ($statusstopdate && !checkdate($statusstopdate['month'], $stopdate['day'], $stopdate['year'])) { + if(!empty($_GET["statusdateend"])) { + $statusendts = makeTsFromDate($_GET["statusdateend"]); + $statusenddate = array('year'=>(int)date('Y', $statusendts), 'month'=>(int)date('m', $statusendts), 'day'=>(int)date('d', $statusendts), 'hour'=>23, 'minute'=>59, 'second'=>59); + } + if ($statusenddate && !checkdate($statusenddate['month'], $statusenddate['day'], $statusenddate['year'])) { UI::exitError(getMLText("search"),getMLText("invalid_status_date_end")); } + /* }}} */ + /* Expiration date {{{ */ $expstartdate = array(); - $expstopdate = array(); - if (isset($_GET["expirationdate"]) && $_GET["expirationdate"]!=null) { - $expirationdate = true; - } else { - $expirationdate = false; - } - - if(isset($_GET["expirationstart"]) && $_GET["expirationstart"]) { - $tmp = explode("-", $_GET["expirationstart"]); - $expstartdate = array('year'=>(int)$tmp[0], 'month'=>(int)$tmp[1], 'day'=>(int)$tmp[2], 'hour'=>0, 'minute'=>0, 'second'=>0); + $expenddate = array(); + if(!empty($_GET["expirationstart"])) { + $expstartts = makeTsFromDate($_GET["expirationstart"]); + $expstartdate = array('year'=>(int)date('Y', $expstartts), 'month'=>(int)date('m', $expstartts), 'day'=>(int)date('d', $expstartts), 'hour'=>0, 'minute'=>0, 'second'=>0); if (!checkdate($expstartdate['month'], $expstartdate['day'], $expstartdate['year'])) { UI::exitError(getMLText("search"),getMLText("invalid_expiration_date_start")); } - } else { -// $expstartdate = array('year'=>$_GET["expirationstartyear"], 'month'=>$_GET["expirationstartmonth"], 'day'=>$_GET["expirationstartday"], 'hour'=>0, 'minute'=>0, 'second'=>0); - $expstartdate = array(); } - if(isset($_GET["expirationend"]) && $_GET["expirationend"]) { - $tmp = explode("-", $_GET["expirationend"]); - $expstopdate = array('year'=>(int)$tmp[0], 'month'=>(int)$tmp[1], 'day'=>(int)$tmp[2], 'hour'=>0, 'minute'=>0, 'second'=>0); - if (!checkdate($expstopdate['month'], $expstopdate['day'], $expstopdate['year'])) { + if(!empty($_GET["expirationend"])) { + $expendts = makeTsFromDate($_GET["expirationend"]); + $expenddate = array('year'=>(int)date('Y', $expendts), 'month'=>(int)date('m', $expendts), 'day'=>(int)date('d', $expendts), 'hour'=>23, 'minute'=>59, 'second'=>59); + if (!checkdate($expenddate['month'], $expenddate['day'], $expenddate['year'])) { UI::exitError(getMLText("search"),getMLText("invalid_expiration_date_end")); } - } else { - //$expstopdate = array('year'=>$_GET["expirationendyear"], 'month'=>$_GET["expirationendmonth"], 'day'=>$_GET["expirationendday"], 'hour'=>23, 'minute'=>59, 'second'=>59); - $expstopdate = array(); } + /* }}} */ // status + $status = isset($_GET['status']) ? $_GET['status'] : array(); + /* $status = array(); if (isset($_GET["pendingReview"])){ $status[] = S_DRAFT_REV; @@ -434,6 +386,7 @@ if(((!isset($_GET["fullsearch"]) && $settings->_defaultSearchMethod == 'fulltext if (isset($_GET["expired"])){ $status[] = S_EXPIRED; } + */ /* Do not search for folders if result shall be filtered by status. * If this is not done, unexplainable results will be delivered. @@ -446,13 +399,10 @@ if(((!isset($_GET["fullsearch"]) && $settings->_defaultSearchMethod == 'fulltext // category $categories = array(); - $categorynames = array(); if(isset($_GET['category']) && $_GET['category']) { - foreach($_GET['category'] as $catname) { - if($catname) { - $cat = $dms->getDocumentCategoryByName($catname); + foreach($_GET['category'] as $catid) { + if($cat = $dms->getDocumentCategory($catid)) { $categories[] = $cat; - $categorynames[] = $cat->getName(); } } } @@ -513,17 +463,17 @@ if(((!isset($_GET["fullsearch"]) && $settings->_defaultSearchMethod == 'fulltext 'startFolder'=>$startFolder, 'owner'=>$ownerobjs, 'status'=>$status, - 'creationstartdate'=>$creationdate ? $startdate : array(), - 'creationenddate'=>$creationdate ? $stopdate : array(), + 'creationstartdate'=>$createstartdate ? $createstartdate : array(), + 'creationenddate'=>$createenddate ? $createenddate : array(), 'modificationstartdate'=>array(), 'modificationenddate'=>array(), 'categories'=>$categories, 'attributes'=>$attributes, 'mode'=>$resultmode, - 'expirationstartdate'=>$expirationdate ? $expstartdate : array(), - 'expirationenddate'=>$expirationdate ? $expstopdate : array(), - 'statusstartdate'=>$statusdate ? $statusstartdate : array(), - 'statusenddate'=>$statusdate ? $statusstopdate : array(), + 'expirationstartdate'=>$expstartdate ? $expstartdate : array(), + 'expirationenddate'=>$expenddate ? $expenddate : array(), + 'statusstartdate'=>$statusstartdate ? $statusstartdate : array(), + 'statusenddate'=>$statusenddate ? $statusenddate : array(), 'orderby'=>$orderby )); $total = $resArr['totalDocs'] + $resArr['totalFolders']; @@ -593,18 +543,17 @@ if($settings->_showSingleSearchHit && count($entries) == 1) { $view->setParam('searchin', isset($searchin) ? $searchin : array()); $view->setParam('startfolder', isset($startFolder) ? $startFolder : null); $view->setParam('owner', $owner); - $view->setParam('startdate', isset($startdate) ? $startdate : array()); - $view->setParam('stopdate', isset($stopdate) ? $stopdate : array()); - $view->setParam('expstartdate', isset($expstartdate) ? $expstartdate : array()); - $view->setParam('expstopdate', isset($expstopdate) ? $expstopdate : array()); - $view->setParam('statusstartdate', isset($statusstartdate) ? $statusstartdate : array()); - $view->setParam('statusstopdate', isset($statusstopdate) ? $statusstopdate : array()); + $view->setParam('createstartdate', $createstartdate ? getReadableDate($createstartts) : ''); + $view->setParam('createenddate', $createenddate ? getReadableDate($createendts) : ''); + $view->setParam('expstartdate', $expstartdate ? getReadableDate($expstartts) : ''); + $view->setParam('expenddate', $expenddate ? getReadableDate($expendts) : ''); + $view->setParam('statusstartdate', $statusstartdate ? getReadableDate($statusstartts) : ''); + $view->setParam('statusenddate', $statusenddate ? getReadableDate($statusendts) : ''); $view->setParam('creationdate', isset($creationdate) ? $creationdate : ''); $view->setParam('expirationdate', isset($expirationdate) ? $expirationdate: ''); $view->setParam('statusdate', isset($statusdate) ? $statusdate: ''); $view->setParam('status', isset($status) ? $status : array()); $view->setParam('categories', isset($categories) ? $categories : ''); - $view->setParam('category', isset($categorynames) ? $categorynames : ''); $view->setParam('mimetype', isset($mimetype) ? $mimetype : ''); $view->setParam('attributes', isset($attributes) ? $attributes : ''); $attrdefs = $dms->getAllAttributeDefinitions(array(SeedDMS_Core_AttributeDefinition::objtype_document, SeedDMS_Core_AttributeDefinition::objtype_documentcontent, SeedDMS_Core_AttributeDefinition::objtype_folder, SeedDMS_Core_AttributeDefinition::objtype_all)); diff --git a/views/bootstrap/class.Search.php b/views/bootstrap/class.Search.php index f36c870ef..01ff9bcb0 100644 --- a/views/bootstrap/class.Search.php +++ b/views/bootstrap/class.Search.php @@ -132,17 +132,16 @@ function typeahead() { /* {{{ */ $enablefullsearch = $this->params['enablefullsearch']; $enableclipboard = $this->params['enableclipboard']; $attributes = $this->params['attributes']; - $category = $this->params['category']; $categories = $this->params['categories']; $mimetype = $this->params['mimetype']; $owner = $this->params['owner']; $startfolder = $this->params['startfolder']; - $startdate = $this->params['startdate']; - $stopdate = $this->params['stopdate']; + $createstartdate = $this->params['createstartdate']; + $createenddate = $this->params['createenddate']; $expstartdate = $this->params['expstartdate']; - $expstopdate = $this->params['expstopdate']; + $expenddate = $this->params['expenddate']; $statusstartdate = $this->params['statusstartdate']; - $statusstopdate = $this->params['statusstopdate']; + $statusenddate = $this->params['statusenddate']; $creationdate = $this->params['creationdate']; $expirationdate = $this->params['expirationdate']; $statusdate = $this->params['statusdate']; @@ -161,8 +160,6 @@ function typeahead() { /* {{{ */ $timeout = $this->params['timeout']; $xsendfile = $this->params['xsendfile']; - $this->htmlAddHeader(''."\n", 'js'); - $this->htmlStartPage(getMLText("search_results")); $this->globalNavigation(); $this->contentStart(); @@ -172,7 +169,7 @@ function typeahead() { /* {{{ */ $this->columnStart(4); //echo "
        ";print_r($_GET);echo "
        "; ?> -
      \n"; $this->columnEnd(); $this->rowEnd(); From 2001f4f0d356af920b1dcaa379ffb8328b0cb235 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Thu, 6 May 2021 15:08:11 +0200 Subject: [PATCH 145/403] slightly improved layout --- views/bootstrap/class.DefaultKeywords.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/views/bootstrap/class.DefaultKeywords.php b/views/bootstrap/class.DefaultKeywords.php index 7ee55f052..79cbabcbd 100644 --- a/views/bootstrap/class.DefaultKeywords.php +++ b/views/bootstrap/class.DefaultKeywords.php @@ -190,7 +190,7 @@ $(document).ready( function() { contentHeading(getMLText("default_keywords")); - $this->contentContainerStart(); +// $this->contentContainerStart(); ?> getKeywordLists(); @@ -205,7 +205,7 @@ $(document).ready( function() { "> "> - +
      @@ -213,7 +213,7 @@ $(document).ready( function() { "> - +

      @@ -232,7 +232,7 @@ $(document).ready( function() {
      contentContainerEnd(); +// $this->contentContainerEnd(); } } /* }}} */ From cdd75239e3b0659f495c2e9f88e57704aeb82756 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Thu, 6 May 2021 15:08:33 +0200 Subject: [PATCH 146/403] fix wrong call of parent method --- views/bootstrap/class.Settings.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/views/bootstrap/class.Settings.php b/views/bootstrap/class.Settings.php index f6be1d89f..6b9534c0e 100644 --- a/views/bootstrap/class.Settings.php +++ b/views/bootstrap/class.Settings.php @@ -32,7 +32,7 @@ class SeedDMS_View_Settings extends SeedDMS_Theme_Style { protected function showStartPaneContent($name, $isactive) { /* {{{ */ - self::parent($name, $isactive); + parent::showStartPaneContent($name, $isactive); $this->contentContainerStart(); echo ''; echo ''; @@ -41,7 +41,7 @@ class SeedDMS_View_Settings extends SeedDMS_Theme_Style { protected function showEndPaneContent($name, $currentab) { /* {{{ */ echo '
      '; $this->contentContainerEnd(); - self::parent($name, $isactive); + parent::showEndPaneContent($name, $isactive); } /* }}} */ protected function getTextField($name, $value, $type='', $placeholder='') { /* {{{ */ @@ -421,7 +421,7 @@ if(($kkk = $this->callHook('getFullSearchEngine')) && is_array($kkk)) showConfigText('settings_smtpSendFrom', 'smtpSendFrom'); ?> showConfigText('settings_smtpUser', 'smtpUser'); ?> showConfigText('settings_smtpPassword', 'smtpPassword', 'password'); ?> -showConfigPlain(htmlspecialchars(getMLText('settings_smtpSendTestMail')), htmlspecialchars(getMLText('settings_smtpSendTestMail_desc')), ''.getMLText('send_test_mail').'
      You will see debug messages here
      '); ?> +showConfigPlain(htmlspecialchars(getMLText('settings_smtpSendTestMail')), htmlspecialchars(getMLText('settings_smtpSendTestMail_desc')), ''.getMLText('send_test_mail').'
      You will see debug messages here
      '); ?> showEndPaneContent('system', $currenttab); From 5d008374894b096a5c55564910ada595cdc0973d Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Thu, 6 May 2021 15:12:11 +0200 Subject: [PATCH 147/403] use warningMsg() instead of plain html --- views/bootstrap/class.Settings.php | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/views/bootstrap/class.Settings.php b/views/bootstrap/class.Settings.php index 6b9534c0e..d03deeec8 100644 --- a/views/bootstrap/class.Settings.php +++ b/views/bootstrap/class.Settings.php @@ -254,11 +254,9 @@ class SeedDMS_View_Settings extends SeedDMS_Theme_Style { _configFilePath)) { - print "
      "; - echo "

      ".getMLText("settings_notwritable")."

      "; - print "
      "; -} + if(!is_writeable($settings->_configFilePath)) { + $this->warningMsg(getMLText("settings_notwritable")); + } ?>
      \n"; } /* }}} */ function js() { /* {{{ */ header('Content-Type: application/javascript; charset=UTF-8'); ?> $(document).ready( function() { - $('i.fa fa-arrow-up').on('click', function(e) { + $('#toggleall').on('click', function(e) { //var checkBoxes = $("input[type=checkbox]"); //checkBoxes.prop("checked", !checkBoxes.prop("checked")); - $('input[type=checkbox]').prop('checked', true); +$("input[type=checkbox]").each(function () { this.checked = !this.checked; }); }); }); From dd95c1ed8af0c285ca52b7eee8fd8b8bf4e5e611 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 7 May 2021 08:48:38 +0200 Subject: [PATCH 159/403] set title of modal box from data-modal-title --- views/bootstrap4/styles/application.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/views/bootstrap4/styles/application.js b/views/bootstrap4/styles/application.js index 09b7efa46..0798e8c89 100644 --- a/views/bootstrap4/styles/application.js +++ b/views/bootstrap4/styles/application.js @@ -281,6 +281,9 @@ $(document).ready( function() { $('body').on('click', '[data-toggle="modal"]', function(ev){ ev.preventDefault(); $($(this).data("target")+' .modal-body').load($(this).data("remote")); + /* Also set the title */ + if($(this).data("modal-title")) + $($(this).data("target")+' .modal-header h3').html($(this).data("modal-title")); }); // $('body').on('touchstart.dropdown', '.dropdown-menu', function (e) { e.stopPropagation(); }); From 9d87ff9ff3e9fb9e0173f97730c7aaf24b795dab Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 7 May 2021 08:49:13 +0200 Subject: [PATCH 160/403] minor layout improvements --- views/bootstrap/class.LogManagement.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/views/bootstrap/class.LogManagement.php b/views/bootstrap/class.LogManagement.php index 534129d31..d58a524ce 100644 --- a/views/bootstrap/class.LogManagement.php +++ b/views/bootstrap/class.LogManagement.php @@ -56,17 +56,17 @@ class SeedDMS_View_LogManagement extends SeedDMS_Theme_Style { print "
      ".SeedDMS_Core_File::format_filesize(filesize($this->logdir.$entry)).""; - print "".getMLText("rm_file").""; + print " ".getMLText("rm_file").""; print " "; print " ".getMLText("download").""; print " "; - echo $this->getModalBoxLink(array('target'=>'logViewer', 'remote'=>'out.LogManagement.php?logname='.$entry, 'class'=>'btn btn-primary btn-mini btn-sm', 'title'=>' '.getMLText('view').'')); + echo $this->getModalBoxLink(array('target'=>'logViewer', 'remote'=>'out.LogManagement.php?logname='.$entry, 'class'=>'btn btn-primary btn-mini btn-sm', 'title'=>' '.getMLText('view').'', 'attributes'=>array('data-modal-title'=>$entry))); print "
      \n"; + else print "\n"; } /* }}} */ function js() { /* {{{ */ From a0a392ff98774d88bab68359830f21f0b140e4aa Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 7 May 2021 09:32:06 +0200 Subject: [PATCH 161/403] add classes table-sm, table-condensed --- views/bootstrap/class.Clipboard.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/bootstrap/class.Clipboard.php b/views/bootstrap/class.Clipboard.php index 1bd9055a9..b2df501e0 100644 --- a/views/bootstrap/class.Clipboard.php +++ b/views/bootstrap/class.Clipboard.php @@ -233,7 +233,7 @@ class SeedDMS_View_Clipboard extends SeedDMS_Theme_Style { * actually available */ if($foldercount || $doccount) { - $content = "".$content; + $content = "
      ".$content; $content .= "
      "; } else { } From c1e6a8360f9b5b66fe132006591ccabc524d682c Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 7 May 2021 09:32:32 +0200 Subject: [PATCH 162/403] improve layout of clipboard on small devices --- views/bootstrap4/styles/application.css | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/views/bootstrap4/styles/application.css b/views/bootstrap4/styles/application.css index d030ba45a..732abbef8 100644 --- a/views/bootstrap4/styles/application.css +++ b/views/bootstrap4/styles/application.css @@ -191,17 +191,22 @@ div.splash { div.clipboard-container { position: fixed; - left: 10px; - top: 40px; + left: 0px; + top: 50px; width: 29.8%; + min-width: 200px; background: white; border: 1px solid #d4d4d4; border-radius: 5px; padding: 10px; - height: 500px; + max-height: 400px; margin: 10px; overflow-y: auto; overflow-x: hidden; + z-index: 1; +} +div.clipboard-container legend { + display: none; } div.statusbar-container { From 3029bb195e6ef4c3647467e9d249554b4fab3537 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 7 May 2021 11:45:06 +0200 Subject: [PATCH 163/403] SeedDMS_Core_DMS::getTimeline() uses status log instead of document content --- SeedDMS_Core/Core/inc.ClassDMS.php | 8 +++++++- SeedDMS_Core/package.xml | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/SeedDMS_Core/Core/inc.ClassDMS.php b/SeedDMS_Core/Core/inc.ClassDMS.php index 922f9e918..21e221d90 100644 --- a/SeedDMS_Core/Core/inc.ClassDMS.php +++ b/SeedDMS_Core/Core/inc.ClassDMS.php @@ -3259,7 +3259,13 @@ class SeedDMS_Core_DMS { /** @var SeedDMS_Core_Document[] $timeline */ $timeline = array(); - $queryStr = "SELECT DISTINCT document FROM `tblDocumentContent` WHERE `date` > ".$startts." AND `date` < ".$endts." UNION SELECT DISTINCT document FROM `tblDocumentFiles` WHERE `date` > ".$startts." AND `date` < ".$endts; + if(0) { + $queryStr = "SELECT DISTINCT `document` FROM `tblDocumentContent` WHERE `date` > ".$startts." AND `date` < ".$endts." UNION SELECT DISTINCT `document` FROM `tblDocumentFiles` WHERE `date` > ".$startts." AND `date` < ".$endts; + } else { + $startdate = date('Y-m-d H:i:s', $startts); + $enddate = date('Y-m-d H:i:s', $endts); + $queryStr = "SELECT DISTINCT `documentID` AS `document` FROM `tblDocumentStatus` LEFT JOIN `tblDocumentStatusLog` ON `tblDocumentStatus`.`statusId`=`tblDocumentStatusLog`.`statusID` WHERE `date` > ".$this->db->qstr($startdate)." AND `date` < ".$this->db->qstr($enddate)." UNION SELECT DISTINCT document FROM `tblDocumentFiles` WHERE `date` > ".$this->db->qstr($startdate)." AND `date` < ".$this->db->qstr($enddate)." UNION SELECT DISTINCT `document` FROM `tblDocumentFiles` WHERE `date` > ".$startts." AND `date` < ".$endts; + } $resArr = $this->db->getResultArray($queryStr); if ($resArr === false) return false; diff --git a/SeedDMS_Core/package.xml b/SeedDMS_Core/package.xml index d127af311..43aa9050f 100644 --- a/SeedDMS_Core/package.xml +++ b/SeedDMS_Core/package.xml @@ -24,7 +24,7 @@ GPL License -- no changes +- SeedDMS_Core_DMS::getTimeline() uses status log instead of document content From ea37036bb145af746716d8352bc1cbfac916ff6d Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 7 May 2021 11:45:23 +0200 Subject: [PATCH 164/403] add obsolete documents --- views/bootstrap/class.Timeline.php | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/views/bootstrap/class.Timeline.php b/views/bootstrap/class.Timeline.php index c9257142d..7b15ecd6e 100644 --- a/views/bootstrap/class.Timeline.php +++ b/views/bootstrap/class.Timeline.php @@ -182,6 +182,11 @@ div.timeline-frame { border-color: #e3e3e3; } +div.add_file { + background-color: #E5D5F5; + border-color: #AA9ABA; +} + div.status_change_2 { background-color: #DAF6D5; border-color: #AAF897; @@ -192,6 +197,16 @@ div.status_change_-1 { border-color: #F89797; } +div.status_change_-2 { + background-color: #eee; + border-color: #ccc; +} + +div.status_change_-3 { + background-color: #eee; + border-color: #ccc; +} + div.timeline-event-selected { background-color: #fff785; border-color: #ffc200; @@ -253,6 +268,7 @@ div.timeline-event-selected { '.getMLText('timeline_skip_status_change_2').'
      '.getMLText('timeline_skip_status_change_3').'
      '.getMLText('timeline_skip_status_change_-1').'
      + '.getMLText('timeline_skip_status_change_-2').'
      '.getMLText('timeline_skip_status_change_-3').'
      '; $this->formField( getMLText("exclude_items"), From 543890e4eb1e08bc5324c812e5607f33438e6524 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 7 May 2021 13:22:57 +0200 Subject: [PATCH 165/403] add class SeedDMS_JwtToken --- inc/inc.Utils.php | 61 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/inc/inc.Utils.php b/inc/inc.Utils.php index 9492e45d4..64633ad8a 100644 --- a/inc/inc.Utils.php +++ b/inc/inc.Utils.php @@ -951,6 +951,67 @@ class SeedDMS_CSRF { /* {{{ */ } /* }}} */ } /* }}} */ +/** + * Class to represent a jwt token + * + * + * @category DMS + * @package SeedDMS + * @author Uwe Steinmann + * @copyright 2016 Uwe Steinmann + * @version Release: @package_version@ + */ +class SeedDMS_JwtToken { /* {{{ */ + protected $jwtsecret; + + public function __construct($jwtsecret = '') { /* {{{ */ + $this->jwtsecret = $jwtsecret; + } /* }}} */ + + public function jwtEncode($payload) { /* {{{ */ + $header = [ + "alg" => "HS256", + "typ" => "JWT" + ]; + $encHeader = self::base64UrlEncode(json_encode($header)); + $encPayload = self::base64UrlEncode(json_encode($payload)); + $hash = self::base64UrlEncode(self::calculateHash($encHeader, $encPayload)); + + return "$encHeader.$encPayload.$hash"; + } /* }}} */ + + public function jwtDecode($token) { /* {{{ */ + if (!$this->jwtsecret) return ""; + + $split = explode(".", $token); + if (count($split) != 3) return ""; + + $hash = self::base64UrlEncode(self::calculateHash($split[0], $split[1])); + + if (strcmp($hash, $split[2]) != 0) return ""; + return self::base64UrlDecode($split[1]); + } /* }}} */ + + protected function calculateHash($encHeader, $encPayload) { /* {{{ */ + return hash_hmac("sha256", "$encHeader.$encPayload", $this->jwtsecret, true); + } /* }}} */ + + protected function base64UrlEncode($str) { /* {{{ */ + return str_replace("/", "_", str_replace("+", "-", trim(base64_encode($str), "="))); + } /* }}} */ + + protected function base64UrlDecode($payload) { /* {{{ */ + $b64 = str_replace("_", "/", str_replace("-", "+", $payload)); + switch (strlen($b64) % 4) { + case 2: + $b64 = $b64 . "=="; break; + case 3: + $b64 = $b64 . "="; break; + } + return base64_decode($b64); + } /* }}} */ +} /* }}} */ + class SeedDMS_FolderTree { /* {{{ */ public function __construct($folder, $callback) { /* {{{ */ From 38b18488d8606f090f0a23c4b556a17927715cbf Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 7 May 2021 15:48:07 +0200 Subject: [PATCH 166/403] show path of document/folder instead of comment --- views/bootstrap/class.Clipboard.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/views/bootstrap/class.Clipboard.php b/views/bootstrap/class.Clipboard.php index b2df501e0..063a34808 100644 --- a/views/bootstrap/class.Clipboard.php +++ b/views/bootstrap/class.Clipboard.php @@ -119,9 +119,12 @@ class SeedDMS_View_Clipboard extends SeedDMS_Theme_Style { $content .= $this->folderListRowStart($folder); $content .= "getID()."&showtree=".showtree()."\">getMimeIcon(".folder")."\" width=\"24\" height=\"24\" border=0>\n"; $content .= "getID()."&showtree=".showtree()."\">" . htmlspecialchars($folder->getName()) . ""; + /* if($comment) { $content .= "
      ".htmlspecialchars($comment).""; } + */ + $content .= $this->getListRowPath($folder); $content .= "\n"; $content .= "\n"; $content .= ""; @@ -165,9 +168,12 @@ class SeedDMS_View_Clipboard extends SeedDMS_Theme_Style { $content .= "getMimeIcon($latestContent->getFileType())."\" title=\"".htmlspecialchars($latestContent->getMimeType())."\">"; $content .= "getID()."&showtree=".showtree()."\">" . htmlspecialchars($document->getName()) . ""; + /* if($comment) { $content .= "
      ".htmlspecialchars($comment).""; } + */ + $content .= $this->getListRowPath($document); $content .= "\n"; $content .= "\n"; $content .= ""; From e4f4a52ed686062ac3d0762b5e50d3854985ae5c Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 7 May 2021 15:48:27 +0200 Subject: [PATCH 167/403] add changes for 5.1.23 --- CHANGELOG | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG b/CHANGELOG index 788252e05..be218e41a 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -9,6 +9,7 @@ RemoveFolder::run was called more than once - fix php error setting mandatory workflow when uploading documents via webdav - typeahead search for folders can search in subfolders +- new theme based on bootstrap 4, including many improvements on small displays -------------------------------------------------------------------------------- Changes in version 5.1.22 From ed4b5e34a41f1c2ffc08a9090ff566dc3a1028e9 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 7 May 2021 17:35:29 +0200 Subject: [PATCH 168/403] item in list with badges can be set active --- views/bootstrap/class.Bootstrap.php | 2 +- views/bootstrap4/class.Bootstrap4.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/views/bootstrap/class.Bootstrap.php b/views/bootstrap/class.Bootstrap.php index 81f1f640e..79f27fac7 100644 --- a/views/bootstrap/class.Bootstrap.php +++ b/views/bootstrap/class.Bootstrap.php @@ -589,7 +589,7 @@ background-image: linear-gradient(to bottom, #882222, #111111);; $content = ''; $content .= "\n"; foreach($menuitems as $menuitem) { - $content .= "
    • \n"; + $content .= "
    • \n"; $content .= ' \n"; foreach($menuitems as $menuitem) { - $content .= "
    • \n"; + $content .= "
    • \n"; $content .= ' Date: Sun, 9 May 2021 08:12:49 +0200 Subject: [PATCH 169/403] add missing space between attributes of html tag --- views/bootstrap4/class.Bootstrap4.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/bootstrap4/class.Bootstrap4.php b/views/bootstrap4/class.Bootstrap4.php index 13b6d72f7..ed720ed63 100644 --- a/views/bootstrap4/class.Bootstrap4.php +++ b/views/bootstrap4/class.Bootstrap4.php @@ -1337,7 +1337,7 @@ background-image: linear-gradient(to bottom, #882222, #111111);; '; if($config['buttons']) { foreach($config['buttons'] as $button) - $content .= ''; + $content .= ''; } $content .= '
    • From c37802fdca2b62b6a842061186e174b262baf5f3 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Sun, 9 May 2021 13:48:36 +0200 Subject: [PATCH 170/403] add opitonal parameter $new to createRawPreview() and createPreview() --- SeedDMS_Preview/Preview/Previewer.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/SeedDMS_Preview/Preview/Previewer.php b/SeedDMS_Preview/Preview/Previewer.php index ba69b75a4..44a79837c 100644 --- a/SeedDMS_Preview/Preview/Previewer.php +++ b/SeedDMS_Preview/Preview/Previewer.php @@ -89,7 +89,7 @@ class SeedDMS_Preview_Previewer extends SeedDMS_Preview_Base { * @param string $target optional name of preview image (without extension) * @return boolean true on success, false on failure */ - public function createRawPreview($infile, $dir, $mimetype, $width=0, $target='') { /* {{{ */ + public function createRawPreview($infile, $dir, $mimetype, $width=0, $target='', &$new=false) { /* {{{ */ if($width == 0) $width = $this->width; else @@ -120,6 +120,7 @@ class SeedDMS_Preview_Previewer extends SeedDMS_Preview_Base { if($cmd) { try { self::execWithTimeout($cmd, $this->timeout); + $new = true; } catch(Exception $e) { $this->lastpreviewfile = ''; return false; @@ -144,7 +145,7 @@ class SeedDMS_Preview_Previewer extends SeedDMS_Preview_Base { * @param integer $width desired width of preview image * @return boolean true on success, false on failure */ - public function createPreview($object, $width=0) { /* {{{ */ + public function createPreview($object, $width=0, &$new=false) { /* {{{ */ if(!$object) return false; @@ -155,7 +156,7 @@ class SeedDMS_Preview_Previewer extends SeedDMS_Preview_Base { $document = $object->getDocument(); $file = $document->_dms->contentDir.$object->getPath(); $target = $this->getFileName($object, $width); - return $this->createRawPreview($file, $document->getDir(), $object->getMimeType(), $width, $target); + return $this->createRawPreview($file, $document->getDir(), $object->getMimeType(), $width, $target, $new); } /* }}} */ /** From 4f59c3b4e835d5ae076d0d899b594af3f53ed56b Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Mon, 10 May 2021 08:54:18 +0200 Subject: [PATCH 171/403] execWithTimeout() closes all pipes and also returns return value of cmd --- SeedDMS_Lucene/Lucene/IndexedDocument.php | 16 ++++++++++++--- SeedDMS_Preview/Preview/Base.php | 14 ++++++++++++- SeedDMS_Preview/Preview/Previewer.php | 1 + .../SQLiteFTS/IndexedDocument.php | 20 +++++++++++++++++-- 4 files changed, 45 insertions(+), 6 deletions(-) diff --git a/SeedDMS_Lucene/Lucene/IndexedDocument.php b/SeedDMS_Lucene/Lucene/IndexedDocument.php index f4ef10432..a0b1b8ae7 100644 --- a/SeedDMS_Lucene/Lucene/IndexedDocument.php +++ b/SeedDMS_Lucene/Lucene/IndexedDocument.php @@ -40,9 +40,11 @@ class SeedDMS_Lucene_IndexedDocument extends Zend_Search_Lucene_Document { protected $cmd; /** + * Run a shell command + * * @param $cmd * @param int $timeout - * @return string + * @return array * @throws Exception */ static function execWithTimeout($cmd, $timeout=2) { /* {{{ */ @@ -54,7 +56,11 @@ class SeedDMS_Lucene_IndexedDocument extends Zend_Search_Lucene_Document { $pipes = array(); $timeout += time(); - $process = proc_open($cmd, $descriptorspec, $pipes); + // Putting an 'exec' before the command will not fork the command + // and therefore not create any child process. proc_terminate will + // then reliably terminate the cmd and not just shell. See notes of + // https://www.php.net/manual/de/function.proc-terminate.php + $process = proc_open('exec '.$cmd, $descriptorspec, $pipes); if (!is_resource($process)) { throw new Exception("proc_open failed on: " . $cmd); } @@ -79,11 +85,15 @@ class SeedDMS_Lucene_IndexedDocument extends Zend_Search_Lucene_Document { $timeleft = $timeout - time(); } while (!feof($pipes[1]) && $timeleft > 0); + fclose($pipes[0]); + fclose($pipes[1]); + fclose($pipes[2]); if ($timeleft <= 0) { proc_terminate($process); throw new Exception("command timeout on: " . $cmd); } else { - return array('stdout'=>$output, 'stderr'=>$error); + $return_value = proc_close($process); + return array('stdout'=>$output, 'stderr'=>$error, 'return'=>$return_value); } } /* }}} */ diff --git a/SeedDMS_Preview/Preview/Base.php b/SeedDMS_Preview/Preview/Base.php index 572bb521d..b58b6775b 100644 --- a/SeedDMS_Preview/Preview/Base.php +++ b/SeedDMS_Preview/Preview/Base.php @@ -70,6 +70,14 @@ class SeedDMS_Preview_Base { $this->xsendfile = $xsendfile; } /* }}} */ + /** + * Run a shell command + * + * @param $cmd + * @param int $timeout + * @return array + * @throws Exception + */ static function execWithTimeout($cmd, $timeout=5) { /* {{{ */ $descriptorspec = array( 0 => array("pipe", "r"), @@ -108,11 +116,15 @@ class SeedDMS_Preview_Base { $timeleft = $timeout - time(); } while (!feof($pipes[1]) && $timeleft > 0); + fclose($pipes[0]); + fclose($pipes[1]); + fclose($pipes[2]); if ($timeleft <= 0) { proc_terminate($process); throw new Exception("command timeout on: " . $cmd); } else { - return array('stdout'=>$output, 'stderr'=>$error); + $return_value = proc_close($process); + return array('stdout'=>$output, 'stderr'=>$error, 'return'=>$return_value); } } /* }}} */ diff --git a/SeedDMS_Preview/Preview/Previewer.php b/SeedDMS_Preview/Preview/Previewer.php index 44a79837c..32a06cc89 100644 --- a/SeedDMS_Preview/Preview/Previewer.php +++ b/SeedDMS_Preview/Preview/Previewer.php @@ -128,6 +128,7 @@ class SeedDMS_Preview_Previewer extends SeedDMS_Preview_Base { } return true; } + $new = false; return true; } /* }}} */ diff --git a/SeedDMS_SQLiteFTS/SQLiteFTS/IndexedDocument.php b/SeedDMS_SQLiteFTS/SQLiteFTS/IndexedDocument.php index 7c235976b..eb551ed4d 100644 --- a/SeedDMS_SQLiteFTS/SQLiteFTS/IndexedDocument.php +++ b/SeedDMS_SQLiteFTS/SQLiteFTS/IndexedDocument.php @@ -44,6 +44,14 @@ class SeedDMS_SQLiteFTS_IndexedDocument extends SeedDMS_SQLiteFTS_Document { */ protected $cmd; + /** + * Run a shell command + * + * @param $cmd + * @param int $timeout + * @return array + * @throws Exception + */ static function execWithTimeout($cmd, $timeout=2) { /* {{{ */ $descriptorspec = array( 0 => array("pipe", "r"), @@ -53,7 +61,11 @@ class SeedDMS_SQLiteFTS_IndexedDocument extends SeedDMS_SQLiteFTS_Document { $pipes = array(); $timeout += time(); - $process = proc_open($cmd, $descriptorspec, $pipes); + // Putting an 'exec' before the command will not fork the command + // and therefore not create any child process. proc_terminate will + // then reliably terminate the cmd and not just shell. See notes of + // https://www.php.net/manual/de/function.proc-terminate.php + $process = proc_open('exec '.$cmd, $descriptorspec, $pipes); if (!is_resource($process)) { throw new Exception("proc_open failed on: " . $cmd); } @@ -78,11 +90,15 @@ class SeedDMS_SQLiteFTS_IndexedDocument extends SeedDMS_SQLiteFTS_Document { $timeleft = $timeout - time(); } while (!feof($pipes[1]) && $timeleft > 0); + fclose($pipes[0]); + fclose($pipes[1]); + fclose($pipes[2]); if ($timeleft <= 0) { proc_terminate($process); throw new Exception("command timeout on: " . $cmd); } else { - return array('stdout'=>$output, 'stderr'=>$error); + $return_value = proc_close($process); + return array('stdout'=>$output, 'stderr'=>$error, 'return'=>$return_value); } } /* }}} */ From 175dd6902de0dff9ac23c12eba797d2cec98dad1 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Mon, 10 May 2021 09:00:55 +0200 Subject: [PATCH 172/403] update package info --- SeedDMS_Lucene/package.xml | 24 ++++++++++++++++++++---- SeedDMS_Preview/package.xml | 26 ++++++++++++++++++++++---- SeedDMS_SQLiteFTS/package.xml | 3 ++- 3 files changed, 44 insertions(+), 9 deletions(-) diff --git a/SeedDMS_Lucene/package.xml b/SeedDMS_Lucene/package.xml index 8d80f829e..01192ead0 100644 --- a/SeedDMS_Lucene/package.xml +++ b/SeedDMS_Lucene/package.xml @@ -11,11 +11,11 @@ uwe@steinmann.cx yes - 2020-12-12 + 2021-05-10 - 1.1.16 - 1.1.16 + 1.1.17 + 1.1.17 stable @@ -23,7 +23,7 @@ GPL License -- add indexing of folders +- close pipes in execWithTimeout(), also return exit code of command @@ -352,5 +352,21 @@ Index users with at least read access on the document and SeedDMS_Lucene_Indexer::open() + + 2020-12-12 + + + 1.1.16 + 1.1.16 + + + stable + stable + + GPL License + +- add indexing of folders + + diff --git a/SeedDMS_Preview/package.xml b/SeedDMS_Preview/package.xml index 715278e1a..fa544e705 100644 --- a/SeedDMS_Preview/package.xml +++ b/SeedDMS_Preview/package.xml @@ -14,8 +14,8 @@ 2020-12-23 - 1.3.2 - 1.3.1 + 1.3.3 + 1.3.3 stable @@ -23,8 +23,9 @@ GPL License -set header Content-Length -update package description +- close pipes in execWithTimeout(), also return exit code of command +- createPreview() has optional parameter by referenz to return true if a + preview image was actually created @@ -453,5 +454,22 @@ add new methode getPreviewFile() add parameter $target to SeedDMS_Preview_pdfPreviewer::hasRawPreview() and SeedDMS_Preview_pdfPreviewer::getRawPreview() + + 2020-12-23 + + + 1.3.2 + 1.3.1 + + + stable + stable + + GPL License + +set header Content-Length +update package description + + diff --git a/SeedDMS_SQLiteFTS/package.xml b/SeedDMS_SQLiteFTS/package.xml index 1fddaeb00..8e05d96ef 100644 --- a/SeedDMS_SQLiteFTS/package.xml +++ b/SeedDMS_SQLiteFTS/package.xml @@ -11,7 +11,7 @@ uwe@steinmann.cx yes - 2021-04-19 + 2021-05-10 1.0.16 @@ -23,6 +23,7 @@ GPL License +- close pipes in execWithTimeout(), also return exit code of command - add support for fts5 (make it the default) From bc4a1b5dac72d0095e29aaba3720c426d7e6b606 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Mon, 10 May 2021 09:01:20 +0200 Subject: [PATCH 173/403] propperly check for translation of html body (Closes: #510) --- inc/inc.ClassEmailNotify.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/inc.ClassEmailNotify.php b/inc/inc.ClassEmailNotify.php index 5100d2e2e..b5b1905de 100644 --- a/inc/inc.ClassEmailNotify.php +++ b/inc/inc.ClassEmailNotify.php @@ -133,7 +133,7 @@ class SeedDMS_EmailNotify extends SeedDMS_Notify { } $bodyhtml = ''; - if(isset($params['__body_html__']) || getMLText($messagekey.'_html')) { + if(isset($params['__body_html__']) || getMLText($messagekey.'_html', $params, "", $lang)) { if(!isset($params['__skip_header__']) || !$params['__skip_header__']) { if(!isset($params['__header_html__'])) $bodyhtml .= getMLText("email_header_html", $params, "", $lang)."\r\n\r\n"; From 2bc5ce80d752bd88b28a50f7474e4bbdbec52703 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Mon, 10 May 2021 09:02:27 +0200 Subject: [PATCH 174/403] closes #510 --- CHANGELOG | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG b/CHANGELOG index be218e41a..9860636a0 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -10,6 +10,7 @@ - fix php error setting mandatory workflow when uploading documents via webdav - typeahead search for folders can search in subfolders - new theme based on bootstrap 4, including many improvements on small displays +- propperly check for translation of html email body (Closes: #510) -------------------------------------------------------------------------------- Changes in version 5.1.22 From 4d9a36b080667cf6f9958c6d9ea275168d8484b2 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 11 May 2021 17:20:08 +0200 Subject: [PATCH 175/403] make string of $seq, otherwise a 0 value can be set --- views/bootstrap/class.AddDocument.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/bootstrap/class.AddDocument.php b/views/bootstrap/class.AddDocument.php index d36f18b4f..5f6af7493 100644 --- a/views/bootstrap/class.AddDocument.php +++ b/views/bootstrap/class.AddDocument.php @@ -259,7 +259,7 @@ $(document).ready(function() { 'element'=>'input', 'type'=>'hidden', 'name'=>'sequence', - 'value'=>$seq, + 'value'=>(string) $seq, ) ); } From fb366307bfd76b3c5f33a119b69c725402379286 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 11 May 2021 17:21:11 +0200 Subject: [PATCH 176/403] fix second parameter of showEndPaneContent() --- views/bootstrap/class.Settings.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/views/bootstrap/class.Settings.php b/views/bootstrap/class.Settings.php index d03deeec8..0621e2da0 100644 --- a/views/bootstrap/class.Settings.php +++ b/views/bootstrap/class.Settings.php @@ -38,10 +38,10 @@ class SeedDMS_View_Settings extends SeedDMS_Theme_Style { echo ''; } /* }}} */ - protected function showEndPaneContent($name, $currentab) { /* {{{ */ + protected function showEndPaneContent($name, $currenttab) { /* {{{ */ echo ''; $this->contentContainerEnd(); - parent::showEndPaneContent($name, $isactive); + parent::showEndPaneContent($name, $currenttab); } /* }}} */ protected function getTextField($name, $value, $type='', $placeholder='') { /* {{{ */ From c0120b0a1d6d432dda0412a090788f49ebcb6709 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 11 May 2021 21:18:15 +0200 Subject: [PATCH 177/403] do not call get_magic_quotes_gpc() anymore --- inc/inc.Settings.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/inc.Settings.php b/inc/inc.Settings.php index 2515be2a5..df11ccada 100644 --- a/inc/inc.Settings.php +++ b/inc/inc.Settings.php @@ -47,7 +47,7 @@ if(isset($settings->_maxExecutionTime)) { } } -if (get_magic_quotes_gpc()) { +if (function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc()) { $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST); while (list($key, $val) = each($process)) { foreach ($val as $k => $v) { From d1bd50fa24a859b2db6aed5595128b583fea98e8 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 11 May 2021 21:18:36 +0200 Subject: [PATCH 178/403] support for 5.1.23 --- out/out.Help.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/out/out.Help.php b/out/out.Help.php index 3a6c70816..7de5bd165 100644 --- a/out/out.Help.php +++ b/out/out.Help.php @@ -29,6 +29,7 @@ require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1]); +$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if(isset($_GET['context'])) $context = $_GET['context']; @@ -38,6 +39,7 @@ if($view) { $view->setParam('dms', $dms); $view->setParam('user', $user); $view->setParam('context', $context); + $view->setParam('accessobject', $accessop); $view($_GET); exit; } From a4935f608bd6379005f2dbae78260c094fd568ec Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Wed, 12 May 2021 08:43:09 +0200 Subject: [PATCH 179/403] remove old magic_quote code for compatibility with php 8 --- op/op.Login.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/op/op.Login.php b/op/op.Login.php index 1e10dd214..1cd9ebce6 100644 --- a/op/op.Login.php +++ b/op/op.Login.php @@ -60,9 +60,6 @@ if (!isset($login) || strlen($login)==0) { $pwd = ''; if(isset($_POST['pwd'])) { $pwd = (string) $_POST["pwd"]; - if (get_magic_quotes_gpc()) { - $pwd = stripslashes($pwd); - } } $lang = ''; From 1575cdb1545006f58a715ed7acd296e73fe6f2ec Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Wed, 12 May 2021 09:35:42 +0200 Subject: [PATCH 180/403] remove old call of sanitizeString() --- views/bootstrap/class.Login.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/bootstrap/class.Login.php b/views/bootstrap/class.Login.php index 8cfa31ff4..eaa0277c7 100644 --- a/views/bootstrap/class.Login.php +++ b/views/bootstrap/class.Login.php @@ -123,7 +123,7 @@ $(document).ready( function() {
      "; + echo ""; } $this->formField( getMLText("user_login"), From c60f8f660da431ac0232611d44826e520a0db410 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Wed, 12 May 2021 09:36:39 +0200 Subject: [PATCH 181/403] fix layout --- views/bootstrap/class.ChangePassword.php | 14 +++++--------- views/bootstrap/class.ForcePasswordChange.php | 4 ++-- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/views/bootstrap/class.ChangePassword.php b/views/bootstrap/class.ChangePassword.php index 158f8e462..16fb77807 100644 --- a/views/bootstrap/class.ChangePassword.php +++ b/views/bootstrap/class.ChangePassword.php @@ -61,17 +61,13 @@ document.form1.newpassword.focus(); $this->contentContainerStart(); $this->formField( getMLText("password"), - '' + '' ); if($passwordstrength > 0) { -?> -
      - -
      -
      -
      -
      -formField( + getMLText("password_strength"), + '
      ' + ); } $this->formField( getMLText("confirm_pwd"), diff --git a/views/bootstrap/class.ForcePasswordChange.php b/views/bootstrap/class.ForcePasswordChange.php index c1bf33a31..21fa72f76 100644 --- a/views/bootstrap/class.ForcePasswordChange.php +++ b/views/bootstrap/class.ForcePasswordChange.php @@ -93,12 +93,12 @@ $(document).ready( function() { ); $this->formField( getMLText("new_password"), - '' + '' ); if($passwordstrength) { $this->formField( getMLText("password_strength"), - '
      ' + '
      ' ); } $this->formField( From 1e20ddcddfad352dca587e5f3ea23fcdefdf83cb Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Wed, 12 May 2021 09:37:06 +0200 Subject: [PATCH 182/403] remove SeedDMS_AccessOperation --- out/out.PasswordSend.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/out/out.PasswordSend.php b/out/out.PasswordSend.php index 2c45ad807..c4ad611ee 100644 --- a/out/out.PasswordSend.php +++ b/out/out.PasswordSend.php @@ -23,6 +23,7 @@ if(!isset($settings)) require_once("inc/inc.LogInit.php"); require_once("inc/inc.Language.php"); require_once("inc/inc.Init.php"); +require_once("inc/inc.DBInit.php"); require_once("inc/inc.Extension.php"); require_once("inc/inc.ClassUI.php"); @@ -35,9 +36,7 @@ if (isset($_REQUEST["referuri"]) && strlen($_REQUEST["referuri"])>0) { } $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('referrer'=>$referrer)); -$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if($view) { - $view->setParam('accessobject', $accessop); $view->setParam('referrer', $referrer); $view($_GET); } From 67511017bd1e06ce097c081cd7df75c29a93dc28 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Wed, 12 May 2021 09:37:27 +0200 Subject: [PATCH 183/403] remove SeedDMS_AccessOperation --- out/out.ChangePassword.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/out/out.ChangePassword.php b/out/out.ChangePassword.php index 48003a9b9..35baaff55 100644 --- a/out/out.ChangePassword.php +++ b/out/out.ChangePassword.php @@ -44,8 +44,6 @@ if (isset($_REQUEST["hash"]) && strlen($_REQUEST["hash"])>0) { $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $view = UI::factory($theme, $tmp[1], array('dms'=>$dms, 'referuri'=>$referuri, 'hash'=>$hash, 'passwordstrength'=>$settings->_passwordStrength)); -$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); if($view) { - $view->setParam('accessobject', $accessop); $view($_GET); } From 9a417a94600bc2c2612cb41975666787b4e84c8e Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Wed, 12 May 2021 09:37:48 +0200 Subject: [PATCH 184/403] include inc/inc.ClassAccessOperation.php --- op/op.ChangePassword.php | 1 + 1 file changed, 1 insertion(+) diff --git a/op/op.ChangePassword.php b/op/op.ChangePassword.php index f2c9aa5ca..da4c6f32c 100644 --- a/op/op.ChangePassword.php +++ b/op/op.ChangePassword.php @@ -27,6 +27,7 @@ include("../inc/inc.Extension.php"); include("../inc/inc.ClassSession.php"); include("../inc/inc.DBInit.php"); include("../inc/inc.ClassUI.php"); +require_once("../inc/inc.ClassAccessOperation.php"); function _printMessage($heading, $message) { From 95f4485382455552c5a88f727768dc9c820b9852 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Wed, 12 May 2021 11:39:30 +0200 Subject: [PATCH 185/403] add bootstrap4 to view --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 30f8a8a4b..0473b9308 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ VERSION=$(shell php -r 'include("inc/inc.Version.php"); $$v=new SeedDMS_Version(); echo $$v->version();') SRC=CHANGELOG inc conf utils index.php .htaccess languages op out controllers doc TODO LICENSE webdav install restapi pdfviewer -VIEWS ?= bootstrap +VIEWS ?= bootstrap bootstrap4 NODISTFILES=utils/importmail.php utils/seedddms-importmail utils/remote-email-upload utils/remote-upload utils/da-bv-reminder.php utils/seeddms-da-bv-reminder .svn .gitignore From c56901147b6fc5eb0ddaaa12630e8baa0b17447c Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Wed, 12 May 2021 15:32:25 +0200 Subject: [PATCH 186/403] add class action-list to list of version actions --- views/bootstrap/class.ViewDocument.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/bootstrap/class.ViewDocument.php b/views/bootstrap/class.ViewDocument.php index 99ffbcaab..497c9dda6 100644 --- a/views/bootstrap/class.ViewDocument.php +++ b/views/bootstrap/class.ViewDocument.php @@ -444,7 +444,7 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Theme_Style { } /* }}} */ protected function showActions($items) { /* {{{ */ - print "
        "; + print "
          "; foreach($items as $item) { if(is_string($item)) echo "
        • ".$item."
        • "; From 0b2ba1a8936aa408681e015f89ef79a70db2a1c8 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Thu, 13 May 2021 16:46:18 +0200 Subject: [PATCH 187/403] fix layout of filter field --- views/bootstrap/class.ExtensionMgr.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/bootstrap/class.ExtensionMgr.php b/views/bootstrap/class.ExtensionMgr.php index 9dc1921a8..4ec1e035a 100644 --- a/views/bootstrap/class.ExtensionMgr.php +++ b/views/bootstrap/class.ExtensionMgr.php @@ -276,7 +276,7 @@ class SeedDMS_View_ExtensionMgr extends SeedDMS_Theme_Style {
        - +
        installedList(); From e76581f5b1f0bf70b0ab900a0ab0d588c24af9f9 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Thu, 13 May 2021 17:01:55 +0200 Subject: [PATCH 188/403] add new and some missing translations --- languages/ar_EG/lang.inc | 9 +++ languages/bg_BG/lang.inc | 9 +++ languages/ca_ES/lang.inc | 9 +++ languages/cs_CZ/lang.inc | 9 +++ languages/de_DE/lang.inc | 33 ++++++---- languages/el_GR/lang.inc | 9 +++ languages/en_GB/lang.inc | 39 +++++++----- languages/es_ES/lang.inc | 9 +++ languages/fr_FR/lang.inc | 127 +++++++++++++++++++++------------------ languages/hr_HR/lang.inc | 9 +++ languages/hu_HU/lang.inc | 9 +++ languages/it_IT/lang.inc | 9 +++ languages/ko_KR/lang.inc | 9 +++ languages/lo_LA/lang.inc | 9 +++ languages/nb_NO/lang.inc | 9 +++ languages/nl_NL/lang.inc | 9 +++ languages/pl_PL/lang.inc | 9 +++ languages/pt_BR/lang.inc | 9 +++ languages/ro_RO/lang.inc | 9 +++ languages/ru_RU/lang.inc | 9 +++ languages/sk_SK/lang.inc | 9 +++ languages/sv_SE/lang.inc | 9 +++ languages/tr_TR/lang.inc | 9 +++ languages/uk_UA/lang.inc | 9 +++ languages/zh_CN/lang.inc | 9 +++ languages/zh_TW/lang.inc | 9 +++ 26 files changed, 322 insertions(+), 84 deletions(-) diff --git a/languages/ar_EG/lang.inc b/languages/ar_EG/lang.inc index 7976d05e8..3d9ce60ba 100644 --- a/languages/ar_EG/lang.inc +++ b/languages/ar_EG/lang.inc @@ -95,6 +95,7 @@ URL: [url]', 'all_users' => 'كل المستخدمين', 'already_subscribed' => 'بالفعل مشترك', 'and' => 'و', +'apikey' => '', 'apply' => 'تطبيق', 'approvals_accepted' => 'موافقةالطلب', 'approvals_accepted_latest' => '', @@ -257,6 +258,7 @@ URL: [url]', 'checkedout_file_is_unchanged' => 'لم يتم تغيير سحب الملف', 'checkin_document' => 'ملف', 'checkoutpath_does_not_exist' => 'سير السحب غير موجود', +'checkout_cancel_confirm' => '', 'checkout_document' => 'سحب الملف', 'checkout_is_disabled' => 'السحب معطل', 'choose_attrdef' => 'من فضلك اختر تعريف السمة', @@ -837,6 +839,7 @@ URL: [url]', 'my_transmittals' => 'الإحالات الخاصة بي', 'name' => 'اسم', 'nav_brand_admin_tools' => 'أدوات-الإدارة', +'nav_brand_calendar' => '', 'nav_brand_my_account' => 'حسابي', 'nav_brand_my_documents' => '', 'nav_brand_view_document' => '', @@ -965,6 +968,8 @@ URL: [url]', 'password_forgotten_send_hash' => 'تم ارسال التعليمات اللازمة لبريدك الالكتروني', 'password_forgotten_text' => 'قم بملء النموذج التالي واتبع التعليمات التى سيتم ارسالها اليك بالبريد الالكتروني', 'password_forgotten_title' => 'ارسال كلمة السر', +'password_mismatch_error' => '', +'password_mismatch_error_title' => '', 'password_repeat' => 'تكرار كلمة السر', 'password_send' => 'أرسل كلمة السر', 'password_send_text' => 'أرسل نموذج كلمة السر', @@ -1182,6 +1187,7 @@ URL: [url]', 'search' => 'البحث', 'search_fulltext' => 'بحث في النص الكامل', 'search_in' => 'بحث في', +'search_mode' => '', 'search_mode_and' => 'كل الكلمات', 'search_mode_documents' => 'وضع البحث عن مستندات', 'search_mode_folders' => 'وضع البحث عن مجلدات', @@ -1223,6 +1229,7 @@ URL: [url]', 'select_mimetype' => '', 'select_one' => 'اختر واحد', 'select_owner' => '', +'select_status' => '', 'select_user' => 'اختر مستخدم', 'select_users' => 'اضغط لاختيار المستخدم', 'select_value' => 'ًاختار قيمة', @@ -1813,6 +1820,7 @@ URL: [url]', 'timeline_skip_add_file' => 'تخطى وأضف ملف', 'timeline_skip_scheduled_revision' => 'تخطي المراجعة المحددة في التاريخ', 'timeline_skip_status_change_-1' => 'تخطي تغيير الحالة -1', +'timeline_skip_status_change_-2' => '', 'timeline_skip_status_change_-3' => 'تخطي تغيير الحالة -3', 'timeline_skip_status_change_0' => 'تخطي تغيير الحالة 0', 'timeline_skip_status_change_1' => 'تخطي تغيير الحالة 1', @@ -1871,6 +1879,7 @@ URL: [url]', 'unknown_id' => 'معرف مجهول', 'unknown_keyword_category' => 'قسم مجهول', 'unknown_owner' => 'معرف مالك مجهول', +'unknown_status' => '', 'unknown_user' => 'معرف مستخدم مجهول', 'unlinked_content' => 'محتوى غير مربوط', 'unlinked_documents' => 'مستندات غير مربوطة', diff --git a/languages/bg_BG/lang.inc b/languages/bg_BG/lang.inc index bda2b786d..82d16f625 100644 --- a/languages/bg_BG/lang.inc +++ b/languages/bg_BG/lang.inc @@ -91,6 +91,7 @@ $text = array( 'all_users' => 'Всички потребители', 'already_subscribed' => 'Вече е подписан', 'and' => 'и', +'apikey' => '', 'apply' => 'Приложи', 'approvals_accepted' => '', 'approvals_accepted_latest' => '', @@ -240,6 +241,7 @@ $text = array( 'checkedout_file_is_unchanged' => '', 'checkin_document' => '', 'checkoutpath_does_not_exist' => '', +'checkout_cancel_confirm' => '', 'checkout_document' => '', 'checkout_is_disabled' => '', 'choose_attrdef' => 'Изберете attribute definition', @@ -766,6 +768,7 @@ $text = array( 'my_transmittals' => 'Моите предавания', 'name' => 'Име', 'nav_brand_admin_tools' => 'Администрация', +'nav_brand_calendar' => '', 'nav_brand_my_account' => 'Моя акаунт', 'nav_brand_my_documents' => '', 'nav_brand_view_document' => '', @@ -864,6 +867,8 @@ $text = array( 'password_forgotten_send_hash' => 'Инструкциите са изпратени на email', 'password_forgotten_text' => 'Попълнете формата и следвайте инструкциите в писмото', 'password_forgotten_title' => 'Парола изпратена', +'password_mismatch_error' => '', +'password_mismatch_error_title' => '', 'password_repeat' => 'Повторете паролата', 'password_send' => '', 'password_send_text' => '', @@ -1045,6 +1050,7 @@ $text = array( 'search' => 'Търсене', 'search_fulltext' => 'Пълнотекстово търсене', 'search_in' => 'Търси в', +'search_mode' => '', 'search_mode_and' => 'всички думи', 'search_mode_documents' => '', 'search_mode_folders' => '', @@ -1086,6 +1092,7 @@ $text = array( 'select_mimetype' => '', 'select_one' => 'Избери един', 'select_owner' => '', +'select_status' => '', 'select_user' => '', 'select_users' => 'Кликни да избереш потребители', 'select_value' => 'Избери стойност', @@ -1676,6 +1683,7 @@ $text = array( 'timeline_skip_add_file' => '', 'timeline_skip_scheduled_revision' => '', 'timeline_skip_status_change_-1' => '', +'timeline_skip_status_change_-2' => '', 'timeline_skip_status_change_-3' => '', 'timeline_skip_status_change_0' => '', 'timeline_skip_status_change_1' => '', @@ -1725,6 +1733,7 @@ $text = array( 'unknown_id' => 'неизвестен идентификатор', 'unknown_keyword_category' => 'Неизвестна категория', 'unknown_owner' => 'Неизвестен идентификатор на собственик', +'unknown_status' => '', 'unknown_user' => 'Неизвестен идентификатор на потребител', 'unlinked_content' => 'Несвързано съдържание', 'unlinked_documents' => '', diff --git a/languages/ca_ES/lang.inc b/languages/ca_ES/lang.inc index d808086f3..0a34c6df0 100644 --- a/languages/ca_ES/lang.inc +++ b/languages/ca_ES/lang.inc @@ -91,6 +91,7 @@ $text = array( 'all_users' => 'Tots els usuaris', 'already_subscribed' => 'Ja està subscrit', 'and' => 'i', +'apikey' => '', 'apply' => 'Apply', 'approvals_accepted' => '', 'approvals_accepted_latest' => '', @@ -245,6 +246,7 @@ URL: [url]', 'checkedout_file_is_unchanged' => '', 'checkin_document' => '', 'checkoutpath_does_not_exist' => '', +'checkout_cancel_confirm' => '', 'checkout_document' => '', 'checkout_is_disabled' => '', 'choose_attrdef' => '', @@ -771,6 +773,7 @@ URL: [url]', 'my_transmittals' => 'Documents enviats per mi', 'name' => 'Nom', 'nav_brand_admin_tools' => 'Eines d\'administració', +'nav_brand_calendar' => '', 'nav_brand_my_account' => 'El meu compte', 'nav_brand_my_documents' => '', 'nav_brand_view_document' => '', @@ -869,6 +872,8 @@ URL: [url]', 'password_forgotten_send_hash' => '', 'password_forgotten_text' => '', 'password_forgotten_title' => '', +'password_mismatch_error' => '', +'password_mismatch_error_title' => '', 'password_repeat' => '', 'password_send' => '', 'password_send_text' => '', @@ -1050,6 +1055,7 @@ URL: [url]', 'search' => 'Cercar', 'search_fulltext' => 'Search in fulltext', 'search_in' => 'Buscar a', +'search_mode' => '', 'search_mode_and' => 'tots els mots', 'search_mode_documents' => '', 'search_mode_folders' => 'Només carpetes', @@ -1091,6 +1097,7 @@ URL: [url]', 'select_mimetype' => '', 'select_one' => 'Seleccionar un', 'select_owner' => '', +'select_status' => '', 'select_user' => 'Seleccionar usuari', 'select_users' => 'Prem per seleccionar els usuaris', 'select_value' => 'Selecciona un valor', @@ -1681,6 +1688,7 @@ URL: [url]', 'timeline_skip_add_file' => '', 'timeline_skip_scheduled_revision' => '', 'timeline_skip_status_change_-1' => '', +'timeline_skip_status_change_-2' => '', 'timeline_skip_status_change_-3' => '', 'timeline_skip_status_change_0' => '', 'timeline_skip_status_change_1' => '', @@ -1730,6 +1738,7 @@ URL: [url]', 'unknown_id' => 'Id desconegut', 'unknown_keyword_category' => 'Categoria desconeguda', 'unknown_owner' => 'Id de propietari/a desconegut', +'unknown_status' => '', 'unknown_user' => 'ID d\'usuari desconegut', 'unlinked_content' => '', 'unlinked_documents' => '', diff --git a/languages/cs_CZ/lang.inc b/languages/cs_CZ/lang.inc index 90d8cf129..b0d9e73c0 100644 --- a/languages/cs_CZ/lang.inc +++ b/languages/cs_CZ/lang.inc @@ -95,6 +95,7 @@ URL: [url]', 'all_users' => 'Všichni uživatelé', 'already_subscribed' => 'Již odebráno', 'and' => 'a', +'apikey' => '', 'apply' => 'Použít', 'approvals_accepted' => '[no_approvals] schválení již schváleno', 'approvals_accepted_latest' => '', @@ -269,6 +270,7 @@ URL: [url]', 'checkedout_file_is_unchanged' => 'Soubor dokumentu, který jste zkontrolovali, je stále nezměněn. Přihlášení nebude možné. Pokud neplánujete žádné úpravy, můžete resetovat stav odhlášení.', 'checkin_document' => 'Kontrolovat', 'checkoutpath_does_not_exist' => 'Cesta ke kontrole neexistuje', +'checkout_cancel_confirm' => '', 'checkout_document' => 'Zkontrolovat', 'checkout_is_disabled' => 'Kontrola dokumentů je zakázána v konfiguraci.', 'choose_attrdef' => 'Zvolte definici atributů', @@ -868,6 +870,7 @@ URL: [url]', 'my_transmittals' => 'Moje přenosy', 'name' => 'Název', 'nav_brand_admin_tools' => 'Nástroje správce', +'nav_brand_calendar' => '', 'nav_brand_my_account' => 'Můj účet', 'nav_brand_my_documents' => '', 'nav_brand_view_document' => '', @@ -1000,6 +1003,8 @@ Pokud budete mít problém s přihlášením i po změně hesla, kontaktujte Adm 'password_forgotten_send_hash' => 'Instrukce byly poslány uživateli na emailovou adresu.', 'password_forgotten_text' => 'Vyplňte následující formulář a následujte instrukce v emailu, který vám bude odeslán.', 'password_forgotten_title' => 'Heslo odesláno', +'password_mismatch_error' => '', +'password_mismatch_error_title' => '', 'password_repeat' => 'Opakujte heslo', 'password_send' => 'Heslo odesláno', 'password_send_text' => 'Vaše nové heslo bylo odesláno a zadanou emailovou adresu, pokud pro přihlašovací jméno a email existuje uživatel. Pokud neobdržíte email během příštích minut, pak se ujistěte se, že přihlašovací jméno a email jsou správné a proces zopakujte.', @@ -1249,6 +1254,7 @@ URL: [url]', 'search' => 'Hledat', 'search_fulltext' => 'Vyhledat fulltextově', 'search_in' => 'Prohledávat', +'search_mode' => '', 'search_mode_and' => 'všechna slova', 'search_mode_documents' => 'Pouze dokumenty', 'search_mode_folders' => 'Pouze složky', @@ -1290,6 +1296,7 @@ URL: [url]', 'select_mimetype' => '', 'select_one' => 'Vybrat jeden', 'select_owner' => '', +'select_status' => '', 'select_user' => 'Vybrat uživatele', 'select_users' => 'Kliknutím vybrat uživatele', 'select_value' => 'Vybrat hodnotu', @@ -1885,6 +1892,7 @@ Jméno: [username] 'timeline_skip_add_file' => 'příloha byla přidána', 'timeline_skip_scheduled_revision' => 'Plánovaná revize', 'timeline_skip_status_change_-1' => 'zamítnuto', +'timeline_skip_status_change_-2' => '', 'timeline_skip_status_change_-3' => 'vypršela platnost', 'timeline_skip_status_change_0' => 'čeká na přezkum', 'timeline_skip_status_change_1' => 'čeká na schválení', @@ -1943,6 +1951,7 @@ URL: [url]', 'unknown_id' => 'neznámé id', 'unknown_keyword_category' => 'Neznámá kategorie', 'unknown_owner' => 'Neznámé ID vlastníka', +'unknown_status' => '', 'unknown_user' => 'Neznámé ID uživatele', 'unlinked_content' => 'Nepropojený obsah', 'unlinked_documents' => 'Nepropojené dokumenty', diff --git a/languages/de_DE/lang.inc b/languages/de_DE/lang.inc index 7c4c37b45..1b2a4dc33 100644 --- a/languages/de_DE/lang.inc +++ b/languages/de_DE/lang.inc @@ -19,7 +19,7 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // -// Translators: Admin (2886), dgrutsch (22) +// Translators: Admin (2906), dgrutsch (22) $text = array( '2_factor_auth' => '2-Faktor Authentifizierung', @@ -95,6 +95,7 @@ URL: [url]', 'all_users' => 'Alle Benutzer', 'already_subscribed' => 'Bereits abonniert', 'and' => 'und', +'apikey' => 'API-Schlüssel', 'apply' => 'Anwenden', 'approvals_accepted' => '[no_approvals] Freigaben', 'approvals_accepted_latest' => '(davon [no_approvals] in letzter Version)', @@ -269,6 +270,7 @@ URL: [url]', 'checkedout_file_is_unchanged' => 'Die Datei des ausgecheckten Dokuments ist noch unverändert. Das Einchecken ist daher nicht möglich. Wenn Sie keine weiteren Änderungen am Dokument vornehmen möchten, dann setzen Sie den CheckOut-Status zurück.', 'checkin_document' => 'Einchecken', 'checkoutpath_does_not_exist' => 'Verzeichnis für das Auschecken von Dokumenten exisitiert nicht', +'checkout_cancel_confirm' => 'Beenden des Checkouts bestätigen', 'checkout_document' => 'Auschecken', 'checkout_is_disabled' => 'Auschecken von Dokumenten ist in der Konfiguration ausgeschaltet.', 'choose_attrdef' => 'Attributdefinition wählen', @@ -487,7 +489,7 @@ URL: [url]', 'draft' => 'Entwurf', 'draft_pending_approval' => 'Freigabe erforderlich', 'draft_pending_review' => 'Prüfung erforderlich', -'drag_icon_here' => 'Icon eines Ordners oder Dokuments hier hin ziehen!', +'drag_icon_here' => 'Ordners oder Dokument hier hin ziehen!', 'dropfolderdir_missing' => 'Ihr persönlicher Ablageordner auf dem Server existiert nicht! Kontaktieren Sie den Administrator, um in anlegen zu lassen.', 'dropfolder_file' => 'Datei aus Ablageordner', 'dropfolder_folder' => 'Ordner aus Ablageordner', @@ -501,17 +503,17 @@ URL: [url]', 'duplicates' => 'Duplikate', 'duplicate_content' => 'Doppelte Dateien', 'edit' => 'Bearbeiten', -'edit_attributes' => 'Edit attributes', +'edit_attributes' => 'Attribute bearbeiten', 'edit_comment' => 'Kommentar bearbeiten', 'edit_default_keywords' => 'Stichworte bearbeiten', -'edit_document_access' => 'Zugriffsrechte bearbeiten', +'edit_document_access' => 'Zugriffsrechte', 'edit_document_notify' => 'Beobachtung von Dokumenten', 'edit_document_props' => 'Bearbeiten', 'edit_event' => 'Ereignis editieren', 'edit_existing_access' => 'Bestehende Berechtigungen bearbeiten', 'edit_existing_attribute_groups' => 'Attributgruppen bearbeiten', 'edit_existing_notify' => 'Beobachter bearbeiten', -'edit_folder_access' => 'Zugriffsrechte bearbeiten', +'edit_folder_access' => 'Zugriffsrechte', 'edit_folder_attrdefgrp' => 'Attributgruppen bearbeiten', 'edit_folder_notify' => 'Beobachtung von Ordnern', 'edit_folder_props' => 'Bearbeiten', @@ -868,6 +870,7 @@ URL: [url]', 'my_transmittals' => 'Meine Dokumentenlisten', 'name' => 'Name', 'nav_brand_admin_tools' => 'Administration', +'nav_brand_calendar' => 'Kalender', 'nav_brand_my_account' => 'Mein Profil', 'nav_brand_my_documents' => 'Meine Dokumente', 'nav_brand_view_document' => 'Dokument', @@ -1003,6 +1006,8 @@ Sollen Sie danach immer noch Probleme bei der Anmeldung haben, dann kontaktieren 'password_forgotten_send_hash' => 'Anweisungen zum weiteren Vorgehen wurden an die E-Mail Adresse des Benutzers versandt', 'password_forgotten_text' => 'Füllen Sie bitte untenstehendes Formular aus. Weitere Anweisungen erhalten Sie dann in einer E-Mail die an Sie gesandt wird', 'password_forgotten_title' => 'Passwort gesendet', +'password_mismatch_error' => 'Passwörter sind nicht identisch', +'password_mismatch_error_title' => 'Passwörter sind nicht identisch', 'password_repeat' => 'Passwort wiederholen', 'password_send' => 'Passwort verschickt', 'password_send_text' => 'Ihr neues Passwort wurde an die angegebene E-Mail-Adresse versandt, wenn ein Benutzer mit diesem Login und dieser E-Mail-Adresse existiert. Sollten Sie innerhalb der nächsten Minuten keine E-Mail bekommen, dann überprüfen Sie nochmal die Angaben und wiederholen Sie den Vorgang.', @@ -1260,6 +1265,7 @@ URL: [url]', 'search' => 'Suchen', 'search_fulltext' => 'Suche im Volltext', 'search_in' => 'Suchen in', +'search_mode' => 'Suchmodus', 'search_mode_and' => 'alle Begriffe', 'search_mode_documents' => 'Nur Dokumente', 'search_mode_folders' => 'Nur Ordner', @@ -1301,6 +1307,7 @@ URL: [url]', 'select_mimetype' => 'Klicken zur Auswahl eines Mimetypes', 'select_one' => 'Bitte wählen', 'select_owner' => 'Klicken zur Auswahl eines Besitzers', +'select_status' => 'Klicken zur Auswaohl des Dokumentstatus', 'select_user' => 'Benutzer auswählen', 'select_users' => 'Klicken zur Auswahl eines Benutzers', 'select_value' => 'Wert auswählen', @@ -1312,7 +1319,9 @@ URL: [url]', Login: [login] Name: [username] -[comment]', +[comment] + +Sollten Sie kein Passwort bekommen haben, dann nutzen Sie bitte die Passwort-Vergessen-Funktion auf der Anmeldeseite, um ein neues Passwort zu setzen.', 'send_login_data_subject' => '[sitename]: [login] - Ihre Login-Daten', 'send_test_mail' => 'Sende Test-E-mail', 'september' => 'September', @@ -1896,12 +1905,13 @@ Name: [username] 'timeline_skip_add_file' => 'Anhang hinzugefügt', 'timeline_skip_scheduled_revision' => 'Geplante Wiederholungsprüfung', 'timeline_skip_status_change_-1' => 'abgelehnt', +'timeline_skip_status_change_-2' => 'veraltet', 'timeline_skip_status_change_-3' => 'abgelaufen', -'timeline_skip_status_change_0' => 'bevorstehende Prüfung', -'timeline_skip_status_change_1' => 'bevorstehende Freigabe', +'timeline_skip_status_change_0' => 'Prüfung erforderlich', +'timeline_skip_status_change_1' => 'Freigabe erforderlich', 'timeline_skip_status_change_2' => 'freigegeben', 'timeline_skip_status_change_3' => 'im Workflow', -'timeline_skip_status_change_4' => 'In Revision', +'timeline_skip_status_change_4' => 'Wiederholungsprüfung erforderlich', 'timeline_skip_status_change_5' => 'Entwurf', 'timeline_status_change' => 'Version [version]: [status]', 'to' => 'bis', @@ -1947,13 +1957,14 @@ URL: [url]', 'type_to_search' => 'Hier tippen zum Suchen', 'uk_UA' => 'Ukrainisch', 'under_folder' => 'In Ordner', -'unknown_attrdef' => 'Unbekannte Attributdefinition', +'unknown_attrdef' => 'unbekannte Attributdefinition', 'unknown_command' => 'unbekannter Befehl', -'unknown_document_category' => 'Unbekannte Kategorie', +'unknown_document_category' => 'unbekannte Kategorie', 'unknown_group' => 'unbekannte Gruppenidentifikation', 'unknown_id' => 'unbekannte id', 'unknown_keyword_category' => 'unbekannte Kategorie', 'unknown_owner' => 'unbekannte Besitzeridentifikation', +'unknown_status' => 'unbekannter Status', 'unknown_user' => 'unbekannte Benutzeridentifikation', 'unlinked_content' => 'Dokumenteninhalt ohne Dokument', 'unlinked_documents' => 'Nicht verknüpfte Dokumente', diff --git a/languages/el_GR/lang.inc b/languages/el_GR/lang.inc index e91a3c4db..be780a748 100644 --- a/languages/el_GR/lang.inc +++ b/languages/el_GR/lang.inc @@ -91,6 +91,7 @@ $text = array( 'all_users' => 'Όλοι οι Χρήστες', 'already_subscribed' => '', 'and' => 'και', +'apikey' => '', 'apply' => 'Apply', 'approvals_accepted' => '', 'approvals_accepted_latest' => '', @@ -240,6 +241,7 @@ $text = array( 'checkedout_file_is_unchanged' => '', 'checkin_document' => '', 'checkoutpath_does_not_exist' => '', +'checkout_cancel_confirm' => '', 'checkout_document' => '', 'checkout_is_disabled' => '', 'choose_attrdef' => '', @@ -766,6 +768,7 @@ $text = array( 'my_transmittals' => 'Οι Διαβιβάσεις μου', 'name' => 'Όνομα', 'nav_brand_admin_tools' => 'Εργαλεία', +'nav_brand_calendar' => '', 'nav_brand_my_account' => '', 'nav_brand_my_documents' => '', 'nav_brand_view_document' => '', @@ -875,6 +878,8 @@ URL: [url]', 'password_forgotten_send_hash' => '', 'password_forgotten_text' => '', 'password_forgotten_title' => '', +'password_mismatch_error' => '', +'password_mismatch_error_title' => '', 'password_repeat' => '', 'password_send' => '', 'password_send_text' => '', @@ -1056,6 +1061,7 @@ URL: [url]', 'search' => 'Αναζήτηση', 'search_fulltext' => '', 'search_in' => '', +'search_mode' => '', 'search_mode_and' => '', 'search_mode_documents' => '', 'search_mode_folders' => '', @@ -1097,6 +1103,7 @@ URL: [url]', 'select_mimetype' => '', 'select_one' => 'Επιλογή', 'select_owner' => '', +'select_status' => '', 'select_user' => 'Επιλογή χρήστη', 'select_users' => 'Κάντε κλικ για να επιλέξετε χρήστες', 'select_value' => 'Επιλέξτε τιμή', @@ -1687,6 +1694,7 @@ URL: [url]', 'timeline_skip_add_file' => 'Η προσθήκη ολοκληρώθηκε', 'timeline_skip_scheduled_revision' => '', 'timeline_skip_status_change_-1' => 'Απορριφθέντα', +'timeline_skip_status_change_-2' => '', 'timeline_skip_status_change_-3' => 'Ληγμένα', 'timeline_skip_status_change_0' => 'Προς ενημέρωση', 'timeline_skip_status_change_1' => 'Προς έγκριση', @@ -1736,6 +1744,7 @@ URL: [url]', 'unknown_id' => '', 'unknown_keyword_category' => '', 'unknown_owner' => '', +'unknown_status' => '', 'unknown_user' => '', 'unlinked_content' => '', 'unlinked_documents' => '', diff --git a/languages/en_GB/lang.inc b/languages/en_GB/lang.inc index fbb6a800a..c98e46e1d 100644 --- a/languages/en_GB/lang.inc +++ b/languages/en_GB/lang.inc @@ -19,7 +19,7 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // -// Translators: Admin (1996), archonwang (3), dgrutsch (9), netixw (14) +// Translators: Admin (2010), archonwang (3), dgrutsch (9), netixw (14) $text = array( '2_factor_auth' => '2-factor authentication', @@ -95,6 +95,7 @@ URL: [url]', 'all_users' => 'All users', 'already_subscribed' => 'Already subscribed', 'and' => 'and', +'apikey' => 'API key', 'apply' => 'Apply', 'approvals_accepted' => '[no_approvals] approvals already accepted', 'approvals_accepted_latest' => '(being [no_approvals] in latest version)', @@ -269,6 +270,7 @@ URL: [url]', 'checkedout_file_is_unchanged' => 'The file of the checked out document is still unchanged. Check in will not be possible. If do not plan any modifications, you can reset the check out status.', 'checkin_document' => 'Check In', 'checkoutpath_does_not_exist' => 'Checkout path does not exists', +'checkout_cancel_confirm' => 'Confirm to cancel checkout', 'checkout_document' => 'Check out', 'checkout_is_disabled' => 'Check out of documents is disabled in the configuration.', 'choose_attrdef' => 'Please choose attribute definition', @@ -487,7 +489,7 @@ URL: [url]', 'draft' => 'Draft', 'draft_pending_approval' => 'pending approval', 'draft_pending_review' => 'pending review', -'drag_icon_here' => 'Drag icon of folder or document here!', +'drag_icon_here' => 'Drag folder or document here!', 'dropfolderdir_missing' => 'Your personal drop folder does not exist on the server! Please ask your administrator to create it.', 'dropfolder_file' => 'File from drop folder', 'dropfolder_folder' => 'Folder from drop folder', @@ -504,14 +506,14 @@ URL: [url]', 'edit_attributes' => 'Edit attributes', 'edit_comment' => 'Edit comment', 'edit_default_keywords' => 'Edit keywords', -'edit_document_access' => 'Edit Access', +'edit_document_access' => 'Access rights', 'edit_document_notify' => 'Document Notification List', 'edit_document_props' => 'Edit document', 'edit_event' => 'Edit event', 'edit_existing_access' => 'Edit Access List', 'edit_existing_attribute_groups' => 'Edit attribute groups', 'edit_existing_notify' => 'Edit notification list', -'edit_folder_access' => 'Edit access', +'edit_folder_access' => 'Access rights', 'edit_folder_attrdefgrp' => 'Edit attribute groups', 'edit_folder_notify' => 'Folder Notification List', 'edit_folder_props' => 'Edit folder', @@ -868,6 +870,7 @@ URL: [url]', 'my_transmittals' => 'My Transmittals', 'name' => 'Name', 'nav_brand_admin_tools' => 'Admin tools', +'nav_brand_calendar' => 'Calendar', 'nav_brand_my_account' => 'My Account', 'nav_brand_my_documents' => 'My documents', 'nav_brand_view_document' => 'Document', @@ -991,19 +994,21 @@ URL: [url]', 'password_expired' => 'Password expired', 'password_expires_in_days' => 'Password expires in %s days.', 'password_forgotten' => 'Password forgotten', -'password_forgotten_email_body' => 'Dear user of SeedDMS, - -we have received a request to change your password. - -This can be done by clicking on the following link: - -[url_prefix]out/out.ChangePassword.php?hash=[hash] - -If you have still problems to login, then please contact your administrator.', +'password_forgotten_email_body' => 'Dear user of SeedDMS, + +we have received a request to change your password. + +This can be done by clicking on the following link: + +[url_prefix]out/out.ChangePassword.php?hash=[hash] + +If you still have problems to login, then please contact your administrator.', 'password_forgotten_email_subject' => '[sitename]: Password forgotten', 'password_forgotten_send_hash' => 'Instructions on how to proceed has been send to the user\'s email address', 'password_forgotten_text' => 'Fill out the form below and follow the instructions in the email, which will be sent to you.', 'password_forgotten_title' => 'Password sent', +'password_mismatch_error' => 'Passwords mismatch', +'password_mismatch_error_title' => 'Passwords mismatch', 'password_repeat' => 'Repeat password', 'password_send' => 'Password send', 'password_send_text' => 'Your new password has been send to the given email address, if the login and email matches an existing user. If you do not receive an email within the next minutes, then make sure both login and email are correct and restart the process again.', @@ -1254,6 +1259,7 @@ URL: [url]', 'search' => 'Search', 'search_fulltext' => 'Search in fulltext', 'search_in' => 'Search in', +'search_mode' => 'Search mode', 'search_mode_and' => 'all words', 'search_mode_documents' => 'Documents only', 'search_mode_folders' => 'Folders only', @@ -1295,6 +1301,7 @@ URL: [url]', 'select_mimetype' => 'Click to select mimetype', 'select_one' => 'Select one', 'select_owner' => 'Click to select owner', +'select_status' => 'Click to select document status', 'select_user' => 'Select user', 'select_users' => 'Click to select users', 'select_value' => 'Select value', @@ -1306,7 +1313,9 @@ URL: [url]', Login: [login] Name: [username] -[comment]', +[comment] + +If you did not receive a password, please use the password forgotten function on the login page to set a new password.', 'send_login_data_subject' => '[sitename]: [login] - Your login data', 'send_test_mail' => 'Send test mail', 'september' => 'September', @@ -1890,6 +1899,7 @@ Name: [username] 'timeline_skip_add_file' => 'attachment added', 'timeline_skip_scheduled_revision' => 'Scheduled revision', 'timeline_skip_status_change_-1' => 'rejected', +'timeline_skip_status_change_-2' => 'obsolete', 'timeline_skip_status_change_-3' => 'expired', 'timeline_skip_status_change_0' => 'pending review', 'timeline_skip_status_change_1' => 'pending approval', @@ -1948,6 +1958,7 @@ URL: [url]', 'unknown_id' => 'unknown id', 'unknown_keyword_category' => 'Unknown category', 'unknown_owner' => 'Unknown owner id', +'unknown_status' => 'Unknown status', 'unknown_user' => 'Unknown user id', 'unlinked_content' => 'Unlinked content', 'unlinked_documents' => 'Unlinked documents', diff --git a/languages/es_ES/lang.inc b/languages/es_ES/lang.inc index 4cbba0183..70f5d8fa8 100644 --- a/languages/es_ES/lang.inc +++ b/languages/es_ES/lang.inc @@ -95,6 +95,7 @@ URL: [url]', 'all_users' => 'Todos los usuarios', 'already_subscribed' => 'Ya está suscrito', 'and' => 'y', +'apikey' => '', 'apply' => 'Aplicar', 'approvals_accepted' => '', 'approvals_accepted_latest' => '', @@ -264,6 +265,7 @@ URL: [url]', 'checkedout_file_is_unchanged' => '', 'checkin_document' => '', 'checkoutpath_does_not_exist' => '', +'checkout_cancel_confirm' => '', 'checkout_document' => '', 'checkout_is_disabled' => '', 'choose_attrdef' => 'Por favor, seleccione definición de atributo', @@ -844,6 +846,7 @@ URL: [url]', 'my_transmittals' => 'Mi transmision', 'name' => 'Nombre', 'nav_brand_admin_tools' => 'Administración', +'nav_brand_calendar' => '', 'nav_brand_my_account' => 'Mi cuenta', 'nav_brand_my_documents' => '', 'nav_brand_view_document' => '', @@ -980,6 +983,8 @@ Si continua teniendo problemas de acceso, por favor contacte con el administrado 'password_forgotten_send_hash' => 'Las instrucciones para proceder al cambio se han enviado a la dirección de correo de usuario', 'password_forgotten_text' => 'Rellene el siguiente formulario y siga las instrucciones del correo que se le enviará.', 'password_forgotten_title' => 'Envío de contraseña', +'password_mismatch_error' => '', +'password_mismatch_error_title' => '', 'password_repeat' => 'Repetir contraseña', 'password_send' => 'Envío de contraseña', 'password_send_text' => 'Su nueva contraseña fue enviada al e-mail registrado.', @@ -1197,6 +1202,7 @@ URL: [url]', 'search' => 'Buscar', 'search_fulltext' => 'Buscar en texto completo', 'search_in' => 'Buscar en', +'search_mode' => '', 'search_mode_and' => 'todas las palabras', 'search_mode_documents' => 'Documentos sólo', 'search_mode_folders' => 'Carpetas sólo', @@ -1238,6 +1244,7 @@ URL: [url]', 'select_mimetype' => '', 'select_one' => 'Seleccionar uno', 'select_owner' => '', +'select_status' => '', 'select_user' => 'Seleccionar Usuario', 'select_users' => 'Haga Click para seleccionar usuarios', 'select_value' => 'Selecciona valor', @@ -1828,6 +1835,7 @@ URL: [url]', 'timeline_skip_add_file' => 'anexos agregados', 'timeline_skip_scheduled_revision' => '', 'timeline_skip_status_change_-1' => 'rechazado', +'timeline_skip_status_change_-2' => '', 'timeline_skip_status_change_-3' => 'expirado', 'timeline_skip_status_change_0' => 'revisiones pendientes', 'timeline_skip_status_change_1' => 'aprovaciones pendientes', @@ -1886,6 +1894,7 @@ URL: [url]', 'unknown_id' => 'Id desconocido', 'unknown_keyword_category' => 'Categoría desconocida', 'unknown_owner' => 'Id de propietario desconocido', +'unknown_status' => '', 'unknown_user' => 'ID de usuario desconocido', 'unlinked_content' => 'Contenido desvinculado', 'unlinked_documents' => 'Documentos desvinculados', diff --git a/languages/fr_FR/lang.inc b/languages/fr_FR/lang.inc index e3ee03f37..05afd2c90 100644 --- a/languages/fr_FR/lang.inc +++ b/languages/fr_FR/lang.inc @@ -19,19 +19,19 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // -// Translators: Admin (1113), jeromerobert (50), lonnnew (9), Oudiceval (977) +// Translators: Admin (1113), jeromerobert (50), lonnnew (9), Oudiceval (1038) $text = array( '2_factor_auth' => 'Authentification forte', '2_factor_auth_info' => 'Ce système requiert une authentification à deux facteurs. Cela nécessite l’installation de Google Authenticator sur votre téléphone mobile. Ci-dessous sont visibles deux QR codes. Celui de droite correspond à votre clé secrète actuelle. Celui de gauche permet de définir une nouvelle clé secrète. Lorsque vous définissez une nouvelle clé secrète, assurez-vous de la scanner avec Google Authenticator.', '2_fact_auth_secret' => 'Clé secrète', -'abbr_day' => '', -'abbr_hour' => '', -'abbr_minute' => '', -'abbr_month' => '', -'abbr_second' => '', -'abbr_week' => '', -'abbr_year' => '', +'abbr_day' => 'j', +'abbr_hour' => 'h', +'abbr_minute' => 'min', +'abbr_month' => 'm.', +'abbr_second' => 's', +'abbr_week' => 'sem', +'abbr_year' => 'an.', 'accept' => 'Accepter', 'access_control' => 'Contrôle d’accès', 'access_control_is_off' => 'Le contrôle d’accès avancé est désactivé', @@ -95,6 +95,7 @@ URL : [url]', 'all_users' => 'Tous les utilisateurs', 'already_subscribed' => 'Déjà abonné', 'and' => 'et', +'apikey' => '', 'apply' => 'Appliquer', 'approvals_accepted' => '[no_approvals] approbations déjà confirmées', 'approvals_accepted_latest' => '(dont [no_approvals] dans la dernière version)', @@ -229,8 +230,8 @@ URL: [url]', 'calendar' => 'Agenda', 'calendar_week' => 'Semaine', 'cancel' => 'Annuler', -'cancel_checkout' => '', -'cancel_checkout_warning' => '', +'cancel_checkout' => 'Annuler la vérification', +'cancel_checkout_warning' => 'La vérification peut être annulée même si des modifications ont été apportées au fichier. Dans ce cas, le fichier sera supprimé de l\'espace de vérification et votre modification sera perdue.', 'cannot_assign_invalid_state' => 'Impossible de modifier un document obsolète ou rejeté', 'cannot_change_final_states' => 'Attention : Vous ne pouvez pas modifier l’état d\'un document rejeté, expiré ou en attente de vérification ou d’approbation.', 'cannot_delete_user' => 'Impossible de supprimer l’utilisateur', @@ -262,13 +263,14 @@ URL: [url]', 'chart_docspermonth_title' => 'Nouveaux documents par mois', 'chart_docsperstatus_title' => 'Documents par statut', 'chart_docsperuser_title' => 'Documents par utilisateur', -'chart_selection' => 'Sélectionnez un graphique', +'chart_selection' => 'Sélectionner un graphique', 'chart_sizeperuser_title' => 'Volume par utilisateur', 'checkedout_file_has_different_version' => 'La version bloquée n’est pas identique à la version actuelle. Le déblocage ne modifiera pas le document.', 'checkedout_file_has_disappeared' => 'Le fichier du document bloqué n’existe plus. Le déblocage est impossible.', 'checkedout_file_is_unchanged' => 'Le fichier du document bloqué est inchangé. Le déblocage n’est pas possible. Si vous ne souhaitez pas apporter de modifications, désactivez le blocage.', 'checkin_document' => 'Débloquer (check-in)', 'checkoutpath_does_not_exist' => 'Le chemin de vérification n’existe pas', +'checkout_cancel_confirm' => '', 'checkout_document' => 'Bloquer (check-out)', 'checkout_is_disabled' => 'Le blocage (check-out) de documents est désactivé dans la configuration.', 'choose_attrdef' => 'Choisissez une définition d\'attribut', @@ -284,7 +286,7 @@ URL: [url]', 'choose_workflow' => 'Choisir un workflow', 'choose_workflow_action' => 'Choisir une action de workflow', 'choose_workflow_state' => 'Choisir un état de workflow', -'class_finfo_missing' => '', +'class_finfo_missing' => 'La classe finfo est requise lors du dépôt de nouveaux fichiers pour déterminer le type MIME.', 'class_name' => 'Nom de classe', 'clear_cache' => 'Vider le cache', 'clear_clipboard' => 'Vider le presse-papier', @@ -363,7 +365,7 @@ URL: [url]', 'documents_locked' => 'Documents verrouillés', 'documents_locked_by_you' => 'Documents verrouillés', 'documents_only' => 'Documents uniquement', -'documents_rejected' => '', +'documents_rejected' => 'Rejeté', 'documents_to_approve' => 'Documents en attente d\'approbation', 'documents_to_correct' => 'Documents à corriger', 'documents_to_process' => 'Documents à traiter', @@ -413,8 +415,8 @@ Utilisateur : [username]', 'document_has_no_workflow' => 'Le document n\'a pas de workflow', 'document_infos' => 'Informations sur le document', 'document_is_checked_out' => '', -'document_is_checked_out_remove' => '', -'document_is_checked_out_update' => 'Le document est actuellement bloqué. Si vous ajoutez une nouvelle version, la version bloquée ne pourra plus être débloquée.', +'document_is_checked_out_remove' => 'Le document est actuellement vérifié. Si vous supprimez le document, la version vérifiée ne pourra plus être ajoutée et restera dans la zone de vérification.', +'document_is_checked_out_update' => 'Le document est actuellement vérifié. Si vous ajoutez une nouvelle version, la version vérifiée ne pourra plus être vérifiée à nouveau.', 'document_is_not_locked' => 'Ce document n\'est pas verrouillé', 'document_link_by' => 'Lié par', 'document_link_public' => 'Public', @@ -517,7 +519,7 @@ URL: [url]', 'edit_folder_props' => 'Modifier le dossier', 'edit_group' => 'Modifier un groupe', 'edit_online' => 'Modification en ligne', -'edit_online_not_allowed' => '', +'edit_online_not_allowed' => 'Vous n’êtes pas autorisé à modifier ce fichier car vous n’avez pas créé la dernière version. Déposez simplement une nouvelle version du document.', 'edit_online_warning' => 'L’enregistrement de vos modifications écrasera le contenu de la version actuelle au lieu de créer une nouvelle version.', 'edit_task' => 'Modifier la tâche', 'edit_transmittal_props' => 'Modifier les propriétés de la transmission', @@ -528,9 +530,9 @@ URL: [url]', 'email' => 'E-mail', 'email_error_title' => 'Aucun e-mail indiqué', 'email_footer' => 'Vous pouvez modifier vos notifications via « Mon compte ».', -'email_footer_html' => '', +'email_footer_html' => '

        Vous pouvez modifier vos préférences e-mail à tout moment via \'Mon compte\'

        ', 'email_header' => 'Ceci est un message automatique généré par le serveur DMS.', -'email_header_html' => '', +'email_header_html' => '

        Ceci est un message automatique du serveur DMS.

        ', 'email_not_given' => 'Veuillez entrer une adresse e-mail valide.', 'empty_attribute_group_list' => 'Aucun groupe d’attributs', 'empty_folder_list' => 'Pas de documents ou de dossier', @@ -565,7 +567,7 @@ URL: [url]', 'exclude_items' => 'Exclure des élements', 'expired' => 'Expiré', 'expired_at_date' => 'Expiré le [datetime]', -'expired_docs_mail_subject' => '', +'expired_docs_mail_subject' => 'Documents expirés', 'expired_documents' => 'Documents expirés', 'expires' => 'Expiration', 'expire_by_date' => 'Expire à une date', @@ -590,8 +592,8 @@ URL : [url]', 'export_user_list_csv' => 'Exporter les utilisateurs en CSV', 'extension_archive' => 'Extension', 'extension_changelog' => 'Journal des modifications', -'extension_is_off_now' => '', -'extension_is_on_now' => '', +'extension_is_off_now' => 'L’extension est désactivée', +'extension_is_on_now' => 'L’extension est activée', 'extension_loading' => 'Chargement des extensions…', 'extension_manager' => 'Gestionnaire d\'extensions', 'extension_mgr_error_upload' => 'Erreur lors du chargement de l’extension', @@ -599,8 +601,8 @@ URL : [url]', 'extension_mgr_no_upload' => 'L’ajout de nouvelles extensions n’est pas possible car le répertoire des extensions n’est pas accessible en écriture.', 'extension_mgr_no_zipfile' => 'L’extension chargée n’est pas un dossier zip', 'extension_mgr_repository' => 'Disponibles', -'extension_missing_name' => '', -'extension_toggle_error' => '', +'extension_missing_name' => 'Nom d’extension manquant', +'extension_toggle_error' => 'Impossible d’activer/désactiver l’extension', 'extension_version_list' => 'Versions', 'february' => 'Février', 'file' => 'Fichier', @@ -671,7 +673,7 @@ URL: [url]', 'fulltextsearch_disabled' => 'La recherche plein texte est désactivée.', 'fulltext_converters' => 'Conversion des documents pour indexation', 'fulltext_info' => 'Information sur l\'index plein texte', -'func_proc_open_missing' => '', +'func_proc_open_missing' => 'proc_open est nécessaire pour indexer le contenu des documents. Sans cette fonction, seules les métadonnées seront indexées.', 'global_attributedefinitiongroups' => 'Groupes d’attributs', 'global_attributedefinitions' => 'Définitions d\'attributs', 'global_default_keywords' => 'Mots-clés globaux', @@ -725,12 +727,12 @@ URL: [url]', 'individuals' => 'Individuels', 'individuals_in_groups' => 'Membres d’un groupe', 'info_recipients_tab_not_released' => 'L’accusé de réception pour cette version du document n’est pas possible car la version n’est pas en état « publié ».', -'info_rm_user_from_processes_user' => '', +'info_rm_user_from_processes_user' => 'Seules les tâches non traitées peuvent être transférées à un autre utilisateur. Pour les tâches déjà traitées, une entrée sera ajoutée dans l’historique, comme si l’utilisateur lui-même avait été supprimé.', 'inherited' => 'hérité', 'inherits_access_copy_msg' => 'Recopier la liste des accès hérités', 'inherits_access_empty_msg' => 'Commencer avec une liste d\'accès vide', 'inherits_access_msg' => 'L\'accès est hérité.', -'installed_apache_extensions' => '', +'installed_apache_extensions' => 'Extensions Apache installées', 'installed_php_extensions' => 'Extensions PHP installées', 'internal_error' => 'Erreur interne', 'internal_error_exit' => 'Erreur interne. Impossible d\'achever la demande.', @@ -848,11 +850,11 @@ URL: [url]', 'missing_checksum' => 'Checksum manquante', 'missing_file' => 'Fichier manquant', 'missing_filesize' => 'Taille de fichier manquante', -'missing_func_class_note' => '', +'missing_func_class_note' => 'Note', 'missing_php_extensions' => 'Extensions PHP manquantes', -'missing_php_functions_and_classes' => '', +'missing_php_functions_and_classes' => 'Fonctions et classes PHP manquantes', 'missing_reception' => 'Réception manquante', -'missing_request_object' => '', +'missing_request_object' => 'Demande d’objet manquante', 'missing_transition_user_group' => 'Utilisateur/groupe manquant pour transition', 'monday' => 'Lundi', 'monday_abbr' => 'Lun.', @@ -868,10 +870,11 @@ URL: [url]', 'my_transmittals' => 'Mes transmissions', 'name' => 'Nom', 'nav_brand_admin_tools' => 'Outils d\'administration', +'nav_brand_calendar' => 'Agenda', 'nav_brand_my_account' => 'Mon compte', -'nav_brand_my_documents' => '', -'nav_brand_view_document' => '', -'nav_brand_view_folder' => '', +'nav_brand_my_documents' => 'Mes documents', +'nav_brand_view_document' => 'Document', +'nav_brand_view_folder' => 'Dossier', 'nb_NO' => 'Norvégien bokmål', 'needs_correction' => 'Nécessite une correction', 'needs_workflow_action' => 'Ce document requiert votre attention. Consultez l\'onglet workflow.', @@ -934,7 +937,7 @@ URL: [url]', 'no_action' => 'Aucune action n\'est nécessaire', 'no_approval_needed' => 'Aucune approbation en attente', 'no_attached_files' => 'Aucun fichier attaché', -'no_attribute_definitions' => '', +'no_attribute_definitions' => 'Aucune définition d’attribut', 'no_backup_dir' => 'Le répertoire de sauvegarde n’est pas défini.', 'no_current_version' => 'Vous utilisez une ancienne version de SeedDMS. La dernière version disponible est la [latestversion].', 'no_default_keywords' => 'Aucun mot-clé disponible', @@ -970,7 +973,7 @@ URL: [url]', 'october' => 'Octobre', 'old' => 'Ancien', 'only_jpg_user_images' => 'Images d\'utilisateur au format .jpg seulement', -'operation_disallowed' => '', +'operation_disallowed' => 'Opération non autorisée', 'order_by_sequence_off' => 'Le tri par position est désactivé dans les préférences. Si vous souhaitez que ce paramètre prenne effet, vous devez l’activer.', 'original_filename' => 'Nom de fichier original', 'overall_indexing_progress' => 'Progression globale de l’indexation', @@ -1002,6 +1005,8 @@ En cas de problème persistant, veuillez contacter votre administrateur.', 'password_forgotten_send_hash' => 'La procédure à suivre a bien été envoyée à l\'adresse indiquée', 'password_forgotten_text' => 'Remplissez le formulaire ci-dessous et suivez les instructions dans le courrier électronique qui vous sera envoyé.', 'password_forgotten_title' => 'Mot de passe envoyé', +'password_mismatch_error' => '', +'password_mismatch_error_title' => '', 'password_repeat' => 'Répétez le mot de passe', 'password_send' => 'Envoi du mot de passe', 'password_send_text' => 'Votre nouveau mot de passe a été envoyé à l\'adresse fournie (si l\'identifiant et l\'adresse e-mail correspondent à un utilisateur existant). Si vous ne recevez rien dans les minutes qui suivent, assurez-vous que l\'identifiant et l\'adresse e-mail sont corrects puis relancez le processus.', @@ -1161,7 +1166,7 @@ URL : [url]', 'review_update_failed' => 'Erreur lors de la mise à jour du statut de vérification. Échec de la mise à jour.', 'revise_document' => 'Réviser le document', 'revise_document_on' => 'Prochaine révision de la version du document le [date]', -'revision' => '', +'revision' => 'Révision', 'revisions_accepted' => '[no_revisions] révisions déjà confirmées', 'revisions_accepted_latest' => '(dont [no_revisions] dans la dernière version)', 'revisions_not_touched' => '[no_revisions] révisions non amorcées', @@ -1252,6 +1257,7 @@ URL : [url]', 'search' => 'Recherche', 'search_fulltext' => 'Rechercher dans le texte', 'search_in' => 'Rechercher dans', +'search_mode' => '', 'search_mode_and' => 'tous les mots', 'search_mode_documents' => 'Seulement les documents', 'search_mode_folders' => 'Seulement les dossiers', @@ -1269,9 +1275,9 @@ URL : [url]', 'seeddms_info' => 'Informations sur SeedDMS', 'seeddms_version' => 'Version de SeedDMS', 'selection' => 'Sélection', -'select_attrdef' => '', -'select_attrdefgrp_show' => 'Choisir quand afficher', -'select_attribute_value' => 'Sélectionnez la valeur de l’attribut', +'select_attrdef' => 'Sélectionner une définition d’attribut', +'select_attrdefgrp_show' => 'Sélectionner quand afficher', +'select_attribute_value' => 'Sélectionner la valeur de l’attribut', 'select_category' => 'Cliquer pour choisir une catégorie', 'select_group' => 'Sélectionner un groupe', 'select_groups' => 'Cliquer pour choisir un groupe', @@ -1293,6 +1299,7 @@ URL : [url]', 'select_mimetype' => 'Sélectionner un type MIME', 'select_one' => 'Selectionner', 'select_owner' => 'Sélectionner un propriétaire', +'select_status' => '', 'select_user' => 'Sélectionner un utilisateur', 'select_users' => 'Cliquer pour choisir un utilisateur', 'select_value' => 'Sélectionner une valeur', @@ -1369,9 +1376,9 @@ Nom : [username] 'settings_currentvalue' => 'Valeur actuelle', 'settings_Database' => 'Paramètres base de données', 'settings_dateformat' => 'Format de date', -'settings_dateformat_desc' => 'Ce format de date utilise la syntaxe de la fonction date() de php', +'settings_dateformat_desc' => 'Ce format de date utilise la syntaxe de la fonction PHP date()', 'settings_datetimeformat' => 'Format de date/heure', -'settings_datetimeformat_desc' => '', +'settings_datetimeformat_desc' => 'Ce format de date utilise la syntaxe de la fonction PHP date()', 'settings_dbDatabase' => 'Base de données', 'settings_dbDatabase_desc' => 'Le nom de votre base de données entré pendant le processus d\'installation. Ne pas modifier le champ sauf si absolument nécessaire, par exemple si la base de données a été déplacé.', 'settings_dbDriver' => 'Type base de données', @@ -1413,8 +1420,8 @@ Nom : [username] 'settings_enableAdminRevApp_desc' => 'Activer cette option pour ajouter les administrateurs à la liste des examinateurs/approbateurs et pour les transitions de workflow.', 'settings_enableCalendar' => 'Activer agenda', 'settings_enableCalendar_desc' => 'Active/désactive l’agenda', -'settings_enableCancelCheckout' => '', -'settings_enableCancelCheckout_desc' => '', +'settings_enableCancelCheckout' => 'Autoriser l’annulation des vérifications', +'settings_enableCancelCheckout_desc' => 'Si coché, un document vérifié qui a déjà été modifié pourra être abandonné.', 'settings_enableClipboard' => 'Activer le presse-papier', 'settings_enableClipboard_desc' => 'Active/désactive le presse-papier', 'settings_enableConverting' => 'Activer conversion des fichiers', @@ -1575,8 +1582,8 @@ Nom : [username] 'settings_onePageMode_desc' => 'Le mode Page unique activera le code javascript dans la page AfficherDossier, qui va mettre à jour la liste Dossier/Document, navigation, etc quand vous cliquez sur un dossier ou vous changer le parametre de l\'ordre d\'affichage.', 'settings_overrideMimeType' => 'Passer outre le type MIME', 'settings_overrideMimeType_desc' => 'Ne pas tenir compte du type MIME envoyé par le navigateur quand un fichier est téléversé. Le type MIME sera déterminé par SeedDMS.', -'settings_overrideTheme' => '', -'settings_overrideTheme_desc' => '', +'settings_overrideTheme' => 'Forcer le thème', +'settings_overrideTheme_desc' => 'Activer pour remplacer le paramètre du thème dans le compte utilisateur par le paramètre de la configuration.', 'settings_partitionSize' => 'Taille des fichiers partiels téléchargées par jumploader', 'settings_partitionSize_desc' => 'Taille des fichiers partiels en octets, téléchargées par jumploader. Ne pas fixer une valeur plus grande que la taille de transfert maximale définie par le serveur.', 'settings_passwordExpiration' => 'Expiration du mot de passe', @@ -1672,11 +1679,11 @@ Nom : [username] 'settings_System' => 'Système', 'settings_tasksInMenu' => 'Tâches sélectionnées', 'settings_tasksInMenu_approval' => 'Approbations', -'settings_tasksInMenu_checkedout' => '', +'settings_tasksInMenu_checkedout' => 'Vérifié', 'settings_tasksInMenu_desc' => 'Sélectionnez les tâches à comptabiliser. Si aucune n’est sélectionnée, toutes les tâches seront comptabilisées.', 'settings_tasksInMenu_needscorrection' => 'Nécessitant une correction', 'settings_tasksInMenu_receipt' => 'Réceptions', -'settings_tasksInMenu_rejected' => '', +'settings_tasksInMenu_rejected' => 'Rejeté', 'settings_tasksInMenu_review' => 'Vérifications', 'settings_tasksInMenu_revision' => 'Révisions', 'settings_tasksInMenu_workflow' => 'Workflow', @@ -1690,8 +1697,8 @@ Nom : [username] 'settings_updateNotifyTime' => 'Délai de notification des modifications', 'settings_updateNotifyTime_desc' => 'Les utilisateurs sont informés des modifications apportées aux documents qui ont eu lieu durant le délai précisé (en secondes).', 'settings_upgrade_php' => 'Mettez à jour PHP vers une version au moins égale à 5.6.38', -'settings_useHomeAsRootFolder' => '', -'settings_useHomeAsRootFolder_desc' => '', +'settings_useHomeAsRootFolder' => 'Utiliser le dossier de départ comme dossier racine', +'settings_useHomeAsRootFolder_desc' => 'Activer pour que le dossier de départ de l’utilisateur (non admin) soit utilisé comme dossier racine (expérimental).', 'settings_versioningFileName' => 'Nom des fichiers de versionnage', 'settings_versioningFileName_desc' => 'Nom des fichiers textes d’information créés depuis les outils de sauvegarde', 'settings_versiontolow' => 'Version trop ancienne', @@ -1733,7 +1740,7 @@ Nom : [username] 'splash_add_to_transmittal' => 'Ajouté à la transmission', 'splash_add_transmittal' => 'Ajouté à la transmission', 'splash_add_user' => 'Nouvel utilisateur ajouté', -'splash_cancel_checkout' => '', +'splash_cancel_checkout' => 'Vérification annulée', 'splash_cleared_cache' => 'Cache vidé', 'splash_cleared_clipboard' => 'Presse-papier vidé', 'splash_delete_access' => 'Droits d’accès supprimés', @@ -1754,10 +1761,10 @@ Nom : [username] 'splash_edit_user' => 'Utilisateur modifié', 'splash_error_add_to_transmittal' => 'Erreur lors de l’ajout du document à la transmission', 'splash_error_rm_download_link' => 'Erreur lors de la suppression du lien de téléchargement', -'splash_error_saving_file' => '', +'splash_error_saving_file' => 'Erreur lors de l’enregistrement du fichier', 'splash_error_send_download_link' => 'Erreur lors de l’envoi du lien de téléchargement', -'splash_expiration_date_cleared' => '', -'splash_expiration_date_set' => '', +'splash_expiration_date_cleared' => 'Date d’expiration retirée', +'splash_expiration_date_set' => 'Date d’expiration définie au [date]', 'splash_extension_getlist' => 'Liste des extensions du dépôt actualisée', 'splash_extension_import' => 'Extension installée', 'splash_extension_refresh' => 'Liste des extensions actualisée', @@ -1808,7 +1815,7 @@ Nom : [username] 'status_approval_rejected' => 'Ébauche rejetée', 'status_approved' => 'Approuvé', 'status_approver_removed' => 'Approbateur retiré du processus', -'status_change' => '', +'status_change' => 'Statut modifié', 'status_needs_correction' => 'Nécessite une correction', 'status_not_approved' => 'Non approuvé', 'status_not_receipted' => 'Pas encore réceptionné', @@ -1858,15 +1865,15 @@ Nom : [username] 'takeOverIndApprovers' => 'Récupérer les approbateurs individuels', 'takeOverIndReviewer' => 'Récupérer les examinateurs de la dernière version.', 'takeOverIndReviewers' => 'Récupérer les examinateurs individuels', -'target_equals_source_folder' => '', +'target_equals_source_folder' => 'Le dossier de destination est identique au dossier source', 'tasks' => 'Tâches', 'task_core_expireddocs_days' => 'jours', -'task_core_expireddocs_email' => '', -'task_core_indexingdocs_recreate' => '', +'task_core_expireddocs_email' => 'E-mail', +'task_core_indexingdocs_recreate' => 'Régénérer l’index', 'task_description' => 'Description', 'task_disabled' => 'Désactivée', 'task_frequency' => 'Fréquence', -'task_frequency_placeholder' => '', +'task_frequency_placeholder' => 'min h j m jsem', 'task_last_run' => 'Dernière exécution', 'task_name' => 'Nom', 'task_next_run' => 'Prochaine exécution', @@ -1888,6 +1895,7 @@ Nom : [username] 'timeline_skip_add_file' => 'avec fichiers attachés', 'timeline_skip_scheduled_revision' => 'Révision planifiée', 'timeline_skip_status_change_-1' => 'rejetés', +'timeline_skip_status_change_-2' => '', 'timeline_skip_status_change_-3' => 'expirés', 'timeline_skip_status_change_0' => 'en attente de revue', 'timeline_skip_status_change_1' => 'en attente d\'approbation', @@ -1904,7 +1912,7 @@ Nom : [username] 'transfer_content' => 'Transférer le contenu', 'transfer_document' => 'Transférer le document', 'transfer_no_read_access' => 'L’utilisateur n’a pas le droit de lecture dans ce dossier', -'transfer_no_users' => '', +'transfer_no_users' => 'Il n’y a actuellement aucun utilisateur auquel le document peut être transféré.', 'transfer_no_write_access' => 'L’utilisateur n’a pas le droit d’écriture dans ce dossier', 'transfer_objects' => 'Transférer les objets', 'transfer_objects_to_user' => 'Nouveau propriétaire', @@ -1946,6 +1954,7 @@ URL : [url]', 'unknown_id' => 'ID inconnu', 'unknown_keyword_category' => 'Catégorie inconnue', 'unknown_owner' => 'Identifiant de propriétaire inconnu', +'unknown_status' => '', 'unknown_user' => 'Identifiant d\'utilisateur inconnu', 'unlinked_content' => 'Contenu non lié', 'unlinked_documents' => 'Documents non liés', @@ -2043,7 +2052,7 @@ URL: [url]', 'workflow_title' => '', 'workflow_transition_without_user_group' => 'Au moins une transition a ni utilisateur, ni groupe !', 'workflow_user_summary' => 'Récapitulatif utilisateur', -'wrong_checksum' => '', +'wrong_checksum' => 'Mauvaise somme de contrôle', 'wrong_filetype' => 'Mauvais type de fichier', 'x_more_objects' => '[number] objets supplémentaires', 'year_view' => 'Vue annuelle', diff --git a/languages/hr_HR/lang.inc b/languages/hr_HR/lang.inc index a426f9453..9e5ec9c5e 100644 --- a/languages/hr_HR/lang.inc +++ b/languages/hr_HR/lang.inc @@ -95,6 +95,7 @@ Internet poveznica: [url]', 'all_users' => 'Svi korisnici', 'already_subscribed' => 'Već prijavljeno', 'and' => 'i', +'apikey' => '', 'apply' => 'Primjeni', 'approvals_accepted' => '', 'approvals_accepted_latest' => '', @@ -269,6 +270,7 @@ Internet poveznica: [url]', 'checkedout_file_is_unchanged' => 'Datoteka odjavljenog dokumenta je još uvijek nepromijenjena. Prijava neće biti moguća. Ukoliko ne planirate izmjene, možete resetirati status odjave.', 'checkin_document' => 'Prijava', 'checkoutpath_does_not_exist' => '', +'checkout_cancel_confirm' => '', 'checkout_document' => 'Odjava', 'checkout_is_disabled' => 'Odjava dokumenata je onemogućena u konfiguraciji.', 'choose_attrdef' => 'Molim odaberite definiciju atributa', @@ -849,6 +851,7 @@ Internet poveznica: [url]', 'my_transmittals' => 'Moja proslijeđivanja', 'name' => 'Naziv', 'nav_brand_admin_tools' => '', +'nav_brand_calendar' => '', 'nav_brand_my_account' => '', 'nav_brand_my_documents' => '', 'nav_brand_view_document' => '', @@ -984,6 +987,8 @@ Ako i dalje imate problema s prijavom, molimo kontaktirajte Vašeg administrator 'password_forgotten_send_hash' => 'Upute kako postupiti su poslane na e-mail adresu korisnika', 'password_forgotten_text' => 'Ispunite donji obrazac i slijedite upute iz e-maila koji će vam biti poslan.', 'password_forgotten_title' => 'Lozinka je poslana', +'password_mismatch_error' => '', +'password_mismatch_error_title' => '', 'password_repeat' => 'Ponovi lozinku', 'password_send' => 'Pošalji lozinku', 'password_send_text' => 'Vaša nova lozinka je poslana na navedenu e-mail adresu, ako login i e-mail odgovaraju postojećem korisniku. Ako ne primite e-mail u narednim minutama, tada provjerite da su login i e-mail ispravni te ponovite postupak.', @@ -1218,6 +1223,7 @@ Internet poveznica: [url]', 'search' => 'Traži', 'search_fulltext' => 'Traži u cijelom tekstu', 'search_in' => 'Traži u', +'search_mode' => '', 'search_mode_and' => 'sve riječi', 'search_mode_documents' => 'Samo dokumenti', 'search_mode_folders' => 'Samo mape', @@ -1259,6 +1265,7 @@ Internet poveznica: [url]', 'select_mimetype' => '', 'select_one' => 'Odaberite jednog', 'select_owner' => '', +'select_status' => '', 'select_user' => 'Izaberi korisnika', 'select_users' => 'Kliknite za odabir korisnika', 'select_value' => 'Odaberite vrijednost', @@ -1849,6 +1856,7 @@ Internet poveznica: [url]', 'timeline_skip_add_file' => 'dodan prilog', 'timeline_skip_scheduled_revision' => '', 'timeline_skip_status_change_-1' => 'odbijeno', +'timeline_skip_status_change_-2' => '', 'timeline_skip_status_change_-3' => 'isteklo', 'timeline_skip_status_change_0' => 'na čekanju za pregled', 'timeline_skip_status_change_1' => 'na čekanju za odobrenje', @@ -1907,6 +1915,7 @@ Internet poveznica: [url]', 'unknown_id' => 'nepoznati ID', 'unknown_keyword_category' => 'Nepoznata kategorija', 'unknown_owner' => 'Nepoznati ID vlasnika', +'unknown_status' => '', 'unknown_user' => 'Nepoznati ID korisnika', 'unlinked_content' => 'Nepovezani sadržaj', 'unlinked_documents' => 'Nepovezani dokumenti', diff --git a/languages/hu_HU/lang.inc b/languages/hu_HU/lang.inc index 3b84ee19c..8de858b69 100644 --- a/languages/hu_HU/lang.inc +++ b/languages/hu_HU/lang.inc @@ -95,6 +95,7 @@ URL: [url]', 'all_users' => 'Minden felhasználó', 'already_subscribed' => 'Már feliratkozott', 'and' => '-', +'apikey' => '', 'apply' => 'Elfogad', 'approvals_accepted' => '[no_approvals] már elfogadott jóváhagyások', 'approvals_accepted_latest' => '', @@ -264,6 +265,7 @@ URL: [url]', 'checkedout_file_is_unchanged' => '', 'checkin_document' => '', 'checkoutpath_does_not_exist' => '', +'checkout_cancel_confirm' => '', 'checkout_document' => '', 'checkout_is_disabled' => '', 'choose_attrdef' => 'Kérem válasszon jellemző meghatározást', @@ -844,6 +846,7 @@ URL: [url]', 'my_transmittals' => 'Átviteleim', 'name' => 'Név', 'nav_brand_admin_tools' => '', +'nav_brand_calendar' => '', 'nav_brand_my_account' => '', 'nav_brand_my_documents' => '', 'nav_brand_view_document' => '', @@ -980,6 +983,8 @@ Amennyiben problémákba ütközik a bejelentkezés során, kérjük vegye fel a 'password_forgotten_send_hash' => 'Utasítások arról, hogyan kell eljárni a felhasználók email címének elküldéséhez', 'password_forgotten_text' => 'Töltse ki a következő űrlapot és kövesse az Önnek küldött, elektronikus levélben szereplő utasításokat.', 'password_forgotten_title' => 'Jelszó küldés', +'password_mismatch_error' => '', +'password_mismatch_error_title' => '', 'password_repeat' => 'Jelszó mégegyszer', 'password_send' => 'Jelszó elküldve', 'password_send_text' => 'Új jelszót küld Önnek a megadott email címre, amennyiben a felhasználónév és az email cím megfelel egy létező felhasználónak. Amennyiben néhány percen belül nem kapja meg az email-t, akkor ellenőrizze a felhasználónevet és email címet és indítsa újra a folyamatot.', @@ -1196,6 +1201,7 @@ URL: [url]', 'search' => 'Keresés', 'search_fulltext' => 'Keresés a teljes szövegben', 'search_in' => 'Keresés ebben a könyvtárban', +'search_mode' => '', 'search_mode_and' => 'egyezés minden szóra', 'search_mode_documents' => 'Csak dokumentumok', 'search_mode_folders' => 'Csak mappák', @@ -1237,6 +1243,7 @@ URL: [url]', 'select_mimetype' => '', 'select_one' => 'Válasszon egyet', 'select_owner' => '', +'select_status' => '', 'select_user' => 'Felhasználó kiválasztása', 'select_users' => 'Kattintson a felhasználó kiválasztásához', 'select_value' => 'Érték kiválasztása', @@ -1827,6 +1834,7 @@ URL: [url]', 'timeline_skip_add_file' => 'melléklet hozzáadva', 'timeline_skip_scheduled_revision' => '', 'timeline_skip_status_change_-1' => 'visszautasítva', +'timeline_skip_status_change_-2' => '', 'timeline_skip_status_change_-3' => 'lejárt', 'timeline_skip_status_change_0' => 'felülvizsgálatra vár', 'timeline_skip_status_change_1' => 'jóváhagyásra vár', @@ -1885,6 +1893,7 @@ URL: [url]', 'unknown_id' => 'ismeretlen azonosító', 'unknown_keyword_category' => 'Ismeretlen kategória', 'unknown_owner' => 'Ismeretlen tulajdonos azonosító', +'unknown_status' => '', 'unknown_user' => 'Ismeretlen felhasználó azonosító', 'unlinked_content' => 'Nem hivatkozott tartalom', 'unlinked_documents' => 'Nem hivatkozott dokumentumok', diff --git a/languages/it_IT/lang.inc b/languages/it_IT/lang.inc index 4e6c5d46e..3888f65c9 100644 --- a/languages/it_IT/lang.inc +++ b/languages/it_IT/lang.inc @@ -95,6 +95,7 @@ URL: [url]', 'all_users' => 'Tutti gli utenti', 'already_subscribed' => 'L\'oggetto è già stato sottoscritto', 'and' => 'e', +'apikey' => '', 'apply' => 'Applica', 'approvals_accepted' => '[no_approvals] approvazioni già accettate', 'approvals_accepted_latest' => '', @@ -269,6 +270,7 @@ URL: [url]', 'checkedout_file_is_unchanged' => 'La versione approvata è uguale alla versione corrente. Impossibile caricare.', 'checkin_document' => 'Da approvare', 'checkoutpath_does_not_exist' => 'Il percorso di approvazione non esiste', +'checkout_cancel_confirm' => '', 'checkout_document' => 'Approvato', 'checkout_is_disabled' => 'Approvazione dei documenti disabilitata', 'choose_attrdef' => 'Seleziona l\'Attributo', @@ -854,6 +856,7 @@ URL: [url]', 'my_transmittals' => 'Mie trasmissioni', 'name' => 'Nome', 'nav_brand_admin_tools' => '', +'nav_brand_calendar' => '', 'nav_brand_my_account' => '', 'nav_brand_my_documents' => '', 'nav_brand_view_document' => '', @@ -990,6 +993,8 @@ Dovessero esserci ancora problemi al login, prego contatta l\'amministratore di 'password_forgotten_send_hash' => 'Le istruzioni su come procedere sono state inviate all\'indirizzo e-mail dell\'utente', 'password_forgotten_text' => 'Compilare i campi seguenti e seguire le istruzioni nell\'e-mail che sarà inviata a breve.', 'password_forgotten_title' => 'Password inviata', +'password_mismatch_error' => '', +'password_mismatch_error_title' => '', 'password_repeat' => 'Ripetere password', 'password_send' => 'Invia la password', 'password_send_text' => 'La nuova password è stata inviata all\'indirizzo email fornito, nel caso in cui login ed email siano nel database e corrispondano ad un utente. Qualora non si fosse ricevuto alcun messaggio nei prossimi minuti, si prega di controllare che login ed email siano corretti e provare di nuovo.', @@ -1240,6 +1245,7 @@ URL: [url]', 'search' => 'Ricerca', 'search_fulltext' => 'Ricerca fulltext', 'search_in' => 'Cerca in', +'search_mode' => '', 'search_mode_and' => 'tutte le parole', 'search_mode_documents' => 'Solo documenti', 'search_mode_folders' => 'Solo cartelle', @@ -1281,6 +1287,7 @@ URL: [url]', 'select_mimetype' => '', 'select_one' => 'Seleziona uno', 'select_owner' => '', +'select_status' => '', 'select_user' => 'Seleziona utente', 'select_users' => 'Clicca per selezionare gli utenti', 'select_value' => 'Selezionare un valore', @@ -1876,6 +1883,7 @@ Name: [username] 'timeline_skip_add_file' => 'allegato aggiunto', 'timeline_skip_scheduled_revision' => 'Riesame programmato', 'timeline_skip_status_change_-1' => 'respinto', +'timeline_skip_status_change_-2' => '', 'timeline_skip_status_change_-3' => 'scaduto', 'timeline_skip_status_change_0' => 'in attesa di revisione', 'timeline_skip_status_change_1' => 'in attesa di approvazione', @@ -1934,6 +1942,7 @@ URL: [url]', 'unknown_id' => 'ID sconosciuto', 'unknown_keyword_category' => 'Categoria sconosciuta', 'unknown_owner' => 'ID proprietario sconosciuto', +'unknown_status' => '', 'unknown_user' => 'ID utente sconosciuto', 'unlinked_content' => 'Contenuto non collegato', 'unlinked_documents' => 'Documenti non collegati', diff --git a/languages/ko_KR/lang.inc b/languages/ko_KR/lang.inc index 904e7f936..86cc748eb 100644 --- a/languages/ko_KR/lang.inc +++ b/languages/ko_KR/lang.inc @@ -95,6 +95,7 @@ URL: [url]', 'all_users' => '모든 사용자', 'already_subscribed' => '가입된', 'and' => '와', +'apikey' => '', 'apply' => '적용', 'approvals_accepted' => '', 'approvals_accepted_latest' => '', @@ -271,6 +272,7 @@ URL: [url]', 'checkedout_file_is_unchanged' => '요청한 문서가 아직 변경전 상태입니다. 변경을 원하지 않는 경우 재설정 할 수 있습니다.', 'checkin_document' => '체크인', 'checkoutpath_does_not_exist' => '', +'checkout_cancel_confirm' => '', 'checkout_document' => '체크아웃', 'checkout_is_disabled' => '체크아웃된 문서는 설정에서 비활성화됩니다.', 'choose_attrdef' => '속성의 정의를 선택하세요', @@ -850,6 +852,7 @@ URL: [url]', 'my_transmittals' => '내 송부', 'name' => '이름', 'nav_brand_admin_tools' => '', +'nav_brand_calendar' => '', 'nav_brand_my_account' => '', 'nav_brand_my_documents' => '', 'nav_brand_view_document' => '', @@ -978,6 +981,8 @@ URL : [url]', 'password_forgotten_send_hash' => '사용자의 이메일 주소로 전송 진행 방법에 대한 지침', 'password_forgotten_text' => '아래의 양식을 작성하시고 당신에게 보낼 이메일에 있는 지시 사항을 따르십시오.', 'password_forgotten_title' => '비밀번호 전송', +'password_mismatch_error' => '', +'password_mismatch_error_title' => '', 'password_repeat' => '암호 반복', 'password_send' => '비밀번호 전송', 'password_send_text' => '로그인 및 이메일이 기존 사용자와 일치하는 경우 새 암호가 지정된 이메일 주소로 전송됩니다. 당신이 잠시후 이메일을 수신하지 못했으면 반드시 로그인 및 이메일 모두가 올바른지 확인하고 프로세스를 다시 시작 하세요.', @@ -1212,6 +1217,7 @@ URL : [url]', 'search' => '검색', 'search_fulltext' => '전체 텍스트 검색', 'search_in' => '검색내', +'search_mode' => '', 'search_mode_and' => '모든 단어', 'search_mode_documents' => '문서만', 'search_mode_folders' => '폴더만', @@ -1253,6 +1259,7 @@ URL : [url]', 'select_mimetype' => '', 'select_one' => '선택', 'select_owner' => '', +'select_status' => '', 'select_user' => '', 'select_users' => '사용자를 선택합니다', 'select_value' => '', @@ -1843,6 +1850,7 @@ URL : [url]', 'timeline_skip_add_file' => '첨부 파일 이 추가 되었습니다', 'timeline_skip_scheduled_revision' => '', 'timeline_skip_status_change_-1' => '거부', +'timeline_skip_status_change_-2' => '', 'timeline_skip_status_change_-3' => '만료', 'timeline_skip_status_change_0' => '보류된 검토', 'timeline_skip_status_change_1' => '보류된 승인', @@ -1901,6 +1909,7 @@ URL : [url]', 'unknown_id' => '알 수없는 ID', 'unknown_keyword_category' => '알 수없는 범주', 'unknown_owner' => '알 수없는 소유자 ID', +'unknown_status' => '', 'unknown_user' => '알 수 없는 사용자 ID', 'unlinked_content' => '연결되지 않은 내용', 'unlinked_documents' => '연결되지 않은 문서', diff --git a/languages/lo_LA/lang.inc b/languages/lo_LA/lang.inc index c1a0d6b3d..fc7ef9439 100644 --- a/languages/lo_LA/lang.inc +++ b/languages/lo_LA/lang.inc @@ -95,6 +95,7 @@ URL: [url]', 'all_users' => 'ຜູ້ໃຊ້ທັງໝົດ', 'already_subscribed' => 'ສະໝັກຮັບຂໍ້ມູນແລ້ວ', 'and' => 'ແລະ', +'apikey' => '', 'apply' => 'ໃຊ້', 'approvals_accepted' => '[no_approvals] ອະນຸມັດໂດຍບໍ່ຕ້ອງສຳພັດ', 'approvals_accepted_latest' => '', @@ -267,6 +268,7 @@ URL: [url]', 'checkedout_file_is_unchanged' => 'ໄຟລຂອງເອກະສານເຊັກເອົາຍັງຄົງເດີມ ບໍ່ສາມາດເຊັກອິນໄດ້ ຖ້າຫາກບໍ່ມີການວາງແຜນແກ້ໄຂໄດໆ ເຈົ້າສາມາດລີເຊັດສະຖານະເຊັກເອົາ', 'checkin_document' => 'ເຊັກອຶນ', 'checkoutpath_does_not_exist' => 'ບໍ່ມີເສັ້ນທາງເຊັກເອົາ', +'checkout_cancel_confirm' => '', 'checkout_document' => 'ເຊັກເອົາ', 'checkout_is_disabled' => 'ໃນການກຳນົດຄ່າເຊັກເອົາເອກະສານໄດ້ຖືກປິດໄຊ້ງານ', 'choose_attrdef' => 'ກະລຸນາເລືອກນິຍາມແອັດທິບິວ', @@ -847,6 +849,7 @@ URL: [url]', 'my_transmittals' => 'ການຂົນສົ່ງຂອງຂ້ອຍ', 'name' => 'ຊື່', 'nav_brand_admin_tools' => '', +'nav_brand_calendar' => '', 'nav_brand_my_account' => '', 'nav_brand_my_documents' => '', 'nav_brand_view_document' => '', @@ -983,6 +986,8 @@ URL: [url]', 'password_forgotten_send_hash' => 'ຄຳແນະນຳໃນການດຳເນີນການຖືກສົ່ງໄປຫາອີເມວຂອງຜູ້ນຳໄຊ້', 'password_forgotten_text' => 'ກະລຸນາຂຽນແບບຟອມດ້ານລຸ່ມ ແລະເຮັດຕາມຄຳແນະນຳໃນອີເມວທີໄດ້ສົ່ງຫາເຈົ້າ', 'password_forgotten_title' => 'ສົ່ງລະຫັດຜ່ານ', +'password_mismatch_error' => '', +'password_mismatch_error_title' => '', 'password_repeat' => 'ຢຳລະຫັດຜ່ານ', 'password_send' => 'ສົ່ງລະຫັດຜ່ານ', 'password_send_text' => 'ລະຫັດຜ່ານໄຫມ່ຂອງເຈົ້າໄດ້ຖືກສົ່ງໄປຕາມທີ່ຢູ່ຂອງອີເມວ, ຖ້າການເຂົ້າລະບົບ ແລະອີເມວກົງກັບຜູ້ໄຊ້ທີມີຢູ່, ຖ້າເຈົ້າບໍ່ໄດ້ຮັບອີເມວພາຍຫຼັງນາທີທັດໄປ, ກວດຄືນໃຫ້ແນ່ໃຈວ່າທັ່ງການ Login ເຂົ້າສູ້ລະບົບ ແລະອີເມວວ່າຖືກຕ້ອງແລະເລີ່ມຕົ້ນດຳເນີນການໄຫມ່ອີກຄັ້ງ', @@ -1233,6 +1238,7 @@ URL: [url]', 'search' => 'ຄົ້ນຫາ', 'search_fulltext' => 'ຄົ້ນຫາແບບເຕັມຮູບແບບ', 'search_in' => 'ຄົ້ນຫາໃນ', +'search_mode' => '', 'search_mode_and' => 'ທຸກຄຳ', 'search_mode_documents' => 'ເອກະສານຢ່າງດຽວ', 'search_mode_folders' => 'ໂຟລເດີຢ່າງດຽວ', @@ -1274,6 +1280,7 @@ URL: [url]', 'select_mimetype' => '', 'select_one' => 'ເລືອກໜື່ງອັນ', 'select_owner' => '', +'select_status' => '', 'select_user' => '', 'select_users' => 'ຄິກເພື່ອເລືອກຜູ້ໄຊ້', 'select_value' => '', @@ -1869,6 +1876,7 @@ URL: [url]', 'timeline_skip_add_file' => 'ເພີ່ມໄຟລແນບແລ້ວ', 'timeline_skip_scheduled_revision' => '', 'timeline_skip_status_change_-1' => 'ປະຕິເສດ', +'timeline_skip_status_change_-2' => '', 'timeline_skip_status_change_-3' => 'ວັນໝົດອາຍຸ', 'timeline_skip_status_change_0' => 'ລໍການກວດສອບ', 'timeline_skip_status_change_1' => 'ລໍຖ້າການອະນຸມັດ', @@ -1927,6 +1935,7 @@ URL: [url]', 'unknown_id' => 'ID ທີ່ບໍ່ຮູ້ຈັກ', 'unknown_keyword_category' => 'ໝວດໝູ່ທີບໍ່ຮູ້ຈັກ', 'unknown_owner' => 'ເຈົາຂອງ ID ທີ່ບໍ່ຮູ້ຈັກ', +'unknown_status' => '', 'unknown_user' => 'ລະຫັດຜູ້ໄຊ້ທີບໍ່ຮູ້ຈັກ ID', 'unlinked_content' => 'ຍົກເລີກການເຊື່ອມໂຍງເນື້ອຫາ', 'unlinked_documents' => 'ຍົກເລີກການເຊື່ອມໂຍງເອກະສານ', diff --git a/languages/nb_NO/lang.inc b/languages/nb_NO/lang.inc index e0252b514..2b94135c1 100644 --- a/languages/nb_NO/lang.inc +++ b/languages/nb_NO/lang.inc @@ -95,6 +95,7 @@ URL: [url]', 'all_users' => 'Alle brukere', 'already_subscribed' => 'Abonnert allerede', 'and' => 'og', +'apikey' => '', 'apply' => 'Søke om', 'approvals_accepted' => '[no_approvals] godkjenninger allerede akseptert', 'approvals_accepted_latest' => '(er [no_approvals] i siste versjon)', @@ -269,6 +270,7 @@ URL: [url]', 'checkedout_file_is_unchanged' => 'Filen til det utsjekkede dokumentet er fortsatt uendret. Innsjekking vil ikke være mulig. Hvis du ikke planlegger noen endringer, kan du tilbakestille statusen for utsjekking.', 'checkin_document' => 'Innsjekking', 'checkoutpath_does_not_exist' => 'Utsjekking sti mangler', +'checkout_cancel_confirm' => '', 'checkout_document' => 'Utsjekking', 'checkout_is_disabled' => 'Sjekk ut av dokumentene er deaktivert i konfigurasjonen.', 'choose_attrdef' => 'Velg egenskaps definition', @@ -868,6 +870,7 @@ URL: [url]', 'my_transmittals' => 'Mine sendinger', 'name' => 'Navn', 'nav_brand_admin_tools' => '', +'nav_brand_calendar' => '', 'nav_brand_my_account' => '', 'nav_brand_my_documents' => '', 'nav_brand_view_document' => '', @@ -998,6 +1001,8 @@ Om du fortsatt har problemer med innloggingen, kontakt admin.', 'password_forgotten_send_hash' => 'Instruksjoner om hvordan du går frem er sendt til din oppgitte e-postadresse.', 'password_forgotten_text' => 'Fyll ut skjemaet nedenfor og følg instruksjonene i e-posten, som vil bli sendt til deg.', 'password_forgotten_title' => 'Passord sendt', +'password_mismatch_error' => '', +'password_mismatch_error_title' => '', 'password_repeat' => 'Gjenta passord', 'password_send' => 'Passord sendt', 'password_send_text' => 'Ditt nye passord er blitt sendt til den oppgitte e-postadressen, hvis påloggingen og e-posten samsvarer med en eksisterende bruker. Hvis du ikke mottar en e-post i løpet av de neste minuttene, må du sørge for at både innlogging og e-post er riktig og start prosessen på nytt.', @@ -1248,6 +1253,7 @@ URL: [url]', 'search' => 'Søk', 'search_fulltext' => 'Søk i fulltekst', 'search_in' => 'Søk i', +'search_mode' => '', 'search_mode_and' => 'alle ord', 'search_mode_documents' => 'Kun dokumenter', 'search_mode_folders' => 'Bare mapper', @@ -1289,6 +1295,7 @@ URL: [url]', 'select_mimetype' => '', 'select_one' => 'Velg en', 'select_owner' => '', +'select_status' => '', 'select_user' => 'Velg bruker', 'select_users' => 'Klikk for å velge flere brukere', 'select_value' => 'Velg verdi', @@ -1882,6 +1889,7 @@ Bruker: [username] 'timeline_skip_add_file' => 'vedlegg lagt til', 'timeline_skip_scheduled_revision' => 'Planlagt revisjon', 'timeline_skip_status_change_-1' => 'avvist', +'timeline_skip_status_change_-2' => '', 'timeline_skip_status_change_-3' => 'utløpt', 'timeline_skip_status_change_0' => 'avventer vurdering', 'timeline_skip_status_change_1' => 'venter på godkjenning', @@ -1940,6 +1948,7 @@ URL: [url]', 'unknown_id' => 'ukjent navn', 'unknown_keyword_category' => 'Ukjent kategori', 'unknown_owner' => 'Ukjent eiernavn', +'unknown_status' => '', 'unknown_user' => 'Ukjent brukernavn', 'unlinked_content' => 'U-linket innhold', 'unlinked_documents' => 'U-linket dokumenter', diff --git a/languages/nl_NL/lang.inc b/languages/nl_NL/lang.inc index 173f65adf..bb5d52dc9 100644 --- a/languages/nl_NL/lang.inc +++ b/languages/nl_NL/lang.inc @@ -95,6 +95,7 @@ URL: [url]', 'all_users' => 'Alle gebruikers', 'already_subscribed' => 'Al ingetekend', 'and' => 'en', +'apikey' => '', 'apply' => 'Toepassen', 'approvals_accepted' => '[no_approvals] goedkeuringen', 'approvals_accepted_latest' => 'Er zijn [no_approvals] goedkeuringen', @@ -262,6 +263,7 @@ URL: [url]', 'checkedout_file_is_unchanged' => 'Checkout-document ongewijzigd', 'checkin_document' => 'Veranderd document', 'checkoutpath_does_not_exist' => 'Checkout-pad bestaat niet', +'checkout_cancel_confirm' => '', 'checkout_document' => 'Checkout-document', 'checkout_is_disabled' => 'Checkout is niet mogelijk', 'choose_attrdef' => 'Kies een attribuutdefinitie', @@ -861,6 +863,7 @@ URL: [url]', 'my_transmittals' => 'Mijn zendingen', 'name' => 'Naam', 'nav_brand_admin_tools' => '', +'nav_brand_calendar' => '', 'nav_brand_my_account' => '', 'nav_brand_my_documents' => '', 'nav_brand_view_document' => '', @@ -996,6 +999,8 @@ Als u nog steed problemen ondervind met het inloggen, neem aub contact op met uw 'password_forgotten_send_hash' => 'Verdere instructies zijn naar uw gebruikers email adres verstuurd.', 'password_forgotten_text' => 'Vul het formulier hieronder in en volg de instructie in de email, welke naar u verzonden zal worden.', 'password_forgotten_title' => 'Wachtwoord verzonden', +'password_mismatch_error' => '', +'password_mismatch_error_title' => '', 'password_repeat' => 'Herhaal wachtwoord', 'password_send' => 'Wachtwoord verzonden', 'password_send_text' => 'Als het opgegeven gebruikersnaam en emailadres overeenkomen met een bestaande gebruiker is er een nieuw wachtwoord verzonden naar het opgegeven emailadres. @@ -1245,6 +1250,7 @@ URL: [url]', 'search' => 'Zoeken', 'search_fulltext' => 'Zoek in volledige tekst', 'search_in' => 'Zoek in', +'search_mode' => '', 'search_mode_and' => 'alle woorden', 'search_mode_documents' => 'Alleen documenten', 'search_mode_folders' => 'Alleen mappen', @@ -1286,6 +1292,7 @@ URL: [url]', 'select_mimetype' => 'Selecteer het mime-type', 'select_one' => 'Kies er een', 'select_owner' => 'Kies de eigenaar', +'select_status' => '', 'select_user' => 'Selecteer gebruiker', 'select_users' => 'Klik om gebruikers te selecteren', 'select_value' => 'selecteer waarde', @@ -1881,6 +1888,7 @@ Name: [username] 'timeline_skip_add_file' => 'Bijlage toegevoegd', 'timeline_skip_scheduled_revision' => 'In revisie', 'timeline_skip_status_change_-1' => 'afgewezenen', +'timeline_skip_status_change_-2' => '', 'timeline_skip_status_change_-3' => 'verlopen', 'timeline_skip_status_change_0' => 'wacht op beoordeling', 'timeline_skip_status_change_1' => 'wacht op goedkeuring', @@ -1939,6 +1947,7 @@ URL: [url]', 'unknown_id' => 'Onbekende id', 'unknown_keyword_category' => 'Onbekend sleutelwoordcategorie', 'unknown_owner' => 'Onbekende eigenaar ID', +'unknown_status' => '', 'unknown_user' => 'Onbekende gebruiker', 'unlinked_content' => 'Ongekoppelde inhoud', 'unlinked_documents' => 'nietgekoppelde documenten', diff --git a/languages/pl_PL/lang.inc b/languages/pl_PL/lang.inc index 598e6f979..5142826c0 100644 --- a/languages/pl_PL/lang.inc +++ b/languages/pl_PL/lang.inc @@ -95,6 +95,7 @@ URL: [url]', 'all_users' => 'Wszyscy użytkownicy', 'already_subscribed' => 'Aktualnie subskrybowane', 'and' => 'i', +'apikey' => '', 'apply' => 'Zastosuj', 'approvals_accepted' => 'Zatwierdzenia zaakceptowane', 'approvals_accepted_latest' => 'Zatwierdzenia zaakceptowane później', @@ -257,6 +258,7 @@ URL: [url]', 'checkedout_file_is_unchanged' => 'Plik wyrejestrowanego dokumentu jest nadal niezmieniony. Zameldowanie nie będzie możliwe. Jeśli nie planujesz żadnych modyfikacji, możesz zresetować status transakcji.', 'checkin_document' => 'Zamelduj się', 'checkoutpath_does_not_exist' => 'Ścieżka realizacji transakcji nie istnieje', +'checkout_cancel_confirm' => '', 'checkout_document' => 'Wymelduj się', 'checkout_is_disabled' => 'Wyewidencjonowywanie dokumentów jest wyłączone w konfiguracji.', 'choose_attrdef' => 'Proszę wybrać definicję atrybutu', @@ -837,6 +839,7 @@ URL: [url]', 'my_transmittals' => 'Moi recenzenci', 'name' => 'Nazwa', 'nav_brand_admin_tools' => '', +'nav_brand_calendar' => '', 'nav_brand_my_account' => '', 'nav_brand_my_documents' => '', 'nav_brand_view_document' => '', @@ -973,6 +976,8 @@ Jeśli nadal będą problemy z zalogowaniem, prosimy o kontakt z administratorem 'password_forgotten_send_hash' => 'Instrukcje dotyczące zmiany hasła zostały wysłane na adres email użytkownika.', 'password_forgotten_text' => 'Wypełnij pola poniżej i postępuj wg instrukcji z emaila, który zostanie do Ciebie wysłany.', 'password_forgotten_title' => 'Hasło wysłane', +'password_mismatch_error' => '', +'password_mismatch_error_title' => '', 'password_repeat' => 'Powtórz hasło', 'password_send' => 'Hasło wysłane', 'password_send_text' => 'Twoje nowe hasło zostało wysłane na podany adres e-mail, jeśli login i adres e-mail odpowiadają istniejącemu użytkownikowi. Jeśli w ciągu kilku minut nie otrzymasz wiadomości e-mail, upewnij się, że login i e-mail są poprawne, i ponownie uruchom proces.', @@ -1176,6 +1181,7 @@ URL: [url]', 'search' => 'Szukaj', 'search_fulltext' => 'Przeszukaj całe teksty', 'search_in' => 'Szukaj w', +'search_mode' => '', 'search_mode_and' => 'wszystkie słowa', 'search_mode_documents' => 'Tylko dokumenty', 'search_mode_folders' => 'Tylko foldery', @@ -1217,6 +1223,7 @@ URL: [url]', 'select_mimetype' => '', 'select_one' => 'Wybierz', 'select_owner' => '', +'select_status' => '', 'select_user' => 'Wybierz użytkownika', 'select_users' => 'Kliknij by wybrać użytkowników', 'select_value' => 'Wybrać wartość', @@ -1812,6 +1819,7 @@ Name: [username] 'timeline_skip_add_file' => 'dodano załącznik', 'timeline_skip_scheduled_revision' => 'Zaplanowana wersja', 'timeline_skip_status_change_-1' => 'odrzucony', +'timeline_skip_status_change_-2' => '', 'timeline_skip_status_change_-3' => 'przedawniony', 'timeline_skip_status_change_0' => 'oczekuje na opinię', 'timeline_skip_status_change_1' => 'oczekuje na zatwierdzenie', @@ -1870,6 +1878,7 @@ URL: [url]', 'unknown_id' => 'Nieznany ID', 'unknown_keyword_category' => 'Nieznana kategoria', 'unknown_owner' => 'Nieznany ID właściciela', +'unknown_status' => '', 'unknown_user' => 'Nieznany ID użytkownika', 'unlinked_content' => 'Odłączone treści', 'unlinked_documents' => 'Odłączone dokumenty', diff --git a/languages/pt_BR/lang.inc b/languages/pt_BR/lang.inc index a03ab870e..83aa6355a 100644 --- a/languages/pt_BR/lang.inc +++ b/languages/pt_BR/lang.inc @@ -95,6 +95,7 @@ URL: [url]', 'all_users' => 'Todos os usuários', 'already_subscribed' => 'Já subscrito', 'and' => 'e', +'apikey' => '', 'apply' => 'Aplicar', 'approvals_accepted' => '[no_approvals] aprovações já aceitas', 'approvals_accepted_latest' => 'aprovações aceitas mais recentes', @@ -269,6 +270,7 @@ URL: [url]', 'checkedout_file_is_unchanged' => 'O arquivo do documento retirado ainda está inalterado. A entrada não será possível. Se não planejar nenhuma modificação, você poderá redefinir o estado de retirada.', 'checkin_document' => 'Entrada', 'checkoutpath_does_not_exist' => 'O caminho de retirada não existe', +'checkout_cancel_confirm' => '', 'checkout_document' => 'Retirada', 'checkout_is_disabled' => 'A retirada de documentos está desativada na configuração.', 'choose_attrdef' => 'Por favor escolha a definição de atributo', @@ -868,6 +870,7 @@ URL: [url]', 'my_transmittals' => 'Minhas Transmissões', 'name' => 'Nome', 'nav_brand_admin_tools' => '', +'nav_brand_calendar' => '', 'nav_brand_my_account' => '', 'nav_brand_my_documents' => '', 'nav_brand_view_document' => '', @@ -1003,6 +1006,8 @@ Se você ainda tiver problemas para fazer o login, por favor, contate o administ 'password_forgotten_send_hash' => 'Instruções de como proceder para que seja enviada para o endereço de e-mail do usuário', 'password_forgotten_text' => 'Preencha o formulário abaixo e siga as instruções do e-mail que será enviado para você.', 'password_forgotten_title' => 'Senha enviada', +'password_mismatch_error' => '', +'password_mismatch_error_title' => '', 'password_repeat' => 'Repetir a senha', 'password_send' => 'Senha enviada', 'password_send_text' => 'Sua nova senha foi enviada para o endereço de e-mail indicado, se o login e e-mail corresponde a um usuário existe. Se você não receber um e-mail nos próximos minutos, então certifique se login e e-mail estão corretos e reinicie o processo novamente.', @@ -1252,6 +1257,7 @@ URL: [url]', 'search' => 'Busca', 'search_fulltext' => 'Pesquisa em texto completo', 'search_in' => 'Busca em', +'search_mode' => '', 'search_mode_and' => 'todas as palavras', 'search_mode_documents' => 'Só Documentos', 'search_mode_folders' => 'Só Pastas', @@ -1293,6 +1299,7 @@ URL: [url]', 'select_mimetype' => '', 'select_one' => 'Selecione um', 'select_owner' => '', +'select_status' => '', 'select_user' => 'Selecione o usuário', 'select_users' => 'Clique para selecionar os usuários', 'select_value' => 'Selecionar opção', @@ -1888,6 +1895,7 @@ Nome: [username] 'timeline_skip_add_file' => 'anexo adicionado', 'timeline_skip_scheduled_revision' => 'Revisão agendada', 'timeline_skip_status_change_-1' => 'rejeitado', +'timeline_skip_status_change_-2' => '', 'timeline_skip_status_change_-3' => 'expirado', 'timeline_skip_status_change_0' => 'revisão pendente', 'timeline_skip_status_change_1' => 'aprovação pendente', @@ -1946,6 +1954,7 @@ URL: [url]', 'unknown_id' => 'ID desconhecido', 'unknown_keyword_category' => 'Categoria desconhecida', 'unknown_owner' => 'ID do proprietário desconhecida', +'unknown_status' => '', 'unknown_user' => 'ID do usuário desconhecida', 'unlinked_content' => 'Conteúdo não conectado', 'unlinked_documents' => 'Documentos não conectados', diff --git a/languages/ro_RO/lang.inc b/languages/ro_RO/lang.inc index 303a97f25..d04b70e25 100644 --- a/languages/ro_RO/lang.inc +++ b/languages/ro_RO/lang.inc @@ -95,6 +95,7 @@ URL: [url]', 'all_users' => 'Toti utilizatorii', 'already_subscribed' => 'Deja trimis', 'and' => 'si', +'apikey' => '', 'apply' => 'Aplică', 'approvals_accepted' => '', 'approvals_accepted_latest' => '', @@ -269,6 +270,7 @@ URL: [url]', 'checkedout_file_is_unchanged' => 'Fisierul documentului verificat este inca neschimbat. Check in-ul nu va fi posibil. Daca nu planuiti modificari, puteti reseta starea de Verificare.', 'checkin_document' => 'Check In', 'checkoutpath_does_not_exist' => '', +'checkout_cancel_confirm' => '', 'checkout_document' => 'Verifica', 'checkout_is_disabled' => 'Verificarea documentelor este dezactivata in configurari.', 'choose_attrdef' => 'Vă rugăm să alegeți definiția atributului', @@ -849,6 +851,7 @@ URL: [url]', 'my_transmittals' => 'Trimiterile mele', 'name' => 'Nume', 'nav_brand_admin_tools' => '', +'nav_brand_calendar' => '', 'nav_brand_my_account' => '', 'nav_brand_my_documents' => '', 'nav_brand_view_document' => '', @@ -985,6 +988,8 @@ Dacă aveți în continuare probleme la autentificare, vă rugăm să contactaț 'password_forgotten_send_hash' => 'Instrucțiuni privind modul cum trebuie procedat au fost trimise la adresa de email a utilizatorului', 'password_forgotten_text' => 'Completați formularul de mai jos și urmați instrucțiunile ce vor fi trimise prin e-mail.', 'password_forgotten_title' => 'Parola a fost trimisă', +'password_mismatch_error' => '', +'password_mismatch_error_title' => '', 'password_repeat' => 'Repetați parola', 'password_send' => 'Parola a fost trimisă', 'password_send_text' => 'Noua dumneavoastră parolă a fost trimisă la adresa de e-mail furnizată, în cazul în care campurile de login și email se potrivesc cu un utilizator existent. Dacă nu primiți un e-mail în următoarele minute, asigurați-vă că atât campul de login cât și email sunt corecte și incercați din nou procesul.', @@ -1219,6 +1224,7 @@ URL: [url]', 'search' => 'Caută', 'search_fulltext' => 'Caută în tot textul', 'search_in' => 'Caută în', +'search_mode' => '', 'search_mode_and' => 'toate cuvintele', 'search_mode_documents' => '', 'search_mode_folders' => '', @@ -1260,6 +1266,7 @@ URL: [url]', 'select_mimetype' => '', 'select_one' => 'Selectați unul', 'select_owner' => '', +'select_status' => '', 'select_user' => 'Selecteaza utilizator', 'select_users' => 'Click pentru a selecta utilizatori', 'select_value' => 'Valoare selectata', @@ -1850,6 +1857,7 @@ URL: [url]', 'timeline_skip_add_file' => 'atașament adăugat', 'timeline_skip_scheduled_revision' => '', 'timeline_skip_status_change_-1' => 'rejectat', +'timeline_skip_status_change_-2' => '', 'timeline_skip_status_change_-3' => 'expirat', 'timeline_skip_status_change_0' => 'așteaptă revizuire', 'timeline_skip_status_change_1' => 'așteaptă aprobare', @@ -1908,6 +1916,7 @@ URL: [url]', 'unknown_id' => 'ID necunoscut', 'unknown_keyword_category' => 'Categorie necunoscută', 'unknown_owner' => 'ID proprietar necunoscut', +'unknown_status' => '', 'unknown_user' => 'ID utilizator necunoscut', 'unlinked_content' => 'Conținut dezasociat', 'unlinked_documents' => 'Documente dezasociate', diff --git a/languages/ru_RU/lang.inc b/languages/ru_RU/lang.inc index d1632dd99..b0ddbc4e7 100644 --- a/languages/ru_RU/lang.inc +++ b/languages/ru_RU/lang.inc @@ -95,6 +95,7 @@ URL: [url]', 'all_users' => 'Все пользователи', 'already_subscribed' => 'Уже подписан', 'and' => 'и', +'apikey' => '', 'apply' => 'Применить', 'approvals_accepted' => '', 'approvals_accepted_latest' => '', @@ -269,6 +270,7 @@ URL: [url]', 'checkedout_file_is_unchanged' => 'Документ не изменен. Загрузка не возможна.', 'checkin_document' => 'Получение', 'checkoutpath_does_not_exist' => '', +'checkout_cancel_confirm' => '', 'checkout_document' => 'Загрузка', 'checkout_is_disabled' => 'Загрузка отключена.', 'choose_attrdef' => 'Выберите атрибут', @@ -849,6 +851,7 @@ URL: [url]', 'my_transmittals' => 'Мои пересылки', 'name' => 'Имя', 'nav_brand_admin_tools' => '', +'nav_brand_calendar' => '', 'nav_brand_my_account' => '', 'nav_brand_my_documents' => '', 'nav_brand_view_document' => '', @@ -982,6 +985,8 @@ URL: [url]', 'password_forgotten_send_hash' => 'Инструкции высланы на e-mail', 'password_forgotten_text' => 'Заполните форму и следуйте инструкциям в письме', 'password_forgotten_title' => 'Пароль выслан', +'password_mismatch_error' => '', +'password_mismatch_error_title' => '', 'password_repeat' => 'Повторите пароль', 'password_send' => 'Пароль выслан', 'password_send_text' => 'Пароль отправлен', @@ -1226,6 +1231,7 @@ URL: [url]', 'search' => 'Поиск', 'search_fulltext' => 'Полнотекстовый поиск', 'search_in' => 'Поиск', +'search_mode' => '', 'search_mode_and' => 'Все слова', 'search_mode_documents' => 'Только документы', 'search_mode_folders' => 'Только папки', @@ -1267,6 +1273,7 @@ URL: [url]', 'select_mimetype' => '', 'select_one' => 'Выберите', 'select_owner' => '', +'select_status' => '', 'select_user' => 'Выберите пользователя', 'select_users' => 'Выберите пользователей', 'select_value' => 'Выберите значение', @@ -1857,6 +1864,7 @@ URL: [url]', 'timeline_skip_add_file' => 'вложение добавлено', 'timeline_skip_scheduled_revision' => '', 'timeline_skip_status_change_-1' => 'отклонён', +'timeline_skip_status_change_-2' => '', 'timeline_skip_status_change_-3' => 'срок действия вышел', 'timeline_skip_status_change_0' => 'ожидает рецензии', 'timeline_skip_status_change_1' => 'ожидает подтверждения', @@ -1915,6 +1923,7 @@ URL: [url]', 'unknown_id' => 'неизвестный идентификатор', 'unknown_keyword_category' => 'Неизвестная метка', 'unknown_owner' => 'Неизвестный идентификатор собственника', +'unknown_status' => '', 'unknown_user' => 'Неизвестный идентификатор пользователя', 'unlinked_content' => 'Удалённое содержимое', 'unlinked_documents' => 'Удалённые документы', diff --git a/languages/sk_SK/lang.inc b/languages/sk_SK/lang.inc index 2453099c3..53426622a 100644 --- a/languages/sk_SK/lang.inc +++ b/languages/sk_SK/lang.inc @@ -95,6 +95,7 @@ URL: [url]', 'all_users' => 'Všetci používatelia', 'already_subscribed' => 'Už ste sa prihlásili na odber', 'and' => 'a', +'apikey' => '', 'apply' => 'Použiť', 'approvals_accepted' => '[no_approvals] approvals already accepted', 'approvals_accepted_latest' => '', @@ -269,6 +270,7 @@ URL: [url]', 'checkedout_file_is_unchanged' => 'The file of the checked out document is still unchanged. Check in will not be possible. If do not plan any modifications, you can reset the check out status.', 'checkin_document' => 'Check In', 'checkoutpath_does_not_exist' => 'Checkout path does not exists', +'checkout_cancel_confirm' => '', 'checkout_document' => 'Pozrieť sa na dokument', 'checkout_is_disabled' => 'Kontrola dokumentov je zakázaná v konfigurácii.', 'choose_attrdef' => 'Vyberte prosím definíciu atribútu', @@ -868,6 +870,7 @@ URL: [url]', 'my_transmittals' => 'My Transmittals', 'name' => 'Meno', 'nav_brand_admin_tools' => '', +'nav_brand_calendar' => '', 'nav_brand_my_account' => '', 'nav_brand_my_documents' => '', 'nav_brand_view_document' => '', @@ -1004,6 +1007,8 @@ If you have still problems to login, then please contact your administrator.', 'password_forgotten_send_hash' => 'Instructions on how to proceed has been send to the user\'s email address', 'password_forgotten_text' => 'Fill out the form below and follow the instructions in the email, which will be sent to you.', 'password_forgotten_title' => 'Heslo bolo odoslané', +'password_mismatch_error' => '', +'password_mismatch_error_title' => '', 'password_repeat' => 'Zopakovať heslo', 'password_send' => 'Odoslať heslo', 'password_send_text' => 'Your new password has been send to the given email address, if the login and email matches an existing user. If you do not receive an email within the next minutes, then make sure both login and email are correct and restart the process again.', @@ -1254,6 +1259,7 @@ URL: [url]', 'search' => 'Hľadať', 'search_fulltext' => 'Vyhľadávanie vo fulltexte', 'search_in' => 'Prehľadávať', +'search_mode' => '', 'search_mode_and' => 'všetky slová', 'search_mode_documents' => 'Iba dokumenty', 'search_mode_folders' => 'Iba zložky', @@ -1295,6 +1301,7 @@ URL: [url]', 'select_mimetype' => '', 'select_one' => 'Vyberte', 'select_owner' => '', +'select_status' => '', 'select_user' => 'Vyberte používateľa', 'select_users' => 'Kliknutím vyberte používateľov', 'select_value' => 'Vyberte hodnotu', @@ -1890,6 +1897,7 @@ Meno: [username] 'timeline_skip_add_file' => 'príloha bola pridaná', 'timeline_skip_scheduled_revision' => 'Scheduled revision', 'timeline_skip_status_change_-1' => 'odmietnuté', +'timeline_skip_status_change_-2' => '', 'timeline_skip_status_change_-3' => 'expirovaný', 'timeline_skip_status_change_0' => 'čaká na revíziu', 'timeline_skip_status_change_1' => 'čaká na potvrdenie', @@ -1948,6 +1956,7 @@ URL: [url]', 'unknown_id' => 'Neznáme ID', 'unknown_keyword_category' => 'Neznáma kategória', 'unknown_owner' => 'Neznámy ID vlastníka', +'unknown_status' => '', 'unknown_user' => 'Neznámy ID používateľa', 'unlinked_content' => 'Obsah bol odpojený', 'unlinked_documents' => 'Dokumenty boli odpojené', diff --git a/languages/sv_SE/lang.inc b/languages/sv_SE/lang.inc index 4bcf3f192..2230960d3 100644 --- a/languages/sv_SE/lang.inc +++ b/languages/sv_SE/lang.inc @@ -96,6 +96,7 @@ URL: [url]', 'all_users' => 'Alla användare', 'already_subscribed' => 'Prenumererar redan', 'and' => 'och', +'apikey' => '', 'apply' => 'Använd', 'approvals_accepted' => '', 'approvals_accepted_latest' => '', @@ -270,6 +271,7 @@ URL: [url]', 'checkedout_file_is_unchanged' => 'Filen för det utcheckade dokumentet är oförändrad och inchecknign är inte möjlig. Om du inte planerar att göra någon modifiering kan du återställa dokumentets utcheckningsstatus.', 'checkin_document' => 'Incheckning', 'checkoutpath_does_not_exist' => 'Sökvägen för utcheckning saknas', +'checkout_cancel_confirm' => '', 'checkout_document' => 'Utcheckning', 'checkout_is_disabled' => 'Utcheckning av dokument är invaktiverad i systemets inställningar.', 'choose_attrdef' => 'Välj attributdefinition', @@ -855,6 +857,7 @@ URL: [url]', 'my_transmittals' => 'Mina överföringar', 'name' => 'Namn', 'nav_brand_admin_tools' => '', +'nav_brand_calendar' => '', 'nav_brand_my_account' => '', 'nav_brand_my_documents' => '', 'nav_brand_view_document' => '', @@ -988,6 +991,8 @@ Om du fortfarande har problem med inloggningen, kontakta administratören.', 'password_forgotten_send_hash' => 'En beskrivning av vad du måste göra har nu skickats till din e-postadress.', 'password_forgotten_text' => 'Fyll i formuläret nedan och följ instruktionerna som skickas till din e-postadress.', 'password_forgotten_title' => 'Glömt lösenord', +'password_mismatch_error' => '', +'password_mismatch_error_title' => '', 'password_repeat' => 'Upprepa lösenord', 'password_send' => 'Lösenord skickat', 'password_send_text' => 'Ditt nya lösenord har skickats till den angivna e-postadressen, förutsatt att användarnamn och e-postadressen matchar en existerande användare. Om du inte får ett epost inom några minuter, kontrollera att användarnamn och e-postadressen är rätt. Begär ett nytt lösenord igen.', @@ -1227,6 +1232,7 @@ URL: [url]', 'search' => 'Sök', 'search_fulltext' => 'Fulltext-sökning', 'search_in' => 'Sök i', +'search_mode' => '', 'search_mode_and' => 'alla ord', 'search_mode_documents' => 'Endast dokument', 'search_mode_folders' => 'Endast kataloger', @@ -1268,6 +1274,7 @@ URL: [url]', 'select_mimetype' => '', 'select_one' => 'Välj', 'select_owner' => '', +'select_status' => '', 'select_user' => 'Välj användare', 'select_users' => 'Välj användare', 'select_value' => 'Välj värde', @@ -1863,6 +1870,7 @@ Kommentar: [comment]', 'timeline_skip_add_file' => 'Bilaga tillagd', 'timeline_skip_scheduled_revision' => '', 'timeline_skip_status_change_-1' => 'avvisad', +'timeline_skip_status_change_-2' => '', 'timeline_skip_status_change_-3' => 'utgånget', 'timeline_skip_status_change_0' => 'väntar på granskning', 'timeline_skip_status_change_1' => 'väntar på godkännande', @@ -1921,6 +1929,7 @@ URL: [url]', 'unknown_id' => 'Okänt ID', 'unknown_keyword_category' => 'Okänd kategori', 'unknown_owner' => 'Okänt ägar-ID', +'unknown_status' => '', 'unknown_user' => 'Okänt användar-ID', 'unlinked_content' => 'Olänkat innehåll', 'unlinked_documents' => 'Olänkade dokument', diff --git a/languages/tr_TR/lang.inc b/languages/tr_TR/lang.inc index b597dd104..f40a4e19f 100644 --- a/languages/tr_TR/lang.inc +++ b/languages/tr_TR/lang.inc @@ -94,6 +94,7 @@ URL: [url]', 'all_users' => 'Tüm kullanıcılar', 'already_subscribed' => 'Zaten kayıtlı', 'and' => 've', +'apikey' => '', 'apply' => 'Uygula', 'approvals_accepted' => '', 'approvals_accepted_latest' => '', @@ -263,6 +264,7 @@ URL: [url]', 'checkedout_file_is_unchanged' => '', 'checkin_document' => '', 'checkoutpath_does_not_exist' => '', +'checkout_cancel_confirm' => '', 'checkout_document' => '', 'checkout_is_disabled' => '', 'choose_attrdef' => 'Lütfen nitelik tanımını seçiniz', @@ -843,6 +845,7 @@ URL: [url]', 'my_transmittals' => 'Çevirilerim', 'name' => 'İsim', 'nav_brand_admin_tools' => '', +'nav_brand_calendar' => '', 'nav_brand_my_account' => '', 'nav_brand_my_documents' => '', 'nav_brand_view_document' => '', @@ -981,6 +984,8 @@ Giriş yaparken halen sorun yaşıyorsanız lütfen sistem yöneticinizle görü 'password_forgotten_send_hash' => 'Yeni şifre alma talimatı kullanıcının e-posta adresine gönderilmiştir.', 'password_forgotten_text' => 'Aşağıdaki formu doldurunuz ve e-posta adresinize gönderilecek olan talimatı uygulayınız.', 'password_forgotten_title' => 'Parola gönderildi', +'password_mismatch_error' => '', +'password_mismatch_error_title' => '', 'password_repeat' => 'Parolayı tekrar giriniz', 'password_send' => 'Parola gönderildi', 'password_send_text' => 'Kullanıcı adı ve e-posta adresiniz eşleştiyse yeni parolanız belirttiğiniz e-posta adresinize gönderilmiş olacaktır. Eğer birkaç dakika içerisinde e-posta adresinize mesaj gelmezse kullanıcı adı ve sisteme kayıtlı e-posta adresinizin doğru olduğundan emin olarak işlemi tekrarlayınız.', @@ -1198,6 +1203,7 @@ URL: [url]', 'search' => 'Ara', 'search_fulltext' => 'Tam metinde ara', 'search_in' => 'Şurada ara', +'search_mode' => '', 'search_mode_and' => 'tüm sözcükler', 'search_mode_documents' => 'Sadece Belgeler', 'search_mode_folders' => 'Sadece Klasörler', @@ -1239,6 +1245,7 @@ URL: [url]', 'select_mimetype' => '', 'select_one' => 'Birini seçiniz', 'select_owner' => '', +'select_status' => '', 'select_user' => 'Kullanıcı Seç', 'select_users' => 'Kullanıcı seçmek için tıklayın', 'select_value' => 'Değeri seç', @@ -1829,6 +1836,7 @@ URL: [url]', 'timeline_skip_add_file' => 'ek eklendi', 'timeline_skip_scheduled_revision' => '', 'timeline_skip_status_change_-1' => '', +'timeline_skip_status_change_-2' => '', 'timeline_skip_status_change_-3' => '', 'timeline_skip_status_change_0' => '', 'timeline_skip_status_change_1' => '', @@ -1887,6 +1895,7 @@ URL: [url]', 'unknown_id' => 'bilinmeyen id', 'unknown_keyword_category' => 'Bilinmeyen kategori', 'unknown_owner' => 'Bilinmeyen sahip Id', +'unknown_status' => '', 'unknown_user' => 'Bilinmeyen kullanıcı ID', 'unlinked_content' => 'Linki kaldırılmış içerik', 'unlinked_documents' => 'Linki kaldırılmış dokümanlar', diff --git a/languages/uk_UA/lang.inc b/languages/uk_UA/lang.inc index 27113fab7..571525da2 100644 --- a/languages/uk_UA/lang.inc +++ b/languages/uk_UA/lang.inc @@ -95,6 +95,7 @@ URL: [url]', 'all_users' => 'Всі користувачі', 'already_subscribed' => 'Вже підписаний', 'and' => 'і', +'apikey' => '', 'apply' => 'Застосувати', 'approvals_accepted' => '', 'approvals_accepted_latest' => '', @@ -269,6 +270,7 @@ URL: [url]', 'checkedout_file_is_unchanged' => 'Документ не змінено. Завантаження неможливе', 'checkin_document' => 'Отримання', 'checkoutpath_does_not_exist' => '', +'checkout_cancel_confirm' => '', 'checkout_document' => 'Завантаження', 'checkout_is_disabled' => 'Завантаження відключене', 'choose_attrdef' => 'Оберіть атрибут', @@ -849,6 +851,7 @@ URL: [url]', 'my_transmittals' => 'Мої перенесення', 'name' => 'Назва', 'nav_brand_admin_tools' => '', +'nav_brand_calendar' => '', 'nav_brand_my_account' => '', 'nav_brand_my_documents' => '', 'nav_brand_view_document' => '', @@ -982,6 +985,8 @@ URL: [url]', 'password_forgotten_send_hash' => 'Інструкції вислано на e-mail', 'password_forgotten_text' => 'Заповніть форму і виконайте інструкції в листі', 'password_forgotten_title' => 'Пароль вислано', +'password_mismatch_error' => '', +'password_mismatch_error_title' => '', 'password_repeat' => 'Повторіть пароль', 'password_send' => 'Пароль відіслано', 'password_send_text' => 'Пароль відіслано.', @@ -1219,6 +1224,7 @@ URL: [url]', 'search' => 'Пошук', 'search_fulltext' => 'Повнотекстовий пошук', 'search_in' => 'Пошук', +'search_mode' => '', 'search_mode_and' => 'Всі слова', 'search_mode_documents' => 'Режим пошуку документів', 'search_mode_folders' => 'Режим пошуку каталогів', @@ -1260,6 +1266,7 @@ URL: [url]', 'select_mimetype' => '', 'select_one' => 'Оберіть', 'select_owner' => '', +'select_status' => '', 'select_user' => '', 'select_users' => 'Оберіть користувачів', 'select_value' => 'Обрати значення', @@ -1850,6 +1857,7 @@ URL: [url]', 'timeline_skip_add_file' => 'додаток додано', 'timeline_skip_scheduled_revision' => '', 'timeline_skip_status_change_-1' => 'відхилений', +'timeline_skip_status_change_-2' => '', 'timeline_skip_status_change_-3' => 'термін виконання вийшов', 'timeline_skip_status_change_0' => 'очікує рецензії', 'timeline_skip_status_change_1' => 'очікую підтвердження', @@ -1908,6 +1916,7 @@ URL: [url]', 'unknown_id' => 'невідомий ідентифікатор', 'unknown_keyword_category' => 'Невідома категорія', 'unknown_owner' => 'Невідомий ідентифікатор власника', +'unknown_status' => '', 'unknown_user' => 'Невідомий ідентифікатор користувача', 'unlinked_content' => 'Віддалений вміст', 'unlinked_documents' => 'Видалені документи', diff --git a/languages/zh_CN/lang.inc b/languages/zh_CN/lang.inc index d58972259..91ca89d14 100644 --- a/languages/zh_CN/lang.inc +++ b/languages/zh_CN/lang.inc @@ -95,6 +95,7 @@ URL: [url]', 'all_users' => '所有用户', 'already_subscribed' => '已经订阅', 'and' => 'and', +'apikey' => '', 'apply' => '应用', 'approvals_accepted' => '', 'approvals_accepted_latest' => '', @@ -261,6 +262,7 @@ URL: [url]', 'checkedout_file_is_unchanged' => '', 'checkin_document' => '签入', 'checkoutpath_does_not_exist' => '签出路径不存在', +'checkout_cancel_confirm' => '', 'checkout_document' => '签出', 'checkout_is_disabled' => '', 'choose_attrdef' => '请选择属性', @@ -839,6 +841,7 @@ URL: [url]', 'my_transmittals' => '我的送达函', 'name' => '名称', 'nav_brand_admin_tools' => '', +'nav_brand_calendar' => '', 'nav_brand_my_account' => '', 'nav_brand_my_documents' => '', 'nav_brand_view_document' => '', @@ -975,6 +978,8 @@ URL: [url]', 'password_forgotten_send_hash' => '', 'password_forgotten_text' => '填写以下表格,并遵循邮件中的指示找回遗失密码。', 'password_forgotten_title' => '密码已发送', +'password_mismatch_error' => '', +'password_mismatch_error_title' => '', 'password_repeat' => '重复密码', 'password_send' => '发送密码', 'password_send_text' => '您的新密码已通过邮件发送给您。若您尚未收到该邮件,请确认登陆用户名和对应的电子邮件填写是否正确,并重试。', @@ -1189,6 +1194,7 @@ URL: [url]', 'search' => '搜索', 'search_fulltext' => '全文检索', 'search_in' => '搜索于', +'search_mode' => '', 'search_mode_and' => '与模式', 'search_mode_documents' => '仅文档', 'search_mode_folders' => '仅目录', @@ -1230,6 +1236,7 @@ URL: [url]', 'select_mimetype' => '', 'select_one' => '选择一个', 'select_owner' => '', +'select_status' => '', 'select_user' => '选择用户', 'select_users' => '点击选择用户', 'select_value' => '选择值', @@ -1825,6 +1832,7 @@ URL: [url]', 'timeline_skip_add_file' => '添加附件', 'timeline_skip_scheduled_revision' => '', 'timeline_skip_status_change_-1' => '拒绝', +'timeline_skip_status_change_-2' => '', 'timeline_skip_status_change_-3' => '过期', 'timeline_skip_status_change_0' => '待审核', 'timeline_skip_status_change_1' => '待批准', @@ -1874,6 +1882,7 @@ URL: [url]', 'unknown_id' => '未知ID号', 'unknown_keyword_category' => '未知类别', 'unknown_owner' => '未知所有者ID号', +'unknown_status' => '', 'unknown_user' => '未知用户ID号', 'unlinked_content' => '未链接内容', 'unlinked_documents' => '未链接的文档', diff --git a/languages/zh_TW/lang.inc b/languages/zh_TW/lang.inc index adb741fe0..f4fa72eec 100644 --- a/languages/zh_TW/lang.inc +++ b/languages/zh_TW/lang.inc @@ -95,6 +95,7 @@ URL: [url]', 'all_users' => '所有使用者', 'already_subscribed' => '已經訂閱', 'and' => '和', +'apikey' => '', 'apply' => '接受', 'approvals_accepted' => '[no_approvals]個批准已被接受', 'approvals_accepted_latest' => '(最新版本為[no_approvals])', @@ -269,6 +270,7 @@ URL: [url]', 'checkedout_file_is_unchanged' => '簽出文件的文件仍保持不變。無法辦理入住手續。如果不計劃任何修改,則可以重置簽出狀態。', 'checkin_document' => '簽入', 'checkoutpath_does_not_exist' => '簽出路徑不存在', +'checkout_cancel_confirm' => '', 'checkout_document' => '簽出', 'checkout_is_disabled' => '在配置中禁用了簽出文件功能。', 'choose_attrdef' => '請選擇屬性', @@ -868,6 +870,7 @@ URL: [url]', 'my_transmittals' => '我的傳送', 'name' => '名稱', 'nav_brand_admin_tools' => '', +'nav_brand_calendar' => '', 'nav_brand_my_account' => '', 'nav_brand_my_documents' => '', 'nav_brand_view_document' => '', @@ -1002,6 +1005,8 @@ URL: [url]', 'password_forgotten_send_hash' => '有關如何進行操作的說明已發送到使用者的電子郵件地址', 'password_forgotten_text' => '填寫以下表格,然後按照將發送給您的電子郵件中的說明進行操作。', 'password_forgotten_title' => '密碼已寄出', +'password_mismatch_error' => '', +'password_mismatch_error_title' => '', 'password_repeat' => '重複輸入密碼', 'password_send' => '密碼寄出', 'password_send_text' => '如果登錄名和電子郵件與現有使用者匹配,則您的新密碼已發送到給定的電子郵件地址。如果您在接下來的幾分鐘內沒有收到電子郵件,請確保登錄名和電子郵件均正確無誤,然後重新啟動該過程。', @@ -1252,6 +1257,7 @@ URL: [url]', 'search' => '搜索', 'search_fulltext' => '全文檢索', 'search_in' => '搜索於', +'search_mode' => '', 'search_mode_and' => '與模式', 'search_mode_documents' => '只文件', 'search_mode_folders' => '只資料夾', @@ -1293,6 +1299,7 @@ URL: [url]', 'select_mimetype' => '', 'select_one' => '選擇一個', 'select_owner' => '', +'select_status' => '', 'select_user' => '選擇使用者', 'select_users' => '點擊選擇使用者', 'select_value' => '選取值', @@ -1888,6 +1895,7 @@ URL: [url]', 'timeline_skip_add_file' => '新增附件', 'timeline_skip_scheduled_revision' => '預定修訂', 'timeline_skip_status_change_-1' => '拒絕', +'timeline_skip_status_change_-2' => '', 'timeline_skip_status_change_-3' => '已過期', 'timeline_skip_status_change_0' => '等待審核', 'timeline_skip_status_change_1' => '等待批准', @@ -1946,6 +1954,7 @@ URL: [url]', 'unknown_id' => '未知ID號', 'unknown_keyword_category' => '未知類別', 'unknown_owner' => '未知所有者ID號', +'unknown_status' => '', 'unknown_user' => '未知使用者ID號', 'unlinked_content' => '未關聯的內容', 'unlinked_documents' => '未關聯的文件', From 9a2ebf80cc98fb7ff39e9f026fb3a04d0db77bb8 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 14 May 2021 12:37:10 +0200 Subject: [PATCH 189/403] fix sending notification mail to group, add mandatory group rev/app --- op/op.Ajax.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/op/op.Ajax.php b/op/op.Ajax.php index f9b4ce487..cc4f90e69 100644 --- a/op/op.Ajax.php +++ b/op/op.Ajax.php @@ -760,10 +760,14 @@ switch($command) { $mreviewers = getMandatoryReviewers($folder, $user); if($mreviewers['i']) $reviewers['i'] = array_merge($reviewers['i'], $mreviewers['i']); + if($mreviewers['g']) + $reviewers['g'] = array_merge($reviewers['g'], $mreviewers['g']); } $mapprovers = getMandatoryApprovers($folder, $user); if($mapprovers['i']) $approvers['i'] = array_merge($approvers['i'], $mapprovers['i']); + if($mapprovers['g']) + $approvers['g'] = array_merge($approvers['g'], $mapprovers['g']); } elseif($settings->_workflowMode == 'advanced') { $workflow = $user->getMandatoryWorkflow(); @@ -889,7 +893,7 @@ switch($command) { $notifier->toIndividual($user, $dms->getUser($reviewerid), $subject, $message, $params, SeedDMS_NotificationService::RECV_REVIEWER); } foreach($reviewers['g'] as $reviewergrpid) { - $notifier->toGroup($user, $dms->getGroup($reviewergrpid), $subject, $message, $params, $params, SeedDMS_NotificationService::RECV_REVIEWER); + $notifier->toGroup($user, $dms->getGroup($reviewergrpid), $subject, $message, $params, SeedDMS_NotificationService::RECV_REVIEWER); } } From 5a74c3debfdd7a05b1c04ac536416d5bcf86629e Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 14 May 2021 12:37:37 +0200 Subject: [PATCH 190/403] add mandatory group reviewer/approver --- op/op.AddDocument.php | 4 ++++ op/op.UpdateDocument.php | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/op/op.AddDocument.php b/op/op.AddDocument.php index 85da330b7..5ea2dec72 100644 --- a/op/op.AddDocument.php +++ b/op/op.AddDocument.php @@ -205,10 +205,14 @@ if($settings->_workflowMode == 'traditional' || $settings->_workflowMode == 'tra $mreviewers = getMandatoryReviewers($folder, $user); if($mreviewers['i']) $reviewers['i'] = array_merge($reviewers['i'], $mreviewers['i']); + if($mreviewers['g']) + $reviewers['g'] = array_merge($reviewers['g'], $mreviewers['g']); } $mapprovers = getMandatoryApprovers($folder, $user); if($mapprovers['i']) $approvers['i'] = array_merge($approvers['i'], $mapprovers['i']); + if($mapprovers['g']) + $approvers['g'] = array_merge($approvers['g'], $mapprovers['g']); if($settings->_workflowMode == 'traditional' && !$settings->_allowReviewerOnly) { /* Check if reviewers are set but no approvers */ diff --git a/op/op.UpdateDocument.php b/op/op.UpdateDocument.php index 331c801e4..ed058e325 100644 --- a/op/op.UpdateDocument.php +++ b/op/op.UpdateDocument.php @@ -214,10 +214,14 @@ default: $mreviewers = getMandatoryReviewers($folder, $user); if($mreviewers['i']) $reviewers['i'] = array_merge($reviewers['i'], $mreviewers['i']); + if($mreviewers['g']) + $reviewers['g'] = array_merge($reviewers['g'], $mreviewers['g']); } $mapprovers = getMandatoryApprovers($folder, $user); if($mapprovers['i']) $approvers['i'] = array_merge($approvers['i'], $mapprovers['i']); + if($mapprovers['g']) + $approvers['g'] = array_merge($approvers['g'], $mapprovers['g']); } elseif($settings->_workflowMode == 'advanced') { if(!$workflows = $user->getMandatoryWorkflows()) { if(isset($_POST["workflow"])) From 639c280920d63baa545fde61716478fcd9dbe5b9 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 14 May 2021 12:39:05 +0200 Subject: [PATCH 191/403] add changes for 5.1.23 --- CHANGELOG | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index 9860636a0..d5d0e3e0c 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -11,6 +11,8 @@ - typeahead search for folders can search in subfolders - new theme based on bootstrap 4, including many improvements on small displays - propperly check for translation of html email body (Closes: #510) +- set mandatory group reviewer/approver when adding a new document or version +- fix sending notification mails to group when uploading document via drag&drop -------------------------------------------------------------------------------- Changes in version 5.1.22 From 1ac8f31105fd787e8c64768fbb6b1e4f2df46709 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 14 May 2021 19:05:02 +0200 Subject: [PATCH 192/403] check if shift key was preset when clicked in a folder/document row --- views/bootstrap/class.Bootstrap.php | 20 ++++++++++++------ views/bootstrap/class.ViewFolder.php | 18 +++++++++------- views/bootstrap4/class.Bootstrap4.php | 30 ++++++++++++++++++--------- 3 files changed, 45 insertions(+), 23 deletions(-) diff --git a/views/bootstrap/class.Bootstrap.php b/views/bootstrap/class.Bootstrap.php index 79f27fac7..b93a16179 100644 --- a/views/bootstrap/class.Bootstrap.php +++ b/views/bootstrap/class.Bootstrap.php @@ -2751,8 +2751,12 @@ $(document).ready( function() { ?> /* catch click on a document row in the list folders and documents */ $('body').on('click', '[id^=\"table-row-document\"] td:nth-child(2)', function(ev) { - attr_id = $(ev.currentTarget).parent().attr('id').split('-')[3]; - window.location = '../out/out.ViewDocument.php?documentid=' + attr_id; + if(ev.shiftKey) { + $(ev.currentTarget).parent().toggleClass('selected'); + } else { + attr_id = $(ev.currentTarget).parent().attr('id').split('-')[3]; + window.location = '../out/out.ViewDocument.php?documentid=' + attr_id; + } }); /* catch click on a document row in the list folders and documents */ $('body').on('click', '[id^=\"table-row-folder\"] td:nth-child(2)', function(ev) { - attr_id = $(ev.currentTarget).parent().data('target-id'); - if(typeof attr_id == 'undefined') - attr_id = $(ev.currentTarget).parent().attr('id').split('-')[3]; - window.location = '../out/out.ViewFolder.php?folderid=' + attr_id; + if(ev.shiftKey) { + $(ev.currentTarget).parent().toggleClass('selected'); + } else { + attr_id = $(ev.currentTarget).parent().data('target-id'); + if(typeof attr_id == 'undefined') + attr_id = $(ev.currentTarget).parent().attr('id').split('-')[3]; + window.location = '../out/out.ViewFolder.php?folderid=' + attr_id; + } }); printClickDocumentJs(); diff --git a/views/bootstrap4/class.Bootstrap4.php b/views/bootstrap4/class.Bootstrap4.php index ed720ed63..497b11c0d 100644 --- a/views/bootstrap4/class.Bootstrap4.php +++ b/views/bootstrap4/class.Bootstrap4.php @@ -2798,8 +2798,12 @@ $(document).ready( function() { ?> /* catch click on a document row in the list folders and documents */ $('body').on('click', '[id^=\"table-row-document\"] td:nth-child(2)', function(ev) { - attr_id = $(ev.currentTarget).parent().attr('id').split('-')[3]; - window.location = '../out/out.ViewDocument.php?documentid=' + attr_id; + if(ev.shiftKey) { + $(ev.currentTarget).parent().toggleClass('selected'); + } else { + attr_id = $(ev.currentTarget).parent().attr('id').split('-')[3]; + window.location = '../out/out.ViewDocument.php?documentid=' + attr_id; + } }); /* catch click on a document row in the list folders and documents */ $('body').on('click', '[id^=\"table-row-folder\"] td:nth-child(2)', function(ev) { - attr_id = $(ev.currentTarget).parent().data('target-id'); - if(typeof attr_id == 'undefined') - attr_id = $(ev.currentTarget).parent().attr('id').split('-')[3]; - window.location = '../out/out.ViewFolder.php?folderid=' + attr_id; + if(ev.shiftKey) { + $(ev.currentTarget).parent().toggleClass('selected'); + } else { + attr_id = $(ev.currentTarget).parent().data('target-id'); + if(typeof attr_id == 'undefined') + attr_id = $(ev.currentTarget).parent().attr('id').split('-')[3]; + window.location = '../out/out.ViewFolder.php?folderid=' + attr_id; + } }); getID(); return "getName(), ENT_QUOTES)."\">"; } /* }}} */ From e5159ca7f96df62954ff42071a66c1bcaa244265 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 14 May 2021 21:54:34 +0200 Subject: [PATCH 193/403] add methods SeedDMS_Core_DocumentContent::getReviewers() and SeedDMS_Core_DocumentContent::getApprovers() --- SeedDMS_Core/Core/inc.ClassDocument.php | 58 +++++++++++++++++++++++++ SeedDMS_Core/package.xml | 1 + 2 files changed, 59 insertions(+) diff --git a/SeedDMS_Core/Core/inc.ClassDocument.php b/SeedDMS_Core/Core/inc.ClassDocument.php index 4adf9f771..73b5604ec 100644 --- a/SeedDMS_Core/Core/inc.ClassDocument.php +++ b/SeedDMS_Core/Core/inc.ClassDocument.php @@ -3382,6 +3382,35 @@ class SeedDMS_Core_DocumentContent extends SeedDMS_Core_Object { /* {{{ */ return M_NONE; } /* }}} */ + /** + * Return a list of all reviewers separated by individuals and groups + * + * @return array|bool|null + */ + function getReviewers() { /* {{{ */ + $dms = $this->_document->getDMS(); + $db = $dms->getDB(); + + $queryStr= + "SELECT * FROM `tblDocumentReviewers` WHERE `version`='".$this->_version + ."' AND `documentID` = '". $this->_document->getID() ."' "; + + $recs = $db->getResultArray($queryStr); + if (is_bool($recs)) + return false; + $reviewers = array('i'=>array(), 'g'=>array()); + foreach($recs as $rec) { + if($rec['type'] == 0) { + if($u = $dms->getUser($rec['required'])) + $reviewers['i'][] = $u; + } elseif($rec['type'] == 1) { + if($g = $dms->getGroup($rec['required'])) + $reviewers['g'][] = $g; + } + } + return $reviewers; + } /* }}} */ + /** * Get the current review status of the document content * The review status is a list of reviews and its current status @@ -3510,6 +3539,35 @@ class SeedDMS_Core_DocumentContent extends SeedDMS_Core_Object { /* {{{ */ return true; } /* }}} */ + /** + * Return a list of all approvers separated by individuals and groups + * + * @return array|bool|null + */ + function getApprovers() { /* {{{ */ + $dms = $this->_document->getDMS(); + $db = $dms->getDB(); + + $queryStr= + "SELECT * FROM `tblDocumentApprovers` WHERE `version`='".$this->_version + ."' AND `documentID` = '". $this->_document->getID() ."' "; + + $recs = $db->getResultArray($queryStr); + if (is_bool($recs)) + return false; + $approvers = array('i'=>array(), 'g'=>array()); + foreach($recs as $rec) { + if($rec['type'] == 0) { + if($u = $dms->getUser($rec['required'])) + $approvers['i'][] = $u; + } elseif($rec['type'] == 1) { + if($g = $dms->getGroup($rec['required'])) + $approvers['g'][] = $g; + } + } + return $approvers; + } /* }}} */ + /** * Get the current approval status of the document content * The approval status is a list of approvals and its current status diff --git a/SeedDMS_Core/package.xml b/SeedDMS_Core/package.xml index 43aa9050f..f09a4a087 100644 --- a/SeedDMS_Core/package.xml +++ b/SeedDMS_Core/package.xml @@ -25,6 +25,7 @@ GPL License - SeedDMS_Core_DMS::getTimeline() uses status log instead of document content +- add methods SeedDMS_Core_DocumentContent::getReviewers() and SeedDMS_Core_DocumentContent::getApprovers() From e40fcf1c2cedc80db54ccf12b7f831aa4d931234 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 14 May 2021 21:55:00 +0200 Subject: [PATCH 194/403] add method sendNewDocumentMail(), settings can be passed to construct --- inc/inc.Notification.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/inc.Notification.php b/inc/inc.Notification.php index cfc3ab615..e02404a13 100644 --- a/inc/inc.Notification.php +++ b/inc/inc.Notification.php @@ -13,7 +13,7 @@ */ global $logger; -$notifier = new SeedDMS_NotificationService($logger); +$notifier = new SeedDMS_NotificationService($logger, $settings); if(isset($GLOBALS['SEEDDMS_HOOKS']['notification'])) { foreach($GLOBALS['SEEDDMS_HOOKS']['notification'] as $notificationObj) { From ca52671bac8a420231904a6e604d5b6ca1502f33 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 14 May 2021 21:55:48 +0200 Subject: [PATCH 195/403] add method sendNewDocumentMail(), settings can be passed to construct --- inc/inc.ClassNotificationService.php | 140 ++++++++++++++++++++++++--- 1 file changed, 126 insertions(+), 14 deletions(-) diff --git a/inc/inc.ClassNotificationService.php b/inc/inc.ClassNotificationService.php index 6a76f6396..aabd049cd 100644 --- a/inc/inc.ClassNotificationService.php +++ b/inc/inc.ClassNotificationService.php @@ -36,6 +36,11 @@ class SeedDMS_NotificationService { */ protected $logger; + /* + * Configuration + */ + protected $settings; + /* * Possible types of receivers */ @@ -46,28 +51,29 @@ class SeedDMS_NotificationService { const RECV_APPROVER = 4; const RECV_WORKFLOW = 5; - public function __construct($logger = null) { + public function __construct($logger = null, $settings = null) { /* {{{ */ $this->services = array(); $this->errors = array(); $this->logger = $logger; - } + $this->settings = $settings; + } /* }}} */ - public function addService($service, $name='') { + public function addService($service, $name='') { /* {{{ */ if(!$name) $name = md5(uniqid()); $this->services[$name] = $service; $this->errors[$name] = true; - } + } /* }}} */ - public function getServices() { + public function getServices() { /* {{{ */ return $this->services; - } + } /* }}} */ - public function getErrors() { + public function getErrors() { /* {{{ */ return $this->errors; - } + } /* }}} */ - public function toIndividual($sender, $recipient, $subject, $message, $params=array(), $recvtype=0) { + public function toIndividual($sender, $recipient, $subject, $message, $params=array(), $recvtype=0) { /* {{{ */ $error = true; foreach($this->services as $name => $service) { /* Set $to to email address of user or the string passed in $recipient @@ -96,13 +102,13 @@ class SeedDMS_NotificationService { } } return $error; - } + } /* }}} */ /** * Send a notification to each user of a group * */ - public function toGroup($sender, $groupRecipient, $subject, $message, $params=array(), $recvtype=0) { + public function toGroup($sender, $groupRecipient, $subject, $message, $params=array(), $recvtype=0) { /* {{{ */ $error = true; foreach($this->services as $name => $service) { $ret = true; @@ -115,7 +121,7 @@ class SeedDMS_NotificationService { } } return $error; - } + } /* }}} */ /** * Send a notification to a list of recipients @@ -130,7 +136,7 @@ class SeedDMS_NotificationService { * @param int $recvtype type of receiver * @return boolean true on success, otherwise false */ - public function toList($sender, $recipients, $subject, $message, $params=array(), $recvtype=0) { + public function toList($sender, $recipients, $subject, $message, $params=array(), $recvtype=0) { /* {{{ */ $error = true; foreach($this->services as $name => $service) { $ret = true; @@ -143,7 +149,113 @@ class SeedDMS_NotificationService { } } return $error; - } + } /* }}} */ + /** + * + */ + public function sendNewDocumentMail($document, $user) { + $folder = $document->getFolder(); + $fnl = $folder->getNotifyList(); + $dnl = $document->getNotifyList(); + $nl = array( + 'users'=>array_unique(array_merge($dnl['users'], $fnl['users']), SORT_REGULAR), + 'groups'=>array_unique(array_merge($dnl['groups'], $fnl['groups']), SORT_REGULAR) + ); + + $lc = $document->getLatestContent(); + $subject = "new_document_email_subject"; + $message = "new_document_email_body"; + $params = array(); + $params['name'] = $document->getName(); + $params['folder_name'] = $folder->getName(); + $params['folder_path'] = $folder->getFolderPathPlain(); + $params['username'] = $user->getFullName(); + $params['comment'] = $document->getComment(); + $params['version_comment'] = $lc->getComment(); + $params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); + $params['sitename'] = $this->settings->_siteName; + $params['http_root'] = $this->settings->_httpRoot; + $this->toList($user, $nl["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + foreach ($nl["groups"] as $grp) { + $this->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + } + + /* Get workflow from controller in case it was modified in a hook */ +// $workflow = $controller->getParam('workflow'); + if($this->settings->_enableNotificationWorkflow && ($workflow = $lc->getWorkflow())) { + $subject = "request_workflow_action_email_subject"; + $message = "request_workflow_action_email_body"; + $params = array(); + $params['name'] = $document->getName(); + $params['version'] = $lc->getVersion(); + $params['workflow'] = $workflow->getName(); + $params['folder_path'] = $folder->getFolderPathPlain(); + $params['current_state'] = $workflow->getInitState()->getName(); + $params['username'] = $user->getFullName(); + $params['sitename'] = $this->settings->_siteName; + $params['http_root'] = $this->settings->_httpRoot; + $params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); + + foreach($workflow->getNextTransitions($workflow->getInitState()) as $ntransition) { + foreach($ntransition->getUsers() as $tuser) { + $this->toIndividual($user, $tuser->getUser(), $subject, $message, $params, SeedDMS_NotificationService::RECV_WORKFLOW); + } + foreach($ntransition->getGroups() as $tuser) { + $this->toGroup($user, $tuser->getGroup(), $subject, $message, $params, SeedDMS_NotificationService::RECV_WORKFLOW); + } + } + } + + if($this->settings->_enableNotificationAppRev) { + /* Reviewers and approvers will be informed about the new document */ + /* Get reviewers and approvers from controller in case it was + * modified in a hook + */ + $reviewers = $lc->getReviewers(); //$controller->getParam('reviewers'); + $approvers = $lc->getApprovers(); //$controller->getParam('approvers'); + if($reviewers['i'] || $reviewers['g']) { + $subject = "review_request_email_subject"; + $message = "review_request_email_body"; + $params = array(); + $params['name'] = $document->getName(); + $params['folder_path'] = $folder->getFolderPathPlain(); + $params['version'] = $lc->getVersion(); + $params['comment'] = $document->getComment(); + $params['username'] = $user->getFullName(); + $params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); + $params['sitename'] = $this->settings->_siteName; + $params['http_root'] = $this->settings->_httpRoot; + + foreach($reviewers['i'] as $reviewer) { + $this->toIndividual($user, $reviewer, $subject, $message, $params, SeedDMS_NotificationService::RECV_REVIEWER); + } + foreach($reviewers['g'] as $reviewergrp) { + $this->toGroup($user, $reviewergrp, $subject, $message, $params, SeedDMS_NotificationService::RECV_REVIEWER); + } + } + + elseif($approvers['i'] || $approvers['g']) { + $subject = "approval_request_email_subject"; + $message = "approval_request_email_body"; + $params = array(); + $params['name'] = $document->getName(); + $params['folder_path'] = $folder->getFolderPathPlain(); + $params['version'] = $lc->getVersion(); + $params['comment'] = $document->getComment(); + $params['username'] = $user->getFullName(); + $params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); + $params['sitename'] = $this->settings->_siteName; + $params['http_root'] = $this->settings->_httpRoot; + + foreach($approvers['i'] as $approver) { + $this->toIndividual($user, $approver, $subject, $message, $params, SeedDMS_NotificationService::RECV_APPROVER); + } + foreach($approvers['g'] as $approvergrp) { + $this->toGroup($user, $approvergrp, $subject, $message, $params, SeedDMS_NotificationService::RECV_APPROVER); + } + } + } + } /* }}} */ } From e436e7fb05e427f9035369abd5524da19cc1aa35 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 14 May 2021 21:56:09 +0200 Subject: [PATCH 196/403] pass settings to notification --- webdav/index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webdav/index.php b/webdav/index.php index d035c2d42..89d89245d 100644 --- a/webdav/index.php +++ b/webdav/index.php @@ -28,7 +28,7 @@ require_once("../inc/inc.ClassEmailNotify.php"); require_once("../inc/inc.Notification.php"); require_once("../inc/inc.ClassController.php"); -$notifier = new SeedDMS_NotificationService($logger); +$notifier = new SeedDMS_NotificationService($logger, $settings); if(isset($GLOBALS['SEEDDMS_HOOKS']['notification'])) { foreach($GLOBALS['SEEDDMS_HOOKS']['notification'] as $notificationObj) { From 423f42c1f4312ba42ba1b33794551341a660f7eb Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 14 May 2021 21:56:37 +0200 Subject: [PATCH 197/403] use new method sendNewDocumentMail() to send notification mail --- op/op.AddDocument.php | 100 +--------------------------------------- op/op.Ajax.php | 103 +----------------------------------------- 2 files changed, 3 insertions(+), 200 deletions(-) diff --git a/op/op.AddDocument.php b/op/op.AddDocument.php index 5ea2dec72..6176b54d8 100644 --- a/op/op.AddDocument.php +++ b/op/op.AddDocument.php @@ -376,105 +376,7 @@ for ($file_num=0;$file_numgetNotifyList(); - $dnl = $document->getNotifyList(); - $nl = array( - 'users'=>array_unique(array_merge($dnl['users'], $fnl['users']), SORT_REGULAR), - 'groups'=>array_unique(array_merge($dnl['groups'], $fnl['groups']), SORT_REGULAR) - ); - - $subject = "new_document_email_subject"; - $message = "new_document_email_body"; - $params = array(); - $params['name'] = $name; - $params['folder_name'] = $folder->getName(); - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['username'] = $user->getFullName(); - $params['comment'] = $comment; - $params['version_comment'] = $version_comment; - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - $notifier->toList($user, $nl["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - foreach ($nl["groups"] as $grp) { - $notifier->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - } - - /* Get workflow from controller in case it was modified in a hook */ - $workflow = $controller->getParam('workflow'); - if($workflow && $settings->_enableNotificationWorkflow) { - $subject = "request_workflow_action_email_subject"; - $message = "request_workflow_action_email_body"; - $params = array(); - $params['name'] = $document->getName(); - $params['version'] = $reqversion; - $params['workflow'] = $workflow->getName(); - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['current_state'] = $workflow->getInitState()->getName(); - $params['username'] = $user->getFullName(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); - - foreach($workflow->getNextTransitions($workflow->getInitState()) as $ntransition) { - foreach($ntransition->getUsers() as $tuser) { - $notifier->toIndividual($user, $tuser->getUser(), $subject, $message, $params, SeedDMS_NotificationService::RECV_WORKFLOW); - } - foreach($ntransition->getGroups() as $tuser) { - $notifier->toGroup($user, $tuser->getGroup(), $subject, $message, $params, SeedDMS_NotificationService::RECV_WORKFLOW); - } - } - } - - if($settings->_enableNotificationAppRev) { - /* Reviewers and approvers will be informed about the new document */ - /* Get reviewers and approvers from controller in case it was - * modified in a hook - */ - $reviewers = $controller->getParam('reviewers'); - $approvers = $controller->getParam('approvers'); - if($reviewers['i'] || $reviewers['g']) { - $subject = "review_request_email_subject"; - $message = "review_request_email_body"; - $params = array(); - $params['name'] = $document->getName(); - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['version'] = $reqversion; - $params['comment'] = $comment; - $params['username'] = $user->getFullName(); - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - - foreach($reviewers['i'] as $reviewerid) { - $notifier->toIndividual($user, $dms->getUser($reviewerid), $subject, $message, $params, SeedDMS_NotificationService::RECV_REVIEWER); - } - foreach($reviewers['g'] as $reviewergrpid) { - $notifier->toGroup($user, $dms->getGroup($reviewergrpid), $subject, $message, $params, SeedDMS_NotificationService::RECV_REVIEWER); - } - } - - elseif($approvers['i'] || $approvers['g']) { - $subject = "approval_request_email_subject"; - $message = "approval_request_email_body"; - $params = array(); - $params['name'] = $document->getName(); - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['version'] = $reqversion; - $params['comment'] = $comment; - $params['username'] = $user->getFullName(); - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - - foreach($approvers['i'] as $approverid) { - $notifier->toIndividual($user, $dms->getUser($approverid), $subject, $message, $params, SeedDMS_NotificationService::RECV_APPROVER); - } - foreach($approvers['g'] as $approvergrpid) { - $notifier->toGroup($user, $dms->getGroup($approvergrpid), $subject, $message, $params, SeedDMS_NotificationService::RECV_APPROVER); - } - } - } + $notifier->sendNewDocumentMail($document, $user); } if($settings->_removeFromDropFolder) { if(file_exists($userfiletmp)) { diff --git a/op/op.Ajax.php b/op/op.Ajax.php index cc4f90e69..dbc1e7333 100644 --- a/op/op.Ajax.php +++ b/op/op.Ajax.php @@ -64,7 +64,7 @@ if (isset($_COOKIE["mydms_session"])) { } global $logger; - $notifier = new SeedDMS_NotificationService($logger); + $notifier = new SeedDMS_NotificationService($logger, $settings); if(isset($GLOBALS['SEEDDMS_HOOKS']['notification'])) { foreach($GLOBALS['SEEDDMS_HOOKS']['notification'] as $notificationObj) { if(method_exists($notificationObj, 'preAddService')) { @@ -819,106 +819,7 @@ switch($command) { } else { // Send notification to subscribers of folder. if($notifier) { - $fnl = $folder->getNotifyList(); - $dnl = $document->getNotifyList(); - $nl = array( - 'users'=>array_unique(array_merge($dnl['users'], $fnl['users']), SORT_REGULAR), - 'groups'=>array_unique(array_merge($dnl['groups'], $fnl['groups']), SORT_REGULAR) - ); - - $subject = "new_document_email_subject"; - $message = "new_document_email_body"; - $params = array(); - $params['name'] = $name; - $params['folder_name'] = $folder->getName(); - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['username'] = $user->getFullName(); - $params['comment'] = ''; - $params['version_comment'] = ''; - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - $notifier->toList($user, $nl["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - foreach ($nl["groups"] as $grp) { - $notifier->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - } - - /* Get workflow from controller in case it was modified in a hook */ - $workflow = $controller->getParam('workflow'); - if($workflow && $settings->_enableNotificationWorkflow) { - $subject = "request_workflow_action_email_subject"; - $message = "request_workflow_action_email_body"; - $params = array(); - $params['name'] = $document->getName(); - $params['version'] = 1; - $params['workflow'] = $workflow->getName(); - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['current_state'] = $workflow->getInitState()->getName(); - $params['username'] = $user->getFullName(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); - - foreach($workflow->getNextTransitions($workflow->getInitState()) as $ntransition) { - foreach($ntransition->getUsers() as $tuser) { - $notifier->toIndividual($user, $tuser->getUser(), $subject, $message, $params, SeedDMS_NotificationService::RECV_WORKFLOW); - } - foreach($ntransition->getGroups() as $tuser) { - $notifier->toGroup($user, $tuser->getGroup(), $subject, $message, $params, SeedDMS_NotificationService::RECV_WORKFLOW); - } - } - } - - if($settings->_enableNotificationAppRev) { - /* Reviewers and approvers will be informed about the new document */ - /* Get reviewers and approvers from controller in case it was - * modified in a hook - */ - $reviewers = $controller->getParam('reviewers'); - $approvers = $controller->getParam('approvers'); - if($reviewers['i'] || $reviewers['g']) { - $subject = "review_request_email_subject"; - $message = "review_request_email_body"; - $params = array(); - $params['name'] = $document->getName(); - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['version'] = 1; - $params['comment'] = ''; - $params['username'] = $user->getFullName(); - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - - foreach($reviewers['i'] as $reviewerid) { - $notifier->toIndividual($user, $dms->getUser($reviewerid), $subject, $message, $params, SeedDMS_NotificationService::RECV_REVIEWER); - } - foreach($reviewers['g'] as $reviewergrpid) { - $notifier->toGroup($user, $dms->getGroup($reviewergrpid), $subject, $message, $params, SeedDMS_NotificationService::RECV_REVIEWER); - } - } - - elseif($approvers['i'] || $approvers['g']) { - $subject = "approval_request_email_subject"; - $message = "approval_request_email_body"; - $params = array(); - $params['name'] = $document->getName(); - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['version'] = 1; - $params['comment'] = ''; - $params['username'] = $user->getFullName(); - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - - foreach($approvers['i'] as $approverid) { - $notifier->toIndividual($user, $dms->getUser($approverid), $subject, $message, $params, SeedDMS_NotificationService::RECV_APPROVER); - } - foreach($approvers['g'] as $approvergrpid) { - $notifier->toGroup($user, $dms->getGroup($approvergrpid), $subject, $message, $params, SeedDMS_NotificationService::RECV_APPROVER); - } - } - } - + $notifier->sendNewDocumentMail($document, $user); } } header('Content-Type: application/json'); From c6a74605335c513f071ca480eb98931c11702105 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Sat, 15 May 2021 07:37:21 +0200 Subject: [PATCH 198/403] add missing case in getAttributeValidationError() --- inc/inc.Language.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/inc.Language.php b/inc/inc.Language.php index ef9950862..bf9636993 100644 --- a/inc/inc.Language.php +++ b/inc/inc.Language.php @@ -273,7 +273,7 @@ function getAttributeValidationError($error, $attrname='', $attrvalue='', $regex case 10: return array("attr_not_in_valueset", array('attrname'=>$attrname, 'value'=>$attrvalue)); break; - case 8: + case 9: return array("attr_malformed_date", array('attrname'=>$attrname, 'value'=>$attrvalue)); break; case 8: From 64c6c2159298180ccd8107deb11e0ebd735a70bb Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Sat, 15 May 2021 07:38:04 +0200 Subject: [PATCH 199/403] fix error in creating list of notifier --- op/op.RemoveVersion.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/op/op.RemoveVersion.php b/op/op.RemoveVersion.php index 764d44827..4857f3955 100644 --- a/op/op.RemoveVersion.php +++ b/op/op.RemoveVersion.php @@ -110,19 +110,19 @@ else { $emailGroupListA = array(); $status = $version->getReviewStatus(); foreach ($status as $st) { - if ($st["status"]==0 && !in_array($st["required"], $emailUserList)) { - if($st['type'] == 0) + if ($st["status"]==0) { + if($st['type'] == 0 && !in_array($st["required"], $emailUserListR)) $emailUserListR[] = $st["required"]; - else + elseif(!in_array($st["required"], $emailGroupListR)) $emailGroupListR[] = $st["required"]; } } $status = $version->getApprovalStatus(); foreach ($status as $st) { - if ($st["status"]==0 && !in_array($st["required"], $emailUserList)) { - if($st['type'] == 0) + if ($st["status"]==0) { + if($st['type'] == 0 && !in_array($st["required"], $emailUserListA)) $emailUserListA[] = $st["required"]; - else + elseif(!in_array($st["required"], $emailGroupListA)) $emailGroupListA[] = $st["required"]; } } From d6a296c0716001fbc02372be6745fed861e66e05 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Sat, 15 May 2021 07:38:46 +0200 Subject: [PATCH 200/403] add more methods for sending mails --- inc/inc.ClassNotificationService.php | 257 +++++++++++++++++---------- 1 file changed, 165 insertions(+), 92 deletions(-) diff --git a/inc/inc.ClassNotificationService.php b/inc/inc.ClassNotificationService.php index aabd049cd..65d66d7b8 100644 --- a/inc/inc.ClassNotificationService.php +++ b/inc/inc.ClassNotificationService.php @@ -152,110 +152,183 @@ class SeedDMS_NotificationService { } /* }}} */ /** - * + * This notification is sent when a workflow action is needed. */ - public function sendNewDocumentMail($document, $user) { + public function sendRequestWorkflowActionMail($content, $user) { /* {{{ */ + $document = $content->getDocument(); $folder = $document->getFolder(); - $fnl = $folder->getNotifyList(); - $dnl = $document->getNotifyList(); - $nl = array( - 'users'=>array_unique(array_merge($dnl['users'], $fnl['users']), SORT_REGULAR), - 'groups'=>array_unique(array_merge($dnl['groups'], $fnl['groups']), SORT_REGULAR) - ); - $lc = $document->getLatestContent(); - $subject = "new_document_email_subject"; - $message = "new_document_email_body"; + /* Send mail only if enabled in the configuration */ + if($this->settings->_enableNotificationWorkflow && ($workflow = $content->getWorkflow())) { + $subject = "request_workflow_action_email_subject"; + $message = "request_workflow_action_email_body"; + $params = array(); + $params['name'] = $document->getName(); + $params['version'] = $content->getVersion(); + $params['workflow'] = $workflow->getName(); + $params['folder_path'] = $folder->getFolderPathPlain(); + $params['current_state'] = $workflow->getInitState()->getName(); + $params['username'] = $user->getFullName(); + $params['sitename'] = $this->settings->_siteName; + $params['http_root'] = $this->settings->_httpRoot; + $params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); + + foreach($workflow->getNextTransitions($workflow->getInitState()) as $ntransition) { + foreach($ntransition->getUsers() as $tuser) { + $this->toIndividual($user, $tuser->getUser(), $subject, $message, $params, SeedDMS_NotificationService::RECV_WORKFLOW); + } + foreach($ntransition->getGroups() as $tuser) { + $this->toGroup($user, $tuser->getGroup(), $subject, $message, $params, SeedDMS_NotificationService::RECV_WORKFLOW); + } + } + } + } /* }}} */ + + /** + * This notification is sent when a review or approval is needed. + */ + public function sendRequestRevAppActionMail($content, $user) { /* {{{ */ + $document = $content->getDocument(); + $folder = $document->getFolder(); + + if($this->settings->_enableNotificationAppRev) { + /* Reviewers and approvers will be informed about the new document */ + $reviewers = $content->getReviewers(); //$controller->getParam('reviewers'); + $approvers = $content->getApprovers(); //$controller->getParam('approvers'); + if($reviewers['i'] || $reviewers['g']) { + $subject = "review_request_email_subject"; + $message = "review_request_email_body"; + $params = array(); + $params['name'] = $document->getName(); + $params['folder_path'] = $folder->getFolderPathPlain(); + $params['version'] = $content->getVersion(); + $params['comment'] = $document->getComment(); + $params['username'] = $user->getFullName(); + $params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); + $params['sitename'] = $this->settings->_siteName; + $params['http_root'] = $this->settings->_httpRoot; + + foreach($reviewers['i'] as $reviewer) { + $this->toIndividual($user, $reviewer, $subject, $message, $params, SeedDMS_NotificationService::RECV_REVIEWER); + } + foreach($reviewers['g'] as $reviewergrp) { + $this->toGroup($user, $reviewergrp, $subject, $message, $params, SeedDMS_NotificationService::RECV_REVIEWER); + } + } + + elseif($approvers['i'] || $approvers['g']) { + $subject = "approval_request_email_subject"; + $message = "approval_request_email_body"; + $params = array(); + $params['name'] = $document->getName(); + $params['folder_path'] = $folder->getFolderPathPlain(); + $params['version'] = $content->getVersion(); + $params['comment'] = $document->getComment(); + $params['username'] = $user->getFullName(); + $params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); + $params['sitename'] = $this->settings->_siteName; + $params['http_root'] = $this->settings->_httpRoot; + + foreach($approvers['i'] as $approver) { + $this->toIndividual($user, $approver, $subject, $message, $params, SeedDMS_NotificationService::RECV_APPROVER); + } + foreach($approvers['g'] as $approvergrp) { + $this->toGroup($user, $approvergrp, $subject, $message, $params, SeedDMS_NotificationService::RECV_APPROVER); + } + } + } + } /* }}} */ + + /** + * This notification is sent when a new document is created. + */ + public function sendNewDocumentMail($document, $user) { /* {{{ */ + $folder = $document->getFolder(); + $fnl = $folder->getNotifyList(); + $dnl = $document->getNotifyList(); + $nl = array( + 'users'=>array_unique(array_merge($dnl['users'], $fnl['users']), SORT_REGULAR), + 'groups'=>array_unique(array_merge($dnl['groups'], $fnl['groups']), SORT_REGULAR) + ); + + $lc = $document->getLatestContent(); + $subject = "new_document_email_subject"; + $message = "new_document_email_body"; + $params = array(); + $params['name'] = $document->getName(); + $params['folder_name'] = $folder->getName(); + $params['folder_path'] = $folder->getFolderPathPlain(); + $params['username'] = $user->getFullName(); + $params['comment'] = $document->getComment(); + $params['version_comment'] = $lc->getComment(); + $params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); + $params['sitename'] = $this->settings->_siteName; + $params['http_root'] = $this->settings->_httpRoot; + $this->toList($user, $nl["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + foreach ($nl["groups"] as $grp) { + $this->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + } + + $this->sendRequestWorkflowActionMail($lc, $user); + + $this->sendRequestRevAppActionMail($lc, $user); + + } /* }}} */ + + /** + * This notification is sent when a new document version is created. + */ + public function sendNewDocumentVersionMail($document, $user) { /* {{{ */ + $lc = $document->getLatestContent(); + $folder = $document->getFolder(); + $notifyList = $document->getNotifyList(); + + $subject = "document_updated_email_subject"; + $message = "document_updated_email_body"; + $params = array(); + $params['name'] = $document->getName(); + $params['folder_path'] = $folder->getFolderPathPlain(); + $params['username'] = $user->getFullName(); + $params['comment'] = $document->getComment(); + $params['version_comment'] = $lc->getComment(); + $params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); + $params['sitename'] = $this->settings->_siteName; + $params['http_root'] = $this->settings->_httpRoot; + $this->toList($user, $notifyList["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + foreach ($notifyList["groups"] as $grp) { + $this->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + } +// if user is not owner send notification to owner +// if ($user->getID() != $document->getOwner()->getID()) +// $this->toIndividual($user, $document->getOwner(), $subject, $message, $params, SeedDMS_NotificationService::RECV_OWNER); + + $this->sendRequestWorkflowActionMail($lc, $user); + + $this->sendRequestRevAppActionMail($lc, $user); + + } /* }}} */ + + public function sendChangedExpiryMail($document, $user, $oldexpires) { /* {{{ */ + $folder = $document->getFolder(); + $notifyList = $document->getNotifyList(); + + if($oldexpires != $document->getExpires()) { + // Send notification to subscribers. + $subject = "expiry_changed_email_subject"; + $message = "expiry_changed_email_body"; $params = array(); $params['name'] = $document->getName(); - $params['folder_name'] = $folder->getName(); $params['folder_path'] = $folder->getFolderPathPlain(); $params['username'] = $user->getFullName(); - $params['comment'] = $document->getComment(); - $params['version_comment'] = $lc->getComment(); $params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); $params['sitename'] = $this->settings->_siteName; $params['http_root'] = $this->settings->_httpRoot; - $this->toList($user, $nl["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - foreach ($nl["groups"] as $grp) { + $this->toList($user, $notifyList["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + foreach ($notifyList["groups"] as $grp) { $this->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); } - - /* Get workflow from controller in case it was modified in a hook */ -// $workflow = $controller->getParam('workflow'); - if($this->settings->_enableNotificationWorkflow && ($workflow = $lc->getWorkflow())) { - $subject = "request_workflow_action_email_subject"; - $message = "request_workflow_action_email_body"; - $params = array(); - $params['name'] = $document->getName(); - $params['version'] = $lc->getVersion(); - $params['workflow'] = $workflow->getName(); - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['current_state'] = $workflow->getInitState()->getName(); - $params['username'] = $user->getFullName(); - $params['sitename'] = $this->settings->_siteName; - $params['http_root'] = $this->settings->_httpRoot; - $params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); - - foreach($workflow->getNextTransitions($workflow->getInitState()) as $ntransition) { - foreach($ntransition->getUsers() as $tuser) { - $this->toIndividual($user, $tuser->getUser(), $subject, $message, $params, SeedDMS_NotificationService::RECV_WORKFLOW); - } - foreach($ntransition->getGroups() as $tuser) { - $this->toGroup($user, $tuser->getGroup(), $subject, $message, $params, SeedDMS_NotificationService::RECV_WORKFLOW); - } - } - } - - if($this->settings->_enableNotificationAppRev) { - /* Reviewers and approvers will be informed about the new document */ - /* Get reviewers and approvers from controller in case it was - * modified in a hook - */ - $reviewers = $lc->getReviewers(); //$controller->getParam('reviewers'); - $approvers = $lc->getApprovers(); //$controller->getParam('approvers'); - if($reviewers['i'] || $reviewers['g']) { - $subject = "review_request_email_subject"; - $message = "review_request_email_body"; - $params = array(); - $params['name'] = $document->getName(); - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['version'] = $lc->getVersion(); - $params['comment'] = $document->getComment(); - $params['username'] = $user->getFullName(); - $params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); - $params['sitename'] = $this->settings->_siteName; - $params['http_root'] = $this->settings->_httpRoot; - - foreach($reviewers['i'] as $reviewer) { - $this->toIndividual($user, $reviewer, $subject, $message, $params, SeedDMS_NotificationService::RECV_REVIEWER); - } - foreach($reviewers['g'] as $reviewergrp) { - $this->toGroup($user, $reviewergrp, $subject, $message, $params, SeedDMS_NotificationService::RECV_REVIEWER); - } - } - - elseif($approvers['i'] || $approvers['g']) { - $subject = "approval_request_email_subject"; - $message = "approval_request_email_body"; - $params = array(); - $params['name'] = $document->getName(); - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['version'] = $lc->getVersion(); - $params['comment'] = $document->getComment(); - $params['username'] = $user->getFullName(); - $params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); - $params['sitename'] = $this->settings->_siteName; - $params['http_root'] = $this->settings->_httpRoot; - - foreach($approvers['i'] as $approver) { - $this->toIndividual($user, $approver, $subject, $message, $params, SeedDMS_NotificationService::RECV_APPROVER); - } - foreach($approvers['g'] as $approvergrp) { - $this->toGroup($user, $approvergrp, $subject, $message, $params, SeedDMS_NotificationService::RECV_APPROVER); - } - } - } + } } /* }}} */ + } From 07b8ab9706184cb3ac07292158f717a634a7d5ed Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Sat, 15 May 2021 07:39:18 +0200 Subject: [PATCH 201/403] use methods in notification service for sending mails --- op/op.UpdateDocument.php | 117 +-------------------------------------- 1 file changed, 3 insertions(+), 114 deletions(-) diff --git a/op/op.UpdateDocument.php b/op/op.UpdateDocument.php index ed058e325..a89c93bc1 100644 --- a/op/op.UpdateDocument.php +++ b/op/op.UpdateDocument.php @@ -280,121 +280,10 @@ default: UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText($controller->getErrorMsg())); } else { // Send notification to subscribers. - if ($notifier){ - $notifyList = $document->getNotifyList(); - $folder = $document->getFolder(); + if($notifier) { + $notifier->sendNewDocumentVersionMail($document, $user); - $subject = "document_updated_email_subject"; - $message = "document_updated_email_body"; - $params = array(); - $params['name'] = $document->getName(); - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['username'] = $user->getFullName(); - $params['comment'] = $document->getComment(); - $params['version_comment'] = $content->getComment(); - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - $notifier->toList($user, $notifyList["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - foreach ($notifyList["groups"] as $grp) { - $notifier->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - } - // if user is not owner send notification to owner -// if ($user->getID() != $document->getOwner()->getID()) -// $notifier->toIndividual($user, $document->getOwner(), $subject, $message, $params, SeedDMS_NotificationService::RECV_OWNER); - - /* Get workflow from controller in case it was modified in a hook */ - $workflow = $controller->getParam('workflow'); - if($workflow && $settings->_enableNotificationWorkflow) { - $subject = "request_workflow_action_email_subject"; - $message = "request_workflow_action_email_body"; - $params = array(); - $params['name'] = $document->getName(); - $params['version'] = $content->getVersion(); - $params['workflow'] = $workflow->getName(); - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['current_state'] = $workflow->getInitState()->getName(); - $params['username'] = $user->getFullName(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); - - foreach($workflow->getNextTransitions($workflow->getInitState()) as $ntransition) { - foreach($ntransition->getUsers() as $tuser) { - $notifier->toIndividual($user, $tuser->getUser(), $subject, $message, $params, SeedDMS_NotificationService::RECV_WORKFLOW); - } - foreach($ntransition->getGroups() as $tuser) { - $notifier->toGroup($user, $tuser->getGroup(), $subject, $message, $params, SeedDMS_NotificationService::RECV_WORKFLOW); - } - } - } - - if($settings->_enableNotificationAppRev) { - /* Reviewers and approvers will be informed about the new document */ - /* Get reviewers and approvers from controller in case it was - * modified in a hook - */ - $reviewers = $controller->getParam('reviewers'); - $approvers = $controller->getParam('approvers'); - if($reviewers['i'] || $reviewers['g']) { - $subject = "review_request_email_subject"; - $message = "review_request_email_body"; - $params = array(); - $params['name'] = $document->getName(); - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['version'] = $content->getVersion(); - $params['comment'] = $content->getComment(); - $params['username'] = $user->getFullName(); - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - - foreach($reviewers['i'] as $reviewerid) { - $notifier->toIndividual($user, $dms->getUser($reviewerid), $subject, $message, $params, SeedDMS_NotificationService::RECV_REVIEWER); - } - foreach($reviewers['g'] as $reviewergrpid) { - $notifier->toGroup($user, $dms->getGroup($reviewergrpid), $subject, $message, $params, SeedDMS_NotificationService::RECV_REVIEWER); - } - } - - elseif($approvers['i'] || $approvers['g']) { - $subject = "approval_request_email_subject"; - $message = "approval_request_email_body"; - $params = array(); - $params['name'] = $document->getName(); - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['version'] = $content->getVersion(); - $params['comment'] = $content->getComment(); - $params['username'] = $user->getFullName(); - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - - foreach($approvers['i'] as $approverid) { - $notifier->toIndividual($user, $dms->getUser($approverid), $subject, $message, $params, SeedDMS_NotificationService::RECV_APPROVER); - } - foreach($approvers['g'] as $approvergrpid) { - $notifier->toGroup($user, $dms->getGroup($approvergrpid), $subject, $message, $params, SeedDMS_NotificationService::RECV_APPROVER); - } - } - } - - if($oldexpires != $document->getExpires()) { - // Send notification to subscribers. - $subject = "expiry_changed_email_subject"; - $message = "expiry_changed_email_body"; - $params = array(); - $params['name'] = $document->getName(); - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['username'] = $user->getFullName(); - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - $notifier->toList($user, $notifyList["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - foreach ($notifyList["groups"] as $grp) { - $notifier->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - } - } + $notifier->sendChangedExpiryMail($document, $user, $oldexpires); } if($settings->_removeFromDropFolder) { From 7f417157f8c7713158651800b96418894ee6639a Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Sat, 15 May 2021 12:17:07 +0200 Subject: [PATCH 202/403] move sending mails into NotificationService --- inc/inc.ClassNotificationService.php | 240 +++++++++++++++++++++++++-- op/op.Ajax.php | 12 ++ op/op.EditComment.php | 41 +---- op/op.EditDocument.php | 142 +--------------- op/op.MoveClipboard.php | 51 +----- op/op.MoveDocument.php | 25 +-- op/op.MoveFolder.php | 26 +-- 7 files changed, 244 insertions(+), 293 deletions(-) diff --git a/inc/inc.ClassNotificationService.php b/inc/inc.ClassNotificationService.php index 65d66d7b8..15626e544 100644 --- a/inc/inc.ClassNotificationService.php +++ b/inc/inc.ClassNotificationService.php @@ -110,15 +110,12 @@ class SeedDMS_NotificationService { */ public function toGroup($sender, $groupRecipient, $subject, $message, $params=array(), $recvtype=0) { /* {{{ */ $error = true; - foreach($this->services as $name => $service) { - $ret = true; - foreach ($groupRecipient->getUsers() as $recipient) { - $ret &= $this->toIndividual($sender, $recipient, $subject, $message, $params, $recvtype); - } - $this->errors[$name] = $ret; - if(!$ret) { - $error = false; - } + $ret = true; + foreach ($groupRecipient->getUsers() as $recipient) { + $ret &= $this->toIndividual($sender, $recipient, $subject, $message, $params, $recvtype); + } + if(!$ret) { + $error = false; } return $error; } /* }}} */ @@ -138,15 +135,12 @@ class SeedDMS_NotificationService { */ public function toList($sender, $recipients, $subject, $message, $params=array(), $recvtype=0) { /* {{{ */ $error = true; - foreach($this->services as $name => $service) { - $ret = true; - foreach ($recipients as $recipient) { - $ret &= $this->toIndividual($sender, $recipient, $subject, $message, $params, $recvtype); - } - $this->errors[$name] = $ret; - if(!$ret) { - $error = false; - } + $ret = true; + foreach ($recipients as $recipient) { + $ret &= $this->toIndividual($sender, $recipient, $subject, $message, $params, $recvtype); + } + if(!$ret) { + $error = false; } return $error; } /* }}} */ @@ -323,6 +317,12 @@ class SeedDMS_NotificationService { $params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); $params['sitename'] = $this->settings->_siteName; $params['http_root'] = $this->settings->_httpRoot; + // if user is not owner and owner not already in list of notifiers, then + // send notification to owner + if ($user->getID() != $document->getOwner()->getID() && + false === SeedDMS_Core_DMS::inList($document->getOwner(), $notifyList['users'])) { + $this->toIndividual($user, $document->getOwner(), $subject, $message, $params, SeedDMS_NotificationService::RECV_OWNER); + } $this->toList($user, $notifyList["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); foreach ($notifyList["groups"] as $grp) { $this->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); @@ -330,5 +330,209 @@ class SeedDMS_NotificationService { } } /* }}} */ + public function sendChangedAttributesMail($document, $user, $oldattributes) { /* {{{ */ + $folder = $document->getFolder(); + $notifyList = $document->getNotifyList(); + + $newattributes = $document->getAttributes(); + if($oldattributes) { + foreach($oldattributes as $attrdefid=>$attribute) { + if(!isset($newattributes[$attrdefid]) || $newattributes[$attrdefid]->getValueAsArray() !== $oldattributes[$attrdefid]->getValueAsArray()) { + $subject = "document_attribute_changed_email_subject"; + $message = "document_attribute_changed_email_body"; + $params = array(); + $params['name'] = $document->getName(); + $params['attribute_name'] = $attribute->getAttributeDefinition()->getName(); + $params['attribute_old_value'] = $oldattributes[$attrdefid]->getValue(); + $params['attribute_new_value'] = isset($newattributes[$attrdefid]) ? $newattributes[$attrdefid]->getValue() : ''; + $params['folder_path'] = $folder->getFolderPathPlain(); + $params['username'] = $user->getFullName(); + $params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); + $params['sitename'] = $this->settings->_siteName; + $params['http_root'] = $this->settings->_httpRoot; + + $this->toList($user, $notifyList["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + foreach ($notifyList["groups"] as $grp) { + $this->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + } + } + } + } + /* Check for new attributes which didn't have a value before */ + if($newattributes) { + foreach($newattributes as $attrdefid=>$attribute) { + if(!isset($oldattributes[$attrdefid]) && $attribute) { + $subject = "document_attribute_changed_email_subject"; + $message = "document_attribute_changed_email_body"; + $params = array(); + $params['name'] = $document->getName(); + $params['attribute_name'] = $dms->getAttributeDefinition($attrdefid)->getName(); + $params['attribute_old_value'] = ''; + $params['attribute_new_value'] = $attribute->getValue(); + $params['folder_path'] = $folder->getFolderPathPlain(); + $params['username'] = $user->getFullName(); + $params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); + $params['sitename'] = $this->settings->_siteName; + $params['http_root'] = $this->settings->_httpRoot; + + $this->toList($user, $notifyList["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + foreach ($notifyList["groups"] as $grp) { + $this->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + } + } + } + } + } /* }}} */ + + public function sendChangedCommentMail($document, $user, $oldcomment) { /* {{{ */ + if($oldcomment != $document->getComment()) { + $notifyList = $document->getNotifyList(); + $folder = $document->getFolder(); + $subject = "document_comment_changed_email_subject"; + $message = "document_comment_changed_email_body"; + $params = array(); + $params['name'] = $document->getName(); + $params['folder_path'] = $folder->getFolderPathPlain(); + $params['old_comment'] = $oldcomment; + $params['new_comment'] = $document->getComment(); + $params['username'] = $user->getFullName(); + $params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); + $params['sitename'] = $this->settings->_siteName; + $params['http_root'] = $this->settings->_httpRoot; + + // if user is not owner send notification to owner + if ($user->getID() != $document->getOwner()->getID() && + false === SeedDMS_Core_DMS::inList($document->getOwner(), $notifyList['users'])) { + $this->toIndividual($user, $document->getOwner(), $subject, $message, $params, SeedDMS_NotificationService::RECV_OWNER); + } + $this->toList($user, $notifyList["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + foreach ($notifyList["groups"] as $grp) { + $this->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + } + } + } /* }}} */ + + public function sendChangedVersionCommentMail($content, $user, $oldcomment) { /* {{{ */ + // FIXME: use extra mail template which includes the version + if($oldcomment != $content->getComment()) { + $document = $content->getDocument(); + $notifyList = $document->getNotifyList(); + $folder = $document->getFolder(); + $subject = "document_comment_changed_email_subject"; + $message = "document_comment_changed_email_body"; + $params = array(); + $params['name'] = $document->getName(); + $params['folder_path'] = $folder->getFolderPathPlain(); + $params['old_comment'] = $oldcomment; + $params['new_comment'] = $content->getComment(); + $params['username'] = $user->getFullName(); + $params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); + $params['sitename'] = $this->settings->_siteName; + $params['http_root'] = $this->settings->_httpRoot; + + // if user is not owner send notification to owner + if ($user->getID() != $document->getOwner()->getID() && + false === SeedDMS_Core_DMS::inList($document->getOwner(), $notifyList['users'])) { + $this->toIndividual($user, $document->getOwner(), $subject, $message, $params, SeedDMS_NotificationService::RECV_OWNER); + } + $this->toList($user, $notifyList["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + foreach ($notifyList["groups"] as $grp) { + $this->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + } + } + } /* }}} */ + + public function sendChangedNameMail($document, $user, $oldname) { /* {{{ */ + if($oldname != $document->getName()) { + $notifyList = $document->getNotifyList(); + $folder = $document->getFolder(); + $subject = "document_renamed_email_subject"; + $message = "document_renamed_email_body"; + $params = array(); + $params['name'] = $document->getName(); + $params['old_name'] = $oldname; + $params['folder_path'] = $folder->getFolderPathPlain(); + $params['username'] = $user->getFullName(); + $params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); + $params['sitename'] = $this->settings->_siteName; + $params['http_root'] = $this->settings->_httpRoot; + + // if user is not owner send notification to owner + if ($user->getID() != $document->getOwner()->getID() && + false === SeedDMS_Core_DMS::inList($document->getOwner(), $notifyList['users'])) { + $this->toIndividual($user, $document->getOwner(), $subject, $message, $params, SeedDMS_NotificationService::RECV_OWNER); + } + $this->toList($user, $notifyList["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + foreach ($notifyList["groups"] as $grp) { + $notifier->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + } + } + } /* }}} */ + + public function sendMovedDocumentMail($document, $user, $oldfolder) { /* {{{ */ + $targetfolder = $document->getFolder(); + if($targetfolder->getId() == $oldfolder->getId()) + return; + + $nl1 = $oldfolder->getNotifyList(); + $nl2 = $document->getNotifyList(); + $nl3 = $targetfolder->getNotifyList(); + $nl = array( + 'users'=>array_unique(array_merge($nl1['users'], $nl2['users'], $nl3['users']), SORT_REGULAR), + 'groups'=>array_unique(array_merge($nl1['groups'], $nl2['groups'], $nl3['groups']), SORT_REGULAR) + ); + $subject = "document_moved_email_subject"; + $message = "document_moved_email_body"; + $params = array(); + $params['name'] = $document->getName(); + $params['old_folder_path'] = $oldfolder->getFolderPathPlain(); + $params['new_folder_path'] = $targetfolder->getFolderPathPlain(); + $params['username'] = $user->getFullName(); + $params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); + $params['sitename'] = $this->settings->_siteName; + $params['http_root'] = $this->settings->_httpRoot; + $this->toList($user, $nl["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + foreach ($nl["groups"] as $grp) { + $this->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + } + // if user is not owner send notification to owner + if ($user->getID() != $document->getOwner()->getID() && + false === SeedDMS_Core_DMS::inList($document->getOwner(), $notifyList['users'])) { + $this->toIndividual($user, $document->getOwner(), $subject, $message, $params, SeedDMS_NotificationService::RECV_OWNER); + } + } /* }}} */ + + public function sendMovedFolderMail($folder, $user, $oldfolder) { /* {{{ */ + $targetfolder = $folder->getParent(); + if($targetfolder->getId() == $oldfolder->getId()) + return; + + $nl1 = $oldfolder->getNotifyList(); + $nl2 = $folder->getNotifyList(); + $nl3 = $targetfolder->getNotifyList(); + $nl = array( + 'users'=>array_unique(array_merge($nl1['users'], $nl2['users'], $nl3['users']), SORT_REGULAR), + 'groups'=>array_unique(array_merge($nl1['groups'], $nl2['groups'], $nl3['groups']), SORT_REGULAR) + ); + $subject = "folder_moved_email_subject"; + $message = "folder_moved_email_body"; + $params = array(); + $params['name'] = $folder->getName(); + $params['old_folder_path'] = $oldfolder->getFolderPathPlain(); + $params['new_folder_path'] = $targetfolder->getFolderPathPlain(); + $params['username'] = $user->getFullName(); + $params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewFolder.php?folderid=".$folder->getID(); + $params['sitename'] = $this->settings->_siteName; + $params['http_root'] = $this->settings->_httpRoot; + $this->toList($user, $nl["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + foreach ($nl["groups"] as $grp) { + $this->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + } + // if user is not owner send notification to owner + if ($user->getID() != $folder->getOwner()->getID() && + false === SeedDMS_Core_DMS::inList($folder->getOwner(), $notifyList['users'])) { + $this->toIndividual($user, $folder->getOwner(), $subject, $message, $params, SeedDMS_NotificationService::RECV_OWNER); + } + } /* }}} */ } diff --git a/op/op.Ajax.php b/op/op.Ajax.php index dbc1e7333..217316fa7 100644 --- a/op/op.Ajax.php +++ b/op/op.Ajax.php @@ -310,7 +310,11 @@ switch($command) { if ($mfolder->getAccessMode($user, 'moveFolder') >= M_READWRITE) { if($folder = $dms->getFolder($_REQUEST['targetfolderid'])) { if($folder->getAccessMode($user, 'moveFolder') >= M_READWRITE) { + $oldFolder = $mfolder->getParent(); if($mfolder->setParent($folder)) { + if($notifier) { + $notifier->sendMovedFolderMail($mfolder, $user, $oldFolder); + } header('Content-Type: application/json'); echo json_encode(array('success'=>true, 'message'=>getMLText('splash_move_folder'), 'data'=>'')); add_log_line(); @@ -349,10 +353,14 @@ switch($command) { if ($mdocument->getAccessMode($user, 'moveDocument') >= M_READWRITE) { if($folder = $dms->getFolder($_REQUEST['targetfolderid'])) { if($folder->getAccessMode($user, 'moveDocument') >= M_READWRITE) { + $oldFolder = $mdocument->getFolder(); if($mdocument->setFolder($folder)) { if(isset($_REQUEST['sequence'])) { $mdocument->setSequence((float) $_REQUEST['sequence']); } + if($notifier) { + $notifier->sendMovedDocumentMail($mdocument, $user, $oldFolder); + } header('Content-Type: application/json'); echo json_encode(array('success'=>true, 'message'=>getMLText('splash_move_document'), 'data'=>'')); add_log_line(); @@ -634,10 +642,14 @@ switch($command) { $document = $dms->getDocument($_REQUEST['id']); if($document) { if ($document->getAccessMode($user) >= M_READWRITE) { + $oldname = $document->getName(); if (!$document->setName($_REQUEST['name'])) { header('Content-Type: application/json'); echo json_encode(array('success'=>false, 'message'=>'Error setting name', 'data'=>'')); } else { + if($notifier) { + $notifier->sendChangedNameMail($document, $user, $oldname); + } header('Content-Type: application/json'); echo json_encode(array('success'=>true, 'message'=>getMLText('splash_document_name_changed'), 'data'=>'')); add_log_line(); diff --git a/op/op.EditComment.php b/op/op.EditComment.php index 7da9cc26a..381e1d97d 100644 --- a/op/op.EditComment.php +++ b/op/op.EditComment.php @@ -68,46 +68,7 @@ $comment = $_POST["comment"]; if (($oldcomment = $version->getComment()) != $comment) { if($version->setComment($comment)) { if($notifier) { - $notifyList = $document->getNotifyList(); - $folder = $document->getFolder(); - -/* - $subject = "###SITENAME###: ".$document->getName().", v.".$version->_version." - ".getMLText("document_comment_changed_email"); - $message = getMLText("document_comment_changed_email")."\r\n"; - $message .= - getMLText("document").": ".$document->getName()."\r\n". - getMLText("version").": ".$version->_version."\r\n". - getMLText("comment").": ".$comment."\r\n". - getMLText("user").": ".$user->getFullName()." <". $user->getEmail() .">\r\n". - "URL: ###URL_PREFIX###out/out.ViewDocument.php?documentid=".$document->getID()."&version=".$version->_version."\r\n"; - - if(isset($document->_notifyList["users"])) { - $notifier->toList($user, $document->_notifyList["users"], $subject, $message); - } - if(isset($document->_notifyList["groups"])) { - foreach ($document->_notifyList["groups"] as $grp) { - $notifier->toGroup($user, $grp, $subject, $message); - } - } -*/ - - $subject = "document_comment_changed_email_subject"; - $message = "document_comment_changed_email_body"; - $params = array(); - $params['name'] = $document->getName(); - $params['version'] = $version->getVersion(); - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['username'] = $user->getFullName(); - $params['new_comment'] = $comment; - $params['old_comment'] = $oldcomment; - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID()."&version=".$version->getVersion(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - $notifier->toList($user, $notifyList["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - foreach ($notifyList["groups"] as $grp) { - $notifier->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - } - + $notifier->sendChangedVersionCommentMail($version, $user, $oldcomment); } } else { diff --git a/op/op.EditDocument.php b/op/op.EditDocument.php index 538d3a050..8e9f21518 100644 --- a/op/op.EditDocument.php +++ b/op/op.EditDocument.php @@ -148,146 +148,14 @@ if(!$controller->run()) { UI::exitError(getMLText("document_title", array("documentname" => $document->getName())), $errmsg); } -if ($oldname != $name) { - // Send notification to subscribers. - if($notifier) { - $notifyList = $document->getNotifyList(); - $folder = $document->getFolder(); - $subject = "document_renamed_email_subject"; - $message = "document_renamed_email_body"; - $params = array(); - $params['name'] = $document->getName(); - $params['old_name'] = $oldname; - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['username'] = $user->getFullName(); - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; +if($notifier) { + $notifier->sendChangedNameMail($document, $user, $oldname); - // if user is not owner send notification to owner - if ($user->getID() != $document->getOwner()->getID() && - false === SeedDMS_Core_DMS::inList($document->getOwner(), $notifyList['users'])) { - $notifier->toIndividual($user, $document->getOwner(), $subject, $message, $params, SeedDMS_NotificationService::RECV_OWNER); - } - $notifier->toList($user, $notifyList["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - foreach ($notifyList["groups"] as $grp) { - $notifier->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - } - } -} + $notifier->sendChangedCommentMail($document, $user, $oldcomment); -if ($oldcomment != $comment) { - // Send notification to subscribers. - if($notifier) { - $notifyList = $document->getNotifyList(); - $folder = $document->getFolder(); - $subject = "document_comment_changed_email_subject"; - $message = "document_comment_changed_email_body"; - $params = array(); - $params['name'] = $document->getName(); - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['old_comment'] = $oldcomment; - $params['new_comment'] = $comment; - $params['username'] = $user->getFullName(); - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; + $notifier->sendChangedExpiryMail($document, $user, $oldexpires); - // if user is not owner send notification to owner - if ($user->getID() != $document->getOwner()->getID() && - false === SeedDMS_Core_DMS::inList($document->getOwner(), $notifyList['users'])) { - $notifier->toIndividual($user, $document->getOwner(), $subject, $message, $params, SeedDMS_NotificationService::RECV_OWNER); - } - $notifier->toList($user, $notifyList["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - foreach ($notifyList["groups"] as $grp) { - $notifier->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - } - } -} - -if ($expires != $oldexpires) { - if($notifier) { - $notifyList = $document->getNotifyList(); - $folder = $document->getFolder(); - // Send notification to subscribers. - $subject = "expiry_changed_email_subject"; - $message = "expiry_changed_email_body"; - $params = array(); - $params['name'] = $document->getName(); - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['username'] = $user->getFullName(); - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - - // if user is not owner send notification to owner - if ($user->getID() != $document->getOwner()->getID() && - false === SeedDMS_Core_DMS::inList($document->getOwner(), $notifyList['users'])) { - $notifier->toIndividual($user, $document->getOwner(), $subject, $message, $params, SeedDMS_NotificationService::RECV_OWNER); - } - $notifier->toList($user, $notifyList["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - foreach ($notifyList["groups"] as $grp) { - $notifier->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - } - } -} - -if ($oldkeywords != $keywords) { -} - -$newattributes = $document->getAttributes(); -if($oldattributes) { - foreach($oldattributes as $attrdefid=>$attribute) { - if(!isset($newattributes[$attrdefid]) || $newattributes[$attrdefid]->getValueAsArray() !== $oldattributes[$attrdefid]->getValueAsArray()) { - if($notifier) { - $notifyList = $document->getNotifyList(); - $subject = "document_attribute_changed_email_subject"; - $message = "document_attribute_changed_email_body"; - $params = array(); - $params['name'] = $document->getName(); - $params['attribute_name'] = $attribute->getAttributeDefinition()->getName(); - $params['attribute_old_value'] = $oldattributes[$attrdefid]->getValue(); - $params['attribute_new_value'] = isset($newattributes[$attrdefid]) ? $newattributes[$attrdefid]->getValue() : ''; - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['username'] = $user->getFullName(); - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - - $notifier->toList($user, $notifyList["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - foreach ($notifyList["groups"] as $grp) { - $notifier->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - } - } - } - } -} -/* Check for new attributes which didn't have a value before */ -if($newattributes) { - foreach($newattributes as $attrdefid=>$attribute) { - if(!isset($oldattributes[$attrdefid]) && $attribute) { - if($notifier) { - $notifyList = $document->getNotifyList(); - $subject = "document_attribute_changed_email_subject"; - $message = "document_attribute_changed_email_body"; - $params = array(); - $params['name'] = $document->getName(); - $params['attribute_name'] = $dms->getAttributeDefinition($attrdefid)->getName(); - $params['attribute_old_value'] = ''; - $params['attribute_new_value'] = $attribute->getValue(); - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['username'] = $user->getFullName(); - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - - $notifier->toList($user, $notifyList["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - foreach ($notifyList["groups"] as $grp) { - $notifier->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - } - } - } - } + $notifier->sendChangedAttributesMail($document, $user, $oldattributes); } $session->setSplashMsg(array('type'=>'success', 'msg'=>getMLText('splash_document_edited'))); diff --git a/op/op.MoveClipboard.php b/op/op.MoveClipboard.php index 2e77ffca4..bff27c200 100644 --- a/op/op.MoveClipboard.php +++ b/op/op.MoveClipboard.php @@ -56,30 +56,7 @@ foreach($clipboard['docs'] as $documentid) { if ($document->setFolder($targetFolder)) { // Send notification to subscribers. if($notifier) { - $nl1 = $oldFolder->getNotifyList(); - $nl2 = $document->getNotifyList(); - $nl3 = $targetFolder->getNotifyList(); - $nl = array( - 'users'=>array_unique(array_merge($nl1['users'], $nl2['users'], $nl3['users']), SORT_REGULAR), - 'groups'=>array_unique(array_merge($nl1['groups'], $nl2['groups'], $nl3['groups']), SORT_REGULAR) - ); - $subject = "document_moved_email_subject"; - $message = "document_moved_email_body"; - $params = array(); - $params['name'] = $document->getName(); - $params['old_folder_path'] = $oldFolder->getFolderPathPlain(); - $params['new_folder_path'] = $targetFolder->getFolderPathPlain(); - $params['username'] = $user->getFullName(); - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - $notifier->toList($user, $nl["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - foreach ($nl["groups"] as $grp) { - $notifier->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - } - // if user is not owner send notification to owner -// if ($user->getID() != $document->getOwner()->getID()) -// $notifier->toIndividual($user, $document->getOwner(), $subject, $message, $params, SeedDMS_NotificationService::RECV_OWNER); + $notifier->sendMovedDocumentMail($document, $user, $oldFolder); } $session->removeFromClipboard($document); @@ -103,31 +80,7 @@ foreach($clipboard['folders'] as $folderid) { if ($folder->setParent($targetFolder)) { // Send notification to subscribers. if($notifier) { - $nl1 = $oldFolder->getNotifyList(); - $nl2 = $folder->getNotifyList(); - $nl3 = $targetFolder->getNotifyList(); - $nl = array( - 'users'=>array_unique(array_merge($nl1['users'], $nl2['users'], $nl3['users']), SORT_REGULAR), - 'groups'=>array_unique(array_merge($nl1['groups'], $nl2['groups'], $nl3['groups']), SORT_REGULAR) - ); - $subject = "folder_moved_email_subject"; - $message = "folder_moved_email_body"; - $params = array(); - $params['name'] = $folder->getName(); - $params['old_folder_path'] = $oldFolder->getFolderPathPlain(); - $params['new_folder_path'] = $targetFolder->getFolderPathPlain(); - $params['username'] = $user->getFullName(); - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewFolder.php?folderid=".$folder->getID(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - $notifier->toList($user, $nl["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - foreach ($nl["groups"] as $grp) { - $notifier->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - } - // if user is not owner send notification to owner -// if ($user->getID() != $folder->getOwner()->getID()) -// $notifier->toIndividual($user, $folder->getOwner(), $subject, $message, $params, SeedDMS_NotificationService::RECV_OWNER); - + $notifier->sendMovedFolderMail($folder, $user, $oldFolder); } $session->removeFromClipboard($folder); } else { diff --git a/op/op.MoveDocument.php b/op/op.MoveDocument.php index 56c7a2515..e1ebc227a 100644 --- a/op/op.MoveDocument.php +++ b/op/op.MoveDocument.php @@ -82,30 +82,7 @@ if(!$settings->_enableDuplicateDocNames) { if ($document->setFolder($targetFolder)) { // Send notification to subscribers. if($notifier) { - $nl1 = $oldFolder->getNotifyList(); - $nl2 = $document->getNotifyList(); - $nl3 = $targetFolder->getNotifyList(); - $nl = array( - 'users'=>array_unique(array_merge($nl1['users'], $nl2['users'], $nl3['users']), SORT_REGULAR), - 'groups'=>array_unique(array_merge($nl1['groups'], $nl2['groups'], $nl3['groups']), SORT_REGULAR) - ); - $subject = "document_moved_email_subject"; - $message = "document_moved_email_body"; - $params = array(); - $params['name'] = $document->getName(); - $params['old_folder_path'] = $oldFolder->getFolderPathPlain(); - $params['new_folder_path'] = $targetFolder->getFolderPathPlain(); - $params['username'] = $user->getFullName(); - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - $notifier->toList($user, $nl["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - foreach ($nl["groups"] as $grp) { - $notifier->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - } - // if user is not owner send notification to owner -// if ($user->getID() != $document->getOwner()->getID()) -// $notifier->toIndividual($user, $document->getOwner(), $subject, $message, $params, SeedDMS_NotificationService::RECV_OWNER); + $notifier->sendMovedDocumentMail($document, $user, $oldFolder); } } else { diff --git a/op/op.MoveFolder.php b/op/op.MoveFolder.php index dbdad0f88..d0fc96886 100644 --- a/op/op.MoveFolder.php +++ b/op/op.MoveFolder.php @@ -81,31 +81,7 @@ if(!$settings->_enableDuplicateSubFolderNames) { if ($folder->setParent($targetFolder)) { // Send notification to subscribers. if($notifier) { - $nl1 = $oldFolder->getNotifyList(); - $nl2 = $folder->getNotifyList(); - $nl3 = $targetFolder->getNotifyList(); - $nl = array( - 'users'=>array_unique(array_merge($nl1['users'], $nl2['users'], $nl3['users']), SORT_REGULAR), - 'groups'=>array_unique(array_merge($nl1['groups'], $nl2['groups'], $nl3['groups']), SORT_REGULAR) - ); - $subject = "folder_moved_email_subject"; - $message = "folder_moved_email_body"; - $params = array(); - $params['name'] = $folder->getName(); - $params['old_folder_path'] = $oldFolder->getFolderPathPlain(); - $params['new_folder_path'] = $targetFolder->getFolderPathPlain(); - $params['username'] = $user->getFullName(); - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewFolder.php?folderid=".$folder->getID(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - $notifier->toList($user, $nl["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - foreach ($nl["groups"] as $grp) { - $notifier->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - } - // if user is not owner send notification to owner - //if ($user->getID() != $folder->getOwner()->getID()) - // $notifier->toIndividual($user, $folder->getOwner(), $subject, $message, $params, SeedDMS_NotificationService::RECV_OWNER); - + $notifier->sendMovedFolderMail($folder, $user, $oldFolder); } } else { UI::exitError(getMLText("folder_title", array("foldername" => $folder->getName())),getMLText("error_occured")); From 33c6436c16b30414924a1dd1dc481465abff55bb Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Sat, 15 May 2021 22:46:46 +0200 Subject: [PATCH 203/403] move more emails into class NotificationService --- inc/inc.ClassNotificationService.php | 120 +++++++++++++++++++++++++++ op/op.AddFile.php | 18 +--- op/op.AddSubFolder.php | 3 + op/op.Ajax.php | 38 ++------- op/op.RemoveDocument.php | 23 ++--- op/op.RemoveFolder.php | 3 + op/op.SetWorkflow.php | 27 +----- 7 files changed, 141 insertions(+), 91 deletions(-) diff --git a/inc/inc.ClassNotificationService.php b/inc/inc.ClassNotificationService.php index 15626e544..728ef5077 100644 --- a/inc/inc.ClassNotificationService.php +++ b/inc/inc.ClassNotificationService.php @@ -302,6 +302,126 @@ class SeedDMS_NotificationService { } /* }}} */ + /** + * This notification is sent when a document is deleted. + * Keep in mind that $document refers to a document which has just been + * deleted from the database, but all the data needed is still in the + * object. + */ + public function sendDeleteDocumentMail($document, $user) { /* {{{ */ + $folder = $document->getFolder(); + $dnl = $document->getNotifyList(); + $fnl = $folder->getNotifyList(); + $nl = array( + 'users'=>array_unique(array_merge($dnl['users'], $fnl['users']), SORT_REGULAR), + 'groups'=>array_unique(array_merge($dnl['groups'], $fnl['groups']), SORT_REGULAR) + ); + $subject = "document_deleted_email_subject"; + $message = "document_deleted_email_body"; + $params = array(); + $params['name'] = $document->getName(); + $params['folder_path'] = $folder->getFolderPathPlain(); + $params['username'] = $user->getFullName(); + $params['sitename'] = $this->settings->_siteName; + $params['http_root'] = $this->settings->_httpRoot; + $params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewFolder.php?folderid=".$folder->getID(); + $this->toList($user, $nl["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + foreach ($nl["groups"] as $grp) { + $this->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + } + } /* }}} */ + + /** + * This notification is sent when a new folder is created. + */ + public function sendNewFolderMail($folder, $user) { /* {{{ */ + $parent = $folder->getParent(); + $fnl = $parent->getNotifyList(); + $snl = $folder->getNotifyList(); + $nl = array( + 'users'=>array_unique(array_merge($snl['users'], $fnl['users']), SORT_REGULAR), + 'groups'=>array_unique(array_merge($snl['groups'], $fnl['groups']), SORT_REGULAR) + ); + + $subject = "new_subfolder_email_subject"; + $message = "new_subfolder_email_body"; + $params = array(); + $params['name'] = $folder->getName(); + $params['folder_name'] = $parent->getName(); + $params['folder_path'] = $parent->getFolderPathPlain(); + $params['username'] = $user->getFullName(); + $params['comment'] = $folder->getComment(); + $params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewFolder.php?folderid=".$folder->getID(); + $params['sitename'] = $this->settings->_siteName; + $params['http_root'] = $this->settings->_httpRoot; + $this->toList($user, $nl["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + foreach ($nl["groups"] as $grp) { + $this->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + } + } /* }}} */ + + /** + * This notification is sent when a folder is deleted. + * Keep in mind that $folder refers to a folder which has just been + * deleted from the database, but all the data needed is still in the + * object. + */ + public function sendDeleteFolderMail($folder, $user) { /* {{{ */ + $parent = $folder->getParent(); + $fnl = $folder->getNotifyList(); + $pnl = $parent->getNotifyList(); + $nl = array( + 'users'=>array_unique(array_merge($fnl['users'], $pnl['users']), SORT_REGULAR), + 'groups'=>array_unique(array_merge($fnl['groups'], $pnl['groups']), SORT_REGULAR) + ); + + $subject = "folder_deleted_email_subject"; + $message = "folder_deleted_email_body"; + $params = array(); + $params['name'] = $folder->getName(); + $params['folder_path'] = $parent->getFolderPathPlain(); + $params['username'] = $user->getFullName(); + $params['sitename'] = $this->settings->_siteName; + $params['http_root'] = $this->settings->_httpRoot; + $params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewFolder.php?folderid=".$parent->getID(); + $this->toList($user, $nl["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + foreach ($nl["groups"] as $grp) { + $this->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + } + } /* }}} */ + + /** + * This notification is sent when a new attachment is created. + */ + public function sendNewFileMail($file, $user) { /* {{{ */ + $document = $file->getDocument(); + $folder = $document->getFolder(); + $notifyList = $document->getNotifyList(); + + $subject = "new_file_email_subject"; + $message = "new_file_email_body"; + $params = array(); + $params['name'] = $file->getName(); + $params['document'] = $document->getName(); + $params['folder_name'] = $folder->getName(); + $params['folder_path'] = $folder->getFolderPathPlain(); + $params['username'] = $user->getFullName(); + $params['comment'] = $file->getComment(); + $params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); + $params['sitename'] = $this->settings->_siteName; + $params['http_root'] = $this->settings->_httpRoot; + // if user is not owner and owner not already in list of notifiers, then + // send notification to owner + if ($user->getID() != $document->getOwner()->getID() && + false === SeedDMS_Core_DMS::inList($document->getOwner(), $notifyList['users'])) { + $this->toIndividual($user, $document->getOwner(), $subject, $message, $params, SeedDMS_NotificationService::RECV_OWNER); + } + $this->toList($user, $notifyList["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + foreach ($notifyList["groups"] as $grp) { + $this->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + } + } /* }}} */ + public function sendChangedExpiryMail($document, $user, $oldexpires) { /* {{{ */ $folder = $document->getFolder(); $notifyList = $document->getNotifyList(); diff --git a/op/op.AddFile.php b/op/op.AddFile.php index 5f970afdd..305972af5 100644 --- a/op/op.AddFile.php +++ b/op/op.AddFile.php @@ -111,22 +111,7 @@ for ($file_num=0;$file_numgetNotifyList(); - - $subject = "new_file_email_subject"; - $message = "new_file_email_body"; - $params = array(); - $params['name'] = $name; - $params['document'] = $document->getName(); - $params['username'] = $user->getFullName(); - $params['comment'] = $comment; - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - $notifier->toList($user, $notifyList["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - foreach ($notifyList["groups"] as $grp) { - $notifier->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - } + $notifier->sendNewFileMail($res, $user); } } } @@ -135,5 +120,4 @@ add_log_line("?name=".$name."&documentid=".$documentid); header("Location:../out/out.ViewDocument.php?documentid=".$documentid."¤ttab=attachments"); - ?> diff --git a/op/op.AddSubFolder.php b/op/op.AddSubFolder.php index a98c9d7ac..efac68b40 100644 --- a/op/op.AddSubFolder.php +++ b/op/op.AddSubFolder.php @@ -121,6 +121,8 @@ if(!$subFolder = $controller->run()) { } else { // Send notification to subscribers. if($notifier) { + $notifier->sendNewFolderMail($subFolder, $user); + /* $fnl = $folder->getNotifyList(); $snl = $subFolder->getNotifyList(); $nl = array( @@ -143,6 +145,7 @@ if(!$subFolder = $controller->run()) { foreach ($nl["groups"] as $grp) { $notifier->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); } + */ } } diff --git a/op/op.Ajax.php b/op/op.Ajax.php index 217316fa7..71dc69af3 100644 --- a/op/op.Ajax.php +++ b/op/op.Ajax.php @@ -74,7 +74,7 @@ if (isset($_COOKIE["mydms_session"])) { } if($settings->_enableEmail) { - $notifier->addService(new SeedDMS_EmailNotify($dms, $settings->_smtpSendFrom, $settings->_smtpServer, $settings->_smtpPort, $settings->_smtpUser, $settings->_smtpPassword)); + $notifier->addService(new SeedDMS_EmailNotify($dms, $settings->_smtpSendFrom, $settings->_smtpServer, $settings->_smtpPort, $settings->_smtpUser, $settings->_smtpPassword), 'email'); } if(isset($GLOBALS['SEEDDMS_HOOKS']['notification'])) { @@ -507,19 +507,7 @@ switch($command) { if($folder->remove()) { if ($notifier) { - $subject = "folder_deleted_email_subject"; - $message = "folder_deleted_email_body"; - $params = array(); - $params['name'] = $foldername; - $params['folder_path'] = $parent->getFolderPathPlain(); - $params['username'] = $user->getFullName(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewFolder.php?folderid=".$parent->getID(); - $notifier->toList($user, $nl["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - foreach ($nl["groups"] as $grp) { - $notifier->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - } + $notifier->sendDeleteFolderMail($folder, $user); } header('Content-Type: application/json'); echo json_encode(array('success'=>true, 'message'=>'', 'data'=>'')); @@ -553,10 +541,6 @@ switch($command) { /* Get the notify list before removing the document */ $dnl = $document->getNotifyList(); $fnl = $folder->getNotifyList(); - $nl = array( - 'users'=>array_unique(array_merge($dnl['users'], $fnl['users']), SORT_REGULAR), - 'groups'=>array_unique(array_merge($dnl['groups'], $fnl['groups']), SORT_REGULAR) - ); $docname = $document->getName(); $controller = Controller::factory('RemoveDocument', array('dms'=>$dms, 'user'=>$user)); @@ -564,18 +548,10 @@ switch($command) { $controller->setParam('fulltextservice', $fulltextservice); if($controller->run()) { if ($notifier){ - $subject = "document_deleted_email_subject"; - $message = "document_deleted_email_body"; - $params = array(); - $params['name'] = $docname; - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['username'] = $user->getFullName(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - $notifier->toList($user, $nl["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - foreach ($nl["groups"] as $grp) { - $notifier->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - } + /* $document still has the data from the just deleted document, + * which is just enough to send the email. + */ + $notifier->sendDeleteDocumentMail($document, $user); } header('Content-Type: application/json'); @@ -844,7 +820,7 @@ switch($command) { } break; /* }}} */ - case 'indexdocument': /* {{{ */ + case 'indexdocument': case 'indexfolder': /* {{{ */ if($user && $user->isAdmin()) { if($fulltextservice) { diff --git a/op/op.RemoveDocument.php b/op/op.RemoveDocument.php index 9d554b335..f700b96ac 100644 --- a/op/op.RemoveDocument.php +++ b/op/op.RemoveDocument.php @@ -69,13 +69,11 @@ $previewer->deleteDocumentPreviews($document); /* Get the notify list before removing the document * Also inform the users/groups of the parent folder + * Getting the list now will keep them in the document object + * even after the document has been deleted. */ $dnl = $document->getNotifyList(); $fnl = $folder->getNotifyList(); -$nl = array( - 'users'=>array_unique(array_merge($dnl['users'], $fnl['users']), SORT_REGULAR), - 'groups'=>array_unique(array_merge($dnl['groups'], $fnl['groups']), SORT_REGULAR) -); $docname = $document->getName(); $controller->setParam('document', $document); @@ -89,19 +87,10 @@ if(!$controller->run()) { } if ($notifier){ - $subject = "document_deleted_email_subject"; - $message = "document_deleted_email_body"; - $params = array(); - $params['name'] = $docname; - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['username'] = $user->getFullName(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewFolder.php?folderid=".$folder->getID(); - $notifier->toList($user, $nl["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - foreach ($nl["groups"] as $grp) { - $notifier->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - } + /* $document still has the data from the just deleted document, + * which is just enough to send the email. + */ + $notifier->sendDeleteDocumentMail($document, $user); } $session->setSplashMsg(array('type'=>'success', 'msg'=>getMLText('splash_rm_document'))); diff --git a/op/op.RemoveFolder.php b/op/op.RemoveFolder.php index 0d0c948e3..a2a25da55 100644 --- a/op/op.RemoveFolder.php +++ b/op/op.RemoveFolder.php @@ -85,6 +85,8 @@ if(!$controller->run()) { } if ($notifier) { + $notifier->sendDeleteFolderMail($folder, $user); + /* $subject = "folder_deleted_email_subject"; $message = "folder_deleted_email_body"; $params = array(); @@ -98,6 +100,7 @@ if ($notifier) { foreach ($nl["groups"] as $grp) { $notifier->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); } + */ } add_log_line("?folderid=".$folderid."&name=".$foldername); diff --git a/op/op.SetWorkflow.php b/op/op.SetWorkflow.php index b679ab885..13a961c00 100644 --- a/op/op.SetWorkflow.php +++ b/op/op.SetWorkflow.php @@ -72,32 +72,7 @@ if (!$version->setWorkflow($workflow, $user)){ } if ($notifier) { - $nl = $document->getNotifyList(); - $folder = $document->getFolder(); - - if($settings->_enableNotificationWorkflow) { - $subject = "request_workflow_action_email_subject"; - $message = "request_workflow_action_email_body"; - $params = array(); - $params['name'] = $document->getName(); - $params['version'] = $version->getVersion(); - $params['workflow'] = $workflow->getName(); - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['current_state'] = $workflow->getInitState()->getName(); - $params['username'] = $user->getFullName(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); - - foreach($workflow->getNextTransitions($workflow->getInitState()) as $ntransition) { - foreach($ntransition->getUsers() as $tuser) { - $notifier->toIndividual($user, $tuser->getUser(), $subject, $message, $params, SeedDMS_NotificationService::RECV_WORKFLOW); - } - foreach($ntransition->getGroups() as $tuser) { - $notifier->toGroup($user, $tuser->getGroup(), $subject, $message, $params, SeedDMS_NotificationService::RECV_WORKFLOW); - } - } - } + $notifier->sendRequestWorkflowActionMail($version, $user); } add_log_line("?documentid=".$documentid); From abd52ea2193ed62aaff809ffb801f852aa7978a8 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Mon, 17 May 2021 07:01:03 +0200 Subject: [PATCH 204/403] set version in sendChangedVersionCommentMail() --- inc/inc.ClassNotificationService.php | 1 + 1 file changed, 1 insertion(+) diff --git a/inc/inc.ClassNotificationService.php b/inc/inc.ClassNotificationService.php index 728ef5077..37d11b092 100644 --- a/inc/inc.ClassNotificationService.php +++ b/inc/inc.ClassNotificationService.php @@ -542,6 +542,7 @@ class SeedDMS_NotificationService { $message = "document_comment_changed_email_body"; $params = array(); $params['name'] = $document->getName(); + $params['version'] = $content->getVersion(); $params['folder_path'] = $folder->getFolderPathPlain(); $params['old_comment'] = $oldcomment; $params['new_comment'] = $content->getComment(); From 72dcae36a29d44b4634568991f5d2b07c21834bc Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Mon, 17 May 2021 13:31:32 +0200 Subject: [PATCH 205/403] place submit button outside content area --- views/bootstrap/class.AddSubFolder.php | 4 ++-- views/bootstrap/class.DocumentAccess.php | 27 +++++++++++----------- views/bootstrap/class.EditDocument.php | 4 ++-- views/bootstrap/class.EditFolder.php | 4 ++-- views/bootstrap/class.FolderAccess.php | 29 ++++++++++++------------ views/bootstrap/class.UpdateDocument.php | 4 ++-- 6 files changed, 36 insertions(+), 36 deletions(-) diff --git a/views/bootstrap/class.AddSubFolder.php b/views/bootstrap/class.AddSubFolder.php index 393e67510..56737ca70 100644 --- a/views/bootstrap/class.AddSubFolder.php +++ b/views/bootstrap/class.AddSubFolder.php @@ -81,7 +81,6 @@ $(document).ready( function() { contentHeading(getMLText("add_subfolder")); - $this->contentContainerStart(); ?> @@ -89,6 +88,7 @@ $(document).ready( function() { contentContainerStart(); $this->formField( getMLText("name"), array( @@ -143,11 +143,11 @@ $(document).ready( function() { echo $arrs; } + $this->contentContainerEnd(); $this->formSubmit(" ".getMLText('add_subfolder')); ?> contentContainerEnd(); $this->contentEnd(); $this->htmlEndPage(); } /* }}} */ diff --git a/views/bootstrap/class.DocumentAccess.php b/views/bootstrap/class.DocumentAccess.php index 994017c7b..f0f0bfa9a 100644 --- a/views/bootstrap/class.DocumentAccess.php +++ b/views/bootstrap/class.DocumentAccess.php @@ -95,16 +95,16 @@ $(document).ready( function() { $this->contentHeading(getMLText("edit_document_access")); $this->rowStart(); $this->columnStart(4); - $this->contentContainerStart(); if ($user->isAdmin()) { ?> -
        + contentContainerStart(); $owner = $document->getOwner(); $options = array(); foreach ($allUsers as $currUser) { @@ -120,16 +120,17 @@ $(document).ready( function() { 'options'=>$options ) ); + $this->contentContainerEnd(); $this->formSubmit(" ".getMLText('save')); ?>
        contentSubHeading(getMLText("access_inheritance")); + $this->contentHeading(getMLText("access_inheritance")); if ($document->inheritsAccess()) { - printMLText("inherits_access_msg"); + $this->infoMsg(getMLText("inherits_access_msg")); ?>

        @@ -148,7 +149,6 @@ $(document).ready( function() {

        contentContainerEnd(); $this->columnEnd(); $this->rowEnd(); $this->contentEnd(); @@ -163,23 +163,23 @@ $(document).ready( function() { "> contentContainerEnd(); $this->columnEnd(); $this->columnStart(4); - $this->contentContainerStart(); $accessList = $document->getAccessList(); ?> -
        + contentContainerStart(); $this->formField( getMLText("default_access"), $this->getAccessModeSelection($document->getDefaultAccess()) ); + $this->contentContainerEnd(); $this->formSubmit(" ".getMLText('save')); ?>
        @@ -189,6 +189,7 @@ $(document).ready( function() { contentContainerStart(); $memusers = array(); foreach ($accessList["users"] as $userAccess) { $userObj = $userAccess->getUser(); @@ -234,11 +235,11 @@ $(document).ready( function() { getMLText("access_mode"), $this->getAccessModeSelection(M_READ) ); + $this->contentContainerEnd(); $this->formSubmit(" ".getMLText('add')); ?> contentContainerEnd(); $this->columnEnd(); $this->columnStart(4); /* memorize users with access rights */ @@ -264,7 +265,7 @@ $(document).ready( function() { print "getId()."\">\n"; print "\n"; print "getID()."\">\n"; - print ""; + print ""; print "\n"; print "\n"; print "
        \n"; @@ -273,7 +274,7 @@ $(document).ready( function() { print "getId()."\">\n"; print "\n"; print "getID()."\">\n"; - print ""; + print ""; print "\n"; print "\n"; print "\n"; @@ -295,7 +296,7 @@ $(document).ready( function() { print "getId()."\">"; print ""; print "getID()."\">"; - print ""; + print ""; print "
        \n"; print ""; print "
        \n"; @@ -304,7 +305,7 @@ $(document).ready( function() { print "getId()."\">\n"; print "\n"; print "getID()."\">\n"; - print ""; + print ""; print "
        "; print "\n"; print "\n"; diff --git a/views/bootstrap/class.EditDocument.php b/views/bootstrap/class.EditDocument.php index 89f49bdde..f29b919fb 100644 --- a/views/bootstrap/class.EditDocument.php +++ b/views/bootstrap/class.EditDocument.php @@ -82,7 +82,6 @@ $(document).ready( function() { $this->pageNavigation($this->getFolderPathHTML($folder, true, $document), "view_document", $document); $this->contentHeading(getMLText("edit_document_props")); - $this->contentContainerStart(); if($document->expires()) $expdate = getReadableDate($document->getExpires()); @@ -93,6 +92,7 @@ $(document).ready( function() { contentContainerStart(); $this->formField( getMLText("name"), array( @@ -232,11 +232,11 @@ $(document).ready( function() { } elseif(is_string($arrs)) { echo $arrs; } + $this->contentContainerEnd(); $this->formSubmit(" ".getMLText('save')); ?> contentContainerEnd(); $this->contentEnd(); $this->htmlEndPage(); } /* }}} */ diff --git a/views/bootstrap/class.EditFolder.php b/views/bootstrap/class.EditFolder.php index 927a37ba7..7501012d5 100644 --- a/views/bootstrap/class.EditFolder.php +++ b/views/bootstrap/class.EditFolder.php @@ -78,13 +78,13 @@ $(document).ready(function() { $this->contentStart(); $this->pageNavigation($this->getFolderPathHTML($folder, true), "view_folder", $folder); $this->contentHeading(getMLText("edit_folder_props")); - $this->contentContainerStart(); ?>
        contentContainerStart(); $this->formField( getMLText("name"), array( @@ -133,11 +133,11 @@ $(document).ready(function() { } elseif(is_string($arrs)) { echo $arrs; } + $this->contentContainerEnd(); $this->formSubmit(" ".getMLText('save')); ?>
        contentContainerEnd(); $this->contentEnd(); $this->htmlEndPage(); } /* }}} */ diff --git a/views/bootstrap/class.FolderAccess.php b/views/bootstrap/class.FolderAccess.php index dd77941b1..ab7609afb 100644 --- a/views/bootstrap/class.FolderAccess.php +++ b/views/bootstrap/class.FolderAccess.php @@ -92,16 +92,16 @@ $(document).ready(function() { $this->contentHeading(getMLText("edit_folder_access")); $this->rowStart(); $this->columnStart(4); - $this->contentContainerStart(); if ($user->isAdmin()) { ?> -
        + contentContainerStart(); $owner = $folder->getOwner(); $options = array(); foreach ($allUsers as $currUser) { @@ -117,6 +117,7 @@ $(document).ready(function() { 'options'=>$options ) ); + $this->contentContainerEnd(); $this->formSubmit(" ".getMLText('save')); ?>
        @@ -125,10 +126,10 @@ $(document).ready(function() { if ($folder->getID() != $rootfolderid && $folder->getParent()){ - $this->contentSubHeading(getMLText("access_inheritance")); + $this->contentHeading(getMLText("access_inheritance")); if ($folder->inheritsAccess()) { - printMLText("inherits_access_msg"); + $this->infoMsg(getMLText("inherits_access_msg")); ?>

        @@ -147,7 +148,6 @@ $(document).ready(function() {

        contentContainerEnd(); $this->columnEnd(); $this->rowEnd(); $this->contentEnd(); @@ -163,35 +163,34 @@ $(document).ready(function() { contentContainerEnd(); $this->columnEnd(); $this->columnStart(4); - $this->contentContainerStart(); $accessList = $folder->getAccessList(); ?> -
        + contentContainerStart(); $this->formField( getMLText("default_access"), $this->getAccessModeSelection($folder->getDefaultAccess()) ); + $this->contentContainerEnd(); $this->formSubmit(" ".getMLText('save')); ?>
        contentContainerEnd(); - $this->contentContainerStart(); ?>
        contentContainerStart(); $options = array(); $options[] = array(-1, getMLText('select_one')); foreach ($allUsers as $currUser) { @@ -228,11 +227,11 @@ $(document).ready(function() { getMLText("access_mode"), $this->getAccessModeSelection(M_READ) ); + $this->contentContainerEnd(); $this->formSubmit(" ".getMLText('add')); ?>
        contentContainerEnd(); $this->columnEnd(); $this->columnStart(4); @@ -254,7 +253,7 @@ $(document).ready(function() { $this->printAccessModeSelection($userAccess->getMode()); print "\n"; print "\n"; - print ""; + print ""; print "\n"; print "\n"; print "
        \n"; @@ -263,7 +262,7 @@ $(document).ready(function() { print "\n"; print "getID()."\">\n"; print "\n"; - print ""; + print ""; print "\n"; print "
        \n"; print "\n"; @@ -284,7 +283,7 @@ $(document).ready(function() { $this->printAccessModeSelection($groupAccess->getMode()); print "\n"; print "\n"; - print ""; + print ""; print "\n"; print ""; print "
        \n"; @@ -293,7 +292,7 @@ $(document).ready(function() { print "\n"; print "getID()."\">\n"; print ""; - print ""; + print ""; print "\n"; print "
        "; print "\n"; diff --git a/views/bootstrap/class.UpdateDocument.php b/views/bootstrap/class.UpdateDocument.php index 9edbaea03..ced0ed44d 100644 --- a/views/bootstrap/class.UpdateDocument.php +++ b/views/bootstrap/class.UpdateDocument.php @@ -220,13 +220,13 @@ console.log(element); } if($msg) $this->warningMsg($msg); - $this->contentContainerStart(); ?>
        contentContainerStart(); $this->formField( getMLText("local_file"), $enablelargefileupload ? $this->getFineUploaderHtml() : $this->getFileChooserHtml('userfile', false) @@ -649,12 +649,12 @@ console.log(element); } $this->warningMsg(getMLText("add_doc_reviewer_approver_warning")); } + $this->contentContainerEnd(); $this->formSubmit(getMLText('update_document')); ?>
        contentContainerEnd(); $this->contentEnd(); $this->htmlEndPage(); } /* }}} */ From 3422e5a906f9a1f5ab0859da121038a9361ff37b Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 18 May 2021 16:58:16 +0200 Subject: [PATCH 206/403] move sending notification mail in class NotificationService --- inc/inc.ClassNotificationService.php | 21 +++++++++++++++++++++ op/op.TransferDocument.php | 21 ++------------------- 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/inc/inc.ClassNotificationService.php b/inc/inc.ClassNotificationService.php index 37d11b092..afe52388e 100644 --- a/inc/inc.ClassNotificationService.php +++ b/inc/inc.ClassNotificationService.php @@ -655,5 +655,26 @@ class SeedDMS_NotificationService { $this->toIndividual($user, $folder->getOwner(), $subject, $message, $params, SeedDMS_NotificationService::RECV_OWNER); } } /* }}} */ + + public function sendTransferDocumentMail($document, $user, $oldowner) { /* {{{ */ + $folder = $document->getFolder(); + $nl = $document->getNotifyList(); + $subject = "document_transfered_email_subject"; + $message = "document_transfered_email_body"; + $params = array(); + $params['name'] = $document->getName(); + $params['newuser'] = $document->getOwner()->getFullName(); + $params['olduser'] = $oldowner->getFullName(); + $params['folder_path'] = $folder->getFolderPathPlain(); + $params['username'] = $user->getFullName(); + $params['sitename'] = $this->settings->_siteName; + $params['http_root'] = $this->settings->_httpRoot; + $params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); + $this->toList($user, $nl["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + foreach ($nl["groups"] as $grp) { + $this->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + } + } /* }}} */ + } diff --git a/op/op.TransferDocument.php b/op/op.TransferDocument.php index 69056506a..b3080a82c 100644 --- a/op/op.TransferDocument.php +++ b/op/op.TransferDocument.php @@ -30,10 +30,6 @@ include("../inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); $controller = Controller::factory($tmp[1], array('dms'=>$dms, 'user'=>$user)); -$accessop = new SeedDMS_AccessOperation($dms, $user, $settings); -if (!$accessop->check_controller_access($controller, $_POST)) { - UI::exitError(getMLText("document_title", array("documentname" => "")),getMLText("access_denied")); -} /* Check if the form data comes from a trusted request */ if(!checkFormKey('transferdocument')) { @@ -61,6 +57,7 @@ if (!is_object($newuser)) { } $folder = $document->getFolder(); +$oldowner = $document->getOwner(); $controller->setParam('document', $document); $controller->setParam('newuser', $newuser); @@ -70,21 +67,7 @@ if(!$controller->run()) { if ($notifier){ /* Get the notify list before removing the document */ - $nl = $document->getNotifyList(); - $subject = "document_transfered_email_subject"; - $message = "document_transfered_email_body"; - $params = array(); - $params['name'] = $document->getName(); - $params['newuser'] = $newuser->getFullName(); - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['username'] = $user->getFullName(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); - $notifier->toList($user, $nl["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - foreach ($nl["groups"] as $grp) { - $notifier->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - } + $notifier->sendTransferDocumentMail($document, $user, $oldowner); } $session->setSplashMsg(array('type'=>'success', 'msg'=>getMLText('splash_transfer_document'))); From 040793034b68e98b7260da8dc36d69bea2fc6731 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 18 May 2021 17:07:14 +0200 Subject: [PATCH 207/403] move notification mail into class NotificationService --- inc/inc.ClassNotificationService.php | 26 ++++++++++++++++++++++++++ op/op.OverrideContentStatus.php | 21 +-------------------- 2 files changed, 27 insertions(+), 20 deletions(-) diff --git a/inc/inc.ClassNotificationService.php b/inc/inc.ClassNotificationService.php index afe52388e..62835bad4 100644 --- a/inc/inc.ClassNotificationService.php +++ b/inc/inc.ClassNotificationService.php @@ -676,5 +676,31 @@ class SeedDMS_NotificationService { } } /* }}} */ + public function sendChangedDocumentStatusMail($document, $user, $oldstatus) { /* {{{ */ + $content = $document->getLatestContent(); + $overallStatus = $content->getStatus(); + $nl = $document->getNotifyList(); + $folder = $document->getFolder(); + $subject = "document_status_changed_email_subject"; + $message = "document_status_changed_email_body"; + $params = array(); + $params['name'] = $document->getName(); + $params['folder_path'] = $folder->getFolderPathPlain(); + $params['status'] = getOverallStatusText($overallStatus["status"]); + $params['old_status'] = getOverallStatusText($oldstatus); + $params['new_status_code'] = $overallStatus["status"]; + $params['old_status_code'] = $oldstatus; + $params['username'] = $user->getFullName(); + $params['sitename'] = $this->settings->_siteName; + $params['http_root'] = $this->settings->_httpRoot; + $params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); + $this->toList($user, $nl["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + foreach ($nl["groups"] as $grp) { + $this->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + } + +// $notifier->toIndividual($user, $content->getUser(), $subject, $message, $params, SeedDMS_NotificationService::RECV_OWNER); + } /* }}} */ + } diff --git a/op/op.OverrideContentStatus.php b/op/op.OverrideContentStatus.php index 58d0e7f9b..a92d9470c 100644 --- a/op/op.OverrideContentStatus.php +++ b/op/op.OverrideContentStatus.php @@ -80,26 +80,7 @@ if ($overrideStatus != $overallStatus["status"]) { } else { // Send notification to subscribers. if($notifier) { - $nl = $document->getNotifyList(); - $folder = $document->getFolder(); - $subject = "document_status_changed_email_subject"; - $message = "document_status_changed_email_body"; - $params = array(); - $params['name'] = $document->getName(); - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['status'] = getOverallStatusText($overrideStatus); - $params['new_status_code'] = $overrideStatus; - $params['old_status_code'] = $overallStatus["status"]; - $params['username'] = $user->getFullName(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); - $notifier->toList($user, $nl["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - foreach ($nl["groups"] as $grp) { - $notifier->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - } - -// $notifier->toIndividual($user, $content->getUser(), $subject, $message, $params, SeedDMS_NotificationService::RECV_OWNER); + $notifier->sendChangedDocumentStatusMail($document, $user, $overallStatus["status"]); } } } From 97c001acbed6aa753fa31ab7c8ac5b3fdf2b1446 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 18 May 2021 17:39:14 +0200 Subject: [PATCH 208/403] move notification mail into notification service --- inc/inc.ClassNotificationService.php | 112 ++++++++++++++++++++++----- op/op.DocumentNotify.php | 43 +--------- op/op.FolderNotify.php | 46 +---------- 3 files changed, 99 insertions(+), 102 deletions(-) diff --git a/inc/inc.ClassNotificationService.php b/inc/inc.ClassNotificationService.php index 62835bad4..3bc65319f 100644 --- a/inc/inc.ClassNotificationService.php +++ b/inc/inc.ClassNotificationService.php @@ -678,28 +678,98 @@ class SeedDMS_NotificationService { public function sendChangedDocumentStatusMail($document, $user, $oldstatus) { /* {{{ */ $content = $document->getLatestContent(); - $overallStatus = $content->getStatus(); - $nl = $document->getNotifyList(); - $folder = $document->getFolder(); - $subject = "document_status_changed_email_subject"; - $message = "document_status_changed_email_body"; - $params = array(); - $params['name'] = $document->getName(); - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['status'] = getOverallStatusText($overallStatus["status"]); - $params['old_status'] = getOverallStatusText($oldstatus); - $params['new_status_code'] = $overallStatus["status"]; - $params['old_status_code'] = $oldstatus; - $params['username'] = $user->getFullName(); - $params['sitename'] = $this->settings->_siteName; - $params['http_root'] = $this->settings->_httpRoot; - $params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); - $this->toList($user, $nl["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - foreach ($nl["groups"] as $grp) { - $this->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - } + $overallStatus = $content->getStatus(); + $nl = $document->getNotifyList(); + $folder = $document->getFolder(); + $subject = "document_status_changed_email_subject"; + $message = "document_status_changed_email_body"; + $params = array(); + $params['name'] = $document->getName(); + $params['folder_path'] = $folder->getFolderPathPlain(); + $params['status'] = getOverallStatusText($overallStatus["status"]); + $params['old_status'] = getOverallStatusText($oldstatus); + $params['new_status_code'] = $overallStatus["status"]; + $params['old_status_code'] = $oldstatus; + $params['username'] = $user->getFullName(); + $params['sitename'] = $this->settings->_siteName; + $params['http_root'] = $this->settings->_httpRoot; + $params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); + $this->toList($user, $nl["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + foreach ($nl["groups"] as $grp) { + $this->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + } -// $notifier->toIndividual($user, $content->getUser(), $subject, $message, $params, SeedDMS_NotificationService::RECV_OWNER); +// $notifier->toIndividual($user, $content->getUser(), $subject, $message, $params, SeedDMS_NotificationService::RECV_OWNER); + } /* }}} */ + + public function sendNewDocumentNotifyMail($document, $user, $obj) { /* {{{ */ + $folder = $document->getFolder(); + $subject = "notify_added_email_subject"; + $message = "notify_added_email_body"; + $params = array(); + $params['name'] = $document->getName(); + $params['folder_path'] = $folder->getFolderPathPlain(); + $params['username'] = $user->getFullName(); + $params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); + $params['sitename'] = $this->settings->_siteName; + $params['http_root'] = $this->settings->_httpRoot; + + if($obj->isType('user')) + $this->toIndividual($user, $obj, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + elseif($obj->isType('group')) + $notifier->toGroup($user, $obj, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + } /* }}} */ + + public function sendNewFolderNotifyMail($folder, $user, $obj) { /* {{{ */ + $subject = "notify_added_email_subject"; + $message = "notify_added_email_body"; + $params = array(); + $params['name'] = $folder->getName(); + $params['folder_path'] = $folder->getFolderPathPlain(); + $params['username'] = $user->getFullName(); + $params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewFolder.php?folderid=".$folder->getID(); + $params['sitename'] = $this->settings->_siteName; + $params['http_root'] = $this->settings->_httpRoot; + + if($obj->isType('user')) + $this->toIndividual($user, $obj, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + elseif($obj->isType('group')) + $notifier->toGroup($user, $obj, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + } /* }}} */ + + public function sendDeleteDocumentNotifyMail($document, $user, $obj) { /* {{{ */ + $folder = $document->getFolder(); + $subject = "notify_deleted_email_subject"; + $message = "notify_deleted_email_body"; + $params = array(); + $params['name'] = $folder->getName(); + $params['folder_path'] = $folder->getFolderPathPlain(); + $params['username'] = $user->getFullName(); + $params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); + $params['sitename'] = $this->settings->_siteName; + $params['http_root'] = $this->settings->_httpRoot; + + if($obj->isType('user')) + $this->toIndividual($user, $obj, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + elseif($obj->isType('group')) + $notifier->toGroup($user, $obj, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + } /* }}} */ + + public function sendDeleteFolderNotifyMail($folder, $user, $obj) { /* {{{ */ + $subject = "notify_deleted_email_subject"; + $message = "notify_deleted_email_body"; + $params = array(); + $params['name'] = $folder->getName(); + $params['folder_path'] = $folder->getFolderPathPlain(); + $params['username'] = $user->getFullName(); + $params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewFolder.php?folderid=".$folder->getID(); + $params['sitename'] = $this->settings->_siteName; + $params['http_root'] = $this->settings->_httpRoot; + + if($obj->isType('user')) + $this->toIndividual($user, $obj, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + elseif($obj->isType('group')) + $notifier->toGroup($user, $obj, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); } /* }}} */ } diff --git a/op/op.DocumentNotify.php b/op/op.DocumentNotify.php index abcbf632e..9e061c247 100644 --- a/op/op.DocumentNotify.php +++ b/op/op.DocumentNotify.php @@ -94,7 +94,7 @@ if ($action == "delnotify"){ UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("access_denied")); break; case -3: - UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("already_subscribed")); + UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("not_subscribed")); break; case -4: UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("internal_error")); @@ -102,22 +102,7 @@ if ($action == "delnotify"){ case 0: // Email user / group, informing them of subscription change. if($notifier) { - $subject = "notify_deleted_email_subject"; - $message = "notify_deleted_email_body"; - $params = array(); - $params['name'] = $document->getName(); - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['username'] = $user->getFullName(); - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - - if ($userid > 0) { - $notifier->toIndividual($user, $obj, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - } - else { - $notifier->toGroup($user, $obj, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - } + $notifier->sendDeleteFolderNotifyMail($folder, $user, $obj); } break; } @@ -145,17 +130,7 @@ else if ($action == "addnotify") { // Email user / group, informing them of subscription. if ($notifier){ $obj = $dms->getUser($userid); - $subject = "notify_added_email_subject"; - $message = "notify_added_email_body"; - $params = array(); - $params['name'] = $document->getName(); - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['username'] = $user->getFullName(); - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - - $notifier->toIndividual($user, $obj, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + $notifier->sendNewDocumentNotifyMail($document, $user, $obj); } break; @@ -179,17 +154,7 @@ else if ($action == "addnotify") { case 0: if ($notifier){ $obj = $dms->getGroup($groupid); - $subject = "notify_added_email_subject"; - $message = "notify_added_email_body"; - $params = array(); - $params['name'] = $document->getName(); - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['username'] = $user->getFullName(); - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - - $notifier->toGroup($user, $obj, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + $notifier->sendNewDocumentNotifyMail($document, $user, $obj); } break; } diff --git a/op/op.FolderNotify.php b/op/op.FolderNotify.php index f2dbca2ce..0390ab7b7 100644 --- a/op/op.FolderNotify.php +++ b/op/op.FolderNotify.php @@ -89,30 +89,14 @@ if ($action == "delnotify") { UI::exitError(getMLText("folder_title", array("foldername" => $folder->getName())),getMLText("access_denied")); break; case -3: - UI::exitError(getMLText("folder_title", array("foldername" => $folder->getName())),getMLText("already_subscribed")); + UI::exitError(getMLText("folder_title", array("foldername" => $folder->getName())),getMLText("not_subscribed")); break; case -4: UI::exitError(getMLText("folder_title", array("foldername" => $folder->getName())),getMLText("internal_error")); break; case 0: if($notifier) { - // Email user / group, informing them of subscription. - $subject = "notify_deleted_email_subject"; - $message = "notify_deleted_email_body"; - $params = array(); - $params['name'] = $folder->getName(); - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['username'] = $user->getFullName(); - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewFolder.php?folderid=".$folder->getID(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - - if ($userid > 0) { - $notifier->toIndividual($user, $obj, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - } - else { - $notifier->toGroup($user, $obj, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - } + $notifier->sendDeleteFolderNotifyMail($folder, $user, $obj); } break; } @@ -139,18 +123,7 @@ else if ($action == "addnotify") { case 0: if($notifier) { $obj = $dms->getUser($userid); - // Email user / group, informing them of subscription. - $subject = "notify_added_email_subject"; - $message = "notify_added_email_body"; - $params = array(); - $params['name'] = $folder->getName(); - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['username'] = $user->getFullName(); - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewFolder.php?folderid=".$folder->getID(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - - $notifier->toIndividual($user, $obj, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + $notifier->sendNewFolderNotifyMail($folder, $user, $obj); } break; @@ -174,18 +147,7 @@ else if ($action == "addnotify") { case 0: if($notifier) { $obj = $dms->getGroup($groupid); - // Email user / group, informing them of subscription. - $subject = "notify_added_email_subject"; - $message = "notify_added_email_body"; - $params = array(); - $params['name'] = $folder->getName(); - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['username'] = $user->getFullName(); - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewFolder.php?folderid=".$folder->getID(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - - $notifier->toGroup($user, $obj, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + $notifier->sendNewFolderNotifyMail($folder, $user, $obj); } break; } From 0852d10df4afddb1acba227796592be831a8aa83 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Wed, 19 May 2021 08:32:38 +0200 Subject: [PATCH 209/403] add version to document update mail, add stub for remove version mail --- inc/inc.ClassNotificationService.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/inc/inc.ClassNotificationService.php b/inc/inc.ClassNotificationService.php index 3bc65319f..edc06b04b 100644 --- a/inc/inc.ClassNotificationService.php +++ b/inc/inc.ClassNotificationService.php @@ -284,6 +284,7 @@ class SeedDMS_NotificationService { $params['folder_path'] = $folder->getFolderPathPlain(); $params['username'] = $user->getFullName(); $params['comment'] = $document->getComment(); + $params['version'] = $lc->getVersion(); $params['version_comment'] = $lc->getComment(); $params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); $params['sitename'] = $this->settings->_siteName; @@ -331,6 +332,15 @@ class SeedDMS_NotificationService { } } /* }}} */ + /** + * This notification is sent when a document version is deleted. + * Keep in mind that $document refers to a document which has just been + * deleted from the database, but all the data needed is still in the + * object. + */ + public function sendDeleteDocumentVersionMail($document, $user) { /* {{{ */ + } /* }}} */ + /** * This notification is sent when a new folder is created. */ From ba381d8e85e816f084fbb0439a0a31895b9bcb54 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Wed, 19 May 2021 08:33:15 +0200 Subject: [PATCH 210/403] use controller RemoveDocument, send mail with notification class --- op/op.RemoveVersion.php | 56 +++++++++++++++++++---------------------- 1 file changed, 26 insertions(+), 30 deletions(-) diff --git a/op/op.RemoveVersion.php b/op/op.RemoveVersion.php index 4857f3955..ca68b62f4 100644 --- a/op/op.RemoveVersion.php +++ b/op/op.RemoveVersion.php @@ -67,37 +67,33 @@ $folder = $document->getFolder(); /* Check if there is just one version. In that case remove the document */ if (count($document->getContent())==1) { $previewer->deleteDocumentPreviews($document); - $nl = $document->getNotifyList(); - $docname = $document->getName(); - if (!$document->remove()) { - UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("error_occured")); - } else { - $nexturl = "../out/out.ViewFolder.php?folderid=".$folder->getId(); - /* Remove the document from the fulltext index */ - if($fulltextservice && ($index = $fulltextservice->Index())) { - $lucenesearch = $fulltextservice->Search(); - if($hit = $lucenesearch->getDocument($documentid)) { - $index->delete($hit->id); - $index->commit(); - } - } - if ($notifier){ - $subject = "document_deleted_email_subject"; - $message = "document_deleted_email_body"; - $params = array(); - $params['name'] = $docname; - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['username'] = $user->getFullName(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); - $notifier->toList($user, $nl["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - foreach ($nl["groups"] as $grp) { - $notifier->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - } - } + /* Get the notify list before removing the document + * Also inform the users/groups of the parent folder + * Getting the list now will keep them in the document object + * even after the document has been deleted. + */ + $dnl = $document->getNotifyList(); + $fnl = $folder->getNotifyList(); + $docname = $document->getName(); + + $controller->setParam('document', $document); + $controller->setParam('fulltextservice', $fulltextservice); + if(!$controller->run()) { + if ($controller->getErrorMsg() != '') + $errormsg = $controller->getErrorMsg(); + else + $errormsg = "error_remove_document"; + UI::exitError(getMLText("document_title", array("documentname" => htmlspecialchars($docname))),getMLText($errormsg)); } + + if ($notifier){ + /* $document still has the data from the just deleted document, + * which is just enough to send the email. + */ + $notifier->sendDeleteDocumentMail($document, $user); + } + $nexturl = "../out/out.ViewFolder.php?folderid=".$folder->getId(); } else { /* Before deleting the content get a list of all users that should @@ -129,7 +125,7 @@ else { $previewer->deletePreview($version, $settings->_previewWidthDetail); $previewer->deletePreview($version, $settings->_previewWidthList); - /* Check if the version to be delete is the latest version. This is + /* Check if the version to be deleted is the latest version. This is * later used to set the redirect url. */ $islatest = $version->getVersion() == $document->getLatestContent()->getVersion(); From 6feb6d7121497a3f3bdd60480093a3af51dce682 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Wed, 19 May 2021 08:34:31 +0200 Subject: [PATCH 211/403] remove already commented code --- op/op.RemoveFolder.php | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/op/op.RemoveFolder.php b/op/op.RemoveFolder.php index a2a25da55..5d0e09b64 100644 --- a/op/op.RemoveFolder.php +++ b/op/op.RemoveFolder.php @@ -86,21 +86,6 @@ if(!$controller->run()) { if ($notifier) { $notifier->sendDeleteFolderMail($folder, $user); - /* - $subject = "folder_deleted_email_subject"; - $message = "folder_deleted_email_body"; - $params = array(); - $params['name'] = $foldername; - $params['folder_path'] = $parent->getFolderPathPlain(); - $params['username'] = $user->getFullName(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewFolder.php?folderid=".$parent->getID(); - $notifier->toList($user, $nl["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - foreach ($nl["groups"] as $grp) { - $notifier->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - } - */ } add_log_line("?folderid=".$folderid."&name=".$foldername); From 92ff13afc60eee2601ab4a4c4ffdf1d4ea09cb91 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Wed, 19 May 2021 15:13:49 +0200 Subject: [PATCH 212/403] move notification mail into notification service --- inc/inc.ClassNotificationService.php | 104 ++++++++++++++++++++++++++ op/op.EditFolder.php | 108 ++------------------------- 2 files changed, 109 insertions(+), 103 deletions(-) diff --git a/inc/inc.ClassNotificationService.php b/inc/inc.ClassNotificationService.php index edc06b04b..f86fdc415 100644 --- a/inc/inc.ClassNotificationService.php +++ b/inc/inc.ClassNotificationService.php @@ -461,6 +461,7 @@ class SeedDMS_NotificationService { } /* }}} */ public function sendChangedAttributesMail($document, $user, $oldattributes) { /* {{{ */ + $dms = $document->getDMS(); $folder = $document->getFolder(); $notifyList = $document->getNotifyList(); @@ -514,6 +515,60 @@ class SeedDMS_NotificationService { } } /* }}} */ + public function sendChangedFolderAttributesMail($folder, $user, $oldattributes) { /* {{{ */ + $dms = $folder->getDMS(); + $notifyList = $folder->getNotifyList(); + + $newattributes = $folder->getAttributes(); + if($oldattributes) { + foreach($oldattributes as $attrdefid=>$attribute) { + if(!isset($newattributes[$attrdefid]) || $newattributes[$attrdefid]->getValueAsArray() !== $oldattributes[$attrdefid]->getValueAsArray()) { + $subject = "folder_attribute_changed_email_subject"; + $message = "folder_attribute_changed_email_body"; + $params = array(); + $params['name'] = $folder->getName(); + $params['attribute_name'] = $attribute->getAttributeDefinition()->getName(); + $params['attribute_old_value'] = $oldattributes[$attrdefid]->getValue(); + $params['attribute_new_value'] = isset($newattributes[$attrdefid]) ? $newattributes[$attrdefid]->getValue() : ''; + $params['folder_path'] = $folder->getFolderPathPlain(); + $params['username'] = $user->getFullName(); + $params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewFolder.php?folderid=".$folder->getID(); + $params['sitename'] = $this->settings->_siteName; + $params['http_root'] = $this->settings->_httpRoot; + + $this->toList($user, $notifyList["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + foreach ($notifyList["groups"] as $grp) { + $this->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + } + } + } + } + /* Check for new attributes which didn't have a value before */ + if($newattributes) { + foreach($newattributes as $attrdefid=>$attribute) { + if(!isset($oldattributes[$attrdefid]) && $attribute) { + $subject = "folder_attribute_changed_email_subject"; + $message = "folder_attribute_changed_email_body"; + $params = array(); + $params['name'] = $folder->getName(); + $params['attribute_name'] = $dms->getAttributeDefinition($attrdefid)->getName(); + $params['attribute_old_value'] = ''; + $params['attribute_new_value'] = $attribute->getValue(); + $params['folder_path'] = $folder->getFolderPathPlain(); + $params['username'] = $user->getFullName(); + $params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewFolder.php?folderid=".$folder->getID(); + $params['sitename'] = $this->settings->_siteName; + $params['http_root'] = $this->settings->_httpRoot; + + $this->toList($user, $notifyList["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + foreach ($notifyList["groups"] as $grp) { + $this->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + } + } + } + } + } /* }}} */ + public function sendChangedCommentMail($document, $user, $oldcomment) { /* {{{ */ if($oldcomment != $document->getComment()) { $notifyList = $document->getNotifyList(); @@ -542,6 +597,31 @@ class SeedDMS_NotificationService { } } /* }}} */ + public function sendChangedFolderCommentMail($folder, $user, $oldcomment) { /* {{{ */ + if($oldcomment != $folder->getComment()) { + $notifyList = $folder->getNotifyList(); + + $subject = "folder_comment_changed_email_subject"; + $message = "folder_comment_changed_email_body"; + $params = array(); + $params['name'] = $folder->getName(); + $params['folder_path'] = $folder->getFolderPathPlain(); + $params['old_comment'] = $oldcomment; + $params['new_comment'] = $comment; + $params['username'] = $user->getFullName(); + $params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewFolder.php?folderid=".$folder->getID(); + $params['sitename'] = $this->settings->_siteName; + $params['http_root'] = $this->settings->_httpRoot; + $this->toList($user, $notifyList["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + foreach ($notifyList["groups"] as $grp) { + $this->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + } + // if user is not owner send notification to owner + // if ($user->getID() != $folder->getOwner()->getID()) + // $notifier->toIndividual($user, $folder->getOwner(), $subject, $message, $params, SeedDMS_NotificationService::RECV_OWNER); + } + } /* }}} */ + public function sendChangedVersionCommentMail($content, $user, $oldcomment) { /* {{{ */ // FIXME: use extra mail template which includes the version if($oldcomment != $content->getComment()) { @@ -600,6 +680,30 @@ class SeedDMS_NotificationService { } } /* }}} */ + public function sendChangedFolderNameMail($folder, $user, $oldname) { /* {{{ */ + if($oldname != $folder->getName()) { + $notifyList = $folder->getNotifyList(); + + $subject = "folder_renamed_email_subject"; + $message = "folder_renamed_email_body"; + $params = array(); + $params['name'] = $folder->getName(); + $params['old_name'] = $oldname; + $params['folder_path'] = $folder->getFolderPathPlain(); + $params['username'] = $user->getFullName(); + $params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewFolder.php?folderid=".$folder->getID(); + $params['sitename'] = $this->settings->_siteName; + $params['http_root'] = $this->settings->_httpRoot; + $this->toList($user, $notifyList["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + foreach ($notifyList["groups"] as $grp) { + $this->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + } + // if user is not owner send notification to owner + // if ($user->getID() != $folder->getOwner()->getID()) + // $this->toIndividual($user, $folder->getOwner(), $subject, $message, $params, SeedDMS_NotificationService::RECV_OWNER); + } + } /* }}} */ + public function sendMovedDocumentMail($document, $user, $oldfolder) { /* {{{ */ $targetfolder = $document->getFolder(); if($targetfolder->getId() == $oldfolder->getId()) diff --git a/op/op.EditFolder.php b/op/op.EditFolder.php index 485069bb8..d834329b1 100644 --- a/op/op.EditFolder.php +++ b/op/op.EditFolder.php @@ -97,111 +97,13 @@ if(!$controller->run()) { UI::exitError(getMLText("folder_title", array("foldername" => $folder->getName())), $errmsg); } -if($oldname != $name) { - // Send notification to subscribers. - if($notifier) { - $notifyList = $folder->getNotifyList(); +// Send notification to subscribers. +if($notifier) { + $notifier->sendChangedFolderNameMail($folder, $user, $oldname); - $subject = "folder_renamed_email_subject"; - $message = "folder_renamed_email_body"; - $params = array(); - $params['name'] = $folder->getName(); - $params['old_name'] = $oldname; - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['username'] = $user->getFullName(); - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewFolder.php?folderid=".$folder->getID(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - $notifier->toList($user, $notifyList["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - foreach ($notifyList["groups"] as $grp) { - $notifier->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - } - // if user is not owner send notification to owner -// if ($user->getID() != $folder->getOwner()->getID()) -// $notifier->toIndividual($user, $folder->getOwner(), $subject, $message, $params, SeedDMS_NotificationService::RECV_OWNER); - } -} + $notifier->sendChangedFolderCommentMail($folder, $user, $oldcomment); -if($oldcomment != $comment) { - // Send notification to subscribers. - if($notifier) { - $notifyList = $folder->getNotifyList(); - - $subject = "folder_comment_changed_email_subject"; - $message = "folder_comment_changed_email_body"; - $params = array(); - $params['name'] = $folder->getName(); - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['old_comment'] = $oldcomment; - $params['new_comment'] = $comment; - $params['username'] = $user->getFullName(); - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewFolder.php?folderid=".$folder->getID(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - $notifier->toList($user, $notifyList["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - foreach ($notifyList["groups"] as $grp) { - $notifier->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - } - // if user is not owner send notification to owner -// if ($user->getID() != $folder->getOwner()->getID()) -// $notifier->toIndividual($user, $folder->getOwner(), $subject, $message, $params, SeedDMS_NotificationService::RECV_OWNER); - - } -} - -$newattributes = $folder->getAttributes(); -if($oldattributes) { - foreach($oldattributes as $attrdefid=>$attribute) { - if(!isset($newattributes[$attrdefid]) || $newattributes[$attrdefid]->getValueAsArray() !== $oldattributes[$attrdefid]->getValueAsArray()) { - if($notifier) { - $notifyList = $folder->getNotifyList(); - $subject = "folder_attribute_changed_email_subject"; - $message = "folder_attribute_changed_email_body"; - $params = array(); - $params['name'] = $folder->getName(); - $params['attribute_name'] = $attribute->getAttributeDefinition()->getName(); - $params['attribute_old_value'] = $oldattributes[$attrdefid]->getValue(); - $params['attribute_new_value'] = isset($newattributes[$attrdefid]) ? $newattributes[$attrdefid]->getValue() : ''; - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['username'] = $user->getFullName(); - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewFolder.php?folderid=".$folder->getID(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - - $notifier->toList($user, $notifyList["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - foreach ($notifyList["groups"] as $grp) { - $notifier->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - } - } - } - } -} -/* Check for new attributes which didn't have a value before */ -if($newattributes) { - foreach($newattributes as $attrdefid=>$attribute) { - if(!isset($oldattributes[$attrdefid]) && $attribute) { - if($notifier) { - $notifyList = $folder->getNotifyList(); - $subject = "folder_attribute_changed_email_subject"; - $message = "folder_attribute_changed_email_body"; - $params = array(); - $params['name'] = $folder->getName(); - $params['attribute_name'] = $dms->getAttributeDefinition($attrdefid)->getName(); - $params['attribute_old_value'] = ''; - $params['attribute_new_value'] = $attribute->getValue(); - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['username'] = $user->getFullName(); - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewFolder.php?folderid=".$folder->getID(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - - $notifier->toList($user, $notifyList["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - foreach ($notifyList["groups"] as $grp) { - $notifier->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - } - } - } - } + $notifier->sendChangedFolderAttributesMail($folder, $user, $oldattributes); } $session->setSplashMsg(array('type'=>'success', 'msg'=>getMLText('splash_folder_edited'))); From 4d84aa2ce29f53e2372f356a30ff9e5259cb804c Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Wed, 19 May 2021 16:11:18 +0200 Subject: [PATCH 213/403] remove old commented code --- op/op.AddSubFolder.php | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/op/op.AddSubFolder.php b/op/op.AddSubFolder.php index efac68b40..5c8efb226 100644 --- a/op/op.AddSubFolder.php +++ b/op/op.AddSubFolder.php @@ -122,30 +122,6 @@ if(!$subFolder = $controller->run()) { // Send notification to subscribers. if($notifier) { $notifier->sendNewFolderMail($subFolder, $user); - /* - $fnl = $folder->getNotifyList(); - $snl = $subFolder->getNotifyList(); - $nl = array( - 'users'=>array_unique(array_merge($snl['users'], $fnl['users']), SORT_REGULAR), - 'groups'=>array_unique(array_merge($snl['groups'], $fnl['groups']), SORT_REGULAR) - ); - - $subject = "new_subfolder_email_subject"; - $message = "new_subfolder_email_body"; - $params = array(); - $params['name'] = $subFolder->getName(); - $params['folder_name'] = $folder->getName(); - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['username'] = $user->getFullName(); - $params['comment'] = $comment; - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewFolder.php?folderid=".$subFolder->getID(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - $notifier->toList($user, $nl["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - foreach ($nl["groups"] as $grp) { - $notifier->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - } - */ } } From acf85728c386714a3203d173ec0170d6b2e1caf7 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Wed, 19 May 2021 16:18:03 +0200 Subject: [PATCH 214/403] move sending notification mail into Notification Service --- inc/inc.ClassNotificationService.php | 21 +++++++++++++++++++++ op/op.RemoveDocumentFile.php | 15 +-------------- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/inc/inc.ClassNotificationService.php b/inc/inc.ClassNotificationService.php index f86fdc415..0293d8643 100644 --- a/inc/inc.ClassNotificationService.php +++ b/inc/inc.ClassNotificationService.php @@ -432,6 +432,27 @@ class SeedDMS_NotificationService { } } /* }}} */ + /** + * This notification is sent when a new attachment is created. + */ + public function sendDeleteFileMail($file, $user) { /* {{{ */ + $document = $file->getDocument(); + $notifyList = $document->getNotifyList(); + + $subject = "removed_file_email_subject"; + $message = "removed_file_email_body"; + $params = array(); + $params['document'] = $document->getName(); + $params['username'] = $user->getFullName(); + $params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); + $params['sitename'] = $this->settings->_siteName; + $params['http_root'] = $this->settings->_httpRoot; + $this->toList($user, $notifyList["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + foreach ($notifyList["groups"] as $grp) { + $this->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + } + } /* }}} */ + public function sendChangedExpiryMail($document, $user, $oldexpires) { /* {{{ */ $folder = $document->getFolder(); $notifyList = $document->getNotifyList(); diff --git a/op/op.RemoveDocumentFile.php b/op/op.RemoveDocumentFile.php index dbda46a6d..f01114f94 100644 --- a/op/op.RemoveDocumentFile.php +++ b/op/op.RemoveDocumentFile.php @@ -68,20 +68,7 @@ if (!$document->removeDocumentFile($fileid)) { } else { // Send notification to subscribers. if($notifier) { - $notifyList = $document->getNotifyList(); - - $subject = "removed_file_email_subject"; - $message = "removed_file_email_body"; - $params = array(); - $params['document'] = $document->getName(); - $params['username'] = $user->getFullName(); - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - $notifier->toList($user, $notifyList["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - foreach ($notifyList["groups"] as $grp) { - $notifier->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - } + $notifier->sendDeleteFileMail($file, $user); } } From 1d4bd6d1f09bed9d9ef72d4f9706e6ebfb4b49eb Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Wed, 19 May 2021 17:01:18 +0200 Subject: [PATCH 215/403] place submit outside of content area --- views/bootstrap/class.AddFile.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/views/bootstrap/class.AddFile.php b/views/bootstrap/class.AddFile.php index 7e7f51e2d..f01617664 100644 --- a/views/bootstrap/class.AddFile.php +++ b/views/bootstrap/class.AddFile.php @@ -147,12 +147,12 @@ $(document).ready( function() { $msg = getMLText("max_upload_size").": ".SeedDMS_Core_File::format_filesize($mus2); $this->warningMsg($msg); - $this->contentContainerStart(); ?>
        contentContainerStart(); $this->formField( getMLText("local_file"), ($enablelargefileupload ? $this->getFineUploaderHtml() : $this->getFileChooserHtml('userfile[]', false)) @@ -205,11 +205,11 @@ $(document).ready( function() { ) ); } + $this->contentContainerEnd(); $this->formSubmit(getMLText('add')); ?>
        contentContainerEnd(); $this->contentEnd(); $this->htmlEndPage(); From 24be00ccd1abedbcf9198f7e03aa2fc07a45d12f Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Wed, 19 May 2021 20:40:45 +0200 Subject: [PATCH 216/403] add methods getApproveLog() and getReviewLog() --- SeedDMS_Core/Core/inc.ClassDocument.php | 42 +++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/SeedDMS_Core/Core/inc.ClassDocument.php b/SeedDMS_Core/Core/inc.ClassDocument.php index 73b5604ec..c0850dabe 100644 --- a/SeedDMS_Core/Core/inc.ClassDocument.php +++ b/SeedDMS_Core/Core/inc.ClassDocument.php @@ -3468,6 +3468,27 @@ class SeedDMS_Core_DocumentContent extends SeedDMS_Core_Object { /* {{{ */ return $this->_reviewStatus; } /* }}} */ + /** + * Get the latest entries from the review log of the document content + * + * @param integer $limit the number of log entries returned, defaults to 1 + * @return array list of review log entries + */ + function getReviewLog($limit=1) { /* {{{ */ + $db = $this->_document->getDMS()->getDB(); + + if (!is_numeric($limit)) return false; + + $queryStr= + "SELECT * FROM `tblDocumentReviewLog` LEFT JOIN `tblDocumentReviewers` ON `tblDocumentReviewLog`.`reviewID` = `tblDocumentReviewers`.`reviewID` WHERE `version`='".$this->_version + ."' AND `documentID` = '". $this->_document->getID() ."' " + ."ORDER BY `tblDocumentReviewLog`.`reviewLogID` DESC LIMIT ".(int) $limit; + $recs = $db->getResultArray($queryStr); + if (is_bool($recs) && !$recs) + return false; + return($recs); + } /* }}} */ + /** * Rewrites the complete review log * @@ -3625,6 +3646,27 @@ class SeedDMS_Core_DocumentContent extends SeedDMS_Core_Object { /* {{{ */ return $this->_approvalStatus; } /* }}} */ + /** + * Get the latest entries from the approval log of the document content + * + * @param integer $limit the number of log entries returned, defaults to 1 + * @return array list of approval log entries + */ + function getApproveLog($limit=1) { /* {{{ */ + $db = $this->_document->getDMS()->getDB(); + + if (!is_numeric($limit)) return false; + + $queryStr= + "SELECT * FROM `tblDocumentApproveLog` LEFT JOIN `tblDocumentApprovers` ON `tblDocumentApproveLog`.`approveID` = `tblDocumentApprovers`.`approveID` WHERE `version`='".$this->_version + ."' AND `documentID` = '". $this->_document->getID() ."' " + ."ORDER BY `tblDocumentApproveLog`.`approveLogID` DESC LIMIT ".(int) $limit; + $recs = $db->getResultArray($queryStr); + if (is_bool($recs) && !$recs) + return false; + return($recs); + } /* }}} */ + /** * Rewrites the complete approval log * From 5028f37accda01172a8bd2cca8225146798f174e Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Wed, 19 May 2021 20:41:50 +0200 Subject: [PATCH 217/403] move notification emails into notification service --- inc/inc.ClassNotificationService.php | 51 +++++++++++++++- op/op.ApproveDocument.php | 87 +++------------------------- op/op.OverrideContentStatus.php | 2 +- op/op.ReviewDocument.php | 41 ++----------- 4 files changed, 61 insertions(+), 120 deletions(-) diff --git a/inc/inc.ClassNotificationService.php b/inc/inc.ClassNotificationService.php index 0293d8643..b586381d1 100644 --- a/inc/inc.ClassNotificationService.php +++ b/inc/inc.ClassNotificationService.php @@ -811,8 +811,8 @@ class SeedDMS_NotificationService { } } /* }}} */ - public function sendChangedDocumentStatusMail($document, $user, $oldstatus) { /* {{{ */ - $content = $document->getLatestContent(); + public function sendChangedDocumentStatusMail($content, $user, $oldstatus) { /* {{{ */ + $document = $content->getDocument(); $overallStatus = $content->getStatus(); $nl = $document->getNotifyList(); $folder = $document->getFolder(); @@ -907,5 +907,52 @@ class SeedDMS_NotificationService { $notifier->toGroup($user, $obj, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); } /* }}} */ + public function sendSubmittedReviewMail($content, $user, $reviewlog) { /* {{{ */ + $document = $content->getDocument(); + $nl=$document->getNotifyList(); + $folder = $document->getFolder(); + $subject = "review_submit_email_subject"; + $message = "review_submit_email_body"; + $params = array(); + $params['name'] = $document->getName(); + $params['version'] = $content->getVersion(); + $params['folder_path'] = $folder->getFolderPathPlain(); + $params['status'] = getReviewStatusText($reviewlog["status"]); + $params['comment'] = $reviewlog['comment']; + $params['username'] = $user->getFullName(); + $params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); + $params['sitename'] = $this->settings->_siteName; + $params['http_root'] = $this->settings->_httpRoot; + $this->toList($user, $nl["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + foreach ($nl["groups"] as $grp) { + $this->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + } +// $notifier->toIndividual($user, $content->getUser(), $subject, $message, $params, SeedDMS_NotificationService::RECV_OWNER); + } /* }}} */ + + public function sendSubmittedApprovalMail($content, $user, $approvelog) { /* {{{ */ + $document = $content->getDocument(); + $nl=$document->getNotifyList(); + $folder = $document->getFolder(); + $subject = "approval_submit_email_subject"; + $message = "approval_submit_email_body"; + $params = array(); + $params['name'] = $document->getName(); + $params['version'] = $content->getVersion(); + $params['folder_path'] = $folder->getFolderPathPlain(); + $params['status'] = getApprovalStatusText($approvelog["status"]); + $params['comment'] = $approvelog['comment']; + $params['username'] = $user->getFullName(); + $params['sitename'] = $this->settings->_siteName; + $params['http_root'] = $this->settings->_httpRoot; + $params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID()."¤ttab=revapp"; + + $this->toList($user, $nl["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + foreach ($nl["groups"] as $grp) + $notifier->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); +// $this->toIndividual($user, $content->getUser(), $subject, $message, $params, SeedDMS_NotificationService::RECV_OWNER); + + } /* }}} */ + } diff --git a/op/op.ApproveDocument.php b/op/op.ApproveDocument.php index 0eb9f08f4..2314b64e4 100644 --- a/op/op.ApproveDocument.php +++ b/op/op.ApproveDocument.php @@ -100,29 +100,10 @@ if ($_POST["approvalType"] == "ind") { UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("approval_update_failed")); } else { - // Send an email notification to the document updater. if($notifier) { - $subject = "approval_submit_email_subject"; - $message = "approval_submit_email_body"; - $params = array(); - $params['name'] = $document->getName(); - $params['version'] = $version; - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['status'] = getApprovalStatusText($_POST["approvalStatus"]); - $params['comment'] = $comment; - $params['username'] = $user->getFullName(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID()."¤ttab=revapp"; - - $notifier->toIndividual($user, $content->getUser(), $subject, $message, $params, SeedDMS_NotificationService::RECV_OWNER); - // Send notification to subscribers. - $nl=$document->getNotifyList(); - $notifier->toList($user, $nl["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - foreach ($nl["groups"] as $grp) { - $notifier->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - } + $approvelog = $latestContent->getApproveLog(); + $notifier->sendSubmittedApprovalMail($latestContent, $user, $approvelog ? $approvelog[0] : false); } } } @@ -138,29 +119,10 @@ else if ($_POST["approvalType"] == "grp") { UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("approval_update_failed")); } else { - // Send an email notification to the document updater. if($notifier) { - $subject = "approval_submit_email_subject"; - $message = "approval_submit_email_body"; - $params = array(); - $params['name'] = $document->getName(); - $params['version'] = $version; - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['status'] = getApprovalStatusText($_POST["approvalStatus"]); - $params['comment'] = $comment; - $params['username'] = $user->getFullName(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID()."¤ttab=revapp"; - - $notifier->toIndividual($user, $content->getUser(), $subject, $message, $params, SeedDMS_NotificationService::RECV_OWNER); - // Send notification to subscribers. - $nl=$document->getNotifyList(); - $notifier->toList($user, $nl["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - foreach ($nl["groups"] as $grp) { - $notifier->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - } + $approvelog = $latestContent->getApproveLog(); + $notifier->sendSubmittedApprovalMail($latestContent, $user, $approvelog ? $approvelog[0] : false); } } } @@ -170,29 +132,12 @@ else if ($_POST["approvalType"] == "grp") { // updated. // +$overallStatus = $content->getStatus(); if ($_POST["approvalStatus"]==-1){ if($content->setStatus(S_REJECTED,$comment,$user)) { // Send notification to subscribers. if($notifier) { - $nl=$document->getNotifyList(); - $folder = $document->getFolder(); - $subject = "document_status_changed_email_subject"; - $message = "document_status_changed_email_body"; - $params = array(); - $params['name'] = $document->getName(); - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['status'] = getOverallStatusText(S_REJECTED); - $params['new_status_code'] = S_REJECTED; - $params['comment'] = $document->getComment(); - $params['username'] = $user->getFullName(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); - - $notifier->toList($user, $nl["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - foreach ($nl["groups"] as $grp) { - $notifier->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - } + $notifier->sendChangedDocumentStatusMail($content, $user, $overallStatus["status"]); } if(isset($GLOBALS['SEEDDMS_HOOKS']['approveDocument'])) { @@ -227,25 +172,7 @@ if ($_POST["approvalStatus"]==-1){ if($content->setStatus($newStatus, getMLText("automatic_status_update"), $user)) { // Send notification to subscribers. if($notifier) { - $nl=$document->getNotifyList(); - $folder = $document->getFolder(); - $subject = "document_status_changed_email_subject"; - $message = "document_status_changed_email_body"; - $params = array(); - $params['name'] = $document->getName(); - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['status'] = getOverallStatusText($newStatus); - $params['new_status_code'] = $newStatus; - $params['comment'] = $document->getComment(); - $params['username'] = $user->getFullName(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); - - $notifier->toList($user, $nl["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - foreach ($nl["groups"] as $grp) { - $notifier->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - } + $notifier->sendChangedDocumentStatusMail($content, $user, $overallStatus["status"]); } if(isset($GLOBALS['SEEDDMS_HOOKS']['approveDocument'])) { diff --git a/op/op.OverrideContentStatus.php b/op/op.OverrideContentStatus.php index a92d9470c..e313844ed 100644 --- a/op/op.OverrideContentStatus.php +++ b/op/op.OverrideContentStatus.php @@ -80,7 +80,7 @@ if ($overrideStatus != $overallStatus["status"]) { } else { // Send notification to subscribers. if($notifier) { - $notifier->sendChangedDocumentStatusMail($document, $user, $overallStatus["status"]); + $notifier->sendChangedDocumentStatusMail($content, $user, $overallStatus["status"]); } } } diff --git a/op/op.ReviewDocument.php b/op/op.ReviewDocument.php index dcd734ff4..1547f1541 100644 --- a/op/op.ReviewDocument.php +++ b/op/op.ReviewDocument.php @@ -100,25 +100,8 @@ if ($_POST["reviewType"] == "ind") { else { // Send an email notification to the document updater. if($notifier) { - $nl=$document->getNotifyList(); - $folder = $document->getFolder(); - $subject = "review_submit_email_subject"; - $message = "review_submit_email_body"; - $params = array(); - $params['name'] = $document->getName(); - $params['version'] = $version; - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['status'] = getReviewStatusText($_POST["reviewStatus"]); - $params['comment'] = $comment; - $params['username'] = $user->getFullName(); - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID()."¤ttab=revapp"; - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - $notifier->toList($user, $nl["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - foreach ($nl["groups"] as $grp) { - $notifier->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - } -// $notifier->toIndividual($user, $content->getUser(), $subject, $message, $params, SeedDMS_NotificationService::RECV_OWNER); + $reviewlog = $latestContent->getReviewLog(); + $notifier->sendSubmittedReviewMail($latestContent, $user, $reviewlog ? $reviewlog[0] : false); } } } @@ -136,24 +119,8 @@ else if ($_POST["reviewType"] == "grp") { else { // Send an email notification to the document updater. if($notifier) { - $nl=$document->getNotifyList(); - $folder = $document->getFolder(); - $subject = "review_submit_email_subject"; - $message = "review_submit_email_body"; - $params = array(); - $params['name'] = $document->getName(); - $params['version'] = $version; - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['status'] = getReviewStatusText($_POST["reviewStatus"]); - $params['comment'] = $comment; - $params['username'] = $user->getFullName(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - $notifier->toList($user, $nl["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - foreach ($nl["groups"] as $grp) { - $notifier->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - } -// $notifier->toIndividual($user, $content->getUser(), $subject, $message, $params, SeedDMS_NotificationService::RECV_OWNER); + $reviewlog = $latestContent->getReviewLog(); + $notifier->sendSubmittedReviewMail($latestContent, $user, $reviewlog ? $reviewlog[0] : false); } } } From 8de5b0ab150a6848b24471d7f24ba4c0f9bd2ac4 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Wed, 19 May 2021 20:44:37 +0200 Subject: [PATCH 218/403] add notes for 5.1.23 --- SeedDMS_Core/package.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/SeedDMS_Core/package.xml b/SeedDMS_Core/package.xml index f09a4a087..8be3616fd 100644 --- a/SeedDMS_Core/package.xml +++ b/SeedDMS_Core/package.xml @@ -26,6 +26,7 @@ - SeedDMS_Core_DMS::getTimeline() uses status log instead of document content - add methods SeedDMS_Core_DocumentContent::getReviewers() and SeedDMS_Core_DocumentContent::getApprovers() +- add methods SeedDMS_Core_DocumentContent::getApproveLog() and SeedDMS_Core_DocumentContent::getReviewLog() From aa8f6250b3fc61e5b3519b9e7f67697827d51b4d Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Wed, 19 May 2021 21:19:32 +0200 Subject: [PATCH 219/403] move sending notification emails into notification service --- inc/inc.ClassNotificationService.php | 85 +++++++++++++++++++++ op/op.DocumentAccess.php | 93 ++++------------------- op/op.FolderAccess.php | 109 +++------------------------ 3 files changed, 111 insertions(+), 176 deletions(-) diff --git a/inc/inc.ClassNotificationService.php b/inc/inc.ClassNotificationService.php index b586381d1..ff4d29444 100644 --- a/inc/inc.ClassNotificationService.php +++ b/inc/inc.ClassNotificationService.php @@ -954,5 +954,90 @@ class SeedDMS_NotificationService { } /* }}} */ + public function sendChangedDocumentOwnerMail($document, $user, $oldowner) { /* {{{ */ + if($oldowner->getID() != $document->getOwner()->getID()) { + $notifyList = $document->getNotifyList(); + $folder = $document->getFolder(); + $subject = "ownership_changed_email_subject"; + $message = "ownership_changed_email_body"; + $params = array(); + $params['name'] = $document->getName(); + $params['folder_path'] = $folder->getFolderPathPlain(); + $params['username'] = $user->getFullName(); + $params['old_owner'] = $oldowner->getFullName(); + $params['new_owner'] = $document->getOwner()->getFullName(); + $params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); + $params['sitename'] = $this->settings->_siteName; + $params['http_root'] = $this->settings->_httpRoot; + $this->toList($user, $notifyList["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + foreach ($notifyList["groups"] as $grp) { + $this->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + } +// $notifier->toIndividual($user, $oldowner, $subject, $message, $params, SeedDMS_NotificationService::RECV_OWNER); + } + } /* }}} */ + + public function sendChangedFolderOwnerMail($folder, $user, $oldowner) { /* {{{ */ + if($oldowner->getID() != $folder->getOwner()->getID()) { + $notifyList = $folder->getNotifyList(); + $subject = "ownership_changed_email_subject"; + $message = "ownership_changed_email_body"; + $params = array(); + $params['name'] = $folder->getName(); + if($folder->getParent()) + $params['folder_path'] = $folder->getParent()->getFolderPathPlain(); + else + $params['folder_path'] = $folder->getFolderPathPlain(); + $params['username'] = $user->getFullName(); + $params['old_owner'] = $oldowner->getFullName(); + $params['new_owner'] = $folder->getOwner()->getFullName(); + $params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewFolder.php?folderid=".$folder->getID(); + $params['sitename'] = $this->settings->_siteName; + $params['http_root'] = $this->settings->_httpRoot; + $this->toList($user, $notifyList["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + foreach ($notifyList["groups"] as $grp) { + $this->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + } + } + } /* }}} */ + + public function sendChangedDocumentAccessMail($document, $user) { /* {{{ */ + $notifyList = $document->getNotifyList(); + $folder = $document->getFolder(); + $subject = "access_permission_changed_email_subject"; + $message = "access_permission_changed_email_body"; + $params = array(); + $params['name'] = $document->getName(); + $params['folder_path'] = $folder->getFolderPathPlain(); + $params['username'] = $user->getFullName(); + $params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); + $params['sitename'] = $this->settings->_siteName; + $params['http_root'] = $this->settings->_httpRoot; + $this->toList($user, $notifyList["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + foreach ($notifyList["groups"] as $grp) { + $this->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + } + } /* }}} */ + + public function sendChangedFolderAccessMail($folder, $user) { /* {{{ */ + $notifyList = $folder->getNotifyList(); + $subject = "access_permission_changed_email_subject"; + $message = "access_permission_changed_email_body"; + $params = array(); + $params['name'] = $folder->getName(); + if($folder->getParent()) + $params['folder_path'] = $folder->getParent()->getFolderPathPlain(); + else + $params['folder_path'] = $folder->getFolderPathPlain(); + $params['username'] = $user->getFullName(); + $params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewFolder.php?folderid=".$folder->getID(); + $params['sitename'] = $this->settings->_siteName; + $params['http_root'] = $this->settings->_httpRoot; + $this->toList($user, $notifyList["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + foreach ($notifyList["groups"] as $grp) { + $this->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + } + } /* }}} */ + } diff --git a/op/op.DocumentAccess.php b/op/op.DocumentAccess.php index af69f0aa0..e256435af 100644 --- a/op/op.DocumentAccess.php +++ b/op/op.DocumentAccess.php @@ -121,7 +121,7 @@ if($action == 'setowner') { if (!$user->isAdmin()) { UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("access_denied")); } - if (empty($_GET["ownerid"])) { + if (!isset($_GET["ownerid"]) || !is_numeric($_GET["ownerid"]) || $_GET["ownerid"]<1) { UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("unknown_group")); } if (!($newowner = $dms->getUser($_GET["ownerid"]))) { @@ -130,7 +130,6 @@ if($action == 'setowner') { $oldowner = $document->getOwner(); } - $controller->setParam('document', $document); $controller->setParam('folder', $folder); $controller->setParam('settings', $settings); @@ -145,27 +144,10 @@ if(!$controller->run()) { // Change owner ----------------------------------------------------------- if ($action == "setowner") { + if($notifier) { + $notifier->sendChangedDocumentOwnerMail($document, $user, $oldowner); + } if($oldowner->getID() != $newowner->getID()) { - if($notifier) { - $notifyList = $document->getNotifyList(); - $folder = $document->getFolder(); - $subject = "ownership_changed_email_subject"; - $message = "ownership_changed_email_body"; - $params = array(); - $params['name'] = $document->getName(); - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['username'] = $user->getFullName(); - $params['old_owner'] = $oldowner->getFullName(); - $params['new_owner'] = $newowner->getFullName(); - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - $notifier->toList($user, $notifyList["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - foreach ($notifyList["groups"] as $grp) { - $notifier->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - } -// $notifier->toIndividual($user, $oldowner, $subject, $message, $params, SeedDMS_NotificationService::RECV_OWNER); - } $session->setSplashMsg(array('type'=>'success', 'msg'=>getMLText('splash_setowner'))); } } @@ -173,69 +155,26 @@ if ($action == "setowner") { // Change to not inherit --------------------------------------------------- else if ($action == "notinherit") { - if($notifier) { - $notifyList = $document->getNotifyList(); - $folder = $document->getFolder(); - $subject = "access_permission_changed_email_subject"; - $message = "access_permission_changed_email_body"; - $params = array(); - $params['name'] = $document->getName(); - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['username'] = $user->getFullName(); - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - $notifier->toList($user, $notifyList["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - foreach ($notifyList["groups"] as $grp) { - $notifier->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - } - - } - $session->setSplashMsg(array('type'=>'success', 'msg'=>getMLText('splash_notinherit_access'))); + if($notifier) { + $notifier->sendChangedDocumentAccessMail($document, $user); + } + $session->setSplashMsg(array('type'=>'success', 'msg'=>getMLText('splash_notinherit_access'))); } // Change to inherit----------------------------------------------------- else if ($action == "inherit") { - if($notifier) { - $notifyList = $document->getNotifyList(); - $folder = $document->getFolder(); - $subject = "access_permission_changed_email_subject"; - $message = "access_permission_changed_email_body"; - $params = array(); - $params['name'] = $document->getName(); - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['username'] = $user->getFullName(); - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - $notifier->toList($user, $notifyList["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - foreach ($notifyList["groups"] as $grp) { - $notifier->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - } - } - $session->setSplashMsg(array('type'=>'success', 'msg'=>getMLText('splash_inherit_access'))); + if($notifier) { + $notifier->sendChangedDocumentAccessMail($document, $user); + } + $session->setSplashMsg(array('type'=>'success', 'msg'=>getMLText('splash_inherit_access'))); } // Set default permissions ---------------------------------------------- else if ($action == "setdefault") { - if($notifier) { - $notifyList = $document->getNotifyList(); - $folder = $document->getFolder(); - $subject = "access_permission_changed_email_subject"; - $message = "access_permission_changed_email_body"; - $params = array(); - $params['name'] = $document->getName(); - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['username'] = $user->getFullName(); - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - $notifier->toList($user, $notifyList["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - foreach ($notifyList["groups"] as $grp) { - $notifier->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - } - } - $session->setSplashMsg(array('type'=>'success', 'msg'=>getMLText('splash_set_default_access'))); + if($notifier) { + $notifier->sendChangedDocumentAccessMail($document, $user); + } + $session->setSplashMsg(array('type'=>'success', 'msg'=>getMLText('splash_set_default_access'))); } elseif($action == "delaccess") { $session->setSplashMsg(array('type'=>'success', 'msg'=>getMLText('splash_delete_access'))); } elseif($action == "addaccess") { diff --git a/op/op.FolderAccess.php b/op/op.FolderAccess.php index 00bb30468..004abd871 100644 --- a/op/op.FolderAccess.php +++ b/op/op.FolderAccess.php @@ -110,40 +110,20 @@ if (isset($_GET["groupid"])) { // Change owner ----------------------------------------------------------- if ($action == "setowner") { - if (!$user->isAdmin()) { UI::exitError(getMLText("folder_title", array("foldername" => $folder->getName())),getMLText("access_denied")); } if (!isset($_GET["ownerid"]) || !is_numeric($_GET["ownerid"]) || $_GET["ownerid"]<1) { UI::exitError(getMLText("folder_title", array("foldername" => $folder->getName())),getMLText("unknown_user")); } - $newOwner = $dms->getUser($_GET["ownerid"]); - if (!is_object($newOwner)) { + if (!($newowner = $dms->getUser($_GET["ownerid"]))) { UI::exitError(getMLText("folder_title", array("foldername" => $folder->getName())),getMLText("unknown_user")); } $oldOwner = $folder->getOwner(); - if($folder->setOwner($newOwner)) { + if($folder->setOwner($newowner)) { if($notifier) { // Send notification to subscribers. - $notifyList = $folder->getNotifyList(); - $subject = "ownership_changed_email_subject"; - $message = "ownership_changed_email_body"; - $params = array(); - $params['name'] = $folder->getName(); - if($folder->getParent()) - $params['folder_path'] = $folder->getParent()->getFolderPathPlain(); - else - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['username'] = $user->getFullName(); - $params['old_owner'] = $oldOwner->getFullName(); - $params['new_owner'] = $newOwner->getFullName(); - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewFolder.php?folderid=".$folder->getID(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - $notifier->toList($user, $notifyList["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - foreach ($notifyList["groups"] as $grp) { - $notifier->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - } + $notifier->sendChangedFolderOwnerMail($folder, $user, $oldOwner); } $session->setSplashMsg(array('type'=>'success', 'msg'=>getMLText('splash_setowner'))); } else { @@ -156,49 +136,12 @@ else if ($action == "notinherit") { $defAccess = $folder->getDefaultAccess(); if($folder->setInheritAccess(false)) { - if($notifier) { - // Send notification to subscribers. - $notifyList = $folder->getNotifyList(); - $subject = "access_permission_changed_email_subject"; - $message = "access_permission_changed_email_body"; - $params = array(); - $params['name'] = $folder->getName(); - if($folder->getParent()) - $params['folder_path'] = $folder->getParent()->getFolderPathPlain(); - else - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['username'] = $user->getFullName(); - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewFolder.php?folderid=".$folder->getID(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - $notifier->toList($user, $notifyList["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - foreach ($notifyList["groups"] as $grp) { - $notifier->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + if($folder->setDefaultAccess($defAccess)) { + if($notifier) { + // Send notification to subscribers. + $notifier->sendChangedFolderAccessMail($folder, $user); } - $session->setSplashMsg(array('type'=>'success', 'msg'=>getMLText('splash_notinherit_access'))); - } - } - if($folder->setDefaultAccess($defAccess)) { - if($notifier) { - // Send notification to subscribers. - $notifyList = $folder->getNotifyList(); - $subject = "access_permission_changed_email_subject"; - $message = "access_permission_changed_email_body"; - $params = array(); - $params['name'] = $folder->getName(); - if($folder->getParent()) - $params['folder_path'] = $folder->getParent()->getFolderPathPlain(); - else - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['username'] = $user->getFullName(); - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewFolder.php?folderid=".$folder->getID(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - $notifier->toList($user, $notifyList["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - foreach ($notifyList["groups"] as $grp) { - $notifier->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - } - + $session->setSplashMsg(array('type'=>'success', 'msg'=>getMLText('splash_notinherit_access'))); } } if ($mode == "copy") { @@ -220,23 +163,7 @@ else if ($action == "inherit") { if($folder->setInheritAccess(true)) { if($notifier) { // Send notification to subscribers. - $notifyList = $folder->getNotifyList(); - $subject = "access_permission_changed_email_subject"; - $message = "access_permission_changed_email_body"; - $params = array(); - $params['name'] = $folder->getName(); - if($folder->getParent()) - $params['folder_path'] = $folder->getParent()->getFolderPathPlain(); - else - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['username'] = $user->getFullName(); - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewFolder.php?folderid=".$folder->getID(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - $notifier->toList($user, $notifyList["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - foreach ($notifyList["groups"] as $grp) { - $notifier->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - } + $notifier->sendChangedFolderAccessMail($folder, $user); } $session->setSplashMsg(array('type'=>'success', 'msg'=>getMLText('splash_inherit_access'))); } @@ -247,23 +174,7 @@ else if ($action == "setdefault") { if($folder->setDefaultAccess($mode)) { if($notifier) { // Send notification to subscribers. - $notifyList = $folder->getNotifyList(); - $subject = "access_permission_changed_email_subject"; - $message = "access_permission_changed_email_body"; - $params = array(); - $params['name'] = $folder->getName(); - if($folder->getParent()) - $params['folder_path'] = $folder->getParent()->getFolderPathPlain(); - else - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['username'] = $user->getFullName(); - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewFolder.php?folderid=".$folder->getID(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - $notifier->toList($user, $notifyList["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - foreach ($notifyList["groups"] as $grp) { - $notifier->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - } + $notifier->sendChangedFolderAccessMail($folder, $user); } $session->setSplashMsg(array('type'=>'success', 'msg'=>getMLText('splash_set_default_access'))); } From 9ed96e2a2af420cfb0852819b093a63389b0b1bb Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 21 May 2021 08:51:08 +0200 Subject: [PATCH 220/403] init $statusstartdate and $statusenddate in search() --- SeedDMS_Core/Core/inc.ClassDMS.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/SeedDMS_Core/Core/inc.ClassDMS.php b/SeedDMS_Core/Core/inc.ClassDMS.php index 21e221d90..f5e67f18f 100644 --- a/SeedDMS_Core/Core/inc.ClassDMS.php +++ b/SeedDMS_Core/Core/inc.ClassDMS.php @@ -1459,6 +1459,8 @@ class SeedDMS_Core_DMS { */ function search($query, $limit=0, $offset=0, $logicalmode='AND', $searchin=array(), $startFolder=null, $owner=null, $status = array(), $creationstartdate=array(), $creationenddate=array(), $modificationstartdate=array(), $modificationenddate=array(), $categories=array(), $attributes=array(), $mode=0x3, $expirationstartdate=array(), $expirationenddate=array()) { /* {{{ */ $orderby = ''; + $statusstartdate = array(); + $statusenddate = array(); if(is_array($query)) { foreach(array('limit', 'offset', 'logicalmode', 'searchin', 'startFolder', 'owner', 'status', 'creationstartdate', 'creationenddate', 'modificationstartdate', 'modificationenddate', 'categories', 'attributes', 'mode', 'expirationstartdate', 'expirationenddate') as $paramname) ${$paramname} = isset($query[$paramname]) ? $query[$paramname] : ${$paramname}; From 477d1a69b86f5631ce67e8ae8183959fae3d105c Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 21 May 2021 08:51:47 +0200 Subject: [PATCH 221/403] issue splash message --- op/op.DocumentNotify.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/op/op.DocumentNotify.php b/op/op.DocumentNotify.php index 9e061c247..1ce87d163 100644 --- a/op/op.DocumentNotify.php +++ b/op/op.DocumentNotify.php @@ -100,6 +100,7 @@ if ($action == "delnotify"){ UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("internal_error")); break; case 0: + $session->setSplashMsg(array('type'=>'success', 'msg'=>getMLText('splash_rm_notify'))); // Email user / group, informing them of subscription change. if($notifier) { $notifier->sendDeleteFolderNotifyMail($folder, $user, $obj); @@ -111,6 +112,7 @@ if ($action == "delnotify"){ // add notification else if ($action == "addnotify") { + /* Both $userid and $groupid can be set */ if ($userid > 0) { $res = $document->addNotify($userid, true); switch ($res) { @@ -127,12 +129,11 @@ else if ($action == "addnotify") { UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("internal_error")); break; case 0: - // Email user / group, informing them of subscription. + $session->setSplashMsg(array('type'=>'success', 'msg'=>getMLText('splash_add_notify'))); if ($notifier){ $obj = $dms->getUser($userid); $notifier->sendNewDocumentNotifyMail($document, $user, $obj); } - break; } } @@ -152,6 +153,7 @@ else if ($action == "addnotify") { UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("internal_error")); break; case 0: + $session->setSplashMsg(array('type'=>'success', 'msg'=>getMLText('splash_add_notify'))); if ($notifier){ $obj = $dms->getGroup($groupid); $notifier->sendNewDocumentNotifyMail($document, $user, $obj); From eacd59c2ef533769bc37712d57a3d752a7c2354f Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 21 May 2021 08:53:43 +0200 Subject: [PATCH 222/403] issue splash messages --- op/op.FolderNotify.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/op/op.FolderNotify.php b/op/op.FolderNotify.php index 0390ab7b7..ffca554c2 100644 --- a/op/op.FolderNotify.php +++ b/op/op.FolderNotify.php @@ -95,6 +95,7 @@ if ($action == "delnotify") { UI::exitError(getMLText("folder_title", array("foldername" => $folder->getName())),getMLText("internal_error")); break; case 0: + $session->setSplashMsg(array('type'=>'success', 'msg'=>getMLText('splash_rm_notify'))); if($notifier) { $notifier->sendDeleteFolderNotifyMail($folder, $user, $obj); } @@ -121,6 +122,7 @@ else if ($action == "addnotify") { UI::exitError(getMLText("folder_title", array("foldername" => $folder->getName())),getMLText("internal_error")); break; case 0: + $session->setSplashMsg(array('type'=>'success', 'msg'=>getMLText('splash_add_notify'))); if($notifier) { $obj = $dms->getUser($userid); $notifier->sendNewFolderNotifyMail($folder, $user, $obj); @@ -145,6 +147,7 @@ else if ($action == "addnotify") { UI::exitError(getMLText("folder_title", array("foldername" => $folder->getName())),getMLText("internal_error")); break; case 0: + $session->setSplashMsg(array('type'=>'success', 'msg'=>getMLText('splash_add_notify'))); if($notifier) { $obj = $dms->getGroup($groupid); $notifier->sendNewFolderNotifyMail($folder, $user, $obj); From a9d912bce29a13d114cca551b4fb39ff6310d6ec Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 21 May 2021 08:54:07 +0200 Subject: [PATCH 223/403] better error checking, send notification mail via notification service --- op/op.ManageNotify.php | 64 +++++++++++++++++++++++++++++++++--------- 1 file changed, 50 insertions(+), 14 deletions(-) diff --git a/op/op.ManageNotify.php b/op/op.ManageNotify.php index 0dc92afdf..e6c493977 100644 --- a/op/op.ManageNotify.php +++ b/op/op.ManageNotify.php @@ -81,8 +81,55 @@ if ($_GET["type"]=="document"){ if ($document->getAccessMode($user) < M_READ) UI::exitError(getMLText("my_account"),getMLText("error_occured")); - if ($_GET["action"]=="add") $document->addNotify($userid, true); - else if ($_GET["action"]=="del") $document->removeNotify($userid, true); + if ($_GET["action"]=="add") { + $res = $document->addNotify($userid, true); + switch ($res) { + case -1: + UI::exitError(getMLText("my_account"), getMLText("unknown_user")); + break; + case -2: + UI::exitError(getMLText("my_account"), getMLText("access_denied")); + break; + case -3: + UI::exitError(getMLText("my_account"), getMLText("already_subscribed")); + break; + case -4: + UI::exitError(getMLText("my_account"), getMLText("internal_error")); + break; + case 0: + $session->setSplashMsg(array('type'=>'success', 'msg'=>getMLText('splash_add_notify'))); + // Email user / group, informing them of subscription. + if ($notifier){ + $obj = $dms->getUser($userid); + $notifier->sendNewDocumentNotifyMail($document, $user, $obj); + } + break; + } + } elseif ($_GET["action"]=="del") { + $res = $document->removeNotify($userid, true); + switch ($res) { + case -1: + UI::exitError(getMLText("my_account"), getMLText("unknown_user")); + break; + case -2: + UI::exitError(getMLText("my_account"), getMLText("access_denied")); + break; + case -3: + UI::exitError(getMLText("my_account"), getMLText("not_subscribed")); + break; + case -4: + UI::exitError(getMLText("my_account"), getMLText("internal_error")); + break; + case 0: + $session->setSplashMsg(array('type'=>'success', 'msg'=>getMLText('splash_rm_notify'))); + // Email user / group, informing them of subscription change. + if($notifier) { + $obj = $dms->getUser($userid); + $notifier->sendDeleteDocumentNotifyMail($document, $user, $obj); + } + break; + } + } } else if ($_GET["type"]=="folder") { @@ -113,18 +160,7 @@ if ($_GET["type"]=="document"){ if(0 == $folder->removeNotify($userid, true)) { if($notifier) { $obj = $dms->getUser($userid); - // Email user / group, informing them of subscription. - $subject = "notify_deleted_email_subject"; - $message = "notify_deleted_email_body"; - $params = array(); - $params['name'] = $folder->getName(); - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['username'] = $user->getFullName(); - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewFolder.php?folderid=".$folder->getID(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - - $notifier->toIndividual($user, $obj, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + $notifier->sendDeleteFolderNotifyMail($folder, $user, $obj); } } } From b12dbd8e02cc97b7bfcdf97f68e30e94b7233812 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 21 May 2021 09:14:55 +0200 Subject: [PATCH 224/403] move sending notification mail into Notification service --- inc/inc.ClassNotificationService.php | 27 +++++++++++++++++++++++++++ op/op.EditOnline.php | 20 +------------------- 2 files changed, 28 insertions(+), 19 deletions(-) diff --git a/inc/inc.ClassNotificationService.php b/inc/inc.ClassNotificationService.php index ff4d29444..b760cc593 100644 --- a/inc/inc.ClassNotificationService.php +++ b/inc/inc.ClassNotificationService.php @@ -432,6 +432,33 @@ class SeedDMS_NotificationService { } } /* }}} */ + /** + * This notification is sent when a document content is replaced. + */ + public function sendReplaceContentMail($content, $user) { /* {{{ */ + $document = $content->getDocument(); + $folder = $document->getFolder(); + $notifyList = $document->getNotifyList(); + + $subject = "replace_content_email_subject"; + $message = "replace_content_email_body"; + $params = array(); + $params['name'] = $document->getName(); + $params['folder_name'] = $folder->getName(); + $params['folder_path'] = $folder->getFolderPathPlain(); + $params['username'] = $user->getFullName(); + $params['comment'] = $document->getComment(); + $params['version'] = $content->getVersion(); + $params['version_comment'] = $content->getComment(); + $params['url'] = getBaseUrl().$this->settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); + $params['sitename'] = $this->settings->_siteName; + $params['http_root'] = $this->settings->_httpRoot; + $this->toList($user, $notifyList["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + foreach ($notifyList["groups"] as $grp) { + $this->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); + } + } /* }}} */ + /** * This notification is sent when a new attachment is created. */ diff --git a/op/op.EditOnline.php b/op/op.EditOnline.php index 2ad2327b4..152fd3c59 100644 --- a/op/op.EditOnline.php +++ b/op/op.EditOnline.php @@ -63,25 +63,7 @@ if($lc->getChecksum() == SeedDMS_Core_File::checksum($tmpfname)) { } else { if($document->replaceContent(0, $user, $tmpfname, $lc->getOriginalFileName(), $lc->getFileType(), $lc->getMimeType())) { if($notifier) { - $notifyList = $folder->getNotifyList(); - - $subject = "replace_content_email_subject"; - $message = "replace_content_email_body"; - $params = array(); - $params['name'] = $document->getName(); - $params['folder_name'] = $folder->getName(); - $params['folder_path'] = $folder->getFolderPathPlain(); - $params['username'] = $user->getFullName(); - $params['comment'] = $document->getComment(); - $params['version'] = $lc->getVersion(); - $params['version_comment'] = $lc->getComment(); - $params['url'] = getBaseUrl().$settings->_httpRoot."out/out.ViewDocument.php?documentid=".$document->getID(); - $params['sitename'] = $settings->_siteName; - $params['http_root'] = $settings->_httpRoot; - $notifier->toList($user, $notifyList["users"], $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - foreach ($notifyList["groups"] as $grp) { - $notifier->toGroup($user, $grp, $subject, $message, $params, SeedDMS_NotificationService::RECV_NOTIFICATION); - } + $notifier->sendReplaceContentMail($lc, $user); } echo json_encode(array('success'=>true, 'message'=>getMLText('splash_saved_file'))); } else { From 19600dd7caba541696aae025602b1bab6af7971e Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 21 May 2021 10:37:09 +0200 Subject: [PATCH 225/403] no need to include bootbox.js anymore --- views/bootstrap/class.ApprovalSummary.php | 2 -- views/bootstrap/class.ExpiredDocuments.php | 2 -- views/bootstrap/class.MyDocuments.php | 2 -- views/bootstrap/class.ObjectCheck.php | 2 -- views/bootstrap/class.ReviewSummary.php | 2 -- views/bootstrap/class.Timeline.php | 2 -- views/bootstrap/class.ViewDocument.php | 1 - views/bootstrap/class.ViewFolder.php | 2 -- 8 files changed, 15 deletions(-) diff --git a/views/bootstrap/class.ApprovalSummary.php b/views/bootstrap/class.ApprovalSummary.php index 5dba410e8..f4094d53d 100644 --- a/views/bootstrap/class.ApprovalSummary.php +++ b/views/bootstrap/class.ApprovalSummary.php @@ -54,8 +54,6 @@ class SeedDMS_View_ApprovalSummary extends SeedDMS_Theme_Style { $previewer = new SeedDMS_Preview_Previewer($cachedir, $previewwidth, $timeout, $xsendfile); - $this->htmlAddHeader(''."\n", 'js'); - $this->htmlStartPage(getMLText("approval_summary")); $this->globalNavigation(); $this->contentStart(); diff --git a/views/bootstrap/class.ExpiredDocuments.php b/views/bootstrap/class.ExpiredDocuments.php index 72ae52a5f..4c3aacc61 100644 --- a/views/bootstrap/class.ExpiredDocuments.php +++ b/views/bootstrap/class.ExpiredDocuments.php @@ -58,8 +58,6 @@ class SeedDMS_View_ExpiredDocuments extends SeedDMS_Theme_Style { $xsendfile = $this->params['xsendfile']; $order = $orderby.$orderdir; - $this->htmlAddHeader(''."\n", 'js'); - $db = $dms->getDB(); $previewer = new SeedDMS_Preview_Previewer($cachedir, $previewwidth, $timeout, $xsendfile); diff --git a/views/bootstrap/class.MyDocuments.php b/views/bootstrap/class.MyDocuments.php index dc4ece7c7..dd3136c03 100644 --- a/views/bootstrap/class.MyDocuments.php +++ b/views/bootstrap/class.MyDocuments.php @@ -58,8 +58,6 @@ class SeedDMS_View_MyDocuments extends SeedDMS_Theme_Style { $timeout = $this->params['timeout']; $xsendfile = $this->params['xsendfile']; - $this->htmlAddHeader(''."\n", 'js'); - $db = $dms->getDB(); $previewer = new SeedDMS_Preview_Previewer($cachedir, $previewwidth, $timeout, $xsendfile); diff --git a/views/bootstrap/class.ObjectCheck.php b/views/bootstrap/class.ObjectCheck.php index e12a55e6a..52af51825 100644 --- a/views/bootstrap/class.ObjectCheck.php +++ b/views/bootstrap/class.ObjectCheck.php @@ -197,8 +197,6 @@ class SeedDMS_View_ObjectCheck extends SeedDMS_Theme_Style { $previewer = new SeedDMS_Preview_Previewer($cachedir, $previewwidth, $timeout, $xsendfile); $previewer->setConverters($previewconverters); - $this->htmlAddHeader(''."\n", 'js'); - $this->htmlStartPage(getMLText("admin_tools")); $this->globalNavigation(); $this->contentStart(); diff --git a/views/bootstrap/class.ReviewSummary.php b/views/bootstrap/class.ReviewSummary.php index 575e9e7e7..39b669cd1 100644 --- a/views/bootstrap/class.ReviewSummary.php +++ b/views/bootstrap/class.ReviewSummary.php @@ -54,8 +54,6 @@ class SeedDMS_View_ReviewSummary extends SeedDMS_Theme_Style { $previewer = new SeedDMS_Preview_Previewer($cachedir, $previewwidth, $timeout, $xsendfile); - $this->htmlAddHeader(''."\n", 'js'); - $this->htmlStartPage(getMLText("my_documents")); $this->globalNavigation(); $this->contentStart(); diff --git a/views/bootstrap/class.Timeline.php b/views/bootstrap/class.Timeline.php index 7b15ecd6e..a32107e19 100644 --- a/views/bootstrap/class.Timeline.php +++ b/views/bootstrap/class.Timeline.php @@ -223,8 +223,6 @@ div.timeline-event-selected { $todate = $this->params['todate']; $skip = $this->params['skip']; - $this->htmlAddHeader(''."\n", 'js'); - if($fromdate) { $from = makeTsFromLongDate($fromdate.' 00:00:00'); } else { diff --git a/views/bootstrap/class.ViewDocument.php b/views/bootstrap/class.ViewDocument.php index 497c9dda6..7adbd297a 100644 --- a/views/bootstrap/class.ViewDocument.php +++ b/views/bootstrap/class.ViewDocument.php @@ -643,7 +643,6 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Theme_Style { if($versions === null) $versions = $document->getContent(); -// $this->htmlAddHeader(''."\n", 'js'); $this->htmlAddHeader(''."\n", 'css'); $this->htmlAddHeader(''."\n", 'js'); $this->htmlAddHeader(''."\n", 'js'); diff --git a/views/bootstrap/class.ViewFolder.php b/views/bootstrap/class.ViewFolder.php index aff68d62f..2793f8c1c 100644 --- a/views/bootstrap/class.ViewFolder.php +++ b/views/bootstrap/class.ViewFolder.php @@ -572,8 +572,6 @@ $('body').on('click', '.order-btn', function(ev) { $previewer = new SeedDMS_Preview_Previewer($cachedir, $previewwidth, $timeout, $xsendfile); $previewer->setConverters($previewconverters); - //$this->htmlAddHeader(''."\n", 'js'); - // echo $this->callHook('startPage'); $this->htmlStartPage(getMLText("folder_title", array("foldername" => htmlspecialchars($folder->getName())))); $this->globalNavigation($folder); From 165eaec67e651e68ff53b949eb9daf2deb1d10fb Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 21 May 2021 14:53:42 +0200 Subject: [PATCH 226/403] set zIndexOffset of datepicker to 1040, which is above the header --- views/bootstrap4/styles/application.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/bootstrap4/styles/application.js b/views/bootstrap4/styles/application.js index 0798e8c89..5e12d0509 100644 --- a/views/bootstrap4/styles/application.js +++ b/views/bootstrap4/styles/application.js @@ -49,7 +49,7 @@ function treeDocumentSelected(formid, nodeid, nodename) { function initMost() { $('.datepicker, #expirationdate, #createstartdate, #createenddate, #expirationstartdate, #expirationenddate') - .datepicker({todayHighlight: true, toggleActive: true, autoclose: "true"}) + .datepicker({todayHighlight: true, toggleActive: true, autoclose: "true", zIndexOffset: "1040"}) /* .on('changeDate', function(ev){ if(ev.date && $(ev.target).data('selectmenu')) { From 635c40bd84ff7fbc5ef07b8d5bfff9175d1304e2 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 21 May 2021 14:54:23 +0200 Subject: [PATCH 227/403] put menu items into one global menu --- views/bootstrap4/class.Bootstrap4.php | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/views/bootstrap4/class.Bootstrap4.php b/views/bootstrap4/class.Bootstrap4.php index 497b11c0d..ed6236474 100644 --- a/views/bootstrap4/class.Bootstrap4.php +++ b/views/bootstrap4/class.Bootstrap4.php @@ -320,22 +320,19 @@ background-image: linear-gradient(to bottom, #882222, #111111);; echo "\n"; /* }}} End of search form */ - echo " \n"; + echo " \n"; echo "
        \n"; echo " \n"; - - echo "
          \n"; $menuitems = array(); + if ($this->params['enablecalendar'] && $accessobject->check_view_access('Calendar')) $menuitems['calendar'] = array('link'=>'../out/out.Calendar.php?mode='.$this->params['calendardefaultview'], 'label'=>"calendar"); + if ($this->params['user']->isAdmin()) $menuitems['admintools'] = array('link'=>'../out/out.AdminTools.php', 'label'=>"admin_tools"); + if($this->params['enablehelp']) { + $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); + $menuitems['help'] = array('link'=>'../out/out.Help.php?context='.$tmp[1], 'label'=>"help"); + } /* Check if hook exists because otherwise callHook() will override $menuitems */ if($this->hasHook('globalNavigationBar')) $menuitems = $this->callHook('globalNavigationBar', $menuitems); @@ -1404,7 +1401,7 @@ $(document).ready(function() { $dateformat = getConvertDateFormat(); $content = '
          - +
          From aef421a581495197f29e4c7dc306e37de65914f0 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Sat, 22 May 2021 13:14:17 +0200 Subject: [PATCH 228/403] fix color change of header after substituion of user --- views/bootstrap4/class.Bootstrap4.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/bootstrap4/class.Bootstrap4.php b/views/bootstrap4/class.Bootstrap4.php index ed6236474..b2b6bb29e 100644 --- a/views/bootstrap4/class.Bootstrap4.php +++ b/views/bootstrap4/class.Bootstrap4.php @@ -127,7 +127,7 @@ class SeedDMS_Theme_Style extends SeedDMS_View_Common { if($this->params['session'] && $this->params['session']->getSu()) { ?>