Merge branch 'seeddms-5.1.x' into seeddms-6.0.x

This commit is contained in:
Uwe Steinmann 2019-12-15 08:03:36 +01:00
commit 7b1835774d
18 changed files with 273 additions and 45 deletions

View File

@ -121,8 +121,11 @@
Changes in version 5.1.14
--------------------------------------------------------------------------------
- allow mimetype to specify documents which can be edited online
- show number of indexing tasks in bar
- show number of indexing tasks in progress bar
- fix comparison of last indexing time with creation date of document content
- new hooks leftContentPre and leftContentPost
- minimize sql queries when fetching sub folders and documents of a folder
- custom attributes can be validated in a hook
--------------------------------------------------------------------------------
Changes in version 5.1.13

View File

@ -292,6 +292,22 @@ class SeedDMS_Core_Document extends SeedDMS_Core_Object { /* {{{ */
return $searchFields;
} /* }}} */
/**
* Return a folder by its database record
*
* @param array $resArr array of folder data as returned by database
* @param SeedDMS_Core_DMS $dms
* @return SeedDMS_Core_Folder|bool instance of SeedDMS_Core_Folder if document exists
*/
public static function getInstanceByData($resArr, $dms) { /* {{{ */
$classname = $dms->getClassname('document');
/** @var SeedDMS_Core_Document $document */
$document = new $classname($resArr["id"], $resArr["name"], $resArr["comment"], $resArr["date"], $resArr["expires"], $resArr["owner"], $resArr["folder"], $resArr["inheritAccess"], $resArr["defaultAccess"], $resArr['lock'], $resArr["keywords"], $resArr["sequence"]);
$document->setDMS($dms);
$document = $document->applyDecorators();
return $document;
} /* }}} */
/**
* Return an document by its id
*
@ -303,7 +319,8 @@ class SeedDMS_Core_Document extends SeedDMS_Core_Object { /* {{{ */
public static function getInstance($id, $dms) { /* {{{ */
$db = $dms->getDB();
$queryStr = "SELECT * FROM `tblDocuments` WHERE `id` = " . (int) $id;
// $queryStr = "SELECT * FROM `tblDocuments` WHERE `id` = " . (int) $id;
$queryStr = "SELECT `tblDocuments`.*, `tblDocumentLocks`.`userID` as `lock` FROM `tblDocuments` LEFT JOIN `tblDocumentLocks` ON `tblDocuments`.`id` = `tblDocumentLocks`.`document` WHERE `id` = " . (int) $id;
$resArr = $db->getResultArray($queryStr);
if (is_bool($resArr) && $resArr == false)
return false;
@ -312,20 +329,26 @@ class SeedDMS_Core_Document extends SeedDMS_Core_Object { /* {{{ */
$resArr = $resArr[0];
// New Locking mechanism uses a separate table to track the lock.
/*
$queryStr = "SELECT * FROM `tblDocumentLocks` WHERE `document` = " . (int) $id;
$lockArr = $db->getResultArray($queryStr);
if ((is_bool($lockArr) && $lockArr==false) || (count($lockArr)==0)) {
// Could not find a lock on the selected document.
$lock = -1;
$resArr['lock'] = -1;
}
else {
// A lock has been identified for this document.
$lock = $lockArr[0]["userID"];
$resArr['lock'] = $lockArr[0]["userID"];
}
*/
$resArr['lock'] = !$resArr['lock'] ? -1 : $resArr['lock'];
// print_r($resArr);exit;
return self::getInstanceByData($resArr, $dms);
$classname = $dms->getClassname('document');
/** @var SeedDMS_Core_Document $document */
$document = new $classname($resArr["id"], $resArr["name"], $resArr["comment"], $resArr["date"], $resArr["expires"], $resArr["owner"], $resArr["folder"], $resArr["inheritAccess"], $resArr["defaultAccess"], $lock, $resArr["keywords"], $resArr["sequence"]);
$document = new $classname($resArr["id"], $resArr["name"], $resArr["comment"], $resArr["date"], $resArr["expires"], $resArr["owner"], $resArr["folder"], $resArr["inheritAccess"], $resArr["defaultAccess"], $resArr['lock'], $resArr["keywords"], $resArr["sequence"]);
$document->setDMS($dms);
$document = $document->applyDecorators();
return $document;

View File

@ -177,6 +177,22 @@ class SeedDMS_Core_Folder extends SeedDMS_Core_Object {
return $sql;
} /* }}} */
/**
* Return a folder by its database record
*
* @param array $resArr array of folder data as returned by database
* @param SeedDMS_Core_DMS $dms
* @return SeedDMS_Core_Folder|bool instance of SeedDMS_Core_Folder if document exists
*/
public static function getInstanceByData($resArr, $dms) { /* {{{ */
$classname = $dms->getClassname('folder');
/** @var SeedDMS_Core_Folder $folder */
$folder = new $classname($resArr["id"], $resArr["name"], $resArr["parent"], $resArr["comment"], $resArr["date"], $resArr["owner"], $resArr["inheritAccess"], $resArr["defaultAccess"], $resArr["sequence"]);
$folder->setDMS($dms);
$folder = $folder->applyDecorators();
return $folder;
} /* }}} */
/**
* Return a folder by its id
*
@ -195,6 +211,8 @@ class SeedDMS_Core_Folder extends SeedDMS_Core_Object {
else if (count($resArr) != 1)
return null;
return self::getInstanceByData($resArr[0], $dms);
$resArr = $resArr[0];
$classname = $dms->getClassname('folder');
/** @var SeedDMS_Core_Folder $folder */
@ -601,9 +619,11 @@ class SeedDMS_Core_Folder extends SeedDMS_Core_Object {
if (is_bool($resArr) && $resArr == false)
return false;
$classname = $this->_dms->getClassname('folder');
$this->_subFolders = array();
for ($i = 0; $i < count($resArr); $i++)
$this->_subFolders[$i] = $this->_dms->getFolder($resArr[$i]["id"]);
// $this->_subFolders[$i] = $this->_dms->getFolder($resArr[$i]["id"]);
$this->_subFolders[$i] = $classname::getInstanceByData($resArr[$i], $this->_dms);
}
return $this->_subFolders;
@ -784,7 +804,7 @@ class SeedDMS_Core_Folder extends SeedDMS_Core_Object {
$db = $this->_dms->getDB();
if (!isset($this->_documents)) {
$queryStr = "SELECT * FROM `tblDocuments` WHERE `folder` = " . $this->_id;
$queryStr = "SELECT `tblDocuments`.*, `tblDocumentLocks`.`userID` as `lock` FROM `tblDocuments` LEFT JOIN `tblDocumentLocks` ON `tblDocuments`.`id` = `tblDocumentLocks`.`document` WHERE `folder` = " . $this->_id;
if ($orderby && $orderby[0]=="n") $queryStr .= " ORDER BY `name`";
elseif($orderby && $orderby[0]=="s") $queryStr .= " ORDER BY `sequence`";
elseif($orderby && $orderby[0]=="d") $queryStr .= " ORDER BY `date`";
@ -801,9 +821,11 @@ class SeedDMS_Core_Folder extends SeedDMS_Core_Object {
return false;
$this->_documents = array();
$classname = $this->_dms->getClassname('document');
foreach ($resArr as $row) {
// array_push($this->_documents, new SeedDMS_Core_Document($row["id"], $row["name"], $row["comment"], $row["date"], $row["expires"], $row["owner"], $row["folder"], $row["inheritAccess"], $row["defaultAccess"], isset($row["lockUser"])?$row["lockUser"]:NULL, $row["keywords"], $row["sequence"]));
array_push($this->_documents, $this->_dms->getDocument($row["id"]));
$row['lock'] = !$row['lock'] ? -1 : $row['lock'];
// array_push($this->_documents, $this->_dms->getDocument($row["id"]));
array_push($this->_documents, $classname::getInstanceByData($row, $this->_dms));
}
}
return $this->_documents;

View File

@ -1716,6 +1716,22 @@ add method SeedDMS_Core_DatabaseAccess::setLogFp()
- skip a fileType with just a '.'
</notes>
</release>
<release>
<date>2019-12-13</date>
<time>07:31:17</time>
<version>
<release>5.1.14</release>
<api>5.1.14</api>
</version>
<stability>
<release>stable</release>
<api>stable</api>
</stability>
<license uri="http://opensource.org/licenses/gpl-license">GPL License</license>
<notes>
- speed up SeedDMS_Core_Folder::getSubFolders() SeedDMS_Core_Folder::getDocuments() by minimizing the number of sql queries.
</notes>
</release>
<release>
<date>2017-02-28</date>
<time>06:34:50</time>

View File

@ -57,7 +57,40 @@ class SeedDMS_Controller_AddDocument extends SeedDMS_Controller_Common {
$reqversion = $this->getParam('reqversion');
$version_comment = $this->getParam('versioncomment');
$attributes = $this->getParam('attributes');
foreach($attributes as $attrdefid=>$attribute) {
if($attrdef = $dms->getAttributeDefinition($attrdefid)) {
if(null === ($ret = $this->callHook('validateAttribute', $attrdef, $attribute))) {
if($attribute) {
if(!$attrdef->validate($attribute)) {
$this->errormsg = getAttributeValidationError($attrdef->getValidationError(), $attrdef->getName(), $attribute);
return false;
}
} elseif($attrdef->getMinValues() > 0) {
$this->errormsg = array("attr_min_values", array("attrname"=>$attrdef->getName()));
return false;
}
} else {
if($ret === false)
return false;
}
}
}
$attributes_version = $this->getParam('attributesversion');
foreach($attributes_version as $attrdefid=>$attribute) {
if($attrdef = $dms->getAttributeDefinition($attrdefid)) {
if(null === ($ret = $this->callHook('validateAttribute', $attrdef, $attribute))) {
if($attribute) {
if(!$attrdef->validate($attribute)) {
$this->errormsg = getAttributeValidationError($attrdef->getValidationError(), $attrdef->getName(), $attribute);
return false;
}
}
} else {
if($ret === false)
return false;
}
}
}
$workflow = $this->getParam('workflow');
$notificationgroups = $this->getParam('notificationgroups');
$notificationusers = $this->getParam('notificationusers');

View File

@ -40,6 +40,24 @@ class SeedDMS_Controller_AddSubFolder extends SeedDMS_Controller_Common {
$comment = $this->getParam('comment');
$sequence = $this->getParam('sequence');
$attributes = $this->getParam('attributes');
foreach($attributes as $attrdefid=>$attribute) {
if($attrdef = $dms->getAttributeDefinition($attrdefid)) {
if(null === ($ret = $this->callHook('validateAttribute', $attrdef, $attribute))) {
if($attribute) {
if(!$attrdef->validate($attribute)) {
$this->errormsg = getAttributeValidationError($attrdef->getValidationError(), $attrdef->getName(), $attribute);
return false;
}
} elseif($attrdef->getMinValues() > 0) {
$this->errormsg = array("attr_min_values", array("attrname"=>$attrdef->getName()));
return false;
}
} else {
if($ret === false)
return false;
}
}
}
$notificationgroups = $this->getParam('notificationgroups');
$notificationusers = $this->getParam('notificationusers');

View File

@ -116,10 +116,11 @@ class SeedDMS_Controller_EditDocument extends SeedDMS_Controller_Common {
$oldattributes = $document->getAttributes();
if($attributes) {
foreach($attributes as $attrdefid=>$attribute) {
$attrdef = $dms->getAttributeDefinition($attrdefid);
if($attrdef = $dms->getAttributeDefinition($attrdefid)) {
if(null === ($ret = $this->callHook('validateAttribute', $attrdef, $attribute))) {
if($attribute) {
if(!$attrdef->validate($attribute)) {
$this->errormsg = getAttributeValidationText($attrdef->getValidationError(), $attrdef->getName(), $attribute);
$this->errormsg = getAttributeValidationError($attrdef->getValidationError(), $attrdef->getName(), $attribute);
return false;
}
@ -128,11 +129,16 @@ class SeedDMS_Controller_EditDocument extends SeedDMS_Controller_Common {
return false;
}
} elseif($attrdef->getMinValues() > 0) {
$this->errormsg = getMLText("attr_min_values", array("attrname"=>$attrdef->getName()));
$this->errormsg = array("attr_min_values", array("attrname"=>$attrdef->getName()));
} elseif(isset($oldattributes[$attrdefid])) {
if(!$document->removeAttribute($dms->getAttributeDefinition($attrdefid)))
return false;
}
} else {
if($ret === false)
return false;
}
}
}
}
foreach($oldattributes as $attrdefid=>$oldattribute) {

View File

@ -51,6 +51,7 @@ class SeedDMS_Controller_EditFolder extends SeedDMS_Controller_Common {
if($attributes) {
foreach($attributes as $attrdefid=>$attribute) {
$attrdef = $dms->getAttributeDefinition($attrdefid);
if(null === ($ret = $this->callHook('validateAttribute', $attrdef, $attribute))) {
if($attribute) {
if(!$attrdef->validate($attribute)) {
$this->errormsg = getAttributeValidationText($attrdef->getValidationError(), $attrdef->getName(), $attribute);
@ -67,6 +68,10 @@ class SeedDMS_Controller_EditFolder extends SeedDMS_Controller_Common {
if(!$folder->removeAttribute($dms->getAttributeDefinition($attrdefid)))
return false;
}
} else {
if($ret === false)
return false;
}
}
}
foreach($oldattributes as $attrdefid=>$oldattribute) {

View File

@ -203,6 +203,9 @@ class SeedDMS_Controller_Common {
foreach($GLOBALS['SEEDDMS_HOOKS']['controller'][lcfirst($tmp)] as $hookObj) {
if (method_exists($hookObj, $hook)) {
switch(func_num_args()) {
case 4:
$result = $hookObj->$hook($this, func_get_arg(1), func_get_arg(2), func_get_arg(3));
break;
case 3:
$result = $hookObj->$hook($this, func_get_arg(1), func_get_arg(2));
break;

View File

@ -194,6 +194,61 @@ class SeedDMS_Extension_Mgr {
return $extensions;
} /* }}} */
static protected function Zip($source, $destination, $include_dir = false) { /* {{{ */
if (!extension_loaded('zip') || !file_exists($source)) {
return false;
}
if (file_exists($destination)) {
unlink ($destination);
}
$zip = new ZipArchive();
if (!$zip->open($destination, ZIPARCHIVE::CREATE)) {
return false;
}
$source = str_replace('\\', '/', realpath($source));
if (is_dir($source) === true) {
$files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST);
if ($include_dir) {
$arr = explode("/",$source);
$maindir = $arr[count($arr)- 1];
$source = "";
for ($i=0; $i < count($arr) - 1; $i++) {
$source .= '/' . $arr[$i];
}
$source = substr($source, 1);
$zip->addEmptyDir($maindir);
}
foreach ($files as $file) {
$file = str_replace('\\', '/', $file);
// Ignore "." and ".." folders
if( in_array(substr($file, strrpos($file, '/')+1), array('.', '..')) )
continue;
$file = realpath($file);
if (is_dir($file) === true) {
$zip->addEmptyDir(str_replace($source . '/', '', $file . '/'));
} else if (is_file($file) === true) {
$zip->addFromString(str_replace($source . '/', '', $file), file_get_contents($file));
}
}
} else if (is_file($source) === true) {
$zip->addFromString(basename($source), file_get_contents($source));
}
return $zip->close();
} /* }}} */
/**
* Create zip archive of an extension
*
@ -207,8 +262,11 @@ class SeedDMS_Extension_Mgr {
$tmpfile = $this->cachedir."/".$extname."-".$version.".zip";
$cmd = "cd ".$this->extdir."/".$extname."; zip -r ".$tmpfile." .";
exec($cmd);
if(!SeedDMS_Extension_Mgr::Zip($this->extdir."/".$extname, $tmpfile)) {
return false;
}
// $cmd = "cd ".$this->extdir."/".$extname."; zip -r ".$tmpfile." .";
// exec($cmd);
return $tmpfile;
} /* }}} */

View File

@ -334,39 +334,45 @@ function getOverallStatusText($status) { /* {{{ */
} /* }}} */
function getAttributeValidationText($error, $attrname='', $attrvalue='', $regex='') { /* {{{ */
$arr = getAttributeValidationError($error, $attrname, $attrvalue, $regex);
return getMLText($arr[0], $arr[1]);
} /* }}} */
function getAttributeValidationError($error, $attrname='', $attrvalue='', $regex='') { /* {{{ */
switch($error) {
case 10:
return getMLText("attr_not_in_valueset", array('attrname'=>$attrname, 'value'=>$attrvalue));
return array("attr_not_in_valueset", array('attrname'=>$attrname, 'value'=>$attrvalue));
break;
case 8:
return getMLText("attr_malformed_date", array('attrname'=>$attrname, 'value'=>$attrvalue));
return array("attr_malformed_date", array('attrname'=>$attrname, 'value'=>$attrvalue));
break;
case 8:
return getMLText("attr_malformed_boolean", array('attrname'=>$attrname, 'value'=>$attrvalue));
return array("attr_malformed_boolean", array('attrname'=>$attrname, 'value'=>$attrvalue));
break;
case 7:
return getMLText("attr_malformed_float", array('attrname'=>$attrname, 'value'=>$attrvalue));
return array("attr_malformed_float", array('attrname'=>$attrname, 'value'=>$attrvalue));
break;
case 6:
return getMLText("attr_malformed_int", array('attrname'=>$attrname, 'value'=>$attrvalue));
return array("attr_malformed_int", array('attrname'=>$attrname, 'value'=>$attrvalue));
break;
case 5:
return getMLText("attr_malformed_email", array('attrname'=>$attrname, 'value'=>$attrvalue));
return array("attr_malformed_email", array('attrname'=>$attrname, 'value'=>$attrvalue));
break;
case 4:
return getMLText("attr_malformed_url", array('attrname'=>$attrname, 'value'=>$attrvalue));
return array("attr_malformed_url", array('attrname'=>$attrname, 'value'=>$attrvalue));
break;
case 3:
return getMLText("attr_no_regex_match", array('attrname'=>$attrname, 'value'=>$attrvalue, 'regex'=>$regex));
return array("attr_no_regex_match", array('attrname'=>$attrname, 'value'=>$attrvalue, 'regex'=>$regex));
break;
case 2:
return getMLText("attr_max_values", array('attrname'=>$attrname, 'value'=>$attrvalue));
return array("attr_max_values", array('attrname'=>$attrname, 'value'=>$attrvalue));
break;
case 1:
return getMLText("attr_min_values", array('attrname'=>$attrname, 'value'=>$attrvalue));
return array("attr_min_values", array('attrname'=>$attrname, 'value'=>$attrvalue));
break;
default:
return getMLText("attr_validation_error", array('attrname'=>$attrname, 'value'=>$attrvalue));
return array("attr_validation_error", array('attrname'=>$attrname, 'value'=>$attrvalue));
break;
}
} /* }}} */

View File

@ -94,6 +94,7 @@ if(isset($_POST["attributes"]))
$attributes = $_POST["attributes"];
else
$attributes = array();
/* Has been moved to controller
foreach($attributes as $attrdefid=>$attribute) {
if($attrdef = $dms->getAttributeDefinition($attrdefid)) {
if($attribute) {
@ -106,11 +107,13 @@ foreach($attributes as $attrdefid=>$attribute) {
}
}
}
*/
if(isset($_POST["attributes_version"]))
$attributes_version = $_POST["attributes_version"];
else
$attributes_version = array();
/* Has been moved to controller
foreach($attributes_version as $attrdefid=>$attribute) {
$attrdef = $dms->getAttributeDefinition($attrdefid);
if($attribute) {
@ -120,6 +123,7 @@ foreach($attributes_version as $attrdefid=>$attribute) {
}
}
}
*/
$reqversion = (int)$_POST["reqversion"];
if ($reqversion<1) $reqversion=1;
@ -466,7 +470,15 @@ for ($file_num=0;$file_num<count($_FILES["userfile"]["tmp_name"]);$file_num++){
$controller->setParam('defaultaccessdocs', $settings->_defaultAccessDocs);
if(!$document = $controller->run()) {
UI::exitError(getMLText("folder_title", array("foldername" => $folder->getName())),getMLText($controller->getErrorMsg()));
$err = $controller->getErrorMsg();
if(is_string($err))
$errmsg = getMLText($err);
elseif(is_array($err)) {
$errmsg = getMLText($err[0], $err[1]);
} else {
$errmsg = $err;
}
UI::exitError(getMLText("folder_title", array("foldername" => $folder->getName())),$errmsg);
} else {
// Send notification to subscribers of folder.
if($notifier) {

View File

@ -67,6 +67,7 @@ if(isset($_POST["attributes"]))
$attributes = $_POST["attributes"];
else
$attributes = array();
/*
foreach($attributes as $attrdefid=>$attribute) {
$attrdef = $dms->getAttributeDefinition($attrdefid);
if($attribute) {
@ -78,6 +79,7 @@ foreach($attributes as $attrdefid=>$attribute) {
UI::exitError(getMLText("folder_title", array("foldername" => $document->getName())),getMLText("attr_min_values", array("attrname"=>$attrdef->getName())));
}
}
*/
/* Check if additional notification shall be added */
$notusers = array();

View File

@ -127,9 +127,15 @@ $controller->setParam('expires', $expires);
$controller->setParam('sequence', $sequence);
$controller->setParam('attributes', $attributes);
if(!$controller->run()) {
if($controller->getErrorMsg()) {
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())), $controller->getErrorMsg());
$err = $controller->getErrorMsg();
if(is_string($err))
$errmsg = getMLText($err);
elseif(is_array($err)) {
$errmsg = getMLText($err[0], $err[1]);
} else {
$errmsg = $err;
}
UI::exitError(getMLText("document_title", array("documentname" => $document->getName())), $errmsg);
}
if ($oldname != $name) {

View File

@ -80,9 +80,15 @@ $controller->setParam('comment', $comment);
$controller->setParam('sequence', $sequence);
$controller->setParam('attributes', $attributes);
if(!$controller->run()) {
if($controller->getErrorMsg()) {
UI::exitError(getMLText("folder_title", array("foldername" => $folder->getName())), $controller->getErrorMsg());
$err = $controller->getErrorMsg();
if(is_string($err))
$errmsg = getMLText($err);
elseif(is_array($err)) {
$errmsg = getMLText($err[0], $err[1]);
} else {
$errmsg = $err;
}
UI::exitError(getMLText("folder_title", array("foldername" => $folder->getName())), $errmsg);
}
if($oldname != $name) {

View File

@ -562,14 +562,14 @@ background-image: linear-gradient(to bottom, #882222, #111111);;
foreach($menuitems as $menuitem) {
if(!empty($menuitem['children'])) {
echo " <li class=\"dropdown\">\n";
echo " <a href=\"".$menuitem['link']."\" class=\"dropdown-toggle\" data-toggle=\"dropdown\">".getMLText($menuitem['label'])." <i class=\"icon-caret-down\"></i></a>\n";
echo " <a class=\"dropdown-toggle\" data-toggle=\"dropdown\">".getMLText($menuitem['label'])." <i class=\"icon-caret-down\"></i></a>\n";
echo " <ul class=\"dropdown-menu\" role=\"menu\">\n";
foreach($menuitem['children'] as $submenuitem) {
echo " <li><a href=\"".$submenuitem['link']."\">".getMLText($submenuitem['label'])."</a></li>\n";
echo " <li><a href=\"".$submenuitem['link']."\"".(isset($submenuitem['target']) ? ' target="'.$submenuitem['target'].'"' : '').">".getMLText($submenuitem['label'])."</a></li>\n";
}
echo " </ul>\n";
} else {
echo "<li><a href=\"".$menuitem['link']."\">".getMLText($menuitem['label'])."</a></li>";
echo "<li><a href=\"".$menuitem['link']."\"".(isset($menuitem['target']) ? ' target="'.$menuitem['target'].'"' : '').">".getMLText($menuitem['label'])."</a></li>";
}
}
} /* }}} */
@ -1157,6 +1157,8 @@ background-image: linear-gradient(to bottom, #882222, #111111);;
$icons["rar"] = "package.svg";
$icons["mpg"] = "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";
@ -2716,12 +2718,13 @@ $('body').on('click', '[id^=\"table-row-document\"] td:nth-child(2)', function(e
// $content .= "<td></td>";
$content .= "<td>";
$content .= "<div class=\"list-action\">";
if($subFolder->getAccessMode($user) >= M_ALL) {
$subFolderAccessMode = $subFolder->getAccessMode($user);
if($subFolderAccessMode >= M_ALL) {
$content .= $this->printDeleteFolderButton($subFolder, 'splash_rm_folder', true);
} else {
$content .= '<span style="padding: 2px; color: #CCC;"><i class="icon-remove"></i></span>';
}
if($subFolder->getAccessMode($user) >= M_READWRITE) {
if($subFolderAccessMode >= M_READWRITE) {
$content .= '<a class_="btn btn-mini" href="../out/out.EditFolder.php?folderid='.$subFolder->getID().'" title="'.getMLText("edit_folder_props").'"><i class="icon-edit"></i></a>';
} else {
$content .= '<span style="padding: 2px; color: #CCC;"><i class="icon-edit"></i></span>';

View File

@ -388,6 +388,7 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Bootstrap_Style {
case 'video/avi':
case 'video/msvideo':
case 'video/x-msvideo':
case 'video/x-matroska':
$this->contentHeading(getMLText("preview"));
?>
<video controls style="width: 100%;">

View File

@ -555,6 +555,9 @@ $('body').on('click', '.order-btn', function(ev) {
}
if ($LeftColumnSpan > 0) {
echo "<div class=\"span".$LeftColumnSpan."\">\n";
echo $this->callHook('leftContentPre');
if ($enableFolderTree) {
if ($showtree==1){
$this->contentHeading("<a href=\"../out/out.ViewFolder.php?folderid=". $folderid."&showtree=0\"><i class=\"icon-minus-sign\"></i></a>", true);
@ -574,6 +577,8 @@ $('body').on('click', '.order-btn', function(ev) {
if ($enableClipboard) $this->printClipboard($this->params['session']->getClipboard(), $previewer);
echo $this->callHook('leftContentPost');
echo "</div>\n";
}
echo "<div class=\"span".$RightColumnSpan."\">\n";