package LIMS::Controller::Admin::Lab::Section::StatusOptions; use Moose; BEGIN { extends 'LIMS::Base'; } with 'LIMS::Controller::Roles::DataMap'; __PACKAGE__->meta->make_immutable(inline_constructor => 0); use LIMS::Local::Sugar; __PACKAGE__->authz->authz_runmodes( ':all' => 'do_admin' ); # ------------------------------------------------------------------------------ startmode default { $self->_debug_path($self->get_current_runmode); { # lab_section_status_options table data: my $section_options = $self->all_lab_section_status_options_map; $self->tt_params( section_options => $section_options ); } { # lab-sections map: my $lab_sections_map = $self->lab_sections_map; $self->tt_params( lab_sections_map => $lab_sections_map ); } return $self->tt_process; } # ------------------------------------------------------------------------------ runmode edit ($id) { $self->_debug_path($self->get_current_runmode); $id || return $self->error( 'no id passed to ' . $self->get_current_runmode ); { # lab_section_status_options map for this lab_section.id: my $data = $self->_lab_section_status_options_map($id); $self->tt_params( data => $data ); } { # all lab_test_status_options: my $options = $self->model('Base')->get_objects('LabTestStatusOption'); # re-order alphabetically: my @opts = sort { lc $a->description cmp lc $b->description } @$options; $self->tt_params( status_options => \@opts ); } { # lab-sections map (need to 'invert' $self->lab_sections_map): my $lab_section = $self->model('LabSection')->get_lab_section($id); $self->tt_params( lab_section => $lab_section ); } return $self->tt_process; } # ------------------------------------------------------------------------------ runmode update ($id) { $self->_debug_path($self->get_current_runmode); $id || return $self->error( 'no id passed to ' . $self->get_current_runmode ); my $dfv = $self->check_rm('edit', $self->validate('section_status_options') ); my $data = $dfv->valid; # only valid param = option_data # options submitted as composite of option_id~~position; need to check position # is unique or will die in model from unique key constraint: my @opts = $self->query->param('option_data'); # same as in $data, but in array format my %seen; for (@opts) { next unless /~~/; # empty rows submitted my ($option_id, $position) = split /~~/; if ( $seen{$position}++ ) { # have duplicate position $self->flash( error => $self->messages('admin')->{status_option}->{position_not_unique} ); my $url = '/admin/lab_section_status-options/edit/' . $id; return $self->redirect( $self->query->url . $url ); } } $data->{section_id} = $id; my $rtn = $self->model('LabSection')->update_section_status_options($data); if ($rtn) { return $self->error($rtn); } else { $self->flash( info => $self->messages('action')->{edit_success}); return $self->redirect( $self->query->url . '/admin/lab_section_status-options' ); } } # ------------------------------------------------------------------------------ sub _lab_section_status_options_map { my ($self, $section_id) = @_; my $o = $self->model('LabSection')->get_section_status_options($section_id); my %map = map { $_->status_option_id => $_->position; } @$o; return \%map; } 1;