Skip to content

Commit

Permalink
Fixed issue #15570: Column filter gets stuck after selecting once and…
Browse files Browse the repository at this point in the history
… does not filter certain columns
  • Loading branch information
ptelu committed Jan 9, 2020
1 parent 86eedc0 commit 9863858
Show file tree
Hide file tree
Showing 9 changed files with 257 additions and 203 deletions.
13 changes: 3 additions & 10 deletions application/controllers/admin/responses.php
Expand Up @@ -563,15 +563,8 @@ public function browse($iSurveyId)
}
}

// Checks if Columns have been filtered
$filterableColumnsExist = !empty(isset($_SESSION['survey_' . $iSurveyId]['filteredColumns'])
? $_SESSION['survey_' . $iSurveyId]['filteredColumns']
: null);
$filteredColumns = [];
if ($filterableColumnsExist) {
$filteredColumns = $_SESSION['survey_' . $iSurveyId]['filteredColumns'];
}
$aData['filterableColumnsExist'] = $filteredColumns;
// Sets which columns to filter
$filteredColumns = !empty(isset($_SESSION['survey_' . $iSurveyId]['filteredColumns'])) ? $_SESSION['survey_' . $iSurveyId]['filteredColumns'] : null;
$aData['filteredColumns'] = $filteredColumns;

