Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
125 changes: 113 additions & 12 deletions js/source/legacy/CXGN/BreedersToolbox/AddTrial.js
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,15 @@ jQuery(document).ready(function ($) {
jQuery('#add_plant_entries').on('change', function() {
let plants_per_plot = jQuery(this).val();
jQuery('#greenhouse_default_num_plants_per_accession_val').val(plants_per_plot);
//jQuery('#num_plants_per_treatment').val(plants_per_plot);
greenhouse_show_num_plants_section()
});

// jQuery('#num_plants_per_treatment').on('change', function(){
// let plants_per_plot = jQuery(this).val();
// jQuery('#add_plant_entries').val(plants_per_plot);
// });

jQuery('#greenhouse_default_num_plants_per_accession_val').on('change', function() {
let plants_per_plot = jQuery(this).val();
jQuery('#add_plant_entries').val(plants_per_plot);
Expand Down Expand Up @@ -691,7 +697,11 @@ jQuery(document).ready(function ($) {

var num_rows_per_plot = $('#trial_create_rows_per_plot').val();
var num_cols_per_plot = $('#trial_create_cols_per_plot').val();
if ($('#trial_create_rows_and_columns_to_plants').prop('checked') && ($('#add_plant_entries').val() > num_rows_per_plot * num_cols_per_plot || num_rows_per_plot * num_cols_per_plot < Math.max(... greenhouse_num_plants.map(Number))) || num_rows_per_plot * num_cols_per_plot < num_plants_per_treatment) {
if ($('#trial_create_rows_and_columns_to_plants').prop('checked') && (
$('#add_plant_entries').val() > num_rows_per_plot * num_cols_per_plot ||
num_rows_per_plot * num_cols_per_plot < Math.max(...greenhouse_num_plants.map(Number)) ||
num_rows_per_plot * num_cols_per_plot < num_plants_per_treatment
)) {
alert("You specified in-plot coordinates, but the number of plants per plot is greater than the number of positions available in each plot. Please decrease the number of plants per plot or increase the number of available positions. If this is a greenhouse trial, make sure no accession is specified to have more plants than the number of allowed spaces. If this is a splitplot design, please make sure that the number of plants per plot specified in section (2) matches the number of plants per treatment.");
return;
}
Expand All @@ -706,6 +716,19 @@ jQuery(document).ready(function ($) {

var plot_numbering_scheme = $('input[name="plot_numbering_scheme"]:checked').val();

var plot_name_template = null;
var active_plot_naming_tab = jQuery('#plot_naming_tabs li.active a').attr('href');
if (active_plot_naming_tab === '#plot_naming_tab_template') {
var selected_template = jQuery('input[name="plot_name_template_idx"]:checked');
if (selected_template.length > 0) {
var template_idx = selected_template.val();
var templates = jQuery('#plot_template_radios').data('templates');
if (templates && templates[template_idx]) {
plot_name_template = JSON.stringify(templates[template_idx]);
}
}
}

$.ajax({
type: 'POST',
timeout: 3000000,
Expand Down Expand Up @@ -761,7 +784,9 @@ jQuery(document).ready(function ($) {
'use_same_layout' : use_same_layout,
'plot_numbering_scheme' : plot_numbering_scheme,
'num_cols_per_plot' : num_cols_per_plot,
'num_rows_per_plot' : num_rows_per_plot
'num_rows_per_plot' : num_rows_per_plot,
'plot_name_template': plot_name_template,
'breeding_program_name': jQuery('#select_breeding_program option:selected').text()
},
success: function (response) {
$('#working_modal').modal("hide");
Expand Down Expand Up @@ -2203,15 +2228,73 @@ jQuery(document).ready(function ($) {
}
});

$("#show_plot_naming_options").click(function () {
if ($('#show_plot_naming_options').is(':checked')) {
$("#plot_naming_options").show();
}
else {
$("#plot_naming_options").hide();
}
jQuery('#plot_naming_tabs a').on('shown.bs.tab', function(e) {
if (jQuery(e.target).attr('href') === '#plot_naming_tab_template') {
load_plot_name_templates();
}
});

function load_plot_name_templates() {
var breeding_program_id = jQuery('#select_breeding_program').val();
if (!breeding_program_id) {
jQuery('#plot_template_radios').html('<p><em>Please select a breeding program first.</em></p>');
return;
}
jQuery('#plot_template_radios').html('<p><em>Loading available templates...</em></p>');
var templates = {};
jQuery.ajax({
url: '/ajax/breeders/program/' + breeding_program_id + '/autogenerated_name_metadata',
type: 'GET',
success: function(response) {
var $container = jQuery('#plot_template_radios').empty();
if (response && response.data && response.data.length > 0) {
var has_plot_templates = false;
response.data.forEach(function(template_obj) {
var format_name = Object.keys(template_obj)[0];
var tmpl = template_obj[format_name];
if (tmpl.name_type !== 'plot') { return; }

has_plot_templates = true;
templates[format_name] = template_obj;

var $radio = jQuery('<div class="radio">');
var $label = jQuery('<label>');
$label.append(jQuery('<input type="radio" name="plot_name_template_idx">').val(format_name));
$label.append(jQuery('<strong>').text(' ' + format_name));
$radio.append($label);

var name_attributes = tmpl.name_attributes || [];
if (name_attributes.length > 0) {
var $components = jQuery('<div style="margin-left:20px; margin-top:4px">');
name_attributes.forEach(function(attr, i) {
if (typeof attr === 'object') {
$components.append(document.createTextNode(attr.text));
} else {
$components.append(jQuery('<span class="label label-default">').text(attr));
}
if (i < name_attributes.length - 1) {
$components.append(document.createTextNode('_'));
}
});
$radio.append($components);
}

$container.append($radio);
});
if (!has_plot_templates) {
$container.html('<p><em>No plot name templates available for this breeding program.</em></p>');
}
} else {
$container.html('<p><em>No plot name templates available for this breeding program.</em></p>');
}
jQuery('#plot_template_radios').data('templates', templates);
},
error: function() {
jQuery('#plot_template_radios').html('<p class="text-danger">Error loading templates.</p>');
}
});
}

$("#show_field_map_options").click(function () {
if ($('#show_field_map_options').is(':checked')) {
$("#field_map_options").show();
Expand Down Expand Up @@ -2299,7 +2382,8 @@ jQuery(document).ready(function ($) {
var plot_prefix = jQuery('#plot_prefix').val();
var start_number = jQuery('#start_number').val();
var increment = jQuery('#increment').val();
var breeding_program_name = jQuery('#select_breeding_program').val();
var breeding_program_name = jQuery('#select_breeding_program option:selected').text();
var breeding_program_id = jQuery('#select_breeding_program').val();
var fieldmap_col_number = jQuery('#fieldMap_col_number').val();
var fieldmap_row_number = jQuery('#fieldMap_row_number').val();
var plot_layout_format = jQuery('#plot_layout_format').val();
Expand Down Expand Up @@ -2329,6 +2413,18 @@ jQuery(document).ready(function ($) {

var plot_numbering_scheme = jQuery('input[name="plot_numbering_scheme"]:checked').val();

var save_plot_name_template = null;
if (jQuery('#plot_naming_tabs li.active a').attr('href') === '#plot_naming_tab_template') {
var saved_selected = jQuery('input[name="plot_name_template_idx"]:checked');
if (saved_selected.length > 0) {
var saved_format_name = saved_selected.val();
var saved_templates = jQuery('#plot_template_radios').data('templates');
if (saved_templates && saved_templates[saved_format_name]) {
save_plot_name_template = JSON.stringify(saved_templates[saved_format_name]);
}
}
}

jQuery.ajax({
type: 'POST',
timeout: 3000000,
Expand Down Expand Up @@ -2359,6 +2455,7 @@ jQuery(document).ready(function ($) {
'increment': increment,
'design_json': design_json,
'breeding_program_name': breeding_program_name,
'breeding_program_id' : breeding_program_id,
'greenhouse_num_plants': JSON.stringify(greenhouse_num_plants),
'fieldmap_col_number': fieldmap_col_number,
'fieldmap_row_number': fieldmap_row_number,
Expand All @@ -2375,7 +2472,8 @@ jQuery(document).ready(function ($) {
'field_trial_is_planned_to_be_genotyped': field_trial_is_planned_to_be_genotyped,
'field_trial_is_planned_to_cross': field_trial_is_planned_to_cross,
'add_project_trial_source': selectedTrials,
'use_same_layout' : use_same_layout
'use_same_layout' : use_same_layout,
'plot_name_template': save_plot_name_template
},
success: function (response) {
trial_id = response.trial_id;
Expand Down Expand Up @@ -2501,10 +2599,13 @@ jQuery(document).ready(function ($) {

jQuery('#select_breeding_program').change(function(){
populate_trial_linkage_selects();
if (jQuery('#plot_naming_tabs li.active a').attr('href') === '#plot_naming_tab_template') {
load_plot_name_templates();
}
});

function populate_trial_linkage_selects(){
get_select_box('trials', 'add_project_trial_source', {'id':'add_project_trial_source_select', 'name':'add_project_trial_source_select', 'breeding_program_name':jQuery('#select_breeding_program').val(), 'multiple':1, 'empty':1} );
get_select_box('trials', 'add_project_trial_source', {'id':'add_project_trial_source_select', 'name':'add_project_trial_source_select', 'breeding_program_id':jQuery('#select_breeding_program').val(), 'multiple':1, 'empty':1} );
}

jQuery('button[name="new_trial_add_treatments"]').click(function(){
Expand Down
11 changes: 11 additions & 0 deletions lib/CXGN/AddAutogeneratedNameMetadata.pm
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,17 @@ sub add_info {
return {error => "This format name is already used in the database! Please use another format name.\n"};
}

my %attrs = map { $_ => 1 } grep { !ref $_ } @$name_attributes;

if ($name_type eq 'plot') {
unless ($attrs{trialName}) {
return {error => "Plot name template must include 'trialName' to produce globally unique stock names.\n"};
}
unless ($attrs{plotNumber} || ($attrs{rowNumber} && $attrs{colNumber}) || ($attrs{accessionName} && $attrs{repNumber})) {
return {error => "Plot name template must include 'plotNumber', or both 'rowNumber' and 'colNumber', or both 'accessionName' and 'repNumber' to produce globally unique stock names.\n"};
}
}

my $name_metadata_cvterm;
if ($name_type eq 'transformant') {
$name_metadata_cvterm = SGN::Model::Cvterm->get_cvterm_row($schema, 'transformant_autogenerated_name_metadata', 'project_property');
Expand Down
8 changes: 8 additions & 0 deletions lib/CXGN/Trial/TrialCreate.pm
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,8 @@ has 'sampling_trial_sample_type' => (isa => 'Str', is => 'rw');

has 'owner_id' => (isa => 'Int' , is => 'rw');

has 'plot_name_template' => (isa => 'Maybe[Str]', is => 'rw', predicate => 'has_plot_name_template', required => 0);

sub trial_name_already_exists {
my $self = shift;

Expand Down Expand Up @@ -411,6 +413,12 @@ sub save_trial {
$project_year_cvterm->name() => $self->get_trial_year(),
$project_design_cvterm->name() => $self->get_design_type()
});
if ($self->has_plot_name_template && $self->get_plot_name_template) {
my $plot_autogenerated_name_metadata_cvterm = SGN::Model::Cvterm->get_cvterm_row($chado_schema, 'plot_autogenerated_name_metadata', 'project_property');
$project->create_projectprops({
$plot_autogenerated_name_metadata_cvterm->name() => $self->get_plot_name_template
});
}
if ($self->has_field_size && $self->get_field_size){
$project->create_projectprops({
$field_size_cvterm->name() => $self->get_field_size
Expand Down
Loading
Loading