<?php /** * Implementation of ViewDocument view * * @category DMS * @package SeedDMS * @license GPL 2 * @version @version@ * @author Uwe Steinmann <uwe@steinmann.cx> * @copyright Copyright (C) 2002-2005 Markus Westphal, * 2006-2008 Malcolm Cowe, 2010 Matteo Lucarelli, * 2010-2012 Uwe Steinmann * @version Release: @package_version@ */ /** * Include parent class */ require_once("class.Bootstrap.php"); /** * Include class to preview documents */ require_once("SeedDMS/Preview.php"); /** * Class which outputs the html page for ViewDocument view * * @category DMS * @package SeedDMS * @author Markus Westphal, Malcolm Cowe, Uwe Steinmann <uwe@steinmann.cx> * @copyright Copyright (C) 2002-2005 Markus Westphal, * 2006-2008 Malcolm Cowe, 2010 Matteo Lucarelli, * 2010-2012 Uwe Steinmann * @version Release: @package_version@ */ class SeedDMS_View_ViewDocument extends SeedDMS_Bootstrap_Style { protected function getAccessModeText($defMode) { /* {{{ */ switch($defMode) { case M_NONE: return getMLText("access_mode_none"); break; case M_READ: return getMLText("access_mode_read"); break; case M_READWRITE: return getMLText("access_mode_readwrite"); break; case M_ALL: return getMLText("access_mode_all"); break; } } /* }}} */ protected function printAccessList($obj) { /* {{{ */ $accessList = $obj->getAccessList(); if (count($accessList["users"]) == 0 && count($accessList["groups"]) == 0) return; $content = ''; for ($i = 0; $i < count($accessList["groups"]); $i++) { $group = $accessList["groups"][$i]->getGroup(); $accesstext = $this->getAccessModeText($accessList["groups"][$i]->getMode()); $content .= $accesstext.": ".htmlspecialchars($group->getName()); if ($i+1 < count($accessList["groups"]) || count($accessList["users"]) > 0) $content .= "<br />"; } for ($i = 0; $i < count($accessList["users"]); $i++) { $user = $accessList["users"][$i]->getUser(); $accesstext = $this->getAccessModeText($accessList["users"][$i]->getMode()); $content .= $accesstext.": ".htmlspecialchars($user->getFullName()); if ($i+1 < count($accessList["users"])) $content .= "<br />"; } if(count($accessList["groups"]) + count($accessList["users"]) > 3) { $this->printPopupBox(getMLText('list_access_rights'), $content); } else { echo $content; } } /* }}} */ /** * Output a single attribute in the document info section * * @param object $attribute attribute */ protected function printAttribute($attribute) { /* {{{ */ $attrdef = $attribute->getAttributeDefinition(); ?> <tr> <td><?php echo htmlspecialchars($attrdef->getName()); ?>:</td> <td> <?php switch($attrdef->getType()) { case SeedDMS_Core_AttributeDefinition::type_url: $attrs = $attribute->getValueAsArray(); $tmp = array(); foreach($attrs as $attr) { $tmp[] = '<a href="'.htmlspecialchars($attr).'">'.htmlspecialchars($attr).'</a>'; } echo implode('<br />', $tmp); break; case SeedDMS_Core_AttributeDefinition::type_email: $attrs = $attribute->getValueAsArray(); $tmp = array(); foreach($attrs as $attr) { $tmp[] = '<a mailto="'.htmlspecialchars($attr).'">'.htmlspecialchars($attr).'</a>'; } echo implode('<br />', $tmp); break; default: echo htmlspecialchars(implode(', ', $attribute->getValueAsArray())); } ?> </td> </tr> <?php } /* }}} */ function documentListItem() { /* {{{ */ $dms = $this->params['dms']; $user = $this->params['user']; $previewwidth = $this->params['previewWidthList']; $cachedir = $this->params['cachedir']; $document = $this->params['document']; if($document) { if ($document->getAccessMode($user) >= M_READ) { $previewer = new SeedDMS_Preview_Previewer($cachedir, $previewwidth); $txt = $this->callHook('documentListItem', $document, $previewer, 'viewitem'); if(is_string($txt)) $content = $txt; else $content = $this->documentListRow($document, $previewer, true); echo $content; } } } /* }}} */ function timelinedata() { /* {{{ */ $dms = $this->params['dms']; $user = $this->params['user']; $document = $this->params['document']; $jsondata = array(); if($user->isAdmin()) { $data = $document->getTimeline(); foreach($data as $i=>$item) { switch($item['type']) { case 'add_version': $msg = getMLText('timeline_'.$item['type'], array('document'=>htmlspecialchars($item['document']->getName()), 'version'=> $item['version'])); break; case 'add_file': $msg = getMLText('timeline_'.$item['type'], array('document'=>htmlspecialchars($item['document']->getName()))); break; case 'status_change': $msg = getMLText('timeline_'.$item['type'], array('document'=>htmlspecialchars($item['document']->getName()), 'version'=> $item['version'], 'status'=> getOverallStatusText($item['status']))); break; default: $msg = '???'; } $data[$i]['msg'] = $msg; } foreach($data as $item) { if($item['type'] == 'status_change') $classname = $item['type']."_".$item['status']; else $classname = $item['type']; $d = makeTsFromLongDate($item['date']); $jsondata[] = array('start'=>date('c', $d)/*$item['date']*/, 'content'=>$item['msg'], 'className'=>$classname); } } header('Content-Type: application/json'); echo json_encode($jsondata); } /* }}} */ function js() { /* {{{ */ $dms = $this->params['dms']; $user = $this->params['user']; $document = $this->params['document']; header('Content-Type: application/javascript'); if($user->isAdmin()) { $this->printTimelineJs('out.ViewDocument.php?action=timelinedata&documentid='.$document->getID(), 300, '', date('Y-m-d')); } $this->printDocumentChooserJs("form1"); } /* }}} */ function documentInfos() { /* {{{ */ $dms = $this->params['dms']; $user = $this->params['user']; $document = $this->params['document']; $checkoutdir = $this->params['checkOutDir']; $this->contentHeading(getMLText("document_infos")); if($info = $document->getCheckOutInfo()) { echo "<div class=\"alert alert-info\">"; $session = $this->params['session']; if($session->getSu()) { $origuser = $dms->getUser($session->getUser()); $checkoutpath = sprintf($checkoutdir, preg_replace('/[^A-Za-z0-9_-]/', '', $origuser->getLogin())); } else { $checkoutpath = sprintf($checkoutdir, preg_replace('/[^A-Za-z0-9_-]/', '', $user->getLogin())); } echo "<a href=\"file://".$info['filename']."\">".getMLText('copied_to_checkout_as', array('date'=>$info['date'], 'filename'=>substr($info['filename'], strlen($checkoutpath)+1)))."</a>"; echo "</div>"; } $this->contentContainerStart(); $txt = $this->callHook('preDocumentInfos', $document); if(is_string($txt)) echo $txt; $txt = $this->callHook('documentInfos', $document); if(is_string($txt)) echo $txt; else { ?> <table class="table-condensed"> <?php if($user->isAdmin()) { echo "<tr>"; echo "<td>".getMLText("id").":</td>\n"; echo "<td>".htmlspecialchars($document->getID())."</td>\n"; echo "</tr>"; } ?> <tr> <td><?php printMLText("name");?>:</td> <td><?php print htmlspecialchars($document->getName());?></td> </tr> <tr> <td><?php printMLText("owner");?>:</td> <td> <?php $owner = $document->getOwner(); print "<a class=\"infos\" href=\"mailto:".$owner->getEmail()."\">".htmlspecialchars($owner->getFullName())."</a>"; ?> </td> </tr> <?php if($document->getComment()) { ?> <tr> <td><?php printMLText("comment");?>:</td> <td><?php print htmlspecialchars($document->getComment());?></td> </tr> <?php } if($user->isAdmin()) { echo "<tr>"; echo "<td>".getMLText('default_access').":</td>"; echo "<td>".$this->getAccessModeText($document->getDefaultAccess())."</td>"; echo "</tr>"; if($document->inheritsAccess()) { echo "<tr>"; echo "<td>".getMLText("access_mode").":</td>\n"; echo "<td>"; echo getMLText("inherited")."<br />"; $this->printAccessList($document); echo "</tr>"; } else { echo "<tr>"; echo "<td>".getMLText('access_mode').":</td>"; echo "<td>"; $this->printAccessList($document); echo "</td>"; echo "</tr>"; } } ?> <tr> <td><?php printMLText("used_discspace");?>:</td> <td><?php print SeedDMS_Core_File::format_filesize($document->getUsedDiskSpace());?></td> </tr> <tr> <td><?php printMLText("creation_date");?>:</td> <td><?php print getLongReadableDate($document->getDate()); ?></td> </tr> <?php if($document->expires()) { ?> <tr> <td><?php printMLText("expires");?>:</td> <td><?php print getReadableDate($document->getExpires()); ?></td> </tr> <?php } if($document->getKeywords()) { ?> <tr> <td><?php printMLText("keywords");?>:</td> <td><?php print htmlspecialchars($document->getKeywords());?></td> </tr> <?php } if($cats = $document->getCategories()) { ?> <tr> <td><?php printMLText("categories");?>:</td> <td> <?php $ct = array(); foreach($cats as $cat) $ct[] = htmlspecialchars($cat->getName()); echo implode(', ', $ct); ?> </td> </tr> <?php } ?> <?php $attributes = $document->getAttributes(); if($attributes) { foreach($attributes as $attribute) { $arr = $this->callHook('showDocumentAttribute', $document, $attribute); if(is_array($arr)) { echo "<tr>"; echo "<td>".$arr[0].":</td>"; echo "<td>".$arr[1]."</td>"; echo "</tr>"; } else { $this->printAttribute($attribute); } } } ?> </table> <?php } $txt = $this->callHook('postDocumentInfos', $document); if(is_string($txt)) echo $txt; $this->contentContainerEnd(); } /* }}} */ function preview() { /* {{{ */ $dms = $this->params['dms']; $document = $this->params['document']; $timeout = $this->params['timeout']; $showfullpreview = $this->params['showFullPreview']; $converttopdf = $this->params['convertToPdf']; $cachedir = $this->params['cachedir']; if(!$showfullpreview) return; $accessop = $this->params['accessobject']; if($accessop->check_controller_access('ViewOnline', array('action'=>'version'))) { $latestContent = $document->getLatestContent(); $txt = $this->callHook('preDocumentPreview', $latestContent); if(is_string($txt)) echo $txt; $txt = $this->callHook('documentPreview', $latestContent); if(is_string($txt)) echo $txt; else { switch($latestContent->getMimeType()) { case 'audio/mpeg': case 'audio/mp3': case 'audio/ogg': case 'audio/wav': $this->contentHeading(getMLText("preview")); ?> <audio controls style="width: 100%;"> <source src="../op/op.ViewOnline.php?documentid=<?php echo $document->getID(); ?>&version=<?php echo $latestContent->getVersion(); ?>" type="audio/mpeg"> </audio> <?php break; case 'application/pdf': $this->contentHeading(getMLText("preview")); ?> <iframe src="../pdfviewer/web/viewer.html?file=<?php echo urlencode('../../op/op.ViewOnline.php?documentid='.$document->getID().'&version='.$latestContent->getVersion()); ?>" width="100%" height="700px"></iframe> <?php break; case 'image/svg+xml': $this->contentHeading(getMLText("preview")); ?> <img src="../op/op.ViewOnline.php?documentid=<?php echo $document->getID(); ?>&version=<?php echo $latestContent->getVersion(); ?>" width="100%"> <?php break; default: $txt = $this->callHook('additionalDocumentPreview', $latestContent); if(is_string($txt)) echo $txt; break; } } $txt = $this->callHook('postDocumentPreview', $latestContent); if(is_string($txt)) echo $txt; if($converttopdf) { $pdfpreviewer = new SeedDMS_Preview_PdfPreviewer($cachedir, $timeout); if($pdfpreviewer->hasConverter($latestContent->getMimeType())) { $this->contentHeading(getMLText("preview")); ?> <iframe src="../pdfviewer/web/viewer.html?file=<?php echo urlencode('../../op/op.PdfPreview.php?documentid='.$document->getID().'&version='.$latestContent->getVersion()); ?>" width="100%" height="700px"></iframe> <?php } } } } /* }}} */ function show() { /* {{{ */ parent::show(); $dms = $this->params['dms']; $user = $this->params['user']; $folder = $this->params['folder']; $document = $this->params['document']; $accessop = $this->params['accessobject']; $viewonlinefiletypes = $this->params['viewonlinefiletypes']; $enableownerrevapp = $this->params['enableownerrevapp']; $enableownerreceipt = $this->params['enableownerreceipt']; $workflowmode = $this->params['workflowmode']; $cachedir = $this->params['cachedir']; $previewwidthlist = $this->params['previewWidthList']; $previewwidthdetail = $this->params['previewWidthDetail']; $previewconverters = $this->params['previewConverters']; $documentid = $document->getId(); $currenttab = $this->params['currenttab']; $timeout = $this->params['timeout']; $versions = $document->getContent(); $this->htmlAddHeader('<link href="../styles/'.$this->theme.'/timeline/timeline.css" rel="stylesheet">'."\n", 'css'); $this->htmlAddHeader('<script type="text/javascript" src="../styles/'.$this->theme.'/timeline/timeline-min.js"></script>'."\n", 'js'); $this->htmlAddHeader('<script type="text/javascript" src="../styles/'.$this->theme.'/timeline/timeline-locales.js"></script>'."\n", 'js'); $this->htmlStartPage(getMLText("document_title", array("documentname" => htmlspecialchars($document->getName())))); $this->globalNavigation($folder); $this->contentStart(); $this->pageNavigation($this->getFolderPathHTML($folder, true, $document), "view_document", $document); if ($document->isLocked()) { $lockingUser = $document->getLockingUser(); $txt = $this->callHook('documentIsLocked', $document, $lockingUser); if(is_string($txt)) echo $txt; else { ?> <div class="alert alert-warning"> <?php printMLText("lock_message", array("email" => $lockingUser->getEmail(), "username" => htmlspecialchars($lockingUser->getFullName())));?> </div> <?php } } /* Retrieve latest content and attacheѕ files */ $latestContent = $document->getLatestContent(); $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, 'target'); /* Retrieve reverse linked documents */ $reverselinks = $document->getReverseDocumentLinks(); $reverselinks = SeedDMS_Core_DMS::filterDocumentLinks($user, $reverselinks, 'source'); $needwkflaction = false; if($workflowmode == 'traditional' || $workflowmode == 'traditional_only_approval') { } else { $workflow = $latestContent->getWorkflow(); if($workflow) { $workflowstate = $latestContent->getWorkflowState(); $transitions = $workflow->getNextTransitions($workflowstate); $needwkflaction = $latestContent->needsWorkflowAction($user); } } if($needwkflaction) { $this->infoMsg(getMLText('needs_workflow_action')); } $status = $latestContent->getStatus(); $reviewStatus = $latestContent->getReviewStatus(); $approvalStatus = $latestContent->getApprovalStatus(); $receiptStatus = $latestContent->getReceiptStatus(); $revisionStatus = $latestContent->getRevisionStatus(); ?> <div class="row-fluid"> <div class="span4"> <?php $this->documentInfos(); if($accessop->check_controller_access('ViewOnline', array('action'=>'run'))) { $this->preview(); } ?> </div> <div class="span8"> <ul class="nav nav-tabs" id="docinfotab"> <li class="<?php if(!$currenttab || $currenttab == 'docinfo') echo 'active'; ?>"><a data-target="#docinfo" data-toggle="tab"><?php printMLText('current_version'); ?></a></li> <?php if (count($versions)>1) { ?> <li class="<?php if($currenttab == 'previous') echo 'active'; ?>"><a data-target="#previous" data-toggle="tab"><?php printMLText('previous_versions'); ?></a></li> <?php } if($workflowmode == 'traditional' || $workflowmode == 'traditional_only_approval') { if((is_array($reviewStatus) && count($reviewStatus)>0) || (is_array($approvalStatus) && count($approvalStatus)>0)) { ?> <li class="<?php if($currenttab == 'revapp') echo 'active'; ?>"><a data-target="#revapp" data-toggle="tab"><?php if($workflowmode == 'traditional') echo getMLText('reviewers')."/"; echo getMLText('approvers'); ?></a></li> <?php } } else { if($workflow) { ?> <li class="<?php if($currenttab == 'workflow') echo 'active'; ?>"><a data-target="#workflow" data-toggle="tab"><?php echo getMLText('workflow'); ?></a></li> <?php } } if(is_array($receiptStatus) && count($receiptStatus)>0) { ?> <li class="<?php if($currenttab == 'recipients') echo 'active'; ?>"><a data-target="#recipients" data-toggle="tab"><?php echo getMLText('recipients'); ?></a></li> <?php } if(is_array($revisionStatus) && count($revisionStatus)>0) { ?> <li class="<?php if($currenttab == 'revision') echo 'active'; ?>"><a data-target="#revision" data-toggle="tab"><?php echo getMLText('revise_document'); ?></a></li> <?php } ?> <li class="<?php if($currenttab == 'attachments') echo 'active'; ?>"><a data-target="#attachments" data-toggle="tab"><?php printMLText('linked_files'); echo (count($files)) ? " (".count($files).")" : ""; ?></a></li> <li class="<?php if($currenttab == 'links') echo 'active'; ?>"><a data-target="#links" data-toggle="tab"><?php printMLText('linked_documents'); echo (count($links) || count($reverselinks)) ? " (".count($links)."/".count($reverselinks).")" : ""; ?></a></li> </ul> <div class="tab-content"> <div class="tab-pane <?php if(!$currenttab || $currenttab == 'docinfo') echo 'active'; ?>" id="docinfo"> <?php if(!$latestContent) { $this->contentContainerStart(); print getMLText('document_content_missing'); $this->contentContainerEnd(); $this->contentEnd(); $this->htmlEndPage(); exit; } // verify if file exists $file_exists=file_exists($dms->contentDir . $latestContent->getPath()); $this->contentContainerStart(); print "<table class=\"table\">"; print "<thead>\n<tr>\n"; print "<th colspan=\"2\">".htmlspecialchars($latestContent->getOriginalFileName())."</th>\n"; // print "<th width='*'>".getMLText("file")."</th>\n"; // print "<th width='25%'>".getMLText("comment")."</th>\n"; print "<th width='20%'>".getMLText("status")."</th>\n"; print "<th width='25%'></th>\n"; print "</tr></thead><tbody>\n"; print "<tr>\n"; print "<td style=\"width:".$previewwidthdetail."px; text-align: center;\">"; $previewer = new SeedDMS_Preview_Previewer($cachedir, $previewwidthdetail, $timeout); $previewer->setConverters($previewconverters); $previewer->createPreview($latestContent); if ($file_exists) { if ($viewonlinefiletypes && in_array(strtolower($latestContent->getFileType()), $viewonlinefiletypes)) { if($accessop->check_controller_access('ViewOnline', array('action'=>'run'))) { print "<a target=\"_blank\" href=\"../op/op.ViewOnline.php?documentid=".$documentid."&version=". $latestContent->getVersion()."\">"; } } else { if($accessop->check_controller_access('Download', array('action'=>'version'))) { print "<a href=\"../op/op.Download.php?documentid=".$documentid."&version=".$latestContent->getVersion()."\">"; } } } if($previewer->hasPreview($latestContent)) { print("<img class=\"mimeicon\" width=\"".$previewwidthdetail."\" src=\"../op/op.Preview.php?documentid=".$document->getID()."&version=".$latestContent->getVersion()."&width=".$previewwidthdetail."\" title=\"".htmlspecialchars($latestContent->getMimeType())."\">"); } else { print "<img class=\"mimeicon\" width=\"".$previewwidthdetail."\" src=\"".$this->getMimeIcon($latestContent->getFileType())."\" title=\"".htmlspecialchars($latestContent->getMimeType())."\">"; } if ($file_exists) { if($accessop->check_controller_access('Download', array('action'=>'run')) || $accessop->check_controller_access('ViewOnline', array('action'=>'run'))) print "</a>"; } print "</td>\n"; print "<td><ul class=\"actions unstyled\">\n"; // print "<li class=\"wordbreak\">".$latestContent->getOriginalFileName() ."</li>\n"; print "<li>".getMLText('version').": ".$latestContent->getVersion()."</li>\n"; if ($file_exists) print "<li>". SeedDMS_Core_File::format_filesize($latestContent->getFileSize()) .", ".htmlspecialchars($latestContent->getMimeType())."</li>"; else print "<li><span class=\"warning\">".getMLText("document_deleted")."</span></li>"; $updatingUser = $latestContent->getUser(); print "<li>".getMLText("uploaded_by")." <a href=\"mailto:".$updatingUser->getEmail()."\">".htmlspecialchars($updatingUser->getFullName())."</a></li>"; print "<li>".getLongReadableDate($latestContent->getDate())."</li>"; print "</ul>\n"; print "<p style=\"font-style: italic;\">".htmlspecialchars($latestContent->getComment())."</p>"; print "<ul class=\"actions unstyled\">\n"; $attributes = $latestContent->getAttributes(); if($attributes) { foreach($attributes as $attribute) { $arr = $this->callHook('showDocumentContentAttribute', $latestContent, $attribute); if(is_array($arr)) { print "<li>".$arr[0].": ".$arr[1]."</li>\n"; } else { $attrdef = $attribute->getAttributeDefinition(); print "<li>".htmlspecialchars($attrdef->getName()).": ".htmlspecialchars(implode(', ', $attribute->getValueAsArray()))."</li>\n"; } } } print "</ul></td>\n"; // print "<td>".htmlspecialchars($latestContent->getComment())."</td>"; print "<td width='10%'>"; print getOverallStatusText($status["status"]); if ( $status["status"]==S_DRAFT_REV || $status["status"]==S_DRAFT_APP || $status["status"]==S_IN_WORKFLOW || $status["status"]==S_EXPIRED ){ print "<br><span".($document->hasExpired()?" class=\"warning\" ":"").">".(!$document->getExpires() ? getMLText("does_not_expire") : getMLText("expires").": ".getReadableDate($document->getExpires()))."</span>"; } print "</td>"; print "<td>"; print "<ul class=\"unstyled actions\">"; if ($file_exists){ if($accessop->check_controller_access('Download', array('action'=>'version'))) { print "<li><a href=\"../op/op.Download.php?documentid=".$documentid."&version=".$latestContent->getVersion()."\"><i class=\"icon-download\"></i>".getMLText("download")."</a></li>"; } if($accessop->check_controller_access('ViewOnline', array('action'=>'run'))) { if ($viewonlinefiletypes && in_array(strtolower($latestContent->getFileType()), $viewonlinefiletypes)) print "<li><a target=\"_blank\" href=\"../op/op.ViewOnline.php?documentid=".$documentid."&version=". $latestContent->getVersion()."\"><i class=\"icon-star\"></i>" . getMLText("view_online") . "</a></li>"; } } print "</ul>"; print "<ul class=\"unstyled actions\">"; if($this->check_access('EditOnline')) if($accessop->mayEditVersion($document)) { print "<li>".$this->html_link('EditOnline', array('documentid'=>$documentid, 'version'=>$latestContent->getVersion()), array(), "<i class=\"icon-edit\"></i>".getMLText("edit_version"), false, true)."</li>"; } /* Only admin has the right to remove version in any case or a regular * user if enableVersionDeletion is on */ if($this->check_access('RemoveVersion')) if($accessop->mayRemoveVersion($document)) { print "<li>".$this->html_link('RemoveVersion', array('documentid'=>$documentid, 'version'=>$latestContent->getVersion()), array(), "<i class=\"icon-remove\"></i>".getMLText("rm_version"), false, true)."</li>"; } if($this->check_access('OverrideContentStatus')) if($accessop->mayOverrideStatus($document)) { print "<li>".$this->html_link('OverrideContentStatus', array('documentid'=>$documentid, 'version'=>$latestContent->getVersion()), array(), "<i class=\"icon-align-justify\"></i>".getMLText("change_status"), false, true)."</li>"; } if($this->check_access('SetRecipients')) if($accessop->maySetRecipients($document)) { print "<li>".$this->html_link('SetRecipients', array('documentid'=>$documentid, 'version'=>$latestContent->getVersion()), array(), "<i class=\"icon-check\"></i>".getMLText("change_recipients"), false, true)."</li>"; } if($this->check_access('SetRevisors')) if($accessop->maySetRevisors($document)) { print "<li>".$this->html_link('SetRevisors', array('documentid'=>$documentid, 'version'=>$latestContent->getVersion()), array(), "<i class=\"icon-refresh\"></i>".getMLText("change_revisors"), false, true)."</li>"; } if($workflowmode == 'traditional' || $workflowmode == 'traditional_only_approval') { // Allow changing reviewers/approvals only if not reviewed if($this->check_access('SetReviewersApprovers')) if($accessop->maySetReviewersApprovers($document)) { print "<li>".$this->html_link('SetReviewersApprovers', array('documentid'=>$documentid, 'version'=>$latestContent->getVersion()), array(), "<i class=\"icon-edit\"></i>".getMLText("change_assignments"), false, true)."</li>"; } } else { if($this->check_access('SetWorkflow')) if($accessop->maySetWorkflow($document)) { if(!$workflow) { print "<li>".$this->html_link('SetWorkflow', array('documentid'=>$documentid, 'version'=>$latestContent->getVersion()), array(), "<i class=\"icon-random\"></i>".getMLText("set_workflow"), false, true)."</li>"; } } } /* if($accessop->maySetExpires($document)) { print "<li>".$this->html_link('SetExpires', array('documentid'=>$documentid), array(), "<i class=\"icon-time\"></i>".getMLText("set_expiry"), false, true)."</li>"; } */ if($this->check_access('AddToTransmittal')) if($dms->getAllTransmittals($user)) { if($this->check_access('AddToTransmittal')) print "<li>".$this->html_link('AddToTransmittal', array('documentid'=>$documentid, 'version'=>$latestContent->getVersion()), array(), "<i class=\"icon-list\"></i>".getMLText("add_to_transmittal"), false, true)."</li>"; } if($this->check_access('EditComment')) if($accessop->mayEditComment($document)) { print "<li>".$this->html_link('EditComment', array('documentid'=>$documentid, 'version'=>$latestContent->getVersion()), array(), "<i class=\"icon-comment\"></i>".getMLText("edit_comment"), false, true)."</li>"; } if($this->check_access('EditAttributes')) if($accessop->mayEditAttributes($document)) { print "<li>".$this->html_link('EditAttributes', array('documentid'=>$documentid, 'version'=>$latestContent->getVersion()), array(), "<i class=\"icon-edit\"></i>".getMLText("edit_attributes"), false, true)."</li>"; } $items = $this->callHook('extraVersionActions', $latestContent); if($items) { foreach($items as $item) { echo "<li>".$item."</li>"; } } print "</ul>"; echo "</td>"; print "</tr></tbody>\n</table>\n"; $this->contentContainerEnd(); if($user->isAdmin()) { $this->contentHeading(getMLText("status")); $this->contentContainerStart(); $statuslog = $latestContent->getStatusLog(); echo "<table class=\"table table-condensed\"><thead>"; echo "<th>".getMLText('date')."</th><th>".getMLText('status')."</th><th>".getMLText('user')."</th><th>".getMLText('comment')."</th></tr>\n"; echo "</thead><tbody>"; foreach($statuslog as $entry) { if($suser = $dms->getUser($entry['userID'])) $fullname = $suser->getFullName(); else $fullname = "--"; echo "<tr><td>".$entry['date']."</td><td>".getOverallStatusText($entry['status'])."</td><td>".$fullname."</td><td>".$entry['comment']."</td></tr>\n"; } print "</tbody>\n</table>\n"; $this->contentContainerEnd(); $wkflogs = $latestContent->getWorkflowLog(); if($wkflogs) { $this->contentHeading(getMLText("workflow_summary")); $this->contentContainerStart(); echo "<table class=\"table table-condensed\"><thead>"; echo "<th>".getMLText('date')."</th><th>".getMLText('action')."</th><th>".getMLText('user')."</th><th>".getMLText('comment')."</th></tr>\n"; echo "</thead><tbody>"; foreach($wkflogs as $wkflog) { echo "<tr>"; echo "<td>".$wkflog->getDate()."</td>"; echo "<td>".$wkflog->getTransition()->getAction()->getName()."</td>"; $loguser = $wkflog->getUser(); echo "<td>".$loguser->getFullName()."</td>"; echo "<td>".$wkflog->getComment()."</td>"; echo "</tr>"; } print "</tbody>\n</table>\n"; $this->contentContainerEnd(); } } ?> </div> <?php if($workflowmode == 'traditional' || $workflowmode == 'traditional_only_approval') { if((is_array($reviewStatus) && count($reviewStatus)>0) || (is_array($approvalStatus) && count($approvalStatus)>0)) { ?> <div class="tab-pane <?php if($currenttab == 'revapp') echo 'active'; ?>" id="revapp"> <?php $this->contentContainerstart(); print "<table class=\"table-condensed\">\n"; /* Just check fo an exting reviewStatus, even workflow mode is set * to traditional_only_approval. There may be old documents which * are still in S_DRAFT_REV. */ if (/*$workflowmode != 'traditional_only_approval' &&*/ is_array($reviewStatus) && count($reviewStatus)>0) { print "<tr><td colspan=5>\n"; $this->contentSubHeading(getMLText("reviewers")); print "</tr>"; print "<tr>\n"; print "<td width='20%'><b>".getMLText("name")."</b></td>\n"; print "<td width='20%'><b>".getMLText("last_update")."</b></td>\n"; print "<td width='25%'><b>".getMLText("comment")."</b></td>"; print "<td width='15%'><b>".getMLText("status")."</b></td>\n"; print "<td width='20%'></td>\n"; print "</tr>\n"; foreach ($reviewStatus as $r) { $required = null; $is_reviewer = false; $accesserr = ''; switch ($r["type"]) { case 0: // Reviewer is an individual. $required = $dms->getUser($r["required"]); if (!is_object($required)) { $reqName = getMLText("unknown_user")." '".$r["required"]."'"; } else { $reqName = "<i class=\"icon-user\"></i> ".htmlspecialchars($required->getFullName()." (".$required->getLogin().")"); if($user->isAdmin()) { if($document->getAccessMode($required) < M_READ || $latestContent->getAccessMode($required) < M_READ) $accesserr = getMLText("access_denied"); elseif(is_object($required) && $required->isDisabled()) $accesserr = getMLText("login_disabled_title"); } if($required->getId() == $user->getId()/* && ($user->getId() != $owner->getId() || $enableownerrevapp == 1)*/) $is_reviewer = true; } break; case 1: // Reviewer is a group. $required = $dms->getGroup($r["required"]); if (!is_object($required)) { $reqName = getMLText("unknown_group")." '".$r["required"]."'"; } else { $reqName = "<i class=\"icon-group\"></i> ".htmlspecialchars($required->getName()); if($user->isAdmin()) { $grpusers = $required->getUsers(); if(!$grpusers) $accesserr = getMLText("no_group_members"); } if($required->isMember($user)/* && ($user->getId() != $owner->getId() || $enableownerrevapp == 1)*/) $is_reviewer = true; } break; } print "<tr>\n"; print "<td>".$reqName."</td>\n"; print "<td><ul class=\"unstyled\"><li>".$r["date"]."</li>"; /* $updateUser is the user who has done the review */ $updateUser = $dms->getUser($r["userID"]); print "<li>".(is_object($updateUser) ? htmlspecialchars($updateUser->getFullName()." (".$updateUser->getLogin().")") : "unknown user id '".$r["userID"]."'")."</li></ul></td>"; print "<td>".htmlspecialchars($r["comment"]); if($r['file']) { echo "<br />"; if($accessop->check_controller_access('Download', array('action'=>'run'))) { echo "<a href=\"../op/op.Download.php?documentid=".$documentid."&reviewlogid=".$r['reviewLogID']."\" class=\"btn btn-mini\"><i class=\"icon-download\"></i> ".getMLText('download')."</a>"; } } print "</td>\n"; print "<td>".getReviewStatusText($r["status"])."</td>\n"; print "<td><ul class=\"unstyled\">"; if($accesserr) echo "<li><span class=\"alert alert-error\">".$accesserr."</span></li>"; if($accessop->mayReview($document)) { if ($is_reviewer) { if ($r["status"]==0) { print "<li>".$this->html_link('ReviewDocument', array('documentid'=>$documentid, 'version'=>$latestContent->getVersion(), 'reviewid'=>$r['reviewID']), array('class'=>'btn btn-mini'), getMLText("add_review"), false, true)."</li>"; } elseif ($accessop->mayUpdateReview($document, $updateUser) && (($r["status"]==1)||($r["status"]==-1))){ print "<li>".$this->html_link('ReviewDocument', array('documentid'=>$documentid, 'version'=>$latestContent->getVersion(), 'reviewid'=>$r['reviewID']), array('class'=>'btn btn-mini'), getMLText("edit"), false, true)."</li>"; } } } print "</ul></td>\n"; print "</tr>\n"; } } if (is_array($approvalStatus) && count($approvalStatus)>0) { print "<tr><td colspan=5>\n"; $this->contentSubHeading(getMLText("approvers")); print "</tr>"; print "<tr>\n"; print "<td width='20%'><b>".getMLText("name")."</b></td>\n"; print "<td width='20%'><b>".getMLText("last_update")."</b></td>\n"; print "<td width='25%'><b>".getMLText("comment")."</b></td>"; print "<td width='15%'><b>".getMLText("status")."</b></td>\n"; print "<td width='20%'></td>\n"; print "</tr>\n"; foreach ($approvalStatus as $a) { $required = null; $is_approver = false; $accesserr = ''; switch ($a["type"]) { case 0: // Approver is an individual. $required = $dms->getUser($a["required"]); if (!is_object($required)) { $reqName = getMLText("unknown_user")." '".$a["required"]."'"; } else { $reqName = "<i class=\"icon-user\"></i> ".htmlspecialchars($required->getFullName()." (".$required->getLogin().")"); if($user->isAdmin()) { if($document->getAccessMode($required) < M_READ || $latestContent->getAccessMode($required) < M_READ) $accesserr = getMLText("access_denied"); elseif(is_object($required) && $required->isDisabled()) $accesserr = getMLText("login_disabled_title"); } if($required->getId() == $user->getId()) $is_approver = true; } break; case 1: // Approver is a group. $required = $dms->getGroup($a["required"]); if (!is_object($required)) { $reqName = getMLText("unknown_group")." '".$a["required"]."'"; } else { $reqName = "<i class=\"icon-group\"></i> ".htmlspecialchars($required->getName()); if($user->isAdmin()) { $grpusers = $required->getUsers(); if(!$grpusers) $accesserr = getMLText("no_group_members"); } if($required->isMember($user)/* && ($user->getId() != $owner->getId() || $enableownerrevapp == 1)*/) $is_approver = true; } break; } print "<tr>\n"; print "<td>".$reqName."</td>\n"; print "<td><ul class=\"unstyled\"><li>".$a["date"]."</li>"; /* $updateUser is the user who has done the approval */ $updateUser = $dms->getUser($a["userID"]); print "<li>".(is_object($updateUser) ? htmlspecialchars($updateUser->getFullName()." (".$updateUser->getLogin().")") : "unknown user id '".$a["userID"]."'")."</li></ul></td>"; print "<td>".htmlspecialchars($a["comment"]); if($a['file']) { echo "<br />"; if($accessop->check_controller_access('Download', array('action'=>'run'))) { echo "<a href=\"../op/op.Download.php?documentid=".$documentid."&approvelogid=".$a['approveLogID']."\" class=\"btn btn-mini\"><i class=\"icon-download\"></i> ".getMLText('download')."</a>"; } } echo "</td>\n"; print "<td>".getApprovalStatusText($a["status"])."</td>\n"; print "<td><ul class=\"unstyled\">"; if($accesserr) echo "<li><span class=\"alert alert-error\">".$accesserr."</span></li>"; if($accessop->mayApprove($document)) { if ($is_approver) { if ($a['status'] == 0) { print "<li>".$this->html_link('ApproveDocument', array('documentid'=>$documentid, 'version'=>$latestContent->getVersion(), 'approveid'=>$a['approveID']), array('class'=>'btn btn-mini'), getMLText("add_approval"), false, true)."</li>"; } elseif ($accessop->mayUpdateApproval($document, $updateUser) && (($a["status"]==1)||($a["status"]==-1))){ print "<li>".$this->html_link('ApproveDocument', array('documentid'=>$documentid, 'version'=>$latestContent->getVersion(), 'approveid'=>$a['approveID']), array('class'=>'btn btn-mini'), getMLText("edit"), false, true)."</li>"; } } } print "</ul>"; print "</td>\n"; print "</tr>\n"; } } print "</table>\n"; $this->contentContainerEnd(); if($user->isAdmin() || $user->getId() == $document->getOwner()->getId()) { ?> <div class="row-fluid"> <?php /* Check for an existing review log, even if the workflowmode * is set to traditional_only_approval. There may be old documents * that still have a review log if the workflow mode has been * changed afterwards. */ if($latestContent->getReviewStatus(10) /*$workflowmode != 'traditional_only_approval'*/) { ?> <div class="span6"> <?php $this->printProtocol($latestContent, 'review'); ?> </div> <?php } ?> <div class="span6"> <?php $this->printProtocol($latestContent, 'approval'); ?> </div> </div> <?php } ?> </div> <?php } } else { if($workflow) { /* Check if user is involved in workflow */ $user_is_involved = false; foreach($transitions as $transition) { if($latestContent->triggerWorkflowTransitionIsAllowed($user, $transition)) { $user_is_involved = true; } } ?> <div class="tab-pane <?php if($currenttab == 'workflow') echo 'active'; ?>" id="workflow"> <?php echo "<div class=\"row-fluid\">"; if ($user_is_involved && $this->check_access('WorkflowGraph')) echo "<div class=\"span6\">"; else echo "<div class=\"span12\">"; $this->contentContainerStart(); if($user->isAdmin()) { if(SeedDMS_Core_DMS::checkIfEqual($workflow->getInitState(), $latestContent->getWorkflowState())) { print "<form action=\"../out/out.RemoveWorkflowFromDocument.php\" method=\"post\">".createHiddenFieldWithKey('removeworkflowfromdocument')."<input type=\"hidden\" name=\"documentid\" value=\"".$documentid."\" /><input type=\"hidden\" name=\"version\" value=\"".$latestContent->getVersion()."\" /><button type=\"submit\" class=\"btn\"><i class=\"icon-remove\"></i> ".getMLText('rm_workflow')."</button></form>"; } else { print "<form action=\"../out/out.RewindWorkflow.php\" method=\"post\">".createHiddenFieldWithKey('rewindworkflow')."<input type=\"hidden\" name=\"documentid\" value=\"".$documentid."\" /><input type=\"hidden\" name=\"version\" value=\"".$latestContent->getVersion()."\" /><button type=\"submit\" class=\"btn\"><i class=\"icon-refresh\"></i> ".getMLText('rewind_workflow')."</button></form>"; } } echo "<h4>".$workflow->getName()."</h4>"; if($parentworkflow = $latestContent->getParentWorkflow()) { echo "<p>Sub workflow of '".$parentworkflow->getName()."'</p>"; } echo "<h5>".getMLText('current_state').": ".$workflowstate->getName()."</h5>"; echo "<table class=\"table table-condensed\">\n"; echo "<tr>"; echo "<td>".getMLText('next_state').":</td>"; foreach($transitions as $transition) { $nextstate = $transition->getNextState(); $docstatus = $nextstate->getDocumentStatus(); echo "<td><i class=\"icon-circle".($docstatus == S_RELEASED ? " released" : ($docstatus == S_REJECTED ? " rejected" : " in-workflow"))."\"></i> ".$nextstate->getName()."</td>"; } echo "</tr>"; echo "<tr>"; echo "<td>".getMLText('action').":</td>"; foreach($transitions as $transition) { $action = $transition->getAction(); echo "<td>".getMLText('action_'.strtolower($action->getName()), array(), $action->getName())."</td>"; } echo "</tr>"; echo "<tr>"; echo "<td>".getMLText('users').":</td>"; foreach($transitions as $transition) { $transusers = $transition->getUsers(); echo "<td>"; foreach($transusers as $transuser) { $u = $transuser->getUser(); echo $u->getFullName(); if($document->getAccessMode($u) < M_READ) { echo " (no access)"; } echo "<br />"; } echo "</td>"; } echo "</tr>"; echo "<tr>"; echo "<td>".getMLText('groups').":</td>"; foreach($transitions as $transition) { $transgroups = $transition->getGroups(); echo "<td>"; foreach($transgroups as $transgroup) { $g = $transgroup->getGroup(); echo getMLText('at_least_n_users_of_group', array("number_of_users" => $transgroup->getNumOfUsers(), "group" => $g->getName())); if ($document->getGroupAccessMode($g) < M_READ) { echo " (no access)"; } echo "<br />"; } echo "</td>"; } echo "</tr>"; echo "<tr class=\"success\">"; echo "<td>".getMLText('users_done_work').":</td>"; foreach($transitions as $transition) { echo "<td>"; if($latestContent->executeWorkflowTransitionIsAllowed($transition)) { /* If this is reached, then the transition should have been executed * but for some reason the next state hasn't been reached. This can * be causes, if a transition which was previously already executed * is about to be executed again. E.g. there was already a transition * T1 from state S1 to S2 triggered by user U1. * Then there was a second transition T2 from * S2 back to S1. If the state S1 has been reached again, then * executeWorkflowTransitionIsAllowed() will think that T1 could be * executed because there is already a log entry saying, that U1 * has triggered the workflow. */ echo "Done "; } $wkflogs = $latestContent->getWorkflowLog($transition); foreach($wkflogs as $wkflog) { $loguser = $wkflog->getUser(); echo $loguser->getFullName()." ("; $names = array(); foreach($loguser->getGroups() as $loggroup) { $names[] = $loggroup->getName(); } echo implode(", ", $names); echo ") - "; echo $wkflog->getDate(); echo "<br />"; } echo "</td>"; } echo "</tr>"; echo "<tr>"; echo "<td></td>"; $allowedtransitions = array(); foreach($transitions as $transition) { echo "<td>"; if($latestContent->triggerWorkflowTransitionIsAllowed($user, $transition)) { $action = $transition->getAction(); print "<form action=\"../out/out.TriggerWorkflow.php\" method=\"post\">".createHiddenFieldWithKey('triggerworkflow')."<input type=\"hidden\" name=\"documentid\" value=\"".$documentid."\" /><input type=\"hidden\" name=\"version\" value=\"".$latestContent->getVersion()."\" /><input type=\"hidden\" name=\"transition\" value=\"".$transition->getID()."\" /><input type=\"submit\" class=\"btn\" value=\"".getMLText('action_'.strtolower($action->getName()), array(), $action->getName())."\" /></form>"; $allowedtransitions[] = $transition; } echo "</td>"; } echo "</tr>"; echo "</table>"; $workflows = $dms->getAllWorkflows(); if($workflows) { $subworkflows = array(); foreach($workflows as $wkf) { if($wkf->getInitState()->getID() == $workflowstate->getID()) { if($workflow->getID() != $wkf->getID()) { $subworkflows[] = $wkf; } } } if($subworkflows) { echo "<form action=\"../out/out.RunSubWorkflow.php\" method=\"post\">".createHiddenFieldWithKey('runsubworkflow')."<input type=\"hidden\" name=\"documentid\" value=\"".$documentid."\" /><input type=\"hidden\" name=\"version\" value=\"".$latestContent->getVersion()."\" />"; echo "<select name=\"subworkflow\">"; foreach($subworkflows as $subworkflow) { echo "<option value=\"".$subworkflow->getID()."\">".$subworkflow->getName()."</option>"; } echo "</select>"; echo "<label class=\"inline\">"; echo "<input type=\"submit\" class=\"btn\" value=\"".getMLText('run_subworkflow')."\" />"; echo "</lable>"; echo "</form>"; } } /* If in a sub workflow, the check if return the parent workflow * is possible. */ if($parentworkflow = $latestContent->getParentWorkflow()) { $states = $parentworkflow->getStates(); foreach($states as $state) { /* Check if the current workflow state is also a state in the * 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<br />"; /* 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 * the sub workflow shouldn't be entered in the first place, * but that is difficult to check. */ /* If the init state has not been left, return is always possible */ if($workflow->getInitState()->getID() == $latestContent->getWorkflowState()->getID()) { echo "Initial state of sub workflow has not been left. Return to parent workflow is possible<br />"; echo "<form action=\"../out/out.ReturnFromSubWorkflow.php\" method=\"post\">".createHiddenFieldWithKey('returnfromsubworkflow')."<input type=\"hidden\" name=\"documentid\" value=\"".$documentid."\" /><input type=\"hidden\" name=\"version\" value=\"".$latestContent->getVersion()."\" />"; echo "<input type=\"submit\" class=\"btn\" value=\"".getMLText('return_from_subworkflow')."\" />"; echo "</form>"; } else { /* Get a transition from the last state in the parent workflow * (which is the initial state of the sub workflow) into * current state. */ echo "Check for transition from ".$workflow->getInitState()->getName()." into ".$latestContent->getWorkflowState()->getName()." is possible in parentworkflow ".$parentworkflow->getID()."<br />"; $transitions = $parentworkflow->getTransitionsByStates($workflow->getInitState(), $latestContent->getWorkflowState()); if($transitions) { echo "Found transitions in workflow ".$parentworkflow->getID()."<br />"; foreach($transitions as $transition) { if($latestContent->triggerWorkflowTransitionIsAllowed($user, $transition)) { echo "Triggering transition is allowed<br />"; echo "<form action=\"../out/out.ReturnFromSubWorkflow.php\" method=\"post\">".createHiddenFieldWithKey('returnfromsubworkflow')."<input type=\"hidden\" name=\"documentid\" value=\"".$documentid."\" /><input type=\"hidden\" name=\"version\" value=\"".$latestContent->getVersion()."\" /><input type=\"hidden\" name=\"transition\" value=\"".$transition->getID()."\" />"; echo "<input type=\"submit\" class=\"btn\" value=\"".getMLText('return_from_subworkflow')."\" />"; echo "</form>"; } } } } } } } $this->contentContainerEnd(); echo "</div>"; if ($user_is_involved && $this->check_access('WorkflowGraph')) { echo "<div class=\"span6\">"; ?> <iframe src="out.WorkflowGraph.php?workflow=<?php echo $workflow->getID(); ?><?php if($allowedtransitions) foreach($allowedtransitions as $tr) {echo "&transitions[]=".$tr->getID();} ?>" width="99%" height="661" style="border: 1px solid #AAA;"></iframe> <?php echo "</div>"; } echo "</div>"; ?> </div> <?php } } if(is_array($receiptStatus) && count($receiptStatus)>0) { ?> <div class="tab-pane <?php if($currenttab == 'recipients') echo 'active'; ?>" id="recipients"> <?php $this->contentContainerStart(); print "<table class=\"table-condensed\">\n"; print "<tr><td colspan=5>\n"; $this->contentSubHeading(getMLText("recipients")); print "</tr>"; print "<tr>\n"; print "<td width='20%'><b>".getMLText("name")."</b></td>\n"; print "<td width='20%'><b>".getMLText("last_update")."</b></td>\n"; print "<td width='25%'><b>".getMLText("comment")."</b></td>"; print "<td width='15%'><b>".getMLText("status")."</b></td>\n"; print "<td width='20%'></td>\n"; print "</tr>\n"; $stat = array('-1'=>0, '0'=>0, '1'=>0, '-2'=>0); foreach ($receiptStatus as $r) { $required = null; $is_recipient = false; $stat[''.$r['status']]++; $accesserr = ''; switch ($r["type"]) { case 0: // Recipient is an individual. $required = $dms->getUser($r["required"]); if (!is_object($required)) { $reqName = getMLText("unknown_user")." '".$r["required"]."'"; } else { $reqName = "<i class=\"icon-user\"></i> ".htmlspecialchars($required->getFullName()." (".$required->getLogin().")"); if($user->isAdmin()) { if($document->getAccessMode($required) < M_READ || $latestContent->getAccessMode($required) < M_READ) $accesserr = getMLText("access_denied"); elseif(is_object($required) && $required->isDisabled()) $accesserr = getMLText("login_disabled_title"); } } if($r["required"] == $user->getId()/* && ($user->getId() != $owner->getId() || $enableownerreceipt == 1)*/) $is_recipient = true; break; case 1: // Recipient is a group. $required = $dms->getGroup($r["required"]); if (!is_object($required)) { $reqName = getMLText("unknown_group")." '".$r["required"]."'"; } else { $reqName = "<i class=\"icon-group\"></i> ".htmlspecialchars($required->getName()); if($user->isAdmin()) { $grpusers = $required->getUsers(); if(!$grpusers) $accesserr = getMLText("no_group_members"); } if($required->isMember($user)/* && ($user->getId() != $owner->getId() || $enableownerreceipt == 1)*/) $is_recipient = true; } break; } /* Do not list users that has been removed from the list of recipients * unless admin is logged in. */ if($user->isAdmin() || $r["status"] > -2) { print "<tr>\n"; print "<td>".$reqName."</td>\n"; print "<td><ul class=\"unstyled\"><li>".$r["date"]."</li>"; /* $updateUser is the user who has done the receipt */ $updateUser = $dms->getUser($r["userID"]); print "<li>".(is_object($updateUser) ? htmlspecialchars($updateUser->getFullName()." (".$updateUser->getLogin().")") : "unknown user id '".$r["userID"]."'")."</li></ul></td>"; print "<td>".htmlspecialchars($r["comment"])."</td>\n"; print "<td>".getReceiptStatusText($r["status"])."</td>\n"; print "<td><ul class=\"unstyled\">"; if($accesserr) echo "<li><span class=\"alert alert-error\">".$accesserr."</span></li>"; if($accessop->mayReceipt($document)) { if ($is_recipient) { if($r["status"]==0) { print "<li>".$this->html_link('ReceiptDocument', array('documentid'=>$documentid, 'version'=>$latestContent->getVersion(), 'receiptid'=>$r['receiptID']), array('class'=>'btn btn-mini'), getMLText("add_receipt"), false, true)."</li>"; } elseif ($accessop->mayUpdateReceipt($document, $updateUser) && (($r["status"]==1)||($r["status"]==-1))) { print "<li>".$this->html_link('ReceiptDocument', array('documentid'=>$documentid, 'version'=>$latestContent->getVersion(), 'receiptid'=>$r['receiptID']), array('class'=>'btn btn-mini'), getMLText("edit"), false, true)."</li>"; } } } print "</ul></td>\n"; print "</tr>\n"; } } ?> </table> <?php $this->contentContainerEnd(); if($user->isAdmin() || $user->getId() == $document->getOwner()->getId()) { /* Do not count entries '-2' as they are removed userѕ */ $totalreceipts = $stat['-1'] + $stat['0'] + $stat['1']; ?> <div class="row-fluid"> <div class="span12"> <div class="progress"> <div class="bar bar-success" style="width: <?php echo round($stat['1']/$totalreceipts*100); ?>%;"><?php echo ($stat['1'] ? $stat['1']."/".$totalreceipts : ''); ?></div> <!-- div class="bar bar-warning" style="width: <?php echo round($stat['0']/$totalreceipts*100); ?>%;"></div --> <div class="bar bar-danger" style="width: <?php echo round($stat['-1']/$totalreceipts*100); ?>%;"><?php echo ($stat['-1'] ? $stat['-1']."/".$totalreceipts : ''); ?></div> </div> </div> </div> <div class="row-fluid"> <div class="span12"> <?php $this->printProtocol($latestContent, 'receipt'); ?> </div> </div> <?php } ?> </div> <?php } if(is_array($revisionStatus) && count($revisionStatus)>0) { ?> <div class="tab-pane <?php if($currenttab == 'revision') echo 'active'; ?>" id="revision"> <?php if($status['status'] == S_RELEASED) { if($latestContent->getRevisionDate()) { ?> <div class="alert alert-warning"> <?php print getMLText('revise_document_on', array('date' => substr($latestContent->getRevisionDate(), 0, 10))); ?> </div> <?php } } /*elseif($status['status'] != S_IN_REVISION) { ?> <div class="alert alert-info"><?= getMLText('no_revision_planed') ?></div> <?php } */ $this->contentContainerStart(); print "<table class=\"table-condensed\">\n"; print "<tr><td colspan=5>\n"; $this->contentSubHeading(getMLText("revisors")); print "</tr>"; print "<tr>\n"; print "<td width='20%'><b>".getMLText("name")."</b></td>\n"; print "<td width='20%'><b>".getMLText("last_update")."</b></td>\n"; print "<td width='25%'><b>".getMLText("comment")."</b></td>"; print "<td width='15%'><b>".getMLText("status")."</b></td>\n"; print "<td width='20%'></td>\n"; print "</tr>\n"; foreach ($revisionStatus as $r) { $required = null; $is_recipient = false; $accesserr = ''; switch ($r["type"]) { case 0: // Reviewer is an individual. $required = $dms->getUser($r["required"]); if (!is_object($required)) { $reqName = getMLText("unknown_user")." '".$r["required"]."'"; } else { $reqName = "<i class=\"icon-user\"></i> ".htmlspecialchars($required->getFullName()." (".$required->getLogin().")"); if($user->isAdmin()) { if($document->getAccessMode($required) < M_READ || $latestContent->getAccessMode($required) < M_READ) $accesserr = getMLText("access_denied"); elseif(is_object($required) && $required->isDisabled()) $accesserr = getMLText("login_disabled_title"); } } if($r["required"] == $user->getId()/* && ($user->getId() != $owner->getId() || $enableownerrevapp == 1)*/) $is_recipient = true; break; case 1: // Reviewer is a group. $required = $dms->getGroup($r["required"]); if (!is_object($required)) { $reqName = getMLText("unknown_group")." '".$r["required"]."'"; } else { $reqName = "<i class=\"icon-user\"></i> ".htmlspecialchars($required->getName()); if($required->isMember($user)/* && ($user->getId() != $owner->getId() || $enableownerrevapp == 1)*/) $is_recipient = true; } break; } print "<tr>\n"; print "<td>".$reqName."</td>\n"; print "<td><ul class=\"unstyled\"><li>".$r["date"]."</li>"; /* $updateUser is the user who has done the revision */ $updateUser = $dms->getUser($r["userID"]); print "<li>".(is_object($updateUser) ? htmlspecialchars($updateUser->getFullName()." (".$updateUser->getLogin().")") : "unknown user id '".$r["userID"]."'")."</li></ul></td>"; print "<td>".htmlspecialchars($r["comment"])."</td>\n"; print "<td>".getRevisionStatusText($r["status"])."</td>\n"; print "<td><ul class=\"unstyled\">"; if($accesserr) echo "<li><span class=\"alert alert-error\">".$accesserr."</span></li>"; if($accessop->mayRevise($document)) { if ($is_recipient && $r["status"]==0) { print "<li>".$this->html_link('ReviseDocument', array('documentid'=>$documentid, 'version'=>$latestContent->getVersion(), 'revisionid'=>$r['revisionID']), array('class'=>'btn btn-mini'), getMLText("add_revision"), false, true)."</li>"; } elseif (($updateUser==$user)&&(($r["status"]==1)||($r["status"]==-1))&&(!$document->hasExpired())){ print "<li>".$this->html_link('ReviseDocument', array('documentid'=>$documentid, 'version'=>$latestContent->getVersion(), 'revisionid'=>$r['revisionID']), array('class'=>'btn btn-mini'), getMLText("edit"), false, true)."</li>"; } } print "</ul></td>\n"; print "</tr>\n"; } ?> </table> <?php $this->contentContainerEnd(); if($user->isAdmin() || $user->getId() == $document->getOwner()->getId()) { ?> <div class="row-fluid"> <div class="span12"> <?php $this->printProtocol($latestContent, 'revision'); ?> </div> </div> <?php } ?> </div> <?php } if (count($versions)>1) { ?> <div class="tab-pane <?php if($currenttab == 'previous') echo 'active'; ?>" id="previous"> <?php $this->contentContainerStart(); print "<table class=\"table\">"; print "<thead>\n<tr>\n"; print "<th colspan=\"2\"></th>\n"; print "<th width='20%'>".getMLText("status")."</th>\n"; print "<th width='25%'></th>\n"; print "</tr>\n</thead>\n<tbody>\n"; for ($i = count($versions)-2; $i >= 0; $i--) { $version = $versions[$i]; $vstat = $version->getStatus(); $workflow = $version->getWorkflow(); $workflowstate = $version->getWorkflowState(); // verify if file exists $file_exists=file_exists($dms->contentDir . $version->getPath()); print "<tr>\n"; print "<td style=\"width:".$previewwidthdetail."px; text-align: center;\">"; if($file_exists) { if ($viewonlinefiletypes && in_array(strtolower($version->getFileType()), $viewonlinefiletypes)) { if($accessop->check_controller_access('ViewOnline', array('action'=>'run'))) { print "<a target=\"_blank\" href=\"../op/op.ViewOnline.php?documentid=".$documentid."&version=".$version->getVersion()."\">"; } } else { if($accessop->check_controller_access('Download', array('action'=>'version'))) { print "<a href=\"../op/op.Download.php?documentid=".$documentid."&version=".$version->getVersion()."\">"; } } } $previewer->createPreview($version); if($previewer->hasPreview($version)) { print("<img class=\"mimeicon\" width=\"".$previewwidthdetail."\" src=\"../op/op.Preview.php?documentid=".$document->getID()."&version=".$version->getVersion()."&width=".$previewwidthdetail."\" title=\"".htmlspecialchars($version->getMimeType())."\">"); } else { print "<img class=\"mimeicon\" width=\"".$previewwidthdetail."\" src=\"".$this->getMimeIcon($version->getFileType())."\" title=\"".htmlspecialchars($version->getMimeType())."\">"; } if($file_exists) { if($accessop->check_controller_access('Download', array('action'=>'run')) || $accessop->check_controller_access('ViewOnline', array('action'=>'run'))) print "</a>\n"; } print "</td>\n"; print "<td><ul class=\"unstyled\">\n"; print "<li>".htmlspecialchars($version->getOriginalFileName())."</li>\n"; print "<li>".getMLText('version').": ".$version->getVersion()."</li>\n"; if ($file_exists) print "<li>". SeedDMS_Core_File::format_filesize($version->getFileSize()) .", ".htmlspecialchars($version->getMimeType())."</li>"; else print "<li><span class=\"warning\">".getMLText("document_deleted")."</span></li>"; $updatingUser = $version->getUser(); print "<li>".getMLText("uploaded_by")." <a href=\"mailto:".$updatingUser->getEmail()."\">".htmlspecialchars($updatingUser->getFullName())."</a></li>"; print "<li>".getLongReadableDate($version->getDate())."</li>"; print "</ul>\n"; if($version->getComment()) print "<p style=\"font-style: italic;\">".htmlspecialchars($version->getComment())."</p>"; print "<ul class=\"actions unstyled\">\n"; $attributes = $version->getAttributes(); if($attributes) { foreach($attributes as $attribute) { $arr = $this->callHook('showDocumentContentAttribute', $version, $attribute); if(is_array($arr)) { print "<li>".$arr[0].": ".$arr[1]."</li>\n"; } else { $attrdef = $attribute->getAttributeDefinition(); print "<li>".htmlspecialchars($attrdef->getName()).": ".htmlspecialchars(implode(', ', $attribute->getValueAsArray()))."</li>\n"; } } } print "</ul></td>\n"; // print "<td>".htmlspecialchars($version->getComment())."</td>"; print "<td>".getOverallStatusText($vstat["status"])."</td>"; print "<td>"; print "<ul class=\"actions unstyled\">"; if ($file_exists){ if($accessop->check_controller_access('Download', array('action'=>'version'))) { print "<li><a href=\"../op/op.Download.php?documentid=".$documentid."&version=".$version->getVersion()."\"><i class=\"icon-download\"></i>".getMLText("download")."</a>"; } if ($viewonlinefiletypes && in_array(strtolower($version->getFileType()), $viewonlinefiletypes)) if($accessop->check_controller_access('ViewOnline', array('action'=>'run'))) { print "<li><a target=\"_blank\" href=\"../op/op.ViewOnline.php?documentid=".$documentid."&version=".$version->getVersion()."\"><i class=\"icon-star\"></i>" . getMLText("view_online") . "</a>"; } print "</ul>"; print "<ul class=\"actions unstyled\">"; } /* Only admin has the right to remove version in any case or a regular * user if enableVersionDeletion is on */ if($accessop->mayRemoveVersion($document)) { print "<li>".$this->html_link('RemoveVersion', array('documentid'=>$documentid, 'version'=>$version->getVersion()), array(), "<i class=\"icon-remove\"></i>".getMLText("rm_version"), false, true)."</li>"; } if($this->check_access('AddToTransmittal')) print "<li>".$this->html_link('AddToTransmittal', array('documentid'=>$documentid, 'version'=>$version->getVersion()), array(), "<i class=\"icon-list\"></i>".getMLText("add_to_transmittal"), false, true)."</li>"; if($accessop->mayEditComment($document)) { print "<li>".$this->html_link('EditComment', array('documentid'=>$documentid, 'version'=>$version->getVersion()), array(), "<i class=\"icon-comment\"></i>".getMLText("edit_comment"), false, true)."</li>"; } if($accessop->mayEditAttributes($document)) { print "<li>".$this->html_link('EditAttributes', array('documentid'=>$documentid, 'version'=>$version->getVersion()), array(), "<i class=\"icon-edit\"></i>".getMLText("edit_attributes"), false, true)."</li>"; } print "<li>".$this->html_link('DocumentVersionDetail', array('documentid'=>$documentid, 'version'=>$version->getVersion()), array(), "<i class=\"icon-info-sign\"></i>".getMLText("details"), false, true)."</li>"; $items = $this->callHook('extraVersionActions', $version); if($items) { foreach($items as $item) { echo "<li>".$item."</li>"; } } print "</ul>"; print "</td>\n</tr>\n"; } print "</tbody>\n</table>\n"; $this->contentContainerEnd(); ?> </div> <?php } ?> <div class="tab-pane <?php if($currenttab == 'attachments') echo 'active'; ?>" id="attachments"> <?php $this->contentContainerStart(); if (count($files) > 0) { print "<table class=\"table\">"; print "<thead>\n<tr>\n"; print "<th width='20%'></th>\n"; print "<th width='20%'>".getMLText("file")."</th>\n"; print "<th width='40%'>".getMLText("comment")."</th>\n"; print "<th width='20%'></th>\n"; print "</tr>\n</thead>\n<tbody>\n"; foreach($files as $file) { $file_exists=file_exists($dms->contentDir . $file->getPath()); $responsibleUser = $file->getUser(); print "<tr>"; print "<td>"; $previewer->createPreview($file, $previewwidthdetail); if($file_exists) { if ($viewonlinefiletypes && in_array(strtolower($file->getFileType()), $viewonlinefiletypes)) { if($accessop->check_controller_access('ViewOnline', array('action'=>'run'))) { print "<a target=\"_blank\" href=\"../op/op.ViewOnline.php?documentid=".$documentid."&file=". $file->getID()."\">"; } } else { if($accessop->check_controller_access('Download', array('action'=>'file'))) { print "<a href=\"../op/op.Download.php?documentid=".$documentid."&file=".$file->getID()."\">"; } } } if($previewer->hasPreview($file)) { print("<img class=\"mimeicon\" width=\"".$previewwidthdetail."\" src=\"../op/op.Preview.php?documentid=".$document->getID()."&file=".$file->getID()."&width=".$previewwidthdetail."\" title=\"".htmlspecialchars($file->getMimeType())."\">"); } else { print "<img class=\"mimeicon\" width=\"".$previewwidthdetail."\" src=\"".$this->getMimeIcon($file->getFileType())."\" title=\"".htmlspecialchars($file->getMimeType())."\">"; } if($file_exists) { if($accessop->check_controller_access('Download', array('action'=>'run')) || $accessop->check_controller_access('ViewOnline', array('action'=>'run'))) print "</a>"; } print "</td>"; print "<td><ul class=\"unstyled\">\n"; print "<li>".htmlspecialchars($file->getName())."</li>\n"; if($file->getName() != $file->getOriginalFileName()) print "<li>".htmlspecialchars($file->getOriginalFileName())."</li>\n"; if ($file_exists) print "<li>".SeedDMS_Core_File::format_filesize(filesize($dms->contentDir . $file->getPath())) ." bytes, ".htmlspecialchars($file->getMimeType())."</li>"; else print "<li>".htmlspecialchars($file->getMimeType())." - <span class=\"warning\">".getMLText("document_deleted")."</span></li>"; print "<li>".getMLText("uploaded_by")." <a href=\"mailto:".$responsibleUser->getEmail()."\">".htmlspecialchars($responsibleUser->getFullName())."</a></li>"; print "<li>".getLongReadableDate($file->getDate())."</li>"; if($file->getVersion()) print "<li>".getMLText('linked_to_current_version')."</li>"; else print "<li>".getMLText('linked_to_document')."</li>"; print "</ul></td>"; print "<td>".htmlspecialchars($file->getComment())."</td>"; print "<td><ul class=\"unstyled actions\">"; if ($file_exists) { if($accessop->check_controller_access('Download', array('action'=>'file'))) { print "<li><a href=\"../op/op.Download.php?documentid=".$documentid."&file=".$file->getID()."\"><i class=\"icon-download\"></i>".getMLText('download')."</a></li>"; } if ($viewonlinefiletypes && in_array(strtolower($file->getFileType()), $viewonlinefiletypes)) { if($accessop->check_controller_access('ViewOnline', array('action'=>'run'))) { print "<li><a target=\"_blank\" href=\"../op/op.ViewOnline.php?documentid=".$documentid."&file=". $file->getID()."\"><i class=\"icon-star\"></i>" . getMLText("view_online") . "</a></li>"; } } } else print "<li><img class=\"mimeicon\" src=\"images/icons/".$this->getMimeIcon($file->getFileType())."\" title=\"".htmlspecialchars($file->getMimeType())."\">"; echo "</ul><ul class=\"unstyled actions\">"; if (($document->getAccessMode($user) == M_ALL)||($file->getUserID()==$user->getID())) print "<li><a href=\"out.RemoveDocumentFile.php?documentid=".$documentid."&fileid=".$file->getID()."\"><i class=\"icon-remove\"></i>".getMLText("delete")."</a></li>"; print "</ul></td>"; print "</tr>"; } print "</tbody>\n</table>\n"; } else printMLText("no_attached_files"); if($this->check_access('AddFile')) { if ($document->getAccessMode($user) >= M_READWRITE){ print "<ul class=\"unstyled\"><li>".$this->html_link('AddFile', array('documentid'=>$documentid), array('class'=>'btn'), getMLText("add"), false, true)."</li></ul>\n"; } } $this->contentContainerEnd(); ?> </div> <div class="tab-pane <?php if($currenttab == 'links') echo 'active'; ?>" id="links"> <?php $this->contentContainerStart(); if (count($links) > 0) { print "<table class=\"table table-condensed\">"; print "<thead>\n<tr>\n"; print "<th></th>\n"; print "<th></th>\n"; print "<th>".getMLText("comment")."</th>\n"; print "<th></th>\n"; print "<th></th>\n"; print "</tr>\n</thead>\n<tbody>\n"; foreach($links as $link) { $responsibleUser = $link->getUser(); $targetDoc = $link->getTarget(); $targetlc = $targetDoc->getLatestContent(); $previewer->createPreview($targetlc, $previewwidthdetail); echo "<tr id=\"table-row-transmittalitem-".$link->getID()."\">"; echo $this->documentListRow($targetDoc, $previewer, true); print "<td><small>".getMLText("document_link_by")." ".htmlspecialchars($responsibleUser->getFullName()); if (($user->getID() == $responsibleUser->getID()) || ($document->getAccessMode($user) == M_ALL )) { print "<br />".getMLText("document_link_public").": ".(($link->isPublic()) ? getMLText("yes") : getMLText("no")); print "<form action=\"../op/op.RemoveDocumentLink.php\" method=\"post\">".createHiddenFieldWithKey('removedocumentlink')."<input type=\"hidden\" name=\"documentid\" value=\"".$documentid."\" /><input type=\"hidden\" name=\"linkid\" value=\"".$link->getID()."\" /><button type=\"submit\" class=\"btn btn-mini\"><i class=\"icon-remove\"></i> ".getMLText("delete")."</button></form>"; } print "</small></td>"; echo "</tr>"; if(0){ print "<tr>"; print "<td style=\"width:".$previewwidthdetail."px; text-align: center;\">"; if($accessop->check_controller_access('Download', array('action'=>'version'))) print "<a href=\"../op/op.Download.php?documentid=".$targetDoc->getID()."&version=".$targetlc->getVersion()."\">"; if($previewer->hasPreview($targetlc)) { print "<img class=\"mimeicon\" width=\"".$previewwidthlist."\" src=\"../op/op.Preview.php?documentid=".$targetDoc->getID()."&version=".$targetlc->getVersion()."&width=".$previewwidthlist."\" title=\"".htmlspecialchars($targetlc->getMimeType())."\">"; } else { print "<img class=\"mimeicon\" width=\"".$previewwidthlist."\" src=\"".$this->getMimeIcon($targetlc->getFileType())."\" title=\"".htmlspecialchars($targetlc->getMimeType())."\">"; } if($accessop->check_controller_access('Download', array('action'=>'run'))) print "</a>"; print "</td>"; print "<td><a href=\"out.ViewDocument.php?documentid=".$targetDoc->getID()."\" class=\"linklist\">".htmlspecialchars($targetDoc->getName())."</a></td>"; print "<td>".htmlspecialchars($targetDoc->getComment())."</td>"; print "<td>".getMLText("document_link_by")." ".htmlspecialchars($responsibleUser->getFullName()); if (($user->getID() == $responsibleUser->getID()) || ($document->getAccessMode($user) == M_ALL )) print "<br />".getMLText("document_link_public").": ".(($link->isPublic()) ? getMLText("yes") : getMLText("no")); print "</td>"; print "<td><span class=\"actions\">"; if (($user->getID() == $responsibleUser->getID()) || ($document->getAccessMode($user) == M_ALL )) print "<form action=\"../op/op.RemoveDocumentLink.php\" method=\"post\">".createHiddenFieldWithKey('removedocumentlink')."<input type=\"hidden\" name=\"documentid\" value=\"".$documentid."\" /><input type=\"hidden\" name=\"linkid\" value=\"".$link->getID()."\" /><button type=\"submit\" class=\"btn btn-mini\"><i class=\"icon-remove\"></i> ".getMLText("delete")."</button></form>"; print "</span></td>"; print "</tr>"; } } print "</tbody>\n</table>\n"; } else printMLText("no_linked_files"); if (!$user->isGuest()){ ?> <br> <form action="../op/op.AddDocumentLink.php" name="form1"> <input type="hidden" name="documentid" value="<?php print $documentid;?>"> <table class="table-condensed"> <tr> <td><?php printMLText("add_document_link");?>:</td> <td><?php $this->printDocumentChooserHtml("form1");?></td> </tr> <?php if ($document->getAccessMode($user) >= M_READWRITE) { print "<tr><td>".getMLText("document_link_public")."</td>"; print "<td>"; print "<input type=\"checkbox\" name=\"public\" value=\"true\" checked />"; print "</td></tr>"; } ?> <tr> <td></td> <td><button type="submit" class="btn"><i class="icon-save"></i> <?php printMLText("save")?></button></td> </tr> </table> </form> <?php } $this->contentContainerEnd(); if (count($reverselinks) > 0) { $this->contentHeading(getMLText("reverse_links")); $this->contentContainerStart(); print "<table class=\"table table-condensed\">"; print "<thead>\n<tr>\n"; print "<th></th>\n"; print "<th></th>\n"; print "<th>".getMLText("comment")."</th>\n"; print "<th></th>\n"; print "<th></th>\n"; print "</tr>\n</thead>\n<tbody>\n"; foreach($reverselinks as $link) { $responsibleUser = $link->getUser(); $sourceDoc = $link->getDocument(); /* Check if latest content is accessible. Could be that even if the document * is accessible, the document content isn't because of its status */ if($sourcelc = $sourceDoc->getLatestContent()) { $previewer->createPreview($sourcelc, $previewwidthdetail); print "<tr>"; print "<td style=\"width:".$previewwidthdetail."px; text-align: center;\">"; if($accessop->check_controller_access('Download', array('action'=>'version'))) print "<a href=\"../op/op.Download.php?documentid=".$sourceDoc->getID()."&version=".$sourcelc->getVersion()."\">"; if($previewer->hasPreview($sourcelc)) { print "<img class=\"mimeicon\" width=\"".$previewwidthlist."\" src=\"../op/op.Preview.php?documentid=".$sourceDoc->getID()."&version=".$sourcelc->getVersion()."&width=".$previewwidthlist."\" title=\"".htmlspecialchars($sourcelc->getMimeType())."\">"; } else { print "<img class=\"mimeicon\" width=\"".$previewwidthlist."\" src=\"".$this->getMimeIcon($sourcelc->getFileType())."\" title=\"".htmlspecialchars($sourcelc->getMimeType())."\">"; } if($accessop->check_controller_access('Download', array('action'=>'run'))) print "</a>"; print "</td>"; print "<td><a href=\"out.ViewDocument.php?documentid=".$sourceDoc->getID()."\" class=\"linklist\">".htmlspecialchars($sourceDoc->getName())."</a></td>"; print "<td>".htmlspecialchars($sourceDoc->getComment())."</td>"; print "<td>".getMLText("document_link_by")." ".htmlspecialchars($responsibleUser->getFullName()); if (($user->getID() == $responsibleUser->getID()) || ($document->getAccessMode($user) == M_ALL )) print "<br />".getMLText("document_link_public").": ".(($link->isPublic()) ? getMLText("yes") : getMLText("no")); print "</td>"; print "<td><span class=\"actions\">"; if (($user->getID() == $responsibleUser->getID()) || ($document->getAccessMode($user) == M_ALL )) print "<form action=\"../op/op.RemoveDocumentLink.php\" method=\"post\">".createHiddenFieldWithKey('removedocumentlink')."<input type=\"hidden\" name=\"documentid\" value=\"".$documentid."\" /><input type=\"hidden\" name=\"linkid\" value=\"".$link->getID()."\" /><button type=\"submit\" class=\"btn btn-mini\"><i class=\"icon-remove\"></i> ".getMLText("delete")."</button></form>"; print "</span></td>"; print "</tr>"; } } print "</tbody>\n</table>\n"; $this->contentContainerEnd(); } ?> </div> </div> <?php if($user->isAdmin()) { $timeline = $document->getTimeline(); if($timeline) { $this->contentHeading(getMLText("timeline")); foreach($timeline as &$item) { switch($item['type']) { case 'add_version': $msg = getMLText('timeline_'.$item['type'], array('document'=>$item['document']->getName(), 'version'=> $item['version'])); break; case 'add_file': $msg = getMLText('timeline_'.$item['type'], array('document'=>$item['document']->getName())); break; case 'status_change': $msg = getMLText('timeline_'.$item['type'], array('document'=>$item['document']->getName(), 'version'=> $item['version'], 'status'=> getOverallStatusText($item['status']))); break; default: $msg = $this->callHook('getTimelineMsg', $document, $item); if(!is_string($msg)) $msg = '???'; } $item['msg'] = $msg; } // $this->printTimeline('out.ViewDocument.php?action=timelinedata&documentid='.$document->getID(), 300, '', date('Y-m-d')); $this->printTimelineHtml(300); } } ?> </div> </div> <?php $this->contentEnd(); $this->htmlEndPage(); } /* }}} */ } ?>