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

This commit is contained in:
Uwe Steinmann 2020-10-16 16:01:54 +02:00
commit 831dff03db
12 changed files with 55 additions and 32 deletions

View File

@ -184,6 +184,8 @@
- do offer to export users of group if there are no users
- config file can be set in env var SEEDDMS_CONFIG_FILE
- fix error when search for a boolean attribute value
- extension may contain a conf varіable to select a workflow
- do not set max_execution_time for scripts run by php-cli
--------------------------------------------------------------------------------
Changes in version 5.1.20

View File

@ -35,8 +35,11 @@ if(isset($settings->_extraPath))
/* composer is installed in pear directory */
require_once 'vendor/autoload.php';
if(isset($settings->_maxExecutionTime))
ini_set('max_execution_time', $settings->_maxExecutionTime);
if(isset($settings->_maxExecutionTime)) {
if (php_sapi_name() !== "cli") {
ini_set('max_execution_time', $settings->_maxExecutionTime);
}
}
if (get_magic_quotes_gpc()) {
$process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);

View File

@ -174,10 +174,10 @@ function import_folder($dirname, $folder, $setfiledate, $setfolderdate, $metadat
echo $mimetype." - ".$filetype." - ".$path."<br />\n";
if($res = $folder->addDocument($docname, $comment, $expires, $owner, $keywords,
$metadata[$path]['category'], $filetmp, $name,
!empty($metadata[$path]['category']) ? $metadata[$path]['category'] : array(), $filetmp, $name,
$filetype, $mimetype, $sequence, $reviewers,
$approvers, $reqversion, $version_comment,
$metadata[$path]['attributes'])) {
!empty($metadata[$path]['attributes']) ? $metadata[$path]['attributes'] : array())) {
$doccount++;
if($setfiledate) {
$newdoc = $res[0];

View File

@ -9,13 +9,13 @@
"author": "Uwe Steinmann",
"license": "ISC",
"dependencies": {
"@coreui/coreui": "^3.2.2",
"@coreui/coreui": "^3.3.0",
"@coreui/icons": "^1.0.1",
"@popperjs/core": "^2.4.4",
"@popperjs/core": "^2.5.3",
"bootstrap": "^4.5.2",
"bootstrap-datepicker": "^1.9.0",
"chartjs": "^0.3.24",
"cytoscape": "^3.15.2",
"cytoscape": "^3.16.2",
"cytoscape-grid-guide": "^2.3.2",
"fine-uploader": "^5.16.2",
"flag-icon-css": "^3.5.0",
@ -25,10 +25,10 @@
"grunt": "^1.3.0",
"grunt-contrib-clean": "^2.0.0",
"grunt-contrib-copy": "^1.0.0",
"jqtree": "^1.4.12",
"jqtree": "^1.5.1",
"jquery": "^1.12.4",
"jquery-validation": "^1.19.2",
"moment": "^2.17.1",
"moment": "^2.29.1",
"noty": "^2.4.1",
"pace-progressbar": "^1.0.9",
"perfect-scrollbar": "^1.5.0",

View File

@ -285,6 +285,7 @@ ul.jqtree-tree li.jqtree_common > .jqtree-element:hover {
i.success {color: #00b000;}
i.error {color: #b00000;}
i.warning {color: #ff9900;}
i.initstate {color: #ff9900;}
i.released {color: #00b000;}
i.rejected {color: #b00000;}

View File

@ -1303,7 +1303,7 @@ $(document).ready(function() {
<div id="'.$id.'-upload-file" class="upload-file">
<div class="input-append">
<input type="text" class="form-control" readonly>
<span class="btn btn-default btn-file">
<span class="btn btn-secondary btn-file">
'.getMLText("browse").'&hellip; <input id="'.$id.'" type="file" name="'.$varname.'"'.($multiple ? " multiple" : "").($accept ? ' accept="'.$accept.'"' : "").'>
</span>
</div>
@ -2128,7 +2128,7 @@ $(function() {
onCreateLi: function(node, $li) {
// Add 'icon' span before title
if(node.is_folder)
$li.find('.jqtree-title').before('<i class="fa fa-folder-o table-row-folder droptarget" data-droptarget="folder_' + node.id + '" rel="folder_' + node.id + '"></i> ').attr('rel', 'folder_' + node.id).attr('formtoken', '<?php echo createFormKey(''); ?>').attr('data-uploadformtoken', '<?php echo createFormKey(''); ?>');
$li.find('.jqtree-title').before('<i class="fa fa-folder-o table-row-folder droptarget" data-droptarget="folder_' + node.id + '" rel="folder_' + node.id + '"></i> ').attr('data-name', node.name).attr('rel', 'folder_' + node.id).attr('formtoken', '<?php echo createFormKey(''); ?>').attr('data-uploadformtoken', '<?php echo createFormKey(''); ?>').attr('data-droptarget', 'folder_' + node.id).addClass('droptarget');
else
$li.find('.jqtree-title').before('<i class="fa fa-file"></i> ');
}

View File

@ -112,7 +112,7 @@ class SeedDMS_View_Calendar extends SeedDMS_Bootstrap_Style {
<?php echo createHiddenFieldWithKey('removeevent'); ?>
<input type="hidden" name="eventid" value="<?php echo intval($event["id"]); ?>">
<p><?php printMLText("confirm_rm_event", array ("name" => htmlspecialchars($event["name"])));?></p>
<button class="btn" type="submit"><i class="fa fa-remove"></i> <?php printMLText("delete");?></button>
<button class="btn btn-danger" type="submit"><i class="fa fa-remove"></i> <?php printMLText("delete");?></button>
</form>
<?php
$this->contentContainerEnd();

View File

@ -720,7 +720,7 @@ foreach($facets as $facetname=>$values) {
$extracontent = array();
$extracontent['below_title'] = $belowtitle;
if($attrstr)
$extracontent['bottom_title'] = '<br />'.$this->printPopupBox('<span class="btn btn-mini btn-default">'.getMLText('attributes').'</span>', $attrstr, true);
$extracontent['bottom_title'] = '<br />'.$this->printPopupBox('<span class="btn btn-mini btn-secondary">'.getMLText('attributes').'</span>', $attrstr, true);
print $this->documentListRow($document, $previewer, false, 0, $extracontent);
}
} elseif($entry->isType('folder')) {
@ -745,7 +745,7 @@ foreach($facets as $facetname=>$values) {
}
$extracontent = array();
if($attrstr)
$extracontent['bottom_title'] = '<br />'.$this->printPopupBox('<span class="btn btn-mini btn-default">'.getMLText('attributes').'</span>', $attrstr, true);
$extracontent['bottom_title'] = '<br />'.$this->printPopupBox('<span class="btn btn-mini btn-secondary">'.getMLText('attributes').'</span>', $attrstr, true);
print $this->folderListRow($folder, false, $extracontent);
}
}

View File

@ -620,6 +620,23 @@ if(($kkk = $this->callHook('getFullSearchEngine')) && is_array($kkk))
printMLText('no_attribute_definitions');
}
break;
case "workflows":
$recs = $dms->getAllWorkflows();
if($recs) {
echo "<select class=\"chzn-select\"".($allowempty ? " data-allow-clear=\"true\"" : "")."\" name=\"extensions[".$extname."][".$confkey."][]\"".(!empty($conf['multiple']) ? " multiple" : "").(!empty($conf['size']) ? " size=\"".$conf['size']."\"" : "")." data-placeholder=\"".getMLText("select_attribute_value")."\">";
if($allowempty)
echo "<option value=\"\"></option>";
foreach($recs as $rec) {
echo "<option value=\"".$rec->getID()."\"";
if(in_array($rec->getID(), $selections))
echo " selected";
echo ">".htmlspecialchars($rec->getName())."</option>";
}
echo "</select>";
} else {
printMLText('no_workflows');
}
break;
case "folders":
$this->formField(null, $this->getFolderChooserHtml("form".$extname.$confkey, M_READ, -1, $selections ? $dms->getFolder($selections[0]) : 0, 'extensions['.$extname."][".$confkey."]"));
break;

View File

@ -906,7 +906,7 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Bootstrap_Style {
if($r['file']) {
echo "<br />";
if($accessobject->check_controller_access('Download', array('action'=>'run'))) {
echo "<a href=\"../op/op.Download.php?documentid=".$latestContent->getDocument()->getId()."&reviewlogid=".$r['reviewLogID']."\" class=\"btn btn-mini\"><i class=\"fa fa-download\"></i> ".getMLText('download')."</a>";
echo "<a href=\"../op/op.Download.php?documentid=".$latestContent->getDocument()->getId()."&reviewlogid=".$r['reviewLogID']."\" class=\"btn btn-secondary btn-mini\"><i class=\"fa fa-download\"></i> ".getMLText('download')."</a>";
}
}
print "</td>\n";
@ -1010,7 +1010,7 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Bootstrap_Style {
if($a['file']) {
echo "<br />";
if($accessobject->check_controller_access('Download', array('action'=>'run'))) {
echo "<a href=\"../op/op.Download.php?documentid=".$latestContent->getDocument()->getId()."&approvelogid=".$a['approveLogID']."\" class=\"btn btn-mini\"><i class=\"fa fa-download\"></i> ".getMLText('download')."</a>";
echo "<a href=\"../op/op.Download.php?documentid=".$latestContent->getDocument()->getId()."&approvelogid=".$a['approveLogID']."\" class=\"btn btn-secondary btn-mini\"><i class=\"fa fa-download\"></i> ".getMLText('download')."</a>";
}
}
echo "</td>\n";
@ -1085,9 +1085,9 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Bootstrap_Style {
$this->contentContainerStart();
if($user->isAdmin()) {
if(SeedDMS_Core_DMS::checkIfEqual($workflow->getInitState(), $latestContent->getWorkflowState())) {
print "<form action=\"../out/out.RemoveWorkflowFromDocument.php\" method=\"get\"><input type=\"hidden\" name=\"documentid\" value=\"".$latestContent->getDocument()->getId()."\" /><input type=\"hidden\" name=\"version\" value=\"".$latestContent->getVersion()."\" /><button type=\"submit\" class=\"btn\"><i class=\"fa fa-remove\"></i> ".getMLText('rm_workflow')."</button></form>";
print "<form action=\"../out/out.RemoveWorkflowFromDocument.php\" method=\"get\"><input type=\"hidden\" name=\"documentid\" value=\"".$latestContent->getDocument()->getId()."\" /><input type=\"hidden\" name=\"version\" value=\"".$latestContent->getVersion()."\" /><button type=\"submit\" class=\"btn btn-danger\"><i class=\"fa fa-remove\"></i> ".getMLText('rm_workflow')."</button></form>";
} else {
print "<form action=\"../out/out.RewindWorkflow.php\" method=\"get\"><input type=\"hidden\" name=\"documentid\" value=\"".$latestContent->getDocument()->getId()."\" /><input type=\"hidden\" name=\"version\" value=\"".$latestContent->getVersion()."\" /><button type=\"submit\" class=\"btn\"><i class=\"fa fa-refresh\"></i> ".getMLText('rewind_workflow')."</button></form>";
print "<form action=\"../out/out.RewindWorkflow.php\" method=\"get\"><input type=\"hidden\" name=\"documentid\" value=\"".$latestContent->getDocument()->getId()."\" /><input type=\"hidden\" name=\"version\" value=\"".$latestContent->getVersion()."\" /><button type=\"submit\" class=\"btn btn-danger\"><i class=\"fa fa-refresh\"></i> ".getMLText('rewind_workflow')."</button></form>";
}
}
@ -1187,7 +1187,7 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Bootstrap_Style {
echo "<td>";
if($latestContent->triggerWorkflowTransitionIsAllowed($user, $transition)) {
$action = $transition->getAction();
print "<form action=\"../out/out.TriggerWorkflow.php\" method=\"get\"><input type=\"hidden\" name=\"documentid\" value=\"".$latestContent->getDocument()->getId()."\" /><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(), htmlspecialchars($action->getName()))."\" /></form>";
print "<form action=\"../out/out.TriggerWorkflow.php\" method=\"get\"><input type=\"hidden\" name=\"documentid\" value=\"".$latestContent->getDocument()->getId()."\" /><input type=\"hidden\" name=\"version\" value=\"".$latestContent->getVersion()."\" /><input type=\"hidden\" name=\"transition\" value=\"".$transition->getID()."\" /><input type=\"submit\" class=\"btn btn-primary\" value=\"".getMLText('action_'.strtolower($action->getName()), array(), htmlspecialchars($action->getName()))."\" /></form>";
$allowedtransitions[] = $transition;
}
echo "</td>";
@ -1213,7 +1213,7 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Bootstrap_Style {
}
echo "</select>";
echo "<label class=\"inline\">";
echo "<input type=\"submit\" class=\"btn\" value=\"".getMLText('run_subworkflow')."\" />";
echo "<input type=\"submit\" class=\"btn btn-primary\" value=\"".getMLText('run_subworkflow')."\" />";
echo "</lable>";
echo "</form>";
}
@ -1239,7 +1239,7 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Bootstrap_Style {
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=\"get\"><input type=\"hidden\" name=\"documentid\" value=\"".$latestContent->getDocument()->getId()."\" /><input type=\"hidden\" name=\"version\" value=\"".$latestContent->getVersion()."\" />";
echo "<input type=\"submit\" class=\"btn\" value=\"".getMLText('return_from_subworkflow')."\" />";
echo "<input type=\"submit\" class=\"btn btn-primary\" value=\"".getMLText('return_from_subworkflow')."\" />";
echo "</form>";
} else {
/* Get a transition from the last state in the parent workflow
@ -1254,7 +1254,7 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Bootstrap_Style {
if($latestContent->triggerWorkflowTransitionIsAllowed($user, $transition)) {
echo "Triggering transition is allowed<br />";
echo "<form action=\"../out/out.ReturnFromSubWorkflow.php\" method=\"get\"><input type=\"hidden\" name=\"documentid\" value=\"".$latestContent->getDocument()->getId()."\" /><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 "<input type=\"submit\" class=\"btn btn-primary\" value=\"".getMLText('return_from_subworkflow')."\" />";
echo "</form>";
}
@ -1780,7 +1780,7 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Bootstrap_Style {
if (($user->getID() == $responsibleUser->getID()) || ($document->getAccessMode($user) == M_ALL ))
print "<br />".getMLText("document_link_public").": ".(($link->isPublic()) ? getMLText("yes") : getMLText("no"));
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=\"fa fa-remove\"></i> ".getMLText("delete")."</button></form>";
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-danger btn-mini\"><i class=\"fa fa-remove\"></i> ".getMLText("delete")."</button></form>";
print "</span></td>";
echo $this->documentListRowEnd($targetDoc);
}
@ -1845,7 +1845,7 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Bootstrap_Style {
print 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=\"".$sourceDoc->getId()."\" /><input type=\"hidden\" name=\"linkid\" value=\"".$link->getID()."\" /><button type=\"submit\" class=\"btn btn-mini\"><i class=\"fa fa-remove\"></i> ".getMLText("delete")."</button></form>";
print "<form action=\"../op/op.RemoveDocumentLink.php\" method=\"post\">".createHiddenFieldWithKey('removedocumentlink')."<input type=\"hidden\" name=\"documentid\" value=\"".$sourceDoc->getId()."\" /><input type=\"hidden\" name=\"linkid\" value=\"".$link->getID()."\" /><button type=\"submit\" class=\"btn btn-danger btn-mini\"><i class=\"fa fa-remove\"></i> ".getMLText("delete")."</button></form>";
print "</span></td>";
echo $this->documentListRowEnd($sourceDoc);
}

View File

@ -356,7 +356,7 @@ $('body').on('click', '.order-btn', function(ev) {
else {
print "<table id=\"viewfolder-table\" class=\"table table-condensed table-hover\">";
print "<thead>\n<tr>\n";
print "<th>".($parent ? '<button class="btn btn-mini btn-default" id="goto-parent" data-parentid="'.$parent->getID().'"><i class="fa fa-arrow-up"></i></button>' : '')."</th>\n";
print "<th>".($parent ? '<button class="btn btn-mini btn-secondary" id="goto-parent" data-parentid="'.$parent->getID().'"><i class="fa fa-arrow-up"></i></button>' : '')."</th>\n";
print "<th>".getMLText("name");
print " <a class=\"order-btn\" href=\"../out/out.ViewFolder.php?folderid=". $folderid .($orderby=="n"||$orderby=="na"?"&orderby=nd":"&orderby=n")."\" data-orderby=\"".($orderby=="n"||$orderby=="na"?"nd":"n")."\"title=\"".getMLText("sort_by_name")."\">".($orderby=="n"||$orderby=="na"?' <i class="fa fa-sort-alpha-asc selected"></i>':($orderby=="nd"?' <i class="fa fa-sort-alpha-desc selected"></i>':' <i class="fa fa-sort-alpha-asc"></i>'))."</a>";
print " <a class=\"order-btn\" href=\"../out/out.ViewFolder.php?folderid=". $folderid .($orderby=="s"||$orderby=="sa"?"&orderby=sd":"&orderby=s")."\" data-orderby=\"".($orderby=="s"||$orderby=="sa"?"sd":"s")."\" title=\"".getMLText("sort_by_sequence")."\">".($orderby=="s"||$orderby=="sa"?' <i class="fa fa-sort-numeric-asc selected"></i>':($orderby=="sd"?' <i class="fa fa-sort-numeric-desc selected"></i>':' <i class="fa fa-sort-numeric-asc"></i>'))."</a>";
@ -409,7 +409,7 @@ $('body').on('click', '.order-btn', function(ev) {
echo "</tbody>\n</table>\n";
if($maxItemsPerPage && $i > $maxItemsPerPage)
echo "<button id=\"loadmore\" style=\"width: 100%; margin-bottom: 20px;\" class=\"btn btn-default\" data-folder=\"".$folder->getId()."\"data-offset=\"".$maxItemsPerPage."\" data-limit=\"".$incItemsPerPage."\" data-all=\"".($i-$maxItemsPerPage)."\">".getMLText('x_more_objects', array('number'=>($i-$maxItemsPerPage)))."</button>";
echo "<button id=\"loadmore\" style=\"width: 100%; margin-bottom: 20px;\" class=\"btn btn-secondary\" data-folder=\"".$folder->getId()."\"data-offset=\"".$maxItemsPerPage."\" data-limit=\"".$incItemsPerPage."\" data-all=\"".($i-$maxItemsPerPage)."\">".getMLText('x_more_objects', array('number'=>($i-$maxItemsPerPage)))."</button>";
}
else printMLText("empty_folder_list");

View File

@ -186,7 +186,7 @@ cy.on('free', 'node', function(evt) {
cy.on('tap', 'node', function(evt) {
var node = evt.target;
var scratch = node.scratch('_app');
var scratch = node.scratch('app');
if(typeof scratch !== 'undefined') {
noty({
text: (scratch.users ? '<p><?= '<i class="fa fa-user"></i> ' ?> ' + scratch.users + '</p>' : '') + (scratch.groups ? '<?= '<i class="fa fa-group"></i> ' ?> ' + scratch.groups + '</p>' : ''),
@ -256,12 +256,12 @@ $(document).ready(function() {
$transusers = $transition->getUsers();
$unames = array();
foreach($transusers as $transuser) {
$unames[] = $transuser->getUser()->getLogin().' - '.$transuser->getUser()->getFullName();
$unames[] = htmlspecialchars($transuser->getUser()->getLogin().' - '.$transuser->getUser()->getFullName());
}
$transgroups = $transition->getGroups();
$gnames = array();
foreach($transgroups as $transgroup) {
$gnames[] = $transgroup->getGroup()->getName();
$gnames[] = htmlspecialchars($transgroup->getGroup()->getName());
}
$nodeid = "A".$transition->getID()."-".$action->getID();
echo "cy.add({
@ -272,7 +272,7 @@ $(document).ready(function() {
position: {x: ".$positions[$nodeid]->x.", y: ".$positions[$nodeid]->y."}," : "")."
classes: 'action".($iscurtransition ? " current" : ($this->curtransitions ? " light" : ""))."'".(!$this->curtransitions || $iscurtransition && $this->curtransitions ? ",
scratch: {
_app: {groups: \"".str_replace('"', "\\\"", implode(", ", $gnames))."\", users: \"".str_replace('"', "\\\"", implode(", ", $unames))."\"}
app: {groups: \"".str_replace('"', "\\\"", implode(", ", $gnames))."\", users: \"".str_replace('"', "\\\"", implode(", ", $unames))."\"}
}" : "")."
});\n";
}
@ -387,8 +387,8 @@ div.buttons #zoom {margin: 3px; _float: right;}
<i class="fa fa-sign-blank workflow-action"></i> <?php echo printMLText('global_workflow_actions'); ?>
</div>
<div class="buttons">
<div id="zoom"><button class="btn btn-mini btn-default">Zoom</button></div>
<button class="btn btn-mini" id="savelayout"><?php printMLText('workflow_save_layout'); ?></button>
<div id="zoom"><button class="btn btn-mini btn-secondary">Zoom</button></div>
<button class="btn btn-mini btn-secondary" id="savelayout"><?php printMLText('workflow_save_layout'); ?></button>
<button class="btn btn-mini" id="setlayout" data-layout="cose"><?php printMLText('redraw'); ?></button>
</div>
</div>