From 0a71bce5472812ad6d1bd8376caee0ed6c3416ba Mon Sep 17 00:00:00 2001 From: Paolo Date: Tue, 29 May 2018 18:05:22 +0200 Subject: [PATCH] Changes to the FilterWidget --- application/controllers/system/Filters.php | 977 ++++++------ application/core/FHC_Controller.php | 35 + application/libraries/FiltersLib.php | 444 ++++++ .../system/infocenter/infocenterData.php | 17 +- application/views/widgets/filter/filter.php | 4 +- application/widgets/FilterWidget.bak.php | 1231 +++++++++++++++ application/widgets/FilterWidget.php | 1369 +++-------------- public/js/AjaxLib.js | 40 +- public/js/FilterWidget.js | 574 ++++--- 9 files changed, 2768 insertions(+), 1923 deletions(-) create mode 100644 application/libraries/FiltersLib.php create mode 100644 application/widgets/FilterWidget.bak.php diff --git a/application/controllers/system/Filters.php b/application/controllers/system/Filters.php index 648868d61..c0c1f7a4c 100644 --- a/application/controllers/system/Filters.php +++ b/application/controllers/system/Filters.php @@ -3,553 +3,508 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** - * + * This controller operates between (interface) the JS (GUI) and the FiltersLib (back-end) + * Provides data to the ajax get calls about the filter + * Accepts ajax post calls to change the filter data + * This controller works with JSON calls on the HTTP GET or POST and the output is always JSON */ -class Filters extends VileSci_Controller +class Filters extends FHC_Controller { - const SESSION_NAME = 'FHC_FILTER_WIDGET'; - - const SELECTED_FIELDS = 'selectedFields'; - const SELECTED_FILTERS = 'selectedFilters'; - const ACTIVE_FILTERS = 'activeFilters'; - const ACTIVE_FILTERS_OPTION = 'activeFiltersOption'; - const ACTIVE_FILTERS_OPERATION = 'activeFiltersOperation'; - const FILTER_NAME = 'filterName'; + const FILTER_PAGE_PARAM = 'filter_page'; /** - * + * Calls the parent's constructor and loads the FiltersLib */ public function __construct() { parent::__construct(); - // Load session library - $this->load->library('session'); - - $this->load->model('system/Filters_model', 'FiltersModel'); - $this->load->model('person/Benutzer_model', 'BenutzerModel'); + $this->_loadFiltersLib(); // Loads the FiltersLib with parameters } - /** - * - */ - public function tableDataset() - { - $json = new stdClass(); - - $session = $this->_readSession($this->_getFilterUniqueId()); - - $json->selectedFields = $this->_getFromSession('selectedFields'); - $json->columnsAliases = $this->_getFromSession('columnsAliases'); - $json->additionalColumns = $this->_getFromSession('additionalColumns'); - $json->checkboxes = $this->_getFromSession('checkboxes'); - $json->dataset = $this->_getFromSession('dataset'); - - $this->output->set_content_type('application/json')->set_output(json_encode($json)); - } + //------------------------------------------------------------------------------------------------------------------ + // Public methods /** * */ - public function selectFields() + public function getFilter() { - $json = new stdClass(); - - $session = $this->_readSession($this->_getFilterUniqueId()); - - $json->allSelectedFields = $this->_getFromSession('allSelectedFields'); - $json->allColumnsAliases = $this->_getFromSession('allColumnsAliases'); - - $json->selectedFields = $this->_getFromSession('selectedFields'); - $json->columnsAliases = $this->_getFromSession('columnsAliases'); - - $this->output->set_content_type('application/json')->set_output(json_encode($json)); + $this->outputJsonSuccess($this->filterslib->getSession()); } /** - * - */ - public function sortSelectedFields() - { - $selectedFieldsLst = $this->input->post('selectedFieldsLst'); - - $filterUniqueId = $this->_getFilterUniqueId(); - - $json = new stdClass(); - - $session = $this->_readSession($filterUniqueId); - - $allSelectedFields = $this->_getFromSession('allSelectedFields'); - $allColumnsAliases = $this->_getFromSession('allColumnsAliases'); - - $json->selectedFields = $this->_getFromSession('selectedFields'); - $json->columnsAliases = $this->_getFromSession('columnsAliases'); - - if (isset($selectedFieldsLst) && is_array($selectedFieldsLst)) - { - $json->selectedFields = $selectedFieldsLst; - $json->columnsAliases = array(); - - for ($i = 0; $i < count($json->selectedFields); $i++) - { - $pos = array_search($json->selectedFields[$i], $allSelectedFields); - - $json->columnsAliases[$i] = $json->selectedFields[$i]; - - if ($pos !== false) - { - if ($allColumnsAliases != null && is_array($allColumnsAliases)) - { - $json->columnsAliases[$i] = $allColumnsAliases[$pos]; - } - } - } - } - - $_SESSION[self::SESSION_NAME][$filterUniqueId]['selectedFields'] = $json->selectedFields; - $_SESSION[self::SESSION_NAME][$filterUniqueId]['columnsAliases'] = $json->columnsAliases; - - $this->output->set_content_type('application/json')->set_output(json_encode($json)); - } - - /** - * - */ - public function selectFilters() - { - $json = new stdClass(); - - $session = $this->_readSession($this->_getFilterUniqueId()); - - $json->allSelectedFields = $this->_getFromSession('allSelectedFields'); - $json->allColumnsAliases = $this->_getFromSession('allColumnsAliases'); - - $json->selectedFilters = $this->_getFromSession('selectedFilters'); - $json->selectedFiltersAliases = array(); - $json->selectedFiltersMetaData = array(); - - $json->selectedFiltersActiveFilters = array(); - $json->selectedFiltersActiveFiltersOperation = array(); - $json->selectedFiltersActiveFiltersOption = array(); - - $metaData = $this->_getFromSession('metaData'); - $activeFilters = $this->_getFromSession('activeFilters'); - $activeFiltersOperation = $this->_getFromSession('activeFiltersOperation'); - $activeFiltersOption = $this->_getFromSession('activeFiltersOption'); - - for ($i = 0; $i < count($json->selectedFilters); $i++) - { - $pos = array_search($json->selectedFilters[$i], $json->allSelectedFields); - - if ($pos !== false) - { - $json->selectedFiltersAliases[$i] = $json->selectedFilters[$i]; - if ($json->allColumnsAliases != null && is_array($json->allColumnsAliases)) - { - $json->selectedFiltersAliases[$i] = $json->allColumnsAliases[$pos]; - } - - $json->selectedFiltersMetaData[] = $metaData[$pos]; - - if (isset($activeFilters[$json->selectedFilters[$i]])) - { - $json->selectedFiltersActiveFilters[] = $activeFilters[$json->selectedFilters[$i]]; - } - - if (isset($activeFiltersOperation[$json->selectedFilters[$i]])) - { - $json->selectedFiltersActiveFiltersOperation[] = $activeFiltersOperation[$json->selectedFilters[$i]]; - } - - if (isset($activeFiltersOption[$json->selectedFilters[$i]])) - { - $json->selectedFiltersActiveFiltersOption[] = $activeFiltersOption[$json->selectedFilters[$i]]; - } - } - } - - $this->output->set_content_type('application/json')->set_output(json_encode($json)); - } - - /** - * - */ - public function saveFilter() - { - $this->_saveFilter($this->input->post("customFilterDescription"), $this->_getFilterUniqueId()); - - $this->output->set_content_type('application/json')->set_output(json_encode('Filter saved')); - } - - /** - * - */ - private function _saveFilter($customFilterDescription, $filterUniqueId) - { - $objToBeSaved = new stdClass(); - - $filterSessionArray = $this->_readSession($filterUniqueId); - - $objToBeSaved->name = $customFilterDescription; - - if (isset($filterSessionArray[self::SELECTED_FIELDS])) - { - $selectedFields = $filterSessionArray[self::SELECTED_FIELDS]; - $objToBeSaved->columns = array(); - - for ($selectedFieldsCounter = 0; $selectedFieldsCounter < count($selectedFields); $selectedFieldsCounter++) - { - $objToBeSaved->columns[$selectedFieldsCounter] = new stdClass(); - $objToBeSaved->columns[$selectedFieldsCounter]->name = $selectedFields[$selectedFieldsCounter]; - } - } - - if (isset($filterSessionArray[self::SELECTED_FILTERS])) - { - $selectedFilters = $filterSessionArray[self::SELECTED_FILTERS]; - $objToBeSaved->filters = array(); - - for ($selectedFiltersCounter = 0; $selectedFiltersCounter < count($selectedFilters); $selectedFiltersCounter++) - { - $objToBeSaved->filters[$selectedFiltersCounter] = new stdClass(); - $objToBeSaved->filters[$selectedFiltersCounter]->name = $selectedFilters[$selectedFiltersCounter]; - - if (isset($filterSessionArray[self::ACTIVE_FILTERS]) - && isset($filterSessionArray[self::ACTIVE_FILTERS][$selectedFilters[$selectedFiltersCounter]])) - { - $objToBeSaved->filters[$selectedFiltersCounter]->condition = $filterSessionArray[self::ACTIVE_FILTERS][$selectedFilters[$selectedFiltersCounter]]; - } - - if (isset($filterSessionArray[self::ACTIVE_FILTERS_OPERATION]) - && isset($filterSessionArray[self::ACTIVE_FILTERS_OPERATION][$selectedFilters[$selectedFiltersCounter]])) - { - $objToBeSaved->filters[$selectedFiltersCounter]->operation = $filterSessionArray[self::ACTIVE_FILTERS_OPERATION][$selectedFilters[$selectedFiltersCounter]]; - } - - if (isset($filterSessionArray[self::ACTIVE_FILTERS_OPTION]) - && isset($filterSessionArray[self::ACTIVE_FILTERS_OPTION][$selectedFilters[$selectedFiltersCounter]])) - { - $objToBeSaved->filters[$selectedFiltersCounter]->option = $filterSessionArray[self::ACTIVE_FILTERS_OPTION][$selectedFilters[$selectedFiltersCounter]]; - } - } - } - - $desc = $customFilterDescription; - $descPGArray = '{"'.$desc.'", "'.$desc.'", "'.$desc.'", "'.$desc.'"}'; - - $resultBenutzer = $this->BenutzerModel->load(getAuthUID()); - $personId = $resultBenutzer->retval[0]->person_id; - - $result = $this->FiltersModel->loadWhere(array( - 'app' => $_SESSION[self::SESSION_NAME][$filterUniqueId]['app'], - 'dataset_name' => $_SESSION[self::SESSION_NAME][$filterUniqueId]['datasetName'], - 'description' => $descPGArray, - 'person_id' => $personId - )); - - if (hasData($result)) - { - $this->FiltersModel->update( - array( - 'app' => $_SESSION[self::SESSION_NAME][$filterUniqueId]['app'], - 'dataset_name' => $_SESSION[self::SESSION_NAME][$filterUniqueId]['datasetName'], - 'description' => $descPGArray, - 'person_id' => $personId - ), - array( - 'filter' => json_encode($objToBeSaved) - ) - ); - } - else - { - $this->FiltersModel->insert(array( - 'app' => $_SESSION[self::SESSION_NAME][$filterUniqueId]['app'], - 'dataset_name' => $_SESSION[self::SESSION_NAME][$filterUniqueId]['datasetName'], - 'filter_kurzbz' => uniqid($personId, true), - 'person_id' => $personId, - 'description' => $descPGArray, - 'sort' => null, - 'default_filter' => false, - 'filter' => json_encode($objToBeSaved), - 'oe_kurzbz' => null - )); - } - } - - /** - * - */ - public function deleteCustomFilter() - { - $filter_id = $this->input->post('filter_id'); - - if (is_numeric($filter_id)) - { - $this->FiltersModel->deleteCustomFilter($filter_id); - - $this->output->set_content_type('application/json')->set_output(json_encode('Removed')); - } - } - - /** - * - */ - public function removeSelectedFields() - { - $fieldName = $this->input->post('fieldName'); - $filterUniqueId = $this->_getFilterUniqueId(); - - $session = $this->_readSession($filterUniqueId); - - $allSelectedFields = $this->_getFromSession('allSelectedFields'); - $allColumnsAliases = $this->_getFromSession('allColumnsAliases'); - - $selectedFields = $this->_getFromSession('selectedFields'); - $columnsAliases = $this->_getFromSession('columnsAliases'); - - if (($pos = array_search($fieldName, $selectedFields)) !== false) - { - array_splice($selectedFields, $pos, 1); - - if ($columnsAliases != null && is_array($columnsAliases)) - { - array_splice($columnsAliases, $pos, 1); - } - } - - $_SESSION[self::SESSION_NAME][$filterUniqueId]['selectedFields'] = $selectedFields; - $_SESSION[self::SESSION_NAME][$filterUniqueId]['columnsAliases'] = $columnsAliases; - - $json = new stdClass(); - - $json->allSelectedFields = $allSelectedFields; - $json->allColumnsAliases = $allColumnsAliases; - $json->selectedFields = $selectedFields; - $json->columnsAliases = $columnsAliases; - - $this->output->set_content_type('application/json')->set_output(json_encode($json)); - } - - /** - * - */ - public function removeSelectedFilters() - { - $fieldName = $this->input->post('fieldName'); - $filterUniqueId = $this->_getFilterUniqueId(); - - $session = $this->_readSession($filterUniqueId); - - $selectedFilters = $this->_getFromSession('selectedFilters'); - $selectedFiltersActiveFilters = $this->_getFromSession('activeFilters'); - $selectedFiltersActiveFiltersOperation = $this->_getFromSession('activeFiltersOperation'); - $selectedFiltersActiveFiltersOption = $this->_getFromSession('activeFiltersOption'); - - if (($pos = array_search($fieldName, $selectedFilters)) !== false) - { - array_splice($selectedFilters, $pos, 1); - array_splice($selectedFiltersActiveFilters, $pos, 1); - array_splice($selectedFiltersActiveFiltersOperation, $pos, 1); - array_splice($selectedFiltersActiveFiltersOption, $pos, 1); - } - - $_SESSION[self::SESSION_NAME][$filterUniqueId]['selectedFilters'] = $selectedFilters; - $_SESSION[self::SESSION_NAME][$filterUniqueId]['activeFilters'] = $selectedFiltersActiveFilters; - $_SESSION[self::SESSION_NAME][$filterUniqueId]['activeFiltersOperation'] = $selectedFiltersActiveFiltersOperation; - $_SESSION[self::SESSION_NAME][$filterUniqueId]['activeFiltersOption'] = $selectedFiltersActiveFiltersOption; - - $json = new stdClass(); - - $json->selectedFilters = $selectedFilters; - $json->selectedFiltersActiveFilters = $selectedFiltersActiveFilters; - $json->selectedFiltersActiveFiltersOperation = $selectedFiltersActiveFiltersOperation; - $json->selectedFiltersActiveFiltersOption = $selectedFiltersActiveFiltersOption; - - $this->output->set_content_type('application/json')->set_output(json_encode($json)); - } - - /** - * - */ - public function addSelectedFields() - { - $fieldName = $this->input->post('fieldName'); - $filterUniqueId = $this->_getFilterUniqueId(); - - $session = $this->_readSession($filterUniqueId); - - $allSelectedFields = $this->_getFromSession('allSelectedFields'); - $allColumnsAliases = $this->_getFromSession('allColumnsAliases'); - - $selectedFields = $this->_getFromSession('selectedFields'); - $columnsAliases = $this->_getFromSession('columnsAliases'); - - if (($pos = array_search($fieldName, $allSelectedFields)) !== false - && array_search($fieldName, $selectedFields) === false) - { - array_push($selectedFields, $fieldName); - - if ($columnsAliases != null && is_array($columnsAliases)) - { - array_push($columnsAliases, $allColumnsAliases[$pos]); - } - } - - $_SESSION[self::SESSION_NAME][$filterUniqueId]['selectedFields'] = $selectedFields; - $_SESSION[self::SESSION_NAME][$filterUniqueId]['columnsAliases'] = $columnsAliases; - - $json = new stdClass(); - - $json->allSelectedFields = $allSelectedFields; - $json->allColumnsAliases = $allColumnsAliases; - $json->selectedFields = $selectedFields; - $json->columnsAliases = $columnsAliases; - - $this->output->set_content_type('application/json')->set_output(json_encode($json)); - } - - /** - * - */ - public function addSelectedFilters() - { - $fieldName = $this->input->post('fieldName'); - $filterUniqueId = $this->_getFilterUniqueId(); - - $session = $this->_readSession($filterUniqueId); - - $selectedFilters = $this->_getFromSession('selectedFilters'); - $selectedFiltersActiveFilters = $this->_getFromSession('activeFilters'); - $selectedFiltersActiveFiltersOperation = $this->_getFromSession('activeFiltersOperation'); - $selectedFiltersActiveFiltersOption = $this->_getFromSession('activeFiltersOption'); - - if (!in_array($fieldName, $selectedFilters)) - { - array_push($selectedFilters, $fieldName); - $selectedFiltersActiveFilters[$fieldName] = ""; - $selectedFiltersActiveFiltersOperation[$fieldName] = ""; - $selectedFiltersActiveFiltersOption[$fieldName] = ""; - } - - $_SESSION[self::SESSION_NAME][$filterUniqueId]['selectedFilters'] = $selectedFilters; - $_SESSION[self::SESSION_NAME][$filterUniqueId]['activeFilters'] = $selectedFiltersActiveFilters; - $_SESSION[self::SESSION_NAME][$filterUniqueId]['activeFiltersOperation'] = $selectedFiltersActiveFiltersOperation; - $_SESSION[self::SESSION_NAME][$filterUniqueId]['activeFiltersOption'] = $selectedFiltersActiveFiltersOption; - - $json = new stdClass(); - - $json->selectedFilters = $selectedFilters; - $json->selectedFiltersActiveFilters = $selectedFiltersActiveFilters; - $json->selectedFiltersActiveFiltersOperation = $selectedFiltersActiveFiltersOperation; - $json->selectedFiltersActiveFiltersOption = $selectedFiltersActiveFiltersOption; - - $this->output->set_content_type('application/json')->set_output(json_encode($json)); - } - - /** - * - */ - public function applyFilter() - { - $fieldNames = $this->input->post('filterNames'); - $filterOperations = $this->input->post('filterOperations'); - $filterOperationValues = $this->input->post('filterOperationValues'); - $filterOptions = $this->input->post('filterOptions'); - $filterUniqueId = $this->_getFilterUniqueId(); - - $session = $this->_readSession($filterUniqueId); - - $activeFilters = array_combine($fieldNames, $filterOperationValues); - $activeFiltersOperation = array_combine($fieldNames, $filterOperations); - $activeFiltersOption = array_combine($fieldNames, $filterOptions); - - $_SESSION[self::SESSION_NAME][$filterUniqueId]['activeFilters'] = $activeFilters; - $_SESSION[self::SESSION_NAME][$filterUniqueId]['activeFiltersOperation'] = $activeFiltersOperation; - $_SESSION[self::SESSION_NAME][$filterUniqueId]['activeFiltersOption'] = $activeFiltersOption; - - $json = new stdClass(); - - $json->fieldNames = $fieldNames; - $json->activeFilters = $activeFilters; - $json->activeFiltersOperation = $activeFiltersOperation; - $json->activeFiltersOption = $activeFiltersOption; - - $this->output->set_content_type('application/json')->set_output(json_encode($json)); - } - - /** - * + * Retrives the number of records present in the dataset */ public function rowNumber() { - $json = new stdClass(); + $rowNumber = 0; + $dataset = $this->filterslib->getElementSession(FiltersLib::SESSION_DATASET); - $session = $this->_readSession($this->_getFilterUniqueId()); - - $dataset = $this->_getFromSession('dataset'); - - if (is_array($dataset)) + if (isset($dataset) && is_array($dataset)) { - $json->rowNumber = count($dataset); + $rowNumber = count($dataset); } - $this->output->set_content_type('application/json')->set_output(json_encode($json)); + $this->outputJsonSuccess($rowNumber); } - /** - * - */ - private function _readSession($filterUniqueId) - { - if (isset($_SESSION[self::SESSION_NAME]) && isset($_SESSION[self::SESSION_NAME][$filterUniqueId])) - return $_SESSION[self::SESSION_NAME][$filterUniqueId]; - - return array(); - } + //------------------------------------------------------------------------------------------------------------------ + // Private methods /** - * + * Loads the FiltersLib with the FILTER_PAGE_PARAM parameter + * If the parameter FILTER_PAGE_PARAM is not given then the execution of the controller is terminated and + * an error message is printed */ - private function _writeSession($data, $filterUniqueId) + private function _loadFiltersLib() { - if (!isset($_SESSION[self::SESSION_NAME]) - || (isset($_SESSION[self::SESSION_NAME]) && !is_array($_SESSION[self::SESSION_NAME]))) + // If the parameter FILTER_PAGE_PARAM is present in the HTTP GET or POST + if (isset($_GET[self::FILTER_PAGE_PARAM]) || isset($_POST[self::FILTER_PAGE_PARAM])) { - $_SESSION[self::SESSION_NAME] = array(); + // If it is present in the HTTP GET + if (isset($_GET[self::FILTER_PAGE_PARAM])) + { + $filterPage = $this->input->get(self::FILTER_PAGE_PARAM); // is retrived from the HTTP GET + } + elseif (isset($_POST[self::FILTER_PAGE_PARAM])) // Else if it is present in the HTTP POST + { + $filterPage = $this->input->post(self::FILTER_PAGE_PARAM); // is retrived from the HTTP POST + } + + // Loads the FiltersLib that contains all the used logic + $this->load->library('FiltersLib', array(self::FILTER_PAGE_PARAM => $filterPage)); } - - $_SESSION[self::SESSION_NAME][$filterUniqueId] = $data; - } - - /** - * - */ - private function _getFilterUniqueId() - { - $_getFilterUniqueId = ''; - - if ($_SERVER['REQUEST_METHOD'] === 'POST') + else // Otherwise an error will be written in the output { - $_getFilterUniqueId = $this->input->post('filter_page').'/'.$this->input->post('fhc_controller_id'); + $this->outputJsonError('Parameter '.self::FILTER_PAGE_PARAM.' not provided!'); + exit; } - elseif ($_SERVER['REQUEST_METHOD'] === 'GET') - { - $_getFilterUniqueId = $this->input->get('filter_page').'/'.$this->input->get('fhc_controller_id'); - } - - return $_getFilterUniqueId; } - /** - * - */ - private function _getFromSession($el) - { - $_getFromSession = null; - - if (isset($_SESSION[$el])) return $_SESSION[$el]; - - return $_getFromSession; - } + // /** + // * + // */ + // public function getFields() + // { + // $json = new stdClass(); + // + // $json->fields = $this->filterslib->getElementSession(FiltersLib::SESSION_FIELDS); + // $json->selectedFields = $this->filterslib->getElementSession(FiltersLib::SESSION_SELECTED_FIELDS); + // $json->columnsAliases = $this->filterslib->getElementSession(FiltersLib::SESSION_COLUMNS_ALIASES); + // + // $this->outputJsonSuccess($json); + // } + // + // /** + // * + // */ + // public function getFilters() + // { + // $json = new stdClass(); + // + // $session = $this->_readSession($this->_getFilterUniqueId()); + // + // $json->allSelectedFields = $this->_getFromSession('allSelectedFields'); + // $json->allColumnsAliases = $this->_getFromSession('allColumnsAliases'); + // + // $json->selectedFilters = $this->_getFromSession('selectedFilters'); + // $json->selectedFiltersAliases = array(); + // $json->selectedFiltersMetaData = array(); + // + // $json->selectedFiltersActiveFilters = array(); + // $json->selectedFiltersActiveFiltersOperation = array(); + // $json->selectedFiltersActiveFiltersOption = array(); + // + // $metaData = $this->_getFromSession('metaData'); + // $activeFilters = $this->_getFromSession('activeFilters'); + // $activeFiltersOperation = $this->_getFromSession('activeFiltersOperation'); + // $activeFiltersOption = $this->_getFromSession('activeFiltersOption'); + // + // for ($i = 0; $i < count($json->selectedFilters); $i++) + // { + // $pos = array_search($json->selectedFilters[$i], $json->allSelectedFields); + // + // if ($pos !== false) + // { + // $json->selectedFiltersAliases[$i] = $json->selectedFilters[$i]; + // if ($json->allColumnsAliases != null && is_array($json->allColumnsAliases)) + // { + // $json->selectedFiltersAliases[$i] = $json->allColumnsAliases[$pos]; + // } + // + // $json->selectedFiltersMetaData[] = $metaData[$pos]; + // + // if (isset($activeFilters[$json->selectedFilters[$i]])) + // { + // $json->selectedFiltersActiveFilters[] = $activeFilters[$json->selectedFilters[$i]]; + // } + // + // if (isset($activeFiltersOperation[$json->selectedFilters[$i]])) + // { + // $json->selectedFiltersActiveFiltersOperation[] = $activeFiltersOperation[$json->selectedFilters[$i]]; + // } + // + // if (isset($activeFiltersOption[$json->selectedFilters[$i]])) + // { + // $json->selectedFiltersActiveFiltersOption[] = $activeFiltersOption[$json->selectedFilters[$i]]; + // } + // } + // } + // + // $this->output->set_content_type('application/json')->set_output(json_encode($json)); + // } + // + // /** + // * + // */ + // public function sortSelectedFields() + // { + // $selectedFieldsLst = $this->input->post('selectedFieldsLst'); + // + // $filterUniqueId = $this->_getFilterUniqueId(); + // + // $json = new stdClass(); + // + // $session = $this->_readSession($filterUniqueId); + // + // $allSelectedFields = $this->_getFromSession('allSelectedFields'); + // $allColumnsAliases = $this->_getFromSession('allColumnsAliases'); + // + // $json->selectedFields = $this->_getFromSession('selectedFields'); + // $json->columnsAliases = $this->_getFromSession('columnsAliases'); + // + // if (isset($selectedFieldsLst) && is_array($selectedFieldsLst)) + // { + // $json->selectedFields = $selectedFieldsLst; + // $json->columnsAliases = array(); + // + // for ($i = 0; $i < count($json->selectedFields); $i++) + // { + // $pos = array_search($json->selectedFields[$i], $allSelectedFields); + // + // $json->columnsAliases[$i] = $json->selectedFields[$i]; + // + // if ($pos !== false) + // { + // if ($allColumnsAliases != null && is_array($allColumnsAliases)) + // { + // $json->columnsAliases[$i] = $allColumnsAliases[$pos]; + // } + // } + // } + // } + // + // $_SESSION[self::SESSION_NAME][$filterUniqueId]['selectedFields'] = $json->selectedFields; + // $_SESSION[self::SESSION_NAME][$filterUniqueId]['columnsAliases'] = $json->columnsAliases; + // + // $this->output->set_content_type('application/json')->set_output(json_encode($json)); + // } + // + // /** + // * + // */ + // public function saveFilter() + // { + // $this->_saveFilter($this->input->post("customFilterDescription"), $this->_getFilterUniqueId()); + // + // $this->output->set_content_type('application/json')->set_output(json_encode('Filter saved')); + // } + // + // /** + // * + // */ + // private function _saveFilter($customFilterDescription, $filterUniqueId) + // { + // $objToBeSaved = new stdClass(); + // + // $filterSessionArray = $this->_readSession($filterUniqueId); + // + // $objToBeSaved->name = $customFilterDescription; + // + // if (isset($filterSessionArray[self::SELECTED_FIELDS])) + // { + // $selectedFields = $filterSessionArray[self::SELECTED_FIELDS]; + // $objToBeSaved->columns = array(); + // + // for ($selectedFieldsCounter = 0; $selectedFieldsCounter < count($selectedFields); $selectedFieldsCounter++) + // { + // $objToBeSaved->columns[$selectedFieldsCounter] = new stdClass(); + // $objToBeSaved->columns[$selectedFieldsCounter]->name = $selectedFields[$selectedFieldsCounter]; + // } + // } + // + // if (isset($filterSessionArray[self::SELECTED_FILTERS])) + // { + // $selectedFilters = $filterSessionArray[self::SELECTED_FILTERS]; + // $objToBeSaved->filters = array(); + // + // for ($selectedFiltersCounter = 0; $selectedFiltersCounter < count($selectedFilters); $selectedFiltersCounter++) + // { + // $objToBeSaved->filters[$selectedFiltersCounter] = new stdClass(); + // $objToBeSaved->filters[$selectedFiltersCounter]->name = $selectedFilters[$selectedFiltersCounter]; + // + // if (isset($filterSessionArray[self::ACTIVE_FILTERS]) + // && isset($filterSessionArray[self::ACTIVE_FILTERS][$selectedFilters[$selectedFiltersCounter]])) + // { + // $objToBeSaved->filters[$selectedFiltersCounter]->condition = $filterSessionArray[self::ACTIVE_FILTERS][$selectedFilters[$selectedFiltersCounter]]; + // } + // + // if (isset($filterSessionArray[self::ACTIVE_FILTERS_OPERATION]) + // && isset($filterSessionArray[self::ACTIVE_FILTERS_OPERATION][$selectedFilters[$selectedFiltersCounter]])) + // { + // $objToBeSaved->filters[$selectedFiltersCounter]->operation = $filterSessionArray[self::ACTIVE_FILTERS_OPERATION][$selectedFilters[$selectedFiltersCounter]]; + // } + // + // if (isset($filterSessionArray[self::ACTIVE_FILTERS_OPTION]) + // && isset($filterSessionArray[self::ACTIVE_FILTERS_OPTION][$selectedFilters[$selectedFiltersCounter]])) + // { + // $objToBeSaved->filters[$selectedFiltersCounter]->option = $filterSessionArray[self::ACTIVE_FILTERS_OPTION][$selectedFilters[$selectedFiltersCounter]]; + // } + // } + // } + // + // $desc = $customFilterDescription; + // $descPGArray = '{"'.$desc.'", "'.$desc.'", "'.$desc.'", "'.$desc.'"}'; + // + // $resultBenutzer = $this->BenutzerModel->load(getAuthUID()); + // $personId = $resultBenutzer->retval[0]->person_id; + // + // $result = $this->FiltersModel->loadWhere(array( + // 'app' => $_SESSION[self::SESSION_NAME][$filterUniqueId]['app'], + // 'dataset_name' => $_SESSION[self::SESSION_NAME][$filterUniqueId]['datasetName'], + // 'description' => $descPGArray, + // 'person_id' => $personId + // )); + // + // if (hasData($result)) + // { + // $this->FiltersModel->update( + // array( + // 'app' => $_SESSION[self::SESSION_NAME][$filterUniqueId]['app'], + // 'dataset_name' => $_SESSION[self::SESSION_NAME][$filterUniqueId]['datasetName'], + // 'description' => $descPGArray, + // 'person_id' => $personId + // ), + // array( + // 'filter' => json_encode($objToBeSaved) + // ) + // ); + // } + // else + // { + // $this->FiltersModel->insert(array( + // 'app' => $_SESSION[self::SESSION_NAME][$filterUniqueId]['app'], + // 'dataset_name' => $_SESSION[self::SESSION_NAME][$filterUniqueId]['datasetName'], + // 'filter_kurzbz' => uniqid($personId, true), + // 'person_id' => $personId, + // 'description' => $descPGArray, + // 'sort' => null, + // 'default_filter' => false, + // 'filter' => json_encode($objToBeSaved), + // 'oe_kurzbz' => null + // )); + // } + // } + // + // /** + // * + // */ + // public function deleteCustomFilter() + // { + // $filter_id = $this->input->post('filter_id'); + // + // if (is_numeric($filter_id)) + // { + // $this->FiltersModel->deleteCustomFilter($filter_id); + // + // $this->output->set_content_type('application/json')->set_output(json_encode('Removed')); + // } + // } + // + // /** + // * + // */ + // public function removeSelectedFields() + // { + // $fieldName = $this->input->post('fieldName'); + // $filterUniqueId = $this->_getFilterUniqueId(); + // + // $session = $this->_readSession($filterUniqueId); + // + // $allSelectedFields = $this->_getFromSession('allSelectedFields'); + // $allColumnsAliases = $this->_getFromSession('allColumnsAliases'); + // + // $selectedFields = $this->_getFromSession('selectedFields'); + // $columnsAliases = $this->_getFromSession('columnsAliases'); + // + // if (($pos = array_search($fieldName, $selectedFields)) !== false) + // { + // array_splice($selectedFields, $pos, 1); + // + // if ($columnsAliases != null && is_array($columnsAliases)) + // { + // array_splice($columnsAliases, $pos, 1); + // } + // } + // + // $_SESSION[self::SESSION_NAME][$filterUniqueId]['selectedFields'] = $selectedFields; + // $_SESSION[self::SESSION_NAME][$filterUniqueId]['columnsAliases'] = $columnsAliases; + // + // $json = new stdClass(); + // + // $json->allSelectedFields = $allSelectedFields; + // $json->allColumnsAliases = $allColumnsAliases; + // $json->selectedFields = $selectedFields; + // $json->columnsAliases = $columnsAliases; + // + // $this->output->set_content_type('application/json')->set_output(json_encode($json)); + // } + // + // /** + // * + // */ + // public function removeSelectedFilters() + // { + // $fieldName = $this->input->post('fieldName'); + // $filterUniqueId = $this->_getFilterUniqueId(); + // + // $session = $this->_readSession($filterUniqueId); + // + // $selectedFilters = $this->_getFromSession('selectedFilters'); + // $selectedFiltersActiveFilters = $this->_getFromSession('activeFilters'); + // $selectedFiltersActiveFiltersOperation = $this->_getFromSession('activeFiltersOperation'); + // $selectedFiltersActiveFiltersOption = $this->_getFromSession('activeFiltersOption'); + // + // if (($pos = array_search($fieldName, $selectedFilters)) !== false) + // { + // array_splice($selectedFilters, $pos, 1); + // array_splice($selectedFiltersActiveFilters, $pos, 1); + // array_splice($selectedFiltersActiveFiltersOperation, $pos, 1); + // array_splice($selectedFiltersActiveFiltersOption, $pos, 1); + // } + // + // $_SESSION[self::SESSION_NAME][$filterUniqueId]['selectedFilters'] = $selectedFilters; + // $_SESSION[self::SESSION_NAME][$filterUniqueId]['activeFilters'] = $selectedFiltersActiveFilters; + // $_SESSION[self::SESSION_NAME][$filterUniqueId]['activeFiltersOperation'] = $selectedFiltersActiveFiltersOperation; + // $_SESSION[self::SESSION_NAME][$filterUniqueId]['activeFiltersOption'] = $selectedFiltersActiveFiltersOption; + // + // $json = new stdClass(); + // + // $json->selectedFilters = $selectedFilters; + // $json->selectedFiltersActiveFilters = $selectedFiltersActiveFilters; + // $json->selectedFiltersActiveFiltersOperation = $selectedFiltersActiveFiltersOperation; + // $json->selectedFiltersActiveFiltersOption = $selectedFiltersActiveFiltersOption; + // + // $this->output->set_content_type('application/json')->set_output(json_encode($json)); + // } + // + // /** + // * + // */ + // public function addSelectedFields() + // { + // $fieldName = $this->input->post('fieldName'); + // $filterUniqueId = $this->_getFilterUniqueId(); + // + // $session = $this->_readSession($filterUniqueId); + // + // $allSelectedFields = $this->_getFromSession('allSelectedFields'); + // $allColumnsAliases = $this->_getFromSession('allColumnsAliases'); + // + // $selectedFields = $this->_getFromSession('selectedFields'); + // $columnsAliases = $this->_getFromSession('columnsAliases'); + // + // if (($pos = array_search($fieldName, $allSelectedFields)) !== false + // && array_search($fieldName, $selectedFields) === false) + // { + // array_push($selectedFields, $fieldName); + // + // if ($columnsAliases != null && is_array($columnsAliases)) + // { + // array_push($columnsAliases, $allColumnsAliases[$pos]); + // } + // } + // + // $_SESSION[self::SESSION_NAME][$filterUniqueId]['selectedFields'] = $selectedFields; + // $_SESSION[self::SESSION_NAME][$filterUniqueId]['columnsAliases'] = $columnsAliases; + // + // $json = new stdClass(); + // + // $json->allSelectedFields = $allSelectedFields; + // $json->allColumnsAliases = $allColumnsAliases; + // $json->selectedFields = $selectedFields; + // $json->columnsAliases = $columnsAliases; + // + // $this->output->set_content_type('application/json')->set_output(json_encode($json)); + // } + // + // /** + // * + // */ + // public function addSelectedFilters() + // { + // $fieldName = $this->input->post('fieldName'); + // $filterUniqueId = $this->_getFilterUniqueId(); + // + // $session = $this->_readSession($filterUniqueId); + // + // $selectedFilters = $this->_getFromSession('selectedFilters'); + // $selectedFiltersActiveFilters = $this->_getFromSession('activeFilters'); + // $selectedFiltersActiveFiltersOperation = $this->_getFromSession('activeFiltersOperation'); + // $selectedFiltersActiveFiltersOption = $this->_getFromSession('activeFiltersOption'); + // + // if (!in_array($fieldName, $selectedFilters)) + // { + // array_push($selectedFilters, $fieldName); + // $selectedFiltersActiveFilters[$fieldName] = ""; + // $selectedFiltersActiveFiltersOperation[$fieldName] = ""; + // $selectedFiltersActiveFiltersOption[$fieldName] = ""; + // } + // + // $_SESSION[self::SESSION_NAME][$filterUniqueId]['selectedFilters'] = $selectedFilters; + // $_SESSION[self::SESSION_NAME][$filterUniqueId]['activeFilters'] = $selectedFiltersActiveFilters; + // $_SESSION[self::SESSION_NAME][$filterUniqueId]['activeFiltersOperation'] = $selectedFiltersActiveFiltersOperation; + // $_SESSION[self::SESSION_NAME][$filterUniqueId]['activeFiltersOption'] = $selectedFiltersActiveFiltersOption; + // + // $json = new stdClass(); + // + // $json->selectedFilters = $selectedFilters; + // $json->selectedFiltersActiveFilters = $selectedFiltersActiveFilters; + // $json->selectedFiltersActiveFiltersOperation = $selectedFiltersActiveFiltersOperation; + // $json->selectedFiltersActiveFiltersOption = $selectedFiltersActiveFiltersOption; + // + // $this->output->set_content_type('application/json')->set_output(json_encode($json)); + // } + // + // /** + // * + // */ + // public function applyFilter() + // { + // $fieldNames = $this->input->post('filterNames'); + // $filterOperations = $this->input->post('filterOperations'); + // $filterOperationValues = $this->input->post('filterOperationValues'); + // $filterOptions = $this->input->post('filterOptions'); + // $filterUniqueId = $this->_getFilterUniqueId(); + // + // $session = $this->_readSession($filterUniqueId); + // + // $activeFilters = array_combine($fieldNames, $filterOperationValues); + // $activeFiltersOperation = array_combine($fieldNames, $filterOperations); + // $activeFiltersOption = array_combine($fieldNames, $filterOptions); + // + // $_SESSION[self::SESSION_NAME][$filterUniqueId]['activeFilters'] = $activeFilters; + // $_SESSION[self::SESSION_NAME][$filterUniqueId]['activeFiltersOperation'] = $activeFiltersOperation; + // $_SESSION[self::SESSION_NAME][$filterUniqueId]['activeFiltersOption'] = $activeFiltersOption; + // + // $json = new stdClass(); + // + // $json->fieldNames = $fieldNames; + // $json->activeFilters = $activeFilters; + // $json->activeFiltersOperation = $activeFiltersOperation; + // $json->activeFiltersOption = $activeFiltersOption; + // + // $this->output->set_content_type('application/json')->set_output(json_encode($json)); + // } } diff --git a/application/core/FHC_Controller.php b/application/core/FHC_Controller.php index fc200d935..b63978f22 100644 --- a/application/core/FHC_Controller.php +++ b/application/core/FHC_Controller.php @@ -20,6 +20,9 @@ class FHC_Controller extends CI_Controller $this->load->helper('fhcauth'); } + //------------------------------------------------------------------------------------------------------------------ + // Public methods + /** * Wrapper to load phrases using the PhrasesLib * NOTE: The library is loaded with the alias 'p', so must me used with this alias in the rest of the code. @@ -30,6 +33,9 @@ class FHC_Controller extends CI_Controller $this->load->library('PhrasesLib', array($categories, $language), 'p'); } + //------------------------------------------------------------------------------------------------------------------ + // Protected methods + /** * Sets the unique id for the called controller * NOTE: it is only working with HTTP GET request, not neeaded with POST @@ -67,4 +73,33 @@ class FHC_Controller extends CI_Controller { return $this->_controllerId; } + + /** + * Utility method to output a success using JSON as content type + * Wraps the private method _outputJson + */ + protected function outputJsonSuccess($mixed) + { + $this->_outputJson(success($mixed)); + } + + /** + * Utility method to output an error using JSON as content type + * Wraps the private method _outputJson + */ + protected function outputJsonError($mixed) + { + $this->_outputJson(error($mixed)); + } + + //------------------------------------------------------------------------------------------------------------------ + // Private methods + + /** + * Utility method to output using JSON as content type + */ + private function _outputJson($mixed) + { + $this->output->set_content_type('application/json')->set_output(json_encode($mixed)); + } } diff --git a/application/libraries/FiltersLib.php b/application/libraries/FiltersLib.php new file mode 100644 index 000000000..c4b846809 --- /dev/null +++ b/application/libraries/FiltersLib.php @@ -0,0 +1,444 @@ +_ci =& get_instance(); + + // Loads helper message to manage returning messages + $this->_ci->load->helper('message'); + + $this->_filterUniqueId = $this->_getFilterUniqueId($params); // sets the id for the related filter widget + } + + //------------------------------------------------------------------------------------------------------------------ + // Public methods + + /** + * Return an unique string that identify this filter widget + * NOTE: The default value is the URI where the FilterWidget is called + * If the fhc_controller_id is present then is also used + */ + private function _getFilterUniqueId($params) + { + // + if ($params != null + && is_array($params) + && isset($params[self::FILTER_PAGE_PARAM]) + && !empty(trim($params[self::FILTER_PAGE_PARAM]))) + { + $filterUniqueId = $params[self::FILTER_PAGE_PARAM]; + } + else + { + // Gets the current page URI + $filterUniqueId = $this->_ci->router->directory.$this->_ci->router->class.'/'.$this->_ci->router->method; + } + + // If the FHC_CONTROLLER_ID parameter is present in the HTTP GET + if (isset($_GET[self::FHC_CONTROLLER_ID])) + { + $filterUniqueId .= '/'.$this->_ci->input->get(self::FHC_CONTROLLER_ID); // then use it + } + elseif (isset($_POST[self::FHC_CONTROLLER_ID])) // else if the FHC_CONTROLLER_ID parameter is present in the HTTP POST + { + $filterUniqueId .= '/'.$this->_ci->input->post(self::FHC_CONTROLLER_ID); // then use it + } + + return $filterUniqueId; + } + + /** + * Returns the whole session for this filter widget if found, otherwise null + */ + public function getSession() + { + $session = null; + + // If it is present a session for this filter + if (isset($_SESSION[self::SESSION_NAME]) && isset($_SESSION[self::SESSION_NAME][$this->_filterUniqueId])) + { + $session = $_SESSION[self::SESSION_NAME][$this->_filterUniqueId]; + } + + return $session; + } + + /** + * Returns one element from the session of this filter widget, otherwise null + */ + public function getElementSession($name) + { + $session = $this->getSession(); // get the whole session for this filter + + if (isset($session[$name])) + { + return $session[$name]; + } + + return null; + } + + /** + * Sets the whole session for this filter widget + */ + public function setSession($data) + { + // If is NOT already present into the session + if (!isset($_SESSION[self::SESSION_NAME]) + || (isset($_SESSION[self::SESSION_NAME]) && !is_array($_SESSION[self::SESSION_NAME]))) + { + $_SESSION[self::SESSION_NAME] = array(); // then create it + } + + $_SESSION[self::SESSION_NAME][$this->_filterUniqueId] = $data; // stores data + } + + /** + * Sets one element of the session of this filter widget + */ + public function setElementSession($name, $value) + { + // If is NOT already present into the session + if (!isset($_SESSION[self::SESSION_NAME]) + || (isset($_SESSION[self::SESSION_NAME]) && !is_array($_SESSION[self::SESSION_NAME]))) + { + $_SESSION[self::SESSION_NAME] = array(); // then create it + } + + // If the session for this filter is NOT already present into the session + if (!isset($_SESSION[self::SESSION_NAME][$this->_filterUniqueId]) + || (isset($_SESSION[self::SESSION_NAME][$this->_filterUniqueId]) + && !is_array($_SESSION[self::SESSION_NAME][$this->_filterUniqueId]))) + { + $_SESSION[self::SESSION_NAME][$this->_filterUniqueId] = array(); // then create it + } + + $_SESSION[self::SESSION_NAME][$this->_filterUniqueId][$name] = $value; // stores the single value + } + + /** + * Loads the definition data from DB for a filter widget + */ + public function loadDefinition($filterId, $app, $datasetName, $filterKurzbz) + { + // Loads the needed models + $this->_ci->load->model('system/Filters_model', 'FiltersModel'); + $this->_ci->load->model('person/Benutzer_model', 'BenutzerModel'); // to get the default custom filter + + $this->_ci->FiltersModel->resetQuery(); // reset any previous built query + + $this->_ci->FiltersModel->addJoin('public.tbl_benutzer', 'person_id', 'LEFT'); // left join with benutzer table + $this->_ci->FiltersModel->addSelect('system.tbl_filters.*'); // select only from table filters + $this->_ci->FiltersModel->addOrder('sort', 'ASC'); // sort on column sort + $this->_ci->FiltersModel->addLimit(1); // if more than one filter is set as default only one will be retrived + + $definition = null; + $whereParameters = null; // where clause parameters + + // If we have a good filterId then use it! + if ($filterId != null && is_numeric($filterId) && $filterId > 0) + { + $whereParameters = array( + 'filter_id' => $filterId + ); + } + else + { + // If we can univocally retrive a filter + if ($app != null && $datasetName != null && $filterKurzbz != null) + { + $whereParameters = array( + 'app' => $app, + 'dataset_name' => $datasetName, + 'filter_kurzbz' => $filterKurzbz + ); + } + // Else if we have only app and datasetName + elseif ($app != null && $datasetName != null && $filterKurzbz == null) + { + // Try to load the custom filter (person_id = logged user person_id) with the given "app" and "dataset_name" + // that is set as default filter (default_filter = true) + $whereParameters = array( + 'app' => $app, + 'dataset_name' => $datasetName, + 'uid' => getAuthUID(), + 'default_filter' => true + ); + + $definition = $this->_ci->FiltersModel->loadWhere($whereParameters); + if (!hasData($definition)) // If a custom filter is NOT found + { + // Try to load the global filter (person_id = null) with the given "app" and "dataset_name" that is set as + // default filter (default_filter = true) + $whereParameters = array( + 'app' => $app, + 'dataset_name' => $datasetName, + 'default_filter' => true + ); + + $definition = $this->_ci->FiltersModel->loadWhere($whereParameters); + } + } + } + + // If no definition where loaded and where parameters were set + if ($definition == null && $whereParameters != null) + { + $definition = $this->_ci->FiltersModel->loadWhere($whereParameters); + } + + return $definition; + } + + /** + * Checks if the json definition of this filter is valid + */ + public function parseFilterJson($definition) + { + $jsonEncodedFilter = null; + + // If the definition contains data and they are valid + if (hasData($definition) && isset($definition->retval[0]->filter) && trim($definition->retval[0]->filter) != '') + { + // Get the json definition of the filter + $tmpJsonEncodedFilter = json_decode($definition->retval[0]->filter); + + // Checks required filter's properies + if (isset($tmpJsonEncodedFilter->name) + && isset($tmpJsonEncodedFilter->columns) + && is_array($tmpJsonEncodedFilter->columns) + && isset($tmpJsonEncodedFilter->filters) + && is_array($tmpJsonEncodedFilter->filters)) + { + $jsonEncodedFilter = $tmpJsonEncodedFilter; + } + } + + return $jsonEncodedFilter; + } + + /** + * Generate the query to retrive the dataset for a filter + * NOTE: filterJson should be already checked using the method parseFilterJson + */ + public function generateDatasetQuery($query, $filterJson) + { + $datasetQuery = null; + + // If the given query is valid and the json of the filter is valid + if (!empty(trim($query)) && $filterJson != null) + { + $definedFilters = $filterJson->filters; + $where = ''; + + for ($filtersCounter = 0; $filtersCounter < count($definedFilters); $filtersCounter++) + { + $filterDefinition = $definedFilters[$filtersCounter]; + + if ($filtersCounter > 0) $where .= ' AND '; + + if (!empty(trim($filterDefinition->name))) + { + $where .= '"'.$filterDefinition->name.'"'.$this->_getDatasetQueryCondition($filterDefinition); + } + } + + if ($where != '') + { + $datasetQuery = 'SELECT * FROM ('.$query.') '.self::DATASET_TABLE_ALIAS.' WHERE '.$where; + } + } + + return $datasetQuery; + } + + /** + * Retrives the dataset from the DB + */ + public function getDataset($datasetQuery) + { + $dataset = null; + + if ($datasetQuery != null) + { + $dataset = @$this->_ci->FiltersModel->execReadOnlyQuery($datasetQuery); + } + + return $dataset; + } + + /** + * Get the filter name, the default is the "name" property of the JSON definition + * If the property namePhrase is present into the JSON definition, then try to load that from the phrases system + * NOTE: filterJson should be already checked using the method parseFilterJson + */ + public function getFilterName($filterJson) + { + $filterName = $filterJson->name; // always present, used as default + + // Filter name from phrases system + if (isset($filterJson->namePhrase) && !empty(trim($filterJson->namePhrase))) + { + // Loads the library to use the phrases system + $this->_ci->load->library('PhrasesLib', array(self::FILTER_PHRASES_CATEGORY)); + + $tmpFilterNamePhrase = $this->_ci->phraseslib->t(self::FILTER_PHRASES_CATEGORY, $filterJson->namePhrase); + if (isset($tmpFilterNamePhrase) && !empty(trim($tmpFilterNamePhrase))) // if is not null or an empty string + { + $filterName = $tmpFilterNamePhrase; + } + } + + return $filterName; + } + + //------------------------------------------------------------------------------------------------------------------ + // Private methods + + /** + * + */ + private function _getDatasetQueryCondition($filterDefinition) + { + $condition = ''; + + if (!empty(trim($filterDefinition->operation))) + { + switch ($filterDefinition->operation) + { + case self::OP_EQUAL: + if (is_numeric($filterDefinition->condition)) $condition = '= '.$filterDefinition->condition; + break; + case self::OP_NOT_EQUAL: + if (is_numeric($filterDefinition->condition)) $condition = '!= '.$filterDefinition->condition; + break; + case self::OP_GREATER_THAN: + if (is_numeric($filterDefinition->condition) + && isset($filterDefinition->option) + && ($filterDefinition->option == self::OPT_DAYS + || $filterDefinition->option == self::OPT_MONTHS)) + { + $condition = '< (NOW() - \''.$filterDefinition->condition.' '.$filterDefinition->option.'\'::interval)'; + } + else + { + $condition = '> '.$filterDefinition->condition; + } + break; + case self::OP_LESS_THAN: + if (is_numeric($filterDefinition->condition) + && isset($filterDefinition->option) + && ($filterDefinition->option == self::OPT_DAYS + || $filterDefinition->option == self::OPT_MONTHS)) + { + $condition = '> (NOW() - \''.$filterDefinition->condition.' '.$filterDefinition->option.'\'::interval)'; + } + else + { + $condition = '< '.$filterDefinition->condition; + } + break; + case self::OP_CONTAINS: + $condition = 'ILIKE \'%'.$this->_ci->FiltersModel->escapeLike($filterDefinition->condition).'%\''; + break; + case self::OP_NOT_CONTAINS: + $condition = 'NOT ILIKE \'%'.$this->_ci->FiltersModel->escapeLike($filterDefinition->condition).'%\''; + break; + case self::OP_IS_TRUE: + $condition = 'IS TRUE'; + break; + case self::OP_IS_FALSE: + $condition = 'IS FALSE'; + break; + case self::OP_SET: + $condition = 'IS NOT NULL'; + break; + case self::OP_NOT_SET: + $condition = 'IS NULL'; + break; + default: + $condition = 'IS NOT NULL'; + break; + } + } + + if (!empty(trim($condition))) $condition = ' '.$condition; + + return $condition; + } +} diff --git a/application/views/system/infocenter/infocenterData.php b/application/views/system/infocenter/infocenterData.php index 5ba35ed2d..807e8c45b 100755 --- a/application/views/system/infocenter/infocenterData.php +++ b/application/views/system/infocenter/infocenterData.php @@ -151,7 +151,7 @@ ),\', \' ) AS "StgAktiv", pl.zeitpunkt AS "LockDate", - pl.lockuser as "LockUser", + pl.lockuser AS "LockUser", pd.parkdate AS "ParkDate" FROM public.tbl_person p LEFT JOIN (SELECT person_id, zeitpunkt, uid as lockuser FROM system.tbl_person_lock WHERE app = \''.$APP.'\') pl USING(person_id) @@ -299,18 +299,9 @@ } ); - $filterId = isset($_GET[InfoCenter::FILTER_ID]) ? $_GET[InfoCenter::FILTER_ID] : null; - - if (isset($filterId) && is_numeric($filterId)) - { - $filterWidgetArray[InfoCenter::FILTER_ID] = $filterId; - } - else - { - $filterWidgetArray['app'] = $APP; - $filterWidgetArray['datasetName'] = 'PersonActions'; - $filterWidgetArray['filterKurzbz'] = 'InfoCenterNotSentApplicationAll'; - } + $filterWidgetArray[InfoCenter::FILTER_ID] = $this->input->get(InfoCenter::FILTER_ID); + $filterWidgetArray['app'] = $APP; + $filterWidgetArray['datasetName'] = 'PersonActions'; echo $this->widgetlib->widget('FilterWidget', $filterWidgetArray); ?> diff --git a/application/views/widgets/filter/filter.php b/application/views/widgets/filter/filter.php index ef5da3c6c..8f1c5b4f3 100644 --- a/application/views/widgets/filter/filter.php +++ b/application/views/widgets/filter/filter.php @@ -1,9 +1,7 @@
-
- -
+

diff --git a/application/widgets/FilterWidget.bak.php b/application/widgets/FilterWidget.bak.php new file mode 100644 index 000000000..fe74a661f --- /dev/null +++ b/application/widgets/FilterWidget.bak.php @@ -0,0 +1,1231 @@ +_initFilterWidget($args); // + + $this->_initSession(); // + + // + $this->load->model('system/Filters_model', 'FiltersModel'); + $this->load->model('person/Benutzer_model', 'BenutzerModel'); + + self::$FilterWidgetInstance = $this; + } + + /** + * + */ + public function display($widgetData) + { + // + $filterSessionArray = $this->_readSession(); + + // + if ($this->filterId == null && isset($filterSessionArray[self::FILTER_ID])) + { + $this->filterId = $filterSessionArray[self::FILTER_ID]; + } + + // + if ($this->filterName == null && isset($filterSessionArray[self::FILTER_NAME])) + { + $this->filterName = $filterSessionArray[self::FILTER_NAME]; + } + + if ($this->filterNamePhrase == null && isset($filterSessionArray[self::FILTER_NAME_PHRASE])) + { + $this->filterNamePhrase = $filterSessionArray[self::FILTER_NAME_PHRASE]; + } + + // + if ($this->filterId <= 0 || $filterSessionArray[self::FILTER_ID] != $this->filterId) + { + // + $this->_loadFilter(); + } + + // + $this->_setSessionFilterData(); + + // + $this->FiltersModel->resetQuery(); + + $query = $this->_generateQuery(); + if ($query != null) + { + // + $this->dataset = @$this->FiltersModel->execReadOnlyQuery($query); + + // + $this->listFields = $this->FiltersModel->getExecutedQueryListFields(); + + // + $selectedFields = array(); + $filterSessionArray = $this->_readSession(); + if (isset($filterSessionArray[self::SELECTED_FIELDS])) + { + $selectedFields = $filterSessionArray[self::SELECTED_FIELDS]; + } + + // + if (count($selectedFields) == 0) + { + $filterSessionArray[self::SELECTED_FIELDS] = $this->listFields; + } + + // + if ($this->columnsAliases != null && count($this->listFields) != count($this->columnsAliases)) + { + show_error('Parameter columnsAliases does not have a number of items equal to those returned by the query'); + } + + $filterSessionArray[self::COLUMNS_ALIASES] = $this->_getColumnAliasesFromPost(); + $filterSessionArray[self::CHECKBOXES] = $this->checkboxes; + + if ($this->app != null) + { + $filterSessionArray[self::APP_PARAMETER] = $this->app; + } + + if ($this->datasetName != null) + { + $filterSessionArray[self::DATASET_NAME_PARAMETER] = $this->datasetName; + } + + $filterSessionArray[self::ALL_SELECTED_FIELDS] = $this->listFields; + $filterSessionArray[self::ALL_COLUMNS_ALIASES] = $this->columnsAliases; + + /* ------------------------------------------------------------ */ + + $tmpDataset = null; + if (hasData($this->dataset)) + { + $tmpDataset = array(); + + for ($resultsCounter = 0; $resultsCounter < count($this->dataset->retval); $resultsCounter++) + { + $result = $this->dataset->retval[$resultsCounter]; + + $class = $this->_markRow($result); + $formattedResult = $this->_formatRaw($result); + $formattedResult->FILTER_CLASS_MARK_ROW = $class; + $tmpDataset[] = $formattedResult; + } + } + + $filterSessionArray[self::DATASET_PARAMETER] = $tmpDataset; + + /* ------------------------------------------------------------ */ + + // + $this->metaData = $this->FiltersModel->getExecutedQueryMetaData(); + + $filterSessionArray[self::METADATA_PARAMETER] = $this->metaData; + } + + $this->_writeSession($filterSessionArray); + + // + $this->loadViewFilters(); + } + + /** + * + */ + public static function getSelectedFilters() + { + return self::_getFromSession(self::SELECTED_FILTERS); + } + + /** + * + */ + public static function getColumnsAliases() + { + return self::_getFromSession(self::COLUMNS_ALIASES); + } + + /** + * + */ + public static function loadViewSelectFields() + { + if (self::$FilterWidgetInstance->hideHeader != true) + { + self::_loadView(self::WIDGET_URL_SELECT_FIELDS); + } + } + + /** + * + */ + public static function loadViewSelectFilters() + { + if (self::$FilterWidgetInstance->hideHeader != true) + { + self::_loadView(self::WIDGET_URL_SELECT_FILTERS); + } + } + + /** + * + */ + public static function loadViewSaveFilter() + { + if (self::$FilterWidgetInstance->hideSave != true) + { + self::_loadView(self::WIDGET_URL_SAVE_FILTER); + } + } + + /** + * + */ + public static function loadViewTableDataset() + { + self::_loadView(self::WIDGET_URL_TABLE_DATASET); + } + + /** + * + */ + private function _formatRaw($datasetRaw) + { + $tmpDatasetRaw = clone $datasetRaw; + + foreach ($tmpDatasetRaw as $columnName => $columnValue) + { + if (is_bool($columnValue)) + { + $tmpDatasetRaw->{$columnValue} = $columnValue === true ? 'true' : 'false'; + } + elseif (DateTime::createFromFormat('Y-m-d G:i:s', $columnValue) !== false) + { + $tmpDatasetRaw->{$columnValue} = date(self::DEFAULT_DATE_FORMAT, strtotime($columnValue)); + } + } + + if ($this->formatRaw != null) + { + $formatRaw = $this->formatRaw; + $tmpDatasetRaw = $formatRaw($tmpDatasetRaw); + } + + return $tmpDatasetRaw; + } + + /** + * + */ + private function _markRow($datasetRaw) + { + if (is_object($datasetRaw)) + { + if ($this->markRow != null) + { + $markRow = $this->markRow; + $class = $markRow($datasetRaw); + } + } + + return $class == null ? '' : $class; + } + + /** + * + */ + public static function displayFilterName() + { + if (self::$FilterWidgetInstance->filterNamePhrase != null && self::$FilterWidgetInstance->filterNamePhrase != '') + { + echo self::$FilterWidgetInstance->filterNamePhrase; + } + elseif (self::$FilterWidgetInstance->filterName != null && self::$FilterWidgetInstance->filterName != '') + { + echo self::$FilterWidgetInstance->filterName; + } + } + + //------------------------------------------------------------------------------------------------------------------ + // Protected + + /** + * + */ + protected function loadViewFilters() + { + // Loads views + $this->view(self::WIDGET_URL_FILTER); + } + + //------------------------------------------------------------------------------------------------------------------ + // Private + + /** + * + */ + private static function _getFromSession($key) + { + $_getFromSession = null; + $ci =& get_instance(); + $filterSessionArray = $ci->session->userdata(self::SESSION_NAME); + + if (isset($filterSessionArray[$key])) + { + $_getFromSession = $filterSessionArray[$key]; + } + + return $_getFromSession; + } + + /** + * + */ + private static function _getActiveFilterValue($filterName) + { + $getActiveFilterValue = ''; + + $activeFields = self::_getFromSession(self::ACTIVE_FILTERS); + + if (isset($activeFields[$filterName])) + { + $getActiveFilterValue = $activeFields[$filterName]; + } + + return $getActiveFilterValue; + } + + /** + * + */ + private static function _getActiveFilterOperationValue($filterName) + { + $getActiveFilterOperationValue = ''; + + $activeFieldsOperation = self::_getFromSession(self::ACTIVE_FILTERS_OPERATION); + + if (isset($activeFieldsOperation[$filterName])) + { + $getActiveFilterOperationValue = $activeFieldsOperation[$filterName]; + } + + return $getActiveFilterOperationValue; + } + + /** + * + */ + private static function _getActiveFilterOptionValue($filterName) + { + $getActiveFilterOptionValue = ''; + + $activeFieldsOption = self::_getFromSession(self::ACTIVE_FILTERS_OPTION); + + if (isset($activeFieldsOption[$filterName])) + { + $getActiveFilterOptionValue = $activeFieldsOption[$filterName]; + } + + return $getActiveFilterOptionValue; + } + + /** + * + */ + private static function _loadView($viewName, $parameters = null) + { + $ci =& get_instance(); + $ci->load->view($viewName, $parameters); + } + + /** + * + */ + private function _initSession() + { + $filterSessionArray = array(); + + $session = $this->_readSession(); + + if (count($session) > 0) + { + $filterSessionArray = $session; + } + + if (!isset($filterSessionArray[self::SELECTED_FIELDS])) + { + $filterSessionArray[self::SELECTED_FIELDS] = array(); + } + + if (!isset($filterSessionArray[self::SELECTED_FILTERS])) + { + $filterSessionArray[self::SELECTED_FILTERS] = array(); + } + + if (!isset($filterSessionArray[self::ACTIVE_FILTERS])) + { + $filterSessionArray[self::ACTIVE_FILTERS] = array(); + } + + if (!isset($filterSessionArray[self::ACTIVE_FILTERS_OPERATION])) + { + $filterSessionArray[self::ACTIVE_FILTERS_OPERATION] = array(); + } + + if (!isset($filterSessionArray[self::ACTIVE_FILTERS_OPTION])) + { + $filterSessionArray[self::ACTIVE_FILTERS_OPTION] = array(); + } + + if (!isset($filterSessionArray[self::ADDITIONAL_COLUMNS])) + { + $filterSessionArray[self::ADDITIONAL_COLUMNS] = array(); + } + + if (!isset($filterSessionArray[self::FILTER_ID])) + { + $filterSessionArray[self::FILTER_ID] = -1; + } + + if (!isset($filterSessionArray[self::COLUMNS_ALIASES])) + { + $filterSessionArray[self::COLUMNS_ALIASES] = array(); + } + + if (!isset($filterSessionArray[self::FILTER_NAME])) + { + $filterSessionArray[self::FILTER_NAME] = null; + } + + if (!isset($filterSessionArray[self::APP_PARAMETER])) + { + $filterSessionArray[self::APP_PARAMETER] = null; + } + + if (!isset($filterSessionArray[self::DATASET_NAME_PARAMETER])) + { + $filterSessionArray[self::DATASET_NAME_PARAMETER] = null; + } + + $this->_writeSession($filterSessionArray); + } + + /** + * + */ + private function _initFilterWidget($args) + { + $this->app = null; + $this->query = null; + $this->datasetName = null; + $this->filterKurzbz = null; + $this->filterId = null; + $this->additionalColumns = null; + $this->formatRaw = null; + $this->markRow = null; + $this->checkboxes = null; + $this->hideHeader = false; + $this->hideSave = false; + $this->columnsAliases = null; + $this->filterName = null; + $this->filterNamePhrase = null; + + $this->filterUniqueId = $this->_getFilterUniqueId(); + + if (!is_array($args) || (is_array($args) && count($args) == 0)) + { + show_error('Second parameter must be a not empty associative array'); + } + else + { + if (( + !isset($args[self::APP_PARAMETER]) + && !isset($args[self::DATASET_NAME_PARAMETER]) + && !isset($args[self::FILTER_KURZBZ]) + ) + && !isset($args[self::FILTER_ID])) + { + show_error('At least one parameters must be specified 1'); + } + else + { + if (!isset($args[self::QUERY_PARAMETER]) && !isset($args[self::DB_RESULT])) + { + show_error('At least one parameters must be specified 2'); + } + else + { + if (isset($args[self::APP_PARAMETER]) + && isset($args[self::DATASET_NAME_PARAMETER]) + && isset($args[self::FILTER_KURZBZ])) + { + $this->app = $args[self::APP_PARAMETER]; + $this->datasetName = $args[self::DATASET_NAME_PARAMETER]; + $this->filterKurzbz = $args[self::FILTER_KURZBZ]; + } + else + { + $this->filterId = $args[self::FILTER_ID]; + } + + if (isset($args[self::QUERY_PARAMETER])) + { + $this->query = $args[self::QUERY_PARAMETER]; + } + elseif (isset($args[self::DB_RESULT])) + { + $this->query = $args[self::DB_RESULT]; + } + } + } + + if (isset($args[self::ADDITIONAL_COLUMNS]) + && is_array($args[self::ADDITIONAL_COLUMNS]) + && count($args[self::ADDITIONAL_COLUMNS]) > 0) + { + $this->additionalColumns = $args[self::ADDITIONAL_COLUMNS]; + } + + if (isset($args[self::FORMAT_RAW]) && is_callable($args[self::FORMAT_RAW])) + { + $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::CHECKBOXES])) + { + $this->checkboxes = $args[self::CHECKBOXES]; + } + + if (isset($args[self::HIDE_HEADER]) && is_bool($args[self::HIDE_HEADER])) + { + $this->hideHeader = $args[self::HIDE_HEADER]; + } + + if (isset($args[self::HIDE_SAVE]) && is_bool($args[self::HIDE_SAVE])) + { + $this->hideSave = $args[self::HIDE_SAVE]; + } + + if (isset($args[self::COLUMNS_ALIASES]) + && is_array($args[self::COLUMNS_ALIASES]) + && count($args[self::COLUMNS_ALIASES]) > 0) + { + $this->columnsAliases = $args[self::COLUMNS_ALIASES]; + } + } + } + + /** + * + */ + private function _loadFilter() + { + // + $this->FiltersModel->resetQuery(); + + // + $this->FiltersModel->addJoin('public.tbl_benutzer', 'person_id', 'LEFT'); + + // + $this->FiltersModel->addSelect('system.tbl_filters.*'); + + // + $this->FiltersModel->addOrder('sort', 'ASC'); + + // + $this->FiltersModel->addLimit(1); + + $whereParameters = null; + + if ($this->filterId <= 0) + { + // Try to load the custom filter (person_id = logged user person_id) with the given "app" and "dataset_name" + // that is set as default filter (default_filter = true) + $whereParameters = array( + 'app' => $this->app, + 'dataset_name' => $this->datasetName, + 'uid' => getAuthUID(), + 'default_filter' => true + ); + } + else + { + $whereParameters = array( + 'filter_id' => $this->filterId + ); + } + + // + $filter = $this->FiltersModel->loadWhere($whereParameters); + + $jsonEncodedFilter = null; + + if (hasData($filter)) + { + if (isset($filter->retval[0]->filter) && trim($filter->retval[0]->filter) != '') + { + $jsonEncodedFilter = json_decode($filter->retval[0]->filter); + } + } + else // Try to load the global filter (person_id = null) with the given "app" and "dataset_name" that is set as + // default filter (default_filter = true) + { + $whereParameters = array( + 'app' => $this->app, + 'dataset_name' => $this->datasetName, + 'default_filter' => true + ); + + $filter = $this->FiltersModel->loadWhere($whereParameters); + if (hasData($filter)) + { + if (isset($filter->retval[0]->filter) && trim($filter->retval[0]->filter) != '') + { + $jsonEncodedFilter = json_decode($filter->retval[0]->filter); + } + } + } + + if ($jsonEncodedFilter != null) + { + $selectedFields = array(); + $selectedFilters = array(); + $activeFilters = array(); + $activeFiltersOperation = array(); + $activeFiltersOption = array(); + $filterName = null; + $filterNamePhrase = null; + + if (isset($jsonEncodedFilter->columns)) + { + $columns = $jsonEncodedFilter->columns; + + for($columnsCounter = 0; $columnsCounter < count($columns); $columnsCounter++) + { + if (isset($columns[$columnsCounter]->name)) + { + $selectedFields[] = $columns[$columnsCounter]->name; + } + } + } + + if (isset($jsonEncodedFilter->filters)) + { + $filters = $jsonEncodedFilter->filters; + + for($filtersCounter = 0; $filtersCounter < count($filters); $filtersCounter++) + { + if (isset($filters[$filtersCounter]->name)) + { + $selectedFilters[] = $filters[$filtersCounter]->name; + $activeFilters[$filters[$filtersCounter]->name] = $filters[$filtersCounter]->condition; + $activeFiltersOperation[$filters[$filtersCounter]->name] = $filters[$filtersCounter]->operation; + if (isset($filters[$filtersCounter]->option)) + { + $activeFiltersOption[$filters[$filtersCounter]->name] = $filters[$filtersCounter]->option; + } + } + } + } + + if (isset($jsonEncodedFilter->name)) + { + $filterName = $jsonEncodedFilter->name; + } + + // Filter name from phrases system + if (isset($jsonEncodedFilter->namePhrase)) + { + $this->load->library('PhrasesLib', array('FilterWidget')); + $filterNamePhrase = $this->phraseslib->t('FilterWidget', $jsonEncodedFilter->namePhrase); + } + + $this->filterName = $filterName; + $this->filterNamePhrase = $filterNamePhrase; + $this->app = $filter->retval[0]->app; + + $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::FILTER_NAME => $filterName, + self::APP_PARAMETER => $filter->retval[0]->app, + self::DATASET_NAME_PARAMETER => $filter->retval[0]->dataset_name + ); + + $this->_writeSession($filterSessionArray); + } + else + { + $filterSessionArray = array( + self::SELECTED_FIELDS => array(), + self::SELECTED_FILTERS => array(), + self::ACTIVE_FILTERS => array(), + self::ACTIVE_FILTERS_OPERATION => array(), + self::ACTIVE_FILTERS_OPTION => array(), + self::FILTER_NAME => null, + self::APP_PARAMETER => null, + self::DATASET_NAME_PARAMETER => null + ); + + $this->_writeSession($filterSessionArray); + } + } + + /** + * + */ + private function _saveFilter() + { + if (isset($_POST['saveCustomFilter']) && $_POST['saveCustomFilter'] == 'true') + { + $objToBeSaved = new stdClass(); + + $filterSessionArray = $this->_readSession(); + + if (isset($filterSessionArray[self::SELECTED_FIELDS])) + { + $selectedFields = $filterSessionArray[self::SELECTED_FIELDS]; + $objToBeSaved->columns = array(); + + for ($selectedFieldsCounter = 0; $selectedFieldsCounter < count($selectedFields); $selectedFieldsCounter++) + { + $objToBeSaved->columns[$selectedFieldsCounter] = new stdClass(); + $objToBeSaved->columns[$selectedFieldsCounter]->name = $selectedFields[$selectedFieldsCounter]; + } + } + + if (isset($filterSessionArray[self::SELECTED_FILTERS])) + { + $selectedFilters = $filterSessionArray[self::SELECTED_FILTERS]; + $objToBeSaved->filters = array(); + + for ($selectedFiltersCounter = 0; $selectedFiltersCounter < count($selectedFilters); $selectedFiltersCounter++) + { + $objToBeSaved->filters[$selectedFiltersCounter] = new stdClass(); + $objToBeSaved->filters[$selectedFiltersCounter]->name = $selectedFilters[$selectedFiltersCounter]; + + if (isset($filterSessionArray[self::ACTIVE_FILTERS]) + && isset($filterSessionArray[self::ACTIVE_FILTERS][$selectedFilters[$selectedFiltersCounter]])) + { + $objToBeSaved->filters[$selectedFiltersCounter]->condition = $filterSessionArray[self::ACTIVE_FILTERS][$selectedFilters[$selectedFiltersCounter]]; + } + + if (isset($filterSessionArray[self::ACTIVE_FILTERS_OPERATION]) + && isset($filterSessionArray[self::ACTIVE_FILTERS_OPERATION][$selectedFilters[$selectedFiltersCounter]])) + { + $objToBeSaved->filters[$selectedFiltersCounter]->operation = $filterSessionArray[self::ACTIVE_FILTERS_OPERATION][$selectedFilters[$selectedFiltersCounter]]; + } + + if (isset($filterSessionArray[self::ACTIVE_FILTERS_OPTION]) + && isset($filterSessionArray[self::ACTIVE_FILTERS_OPTION][$selectedFilters[$selectedFiltersCounter]])) + { + $objToBeSaved->filters[$selectedFiltersCounter]->option = $filterSessionArray[self::ACTIVE_FILTERS_OPTION][$selectedFilters[$selectedFiltersCounter]]; + } + } + } + + $desc = $_POST['customFilterDescription']; + $descPGArray = '{"'.$desc.'", "'.$desc.'", "'.$desc.'", "'.$desc.'"}'; + + $resultBenutzer = $this->BenutzerModel->load(getAuthUID()); + $personId = $resultBenutzer->retval[0]->person_id; + + $result = $this->FiltersModel->loadWhere(array( + 'app' => $this->app, + 'dataset_name' => $this->datasetName, + 'description' => $descPGArray, + 'person_id' => $personId + )); + + if (hasData($result)) + { + $this->FiltersModel->update( + array( + 'app' => $this->app, + 'dataset_name' => $this->datasetName, + 'description' => $descPGArray, + 'person_id' => $personId + ), + array( + 'filter' => json_encode($objToBeSaved) + ) + ); + } + else + { + $this->FiltersModel->insert(array( + 'app' => $this->app, + 'dataset_name' => $this->datasetName, + 'filter_kurzbz' => uniqid($personId, true), + 'person_id' => $personId, + 'description' => $descPGArray, + 'sort' => null, + 'default_filter' => false, + 'filter' => json_encode($objToBeSaved), + 'oe_kurzbz' => null + )); + } + } + } + + /** + * + */ + private function _getSelectedFieldsFromPost() + { + // Selected fields + $selectedFields = array(); + + $filterSessionArray = $this->_readSession(); + if (isset($filterSessionArray[self::SELECTED_FIELDS])) + { + $selectedFields = $filterSessionArray[self::SELECTED_FIELDS]; + } + + return $selectedFields; + } + + /** + * + */ + private function _getAppFromPost() + { + $app = $this->app; + + $filterSessionArray = $this->_readSession(); + if (isset($filterSessionArray[self::APP_PARAMETER])) + { + $app = $filterSessionArray[self::APP_PARAMETER]; + } + + return $app; + } + + /** + * + */ + private function _getDatasetFromPost() + { + $datasetName = $this->datasetName; + + $filterSessionArray = $this->_readSession(); + if (isset($filterSessionArray[self::DATASET_NAME_PARAMETER])) + { + $datasetName = $filterSessionArray[self::DATASET_NAME_PARAMETER]; + } + + return $datasetName; + } + + /** + * + */ + private function _getColumnAliasesFromPost() + { + $columnsAliases = $this->columnsAliases; + $selectedFields = array(); + + $filterSessionArray = $this->_readSession(); + + if (isset($filterSessionArray[self::SELECTED_FIELDS])) + { + $selectedFields = $filterSessionArray[self::SELECTED_FIELDS]; + } + + if (isset($this->listFields) && count($selectedFields) > 0 && is_array($this->columnsAliases) && count($this->columnsAliases) > 0) + { + $columnsAliases = array(); + + for ($i = 0; $i < count($selectedFields); $i++) + { + if (($pos = array_search($selectedFields[$i], $this->listFields)) !== false) + { + $columnsAliases[] = $this->columnsAliases[$pos]; + } + } + } + + return $columnsAliases; + } + + /** + * + */ + private function _getSelectedFiltersFromPost() + { + // Selected filters + $selectedFilters = array(); + + $filterSessionArray = $this->_readSession(); + if (isset($filterSessionArray[self::SELECTED_FILTERS])) + { + $selectedFilters = $filterSessionArray[self::SELECTED_FILTERS]; + } + + return $selectedFilters; + } + + /** + * + */ + private function _setActiveFiltersFromPost(&$activeFilters, &$activeFiltersOperation, &$activeFiltersOption) + { + $selectedFilters = array(); + $filterSessionArray = $this->_readSession(); + + if (isset($filterSessionArray[self::ACTIVE_FILTERS])) + { + $activeFilters = $filterSessionArray[self::ACTIVE_FILTERS]; + } + + if (isset($filterSessionArray[self::ACTIVE_FILTERS_OPERATION])) + { + $activeFiltersOperation = $filterSessionArray[self::ACTIVE_FILTERS_OPERATION]; + } + + if (isset($filterSessionArray[self::ACTIVE_FILTERS_OPTION])) + { + $activeFiltersOption = $filterSessionArray[self::ACTIVE_FILTERS_OPTION]; + } + + if (isset($filterSessionArray[self::SELECTED_FILTERS])) + { + $selectedFilters = $filterSessionArray[self::SELECTED_FILTERS]; + } + + if (is_array($_POST)) + { + if (array_key_exists(self::CMD_REMOVE_FILTER, $_POST) && trim($_POST[self::CMD_REMOVE_FILTER]) != '') + { + if (isset($activeFilters[$_POST[self::CMD_REMOVE_FILTER]])) + { + unset($activeFilters[$_POST[self::CMD_REMOVE_FILTER]]); + } + + if (isset($activeFiltersOperation[$_POST[self::CMD_REMOVE_FILTER]])) + { + unset($activeFiltersOperation[$_POST[self::CMD_REMOVE_FILTER]]); + } + + if (isset($activeFiltersOption[$_POST[self::CMD_REMOVE_FILTER]])) + { + unset($activeFiltersOption[$_POST[self::CMD_REMOVE_FILTER]]); + } + } + else + { + for ($selectedFiltersCounter = 0; $selectedFiltersCounter < count($selectedFilters); $selectedFiltersCounter++) + { + $selectedFilter = $selectedFilters[$selectedFiltersCounter]; + + if (isset($_POST[$selectedFilter])) + { + $activeFilters[$selectedFilter] = $_POST[$selectedFilter]; + } + + if (isset($_POST[$selectedFilter.self::ACTIVE_FILTER_OPERATION_POSTFIX])) + { + $activeFiltersOperation[$selectedFilter] = $_POST[$selectedFilter.self::ACTIVE_FILTER_OPERATION_POSTFIX]; + } + + if (isset($_POST[$selectedFilter.self::ACTIVE_FILTER_OPTION_POSTFIX])) + { + $activeFiltersOption[$selectedFilter] = $_POST[$selectedFilter.self::ACTIVE_FILTER_OPTION_POSTFIX]; + } + } + } + } + } + + /** + * + */ + private function _setSessionFilterData() + { + $session = $this->_readSession(); + + $filterSessionArray = array( + self::SELECTED_FIELDS => $this->_getSelectedFieldsFromPost(), + self::SELECTED_FILTERS => $this->_getSelectedFiltersFromPost(), + self::ADDITIONAL_COLUMNS => $this->additionalColumns, + self::COLUMNS_ALIASES => $this->_getColumnAliasesFromPost(), + self::APP_PARAMETER => $this->_getAppFromPost(), + self::DATASET_NAME_PARAMETER => $this->_getDatasetFromPost() + ); + + $filterSessionArray[self::ACTIVE_FILTERS] = array(); + $filterSessionArray[self::ACTIVE_FILTERS_OPERATION] = array(); + $filterSessionArray[self::ACTIVE_FILTERS_OPTION] = array(); + + $this->_setActiveFiltersFromPost( + $filterSessionArray[self::ACTIVE_FILTERS], + $filterSessionArray[self::ACTIVE_FILTERS_OPERATION], + $filterSessionArray[self::ACTIVE_FILTERS_OPTION] + ); + + $filterSessionArray[self::FILTER_ID] = $this->filterId; + $filterSessionArray[self::FILTER_NAME] = $this->filterName; + $filterSessionArray[self::FILTER_NAME_PHRASE] = $this->filterNamePhrase; + + $this->_writeSession(array_merge($session, $filterSessionArray)); + } + + /** + * + */ + private function _generateQuery() + { + $query = null;//$this->query; + + $activeFilters = array(); + $activeFiltersOperation = array(); + $activeFiltersOption = array(); + + $filterSessionArray = $this->_readSession(); + + if (isset($filterSessionArray[self::ACTIVE_FILTERS])) + { + $activeFilters = $filterSessionArray[self::ACTIVE_FILTERS]; + } + + if (isset($filterSessionArray[self::ACTIVE_FILTERS_OPERATION])) + { + $activeFiltersOperation = $filterSessionArray[self::ACTIVE_FILTERS_OPERATION]; + } + + if (isset($filterSessionArray[self::ACTIVE_FILTERS_OPTION])) + { + $activeFiltersOption = $filterSessionArray[self::ACTIVE_FILTERS_OPTION]; + } + + // + if (count($activeFilters) > 0) + { + $where = ''; + $first = true; + + foreach ($activeFilters as $field => $activeFilterValue) + { + if ($first) + { + $first = false; + } + else + { + $where .= ' AND '; + } + + if (isset($activeFiltersOperation[$field])) + { + $where .= '"'.$field.'"'; + $condition = ''; + + switch ($activeFiltersOperation[$field]) + { + case self::OP_EQUAL: + if (!is_numeric($activeFilterValue)) $activeFilterValue = 0; + $condition = ' = '.$activeFilterValue; + break; + case self::OP_NOT_EQUAL: + if (!is_numeric($activeFilterValue)) $activeFilterValue = 0; + $condition = ' != '.$activeFilterValue; + break; + case self::OP_GREATER_THAN: + if (!is_numeric($activeFilterValue)) $activeFilterValue = 0; + if (isset($activeFiltersOption[$field]) + && ($activeFiltersOption[$field] == self::OPT_DAYS + || $activeFiltersOption[$field] == self::OPT_MONTHS)) + { + $condition = ' < (NOW() - \''.$activeFilterValue.' '.$activeFiltersOption[$field].'\'::interval)'; + } + else + { + $condition = ' > '.$activeFilterValue; + } + + break; + case self::OP_LESS_THAN: + if (!is_numeric($activeFilterValue)) $activeFilterValue = 0; + if (isset($activeFiltersOption[$field]) + && ($activeFiltersOption[$field] == self::OPT_DAYS + || $activeFiltersOption[$field] == self::OPT_MONTHS)) + { + $condition = ' > (NOW() - \''.$activeFilterValue.' '.$activeFiltersOption[$field].'\'::interval)'; + } + else + { + $condition = ' < '.$activeFilterValue; + } + 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: + $condition = ' IS TRUE'; + break; + case self::OP_IS_FALSE: + $condition = ' IS FALSE'; + break; + case self::OP_SET: + $condition = ' IS NOT NULL'; + break; + case self::OP_NOT_SET: + $condition = ' IS NULL'; + break; + default: + $condition = ' IS NOT NULL'; + break; + } + + $where .= $condition; + } + } + + if ($where != '') + { + $query = 'SELECT * FROM ('.$this->query.') tableFilters WHERE '.$where; + } + } + + return $query; + } + + /** + * + */ + private function _readSession() + { + if (isset($_SESSION[self::SESSION_NAME]) && isset($_SESSION[self::SESSION_NAME][$this->filterUniqueId])) + return $_SESSION[self::SESSION_NAME][$this->filterUniqueId]; + + return array(); + } + + /** + * + */ + private function _writeSession($data) + { + if (!isset($_SESSION[self::SESSION_NAME]) + || (isset($_SESSION[self::SESSION_NAME]) && !is_array($_SESSION[self::SESSION_NAME]))) + { + $_SESSION[self::SESSION_NAME] = array(); + } + + $_SESSION[self::SESSION_NAME][$this->filterUniqueId] = $data; + } + + /** + * + */ + private function _getFilterUniqueId() + { + return $this->router->directory.$this->router->class.'/'.$this->router->method.'/'.$this->input->get('fhc_controller_id'); + } +} diff --git a/application/widgets/FilterWidget.php b/application/widgets/FilterWidget.php index fe74a661f..480126a94 100644 --- a/application/widgets/FilterWidget.php +++ b/application/widgets/FilterWidget.php @@ -1,1231 +1,340 @@ _initFilterWidget($args); // + self::$_FilterWidgetInstance = $this; // set static property $_FilterWidgetInstance with this instance - $this->_initSession(); // + $this->load->library('FiltersLib'); // Loads the FiltersLib that contains all the used logic - // - $this->load->model('system/Filters_model', 'FiltersModel'); - $this->load->model('person/Benutzer_model', 'BenutzerModel'); + $this->_initFilterWidget($args); // checks parameters and initialize properties - self::$FilterWidgetInstance = $this; + $this->_startFilterWidget(); // let's start } + //------------------------------------------------------------------------------------------------------------------ + // Public methods + /** - * + * Called when echoing the filter widget call */ public function display($widgetData) { - // - $filterSessionArray = $this->_readSession(); - - // - if ($this->filterId == null && isset($filterSessionArray[self::FILTER_ID])) - { - $this->filterId = $filterSessionArray[self::FILTER_ID]; - } - - // - if ($this->filterName == null && isset($filterSessionArray[self::FILTER_NAME])) - { - $this->filterName = $filterSessionArray[self::FILTER_NAME]; - } - - if ($this->filterNamePhrase == null && isset($filterSessionArray[self::FILTER_NAME_PHRASE])) - { - $this->filterNamePhrase = $filterSessionArray[self::FILTER_NAME_PHRASE]; - } - - // - if ($this->filterId <= 0 || $filterSessionArray[self::FILTER_ID] != $this->filterId) - { - // - $this->_loadFilter(); - } - - // - $this->_setSessionFilterData(); - - // - $this->FiltersModel->resetQuery(); - - $query = $this->_generateQuery(); - if ($query != null) - { - // - $this->dataset = @$this->FiltersModel->execReadOnlyQuery($query); - - // - $this->listFields = $this->FiltersModel->getExecutedQueryListFields(); - - // - $selectedFields = array(); - $filterSessionArray = $this->_readSession(); - if (isset($filterSessionArray[self::SELECTED_FIELDS])) - { - $selectedFields = $filterSessionArray[self::SELECTED_FIELDS]; - } - - // - if (count($selectedFields) == 0) - { - $filterSessionArray[self::SELECTED_FIELDS] = $this->listFields; - } - - // - if ($this->columnsAliases != null && count($this->listFields) != count($this->columnsAliases)) - { - show_error('Parameter columnsAliases does not have a number of items equal to those returned by the query'); - } - - $filterSessionArray[self::COLUMNS_ALIASES] = $this->_getColumnAliasesFromPost(); - $filterSessionArray[self::CHECKBOXES] = $this->checkboxes; - - if ($this->app != null) - { - $filterSessionArray[self::APP_PARAMETER] = $this->app; - } - - if ($this->datasetName != null) - { - $filterSessionArray[self::DATASET_NAME_PARAMETER] = $this->datasetName; - } - - $filterSessionArray[self::ALL_SELECTED_FIELDS] = $this->listFields; - $filterSessionArray[self::ALL_COLUMNS_ALIASES] = $this->columnsAliases; - - /* ------------------------------------------------------------ */ - - $tmpDataset = null; - if (hasData($this->dataset)) - { - $tmpDataset = array(); - - for ($resultsCounter = 0; $resultsCounter < count($this->dataset->retval); $resultsCounter++) - { - $result = $this->dataset->retval[$resultsCounter]; - - $class = $this->_markRow($result); - $formattedResult = $this->_formatRaw($result); - $formattedResult->FILTER_CLASS_MARK_ROW = $class; - $tmpDataset[] = $formattedResult; - } - } - - $filterSessionArray[self::DATASET_PARAMETER] = $tmpDataset; - - /* ------------------------------------------------------------ */ - - // - $this->metaData = $this->FiltersModel->getExecutedQueryMetaData(); - - $filterSessionArray[self::METADATA_PARAMETER] = $this->metaData; - } - - $this->_writeSession($filterSessionArray); - - // - $this->loadViewFilters(); + $this->view(self::WIDGET_URL_FILTER); // GUI starts here } - /** - * - */ - public static function getSelectedFilters() - { - return self::_getFromSession(self::SELECTED_FILTERS); - } + //------------------------------------------------------------------------------------------------------------------ + // Public static methods used to load views and to access statically to some properies of the FilterWidget /** - * - */ - public static function getColumnsAliases() - { - return self::_getFromSession(self::COLUMNS_ALIASES); - } - - /** - * + * Loads the view related to the selected fields */ public static function loadViewSelectFields() { - if (self::$FilterWidgetInstance->hideHeader != true) + if (self::$_FilterWidgetInstance->_hideHeader != true) { self::_loadView(self::WIDGET_URL_SELECT_FIELDS); } } /** - * + * Loads the view related to the selected filters */ public static function loadViewSelectFilters() { - if (self::$FilterWidgetInstance->hideHeader != true) + if (self::$_FilterWidgetInstance->_hideHeader != true) { self::_loadView(self::WIDGET_URL_SELECT_FILTERS); } } /** - * + * Loads the view related to the form to save a custom filter */ public static function loadViewSaveFilter() { - if (self::$FilterWidgetInstance->hideSave != true) + if (self::$_FilterWidgetInstance->_hideSave != true) { self::_loadView(self::WIDGET_URL_SAVE_FILTER); } } /** - * + * Loads the view related to the table dataset */ public static function loadViewTableDataset() { self::_loadView(self::WIDGET_URL_TABLE_DATASET); } - /** - * - */ - private function _formatRaw($datasetRaw) - { - $tmpDatasetRaw = clone $datasetRaw; - - foreach ($tmpDatasetRaw as $columnName => $columnValue) - { - if (is_bool($columnValue)) - { - $tmpDatasetRaw->{$columnValue} = $columnValue === true ? 'true' : 'false'; - } - elseif (DateTime::createFromFormat('Y-m-d G:i:s', $columnValue) !== false) - { - $tmpDatasetRaw->{$columnValue} = date(self::DEFAULT_DATE_FORMAT, strtotime($columnValue)); - } - } - - if ($this->formatRaw != null) - { - $formatRaw = $this->formatRaw; - $tmpDatasetRaw = $formatRaw($tmpDatasetRaw); - } - - return $tmpDatasetRaw; - } - - /** - * - */ - private function _markRow($datasetRaw) - { - if (is_object($datasetRaw)) - { - if ($this->markRow != null) - { - $markRow = $this->markRow; - $class = $markRow($datasetRaw); - } - } - - return $class == null ? '' : $class; - } - - /** - * - */ - public static function displayFilterName() - { - if (self::$FilterWidgetInstance->filterNamePhrase != null && self::$FilterWidgetInstance->filterNamePhrase != '') - { - echo self::$FilterWidgetInstance->filterNamePhrase; - } - elseif (self::$FilterWidgetInstance->filterName != null && self::$FilterWidgetInstance->filterName != '') - { - echo self::$FilterWidgetInstance->filterName; - } - } - //------------------------------------------------------------------------------------------------------------------ - // Protected + // Private methods /** - * + * Checks parameters and initialize all the properties of this FilterWidget */ - protected function loadViewFilters() + private function _initFilterWidget($args) { - // Loads views - $this->view(self::WIDGET_URL_FILTER); - } + $this->_checkParameters($args); - //------------------------------------------------------------------------------------------------------------------ - // Private + // If here then everything is ok - /** - * - */ - private static function _getFromSession($key) - { - $_getFromSession = null; - $ci =& get_instance(); - $filterSessionArray = $ci->session->userdata(self::SESSION_NAME); + // Initialize class properties + $this->_app = null; + $this->_datasetName = null; + $this->_filterKurzbz = null; + $this->_filterId = null; + $this->_query = null; + $this->_additionalColumns = null; + $this->_columnsAliases = null; + $this->_formatRaw = null; + $this->_markRow = null; + $this->_checkboxes = null; + $this->_hideHeader = null; + $this->_hideSave = null; - if (isset($filterSessionArray[$key])) + // Parameters needed to retrive univocally a filter from DB + if (isset($args[FiltersLib::APP_PARAMETER])) { - $_getFromSession = $filterSessionArray[$key]; + $this->_app = $args[FiltersLib::APP_PARAMETER]; } - return $_getFromSession; + if (isset($args[FiltersLib::DATASET_NAME_PARAMETER])) + { + $this->_datasetName = $args[FiltersLib::DATASET_NAME_PARAMETER]; + } + + if (isset($args[FiltersLib::FILTER_KURZBZ_PARAMETER])) + { + $this->_filterKurzbz = $args[FiltersLib::FILTER_KURZBZ_PARAMETER]; + } + + if (isset($args[FiltersLib::FILTER_ID])) + { + $this->_filterId = $args[FiltersLib::FILTER_ID]; + } + + // How to retrive data for the filter: SQL statement or a result from DB + if (isset($args[FiltersLib::QUERY_PARAMETER])) + { + $this->_query = $args[FiltersLib::QUERY_PARAMETER]; + } + + // Parameter is used to add extra columns to the dataset + if (isset($args[FiltersLib::ADDITIONAL_COLUMNS]) + && is_array($args[FiltersLib::ADDITIONAL_COLUMNS]) + && count($args[FiltersLib::ADDITIONAL_COLUMNS]) > 0) + { + $this->_additionalColumns = $args[FiltersLib::ADDITIONAL_COLUMNS]; + } + + // Parameter is used to add use aliases for the columns fo the dataset + if (isset($args[FiltersLib::COLUMNS_ALIASES]) + && is_array($args[FiltersLib::COLUMNS_ALIASES]) + && count($args[FiltersLib::COLUMNS_ALIASES]) > 0) + { + $this->_columnsAliases = $args[FiltersLib::COLUMNS_ALIASES]; + } + + // Parameter that contains a function to format the rows of the dataset + if (isset($args[FiltersLib::FORMAT_RAW]) && is_callable($args[FiltersLib::FORMAT_RAW])) + { + $this->_formatRaw = $args[FiltersLib::FORMAT_RAW]; + } + + // Parameter that contains a function to mark in the GUI the rows of the dataset + if (isset($args[FiltersLib::MARK_ROW]) && is_callable($args[FiltersLib::MARK_ROW])) + { + $this->_markRow = $args[FiltersLib::MARK_ROW]; + } + + // Parameter used to specify the column of the dataset that will be used + // as id of the checkboxes column in the GUI + if (isset($args[FiltersLib::CHECKBOXES])) + { + $this->_checkboxes = $args[FiltersLib::CHECKBOXES]; + } + + // To specify if the header to operate with the FilterWidget is shown or not + if (isset($args[FiltersLib::HIDE_HEADER]) && is_bool($args[FiltersLib::HIDE_HEADER])) + { + $this->_hideHeader = $args[FiltersLib::HIDE_HEADER]; + } + + // To specify if the form to save a custom FilterWidget is shown or not + if (isset($args[FiltersLib::HIDE_SAVE]) && is_bool($args[FiltersLib::HIDE_SAVE])) + { + $this->_hideSave = $args[FiltersLib::HIDE_SAVE]; + } + } + + /** + * Checks the required parameters used to call this FilterWidget + */ + private function _checkParameters($args) + { + if (!is_array($args) || (is_array($args) && count($args) == 0)) + { + show_error('Second parameter of the widget call must be a not empty associative array'); + } + else + { + if ((!isset($args[FiltersLib::APP_PARAMETER]) && !isset($args[FiltersLib::DATASET_NAME_PARAMETER])) + && !isset($args[FiltersLib::FILTER_ID])) + { + show_error( + 'The parameters ("'.FiltersLib::APP_PARAMETER.'" and "'.FiltersLib::DATASET_NAME_PARAMETER.') OR "'. + FiltersLib::FILTER_ID.'" must be specified' + ); + } + else + { + if (!isset($args[FiltersLib::QUERY_PARAMETER])) + { + show_error('The parameters "'.FiltersLib::QUERY_PARAMETER.'" must be specified'); + } + } + } + } + + /** + * Contains all the logic used to load all the data needed to the FilterWidget + */ + private function _startFilterWidget() + { + // Read the all session for this filter widget + $session = $this->filterslib->getSession(); + + // If session is NOT empty + if ($session != null) + { + // Retrive the filterId stored in the session + $sessionFilterId = $this->filterslib->getElementSession(FiltersLib::FILTER_ID); + + // If the filter loaded in session is NOT the same that is being requested then empty the session + if ($this->_filterId != $sessionFilterId) + { + $this->filterslib->setSession(null); + $session = null; + } + } + + // If the session is empty + if ($session == null) + { + // Load filter definition data from DB + $definition = $this->filterslib->loadDefinition( + $this->_filterId, + $this->_app, + $this->_datasetName, + $this->_filterKurzbz + ); + + // Checks and parse json present into the definition + $parsedFilterJson = $this->filterslib->parseFilterJson($definition); + if ($parsedFilterJson != null) // if the json is valid + { + // Generate dataset query + $datasetQuery = $this->filterslib->generateDatasetQuery($this->_query, $parsedFilterJson); + + // Then retrive dataset from DB + $dataset = $this->filterslib->getDataset($datasetQuery); + + // Try to load the name of the filter using the PhrasesLib + $filterName = $this->filterslib->getFilterName($parsedFilterJson); + + // Save changes into session if data are valid + if (!isError($dataset)) + { + // Stores an array that contains all the data useful for + $this->filterslib->setSession( + array( + FiltersLib::FILTER_ID => $this->_filterId, + FiltersLib::SESSION_FILTER_NAME => $filterName, + FiltersLib::SESSION_FIELDS => $this->FiltersModel->getExecutedQueryListFields(), + FiltersLib::SESSION_SELECTED_FIELDS => $this->_getColumnsNames($parsedFilterJson->columns), + FiltersLib::SESSION_COLUMNS_ALIASES => $this->_columnsAliases, + FiltersLib::SESSION_ADDITIONAL_COLUMNS => $this->_additionalColumns, + FiltersLib::SESSION_CHECKBOXES => $this->_checkboxes, + FiltersLib::SESSION_FILTERS => $parsedFilterJson->filters, + FiltersLib::SESSION_DATASET_METADATA => $this->FiltersModel->getExecutedQueryMetaData(), + FiltersLib::SESSION_ROW_NUMBER => count($dataset->retval), + FiltersLib::SESSION_DATASET => $dataset->retval + ) + ); + } + } + } + + // var_dump($this->filterslib->getSession()); } /** * */ - private static function _getActiveFilterValue($filterName) + private function _getColumnsNames($columns) { - $getActiveFilterValue = ''; + $columnsNames = array(); - $activeFields = self::_getFromSession(self::ACTIVE_FILTERS); - - if (isset($activeFields[$filterName])) + foreach ($columns as $key => $obj) { - $getActiveFilterValue = $activeFields[$filterName]; + if (isset($obj->name)) + { + $columnsNames[] = $obj->name; + } } - return $getActiveFilterValue; + return $columnsNames; } /** - * - */ - private static function _getActiveFilterOperationValue($filterName) - { - $getActiveFilterOperationValue = ''; - - $activeFieldsOperation = self::_getFromSession(self::ACTIVE_FILTERS_OPERATION); - - if (isset($activeFieldsOperation[$filterName])) - { - $getActiveFilterOperationValue = $activeFieldsOperation[$filterName]; - } - - return $getActiveFilterOperationValue; - } - - /** - * - */ - private static function _getActiveFilterOptionValue($filterName) - { - $getActiveFilterOptionValue = ''; - - $activeFieldsOption = self::_getFromSession(self::ACTIVE_FILTERS_OPTION); - - if (isset($activeFieldsOption[$filterName])) - { - $getActiveFilterOptionValue = $activeFieldsOption[$filterName]; - } - - return $getActiveFilterOptionValue; - } - - /** - * + * Loads a view using the given viewName and eventually other parameters */ private static function _loadView($viewName, $parameters = null) { $ci =& get_instance(); $ci->load->view($viewName, $parameters); } - - /** - * - */ - private function _initSession() - { - $filterSessionArray = array(); - - $session = $this->_readSession(); - - if (count($session) > 0) - { - $filterSessionArray = $session; - } - - if (!isset($filterSessionArray[self::SELECTED_FIELDS])) - { - $filterSessionArray[self::SELECTED_FIELDS] = array(); - } - - if (!isset($filterSessionArray[self::SELECTED_FILTERS])) - { - $filterSessionArray[self::SELECTED_FILTERS] = array(); - } - - if (!isset($filterSessionArray[self::ACTIVE_FILTERS])) - { - $filterSessionArray[self::ACTIVE_FILTERS] = array(); - } - - if (!isset($filterSessionArray[self::ACTIVE_FILTERS_OPERATION])) - { - $filterSessionArray[self::ACTIVE_FILTERS_OPERATION] = array(); - } - - if (!isset($filterSessionArray[self::ACTIVE_FILTERS_OPTION])) - { - $filterSessionArray[self::ACTIVE_FILTERS_OPTION] = array(); - } - - if (!isset($filterSessionArray[self::ADDITIONAL_COLUMNS])) - { - $filterSessionArray[self::ADDITIONAL_COLUMNS] = array(); - } - - if (!isset($filterSessionArray[self::FILTER_ID])) - { - $filterSessionArray[self::FILTER_ID] = -1; - } - - if (!isset($filterSessionArray[self::COLUMNS_ALIASES])) - { - $filterSessionArray[self::COLUMNS_ALIASES] = array(); - } - - if (!isset($filterSessionArray[self::FILTER_NAME])) - { - $filterSessionArray[self::FILTER_NAME] = null; - } - - if (!isset($filterSessionArray[self::APP_PARAMETER])) - { - $filterSessionArray[self::APP_PARAMETER] = null; - } - - if (!isset($filterSessionArray[self::DATASET_NAME_PARAMETER])) - { - $filterSessionArray[self::DATASET_NAME_PARAMETER] = null; - } - - $this->_writeSession($filterSessionArray); - } - - /** - * - */ - private function _initFilterWidget($args) - { - $this->app = null; - $this->query = null; - $this->datasetName = null; - $this->filterKurzbz = null; - $this->filterId = null; - $this->additionalColumns = null; - $this->formatRaw = null; - $this->markRow = null; - $this->checkboxes = null; - $this->hideHeader = false; - $this->hideSave = false; - $this->columnsAliases = null; - $this->filterName = null; - $this->filterNamePhrase = null; - - $this->filterUniqueId = $this->_getFilterUniqueId(); - - if (!is_array($args) || (is_array($args) && count($args) == 0)) - { - show_error('Second parameter must be a not empty associative array'); - } - else - { - if (( - !isset($args[self::APP_PARAMETER]) - && !isset($args[self::DATASET_NAME_PARAMETER]) - && !isset($args[self::FILTER_KURZBZ]) - ) - && !isset($args[self::FILTER_ID])) - { - show_error('At least one parameters must be specified 1'); - } - else - { - if (!isset($args[self::QUERY_PARAMETER]) && !isset($args[self::DB_RESULT])) - { - show_error('At least one parameters must be specified 2'); - } - else - { - if (isset($args[self::APP_PARAMETER]) - && isset($args[self::DATASET_NAME_PARAMETER]) - && isset($args[self::FILTER_KURZBZ])) - { - $this->app = $args[self::APP_PARAMETER]; - $this->datasetName = $args[self::DATASET_NAME_PARAMETER]; - $this->filterKurzbz = $args[self::FILTER_KURZBZ]; - } - else - { - $this->filterId = $args[self::FILTER_ID]; - } - - if (isset($args[self::QUERY_PARAMETER])) - { - $this->query = $args[self::QUERY_PARAMETER]; - } - elseif (isset($args[self::DB_RESULT])) - { - $this->query = $args[self::DB_RESULT]; - } - } - } - - if (isset($args[self::ADDITIONAL_COLUMNS]) - && is_array($args[self::ADDITIONAL_COLUMNS]) - && count($args[self::ADDITIONAL_COLUMNS]) > 0) - { - $this->additionalColumns = $args[self::ADDITIONAL_COLUMNS]; - } - - if (isset($args[self::FORMAT_RAW]) && is_callable($args[self::FORMAT_RAW])) - { - $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::CHECKBOXES])) - { - $this->checkboxes = $args[self::CHECKBOXES]; - } - - if (isset($args[self::HIDE_HEADER]) && is_bool($args[self::HIDE_HEADER])) - { - $this->hideHeader = $args[self::HIDE_HEADER]; - } - - if (isset($args[self::HIDE_SAVE]) && is_bool($args[self::HIDE_SAVE])) - { - $this->hideSave = $args[self::HIDE_SAVE]; - } - - if (isset($args[self::COLUMNS_ALIASES]) - && is_array($args[self::COLUMNS_ALIASES]) - && count($args[self::COLUMNS_ALIASES]) > 0) - { - $this->columnsAliases = $args[self::COLUMNS_ALIASES]; - } - } - } - - /** - * - */ - private function _loadFilter() - { - // - $this->FiltersModel->resetQuery(); - - // - $this->FiltersModel->addJoin('public.tbl_benutzer', 'person_id', 'LEFT'); - - // - $this->FiltersModel->addSelect('system.tbl_filters.*'); - - // - $this->FiltersModel->addOrder('sort', 'ASC'); - - // - $this->FiltersModel->addLimit(1); - - $whereParameters = null; - - if ($this->filterId <= 0) - { - // Try to load the custom filter (person_id = logged user person_id) with the given "app" and "dataset_name" - // that is set as default filter (default_filter = true) - $whereParameters = array( - 'app' => $this->app, - 'dataset_name' => $this->datasetName, - 'uid' => getAuthUID(), - 'default_filter' => true - ); - } - else - { - $whereParameters = array( - 'filter_id' => $this->filterId - ); - } - - // - $filter = $this->FiltersModel->loadWhere($whereParameters); - - $jsonEncodedFilter = null; - - if (hasData($filter)) - { - if (isset($filter->retval[0]->filter) && trim($filter->retval[0]->filter) != '') - { - $jsonEncodedFilter = json_decode($filter->retval[0]->filter); - } - } - else // Try to load the global filter (person_id = null) with the given "app" and "dataset_name" that is set as - // default filter (default_filter = true) - { - $whereParameters = array( - 'app' => $this->app, - 'dataset_name' => $this->datasetName, - 'default_filter' => true - ); - - $filter = $this->FiltersModel->loadWhere($whereParameters); - if (hasData($filter)) - { - if (isset($filter->retval[0]->filter) && trim($filter->retval[0]->filter) != '') - { - $jsonEncodedFilter = json_decode($filter->retval[0]->filter); - } - } - } - - if ($jsonEncodedFilter != null) - { - $selectedFields = array(); - $selectedFilters = array(); - $activeFilters = array(); - $activeFiltersOperation = array(); - $activeFiltersOption = array(); - $filterName = null; - $filterNamePhrase = null; - - if (isset($jsonEncodedFilter->columns)) - { - $columns = $jsonEncodedFilter->columns; - - for($columnsCounter = 0; $columnsCounter < count($columns); $columnsCounter++) - { - if (isset($columns[$columnsCounter]->name)) - { - $selectedFields[] = $columns[$columnsCounter]->name; - } - } - } - - if (isset($jsonEncodedFilter->filters)) - { - $filters = $jsonEncodedFilter->filters; - - for($filtersCounter = 0; $filtersCounter < count($filters); $filtersCounter++) - { - if (isset($filters[$filtersCounter]->name)) - { - $selectedFilters[] = $filters[$filtersCounter]->name; - $activeFilters[$filters[$filtersCounter]->name] = $filters[$filtersCounter]->condition; - $activeFiltersOperation[$filters[$filtersCounter]->name] = $filters[$filtersCounter]->operation; - if (isset($filters[$filtersCounter]->option)) - { - $activeFiltersOption[$filters[$filtersCounter]->name] = $filters[$filtersCounter]->option; - } - } - } - } - - if (isset($jsonEncodedFilter->name)) - { - $filterName = $jsonEncodedFilter->name; - } - - // Filter name from phrases system - if (isset($jsonEncodedFilter->namePhrase)) - { - $this->load->library('PhrasesLib', array('FilterWidget')); - $filterNamePhrase = $this->phraseslib->t('FilterWidget', $jsonEncodedFilter->namePhrase); - } - - $this->filterName = $filterName; - $this->filterNamePhrase = $filterNamePhrase; - $this->app = $filter->retval[0]->app; - - $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::FILTER_NAME => $filterName, - self::APP_PARAMETER => $filter->retval[0]->app, - self::DATASET_NAME_PARAMETER => $filter->retval[0]->dataset_name - ); - - $this->_writeSession($filterSessionArray); - } - else - { - $filterSessionArray = array( - self::SELECTED_FIELDS => array(), - self::SELECTED_FILTERS => array(), - self::ACTIVE_FILTERS => array(), - self::ACTIVE_FILTERS_OPERATION => array(), - self::ACTIVE_FILTERS_OPTION => array(), - self::FILTER_NAME => null, - self::APP_PARAMETER => null, - self::DATASET_NAME_PARAMETER => null - ); - - $this->_writeSession($filterSessionArray); - } - } - - /** - * - */ - private function _saveFilter() - { - if (isset($_POST['saveCustomFilter']) && $_POST['saveCustomFilter'] == 'true') - { - $objToBeSaved = new stdClass(); - - $filterSessionArray = $this->_readSession(); - - if (isset($filterSessionArray[self::SELECTED_FIELDS])) - { - $selectedFields = $filterSessionArray[self::SELECTED_FIELDS]; - $objToBeSaved->columns = array(); - - for ($selectedFieldsCounter = 0; $selectedFieldsCounter < count($selectedFields); $selectedFieldsCounter++) - { - $objToBeSaved->columns[$selectedFieldsCounter] = new stdClass(); - $objToBeSaved->columns[$selectedFieldsCounter]->name = $selectedFields[$selectedFieldsCounter]; - } - } - - if (isset($filterSessionArray[self::SELECTED_FILTERS])) - { - $selectedFilters = $filterSessionArray[self::SELECTED_FILTERS]; - $objToBeSaved->filters = array(); - - for ($selectedFiltersCounter = 0; $selectedFiltersCounter < count($selectedFilters); $selectedFiltersCounter++) - { - $objToBeSaved->filters[$selectedFiltersCounter] = new stdClass(); - $objToBeSaved->filters[$selectedFiltersCounter]->name = $selectedFilters[$selectedFiltersCounter]; - - if (isset($filterSessionArray[self::ACTIVE_FILTERS]) - && isset($filterSessionArray[self::ACTIVE_FILTERS][$selectedFilters[$selectedFiltersCounter]])) - { - $objToBeSaved->filters[$selectedFiltersCounter]->condition = $filterSessionArray[self::ACTIVE_FILTERS][$selectedFilters[$selectedFiltersCounter]]; - } - - if (isset($filterSessionArray[self::ACTIVE_FILTERS_OPERATION]) - && isset($filterSessionArray[self::ACTIVE_FILTERS_OPERATION][$selectedFilters[$selectedFiltersCounter]])) - { - $objToBeSaved->filters[$selectedFiltersCounter]->operation = $filterSessionArray[self::ACTIVE_FILTERS_OPERATION][$selectedFilters[$selectedFiltersCounter]]; - } - - if (isset($filterSessionArray[self::ACTIVE_FILTERS_OPTION]) - && isset($filterSessionArray[self::ACTIVE_FILTERS_OPTION][$selectedFilters[$selectedFiltersCounter]])) - { - $objToBeSaved->filters[$selectedFiltersCounter]->option = $filterSessionArray[self::ACTIVE_FILTERS_OPTION][$selectedFilters[$selectedFiltersCounter]]; - } - } - } - - $desc = $_POST['customFilterDescription']; - $descPGArray = '{"'.$desc.'", "'.$desc.'", "'.$desc.'", "'.$desc.'"}'; - - $resultBenutzer = $this->BenutzerModel->load(getAuthUID()); - $personId = $resultBenutzer->retval[0]->person_id; - - $result = $this->FiltersModel->loadWhere(array( - 'app' => $this->app, - 'dataset_name' => $this->datasetName, - 'description' => $descPGArray, - 'person_id' => $personId - )); - - if (hasData($result)) - { - $this->FiltersModel->update( - array( - 'app' => $this->app, - 'dataset_name' => $this->datasetName, - 'description' => $descPGArray, - 'person_id' => $personId - ), - array( - 'filter' => json_encode($objToBeSaved) - ) - ); - } - else - { - $this->FiltersModel->insert(array( - 'app' => $this->app, - 'dataset_name' => $this->datasetName, - 'filter_kurzbz' => uniqid($personId, true), - 'person_id' => $personId, - 'description' => $descPGArray, - 'sort' => null, - 'default_filter' => false, - 'filter' => json_encode($objToBeSaved), - 'oe_kurzbz' => null - )); - } - } - } - - /** - * - */ - private function _getSelectedFieldsFromPost() - { - // Selected fields - $selectedFields = array(); - - $filterSessionArray = $this->_readSession(); - if (isset($filterSessionArray[self::SELECTED_FIELDS])) - { - $selectedFields = $filterSessionArray[self::SELECTED_FIELDS]; - } - - return $selectedFields; - } - - /** - * - */ - private function _getAppFromPost() - { - $app = $this->app; - - $filterSessionArray = $this->_readSession(); - if (isset($filterSessionArray[self::APP_PARAMETER])) - { - $app = $filterSessionArray[self::APP_PARAMETER]; - } - - return $app; - } - - /** - * - */ - private function _getDatasetFromPost() - { - $datasetName = $this->datasetName; - - $filterSessionArray = $this->_readSession(); - if (isset($filterSessionArray[self::DATASET_NAME_PARAMETER])) - { - $datasetName = $filterSessionArray[self::DATASET_NAME_PARAMETER]; - } - - return $datasetName; - } - - /** - * - */ - private function _getColumnAliasesFromPost() - { - $columnsAliases = $this->columnsAliases; - $selectedFields = array(); - - $filterSessionArray = $this->_readSession(); - - if (isset($filterSessionArray[self::SELECTED_FIELDS])) - { - $selectedFields = $filterSessionArray[self::SELECTED_FIELDS]; - } - - if (isset($this->listFields) && count($selectedFields) > 0 && is_array($this->columnsAliases) && count($this->columnsAliases) > 0) - { - $columnsAliases = array(); - - for ($i = 0; $i < count($selectedFields); $i++) - { - if (($pos = array_search($selectedFields[$i], $this->listFields)) !== false) - { - $columnsAliases[] = $this->columnsAliases[$pos]; - } - } - } - - return $columnsAliases; - } - - /** - * - */ - private function _getSelectedFiltersFromPost() - { - // Selected filters - $selectedFilters = array(); - - $filterSessionArray = $this->_readSession(); - if (isset($filterSessionArray[self::SELECTED_FILTERS])) - { - $selectedFilters = $filterSessionArray[self::SELECTED_FILTERS]; - } - - return $selectedFilters; - } - - /** - * - */ - private function _setActiveFiltersFromPost(&$activeFilters, &$activeFiltersOperation, &$activeFiltersOption) - { - $selectedFilters = array(); - $filterSessionArray = $this->_readSession(); - - if (isset($filterSessionArray[self::ACTIVE_FILTERS])) - { - $activeFilters = $filterSessionArray[self::ACTIVE_FILTERS]; - } - - if (isset($filterSessionArray[self::ACTIVE_FILTERS_OPERATION])) - { - $activeFiltersOperation = $filterSessionArray[self::ACTIVE_FILTERS_OPERATION]; - } - - if (isset($filterSessionArray[self::ACTIVE_FILTERS_OPTION])) - { - $activeFiltersOption = $filterSessionArray[self::ACTIVE_FILTERS_OPTION]; - } - - if (isset($filterSessionArray[self::SELECTED_FILTERS])) - { - $selectedFilters = $filterSessionArray[self::SELECTED_FILTERS]; - } - - if (is_array($_POST)) - { - if (array_key_exists(self::CMD_REMOVE_FILTER, $_POST) && trim($_POST[self::CMD_REMOVE_FILTER]) != '') - { - if (isset($activeFilters[$_POST[self::CMD_REMOVE_FILTER]])) - { - unset($activeFilters[$_POST[self::CMD_REMOVE_FILTER]]); - } - - if (isset($activeFiltersOperation[$_POST[self::CMD_REMOVE_FILTER]])) - { - unset($activeFiltersOperation[$_POST[self::CMD_REMOVE_FILTER]]); - } - - if (isset($activeFiltersOption[$_POST[self::CMD_REMOVE_FILTER]])) - { - unset($activeFiltersOption[$_POST[self::CMD_REMOVE_FILTER]]); - } - } - else - { - for ($selectedFiltersCounter = 0; $selectedFiltersCounter < count($selectedFilters); $selectedFiltersCounter++) - { - $selectedFilter = $selectedFilters[$selectedFiltersCounter]; - - if (isset($_POST[$selectedFilter])) - { - $activeFilters[$selectedFilter] = $_POST[$selectedFilter]; - } - - if (isset($_POST[$selectedFilter.self::ACTIVE_FILTER_OPERATION_POSTFIX])) - { - $activeFiltersOperation[$selectedFilter] = $_POST[$selectedFilter.self::ACTIVE_FILTER_OPERATION_POSTFIX]; - } - - if (isset($_POST[$selectedFilter.self::ACTIVE_FILTER_OPTION_POSTFIX])) - { - $activeFiltersOption[$selectedFilter] = $_POST[$selectedFilter.self::ACTIVE_FILTER_OPTION_POSTFIX]; - } - } - } - } - } - - /** - * - */ - private function _setSessionFilterData() - { - $session = $this->_readSession(); - - $filterSessionArray = array( - self::SELECTED_FIELDS => $this->_getSelectedFieldsFromPost(), - self::SELECTED_FILTERS => $this->_getSelectedFiltersFromPost(), - self::ADDITIONAL_COLUMNS => $this->additionalColumns, - self::COLUMNS_ALIASES => $this->_getColumnAliasesFromPost(), - self::APP_PARAMETER => $this->_getAppFromPost(), - self::DATASET_NAME_PARAMETER => $this->_getDatasetFromPost() - ); - - $filterSessionArray[self::ACTIVE_FILTERS] = array(); - $filterSessionArray[self::ACTIVE_FILTERS_OPERATION] = array(); - $filterSessionArray[self::ACTIVE_FILTERS_OPTION] = array(); - - $this->_setActiveFiltersFromPost( - $filterSessionArray[self::ACTIVE_FILTERS], - $filterSessionArray[self::ACTIVE_FILTERS_OPERATION], - $filterSessionArray[self::ACTIVE_FILTERS_OPTION] - ); - - $filterSessionArray[self::FILTER_ID] = $this->filterId; - $filterSessionArray[self::FILTER_NAME] = $this->filterName; - $filterSessionArray[self::FILTER_NAME_PHRASE] = $this->filterNamePhrase; - - $this->_writeSession(array_merge($session, $filterSessionArray)); - } - - /** - * - */ - private function _generateQuery() - { - $query = null;//$this->query; - - $activeFilters = array(); - $activeFiltersOperation = array(); - $activeFiltersOption = array(); - - $filterSessionArray = $this->_readSession(); - - if (isset($filterSessionArray[self::ACTIVE_FILTERS])) - { - $activeFilters = $filterSessionArray[self::ACTIVE_FILTERS]; - } - - if (isset($filterSessionArray[self::ACTIVE_FILTERS_OPERATION])) - { - $activeFiltersOperation = $filterSessionArray[self::ACTIVE_FILTERS_OPERATION]; - } - - if (isset($filterSessionArray[self::ACTIVE_FILTERS_OPTION])) - { - $activeFiltersOption = $filterSessionArray[self::ACTIVE_FILTERS_OPTION]; - } - - // - if (count($activeFilters) > 0) - { - $where = ''; - $first = true; - - foreach ($activeFilters as $field => $activeFilterValue) - { - if ($first) - { - $first = false; - } - else - { - $where .= ' AND '; - } - - if (isset($activeFiltersOperation[$field])) - { - $where .= '"'.$field.'"'; - $condition = ''; - - switch ($activeFiltersOperation[$field]) - { - case self::OP_EQUAL: - if (!is_numeric($activeFilterValue)) $activeFilterValue = 0; - $condition = ' = '.$activeFilterValue; - break; - case self::OP_NOT_EQUAL: - if (!is_numeric($activeFilterValue)) $activeFilterValue = 0; - $condition = ' != '.$activeFilterValue; - break; - case self::OP_GREATER_THAN: - if (!is_numeric($activeFilterValue)) $activeFilterValue = 0; - if (isset($activeFiltersOption[$field]) - && ($activeFiltersOption[$field] == self::OPT_DAYS - || $activeFiltersOption[$field] == self::OPT_MONTHS)) - { - $condition = ' < (NOW() - \''.$activeFilterValue.' '.$activeFiltersOption[$field].'\'::interval)'; - } - else - { - $condition = ' > '.$activeFilterValue; - } - - break; - case self::OP_LESS_THAN: - if (!is_numeric($activeFilterValue)) $activeFilterValue = 0; - if (isset($activeFiltersOption[$field]) - && ($activeFiltersOption[$field] == self::OPT_DAYS - || $activeFiltersOption[$field] == self::OPT_MONTHS)) - { - $condition = ' > (NOW() - \''.$activeFilterValue.' '.$activeFiltersOption[$field].'\'::interval)'; - } - else - { - $condition = ' < '.$activeFilterValue; - } - 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: - $condition = ' IS TRUE'; - break; - case self::OP_IS_FALSE: - $condition = ' IS FALSE'; - break; - case self::OP_SET: - $condition = ' IS NOT NULL'; - break; - case self::OP_NOT_SET: - $condition = ' IS NULL'; - break; - default: - $condition = ' IS NOT NULL'; - break; - } - - $where .= $condition; - } - } - - if ($where != '') - { - $query = 'SELECT * FROM ('.$this->query.') tableFilters WHERE '.$where; - } - } - - return $query; - } - - /** - * - */ - private function _readSession() - { - if (isset($_SESSION[self::SESSION_NAME]) && isset($_SESSION[self::SESSION_NAME][$this->filterUniqueId])) - return $_SESSION[self::SESSION_NAME][$this->filterUniqueId]; - - return array(); - } - - /** - * - */ - private function _writeSession($data) - { - if (!isset($_SESSION[self::SESSION_NAME]) - || (isset($_SESSION[self::SESSION_NAME]) && !is_array($_SESSION[self::SESSION_NAME]))) - { - $_SESSION[self::SESSION_NAME] = array(); - } - - $_SESSION[self::SESSION_NAME][$this->filterUniqueId] = $data; - } - - /** - * - */ - private function _getFilterUniqueId() - { - return $this->router->directory.$this->router->class.'/'.$this->router->method.'/'.$this->input->get('fhc_controller_id'); - } } diff --git a/public/js/AjaxLib.js b/public/js/AjaxLib.js index abd079635..a68ffda93 100644 --- a/public/js/AjaxLib.js +++ b/public/js/AjaxLib.js @@ -163,6 +163,26 @@ var FHC_AjaxClient = { FHC_AjaxClient._hideVeil(); }, + /** + * Retrives parameters from URL query string (HTTP GET parameters) + */ + getUrlParameter: function(sParam) { + var sPageURL = decodeURIComponent(window.location.search.substring(1)), + sURLVariables = sPageURL.split('&'), + sParameterName, + i; + + for (i = 0; i < sURLVariables.length; i++) + { + sParameterName = sURLVariables[i].split('='); + + if (sParameterName[0] === sParam) + { + return sParameterName[1]; + } + } + }, + //------------------------------------------------------------------------------------------------------------------ // Private methods @@ -278,26 +298,6 @@ var FHC_AjaxClient = { this._veilTimeout); }, - /** - * Retrives parameters from URL query string (HTTP GET parameters) - */ - getUrlParameter: function(sParam) { - var sPageURL = decodeURIComponent(window.location.search.substring(1)), - sURLVariables = sPageURL.split('&'), - sParameterName, - i; - - for (i = 0; i < sURLVariables.length; i++) - { - sParameterName = sURLVariables[i].split('='); - - if (sParameterName[0] === sParam) - { - return sParameterName[1]; - } - } - }, - /** * Checks call parameters, if they are present and are valid * It generates and returns all the parameters needed to perform an ajax remote call diff --git a/public/js/FilterWidget.js b/public/js/FilterWidget.js index 004f4ddac..d32cfa63a 100644 --- a/public/js/FilterWidget.js +++ b/public/js/FilterWidget.js @@ -38,76 +38,339 @@ var FHC_FilterWidget = { /** * */ - renderSelectedFields: function() { - // + display: function() { + FHC_FilterWidget._getFilter(FHC_FilterWidget._renderFilterWidget); + }, + + /** + * + */ + _getFilter: function(renderFunction) { FHC_AjaxClient.ajaxCallGet( - 'system/Filters/selectFields', + 'system/Filters/getFilter', { filter_page: FHC_FilterWidget._getFilterPage() }, { successCallback: function(data, textStatus, jqXHR) { - FHC_FilterWidget._resetEventsSF(); + // console.log(data); - if (data != null) + if (FHC_AjaxClient.hasData(data) && typeof renderFunction == 'function') { - var arrayFieldsToDisplay = []; - - if (data.columnsAliases != null && $.isArray(data.columnsAliases)) - { - arrayFieldsToDisplay = data.columnsAliases; - } - else if (data.selectedFields != null && $.isArray(data.selectedFields)) - { - arrayFieldsToDisplay = data.selectedFields; - } - - for (var i = 0; i < arrayFieldsToDisplay.length; i++) - { - var fieldToDisplay = arrayFieldsToDisplay[i]; - var fieldName = data.selectedFields[i]; - - var strHtml = ''; - - strHtml += ''; - strHtml += fieldToDisplay; - strHtml += ''; - strHtml += ' X '; - strHtml += ''; - $("#filterSelectFieldsDnd").append(strHtml); - } - - var strDropDown = ''; - $("#addField").append(strDropDown); - - if (data.allSelectedFields != null) - { - for (var i = 0; i < data.allSelectedFields.length; i++) - { - var fieldName = data.allSelectedFields[i]; - var fieldToDisplay = data.allSelectedFields[i]; - - if (data.selectedFields.indexOf(fieldName) < 0) - { - if (data.allColumnsAliases != null && $.isArray(data.allColumnsAliases)) - { - fieldToDisplay = data.allColumnsAliases[i]; - } - - strDropDown = ''; - $("#addField").append(strDropDown); - } - } - } + renderFunction(FHC_AjaxClient.getData(data)); } - - FHC_FilterWidget._dndSF(); - FHC_FilterWidget._addEventsSF(); } } ); }, + + /** + * + */ + _renderFilterWidget: function(data) { + + console.log(data); + + FHC_FilterWidget._setFilterName(data); // + + FHC_FilterWidget._renderDnDFields(data); // + + FHC_FilterWidget._renderDropDownFields(data); // + + FHC_FilterWidget._renderAppliedFilters(data); // + + }, + + _setFilterName: function(data) { + if (data.hasOwnProperty('filterName')) + { + $(".filter-name-title").html(data.filterName); + } + }, + + /** + * + */ + _renderDnDFields: function(data) { + + $(".remove-field").off('click'); + + if (data.hasOwnProperty('rowNumber') && data.rowNumber > 0) + { + var arrayFieldsToDisplay = []; + + if (data.hasOwnProperty('selectedFields') && $.isArray(data.selectedFields)) + { + if (data.hasOwnProperty('columnsAliases') && $.isArray(data.columnsAliases)) + { + for (var i = 0; i < data.selectedFields.length; i++) + { + for (var j = 0; j < data.fields.length; j++) + { + if (data.selectedFields[i] == data.fields[j]) + { + arrayFieldsToDisplay[i] = data.columnsAliases[j]; + } + } + } + } + else + { + arrayFieldsToDisplay = data.selectedFields; + } + } + + for (var i = 0; i < arrayFieldsToDisplay.length; i++) + { + var fieldToDisplay = arrayFieldsToDisplay[i]; + var fieldName = data.selectedFields[i]; + + var strHtml = ''; + strHtml += ' ' + fieldToDisplay + ''; + strHtml += ' '; + strHtml += ' X '; + strHtml += ' '; + strHtml += ''; + + $("#filterSelectFieldsDnd").append(strHtml); + } + + FHC_FilterWidget._drangAndDropEvents(); + + $(".remove-field").click(function(event) { + // + FHC_AjaxClient.ajaxCallPost( + 'system/Filters/removeSelectedFields', + { + fieldName: $(this).attr('fieldToRemove'), + filter_page: FHC_FilterWidget._getFilterPage() + }, + { + successCallback: function(data, textStatus, jqXHR) { + FHC_FilterWidget._resetSelectedFields(); + + FHC_FilterWidget.renderSelectedFields(); + FHC_FilterWidget.renderTableDataset(); + } + } + ); + }); + } + }, + + _renderDropDownFields: function(data) { + + $("#addField").off('change'); + + var strDropDown = ''; + $("#addField").append(strDropDown); + + if (data.fields != null) + { + for (var i = 0; i < data.fields.length; i++) + { + var fieldName = data.fields[i]; + var fieldToDisplay = data.fields[i]; + + if (data.selectedFields.indexOf(fieldName) < 0) + { + if (data.allColumnsAliases != null && $.isArray(data.allColumnsAliases)) + { + fieldToDisplay = data.allColumnsAliases[i]; + } + + strDropDown = ''; + $("#addField").append(strDropDown); + } + } + } + + $("#addField").change(function(event) { + // + FHC_AjaxClient.ajaxCallPost( + 'system/Filters/addSelectedFields', + { + fieldName: $(this).val(), + filter_page: FHC_FilterWidget._getFilterPage() + }, + { + successCallback: function(data, textStatus, jqXHR) { + FHC_FilterWidget._resetSelectedFields(); + + FHC_FilterWidget.renderSelectedFields(); + FHC_FilterWidget.renderTableDataset(); + } + } + ); + }); + }, + + /** + * + */ + _renderAppliedFilters: function(data) { + + $("#addFilter").off('change'); + + var data = FHC_AjaxClient.getData(data); + var strDropDown = ''; + + $("#addFilter").append(strDropDown); + + if (data.selectedFilters != null) + { + for (var i = 0; i < data.selectedFilters.length; i++) + { + var selectedFilters = '
'; + + selectedFilters += ''; + selectedFilters += data.selectedFiltersAliases[i]; + selectedFilters += ''; + + selectedFilters += FHC_FilterWidget._getSelectedFilterFields( + data.selectedFiltersMetaData[i], + data.selectedFiltersActiveFilters[i], + data.selectedFiltersActiveFiltersOperation[i], + data.selectedFiltersActiveFiltersOption[i] + ); + + selectedFilters += ''; + selectedFilters += ''; + selectedFilters += ''; + + selectedFilters += '
'; + + $("#selectedFilters").append(selectedFilters); + } + } + + if (data.allSelectedFields != null) + { + for (var i = 0; i < data.allSelectedFields.length; i++) + { + var fieldName = data.allSelectedFields[i]; + var fieldToDisplay = data.allSelectedFields[i]; + + if (data.selectedFilters.indexOf(fieldName) < 0) + { + if (data.allColumnsAliases != null && $.isArray(data.allColumnsAliases)) + { + fieldToDisplay = data.allColumnsAliases[i]; + } + + strDropDown = ''; + $("#addFilter").append(strDropDown); + } + } + } + + $(".select-filter-operation").change(function() { + + if ($(this).val() == "set" || $(this).val() == "nset") + { + $(this).parent().parent().find(".select-filter-operation-value").addClass("hidden-control"); + $(this).parent().parent().find(".select-filter-option").addClass("hidden-control"); + + $(this).parent().parent().find(".select-filter-operation-value").prop('disabled', true); + $(this).parent().parent().find(".select-filter-option").prop('disabled', true); + } + else + { + $(this).parent().parent().find(".select-filter-operation-value").removeClass("hidden-control"); + $(this).parent().parent().find(".select-filter-option").removeClass("hidden-control"); + + $(this).parent().parent().find(".select-filter-operation-value").prop('disabled', false); + $(this).parent().parent().find(".select-filter-option").prop('disabled', false); + } + + }); + + $("#applyFilter").click(function() { + + var selectFilterName = []; + var selectFilterOperation = []; + var selectFilterOperationValue = []; + var selectFilterOption = []; + + $("#selectedFilters > div").each(function(i, e) { + var tmpSelectFilterName = $(this).find('.hidden-field-name').val(); + var tmpSelectFilterOperation = $(this).find('.select-filter-operation').val(); + var tmpSelectFilterOperationValue = $(this).find('.select-filter-operation-value:enabled').val(); + var tmpSelectFilterOption = $(this).find('.select-filter-option:enabled').val(); + + selectFilterName.push(tmpSelectFilterName); + selectFilterOperation.push(tmpSelectFilterOperation); + selectFilterOperationValue.push(tmpSelectFilterOperationValue != null ? tmpSelectFilterOperationValue : ""); + selectFilterOption.push(tmpSelectFilterOption != null ? tmpSelectFilterOption : ""); + }); + + // + FHC_AjaxClient.ajaxCallPost( + 'system/Filters/applyFilter', + { + filterNames: selectFilterName, + filterOperations: selectFilterOperation, + filterOperationValues: selectFilterOperationValue, + filterOptions: selectFilterOption, + filter_page: FHC_FilterWidget._getFilterPage() + }, + { + successCallback: function(data, textStatus, jqXHR) { + FHC_FilterWidget._resetSelectedFilters(); + + location.reload(); + } + } + ); + }); + + $(".remove-selected-filter").click(function(event) { + // + FHC_AjaxClient.ajaxCallPost( + 'system/Filters/removeSelectedFilters', + { + fieldName: $(this).attr('filterToRemove'), + filter_page: FHC_FilterWidget._getFilterPage() + }, + { + successCallback: function(data, textStatus, jqXHR) { + FHC_FilterWidget._resetSelectedFilters(); + + location.reload(); + } + } + ); + }); + + }, + + + + + + + + + + + + + + + + + + + + + + + + + + + /** * @@ -115,66 +378,16 @@ var FHC_FilterWidget = { renderSelectedFilters: function() { // FHC_AjaxClient.ajaxCallGet( - 'system/Filters/selectFilters', + 'system/Filters/getFilters', { filter_page: FHC_FilterWidget._getFilterPage() }, { successCallback: function(data, textStatus, jqXHR) { - FHC_FilterWidget._resetEventsSFilters(); - - if (data != null) + if (FHC_AjaxClient.hasData(data)) { - var strDropDown = ''; - $("#addFilter").append(strDropDown); - if (data.selectedFilters != null) - { - for (var i = 0; i < data.selectedFilters.length; i++) - { - var selectedFilters = '
'; - - selectedFilters += ''; - selectedFilters += data.selectedFiltersAliases[i]; - selectedFilters += ''; - - selectedFilters += FHC_FilterWidget._getSelectedFilterFields( - data.selectedFiltersMetaData[i], - data.selectedFiltersActiveFilters[i], - data.selectedFiltersActiveFiltersOperation[i], - data.selectedFiltersActiveFiltersOption[i] - ); - - selectedFilters += ''; - selectedFilters += ''; - selectedFilters += ''; - - selectedFilters += '
'; - - $("#selectedFilters").append(selectedFilters); - } - } - - if (data.allSelectedFields != null) - { - for (var i = 0; i < data.allSelectedFields.length; i++) - { - var fieldName = data.allSelectedFields[i]; - var fieldToDisplay = data.allSelectedFields[i]; - - if (data.selectedFilters.indexOf(fieldName) < 0) - { - if (data.allColumnsAliases != null && $.isArray(data.allColumnsAliases)) - { - fieldToDisplay = data.allColumnsAliases[i]; - } - - strDropDown = ''; - $("#addFilter").append(strDropDown); - } - } - } } FHC_FilterWidget._addEventsSFilters(); @@ -309,7 +522,7 @@ var FHC_FilterWidget = { /** * */ - _dndSF: function() { + _drangAndDropEvents: function() { $(".filter-select-field-dnd-span").draggable({ containment: "parent", cursor: "move", @@ -401,57 +614,6 @@ var FHC_FilterWidget = { }); }, - /** - * - */ - _resetEventsSF: function() { - $("#addField").off('change'); - $(".remove-field").off('click'); - }, - - /** - * - */ - _addEventsSF: function() { - $("#addField").change(function(event) { - // - FHC_AjaxClient.ajaxCallPost( - 'system/Filters/addSelectedFields', - { - fieldName: $(this).val(), - filter_page: FHC_FilterWidget._getFilterPage() - }, - { - successCallback: function(data, textStatus, jqXHR) { - FHC_FilterWidget._resetSelectedFields(); - - FHC_FilterWidget.renderSelectedFields(); - FHC_FilterWidget.renderTableDataset(); - } - } - ); - }); - - $(".remove-field").click(function(event) { - // - FHC_AjaxClient.ajaxCallPost( - 'system/Filters/removeSelectedFields', - { - fieldName: $(this).attr('fieldToRemove'), - filter_page: FHC_FilterWidget._getFilterPage() - }, - { - successCallback: function(data, textStatus, jqXHR) { - FHC_FilterWidget._resetSelectedFields(); - - FHC_FilterWidget.renderSelectedFields(); - FHC_FilterWidget.renderTableDataset(); - } - } - ); - }); - }, - /** * */ @@ -460,13 +622,6 @@ var FHC_FilterWidget = { $("#addField").html(""); }, - /** - * - */ - _resetEventsSFilters: function() { - $("#addFilter").off('change'); - }, - /** * */ @@ -490,83 +645,7 @@ var FHC_FilterWidget = { ); }); - $(".select-filter-operation").change(function() { - if ($(this).val() == "set" || $(this).val() == "nset") - { - $(this).parent().parent().find(".select-filter-operation-value").addClass("hidden-control"); - $(this).parent().parent().find(".select-filter-option").addClass("hidden-control"); - - $(this).parent().parent().find(".select-filter-operation-value").prop('disabled', true); - $(this).parent().parent().find(".select-filter-option").prop('disabled', true); - } - else - { - $(this).parent().parent().find(".select-filter-operation-value").removeClass("hidden-control"); - $(this).parent().parent().find(".select-filter-option").removeClass("hidden-control"); - - $(this).parent().parent().find(".select-filter-operation-value").prop('disabled', false); - $(this).parent().parent().find(".select-filter-option").prop('disabled', false); - } - - }); - - $("#applyFilter").click(function() { - - var selectFilterName = []; - var selectFilterOperation = []; - var selectFilterOperationValue = []; - var selectFilterOption = []; - - $("#selectedFilters > div").each(function(i, e) { - var tmpSelectFilterName = $(this).find('.hidden-field-name').val(); - var tmpSelectFilterOperation = $(this).find('.select-filter-operation').val(); - var tmpSelectFilterOperationValue = $(this).find('.select-filter-operation-value:enabled').val(); - var tmpSelectFilterOption = $(this).find('.select-filter-option:enabled').val(); - - selectFilterName.push(tmpSelectFilterName); - selectFilterOperation.push(tmpSelectFilterOperation); - selectFilterOperationValue.push(tmpSelectFilterOperationValue != null ? tmpSelectFilterOperationValue : ""); - selectFilterOption.push(tmpSelectFilterOption != null ? tmpSelectFilterOption : ""); - }); - - // - FHC_AjaxClient.ajaxCallPost( - 'system/Filters/applyFilter', - { - filterNames: selectFilterName, - filterOperations: selectFilterOperation, - filterOperationValues: selectFilterOperationValue, - filterOptions: selectFilterOption, - filter_page: FHC_FilterWidget._getFilterPage() - }, - { - successCallback: function(data, textStatus, jqXHR) { - FHC_FilterWidget._resetSelectedFilters(); - - location.reload(); - } - } - ); - }); - - $(".remove-selected-filter").click(function(event) { - // - FHC_AjaxClient.ajaxCallPost( - 'system/Filters/removeSelectedFilters', - { - fieldName: $(this).attr('filterToRemove'), - filter_page: FHC_FilterWidget._getFilterPage() - }, - { - successCallback: function(data, textStatus, jqXHR) { - FHC_FilterWidget._resetSelectedFilters(); - - location.reload(); - } - } - ); - }); }, @@ -743,8 +822,11 @@ $(document).ready(function() { } }); - FHC_FilterWidget.renderSelectedFields(); - FHC_FilterWidget.renderSelectedFilters(); - FHC_FilterWidget.renderTableDataset(); + // FHC_FilterWidget.setFilterName(); + // FHC_FilterWidget.renderSelectedFields(); + // FHC_FilterWidget.renderSelectedFilters(); + // FHC_FilterWidget.renderTableDataset(); + + FHC_FilterWidget.display(); });