diff options
| author | Jan-Hendrik Willms <tleilax+studip@gmail.com> | 2025-08-26 08:53:09 +0200 |
|---|---|---|
| committer | Jan-Hendrik Willms <tleilax+studip@gmail.com> | 2025-08-26 08:54:29 +0200 |
| commit | 00dd77ab6d5763d93999f00250cb5e6f4de12e9c (patch) | |
| tree | f85ecafa7cf671f337961c3669932963528592a4 | |
| parent | 5903190449f30edf66e8f0bb479ef19797e0ba27 (diff) | |
fix filters for select and boolean, fix filtering for deleted datafields, use default as well, some cleanupbiest-5848
| -rw-r--r-- | app/controllers/admin/courses.php | 11 | ||||
| -rw-r--r-- | lib/classes/AdminCourseFilter.php | 44 | ||||
| -rw-r--r-- | lib/classes/DataFieldSelectboxEntry.php | 5 | ||||
| -rw-r--r-- | lib/models/DataField.php | 21 | ||||
| -rw-r--r-- | templates/datafields/selectbox.php | 24 |
5 files changed, 87 insertions, 18 deletions
diff --git a/app/controllers/admin/courses.php b/app/controllers/admin/courses.php index 426f25a..32081e3 100644 --- a/app/controllers/admin/courses.php +++ b/app/controllers/admin/courses.php @@ -59,7 +59,7 @@ class Admin_CoursesController extends AuthenticatedController URLHelper::getURL( 'dispatch.php/admin/courses/index' ), - ['onclick' => "$(this).toggleClass(['options-checked', 'options-unchecked']); STUDIP.AdminCourses.App.changeFilter({'df_".$datafield->id."': $(this).hasClass('options-checked') ? 1 : 0}); return false;"] + ['onclick' => "$(this).toggleClass(['options-checked', 'options-unchecked']); STUDIP.AdminCourses.App.changeFilter({'df_".$datafield->id."': $(this).hasClass('options-checked') ? 1 : ''}); return false;"] ); return $checkboxWidget; } elseif ($entry instanceof DataFieldSelectboxEntry) { @@ -333,11 +333,17 @@ class Admin_CoursesController extends AuthenticatedController 'teacher_filter' => $configuration->ADMIN_COURSES_TEACHERFILTER, ] ); + $filters = array_filter( + $filters, + function ($value): bool { + return isset($value) && $value !== ''; + } + ); return [ 'setActivatedFields' => $this->getFilterConfig(), 'setActionArea' => $configuration->MY_COURSES_ACTION_AREA ?? '1', - 'setFilter' => array_filter($filters), + 'setFilter' => $filters, ]; } @@ -602,6 +608,7 @@ class Admin_CoursesController extends AuthenticatedController isset($filters[$key]) && $filters[$key] !== '' && in_array($datafield->id, $activeSidebarElements['datafields']) + && $filters[$key] != $datafield->default_value ) { $datafields_filters[$datafield->id] = $filters[$key]; } else { diff --git a/lib/classes/AdminCourseFilter.php b/lib/classes/AdminCourseFilter.php index bdb84d2..04d7d17 100644 --- a/lib/classes/AdminCourseFilter.php +++ b/lib/classes/AdminCourseFilter.php @@ -157,14 +157,42 @@ class AdminCourseFilter if (!$reset_settings) { $datafields_filters = $GLOBALS['user']->cfg->ADMIN_COURSES_DATAFIELDS_FILTERS; - foreach ($datafields_filters as $datafield_id => $value) { - $this->query->join('de_'.$datafield_id, 'datafields_entries', 'de_'.$datafield_id.'.range_id = seminare.Seminar_id AND `de_'.$datafield_id.'`.datafield_id = :de_'.$datafield_id.'_id'); - $this->query->where('de_' . $datafield_id . '_contents', 'de_' . $datafield_id . '.`content` LIKE :de_' . $datafield_id . '_content', - [ - 'de_' . $datafield_id . '_id' => $datafield_id, - 'de_' . $datafield_id . '_content' => '%' . $value . '%' - ]); - } + + DataField::findEachMany( + function (DataField $datafield) use (&$datafields_filters) { + $this->query->join( + "de_{$datafield->id}", + 'datafields_entries', + "de_{$datafield->id}.range_id = seminare.Seminar_id AND `de_{$datafield->id}`.datafield_id = :de_{$datafield->id}_id" + ); + $this->query->join( + "dd_{$datafield->id}", + 'datafields', + "dd_{$datafield->id}.datafield_id = de_{$datafield->id}.datafield_id" + ); + + if ($datafield->isNumericType()) { + $this->query->where( + "de_{$datafield->id}_contents", + "IFNULL(de_{$datafield->id}.`content`, dd_{$datafield->id}.`default_value`) = :de_{$datafield->id}_content", + [ + "de_{$datafield->id}_id" => $datafield->id, + "de_{$datafield->id}_content" => $datafields_filters[$datafield->id] + ] + ); + } else { + $this->query->where( + "de_{$datafield->id}_contents", + "IFNULL(de_{$datafield->id}.`content`, dd_{$datafield->id}.`default_value`) LIKE :de_{$datafield->id}_content", + [ + "de_{$datafield->id}_id" => $datafield->id, + "de_{$datafield->id}_content" => '%' . $datafields_filters[$datafield->id] . '%' + ] + ); + } + }, + array_keys($datafields_filters) + ); } } diff --git a/lib/classes/DataFieldSelectboxEntry.php b/lib/classes/DataFieldSelectboxEntry.php index 4c9c890..4a1cc02 100644 --- a/lib/classes/DataFieldSelectboxEntry.php +++ b/lib/classes/DataFieldSelectboxEntry.php @@ -92,8 +92,9 @@ class DataFieldSelectboxEntry extends DataFieldEntry public function getDisplayValue($entities = true) { $value = $this->is_assoc_param - ? $this->type_param[$this->getValue()] - : $this->getValue(); + ? $this->type_param[$this->getValue()] ?? '' + : $this->getValue(); + return $entities ? htmlReady($value) : $value; } } diff --git a/lib/models/DataField.php b/lib/models/DataField.php index a4b6f95..4f8ca36 100644 --- a/lib/models/DataField.php +++ b/lib/models/DataField.php @@ -264,6 +264,25 @@ class DataField extends SimpleORMap implements PrivacyObject } /** + * Returns whether this datafield is of a numeric type. + */ + public function isNumericType(): bool + { + if ($this->type === 'bool') { + return true; + } + + $entry = DataFieldEntry::createDataFieldEntry($this); + if (!$entry instanceof DataFieldSelectboxEntry) { + return false; + } + + [, $is_assoc] = $entry->getParameters(); + + return $is_assoc; + } + + /** * Export available data of a given user into a storage object * (an instance of the StoredUserData class) for that user. * @@ -287,6 +306,4 @@ class DataField extends SimpleORMap implements PrivacyObject } } } - - } diff --git a/templates/datafields/selectbox.php b/templates/datafields/selectbox.php index 0cc263e..177cc59 100644 --- a/templates/datafields/selectbox.php +++ b/templates/datafields/selectbox.php @@ -1,3 +1,14 @@ +<?php +/** + * @var Datafield $model + * @var DatafieldEntry $entry + * @var string $value + * @var string $name + * @var bool $multiple + * @var bool $is_assoc + * @var array $type_param + */ +?> <label> <span class="datafield_title <?= $model->is_required ? 'required' : '' ?>"> <?= htmlReady($model->name) ?> @@ -18,13 +29,18 @@ return ' selected'; }; ?> - <select name="<?= $name ?>[<?= $model->id ?>]<? if ($multiple) echo '[]'; ?>" - id="<?= $name ?>_<?= $model->id ?>" - <?= !$entry->isEditable() ? "disabled" : "" ?> + <select name="<?= htmlReady($name) ?>[<?= htmlReady($model->id) ?>]<? if ($multiple) echo '[]'; ?>" + id="<?= htmlReady($name) ?>_<?= htmlReady($model->id) ?>" + <? if (!$entry->isEditable()) echo 'disabled'; ?> <? if ($multiple) echo 'multiple'; ?> <? if ($model->is_required) echo 'required'; ?>> + <? if (!$model->is_required): ?> + <option value=""> + (<?= _('keine Auswahl') ?>) + </option> + <? endif; ?> <? foreach ($type_param as $pkey => $pval): ?> - <option value="<?= $is_assoc ? (string)$pkey : $pval ?>" + <option value="<?= htmlReady($is_assoc ? (string) $pkey : $pval) ?>" <?= $selected($is_assoc ? (string)$pkey : $pval) ?>> <?= htmlReady($pval) ?> </option> |
