Skip to content

Commit

Permalink
ability to intersect or union filters
Browse files Browse the repository at this point in the history
  • Loading branch information
Alex-Jordan committed Dec 1, 2023
1 parent 237df81 commit cdcbe3a
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 12 deletions.
2 changes: 1 addition & 1 deletion lib/WeBWorK/HTML/ScrollingRecordList.pm
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ sub scrollingRecordList ($options, @records) {
$c->param("$name!format") || $options{default_format},
sortRecords(
$c->param("$name!sort") || $options{default_sort} || (@$sorts ? $sorts->[0][1] : ''),
filterRecords($c, \@selected_filters, @records)
filterRecords($c, $c->param("$name!filter_combine") // 'intersect', \@selected_filters, @records)
)
);
}
Expand Down
29 changes: 20 additions & 9 deletions lib/WeBWorK/Utils/FilterRecords.pm
Original file line number Diff line number Diff line change
Expand Up @@ -148,10 +148,11 @@ sub getFiltersForClass {
return \@filters;
}

=item filterRecords($c, $filters, @records)
=item filterRecords($c, $filter_combine, $filters, @records)
Given a list of filters and a list of records, returns a list of the records
after the selected filters are applied.
after the selected filters are applied. C<$filter_combine> should be 'union'
or 'intersect'.
C<$filters> should be a reference to an array of filters or be undefined.
Expand All @@ -160,7 +161,7 @@ C<$filters> should be a reference to an array of filters or be undefined.
=cut

sub filterRecords {
my ($c, $filters, @records) = @_;
my ($c, $filter_combine, $filters, @records) = @_;

return unless @records;

Expand All @@ -179,18 +180,28 @@ sub filterRecords {
$c->db->getPermissionLevelsWhere({ user_id => { not_like => 'set_id:%' } }))
: ();

my @filteredRecords;
for my $record (@records) {
my $intersect = ($filter_combine eq 'intersect');
my @filteredRecords = $intersect ? @records : ();
if ($intersect) {
for my $filter (@filtersToUse) {
my ($name, $value) = split(/:/, $filter);
# permission level is handled differently
if ($name eq 'permission') {
if ($permissionName{ $permissionLevels{ $record->user_id } } eq $value) {
@filteredRecords =
grep { $permissionName{ $permissionLevels{ $_->user_id } } eq $value } @filteredRecords;
} else {
@filteredRecords = grep { $_->$name eq $value } @filteredRecords;
}
}
} else {
for my $record (@records) {
for my $filter (@filtersToUse) {
my ($name, $value) = split(/:/, $filter);
# permission level is handled differently
if ($name eq 'permission' && $permissionName{ $permissionLevels{ $record->user_id } } eq $value) {
push @filteredRecords, $record;
last; # Only add a record once.
}
} else {
if ($record->$name eq $value) {
} elsif ($name ne 'permission' && $record->$name eq $value) {
push @filteredRecords, $record;
last; # Only add a record once.
}
Expand Down
12 changes: 10 additions & 2 deletions templates/HTML/ScrollingRecordList/scrollingRecordList.html.ep
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,16 @@
</div>
</div>
<div class="row mb-2">
<%= label_for "$name!filter" => maketext("Filter:"),
class => 'col-form-label col-form-label-sm col-2 pe-1 text-nowrap' =%>
<div class="col-2">
<%= label_for "$name!filter" => maketext('Filter(s):'),
class => 'col-form-label col-form-label-sm pe-1 text-nowrap' =%>
<div class="form-check p-0">
<%= radio_button "$name!filter_combine" => 'intersect', id => "$name!intersect_check", checked => undef =%>
<%= label_for "$name!intersect_check" => maketext('Intersect'), class => 'col-form-label-sm' =%>
<%= radio_button "$name!filter_combine" => 'union', id => "$name!union_check" =%>
<%= label_for "$name!union_check" => maketext('Union'), class => 'col-form-label-sm' =%>
</div>
</div>
<div class="col-10">
<%= select_field "$name!filter" => $filters, id => "$name!filter", class => 'form-select form-select-sm',
multiple => undef, size => 5 =%>
Expand Down

0 comments on commit cdcbe3a

Please sign in to comment.