diff --git a/cfg.d/epm.pl b/cfg.d/epm.pl index e66a735..301ee90 100644 --- a/cfg.d/epm.pl +++ b/cfg.d/epm.pl @@ -2,9 +2,9 @@ use EPrints::EPM::Source; $c->{datasets}->{epm} = { - sqlname => "epm", - class => "EPrints::DataObj::EPM", - virtual => 1, + sqlname => "epm", + class => "EPrints::DataObj::EPM", + virtual => 1, }; @@ -14,10 +14,18 @@ # Define the EPM sources push @{$c->{epm}->{sources}}, { - name => "EPrints Bazaar", - base_url => "https://bazaar.eprints.org", + name => "EPrints Bazaar", + base_url => "https://bazaar.eprints.org", }; +# Don't cache EPMs +push @{$c->{citation_caching}->{excluded_dataobjs}}, 'epm'; + +push @{$c->{roles}->{admin}}, ( + "repository/epm", #EPrints Package Manager + "repository/epm-submit", #EPrints Package Manager - Bazaar Package Submission +); + =head1 COPYRIGHT =for COPYRIGHT BEGIN diff --git a/plugins/EPrints/Plugin/InputForm/Component/FileSelector.pm b/plugins/EPrints/Plugin/InputForm/Component/FileSelector.pm new file mode 100644 index 0000000..e52bb86 --- /dev/null +++ b/plugins/EPrints/Plugin/InputForm/Component/FileSelector.pm @@ -0,0 +1,256 @@ +=head1 NAME + +EPrints::Plugin::InputForm::Component::FileSelector + +=cut + +package EPrints::Plugin::InputForm::Component::FileSelector; + +use EPrints::Plugin::InputForm::Component; +@ISA = ( "EPrints::Plugin::InputForm::Component" ); + +use strict; + +sub new +{ + my( $class, %opts ) = @_; + + my $self = $class->SUPER::new( %opts ); + + $self->{name} = "FileSelector"; + $self->{visible} = "all"; +# $self->{surround} = "None" unless defined $self->{surround}; + + return $self; +} + +sub wishes_to_export +{ + my( $self ) = @_; + + return $self->{session}->param( $self->{prefix} . "_export" ); +} + +# only returns a value if it belongs to this component +sub update_from_form +{ + my( $self, $processor ) = @_; + + my $repo = $self->{repository}; + my $epm = $self->{workflow}->{item}; + + my @filenames = sort grep { + EPrints::Utils::is_set( $_ ) && + $_ !~ m#^(?:/|\.)# && + $_ !~ m#/\.# + } $repo->param( $self->{prefix} ); + + my $doc; + for(@{$epm->value( "documents" )}) + { + $doc = $_, last + if $_->value( "content" ) eq $self->{config}->{document}; + } + if( !defined $doc ) + { + $doc = $repo->dataset( "document" )->make_dataobj( { + content => $self->{config}->{document}, + files => [], + } ); + } + + foreach my $file (@filenames) + { + $file = $repo->dataset( "file" )->make_dataobj({ + filename => $file, + }); + } + + $doc->set_value( "files", \@filenames ); + $epm->set_value( "documents", [$doc] ); + + $epm->rebuild; + + return; +} + +# hmmm. May not be true! +sub is_required { 0 } + +sub get_fields_handled { qw( documents ) } + +sub render_content +{ + my( $self, $surround ) = @_; + + my $repo = $self->{repository}; + my $epm = $self->{workflow}->{item}; + + my $f = $repo->xml->create_document_fragment; + + my $epmid = $epm->id; + my @exclude = split /\s+/, <<"EOE"; + ^defaultcfg + ^entities\\.dtd\$ + ^mime\\.types\$ + ^epm/$epmid/$epmid\\.epm\$ + ^epm/$epmid/$epmid\\.epmi\$ +EOE + @exclude = grep { $_ =~ /\S/ } @exclude; + my $exclude_re = join '|', map { "(?:$_)" } @exclude; + $exclude_re = qr/$exclude_re/; + + my $doc; + for(@{$epm->value( "documents" )}) + { + $doc = $_, last + if $_->value( "content" ) eq $self->{config}->{document}; + } + if( !defined $doc ) + { + $doc = $repo->dataset( "document" )->make_dataobj( { + content => $self->{config}->{document}, + files => [], + } ); + } + my %selected; + my @filenames = map { $_->value( "filename" ) } @{$doc->value( "files" )}; + foreach my $filename (@filenames) + { + my @parts = split '/', $filename; + foreach my $i (0..$#parts) + { + $selected{join('/',@parts[0..$i])} = 1; + } + } + + my $tree = [ undef, [] ]; + my @stack = ($tree); + + my $path = $self->{config}->{path}; + $path =~ s! /*$ !/!x; + + File::Find::find({ + no_chdir => 1, + preprocess => sub { + my $filename = $File::Find::dir; + $filename =~ s/^.*\///; + my $rel = substr($File::Find::dir, length($path)); + my $node = [ $filename, [], + show => $selected{$rel} + ]; + push @{$stack[-1][1]}, $node; + push @stack, $node; + return sort { $a cmp $b } grep { $_ !~ /^\./ } @_; + }, + wanted => sub { + return if -d $File::Find::name; + my $rel = substr($File::Find::name, length($path)); + return if $rel =~ $exclude_re; + push @{$stack[-1][1]}, $rel; + }, + postprocess => sub { pop @stack; } + }, $path ); + + $tree = $tree->[1]; + + push @{$tree->[0]}, show => 1; + + $f->appendChild( $repo->xhtml->tree( $tree, + prefix => "ep_fileselector", + render_value => sub { $self->_render_value( \%selected, @_ ) }, + ) ); + + return $f; +} + +sub _render_value +{ + my( $self, $selected, $ctx, $children ) = @_; + + return $ctx if defined $children; + + my $repo = $self->{repository}; + my $xml = $repo->xml; + my $xhtml = $repo->xhtml; + my $frag = $xml->create_document_fragment; + + my @path = split '/', $ctx; + + my $id = $self->{prefix} . ':' . join('/',@path); + my $input = $xhtml->input_field( $self->{prefix}, join('/',@path), + type => "checkbox", + ($selected->{$ctx} ? (checked => "checked") : ()) + ); + my ($input_node) = $input->getElementsByTagName('input'); + $input_node->setAttribute( id => $id ); + $frag->appendChild( $input ); + $frag->appendChild( $xml->create_data_element( "label", $path[-1], + for => $id + ) ); + + return $frag; +} + +sub export_mimetype +{ + my( $self ) = @_; + + my $plugin = $self->note( "action" ); + if( defined($plugin) && $plugin->param( "ajax" ) eq "automatic" ) + { + return $plugin->export_mimetype; + } + + return $self->SUPER::export_mimetype(); +} + +sub validate +{ + my( $self ) = @_; + + my @problems = (); + + return @problems; +} + +sub parse_config +{ + my( $self, $config_dom ) = @_; + + $self->{config}->{path} = $config_dom->getAttribute( "path" ); + $self->{config}->{document} = $config_dom->getAttribute( "document" ); +} + +1; + +=head1 COPYRIGHT + +=for COPYRIGHT BEGIN + +Copyright 2022 University of Southampton. +EPrints 3.4 is supplied by EPrints Services. + +http://www.eprints.org/eprints-3.4/ + +=for COPYRIGHT END + +=for LICENSE BEGIN + +This file is part of EPrints 3.4 L. + +EPrints 3.4 and this file are released under the terms of the +GNU Lesser General Public License version 3 as published by +the Free Software Foundation unless otherwise stated. + +EPrints 3.4 is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +See the GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with EPrints 3.4. +If not, see L. + +=for LICENSE END +