package EPrints::Plugin::InputForm::Component::Field::ItemrefLookupjs; use EPrints; use EPrints::Plugin::InputForm::Component::Field; @ISA = ( "EPrints::Plugin::InputForm::Component::Field" ); use strict; sub new { my( $class, %opts ) = @_; my $self = $class->SUPER::new( %opts ); $self->{name} = "Container"; $self->{visible} = "all"; $self->{visdepth} = 1; return $self; } sub parse_config { my( $self, $config_dom ) = @_; my @fields = $config_dom->getElementsByTagName( "field" ); if( scalar @fields != 1 ) { EPrints::abort( "Bad configuration for Field Component\n".$config_dom->toString ); } else { $self->{config}->{field} = $self->xml_to_metafield( $fields[0] ); } $self->{config}->{title} = $self->{config}->{field}->render_name( $self->{session} ); my @titles = $config_dom->getElementsByTagName( "title" ); if( scalar @titles ) { $self->{config}->{title} = EPrints::XML::contents_of( $titles[0] ); } } sub update_from_form { my( $self, $processor ) = @_; my $field = $self->{config}->{field}; my $ibutton = $self->get_internal_button; my $initial_multi_values = $self->{dataobj}->get_value( $field->{name} ); # the values are held in hidden fields, if the field is not a multiple # then the value is in "prefix"_id_selected_0. # if the item is a multiple then the values are held in fields: # "prefix"_id_selected_1, "prefix"_id_selected_2, "prefix"_id_selected_3 ... # the number of items is held in the hidden field: "prefix"_id_selected_count my $selected_fields_to_ignore = {}; my $item_to_remove; if( $ibutton =~ /remove_selected$/ ) { # in this instance we need to delete the hidden field referred to so that it is not added if( $ibutton =~ /^(.+)_remove_selected$/ ) { my $item_to_remove = $1; $selected_fields_to_ignore->{$item_to_remove}++; } } elsif( $ibutton =~ /remove$/ ) { if ($field->get_property("multiple")) { if( $ibutton =~ /^(.+)_remove$/ ) { $item_to_remove = $1; } } else { $self->{dataobj}->set_value( $field->{name}, undef ); } } # now add any hidden fields if ($field->get_property("multiple")) { my $multi_values = []; foreach my $id (@$initial_multi_values) { push( @$multi_values, $id ) if $id != $item_to_remove; } my $hidden_item_count_field = $self->{prefix}."_id_selected_count"; my $hidden_item_count_param = $self->{session}->param($hidden_item_count_field); if ($hidden_item_count_param > 0) { for (my $i=1; $i <= $hidden_item_count_param; $i++ ) { my $hidden_item_field = $self->{prefix}."_id_selected_".$i; if (!defined $selected_fields_to_ignore->{$i} ) { my $hidden_item_param = $self->{session}->param($hidden_item_field); push @$multi_values, $hidden_item_param; } } } $self->{dataobj}->set_value( $field->{name}, $multi_values ); } else { if (!defined $selected_fields_to_ignore->{0} ) { my $hidden_item_count_field = $self->{prefix}."_id_selected_count"; my $hidden_item_count_param = $self->{session}->param($hidden_item_count_field); my $hidden_item_field = $self->{prefix}."_id_selected_0"; my $hidden_item_param = $self->{session}->param($hidden_item_field); if ( $hidden_item_param ) { $self->{dataobj}->set_value( $field->{name}, $hidden_item_param ); } } } return; } sub render_title { my( $self, $surround ) = @_; if ($self->{config}->{title}) { return $self->{config}->{title}; } return $self->{config}->{field}->render_name( $self->{session} ); } sub render_content { my( $self, $surround ) = @_; my $session = $self->{session}; my $field = $self->{config}->{field}; my $item = $self->{workflow}->{item}; my $out = $self->{session}->make_element( "div" ); # populate current value my $current_item_val = []; if ($field->get_property("multiple")) { $current_item_val = $item->get_value($field->get_name); } else { my $item_val = $item->get_value($field->get_name); if (defined $item_val) { push @$current_item_val, $item_val; } } my $display_params = {}; $display_params->{basename} = $field->get_name; $display_params->{button_text} = $self->phrase( "remove" ); $display_params->{button_id} = "_remove"; $display_params->{the_dataobj_id} = $current_item_val; if (scalar @$current_item_val) { $out->appendChild( $self->_format_item($display_params)); } else { # render the dialog box $out->appendChild( $self->_render_popup($session, $self->{prefix} ) ); # add the hidden fields for the JS popup $out->appendChild( $self->_render_hidden_item_field($display_params, 1) ); # Render the search box $out->appendChild( $self->_render_search ); } return $out; } # Params: # button_text: Text for the button # button_id: postfix for the button name # the_dataobj_id: id of the dataobj sub _format_item { my( $self, $params ) = @_; my $session = $self->{session}; my $field = $self->{config}->{field}; my $ds_id = $field->get_property("datasetid"); my $ds = $session->dataset( $ds_id ); my $items = $params->{the_dataobj_id}; my $item_count = scalar @$items; my $prefix = $self->{prefix}; my $table = $session->make_element( "table", class=>"ep_multi", id=>$prefix."_result_table" ); my $tr = $session->make_element( "tr", class=>"ep_first" ); my $th = $session->make_element( "th", class=>"ep_multi_heading", id=>$params->{basename}."_th_", rowspan=>$item_count ); $th->appendChild($field->render_name); $th->appendChild($session->make_text(":")); $tr->appendChild( $th ); foreach my $item_id (@$items) { my $the_dataobj = $ds->dataobj($item_id); my $prefix = $self->{prefix}."_".$item_id; my $remove_button = $session->render_button( class=> "ep_form_internal_button", name => "_internal_".$prefix.$params->{button_id}, value => $params->{button_text} ); my $td1 = $session->make_element( "td", class=>"ep_first"); $td1->appendChild( $remove_button ); my $td2 = $session->make_element( "td" , class=>"ep_multi_input ep_first"); if (defined $the_dataobj) { $td2->appendChild( $the_dataobj->render_description ); } else { $td2->appendChild( $self->html_phrase("dataobj_not_found", id=>$session->make_text($item_id)) ); } $tr->appendChild( $td2 ); $tr->appendChild( $td1 ); $table->appendChild( $tr ); $tr = $session->make_element( "tr", class=>"ep_first" ); } if ($field->get_property("multiple")) { my $table_div = $session->make_element( "div", id=>$self->{prefix}."_table_div", style=>"visibility:visible;" ); $table_div->appendChild($table); $table_div->appendChild( $self->_render_popup($session, $self->{prefix} ) ); $table_div->appendChild( $self->_render_hidden_item_field($params, 0) ); $table_div->appendChild($self->_render_search); return $table_div; } return $table; } sub _render_search { my( $self ) = @_; my $prefix = $self->{prefix}; my $session = $self->{session}; my $field = $self->{config}->{field}; my $bar = $self->html_phrase( $field->get_name."_search_bar", search_button=>$session->render_button( class=> "ep_form_internal_button", name=>"_internal_".$prefix."_search", name => "_internal_search_item", value=>$self->phrase( "search_search_button" ), onclick => "return EPJS_IdSelect_ShowPopup( '$prefix' );" ) ); my $search_div = $session->make_element( "div", id=>$prefix."_search_div", style=>"visibility:visible;" ); $search_div->appendChild($bar); return $search_div; } sub _render_hidden_item_field { my( $self, $params, $add_table ) = @_; my $prefix = $self->{prefix}; my $session = $self->{session}; my $field = $self->{config}->{field}; my $count_field_name = $prefix."_id_selected_count"; my $count_hidden_field = $session->render_hidden_field($count_field_name, "0"); my $type_field_name = $prefix."_id_selected_type"; my $type_hidden_field = $session->render_hidden_field($type_field_name, $field->get_property("multiple")); my $search_result_div = $session->make_element( "div", id=>$prefix."_search_result_div", style=>"visibility:hidden; display:none" ); $search_result_div->appendChild($count_hidden_field); $search_result_div->appendChild($type_hidden_field); if ($add_table) { my $table = $session->make_element( "table", class=>"ep_multi", id=>$prefix."_result_table" ); $search_result_div->appendChild($table); } return $search_result_div; } sub get_state_params { my( $self ) = @_; my $params = ""; foreach my $id ( "_internal_".$self->{prefix}."_search", "_internal_".$self->{prefix}."_clear", $self->{prefix}."_searchstore", $self->{prefix}."_searchtext", ) { my $v = $self->{session}->param( $id ); next unless defined $v; $params.= "&$id=$v"; } return $params; } sub _render_popup { my( $self, $session, $baserow ) = @_; my $prefix = $baserow."_popup"; my $field = $self->{config}->{field}; my $ds_id = $field->get_property("datasetid"); my $ds = $session->dataset( $ds_id ); my $base_id = $ds->base_id; my $text_field = "name"; $text_field = "title" if ($base_id eq "eprint"); my $popup = $session->make_element( "div", id => "$prefix", style => "display:none;background-color:#E7E9F5;white-space:normal;" ); my $titlebar = $session->make_element( "div", class=>"ep_sr_title_bar" ); $popup->appendChild( $titlebar ); my $title = $session->make_element( "div", class=>"ep_sr_title" ); $titlebar->appendChild( $title ); $title->appendChild( $self->html_phrase( "search_title" ) ); my $lookup_url = $session->get_repository->get_conf("rel_path")."/cgi/users/lookup/containerid"; my $pic_url = $session->get_repository->get_conf("rel_path")."/images/ajax_waiting.gif"; my $container_id = $self->{dataobj}->get_id; my $content = $session->make_element( "div", class=>"ep_sr_content" ); $popup->appendChild( $content ); $content->appendChild( $self->html_phrase( "search_preamble" ) ); $content->appendChild( $session->make_element( "input", "autocomplete" => "off", "maxlength" => "255", "name" => $prefix."_searchtext", "size" => "25", "id" => $prefix."_searchtext", "class" => "ep_form_text", "onkeypress" => "return EPJS_ItemSelect_block_enter( event, '$prefix', '$lookup_url', '$base_id', '$text_field', '$baserow', '$pic_url' );" ) ); # add Search button that starts the ajax query my $search_btn = $session->render_button( class=> "ep_container_button", name => "_internal_search_item", value => $self->phrase( "search_search_button" ), onclick => "return EPJS_ItemSelect_DoQuery( '$prefix', '$lookup_url', '$base_id', '$text_field', '$baserow', '$pic_url' );" ); my $cancel_btn = $session->render_button( class=> "ep_container_button", name => "_internal_search_item", value => $session->phrase( "lib/submissionform:action_cancel" ), onclick => "EPJS_ItemSelect_ClosePopup( \$( '$prefix' ) ); return false;" ); $content->appendChild( $cancel_btn ); $content->appendChild( $search_btn ); my $drop_div = $session->make_element( "div", id=>$prefix."_drop", class=>"ep_drop_target_box" ); $content->appendChild( $drop_div ); return $popup; } 1;