mirror of
https://git.code.sf.net/p/seeddms/code
synced 2025-02-06 07:04:57 +00:00
Merge branch 'seeddms-5.1.x' into seeddms-6.0.x
This commit is contained in:
commit
ac656d4da0
|
@ -32,7 +32,7 @@ RewriteRule ^ext/[^/]+/icon.(?:png|svg)$ - [L]
|
|||
RewriteCond %{REQUEST_URI} "ext/[^/]+/"
|
||||
RewriteRule !^ext/[^/]+/.*(?:op|out|res|node_modules) - [F]
|
||||
RewriteCond %{REQUEST_URI} "ext/[^/]+/res/.*$" [NC]
|
||||
RewriteRule !^ext/[^/]+/res/.*\.(?:css|js|png|gif|svg|ico|html|woff) - [F]
|
||||
RewriteRule !^ext/[^/]+/res/.*\.(?:css|js|png|gif|svg|ico|html|woff|ttf) - [F]
|
||||
RewriteCond %{REQUEST_FILENAME} -f
|
||||
RewriteRule ^ext/.*$ - [L]
|
||||
|
||||
|
|
|
@ -289,6 +289,9 @@
|
|||
- nicer output on info page
|
||||
- do not show filter for categories in database search if they don't exist
|
||||
- show logs of finished worflows
|
||||
- show preview of documents on clipboard
|
||||
- minor improvements in restapi
|
||||
- update layout of tab for attachments
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
Changes in version 5.1.32
|
||||
|
|
|
@ -43,7 +43,9 @@ if (isset($_GET["folderid"]) && is_numeric($_GET["folderid"])) {
|
|||
|
||||
if($view) {
|
||||
$view->setParam('folder', $folder);
|
||||
$view->setParam('conversionmgr', $conversionmgr);
|
||||
$view->setParam('previewWidthList', $settings->_previewWidthList);
|
||||
$view->setParam('previewConverters', isset($settings->_converters['preview']) ? $settings->_converters['preview'] : array());
|
||||
$view->setParam('timeout', $settings->_cmdTimeout);
|
||||
$view->setParam('xsendfile', $settings->_enableXsendfile);
|
||||
$view($_GET);
|
||||
|
|
|
@ -44,13 +44,19 @@ class RestapiController { /* {{{ */
|
|||
} /* }}} */
|
||||
|
||||
protected function __getDocumentData($document) { /* {{{ */
|
||||
$cats = $document->getCategories();
|
||||
$tmp = [];
|
||||
foreach($cats as $cat) {
|
||||
$tmp[] = $this->__getCategoryData($cat);
|
||||
}
|
||||
$data = array(
|
||||
'type'=>'document',
|
||||
'id'=>(int)$document->getId(),
|
||||
'date'=>date('Y-m-d H:i:s', $document->getDate()),
|
||||
'name'=>$document->getName(),
|
||||
'comment'=>$document->getComment(),
|
||||
'keywords'=>$document->getKeywords()
|
||||
'keywords'=>$document->getKeywords(),
|
||||
'categories'=>$tmp
|
||||
);
|
||||
return $data;
|
||||
} /* }}} */
|
||||
|
@ -608,6 +614,7 @@ class RestapiController { /* {{{ */
|
|||
$userobj = $this->container->userobj;
|
||||
$settings = $this->container->config;
|
||||
$notifier = $this->container->notifier;
|
||||
$fulltextservice = $this->container->fulltextservice;
|
||||
|
||||
if(!$userobj) {
|
||||
return $response->withJson(array('success'=>false, 'message'=>'Not logged in', 'data'=>''), 403);
|
||||
|
@ -693,11 +700,94 @@ class RestapiController { /* {{{ */
|
|||
return $response->withJson(array('success'=>false, 'message'=>getMLText("document_duplicate_name"), 'data'=>''), 409);
|
||||
}
|
||||
}
|
||||
// Get the list of reviewers and approvers for this document.
|
||||
$reviewers = array();
|
||||
$approvers = array();
|
||||
$reviewers["i"] = array();
|
||||
$reviewers["g"] = array();
|
||||
$approvers["i"] = array();
|
||||
$approvers["g"] = array();
|
||||
$workflow = null;
|
||||
if($settings->_workflowMode == 'traditional' || $settings->_workflowMode == 'traditional_only_approval') {
|
||||
// add mandatory reviewers/approvers
|
||||
if($settings->_workflowMode == 'traditional') {
|
||||
$mreviewers = getMandatoryReviewers($folder, $userobj);
|
||||
if($mreviewers['i'])
|
||||
$reviewers['i'] = array_merge($reviewers['i'], $mreviewers['i']);
|
||||
if($mreviewers['g'])
|
||||
$reviewers['g'] = array_merge($reviewers['g'], $mreviewers['g']);
|
||||
}
|
||||
$mapprovers = getMandatoryApprovers($folder, $userobj);
|
||||
if($mapprovers['i'])
|
||||
$approvers['i'] = array_merge($approvers['i'], $mapprovers['i']);
|
||||
if($mapprovers['g'])
|
||||
$approvers['g'] = array_merge($approvers['g'], $mapprovers['g']);
|
||||
} elseif($settings->_workflowMode == 'advanced') {
|
||||
if($workflows = $userobj->getMandatoryWorkflows()) {
|
||||
$workflow = array_shift($workflows);
|
||||
}
|
||||
}
|
||||
$temp = $file_info->file;
|
||||
$finfo = finfo_open(FILEINFO_MIME_TYPE);
|
||||
$userfiletype = finfo_file($finfo, $temp);
|
||||
$fileType = ".".pathinfo($origfilename, PATHINFO_EXTENSION);
|
||||
finfo_close($finfo);
|
||||
$attributes_version = [];
|
||||
$notusers = [];
|
||||
$notgroups = [];
|
||||
$controller = Controller::factory('AddDocument');
|
||||
$controller->setParam('documentsource', 'restapi');
|
||||
$controller->setParam('documentsourcedetails', null);
|
||||
$controller->setParam('dms', $dms);
|
||||
$controller->setParam('user', $userobj);
|
||||
$controller->setParam('folder', $mfolder);
|
||||
$controller->setParam('fulltextservice', $fulltextservice);
|
||||
$controller->setParam('name', $docname);
|
||||
$controller->setParam('comment', $comment);
|
||||
$controller->setParam('expires', $expires);
|
||||
$controller->setParam('keywords', $keywords);
|
||||
$controller->setParam('categories', $cats);
|
||||
$controller->setParam('owner', $owner ? $owner : $userobj);
|
||||
$controller->setParam('userfiletmp', $temp);
|
||||
$controller->setParam('userfilename', $origfilename ? $origfilename : basename($temp));
|
||||
$controller->setParam('filetype', $fileType);
|
||||
$controller->setParam('userfiletype', $userfiletype);
|
||||
$controller->setParam('sequence', $sequence);
|
||||
$controller->setParam('reviewers', $reviewers);
|
||||
$controller->setParam('approvers', $approvers);
|
||||
$controller->setParam('reqversion', $reqversion);
|
||||
$controller->setParam('versioncomment', $version_comment);
|
||||
$controller->setParam('attributes', $attributes);
|
||||
$controller->setParam('attributesversion', $attributes_version);
|
||||
$controller->setParam('workflow', $workflow);
|
||||
$controller->setParam('notificationgroups', $notgroups);
|
||||
$controller->setParam('notificationusers', $notusers);
|
||||
$controller->setParam('maxsizeforfulltext', $settings->_maxSizeForFullText);
|
||||
$controller->setParam('defaultaccessdocs', $settings->_defaultAccessDocs);
|
||||
|
||||
if(!($document = $controller())) {
|
||||
$err = $controller->getErrorMsg();
|
||||
if(is_string($err))
|
||||
$errmsg = getMLText($err);
|
||||
elseif(is_array($err)) {
|
||||
$errmsg = getMLText($err[0], $err[1]);
|
||||
} else {
|
||||
$errmsg = $err;
|
||||
}
|
||||
unlink($temp);
|
||||
return $response->withJson(array('success'=>false, 'message'=>'Upload failed', 'data'=>''), 500);
|
||||
} else {
|
||||
if($controller->hasHook('cleanUpDocument')) {
|
||||
$controller->callHook('cleanUpDocument', $document, $file);
|
||||
}
|
||||
// Send notification to subscribers of folder.
|
||||
if($notifier) {
|
||||
$notifier->sendNewDocumentMail($document, $userobj);
|
||||
}
|
||||
unlink($temp);
|
||||
return $response->withJson(array('success'=>true, 'message'=>'Upload succeded', 'data'=>$this->__getLatestVersionData($document->getLatestContent())), 201);
|
||||
}
|
||||
/*
|
||||
$res = $mfolder->addDocument($docname, $comment, $expires, $owner ? $owner : $userobj, $keywords, $cats, $temp, $origfilename ? $origfilename : basename($temp), $fileType, $userfiletype, $sequence, array(), array(), $reqversion, $version_comment, $attributes);
|
||||
unlink($temp);
|
||||
if($res) {
|
||||
|
@ -709,6 +799,7 @@ class RestapiController { /* {{{ */
|
|||
} else {
|
||||
return $response->withJson(array('success'=>false, 'message'=>'Upload failed', 'data'=>''), 500);
|
||||
}
|
||||
*/
|
||||
} else {
|
||||
return $response->withJson(array('success'=>false, 'message'=>'No access', 'data'=>''), 403);
|
||||
}
|
||||
|
@ -1471,9 +1562,12 @@ class RestapiController { /* {{{ */
|
|||
}
|
||||
|
||||
$document = $dms->getDocument($args['id']);
|
||||
if(!$document)
|
||||
return $response->withJson(array('success'=>false, 'message'=>'No such document', 'data'=>''), 404);
|
||||
$category = $dms->getDocumentCategory($args['catid']);
|
||||
if(!$category)
|
||||
return $response->withJson(array('success'=>false, 'message'=>'No such category', 'data'=>''), 404);
|
||||
|
||||
if($document && $category) {
|
||||
if ($document->getAccessMode($userobj, 'removeDocumentCategory') >= M_READWRITE) {
|
||||
$ret = $document->removeCategories(array($category));
|
||||
if ($ret)
|
||||
|
@ -1483,13 +1577,6 @@ class RestapiController { /* {{{ */
|
|||
} else {
|
||||
return $response->withJson(array('success'=>false, 'message'=>'No access', 'data'=>''), 403);
|
||||
}
|
||||
} else {
|
||||
if(!$document)
|
||||
return $response->withJson(array('success'=>false, 'message'=>'No such document', 'data'=>''), 404);
|
||||
if(!$category)
|
||||
return $response->withJson(array('success'=>false, 'message'=>'No such category', 'data'=>''), 404);
|
||||
return $response->withJson(array('success'=>false, 'message'=>'', 'data'=>''), 500);
|
||||
}
|
||||
} /* }}} */
|
||||
|
||||
function removeDocumentCategories($request, $response, $args) { /* {{{ */
|
||||
|
@ -1582,7 +1669,7 @@ class RestapiController { /* {{{ */
|
|||
$doc = $dms->getDocument($args['id']);
|
||||
if($doc && $attrdef) {
|
||||
if($attrdef->getObjType() !== SeedDMS_Core_AttributeDefinition::objtype_document) {
|
||||
return $response->withJson(array('success'=>false, 'message'=>'Attribute definition not suitable for documents', 'data'=>''), 409);
|
||||
return $response->withJson(array('success'=>false, 'message'=>'Attribute definition "'.$attrdef->getName().'" not suitable for documents', 'data'=>''), 409);
|
||||
}
|
||||
|
||||
$params = $request->getParsedBody();
|
||||
|
@ -1639,7 +1726,7 @@ class RestapiController { /* {{{ */
|
|||
$version = $doc->getContentByVersion($args['version']);
|
||||
if($doc && $attrdef && $version) {
|
||||
if($attrdef->getObjType() !== SeedDMS_Core_AttributeDefinition::objtype_documentcontent) {
|
||||
return $response->withJson(array('success'=>false, 'message'=>'Attribute definition not suitable for document versions', 'data'=>''), 409);
|
||||
return $response->withJson(array('success'=>false, 'message'=>'Attribute definition "'.$attrdef->getName().'" not suitable for document versions', 'data'=>''), 409);
|
||||
}
|
||||
|
||||
$params = $request->getParsedBody();
|
||||
|
@ -1693,7 +1780,7 @@ class RestapiController { /* {{{ */
|
|||
$obj = $dms->getFolder($args['id']);
|
||||
if($obj && $attrdef) {
|
||||
if($attrdef->getObjType() !== SeedDMS_Core_AttributeDefinition::objtype_folder) {
|
||||
return $response->withJson(array('success'=>false, 'message'=>'Attribute definition not suitable for folders', 'data'=>''), 409);
|
||||
return $response->withJson(array('success'=>false, 'message'=>'Attribute definition "'.$attrdef->getName().'" not suitable for folders', 'data'=>''), 409);
|
||||
}
|
||||
|
||||
$params = $request->getParsedBody();
|
||||
|
@ -2101,7 +2188,7 @@ class RestapiController { /* {{{ */
|
|||
return $check;
|
||||
$params = $request->getParsedBody();
|
||||
if (empty($params['name'])) {
|
||||
return $response->withJson(array('success'=>false, 'message'=>'Need a category.', 'data'=>''), 400);
|
||||
return $response->withJson(array('success'=>false, 'message'=>'Need a group name.', 'data'=>''), 400);
|
||||
}
|
||||
|
||||
$groupName = $params['name'];
|
||||
|
@ -2116,6 +2203,25 @@ class RestapiController { /* {{{ */
|
|||
return $response->withJson(array('success'=>true, 'message'=>'', 'data'=>$this->__getGroupData($newGroup)), 201);
|
||||
} /* }}} */
|
||||
|
||||
function deleteGroup($request, $response, $args) { /* {{{ */
|
||||
$dms = $this->container->dms;
|
||||
$userobj = $this->container->userobj;
|
||||
|
||||
$check = $this->checkIfAdmin($request, $response);
|
||||
if($check !== true)
|
||||
return $check;
|
||||
|
||||
if($group = $dms->getGroup($args['id'])) {
|
||||
if($result = $group->remove($userobj)) {
|
||||
return $response->withJson(array('success'=>$result, 'message'=>'', 'data'=>''), 200);
|
||||
} else {
|
||||
return $response->withJson(array('success'=>$result, 'message'=>'Could not delete group', 'data'=>''), 500);
|
||||
}
|
||||
} else {
|
||||
return $response->withJson(array('success'=>false, 'message'=>'No such group', 'data'=>''), 404);
|
||||
}
|
||||
} /* }}} */
|
||||
|
||||
function getGroup($request, $response, $args) { /* {{{ */
|
||||
$dms = $this->container->dms;
|
||||
$userobj = $this->container->userobj;
|
||||
|
@ -2156,7 +2262,7 @@ class RestapiController { /* {{{ */
|
|||
|
||||
$params = $request->getParsedBody();
|
||||
if (empty($params['userid'])) {
|
||||
return $response->withJson(array('success'=>false, 'message'=>'Missing userid', 'data'=>''), 200);
|
||||
return $response->withJson(array('success'=>false, 'message'=>'Missing userid', 'data'=>''), 500);
|
||||
}
|
||||
$userId = $params['userid'];
|
||||
if(ctype_digit($userId))
|
||||
|
@ -2199,11 +2305,11 @@ class RestapiController { /* {{{ */
|
|||
} /* }}} */
|
||||
|
||||
function addUserToGroup($request, $response, $args) { /* {{{ */
|
||||
return changeGroupMembership($request, $response, $args, 'add');
|
||||
return $this->changeGroupMembership($request, $response, $args, 'add');
|
||||
} /* }}} */
|
||||
|
||||
function removeUserFromGroup($request, $response, $args) { /* {{{ */
|
||||
return changeGroupMembership($request, $response, $args, 'remove');
|
||||
return $this->changeGroupMembership($request, $response, $args, 'remove');
|
||||
} /* }}} */
|
||||
|
||||
function setFolderInheritsAccess($request, $response, $args) { /* {{{ */
|
||||
|
@ -2784,6 +2890,7 @@ $app->put('/users/{id}/disable', \RestapiController::class.':setDisabledUser');
|
|||
$app->put('/users/{id}/password', \RestapiController::class.':changeUserPassword');
|
||||
$app->post('/groups', \RestapiController::class.':createGroup');
|
||||
$app->get('/groups', \RestapiController::class.':getGroups');
|
||||
$app->delete('/groups/{id}', \RestapiController::class.':deleteGroup');
|
||||
$app->get('/groups/{id}', \RestapiController::class.':getGroup');
|
||||
$app->put('/groups/{id}/addUser', \RestapiController::class.':addUserToGroup');
|
||||
$app->put('/groups/{id}/removeUser', \RestapiController::class.':removeUserFromGroup');
|
||||
|
|
|
@ -159,11 +159,17 @@ class SeedDMS_View_Clipboard extends SeedDMS_Theme_Style {
|
|||
$dms = $this->params['dms'];
|
||||
$clipboard = $this->params['session']->getClipboard();
|
||||
$cachedir = $this->params['cachedir'];
|
||||
$conversionmgr = $this->params['conversionmgr'];
|
||||
$previewwidth = $this->params['previewWidthList'];
|
||||
$previewconverters = $this->params['previewConverters'];
|
||||
$timeout = $this->params['timeout'];
|
||||
$xsendfile = $this->params['xsendfile'];
|
||||
|
||||
$previewer = new SeedDMS_Preview_Previewer($cachedir, $previewwidth, $timeout, $xsendfile);
|
||||
if($conversionmgr)
|
||||
$previewer->setConversionMgr($conversionmgr);
|
||||
else
|
||||
$previewer->setConverters($previewconverters);
|
||||
$content = '';
|
||||
$txt = $this->callHook('preClipboard', $clipboard);
|
||||
if(is_string($txt))
|
||||
|
|
|
@ -350,7 +350,8 @@ $(document).ready( function() {
|
|||
}
|
||||
print "</td>";
|
||||
|
||||
print "<td><ul class=\"actions unstyled\">\n";
|
||||
print "<td>";
|
||||
print "<ul class=\"actions unstyled\">\n";
|
||||
print "<li>".htmlspecialchars($file->getName())."</li>\n";
|
||||
if($file->getName() != $file->getOriginalFileName())
|
||||
print "<li>".htmlspecialchars($file->getOriginalFileName())."</li>\n";
|
||||
|
@ -368,23 +369,26 @@ $(document).ready( function() {
|
|||
print "</ul></td>";
|
||||
print "<td>".htmlspecialchars($file->getComment())."</td>";
|
||||
|
||||
print "<td><ul class=\"unstyled actions\">";
|
||||
print "<td>";
|
||||
$items = [];
|
||||
if ($file_exists) {
|
||||
if($accessobject->check_controller_access('Download', array('action'=>'file'))) {
|
||||
print "<li><a href=\"".$this->params['settings']->_httpRoot."op/op.Download.php?documentid=".$documentid."&file=".$file->getID()."\"><i class=\"fa fa-download\"></i>".getMLText('download')."</a></li>";
|
||||
$items[] = array('link'=>$this->params['settings']->_httpRoot."op/op.Download.php?documentid=".$documentid."&file=".$file->getID(), 'icon'=>'download', 'label'=>'download');
|
||||
}
|
||||
if ($viewonlinefiletypes && (in_array(strtolower($file->getFileType()), $viewonlinefiletypes) || in_array(strtolower($file->getMimeType()), $viewonlinefiletypes))) {
|
||||
if($accessobject->check_controller_access('ViewOnline', array('action'=>'run'))) {
|
||||
print "<li><a target=\"_blank\" href=\"".$this->params['settings']->_httpRoot."op/op.ViewOnline.php?documentid=".$documentid."&file=". $file->getID()."\"><i class=\"fa fa-star\"></i>" . getMLText("view_online") . "</a></li>";
|
||||
$items[] = array('link'=>$this->params['settings']->_httpRoot."op/op.ViewOnline.php?documentid=".$documentid."&file=". $file->getID(), 'icon'=>'star', 'label'=>'view_online');
|
||||
}
|
||||
}
|
||||
} else print "<li><img class=\"mimeicon\" src=\"images/icons/".$this->getMimeIcon($file->getFileType())."\" title=\"".htmlspecialchars($file->getMimeType())."\">";
|
||||
echo "</ul><ul class=\"unstyled actions\">";
|
||||
$this->showActions($items);
|
||||
$items = [];
|
||||
if (($document->getAccessMode($user) == M_ALL)||($file->getUserID()==$user->getID())) {
|
||||
print $this->html_link('RemoveDocumentFile', array('documentid'=>$document->getID(), 'fileid'=>$file->getID()), array(), '<i class="fa fa-remove"></i>'.getMLText("delete"), false, false, array('<li>', '</li>'));
|
||||
print $this->html_link('EditDocumentFile', array('documentid'=>$document->getID(), 'fileid'=>$file->getID()), array(), '<i class="fa fa-edit"></i>'.getMLText("edit"), false, false, array('<li>', '</li>'));
|
||||
$items[] = array('link'=>$this->html_url('RemoveDocumentFile', array('documentid'=>$document->getID(), 'fileid'=>$file->getID())), 'icon'=>'remove', 'label'=>'delete');
|
||||
$items[] = array('link'=>$this->html_url('EditDocumentFile', array('documentid'=>$document->getID(), 'fileid'=>$file->getID())), 'icon'=>'edit', 'label'=>'edit');
|
||||
}
|
||||
print "</ul></td>";
|
||||
$this->showActions($items);
|
||||
print "</td>";
|
||||
|
||||
print "</tr>";
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user