Skip to content

Commit

Permalink
Fix person filter not working with org filter
Browse files Browse the repository at this point in the history
  • Loading branch information
abeverley committed Jul 6, 2024
1 parent 445347e commit ce45f6b
Show file tree
Hide file tree
Showing 6 changed files with 63 additions and 27 deletions.
2 changes: 1 addition & 1 deletion lib/GADS/API.pm
Original file line number Diff line number Diff line change
Expand Up @@ -1351,7 +1351,7 @@ any ['get', 'post'] => '/api/users' => require_any_role [qw/useradmin superadmin
my $start = $params->get('start') || 0;
my $length = $params->get('length') || 10;

my $users = GADS::Users->new(schema => schema)->user_summary_rs;
my $users = schema->resultset('User')->summary;
my $total = $users->count;
my $col_order = $params->get('order[0][column]');
my $sort_by = defined $col_order && $params->get("columns[${col_order}][name]");
Expand Down
2 changes: 1 addition & 1 deletion lib/GADS/Column/Person.pm
Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,7 @@ sub random

sub resultset_for_values
{ my $self = shift;
$self->schema->resultset('User')->active->with_filter($self->filter);
$self->schema->resultset('User')->summary->with_filter($self->filter);
}

sub cleanup
Expand Down
8 changes: 8 additions & 0 deletions lib/GADS/Schema/Result/Site.pm
Original file line number Diff line number Diff line change
Expand Up @@ -297,24 +297,32 @@ sub user_fields
description => 'Title',
type => 'dropdown',
placeholder => 'Select title',
table => 'title',
field => 'name',
} if $self->register_show_title;
push @fields, {
name => 'organisation',
description => $self->organisation_name,
type => 'dropdown',
placeholder => 'Select ' . $self->organisation_name,
table => 'organisation',
field => 'name',
} if $self->register_show_organisation;
push @fields, {
name => 'department_id',
description => $self->department_name,
type => 'dropdown',
placeholder => 'Select ' . $self->department_name,
table => 'department',
field => 'name',
} if $self->register_show_department;
push @fields, {
name => 'team_id',
description => $self->team_name,
type => 'dropdown',
placeholder => 'Select ' . $self->team_name,
table => 'team',
field => 'name',
} if $self->register_show_team;
push @fields, {
name => 'freetext1',
Expand Down
29 changes: 23 additions & 6 deletions lib/GADS/Schema/ResultSet/User.pm
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,23 @@ sub active
});
}

sub summary
{ my $self = shift;
$self->active->search_rs({},{
columns => [
'me.id', 'me.surname', 'me.firstname', 'title.name', 'me.email',
'organisation.name', 'department.name', 'team.name', 'me.created',
'me.freetext1', 'me.freetext2',
'me.lastlogin', 'me.value',
],
join => [
'organisation', 'department', 'team', 'title',
],
order_by => 'surname',
collapse => 1,
});
}

sub active_and_requests
{ my ($self, %search) = @_;

Expand All @@ -52,31 +69,31 @@ has valid_fields => (
sub _build_valid_fields
{ my $self = shift;
my $site = $self->result_source->schema->resultset('Site')->next;
my %fields = map { $_->{name} => 1 } $site->user_fields;
my %fields = map { $_->{name} => $_ } $site->user_fields;
\%fields;
}

sub rule_to_condition
{ my ($self, $rule) = @_;

my ($field, $operator, $value) = ($rule->{field}, $rule->{operator}, $rule->{value});
my ($field_name, $operator, $value) = ($rule->{field}, $rule->{operator}, $rule->{value});

# Check valid value
$self->valid_fields->{$field}
or error __x"Invalid user field {field}", field => $field;
my $field = $self->valid_fields->{$field_name}
or error __x"Invalid user field {field}", field => $field_name;

my $mappedOperator = $self->field_map->{$operator};
my $mappedValue = $self->get_filter_value($operator, $value);

return (
$field => { $mappedOperator => $mappedValue },
$field->{table} ? "$field->{table}.$field->{field}" : $field->{name} => { $mappedOperator => $mappedValue },
);
}

sub with_filter
{ my ($self, $filter) = @_;
$filter or return $self;
$self->search_rs($self->map_rules($filter->as_hash));
$self->search_rs({$self->map_rules($filter->as_hash)});
}

sub create_user
Expand Down
19 changes: 1 addition & 18 deletions lib/GADS/Users.pm
Original file line number Diff line number Diff line change
Expand Up @@ -87,26 +87,9 @@ sub user_rs
$self->schema->resultset('User')->active;
}

sub user_summary_rs
{ my $self = shift;
$self->user_rs->search_rs({},{
columns => [
'me.id', 'me.surname', 'me.firstname', 'title.name', 'me.email',
'organisation.name', 'department.name', 'team.name', 'me.created',
'me.freetext1', 'me.freetext2',
'me.lastlogin', 'me.value',
],
join => [
'organisation', 'department', 'team', 'title',
],
order_by => 'surname',
collapse => 1,
});
}

sub _build_all
{ my $self = shift;
my $users = $self->user_summary_rs->with_filter($self->filter);
my $users = $self->user_rs->summary->with_filter($self->filter);
[$users->all];
}

Expand Down
30 changes: 29 additions & 1 deletion t/009_typeahead.t
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ my $data = [
string1 => 'Foo',
curval1 => 2,
daterange1 => ['2012-02-10', '2013-06-15'],
person1 => 1,
},
{
string1 => 'Bar',
Expand All @@ -25,7 +26,7 @@ my $data = [
},
];

my $curval_sheet = Test::GADS::DataSheet->new(instance_id => 2);
my $curval_sheet = Test::GADS::DataSheet->new(instance_id => 2, site_id => 1);
$curval_sheet->create_records;
my $schema = $curval_sheet->schema;
my $sheet = Test::GADS::DataSheet->new(data => $data, schema => $schema, curval => 2);
Expand All @@ -43,6 +44,33 @@ is ("@values", "foo1", "Typeahead returned correct values");
@values = $column->values_beginning_with('');
is (scalar @values, 3, "Typeahead returns all results for blank string");

# Person typeahead
$column = $columns->{person1};
@values = map $_->{label}, $column->values_beginning_with('User1');
is (scalar @values, 1, "Person typeahead returned correct number of results");
is ("@values", "User1, User1", "Typeahead returned correct values");
# Test for person field with filter
# Add new org
my $org = $schema->resultset('Organisation')->create({
name => 'Another Organisation',
});
# Set single user to new org
$schema->resultset('User')->find(2)->update({ organisation => $org->id });
$column->filter(GADS::Filter->new(
as_hash => {
rules => [{
field => 'organisation',
type => 'string',
value => 'Another Organisation',
operator => 'equal',
}],
},
));
$column->write;
@values = map $_->{label}, $column->values_beginning_with('User');
is (scalar @values, 1, "Person typeahead returned correct number of results");
is ("@values", "User2, User2", "Typeahead returned correct values");

$column = $columns->{curval1};
$column->value_selector('typeahead');
$column->write;
Expand Down

0 comments on commit ce45f6b

Please sign in to comment.