// rendering
Expand Down Expand Up @@ -636,7 +629,7 @@ public function setFilteredColumns($surveyid)
if (isset($aColumns)) {
if (!empty($aColumns)) {
foreach ($aColumns as $sColumn) {
if (!empty($sColumn)) {
if (isset($sColumn)) {
$aFilteredColumns[] = $sColumn;
}
}
Expand Down
2 changes: 1 addition & 1 deletion application/helpers/viewHelper.php
Expand Up @@ -118,7 +118,7 @@ public static function getFieldText($aField, $aOption = array())

$sQuestionText = ""; // Allways return a string
if (isset($aField['fieldname'])) {
$sQuestionText = self::flatEllipsizeText($aField['question'], $aOption['flat'], $aOption['abbreviated'], $aOption['ellipsis']);
$sQuestionText = self::flatEllipsizeText(isset($aField['answertabledefinition']) ? $aField['answertabledefinition'] : $aField['question'], $aOption['flat'], $aOption['abbreviated'], $aOption['ellipsis']);
// Did this question have sub question, maybe not needed, think only isset is OK
$bHaveSubQuestion = isset($aField['aid']) && $aField['aid'] != "";
if($bHaveSubQuestion) {
Expand Down
33 changes: 16 additions & 17 deletions application/views/admin/responses/listResponses_view.php
Expand Up @@ -97,7 +97,7 @@
)
);

if (!$filterableColumnsExist || in_array('lastpage', $filterableColumnsExist ? $filteredColumns : [])) {
if (!isset($filteredColumns) || in_array('lastpage', $filteredColumns)) {
$aColumns[] = array(
'header' => 'lastpage',
'name' => 'lastpage',
Expand All @@ -107,9 +107,9 @@
$model->lastpage)
);
}
$filterableColumns[] = 'lastpage';
$filterableColumns['lastpage'] = 'lastpage';

if (!$filterableColumnsExist || in_array(gT("completed"), $filterableColumnsExist ? $filteredColumns : [])) {
if (!isset($filteredColumns) || in_array('completed', $filteredColumns)) {
$aColumns[] = array(
'header' => gT("completed"),
'name' => 'completed_filter',
Expand All @@ -121,11 +121,11 @@
array('' => gT('All'), 'Y' => gT('Yes'), 'N' => gT('No')))
);
}
$filterableColumns[] = gT("completed");
$filterableColumns['completed'] = gT("completed");

//add token to top of list if survey is not private
if ($bHaveToken) {
if (!$filterableColumnsExist || in_array('token', $filterableColumnsExist ? $filteredColumns : [])) {
if (!isset($filteredColumns) || in_array('token', $filteredColumns)) {
$aColumns[] = array(
'header' => 'token',
'name' => 'token',
Expand All @@ -134,9 +134,9 @@

);
}
$filterableColumns[] = 'token';
$filterableColumns['token'] = 'token';

if (!$filterableColumnsExist || in_array(gT("First name"), $filterableColumnsExist ? $filteredColumns : [])) {
if (!isset($filteredColumns) || in_array('firstname', $filteredColumns)) {
$aColumns[] = array(
'header' => gT("First name"),
'name' => 'tokens.firstname',
Expand All @@ -148,9 +148,9 @@
$model->firstname_filter)
);
}
$filterableColumns[] = gT("First name");
$filterableColumns['firstname'] = gT("First name");

if (!$filterableColumnsExist || in_array(gT("Last name"), $filterableColumnsExist ? $filteredColumns : [])) {
if (!isset($filteredColumns) || in_array('lastname', $filteredColumns)) {
$aColumns[] = array(
'header' => gT("Last name"),
'name' => 'tokens.lastname',
Expand All @@ -162,9 +162,9 @@
$model->lastname_filter)
);
}
$filterableColumns[] = gT("Last name");
$filterableColumns['lastname'] = gT("Last name");

if (!$filterableColumnsExist || in_array(gT("Email"), $filterableColumnsExist ? $filteredColumns : [])) {
if (!isset($filteredColumns) || in_array('email', $filteredColumns)) {
$aColumns[] = array(
'header' => gT("Email"),
'name' => 'tokens.email',
Expand All @@ -174,16 +174,16 @@
$model->email_filter)
);
}
$filterableColumns[] = gT("Email");
$filterableColumns['email'] = gT("Email");
}

if (!$filterableColumnsExist || in_array('startlanguage', $filterableColumnsExist ? $filteredColumns : [])) {
if (!isset($filteredColumns) || in_array('startlanguage', $filteredColumns)) {
$aColumns[] = array(
'header' => 'startlanguage',
'name' => 'startlanguage',
);
}
$filterableColumns[] = 'startlanguage';
$filterableColumns['startlanguage'] = 'startlanguage';
$encryptionNotice = gT("This field is encrypted and can only be searched by exact match. Please enter the exact value you are looking for.");

// The column model must be built dynamically, since the columns will differ from survey to survey, depending on the questions.
Expand All @@ -202,11 +202,10 @@
$base64jsonFieldMap = base64_encode(json_encode($fieldmap[$column->name]));
/* flat and ellipsize all part of question (sub question etc …, separate by br . mantis #14301 */
$colDetails = viewHelper::getFieldText($fieldmap[$column->name], array('abbreviated' => $model->ellipsize_header_value, 'separator' => array('<br>', '')));

/* Here we strip all tags, and separate with hr since we allow html (in popover), maybe use only viewHelper::purified ? But remind XSS. mantis #14301 */
$colTitle = viewHelper::getFieldText($fieldmap[$column->name], array('afterquestion' => "<hr>", 'separator' => array('', '<br>')));

if (!$filterableColumnsExist || in_array($colName . ': ' . $colDetails, $filterableColumnsExist ? $filteredColumns : [])) {
if (!isset($filteredColumns) || in_array($column->name, $filteredColumns)) {
$aColumns[] = array(
'header' => '<div data-toggle="popover" data-trigger="hover focus" data-placement="bottom" title="' . $colName . '" data-content="' . CHtml::encode($colTitle) . '" data-html="1" data-container="#responses-grid">' . $colName . ' <br/> ' . $colDetails . $encryptionSymbol . '</div>',
'headerHtmlOptions' => array('style' => 'min-width: 350px;'),
Expand All @@ -215,7 +214,7 @@
'value' => '$data->getExtendedData("' . $column->name . '", "' . $language . '", "' . $base64jsonFieldMap . '")',
);
}
$filterableColumns[] = $colName . ': ' . $colDetails;
$filterableColumns[$column->name] = $colName . ': ' . viewHelper::getFieldText($fieldmap[$column->name]);
}
}

Expand Down
36 changes: 23 additions & 13 deletions application/views/admin/responses/modal_subviews/filterColumns.php
@@ -1,6 +1,6 @@
<?php
$surveyid = App()->request->getParam('surveyid');
$surveyColumns = isset($filterableColumns) ? $filterableColumns : null;
$filterableColumns = isset($filterableColumns) ? $filterableColumns : null;
?>

<!-- Button trigger modal -->
Expand All @@ -12,26 +12,36 @@
<div class="modal fade" id="responses-column-filter-modal" tabindex="-1" role="dialog" aria-labelledby="responses-column-filter-label">
<div class="modal-dialog" role="document">
<div class="modal-content">
<form action="<?=App()->createUrl('/admin/responses/sa/setfilteredcolumns/', ['surveyid' => $surveyid])?>" class="pjax" method="POST">
<form action="<?= App()->createUrl('/admin/responses/sa/setfilteredcolumns/', ['surveyid' => $surveyid]) ?>" class="pjax" method="POST" data-filtered-columns=<?php echo json_encode($filteredColumns) ?>>
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title" id="responses-column-filter-modal"><?php eT("Select columns") ?></h4>
<h4 class="modal-title"><?php eT("Select columns") ?></h4>
</div>
<div class="modal-body">
<div class="form-group">
<label for="responses-column-filter-select"></label>
<select multiple="multiple" name="columns[]" id="responses-column-filter-select" class="form-control">
<?php foreach ($surveyColumns as $surveyColumn): ?>
<option <?php echo in_array($surveyColumn, $filteredColumns) ? 'selected' : '' ?>><?php echo $surveyColumn ?></option>
<?php endforeach; ?>
</select>
<input type="hidden" name="surveyid" value="<?=$surveyid?>" />
<input type="hidden" name="<?=Yii::app()->request->csrfTokenName?>" value="<?=App()->request->csrfToken?>" />
<div class="responses-column-filter-modal-checkbox-buttons">
<button id="responses-column-filter-modal-selectall" class="btn btn-default">
<span class="fa fa-check"></span>&nbsp;<?php eT("Select all"); ?>
</button>
<button id="responses-column-filter-modal-clear" class="btn btn-default">
<span class="fa fa-trash text-danger"></span>&nbsp;<?php eT("Clear selection"); ?>
</button>
</div>
<div class="form-group responses-multiselect-checkboxes">
<?php foreach ($filterableColumns as $columnName => $columnTitle): ?>
<div class="checkbox">
<label>
<input name="columns[]" type="checkbox" value="<?php echo $columnName ?>"<?php echo !isset($filteredColumns) || in_array($columnName, $filteredColumns) ? 'checked' : '' ?>>
<?php echo $columnTitle ?>
</label>
</div>
<?php endforeach; ?>
<input type="hidden" name="surveyid" value="<?= $surveyid ?>"/>
<input type="hidden" name="<?= Yii::app()->request->csrfTokenName ?>" value="<?= App()->request->csrfToken ?>"/>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal"><?php eT("Close"); ?></button>
<button id="responses-column-filter-modal-submit" class="btn btn-primary"><?php eT('Ok'); ?></button>
<button id="responses-column-filter-modal-cancel" type="button" class="btn btn-default" data-dismiss="modal"><?php eT("Cancel"); ?></button>
</div>
</form>
</div>
Expand Down

0 comments on commit 9863858

Please sign in to comment.