theme = $theme;
$this->params = $params;
$this->imgpath = '../views/'.$theme.'/images/';
$this->extraheader = array('js'=>'', 'css'=>'');
$this->footerjs = array();
}
/**
* Add javascript to an internal array which is output at the
* end of the page within a document.ready() function.
*
* @param string $script javascript to be added
*/
function addFooterJS($script) { /* {{{ */
$this->footerjs[] = $script;
} /* }}} */
function htmlStartPage($title="", $bodyClass="", $base="") { /* {{{ */
if(1 || method_exists($this, 'js')) {
/* We still need unsafe-eval, because printDocumentChooserHtml and
* printFolderChooserHtml will include a javascript file with ajax
* which is evaled by jquery
* X-WebKit-CSP is deprecated, Chrome understands Content-Security-Policy
* since version 25+
* X-Content-Security-Policy is deprecated, Firefox understands
* Content-Security-Policy since version 23+
*/
$csp_rules = "script-src 'self' 'unsafe-eval';"; // style-src 'self';";
foreach (array("X-WebKit-CSP", "X-Content-Security-Policy", "Content-Security-Policy") as $csp) {
header($csp . ": " . $csp_rules);
}
}
$hookObjs = $this->getHookObjects('SeedDMS_View_Bootstrap');
foreach($hookObjs as $hookObj) {
if (method_exists($hookObj, 'startPage')) {
$hookObj->startPage($this);
}
}
echo "\n";
echo "\n
\n";
} /* }}} */
/**
* Returns the html needed for the clipboard list in the menu
*
* This function renders the clipboard in a way suitable to be
* used as a menu
*
* @param array $clipboard clipboard containing two arrays for both
* documents and folders.
* @return string html code
*/
function menuClipboard($clipboard) { /* {{{ */
if ($this->params['user']->isGuest() || (count($clipboard['docs']) + count($clipboard['folders'])) == 0) {
return '';
}
$content = '';
$content .= "
\n";
return $content;
} /* }}} */
/**
* Returns the html needed for the clipboard list in the menu
*
* This function renders the clipboard in a way suitable to be
* used as a menu
*
* @param array $clipboard clipboard containing two arrays for both
* documents and folders.
* @return string html code
*/
function menuTasks($tasks) { /* {{{ */
$dms = $this->params['dms'];
$content = '';
// $content .= "
\n";
return;
} /* }}} */
function pageList($pageNumber, $totalPages, $baseURI, $params) { /* {{{ */
$maxpages = 25; // skip pages when more than this is shown
$range = 5; // pages left and right of current page
if (!is_numeric($pageNumber) || !is_numeric($totalPages) || $totalPages<2) {
return;
}
// Construct the basic URI based on the $_GET array. One could use a
// regular expression to strip out the pg (page number) variable to
// achieve the same effect. This seems to be less haphazard though...
$resultsURI = $baseURI;
$first=true;
foreach ($params as $key=>$value) {
// Don't include the page number in the basic URI. This is added in
// during the list display loop.
if (!strcasecmp($key, "pg")) {
continue;
}
if (is_array($value)) {
foreach ($value as $subkey=>$subvalue) {
$resultsURI .= ($first ? "?" : "&").$key."%5B".$subkey."%5D=".$subvalue;
$first = false;
}
}
else {
$resultsURI .= ($first ? "?" : "&").$key."=".$value;
}
$first = false;
}
echo "
";
$doccount++;
}
}
}
}
/* $foldercount or $doccount will only count objects which are
* actually available
*/
if($foldercount || $doccount) {
$content = "
".$content;
$content .= "
";
} else {
}
$content .= "
".getMLText("drag_icon_here")."
";
return $content;
} /* }}} */
/**
* Print clipboard in div container
*
* @param array clipboard
*/
function printClipboard($clipboard, $previewer){ /* {{{ */
$this->contentHeading(getMLText("clipboard"), true);
echo "
\n";
?>
\n";
} /* }}} */
/**
* Print button with link for deleting a document
*
* This button is used in document listings (e.g. on the ViewFolder page)
* for deleting a document. In seeddms version < 4.3.9 this was just a
* link to the out/out.RemoveDocument.php page which asks for confirmation
* an than calls op/op.RemoveDocument.php. Starting with version 4.3.9
* the button just opens a small popup asking for confirmation and than
* calls the ajax command 'deletedocument'. The ajax call is called
* in the click function of 'button.removedocument'. That button needs
* to have two attributes: 'rel' for the id of the document, and 'msg'
* for the message shown by notify if the document could be deleted.
*
* @param object $document document to be deleted
* @param string $msg message shown in case of successful deletion
* @param boolean $return return html instead of printing it
* @return string html content if $return is true, otherwise an empty string
*/
function printDeleteDocumentButton($document, $msg, $return=false){ /* {{{ */
$docid = $document->getID();
$content = '';
$content .= ' $document->getName())), ENT_QUOTES).'">';
if($return)
return $content;
else
echo $content;
return '';
} /* }}} */
function printDeleteDocumentButtonJs(){ /* {{{ */
echo "
$(document).ready(function () {
// $('.delete-document-btn').click(function(ev) {
$('body').on('click', 'a.delete-document-btn', function(ev){
id = $(ev.currentTarget).attr('rel');
confirmmsg = $(ev.currentTarget).attr('confirmmsg');
msg = $(ev.currentTarget).attr('msg');
formtoken = '".createFormKey('removedocument')."';
bootbox.dialog(confirmmsg, [{
\"label\" : \" ".getMLText("rm_document")."\",
\"class\" : \"btn-danger\",
\"callback\": function() {
$.get('../op/op.Ajax.php',
{ command: 'deletedocument', id: id, formtoken: formtoken },
function(data) {
if(data.success) {
$('#table-row-document-'+id).hide('slow');
noty({
text: msg,
type: 'success',
dismissQueue: true,
layout: 'topRight',
theme: 'defaultTheme',
timeout: 1500,
});
} else {
noty({
text: data.message,
type: 'error',
dismissQueue: true,
layout: 'topRight',
theme: 'defaultTheme',
timeout: 3500,
});
}
},
'json'
);
}
}, {
\"label\" : \"".getMLText("cancel")."\",
\"class\" : \"btn-cancel\",
\"callback\": function() {
}
}]);
});
});
";
} /* }}} */
/**
* Print button with link for deleting a folder
*
* This button works like document delete button
* {@link SeedDMS_Bootstrap_Style::printDeleteDocumentButton()}
*
* @param object $folder folder to be deleted
* @param string $msg message shown in case of successful deletion
* @param boolean $return return html instead of printing it
* @return string html content if $return is true, otherwise an empty string
*/
function printDeleteFolderButton($folder, $msg, $return=false){ /* {{{ */
$folderid = $folder->getID();
$content = '';
$content .= ' $folder->getName())), ENT_QUOTES).'">';
if($return)
return $content;
else
echo $content;
return '';
} /* }}} */
function printDeleteFolderButtonJs(){ /* {{{ */
echo "
$(document).ready(function () {
// $('.delete-folder-btn').click(function(ev) {
$('body').on('click', 'a.delete-folder-btn', function(ev){
id = $(ev.currentTarget).attr('rel');
confirmmsg = $(ev.currentTarget).attr('confirmmsg');
msg = $(ev.currentTarget).attr('msg');
formtoken = '".createFormKey('removefolder')."';
bootbox.dialog(confirmmsg, [{
\"label\" : \" ".getMLText("rm_folder")."\",
\"class\" : \"btn-danger\",
\"callback\": function() {
$.get('../op/op.Ajax.php',
{ command: 'deletefolder', id: id, formtoken: formtoken },
function(data) {
if(data.success) {
$('#table-row-folder-'+id).hide('slow');
noty({
text: msg,
type: 'success',
dismissQueue: true,
layout: 'topRight',
theme: 'defaultTheme',
timeout: 1500,
});
} else {
noty({
text: data.message,
type: 'error',
dismissQueue: true,
layout: 'topRight',
theme: 'defaultTheme',
timeout: 3500,
});
}
},
'json'
);
}
}, {
\"label\" : \"".getMLText("cancel")."\",
\"class\" : \"btn-cancel\",
\"callback\": function() {
}
}]);
});
});
";
} /* }}} */
function printLockButton($document, $msglock, $msgunlock, $return=false) { /* {{{ */
$docid = $document->getID();
if($document->isLocked()) {
$icon = 'unlock';
$msg = $msgunlock;
$title = 'unlock_document';
} else {
$icon = 'lock';
$msg = $msglock;
$title = 'lock_document';
}
$content = '';
$content .= '';
if($return)
return $content;
else
echo $content;
return '';
} /* }}} */
/**
* Output left-arrow with link which takes over a number of ids into
* a select box.
*
* Clicking in the button will preset the comma seperated list of ids
* in data-ref as options in the select box with name $name
*
* @param string $name id of select box
* @param array $ids list of option values
*/
function printSelectPresetButtonHtml($name, $ids) { /* {{{ */
?>
" data-ref="" data-ids="">
$(document).ready( function() {
$('.selectpreset_btn').click(function(ev){
ev.preventDefault();
if (typeof $(ev.currentTarget).data('ids') != 'undefined') {
target = $(ev.currentTarget).data('ref');
// Use attr() instead of data() because data() converts to int which cannot be split
items = $(ev.currentTarget).attr('data-ids');
arr = items.split(",");
for(var i in arr) {
$("#"+target+" option[value='"+arr[i]+"']").attr("selected", "selected");
}
// $("#"+target).trigger("chosen:updated");
$("#"+target).trigger("change");
}
});
});
" data-ref="" data-text="">
$(document).ready( function() {
$('.inputpreset_btn').click(function(ev){
ev.preventDefault();
if (typeof $(ev.currentTarget).data('text') != 'undefined') {
target = $(ev.currentTarget).data('ref');
value = $(ev.currentTarget).data('text');
sep = $(ev.currentTarget).data('sep');
if(sep) {
// Use attr() instead of data() because data() converts to int which cannot be split
arr = value.split(sep);
for(var i in arr) {
$("#"+target+" option[value='"+arr[i]+"']").attr("selected", "selected");
}
} else {
$("#"+target).val(value);
}
}
});
});
" data-ref="" data-text="">
$(document).ready( function() {
$('.checkboxpreset_btn').click(function(ev){
ev.preventDefault();
if (typeof $(ev.currentTarget).data('text') != 'undefined') {
target = $(ev.currentTarget).data('ref');
value = $(ev.currentTarget).data('text');
if(value) {
$("#"+target).attr('checked', '');
} else {
$("#"+target).removeAttribute('checked');
}
}
});
});
params['dms'];
$user = $this->params['user'];
$showtree = $this->params['showtree'];
$workflowmode = $this->params['workflowmode'];
$previewwidth = $this->params['previewWidthList'];
$enableClipboard = $this->params['enableclipboard'];
$accessop = $this->params['accessobject'];
$content = '';
$owner = $document->getOwner();
$comment = $document->getComment();
if (strlen($comment) > 150) $comment = substr($comment, 0, 147) . "...";
$docID = $document->getID();
if(!$skipcont)
$content .= "
";
if($enableRecursiveCount) {
if($user->isAdmin()) {
/* No need to check for access rights in countChildren() for
* admin. So pass 0 as the limit.
*/
$cc = $subFolder->countChildren($user, 0);
$content .= $cc['folder_count']." ".getMLText("folders")." ".$cc['document_count']." ".getMLText("documents");
} else {
$cc = $subFolder->countChildren($user, $maxRecursiveCount);
if($maxRecursiveCount > 5000)
$rr = 100.0;
else
$rr = 10.0;
$content .= (!$cc['folder_precise'] ? '~'.(round($cc['folder_count']/$rr)*$rr) : $cc['folder_count'])." ".getMLText("folders")." ".(!$cc['document_precise'] ? '~'.(round($cc['document_count']/$rr)*$rr) : $cc['document_count'])." ".getMLText("documents");
}
} else {
/* FIXME: the following is very inefficient for just getting the number of
* subfolders and documents. Making it more efficient is difficult, because
* the access rights need to be checked.
*/
$subsub = $subFolder->getSubFolders();
$subsub = SeedDMS_Core_DMS::filterAccess($subsub, $user, M_READ);
$subdoc = $subFolder->getDocuments();
$subdoc = SeedDMS_Core_DMS::filterAccess($subdoc, $user, M_READ);
$content .= count($subsub)." ".getMLText("folders")." ".count($subdoc)." ".getMLText("documents");
}
$content .= "
\n";
return $content;
} /* }}} */
/**
* Output HTML Code for jumploader
*
* @param string $uploadurl URL where post data is send
* @param integer $folderid id of folder where document is saved
* @param integer $maxfiles maximum number of files allowed to upload
* @param array $fields list of post fields
*/
function printUploadApplet($uploadurl, $attributes, $maxfiles=0, $fields=array()){ /* {{{ */
?>
';
} /* }}} */
/**
* Output HTML Code for jumploader
*
* @param string $uploadurl URL where post data is send
* @param integer $folderid id of folder where document is saved
* @param integer $maxfiles maximum number of files allowed to upload
* @param array $fields list of post fields
*/
function printFineUploaderHtml() { /* {{{ */
?>
$(document).ready(function() {
manualuploader = new qq.FineUploader({
debug: false,
autoUpload: false,
multiple: ,
element: $('#manual-fine-uploader')[0],
template: 'qq-template',
request: {
endpoint: ''
},
0 ? '
validation: {
sizeLimit: '.$maxuploadsize.'
},
' : ''); ?>
chunking: {
enabled: true,
mandatory: true
},
messages: {
sizeError: '{file} is too large, maximum file size is {sizeLimit}.'
},
callbacks: {
onComplete: function(id, name, json, xhr) {
},
onAllComplete: function(succeeded, failed) {
var uuids = Array();
var names = Array();
for (var i = 0; i < succeeded.length; i++) {
uuids.push(this.getUuid(succeeded[i]))
names.push(this.getName(succeeded[i]))
}
$('#fineuploaderuuids').val(uuids.join(';'));
$('#fineuploadernames').val(names.join(';'));
/* Run upload only if all files could be uploaded */
if(succeeded.length > 0 && failed.length == 0)
document.getElementById('form1').submit();
},
onError: function(id, name, reason, xhr) {
noty({
text: reason,
type: 'error',
dismissQueue: true,
layout: 'topRight',
theme: 'defaultTheme',
timeout: 3500,
});
}
}
});
});
params['dms'];
$document = $latestContent->getDocument();
$accessop = $this->params['accessobject'];
?>
,
getReviewStatus(10);
break;
case "approval":
$statusList = $latestContent->getApprovalStatus(10);
break;
case "revision":
$statusList = $latestContent->getRevisionStatus(10);
break;
case "receipt":
$statusList = $latestContent->getReceiptStatus(1);
break;
default:
$statusList = array();
}
foreach($statusList as $rec) {
echo "
";
echo "
";
switch ($rec["type"]) {
case 0: // individual.
$required = $dms->getUser($rec["required"]);
if (!is_object($required)) {
$reqName = getMLText("unknown_user")." '".$rec["required"]."'";
} else {
$reqName = htmlspecialchars($required->getFullName()." (".$required->getLogin().")");
}
break;
case 1: // Approver is a group.
$required = $dms->getGroup($rec["required"]);
if (!is_object($required)) {
$reqName = getMLText("unknown_group")." '".$rec["required"]."'";
}
else {
$reqName = "".htmlspecialchars($required->getName())."";
}
break;
}
echo $reqName;
echo "