diff --git a/CHANGELOG b/CHANGELOG index 319ac4c79..916a3e1b4 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -7,6 +7,12 @@ - do not use md5 password hashing anymore, hashes will be updated automatically when passwords are reset +-------------------------------------------------------------------------------- + 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 -------------------------------------------------------------------------------- @@ -201,6 +207,13 @@ - add document list which can be exported as an archive - search results can be exported +-------------------------------------------------------------------------------- + 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 +- check for quota and duplicate content in restapi + -------------------------------------------------------------------------------- Changes in version 5.1.22 -------------------------------------------------------------------------------- diff --git a/Gruntfile.js b/Gruntfile.js index e1015ea84..1ad6013f0 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'; @@ -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: [ @@ -152,6 +173,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: [ 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(); diff --git a/SeedDMS_Core/Core/inc.ClassUser.php b/SeedDMS_Core/Core/inc.ClassUser.php index 5b8732bc7..7f3b24a3f 100644 --- a/SeedDMS_Core/Core/inc.ClassUser.php +++ b/SeedDMS_Core/Core/inc.ClassUser.php @@ -1197,7 +1197,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 && $ri['status'] == 0) ? 'Reviewer replaced by '.$newuser->getLogin() : 'Reviewer removed from process')."', ".$db->getCurrentDatetime().", '". $user->getID() ."')"; $res=$db->getResult($queryStr); if(!$res) { $db->rollbackTransaction(); @@ -1226,7 +1226,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 && $ai['status'] == 0)? 'Approver replaced by '.$newuser->getLogin() : 'Approver removed from process')."', ".$db->getCurrentDatetime().", '". $user->getID() ."')"; $res=$db->getResult($queryStr); if(!$res) { $db->rollbackTransaction(); @@ -1255,7 +1255,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 && $ri['status'] == 0) ? 'Recipient replaced by '.$newuser->getLogin() : 'Recipient removed from process')."', ".$db->getCurrentDatetime().", '". $user->getID() ."')"; $res=$db->getResult($queryStr); if(!$res) { $db->rollbackTransaction(); @@ -1284,7 +1284,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 && in_array($ri['status'], array(S_LOG_WAITING, S_LOG_SLEEPING))) ? '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 5fda31e52..68c6b6e8d 100644 --- a/SeedDMS_Core/package.xml +++ b/SeedDMS_Core/package.xml @@ -2169,7 +2169,7 @@ better error checking in SeedDMS_Core_Document::cancelCheckOut() - 2021-04-07 + 2021-04-13 6.0.15 @@ -2189,5 +2189,23 @@ better error checking in SeedDMS_Core_Document::cancelCheckOut() days for list DueRevisions + + 2021-04-13 + + + 6.0.16 + 6.0.16 + + + stable + stable + + 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 + + diff --git a/SeedDMS_SQLiteFTS/SQLiteFTS/Indexer.php b/SeedDMS_SQLiteFTS/SQLiteFTS/Indexer.php index 6b209cb58..2eb15428b 100644 --- a/SeedDMS_SQLiteFTS/SQLiteFTS/Indexer.php +++ b/SeedDMS_SQLiteFTS/SQLiteFTS/Indexer.php @@ -23,18 +23,31 @@ * @version Release: @package_version@ */ class SeedDMS_SQLiteFTS_Indexer { + + /** + * @var string $ftstype + * @access protected + */ + protected $_ftstype; + /** * @var object $index sqlite index * @access protected */ protected $_conn; + const ftstype = 'fts5'; /** * Constructor * */ function __construct($indexerDir) { /* {{{ */ $this->_conn = new PDO('sqlite:'.$indexerDir.'/index.db'); + $this->_ftstype = self::ftstype; + if($this->_ftstype == 'fts5') + $this->_rawid = 'rowid'; + else + $this->_rawid = 'docid'; } /* }}} */ /** @@ -62,19 +75,33 @@ class SeedDMS_SQLiteFTS_Indexer { * in SeedDMS_SQLiteFTS_Term */ $version = SQLite3::version(); - if($version['versionNumber'] >= 3008000) - $sql = 'CREATE VIRTUAL TABLE docs USING fts4(documentid, title, comment, keywords, category, mimetype, origfilename, owner, content, created, users, status, path, notindexed=created, matchinfo=fts3)'; - else - $sql = 'CREATE VIRTUAL TABLE docs USING fts4(documentid, title, comment, keywords, category, mimetype, origfilename, owner, content, created, users, status, path, matchinfo=fts3)'; - $res = $index->_conn->exec($sql); - if($res === false) { + if(self::ftstype == 'fts4') { + if($version['versionNumber'] >= 3008000) + $sql = 'CREATE VIRTUAL TABLE docs USING fts4(documentid, title, comment, keywords, category, mimetype, origfilename, owner, content, created, users, status, path, notindexed=created, matchinfo=fts3)'; + else + $sql = 'CREATE VIRTUAL TABLE docs USING fts4(documentid, title, comment, keywords, category, mimetype, origfilename, owner, content, created, users, status, path, matchinfo=fts3)'; + $res = $index->_conn->exec($sql); + if($res === false) { + return null; + } + $sql = 'CREATE VIRTUAL TABLE docs_terms USING fts4aux(docs);'; + $res = $index->_conn->exec($sql); + if($res === false) { + return null; + } + } elseif(self::ftstype == 'fts5') { + $sql = 'CREATE VIRTUAL TABLE docs USING fts5(documentid, title, comment, keywords, category, mimetype, origfilename, owner, content, created unindexed, users, status, path)'; + $res = $index->_conn->exec($sql); + if($res === false) { + return null; + } + $sql = 'CREATE VIRTUAL TABLE docs_terms USING fts5vocab(docs, \'col\');'; + $res = $index->_conn->exec($sql); + if($res === false) { + return null; + } + } else return null; - } - $sql = 'CREATE VIRTUAL TABLE docs_terms USING fts4aux(docs);'; - $res = $index->_conn->exec($sql); - if($res === false) { - return null; - } return($index); } /* }}} */ @@ -116,7 +143,7 @@ class SeedDMS_SQLiteFTS_Indexer { if(!$this->_conn) return false; - $sql = "DELETE FROM docs WHERE docid=".(int) $id; + $sql = "DELETE FROM docs WHERE ".$this->_rawid."=".(int) $id; $res = $this->_conn->exec($sql); return $res; } /* }}} */ @@ -150,10 +177,13 @@ class SeedDMS_SQLiteFTS_Indexer { $res = $this->_conn->query($sql); $row = $res->fetch(); - $sql = "SELECT docid, documentid FROM docs"; + $sql = "SELECT ".$this->_rawid.", documentid FROM docs"; if($query) $sql .= " WHERE docs MATCH ".$this->_conn->quote($query); - $res = $this->_conn->query($sql); + if($this->_ftstype == 'fts5') + //$sql .= " ORDER BY rank"; + // boost documentid, title and comment + $sql .= " ORDER BY bm25(docs, 10.0, 10.0, 10.0)"; if(!empty($limit['limit'])) $sql .= " LIMIT ".(int) $limit['limit']; if(!empty($limit['offset'])) @@ -163,7 +193,7 @@ class SeedDMS_SQLiteFTS_Indexer { if($res) { foreach($res as $rec) { $hit = new SeedDMS_SQLiteFTS_QueryHit($this); - $hit->id = $rec['docid']; + $hit->id = $rec[$this->_rawid]; $hit->documentid = $rec['documentid']; $hits[] = $hit; } @@ -181,13 +211,13 @@ class SeedDMS_SQLiteFTS_Indexer { if(!$this->_conn) return false; - $sql = "SELECT docid FROM docs WHERE docid=".(int) $id; + $sql = "SELECT ".$this->_rawid." FROM docs WHERE ".$this->_rawid."=".(int) $id; $res = $this->_conn->query($sql); $hits = array(); if($res) { while($rec = $res->fetch(PDO::FETCH_ASSOC)) { $hit = new SeedDMS_SQLiteFTS_QueryHit($this); - $hit->id = $rec['docid']; + $hit->id = $rec[$this->_rawid]; $hits[] = $hit; } } @@ -204,13 +234,13 @@ class SeedDMS_SQLiteFTS_Indexer { if(!$this->_conn) return false; - $sql = "SELECT docid, documentid, title, comment, owner, keywords, category, mimetype, origfilename, created, users, status, path FROM docs WHERE docid=".$id; + $sql = "SELECT ".$this->_rawid.", documentid, title, comment, owner, keywords, category, mimetype, origfilename, created, users, status, path FROM docs WHERE documentid='D".$id."'"; $res = $this->_conn->query($sql); $doc = false; if($res) { $rec = $res->fetch(PDO::FETCH_ASSOC); $doc = new SeedDMS_SQLiteFTS_Document(); - $doc->addField('docid', $rec['docid']); + $doc->addField('docid', $rec[$this->_rawid]); $doc->addField('document_id', $rec['documentid']); $doc->addField('title', $rec['title']); $doc->addField('comment', $rec['comment']); @@ -237,13 +267,13 @@ class SeedDMS_SQLiteFTS_Indexer { if(!$this->_conn) return false; - $sql = "SELECT docid, documentid, title, comment, owner, keywords, category, mimetype, origfilename, created, users, status, path FROM docs WHERE documentid='F".$id."'"; + $sql = "SELECT ".$this->_rawid.", documentid, title, comment, owner, keywords, category, mimetype, origfilename, created, users, status, path FROM docs WHERE documentid='F".$id."'"; $res = $this->_conn->query($sql); $doc = false; if($res) { $rec = $res->fetch(PDO::FETCH_ASSOC); $doc = new SeedDMS_SQLiteFTS_Document(); - $doc->addField('docid', $rec['docid']); + $doc->addField('docid', $rec[$this->_rawid]); $doc->addField('document_id', $rec['documentid']); $doc->addField('title', $rec['title']); $doc->addField('comment', $rec['comment']); @@ -264,7 +294,10 @@ class SeedDMS_SQLiteFTS_Indexer { if(!$this->_conn) return false; - $sql = "SELECT term, col, occurrences FROM docs_terms WHERE col!='*' ORDER BY col"; + if($this->_ftstype == 'fts5') + $sql = "SELECT term, col, doc as occurrences FROM docs_terms WHERE col!='*' ORDER BY col"; + else + $sql = "SELECT term, col, occurrences FROM docs_terms WHERE col!='*' ORDER BY col"; $res = $this->_conn->query($sql); $terms = array(); if($res) { diff --git a/SeedDMS_SQLiteFTS/SQLiteFTS/Term.php b/SeedDMS_SQLiteFTS/SQLiteFTS/Term.php index a996ee962..462d6123e 100644 --- a/SeedDMS_SQLiteFTS/SQLiteFTS/Term.php +++ b/SeedDMS_SQLiteFTS/SQLiteFTS/Term.php @@ -62,7 +62,11 @@ class SeedDMS_SQLiteFTS_Term { 11 => 'status', 12 => 'path' ); - $this->field = $fields[$col]; + /* fts5 pass the column name in $col, fts4 uses an integer */ + if(is_int($col)) + $this->field = $fields[$col]; + else + $this->field = $col; //$fields[$col]; $this->_occurrence = $occurrence; } /* }}} */ diff --git a/SeedDMS_SQLiteFTS/package.xml b/SeedDMS_SQLiteFTS/package.xml index 424c76ecc..1fddaeb00 100644 --- a/SeedDMS_SQLiteFTS/package.xml +++ b/SeedDMS_SQLiteFTS/package.xml @@ -11,11 +11,11 @@ uwe@steinmann.cx yes - 2020-12-12 + 2021-04-19 - 1.0.15 - 1.0.15 + 1.0.16 + 1.0.16 stable @@ -23,7 +23,7 @@ GPL License -- add indexing folders +- add support for fts5 (make it the default) @@ -312,5 +312,21 @@ add user to list of terms and SeedDMS_Lucene_Indexer::open() + + 2020-12-12 + + + 1.0.15 + 1.0.15 + + + stable + stable + + GPL License + +- add indexing folders + + diff --git a/ext/example/class.example.php b/ext/example/class.example.php index a0a5814a3..c01d3acfd 100644 --- a/ext/example/class.example.php +++ b/ext/example/class.example.php @@ -183,10 +183,13 @@ class SeedDMS_ExtExample_Task extends SeedDMS_SchedulerTaskBase { * Run the task * * @param $task task to be executed - * @param $dms dms * @return boolean true if task was executed succesfully, otherwise false */ - public function execute($task, $dms, $user) { + public function execute($task) { + $dms = $this->dms; + $user = $this->user; + $settings = $this->settings; + $logger = $this->logger; $taskparams = $task->getParameter(); return true; } diff --git a/inc/inc.ClassControllerCommon.php b/inc/inc.ClassControllerCommon.php index 9582fc2b3..b4eb995bb 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.ClassUI.php b/inc/inc.ClassUI.php index 7beab4283..4114cb7f2 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 = ''; } @@ -102,15 +108,21 @@ 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) { - require($filename); + /* Always include the base class which defines class SeedDMS_Theme_Style */ + require_once($settings->_rootDir."views/".$theme."/class.".ucfirst($theme).".php"); + require_once($filename); $view = new $classname($params, $theme); /* Set some configuration parameters */ $view->setParam('accessobject', new SeedDMS_AccessOperation($dms, $user, $settings)); $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); @@ -171,10 +183,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); diff --git a/inc/inc.ClassViewCommon.php b/inc/inc.ClassViewCommon.php index b9672056a..3667d981a 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,15 +153,7 @@ class SeedDMS_View_Common { * function returns */ public 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]; - } - /* 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)])) { @@ -174,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 */ @@ -197,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) { diff --git a/inc/inc.FulltextInit.php b/inc/inc.FulltextInit.php new file mode 100644 index 000000000..73e2bcfbe --- /dev/null +++ b/inc/inc.FulltextInit.php @@ -0,0 +1,48 @@ +_enableFullSearch) { + require_once("inc.ClassFulltextService.php"); + $fulltextservice = new SeedDMS_FulltextService(); + + if($settings->_fullSearchEngine == 'sqlitefts') { + $indexconf = array( + 'Indexer' => 'SeedDMS_SQLiteFTS_Indexer', + 'Search' => 'SeedDMS_SQLiteFTS_Search', + 'IndexedDocument' => 'SeedDMS_SQLiteFTS_IndexedDocument', + 'Conf' => array('indexdir' => $settings->_luceneDir) + ); + $fulltextservice->addService('sqlitefts', $indexconf); + + require_once('SeedDMS/SQLiteFTS.php'); + } elseif($settings->_fullSearchEngine == 'lucene') { + $indexconf = array( + 'Indexer' => 'SeedDMS_Lucene_Indexer', + 'Search' => 'SeedDMS_Lucene_Search', + 'IndexedDocument' => 'SeedDMS_Lucene_IndexedDocument', + 'Conf' => array('indexdir' => $settings->_luceneDir) + ); + $fulltextservice->addService('lucene', $indexconf); + + if(!empty($settings->_luceneClassDir)) + require_once($settings->_luceneClassDir.'/Lucene.php'); + else + require_once('SeedDMS/Lucene.php'); + } else { + $indexconf = null; + if(isset($GLOBALS['SEEDDMS_HOOKS']['initFulltext'])) { + foreach($GLOBALS['SEEDDMS_HOOKS']['initFulltext'] as $hookObj) { + if (method_exists($hookObj, 'initFulltextService')) { + $indexconf = $hookObj->initFulltextService(array('engine'=>$settings->_fullSearchEngine, 'dms'=>$dms, 'settings'=>$settings)); + } + } + } + if($indexconf) { + $fulltextservice->addService($settings->_fullSearchEngine, $indexconf); + } + } + $fulltextservice->setConverters(isset($settings->_converters['fulltext']) ? $settings->_converters['fulltext'] : null); + $fulltextservice->setMaxSize($settings->_maxSizeForFullText); + $fulltextservice->setCmdTimeout($settings->_cmdTimeout); +} + diff --git a/inc/inc.Tasks.php b/inc/inc.Tasks.php index a7cc19c83..246f5cb8b 100644 --- a/inc/inc.Tasks.php +++ b/inc/inc.Tasks.php @@ -193,11 +193,13 @@ class SeedDMS_IndexingDocumentsTask extends SeedDMS_SchedulerTaskBase { /* {{{ * } } } - } - $folderprocess = new SeedDMS_Task_Indexer_Process_Folder($fulltextservice, $recreate); - $tree = new SeedDMS_FolderTree($folder, array($folderprocess, 'process')); - call_user_func(array($folderprocess, 'process'), $folder); + $folderprocess = new SeedDMS_Task_Indexer_Process_Folder($fulltextservice, $recreate); + $tree = new SeedDMS_FolderTree($folder, array($folderprocess, 'process')); + call_user_func(array($folderprocess, 'process'), $folder); + } else { + $logger->log('Task \'indexingdocs\': fulltext search is turned off', PEAR_LOG_WARNING); + } return true; } diff --git a/inc/inc.Utils.php b/inc/inc.Utils.php index 626472576..d55f67d37 100644 --- a/inc/inc.Utils.php +++ b/inc/inc.Utils.php @@ -478,10 +478,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); } } /* }}} */ @@ -808,6 +808,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 * 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' => '下次啟用', diff --git a/op/op.AddDocument.php b/op/op.AddDocument.php index f8fac3c1c..2e4890193 100644 --- a/op/op.AddDocument.php +++ b/op/op.AddDocument.php @@ -80,7 +80,7 @@ $version_comment = !empty($_POST["version_comment"]) ? trim($_POST["version_comm if($version_comment == "" && isset($_POST["use_comment"])) $version_comment = $comment; -$keywords = trim($_POST["keywords"]); +$keywords = isset($_POST["keywords"]) ? trim($_POST["keywords"]) : ''; $categories = isset($_POST["categories"]) ? $_POST["categories"] : null; $cats = array(); if($categories) { diff --git a/op/op.Ajax.php b/op/op.Ajax.php index 398e7e23f..244abc8b4 100644 --- a/op/op.Ajax.php +++ b/op/op.Ajax.php @@ -331,6 +331,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(); diff --git a/op/op.CancelCheckOut.php b/op/op.CancelCheckOut.php index c3a1ce270..bed1b5013 100644 --- a/op/op.CancelCheckOut.php +++ b/op/op.CancelCheckOut.php @@ -41,6 +41,10 @@ if(empty($settings->_enableCancelCheckout)) { UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("operation_disallowed")); } +if(empty($_POST['confirm'])) { + UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("operation_disallowed")); +} + $document->cancelCheckOut($comment); if (is_bool($result) && !$result) { UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("error_occured")); diff --git a/out/out.ChangePassword.php b/out/out.ChangePassword.php index 3d7153d19..3bd9572e8 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"); 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; } diff --git a/out/out.ExpiredDocuments.php b/out/out.ExpiredDocuments.php index 8a11d7ec5..d79a37f58 100644 --- a/out/out.ExpiredDocuments.php +++ b/out/out.ExpiredDocuments.php @@ -36,10 +36,6 @@ if (!$accessop->check_view_access($view, $_GET)) { UI::exitError(getMLText("my_documents"),getMLText("access_denied")); } -if ($user->isGuest()) { - UI::exitError(getMLText("expired_documents"),getMLText("access_denied")); -} - $orderby='e'; if (isset($_GET["orderby"]) && strlen($_GET["orderby"])==1 ) { $orderby=$_GET["orderby"]; diff --git a/out/out.Login.php b/out/out.Login.php index 99a0dffff..8fc053f1d 100644 --- a/out/out.Login.php +++ b/out/out.Login.php @@ -27,6 +27,7 @@ require_once("inc/inc.Language.php"); require_once("inc/inc.Init.php"); require_once("inc/inc.Extension.php"); require_once("inc/inc.ClassAccessOperation.php"); +require_once("inc/inc.DBInit.php"); require_once("inc/inc.ClassUI.php"); include $settings->_rootDir . "languages/" . $settings->_language . "/lang.inc"; diff --git a/out/out.ManageNotify.php b/out/out.ManageNotify.php index 8ab2f115a..05e7f0adf 100644 --- a/out/out.ManageNotify.php +++ b/out/out.ManageNotify.php @@ -30,7 +30,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, $user, $settings); - if ($user->isGuest()) { UI::exitError(getMLText("my_account"),getMLText("access_denied")); } diff --git a/out/out.PasswordForgotten.php b/out/out.PasswordForgotten.php index 6afce5959..70d93b1b4 100644 --- a/out/out.PasswordForgotten.php +++ b/out/out.PasswordForgotten.php @@ -42,6 +42,7 @@ if (isset($_REQUEST["referuri"]) && strlen($_REQUEST["referuri"])>0) { if($view) { $view->setParam('accessobject', $accessop); $view->setParam('referrer', $referrer); + $view->setParam('accessobject', $accessop); $view($_GET); exit; } diff --git a/out/out.RemoveDump.php b/out/out.RemoveDump.php index 9bf69b701..8a75999a0 100644 --- a/out/out.RemoveDump.php +++ b/out/out.RemoveDump.php @@ -42,6 +42,7 @@ $dumpname = $_GET["dumpname"]; if($view) { $view->setParam('dumpfile', $dumpname); + $view->setParam('accessobject', $accessop); $view($_GET); exit; } diff --git a/out/out.RemoveGroup.php b/out/out.RemoveGroup.php index 78d65b2d7..83ba873b0 100644 --- a/out/out.RemoveGroup.php +++ b/out/out.RemoveGroup.php @@ -46,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 bf3a0c4c5..2c72b8894 100644 --- a/out/out.RemoveLog.php +++ b/out/out.RemoveLog.php @@ -57,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.RemoveUserFromProcesses.php b/out/out.RemoveUserFromProcesses.php index 635049659..f395d9261 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; diff --git a/out/out.RemoveWorkflow.php b/out/out.RemoveWorkflow.php index 0d4b0ea6f..0f1b3c7d6 100644 --- a/out/out.RemoveWorkflow.php +++ b/out/out.RemoveWorkflow.php @@ -48,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.Session.php b/out/out.Session.php index 7adffc1bb..0e1d9c126 100644 --- a/out/out.Session.php +++ b/out/out.Session.php @@ -28,7 +28,6 @@ require_once("inc/inc.Init.php"); require_once("inc/inc.Extension.php"); require_once("inc/inc.DBInit.php"); require_once("inc/inc.ClassUI.php"); -require_once("inc/inc.ClassAccessOperation.php"); require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); diff --git a/out/out.ViewDocument.php b/out/out.ViewDocument.php index 2887e934c..ac0cc8616 100644 --- a/out/out.ViewDocument.php +++ b/out/out.ViewDocument.php @@ -28,7 +28,6 @@ require_once("inc/inc.Init.php"); require_once("inc/inc.Extension.php"); require_once("inc/inc.DBInit.php"); require_once("inc/inc.ClassUI.php"); -require_once("inc/inc.ClassAccessOperation.php"); require_once("inc/inc.Authentication.php"); $tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME'])); diff --git a/package.json b/package.json index ef7720150..b16c40b8b 100644 --- a/package.json +++ b/package.json @@ -10,8 +10,7 @@ "license": "ISC", "dependencies": { "@coreui/coreui": "^3.3.0", - "@coreui/icons": "^1.0.1", - "@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", @@ -34,6 +33,6 @@ "perfect-scrollbar": "^1.5.0", "popper.js": "^1.16.1", "select2": "^4.0.13", - "simple-line-icons": "^2.5.5" + "vis-timeline": "^7.4.7" } } diff --git a/restapi/index.php b/restapi/index.php index e402228c9..227631ec3 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) { diff --git a/views/bootstrap/class.Acl.php b/views/bootstrap/class.Acl.php index e26379ac6..0d3615d80 100644 --- a/views/bootstrap/class.Acl.php +++ b/views/bootstrap/class.Acl.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 Acl view @@ -27,7 +27,7 @@ require_once("class.Bootstrap.php"); * @copyright Copyright (C) 2016 Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_View_Acl extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_Acl extends SeedDMS_Theme_Style { function js() { /* {{{ */ $selrole = $this->params['selrole']; @@ -241,10 +241,8 @@ $(document).ready( function() { if(!$settings->_advancedAcl) { $this->warningMsg(getMLText("access_control_is_off")); } -?> -
-
-rowStart(); + $this->columnStart(4); $this->contentHeading(getMLText("role")); ?>
@@ -267,11 +265,10 @@ $(document).ready( function() {
check_view_access($this, array('action'=>'info')) || $user->isAdmin()) { ?>
getID()."\"" : "") ?>>
- -
- -
columnEnd(); + $this->columnStart(8); $this->contentHeading(getMLText("access_control")); if($selrole) { @@ -285,10 +282,8 @@ $(document).ready( function() { -
-
-columnEnd(); + $this->rowEnd(); $this->contentEnd(); $this->htmlEndPage(); } /* }}} */ diff --git a/views/bootstrap/class.AddDocument.php b/views/bootstrap/class.AddDocument.php index 2d866475e..c838ef474 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() { /* {{{ */ $libraryfolder = $this->params['libraryfolder']; @@ -348,6 +348,46 @@ $(document).ready(function() { } $this->contentContainerEnd(); + if(!$nodocumentformfields || !in_array('notification', $nodocumentformfields)) { + $this->contentSubHeading(getMLText("add_document_notify")); + $this->contentContainerStart(); + + $options = array(); + $allUsers = $dms->getAllUsers($sortusersinlist); + foreach ($allUsers as $userObj) { + if (!$userObj->isGuest() && $folder->getAccessMode($userObj) >= M_READ) + $options[] = array($userObj->getID(), htmlspecialchars($userObj->getLogin() . " - " . $userObj->getFullName())); + } + $this->formField( + getMLText("individuals"), + array( + 'element'=>'select', + 'name'=>'notification_users[]', + 'class'=>'chzn-select', + 'attributes'=>array(array('data-placeholder', getMLText('select_ind_notification'))), + 'multiple'=>true, + 'options'=>$options + ) + ); + $options = array(); + $allGroups = $dms->getAllGroups(); + foreach ($allGroups as $groupObj) { + if ($folder->getGroupAccessMode($groupObj) >= M_READ) + $options[] = array($groupObj->getID(), htmlspecialchars($groupObj->getName())); + } + $this->formField( + getMLText("groups"), + array( + 'element'=>'select', + 'name'=>'notification_groups[]', + 'class'=>'chzn-select', + 'attributes'=>array(array('data-placeholder', getMLText('select_grp_notification'))), + 'multiple'=>true, + 'options'=>$options + ) + ); + $this->contentContainerEnd(); + } $this->columnEnd(); $this->columnStart(6); $this->contentSubHeading(getMLText("version_info")); @@ -771,46 +811,6 @@ $(document).ready(function() { $this->contentContainerEnd(); } - if(!$nodocumentformfields || !in_array('notification', $nodocumentformfields)) { - $this->contentSubHeading(getMLText("add_document_notify")); - $this->contentContainerStart(); - - $options = array(); - $allUsers = $dms->getAllUsers($sortusersinlist); - foreach ($allUsers as $userObj) { - if (!$userObj->isGuest() && $folder->getAccessMode($userObj) >= M_READ) - $options[] = array($userObj->getID(), htmlspecialchars($userObj->getLogin() . " - " . $userObj->getFullName())); - } - $this->formField( - getMLText("individuals"), - array( - 'element'=>'select', - 'name'=>'notification_users[]', - 'class'=>'chzn-select', - 'attributes'=>array(array('data-placeholder', getMLText('select_ind_notification'))), - 'multiple'=>true, - 'options'=>$options - ) - ); - $options = array(); - $allGroups = $dms->getAllGroups(); - foreach ($allGroups as $groupObj) { - if ($folder->getGroupAccessMode($groupObj) >= M_READ) - $options[] = array($groupObj->getID(), htmlspecialchars($groupObj->getName())); - } - $this->formField( - getMLText("groups"), - array( - 'element'=>'select', - 'name'=>'notification_groups[]', - 'class'=>'chzn-select', - 'attributes'=>array(array('data-placeholder', getMLText('select_grp_notification'))), - 'multiple'=>true, - 'options'=>$options - ) - ); - $this->contentContainerEnd(); - } $this->columnEnd(); $this->rowEnd(); $this->formSubmit(" ".getMLText('add_document')); 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..393e67510 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']; @@ -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(); ?> diff --git a/views/bootstrap/class.AdminTools.php b/views/bootstrap/class.AdminTools.php index 707c35c7e..61cfa6940 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,22 +29,30 @@ 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(); } /* }}} */ - 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() { /* {{{ */ @@ -59,7 +67,7 @@ class SeedDMS_View_AdminTools extends SeedDMS_Bootstrap_Style { $this->contentStart(); $this->pageNavigation(getMLText("admin_tools"), "admin_tools"); // $this->contentHeading(getMLText("admin_tools")); - $this->contentContainerStart(); +// $this->contentContainerStart(); ?>
callHook('beforeRows'); ?> @@ -172,7 +180,7 @@ class SeedDMS_View_AdminTools extends SeedDMS_Bootstrap_Style { callHook('afterRows'); ?>
contentContainerEnd(); +// $this->contentContainerEnd(); $this->contentEnd(); $this->htmlEndPage(); } /* }}} */ diff --git a/views/bootstrap/class.ApprovalSummary.php b/views/bootstrap/class.ApprovalSummary.php index 37151c0e5..57a17c7f6 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 03cf6a95d..ccfbad831 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']; @@ -79,7 +79,7 @@ $(document).ready( function() { foreach(array('document', 'folder', 'content') as $type) { $content = ''; if(isset($res['frequencies'][$type]) && $res['frequencies'][$type]) { - $content .= ""; + $content .= "
"; $content .= "\n\n"; $content .= "\n"; $content .= "\n"; @@ -172,7 +172,7 @@ $(document).ready( function() { - + contentContainerStart(); print ""; $this->printFolderChooserHtml("form1",M_READWRITE); - print ""; + print ""; print "\n"; $this->contentContainerEnd(); @@ -83,7 +83,7 @@ class SeedDMS_View_BackupTools extends SeedDMS_Bootstrap_Style { print ""; $this->printFolderChooserHtml("form2",M_READWRITE); print ""; - print ""; + print ""; print "\n"; } @@ -147,7 +147,7 @@ class SeedDMS_View_BackupTools extends SeedDMS_Bootstrap_Style { if($accessop->check_controller_access('CreateDump', array('action'=>'run'))) { print ""; - print ""; + print ""; print "\n"; } diff --git a/views/bootstrap/class.Bootstrap.php b/views/bootstrap/class.Bootstrap.php index 19b46b71e..fb013d1dc 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 @@ -79,12 +79,8 @@ class SeedDMS_Bootstrap_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"; @@ -103,8 +99,8 @@ class SeedDMS_Bootstrap_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 +114,10 @@ class SeedDMS_Bootstrap_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 { @@ -145,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') { /* {{{ */ @@ -164,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(); @@ -182,13 +173,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();'); } @@ -244,10 +235,9 @@ background-image: linear-gradient(to bottom, #882222, #111111);; global $MISSING_LANG, $LANG; if($MISSING_LANG) { echo '
'."\n"; - echo '
'."\n"; - echo '
'."\n"; - echo "

This page contains missing translations in the selected language. Please help to improve SeedDMS and provide the translation.

"; - echo "
"; + $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 "
".getMLText("attribute_value")."".getMLText("attribute_count")."
"; echo "\n"; foreach($MISSING_LANG as $key=>$lang) { @@ -256,7 +246,8 @@ background-image: linear-gradient(to bottom, #882222, #111111);; echo "
Keyengl. TextYour translation
"; echo "
There are missing translations on this page!
Please check the bottom of the page.
\n"; echo "\n"; - echo "\n"; + $this->columnEnd(); + $this->rowEnd(); } } /* }}} */ @@ -281,13 +272,13 @@ background-image: linear-gradient(to bottom, #882222, #111111);; } /* }}} */ function contentStart() { /* {{{ */ - echo "
\n"; + echo "
\n"; echo "
\n"; } /* }}} */ function contentEnd() { /* {{{ */ echo "
\n"; - echo "
\n"; + echo "\n"; } /* }}} */ function globalBanner() { /* {{{ */ @@ -382,6 +373,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"; @@ -396,12 +389,8 @@ background-image: linear-gradient(to bottom, #882222, #111111);; $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'); - $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'])."
  • "; @@ -449,7 +438,9 @@ 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']) { if($accessobject->check_view_access('Tasks', array('action'=>'menuTasks'))) { echo "
"; @@ -463,7 +454,9 @@ background-image: linear-gradient(to bottom, #882222, #111111);; //$this->addFooterJS('checkTasks();'); } } + /* }}} End of menu tasks */ + /* drop folder dir {{{ */ if($this->params['dropfolderdir'] && $this->params['enabledropfolderlist']) { echo "
"; echo "
"; echo "
"; } + /* }}} End of drop folder dir */ + + /* session list {{{ */ if($this->params['enablesessionlist']) { echo "
"; echo "
"; echo "
"; } + /* }}} End of session list */ + + /* clipboard {{{ */ if($this->params['enableclipboard']) { echo "
"; echo "
getID() : 0)."\">
"; echo "
"; } + /* }}} End of clipboard */ echo "
    \n"; $menuitems = array(); @@ -492,11 +492,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"; @@ -511,6 +508,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()."\" />"; @@ -524,6 +523,7 @@ background-image: linear-gradient(to bottom, #882222, #111111);; // } // echo " "; echo "
\n"; + /* }}} End of search form */ echo "
\n"; } echo "
\n"; @@ -603,69 +603,155 @@ 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']; $accessobject = $this->params['accessobject']; 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) { + 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'=>'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')) - $menuitems['add_subfolder'] = array('link'=>"../out/out.AddSubFolder.php?folderid=". $folderID ."&showtree=".showtree(), 'label'=>'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'=>'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'=>'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()) if ($accessobject->check_view_access('RemoveFolder')) - $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) { if ($accessobject->check_view_access('FolderAccess')) - $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')); } if ($accessobject->check_view_access('FolderNotify')) - $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 ($accessMode == M_ALL) { $menuitems['edit_folder_attrdefgrp'] = array('link'=>"../out/out.FolderAttributeGroup.php?folderid=".$folderID."&showtree=".showtree(), 'label'=>'edit_folder_attrdefgrp'); } } if ($accessobject->check_view_access('Indexer') && $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 */ @@ -674,9 +760,7 @@ background-image: linear-gradient(to bottom, #882222, #111111);; self::showNavigationBar($menuitems); - echo "
    \n"; echo "
    \n"; - return; } /* }}} */ private function documentNavigationBar($document) { /* {{{ */ @@ -685,62 +769,61 @@ 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()) { if($accessobject->check_controller_access('UpdateDocument')) - $menuitems['update_document'] = array('link'=>"../out/out.UpdateDocument".$docid, 'label'=>'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'=>'lock_document'); + $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'=>'checkin_document'); + $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'=>'checkout_document'); + $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'=>'edit_document_props'); - $menuitems['move_document'] = array('link'=>"../out/out.MoveDocument".$docid, 'label'=>'move_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)) { if($accessobject->check_controller_access('UpdateDocument')) - $menuitems['update_document'] = array('link'=>"../out/out.UpdateDocument".$docid, 'label'=>'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'=>'unlock_document'); + $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'=>'checkin_document'); + $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'=>'checkout_document'); + $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'=>'edit_document_props'); - $menuitems['move_document'] = array('link'=>"../out/out.MoveDocument".$docid, 'label'=>'move_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($document)) { if ($accessobject->check_view_access('SetExpires')) - $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) { if ($accessobject->check_view_access('RemoveDocument')) - $menuitems['rm_document'] = array('link'=>"../out/out.RemoveDocument".$docid, 'label'=>'rm_document'); + $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'=>'edit_document_access'); + $menuitems['edit_document_access'] = array('link'=>"../out/out.DocumentAccess". $docid, 'label'=>getMLText('edit_document_access')); } if ($accessMode >= M_READ) { if ($accessobject->check_view_access('DocumentNotify')) - $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 ($accessobject->check_view_access('TransferDocument')) { - $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 */ @@ -761,25 +844,22 @@ background-image: linear-gradient(to bottom, #882222, #111111);; self::showNavigationBar($menuitems); - echo "
    \n"; echo "
    \n"; - return; } /* }}} */ private function accountNavigationBar() { /* {{{ */ $accessobject = $this->params['accessobject']; echo "".getMLText("my_account")."\n"; echo "
    \n"; - echo "
      \n"; $menuitems = array(); if ($accessobject->check_view_access('EditUserData') || !$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')); $menuitems['2_factor_auth'] = array('link'=>"../out/out.Setup2Factor.php", 'label'=>'2_factor_auth'); @@ -787,9 +867,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'=>'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'=>'groups'); + $menuitems['groups'] = array('link'=>"../out/out.GroupView.php", 'label'=>getMLText('groups')); } /* Check if hook exists because otherwise callHook() will override $menuitems */ @@ -798,9 +878,7 @@ background-image: linear-gradient(to bottom, #882222, #111111);; self::showNavigationBar($menuitems); - echo "
    \n"; echo "
    \n"; - return; } /* }}} */ private function myDocumentsNavigationBar() { /* {{{ */ @@ -808,24 +886,23 @@ 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') { if ($accessobject->check_view_access('ReviewSummary')) - $menuitems['review_summary'] = array('link'=>"../out/out.ReviewSummary.php", 'label'=>'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'=>'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'=>'workflow_summary'); + $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'=>'receipt_summary'); + $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'=>'revision_summary'); + $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')) @@ -833,9 +910,7 @@ background-image: linear-gradient(to bottom, #882222, #111111);; self::showNavigationBar($menuitems); - echo "
    \n"; echo "
    \n"; - return; } /* }}} */ private function adminToolsNavigationBar() { /* {{{ */ @@ -843,93 +918,93 @@ background-image: linear-gradient(to bottom, #882222, #111111);; $settings = $this->params['settings']; echo " ".getMLText("admin_tools")."\n"; echo "
    \n"; - echo "
      \n"; $menuitems = array(); if($accessobject->check_view_access(array('UsrMgr', 'RoleMgr', 'GroupMgr', 'UserList', 'Acl'))) { - $menuitems['user_group_management'] = array('link'=>"#", 'label'=>'user_group_management'); - if ($accessobject->check_view_access('UsrMgr')) - $menuitems['user_group_management']['children']['user_management'] = array('link'=>"../out/out.UsrMgr.php", 'label'=>'user_management'); - if ($accessobject->check_view_access('RoleMgr')) - $menuitems['user_group_management']['children']['role_management'] = array('link'=>"../out/out.RoleMgr.php", 'label'=>'role_management'); - if ($accessobject->check_view_access('GroupMgr')) - $menuitems['user_group_management']['children']['group_management'] = array('link'=>"../out/out.GroupMgr.php", 'label'=>'group_management'); - if ($accessobject->check_view_access('UserList')) - $menuitems['user_group_management']['children']['user_list'] = array('link'=>"../out/out.UserList.php", 'label'=>'user_list'); - if ($accessobject->check_view_access('Acl')) - $menuitems['user_group_management']['children']['access_control'] = array('link'=>"../out/out.Acl.php", 'label'=>'access_control'); - } + $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'))) { - $menuitems['definitions'] = array('link'=>"#", 'label'=>'definitions'); - if ($accessobject->check_view_access('DefaultKeywords')) - $menuitems['definitions']['children']['default_keywords'] = array('link'=>"../out/out.DefaultKeywords.php", 'label'=>'global_default_keywords'); - if ($accessobject->check_view_access('Categories')) - $menuitems['definitions']['children']['document_categories'] = array('link'=>"../out/out.Categories.php", 'label'=>'global_document_categories'); - if ($accessobject->check_view_access('AttributeMgr')) - $menuitems['definitions']['children']['attribute_definitions'] = array('link'=>"../out/out.AttributeMgr.php", 'label'=>'global_attributedefinitions'); - $menuitems['definitions']['children']['attribute_definitiongroupss'] = array('link'=>"../out/out.AttributeGroupMgr.php", 'label'=>'global_attributedefinitiongroups'); - if($this->params['workflowmode'] == 'advanced') { - if ($accessobject->check_view_access('WorkflowMgr')) - $menuitems['definitions']['children']['workflows'] = array('link'=>"../out/out.WorkflowMgr.php", 'label'=>'global_workflows'); - if ($accessobject->check_view_access('WorkflowStatesMgr')) - $menuitems['definitions']['children']['workflow_states'] = array('link'=>"../out/out.WorkflowStatesMgr.php", 'label'=>'global_workflow_states'); - if ($accessobject->check_view_access('WorkflowActionsMgr')) - $menuitems['definitions']['children']['workflow_actions'] = array('link'=>"../out/out.WorkflowActionsMgr.php", 'label'=>'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 ($accessobject->check_view_access('AttributeGroupMgr')) + $menuitems['definitions']['children']['attribute_definitiongroupss'] = array('link'=>"../out/out.AttributeGroupMgr.php", 'label'=>getMLText('global_attributedefinitiongroups')); + 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'=>'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'=>'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'=>'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'=>'fulltext_info'); + $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'=>'backup_log_management'); - if ($accessobject->check_view_access('BackupTools')) - $menuitems['backup_log_management']['children'][] = array('link'=>"../out/out.BackupTools.php", 'label'=>'backup_tools'); - if ($this->params['logfileenable']) - if ($accessobject->check_view_access('LogManagement')) - $menuitems['backup_log_management']['children'][] = array('link'=>"../out/out.LogManagement.php", 'label'=>'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'))) { - $menuitems['misc'] = array('link'=>"#", 'label'=>'misc'); - if ($accessobject->check_view_access('ImportFS')) - $menuitems['misc']['children']['import_fs'] = array('link'=>"../out/out.ImportFS.php", 'label'=>'import_fs'); - if ($accessobject->check_view_access('ImportUsers')) - $menuitems['misc']['children']['import_users'] = array('link'=>"../out/out.ImportUsers.php", 'label'=>'import_users'); - if ($accessobject->check_view_access('Statistic')) - $menuitems['misc']['children']['folders_and_documents_statistic'] = array('link'=>"../out/out.Statistic.php", 'label'=>'folders_and_documents_statistic'); - if ($accessobject->check_view_access('Charts')) - $menuitems['misc']['children']['charts'] = array('link'=>"../out/out.Charts.php", 'label'=>'charts'); - if ($accessobject->check_view_access('Timeline')) - $menuitems['misc']['children']['timeline'] = array('link'=>"../out/out.Timeline.php", 'label'=>'timeline'); - if ($accessobject->check_view_access('SchedulerTaskMgr')) - $menuitems['misc']['children']['schedulertaskmgr'] = array('link'=>"../out/out.SchedulerTaskMgr.php", 'label'=>'scheduler_task_mgr'); - if ($accessobject->check_view_access('ObjectCheck')) - $menuitems['misc']['children']['objectcheck'] = array('link'=>"../out/out.ObjectCheck.php", 'label'=>'objectcheck'); - if ($accessobject->check_view_access('ExpiredDocuments')) - $menuitems['misc']['children']['documents_expired'] = array('link'=>"../out/out.ExpiredDocuments.php", 'label'=>'documents_expired'); - if ($accessobject->check_view_access('ExtensionMgr')) - $menuitems['misc']['children']['extension_manager'] = array('link'=>"../out/out.ExtensionMgr.php", 'label'=>'extension_manager'); - if ($accessobject->check_view_access('ClearCache')) - $menuitems['misc']['children']['clear_cache'] = array('link'=>"../out/out.ClearCache.php", 'label'=>'clear_cache'); - if ($accessobject->check_view_access('Info')) - $menuitems['misc']['children']['version_info'] = array('link'=>"../out/out.Info.php", 'label'=>'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('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')) + $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')); } if ($settings->_enableDebugMode) { - $menuitems['debug'] = array('link'=>"#", 'label'=>'debug'); + $menuitems['debug'] = array('link'=>"#", 'label'=>getMLText('debug')); if ($accessobject->check_view_access('Hooks')) - $menuitems['debug']['children']['hooks'] = array('link'=>"../out/out.Hooks.php", 'label'=>'list_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 */ @@ -938,11 +1013,7 @@ background-image: linear-gradient(to bottom, #882222, #111111);; self::showNavigationBar($menuitems); - echo "
    \n"; - echo "
      \n"; - echo "
    \n"; echo "
    \n"; - return; } /* }}} */ private function calendarOldNavigationBar($d){ /* {{{ */ @@ -967,11 +1038,10 @@ background-image: linear-gradient(to bottom, #882222, #111111);; $accessobject = $this->params['accessobject']; echo "".getMLText("calendar")."\n"; echo "
    \n"; - echo "
      \n"; $menuitems = array(); if($accessobject->check_view_access(array('AddEvent'))) - $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')) @@ -979,10 +1049,7 @@ background-image: linear-gradient(to bottom, #882222, #111111);; self::showNavigationBar($menuitems); - echo "
    \n"; echo "
    \n"; - return; - } /* }}} */ function pageList($pageNumber, $totalPages, $baseURI, $params) { /* {{{ */ @@ -1146,26 +1213,32 @@ background-image: linear-gradient(to bottom, #882222, #111111);; echo '".(!empty($value['value']) ? $value['value'] : '').""; break; case 'input': default: - echo '"; + switch($value['type']) { + default: + echo '"; + break; + } break; } } @@ -1178,14 +1251,22 @@ background-image: linear-gradient(to bottom, #882222, #111111);; return; } /* }}} */ - function formSubmit($value, $name='', $target='') { /* {{{ */ + function formSubmit($value, $name='', $target='', $type='primary') { /* {{{ */ + switch($type) { + case 'danger': + $class = 'btn-danger'; + break; + case 'primary': + default: + $class = 'btn-primary'; + } echo "
    \n"; if(is_string($value)) { - echo "\n"; + echo "\n"; } else { if(is_array($value)) { foreach($value as $i=>$v) - echo "\n"; + echo "\n"; } } echo "
    \n"; @@ -2148,17 +2229,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; @@ -2214,7 +2295,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 @@ -2682,7 +2763,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 @@ -2778,6 +2859,29 @@ $('body').on('click', '[id^=\"table-row-folder\"] td:nth-child(2)', function(ev) } } /* }}} */ + /** + * Return HTML containing the path of a document or folder + * + * This is used for showing the path of a document/folder below the title + * in document/folder lists like on the search page. + * + * @param object $object + * @return string + */ + function getListRowPath($object) { /* {{{ */ + $belowtitle = ''; + $folder = $object->getParent(); + if($folder) { + $belowtitle .= "
    ".getMLText('in_folder').": /"; + $path = $folder->getPath(); + for ($i = 1; $i < count($path); $i++) { + $belowtitle .= htmlspecialchars($path[$i]->getName())."/"; + } + $belowtitle .= ""; + } + return $belowtitle; + } /* }}} */ + /** * Start the row for a folder in list of documents and folders * @@ -2870,7 +2974,7 @@ $('body').on('click', '[id^=\"table-row-folder\"] td:nth-child(2)', function(ev) } else { $content .= "getMimeIcon($latestContent->getFileType())."\" ".($previewwidth ? "width=\"".$previewwidth."\"" : "")."\" title=\"".htmlspecialchars($latestContent->getMimeType())."\">"; } - if($accessop->check_controller_access('Download', array('action'=>'run'))) + if($accessop->check_controller_access('Download', array('action'=>'version'))) $content .= ""; } else $content .= "getMimeIcon($latestContent->getFileType())."\" title=\"".htmlspecialchars($latestContent->getMimeType())."\">"; @@ -3067,6 +3171,8 @@ $('body').on('click', '[id^=\"table-row-folder\"] td:nth-child(2)', function(ev) $content .= "" . "getId()."\">".htmlspecialchars($subFolder->getName()).""; else $content .= "getID()."&showtree=".$showtree."\">" . htmlspecialchars($subFolder->getName()) . ""; + if(isset($extracontent['below_title'])) + $content .= $extracontent['below_title']; $content .= "
    ".getMLText('owner').": ".htmlspecialchars($owner->getFullName()).", ".getMLText('creation_date').": ".date('Y-m-d', $subFolder->getDate()).""; if($comment) { $content .= "
    ".htmlspecialchars($comment).""; @@ -3583,21 +3689,23 @@ $("body").on("click", "span.openpopupbox", function(e) { $id = substr(md5(uniqid()), 0, 4); ?>
    -
    -
    +
    +
    - -
    + +
    -
    +
    -
    -
    -
    -
    +
    +
    + + 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.CheckInDocument.php b/views/bootstrap/class.CheckInDocument.php index b1c728d21..b14b43701 100644 --- a/views/bootstrap/class.CheckInDocument.php +++ b/views/bootstrap/class.CheckInDocument.php @@ -698,8 +698,17 @@ $(document).ready(function() {
    formSubmit(getMLText('cancel_checkout')); + echo createHiddenFieldWithKey('cancelcheckout'); + $this->formField( + getMLText("checkout_cancel_confirm"), + array( + 'element'=>'input', + 'type'=>'checkbox', + 'name'=>'confirm', + 'value'=>1 + ) + ); + $this->formSubmit(getMLText('cancel_checkout'), '', '', 'danger'); ?>
    - "> + + "> params['dms']; diff --git a/views/bootstrap/class.Clipboard.php b/views/bootstrap/class.Clipboard.php index ec711b891..1bd9055a9 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 * @@ -50,29 +50,38 @@ class SeedDMS_View_Clipboard extends SeedDMS_Bootstrap_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; } /* }}} */ /** @@ -225,7 +237,7 @@ class SeedDMS_View_Clipboard extends SeedDMS_Bootstrap_Style { $content .= ""; } else { } - $content .= "
        ".getMLText("drag_icon_here")."
        "; + $content .= "
        ".getMLText("drag_icon_here")."
        "; $txt = $this->callHook('postClipboard', $clipboard); if(is_string($txt)) $content .= $txt; 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 d07f473e6..75a2ea7cd 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 @@ -162,9 +162,9 @@ class SeedDMS_View_DocumentVersionDetail extends SeedDMS_Bootstrap_Style { $this->rowStart(); $this->columnStart(4); $this->contentHeading(getMLText("document_infos")); - $this->contentContainerStart(); +// $this->contentContainerStart(); ?> - +
        : @@ -241,7 +241,7 @@ class SeedDMS_View_DocumentVersionDetail extends SeedDMS_Bootstrap_Style { ?>
        contentContainerEnd(); +// $this->contentContainerEnd(); $this->preview(); $this->columnEnd(); $this->columnStart(8); @@ -265,8 +265,20 @@ class SeedDMS_View_DocumentVersionDetail extends SeedDMS_Bootstrap_Style { $previewer = new SeedDMS_Preview_Previewer($cachedir, $previewwidthdetail, $timeout, $xsendfile); $previewer->setConverters($previewconverters); $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 5c7ad16bc..4d0209315 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'); @@ -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,36 +80,32 @@ $('.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); if(file_exists($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 a24332eee..0e77467ca 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 cec982e64..367b63810 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 e77c4be80..d81294f3a 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 02d905f8f..abba022a6 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; @@ -128,10 +128,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(); @@ -144,7 +144,7 @@ $(document).ready(function() { ?>
        -'; + $html .= ''; else { if(strlen($value) > 40) $class = 'input-xxlarge'; @@ -63,7 +63,7 @@ class SeedDMS_View_Settings extends SeedDMS_Bootstrap_Style { $class = 'input-medium'; else $class = 'input-small'; - $html .= ''; + $html .= ''; } return $html; } /* }}} */ @@ -158,9 +158,9 @@ class SeedDMS_View_Settings extends SeedDMS_Bootstrap_Style { : - - $value) { $optval = trim($isass ? $i : $value); diff --git a/views/bootstrap/class.Setup2Factor.php b/views/bootstrap/class.Setup2Factor.php index 5c28aa509..59f5f2d2d 100644 --- a/views/bootstrap/class.Setup2Factor.php +++ b/views/bootstrap/class.Setup2Factor.php @@ -14,7 +14,7 @@ /** * Include parent class */ -require_once("class.Bootstrap.php"); +//require_once("class.Bootstrap.php"); /** * Include classes for 2-factor authentication @@ -30,7 +30,7 @@ require "vendor/autoload.php"; * @copyright Copyright (C) 2016 Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_View_Setup2Factor extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_Setup2Factor extends SeedDMS_Theme_Style { function js() { /* {{{ */ header('Content-Type: application/javascript; charset=UTF-8'); diff --git a/views/bootstrap/class.Statistic.php b/views/bootstrap/class.Statistic.php index 9e330db6a..25dff9815 100644 --- a/views/bootstrap/class.Statistic.php +++ b/views/bootstrap/class.Statistic.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 Statistic view @@ -29,7 +29,7 @@ require_once("class.Bootstrap.php"); * 2010-2012 Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_View_Statistic extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_Statistic extends SeedDMS_Theme_Style { var $dms; var $folder_count; var $document_count; diff --git a/views/bootstrap/class.SubstituteUser.php b/views/bootstrap/class.SubstituteUser.php index 512991030..3d43796cb 100644 --- a/views/bootstrap/class.SubstituteUser.php +++ b/views/bootstrap/class.SubstituteUser.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 SubstituteUser view @@ -29,7 +29,7 @@ require_once("class.Bootstrap.php"); * 2010-2012 Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_View_SubstituteUser extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_SubstituteUser extends SeedDMS_Theme_Style { function js() { /* {{{ */ header('Content-Type: application/javascript; charset=UTF-8'); @@ -101,7 +101,7 @@ class SeedDMS_View_SubstituteUser extends SeedDMS_Bootstrap_Style { echo ""; echo ""; if($currUser->getID() != $user->getID()) { - echo "getID())."&formtoken=".createFormKey('substituteuser')."\"> ".getMLText('substitute_user')." "; + echo "getID())."&formtoken=".createFormKey('substituteuser')."\"> ".getMLText('substitute_user')." "; } echo ""; echo ""; diff --git a/views/bootstrap/class.Tasks.php b/views/bootstrap/class.Tasks.php index 6c221f249..470c5aa67 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']; @@ -279,10 +279,8 @@ class SeedDMS_View_Tasks extends SeedDMS_Bootstrap_Style { return; } - $content = ''; - $content .= "
          \n"; - $content .= "
        • \n"; - $content .= " ".getMLText('tasks')." ("; + $menuitems = []; + $ct = array(); if(isset($tasks['review'])) $ct[] = count($tasks['review']); @@ -300,107 +298,82 @@ class SeedDMS_View_Tasks extends SeedDMS_Bootstrap_Style { $ct[] = count($tasks['rejected']); if(isset($tasks['checkedout'])) $ct[] = count($tasks['checkedout']); - $content .= implode('/', $ct); - $content .= ")"; + + $menuitems['tasks'] = array('label'=>getMLText('tasks')." (".implode('/', $ct).")"); + $menuitems['tasks']['children'] = []; + if(!empty($tasks['review']) || !empty($tasks['approval']) || !empty($tasks['receipt']) || !empty($tasks['revision']) || !empty($tasks['needscorrection']) || !empty($tasks['workflow']) || !empty($tasks['rejected']) || !empty($tasks['rejected']) || !empty($tasks['checkedout'])) { - $content .= " \n"; - $content .= "
            \n"; if(!empty($tasks['review'])) { - $content .= "
          • \n"; - $content .= " ".getMLText("documents_to_review")."\n"; - $content .= " \n"; - $content .= "
          • \n"; + $menuitems['tasks']['children']['review'] = array('label'=>getMLText('documents_to_review'), 'children'=>$subitems); + } if(!empty($tasks['approval'])) { - $content .= "
          • \n"; - $content .= " ".getMLText("documents_to_approve")."\n"; - $content .= " \n"; - $content .= "
          • \n"; + $menuitems['tasks']['children']['approval'] = array('label'=>getMLText('documents_to_approve'), 'children'=>$subitems); } if(!empty($tasks['workflow'])) { - $content .= "
          • \n"; - $content .= " ".getMLText("documents_to_trigger_workflow")."\n"; - $content .= " \n"; - $content .= "
          • \n"; + $menuitems['tasks']['children']['workflow'] = array('label'=>getMLText('documents_to_trigger_workflow'), 'children'=>$subitems); } if(!empty($tasks['receipt'])) { - $content .= "
          • \n"; - $content .= " ".getMLText("documents_to_receipt")."\n"; - $content .= "
              \n"; + $subitems = []; foreach($tasks['receipt'] as $t) { $doc = $dms->getDocument($t['id']); - $content .= "
            • getID()."¤ttab=recipients\">".$doc->getName()."
            • "; + $subitems[] = array('label'=>$doc->getName(), 'link'=>"../out/out.ViewDocument.php?documentid=".$doc->getID()."¤ttab=recipients", 'class'=>"table-row-document", 'rel'=>"document_".$doc->getID()); } - $content .= "
            \n"; - $content .= "
          • \n"; + $menuitems['tasks']['children']['receipt'] = array('label'=>getMLText('documents_to_receipt'), 'children'=>$subitems); } if(!empty($tasks['revision'])) { - $content .= "
          • \n"; - $content .= " ".getMLText("documents_to_revise")."\n"; - $content .= "
              \n"; + $subitems = []; foreach($tasks['revision'] as $t) { $doc = $dms->getDocument($t['id']); - $content .= "
            • getID()."¤ttab=revision\">".$doc->getName()."
            • "; + $subitems[] = array('label'=>$doc->getName(), 'link'=>"../out/out.ViewDocument.php?documentid=".$doc->getID()."¤ttab=revision", 'class'=>"table-row-document", 'rel'=>"document_".$doc->getID()); } - $content .= "
            \n"; - $content .= "
          • \n"; + $menuitems['tasks']['children']['revision'] = array('label'=>getMLText('documents_to_revise'), 'children'=>$subitems); } if(!empty($tasks['needscorrection'])) { - $content .= "
          • \n"; - $content .= " ".getMLText("documents_to_correct")."\n"; - $content .= "
              \n"; + $subitems = []; foreach($tasks['needscorrection'] as $t) { $doc = $dms->getDocument($t['id']); - $content .= "
            • getID()."¤ttab=docinfo\">".$doc->getName()."
            • "; + $subitems[] = array('label'=>$doc->getName(), 'link'=>"../out/out.ViewDocument.php?documentid=".$doc->getID()."¤ttab=docinfo", 'class'=>"table-row-document", 'rel'=>"document_".$doc->getID()); } - $content .= "
            \n"; - $content .= "
          • \n"; + $menuitems['tasks']['children']['needscorrection'] = array('label'=>getMLText('documents_to_correct'), 'children'=>$subitems); } if(!empty($tasks['rejected'])) { - $content .= "
          • \n"; - $content .= " ".getMLText("documents_rejected")."\n"; - $content .= " \n"; - $content .= "
          • \n"; + $menuitems['tasks']['children']['rejected'] = array('label'=>getMLText('documents_rejected'), 'children'=>$subitems); } if(!empty($tasks['checkedout'])) { - $content .= "
          • \n"; - $content .= " ".getMLText("documents_checked_out_by_you")."\n"; - $content .= " \n"; - $content .= "
          • \n"; + $menuitems['tasks']['children']['checkedout'] = array('label'=>getMLText('documents_checked_out_by_you'), 'children'=>$subitems); } if ($accessobject->check_view_access('MyDocuments')) { - $content .= "
          • \n"; - $content .= "
          • ".getMLText("my_documents")."
          • \n"; + $menuitems['tasks']['children']['divider'] = array('divider'=>true); + $menuitems['tasks']['children']['mydocuments'] = array('label'=>getMLText('my_documents'), 'link'=>'../out/out.MyDocuments.php'); } + self::showNavigationBar($menuitems, array('right'=>true)); } - $content .= " \n"; - $content .= "
          \n"; - echo $content; } /* }}} */ /** diff --git a/views/bootstrap/class.Timeline.php b/views/bootstrap/class.Timeline.php index c9e348845..f12dfe1cb 100644 --- a/views/bootstrap/class.Timeline.php +++ b/views/bootstrap/class.Timeline.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_Timeline extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_Timeline extends SeedDMS_Theme_Style { function iteminfo() { /* {{{ */ $dms = $this->params['dms']; @@ -48,7 +48,7 @@ class SeedDMS_View_Timeline extends SeedDMS_Bootstrap_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_Bootstrap_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"; } @@ -223,9 +225,9 @@ div.timeline-event-selected { $to = time(); } - $this->htmlAddHeader(''."\n", 'css'); - $this->htmlAddHeader(''."\n", 'js'); - $this->htmlAddHeader(''."\n", 'js'); + $this->htmlAddHeader(''."\n", 'css'); + $this->htmlAddHeader(''."\n", 'js'); + $this->htmlAddHeader(''."\n", 'js'); $this->htmlStartPage(getMLText("timeline")); $this->globalNavigation(); @@ -233,11 +235,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"), @@ -269,7 +271,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(); diff --git a/views/bootstrap/class.TransferDocument.php b/views/bootstrap/class.TransferDocument.php index a40d5a8c4..387f35b62 100644 --- a/views/bootstrap/class.TransferDocument.php +++ b/views/bootstrap/class.TransferDocument.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 TransferDocument view @@ -25,7 +25,7 @@ require_once("class.Bootstrap.php"); * @copyright Copyright (C) 2017 Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_View_TransferDocument extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_TransferDocument extends SeedDMS_Theme_Style { function show() { /* {{{ */ $dms = $this->params['dms']; @@ -67,9 +67,7 @@ class SeedDMS_View_TransferDocument extends SeedDMS_Bootstrap_Style { getMLText("transfer_to_user"), $html ); - if($accessobject->check_controller_access('TransferDocument', array('action'=>'run'))) { - $this->formSubmit(" ".getMLText('transfer_document')); - } + $this->formSubmit(" ".getMLText('transfer_document')); $this->contentContainerEnd(); } else { $this->warningMsg('transfer_no_users'); diff --git a/views/bootstrap/class.TransferObjects.php b/views/bootstrap/class.TransferObjects.php index 09a19d18c..9f409e24b 100644 --- a/views/bootstrap/class.TransferObjects.php +++ b/views/bootstrap/class.TransferObjects.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 TransferObjects view @@ -25,7 +25,7 @@ require_once("class.Bootstrap.php"); * @copyright Copyright (C) 2017 Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_View_TransferObjects extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_TransferObjects 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.TriggerWorkflow.php b/views/bootstrap/class.TriggerWorkflow.php index 3a8333699..6753082bb 100644 --- a/views/bootstrap/class.TriggerWorkflow.php +++ b/views/bootstrap/class.TriggerWorkflow.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 TriggerWorkflow view @@ -29,7 +29,7 @@ require_once("class.Bootstrap.php"); * 2010-2012 Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_View_TriggerWorkflow extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_TriggerWorkflow extends SeedDMS_Theme_Style { function js() { /* {{{ */ header('Content-Type: application/javascript; charset=UTF-8'); diff --git a/views/bootstrap/class.UpdateDocument.php b/views/bootstrap/class.UpdateDocument.php index 53b093df1..290e9f3fe 100644 --- a/views/bootstrap/class.UpdateDocument.php +++ b/views/bootstrap/class.UpdateDocument.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 UpdateDocument view @@ -29,7 +29,7 @@ require_once("class.Bootstrap.php"); * 2010-2012 Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_View_UpdateDocument extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_UpdateDocument extends SeedDMS_Theme_Style { function js() { /* {{{ */ $strictformcheck = $this->params['strictformcheck']; diff --git a/views/bootstrap/class.UserDefaultKeywords.php b/views/bootstrap/class.UserDefaultKeywords.php index 86319c4f4..f7931c12e 100644 --- a/views/bootstrap/class.UserDefaultKeywords.php +++ b/views/bootstrap/class.UserDefaultKeywords.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 UserDefaultKeywords view @@ -29,7 +29,7 @@ require_once("class.Bootstrap.php"); * 2010-2012 Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_View_UserDefaultKeywords extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_UserDefaultKeywords extends SeedDMS_Theme_Style { function js() { /* {{{ */ header('Content-Type: application/javascript; charset=UTF-8'); diff --git a/views/bootstrap/class.UserList.php b/views/bootstrap/class.UserList.php index 942f4c18a..11c69be9a 100644 --- a/views/bootstrap/class.UserList.php +++ b/views/bootstrap/class.UserList.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 UserList view @@ -29,7 +29,7 @@ require_once("class.Bootstrap.php"); * 2010-2012 Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_View_UserList extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_UserList extends SeedDMS_Theme_Style { function js() { /* {{{ */ header('Content-Type: application/javascript; charset=UTF-8'); diff --git a/views/bootstrap/class.UsrMgr.php b/views/bootstrap/class.UsrMgr.php index 2de07421f..1abae9270 100644 --- a/views/bootstrap/class.UsrMgr.php +++ b/views/bootstrap/class.UsrMgr.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 UsrMgr view @@ -29,7 +29,7 @@ require_once("class.Bootstrap.php"); * 2010-2012 Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_View_UsrMgr extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_UsrMgr extends SeedDMS_Theme_Style { function js() { /* {{{ */ $seluser = $this->params['seluser']; @@ -96,7 +96,7 @@ $(document).ready( function() { $sessionmgr = new SeedDMS_SessionMgr($dms->getDB()); $this->contentHeading(getMLText("user_info")); - echo "\n"; + echo "
          \n"; echo "
          ".getMLText('discspace').""; if($quota) { $qt = $seluser->getQuota() ? $seluser->getQuota() : $quota; @@ -199,36 +199,21 @@ $(document).ready( function() { $accessobject = $this->params['accessobject']; if($seluser) { -?> -
          - - - - - -
          -' '.getMLText("send_login_data"), 'link'=>'../out/out.SendLoginData.php?userid='.$seluser->getID()); + self::showButtonwithMenu($button); } } /* }}} */ diff --git a/views/bootstrap/class.UsrView.php b/views/bootstrap/class.UsrView.php index b566573ae..7a0857f1b 100644 --- a/views/bootstrap/class.UsrView.php +++ b/views/bootstrap/class.UsrView.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 UsrView view @@ -29,7 +29,7 @@ require_once("class.Bootstrap.php"); * 2010-2012 Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_View_UsrView extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_UsrView extends SeedDMS_Theme_Style { function show() { /* {{{ */ $dms = $this->params['dms']; @@ -45,7 +45,7 @@ class SeedDMS_View_UsrView extends SeedDMS_Bootstrap_Style { $this->contentHeading(getMLText("users")); - echo "\n"; + echo "
          \n"; echo "\n\n"; if($enableuserimage) echo "\n"; echo "\n"; diff --git a/views/bootstrap/class.ViewDocument.php b/views/bootstrap/class.ViewDocument.php index c86ad42f7..a3f092bb3 100644 --- a/views/bootstrap/class.ViewDocument.php +++ b/views/bootstrap/class.ViewDocument.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_ViewDocument extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_ViewDocument extends SeedDMS_Theme_Style { protected function getAccessModeText($defMode) { /* {{{ */ switch($defMode) { @@ -193,6 +193,16 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Bootstrap_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) @@ -230,17 +240,17 @@ 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 ""; } } - $this->contentContainerStart(); $txt = $this->callHook('preDocumentInfos', $document); if(is_string($txt)) echo $txt; ?> -
          ".getMLText("name")."
          +
          isAdmin()) { echo ""; @@ -413,7 +423,7 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Bootstrap_Style { $txt = $this->callHook('postDocumentInfos', $document); if(is_string($txt)) echo $txt; - $this->contentContainerEnd(); +// $this->contentContainerEnd(); } } /* }}} */ @@ -537,10 +547,10 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Bootstrap_Style { if($versions === null) $versions = $document->getContent(); - $this->htmlAddHeader(''."\n", 'js'); - $this->htmlAddHeader(''."\n", 'css'); - $this->htmlAddHeader(''."\n", 'js'); - $this->htmlAddHeader(''."\n", 'js'); +// $this->htmlAddHeader(''."\n", 'js'); + $this->htmlAddHeader(''."\n", 'css'); + $this->htmlAddHeader(''."\n", 'js'); + $this->htmlAddHeader(''."\n", 'js'); $this->htmlStartPage(getMLText("document_title", array("documentname" => htmlspecialchars($document->getName())))); $this->globalNavigation($folder); @@ -615,43 +625,43 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Bootstrap_Style { echo $txt; ?>
          "; + echo "
          "; echo "\n"; echo ""; foreach($statuslog as $entry) { @@ -864,12 +874,12 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Bootstrap_Style { $this->contentHeading(getMLText("workflow_summary")); $this->contentContainerStart(); foreach($wkflogs as $wkflogt) { - echo "
          ".getMLText('date')."".getMLText('status')."".getMLText('user')."".getMLText('comment')."
          "; + echo "
          "; echo "\n"; echo ""; foreach($wkflogt as $wkflog) { echo ""; - echo ""; + echo ""; echo ""; echo ""; $loguser = $wkflog->getUser(); @@ -901,7 +911,7 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Bootstrap_Style { $this->columnStart(6); // $this->contentContainerStart(); print "".getMLText('reviewers').""; - print "
          ".getMLText('workflow')."".getMLText('date')."".getMLText('action')."".getMLText('user')."".getMLText('comment')."
          ".$wkflog->getWorkflow()->getName()."".htmlspecialchars($wkflog->getWorkflow()->getName())."".$wkflog->getDate()."".htmlspecialchars($wkflog->getTransition()->getAction()->getName())."
          \n"; + print "
          \n"; print "\n"; print "\n"; @@ -978,7 +988,7 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Bootstrap_Style { if($class) echo " "; print getReviewStatusText($r["status"])."\n"; - print "
          ".getMLText("name")."
            "; + print "
            "; if($accesserr) echo "
          • ".$accesserr."
          • "; @@ -1004,7 +1014,7 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Bootstrap_Style { $this->columnStart(6); // $this->contentContainerStart(); print "".getMLText('approvers').""; - print "\n"; + print "
            \n"; if (is_array($approvalStatus) && count($approvalStatus)>0) { print "\n"; @@ -1082,7 +1092,7 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Bootstrap_Style { if($class) echo " "; print getApprovalStatusText($a["status"])."\n"; - print "
              "; + print "
              "; if($accesserr) echo "
            • ".$accesserr."
            • "; @@ -1160,7 +1170,7 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Bootstrap_Style { echo "

              Sub workflow of '".htmlspecialchars($parentworkflow->getName())."'

              "; } echo "
              ".getMLText('current_state').": ".htmlspecialchars($workflowstate->getName())."
              "; - echo "\n"; + echo "
              \n"; echo ""; echo ""; foreach($transitions as $transition) { @@ -1270,15 +1280,15 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Bootstrap_Style { } } if($subworkflows) { - echo "getDocument()->getId()."\" />getVersion()."\" />"; - echo "getDocument()->getId()."\" />getVersion()."\" />"; + echo ""; echo ""; echo ""; } } @@ -1292,7 +1302,7 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Bootstrap_Style { * parent workflow */ if($latestContent->getWorkflowState()->getID() == $state->getID()) { - echo "Switching from sub workflow '".$workflow->getName()."' into state ".$state->getName()." of parent workflow '".$parentworkflow->getName()."' is possible
              "; + echo "Switching from sub workflow '".htmlspecialchars($workflow->getName())."' into state ".$state->getName()." of parent workflow '".htmlspecialchars($parentworkflow->getName())."' is possible
              "; /* Check if the transition from the state where the sub workflow * starts into the current state is also allowed in the parent * workflow. Checking at this point is actually too late, because @@ -1354,15 +1364,18 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Bootstrap_Style { if(is_string($txt)) echo $txt; - print "
              ".getMLText('next_state').":
              \n"; + 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) { @@ -1419,16 +1432,17 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Bootstrap_Style { } print "\n"; print "\n"; - print ""; + print (is_object($updateUser) ? htmlspecialchars($updateUser->getFullName()." (".$updateUser->getLogin().")") : "unknown user id '".$r["userID"]."'"); + print ""; print "\n"; print "\n"; - print "
              ".getMLText("name")."".getMLText("last_update")."".getMLText("comment")."".getMLText("status")."".((count($receiptStatus) > 10) ? '' : 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"]."'")."
            • ".htmlspecialchars($r["comment"]).""; if($class) echo " "; print getReceiptStatusText($r["status"])."
                "; + print "
                "; if($accesserr) echo "
              • ".$accesserr."
              • "; if($accessobject->mayReceipt($document)) { @@ -1446,6 +1460,7 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Bootstrap_Style { } } ?> +
              contentContainerEnd(); @@ -1456,9 +1471,9 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Bootstrap_Style {
              -
              +
              -
              +
              @@ -1495,7 +1510,7 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Bootstrap_Style { contentContainerStart(); - print "\n"; + print "
              \n"; print "\n"; print "\n"; @@ -1550,8 +1565,9 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Bootstrap_Style { if($user->isAdmin() || $r["status"] != -2) { print "\n"; print "\n"; - print "\n"; - print "\n"; - print "
              ".getMLText("name")."
              ".$reqName."
              • ".getLongReadableDate($r["date"])."
              • "; + print "
              • ".getLongReadableDate($r["date"])."
              • "; /* $updateUser is the user who has done the revision */ + $updateUser = null; if($r['status'] != 0) { $updateUser = $dms->getUser($r["userID"]); print "
              • ".(is_object($updateUser) ? htmlspecialchars($updateUser->getFullName()." (".$updateUser->getLogin().")") : "unknown user id '".$r["userID"]."'")."
              • "; @@ -1562,7 +1578,7 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Bootstrap_Style { if($class) echo " "; print getRevisionStatusText($r["status"])."
                "; + print "
                "; if($accesserr) echo "
              • ".$accesserr."
              • "; if($accessobject->mayRevise($document)) { @@ -1646,7 +1662,7 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Bootstrap_Style { print "\n"; } print "
                \n"; + print "
                \n"; print "
              • ".htmlspecialchars($version->getOriginalFileName())."
              • \n"; print "
              • ".getMLText('version').": ".$version->getVersion()."
              • \n"; if ($file_exists) print "
              • ". SeedDMS_Core_File::format_filesize($version->getFileSize()) .", ".htmlspecialchars($version->getMimeType())."
              • "; @@ -1825,7 +1841,7 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Bootstrap_Style { 0) { - print ""; + print "
                "; print "\n\n"; print "\n"; print "\n"; @@ -1851,7 +1867,7 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Bootstrap_Style { if (($user->getID() == $responsibleUser->getID()) || ($document->getAccessMode($user) == M_ALL )) print "
                ".getMLText("document_link_public").": ".(($link->isPublic()) ? getMLText("yes") : getMLText("no")); if (($user->getID() == $responsibleUser->getID()) || ($document->getAccessMode($user) == M_ALL )) - print "".createHiddenFieldWithKey('removedocumentlink')."getID()."\" />"; + print "".createHiddenFieldWithKey('removedocumentlink')."getID()."\" />"; print ""; echo $this->documentListRowEnd($targetDoc); } @@ -1860,12 +1876,12 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Bootstrap_Style { else $this->infoMsg(getMLText("no_linked_files")); if ($accessobject->check_view_access('AddDocumentLink')){ - $this->contentContainerStart(); ?>
                + contentContainerStart(); ?> formField(getMLText("add_document_link"), $this->getDocumentChooserHtml("form1")); ?> getAccessMode($user) >= M_READWRITE) { @@ -1880,18 +1896,18 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Bootstrap_Style { ) ); } + $this->contentContainerEnd(); $this->formSubmit(" ".getMLText('save')); ?> contentContainerEnd(); } if (count($reverselinks) > 0) { $this->contentHeading(getMLText("reverse_links")); // $this->contentContainerStart(); - print "
                ".getMLText("name")."
                "; + print "
                "; print "\n\n"; print "\n"; print "\n"; diff --git a/views/bootstrap/class.ViewFolder.php b/views/bootstrap/class.ViewFolder.php index d91e1afe8..bd6e8f5ed 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,12 @@ 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 { + + /** + * set a different name which is used to specify the hooks. + */ + //public $viewAliasName = ''; function data() { /* {{{ */ $dms = $this->params['dms']; @@ -249,11 +254,11 @@ $('body').on('click', '.order-btn', function(ev) { $owner = $folder->getOwner(); $this->contentHeading(getMLText("folder_infos")); - $this->contentContainerStart(); +// $this->contentContainerStart(); $txt = $this->callHook('preFolderInfos', $folder); if(is_string($txt)) echo $txt; - echo "
                ".getMLText("name")."
                \n"; + echo "
                \n"; if($user->isAdmin()) { echo ""; echo "\n"; @@ -353,7 +358,7 @@ $('body').on('click', '.order-btn', function(ev) { $txt = $this->callHook('postFolderInfos', $folder); if(is_string($txt)) echo $txt; - $this->contentContainerEnd(); +// $this->contentContainerEnd(); } } /* }}} */ @@ -401,9 +406,9 @@ $('body').on('click', '.order-btn', function(ev) { if(is_string($txt)) echo $txt; else { - print "
                ".getMLText("id").":
                "; + print "
                "; print "\n\n"; - print "\n"; + print "\n"; print "
                ".($parent ? '' : '')."".($parent ? '' : '')."".getMLText("name"); print " ".($orderby=="n"||$orderby=="na"?' ':($orderby=="nd"?' ':' ')).""; print " ".($orderby=="s"||$orderby=="sa"?' ':($orderby=="sd"?' ':' ')).""; @@ -488,7 +493,7 @@ $('body').on('click', '.order-btn', function(ev) { $this->contentHeading(getMLText("dropupload"), true); if ($folder->getAccessMode($user) >= M_READWRITE) { ?> -
                +
                errorMsg(getMLText('access_denied')); @@ -592,9 +597,9 @@ $('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'); +// echo $this->callHook('startPage'); $this->htmlStartPage(getMLText("folder_title", array("foldername" => htmlspecialchars($folder->getName())))); $this->globalNavigation($folder); $this->contentStart(); diff --git a/views/bootstrap/class.WorkflowActionsMgr.php b/views/bootstrap/class.WorkflowActionsMgr.php index 223f15e2d..3081a0a97 100644 --- a/views/bootstrap/class.WorkflowActionsMgr.php +++ b/views/bootstrap/class.WorkflowActionsMgr.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 WorkspaceActionsMgr view @@ -29,7 +29,7 @@ require_once("class.Bootstrap.php"); * 2010-2012 Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_View_WorkflowActionsMgr extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_WorkflowActionsMgr extends SeedDMS_Theme_Style { function js() { /* {{{ */ header('Content-Type: application/javascript; charset=UTF-8'); @@ -76,7 +76,7 @@ $(document).ready( function() { if($selworkflowaction->isUsed()) { $transitions = $selworkflowaction->getTransitions(); if($transitions) { - echo ""; + echo "
                "; echo "\n"; echo ""; foreach($transitions as $transition) { @@ -131,7 +131,6 @@ $(document).ready( function() { } } ?> - contentContainerStart(); ?> contentContainerStart(); $this->formField( getMLText("workflow_action_name"), array( @@ -156,10 +156,10 @@ $(document).ready( function() { 'value'=>($action ? htmlspecialchars($action->getName()) : '') ) ); + $this->contentContainerEnd(); $this->formSubmit(' '.getMLText("save")); ?> - contentContainerEnd(); ?> workflow = $this->params['workflow']; @@ -363,13 +363,13 @@ $(document).ready(function() { ''."\n"); $this->htmlAddHeader(' ', 'css'); $this->htmlStartPage(getMLText("admin_tools")); @@ -384,12 +384,12 @@ div.buttons #zoom {margin: 3px; _float: right;}


                - +
                -
                - - +
                + +
                params['selworkflow']; if($selworkflow && $selworkflow->getTransitions()) { ?>
                - +
                params['allworkflowstates']; if($selworkflow && !$selworkflow->isUsed()) { -?> -
                - - - - - -
                - - + "; @@ -261,13 +255,13 @@ $(document).ready(function() { echo "
                ".getMLText('workflow')."".getMLText('previous_state')."".getMLText('next_state')."
                "; echo ""; echo ""; echo "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 .= ""; + + $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 .= "
                "; +// $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 .= "\n"; + if($onepage) + $content .= "\n"; +// $content .= ""; + $content .= ""; +// $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']; +?> + +
                "; - echo ""; $states = $dms->getAllWorkflowStates(); foreach($states as $state) { echo ""; } echo "
                "; - echo ""; $states = $dms->getAllWorkflowStates(); foreach($states as $state) { echo ""; @@ -275,7 +269,7 @@ $(document).ready(function() { echo ""; echo "
                "; - echo ""; foreach($actions as $action) { echo ""; } diff --git a/views/bootstrap/class.WorkflowStatesMgr.php b/views/bootstrap/class.WorkflowStatesMgr.php index 6b1b42578..100f2951a 100644 --- a/views/bootstrap/class.WorkflowStatesMgr.php +++ b/views/bootstrap/class.WorkflowStatesMgr.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 WorkspaceStatesMgr view @@ -29,7 +29,7 @@ require_once("class.Bootstrap.php"); * 2010-2012 Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_View_WorkflowStatesMgr extends SeedDMS_Bootstrap_Style { +class SeedDMS_View_WorkflowStatesMgr extends SeedDMS_Theme_Style { function js() { /* {{{ */ header('Content-Type: application/javascript; charset=UTF-8'); @@ -77,7 +77,7 @@ $(document).ready(function() { if($selworkflowstate->isUsed()) { $transitions = $selworkflowstate->getTransitions(); if($transitions) { - echo ""; + echo "
                "; echo "\n"; echo ""; foreach($transitions as $transition) { @@ -132,7 +132,6 @@ $(document).ready(function() { } } ?> - contentContainerStart(); ?> contentContainerStart(); $this->formField( getMLText("workflow_state_name"), array( @@ -169,10 +169,10 @@ $(document).ready(function() { 'options'=>$options ) ); + $this->contentContainerEnd(); $this->formSubmit(' '.getMLText("save")); ?> - contentContainerEnd(); ?> pageNavigation(getMLText("my_documents"), "my_documents"); $this->contentHeading(getMLText("workflow_user_summary")); - $this->contentContainerStart(); // Get document list for the current user. $workflowStatus = $user->getWorkflowStatus(); @@ -121,9 +120,7 @@ class SeedDMS_View_WorkflowSummary extends SeedDMS_Bootstrap_Style { printMLText("no_docs_to_look_at"); } - $this->contentContainerEnd(); $this->contentHeading(getMLText("workflow_group_summary")); - $this->contentContainerStart(); $printheader=true; foreach ($workflowStatus["g"] as $st) { @@ -177,7 +174,6 @@ class SeedDMS_View_WorkflowSummary extends SeedDMS_Bootstrap_Style { printMLText("no_docs_to_look_at"); } - $this->contentContainerEnd(); $this->contentEnd(); $this->htmlEndPage(); } /* }}} */ diff --git a/views/bootstrap4/class.Bootstrap4.php b/views/bootstrap4/class.Bootstrap4.php new file mode 100644 index 000000000..4c91dbea7 --- /dev/null +++ b/views/bootstrap4/class.Bootstrap4.php @@ -0,0 +1,3611 @@ +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); + } + } + if($this->hasHook('startPage')) + $this->callHook('startPage'); + 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"; + if($this->hasHook('startBody')) + $this->callHook('startBody'); + } /* }}} */ + + 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) { + $html = $this->footNote(); + if($this->hasHook('footNote')) + $html = $this->callHook('footNote', $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 "
                ".getMLText('workflow')."".getMLText('previous_state')."".getMLText('next_state')."
                "; + 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"; + 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($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')); + } + 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($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($document)) { + 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')); + + $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')); + 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')); + } + 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')) + $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', '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'))) { + $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('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')) + $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')); + } + + 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); + + 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='', $type='primary') { /* {{{ */ + switch($type) { + case 'danger': + $class = 'btn-danger'; + break; + case 'primary': + default: + $class = 'btn-primary'; + } +// 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, $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"; + $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=".$folderid."&partialtree=".$partialtree, + '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($form, $accessMode=M_READ, $exclude = -1, $default = false, $formname = '', $folder='', $partialtree=0) { /* {{{ */ + echo self::getDocumentChooserHtml($form, $accessMode, $exclude, $default, $formname, $folder, $partialtree); + } /* }}} */ + + /** + * 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, $accessMode, $exclude, $default, $formname, $folder, $partialtree); +?> + +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(), M_READ, -1, $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($obj, $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($obj, $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); + if($obj->hasHook('filterTreeDocuments')) + $documents = $obj->callHook('filterTreeDocuments', $folder, $documents); + 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($this, $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); + if($this->hasHook('filterTreeDocuments')) + $documents = $this->callHook('filterTreeDocuments', $folder, $documents); + 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; +}); +getParent(); + if($folder) { + $belowtitle .= "
                ".getMLText('in_folder').": /"; + $path = $folder->getPath(); + for ($i = 1; $i < count($path); $i++) { + $belowtitle .= htmlspecialchars($path[$i]->getName())."/"; + } + $belowtitle .= ""; + } + return $belowtitle; + } /* }}} */ + + /** + * Start the row for a folder in list of documents and folders + * + * For a detailed description see + * {@link SeedDMS_Bootstrap_Style::folderListRowStart()} + */ + function documentListRowStart($document, $class='') { /* {{{ */ + if($class == 'error') + $class = 'table-danger'; + else + $class = 'table-'.$class; + $docID = $document->getID(); + return "
                "; + 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 .= ""; + $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"]); + } + if($accessop->check_view_access($this, array('action'=>'receptionBar')) /*$owner->getID() == $user->getID()*/ && $receiptStatus = $latestContent->getReceiptStatus()) { + $rstat = array('-1'=>0, '0'=>0, '1'=>0, '-2'=>0); + $allcomments = array('-1'=>array(), '1'=>array()); + foreach ($receiptStatus as $r) { + $rstat[''.$r['status']]++; + if($r['comment']) { +// $allcomments[''.$r['status']][] = htmlspecialchars($r['comment']); + $m5 = md5(trim($r['comment'])); + if(isset($allcomments[''.$r['status']][$m5])) + $allcomments[''.$r['status']][$m5]['n']++; + else + $allcomments[''.$r['status']][$m5] = array('n'=>1, 'c'=>htmlspecialchars(trim($r['comment']))); + } + } + $totalreceipts = $rstat['-1'] + $rstat['0'] + $rstat['1']; + 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) : "")."
                +
                "; + } + } + $content .= "
                ".$version.""; + $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 .= "
                getID()."&showtree=".$showtree."\">getMimeIcon(".folder")."\" width=\"24\" height=\"24\" border=0>" . "getId()."\">".htmlspecialchars($subFolder->getName()).""; + else + $content .= "getID()."&showtree=".$showtree."\">" . htmlspecialchars($subFolder->getName()) . ""; + if(isset($extracontent['below_title'])) + $content .= $extracontent['below_title']; + $content .= "
                ".getMLText('owner').": ".htmlspecialchars($owner->getFullName()).", ".getMLText('creation_date').": ".date('Y-m-d', $subFolder->getDate()).""; + if($comment) { + $content .= "
                ".htmlspecialchars($comment).""; + } + if(isset($extracontent['bottom_title'])) + $content .= $extracontent['bottom_title']; + $content .= "
                ".htmlspecialchars($owner->getFullName()).""; + 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 .= "
                "; + if(!empty($extracontent['begin_action_list'])) + $content .= $extracontent['begin_action_list']; + $subFolderAccessMode = $subFolder->getAccessMode($user); + 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 .= ''; + } 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 .= "
                + +getReviewStatus(10); + break; + case "approval": + $statusList = $latestContent->getApprovalStatus(10); + break; + case "revision": + $statusList = $latestContent->getRevisionStatus(10); + break; + case "receipt": + $statusList = $latestContent->getReceiptStatus(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; + case "revision": + echo getRevisionStatusText($rec["status"]); + break; + case "receipt": + echo getReceiptStatusText($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 `