diff --git a/inc/inc.ClassSettings.php b/inc/inc.ClassSettings.php
index 65ab8784c..a7b746797 100644
--- a/inc/inc.ClassSettings.php
+++ b/inc/inc.ClassSettings.php
@@ -140,6 +140,8 @@ class Settings { /* {{{ */
var $_defaultSearchMethod = 'database'; // or 'fulltext'
// suggest search term
var $_suggestTerms = array(); // or 'all', 'title'
+ // allowed batch operations on search result
+ var $_batchOperations = array(); // or 'all', 'change_owner', etc.
// jump straight to the document if it is the only hit of a search
var $_showSingleSearchHit = true;
// contentOffsetDirTo
@@ -569,6 +571,8 @@ class Settings { /* {{{ */
$this->_defaultSearchMethod = strval($tab["defaultSearchMethod"]);
if(trim(strval($tab["suggestTerms"])))
$this->_suggestTerms = explode(',',strval($tab["suggestTerms"]));
+ if(trim(strval($tab["batchOperations"])))
+ $this->_batchOperations = explode(',',strval($tab["batchOperations"]));
$this->_showSingleSearchHit = Settings::boolVal($tab["showSingleSearchHit"]);
$this->_stopWordsFile = strval($tab["stopWordsFile"]);
$this->_sortUsersInList = strval($tab["sortUsersInList"]);
@@ -971,6 +975,7 @@ class Settings { /* {{{ */
$this->setXMLAttributValue($node, "fullSearchEngine", $this->_fullSearchEngine);
$this->setXMLAttributValue($node, "defaultSearchMethod", $this->_defaultSearchMethod);
$this->setXMLAttributValue($node, "suggestTerms", implode(',', $this->_suggestTerms));
+ $this->setXMLAttributValue($node, "batchOperations", implode(',', $this->_batchOperations));
$this->setXMLAttributValue($node, "showSingleSearchHit", $this->_showSingleSearchHit);
$this->setXMLAttributValue($node, "expandFolderTree", $this->_expandFolderTree);
$this->setXMLAttributValue($node, "stopWordsFile", $this->_stopWordsFile);
diff --git a/op/op.Settings.php b/op/op.Settings.php
index 5950ccc47..93004ad73 100644
--- a/op/op.Settings.php
+++ b/op/op.Settings.php
@@ -134,6 +134,7 @@ if ($action == "saveSettings")
setStrValue('fullSearchEngine');
setStrValue('defaultSearchMethod');
setStrValue('suggestTerms');
+ setStrValue('batchOperations');
setBoolValue("showSingleSearchHit");
setBoolValue("enableSessionList");
setBoolValue("enableClipboard");
diff --git a/out/out.Search.php b/out/out.Search.php
index 5b868bee2..e4ecb4ec9 100644
--- a/out/out.Search.php
+++ b/out/out.Search.php
@@ -57,6 +57,16 @@ if (isset($_GET["newowner"]) && is_numeric($_GET["newowner"]) && $_GET['newowner
$newowner = $dms->getUser((int) $_GET['newowner']);
}
+$newreviewer = null;
+if (isset($_GET["newreviewer"]) && is_numeric($_GET["newreviewer"]) && $_GET['newreviewer'] > 0) {
+ $newreviewer = $dms->getUser((int) $_GET['newreviewer']);
+}
+
+$newapprover = null;
+if (isset($_GET["newapprover"]) && is_numeric($_GET["newapprover"]) && $_GET['newapprover'] > 0) {
+ $newapprover = $dms->getUser((int) $_GET['newapprover']);
+}
+
$changecategory = null;
if (isset($_GET["changecategory"]) && is_numeric($_GET["changecategory"]) && $_GET['changecategory'] > 0) {
$changecategory = $dms->getDocumentCategory((int) $_GET['changecategory']);
@@ -710,6 +720,8 @@ if($settings->_showSingleSearchHit && count($entries) == 1) {
$view->setParam('includecontent', $includecontent);
$view->setParam('marks', isset($_GET['marks']) ? $_GET['marks'] : array());
$view->setParam('newowner', $newowner);
+ $view->setParam('newreviewer', $newreviewer);
+ $view->setParam('newapprover', $newapprover);
$view->setParam('changecategory', $changecategory);
$view->setParam('removecategory', $removecategory);
$view->setParam('searchhits', $entries);
diff --git a/views/bootstrap/class.Search.php b/views/bootstrap/class.Search.php
index 2e9e29a97..02e2028c0 100644
--- a/views/bootstrap/class.Search.php
+++ b/views/bootstrap/class.Search.php
@@ -107,6 +107,50 @@ $(document).ready( function() {
});
}
});
+
+ $('body').on('click', 'a.add-reviewer-btn', function(ev){
+ ev.preventDefault();
+ ev.stopPropagation();
+console.log('add reviewer '+$('#addreviewer').val());
+ confirmmsg = $(ev.currentTarget).attr('confirmmsg');
+ href = $(ev.currentTarget).attr('href');
+ var url = href+'&newreviewer='+($('#addreviewer').val());
+ var values = {};
+ $('input[name^=\"marks\"]').each(function() {
+ if(this.checked)
+ values[this.name] = 1;
+ });
+ url += '&'+$.param(values);
+ if($('#addreviewer').val() && Object.keys(values).length > 0) {
+ SeedDMSBox.redirect(url, {
+ 'message': confirmmsg,
+ 'cancelLabel': '= getMLText("cancel") ?>',
+ 'confirmLabel': ' = getMLText("batch_add_reviewer") ?>'
+ });
+ }
+ });
+
+ $('body').on('click', 'a.add-approver-btn', function(ev){
+ ev.preventDefault();
+ ev.stopPropagation();
+console.log('add approver '+$('#addapprover').val());
+ confirmmsg = $(ev.currentTarget).attr('confirmmsg');
+ href = $(ev.currentTarget).attr('href');
+ var url = href+'&newapprover='+($('#addapprover').val());
+ var values = {};
+ $('input[name^=\"marks\"]').each(function() {
+ if(this.checked)
+ values[this.name] = 1;
+ });
+ url += '&'+$.param(values);
+ if($('#addapprover').val() && Object.keys(values).length > 0) {
+ SeedDMSBox.redirect(url, {
+ 'message': confirmmsg,
+ 'cancelLabel': '= getMLText("cancel") ?>',
+ 'confirmLabel': ' = getMLText("batch_add_approver") ?>'
+ });
+ }
+ });
});
printFolderChooserJs("form1");
@@ -245,6 +289,58 @@ $(document).ready(function() {
return self::show();
} /* }}} */
+ function addreviewer() { /* {{{ */
+ $dms = $this->params['dms'];
+ $user = $this->params['user'];
+ $entries = $this->params['searchhits'];
+ $newreviewer = $this->params['newreviewer'];
+ $marks = $this->params['marks'];
+
+ if($newreviewer && $user->isAdmin()) {
+ $j = $i = 0;
+ foreach($entries as $entry) {
+ if($entry->isType('document') && $lc = $entry->getLatestContent()) {
+ if(empty($marks) || !empty($marks['D'.$entry->getId()])) {
+ if($lc->addIndReviewer($newreviewer, $user)) {
+ $lc->verifyStatus(true, $user);
+ $j++;
+ }
+ }
+ }
+ }
+ $this->setParam('batchmsg', getMLText('batch_add_reviewer_msg', ['count'=>$j, 'name'=>$newreviewer->getFullName()]));
+ } else {
+ }
+
+ return self::show();
+ } /* }}} */
+
+ function addapprover() { /* {{{ */
+ $dms = $this->params['dms'];
+ $user = $this->params['user'];
+ $entries = $this->params['searchhits'];
+ $newapprover = $this->params['newapprover'];
+ $marks = $this->params['marks'];
+
+ if($newapprover && $user->isAdmin()) {
+ $j = $i = 0;
+ foreach($entries as $entry) {
+ if($entry->isType('document') && $lc = $entry->getLatestContent()) {
+ if(empty($marks) || !empty($marks['D'.$entry->getId()])) {
+ if($lc->addIndApprover($newapprover, $user)) {
+ $lc->verifyStatus(true, $user);
+ $j++;
+ }
+ }
+ }
+ }
+ $this->setParam('batchmsg', getMLText('batch_add_approver_msg', ['count'=>$j, 'name'=>$newapprover->getFullName()]));
+ } else {
+ }
+
+ return self::show();
+ } /* }}} */
+
function changecategory() { /* {{{ */
$dms = $this->params['dms'];
$user = $this->params['user'];
@@ -1329,6 +1425,7 @@ $(document).ready(function() {
if($total)
$this->contentHeading(getMLText('batch_operation'));
if($totaldocs) {
+ if(in_array('export', $settings->_batchOperations)) {
ob_start();
$this->formField(
getMLText("include_content"),
@@ -1341,12 +1438,15 @@ $(document).ready(function() {
)
);
//$this->formSubmit(" ".getMLText('export'));
- print $this->html_link('Search', array_merge($_GET, array('action'=>'export')), array('class'=>'btn btn-primary', 'id'=>'export'), " ".getMLText("export"), false, true)."\n";
+ print $this->html_link('Search', array_merge($_GET, array('action'=>'export')), array('class'=>'btn btn-primary', 'id'=>'export'), " ".getMLText("batch_export"), false, true)."\n";
$content = ob_get_clean();
$this->printAccordion(getMLText('export'), $content);
+ }
}
- if($user->isAdmin() && $total) {
+ /* All other batch operations are only allowed for admins */
+ if($user->isAdmin()) {
+ if($total && in_array('change_owner', $settings->_batchOperations)) {
ob_start();
$users = $dms->getAllUsers();
$options = array();
@@ -1371,7 +1471,61 @@ $(document).ready(function() {
$content = ob_get_clean();
$this->printAccordion(getMLText('batch_change_owner'), $content);
+ }
+ if($totaldocs && in_array('add_reviewer', $settings->_batchOperations)) {
+ ob_start();
+ $users = $dms->getAllUsers();
+ $options = array();
+ foreach ($users as $currUser) {
+ $options[] = array($currUser->getID(), htmlspecialchars($currUser->getLogin().' - '.$currUser->getFullName()), false, array(array('data-subtitle', htmlspecialchars($currUser->getEmail()))));
+ }
+ $this->formField(
+ null, //getMLText("selection"),
+ array(
+ 'element'=>'select',
+ 'id'=>'addreviewer',
+ 'class'=>'chzn-select',
+ 'options'=>$options,
+ 'allow_empty'=>true,
+ 'placeholder'=>getMLText('select_users'),
+ 'attributes'=>array(array('style', 'width: 100%;'))
+ )
+ );
+
+ print $this->html_link('Search', array_merge($_GET, array('action'=>'addreviewer')), array('class'=>'btn btn-primary add-reviewer-btn mt-4', 'confirmmsg'=>htmlspecialchars(getMLText("confirm_add_reviewer", array ()), ENT_QUOTES)), " ".getMLText("batch_add_reviewer"), false, true)."\n";
+
+ $content = ob_get_clean();
+ $this->printAccordion(getMLText('batch_add_reviewer'), $content);
+ }
+
+ if($totaldocs && in_array('add_approver', $settings->_batchOperations)) {
+ ob_start();
+ $users = $dms->getAllUsers();
+ $options = array();
+ foreach ($users as $currUser) {
+ $options[] = array($currUser->getID(), htmlspecialchars($currUser->getLogin().' - '.$currUser->getFullName()), false, array(array('data-subtitle', htmlspecialchars($currUser->getEmail()))));
+ }
+ $this->formField(
+ null, //getMLText("selection"),
+ array(
+ 'element'=>'select',
+ 'id'=>'addapprover',
+ 'class'=>'chzn-select',
+ 'options'=>$options,
+ 'allow_empty'=>true,
+ 'placeholder'=>getMLText('select_users'),
+ 'attributes'=>array(array('style', 'width: 100%;'))
+ )
+ );
+
+ print $this->html_link('Search', array_merge($_GET, array('action'=>'addapprover')), array('class'=>'btn btn-primary add-approver-btn mt-4', 'confirmmsg'=>htmlspecialchars(getMLText("confirm_add_approver", array ()), ENT_QUOTES)), " ".getMLText("batch_add_approver"), false, true)."\n";
+
+ $content = ob_get_clean();
+ $this->printAccordion(getMLText('batch_add_approver'), $content);
+ }
+
+ if($totaldocs && in_array('change_category', $settings->_batchOperations)) {
ob_start();
$cats = $dms->getDocumentCategories();
if($cats) {
@@ -1407,6 +1561,7 @@ $(document).ready(function() {
$content = ob_get_clean();
$this->printAccordion(getMLText('batch_change_category'), $content);
}
+ }
}
// }}}
diff --git a/views/bootstrap/class.Settings.php b/views/bootstrap/class.Settings.php
index 7b0b6f33d..8bc7d2024 100644
--- a/views/bootstrap/class.Settings.php
+++ b/views/bootstrap/class.Settings.php
@@ -404,6 +404,7 @@ if(($kkk = $this->callHook('getFullSearchEngine')) && is_array($kkk))
showConfigOption('settings_defaultSearchMethod', 'defaultSearchMethod', array('database'=>'settings_defaultSearchMethod_valdatabase', 'fulltext'=>'settings_defaultSearchMethod_valfulltext'), false, true); ?>
showConfigCheckbox('settings_showSingleSearchHit', 'showSingleSearchHit'); ?>
showConfigOption('settings_suggestTerms', 'suggestTerms', array('title','comment', 'keywords', 'content'), true, true); ?>
+showConfigOption('settings_batchOperations', 'batchOperations', array('export'=>'batch_export', 'change_category'=>'batch_change_category', 'change_owner'=>'batch_change_owner', 'add_reviewer'=>'batch_add_reviewer', 'add_approver'=>'batch_add_approver', 'change_category'=>'batch_change_category'), true, true); ?>
showConfigText('settings_stopWordsFile', 'stopWordsFile'); ?>
showConfigCheckbox('settings_enableClipboard', 'enableClipboard'); ?>
showConfigCheckbox('settings_alwaysShowClipboard', 'alwaysShowClipboard'); ?>