From 59e92a836f3b740a32a4c46a1ba05b599292b3c2 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Thu, 8 Apr 2021 10:55:33 +0200 Subject: [PATCH 01/91] minor formating change --- views/bootstrap/class.ViewDocument.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/views/bootstrap/class.ViewDocument.php b/views/bootstrap/class.ViewDocument.php index be32ffdfc..6500e2707 100644 --- a/views/bootstrap/class.ViewDocument.php +++ b/views/bootstrap/class.ViewDocument.php @@ -1375,7 +1375,8 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Bootstrap_Style { print ""; + print "
  • ".(is_object($updateUser) ? htmlspecialchars($updateUser->getFullName()." (".$updateUser->getLogin().")") : "unknown user id '".$r["userID"]."'")."
  • "; + print ""; print "".htmlspecialchars($r["comment"])."\n"; print ""; if($class) @@ -1505,6 +1506,7 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Bootstrap_Style { print "".$reqName."\n"; print "\n"; - echo "\n"; echo "\n"; return; } /* }}} */ From 5efc5802b77c461a58f0fa17a9093f398ae00f9d Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 13 Apr 2021 08:39:07 +0200 Subject: [PATCH 05/91] 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 130afd7d251809d659faff61c36e1b9c3406f2ef Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Thu, 15 Apr 2021 06:34:56 +0200 Subject: [PATCH 06/91] pass name of user as parameter to checkout msg --- views/bootstrap/class.ViewDocument.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/views/bootstrap/class.ViewDocument.php b/views/bootstrap/class.ViewDocument.php index 6500e2707..be37f97e4 100644 --- a/views/bootstrap/class.ViewDocument.php +++ b/views/bootstrap/class.ViewDocument.php @@ -204,8 +204,9 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Bootstrap_Style { $checkoutpath = sprintf($checkoutdir, preg_replace('/[^A-Za-z0-9_-]/', '', $user->getLogin())); } foreach($infos as $info) { + $checkoutuser = $dms->getUser($info['userID']); echo ""; } } From ac85cfe26da6249dcea065d934c4a455cceb0b3a Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Thu, 15 Apr 2021 10:31:37 +0200 Subject: [PATCH 07/91] 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 08/91] 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 09/91] 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 10/91] 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 11/91] 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 12/91] 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 13/91] 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 14/91] 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 15/91] 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 16/91] 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 17/91] 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 18/91] 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 19/91] 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 20/91] 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 22/91] 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 23/91] 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 24/91] 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 25/91] 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 26/91] 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 27/91] 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 28/91] 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 29/91] 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 30/91] 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 31/91] 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 ` -

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

      -

      +

      contentContainerEnd(); $this->contentEnd(); $this->htmlEndPage(); } /* }}} */ diff --git a/views/bootstrap/class.ReviseDocument.php b/views/bootstrap/class.ReviseDocument.php index f073ca835..351fe54bf 100644 --- a/views/bootstrap/class.ReviseDocument.php +++ b/views/bootstrap/class.ReviseDocument.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 ReviseDocument view @@ -29,7 +29,7 @@ require_once("class.Bootstrap.php"); * 2010-2012 Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_View_ReviseDocument extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_ReviseDocument extends SeedDMS_Theme_Style { function js() { /* {{{ */ header('Content-Type: application/javascript; charset=UTF-8'); diff --git a/views/bootstrap/class.RevisionSummary.php b/views/bootstrap/class.RevisionSummary.php index adfc54b55..fccc06735 100644 --- a/views/bootstrap/class.RevisionSummary.php +++ b/views/bootstrap/class.RevisionSummary.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_RevisionSummary extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_RevisionSummary extends SeedDMS_Theme_Style { function js() { /* {{{ */ header('Content-Type: application/javascript; charset=UTF-8'); @@ -63,8 +63,8 @@ class SeedDMS_View_RevisionSummary extends SeedDMS_Bootstrap_Style { $this->contentStart(); $this->pageNavigation(getMLText("my_documents"), "my_documents"); - echo "
      \n"; - echo "
      \n"; + $this->rowStart(); + $this->columnStart(6); $this->contentHeading(getMLText("revision_summary")); // $this->contentContainerStart(); @@ -122,8 +122,8 @@ class SeedDMS_View_RevisionSummary extends SeedDMS_Bootstrap_Style { } // $this->contentContainerEnd(); - echo "
      \n"; - echo "
      \n"; + $this->columnEnd(); + $this->columnStart(6); $this->contentHeading(getMLText("group_revision_summary")); // $this->contentContainerStart(); @@ -167,8 +167,8 @@ class SeedDMS_View_RevisionSummary extends SeedDMS_Bootstrap_Style { } // $this->contentContainerEnd(); - echo "
      \n"; - echo "
      \n"; + $this->columnEnd(); + $this->rowEnd(); $this->contentEnd(); $this->htmlEndPage(); } /* }}} */ diff --git a/views/bootstrap/class.RoleMgr.php b/views/bootstrap/class.RoleMgr.php index 6e73fef93..ba1aaeda9 100644 --- a/views/bootstrap/class.RoleMgr.php +++ b/views/bootstrap/class.RoleMgr.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 RoleMgr view @@ -29,7 +29,7 @@ require_once("class.Bootstrap.php"); * 2010-2012 Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_View_RoleMgr extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_RoleMgr extends SeedDMS_Theme_Style { function js() { /* {{{ */ $selrole = $this->params['selrole']; @@ -80,7 +80,7 @@ $(document).ready( function() { $this->contentHeading(getMLText("role_info")); $users = $selrole->getUsers(); if($users) { - echo "\n"; + echo "
      ".getMLText('name')."
      \n"; foreach($users as $currUser) { echo ""; echo "
      ".getMLText('name')."
      "; @@ -208,9 +208,9 @@ $(document).ready( function() { $this->pageNavigation(getMLText("admin_tools"), "admin_tools"); $this->contentHeading(getMLText("role_management")); + $this->rowStart(); + $this->columnStart(4); ?> -
      -
      getID()."\"" : "") ?>>
      check_view_access($this, array('action'=>'info'))) { ?>
      getID()."\"" : "") ?>>
      - -
      - -
      +columnEnd(); + $this->columnStart(8); +?> check_view_access($this, array('action'=>'form'))) { ?>
      getID()."\"" : "") ?>>
      errorMsg(getMLText('access_denied')); -} ?> -
      - - -rowEnd(); + $this->columnEnd(); $this->contentEnd(); $this->htmlEndPage(); } /* }}} */ diff --git a/views/bootstrap/class.SchedulerTaskMgr.php b/views/bootstrap/class.SchedulerTaskMgr.php index e2caec493..841fc841f 100644 --- a/views/bootstrap/class.SchedulerTaskMgr.php +++ b/views/bootstrap/class.SchedulerTaskMgr.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 SchedulerTaskMgr view @@ -25,7 +25,7 @@ require_once("class.Bootstrap.php"); * @copyright Copyright (C) 2013 Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_View_SchedulerTaskMgr extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_SchedulerTaskMgr extends SeedDMS_Theme_Style { function js() { /* {{{ */ header('Content-Type: application/javascript'); @@ -472,10 +472,8 @@ $(document).ready( function() { $this->contentStart(); $this->pageNavigation(getMLText("admin_tools"), "admin_tools"); $this->contentHeading(getMLText("scheduler_task_mgr")); -?> -
      -
      -rowStart(); + $this->columnStart(6); if(!empty($GLOBALS['SEEDDMS_SCHEDULER']['tasks'])) { echo "\n"; print "\n\n"; @@ -520,13 +518,14 @@ $(document).ready( function() { } ?>
      - -
      -
      -
      - - columnEnd(); + $this->columnStart(6); +?> +
      +columnEnd(); + $this->rowEnd(); $this->contentEnd(); $this->htmlEndPage(); } /* }}} */ diff --git a/views/bootstrap/class.SetRecipients.php b/views/bootstrap/class.SetRecipients.php index 7345fb9bb..cf6f9ba0d 100644 --- a/views/bootstrap/class.SetRecipients.php +++ b/views/bootstrap/class.SetRecipients.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 SetRecipients view @@ -29,7 +29,7 @@ require_once("class.Bootstrap.php"); * 2010-2015 Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_View_SetRecipients extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_SetRecipients extends SeedDMS_Theme_Style { function show() { /* {{{ */ $dms = $this->params['dms']; diff --git a/views/bootstrap/class.SetRevisors.php b/views/bootstrap/class.SetRevisors.php index 10f2391fc..dd5c836f3 100644 --- a/views/bootstrap/class.SetRevisors.php +++ b/views/bootstrap/class.SetRevisors.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 SetRevisors view @@ -29,7 +29,7 @@ require_once("class.Bootstrap.php"); * 2010-2015 Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_View_SetRevisors extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_SetRevisors extends SeedDMS_Theme_Style { function show() { /* {{{ */ $dms = $this->params['dms']; diff --git a/views/bootstrap/class.TransmittalMgr.php b/views/bootstrap/class.TransmittalMgr.php index d2305fc0e..4280931b6 100644 --- a/views/bootstrap/class.TransmittalMgr.php +++ b/views/bootstrap/class.TransmittalMgr.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 TransmittalMgr view @@ -29,7 +29,7 @@ require_once("class.Bootstrap.php"); * 2010-2012 Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_View_TransmittalMgr extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_TransmittalMgr extends SeedDMS_Theme_Style { function js() { /* {{{ */ $showtree = $this->params['showtree']; @@ -223,37 +223,30 @@ $(document).ready( function() { -
      -check_controller_access('TransmittalMgr', array('action'=>'removetransmittal'))) { -?> - - - - - - - - - - - - - -formField( + getMLText("name"), + array( + 'element'=>'input', + 'type'=>'text', + 'id'=>'name', + 'name'=>'name', + 'value'=>($transmittal ? htmlspecialchars($transmittal->getName()) : '') + ) + ); + $this->formField( + getMLText("comment"), + array( + 'element'=>'textarea', + 'id'=>'comment', + 'name'=>'comment', + 'rows'=>4, + 'value'=>($transmittal ? htmlspecialchars($transmittal->getComment()) : '') + ) + ); if($transmittal && $accessop->check_controller_access('TransmittalMgr', array('action'=>'edittransmittal')) || !$transmittal && $accessop->check_controller_access('TransmittalMgr', array('action'=>'addtransmittal'))) { -?> - - - - -formSubmit(" ".($transmittal ? getMLText('save') : getMLText('add_transmittal'))); } ?> -
      :">
      :">
      getItems(); if($items) { - print ""; + print "
      "; print "\n\n"; print "\n"; print "\n"; @@ -326,23 +319,18 @@ $(document).ready( function() { $accessop = $this->params['accessobject']; $seltransmittal = $this->params['seltransmittal']; - $this->htmlAddHeader(''."\n", 'js'); - $this->htmlStartPage(getMLText("my_transmittals")); $this->globalNavigation(); $this->contentStart(); $this->pageNavigation(getMLText("my_transmittals"), "my_documents"); $this->contentHeading(getMLText("my_transmittals")); -?> -
      -
      -contentContainerStart(); + $this->rowStart(); + $this->columnStart(4); $transmittals = $dms->getAllTransmittals($user); if ($transmittals){ - print "
      ".getMLText("name")."
      "; + print "
      "; print "\n\n"; print "\n"; print "\n"; @@ -358,6 +346,9 @@ $(document).ready( function() { print ""; print "\n"; @@ -365,11 +356,8 @@ $(document).ready( function() { print "\n
      ".getMLText("name")."".getMLText("comment").""; print ""; print "
      \n"; } - $this->contentContainerEnd(); -?> -
      -
      -columnEnd(); + $this->columnStart(8); if($accessop->check_view_access($this, array('action'=>'form'))) { $this->contentContainerStart(); ?> @@ -382,10 +370,8 @@ $(document).ready( function() {
      getID()."\"" : "") ?>>
      -
      -
      -columnEnd(); + $this->rowEnd(); $this->contentEnd(); $this->htmlEndPage(); } /* }}} */ diff --git a/views/bootstrap/class.ViewDocument.php b/views/bootstrap/class.ViewDocument.php index b71725210..d94aac484 100644 --- a/views/bootstrap/class.ViewDocument.php +++ b/views/bootstrap/class.ViewDocument.php @@ -490,7 +490,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'); @@ -589,12 +589,12 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Theme_Style { } if(is_array($receiptStatus) && count($receiptStatus)>0) { ?> -
    • + 0) { ?> -
    • + diff --git a/views/bootstrap4/class.Bootstrap4.php b/views/bootstrap4/class.Bootstrap4.php index 83ce4efdd..0550e0b23 100644 --- a/views/bootstrap4/class.Bootstrap4.php +++ b/views/bootstrap4/class.Bootstrap4.php @@ -407,8 +407,12 @@ 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'); + if ($accessobject->check_view_access('TransmittalMgr')) + $menuitems['my_transmittals'] = array('link'=>"../out/out.TransmittalMgr.php", 'label'=>'my_transmittals'); foreach($hookObjs as $hookObj) { if (method_exists($hookObj, 'userMenuItems')) { $menuitems = $hookObj->userMenuItems($this, $menuitems); @@ -701,6 +705,13 @@ background-image: linear-gradient(to bottom, #882222, #111111);; $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($document->isCheckedOut()) + $menuitems['checkin_document'] = array('link'=>"../out/out.CheckInDocument".$docid, 'label'=>getMLText('checkin_document')); + else { + if($this->params['checkoutdir']) { + $menuitems['checkout_document'] = array('link'=>"../op/op.CheckOutDocument".$docid, 'label'=>getMLText('checkout_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')); @@ -712,12 +723,19 @@ background-image: linear-gradient(to bottom, #882222, #111111);; $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($document->isCheckedOut()) { + $menuitems['checkin_document'] = array('link'=>"../out/out.CheckInDocument".$docid, 'label'=>getMLText('checkin_document')); + } else { + if($this->params['checkoutdir']) { + $menuitems['checkout_document'] = array('link'=>"../op/op.CheckOutDocument".$docid, 'label'=>getMLText('checkout_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->maySetExpires($document)) { if ($accessobject->check_view_access('SetExpires')) $menuitems['expires'] = array('link'=>"../out/out.SetExpires".$docid, 'label'=>getMLText('expires')); } @@ -767,6 +785,8 @@ background-image: linear-gradient(to bottom, #882222, #111111);; $menuitems['edit_notify'] = array('link'=>"../out/out.ManageNotify.php", 'label'=>getMLText('edit_existing_notify')); + $menuitems['2_factor_auth'] = array('link'=>"../out/out.Setup2Factor.php", 'label'=>'2_factor_auth'); + if ($this->params['enableusersview']){ if ($accessobject->check_view_access('UsrView')) $menuitems['users'] = array('link'=>"../out/out.UsrView.php", 'label'=>getMLText('users')); @@ -797,6 +817,10 @@ background-image: linear-gradient(to bottom, #882222, #111111);; if ($accessobject->check_view_access('WorkflowSummary')) $menuitems['workflow_summary'] = array('link'=>"../out/out.WorkflowSummary.php", 'label'=>getMLText('workflow_summary')); } + if ($accessobject->check_view_access('ReceiptSummary')) + $menuitems['receipt_summary'] = array('link'=>"../out/out.ReceiptSummary.php", 'label'=>getMLText('receipt_summary')); + if ($accessobject->check_view_access('RevisionSummary')) + $menuitems['revision_summary'] = array('link'=>"../out/out.RevisionSummary.php", 'label'=>getMLText('revision_summary')); /* Check if hook exists because otherwise callHook() will override $menuitems */ if($this->hasHook('mydocumentsNavigationBar')) @@ -811,14 +835,18 @@ background-image: linear-gradient(to bottom, #882222, #111111);; $settings = $this->params['settings']; $menuitems = array(); - if($accessobject->check_view_access(array('UsrMgr', 'GroupMgr', 'UserList'))) { + if($accessobject->check_view_access(array('UsrMgr', 'RoleMgr', 'GroupMgr', 'UserList', 'Acl'))) { $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('RoleMgr')) + $menuitems['user_group_management']['children']['role_management'] = array('link'=>"../out/out.RoleMgr.php", 'label'=>getMLText('role_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('Acl')) + $menuitems['user_group_management']['children']['access_control'] = array('link'=>"../out/out.Acl.php", 'label'=>getMLText('access_control')); } if($accessobject->check_view_access(array('DefaultKeywords', 'Categories', 'AttributeMgr', 'WorkflowMgr', 'WorkflowStatesMgr', 'WorkflowActionsMgr'))) { @@ -872,6 +900,8 @@ background-image: linear-gradient(to bottom, #882222, #111111);; $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('SchedulerTaskMgr')) + $menuitems['misc']['children']['schedulertaskmgr'] = array('link'=>"../out/out.SchedulerTaskMgr.php", 'label'=>getMLText('scheduler_task_mgr')); 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')) @@ -884,6 +914,12 @@ background-image: linear-gradient(to bottom, #882222, #111111);; $menuitems['misc']['children']['version_info'] = array('link'=>"../out/out.Info.php", 'label'=>getMLText('version_info')); } + if ($settings->_enableDebugMode) { + $menuitems['debug'] = array('link'=>"#", 'label'=>getMLText('debug')); + if ($accessobject->check_view_access('Hooks')) + $menuitems['debug']['children']['hooks'] = array('link'=>"../out/out.Hooks.php", 'label'=>getMLText('list_hooks')); + } + /* Check if hook exists because otherwise callHook() will override $menuitems */ if($this->hasHook('admintoolsNavigationBar')) $menuitems = $this->callHook('admintoolsNavigationBar', $menuitems); @@ -1440,12 +1476,15 @@ $(document).ready(function() { $content .= ""; return $content; } /* }}} */ - - function getDocumentChooserHtml($form, $default=false, $formname='', $skiptree=false) { /* {{{ */ + + function getDocumentChooserHtml($form, $accessMode=M_READ, $exclude = -1, $default = false, $formname = '', $folder='', $partialtree=0, $skiptree=false) { /* {{{ */ if(!$formname) $formname = "docid"; $formid = md5($formname.$form); - + if(!$folder) + $folderid = $this->params['dms']->getRootFolder()->getId(); + else + $folderid = $folder->getID(); $content = ''; $content .= "getID() : "") ."\">"; $content .= "
      \n"; @@ -1456,7 +1495,7 @@ $(document).ready(function() { $content .= $this->getModalBoxLink( array( 'target' => 'docChooser'.$formid, - 'remote' => "../out/out.DocumentChooser.php?form=".$formid."&folderid=".$this->params['dms']->getRootFolder()->getId(), + 'remote' => "../out/out.DocumentChooser.php?form=".$formid."&folderid=".$folderid."&partialtree=".$partialtree, 'title' => getMLText('document') )); $content .= "
      \n"; @@ -1473,8 +1512,8 @@ $(document).ready(function() { return $content; } /* }}} */ - function printDocumentChooserHtml($formName) { /* {{{ */ - echo self::getDocumentChooserHtml($formName); + function printDocumentChooserHtml($form, $accessMode=M_READ, $exclude = -1, $default = false, $formname = '', $folder='', $partialtree=0) { /* {{{ */ + echo self::getDocumentChooserHtml($form, $accessMode, $exclude, $default, $formname, $folder, $partialtree); } /* }}} */ /** @@ -1497,8 +1536,8 @@ function folderSelected(id, name) { printDocumentChooserHtml($form); + function printDocumentChooser($form, $accessMode=M_READ, $exclude = -1, $default = false, $formname = '', $folder='', $partialtree=0) { /* {{{ */ + $this->printDocumentChooserHtml($form, $accessMode, $exclude, $default, $formname, $folder, $partialtree); ?> '."\n", 'js'); - echo $this->callHook('startPage'); +// echo $this->callHook('startPage'); $this->htmlStartPage(getMLText("folder_title", array("foldername" => htmlspecialchars($folder->getName())))); $this->globalNavigation($folder); $this->contentStart(); From 3d15736772ebd39b421388f01b5a8d63577e6300 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 23 Apr 2021 06:55:10 +0200 Subject: [PATCH 57/91] read property viewAliasName --- inc/inc.ClassViewCommon.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/inc/inc.ClassViewCommon.php b/inc/inc.ClassViewCommon.php index e92788c51..efce8acf8 100644 --- a/inc/inc.ClassViewCommon.php +++ b/inc/inc.ClassViewCommon.php @@ -114,6 +114,12 @@ class SeedDMS_View_Common { */ public function callHook($hook) { /* {{{ */ $tmps = array(); + /* the viewAliasName can be set in the view to specify a different name + * than extracted from the class name. + */ + if(property_exists($this, 'viewAliasName') && !empty($this->viewAliasName)) { + $tmps[] = $this->viewAliasName; + } $tmp = explode('_', get_class($this)); $tmps[] = $tmp[2]; foreach(class_parents($this) as $pc) { From 1a114830a505421a08a2d3311a21b06b6da90aec Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 23 Apr 2021 09:54:36 +0200 Subject: [PATCH 58/91] do not include page navigation with ajax anymore --- views/bootstrap/class.AddSubFolder.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/views/bootstrap/class.AddSubFolder.php b/views/bootstrap/class.AddSubFolder.php index 0282c54fb..393e67510 100644 --- a/views/bootstrap/class.AddSubFolder.php +++ b/views/bootstrap/class.AddSubFolder.php @@ -74,10 +74,12 @@ $(document).ready( function() { $this->htmlStartPage(getMLText("folder_title", array("foldername" => htmlspecialchars($folder->getName())))); $this->globalNavigation($folder); $this->contentStart(); -// $this->pageNavigation($this->getFolderPathHTML($folder, true), "view_folder", $folder); + $this->pageNavigation($this->getFolderPathHTML($folder, true), "view_folder", $folder); + /* ?>
      getID()."\"" : "") ?>>
      contentHeading(getMLText("add_subfolder")); $this->contentContainerStart(); ?> From fd90623de47bd36d9ce862bf816be21b6d41c8c6 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 23 Apr 2021 09:55:25 +0200 Subject: [PATCH 59/91] use callHook() instead of interating over hookObjects --- views/bootstrap/class.Bootstrap.php | 38 ++++++++--------------------- 1 file changed, 10 insertions(+), 28 deletions(-) diff --git a/views/bootstrap/class.Bootstrap.php b/views/bootstrap/class.Bootstrap.php index 32bed970f..8032f59c6 100644 --- a/views/bootstrap/class.Bootstrap.php +++ b/views/bootstrap/class.Bootstrap.php @@ -79,12 +79,8 @@ class SeedDMS_Theme_Style extends SeedDMS_View_Common { header($name . ": " . $value); } } - $hookObjs = $this->getHookObjects('SeedDMS_View_Bootstrap'); - foreach($hookObjs as $hookObj) { - if (method_exists($hookObj, 'startPage')) { - $hookObj->startPage($this); - } - } + if($this->hasHook('startPage')) + $this->callHook('startPage'); echo "\n"; echo "\n\n"; echo "\n"; @@ -147,11 +143,8 @@ background-image: linear-gradient(to bottom, #882222, #111111);; echo "
      ".$flashmsg['msg']."
      \n"; } echo "

      ".getMLText('recent_uploads')."

      \n"; - foreach($hookObjs as $hookObj) { - if (method_exists($hookObj, 'startBody')) { - $hookObj->startBody($this); - } - } + if($this->hasHook('startBody')) + $this->callHook('startBody'); } /* }}} */ function htmlAddHeader($head, $type='js') { /* {{{ */ @@ -166,13 +159,9 @@ background-image: linear-gradient(to bottom, #882222, #111111);; 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); - } - } + if($this->hasHook('footNote')) + $html = $this->callHook('footNote', $html); echo $html; if($this->params['showmissingtranslations']) { $this->missingLanguageKeys(); @@ -326,12 +315,8 @@ background-image: linear-gradient(to bottom, #882222, #111111);; $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')) { - $menuitems = $hookObj->userMenuItems($this, $menuitems); - } - } + if($this->hasHook('userMenuItems')) + $menuitems = $this->callHook('userMenuItems', $menuitems); if($menuitems) { foreach($menuitems as $menuitem) { echo "
    • ".getMLText($menuitem['label'])."
    • "; @@ -427,11 +412,8 @@ background-image: linear-gradient(to bottom, #882222, #111111);; $menuitems['help'] = array('link'=>'../out/out.Help.php?context='.$tmp[1], 'label'=>"help"); } /* 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"; From a7e214b5a93c7061a454baf2d7167dc97ba67c21 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 23 Apr 2021 09:55:58 +0200 Subject: [PATCH 60/91] check for missing class 'finfo', add style table-sm --- views/bootstrap/class.Info.php | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/views/bootstrap/class.Info.php b/views/bootstrap/class.Info.php index 67a33747c..ffdc5f759 100644 --- a/views/bootstrap/class.Info.php +++ b/views/bootstrap/class.Info.php @@ -59,7 +59,7 @@ class SeedDMS_View_Info extends SeedDMS_Theme_Style { $this->columnStart(6); $this->contentHeading(getMLText("seeddms_info")); $seedextensions = $extmgr->getExtensionConfiguration(); - echo "\n"; + echo "
      \n"; echo "\n\n"; echo "\n"; @@ -76,7 +76,7 @@ class SeedDMS_View_Info extends SeedDMS_Theme_Style { $this->columnStart(6); if($user->isAdmin()) { $this->contentHeading(getMLText("php_info")); - echo "
      ".getMLText("name"); echo "
      \n"; + echo "
      \n"; echo "\n\n"; echo "\n"; @@ -87,7 +87,7 @@ class SeedDMS_View_Info extends SeedDMS_Theme_Style { $this->contentHeading(getMLText("installed_php_extensions")); $phpextensions = get_loaded_extensions(false); - echo "
      ".getMLText("name"); echo "
      \n"; + echo "
      \n"; echo "\n\n"; echo "\n"; @@ -97,7 +97,7 @@ class SeedDMS_View_Info extends SeedDMS_Theme_Style { echo "\n
      ".getMLText("name"); echo "
      \n"; $this->contentHeading(getMLText("missing_php_extensions")); - echo "\n"; + echo "
      \n"; echo "\n\n"; echo "\n"; @@ -107,11 +107,11 @@ class SeedDMS_View_Info extends SeedDMS_Theme_Style { echo "\n"; echo "\n
      ".getMLText("name"); echo "
      ".$extname.""."
      \n"; - $this->contentHeading(getMLText("missing_php_functions")); - echo "\n"; + $this->contentHeading(getMLText("missing_php_functions_and_classes")); + echo "
      \n"; echo "\n\n"; echo "\n"; echo "\n\n\n"; foreach(array('proc_open') as $funcname) { @@ -119,12 +119,17 @@ class SeedDMS_View_Info extends SeedDMS_Theme_Style { echo ""; } } + foreach(array('finfo') as $classname) { + if(!class_exists($classname)) { + echo ""; + } + } echo "\n
      ".getMLText("name"); - echo "".getMLText("missing_func_note"); + echo "".getMLText("missing_func_class_note"); echo "
      ".$funcname."".getMLText('func_'.$funcname."_missing")."
      ".$classname."".getMLText('class_'.$classname."_missing")."
      \n"; if(function_exists('apache_get_modules')) { $this->contentHeading(getMLText("installed_apache_extensions")); $apacheextensions = apache_get_modules(); - echo "\n"; + echo "
      \n"; echo "\n\n"; echo "\n"; From ffdc6482922a2c16dc3f40d44296a25d0c4564be Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 23 Apr 2021 09:56:25 +0200 Subject: [PATCH 61/91] use same way to check for hooks in hasHook() and callHook() --- inc/inc.ClassControllerCommon.php | 54 ++++++++++++++++++------ inc/inc.ClassViewCommon.php | 68 ++++++++++++++++++++----------- 2 files changed, 87 insertions(+), 35 deletions(-) diff --git a/inc/inc.ClassControllerCommon.php b/inc/inc.ClassControllerCommon.php index c0454150d..ec2bd1cd3 100644 --- a/inc/inc.ClassControllerCommon.php +++ b/inc/inc.ClassControllerCommon.php @@ -139,6 +139,46 @@ class SeedDMS_Controller_Common { $this->errormsg = $msg; } /* }}} */ + /** + * Return a list of hook classes for the current class + * + * Hooks are associated to a controller class. Calling a hook with + * SeedDMS_View_Common::callHook() will run through a list of + * controller classes searching for the hook. This method returns this + * list. + * + * If a controller is implemented in SeedDMS_View_Example which inherits + * from SeedDMS_Theme_Style which again inherits from SeedDMS_View_Common, + * then this method will return an array with the elments: + * 'Example', 'Style', 'Common'. If SeedDMS_View_Example also sets + * the class property 'controllerAliasName', then this value will be added + * to the beginning of the list. + * + * When a hook is called, it will run through this list and checks + * if $GLOBALS['SEEDDMS_HOOKS']['controller'][] exists and contains + * an instanciated class. This class must implement the hook. + * + * @return array list of controller class names. + */ + protected function getHookClassNames() { /* {{{ */ + $tmps = array(); + /* the controllerAliasName can be set in the controller to specify a different name + * than extracted from the class name. + */ + if(property_exists($this, 'controllerAliasName') && !empty($this->controllerAliasName)) { + $tmps[] = $this->controllerAliasName; + } + $tmp = explode('_', get_class($this)); + $tmps[] = $tmp[2]; + foreach(class_parents($this) as $pc) { + $tmp = explode('_', $pc); + $tmps[] = $tmp[2]; + } + /* Run array_unique() in case the parent class has the same suffix */ + $tmps = array_unique($tmps); + return $tmps; + } /* }}} */ + /** * Call all hooks registered for a controller * @@ -190,17 +230,7 @@ class SeedDMS_Controller_Common { * null if no hook was called */ function callHook($hook) { /* {{{ */ - $tmps = array(); - $tmp = explode('_', get_class($this)); - $tmps[] = $tmp[2]; - foreach(class_parents($this) as $pc) { - $tmp = explode('_', $pc); - $tmps[] = $tmp[2]; - } -// $tmp = explode('_', get_parent_class($this)); -// $tmps[] = $tmp[2]; - /* Run array_unique() in case the parent class has the same suffix */ - $tmps = array_unique($tmps); + $tmps = $this->getHookClassNames(); foreach($tmps as $tmp) if(isset($GLOBALS['SEEDDMS_HOOKS']['controller'][lcfirst($tmp)])) { $this->lasthookresult = null; @@ -242,7 +272,7 @@ class SeedDMS_Controller_Common { * null if no hook was called */ function hasHook($hook) { /* {{{ */ - $tmp = explode('_', get_class($this)); + $tmps = $this->getHookClassNames(); if(isset($GLOBALS['SEEDDMS_HOOKS']['controller'][lcfirst($tmp[2])])) { foreach($GLOBALS['SEEDDMS_HOOKS']['controller'][lcfirst($tmp[2])] as $hookObj) { if (method_exists($hookObj, $hook)) { diff --git a/inc/inc.ClassViewCommon.php b/inc/inc.ClassViewCommon.php index efce8acf8..c388291b2 100644 --- a/inc/inc.ClassViewCommon.php +++ b/inc/inc.ClassViewCommon.php @@ -95,6 +95,46 @@ class SeedDMS_View_Common { public function show() { } + /** + * Return a list of hook classes for the current class + * + * Hooks are associated to a view class. Calling a hook with + * SeedDMS_View_Common::callHook() will run through a list of + * view classes searching for the hook. This method returns this + * list. + * + * If a view is implemented in SeedDMS_View_Example which inherits + * from SeedDMS_Theme_Style which again inherits from SeedDMS_View_Common, + * then this method will return an array with the elments: + * 'Example', 'Style', 'Common'. If SeedDMS_View_Example also sets + * the class property 'viewAliasName', then this value will be added + * to the beginning of the list. + * + * When a hook is called, it will run through this list and checks + * if $GLOBALS['SEEDDMS_HOOKS']['view'][] exists and contains + * an instanciated class. This class must implement the hook. + * + * @return array list of view class names. + */ + protected function getHookClassNames() { /* {{{ */ + $tmps = array(); + /* the viewAliasName can be set in the view to specify a different name + * than extracted from the class name. + */ + if(property_exists($this, 'viewAliasName') && !empty($this->viewAliasName)) { + $tmps[] = $this->viewAliasName; + } + $tmp = explode('_', get_class($this)); + $tmps[] = $tmp[2]; + foreach(class_parents($this) as $pc) { + $tmp = explode('_', $pc); + $tmps[] = $tmp[2]; + } + /* Run array_unique() in case the parent class has the same suffix */ + $tmps = array_unique($tmps); + return $tmps; + } /* }}} */ + /** * Call a hook with a given name * @@ -113,21 +153,7 @@ class SeedDMS_View_Common { * function returns */ public function callHook($hook) { /* {{{ */ - $tmps = array(); - /* the viewAliasName can be set in the view to specify a different name - * than extracted from the class name. - */ - if(property_exists($this, 'viewAliasName') && !empty($this->viewAliasName)) { - $tmps[] = $this->viewAliasName; - } - $tmp = explode('_', get_class($this)); - $tmps[] = $tmp[2]; - foreach(class_parents($this) as $pc) { - $tmp = explode('_', $pc); - $tmps[] = $tmp[2]; - } - /* Run array_unique() in case the parent class has the same suffix */ - $tmps = array_unique($tmps); + $tmps = $this->getHookClassNames(); $ret = null; foreach($tmps as $tmp) if(isset($GLOBALS['SEEDDMS_HOOKS']['view'][lcfirst($tmp)])) { @@ -180,6 +206,9 @@ class SeedDMS_View_Common { * ?> * * + * The method does not return hooks for parent classes nor does it + * evaluate the viewAliasName property. + * * @params string $classname name of class (current class if left empty) * @return array list of hook objects registered for the class */ @@ -203,14 +232,7 @@ class SeedDMS_View_Common { * null if no hook was called */ public function hasHook($hook) { /* {{{ */ - $tmps = array(); - $tmp = explode('_', get_class($this)); - $tmps[] = $tmp[2]; - $tmp = explode('_', get_parent_class($this)); - $tmps[] = $tmp[2]; - /* Run array_unique() in case the parent class has the same suffix */ - $tmps = array_unique($tmps); - $ret = null; + $tmps = $this->getHookClassNames(); foreach($tmps as $tmp) { if(isset($GLOBALS['SEEDDMS_HOOKS']['view'][lcfirst($tmp)])) { foreach($GLOBALS['SEEDDMS_HOOKS']['view'][lcfirst($tmp)] as $hookObj) { From 51d1bd98d6a6f98612415d9b4ee449f0037eb78f Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 23 Apr 2021 10:03:19 +0200 Subject: [PATCH 62/91] various updates --- languages/ar_EG/lang.inc | 15 +++++++++++++-- languages/bg_BG/lang.inc | 13 ++++++++++++- languages/ca_ES/lang.inc | 13 ++++++++++++- languages/cs_CZ/lang.inc | 17 ++++++++++++++--- languages/de_DE/lang.inc | 19 +++++++++++++++---- languages/el_GR/lang.inc | 13 ++++++++++++- languages/en_GB/lang.inc | 17 ++++++++++++++--- languages/es_ES/lang.inc | 19 +++++++++++++++---- languages/fr_FR/lang.inc | 13 ++++++++++++- languages/hr_HR/lang.inc | 11 +++++++++++ languages/hu_HU/lang.inc | 17 ++++++++++++++--- languages/it_IT/lang.inc | 13 ++++++++++++- languages/ko_KR/lang.inc | 11 +++++++++++ languages/lo_LA/lang.inc | 11 +++++++++++ languages/nb_NO/lang.inc | 11 +++++++++++ languages/nl_NL/lang.inc | 11 +++++++++++ languages/pl_PL/lang.inc | 11 +++++++++++ languages/pt_BR/lang.inc | 15 +++++++++++++-- languages/ro_RO/lang.inc | 11 +++++++++++ languages/ru_RU/lang.inc | 11 +++++++++++ languages/sk_SK/lang.inc | 11 +++++++++++ languages/sv_SE/lang.inc | 11 +++++++++++ languages/tr_TR/lang.inc | 21 ++++++++++++++++----- languages/uk_UA/lang.inc | 11 +++++++++++ languages/zh_CN/lang.inc | 11 +++++++++++ languages/zh_TW/lang.inc | 11 +++++++++++ 26 files changed, 317 insertions(+), 31 deletions(-) diff --git a/languages/ar_EG/lang.inc b/languages/ar_EG/lang.inc index f67828709..63364bee9 100644 --- a/languages/ar_EG/lang.inc +++ b/languages/ar_EG/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 (2267) +// Translators: Admin (2270) $text = array( '2_factor_auth' => 'توثيق ذو عاملين', @@ -272,6 +272,7 @@ URL: [url]', 'choose_workflow' => 'اختر مسار عمل', 'choose_workflow_action' => 'اختر اجراء مسار عمل', 'choose_workflow_state' => 'اختر حالة مسار عمل', +'class_finfo_missing' => '', 'class_name' => 'اسم الصف', 'clear_cache' => 'مسح المحفوظات', 'clear_clipboard' => 'مسح الحافظة', @@ -324,7 +325,7 @@ URL: [url]', 'daily' => 'يومي', 'databasesearch' => 'بحث قاعدة البيانات', 'database_schema_version' => '', -'data_loading' => '', +'data_loading' => 'ﺎﻟﺮﺟﺍﺀ ﺍﻼﻨﺘﻇﺍﺭ, ﺖﺤﻤﻴﻟ ﺎﻠﻤﻌﻟﻮﻣﺎﺗ...', 'date' => 'تاريخ', 'days' => 'أيام', 'debug' => 'debug', @@ -639,6 +640,7 @@ URL: [url]', 'fulltextsearch_disabled' => 'توقف البحث الكامل للنص', 'fulltext_converters' => 'فهرس تحويل المستند', 'fulltext_info' => 'معلومات فهرس النص الكامل', +'func_proc_open_missing' => '', 'global_attributedefinitiongroups' => 'معرف تعريف المجموعات', 'global_attributedefinitions' => 'سمات', 'global_default_keywords' => 'كلمات بحثية عامة', @@ -814,7 +816,9 @@ URL: [url]', 'missing_checksum' => 'فحص الأخطاء مفقود', 'missing_file' => 'الملف غير موجود', 'missing_filesize' => 'حجم الملف مفقود', +'missing_func_class_note' => '', 'missing_php_extensions' => '', +'missing_php_functions_and_classes' => '', 'missing_reception' => 'الإستقبال غير موجود', 'missing_request_object' => 'طلب شيء غير موجود', 'missing_transition_user_group' => 'مستخدم/مجموعة مفقودة للتحول', @@ -831,6 +835,11 @@ URL: [url]', 'my_documents' => 'مستنداتي', 'my_transmittals' => 'الإحالات الخاصة بي', 'name' => 'اسم', +'nav_brand_admin_tools' => 'أدوات-الإدارة', +'nav_brand_my_account' => 'حسابي', +'nav_brand_my_documents' => '', +'nav_brand_view_document' => '', +'nav_brand_view_folder' => '', 'nb_NO' => 'ﺎﻠﻧﺭﻮﻴﺟ', 'needs_correction' => 'يحتاج الى تصحيح', 'needs_workflow_action' => 'هذا المستند يتطلب انتباهك . من فضلك تفقد زر مسار العمل', @@ -1723,6 +1732,7 @@ URL: [url]', 'status_approval_rejected' => 'مسودة مرفوضة', 'status_approved' => 'تمت الموافقة', 'status_approver_removed' => 'تم ازالة موافق من العملية', +'status_change' => '', 'status_needs_correction' => 'الوضع يحتاج إلى تصحيح', 'status_not_approved' => 'لم تتم الموافقة بعد', 'status_not_receipted' => 'الوضع غير مستلم', @@ -1780,6 +1790,7 @@ URL: [url]', 'task_description' => 'تفصيل المهام', 'task_disabled' => 'تم توقيف المهمة', 'task_frequency' => 'تردد المهمة', +'task_frequency_placeholder' => '', 'task_last_run' => 'مهمة المدى الماضي', 'task_name' => 'اسم المهمة', 'task_next_run' => 'مدى المهمة القادمة', diff --git a/languages/bg_BG/lang.inc b/languages/bg_BG/lang.inc index 2271153c4..9e5905db0 100644 --- a/languages/bg_BG/lang.inc +++ b/languages/bg_BG/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 (870) +// Translators: Admin (872) $text = array( '2_factor_auth' => '', @@ -255,6 +255,7 @@ $text = array( 'choose_workflow' => 'Изберете workflow', 'choose_workflow_action' => 'Изберете workflow действие', 'choose_workflow_state' => 'Изберете състояние на workflow', +'class_finfo_missing' => '', 'class_name' => '', 'clear_cache' => 'Изчистване на кеша', 'clear_clipboard' => '', @@ -568,6 +569,7 @@ $text = array( 'fulltextsearch_disabled' => '', 'fulltext_converters' => 'Index document conversion', 'fulltext_info' => 'Информация за пълнотекстов индексе', +'func_proc_open_missing' => '', 'global_attributedefinitiongroups' => '', 'global_attributedefinitions' => 'атрибути', 'global_default_keywords' => 'Глобални ключови думи', @@ -743,7 +745,9 @@ $text = array( 'missing_checksum' => 'липсва контролна сума', 'missing_file' => '', 'missing_filesize' => 'липсва размер на файла', +'missing_func_class_note' => '', 'missing_php_extensions' => '', +'missing_php_functions_and_classes' => '', 'missing_reception' => '', 'missing_request_object' => '', 'missing_transition_user_group' => 'липсва потребител или група за преход', @@ -760,6 +764,11 @@ $text = array( 'my_documents' => 'Моите документи', 'my_transmittals' => 'Моите предавания', 'name' => 'Име', +'nav_brand_admin_tools' => 'Администрация', +'nav_brand_my_account' => 'Моя акаунт', +'nav_brand_my_documents' => '', +'nav_brand_view_document' => '', +'nav_brand_view_folder' => '', 'nb_NO' => 'Норвежки', 'needs_correction' => '', 'needs_workflow_action' => '', @@ -1586,6 +1595,7 @@ $text = array( 'status_approval_rejected' => 'Чернова отказана', 'status_approved' => 'Утвърден', 'status_approver_removed' => 'Утвърждаващия премахнат от процеса', +'status_change' => '', 'status_needs_correction' => '', 'status_not_approved' => 'Не утвърден', 'status_not_receipted' => '', @@ -1643,6 +1653,7 @@ $text = array( 'task_description' => '', 'task_disabled' => '', 'task_frequency' => '', +'task_frequency_placeholder' => '', 'task_last_run' => '', 'task_name' => '', 'task_next_run' => '', diff --git a/languages/ca_ES/lang.inc b/languages/ca_ES/lang.inc index c5284cfc8..ac395ee76 100644 --- a/languages/ca_ES/lang.inc +++ b/languages/ca_ES/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 (770) +// Translators: Admin (772) $text = array( '2_factor_auth' => '', @@ -260,6 +260,7 @@ URL: [url]', 'choose_workflow' => '', 'choose_workflow_action' => '', 'choose_workflow_state' => '', +'class_finfo_missing' => '', 'class_name' => '', 'clear_cache' => 'Neteja memòria cau', 'clear_clipboard' => '', @@ -573,6 +574,7 @@ URL: [url]', 'fulltextsearch_disabled' => '', 'fulltext_converters' => '', 'fulltext_info' => 'Informació de full-text', +'func_proc_open_missing' => '', 'global_attributedefinitiongroups' => '', 'global_attributedefinitions' => 'Atributs', 'global_default_keywords' => 'Mots clau globals', @@ -748,7 +750,9 @@ URL: [url]', 'missing_checksum' => '', 'missing_file' => '', 'missing_filesize' => '', +'missing_func_class_note' => '', 'missing_php_extensions' => '', +'missing_php_functions_and_classes' => '', 'missing_reception' => '', 'missing_request_object' => '', 'missing_transition_user_group' => '', @@ -765,6 +769,11 @@ URL: [url]', 'my_documents' => 'Els meus documents', 'my_transmittals' => 'Documents enviats per mi', 'name' => 'Nom', +'nav_brand_admin_tools' => 'Eines d\'administració', +'nav_brand_my_account' => 'El meu compte', +'nav_brand_my_documents' => '', +'nav_brand_view_document' => '', +'nav_brand_view_folder' => '', 'nb_NO' => 'Noruec', 'needs_correction' => '', 'needs_workflow_action' => '', @@ -1591,6 +1600,7 @@ URL: [url]', 'status_approval_rejected' => 'Esborrany rebutjat', 'status_approved' => 'Aprovat', 'status_approver_removed' => 'Aprovador eliminat del procés', +'status_change' => '', 'status_needs_correction' => '', 'status_not_approved' => 'Sense aprovar', 'status_not_receipted' => '', @@ -1648,6 +1658,7 @@ URL: [url]', 'task_description' => '', 'task_disabled' => '', 'task_frequency' => '', +'task_frequency_placeholder' => '', 'task_last_run' => '', 'task_name' => '', 'task_next_run' => '', diff --git a/languages/cs_CZ/lang.inc b/languages/cs_CZ/lang.inc index 0ab02f967..a4257f7e6 100644 --- a/languages/cs_CZ/lang.inc +++ b/languages/cs_CZ/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 (1540), kreml (579) +// Translators: Admin (1545), kreml (579) $text = array( '2_factor_auth' => 'dvoufaktorové ověření', @@ -284,6 +284,7 @@ URL: [url]', 'choose_workflow' => 'Vyberte workflow', 'choose_workflow_action' => 'Vyberte akci workflow', 'choose_workflow_state' => 'Vyberte stav workflow', +'class_finfo_missing' => '', 'class_name' => 'Název třídy', 'clear_cache' => 'Vymazat vyrovnávací paměť', 'clear_clipboard' => 'Vyčistit schránku', @@ -670,6 +671,7 @@ URL: [url]', 'fulltextsearch_disabled' => 'fulltextové vyhledávání zakázáno', 'fulltext_converters' => 'Index konverze dokumentu', 'fulltext_info' => 'Fulltext index info', +'func_proc_open_missing' => '', 'global_attributedefinitiongroups' => 'Skupiny atributů', 'global_attributedefinitions' => 'Atributy', 'global_default_keywords' => 'Globální klíčová slova', @@ -845,7 +847,9 @@ URL: [url]', 'missing_checksum' => 'Chybějící kontrolní součet', 'missing_file' => 'Chybějící soubor', 'missing_filesize' => 'Chybějící velikost souboru', +'missing_func_class_note' => '', 'missing_php_extensions' => '', +'missing_php_functions_and_classes' => '', 'missing_reception' => 'Chybějící recepce', 'missing_request_object' => 'Chybějící požadovaný objekt', 'missing_transition_user_group' => 'Chybějící uživatel / skupina pro transformaci', @@ -862,6 +866,11 @@ URL: [url]', 'my_documents' => 'Moje dokumenty', 'my_transmittals' => 'Moje přenosy', 'name' => 'Název', +'nav_brand_admin_tools' => 'Nástroje správce', +'nav_brand_my_account' => 'Můj účet', +'nav_brand_my_documents' => '', +'nav_brand_view_document' => '', +'nav_brand_view_folder' => '', 'nb_NO' => 'Norština Bokmal', 'needs_correction' => 'Vyžaduje opravu', 'needs_workflow_action' => 'Tento dokument vyžaduje vaši pozornost. Zkontrolujte prosím kartu workflow.', @@ -925,7 +934,7 @@ URL: [url]', 'no_approval_needed' => 'Nic nečeká na schválení.', 'no_attached_files' => 'Žádné přiložené soubory', 'no_attribute_definitions' => '', -'no_backup_dir' => '', +'no_backup_dir' => 'Složka pro zálohování není určena', 'no_current_version' => 'Používáte starou verzi SeedDMS. Nejnovější dostupná verze je [latestversion].', 'no_default_keywords' => 'Nejsou dostupná žádná klíčová slova.', 'no_docs_checked_out' => 'Nebyly odbaveny žádné dokumenty', @@ -1149,7 +1158,7 @@ URL: [url]', 'review_update_failed' => 'Chyba při aktualizaci stavu recenze. Aktualizace selhala.', 'revise_document' => 'Revize dokumentu', 'revise_document_on' => 'Další revize verze dokumentu v [date]', -'revision' => '', +'revision' => 'Revize', 'revisions_accepted' => '[no_revisions] již přijato', 'revisions_accepted_latest' => '', 'revisions_not_touched' => '[no_revisions] revizí nebylo dotčeno', @@ -1795,6 +1804,7 @@ Jméno: [username] 'status_approval_rejected' => 'Návrh zamítnut', 'status_approved' => 'Schválen', 'status_approver_removed' => 'Schvalovatel odstraněn z procesu', +'status_change' => 'změna stavu', 'status_needs_correction' => 'Vyžaduje korekturu', 'status_not_approved' => 'Neschválený', 'status_not_receipted' => 'Dosud nebyl přijat', @@ -1852,6 +1862,7 @@ Jméno: [username] 'task_description' => 'Popis', 'task_disabled' => 'Vypnuto', 'task_frequency' => 'Frekvence', +'task_frequency_placeholder' => '', 'task_last_run' => 'Poslední spuštění', 'task_name' => 'Název', 'task_next_run' => 'Příští spuštění', diff --git a/languages/de_DE/lang.inc b/languages/de_DE/lang.inc index 632af19b8..25043edae 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 (2867), dgrutsch (22) +// Translators: Admin (2881), dgrutsch (22) $text = array( '2_factor_auth' => '2-Faktor Authentifizierung', @@ -62,7 +62,7 @@ URL: [url]', 'add' => 'Anlegen', 'add_approval' => 'Freigabe hinzufügen', 'add_attrdefgroup' => 'Neue Attributgruppe anlegen', -'add_document' => 'Dokument anlegen', +'add_document' => 'Neues Dokument', 'add_document_link' => 'Verknüpfung hinzufügen', 'add_document_notify' => 'Beobachter zuweisen', 'add_doc_reviewer_approver_warning' => 'Anmerkung: Dokumente werden automatisch geprüft und als freigegeben markiert, wenn kein Prüfer oder keine Freigabe zugewiesen wird.', @@ -76,7 +76,7 @@ URL: [url]', 'add_review' => 'Prüfung hinzufügen', 'add_revision' => 'Wiederholungsprüfung hinzufügen', 'add_role' => 'Neue Rolle anlegen', -'add_subfolder' => 'Unterordner anlegen', +'add_subfolder' => 'Neuer Ordner', 'add_task' => 'Neue Task für diese Klasse hinzufügen', 'add_to_clipboard' => 'Zur Zwischenablage hinzufügen', 'add_to_transmittal' => 'Zur Dokumentenliste hinzufügen', @@ -284,6 +284,7 @@ URL: [url]', 'choose_workflow' => 'Workflow wählen', 'choose_workflow_action' => 'Workflow-Aktion wählen', 'choose_workflow_state' => 'Workflow-Status wählen', +'class_finfo_missing' => 'Die Klasse finfo wird zur Ermittlung des MimeTypes beim Hochladen neuer Dateien benötigt.', 'class_name' => 'Klassenname', 'clear_cache' => 'Cache löschen', 'clear_clipboard' => 'Zwischenablage leeren', @@ -323,7 +324,7 @@ URL: [url]', 'continue' => 'fortführen', 'converter_new_cmd' => 'Kommando', 'converter_new_mimetype' => 'Neuer Mime-Type', -'copied_to_checkout_as' => 'Datei am [date] in den Checkout-Space als \'[filename]\' kopiert.', +'copied_to_checkout_as' => 'Datei am [date] von [username] in den Checkout-Space als \'[filename]\' kopiert.', 'create_download_link' => '', 'create_fulltext_index' => 'Erzeuge Volltext-Index', 'create_fulltext_index_warning' => 'Sie möchten den Volltext-Index neu erzeugen. Dies kann beträchtlich Zeit in Anspruch nehmen und Gesamtleistung Ihres System beeinträchtigen. Bestätigen Sie bitte diese Operation.', @@ -670,6 +671,7 @@ URL: [url]', 'fulltextsearch_disabled' => 'Volltext-Index ist ausgeschaltet', 'fulltext_converters' => 'Index Dokumentenumwandlung', 'fulltext_info' => 'Volltext-Index Info', +'func_proc_open_missing' => 'proc_open wird benötigt, um Dokumente im Volltext zu indizieren. Ohne diese Funktion werden lediglich die Metadaten indiziert.', 'global_attributedefinitiongroups' => 'Attributgruppen', 'global_attributedefinitions' => 'Attribute', 'global_default_keywords' => 'Globale Stichwortlisten', @@ -845,7 +847,9 @@ URL: [url]', 'missing_checksum' => 'Fehlende Check-Summe', 'missing_file' => 'Datei fehlt', 'missing_filesize' => 'Fehlende Dateigröße', +'missing_func_class_note' => 'Anmerkung', 'missing_php_extensions' => 'Fehlende PHP-Erweiterungen', +'missing_php_functions_and_classes' => 'Fehlende PHP-Funktionen und Klassen', 'missing_reception' => 'Fehlende Empfangsbestätigung', 'missing_request_object' => 'Fehlendes Zugriffsobjekte', 'missing_transition_user_group' => 'Fehlende/r Benutzer/Gruppe für Transition', @@ -862,6 +866,11 @@ URL: [url]', 'my_documents' => 'Meine Dokumente', 'my_transmittals' => 'Meine Dokumentenlisten', 'name' => 'Name', +'nav_brand_admin_tools' => 'Administration', +'nav_brand_my_account' => 'Mein Profil', +'nav_brand_my_documents' => 'Meine Dokumente', +'nav_brand_view_document' => 'Dokument', +'nav_brand_view_folder' => 'Ordner', 'nb_NO' => 'Norwegisch', 'needs_correction' => 'Korrektur erforderlich', 'needs_workflow_action' => 'Dieses Dokument erfordert eine Aktion. Bitte schauen Sie auf den Workflow-Reiter.', @@ -1806,6 +1815,7 @@ Name: [username] 'status_approval_rejected' => 'Entwurf abgelehnt', 'status_approved' => 'freigegeben', 'status_approver_removed' => 'Freigebender wurde vom Prozess ausgeschlossen', +'status_change' => 'Statusänderung', 'status_needs_correction' => 'Korrektur erforderlich', 'status_not_approved' => 'keine Freigabe', 'status_not_receipted' => 'Empfang noch nicht bestätigt', @@ -1863,6 +1873,7 @@ Name: [username] 'task_description' => 'Beschreibung', 'task_disabled' => 'Deaktiviert', 'task_frequency' => 'Häufigkeit', +'task_frequency_placeholder' => '', 'task_last_run' => 'Letzte Ausführung', 'task_name' => 'Name', 'task_next_run' => 'Nächste Ausführung', diff --git a/languages/el_GR/lang.inc b/languages/el_GR/lang.inc index acae5f2f2..a0f86b395 100644 --- a/languages/el_GR/lang.inc +++ b/languages/el_GR/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 (359) +// Translators: Admin (360) $text = array( '2_factor_auth' => '', @@ -255,6 +255,7 @@ $text = array( 'choose_workflow' => '', 'choose_workflow_action' => '', 'choose_workflow_state' => '', +'class_finfo_missing' => '', 'class_name' => '', 'clear_cache' => 'Εκκαθάριση στιγμιαίας μνήμης', 'clear_clipboard' => '', @@ -568,6 +569,7 @@ $text = array( 'fulltextsearch_disabled' => '', 'fulltext_converters' => '', 'fulltext_info' => 'Πληροφορίες Κειμένου', +'func_proc_open_missing' => '', 'global_attributedefinitiongroups' => '', 'global_attributedefinitions' => 'Ιδιότητες', 'global_default_keywords' => 'Λέξεις Κλειδιά', @@ -743,7 +745,9 @@ $text = array( 'missing_checksum' => '', 'missing_file' => '', 'missing_filesize' => '', +'missing_func_class_note' => '', 'missing_php_extensions' => '', +'missing_php_functions_and_classes' => '', 'missing_reception' => '', 'missing_request_object' => '', 'missing_transition_user_group' => '', @@ -760,6 +764,11 @@ $text = array( 'my_documents' => 'Τα έγγραφα μου', 'my_transmittals' => 'Οι Διαβιβάσεις μου', 'name' => 'Όνομα', +'nav_brand_admin_tools' => 'Εργαλεία', +'nav_brand_my_account' => '', +'nav_brand_my_documents' => '', +'nav_brand_view_document' => '', +'nav_brand_view_folder' => '', 'nb_NO' => 'Νορβηγικά', 'needs_correction' => '', 'needs_workflow_action' => '', @@ -1597,6 +1606,7 @@ URL: [url]', 'status_approval_rejected' => '', 'status_approved' => '', 'status_approver_removed' => '', +'status_change' => '', 'status_needs_correction' => '', 'status_not_approved' => '', 'status_not_receipted' => '', @@ -1654,6 +1664,7 @@ URL: [url]', 'task_description' => '', 'task_disabled' => '', 'task_frequency' => '', +'task_frequency_placeholder' => '', 'task_last_run' => '', 'task_name' => '', 'task_next_run' => '', diff --git a/languages/en_GB/lang.inc b/languages/en_GB/lang.inc index 184d5532c..787428c1d 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 (1976), archonwang (3), dgrutsch (9), netixw (14) +// Translators: Admin (1990), archonwang (3), dgrutsch (9), netixw (14) $text = array( '2_factor_auth' => '2-factor authentication', @@ -87,7 +87,7 @@ URL: [url]', 'add_workflow_action' => 'Add new workflow action', 'add_workflow_state' => 'Add new workflow state', 'admin' => 'Administrator', -'admin_tools' => 'Admin-Tools', +'admin_tools' => 'Admin tools', 'all' => 'All', 'all_categories' => 'All categories', 'all_documents' => 'All Documents', @@ -284,6 +284,7 @@ URL: [url]', 'choose_workflow' => 'Choose workflow', 'choose_workflow_action' => 'Choose workflow action', 'choose_workflow_state' => 'Choose workflow state', +'class_finfo_missing' => 'The class finfo will be used when files are uploading for determine the mimetype.', 'class_name' => 'Name of class', 'clear_cache' => 'Clear cache', 'clear_clipboard' => 'Clear clipboard', @@ -323,7 +324,7 @@ URL: [url]', 'continue' => 'Continue', 'converter_new_cmd' => 'Command', 'converter_new_mimetype' => 'New mimetype', -'copied_to_checkout_as' => 'File copied to checkout space as \'[filename]\' on [date]', +'copied_to_checkout_as' => 'File copied by [username] to checkout space as \'[filename]\' on [date]', 'create_download_link' => '', 'create_fulltext_index' => 'Create fulltext index', 'create_fulltext_index_warning' => 'You are about to recreate the fulltext index. This can take a considerable amount of time and reduce your overall system performance. If you really want to recreate the index, please confirm your operation.', @@ -670,6 +671,7 @@ URL: [url]', 'fulltextsearch_disabled' => 'Fulltext index is disabled', 'fulltext_converters' => 'Index document conversion', 'fulltext_info' => 'Fulltext index info', +'func_proc_open_missing' => 'proc_open is required for indexing the content of documents. Without this function only the metadata will be indexed.', 'global_attributedefinitiongroups' => 'Attribute groups', 'global_attributedefinitions' => 'Attributes', 'global_default_keywords' => 'Global keywords', @@ -845,7 +847,9 @@ URL: [url]', 'missing_checksum' => 'Missing checksum', 'missing_file' => 'Missing file', 'missing_filesize' => 'Missing filesize', +'missing_func_class_note' => 'Note', 'missing_php_extensions' => 'Missing php extensions', +'missing_php_functions_and_classes' => 'Missing php functions and classes', 'missing_reception' => 'Missing reception', 'missing_request_object' => 'Missing request object', 'missing_transition_user_group' => 'Missing user/group for transition', @@ -862,6 +866,11 @@ URL: [url]', 'my_documents' => 'My Documents', 'my_transmittals' => 'My Transmittals', 'name' => 'Name', +'nav_brand_admin_tools' => 'Admin tools', +'nav_brand_my_account' => 'My Account', +'nav_brand_my_documents' => 'My documents', +'nav_brand_view_document' => 'Document', +'nav_brand_view_folder' => 'Folder', 'nb_NO' => 'Norwegian (Bokmål)', 'needs_correction' => 'Needs correction', 'needs_workflow_action' => 'This document requires your attention. Please check the workflow tab.', @@ -1800,6 +1809,7 @@ Name: [username] 'status_approval_rejected' => 'Draft rejected', 'status_approved' => 'Approved', 'status_approver_removed' => 'Approver removed from process', +'status_change' => 'Status change', 'status_needs_correction' => 'Needs correction', 'status_not_approved' => 'Not approved', 'status_not_receipted' => 'Not receipted yet', @@ -1857,6 +1867,7 @@ Name: [username] 'task_description' => 'Description', 'task_disabled' => 'Disabled', 'task_frequency' => 'Frequency', +'task_frequency_placeholder' => 'm h d m dow', 'task_last_run' => 'Last run', 'task_name' => 'Name', 'task_next_run' => 'Next run', diff --git a/languages/es_ES/lang.inc b/languages/es_ES/lang.inc index 10e506dbe..05183928c 100644 --- a/languages/es_ES/lang.inc +++ b/languages/es_ES/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: acabello (20), Admin (1310), angel (123), francisco (2), jaimem (14) +// Translators: acabello (20), Admin (1315), angel (123), francisco (2), jaimem (14) $text = array( '2_factor_auth' => 'Autenticación de doble factor', @@ -279,6 +279,7 @@ URL: [url]', 'choose_workflow' => 'Seleccione flujo de trabajo', 'choose_workflow_action' => 'Seleccione acción del flujo de trabajo', 'choose_workflow_state' => 'Seleccione estado del flujo de trabajo', +'class_finfo_missing' => '', 'class_name' => '', 'clear_cache' => 'Borrar cache', 'clear_clipboard' => 'Limpiar portapapeles', @@ -568,7 +569,7 @@ Carpeta principal: [folder_path] Usuario: [username] URL: [url]', 'expiry_changed_email_subject' => '[sitename]: [name] - Fecha de caducidad modificada', -'export' => '', +'export' => 'Exportar', 'export_user_list_csv' => '', 'extension_archive' => '', 'extension_changelog' => 'Log de Cambios', @@ -646,6 +647,7 @@ URL: [url]', 'fulltextsearch_disabled' => '', 'fulltext_converters' => 'Conversión de índice de documentos', 'fulltext_info' => 'Información de índice de texto completo', +'func_proc_open_missing' => '', 'global_attributedefinitiongroups' => '', 'global_attributedefinitions' => 'Definición de atributos', 'global_default_keywords' => 'Palabras clave globales', @@ -684,7 +686,7 @@ URL: [url]', 'import_users' => 'Importar usuarios', 'import_users_addnew' => 'Agregar nuevos usuarios', 'import_users_update' => 'Actualizar usuarios existentes', -'include_content' => '', +'include_content' => 'Incluir contenido', 'include_documents' => 'Incluir documentos', 'include_subdirectories' => 'Incluir subcarpetas', 'indexing_tasks_in_queue' => 'Tareas de indexación en cola', @@ -821,7 +823,9 @@ URL: [url]', 'missing_checksum' => 'Falta checksum', 'missing_file' => '', 'missing_filesize' => 'Falta tamaño fichero', +'missing_func_class_note' => '', 'missing_php_extensions' => 'Extensiones PHP ausentes', +'missing_php_functions_and_classes' => '', 'missing_reception' => '', 'missing_request_object' => '', 'missing_transition_user_group' => 'Falta usuario/grupo para transición', @@ -838,6 +842,11 @@ URL: [url]', 'my_documents' => 'Mis documentos', 'my_transmittals' => 'Mi transmision', 'name' => 'Nombre', +'nav_brand_admin_tools' => 'Administración', +'nav_brand_my_account' => 'Mi cuenta', +'nav_brand_my_documents' => '', +'nav_brand_view_document' => '', +'nav_brand_view_folder' => '', 'nb_NO' => 'Noruego (Bokmål)', 'needs_correction' => 'Necesita corrección', 'needs_workflow_action' => 'Este documento requiere su atención. Por favor chequee la pestaña de flujo de trabajo.', @@ -1102,7 +1111,7 @@ URL: [url]', 'review_update_failed' => 'Error actualizando el estado de la revisión. La actualización ha fallado.', 'revise_document' => 'Revisar documento', 'revise_document_on' => '', -'revision' => '', +'revision' => 'Revisión', 'revisions_accepted' => '', 'revisions_accepted_latest' => '', 'revisions_not_touched' => '', @@ -1738,6 +1747,7 @@ URL: [url]', 'status_approval_rejected' => 'Borrador rechazado', 'status_approved' => 'Aprobado', 'status_approver_removed' => 'Aprobador eliminado del proceso', +'status_change' => '', 'status_needs_correction' => '', 'status_not_approved' => 'Sin aprobar', 'status_not_receipted' => 'Aún no asignado destinario', @@ -1795,6 +1805,7 @@ URL: [url]', 'task_description' => '', 'task_disabled' => '', 'task_frequency' => '', +'task_frequency_placeholder' => '', 'task_last_run' => '', 'task_name' => '', 'task_next_run' => '', diff --git a/languages/fr_FR/lang.inc b/languages/fr_FR/lang.inc index 0c43c6509..191a081e8 100644 --- a/languages/fr_FR/lang.inc +++ b/languages/fr_FR/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 (1111), jeromerobert (50), lonnnew (9), Oudiceval (977) +// Translators: Admin (1113), jeromerobert (50), lonnnew (9), Oudiceval (977) $text = array( '2_factor_auth' => 'Authentification forte', @@ -284,6 +284,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_name' => 'Nom de classe', 'clear_cache' => 'Vider le cache', 'clear_clipboard' => 'Vider le presse-papier', @@ -670,6 +671,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' => '', 'global_attributedefinitiongroups' => 'Groupes d’attributs', 'global_attributedefinitions' => 'Définitions d\'attributs', 'global_default_keywords' => 'Mots-clés globaux', @@ -845,7 +847,9 @@ URL: [url]', 'missing_checksum' => 'Checksum manquante', 'missing_file' => 'Fichier manquant', 'missing_filesize' => 'Taille de fichier manquante', +'missing_func_class_note' => '', 'missing_php_extensions' => 'Extensions PHP manquantes', +'missing_php_functions_and_classes' => '', 'missing_reception' => 'Réception manquante', 'missing_request_object' => '', 'missing_transition_user_group' => 'Utilisateur/groupe manquant pour transition', @@ -862,6 +866,11 @@ URL: [url]', 'my_documents' => 'Mes documents', 'my_transmittals' => 'Mes transmissions', 'name' => 'Nom', +'nav_brand_admin_tools' => 'Outils d\'administration', +'nav_brand_my_account' => 'Mon compte', +'nav_brand_my_documents' => '', +'nav_brand_view_document' => '', +'nav_brand_view_folder' => '', 'nb_NO' => 'Norvégien bokmål', 'needs_correction' => 'Nécessite une correction', 'needs_workflow_action' => 'Ce document requiert votre attention. Consultez l\'onglet workflow.', @@ -1798,6 +1807,7 @@ Nom : [username] 'status_approval_rejected' => 'Ébauche rejetée', 'status_approved' => 'Approuvé', 'status_approver_removed' => 'Approbateur retiré du processus', +'status_change' => '', 'status_needs_correction' => 'Nécessite une correction', 'status_not_approved' => 'Non approuvé', 'status_not_receipted' => 'Pas encore réceptionné', @@ -1855,6 +1865,7 @@ Nom : [username] 'task_description' => 'Description', 'task_disabled' => 'Désactivée', 'task_frequency' => 'Fréquence', +'task_frequency_placeholder' => '', 'task_last_run' => 'Dernière exécution', 'task_name' => 'Nom', 'task_next_run' => 'Prochaine exécution', diff --git a/languages/hr_HR/lang.inc b/languages/hr_HR/lang.inc index bccfa8253..e83a31a50 100644 --- a/languages/hr_HR/lang.inc +++ b/languages/hr_HR/lang.inc @@ -284,6 +284,7 @@ Internet poveznica: [url]', 'choose_workflow' => 'Odaberite tok rada', 'choose_workflow_action' => 'Odaberite radnju toka rada', 'choose_workflow_state' => 'Odaberite status toka rada', +'class_finfo_missing' => '', 'class_name' => '', 'clear_cache' => 'Obriši keš', 'clear_clipboard' => 'Očistite međuspremnik', @@ -651,6 +652,7 @@ Internet poveznica: [url]', 'fulltextsearch_disabled' => '', 'fulltext_converters' => 'Pretvorba indeksa dokumenta', 'fulltext_info' => 'Informacije cijelog teksta', +'func_proc_open_missing' => '', 'global_attributedefinitiongroups' => '', 'global_attributedefinitions' => 'Atributi', 'global_default_keywords' => 'Globalne ključne riječi', @@ -826,7 +828,9 @@ Internet poveznica: [url]', 'missing_checksum' => 'Nedostaje kontrolna suma', 'missing_file' => '', 'missing_filesize' => 'Nedostaje veličina datoteke', +'missing_func_class_note' => '', 'missing_php_extensions' => '', +'missing_php_functions_and_classes' => '', 'missing_reception' => '', 'missing_request_object' => '', 'missing_transition_user_group' => 'Nedostaje korisnik/grupa za promjenu', @@ -843,6 +847,11 @@ Internet poveznica: [url]', 'my_documents' => 'Moji dokumenti', 'my_transmittals' => 'Moja proslijeđivanja', 'name' => 'Naziv', +'nav_brand_admin_tools' => '', +'nav_brand_my_account' => '', +'nav_brand_my_documents' => '', +'nav_brand_view_document' => '', +'nav_brand_view_folder' => '', 'nb_NO' => 'Norveški', 'needs_correction' => '', 'needs_workflow_action' => 'Ovaj dokument zahtjeva vašu pažnju. Molimo provjerite karticu toka rada.', @@ -1759,6 +1768,7 @@ Internet poveznica: [url]', 'status_approval_rejected' => 'Skica odbijena', 'status_approved' => 'Odobreno', 'status_approver_removed' => 'Validator uklonjen iz postupka', +'status_change' => '', 'status_needs_correction' => '', 'status_not_approved' => 'Nije odobreno', 'status_not_receipted' => 'Još nije primljeno', @@ -1816,6 +1826,7 @@ Internet poveznica: [url]', 'task_description' => '', 'task_disabled' => '', 'task_frequency' => '', +'task_frequency_placeholder' => '', 'task_last_run' => '', 'task_name' => '', 'task_next_run' => '', diff --git a/languages/hu_HU/lang.inc b/languages/hu_HU/lang.inc index 588ce6b26..033aaf024 100644 --- a/languages/hu_HU/lang.inc +++ b/languages/hu_HU/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 (646), Kalpy (113), ribaz (1036) +// Translators: Admin (648), Kalpy (113), ribaz (1036) $text = array( '2_factor_auth' => 'Kétfaktoros azonosítás', @@ -279,6 +279,7 @@ URL: [url]', 'choose_workflow' => 'Válasszon munkafolyamatot', 'choose_workflow_action' => 'Válasszon munkafolyamat műveletet', 'choose_workflow_state' => 'Válasszon munkafolyamat állapotot', +'class_finfo_missing' => '', 'class_name' => 'Osztály neve', 'clear_cache' => 'Gyorsítótár törlése', 'clear_clipboard' => 'Vágólap törlése', @@ -331,7 +332,7 @@ URL: [url]', 'daily' => 'Napi', 'databasesearch' => 'Adatbázis keresés', 'database_schema_version' => 'Adatbázis séma verziója', -'data_loading' => '', +'data_loading' => 'Kérjük várjon, adatok betöltése folyamatban', 'date' => 'Dátum', 'days' => 'nap', 'debug' => 'Hibakeresés', @@ -646,6 +647,7 @@ URL: [url]', 'fulltextsearch_disabled' => '', 'fulltext_converters' => 'Index dokumentum konverzió', 'fulltext_info' => 'Teljes szöveg index információ', +'func_proc_open_missing' => '', 'global_attributedefinitiongroups' => '', 'global_attributedefinitions' => 'Jellemzők', 'global_default_keywords' => 'Globális kulcsszavak', @@ -821,7 +823,9 @@ URL: [url]', 'missing_checksum' => 'Hiányzó ellenőrzőösszeg', 'missing_file' => 'hiányzó állomány', 'missing_filesize' => 'Hiányzó állomány méret', +'missing_func_class_note' => '', 'missing_php_extensions' => '', +'missing_php_functions_and_classes' => '', 'missing_reception' => '', 'missing_request_object' => '', 'missing_transition_user_group' => 'Hiányzó felhasználó/csoport az átvezetéshez', @@ -836,8 +840,13 @@ URL: [url]', 'move_folder' => 'Könyvtár áthelyezése', 'my_account' => 'Saját hozzáférés', 'my_documents' => 'Saját dokumentumok', -'my_transmittals' => '', +'my_transmittals' => 'Átviteleim', 'name' => 'Név', +'nav_brand_admin_tools' => '', +'nav_brand_my_account' => '', +'nav_brand_my_documents' => '', +'nav_brand_view_document' => '', +'nav_brand_view_folder' => '', 'nb_NO' => 'Norvég', 'needs_correction' => '', 'needs_workflow_action' => 'Ez a dokumentum az Ön beavatkozására vár. Ellenőrizze a munkafolyamat fület.', @@ -1737,6 +1746,7 @@ URL: [url]', 'status_approval_rejected' => 'Piszkozat elutasítva', 'status_approved' => 'Jóváhagyott', 'status_approver_removed' => 'Jóváhagyó eltávolítva a folyamatból', +'status_change' => '', 'status_needs_correction' => '', 'status_not_approved' => 'Nem jóváhagyott', 'status_not_receipted' => '', @@ -1794,6 +1804,7 @@ URL: [url]', 'task_description' => '', 'task_disabled' => '', 'task_frequency' => '', +'task_frequency_placeholder' => '', 'task_last_run' => '', 'task_name' => '', 'task_next_run' => '', diff --git a/languages/it_IT/lang.inc b/languages/it_IT/lang.inc index cbbb8cc62..855f345c7 100644 --- a/languages/it_IT/lang.inc +++ b/languages/it_IT/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 (2054), rickr (144), s.pnt (26) +// Translators: Admin (2055), rickr (144), s.pnt (26) $text = array( '2_factor_auth' => 'Autorizzazione a due fattori', @@ -284,6 +284,7 @@ URL: [url]', 'choose_workflow' => 'Seleziona il flusso di lavoro', 'choose_workflow_action' => 'Seleziona l\'azione del flusso di lavoro', 'choose_workflow_state' => 'Seleziona lo stato del flusso di lavoro', +'class_finfo_missing' => '', 'class_name' => 'Nome della classe', 'clear_cache' => 'Pulisci cache', 'clear_clipboard' => 'Cancella appunti', @@ -656,6 +657,7 @@ URL: [url]', 'fulltextsearch_disabled' => 'Ricerca Fulltext disabilitata', 'fulltext_converters' => 'Indice di conversione documenti', 'fulltext_info' => 'Info indice Fulltext', +'func_proc_open_missing' => '', 'global_attributedefinitiongroups' => 'Attributo gruppi', 'global_attributedefinitions' => 'Definizione attributi', 'global_default_keywords' => 'Parole-chiave globali', @@ -831,7 +833,9 @@ URL: [url]', 'missing_checksum' => 'Checksum mancante', 'missing_file' => 'File mancante', 'missing_filesize' => 'Dimensione mancante', +'missing_func_class_note' => '', 'missing_php_extensions' => 'Estensioni php mancanti', +'missing_php_functions_and_classes' => '', 'missing_reception' => 'Ricezione mancante', 'missing_request_object' => 'Manca oggetto di richiesta', 'missing_transition_user_group' => 'Utente/Gruppo per la transizione mancanti', @@ -848,6 +852,11 @@ URL: [url]', 'my_documents' => 'Documenti personali', 'my_transmittals' => 'Mie trasmissioni', 'name' => 'Nome', +'nav_brand_admin_tools' => '', +'nav_brand_my_account' => '', +'nav_brand_my_documents' => '', +'nav_brand_view_document' => '', +'nav_brand_view_folder' => '', 'nb_NO' => 'Norvegiese (Bokmål)', 'needs_correction' => 'Necessita correzioni', 'needs_workflow_action' => 'Il documento richiede attenzione. Prego controllare il flusso di lavoro.', @@ -1786,6 +1795,7 @@ Name: [username] 'status_approval_rejected' => 'Bozza rifiutata', 'status_approved' => 'Approvato', 'status_approver_removed' => 'Approvatore rimosso dal processo', +'status_change' => 'Cambio stato', 'status_needs_correction' => 'Necessita correzioni', 'status_not_approved' => 'Non ancora approvato', 'status_not_receipted' => 'Non ancora ricevuto', @@ -1843,6 +1853,7 @@ Name: [username] 'task_description' => 'Descrizione', 'task_disabled' => 'Disabilitata', 'task_frequency' => 'Frequenza', +'task_frequency_placeholder' => '', 'task_last_run' => 'Ultima esecuzione', 'task_name' => 'Nome', 'task_next_run' => 'Prossima esecuzione', diff --git a/languages/ko_KR/lang.inc b/languages/ko_KR/lang.inc index 5637c4ad4..cad922e60 100644 --- a/languages/ko_KR/lang.inc +++ b/languages/ko_KR/lang.inc @@ -286,6 +286,7 @@ URL: [url]', 'choose_workflow' => '워크플로우 선택', 'choose_workflow_action' => '워크플로우 작업 선택', 'choose_workflow_state' => '워크플로우 상태 선택', +'class_finfo_missing' => '', 'class_name' => '', 'clear_cache' => '캐시 비우기', 'clear_clipboard' => '클립 보드 제거', @@ -652,6 +653,7 @@ URL: [url]', 'fulltextsearch_disabled' => '', 'fulltext_converters' => '인덱스 문서 변환', 'fulltext_info' => '전체 텍스트 색인 정보', +'func_proc_open_missing' => '', 'global_attributedefinitiongroups' => '', 'global_attributedefinitions' => '속성', 'global_default_keywords' => '글로벌 키워드', @@ -827,7 +829,9 @@ URL: [url]', 'missing_checksum' => '검사 누락', 'missing_file' => '누락 된 파일', 'missing_filesize' => '누락 된 파일 크기', +'missing_func_class_note' => '', 'missing_php_extensions' => '', +'missing_php_functions_and_classes' => '', 'missing_reception' => '', 'missing_request_object' => '', 'missing_transition_user_group' => '변화에 대한 사용자 / 그룹을 누락', @@ -844,6 +848,11 @@ URL: [url]', 'my_documents' => '내 문서', 'my_transmittals' => '내 송부', 'name' => '이름', +'nav_brand_admin_tools' => '', +'nav_brand_my_account' => '', +'nav_brand_my_documents' => '', +'nav_brand_view_document' => '', +'nav_brand_view_folder' => '', 'nb_NO' => '', 'needs_correction' => '', 'needs_workflow_action' => '이 문서는 당신의주의가 필요합니다. 워크플로우 탭을 확인하시기 바랍니다.', @@ -1753,6 +1762,7 @@ URL : [url]', 'status_approval_rejected' => '거부된 초안', 'status_approved' => '승인', 'status_approver_removed' => '승인 과정에서 제거', +'status_change' => '', 'status_needs_correction' => '', 'status_not_approved' => '승인되지 않음​​', 'status_not_receipted' => '아직 접수 않된', @@ -1810,6 +1820,7 @@ URL : [url]', 'task_description' => '', 'task_disabled' => '', 'task_frequency' => '', +'task_frequency_placeholder' => '', 'task_last_run' => '', 'task_name' => '', 'task_next_run' => '', diff --git a/languages/lo_LA/lang.inc b/languages/lo_LA/lang.inc index 1ccc81720..41fd5cf89 100644 --- a/languages/lo_LA/lang.inc +++ b/languages/lo_LA/lang.inc @@ -282,6 +282,7 @@ URL: [url]', 'choose_workflow' => 'ເລືອກເວີກໂຟລ', 'choose_workflow_action' => 'ເລືອກການເຮັດວຽກຂອງເວີກໂຟລ', 'choose_workflow_state' => 'ເລືອກສະຖານະຂອງເວີກໂຟລ', +'class_finfo_missing' => '', 'class_name' => 'ຊື່ຊັ້ນຮຽນ', 'clear_cache' => 'ລ້າງແຄຣ', 'clear_clipboard' => 'ລ້າງຄິບບອສ', @@ -649,6 +650,7 @@ URL: [url]', 'fulltextsearch_disabled' => 'ສາລະບານຂໍ້ຄວາມໄດ້ຖືກປິດໄຊ້ງານ', 'fulltext_converters' => '', 'fulltext_info' => 'ສາລະບານຂໍ້ຄວາມແບບເຕັມຮູບແບບ', +'func_proc_open_missing' => '', 'global_attributedefinitiongroups' => 'ກຸ່ມແອັດທີບິວ', 'global_attributedefinitions' => 'ແອັດທີບິວ', 'global_default_keywords' => 'ຄຳຫຼັກທົ່ວໂລກ', @@ -824,7 +826,9 @@ URL: [url]', 'missing_checksum' => 'ບໍ່ມີການກວດສອບ', 'missing_file' => 'ບໍ່ມີຟາຍ', 'missing_filesize' => 'ບໍ່ມີຂະໜາດໄຟລ', +'missing_func_class_note' => '', 'missing_php_extensions' => '', +'missing_php_functions_and_classes' => '', 'missing_reception' => 'ຂາດການຕອນຮັບ', 'missing_request_object' => 'ການສະເໜີຄຳຂໍໄດ້ຫາຍໄປ', 'missing_transition_user_group' => 'ບໍ່ມີຜູ້ໄຊ້/ ກຸ່ມສຳລັບການປ່ຽນແປງ', @@ -841,6 +845,11 @@ URL: [url]', 'my_documents' => 'ເອກະສານຂອງຂ້ອຍ', 'my_transmittals' => 'ການຂົນສົ່ງຂອງຂ້ອຍ', 'name' => 'ຊື່', +'nav_brand_admin_tools' => '', +'nav_brand_my_account' => '', +'nav_brand_my_documents' => '', +'nav_brand_view_document' => '', +'nav_brand_view_folder' => '', 'nb_NO' => '', 'needs_correction' => '', 'needs_workflow_action' => 'ກະລຸນາກວດສອບແທັບເວີກໂຟລ,ເອກະສານນີ້ຕ້ອງໃຫ້ຄວາມລະອຽດແລະເອົາໃຈໄສ່', @@ -1779,6 +1788,7 @@ URL: [url]', 'status_approval_rejected' => 'ຮ່າງຖືກປະຕິເສດ', 'status_approved' => 'ໄດ້ຮັບການອະນຸມັດ', 'status_approver_removed' => 'ຜູ້ອະນຸມັດນຳອອກຈາກກະບວນການ', +'status_change' => '', 'status_needs_correction' => '', 'status_not_approved' => 'ບໍ່ອະນຸມັດ', 'status_not_receipted' => 'ຍັງບໍ່ໄດ້ຮັບເທື່ອ', @@ -1836,6 +1846,7 @@ URL: [url]', 'task_description' => '', 'task_disabled' => '', 'task_frequency' => '', +'task_frequency_placeholder' => '', 'task_last_run' => '', 'task_name' => '', 'task_next_run' => '', diff --git a/languages/nb_NO/lang.inc b/languages/nb_NO/lang.inc index dc800dffe..38b7e68b2 100644 --- a/languages/nb_NO/lang.inc +++ b/languages/nb_NO/lang.inc @@ -284,6 +284,7 @@ URL: [url]', 'choose_workflow' => 'Velg arbeidsflyt', 'choose_workflow_action' => 'Velg arbeidsflythandling', 'choose_workflow_state' => 'Velg arbeidsflyttilstand', +'class_finfo_missing' => '', 'class_name' => 'Navn på klasse', 'clear_cache' => 'Tøm cache', 'clear_clipboard' => 'Tøm utklippstavle', @@ -670,6 +671,7 @@ URL: [url]', 'fulltextsearch_disabled' => 'Indeksering for fulltekstsøkning er deaktivert', 'fulltext_converters' => 'Indeks dokument konvertering', 'fulltext_info' => 'Fulltekst indeksinfo', +'func_proc_open_missing' => '', 'global_attributedefinitiongroups' => 'Egenskapsgrupper', 'global_attributedefinitions' => 'Egenskaper', 'global_default_keywords' => 'Globale søkeord', @@ -845,7 +847,9 @@ URL: [url]', 'missing_checksum' => 'Mangler sjekksum', 'missing_file' => 'Mangler fil', 'missing_filesize' => 'Mangler filstørrelse', +'missing_func_class_note' => '', 'missing_php_extensions' => '', +'missing_php_functions_and_classes' => '', 'missing_reception' => 'Mangler mottager', 'missing_request_object' => 'Mangler forespørsels-objekt', 'missing_transition_user_group' => 'Mangler bruker / gruppe for overgang', @@ -862,6 +866,11 @@ URL: [url]', 'my_documents' => 'Mine dokumenter', 'my_transmittals' => 'Mine sendinger', 'name' => 'Navn', +'nav_brand_admin_tools' => '', +'nav_brand_my_account' => '', +'nav_brand_my_documents' => '', +'nav_brand_view_document' => '', +'nav_brand_view_folder' => '', 'nb_NO' => 'Norsk (Bokmål)', 'needs_correction' => 'Trenger korrigering', 'needs_workflow_action' => 'Dette dokumentet krever oppmerksomhet. Kontroller arbeidsflytfanen.', @@ -1792,6 +1801,7 @@ Bruker: [username] 'status_approval_rejected' => 'Utkast forkastet', 'status_approved' => 'Godkjent', 'status_approver_removed' => 'Godkjenner fjernet fra prosessen', +'status_change' => '', 'status_needs_correction' => 'Trenger korrigering', 'status_not_approved' => 'Ikke godkjent', 'status_not_receipted' => 'Ikke mottatt ennå', @@ -1849,6 +1859,7 @@ Bruker: [username] 'task_description' => 'Beskrivelse', 'task_disabled' => 'Deaktivert', 'task_frequency' => 'Frekvens', +'task_frequency_placeholder' => '', 'task_last_run' => 'Siste kjøring', 'task_name' => 'Navn', 'task_next_run' => 'Neste kjøring', diff --git a/languages/nl_NL/lang.inc b/languages/nl_NL/lang.inc index 5a7df7e30..cc635ee8e 100644 --- a/languages/nl_NL/lang.inc +++ b/languages/nl_NL/lang.inc @@ -277,6 +277,7 @@ URL: [url]', 'choose_workflow' => 'Kies workflow', 'choose_workflow_action' => 'Kies workflow actie', 'choose_workflow_state' => 'kiest workflowstatus', +'class_finfo_missing' => '', 'class_name' => 'naam vd Klasse', 'clear_cache' => 'Cache leegmaken', 'clear_clipboard' => 'Vrijgeven klembord', @@ -663,6 +664,7 @@ URL: [url]', 'fulltextsearch_disabled' => 'Fulltext search uitgeschakeld', 'fulltext_converters' => 'Conversie t.b.v. indexering fulltext search', 'fulltext_info' => 'Inhoud van de fulltext index', +'func_proc_open_missing' => '', 'global_attributedefinitiongroups' => 'Attribuut-definities in groepen', 'global_attributedefinitions' => 'attribuutdefinities', 'global_default_keywords' => 'Algemene sleutelwoorden', @@ -838,7 +840,9 @@ URL: [url]', 'missing_checksum' => 'Controlesom ontbreekt', 'missing_file' => 'File ontbreekt', 'missing_filesize' => 'Bestandsgrootte ontbreekt', +'missing_func_class_note' => '', 'missing_php_extensions' => 'Ontbrekende PHP-extensies', +'missing_php_functions_and_classes' => '', 'missing_reception' => 'Ontvanger ontbreekt', 'missing_request_object' => 'Gevraagd object ontbreekt', 'missing_transition_user_group' => 'Gebruiker / groep ontbreekt voor de overdracht', @@ -855,6 +859,11 @@ URL: [url]', 'my_documents' => 'Mijn Documenten', 'my_transmittals' => 'Mijn zendingen', 'name' => 'Naam', +'nav_brand_admin_tools' => '', +'nav_brand_my_account' => '', +'nav_brand_my_documents' => '', +'nav_brand_view_document' => '', +'nav_brand_view_folder' => '', 'nb_NO' => 'Noors', 'needs_correction' => 'Correctie nodig', 'needs_workflow_action' => 'Dit document vereist uw aandacht. Bekijk het onder het tabblad workflows.', @@ -1791,6 +1800,7 @@ Name: [username] 'status_approval_rejected' => 'Klad Goedkeuring [Afgewezen]', 'status_approved' => 'Goedgekeurd', 'status_approver_removed' => 'Goedkeurder verwijderd', +'status_change' => '', 'status_needs_correction' => 'Correctie nodig', 'status_not_approved' => 'niet goedgekeurd', 'status_not_receipted' => 'niet ontvangen', @@ -1848,6 +1858,7 @@ Name: [username] 'task_description' => 'Omschrijving', 'task_disabled' => 'Inactief', 'task_frequency' => 'Frequentie', +'task_frequency_placeholder' => '', 'task_last_run' => 'Laatst uitgevoerd', 'task_name' => 'Naam', 'task_next_run' => 'Komende uitvoering', diff --git a/languages/pl_PL/lang.inc b/languages/pl_PL/lang.inc index 36e13fef1..266990f5e 100644 --- a/languages/pl_PL/lang.inc +++ b/languages/pl_PL/lang.inc @@ -272,6 +272,7 @@ URL: [url]', 'choose_workflow' => 'Wybierz proces', 'choose_workflow_action' => 'Wybierz działanie procesu', 'choose_workflow_state' => 'Wybierz stan obiegu', +'class_finfo_missing' => '', 'class_name' => 'Nazwa klasy', 'clear_cache' => 'Wyczyść cache', 'clear_clipboard' => 'Oczyść schowek', @@ -639,6 +640,7 @@ URL: [url]', 'fulltextsearch_disabled' => 'Indeks pełnotekstowy jest wyłączony', 'fulltext_converters' => 'Konwersja indeksu dokumentów', 'fulltext_info' => 'Informacje o indeksie pełnotekstowym', +'func_proc_open_missing' => '', 'global_attributedefinitiongroups' => 'Grupy atrybutów', 'global_attributedefinitions' => 'Definicje atrybutów', 'global_default_keywords' => 'Globalne słowa kluczowe', @@ -814,7 +816,9 @@ URL: [url]', 'missing_checksum' => 'Brak sumy kontrolnej', 'missing_file' => 'Brakujący plik', 'missing_filesize' => 'Brakujący rozmiar pliku', +'missing_func_class_note' => '', 'missing_php_extensions' => '', +'missing_php_functions_and_classes' => '', 'missing_reception' => 'Brakuje odbioru', 'missing_request_object' => 'Brak obiektu żądania', 'missing_transition_user_group' => 'Brak użytkownika / grupy dla przejścia', @@ -831,6 +835,11 @@ URL: [url]', 'my_documents' => 'Moje dokumenty', 'my_transmittals' => 'Moi recenzenci', 'name' => 'Nazwa', +'nav_brand_admin_tools' => '', +'nav_brand_my_account' => '', +'nav_brand_my_documents' => '', +'nav_brand_view_document' => '', +'nav_brand_view_folder' => '', 'nb_NO' => 'Norweski', 'needs_correction' => 'Wymaga korekty', 'needs_workflow_action' => 'Dokument wymaga uwagi. Proszę sprawdzić kartę workflow.', @@ -1722,6 +1731,7 @@ Name: [username] 'status_approval_rejected' => 'Szkic odrzucony', 'status_approved' => 'Zatwierdzone', 'status_approver_removed' => 'Osoba zatwierdzająca usunięta z procesu', +'status_change' => '', 'status_needs_correction' => 'Wymaga korekty', 'status_not_approved' => 'Nie zatwierdzone', 'status_not_receipted' => 'Jeszcze nie otrzymane', @@ -1779,6 +1789,7 @@ Name: [username] 'task_description' => 'Opis zadania', 'task_disabled' => 'Zadanie wyłączone', 'task_frequency' => 'Częstotliwość zadania', +'task_frequency_placeholder' => '', 'task_last_run' => 'Ostatnie uruchomienie zadania', 'task_name' => 'Nazwa zadania', 'task_next_run' => 'Zadanie następnego uruchomienia', diff --git a/languages/pt_BR/lang.inc b/languages/pt_BR/lang.inc index 4a0cad204..c371fbd03 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 (1846), flaviove (627), lfcristofoli (352) +// Translators: Admin (1847), flaviove (627), lfcristofoli (352) $text = array( '2_factor_auth' => 'Autenticação de dois fatores', @@ -284,6 +284,7 @@ URL: [url]', 'choose_workflow' => 'Escolha de fluxo de trabalho', 'choose_workflow_action' => 'Escolha a ação de fluxo de trabalho', 'choose_workflow_state' => 'Escolha um estado de fluxo de trabalho', +'class_finfo_missing' => '', 'class_name' => 'Nome da classe', 'clear_cache' => 'Limpar o Cache', 'clear_clipboard' => 'Limpar área de transferência', @@ -670,6 +671,7 @@ URL: [url]', 'fulltextsearch_disabled' => 'O índice de texto completo está desativado', 'fulltext_converters' => 'Índice de conversão de documentos', 'fulltext_info' => 'Informações índice Texto completo', +'func_proc_open_missing' => '', 'global_attributedefinitiongroups' => 'Grupos de atributos', 'global_attributedefinitions' => 'Atributos', 'global_default_keywords' => 'palavras-chave globais', @@ -845,7 +847,9 @@ URL: [url]', 'missing_checksum' => 'Falta verificação de checksum', 'missing_file' => 'Falta o arquivo', 'missing_filesize' => 'Falta tamanho do arquivo', +'missing_func_class_note' => '', 'missing_php_extensions' => '', +'missing_php_functions_and_classes' => '', 'missing_reception' => 'Falta o recebimento', 'missing_request_object' => 'Objeto de solicitação ausente', 'missing_transition_user_group' => 'Falta usuário/grupo para transição', @@ -862,6 +866,11 @@ URL: [url]', 'my_documents' => 'Meus Documentos', 'my_transmittals' => 'Minhas Transmissões', 'name' => 'Nome', +'nav_brand_admin_tools' => '', +'nav_brand_my_account' => '', +'nav_brand_my_documents' => '', +'nav_brand_view_document' => '', +'nav_brand_view_folder' => '', 'nb_NO' => 'Norueguês', 'needs_correction' => 'Precisa de correção', 'needs_workflow_action' => 'Este documento requer sua atenção. Por favor, verifique a guia de fluxo de trabalho.', @@ -1798,6 +1807,7 @@ Nome: [username] 'status_approval_rejected' => 'Rascunho rejeitado', 'status_approved' => 'Aprovado', 'status_approver_removed' => 'Aprovador removido do processo', +'status_change' => '', 'status_needs_correction' => 'Precisa de correção', 'status_not_approved' => 'Não aprovado', 'status_not_receipted' => 'Ainda não recebido', @@ -1855,6 +1865,7 @@ Nome: [username] 'task_description' => 'Descrição', 'task_disabled' => 'Desativado', 'task_frequency' => 'Frequência', +'task_frequency_placeholder' => '', 'task_last_run' => 'Última execução', 'task_name' => 'Nome', 'task_next_run' => 'Próxima execução', @@ -1992,7 +2003,7 @@ URL: [url]', 'version_deleted_email_subject' => '[sitename]: [name] - Versão eliminada', 'version_info' => 'Informações da versão', 'view' => 'Visualizar', -'view_document' => '', +'view_document' => 'Ver detalhes do documento', 'view_folder' => '', 'view_online' => 'Ver online', 'warning' => 'Aviso', diff --git a/languages/ro_RO/lang.inc b/languages/ro_RO/lang.inc index 1afc38c9f..7fd0d689b 100644 --- a/languages/ro_RO/lang.inc +++ b/languages/ro_RO/lang.inc @@ -284,6 +284,7 @@ URL: [url]', 'choose_workflow' => 'Alege workflow', 'choose_workflow_action' => 'Alege acțiune workflow', 'choose_workflow_state' => 'Alege stare workflow', +'class_finfo_missing' => '', 'class_name' => '', 'clear_cache' => 'Sterge cache', 'clear_clipboard' => 'Goleste clipboard', @@ -651,6 +652,7 @@ URL: [url]', 'fulltextsearch_disabled' => '', 'fulltext_converters' => 'Indexare conversie documente', 'fulltext_info' => 'Info indexarea intregului text', +'func_proc_open_missing' => '', 'global_attributedefinitiongroups' => '', 'global_attributedefinitions' => 'Atribute', 'global_default_keywords' => 'Cuvinte cheie globale', @@ -826,7 +828,9 @@ URL: [url]', 'missing_checksum' => 'Lipsește suma de control(checksum)', 'missing_file' => '', 'missing_filesize' => 'Lipsește dimensiunea fișierului', +'missing_func_class_note' => '', 'missing_php_extensions' => '', +'missing_php_functions_and_classes' => '', 'missing_reception' => '', 'missing_request_object' => '', 'missing_transition_user_group' => 'Lipsește utilizatorul/grupul pentru tranziție', @@ -843,6 +847,11 @@ URL: [url]', 'my_documents' => 'Documentele Mele', 'my_transmittals' => 'Trimiterile mele', 'name' => 'Nume', +'nav_brand_admin_tools' => '', +'nav_brand_my_account' => '', +'nav_brand_my_documents' => '', +'nav_brand_view_document' => '', +'nav_brand_view_folder' => '', 'nb_NO' => 'Norvegiana', 'needs_correction' => '', 'needs_workflow_action' => 'Acest document necesită atenția dumneavoastră. Vă rugăm să verificați tab-ul workflow.', @@ -1760,6 +1769,7 @@ URL: [url]', 'status_approval_rejected' => 'Proiect respins', 'status_approved' => 'Aprobat', 'status_approver_removed' => 'Aprobator eliminat din proces', +'status_change' => '', 'status_needs_correction' => '', 'status_not_approved' => 'Neaprobat', 'status_not_receipted' => 'Neprimit inca', @@ -1817,6 +1827,7 @@ URL: [url]', 'task_description' => '', 'task_disabled' => '', 'task_frequency' => '', +'task_frequency_placeholder' => '', 'task_last_run' => '', 'task_name' => '', 'task_next_run' => '', diff --git a/languages/ru_RU/lang.inc b/languages/ru_RU/lang.inc index ae16c7a54..d6a09310f 100644 --- a/languages/ru_RU/lang.inc +++ b/languages/ru_RU/lang.inc @@ -284,6 +284,7 @@ URL: [url]', 'choose_workflow' => 'Выберите процесс', 'choose_workflow_action' => 'Выберите действие процесса', 'choose_workflow_state' => 'Выберите статус процесса', +'class_finfo_missing' => '', 'class_name' => 'Имя класса', 'clear_cache' => 'Очистить кэш', 'clear_clipboard' => 'Очистить буфер обмена', @@ -651,6 +652,7 @@ URL: [url]', 'fulltextsearch_disabled' => '', 'fulltext_converters' => 'Индексирование документов', 'fulltext_info' => 'Информация о полнотекстовом индексе', +'func_proc_open_missing' => '', 'global_attributedefinitiongroups' => 'Глобальные группы атрибутов', 'global_attributedefinitions' => 'Атрибуты', 'global_default_keywords' => 'Глобальные метки', @@ -826,7 +828,9 @@ URL: [url]', 'missing_checksum' => 'Отсутствует контрольная сумма', 'missing_file' => 'Отсутствует файл', 'missing_filesize' => 'Отсутствует размер файла', +'missing_func_class_note' => '', 'missing_php_extensions' => '', +'missing_php_functions_and_classes' => '', 'missing_reception' => '', 'missing_request_object' => '', 'missing_transition_user_group' => 'Отсутствует пользователь/группа для изменения.', @@ -843,6 +847,11 @@ URL: [url]', 'my_documents' => 'Мои документы', 'my_transmittals' => 'Мои пересылки', 'name' => 'Имя', +'nav_brand_admin_tools' => '', +'nav_brand_my_account' => '', +'nav_brand_my_documents' => '', +'nav_brand_view_document' => '', +'nav_brand_view_folder' => '', 'nb_NO' => 'Норвежский', 'needs_correction' => 'Нужны правки', 'needs_workflow_action' => 'Этот документ требует вашего внимания. См. вкладку «Процесс».', @@ -1767,6 +1776,7 @@ URL: [url]', 'status_approval_rejected' => 'Черновик отклонён', 'status_approved' => 'Утверждён', 'status_approver_removed' => 'Утверждающий удалён из процесса', +'status_change' => '', 'status_needs_correction' => '', 'status_not_approved' => 'Не утверждён', 'status_not_receipted' => 'Получение не подтверждено', @@ -1824,6 +1834,7 @@ URL: [url]', 'task_description' => '', 'task_disabled' => '', 'task_frequency' => '', +'task_frequency_placeholder' => '', 'task_last_run' => '', 'task_name' => '', 'task_next_run' => '', diff --git a/languages/sk_SK/lang.inc b/languages/sk_SK/lang.inc index db2bc48fd..16ed9836a 100644 --- a/languages/sk_SK/lang.inc +++ b/languages/sk_SK/lang.inc @@ -284,6 +284,7 @@ URL: [url]', 'choose_workflow' => 'Vyprať pracovný postup', 'choose_workflow_action' => 'Vybrať akciu pracovného postupu', 'choose_workflow_state' => 'Vybrať stav pracovného postupu', +'class_finfo_missing' => '', 'class_name' => 'Názov triedy', 'clear_cache' => 'Vyčistiť pamäť cache', 'clear_clipboard' => 'Vymazať schránku', @@ -670,6 +671,7 @@ URL: [url]', 'fulltextsearch_disabled' => 'Fulltext index je zakázaný', 'fulltext_converters' => 'Index document conversion', 'fulltext_info' => 'Informácie o fulltext indexe', +'func_proc_open_missing' => '', 'global_attributedefinitiongroups' => 'Skupiny atribútov', 'global_attributedefinitions' => 'Atribúty', 'global_default_keywords' => 'Globálne kľúčové slová', @@ -845,7 +847,9 @@ URL: [url]', 'missing_checksum' => 'Chýba kontrolný súčet', 'missing_file' => 'Chýba súbor', 'missing_filesize' => 'Chýba veľkosť súboru', +'missing_func_class_note' => '', 'missing_php_extensions' => '', +'missing_php_functions_and_classes' => '', 'missing_reception' => 'Missing reception', 'missing_request_object' => 'Chýba požadovaný objekt', 'missing_transition_user_group' => 'Chýba používateľ/skupina pre prenos', @@ -862,6 +866,11 @@ URL: [url]', 'my_documents' => 'Moje dokumenty', 'my_transmittals' => 'My Transmittals', 'name' => 'Meno', +'nav_brand_admin_tools' => '', +'nav_brand_my_account' => '', +'nav_brand_my_documents' => '', +'nav_brand_view_document' => '', +'nav_brand_view_folder' => '', 'nb_NO' => 'Nórčina (Bokmål)', 'needs_correction' => 'Vyžaduje opravu', 'needs_workflow_action' => 'Tento dokument si vyžaduje vašu pozornosť. Skontrolujte kartu pracovného postupu.', @@ -1800,6 +1809,7 @@ Meno: [username] 'status_approval_rejected' => 'Návrh zamietnutý', 'status_approved' => 'Schválený', 'status_approver_removed' => 'Schvaľovateľ odstránený z procesu', +'status_change' => '', 'status_needs_correction' => 'Vyžaduje opravu', 'status_not_approved' => 'Neschválený', 'status_not_receipted' => 'Zatiaľ neprijatý', @@ -1857,6 +1867,7 @@ Meno: [username] 'task_description' => 'Description', 'task_disabled' => 'Disabled', 'task_frequency' => 'Frequency', +'task_frequency_placeholder' => '', 'task_last_run' => 'Last run', 'task_name' => 'Name', 'task_next_run' => 'Next run', diff --git a/languages/sv_SE/lang.inc b/languages/sv_SE/lang.inc index b7515ee84..50b4ff66d 100644 --- a/languages/sv_SE/lang.inc +++ b/languages/sv_SE/lang.inc @@ -285,6 +285,7 @@ URL: [url]', 'choose_workflow' => 'Välj arbetsflöde', 'choose_workflow_action' => 'Välj åtgärd för arbetsflödet', 'choose_workflow_state' => 'Välj status för arbetsflödet', +'class_finfo_missing' => '', 'class_name' => 'Klassnamn', 'clear_cache' => 'Rensa cache', 'clear_clipboard' => 'Rensa urklipp', @@ -657,6 +658,7 @@ URL: [url]', 'fulltextsearch_disabled' => 'Indexering för fulltextsökning är inaktiverad', 'fulltext_converters' => 'Omvandling av dokumentindexering', 'fulltext_info' => 'Fulltext-indexinfo', +'func_proc_open_missing' => '', 'global_attributedefinitiongroups' => 'Attributgrupper', 'global_attributedefinitions' => 'Attributdefinitioner', 'global_default_keywords' => 'Globala nyckelord', @@ -832,7 +834,9 @@ URL: [url]', 'missing_checksum' => 'Checksumma saknas', 'missing_file' => 'Fil saknas', 'missing_filesize' => 'Filstorlek saknas', +'missing_func_class_note' => '', 'missing_php_extensions' => '', +'missing_php_functions_and_classes' => '', 'missing_reception' => 'Mottagande saknas', 'missing_request_object' => 'Begärt objekt saknas', 'missing_transition_user_group' => 'Användare/grupp saknas för övergång', @@ -849,6 +853,11 @@ URL: [url]', 'my_documents' => 'Mina dokument', 'my_transmittals' => 'Mina överföringar', 'name' => 'Namn', +'nav_brand_admin_tools' => '', +'nav_brand_my_account' => '', +'nav_brand_my_documents' => '', +'nav_brand_view_document' => '', +'nav_brand_view_folder' => '', 'nb_NO' => 'Norska (Bokmål)', 'needs_correction' => '', 'needs_workflow_action' => 'Detta dokument behöver din uppmärksamhet. Kontrollera inställningarna för arbetsflödet.', @@ -1773,6 +1782,7 @@ Kommentar: [comment]', 'status_approval_rejected' => 'Utkast avvisat', 'status_approved' => 'Godkänt', 'status_approver_removed' => 'Godkännare har tagits bort från processen', +'status_change' => '', 'status_needs_correction' => '', 'status_not_approved' => 'Ej godkänt', 'status_not_receipted' => 'Ej mottaget ännu', @@ -1830,6 +1840,7 @@ Kommentar: [comment]', 'task_description' => '', 'task_disabled' => '', 'task_frequency' => '', +'task_frequency_placeholder' => '', 'task_last_run' => '', 'task_name' => '', 'task_next_run' => '', diff --git a/languages/tr_TR/lang.inc b/languages/tr_TR/lang.inc index 463b5b873..1796e6c3a 100644 --- a/languages/tr_TR/lang.inc +++ b/languages/tr_TR/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 (1125), aydin (83) +// Translators: Admin (1129), aydin (83) $text = array( '2_factor_auth' => 'İki faktörlü yetkilendirme', @@ -171,7 +171,7 @@ URL: [url]', 'attrdef_type_boolean' => 'Mantık', 'attrdef_type_date' => 'Tarih', 'attrdef_type_document' => '', -'attrdef_type_email' => '', +'attrdef_type_email' => 'Eposta', 'attrdef_type_float' => '', 'attrdef_type_folder' => '', 'attrdef_type_group' => '', @@ -278,6 +278,7 @@ URL: [url]', 'choose_workflow' => 'İş akışı seçiniz', 'choose_workflow_action' => 'İş akış eylemi seçiniz', 'choose_workflow_state' => 'İş akış durumunu seçiniz', +'class_finfo_missing' => '', 'class_name' => '', 'clear_cache' => 'Ön belleği temizle', 'clear_clipboard' => 'Panoyu temizle', @@ -557,7 +558,7 @@ URL: [url]', 'expire_in_1y' => '1 Yıl içinde silinecek', 'expire_in_2h' => '', 'expire_in_2y' => '2 Yıl içinde silinecek', -'expire_in_3y' => '', +'expire_in_3y' => '3 Yıl içinde silinecek', 'expire_today' => '', 'expire_tomorrow' => '', 'expiry_changed_email' => 'Süresinin dolacağı tarihi değişti', @@ -568,7 +569,7 @@ Kullanıcı: [username] URL: [url]', 'expiry_changed_email_subject' => '[sitename]: [name] - Bitiş tarihi değişti', 'export' => '', -'export_user_list_csv' => '', +'export_user_list_csv' => 'Kullanıcıları CSV olarak dışa aktar', 'extension_archive' => '', 'extension_changelog' => 'Değişiklik Listesi', 'extension_is_off_now' => '', @@ -645,6 +646,7 @@ URL: [url]', 'fulltextsearch_disabled' => '', 'fulltext_converters' => 'Doküman dönüştürmeyi indeksle', 'fulltext_info' => 'Tam metin indeks bilgi', +'func_proc_open_missing' => '', 'global_attributedefinitiongroups' => '', 'global_attributedefinitions' => 'Nitelikler', 'global_default_keywords' => 'Global anahtar kelimeler', @@ -820,7 +822,9 @@ URL: [url]', 'missing_checksum' => 'Sağlama toplamı eksik', 'missing_file' => '', 'missing_filesize' => 'Dosya boyutu eksik', +'missing_func_class_note' => '', 'missing_php_extensions' => 'Eksik php eklentileri', +'missing_php_functions_and_classes' => '', 'missing_reception' => '', 'missing_request_object' => '', 'missing_transition_user_group' => 'Geçiş için kullanıcı/grup bilgisi eksik', @@ -837,6 +841,11 @@ URL: [url]', 'my_documents' => 'Dokümanlarım', 'my_transmittals' => 'Çevirilerim', 'name' => 'İsim', +'nav_brand_admin_tools' => '', +'nav_brand_my_account' => '', +'nav_brand_my_documents' => '', +'nav_brand_view_document' => '', +'nav_brand_view_folder' => '', 'nb_NO' => 'Norveç Havayolları', 'needs_correction' => '', 'needs_workflow_action' => 'Bu doküman dikkatinizi gerektiriyor. Lütfen iş akış sekmesini kontrol ediniz.', @@ -1739,6 +1748,7 @@ URL: [url]', 'status_approval_rejected' => 'Taslak reddedildi', 'status_approved' => 'Onaylandı', 'status_approver_removed' => 'Onaylayan süreci sildi', +'status_change' => '', 'status_needs_correction' => '', 'status_not_approved' => 'Onaylanmadı', 'status_not_receipted' => '', @@ -1796,6 +1806,7 @@ URL: [url]', 'task_description' => '', 'task_disabled' => '', 'task_frequency' => '', +'task_frequency_placeholder' => '', 'task_last_run' => '', 'task_name' => '', 'task_next_run' => '', @@ -1933,7 +1944,7 @@ URL: [url]', 'version_deleted_email_subject' => '[sitename]: [name] - Versiyon silindi', 'version_info' => 'Versiyon Bilgisi', 'view' => 'Görüntüle', -'view_document' => '', +'view_document' => 'Dokümanın detaylarını görüntüle', 'view_folder' => '', 'view_online' => 'Online görüntüle', 'warning' => 'Dikkat', diff --git a/languages/uk_UA/lang.inc b/languages/uk_UA/lang.inc index e3d80fea1..88f84ab73 100644 --- a/languages/uk_UA/lang.inc +++ b/languages/uk_UA/lang.inc @@ -284,6 +284,7 @@ URL: [url]', 'choose_workflow' => 'Оберіть процес', 'choose_workflow_action' => 'Оберіть дію процесу', 'choose_workflow_state' => 'Оберіть статус процесу', +'class_finfo_missing' => '', 'class_name' => '', 'clear_cache' => 'Очистити кеш', 'clear_clipboard' => 'Очистити буфер обміну', @@ -651,6 +652,7 @@ URL: [url]', 'fulltextsearch_disabled' => '', 'fulltext_converters' => 'Індексування документів', 'fulltext_info' => 'Інформація про повнотекстовий індекс', +'func_proc_open_missing' => '', 'global_attributedefinitiongroups' => '', 'global_attributedefinitions' => 'Атрибути', 'global_default_keywords' => 'Глобальні ключові слова', @@ -826,7 +828,9 @@ URL: [url]', 'missing_checksum' => 'Відсутня контрольна сума', 'missing_file' => 'Відсутній файл', 'missing_filesize' => 'Відсутній розмір файлу', +'missing_func_class_note' => '', 'missing_php_extensions' => '', +'missing_php_functions_and_classes' => '', 'missing_reception' => '', 'missing_request_object' => '', 'missing_transition_user_group' => 'Відсутній користувач/група для зміни.', @@ -843,6 +847,11 @@ URL: [url]', 'my_documents' => 'Мої документи', 'my_transmittals' => 'Мої перенесення', 'name' => 'Назва', +'nav_brand_admin_tools' => '', +'nav_brand_my_account' => '', +'nav_brand_my_documents' => '', +'nav_brand_view_document' => '', +'nav_brand_view_folder' => '', 'nb_NO' => 'Норвезька (букмол)', 'needs_correction' => '', 'needs_workflow_action' => 'Цей документ потребує вашої уваги. Див. вкладку «Процес».', @@ -1760,6 +1769,7 @@ URL: [url]', 'status_approval_rejected' => 'Чернетку відхилено', 'status_approved' => 'Затверджено', 'status_approver_removed' => 'Затверджувач видалений з процесу', +'status_change' => '', 'status_needs_correction' => '', 'status_not_approved' => 'Не затверджено', 'status_not_receipted' => 'Отримання не підтверджено', @@ -1817,6 +1827,7 @@ URL: [url]', 'task_description' => '', 'task_disabled' => '', 'task_frequency' => '', +'task_frequency_placeholder' => '', 'task_last_run' => '', 'task_name' => '', 'task_next_run' => '', diff --git a/languages/zh_CN/lang.inc b/languages/zh_CN/lang.inc index fb054e15e..2c35a8e06 100644 --- a/languages/zh_CN/lang.inc +++ b/languages/zh_CN/lang.inc @@ -276,6 +276,7 @@ URL: [url]', 'choose_workflow' => '选择工作流', 'choose_workflow_action' => '选择工作流节点', 'choose_workflow_state' => '选择工作流状态', +'class_finfo_missing' => '', 'class_name' => '类名', 'clear_cache' => '清除缓存', 'clear_clipboard' => '清除粘贴板', @@ -641,6 +642,7 @@ URL: [url]', 'fulltextsearch_disabled' => '全文索引已禁用', 'fulltext_converters' => '索引文件转换', 'fulltext_info' => '全文索引信息', +'func_proc_open_missing' => '', 'global_attributedefinitiongroups' => '属性组', 'global_attributedefinitions' => '属性', 'global_default_keywords' => '全局关键字', @@ -816,7 +818,9 @@ URL: [url]', 'missing_checksum' => '缺失校验', 'missing_file' => '', 'missing_filesize' => '缺失文件大小', +'missing_func_class_note' => '', 'missing_php_extensions' => '', +'missing_php_functions_and_classes' => '', 'missing_reception' => '', 'missing_request_object' => '', 'missing_transition_user_group' => '', @@ -833,6 +837,11 @@ URL: [url]', 'my_documents' => '我的文档', 'my_transmittals' => '我的送达函', 'name' => '名称', +'nav_brand_admin_tools' => '', +'nav_brand_my_account' => '', +'nav_brand_my_documents' => '', +'nav_brand_view_document' => '', +'nav_brand_view_folder' => '', 'nb_NO' => '挪威语(书面挪威语)', 'needs_correction' => '', 'needs_workflow_action' => '', @@ -1735,6 +1744,7 @@ URL: [url]', 'status_approval_rejected' => '拟拒绝', 'status_approved' => '批准', 'status_approver_removed' => '从审核队列中删除', +'status_change' => '', 'status_needs_correction' => '', 'status_not_approved' => '未批准', 'status_not_receipted' => '尚未接收', @@ -1792,6 +1802,7 @@ URL: [url]', 'task_description' => '', 'task_disabled' => '', 'task_frequency' => '', +'task_frequency_placeholder' => '', 'task_last_run' => '', 'task_name' => '', 'task_next_run' => '', diff --git a/languages/zh_TW/lang.inc b/languages/zh_TW/lang.inc index d482d27da..388cc43cd 100644 --- a/languages/zh_TW/lang.inc +++ b/languages/zh_TW/lang.inc @@ -284,6 +284,7 @@ URL: [url]', 'choose_workflow' => '選擇流程', 'choose_workflow_action' => '選擇流程行為', 'choose_workflow_state' => '選擇流程狀態', +'class_finfo_missing' => '', 'class_name' => '類別名稱', 'clear_cache' => '清除緩存', 'clear_clipboard' => '清除剪貼簿', @@ -670,6 +671,7 @@ URL: [url]', 'fulltextsearch_disabled' => '全文索引已禁用', 'fulltext_converters' => '索引檔轉換', 'fulltext_info' => '全文索引資訊', +'func_proc_open_missing' => '', 'global_attributedefinitiongroups' => '屬性組', 'global_attributedefinitions' => '屬性', 'global_default_keywords' => '全域關鍵字', @@ -845,7 +847,9 @@ URL: [url]', 'missing_checksum' => '缺少校驗', 'missing_file' => '缺少檔案', 'missing_filesize' => '缺少檔案大小', +'missing_func_class_note' => '', 'missing_php_extensions' => '', +'missing_php_functions_and_classes' => '', 'missing_reception' => '缺少接待處', 'missing_request_object' => '缺少請求物件', 'missing_transition_user_group' => '缺少傳送的使用者/群組', @@ -862,6 +866,11 @@ URL: [url]', 'my_documents' => '我的文件', 'my_transmittals' => '我的傳送', 'name' => '名稱', +'nav_brand_admin_tools' => '', +'nav_brand_my_account' => '', +'nav_brand_my_documents' => '', +'nav_brand_view_document' => '', +'nav_brand_view_folder' => '', 'nb_NO' => '', 'needs_correction' => '需要糾正', 'needs_workflow_action' => '本文檔需要您注意。請檢查工作流程標籤。', @@ -1798,6 +1807,7 @@ URL: [url]', 'status_approval_rejected' => '擬拒絕', 'status_approved' => '批准', 'status_approver_removed' => '從審核佇列中刪除', +'status_change' => '', 'status_needs_correction' => '需要糾正', 'status_not_approved' => '未批准', 'status_not_receipted' => '尚未收到', @@ -1855,6 +1865,7 @@ URL: [url]', 'task_description' => '描述', 'task_disabled' => '不啟用', 'task_frequency' => '頻率', +'task_frequency_placeholder' => '', 'task_last_run' => '最後一次啟用', 'task_name' => '名稱', 'task_next_run' => '下次啟用', From 62eb152b01dd9cf2cadbbd190b4756405d6cfc0e Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 23 Apr 2021 10:18:23 +0200 Subject: [PATCH 63/91] indicate if extension is enabled/disabled --- views/bootstrap/class.Info.php | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/views/bootstrap/class.Info.php b/views/bootstrap/class.Info.php index ffdc5f759..d115120d4 100644 --- a/views/bootstrap/class.Info.php +++ b/views/bootstrap/class.Info.php @@ -34,6 +34,7 @@ class SeedDMS_View_Info extends SeedDMS_Theme_Style { function show() { /* {{{ */ $dms = $this->params['dms']; $user = $this->params['user']; + $settings = $this->params['settings']; $version = $this->params['version']; $availversions = $this->params['availversions']; $extmgr = $this->params['extmgr']; @@ -61,15 +62,23 @@ class SeedDMS_View_Info extends SeedDMS_Theme_Style { $seedextensions = $extmgr->getExtensionConfiguration(); echo "
      ".getMLText("name"); echo "
      \n"; echo "\n\n"; + echo ""; echo "\n"; echo "\n\n\n"; $dbversion = $dms->getDBVersion(); - echo "\n"; + echo "\n"; if($user->isAdmin()) { - echo "\n"; - foreach($seedextensions as $extname=>$extconf) - echo "\n"; + echo "\n"; + foreach($seedextensions as $extname=>$extconf) { + echo ""; + echo "\n"; + } } echo "\n
      ".getMLText("name"); echo "
      ".getMLText('seeddms_version')."".$version->version()."
      ".getMLText('seeddms_version')."".$version->version()."
      ".getMLText('database_schema_version')."".$dbversion['major'].".".$dbversion['minor'].".".$dbversion['subminor']."
      ".$extname."
      ".$extconf['title']."
      ".$extconf['version']."
      ".getMLText('database_schema_version')."".$dbversion['major'].".".$dbversion['minor'].".".$dbversion['subminor']."
      "; + if(!$settings->extensionIsDisabled($extname)) + echo " "; + else + echo " "; + echo "".$extname."
      ".$extconf['title']."
      ".$extconf['version']."
      \n"; $this->columnEnd(); From 4c47d69a88a1519546634974db5704a9cd767913 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 23 Apr 2021 12:51:31 +0200 Subject: [PATCH 64/91] remove old html code --- views/bootstrap/class.MyDocuments.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/views/bootstrap/class.MyDocuments.php b/views/bootstrap/class.MyDocuments.php index 538eafb21..9cbde242a 100644 --- a/views/bootstrap/class.MyDocuments.php +++ b/views/bootstrap/class.MyDocuments.php @@ -732,8 +732,6 @@ $(document).ready( function() { $this->contentStart(); $this->pageNavigation(getMLText("my_documents"), "my_documents"); - echo '
      '; - echo '
      '; $this->rowStart(); $this->columnStart(3); $this->contentHeading(getMLText("my_documents")); From 43a280bc6df373996a91268b824b15fd27f29bee Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Mon, 26 Apr 2021 12:24:55 +0200 Subject: [PATCH 65/91] set sequence of document when moving --- op/op.Ajax.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/op/op.Ajax.php b/op/op.Ajax.php index 03431a504..1cc4188aa 100644 --- a/op/op.Ajax.php +++ b/op/op.Ajax.php @@ -319,6 +319,9 @@ switch($command) { if($folder = $dms->getFolder($_REQUEST['targetfolderid'])) { if($folder->getAccessMode($user, 'moveDocument') >= M_READWRITE) { if($mdocument->setFolder($folder)) { + if(isset($_REQUEST['sequence'])) { + $mdocument->setSequence((float) $_REQUEST['sequence']); + } header('Content-Type: application/json'); echo json_encode(array('success'=>true, 'message'=>getMLText('splash_move_document'), 'data'=>'')); add_log_line(); From cad9e24ec3d9bb6ed812cf0499c3f6238d23a7d6 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 27 Apr 2021 07:27:31 +0200 Subject: [PATCH 66/91] fix progress bars of reception --- 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 f7dd11292..6c3b90c40 100644 --- a/views/bootstrap4/class.Bootstrap4.php +++ b/views/bootstrap4/class.Bootstrap4.php @@ -3005,8 +3005,8 @@ $('body').on('click', '[id^=\"table-row-folder\"] td:nth-child(2)', function(ev) if($totalreceipts) { $content .= "
      -
      ".($rstat['1'] ? $rstat['1']."/".$totalreceipts : '').($allcomments['1'] ? " ".$this->printPopupBox('', implode('
      ', formatComment($allcomments['1'])), true) : "")."
      -
      ".($rstat['-1'] ? $rstat['-1']."/".$totalreceipts : '').($allcomments['-1'] ? " ".$this->printPopupBox('', implode('
      ', formatComment($allcomments['-1'])), true) : "")."
      +
      ".($rstat['1'] ? $rstat['1']."/".$totalreceipts : '').($allcomments['1'] ? " ".$this->printPopupBox('', implode('
      ', formatComment($allcomments['1'])), true) : "")."
      +
      ".($rstat['-1'] ? $rstat['-1']."/".$totalreceipts : '').($allcomments['-1'] ? " ".$this->printPopupBox('', implode('
      ', formatComment($allcomments['-1'])), true) : "")."
      "; } } From 734ff7d33fde0ee3f22df8ca03765d96b60bf7fd Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 27 Apr 2021 17:06:19 +0200 Subject: [PATCH 67/91] add path to documentListRow, make column for form wider --- views/bootstrap/class.Timeline.php | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/views/bootstrap/class.Timeline.php b/views/bootstrap/class.Timeline.php index c374c5275..c9257142d 100644 --- a/views/bootstrap/class.Timeline.php +++ b/views/bootstrap/class.Timeline.php @@ -48,7 +48,7 @@ class SeedDMS_View_Timeline extends SeedDMS_Theme_Style { if($document && $version) { // $this->contentHeading(getMLText("timeline_selected_item")); - print ""; + print "
      "; print "\n\n"; print "\n"; print "\n"; @@ -56,7 +56,9 @@ class SeedDMS_View_Timeline extends SeedDMS_Theme_Style { print "\n"; print "\n\n\n"; $previewer = new SeedDMS_Preview_Previewer($cachedir, $previewwidthdetail, $timeout, $xsendfile); - echo $this->documentListRow($document, $previewer); + $extracontent = array(); + $extracontent['below_title'] = $this->getListRowPath($document); + echo $this->documentListRow($document, $previewer, 0, false, $extracontent); echo "\n
      ".getMLText("name")."".getMLText("action")."
      \n"; } @@ -230,11 +232,11 @@ div.timeline-event-selected { $this->pageNavigation(getMLText("admin_tools"), "admin_tools"); $this->rowStart(); - $this->columnStart(3); + $this->columnStart(4); $this->contentHeading(getMLText("timeline")); $this->contentContainerStart(); ?> -
      + formField( getMLText("from"), @@ -263,7 +265,7 @@ div.timeline-event-selected { $this->contentContainerEnd(); echo "
      "; $this->columnEnd(); - $this->columnStart(9); + $this->columnStart(8); $this->contentHeading(getMLText("timeline")); $this->printTimelineHtml(550); $this->columnEnd(); From 74a2e39ff4c82499ea77fd24421463bc3cfab118 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 27 Apr 2021 17:10:42 +0200 Subject: [PATCH 68/91] put form into column --- views/bootstrap/class.RemoveUserFromProcesses.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/views/bootstrap/class.RemoveUserFromProcesses.php b/views/bootstrap/class.RemoveUserFromProcesses.php index be3cfbfde..3eddcdb23 100644 --- a/views/bootstrap/class.RemoveUserFromProcesses.php +++ b/views/bootstrap/class.RemoveUserFromProcesses.php @@ -39,6 +39,8 @@ class SeedDMS_View_RemoveUserFromProcesses extends SeedDMS_Theme_Style { $this->contentHeading(getMLText("rm_user_from_processes")); $this->warningMsg(getMLText("confirm_rm_user_from_processes", array ("username" => htmlspecialchars($rmuser->getFullName())))); + $this->rowStart(); + $this->columnStart(4); ?> @@ -203,6 +205,9 @@ class SeedDMS_View_RemoveUserFromProcesses extends SeedDMS_Theme_Style { columnEnd(); + $this->columnStart(8); + $this->rowEnd(); $this->contentEnd(); $this->htmlEndPage(); } /* }}} */ From 42b97969b5725e2c73fd05c29b43c74899b0f98f Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 27 Apr 2021 19:35:35 +0200 Subject: [PATCH 69/91] pass task and previewer to view --- out/out.RemoveUserFromProcesses.php | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/out/out.RemoveUserFromProcesses.php b/out/out.RemoveUserFromProcesses.php index 41ad60e2b..fcd1d2054 100644 --- a/out/out.RemoveUserFromProcesses.php +++ b/out/out.RemoveUserFromProcesses.php @@ -48,11 +48,23 @@ if ($rmuser->getID()==$user->getID()) { UI::exitError(getMLText("rm_user"),getMLText("cannot_delete_yourself")); } +$task = null; +if (isset($_GET["task"])) { + $task = $_GET['task']; +} + $allusers = $dms->getAllUsers($settings->_sortUsersInList); if($view) { + $view->setParam('showtree', showtree()); $view->setParam('rmuser', $rmuser); $view->setParam('allusers', $allusers); + $view->setParam('task', $task); + $view->setParam('cachedir', $settings->_cacheDir); + $view->setParam('rootfolder', $dms->getFolder($settings->_rootFolderID)); + $view->setParam('previewWidthList', $settings->_previewWidthList); + $view->setParam('previewconverters', $settings->_converters['preview']); + $view->setParam('timeout', $settings->_cmdTimeout); $view->setParam('accessobject', $accessop); $view($_GET); exit; From cce5b69c23eb189a681ac4b90eca90b6abbdef30 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 27 Apr 2021 19:36:12 +0200 Subject: [PATCH 70/91] show list of documents affected --- .../class.RemoveUserFromProcesses.php | 156 +++++++++++++++++- 1 file changed, 150 insertions(+), 6 deletions(-) diff --git a/views/bootstrap/class.RemoveUserFromProcesses.php b/views/bootstrap/class.RemoveUserFromProcesses.php index 3eddcdb23..41a47f7f7 100644 --- a/views/bootstrap/class.RemoveUserFromProcesses.php +++ b/views/bootstrap/class.RemoveUserFromProcesses.php @@ -27,6 +27,148 @@ */ class SeedDMS_View_RemoveUserFromProcesses extends SeedDMS_Theme_Style { + public function js() { /* {{{ */ + header('Content-Type: application/javascript; charset=UTF-8'); +?> +$(document).ready( function() { + $('body').on('click', 'label.checkbox', function(ev){ + ev.preventDefault(); + $('#kkkk.ajax').data('action', $(this).data('action')); + $('#kkkk.ajax').trigger('update', {userid: $(this).data('userid'), task: $(this). data('task')}); + }); +}); +params['dms']; + $user = $this->params['user']; + $settings = $this->params['settings']; + $cachedir = $this->params['cachedir']; + $rootfolder = $this->params['rootfolder']; + $previewwidth = $this->params['previewWidthList']; + $previewconverters = $this->params['previewconverters']; + $timeout = $this->params['timeout']; + $rmuser = $this->params['rmuser']; + $task = $this->params['task']; + + if(!$task) + return; + + $previewer = new SeedDMS_Preview_Previewer($cachedir, $previewwidth, $timeout); + $previewer->setConverters($previewconverters); + + $docs = array(); + switch($task) { + case "reviews_not_touched": + $reviewStatus = $rmuser->getReviewStatus(); + foreach($reviewStatus['indstatus'] as $ri) { + $document = $dms->getDocument($ri['documentID']); + $ri['latest'] = $document->getLatestContent()->getVersion(); + if($ri['latest'] == $ri['version']) { + if($ri['status'] == 0) { + $document->verifyLastestContentExpriry(); + $lc = $document->getLatestContent(); + if($document->getAccessMode($user) >= M_READ && $lc) { + $docs[] = $document; + } + } + } + } + break; + case "reviews_accepted": + $reviewStatus = $rmuser->getReviewStatus(); + foreach($reviewStatus['indstatus'] as $ri) { + $document = $dms->getDocument($ri['documentID']); + $ri['latest'] = $document->getLatestContent()->getVersion(); + if($ri['latest'] == $ri['version']) { + if($ri['status'] == 1) { + $document->verifyLastestContentExpriry(); + $lc = $document->getLatestContent(); + if($document->getAccessMode($user) >= M_READ && $lc) { + $docs[] = $document; + } + } + } + } + break; + case "reviews_rejected": + $reviewStatus = $rmuser->getReviewStatus(); + foreach($reviewStatus['indstatus'] as $ri) { + $document = $dms->getDocument($ri['documentID']); + $ri['latest'] = $document->getLatestContent()->getVersion(); + if($ri['latest'] == $ri['version']) { + if($ri['status'] == -1) { + $docs[] = $document; + } + } + } + break; + case "approvals_not_touched": + $approvalStatus = $rmuser->getApprovalStatus(); + foreach($approvalStatus['indstatus'] as $ai) { + $document = $dms->getDocument($ai['documentID']); + $ai['latest'] = $document->getLatestContent()->getVersion(); + if($ai['latest'] == $ai['version']) { + if($ai['status'] == 0) { + $docs[] = $document; + } + } + } + break; + case "approvals_accepted": + $approvalStatus = $rmuser->getApprovalStatus(); + foreach($approvalStatus['indstatus'] as $ai) { + $document = $dms->getDocument($ai['documentID']); + $ai['latest'] = $document->getLatestContent()->getVersion(); + if($ai['latest'] == $ai['version']) { + if($ai['status'] == 1) { + $docs[] = $document; + } + } + } + break; + case "approvals_rejected": + $approvalStatus = $rmuser->getApprovalStatus(); + foreach($approvalStatus['indstatus'] as $ai) { + $document = $dms->getDocument($ai['documentID']); + $ai['latest'] = $document->getLatestContent()->getVersion(); + if($ai['latest'] == $ai['version']) { + if($ai['status'] == -1) { + $docs[] = $document; + } + } + } + break; + } + if($docs) { + print ""; + print "\n\n"; + print "\n"; + print "\n"; + print "\n"; + print "\n"; + print "\n\n\n"; + foreach($docs as $document) { + $document->verifyLastestContentExpriry(); + $lc = $document->getLatestContent(); + if($document->getAccessMode($user) >= M_READ && $lc) { + $txt = $this->callHook('documentListItem', $document, $previewer, false); + if(is_string($txt)) + echo $txt; + else { + $extracontent = array(); + $extracontent['below_title'] = $this->getListRowPath($document); + echo $this->documentListRowStart($document); + echo $this->documentListRow($document, $previewer, true, 0, $extracontent); + echo $this->documentListRowEnd($document); + } + } + } + echo "\n
      ".getMLText("name")."".getMLText("status")."".getMLText("action")."
      "; + } + } /* }}} */ + function show() { /* {{{ */ $dms = $this->params['dms']; $user = $this->params['user']; @@ -89,7 +231,7 @@ class SeedDMS_View_RemoveUserFromProcesses extends SeedDMS_Theme_Style { 'checked'=>true ), array( - 'field_wrap' => array('") + 'field_wrap' => array('") ) ); ?> @@ -106,7 +248,7 @@ class SeedDMS_View_RemoveUserFromProcesses extends SeedDMS_Theme_Style { 'checked'=>true ), array( - 'field_wrap' => array('") + 'field_wrap' => array('") ) ); ?> @@ -123,7 +265,7 @@ class SeedDMS_View_RemoveUserFromProcesses extends SeedDMS_Theme_Style { 'checked'=>true ), array( - 'field_wrap' => array('") + 'field_wrap' => array('") ) ); ?> @@ -141,7 +283,7 @@ class SeedDMS_View_RemoveUserFromProcesses extends SeedDMS_Theme_Style { 'checked'=>true ), array( - 'field_wrap' => array('") + 'field_wrap' => array('") ) ); ?> @@ -158,7 +300,7 @@ class SeedDMS_View_RemoveUserFromProcesses extends SeedDMS_Theme_Style { 'checked'=>true ), array( - 'field_wrap' => array('") + 'field_wrap' => array('") ) ); ?> @@ -175,7 +317,7 @@ class SeedDMS_View_RemoveUserFromProcesses extends SeedDMS_Theme_Style { 'checked'=>true ), array( - 'field_wrap' => array('") + 'field_wrap' => array('") ) ); ?> @@ -207,6 +349,8 @@ class SeedDMS_View_RemoveUserFromProcesses extends SeedDMS_Theme_Style { columnEnd(); $this->columnStart(8); + echo '
      '; + $this->columnEnd(); $this->rowEnd(); $this->contentEnd(); $this->htmlEndPage(); From 1956cf74cefb9ac6aad69f52ec6d41cc50500159 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 27 Apr 2021 19:36:41 +0200 Subject: [PATCH 71/91] add class table-sm --- views/bootstrap/class.MyDocuments.php | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/views/bootstrap/class.MyDocuments.php b/views/bootstrap/class.MyDocuments.php index d879f1c31..dc4ece7c7 100644 --- a/views/bootstrap/class.MyDocuments.php +++ b/views/bootstrap/class.MyDocuments.php @@ -171,7 +171,7 @@ class SeedDMS_View_MyDocuments extends SeedDMS_Theme_Style { $document->verifyLastestContentExpriry(); if ($printheader){ - print ""; + print "
      "; print "\n\n"; print "\n"; print "\n"; @@ -210,7 +210,7 @@ class SeedDMS_View_MyDocuments extends SeedDMS_Theme_Style { $document->verifyLastestContentExpriry(); if ($printheader){ - print "
      ".getMLText("name")."
      "; + print "
      "; print "\n\n"; print "\n"; print "\n"; @@ -261,7 +261,7 @@ class SeedDMS_View_MyDocuments extends SeedDMS_Theme_Style { $document->verifyLastestContentExpriry(); if ($printheader){ - print "
      ".getMLText("name")."
      "; + print "
      "; print "\n\n"; print "\n"; print "\n"; @@ -298,7 +298,7 @@ class SeedDMS_View_MyDocuments extends SeedDMS_Theme_Style { $document = $dms->getDocument($st["documentID"]); $document->verifyLastestContentExpriry(); if ($printheader){ - print "
      ".getMLText("name")."
      "; + print "
      "; print "\n\n"; print "\n"; print "\n"; @@ -382,7 +382,7 @@ class SeedDMS_View_MyDocuments extends SeedDMS_Theme_Style { //$this->contentContainerStart(); if (count($resArr)>0) { - print "
      ".getMLText("name")."
      "; + print "
      "; print "\n\n"; print ""; print "\n"; @@ -461,7 +461,7 @@ class SeedDMS_View_MyDocuments extends SeedDMS_Theme_Style { //$this->contentContainerStart(); if (count($resArr)>0) { - print "
      ".getMLText("name")."
      "; + print "
      "; print "\n\n"; print ""; print "\n"; @@ -588,7 +588,7 @@ class SeedDMS_View_MyDocuments extends SeedDMS_Theme_Style { $document->verifyLastestContentExpriry(); if ($printheader){ - print "
      ".getMLText("name")."
      "; + print "
      "; print "\n\n"; print "\n"; print "\n"; @@ -630,7 +630,7 @@ class SeedDMS_View_MyDocuments extends SeedDMS_Theme_Style { $document->verifyLastestContentExpriry(); if ($printheader){ - print "
      ".getMLText("name")."
      "; + print "
      "; print "\n\n"; print "\n"; print "\n"; @@ -705,7 +705,7 @@ class SeedDMS_View_MyDocuments extends SeedDMS_Theme_Style { //$this->contentContainerStart(); if (count($resArr)>0) { - print "
      ".getMLText("name")."
      "; + print "
      "; print "\n\n"; print ""; print "\n"; @@ -786,7 +786,7 @@ class SeedDMS_View_MyDocuments extends SeedDMS_Theme_Style { //$this->contentContainerStart(); if (count($resArr)>0) { - print "
      ".getMLText("name")."
      "; + print "
      "; print "\n\n"; print ""; print "\n"; @@ -845,7 +845,7 @@ class SeedDMS_View_MyDocuments extends SeedDMS_Theme_Style { //$this->contentContainerStart(); if (count($docs)>0) { - print "
      ".getMLText("name")."
      "; + print "
      "; print "\n\n"; print ""; print "\n"; @@ -943,7 +943,7 @@ class SeedDMS_View_MyDocuments extends SeedDMS_Theme_Style { if (count($resArr)>0) { - print "
      ".getMLText("name")."
      "; + print "
      "; print "\n\n"; print ""; print ""; + } + echo "
      ".getMLText("name")." — \n"; From 6033a702c63fc4686ed63695c0bdc446bb7edb28 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 27 Apr 2021 19:36:54 +0200 Subject: [PATCH 72/91] fix icon for sustitute user --- 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 a9996a684..3cb9763b7 100644 --- a/views/bootstrap/class.UsrMgr.php +++ b/views/bootstrap/class.UsrMgr.php @@ -186,7 +186,7 @@ $(document).ready( function() { $button['menuitems'][] = array('label'=>' '.getMLText("rm_user_from_processes"), 'link'=>'../out/out.RemoveUserFromProcesses.php?userid='.$seluser->getID()); $button['menuitems'][] = array('label'=>' '.getMLText("transfer_objects"), 'link'=>'../out/out.TransferObjects.php?userid='.$seluser->getID()); if($user->isAdmin() && $seluser->getID() != $user->getID()) - $button['menuitems'][] = array('label'=>' '.getMLText("substitute_user"), 'link'=>'../op/op.SubstituteUser.php?userid='.$seluser->getID()); + $button['menuitems'][] = array('label'=>' '.getMLText("substitute_user"), 'link'=>'../op/op.SubstituteUser.php?userid='.$seluser->getID()); if($enableemail) $button['menuitems'][] = array('label'=>' '.getMLText("send_login_data"), 'link'=>'../out/out.SendLoginData.php?userid='.$seluser->getID()); self::showButtonwithMenu($button); From 3f40dce22d0fa2b941eb143e0ee6ca9926b42c04 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 27 Apr 2021 20:33:54 +0200 Subject: [PATCH 73/91] add changes for 5.1.23 --- CHANGELOG | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG b/CHANGELOG index d27b081dc..cbd3124b1 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -2,6 +2,7 @@ Changes in version 5.1.23 -------------------------------------------------------------------------------- - output path of parent folder in many document/folder lists +- list affected documents when transfering processes to another user -------------------------------------------------------------------------------- Changes in version 5.1.22 From 1a6f2e9b17a0312647581b944294e9ba1ef07101 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 27 Apr 2021 21:00:26 +0200 Subject: [PATCH 74/91] add js for operations on documents --- views/bootstrap/class.RemoveUserFromProcesses.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/views/bootstrap/class.RemoveUserFromProcesses.php b/views/bootstrap/class.RemoveUserFromProcesses.php index 41a47f7f7..b590bcffc 100644 --- a/views/bootstrap/class.RemoveUserFromProcesses.php +++ b/views/bootstrap/class.RemoveUserFromProcesses.php @@ -29,6 +29,10 @@ class SeedDMS_View_RemoveUserFromProcesses extends SeedDMS_Theme_Style { public function js() { /* {{{ */ header('Content-Type: application/javascript; charset=UTF-8'); + parent::jsTranslations(array('cancel', 'splash_move_document', 'confirm_move_document', 'move_document', 'confirm_transfer_link_document', 'transfer_content', 'link_document', 'splash_move_folder', 'confirm_move_folder', 'move_folder')); + $this->printDeleteDocumentButtonJs(); + /* Add js for catching click on document in one page mode */ + $this->printClickDocumentJs(); ?> $(document).ready( function() { $('body').on('click', 'label.checkbox', function(ev){ From e279a2f8e824ace0a28f257a6824294b9ceb0767 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 27 Apr 2021 22:17:26 +0200 Subject: [PATCH 75/91] do not prevent events, otherwise the checkbox doesn't work anymore --- views/bootstrap/class.RemoveUserFromProcesses.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/bootstrap/class.RemoveUserFromProcesses.php b/views/bootstrap/class.RemoveUserFromProcesses.php index a634104cb..b2d1f2cf1 100644 --- a/views/bootstrap/class.RemoveUserFromProcesses.php +++ b/views/bootstrap/class.RemoveUserFromProcesses.php @@ -36,7 +36,7 @@ class SeedDMS_View_RemoveUserFromProcesses extends SeedDMS_Theme_Style { ?> $(document).ready( function() { $('body').on('click', 'label.checkbox', function(ev){ - ev.preventDefault(); +// ev.preventDefault(); $('#kkkk.ajax').data('action', $(this).data('action')); $('#kkkk.ajax').trigger('update', {userid: $(this).data('userid'), task: $(this). data('task')}); }); From a7deac79482903d44dab106355faf3bb83e195fc Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Wed, 28 Apr 2021 07:05:15 +0200 Subject: [PATCH 76/91] removeFromProcess() writes into log when a user was replaced (not just removed) --- SeedDMS_Core/Core/inc.ClassUser.php | 8 ++++---- SeedDMS_Core/package.xml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/SeedDMS_Core/Core/inc.ClassUser.php b/SeedDMS_Core/Core/inc.ClassUser.php index e689d54b8..8755d2bee 100644 --- a/SeedDMS_Core/Core/inc.ClassUser.php +++ b/SeedDMS_Core/Core/inc.ClassUser.php @@ -946,7 +946,7 @@ class SeedDMS_Core_User { /* {{{ */ foreach ($reviewStatus["indstatus"] as $ri) { if($ri['status'] != -2 && (!isset($states['review']) || in_array($ri['status'], $states['review']))) { $queryStr = "INSERT INTO `tblDocumentReviewLog` (`reviewID`, `status`, `comment`, `date`, `userID`) ". - "VALUES ('". $ri["reviewID"] ."', '-2', 'Reviewer removed from process', ".$db->getCurrentDatetime().", '". $user->getID() ."')"; + "VALUES ('". $ri["reviewID"] ."', '-2', '".($newuser ? 'Reviewer replaced by '.$newuser->getLogin() : 'Reviewer removed from process')."', ".$db->getCurrentDatetime().", '". $user->getID() ."')"; $res=$db->getResult($queryStr); if(!$res) { $db->rollbackTransaction(); @@ -975,7 +975,7 @@ class SeedDMS_Core_User { /* {{{ */ foreach ($approvalStatus["indstatus"] as $ai) { if($ai['status'] != -2 && (!isset($states['approval']) || in_array($ai['status'], $states['approval']))) { $queryStr = "INSERT INTO `tblDocumentApproveLog` (`approveID`, `status`, `comment`, `date`, `userID`) ". - "VALUES ('". $ai["approveID"] ."', '-2', 'Approver removed from process', ".$db->getCurrentDatetime().", '". $user->getID() ."')"; + "VALUES ('". $ai["approveID"] ."', '-2', '".($newuser ? 'Approver replaced by '.$newuser->getLogin() : 'Approver removed from process')."', ".$db->getCurrentDatetime().", '". $user->getID() ."')"; $res=$db->getResult($queryStr); if(!$res) { $db->rollbackTransaction(); @@ -1004,7 +1004,7 @@ class SeedDMS_Core_User { /* {{{ */ foreach ($receiptStatus["indstatus"] as $ri) { if($ri['status'] != -2 && (!isset($states['receipt']) || in_array($ri['status'], $states['receipt']))) { $queryStr = "INSERT INTO `tblDocumentReceiptLog` (`receiptID`, `status`, `comment`, `date`, `userID`) ". - "VALUES ('". $ri["receiptID"] ."', '-2', 'Recipient removed from process', ".$db->getCurrentDatetime().", '". $user->getID() ."')"; + "VALUES ('". $ri["receiptID"] ."', '-2', '".($newuser ? 'Recipient replaced by '.$newuser->getLogin() : 'Recipient removed from process')."', ".$db->getCurrentDatetime().", '". $user->getID() ."')"; $res=$db->getResult($queryStr); if(!$res) { $db->rollbackTransaction(); @@ -1033,7 +1033,7 @@ class SeedDMS_Core_User { /* {{{ */ foreach ($revisionStatus["indstatus"] as $ri) { if($ri['status'] != -2 && (!isset($states['revision']) || in_array($ri['status'], $states['revision']))) { $queryStr = "INSERT INTO `tblDocumentRevisionLog` (`revisionID`, `status`, `comment`, `date`, `userID`) ". - "VALUES ('". $ri["revisionID"] ."', '-2', 'Revisor removed from process', ".$db->getCurrentDatetime().", '". $user->getID() ."')"; + "VALUES ('". $ri["revisionID"] ."', '-2', '".($newuser ? 'Revisor replaced by '.$newuser->getLogin() : 'Revisor removed from process')."', ".$db->getCurrentDatetime().", '". $user->getID() ."')"; $res=$db->getResult($queryStr); if(!$res) { $db->rollbackTransaction(); diff --git a/SeedDMS_Core/package.xml b/SeedDMS_Core/package.xml index 69e8a24a9..cc3b2a1cc 100644 --- a/SeedDMS_Core/package.xml +++ b/SeedDMS_Core/package.xml @@ -24,7 +24,7 @@ GPL License -- no changes +- removeFromProcesses() documents in comment of log when a user was replaced From 2c7ab1cfb1d5d926f37a01503b450fadff312703 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Wed, 28 Apr 2021 14:24:40 +0200 Subject: [PATCH 77/91] move checkForDueRevisionWorkflow() into document version --- SeedDMS_Core/Core/inc.ClassDocument.php | 96 ++++++++++++++----------- 1 file changed, 56 insertions(+), 40 deletions(-) diff --git a/SeedDMS_Core/Core/inc.ClassDocument.php b/SeedDMS_Core/Core/inc.ClassDocument.php index 21dc3ad94..72a9bb9a7 100644 --- a/SeedDMS_Core/Core/inc.ClassDocument.php +++ b/SeedDMS_Core/Core/inc.ClassDocument.php @@ -898,14 +898,10 @@ class SeedDMS_Core_Document extends SeedDMS_Core_Object { /* {{{ */ /** * Check if latest content of the document has a scheduled * revision workflow. - * The method will update the document status log database table - * if needed and set the revisiondate of the content to $next. * - * FIXME: This method does not check if there are any revisors left. Even - * if all revisors have been removed, it will still start the revision workflow! - * NOTE: This seems not the case anymore. The status of each revision is - * checked. Only if at least one status is S_LOG_SLEEPING the revision will be - * started. This wouldn't be the case if all revisors had been removed. + * This method was moved into SeedDMS_Core_DocumentContent and + * the original method in SeedDMS_Core_Document now uses it for + * the latest version. * * @param object $user user requesting the possible automatic change * @param string $next next date for review @@ -914,39 +910,7 @@ class SeedDMS_Core_Document extends SeedDMS_Core_Object { /* {{{ */ function checkForDueRevisionWorkflow($user, $next=''){ /* {{{ */ $lc=$this->getLatestContent(); if($lc) { - $st=$lc->getStatus(); - - /* A revision workflow will only be started if the document is released */ - if($st["status"] == S_RELEASED) { - /* First check if there are any scheduled revisions currently sleeping */ - $pendingRevision=false; - unset($this->_revisionStatus); // force to be reloaded from DB - $revisionStatus=$lc->getRevisionStatus(); - if (is_array($revisionStatus) && count($revisionStatus)>0) { - foreach ($revisionStatus as $a){ - if ($a["status"]==S_LOG_SLEEPING || $a["status"]==S_LOG_SLEEPING){ - $pendingRevision=true; - break; - } - } - } - if(!$pendingRevision) - return false; - - /* We have sleeping revision, next check if the revision is already due */ - if($lc->getRevisionDate() && $lc->getRevisionDate() <= date('Y-m-d 00:00:00')) { - if($lc->startRevision($user, 'Automatic start of revision workflow scheduled for '.$lc->getRevisionDate())) { - if($next) { - $tmp = explode('-', substr($next, 0, 10)); - if(checkdate($tmp[1], $tmp[2], $tmp[0])) - $lc->setRevisionDate($next); - } else { - $lc->setRevisionDate(false); - } - return true; - } - } - } + return $lc->checkForDueRevisionWorkflow($user, $next); } return false; } /* }}} */ @@ -4503,6 +4467,58 @@ class SeedDMS_Core_DocumentContent extends SeedDMS_Core_Object { /* {{{ */ return true; } /* }}} */ + /** + * Check if document version has a scheduled revision workflow. + * The method will update the document status log database table + * if needed and set the revisiondate of the content to $next. + * + * FIXME: This method does not check if there are any revisors left. Even + * if all revisors have been removed, it will still start the revision workflow! + * NOTE: This seems not the case anymore. The status of each revision is + * checked. Only if at least one status is S_LOG_SLEEPING the revision will be + * started. This wouldn't be the case if all revisors had been removed. + * + * @param object $user user requesting the possible automatic change + * @param string $next next date for review + * @return boolean true if status has changed + */ + function checkForDueRevisionWorkflow($user, $next=''){ /* {{{ */ + $st=$this->getStatus(); + + /* A revision workflow will only be started if the document version is released */ + if($st["status"] == S_RELEASED) { + /* First check if there are any scheduled revisions currently sleeping */ + $pendingRevision=false; + unset($this->_revisionStatus); // force to be reloaded from DB + $revisionStatus=$this->getRevisionStatus(); + if (is_array($revisionStatus) && count($revisionStatus)>0) { + foreach ($revisionStatus as $a){ + if ($a["status"]==S_LOG_SLEEPING || $a["status"]==S_LOG_SLEEPING){ + $pendingRevision=true; + break; + } + } + } + if(!$pendingRevision) + return false; + + /* We have sleeping revision, next check if the revision is already due */ + if($this->getRevisionDate() && $this->getRevisionDate() <= date('Y-m-d 00:00:00')) { + if($this->startRevision($user, 'Automatic start of revision workflow scheduled for '.$this->getRevisionDate())) { + if($next) { + $tmp = explode('-', substr($next, 0, 10)); + if(checkdate($tmp[1], $tmp[2], $tmp[0])) + $this->setRevisionDate($next); + } else { + $this->setRevisionDate(false); + } + return true; + } + } + } + return false; + } /* }}} */ + function addIndReviewer($user, $requestUser) { /* {{{ */ $db = $this->_document->getDMS()->getDB(); From e128e0e9dd825b22f46e015ec7c1971d368ddcf4 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Wed, 28 Apr 2021 14:26:34 +0200 Subject: [PATCH 78/91] add changes for 6.0.16 --- SeedDMS_Core/package.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/SeedDMS_Core/package.xml b/SeedDMS_Core/package.xml index cc3b2a1cc..2f26f0664 100644 --- a/SeedDMS_Core/package.xml +++ b/SeedDMS_Core/package.xml @@ -25,6 +25,8 @@ GPL License - removeFromProcesses() documents in comment of log when a user was replaced +- move SeedDMS_Core_Document::checkForDueRevisionWorkflow() into SeedDMS_Core_DocumentContent + and add a wrapper method in SeedDMЅ_Core_Document From c1d2b46b2e2103a2f45aff46ef6c4a6cabf5a708 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Wed, 28 Apr 2021 17:40:55 +0200 Subject: [PATCH 79/91] put list of open tasks into table --- .../class.RemoveUserFromProcesses.php | 182 +++++++----------- 1 file changed, 70 insertions(+), 112 deletions(-) diff --git a/views/bootstrap/class.RemoveUserFromProcesses.php b/views/bootstrap/class.RemoveUserFromProcesses.php index b590bcffc..e76f3bffe 100644 --- a/views/bootstrap/class.RemoveUserFromProcesses.php +++ b/views/bootstrap/class.RemoveUserFromProcesses.php @@ -35,10 +35,10 @@ class SeedDMS_View_RemoveUserFromProcesses extends SeedDMS_Theme_Style { $this->printClickDocumentJs(); ?> $(document).ready( function() { - $('body').on('click', 'label.checkbox', function(ev){ + $('body').on('click', 'label.checkbox, td span', function(ev){ ev.preventDefault(); $('#kkkk.ajax').data('action', $(this).data('action')); - $('#kkkk.ajax').trigger('update', {userid: $(this).data('userid'), task: $(this). data('task')}); + $('#kkkk.ajax').trigger('update', {userid: $(this).data('userid'), task: $(this).data('task')}); }); }); warningMsg(getMLText("confirm_rm_user_from_processes", array ("username" => htmlspecialchars($rmuser->getFullName())))); $this->rowStart(); $this->columnStart(4); -?> -
      - - - -contentContainerStart(); $reviewStatus = $rmuser->getReviewStatus(); $tmpr = array(); $cr = array("-2"=>0, '-1'=>0, '0'=>0, '1'=>0); @@ -222,111 +215,77 @@ $(document).ready( function() { else $tmpa[$ai['status']] = array($ai); } -?> - -formField( - getMLText('reviews_not_touched', array('no_reviews' => count($tmpr["0"]))), - array( - 'element'=>'input', - 'type'=>'checkbox', - 'name'=>'status[review][]', - 'value'=>'0', - 'checked'=>true - ), - array( - 'field_wrap' => array('") - ) - ); -?> - - -formField( - getMLText('reviews_accepted', array('no_reviews' => count($tmpr["1"]))), - array( - 'element'=>'input', - 'type'=>'checkbox', - 'name'=>'status[approval][]', - 'value'=>'1', - 'checked'=>true - ), - array( - 'field_wrap' => array('") - ) - ); -?> - - -formField( - getMLText('reviews_rejected', array('no_reviews' => count($tmpr["-1"]))), - array( - 'element'=>'input', - 'type'=>'checkbox', - 'name'=>'status[approval][]', - 'value'=>'-1', - 'checked'=>true - ), - array( - 'field_wrap' => array('") - ) - ); -?> - - -formField( - getMLText('approvals_not_touched', array('no_approvals' => count($tmpa["0"]))), - array( - 'element'=>'input', - 'type'=>'checkbox', - 'name'=>'status[approval][]', - 'value'=>'0', - 'checked'=>true - ), - array( - 'field_wrap' => array('") - ) - ); + $out = array(); + if(isset($tmpr["0"])) { + $out[] = array( + '0', + 'review', + 'not_touched', + getMLText('reviews_not_touched', array('no_reviews' => count($tmpr["0"]))), + getMLText('reviews_not_touched_latest', array('no_reviews' => $cr["0"])) + ); + } + if(isset($tmpr["1"])) { + $out[] = array( + '1', + 'review', + 'accepted', + getMLText('reviews_accepted', array('no_reviews' => count($tmpr["1"]))), + getMLText('reviews_accepted_latest', array('no_reviews' => $cr["1"])) + ); + } + if(isset($tmpr["-1"])) { + $out[] = array( + '-1', + 'review', + 'rejected', + getMLText('reviews_rejected', array('no_reviews' => count($tmpr["-1"]))), + getMLText('reviews_rejected_latest', array('no_reviews' => $cr["-1"])) + ); + } + if(isset($tmpa["0"])) { + $out[] = array( + '0', + 'approval', + 'not_touched', + getMLText('approvals_not_touched', array('no_approvals' => count($tmpa["0"]))), + getMLText('approvals_not_touched_latest', array('no_approvals' => $ca["0"])) + ); + } + if(isset($tmpa["1"])) { + $out[] = array( + '1', + 'approval', + 'accepted', + getMLText('approvals_accepted', array('no_approvals' => count($tmpa["1"]))), + getMLText('approvals_accepted_latest', array('no_approvals' => $ca["1"])) + ); + } + if(isset($tmpa["-1"])) { + $out[] = array( + '-1', + 'approval', + 'rejected', + getMLText('approvals_rejected', array('no_approvals' => count($tmpa["-1"]))), + getMLText('approvals_rejected_latest', array('no_approvals' => $ca["-1"])) + ); + } + ?> - - -formField( - getMLText('approvals_accepted', array('no_approvals' => count($tmpa["1"]))), - array( - 'element'=>'input', - 'type'=>'checkbox', - 'name'=>'status[approval][]', - 'value'=>'1', - 'checked'=>true - ), - array( - 'field_wrap' => array('") - ) - ); -?> - - -formField( - getMLText('approvals_rejected', array('no_approvals' => count($tmpa["-1"]))), - array( - 'element'=>'input', - 'type'=>'checkbox', - 'name'=>'status[approval][]', - 'value'=>'-1', - 'checked'=>true - ), - array( - 'field_wrap' => array('") - ) - ); -?> - + + + + + + "; + foreach($out as $o) { + echo "
      ".$o[3]."".$o[4]."getId()."\" data-task=\"".$o[1]."s_".$o[2]."\">
      "; + /* $options = array(); $allUsers = $dms->getAllUsers($sortusersinlist); @@ -345,7 +304,6 @@ $(document).ready( function() { ) ); */ - $this->contentContainerEnd(); $this->formSubmit(" ".getMLText('rm_user_from_processes')); ?> From 53af7e3173bd8af841a3d77f3ec348cd474299c2 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 30 Apr 2021 07:57:27 +0200 Subject: [PATCH 80/91] add methods cmp_user_login() and cmp_user_fullname() --- inc/inc.Utils.php | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/inc/inc.Utils.php b/inc/inc.Utils.php index 82bee8308..9492e45d4 100644 --- a/inc/inc.Utils.php +++ b/inc/inc.Utils.php @@ -778,6 +778,44 @@ function createNonce() { /* {{{ */ return base64_encode($bytes); } /* }}} */ +/** + * Compare function for sorting users by login + * + * Use this for usort() + * + * + * $users = $dms->getAllUsers(); + * usort($users, 'cmp_user_login'); + * + */ +function cmp_user_login($a, $b) { /* {{{ */ + $as = strtolower($a->getLogin()); + $bs = strtolower($b->getLogin()); + if ($as == $bs) { + return 0; + } + return ($as < $bs) ? -1 : 1; +} /* }}} */ + +/** + * Compare function for sorting users by name + * + * Use this for usort() + * + * + * $users = $dms->getAllUsers(); + * usort($users, 'cmp_user_fullname'); + * + */ +function cmp_user_fullname($a, $b) { /* {{{ */ + $as = strtolower($a->getFullName()); + $bs = strtolower($b->getFullName()); + if ($as == $bs) { + return 0; + } + return ($as < $bs) ? -1 : 1; +} /* }}} */ + /** * Returns the mandatory reviewers * From 751e91ceafe7e816217e6c6a96e570aefed57043 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 30 Apr 2021 09:03:11 +0200 Subject: [PATCH 81/91] sync with bootstrap style, remove old hooks --- views/bootstrap4/class.Bootstrap4.php | 61 +++++++++++---------------- 1 file changed, 24 insertions(+), 37 deletions(-) diff --git a/views/bootstrap4/class.Bootstrap4.php b/views/bootstrap4/class.Bootstrap4.php index c0a63d1f9..cb2e82fab 100644 --- a/views/bootstrap4/class.Bootstrap4.php +++ b/views/bootstrap4/class.Bootstrap4.php @@ -79,12 +79,8 @@ class SeedDMS_Theme_Style extends SeedDMS_View_Common { header($name . ": " . $value); } } - $hookObjs = $this->getHookObjects('SeedDMS_View_Bootstrap'); - foreach($hookObjs as $hookObj) { - if (method_exists($hookObj, 'startPage')) { - $hookObj->startPage($this); - } - } + if($this->hasHook('startPage')) + $this->callHook('startPage'); echo "\n"; echo "\n\n"; echo "\n"; @@ -147,11 +143,8 @@ background-image: linear-gradient(to bottom, #882222, #111111);; echo "
      ".$flashmsg['msg']."
      \n"; } echo "

      ".getMLText('recent_uploads')."

      \n"; - foreach($hookObjs as $hookObj) { - if (method_exists($hookObj, 'startBody')) { - $hookObj->startBody($this); - } - } + if($this->hasHook('startBody')) + $this->callHook('startBody'); } /* }}} */ function htmlAddHeader($head, $type='js') { /* {{{ */ @@ -166,13 +159,9 @@ background-image: linear-gradient(to bottom, #882222, #111111);; 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); - } - } + if($this->hasHook('footNote')) + $html = $this->callHook('footNote', $html); echo $html; if($this->params['showmissingtranslations']) { $this->missingLanguageKeys(); @@ -317,15 +306,11 @@ background-image: linear-gradient(to bottom, #882222, #111111);; } echo " \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 4d471ed592b84dea51147afb756cc24d6c7857cb Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 30 Apr 2021 09:25:11 +0200 Subject: [PATCH 82/91] fix layout of recipient list, add field to filter table rows --- views/bootstrap/class.ViewDocument.php | 42 ++++++++++++++++++-------- 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/views/bootstrap/class.ViewDocument.php b/views/bootstrap/class.ViewDocument.php index 1a9759d4c..ad9027a3c 100644 --- a/views/bootstrap/class.ViewDocument.php +++ b/views/bootstrap/class.ViewDocument.php @@ -168,6 +168,16 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Theme_Style { header('Content-Type: application/javascript; charset=UTF-8'); parent::jsTranslations(array('cancel', 'splash_move_document', 'confirm_move_document', 'move_document', 'confirm_transfer_link_document', 'transfer_content', 'link_document', 'splash_move_folder', 'confirm_move_folder', 'move_folder')); +?> + $(document).ready(function(){ + $("#filterRecipientsInput").on("keyup", function() { + var value = $(this).val().toLowerCase(); + $("#filterRecipientsTable tbody tr").filter(function() { + $(this).toggle($(this).text().toLowerCase().indexOf(value) > -1) + }); + }); + }); +isAdmin()) { $latestContent = $this->callHook('documentLatestContent', $document); if($latestContent === null) @@ -1307,15 +1317,22 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Theme_Style { if(is_string($txt)) echo $txt; - print "\n"; + if(count($receiptStatus) > 8) { + echo ''; + } + print "
        \n"; + + print "\n"; print "\n"; - print "\n"; - print "\n"; - print ""; - print "\n"; - print "\n"; + print "\n"; + print "\n"; + print ""; + print "\n"; + print "\n"; print "\n"; + print "\n"; + print "\n"; $stat = array('-1'=>0, '0'=>0, '1'=>0, '-2'=>0); foreach ($receiptStatus as $r) { @@ -1372,11 +1389,11 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Theme_Style { } print "\n"; print "\n"; - print ""; + print (is_object($updateUser) ? htmlspecialchars($updateUser->getFullName()." (".$updateUser->getLogin().")") : "unknown user id '".$r["userID"]."'"); + print ""; print "\n"; print "
        ".getMLText("name")."".getMLText("last_update")."".getMLText("comment")."".getMLText("status")."".(($count($receiptStatus) > 5) ? '' : getMLText('name'))."".getMLText("last_update")."".getMLText("comment")."".getMLText("status")."
        ".$reqName."
        • ".getLongReadableDate($r["date"])."
        • "; + print "
        ".getLongReadableDate($r["date"])."
        "; /* $updateUser is the user who has done the receipt */ $updateUser = $dms->getUser($r["userID"]); - print "
      • ".(is_object($updateUser) ? htmlspecialchars($updateUser->getFullName()." (".$updateUser->getLogin().")") : "unknown user id '".$r["userID"]."'")."
      • "; - print "
        ".htmlspecialchars($r["comment"]).""; if($class) @@ -1400,6 +1417,7 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Theme_Style { } } ?> +
        contentContainerEnd(); @@ -1410,9 +1428,9 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Theme_Style {
        -
        +
        -
        +
        @@ -1449,7 +1467,7 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Theme_Style { contentContainerStart(); - print "\n"; + print "
        \n"; print "\n"; print "\n"; From 98f7fc85f480f80bb8d7f7439a9ce6a697708823 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 30 Apr 2021 09:27:59 +0200 Subject: [PATCH 83/91] 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 ""; foreach($wkflogt as $wkflog) { echo ""; - echo ""; + echo ""; echo ""; echo ""; $loguser = $wkflog->getUser(); @@ -1325,7 +1325,7 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Theme_Style { print "\n"; print "\n"; - print "\n"; + print "\n"; print "\n"; print ""; print "\n"; From 30eadac7cdf4c09196a3251e4f861b42fbb7bcb2 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 30 Apr 2021 11:48:03 +0200 Subject: [PATCH 85/91] move filter field for recipients into head of table --- views/bootstrap/class.ViewDocument.php | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/views/bootstrap/class.ViewDocument.php b/views/bootstrap/class.ViewDocument.php index 4b07ab20a..3069928b5 100644 --- a/views/bootstrap/class.ViewDocument.php +++ b/views/bootstrap/class.ViewDocument.php @@ -1317,15 +1317,11 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Theme_Style { if(is_string($txt)) echo $txt; - if(count($receiptStatus) > 8) { - echo ''; - } - print "
        ".getMLText("name")."
        ".$wkflog->getWorkflow()->getName()."".htmlspecialchars($wkflog->getWorkflow()->getName())."".$wkflog->getDate()."".htmlspecialchars($wkflog->getTransition()->getAction()->getName())."
        ".(($count($receiptStatus) > 5) ? '' : getMLText('name'))."".((count($receiptStatus) > 5) ? '' : getMLText('name'))."".getMLText("last_update")."".getMLText("comment")."".getMLText("status")."
        \n"; print "\n"; print "\n"; - print "\n"; + print "\n"; print "\n"; print ""; print "\n"; From bb5a79ba70e006a52a054f1b2fa5fe66e8caee8e Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 30 Apr 2021 11:48:28 +0200 Subject: [PATCH 86/91] add changes for 6.0.16 --- CHANGELOG | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG b/CHANGELOG index 615613127..f3f57e113 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -2,6 +2,7 @@ Changes in version 6.0.16 -------------------------------------------------------------------------------- - cancel checkout needs confirmation +- add input field to filter list of recipients if more then 10 -------------------------------------------------------------------------------- Changes in version 6.0.15 From 13001867be61356d0082cb89c0a58fd3aebead9c Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 30 Apr 2021 14:48:13 +0200 Subject: [PATCH 87/91] pass accessobject to exitError view --- inc/inc.ClassUI.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/inc/inc.ClassUI.php b/inc/inc.ClassUI.php index d88cd2eff..86b776214 100644 --- a/inc/inc.ClassUI.php +++ b/inc/inc.ClassUI.php @@ -180,10 +180,12 @@ class UI extends UI_Default { } /* }}} */ static function exitError($pagetitle, $error, $noexit=false, $plain=false) { - global $theme, $dms, $user; + global $theme, $dms, $user, $settings; + $accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings); $view = UI::factory($theme, 'ErrorDlg'); $view->setParam('dms', $dms); $view->setParam('user', $user); + $view->setParam('accessobject', $accessop); $view->setParam('pagetitle', $pagetitle); $view->setParam('errormsg', $error); $view->setParam('plain', $plain); From 4ec36dc6db73b2508256aa555d61225435ecd02d Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 30 Apr 2021 14:48:40 +0200 Subject: [PATCH 88/91] pass accessobject to view --- out/out.ErrorDlg.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/out/out.ErrorDlg.php b/out/out.ErrorDlg.php index bbea7a3ec..6681f02c8 100644 --- a/out/out.ErrorDlg.php +++ b/out/out.ErrorDlg.php @@ -37,7 +37,10 @@ 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($view) { + $view->setParam('accessobject', $accessop); $view($_GET); exit; } From 8be856e68839532baa94384b3829306a65a1d86f Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 30 Apr 2021 14:49:02 +0200 Subject: [PATCH 89/91] check for quota and duplicate content when uploading new doc or version --- restapi/index.php | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/restapi/index.php b/restapi/index.php index 74e5f637b..7f1eefb75 100644 --- a/restapi/index.php +++ b/restapi/index.php @@ -595,6 +595,13 @@ class RestapiController { /* {{{ */ return $response->withJson(array('success'=>false, 'message'=>'No parent folder id given', 'data'=>''), 400); } + if($settings->_quota > 0) { + $remain = checkQuota($userobj); + if ($remain < 0) { + return $response->withJson(array('success'=>false, 'message'=>'Quota exceeded', 'data'=>''), 400); + } + } + $mfolder = $dms->getFolder($args['id']); if($mfolder) { $uploadedFiles = $request->getUploadedFiles(); @@ -692,6 +699,7 @@ class RestapiController { /* {{{ */ function updateDocument($request, $response, $args) { /* {{{ */ $dms = $this->container->dms; $userobj = $this->container->userobj; + $settings = $this->container->config; if(!$userobj) { return $response->withJson(array('success'=>false, 'message'=>'Not logged in', 'data'=>''), 403); @@ -701,6 +709,13 @@ class RestapiController { /* {{{ */ return $response->withJson(array('success'=>false, 'message'=>'No document id given', 'data'=>''), 400); } + if($settings->_quota > 0) { + $remain = checkQuota($userobj); + if ($remain < 0) { + return $response->withJson(array('success'=>false, 'message'=>'Quota exceeded', 'data'=>''), 400); + } + } + $document = $dms->getDocument($args['id']); if($document) { if ($document->getAccessMode($userobj, 'updateDocument') >= M_READWRITE) { @@ -726,7 +741,13 @@ class RestapiController { /* {{{ */ $file_info = array_pop($uploadedFiles); if ($origfilename == null) $origfilename = $file_info->getClientFilename(); - $temp = $file_info->file; + $temp = $file_info->file; + + /* Check if the uploaded file is identical to last version */ + $lc = $document->getLatestContent(); + if($lc->getChecksum() == SeedDMS_Core_File::checksum($temp)) { + return $response->withJson(array('success'=>false, 'message'=>'Uploaded file identical to last version', 'data'=>''), 400); + } $finfo = finfo_open(FILEINFO_MIME_TYPE); $userfiletype = finfo_file($finfo, $temp); $fileType = ".".pathinfo($origfilename, PATHINFO_EXTENSION); @@ -762,7 +783,15 @@ class RestapiController { /* {{{ */ if(!ctype_digit($args['id']) || $args['id'] == 0) { return $response->withJson(array('success'=>false, 'message'=>'No document id given', 'data'=>''), 400); - } + } + + if($settings->_quota > 0) { + $remain = checkQuota($userobj); + if ($remain < 0) { + return $response->withJson(array('success'=>false, 'message'=>'Quota exceeded', 'data'=>''), 400); + } + } + $mfolder = $dms->getFolder($args['id']); if($mfolder) { if ($mfolder->getAccessMode($userobj, 'addDocument') >= M_READWRITE) { From 0ba7aaf9b16ede7752dc19b914d3a03dd4310336 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 30 Apr 2021 14:49:38 +0200 Subject: [PATCH 90/91] add css class to make look nice with bootstrap4 --- views/bootstrap/class.Settings.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/views/bootstrap/class.Settings.php b/views/bootstrap/class.Settings.php index d4b3fbd9d..b18244603 100644 --- a/views/bootstrap/class.Settings.php +++ b/views/bootstrap/class.Settings.php @@ -32,13 +32,13 @@ class SeedDMS_View_Settings extends SeedDMS_Theme_Style { protected function showPaneHeader($name, $title, $isactive) { /* {{{ */ - echo '
      • '.$title.'
      • '."\n"; + echo ''."\n"; } /* }}} */ protected function showStartPaneContent($name, $isactive) { /* {{{ */ echo '
        '; $this->contentContainerStart(); - echo '
        ".((count($receiptStatus) > 5) ? '' : getMLText('name'))."".((count($receiptStatus) > 10) ? '' : getMLText('name'))."".getMLText("last_update")."".getMLText("comment")."".getMLText("status")."
        '; + 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 {
        : - - $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 91/91] 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