aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan-Hendrik Willms <tleilax+studip@gmail.com>2025-08-26 08:53:09 +0200
committerJan-Hendrik Willms <tleilax+studip@gmail.com>2025-08-26 08:54:29 +0200
commit00dd77ab6d5763d93999f00250cb5e6f4de12e9c (patch)
treef85ecafa7cf671f337961c3669932963528592a4
parent5903190449f30edf66e8f0bb479ef19797e0ba27 (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.php11
-rw-r--r--lib/classes/AdminCourseFilter.php44
-rw-r--r--lib/classes/DataFieldSelectboxEntry.php5
-rw-r--r--lib/models/DataField.php21
-rw-r--r--templates/datafields/selectbox.php24
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>