where(sprintf($dispFilter['searchin'], $db->quote($filters[$key])));
+ // Support multi-select dropdown filter
+ if ($dispFilter['search_type'] == 'select' && $dispFilter['multiple'] && is_array($filters[$key]))
+ {
+ $filters[$key] = array_map(array($db, 'quote'), $filters[$key]);
+
+ // Create safe string of array.
+ $filters[$key] = implode(',', $filters[$key]);
+ $query->where(sprintf($dispFilter['searchin'], $filters[$key]));
+ }
+ else
+ {
+ $query->where(sprintf($dispFilter['searchin'], $db->quote($filters[$key])));
+ }
}
else
{
- $query->where($db->quoteName($columnName) . '=' . $db->quote($filters[$key]));
+ // Support multi-select dropdown filter
+ if ($dispFilter['search_type'] == 'select' && $dispFilter['multiple'] && is_array($filters[$key]))
+ {
+ $filters[$key] = array_map(array($db, 'quote'), $filters[$key]);
+
+ // Create safe string of array.
+ $filters[$key] = implode(',', $filters[$key]);
+
+ $query->where($db->quoteName($columnName) . ' IN (' . $filters[$key] . ')');
+ }
+ else
+ {
+ $query->where($db->quoteName($columnName) . '=' . $db->quote($filters[$key]));
+ }
}
}
else
diff --git a/tjreports/site/views/reports/tmpl/default_filters.php b/tjreports/site/views/reports/tmpl/default_filters.php
old mode 100644
new mode 100755
index bb41736..228cd81
--- a/tjreports/site/views/reports/tmpl/default_filters.php
+++ b/tjreports/site/views/reports/tmpl/default_filters.php
@@ -19,123 +19,259 @@
$classForShowHide = 'col-filter-header';
}
-foreach($displayFilters as $searchKey => $filter)
+// Support multiple filter sets if allowed i.e. $this->allowToCreateResultSets is true
+if ($this->addMorefilter && $this->allowToCreateResultSets)
{
- $searchType = $filter['search_type'];
- $searchValue = isset($filters[$searchKey]) ? $filters[$searchKey] : '';
- $filterHtml = '';
- $filterHide = $searchValue === '' ? 'filter-hide' : 'filter-show';
+ $removeFilter = '';
- if ($searchType == 'text')
+ if (isset($this->removeFilter) && $this->removeFilter != '' && $this->removeFilter != 0)
{
- $filterHtml = '
-
-
-
-
-
';
-
- if(isset($this->colKey))
- {
- $filterHtml .= JHtml::_('grid.sort', '', $this->colKey, $this->listDirn, $this->listOrder);
- }
- }
- elseif($searchType == 'select' && isset($filter['select_options']))
- {
- $svalue = isset($filter['select_value']) ? $filter['select_value'] : "value";
- $stext = isset($filter['select_text']) ? $filter['select_text'] : "text";
+ $removeFilter = (int) $this->removeFilter;
- $filterHtml = '';
+ unset($filters['options-' . $removeFilter]);
- $filterHtml .= JHtml::_('select.genericlist', $filter['select_options'], 'filters[' . $searchKey . ']',
- 'class="filter-input ' . $filterHide . '" size="1" onchange="tjrContentUI.report.submitTJRData();"',
- $svalue, $stext, $searchValue);
+ $filterInc = 0;
+ $tempFilter = array();
- if ($this->filterLevel == 1)
+ foreach ($filters as $f_key => $f_value)
{
- $filterHtml .= '
';
- }
- else
- {
- $filterHtml .= '
-
- ';
+ $tempFilter['options-' . $filterInc] = $f_value;
+ $filterInc++;
}
- if(isset($this->colKey))
- {
- $filterHtml .= JHtml::_('grid.sort', '', $this->colKey, $this->listDirn, $this->listOrder);
- }
+ $filters = $tempFilter;
}
- elseif($searchType == 'date.range' || $searchType == 'calendar')
+
+ for ((int) $filterCnt = 0; $filterCnt < $this->addMorefilter; $filterCnt++)
{
- $j = ($searchType == 'date.range') ? 2 : 1;
+ if ($filterCnt >= 1)
+ {
+ echo '
';
+ }
+ ?>
+
- for ($i=1; $i<=$j; $i++)
+ $filter)
{
- $altfieldKey = '';
+ $searchType = $filter['search_type'];
+ $searchValue = isset($filters['options-' . $filterCnt][$searchKey]) ? $filters['options-' . $filterCnt][$searchKey] : '';
+ $filterHtml = '';
+ $filterHide = $searchValue === '' ? 'filter-hide' : 'filter-show';
- if ($searchType == 'date.range')
+ if ($searchType == 'text')
{
- $fieldKey = ($i == 1) ? ($searchKey . '_from') : ($searchKey . '_to');
- $altfieldKey = ($i == 1) ? ($searchKey . '_to') : ($searchKey . '_from');
+ $filterHtml = '
+
+
+
+
+
';
+
+ if(isset($this->colKey))
+ {
+ $filterHtml .= JHtml::_('grid.sort', '', $this->colKey, $this->listDirn, $this->listOrder);
+ }
}
- else
+ elseif($searchType == 'select' && isset($filter['select_options']))
{
- $fieldKey = $searchKey;
- }
+ $svalue = isset($filter['select_value']) ? $filter['select_value'] : "value";
+ $stext = isset($filter['select_text']) ? $filter['select_text'] : "text";
+ $multiple = isset($filter['multiple']) && $filter['multiple'] ? "multiple='true'" : "";
+ $arrayFilter = isset($filter['multiple']) && $filter['multiple'] ? "[]" : "";
+ $class = isset($filter['class']) ? $filter['class'] : "";
- $searchValue = isset($filters[$fieldKey]) ? $filters[$fieldKey] : '';
- $dateFormat = isset($filters['dateFormat']) ? $filters['dateFormat'] : '%Y-%m-%d';
+ $filterHtml = '
';
- if ($j == 2)
- {
- $altSearchValue = isset($filters[$altfieldKey]) ? $filters[$altfieldKey] : '';
- $filterHide = ($searchValue === '' && $altSearchValue === '') ? 'filter-hide' : 'filter-show';
+ $filterHtml .= JHtml::_('select.genericlist', $filter['select_options'], 'filters[options-' . $filterCnt . '][' . $searchKey . ']' . $arrayFilter,
+ 'class="filter-input ' . $filterHide . ' ' . $class . ' " size="1" onchange="tjrContentUI.report.submitTJRData();"' . $multiple,
+ $svalue, $stext, $searchValue);
+
+ if ($this->filterLevel == 1)
+ {
+ $filterHtml .= '
';
+ }
+ else
+ {
+ $filterHtml .= '
+
+ ';
+ }
+
+ if(isset($this->colKey))
+ {
+ $filterHtml .= JHtml::_('grid.sort', '', $this->colKey, $this->listDirn, $this->listOrder);
+ }
}
- else
+ elseif($searchType == 'date.range' || $searchType == 'calendar')
{
- $filterHide = $searchValue === '' ? 'filter-hide' : 'filter-show';
- }
+ $j = ($searchType == 'date.range') ? 2 : 1;
+
+ for ($i=1; $i<=$j; $i++)
+ {
+ $altfieldKey = '';
+
+ if ($searchType == 'date.range')
+ {
+ $fieldKey = ($i == 1) ? ($searchKey . '_from') : ($searchKey . '_to');
+ $altfieldKey = ($i == 1) ? ($searchKey . '_to') : ($searchKey . '_from');
+ }
+ else
+ {
+ $fieldKey = $searchKey;
+ }
+
+ $searchValue = isset($filters['options-' . $filterCnt][$fieldKey]) ? $filters['options-' . $filterCnt][$fieldKey] : '';
+ $dateFormat = isset($filters['dateFormat']) ? $filters['dateFormat'] : '%Y-%m-%d';
+
+ if ($j == 2)
+ {
+ $altSearchValue = isset($filters['options-' . $filterCnt][$altfieldKey]) ? $filters['options-' . $filterCnt][$altfieldKey] : '';
+ $filterHide = ($searchValue === '' && $altSearchValue === '') ? 'filter-hide' : 'filter-show';
+ }
+ else
+ {
+ $filterHide = $searchValue === '' ? 'filter-hide' : 'filter-show';
+ }
+
+ $attrib = array('class' => 'tjrsmall-input dash-calendar validate-ymd-date ' . $filterHide);
+
+ if (isset($filter[$fieldKey]['attrib']))
+ {
+ $fieldAttr = array_merge($filter[$fieldKey]['attrib'], $attrib);
+ }
+ elseif (isset($filter['attrib']))
+ {
+ $fieldAttr = array_merge($filter['attrib'], $attrib);
+ }
+ else
+ {
+ $fieldAttr = $attrib;
+ }
- $attrib = array('class' => 'tjrsmall-input dash-calendar validate-ymd-date ' . $filterHide);
+ $filterHtml .= ''
+ . JHtml::_('calendar', htmlspecialchars($searchValue), 'filters[options-' . $filterCnt . ']['. $fieldKey . ']', 'filters_' . $fieldKey , $dateFormat, $fieldAttr);
- if (isset($filter[$fieldKey]['attrib']))
+ if ($this->filterLevel == 1)
+ {
+ $filterHtml .= '
';
+ }
+ elseif ($this->filterLevel != 1 && $i != 1 || $searchType == 'calendar' )
+ {
+ $filterHtml .= '
+
+ ';
+ }
+
+ if(isset($this->colKey))
+ {
+ $filterHtml .= JHtml::_('grid.sort', '', $this->colKey, $this->listDirn, $this->listOrder);
+ }
+ }
+ }
+ elseif($searchType == 'html')
{
- $fieldAttr = array_merge($filter[$fieldKey]['attrib'], $attrib);
+ $filterHtml = $filter['html'];
}
- elseif (isset($filter['attrib']))
+ ?>
+
+
+
+
+ filterLevel == 1)
+ {
+ ?>
+
+
+
+
+
+
+
+
+ $filter)
+ {
+ $searchType = $filter['search_type'];
+ $searchValue = isset($filters[$searchKey]) ? $filters[$searchKey] : '';
+ $filterHtml = '';
+ $filterHide = $searchValue === '' ? 'filter-hide' : 'filter-show';
+
+ if ($searchType == 'text')
+ {
+ $filterHtml = '
+
+
+
+
+
';
+
+ if(isset($this->colKey))
{
- $fieldAttr = $attrib;
+ $filterHtml .= JHtml::_('grid.sort', '', $this->colKey, $this->listDirn, $this->listOrder);
}
+ }
+ elseif($searchType == 'select' && isset($filter['select_options']))
+ {
+ $svalue = isset($filter['select_value']) ? $filter['select_value'] : "value";
+ $stext = isset($filter['select_text']) ? $filter['select_text'] : "text";
+ $multiple = isset($filter['multiple']) && $filter['multiple'] ? "multiple='true'" : "";
+ $arrayFilter = isset($filter['multiple']) && $filter['multiple'] ? "[]" : "";
+ $class = isset($filter['class']) ? $filter['class'] : "";
+
+ $filterHtml = '';
+ $filterHtml .= '
+
+ ';
}
if(isset($this->colKey))
@@ -143,14 +279,82 @@ class="input input-mini filter-input ' . $filterHide . '" ' .
$filterHtml .= JHtml::_('grid.sort', '', $this->colKey, $this->listDirn, $this->listOrder);
}
}
+ elseif($searchType == 'date.range' || $searchType == 'calendar')
+ {
+ $j = ($searchType == 'date.range') ? 2 : 1;
+
+ for ($i=1; $i<=$j; $i++)
+ {
+ $altfieldKey = '';
+
+ if ($searchType == 'date.range')
+ {
+ $fieldKey = ($i == 1) ? ($searchKey . '_from') : ($searchKey . '_to');
+ $altfieldKey = ($i == 1) ? ($searchKey . '_to') : ($searchKey . '_from');
+ }
+ else
+ {
+ $fieldKey = $searchKey;
+ }
+
+ $searchValue = isset($filters[$fieldKey]) ? $filters[$fieldKey] : '';
+ $dateFormat = isset($filters['dateFormat']) ? $filters['dateFormat'] : '%Y-%m-%d';
+
+ if ($j == 2)
+ {
+ $altSearchValue = isset($filters[$altfieldKey]) ? $filters[$altfieldKey] : '';
+ $filterHide = ($searchValue === '' && $altSearchValue === '') ? 'filter-hide' : 'filter-show';
+ }
+ else
+ {
+ $filterHide = $searchValue === '' ? 'filter-hide' : 'filter-show';
+ }
+
+ $attrib = array('class' => 'tjrsmall-input dash-calendar validate-ymd-date ' . $filterHide);
+
+ if (isset($filter[$fieldKey]['attrib']))
+ {
+ $fieldAttr = array_merge($filter[$fieldKey]['attrib'], $attrib);
+ }
+ elseif (isset($filter['attrib']))
+ {
+ $fieldAttr = array_merge($filter['attrib'], $attrib);
+ }
+ else
+ {
+ $fieldAttr = $attrib;
+ }
+
+ $filterHtml .= ''
+ . JHtml::_('calendar', htmlspecialchars($searchValue), 'filters['. $fieldKey . ']', 'filters_' . $fieldKey , $dateFormat, $fieldAttr);
+
+ if ($this->filterLevel == 1)
+ {
+ $filterHtml .= '
';
+ }
+ elseif ($this->filterLevel != 1 && $i != 1 || $searchType == 'calendar' )
+ {
+ $filterHtml .= '
+
+ ';
+ }
+
+ if(isset($this->colKey))
+ {
+ $filterHtml .= JHtml::_('grid.sort', '', $this->colKey, $this->listDirn, $this->listOrder);
+ }
+ }
+ }
+ elseif($searchType == 'html')
+ {
+ $filterHtml = $filter['html'];
+ }
+ ?>
+
+
+
+
-
-
-
- param, true);
$postFilters = $this->model->getValidRequestVars();
+ // Check if multiple result sets are allowed in the Report
+ if ($this->model->allowToCreateResultSets)
+ {
+ if (count($param['filters']) >= 1)
+ {
+ // Initiate the number of filter sets count
+ Factory::getDocument()->addScriptDeclaration('
+ addMorefilterCnt = ' . count($param['filters'])
+ );
+ }
+
+ // Post the count of filter set to set the filters in the saved report
+ $input->set('addMorefilter', count($param['filters']));
+ }
+
foreach ($postFilters as $postFilter => $filterType)
{
+ // If filters are set in saved queries, then by default keep the Search Tools open
+ if ($postFilter == 'filters' && isset($param[$postFilter]) && !empty($param['filters']))
+ {
+ Factory::getDocument()->addScriptDeclaration('
+ jQuery(document).ready(function (){
+ tjrContentUI.report.showFilter();
+ });
+ '
+ );
+ }
+
if (isset($param[$postFilter]))
{
$input->set($postFilter, $param[$postFilter]);
@@ -213,16 +239,23 @@ public function processData($type = 'html')
$this->showHideColumns = array_intersect($this->model->showhideCols, array_merge($this->defaultColToshow, $this->defaultColToHide));
}
- $this->sortable = $this->model->sortableColumns;
- $this->emailColumn = $this->model->getState('emailColumn');
- $this->srButton = $this->model->showSearchResetButton;
- $this->colToshow = $this->model->getState('colToshow');
- $this->filterValues = $this->model->getState('filters');
- $this->userFilters = $this->model->displayFilters();
- $this->messages = $this->model->getTJRMessages();
- $this->showSummaryReport = $this->model->getState('showSummaryReport');
- $this->enableReportPlugins = $this->model->getenableReportPlugins($this->client);
- $this->isExport = $user->authorise('core.export', 'com_tjreports.tjreport.' . $this->reportId);
+ $this->sortable = $this->model->sortableColumns;
+ $this->emailColumn = $this->model->getState('emailColumn');
+ $this->srButton = $this->model->showSearchResetButton;
+ $this->colToshow = $this->model->getState('colToshow');
+ $this->filterValues = $this->model->getState('filters');
+ $this->userFilters = $this->model->displayFilters();
+ $this->messages = $this->model->getTJRMessages();
+ $this->showSummaryReport = $this->model->getState('showSummaryReport');
+ $this->enableReportPlugins = $this->model->getenableReportPlugins($this->client);
+ $this->isExport = $user->authorise('core.export', 'com_tjreports.tjreport.' . $this->reportId);
+
+ // This will be used to create multiple result sets
+ $this->allowToCreateResultSets = $this->model->allowToCreateResultSets;
+
+ // These two are used to generate filters sets similar to addMore in subforms
+ $this->addMorefilter = $input->get('addMorefilter', 1, 'INT');
+ $this->removeFilter = $input->get('removeFilter', '', 'STRING');
return true;
}
diff --git a/tjreports/site/views/reports/view.csv.php b/tjreports/site/views/reports/view.csv.php
index ee81654..1d1c40c 100644
--- a/tjreports/site/views/reports/view.csv.php
+++ b/tjreports/site/views/reports/view.csv.php
@@ -104,6 +104,13 @@ private function getItems()
JModelLegacy::addIncludePath(JPATH_SITE . '/plugins/tjreports/' . $pluginName);
$model = JModelLegacy::getInstance($pluginName, 'TjreportsModel');
+ // Check if multiple filters set are enabled in the report
+ if ($model->allowToCreateResultSets)
+ {
+ // Set the number of filter sets count in order to get correct CSV report
+ $model->addMorefilter = $input->get('addMorefilter', 1, 'INT');
+ }
+
$model->loadLanguage($pluginName);
$input->set('limit', $this->limit);
diff --git a/tjreports/site/views/reports/view.html.php b/tjreports/site/views/reports/view.html.php
index 9037021..3afd01a 100755
--- a/tjreports/site/views/reports/view.html.php
+++ b/tjreports/site/views/reports/view.html.php
@@ -159,8 +159,8 @@ protected function addDocumentHeaderData()
HTMLHelper::stylesheet(Uri::root() . '/media/techjoomla_strapper/bs3/css/bootstrap.min.css');
}
- HTMLHelper::_('script', 'components/com_tjreports/assets/js/tjrContentService.min.js');
- HTMLHelper::_('script', 'components/com_tjreports/assets/js/tjrContentUI.min.js');
+ HTMLHelper::_('script', 'components/com_tjreports/assets/js/tjrContentService.min.js', array("relative" => true));
+ HTMLHelper::_('script', 'components/com_tjreports/assets/js/tjrContentUI.min.js', array("relative" => true));
HTMLHelper::_('stylesheet', 'components/com_tjreports/assets/css/tjreports.min.css');
$document->addScriptDeclaration('tjrContentUI.base_url = "' . Uri::base() . '"');