package LIMS::Controller::ReferralSource;
use strict;
use base 'LIMS::Base';
use Data::Dumper;
use LIMS::Local::ExcelHandler;
# ------------------------------------------------------------------------------
sub default : StartRunmode {
my $self = shift; $self->_debug_path($self->get_current_runmode);
my $location_type = $self->query->param('lookup');
$self->tt_params( location_type => $location_type );
my @data_files = $self->_get_data_files(); # wantarray-aware
$self->tt_params( data_files => \@data_files );
return $self->tt_process;
}
# ------------------------------------------------------------------------------
# just set a flag to skip headers (default .tt shared with a popup) & forward:
sub select : Runmode {
my $self = shift; $self->_debug_path($self->get_current_runmode);
$self->stash( skip_wrapper => 1 );
return $self->forward('default');
}
# ------------------------------------------------------------------------------
# lookup function for new hospital/practice/GP, etc:
sub lookup : Runmode {
my $self = shift; $self->_debug_path($self->get_current_runmode);
my $location_type = $self->query->param('type')
|| return $self->error('no location type passed to '.$self->get_current_runmode);
my $string = $self->query->param('string')
|| return $self->error('no search string passed to '.$self->get_current_runmode);
# preserve 'skip_wrapper' flag if passed from form as hidden field:
if ( my $flag = $self->query->param('skip_wrapper') ) {
$self->stash( skip_wrapper => $flag );
}
# need min 3 chars to search:
return unless length $string >= 3;
my $xl = LIMS::Local::ExcelHandler->new(); # $self->debug($xl);
$xl->source($location_type);
# array of hashrefs:
my $matches = $xl->parse($string); # $self->debug($matches);
my $file_data = $xl->filedata;
=begin # AJAX/xml:
my $xml = $self->_format_as_xml($matches);
# set header type to xml:
$self->header_props(-type=>'text/xml');
return $xml;
=cut
# call-back to highlight search terms in escaped HTML:
my $q = $self->query; # don't use $self inside callback or get circular ref!
my $highlight = sub {
my $str = shift;
$str =~ s/($string)/$q->b($1)/egi; # highlight search term
return $str;
};
my $data_files = $self->_get_data_files(); # warn Dumper $data_files;
my %subdirs = map { # map of filename => digital.nhs.uk subdir:
$data_files->{$_}->{filename} => $data_files->{$_}->{subdir}
} keys %$data_files; # warn Dumper \%subdirs;
my @files = keys %$data_files; # warn Dumper \@files;
$self->tt_params(
subdirs => \%subdirs,
matches => $matches,
file_data => $file_data,
highlight => $highlight,
data_files => \@files,
location_type => $location_type,
);
$self->tt_process('referralsource/default.tt');
}
# ------------------------------------------------------------------------------
sub _get_data_files {
my $self = shift;
my $data = $self->get_yaml_file('cfh_data_files');
# return array of keys, or full hashref:
return wantarray ? keys %$data : $data;
}
# ------------------------------------------------------------------------------
=begin # for ajax function, but too slow for ajax
sub _format_as_xml {
my $self = shift;
my $matches = shift;
my @rs = map {
sprintf q!<rs id="%s" info="%s">%s</rs>!,
$_->{code},
$_->{code},
$self->query->escapeHTML($_->{display}), # escape eg '&' or output fails
} @$matches;
my $results =
sprintf q!<?xml version="1.0" encoding="utf-8" ?><results>%s</results>!, ( join '', @rs );
return $results;
}
=cut
1;