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': '', + 'confirmLabel': ' ' + }); + } + }); + + $('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': '', + 'confirmLabel': ' ' + }); + } + }); }); 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'); ?>