- Added method escapeLike to DB_Model to escape strings for LIKE operator

- Added JS include jqueryui to InfoCenter
- Added left join to system.tbl_person_lock in infocenterData.php
- Added field LockDate to InfoCenter filter
- Added parameter markRow to InfoCenter filter
- Added DragNDrop to FilterWidget to sort/remove the selected filter fields
- FilterWidget now display the name of the loaded filter if available
- Added the property "name" to the jsonb of filters to display the name of the loaded filter
- Added the static method displayFilterName to the FilterWidget to display the name of the loaded filter
- The collapsible panel in FilterWidget now shows/hides the fields selection, the filter operators and the inputs to save the custom filter
- The GUI remembers if the collapsible panel should be closed or open
- Added the "Apply" button to the filter operators
- Added the markRow parameter to the FilterWidget, used to mark a row if one or more conditions are matched
- Added the alternativeMarkRowClass to use a different class to mark a row
- Added the public static function markRow to the FilterWidget
This commit is contained in:
Paolo
2018-02-21 17:48:03 +01:00
parent 6830e5f51d
commit 72bb40e786
8 changed files with 411 additions and 149 deletions
+15
View File
@@ -540,6 +540,21 @@ class DB_Model extends FHC_Model
return $this->db->escape($value);
}
/**
* This method call the method escape_like_str from class CI_DB_driver, therefore:
* this method should be used when strings are to be used in LIKE conditions so that LIKE wildcards (%, _)
* in the string are also properly escaped.
* NOTE: The escape_like_str() method uses ! (exclamation mark) to escape special characters for LIKE conditions.
* Because this method escapes partial strings that you would wrap in quotes yourself, it cannot automatically
* add the ESCAPE '!' condition for you, and so youll have to manually do that.
*
* @return void
*/
public function escapeLike($value)
{
return $this->db->escape_like_str($value);
}
/**
* Convert PG-Boolean to PHP-Boolean
*
@@ -4,6 +4,7 @@
array(
'title' => 'Info Center',
'jquery' => true,
'jqueryui' => true,
'bootstrap' => true,
'fontawesome' => true,
'sbadmintemplate' => true,
@@ -1,4 +1,7 @@
<?php
$APP = 'infocenter';
$filterWidgetArray = array(
'query' => '
SELECT
@@ -60,8 +63,10 @@
AND ps.person_id = p.person_id
AND tbl_studiengang.typ in(\'b\')
LIMIT 1
) AS "AnzahlAbgeschickt"
) AS "AnzahlAbgeschickt",
pl.zeitpunkt AS "LockDate"
FROM public.tbl_person p
LEFT JOIN (SELECT person_id, zeitpunkt FROM system.tbl_person_lock WHERE app = \''.$APP.'\') pl USING(person_id)
WHERE
EXISTS(
SELECT 1
@@ -135,7 +140,24 @@
}
}
if ($fieldName == 'LockDate')
{
if ($datasetRaw->{$fieldName} == '01.01.1970 01:00:00')
{
$datasetRaw->{$fieldName} = 'Not locked';
}
}
return $datasetRaw;
},
'markRow' => function($datasetRaw) {
if ($datasetRaw->LockDate != '')
{
return true;
}
return false;
}
);
@@ -147,7 +169,7 @@
}
else
{
$filterWidgetArray['app'] = 'infocenter';
$filterWidgetArray['app'] = $APP;
$filterWidgetArray['datasetName'] = 'PersonActions';
$filterWidgetArray['filterKurzbz'] = 'InfoCenterNotSentApplicationAll';
}
+155 -12
View File
@@ -1,5 +1,13 @@
<style>
.filter-name-title {
font-family: inherit;
font-size: 20px;
font-weight: bold;
line-height: 1.1;
color: black;
}
.filters-hidden-panel {
margin: 0 10px 10px 10px;
}
@@ -8,10 +16,105 @@
display: none !important;
}
.filter-select-fields-dnd-div {
height: 50px;
}
.filter-select-field-dnd-span {
border: 1px solid black;
border-radius: 7px;
margin-left: 3px;
margin-right: 3px;
padding: 10px;
}
.filter-select-field-dnd-span:hover {
cursor: move;
}
.filter-select-field-dnd-span a {
cursor: pointer;
}
.selection-before::before {
content: "";
position: absolute;
top: 0;
right: 100%;
height: 100%;
margin-right: 3px;
border-left: 2px solid #428bca;
}
.selection-after::after {
content: "";
position: absolute;
top: 0;
left: 100%;
height: 100%;
margin-left: 3px;
border-right: 2px solid #428bca;
}
</style>
<script language="Javascript" type="text/javascript">
$(document).ready(function() {
$(".filter-select-field-dnd-span").draggable({
containment: "parent",
cursor: "move",
opacity: 0.4,
revert: "invalid",
revertDuration: 200
});
$(".filter-select-field-dnd-span").droppable({
accept: ".filter-select-field-dnd-span",
over: function(event, ui) {
$(this).on("mousemove", function( event ) {
var padding = 20;
var elementCenter = $(this).offset().left + (padding + $(this).width() / 2);
console.log(elementCenter);
console.log(event.pageX);
if (event.pageX > elementCenter)
{
$(this).addClass("selection-after");
$(this).removeClass("selection-before");
}
else if (event.pageX < elementCenter)
{
$(this).addClass("selection-before");
$(this).removeClass("selection-after");
}
});
},
out: function(event, ui) {
$(this).off("mousemove");
$(this).removeClass("selection-before");
$(this).removeClass("selection-after");
},
drop: function(event, ui) {
var padding = 20;
var elementCenter = $(this).offset().left + (padding + $(this).width() / 2);
if (event.pageX > elementCenter)
{
$(this).insertBefore(ui.draggable);
}
else if (event.pageX < elementCenter)
{
$(this).insertAfter(ui.draggable);
}
$(this).off("mousemove");
$(this).removeClass("selection-before");
$(this).removeClass("selection-after");
}
});
$("#addField").change(function() {
$("#filterForm").submit();
});
@@ -54,34 +157,74 @@
$("#filterForm").submit();
});
$("[data-toggle='collapse']").click(function() {
var filterOptionsStatus = sessionStorage.getItem('filter-options-status');
if (filterOptionsStatus != null && filterOptionsStatus == 'closed')
{
sessionStorage.setItem('filter-options-status', 'open');
}
else
{
sessionStorage.setItem('filter-options-status', 'closed');
}
});
var filterOptionsStatus = sessionStorage.getItem('filter-options-status');
if (filterOptionsStatus != null && filterOptionsStatus == 'open')
{
$('.collapse').collapse("show");
}
});
</script>
<div class="row">
<div class="col-lg-12">
<form class="form-inline" id="filterForm" method="POST" action="<?php echo current_url(); ?>">
<div>
<?php FilterWidget::loadViewSelectFields($listFields); ?>
</div>
<div>
<?php FilterWidget::loadViewSelectFilters($metaData); ?>
</div>
<?php FilterWidget::displayFilterName(); ?>
<div>
<?php FilterWidget::loadViewSaveFilter(); ?>
<div class="panel-group">
<div class="panel panel-default">
<div class="panel-heading">
<h4 class="panel-title">
<a data-toggle="collapse" href="#collapseFilterHeader">Filter options</a>
</h4>
</div>
<div id="collapseFilterHeader" class="panel-collapse collapse">
<div class="filters-hidden-panel">
<div>
<?php FilterWidget::loadViewSelectFields($listFields); ?>
</div>
<br>
<div>
<?php FilterWidget::loadViewSelectFilters($metaData); ?>
</div>
<br>
<div>
<?php FilterWidget::loadViewSaveFilter(); ?>
</div>
</div>
</div>
</div>
</div>
<br>
<div id="datasetActionsTop">
</div>
<div id="datasetActionsTop"></div>
<div>
<?php FilterWidget::loadViewTableDataset($dataset); ?>
</div>
<div id="datasetActionsBottom">
</div>
<div id="datasetActionsBottom"></div>
</form>
</div>
</div>
@@ -1,63 +1,54 @@
<div class="panel-group">
<div class="panel panel-default">
<div class="panel-heading">
<h4 class="panel-title">
<a data-toggle="collapse" href="#collapseSelectFields">Select columns</a>
</h4>
</div>
<div id="collapseSelectFields" class="panel-collapse collapse">
<div class="filters-hidden-panel">
<div>
<?php
$selectedFields = FilterWidget::getSelectedFields();
$columnsAliases = FilterWidget::getColumnsAliases();
<div id="filterSelectFieldsDnd" class="filter-select-fields-dnd-div">
<?php
$selectedFields = FilterWidget::getSelectedFields();
$columnsAliases = FilterWidget::getColumnsAliases();
for ($selectedFieldsCounter = 0; $selectedFieldsCounter < count($selectedFields); $selectedFieldsCounter++)
{
$selectedField = $selectedFields[$selectedFieldsCounter];
$selectedFieldAlias = $selectedField;
for ($selectedFieldsCounter = 0; $selectedFieldsCounter < count($selectedFields); $selectedFieldsCounter++)
{
$selectedField = $selectedFields[$selectedFieldsCounter];
$selectedFieldAlias = $selectedField;
if ($columnsAliases != null)
{
$indx = array_search($selectedField, $listFields);
if ($indx !== false)
{
$selectedFieldAlias = $columnsAliases[$indx];
}
}
?>
<input type="button" value="<?php echo $selectedFieldAlias; ?> X" class="remove-field" fieldToRemove="<?php echo $selectedField; ?>">
<?php
}
?>
<input type="hidden" id="<?php echo FilterWidget::CMD_REMOVE_FIELD; ?>" name="<?php echo FilterWidget::CMD_REMOVE_FIELD; ?>" value="">
</div>
<div>
<span>
Add field:
</span>
<span>
<select id="<?php echo FilterWidget::CMD_ADD_FIELD; ?>" name="<?php echo FilterWidget::CMD_ADD_FIELD; ?>">
<option value="">Select a field to add..</option>
<?php
for ($listFieldsCounter = 0; $listFieldsCounter < count($listFields); $listFieldsCounter++)
{
$listField = $listFields[$listFieldsCounter];
$listFieldAlias = $listField;
if ($columnsAliases != null)
{
$listFieldAlias = $columnsAliases[$listFieldsCounter];
}
?>
<option value="<?php echo $listField; ?>"><?php echo $listFieldAlias; ?></option>
<?php
}
?>
</select>
</span>
</div>
</div>
</div>
</div>
if ($columnsAliases != null)
{
$indx = array_search($selectedField, $listFields);
if ($indx !== false)
{
$selectedFieldAlias = $columnsAliases[$indx];
}
}
?>
<span class="filter-select-field-dnd-span">
<?php echo $selectedFieldAlias; ?>
<a class="remove-field" fieldToRemove="<?php echo $selectedField; ?>">X</a>
<input type="hidden" name="<?php echo $selectedField; ?>" value="<?php echo $selectedField; ?>">
</span>
<?php
}
?>
</div>
<input type="hidden" id="<?php echo FilterWidget::CMD_REMOVE_FIELD; ?>" name="<?php echo FilterWidget::CMD_REMOVE_FIELD; ?>" value="">
<div>
<span>
Add field:
</span>
<span>
<select id="<?php echo FilterWidget::CMD_ADD_FIELD; ?>" name="<?php echo FilterWidget::CMD_ADD_FIELD; ?>">
<option value="">Select a field to add..</option>
<?php
for ($listFieldsCounter = 0; $listFieldsCounter < count($listFields); $listFieldsCounter++)
{
$listField = $listFields[$listFieldsCounter];
$listFieldAlias = $listField;
if ($columnsAliases != null)
{
$listFieldAlias = $columnsAliases[$listFieldsCounter];
}
?>
<option value="<?php echo $listField; ?>"><?php echo $listFieldAlias; ?></option>
<?php
}
?>
</select>
</span>
</div>
@@ -1,82 +1,69 @@
<div class="panel-group">
<div class="panel panel-default">
<div class="panel-heading">
<h4 class="panel-title">
<a data-toggle="collapse" href="#collapseSelectFilters">Select filters</a>
</h4>
</div>
<div id="collapseSelectFilters" class="panel-collapse collapse">
<div class="filters-hidden-panel">
<div>
<?php
$selectedFilters = FilterWidget::getSelectedFilters();
$columnsAliases = FilterWidget::getColumnsAliases();
<div>
<?php
$selectedFilters = FilterWidget::getSelectedFilters();
$columnsAliases = FilterWidget::getColumnsAliases();
for ($filtersCounter = 0; $filtersCounter < count($selectedFilters); $filtersCounter++)
{
$selectedFilter = $selectedFilters[$filtersCounter];
for ($filtersCounter = 0; $filtersCounter < count($selectedFilters); $filtersCounter++)
{
$selectedFilter = $selectedFilters[$filtersCounter];
$md = FilterWidget::getFilterMetaData($selectedFilter, $metaData);
$selectedFieldAlias = $md->name;
$md = FilterWidget::getFilterMetaData($selectedFilter, $metaData);
$selectedFieldAlias = $md->name;
if ($columnsAliases != null)
{
$indx = array_search($selectedFilter, $listFields);
if ($indx !== false)
{
$selectedFieldAlias = $columnsAliases[$indx];
}
}
if ($columnsAliases != null)
{
$indx = array_search($selectedFilter, $listFields);
if ($indx !== false)
{
$selectedFieldAlias = $columnsAliases[$indx];
}
}
?>
<div>
?>
<div>
<span>
<?php echo $selectedFieldAlias; ?>
</span>
<span>
<?php echo $selectedFieldAlias; ?>
</span>
<?php echo FilterWidget::renderFilterType($md); ?>
<?php echo FilterWidget::renderFilterType($md); ?>
<span>
<input type="button" value="X" class="remove-filter" filterToRemove="<?php echo $md->name; ?>">
</span>
<span>
<input type="button" value="X" class="remove-filter" filterToRemove="<?php echo $md->name; ?>">
</span>
</div>
<?php
}
?>
<input type="hidden" id="<?php echo FilterWidget::CMD_REMOVE_FILTER; ?>" name="<?php echo FilterWidget::CMD_REMOVE_FILTER; ?>" value="">
</div>
<div>
<span>
Add filter:
</span>
<span>
<select id="<?php echo FilterWidget::CMD_ADD_FILTER; ?>" name="<?php echo FilterWidget::CMD_ADD_FILTER; ?>">
<option value="">Select a filter to add...</option>
<?php
for ($listFieldsCounter = 0; $listFieldsCounter < count($listFields); $listFieldsCounter++)
{
$field = $listFields[$listFieldsCounter];
$listFieldAlias = $field;
if ($columnsAliases != null)
{
$listFieldAlias = $columnsAliases[$listFieldsCounter];
}
?>
<option value="<?php echo $field; ?>"><?php echo $listFieldAlias; ?></option>
<?php
}
?>
</select>
</span>
<span>
<input id="applyFilter" name="applyFilter" type="button" value="Apply">
</span>
</div>
</div>
</div>
<?php
}
?>
<input type="hidden" id="<?php echo FilterWidget::CMD_REMOVE_FILTER; ?>" name="<?php echo FilterWidget::CMD_REMOVE_FILTER; ?>" value="">
</div>
<div>
<span>
Add filter:
</span>
<span>
<select id="<?php echo FilterWidget::CMD_ADD_FILTER; ?>" name="<?php echo FilterWidget::CMD_ADD_FILTER; ?>">
<option value="">Select a filter to add...</option>
<?php
for ($listFieldsCounter = 0; $listFieldsCounter < count($listFields); $listFieldsCounter++)
{
$field = $listFields[$listFieldsCounter];
$listFieldAlias = $field;
if ($columnsAliases != null)
{
$listFieldAlias = $columnsAliases[$listFieldsCounter];
}
?>
<option value="<?php echo $field; ?>"><?php echo $listFieldAlias; ?></option>
<?php
}
?>
</select>
</span>
<span>
<input id="applyFilter" name="applyFilter" type="button" value="Apply">
</span>
</div>
</div>
@@ -55,7 +55,7 @@
{
$result = $results[$resultsCounter];
?>
<tr>
<tr class="<?php echo FilterWidget::markRow($result); ?>">
<?php
if ($checkboxes != null)
{
+105 -2
View File
@@ -13,6 +13,8 @@ class FilterWidget extends Widget
const DB_RESULT = 'dbResult';
const ADDITIONAL_COLUMNS = 'additionalColumns';
const FORMAT_RAW = 'formatRaw';
const MARK_ROW = 'markRow';
const ALTERNATIVE_MARK_ROW_CLASS = 'alternativeMarkRowClass';
const CHECKBOXES = 'checkboxes';
const HIDE_HEADER = 'hideHeader';
const HIDE_SAVE = 'hideSave';
@@ -35,6 +37,7 @@ class FilterWidget extends Widget
const ACTIVE_FILTERS = 'activeFilters';
const ACTIVE_FILTERS_OPTION = 'activeFiltersOption';
const ACTIVE_FILTERS_OPERATION = 'activeFiltersOperation';
const FILTER_NAME = 'filterName';
const ACTIVE_FILTER_OPTION_POSTFIX = '-option';
const ACTIVE_FILTER_OPERATION_POSTFIX = '-operation';
@@ -60,6 +63,8 @@ class FilterWidget extends Widget
const DEFAULT_DATE_FORMAT = 'd.m.Y H:i:s';
const DEFAULT_MARK_ROW_CLASS = 'text-danger';
private $app;
private $query;
private $datasetName;
@@ -67,8 +72,11 @@ class FilterWidget extends Widget
private $filterId;
private $additionalColumns;
private $formatRaw;
private $markRow;
private $alternativeMarkRowClass;
private $checkboxes;
private $columnsAliases;
private $filterName;
private $dataset;
private $metaData;
@@ -108,6 +116,12 @@ class FilterWidget extends Widget
$this->filterId = $filterSessionArray[self::FILTER_ID];
}
//
if ($this->filterName == null && isset($filterSessionArray[self::FILTER_NAME]))
{
$this->filterName = $filterSessionArray[self::FILTER_NAME];
}
//
if ($filterSessionArray[self::FILTER_ID] != $this->filterId)
{
@@ -385,6 +399,37 @@ class FilterWidget extends Widget
return $tmpDatasetRaw;
}
/**
*
*/
public static function markRow($datasetRaw)
{
$class = '';
if (is_object($datasetRaw))
{
$markRow = self::$FilterWidgetInstance->getMarkRow();
if ($markRow != null)
{
if ($markRow($datasetRaw) === true)
{
$alternativeMarkRowClass = self::$FilterWidgetInstance->getAlternativeMarkRowClass();
if ($alternativeMarkRowClass != null)
{
$class = $alternativeMarkRowClass;
}
else
{
$class = self::DEFAULT_MARK_ROW_CLASS;
}
}
}
}
return $class;
}
/**
*
*/
@@ -393,6 +438,17 @@ class FilterWidget extends Widget
return self::$FilterWidgetInstance->_getCheckboxes();
}
/**
*
*/
public static function displayFilterName()
{
if (self::$FilterWidgetInstance->filterName != null && self::$FilterWidgetInstance->filterName != '')
{
echo '<div class="filter-name-title">'.self::$FilterWidgetInstance->filterName.'</div><br>';
}
}
//------------------------------------------------------------------------------------------------------------------
// Protected
@@ -419,6 +475,22 @@ class FilterWidget extends Widget
return $this->formatRaw;
}
/**
*
*/
protected function getMarkRow()
{
return $this->markRow;
}
/**
*
*/
protected function getAlternativeMarkRowClass()
{
return $this->alternativeMarkRowClass;
}
/**
*
*/
@@ -559,6 +631,11 @@ class FilterWidget extends Widget
$filterSessionArray[self::COLUMNS_ALIASES] = array();
}
if (!isset($filterSessionArray[self::FILTER_NAME]))
{
$filterSessionArray[self::FILTER_NAME] = null;
}
$this->session->set_userdata(self::SESSION_NAME, $filterSessionArray);
}
@@ -574,10 +651,13 @@ class FilterWidget extends Widget
$this->filterId = null;
$this->additionalColumns = null;
$this->formatRaw = null;
$this->markRow = null;
$this->alternativeMarkRowClass = null;
$this->checkboxes = null;
$this->hideHeader = false;
$this->hideSave = false;
$this->columnsAliases = null;
$this->filterName = null;
if (!is_array($args) || (is_array($args) && count($args) == 0))
{
@@ -638,6 +718,16 @@ class FilterWidget extends Widget
$this->formatRaw = $args[self::FORMAT_RAW];
}
if (isset($args[self::MARK_ROW]) && is_callable($args[self::MARK_ROW]))
{
$this->markRow = $args[self::MARK_ROW];
}
if (isset($args[self::ALTERNATIVE_MARK_ROW_CLASS]) && $args[self::ALTERNATIVE_MARK_ROW_CLASS] != '')
{
$this->alternativeMarkRowClass = $args[self::ALTERNATIVE_MARK_ROW_CLASS];
}
if (isset($args[self::CHECKBOXES])
&& is_array($args[self::CHECKBOXES])
&& count($args[self::CHECKBOXES]) > 0)
@@ -723,6 +813,7 @@ class FilterWidget extends Widget
$activeFilters = array();
$activeFiltersOperation = array();
$activeFiltersOption = array();
$filterName = null;
if (isset($jsonEncodedFilter->columns))
{
@@ -756,12 +847,20 @@ class FilterWidget extends Widget
}
}
if (isset($jsonEncodedFilter->name))
{
$filterName = $jsonEncodedFilter->name;
}
$this->filterName = $filterName;
$filterSessionArray = array(
self::SELECTED_FIELDS => $selectedFields,
self::SELECTED_FILTERS => $selectedFilters,
self::ACTIVE_FILTERS => $activeFilters,
self::ACTIVE_FILTERS_OPERATION => $activeFiltersOperation,
self::ACTIVE_FILTERS_OPTION => $activeFiltersOption
self::ACTIVE_FILTERS_OPTION => $activeFiltersOption,
self::FILTER_NAME => $filterName
);
$this->session->set_userdata(self::SESSION_NAME, $filterSessionArray);
@@ -773,7 +872,8 @@ class FilterWidget extends Widget
self::SELECTED_FILTERS => array(),
self::ACTIVE_FILTERS => array(),
self::ACTIVE_FILTERS_OPERATION => array(),
self::ACTIVE_FILTERS_OPTION => array()
self::ACTIVE_FILTERS_OPTION => array(),
self::FILTER_NAME => null
);
$this->session->set_userdata(self::SESSION_NAME, $filterSessionArray);
@@ -1038,6 +1138,7 @@ class FilterWidget extends Widget
);
$filterSessionArray[self::FILTER_ID] = $this->filterId;
$filterSessionArray[self::FILTER_NAME] = $this->filterName;
$this->session->set_userdata(self::SESSION_NAME, $filterSessionArray);
}
@@ -1130,9 +1231,11 @@ class FilterWidget extends Widget
}
break;
case self::OP_CONTAINS:
$activeFilterValue = $this->FiltersModel->escapeLike($activeFilterValue); // escapes
$condition = ' ILIKE \'%'.$activeFilterValue.'%\'';
break;
case self::OP_NOT_CONTAINS:
$activeFilterValue = $this->FiltersModel->escapeLike($activeFilterValue); // escapes
$condition = ' NOT ILIKE \'%'.$activeFilterValue.'%\'';
break;
case self::OP_IS_TRUE: