use Scalar::Util qw( blessed );
use Try::Tiny qw( catch try );
-use Koha::REST::V1::ERM::EHoldings::Packages::Manual;
+use Koha::REST::V1::ERM::EHoldings::Packages::Local;
use Koha::REST::V1::ERM::EHoldings::Packages::EBSCO;
=head1 API
=cut
sub list {
- my $provider = C4::Context->preference('ERMProvider');
+ my $c = shift->openapi->valid_input or return;
+
+ my $provider = $c->validation->param('provider');
if ( $provider eq 'ebsco' ) {
- return Koha::REST::V1::ERM::EHoldings::Packages::EBSCO::list(@_);
+ return Koha::REST::V1::ERM::EHoldings::Packages::EBSCO::list($c);
} else {
- return Koha::REST::V1::ERM::EHoldings::Packages::Manual::list(@_);
+ return Koha::REST::V1::ERM::EHoldings::Packages::Local::list($c);
}
}
=cut
sub get {
- my $provider = C4::Context->preference('ERMProvider');
+ my $c = shift->openapi->valid_input or return;
+
+ my $provider = $c->validation->param('provider');
if ( $provider eq 'ebsco' ) {
- return Koha::REST::V1::ERM::EHoldings::Packages::EBSCO::get(@_);
+ return Koha::REST::V1::ERM::EHoldings::Packages::EBSCO::get($c);
} else {
- return Koha::REST::V1::ERM::EHoldings::Packages::Manual::get(@_);
+ return Koha::REST::V1::ERM::EHoldings::Packages::Local::get($c);
}
}
=cut
sub add {
- my $provider = C4::Context->preference('ERMProvider');
+ my $c = shift->openapi->valid_input or return;
+
+ my $provider = $c->validation->param('provider');
if ( $provider eq 'ebsco' ) {
die "invalid action";
} else {
- return Koha::REST::V1::ERM::EHoldings::Packages::Manual::add(@_);
+ return Koha::REST::V1::ERM::EHoldings::Packages::Local::add($c);
}
}
=cut
sub update {
- my $provider = C4::Context->preference('ERMProvider');
+ my $c = shift->openapi->valid_input or return;
+
+ my $provider = $c->validation->param('provider');
if ( $provider eq 'ebsco' ) {
die "invalid action";
} else {
- return Koha::REST::V1::ERM::EHoldings::Packages::Manual::update(@_);
+ return Koha::REST::V1::ERM::EHoldings::Packages::Local::update($c);
}
};
=cut
sub delete {
- my $provider = C4::Context->preference('ERMProvider');
+ my $c = shift->openapi->valid_input or return;
+
+ my $provider = $c->validation->param('provider');
if ( $provider eq 'ebsco' ) {
die "invalid action";
} else {
- return Koha::REST::V1::ERM::EHoldings::Packages::Manual::delete(@_);
+ return Koha::REST::V1::ERM::EHoldings::Packages::Local::delete($c);
}
}
--- /dev/null
+package Koha::REST::V1::ERM::EHoldings::Packages::Local;
+
+# This file is part of Koha.
+#
+# Koha is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# Koha 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Koha; if not, see <http://www.gnu.org/licenses>.
+
+use Modern::Perl;
+
+use Mojo::Base 'Mojolicious::Controller';
+
+use Koha::ERM::EHoldings::Packages;
+
+use Scalar::Util qw( blessed );
+use Try::Tiny qw( catch try );
+
+=head1 API
+
+=head2 Methods
+
+=head3 list
+
+=cut
+
+sub list {
+ my $c = shift->openapi->valid_input or return;
+ return try {
+ my $packages_set = Koha::ERM::EHoldings::Packages->new;
+ my $packages = $c->objects->search($packages_set);
+ return $c->render( status => 200, openapi => $packages );
+ }
+ catch {
+ $c->unhandled_exception($_);
+ };
+}
+
+=head3 get
+
+=cut
+
+sub get {
+ my $c = shift->openapi->valid_input or return;
+
+ return try {
+ my $package_id = $c->validation->param('package_id');
+ my $package = $c->objects->find( Koha::ERM::EHoldings::Packages->search,
+ $package_id );
+
+ unless ($package) {
+ return $c->render(
+ status => 404,
+ openapi => { error => "Package not found" }
+ );
+ }
+
+ return $c->render(
+ status => 200,
+ openapi => $package
+ );
+ }
+ catch {
+ $c->unhandled_exception($_);
+ };
+}
+
+=head3 add
+
+Controller function that handles adding a new Koha::ERM::EHoldings::Package object
+
+=cut
+
+sub add {
+ my $c = shift->openapi->valid_input or return;
+
+ return try {
+ Koha::Database->new->schema->txn_do(
+ sub {
+
+ my $body = $c->validation->param('body');
+
+ my $package_agreements = delete $body->{package_agreements} // [];
+
+ my $package = Koha::ERM::EHoldings::Package->new_from_api($body)->store;
+ $package->package_agreements($package_agreements);
+
+ $c->res->headers->location($c->req->url->to_string . '/' . $package->package_id);
+ return $c->render(
+ status => 201,
+ openapi => $package->to_api
+ );
+ }
+ );
+ }
+ catch {
+
+ my $to_api_mapping = Koha::ERM::EHoldings::Package->new->to_api_mapping;
+
+ if ( blessed $_ ) {
+ if ( $_->isa('Koha::Exceptions::Object::DuplicateID') ) {
+ return $c->render(
+ status => 409,
+ openapi => { error => $_->error, conflict => $_->duplicate_id }
+ );
+ }
+ elsif ( $_->isa('Koha::Exceptions::Object::FKConstraint') ) {
+ return $c->render(
+ status => 400,
+ openapi => {
+ error => "Given "
+ . $to_api_mapping->{ $_->broken_fk }
+ . " does not exist"
+ }
+ );
+ }
+ elsif ( $_->isa('Koha::Exceptions::BadParameter') ) {
+ return $c->render(
+ status => 400,
+ openapi => {
+ error => "Given "
+ . $to_api_mapping->{ $_->parameter }
+ . " does not exist"
+ }
+ );
+ }
+ }
+
+ $c->unhandled_exception($_);
+ };
+}
+
+=head3 update
+
+Controller function that handles updating a Koha::ERM::EHoldings::Package object
+
+=cut
+
+sub update {
+ my $c = shift->openapi->valid_input or return;
+
+ my $package_id = $c->validation->param('package_id');
+ my $package = Koha::ERM::EHoldings::Packages->find( $package_id );
+
+ unless ($package) {
+ return $c->render(
+ status => 404,
+ openapi => { error => "Package not found" }
+ );
+ }
+
+ return try {
+ Koha::Database->new->schema->txn_do(
+ sub {
+
+ my $body = $c->validation->param('body');
+
+ my $package_agreements = delete $body->{package_agreements} // [];
+ use Data::Printer colored => 1; warn p $package_agreements;
+
+ $package->set_from_api($body)->store;
+ $package->package_agreements($package_agreements);
+
+ $c->res->headers->location($c->req->url->to_string . '/' . $package->package_id);
+ return $c->render(
+ status => 200,
+ openapi => $package->to_api
+ );
+ }
+ );
+ }
+ catch {
+ my $to_api_mapping = Koha::ERM::EHoldings::Package->new->to_api_mapping;
+
+ if ( blessed $_ ) {
+ if ( $_->isa('Koha::Exceptions::Object::FKConstraint') ) {
+ return $c->render(
+ status => 400,
+ openapi => {
+ error => "Given "
+ . $to_api_mapping->{ $_->broken_fk }
+ . " does not exist"
+ }
+ );
+ }
+ elsif ( $_->isa('Koha::Exceptions::BadParameter') ) {
+ return $c->render(
+ status => 400,
+ openapi => {
+ error => "Given "
+ . $to_api_mapping->{ $_->parameter }
+ . " does not exist"
+ }
+ );
+ }
+ }
+
+ $c->unhandled_exception($_);
+ };
+};
+
+=head3 delete
+
+=cut
+
+sub delete {
+ my $c = shift->openapi->valid_input or return;
+
+ my $package = Koha::ERM::EHoldings::Packages->find( $c->validation->param('package_id') );
+ unless ($package) {
+ return $c->render(
+ status => 404,
+ openapi => { error => "Package not found" }
+ );
+ }
+
+ return try {
+ $package->delete;
+ return $c->render(
+ status => 204,
+ openapi => q{}
+ );
+ }
+ catch {
+ $c->unhandled_exception($_);
+ };
+}
+
+
+1;
+++ /dev/null
-package Koha::REST::V1::ERM::EHoldings::Packages::Manual;
-
-use Modern::Perl;
-
-use Mojo::Base 'Mojolicious::Controller';
-
-use Koha::ERM::EHoldings::Packages;
-
-use Scalar::Util qw( blessed );
-use Try::Tiny qw( catch try );
-
-sub list {
- my $c = shift->openapi->valid_input or return;
- return try {
- my $packages_set = Koha::ERM::EHoldings::Packages->new;
- my $packages = $c->objects->search($packages_set);
- return $c->render( status => 200, openapi => $packages );
- }
- catch {
- $c->unhandled_exception($_);
- };
-}
-
-sub get {
- my $c = shift->openapi->valid_input or return;
-
- return try {
- my $package_id = $c->validation->param('package_id');
- my $package = $c->objects->find( Koha::ERM::EHoldings::Packages->search,
- $package_id );
-
- unless ($package) {
- return $c->render(
- status => 404,
- openapi => { error => "Package not found" }
- );
- }
-
- return $c->render(
- status => 200,
- openapi => $package
- );
- }
- catch {
- $c->unhandled_exception($_);
- };
-}
-
-=head3 add
-
-Controller function that handles adding a new Koha::ERM::EHoldings::Package object
-
-=cut
-
-sub add {
- my $c = shift->openapi->valid_input or return;
-
- return try {
- Koha::Database->new->schema->txn_do(
- sub {
-
- my $body = $c->validation->param('body');
-
- my $package_agreements = delete $body->{package_agreements} // [];
-
- my $package = Koha::ERM::EHoldings::Package->new_from_api($body)->store;
- $package->package_agreements($package_agreements);
-
- $c->res->headers->location($c->req->url->to_string . '/' . $package->package_id);
- return $c->render(
- status => 201,
- openapi => $package->to_api
- );
- }
- );
- }
- catch {
-
- my $to_api_mapping = Koha::ERM::EHoldings::Package->new->to_api_mapping;
-
- if ( blessed $_ ) {
- if ( $_->isa('Koha::Exceptions::Object::DuplicateID') ) {
- return $c->render(
- status => 409,
- openapi => { error => $_->error, conflict => $_->duplicate_id }
- );
- }
- elsif ( $_->isa('Koha::Exceptions::Object::FKConstraint') ) {
- return $c->render(
- status => 400,
- openapi => {
- error => "Given "
- . $to_api_mapping->{ $_->broken_fk }
- . " does not exist"
- }
- );
- }
- elsif ( $_->isa('Koha::Exceptions::BadParameter') ) {
- return $c->render(
- status => 400,
- openapi => {
- error => "Given "
- . $to_api_mapping->{ $_->parameter }
- . " does not exist"
- }
- );
- }
- }
-
- $c->unhandled_exception($_);
- };
-}
-
-=head3 update
-
-Controller function that handles updating a Koha::ERM::EHoldings::Package object
-
-=cut
-
-sub update {
- my $c = shift->openapi->valid_input or return;
-
- my $package_id = $c->validation->param('package_id');
- my $package = Koha::ERM::EHoldings::Packages->find( $package_id );
-
- unless ($package) {
- return $c->render(
- status => 404,
- openapi => { error => "Package not found" }
- );
- }
-
- return try {
- Koha::Database->new->schema->txn_do(
- sub {
-
- my $body = $c->validation->param('body');
-
- my $package_agreements = delete $body->{package_agreements} // [];
-
- $package->set_from_api($body)->store;
- $package->package_agreements($package_agreements);
-
- $c->res->headers->location($c->req->url->to_string . '/' . $package->package_id);
- return $c->render(
- status => 200,
- openapi => $package->to_api
- );
- }
- );
- }
- catch {
- my $to_api_mapping = Koha::ERM::EHoldings::Package->new->to_api_mapping;
-
- if ( blessed $_ ) {
- if ( $_->isa('Koha::Exceptions::Object::FKConstraint') ) {
- return $c->render(
- status => 400,
- openapi => {
- error => "Given "
- . $to_api_mapping->{ $_->broken_fk }
- . " does not exist"
- }
- );
- }
- elsif ( $_->isa('Koha::Exceptions::BadParameter') ) {
- return $c->render(
- status => 400,
- openapi => {
- error => "Given "
- . $to_api_mapping->{ $_->parameter }
- . " does not exist"
- }
- );
- }
- }
-
- $c->unhandled_exception($_);
- };
-};
-
-=head3 delete
-
-=cut
-
-sub delete {
- my $c = shift->openapi->valid_input or return;
-
- my $package = Koha::ERM::EHoldings::Packages->find( $c->validation->param('package_id') );
- unless ($package) {
- return $c->render(
- status => 404,
- openapi => { error => "Package not found" }
- );
- }
-
- return try {
- $package->delete;
- return $c->render(
- status => 204,
- openapi => q{}
- );
- }
- catch {
- $c->unhandled_exception($_);
- };
-}
-
-
-1;
use Mojo::Base 'Mojolicious::Controller';
-use Koha::REST::V1::ERM::EHoldings::Resources::Manual;
+use Koha::REST::V1::ERM::EHoldings::Resources::Local;
use Koha::REST::V1::ERM::EHoldings::Resources::EBSCO;
use Scalar::Util qw( blessed );
=cut
sub list {
- my $provider = C4::Context->preference('ERMProvider');
+ my $c = shift->openapi->valid_input or return;
+
+ my $provider = $c->validation->param('provider');
if ( $provider eq 'ebsco' ) {
- return Koha::REST::V1::ERM::EHoldings::Resources::EBSCO::list(@_);
+ return Koha::REST::V1::ERM::EHoldings::Resources::EBSCO::list($c);
} else {
- return Koha::REST::V1::ERM::EHoldings::Resources::Manual::list(@_);
+ return Koha::REST::V1::ERM::EHoldings::Resources::Local::list($c);
}
}
=cut
sub get {
- my $provider = C4::Context->preference('ERMProvider');
+ my $c = shift->openapi->valid_input or return;
+
+ my $provider = $c->validation->param('provider');
if ( $provider eq 'ebsco' ) {
- return Koha::REST::V1::ERM::EHoldings::Resources::EBSCO::get(@_);
+ return Koha::REST::V1::ERM::EHoldings::Resources::EBSCO::get($c);
} else {
- return Koha::REST::V1::ERM::EHoldings::Resources::Manual::get(@_);
+ return Koha::REST::V1::ERM::EHoldings::Resources::Local::get($c);
}
}
--- /dev/null
+package Koha::REST::V1::ERM::EHoldings::Resources::Local;
+
+# This file is part of Koha.
+#
+# Koha is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# Koha 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Koha; if not, see <http://www.gnu.org/licenses>.
+
+use Modern::Perl;
+
+use Mojo::Base 'Mojolicious::Controller';
+
+use Koha::ERM::EHoldings::Resources;
+
+use Scalar::Util qw( blessed );
+use Try::Tiny qw( catch try );
+
+=head1 API
+
+=head2 Methods
+
+=head3 list
+
+=cut
+
+sub list {
+ my $c = shift->openapi->valid_input or return;
+
+ return try {
+ my $package_id = $c->validation->param('package_id');
+ my $resources_set =
+ $package_id
+ ? Koha::ERM::EHoldings::Resources->search( { package_id => $package_id } )
+ : Koha::ERM::EHoldings::Resources->new;
+ my $resources = $c->objects->search( $resources_set );
+ return $c->render( status => 200, openapi => $resources );
+ }
+ catch {
+ $c->unhandled_exception($_);
+ };
+
+}
+
+=head3 get
+
+Controller function that handles retrieving a single Koha::ERM::EHoldings::Resource object
+
+=cut
+
+sub get {
+ my $c = shift->openapi->valid_input or return;
+
+ return try {
+ my $resource_id = $c->validation->param('resource_id');
+ my $resource = $c->objects->find( Koha::ERM::EHoldings::Resources->search, $resource_id );
+
+ unless ($resource ) {
+ return $c->render(
+ status => 404,
+ openapi => { error => "eHolding resource not found" }
+ );
+ }
+
+ return $c->render(
+ status => 200,
+ openapi => $resource,
+ );
+ }
+ catch {
+ $c->unhandled_exception($_);
+ };
+}
+
+1;
+++ /dev/null
-package Koha::REST::V1::ERM::EHoldings::Resources::Manual;
-
-# This file is part of Koha.
-#
-# Koha is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3 of the License, or
-# (at your option) any later version.
-#
-# Koha 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 General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with Koha; if not, see <http://www.gnu.org/licenses>.
-
-use Modern::Perl;
-
-use Mojo::Base 'Mojolicious::Controller';
-
-use Koha::ERM::EHoldings::Resources;
-
-use Scalar::Util qw( blessed );
-use Try::Tiny qw( catch try );
-
-=head1 API
-
-=head2 Methods
-
-=head3 list
-
-=cut
-
-sub list {
- my $c = shift->openapi->valid_input or return;
-
- return try {
- my $package_id = $c->validation->param('package_id');
- my $resources_set =
- $package_id
- ? Koha::ERM::EHoldings::Resources->search( { package_id => $package_id } )
- : Koha::ERM::EHoldings::Resources->new;
- my $resources = $c->objects->search( $resources_set );
- return $c->render( status => 200, openapi => $resources );
- }
- catch {
- $c->unhandled_exception($_);
- };
-
-}
-
-=head3 get
-
-Controller function that handles retrieving a single Koha::ERM::EHoldings::Resource object
-
-=cut
-
-sub get {
- my $c = shift->openapi->valid_input or return;
-
- return try {
- my $resource_id = $c->validation->param('resource_id');
- my $resource = $c->objects->find( Koha::ERM::EHoldings::Resources->search, $resource_id );
-
- unless ($resource ) {
- return $c->render(
- status => 404,
- openapi => { error => "eHolding resource not found" }
- );
- }
-
- return $c->render(
- status => 200,
- openapi => $resource,
- );
- }
- catch {
- $c->unhandled_exception($_);
- };
-}
-
-1;
use Scalar::Util qw( blessed );
use Try::Tiny qw( catch try );
-use Koha::REST::V1::ERM::EHoldings::Titles::Manual;
+use Koha::REST::V1::ERM::EHoldings::Titles::Local;
use Koha::REST::V1::ERM::EHoldings::Titles::EBSCO;
=head1 API
=cut
sub list {
- my $provider = C4::Context->preference('ERMProvider');
+ my $c = shift->openapi->valid_input or return;
+
+ my $provider = $c->validation->param('provider');
if ( $provider eq 'ebsco' ) {
- return Koha::REST::V1::ERM::EHoldings::Titles::EBSCO::list(@_);
+ return Koha::REST::V1::ERM::EHoldings::Titles::EBSCO::list($c);
} else {
- return Koha::REST::V1::ERM::EHoldings::Titles::Manual::list(@_);
+ return Koha::REST::V1::ERM::EHoldings::Titles::Local::list($c);
}
}
=cut
sub get {
- my $provider = C4::Context->preference('ERMProvider');
+ my $c = shift->openapi->valid_input or return;
+
+ my $provider = $c->validation->param('provider');
if ( $provider eq 'ebsco' ) {
- return Koha::REST::V1::ERM::EHoldings::Titles::EBSCO::get(@_);
+ return Koha::REST::V1::ERM::EHoldings::Titles::EBSCO::get($c);
} else {
- return Koha::REST::V1::ERM::EHoldings::Titles::Manual::get(@_);
+ return Koha::REST::V1::ERM::EHoldings::Titles::Local::get($c);
}
}
=cut
sub add{
- my $provider = C4::Context->preference('ERMProvider');
+ my $c = shift->openapi->valid_input or return;
+
+ my $provider = $c->validation->param('provider');
if ( $provider eq 'ebsco' ) {
die "invalid action";
} else {
- return Koha::REST::V1::ERM::EHoldings::Titles::Manual::add(@_);
+ return Koha::REST::V1::ERM::EHoldings::Titles::Local::add($c);
}
}
=cut
sub update {
- my $provider = C4::Context->preference('ERMProvider');
+ my $c = shift->openapi->valid_input or return;
+
+ my $provider = $c->validation->param('provider');
if ( $provider eq 'ebsco' ) {
die "invalid action";
} else {
- return Koha::REST::V1::ERM::EHoldings::Titles::Manual::update(@_);
+ return Koha::REST::V1::ERM::EHoldings::Titles::Local::update($c);
}
}
=cut
sub delete {
- my $provider = C4::Context->preference('ERMProvider');
+ my $c = shift->openapi->valid_input or return;
+
+ my $provider = $c->validation->param('provider');
if ( $provider eq 'ebsco' ) {
die "invalid action";
} else {
- return Koha::REST::V1::ERM::EHoldings::Titles::Manual::delete(@_);
+ return Koha::REST::V1::ERM::EHoldings::Titles::Local::delete($c);
}
-};
+}
1;
--- /dev/null
+package Koha::REST::V1::ERM::EHoldings::Titles::Local;
+
+# This file is part of Koha.
+#
+# Koha is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# Koha 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Koha; if not, see <http://www.gnu.org/licenses>.
+
+use Modern::Perl;
+
+use Mojo::Base 'Mojolicious::Controller';
+
+use Koha::ERM::EHoldings::Titles;
+
+use Scalar::Util qw( blessed );
+use Try::Tiny qw( catch try );
+
+=head1 API
+
+=head2 Methods
+
+=head3 list
+
+=cut
+
+sub list {
+ my $c = shift->openapi->valid_input or return;
+
+ return try {
+ my $titles_set = Koha::ERM::EHoldings::Titles->new;
+ my $titles = $c->objects->search( $titles_set );
+ return $c->render( status => 200, openapi => $titles );
+ }
+ catch {
+ $c->unhandled_exception($_);
+ };
+
+}
+
+=head3 get
+
+Controller function that handles retrieving a single Koha::ERM::EHoldings::Title object
+
+=cut
+
+sub get {
+ my $c = shift->openapi->valid_input or return;
+
+ return try {
+ my $title_id = $c->validation->param('title_id');
+ my $title = $c->objects->find( Koha::ERM::EHoldings::Titles->search, $title_id );
+
+ unless ($title ) {
+ return $c->render(
+ status => 404,
+ openapi => { error => "eHolding title not found" }
+ );
+ }
+
+ return $c->render(
+ status => 200,
+ openapi => $title,
+ );
+ }
+ catch {
+ $c->unhandled_exception($_);
+ };
+}
+
+=head3 add
+
+Controller function that handles adding a new Koha::ERM::EHoldings::Title object
+
+=cut
+
+sub add {
+ my $c = shift->openapi->valid_input or return;
+
+ return try {
+ Koha::Database->new->schema->txn_do(
+ sub {
+
+ my $body = $c->validation->param('body');
+
+ my $resources = delete $body->{resources} // [];
+
+ my $title = Koha::ERM::EHoldings::Title->new_from_api($body)->store;
+
+ $title->resources($resources);
+
+ $c->res->headers->location($c->req->url->to_string . '/' . $title->title_id);
+ return $c->render(
+ status => 201,
+ openapi => $title->to_api
+ );
+ }
+ );
+ }
+ catch {
+
+ my $to_api_mapping = Koha::ERM::EHoldings::Title->new->to_api_mapping;
+
+ if ( blessed $_ ) {
+ if ( $_->isa('Koha::Exceptions::Object::DuplicateID') ) {
+ return $c->render(
+ status => 409,
+ openapi => { error => $_->error, conflict => $_->duplicate_id }
+ );
+ }
+ elsif ( $_->isa('Koha::Exceptions::Object::FKConstraint') ) {
+ return $c->render(
+ status => 400,
+ openapi => {
+ error => "Given "
+ . $to_api_mapping->{ $_->broken_fk }
+ . " does not exist"
+ }
+ );
+ }
+ elsif ( $_->isa('Koha::Exceptions::BadParameter') ) {
+ return $c->render(
+ status => 400,
+ openapi => {
+ error => "Given "
+ . $to_api_mapping->{ $_->parameter }
+ . " does not exist"
+ }
+ );
+ }
+ }
+
+ $c->unhandled_exception($_);
+ };
+}
+
+=head3 update
+
+Controller function that handles updating a Koha::ERM::EHoldings::Title object
+
+=cut
+
+sub update {
+ my $c = shift->openapi->valid_input or return;
+
+ my $title_id = $c->validation->param('title_id');
+ my $title = Koha::ERM::EHoldings::Titles->find( $title_id );
+
+ unless ($title) {
+ return $c->render(
+ status => 404,
+ openapi => { error => "eHolding title not found" }
+ );
+ }
+
+ return try {
+ Koha::Database->new->schema->txn_do(
+ sub {
+
+ my $body = $c->validation->param('body');
+
+ my $resources = delete $body->{resources} // [];
+
+ $title->set_from_api($body)->store;
+
+ $title->resources($resources);
+
+ $c->res->headers->location($c->req->url->to_string . '/' . $title->title_id);
+ return $c->render(
+ status => 200,
+ openapi => $title->to_api
+ );
+ }
+ );
+ }
+ catch {
+ my $to_api_mapping = Koha::ERM::EHoldings::Title->new->to_api_mapping;
+
+ if ( blessed $_ ) {
+ if ( $_->isa('Koha::Exceptions::Object::FKConstraint') ) {
+ return $c->render(
+ status => 400,
+ openapi => {
+ error => "Given "
+ . $to_api_mapping->{ $_->broken_fk }
+ . " does not exist"
+ }
+ );
+ }
+ elsif ( $_->isa('Koha::Exceptions::BadParameter') ) {
+ return $c->render(
+ status => 400,
+ openapi => {
+ error => "Given "
+ . $to_api_mapping->{ $_->parameter }
+ . " does not exist"
+ }
+ );
+ }
+ }
+
+ $c->unhandled_exception($_);
+ };
+};
+
+=head3 delete
+
+=cut
+
+sub delete {
+ my $c = shift->openapi->valid_input or return;
+
+ my $title = Koha::ERM::EHoldings::Titles->find( $c->validation->param('title_id') );
+ unless ($title) {
+ return $c->render(
+ status => 404,
+ openapi => { error => "eHolding title not found" }
+ );
+ }
+
+ return try {
+ $title->delete;
+ return $c->render(
+ status => 204,
+ openapi => q{}
+ );
+ }
+ catch {
+ $c->unhandled_exception($_);
+ };
+}
+
+1;
+++ /dev/null
-package Koha::REST::V1::ERM::EHoldings::Titles::Manual;
-
-# This file is part of Koha.
-#
-# Koha is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3 of the License, or
-# (at your option) any later version.
-#
-# Koha 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 General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with Koha; if not, see <http://www.gnu.org/licenses>.
-
-use Modern::Perl;
-
-use Mojo::Base 'Mojolicious::Controller';
-
-use Koha::ERM::EHoldings::Titles;
-
-use Scalar::Util qw( blessed );
-use Try::Tiny qw( catch try );
-
-=head1 API
-
-=head2 Methods
-
-=head3 list
-
-=cut
-
-sub list {
- my $c = shift->openapi->valid_input or return;
-
- return try {
- my $titles_set = Koha::ERM::EHoldings::Titles->new;
- my $titles = $c->objects->search( $titles_set );
- return $c->render( status => 200, openapi => $titles );
- }
- catch {
- $c->unhandled_exception($_);
- };
-
-}
-
-=head3 get
-
-Controller function that handles retrieving a single Koha::ERM::EHoldings::Title object
-
-=cut
-
-sub get {
- my $c = shift->openapi->valid_input or return;
-
- return try {
- my $title_id = $c->validation->param('title_id');
- my $title = $c->objects->find( Koha::ERM::EHoldings::Titles->search, $title_id );
-
- unless ($title ) {
- return $c->render(
- status => 404,
- openapi => { error => "eHolding title not found" }
- );
- }
-
- return $c->render(
- status => 200,
- openapi => $title,
- );
- }
- catch {
- $c->unhandled_exception($_);
- };
-}
-
-=head3 add
-
-Controller function that handles adding a new Koha::ERM::EHoldings::Title object
-
-=cut
-
-sub add {
- my $c = shift->openapi->valid_input or return;
-
- return try {
- Koha::Database->new->schema->txn_do(
- sub {
-
- my $body = $c->validation->param('body');
-
- my $resources = delete $body->{resources} // [];
-
- my $title = Koha::ERM::EHoldings::Title->new_from_api($body)->store;
-
- $title->resources($resources);
-
- $c->res->headers->location($c->req->url->to_string . '/' . $title->title_id);
- return $c->render(
- status => 201,
- openapi => $title->to_api
- );
- }
- );
- }
- catch {
-
- my $to_api_mapping = Koha::ERM::EHoldings::Title->new->to_api_mapping;
-
- if ( blessed $_ ) {
- if ( $_->isa('Koha::Exceptions::Object::DuplicateID') ) {
- return $c->render(
- status => 409,
- openapi => { error => $_->error, conflict => $_->duplicate_id }
- );
- }
- elsif ( $_->isa('Koha::Exceptions::Object::FKConstraint') ) {
- return $c->render(
- status => 400,
- openapi => {
- error => "Given "
- . $to_api_mapping->{ $_->broken_fk }
- . " does not exist"
- }
- );
- }
- elsif ( $_->isa('Koha::Exceptions::BadParameter') ) {
- return $c->render(
- status => 400,
- openapi => {
- error => "Given "
- . $to_api_mapping->{ $_->parameter }
- . " does not exist"
- }
- );
- }
- }
-
- $c->unhandled_exception($_);
- };
-}
-
-=head3 update
-
-Controller function that handles updating a Koha::ERM::EHoldings::Title object
-
-=cut
-
-sub update {
- my $c = shift->openapi->valid_input or return;
-
- my $title_id = $c->validation->param('title_id');
- my $title = Koha::ERM::EHoldings::Titles->find( $title_id );
-
- unless ($title) {
- return $c->render(
- status => 404,
- openapi => { error => "eHolding title not found" }
- );
- }
-
- return try {
- Koha::Database->new->schema->txn_do(
- sub {
-
- my $body = $c->validation->param('body');
-
- my $resources = delete $body->{resources} // [];
-
- $title->set_from_api($body)->store;
-
- $title->resources($resources);
-
- $c->res->headers->location($c->req->url->to_string . '/' . $title->title_id);
- return $c->render(
- status => 200,
- openapi => $title->to_api
- );
- }
- );
- }
- catch {
- my $to_api_mapping = Koha::ERM::EHoldings::Title->new->to_api_mapping;
-
- if ( blessed $_ ) {
- if ( $_->isa('Koha::Exceptions::Object::FKConstraint') ) {
- return $c->render(
- status => 400,
- openapi => {
- error => "Given "
- . $to_api_mapping->{ $_->broken_fk }
- . " does not exist"
- }
- );
- }
- elsif ( $_->isa('Koha::Exceptions::BadParameter') ) {
- return $c->render(
- status => 400,
- openapi => {
- error => "Given "
- . $to_api_mapping->{ $_->parameter }
- . " does not exist"
- }
- );
- }
- }
-
- $c->unhandled_exception($_);
- };
-};
-
-=head3 delete
-
-=cut
-
-sub delete {
- my $c = shift->openapi->valid_input or return;
-
- my $title = Koha::ERM::EHoldings::Titles->find( $c->validation->param('title_id') );
- unless ($title) {
- return $c->render(
- status => 404,
- openapi => { error => "eHolding title not found" }
- );
- }
-
- return try {
- $title->delete;
- return $c->render(
- status => 204,
- openapi => q{}
- );
- }
- catch {
- $c->unhandled_exception($_);
- };
-}
-
-1;
---
-/erm/eholdings/packages:
+/erm/eholdings/{provider}/packages:
get:
x-mojo-to: ERM::EHoldings::Packages#list
operationId: listErmEHoldingsPackages
produces:
- application/json
parameters:
+ - description: Provider name
+ in: path
+ name: provider
+ required: true
+ type: string
- description: Case insensitive search on package package_id
in: query
name: package_id
x-koha-authorization:
permissions:
erm: 1
-"/erm/eholdings/packages/{package_id}":
+"/erm/eholdings/{provider}/packages/{package_id}":
get:
x-mojo-to: ERM::EHoldings::Packages#get
operationId: getErmEHoldingsPackages
produces:
- application/json
parameters:
+ - description: Provider name
+ in: path
+ name: provider
+ required: true
+ type: string
- $ref: "../swagger.yaml#/parameters/eholdings_package_id_pp"
responses:
200:
---
-/erm/eholdings/packages/{package_id}/resources:
+/erm/eholdings/{provider}/packages/{package_id}/resources:
get:
x-mojo-to: ERM::EHoldings::Resources#list
operationId: listErmEHoldingsPackagesResources
produces:
- application/json
parameters:
+ - description: Provider name
+ in: path
+ name: provider
+ required: true
+ type: string
- description: Case insensitive search on resource_id
in: query
name: resource_id
---
-/erm/eholdings/resources:
+/erm/eholdings/{provider}/resources:
get:
x-mojo-to: ERM::EHoldings::Resources#list
operationId: listErmEHoldingsResources
produces:
- application/json
parameters:
+ - description: Provider name
+ in: path
+ name: provider
+ required: true
+ type: string
- description: Case insensitive search on resource_id
in: query
name: resource_id
x-koha-authorization:
permissions:
erm: 1
-"/erm/eholdings/resources/{resource_id}":
+"/erm/eholdings/{provider}/resources/{resource_id}":
get:
x-mojo-to: ERM::EHoldings::Resources#get
operationId: getErmEHoldingsResources
produces:
- application/json
parameters:
+ - description: Provider name
+ in: path
+ name: provider
+ required: true
+ type: string
- $ref: "../swagger.yaml#/parameters/eholdings_resource_id_pp"
responses:
200:
---
-/erm/eholdings/titles:
+/erm/eholdings/{provider}/titles:
get:
x-mojo-to: ERM::EHoldings::Titles#list
operationId: listErmEHoldingsTitles
produces:
- application/json
parameters:
+ - description: Provider name
+ in: path
+ name: provider
+ required: true
+ type: string
- description: Case insensitive search on title title_id
in: query
name: title_id
x-koha-authorization:
permissions:
erm: 1
-"/erm/eholdings/titles/{title_id}":
+"/erm/eholdings/{provider}/titles/{title_id}":
get:
x-mojo-to: ERM::EHoldings::Titles#get
operationId: getErmEHoldingsTitles
produces:
- application/json
parameters:
+ - description: Provider name
+ in: path
+ name: provider
+ required: true
+ type: string
- $ref: "../swagger.yaml#/parameters/eholdings_title_id_pp"
responses:
200:
---
-/erm/eholdings/titles/{title_id}/resources:
+/erm/eholdings/{provider}/titles/{title_id}/resources:
get:
x-mojo-to: ERM::EHoldings::Resources#list
operationId: listErmEHoldingsTitlesResources
$ref: ./paths/erm_agreements.yaml#/~1erm~1agreements
"/erm/agreements/{agreement_id}":
$ref: "./paths/erm_agreements.yaml#/~1erm~1agreements~1{agreement_id}"
- /erm/eholdings/titles:
- $ref: ./paths/erm_eholdings_titles.yaml#/~1erm~1eholdings~1titles
- "/erm/eholdings/titles/{title_id}":
- $ref: "./paths/erm_eholdings_titles.yaml#/~1erm~1eholdings~1titles~1{title_id}"
- "/erm/eholdings/titles/{title_id}/resources":
- $ref: "./paths/erm_eholdings_titles_resources.yaml#/~1erm~1eholdings~1titles~1{title_id}~1resources"
- /erm/eholdings/packages:
- $ref: ./paths/erm_eholdings_packages.yaml#/~1erm~1eholdings~1packages
- /erm/eholdings/resources:
- $ref: ./paths/erm_eholdings_resources.yaml#/~1erm~1eholdings~1resources
- "/erm/eholdings/resources/{resource_id}":
- $ref: "./paths/erm_eholdings_resources.yaml#/~1erm~1eholdings~1resources~1{resource_id}"
- "/erm/eholdings/packages/{package_id}":
- $ref: "./paths/erm_eholdings_packages.yaml#/~1erm~1eholdings~1packages~1{package_id}"
- "/erm/eholdings/packages/{package_id}/resources":
- $ref: "./paths/erm_eholdings_packages_resources.yaml#/~1erm~1eholdings~1packages~1{package_id}~1resources"
+ "/erm/eholdings/{provider}/titles":
+ $ref: ./paths/erm_eholdings_titles.yaml#/~1erm~1eholdings~1{provider}~1titles
+ "/erm/eholdings/{provider}/titles/{title_id}":
+ $ref: "./paths/erm_eholdings_titles.yaml#/~1erm~1eholdings~1{provider}~1titles~1{title_id}"
+ "/erm/eholdings/{provider}/titles/{title_id}/resources":
+ $ref: "./paths/erm_eholdings_titles_resources.yaml#/~1erm~1eholdings~1{provider}~1titles~1{title_id}~1resources"
+ "/erm/eholdings/{provider}/packages":
+ $ref: "./paths/erm_eholdings_packages.yaml#/~1erm~1eholdings~1{provider}~1packages"
+ "/erm/eholdings/{provider}/resources":
+ $ref: "./paths/erm_eholdings_resources.yaml#/~1erm~1eholdings~1{provider}~1resources"
+ "/erm/eholdings/{provider}/resources/{resource_id}":
+ $ref: "./paths/erm_eholdings_resources.yaml#/~1erm~1eholdings~1{provider}~1resources~1{resource_id}"
+ "/erm/eholdings/{provider}/packages/{package_id}":
+ $ref: "./paths/erm_eholdings_packages.yaml#/~1erm~1eholdings~1{provider}~1packages~1{package_id}"
+ "/erm/eholdings/{provider}/packages/{package_id}/resources":
+ $ref: "./paths/erm_eholdings_packages_resources.yaml#/~1erm~1eholdings~1{provider}~1packages~1{package_id}~1resources"
/erm/licenses:
$ref: ./paths/erm_licenses.yaml#/~1erm~1licenses
"/erm/licenses/{license_id}":
it("List package", () => {
// GET package returns 500
- cy.intercept("GET", "/api/v1/erm/eholdings/packages", {
+ cy.intercept("GET", "/api/v1/erm/eholdings/local/packages", {
statusCode: 500,
error: "Something went wrong",
});
);
// GET packages returns empty list
- cy.intercept("GET", "/api/v1/erm/eholdings/packages*", []);
- cy.visit("/cgi-bin/koha/erm/eholdings/packages");
+ cy.intercept("GET", "/api/v1/erm/eholdings/local/packages*", []);
+ cy.visit("/cgi-bin/koha/erm/eholdings/local/packages");
cy.get("#packages_list").contains("There are no packages defined.");
// GET packages returns something
let erm_package = get_package();
let packages = [erm_package];
- cy.intercept("GET", "/api/v1/erm/eholdings/packages*", {
+ cy.intercept("GET", "/api/v1/erm/eholdings/local/packages*", {
statusCode: 200,
body: packages,
headers: {
"X-Total-Count": "1",
},
});
- cy.intercept("GET", "/api/v1/erm/eholdings/packages/*", erm_package);
- cy.visit("/cgi-bin/koha/erm/eholdings/packages");
+ cy.intercept("GET", "/api/v1/erm/eholdings/local/packages/*", erm_package);
+ cy.visit("/cgi-bin/koha/erm/eholdings/local/packages");
cy.get("#packages_list").contains("Showing 1 to 1 of 1 entries");
});
it("Add package", () => {
// Click the button in the toolbar
- cy.visit("/cgi-bin/koha/erm/eholdings/packages");
+ cy.visit("/cgi-bin/koha/erm/eholdings/local/packages");
cy.contains("New package").click();
cy.get("#packages_add h2").contains("New package");
cy.get("#package_content_type").select(erm_package.content_type);
// Submit the form, get 500
- cy.intercept("POST", "/api/v1/erm/eholdings/packages", {
+ cy.intercept("POST", "/api/v1/erm/eholdings/local/packages", {
statusCode: 500,
error: "Something went wrong",
});
);
// Submit the form, success!
- cy.intercept("POST", "/api/v1/erm/eholdings/packages", {
+ cy.intercept("POST", "/api/v1/erm/eholdings/local/packages", {
statusCode: 201,
body: erm_package,
});
let erm_package = get_package();
let packages = [erm_package];
// Click the 'Edit' button from the list
- cy.intercept("GET", "/api/v1/erm/eholdings/packages*", {
+ cy.intercept("GET", "/api/v1/erm/eholdings/local/packages*", {
statusCode: 200,
body: packages,
headers: {
"X-Total-Count": "1",
},
});
- cy.intercept("GET", "/api/v1/erm/eholdings/packages/*", erm_package).as(
+ cy.intercept("GET", "/api/v1/erm/eholdings/local/packages/*", erm_package).as(
"get-package"
);
- cy.visit("/cgi-bin/koha/erm/eholdings/packages");
+ cy.visit("/cgi-bin/koha/erm/eholdings/local/packages");
cy.get("#packages_list table tbody tr:first")
.contains("Edit")
.click();
cy.get("#package_content_type").should("have.value", erm_package.content_type);
// Submit the form, get 500
- cy.intercept("PUT", "/api/v1/erm/eholdings/packages/*", {
+ cy.intercept("PUT", "/api/v1/erm/eholdings/local/packages/*", {
statusCode: 500,
error: "Something went wrong",
});
);
// Submit the form, success!
- cy.intercept("PUT", "/api/v1/erm/eholdings/packages/*", {
+ cy.intercept("PUT", "/api/v1/erm/eholdings/local/packages/*", {
statusCode: 200,
body: erm_package,
});
let erm_package = get_package();
let packages = [erm_package];
// Click the "name" link from the list
- cy.intercept("GET", "/api/v1/erm/eholdings/packages*", {
+ cy.intercept("GET", "/api/v1/erm/eholdings/local/packages*", {
statusCode: 200,
body: packages,
headers: {
"X-Total-Count": "1",
},
});
- cy.intercept("GET", "/api/v1/erm/eholdings/packages/*", erm_package).as(
+ cy.intercept("GET", "/api/v1/erm/eholdings/local/packages/*", erm_package).as(
"get-package"
);
- cy.visit("/cgi-bin/koha/erm/eholdings/packages");
+ cy.visit("/cgi-bin/koha/erm/eholdings/local/packages");
let name_link = cy.get(
"#packages_list table tbody tr:first td:first a"
);
let packages = [erm_package];
// Click the 'Delete' button from the list
- cy.intercept("GET", "/api/v1/erm/eholdings/packages*", {
+ cy.intercept("GET", "/api/v1/erm/eholdings/local/packages*", {
statusCode: 200,
body: packages,
headers: {
"X-Total-Count": "1",
},
});
- cy.intercept("GET", "/api/v1/erm/eholdings/packages/*", erm_package);
- cy.visit("/cgi-bin/koha/erm/eholdings/packages");
+ cy.intercept("GET", "/api/v1/erm/eholdings/local/packages/*", erm_package);
+ cy.visit("/cgi-bin/koha/erm/eholdings/local/packages");
cy.get("#packages_list table tbody tr:first")
.contains("Delete")
cy.contains("Package name: " + erm_package.name);
// Submit the form, get 500
- cy.intercept("DELETE", "/api/v1/erm/eholdings/packages/*", {
+ cy.intercept("DELETE", "/api/v1/erm/eholdings/local/packages/*", {
statusCode: 500,
error: "Something went wrong",
});
);
// Submit the form, success!
- cy.intercept("DELETE", "/api/v1/erm/eholdings/packages/*", {
+ cy.intercept("DELETE", "/api/v1/erm/eholdings/local/packages/*", {
statusCode: 204,
body: null,
});
$dbh->do(q{
INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type)
- VALUES ('ERMProvider', 'manual', 'manual|ebsco', 'Set the provider for the ERM module', 'Choice');
+ VALUES ('ERMProviders', 'local', 'local|ebsco', 'Set the providers for the ERM module', 'multiple');
});
$dbh->do(q{
INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type)
('EnhancedMessagingPreferences','1','','If ON, allows patrons to select to receive additional messages about items due or nearly due.','YesNo'),
('EnhancedMessagingPreferencesOPAC', '1', NULL, 'If ON, show patrons messaging setting on the OPAC.', 'YesNo'),
('ERMModule', '0', NULL, 'Enable the E-Resource management module', 'YesNo'),
-('ERMProvider', 'manual', 'manual|ebsco', 'Set the provider for the ERM module', 'Choice'),
+('ERMProviders', 'local', 'local|ebsco', 'Set the providers for the ERM module', 'Choice'),
('ERMProviderEbscoApiKey', '', '', 'API key for EBSCO', 'free'),
('ERMProviderEbscoCustomerID', '', '', 'Customer ID for EBSCO', 'free'),
('expandedSearchOption','0',NULL,'If ON, set advanced search to be expanded by default','YesNo'),
</div>
<div id="package_search" class="residentsearch">
- <form action="/cgi-bin/koha/erm/eholdings/packages" method="get">
+ <form action="/cgi-bin/koha/erm/eholdings/local/packages" method="get">
<label class="tip" for="package_filter">Package search:</label>
<input class="head-searchbox" type="text" name="q" id="package_filter" size="40" />
<input type="submit" value="OK" class="submit" />
</div>
<div id="title_search" class="residentsearch">
- <form action="/cgi-bin/koha/erm/eholdings/titles" method="get">
+ <form action="/cgi-bin/koha/erm/eholdings/local/titles" method="get">
<label class="tip" for="title_filter">Title search:</label>
<input class="head-searchbox" type="text" name="q" id="title_filter" size="40" />
<input type="submit" value="OK" class="submit" />
0: Disable
- the E-Resource management module
-
- - Provider for the E-Resource management module
- - pref: ERMProvider
- choices:
- manual: Manual
+ - Providers for the E-Resource management module
+ - pref: ERMProviders
+ multiple:
+ local: Local
ebsco: EBSCO
-
- Customer ID for EBSCO HoldingsIQ
const eholdings_packages_table_settings = [% TablesSettings.GetTableSettings( 'erm', 'eholdings', 'packages', 'json' ) | $raw %];
const eholdings_titles_table_settings = [% TablesSettings.GetTableSettings( 'erm', 'eholdings', 'titles', 'json' ) | $raw %];
- const erm_provider = "[% Koha.Preference('ERMProvider') | html %]";
+ const ERMProviders = "[% Koha.Preference('ERMProviders') | html %]";
+ const erm_providers = ERMProviders.split(',');
</script>
--- /dev/null
+<template>
+ <ul>
+ <li>
+ <router-link :to="`/cgi-bin/koha/erm/eholdings/ebsco/packages`">
+ <i class="fa fa-file-text-o"></i>
+ {{ $t("Packages") }}</router-link
+ >
+ </li>
+ <li>
+ <router-link :to="`/cgi-bin/koha/erm/eholdings/ebsco/titles`">
+ <i class="fa fa-file-text-o"></i>
+ {{ $t("Titles") }}</router-link
+ >
+ </li>
+ </ul>
+</template>
+
+<script>
+
+export default {
+ data() {
+ return {
+ }
+ },
+ methods: {
+ },
+ components: {
+ },
+};
+</script>
--- /dev/null
+<template>
+ <fieldset class="rows" id="package_agreements">
+ <legend>{{ $t("Agreements") }}</legend>
+ <fieldset
+ class="rows"
+ v-for="(package_agreement, counter) in package_agreements"
+ v-bind:key="counter"
+ >
+ <legend>
+ {{ $t("Agreement .counter", { counter: counter + 1 }) }}
+ <a href="#" @click.prevent="deleteAgreement(counter)"
+ ><i class="fa fa-trash"></i>
+ {{ $t("Remove this agreement") }}</a
+ >
+ </legend>
+ <ol>
+ <li>
+ <label :for="`agreement_id_${counter}`"
+ >{{ $t("Agreement") }}:
+ </label>
+ <select
+ v-model="package_agreement.agreement_id"
+ :id="`agreement_id_${counter}`"
+ required
+ >
+ <option value=""></option>
+ <option
+ v-for="agreement in agreements"
+ :key="agreement.agreement_id"
+ :value="agreement.agreement_id"
+ :selected="
+ agreement.agreement_id ==
+ package_agreement.agreement_id
+ ? true
+ : false
+ "
+ >
+ {{ agreement.name }}
+ </option>
+ </select>
+ <span class="required">{{ $t("Required") }}</span>
+ </li>
+ </ol>
+ </fieldset>
+ <a
+ v-if="agreements.length"
+ class="btn btn-default"
+ @click="addAgreement"
+ ><font-awesome-icon icon="plus" /> {{ $t("Add new agreement") }}</a
+ >
+ <span v-else>{{ $t("There are no agreements created yet") }}</span>
+ </fieldset>
+</template>
+
+<script>
+import { fetchAgreements } from "../../fetch"
+
+export default {
+ data() {
+ return {
+ agreements: [],
+ }
+ },
+ beforeCreate() {
+ fetchAgreements().then((agreements) => {
+ this.agreements = agreements
+ })
+ },
+ methods: {
+ addAgreement() {
+ this.package_agreements.push({
+ agreement_id: null,
+ })
+ },
+ deleteAgreement(counter) {
+ this.package_agreements.splice(counter, 1)
+ },
+ },
+ props: {
+ package_agreements: Array,
+ },
+ name: 'EHoldingsEBSCOPackageAgreements',
+}
+</script>
--- /dev/null
+<template>
+ <div id="title_list_result">
+ <div id="filters">
+ <a href="#" @click.prevent="toggle_filters($event)"
+ ><i class="fa fa-search"></i>
+ {{ display_filters ? $t("Hide filters") : $t("Show filters") }}
+ </a>
+ <fieldset v-if="display_filters">
+ <ol>
+ <li>
+ <label>{{ $t("Title") }}:</label>
+ <input
+ type="text"
+ id="publication_title_filter"
+ v-model="filters.publication_title"
+ @keyup.enter="filter_table"
+ />
+ </li>
+ <li>
+ <label>{{ $t("Publication type") }}:</label>
+ <select
+ id="publication_type_filter"
+ v-model="filters.publication_type"
+ >
+ <option value="">{{ $t("All") }}</option>
+ <option
+ v-for="type in av_title_publication_types"
+ :key="type.authorised_values"
+ :value="type.authorised_value"
+ >
+ {{ type.lib }}
+ </option>
+ </select>
+ </li>
+ <li>
+ <label>{{ $t("Selection status") }}:</label>
+ <select
+ id="selection_type_filter"
+ v-model="filters.selection_type"
+ >
+ <option value="0">{{ $t("All") }}</option>
+ <option value="1">{{ $t("Selected") }}</option>
+ <option value="2">{{ $t("Not selected") }}</option>
+ </select>
+ </li>
+ </ol>
+
+ <input
+ @click="filter_table"
+ id="filter_table"
+ type="button"
+ :value="$t('Filter')"
+ />
+ </fieldset>
+ </div>
+ <table id="title_list"></table>
+ </div>
+</template>
+
+<script>
+
+import { createVNode, render } from 'vue'
+import { useAVStore } from "../../stores/authorised_values"
+import { storeToRefs } from "pinia"
+
+export default {
+ setup() {
+ const AVStore = useAVStore()
+ const { av_title_publication_types } = storeToRefs(AVStore)
+ const { get_lib_from_av } = AVStore
+
+ return {
+ av_title_publication_types,
+ get_lib_from_av,
+ }
+ },
+ data() {
+ return {
+ filters: {
+ publication_title: "",
+ publication_type: "",
+ selection_type: "",
+ },
+ display_filters: false,
+ }
+ },
+ methods: {
+ show_resource: function (resource_id) {
+ this.$router.push("/cgi-bin/koha/erm/eholdings/ebsco/resources/" + resource_id)
+ },
+ filter_table: function () {
+ $("#title_list").DataTable().draw()
+ },
+ toggle_filters: function (e) {
+ this.display_filters = !this.display_filters
+ },
+ build_datatable: function () {
+ let show_resource = this.show_resource
+ let package_id = this.package_id
+ let get_lib_from_av = this.get_lib_from_av
+ let filters = this.filters
+
+ window['av_title_publication_types'] = this.av_title_publication_types.map(e => {
+ e['_id'] = e['authorised_value']
+ e['_str'] = e['lib']
+ return e
+ })
+
+ let additional_filters = {
+ publication_title: function () {
+ return filters.publication_title || ""
+ },
+ publication_type: function () {
+ return filters.publication_type || ""
+ },
+ selection_type: function () {
+ return filters.selection_type || ""
+ },
+ }
+
+ $('#title_list').kohaTable({
+ ajax: {
+ url: "/api/v1/erm/eholdings/ebsco/packages/" + package_id + "/resources",
+ },
+ ordering: false,
+ dom: '<"top pager"<"table_entries"ilp>>tr<"bottom pager"ip>',
+ aLengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
+ embed: ['title'],
+ autoWidth: false,
+ columns: [
+ {
+ title: __("Name"),
+ data: "title.publication_title",
+ searchable: false,
+ orderable: false,
+ render: function (data, type, row, meta) {
+ // Rendering done in drawCallback
+ return ""
+ }
+ },
+ {
+ title: __("Publication type"),
+ data: "title.publication_type",
+ searchable: false,
+ orderable: false,
+ render: function (data, type, row, meta) {
+ return escape_str(get_lib_from_av("av_title_publication_types", row.title.publication_type))
+ }
+ },
+ ],
+ drawCallback: function (settings) {
+
+ var api = new $.fn.dataTable.Api(settings)
+
+ $.each($(this).find("tbody tr td:first-child"), function (index, e) {
+ let row = api.row(index).data()
+ if (!row) return // Happen if the table is empty
+ let n = createVNode("a", {
+ role: "button",
+ href: "/cgi-bin/koha/erm/eholdings/ebsco/resources/" + row.resource_id,
+ onClick: (e) => {
+ e.preventDefault()
+ show_resource(row.resource_id)
+ }
+ },
+ `${row.title.publication_title}`
+ )
+ if (row.is_selected) {
+ n = createVNode('span', {}, [n, " ", createVNode("i", { class: "fa fa-check-square-o", style: { color: "green" }, title: __("Is selected") })])
+ }
+ render(n, e)
+ })
+ },
+ }, null, 0, additional_filters)
+ },
+ },
+ mounted() {
+ this.build_datatable()
+ },
+ beforeUnmount() {
+ $('#title_list')
+ .DataTable()
+ .destroy(true)
+ },
+ props: {
+ package_id: String,
+ },
+ name: 'EHoldingsEBSCOPackageTitlesList',
+}
+</script>
+
+<style scoped>
+#title_list_result {
+ width: 60%;
+ padding-left: 10rem;
+}
+#title_list {
+ display: table;
+}
+#filters {
+ margin: 0;
+}
+</style>
\ No newline at end of file
--- /dev/null
+<template>
+ <div>
+ <fieldset>
+ {{ $t("Package name") }}:
+ <input
+ type="text"
+ id="package_name_filter"
+ v-model="filters.package_name"
+ @keyup.enter="filter_table"
+ />
+ {{ $t("Content type") }}:
+ <select id="content_type_filter" v-model="filters.content_type">
+ <option value="">{{ $t("All") }}</option>
+ <option
+ v-for="type in av_package_content_types"
+ :key="type.authorised_values"
+ :value="type.authorised_value"
+ >
+ {{ type.lib }}
+ </option>
+ </select>
+ {{ $t("Selection status") }}:
+ <select id="selection_type_filter" v-model="filters.selection_type">
+ <option value="0">{{ $t("All") }}</option>
+ <option value="1">{{ $t("Selected") }}</option>
+ <option value="2">{{ $t("Not selected") }}</option>
+ </select>
+ <input
+ @click="filter_table"
+ id="filter_table"
+ type="button"
+ :value="$t('Submit')"
+ />
+ </fieldset>
+ <div id="package_list_result" style="display: none">
+ <table id="package_list"></table>
+ </div>
+ </div>
+</template>
+
+<script>
+import { createVNode, render } from 'vue'
+import { useVendorStore } from "../../stores/vendors"
+import { useAVStore } from "../../stores/authorised_values"
+import { storeToRefs } from "pinia"
+
+export default {
+ setup() {
+ const vendorStore = useVendorStore() // FIXME We only need that for 'manual'
+ const { vendors } = storeToRefs(vendorStore)
+
+ const AVStore = useAVStore()
+ const { av_package_types, av_package_content_types } = storeToRefs(AVStore)
+ const { get_lib_from_av } = AVStore
+
+ return {
+ vendors,
+ av_package_types,
+ av_package_content_types,
+ get_lib_from_av,
+ }
+ },
+ data: function () {
+ return {
+ packages: [],
+ initialized: true,
+ filters: {
+ package_name: this.$route.query.q || "",
+ content_type: "",
+ selection_type: "",
+ },
+ }
+ },
+ beforeRouteEnter(to, from, next) {
+ next(vm => {
+ vm.build_datatable()
+ })
+ },
+ methods: {
+ show_package: function (package_id) {
+ this.$router.push("/cgi-bin/koha/erm/eholdings/ebsco/packages/" + package_id)
+ },
+ filter_table: function () {
+ $("#package_list_result").show()
+ $("#package_list").DataTable().draw()
+ },
+ build_datatable: function () {
+ let show_package = this.show_package
+ let get_lib_from_av = this.get_lib_from_av
+ let filters = this.filters
+
+ window['vendors'] = this.vendors.map(e => {
+ e['_id'] = e['id']
+ e['_str'] = e['name']
+ return e
+ })
+ window['av_package_types'] = this.av_package_types.map(e => {
+ e['_id'] = e['authorised_value']
+ e['_str'] = e['lib']
+ return e
+ })
+ window['av_package_content_types'] = this.av_package_content_types.map(e => {
+ e['_id'] = e['authorised_value']
+ e['_str'] = e['lib']
+ return e
+ })
+
+ let additional_filters = {
+ name: function () {
+ return filters.package_name || ""
+ },
+ content_type: function () {
+ return filters.content_type || ""
+ },
+ selection_type: function () {
+ return filters.selection_type || ""
+ },
+ }
+
+ $('#package_list').kohaTable({
+ ajax: {
+ url: "/api/v1/erm/eholdings/ebsco/packages",
+ },
+ embed: ['resources+count', 'vendor.name'],
+ ordering: false,
+ dom: '<"top pager"<"table_entries"ilp>>tr<"bottom pager"ip>',
+ aLengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
+ deferLoading: true,
+ autoWidth: false,
+ columns: [
+ {
+ title: __("Name"),
+ data: "me.package_id:me.name",
+ searchable: false,
+ orderable: false,
+ render: function (data, type, row, meta) {
+ // Rendering done in drawCallback
+ return ""
+ }
+ },
+ {
+ title: __("Vendor"),
+ data: "vendor_id",
+ searchable: false,
+ orderable: false,
+ render: function (data, type, row, meta) {
+ return row.vendor ? escape_str(row.vendor.name) : ""
+ },
+ },
+ {
+ title: __("Type"),
+ data: "package_type",
+ searchable: false,
+ orderable: false,
+ render: function (data, type, row, meta) {
+ return escape_str(get_lib_from_av("av_package_types", row.package_type))
+ }
+ }, {
+ title: __("Content type"),
+ searchable: false,
+ orderable: false,
+ render: function (data, type, row, meta) {
+ return escape_str(get_lib_from_av("av_package_content_types", row.content_type))
+ }
+ },
+ ],
+ drawCallback: function (settings) {
+
+ var api = new $.fn.dataTable.Api(settings)
+
+ $.each($(this).find("tbody tr td:first-child"), function (index, e) {
+ let row = api.row(index).data()
+ if (!row) return // Happen if the table is empty
+ let n = createVNode("a", {
+ role: "button",
+ href: "/cgi-bin/koha/erm/eholdings/ebsco/packages/" + row.package_id,
+ onClick: (e) => {
+ e.preventDefault()
+ show_package(row.package_id)
+ }
+ },
+ `${row.name} (#${row.package_id})`
+ )
+ if (row.is_selected) {
+ n = createVNode('span', {}, [n, " ", createVNode("i", { class: "fa fa-check-square-o", style: { color: "green" }, title: __("Is selected") })])
+ }
+ render(n, e)
+ })
+ },
+ }, eholdings_packages_table_settings, 0, additional_filters)
+
+ if (filters.package_name.length) {
+ this.filter_table()
+ }
+ },
+ },
+ name: "EHoldingsEBSCOPackagesList",
+}
+</script>
--- /dev/null
+<template>
+ <div v-if="!initialized">{{ $t("Loading") }}</div>
+ <div v-else-if="erm_package" id="packages_show">
+ <h2>
+ {{ $t("Package .id", { id: erm_package.package_id }) }}
+ </h2>
+ <div>
+ <fieldset class="rows">
+ <ol>
+ <li>
+ <label>{{ $t("Package name") }}:</label>
+ <span>
+ {{ erm_package.name }}
+ </span>
+ </li>
+ <li v-if="erm_package.vendor">
+ <label>{{ $t("Vendor") }}:</label>
+ <span>{{ erm_package.vendor.name }}</span>
+ </li>
+ <li v-if="erm_package.external_id">
+ <label>{{ $t("External ID") }}:</label>
+ <span>
+ <!-- FIXME Create a syspref to store the URL -->
+ <a
+ :href="`https://replace_with_syspref_value_here.folio.ebsco.com/eholdings/packages/${erm_package.vendor.external_id}-${erm_package.external_id}`"
+ >
+ {{ erm_package.external_id }}
+ </a>
+ </span>
+ </li>
+ <li>
+ <label>{{ $t("Package type") }}:</label>
+ <span>{{
+ get_lib_from_av(
+ "av_package_types",
+ erm_package.package_type
+ )
+ }}</span>
+ </li>
+ <li>
+ <label>{{ $t("Content type") }}:</label>
+ <span>{{
+ get_lib_from_av(
+ "av_package_content_types",
+ erm_package.content_type
+ )
+ }}</span>
+ </li>
+ <li v-if="erm_package.created_on">
+ <label>{{ $t("Created on") }}:</label>
+ <span>{{ format_date(erm_package.created_on) }}</span>
+ </li>
+
+ <li>
+ <label
+ >Titles ({{ erm_package.resources_count }})</label
+ >
+ <div v-if="erm_package.resources_count">
+ <EHoldingsPackageTitlesList
+ :package_id="erm_package.package_id.toString()"
+ />
+ </div>
+ </li>
+
+ <li></li>
+ </ol>
+ </fieldset>
+ <fieldset class="action">
+ <router-link
+ to="/cgi-bin/koha/erm/eholdings/ebsco/packages"
+ role="button"
+ class="cancel"
+ >{{ $t("Close") }}</router-link
+ >
+ </fieldset>
+ </div>
+ </div>
+</template>
+
+<script>
+import EHoldingsPackageTitlesList from "./EHoldingsEBSCOPackageTitlesList.vue"
+import { useAVStore } from "../../stores/authorised_values"
+import { fetchEBSCOPackage } from "../../fetch"
+
+export default {
+ setup() {
+ const format_date = $date
+
+ const AVStore = useAVStore()
+ const { get_lib_from_av } = AVStore
+
+ return {
+ format_date,
+ get_lib_from_av,
+ }
+ },
+ data() {
+ return {
+ erm_package: {
+ package_id: null,
+ vendor_id: null,
+ name: '',
+ external_id: '',
+ package_type: '',
+ content_type: '',
+ created_on: null,
+ resources: null,
+ },
+ initialized: false,
+ }
+ },
+ beforeRouteEnter(to, from, next) {
+ next(vm => {
+ vm.getPackage(to.params.package_id)
+ })
+ },
+ beforeRouteUpdate(to, from) {
+ this.erm_package = this.getPackage(to.params.package_id)
+ },
+ methods: {
+ async getPackage(package_id) {
+ const erm_package = await fetchEBSCOPackage(package_id)
+ this.erm_package = erm_package
+ this.initialized = true
+ },
+ },
+ components: {
+ EHoldingsPackageTitlesList,
+ },
+ name: "EHoldingsEBSCOPackagesShow",
+}
+</script>
+<style scoped>
+fieldset.rows label {
+ width: 25rem;
+}
+</style>
--- /dev/null
+<template>
+ <div v-if="!initialized">{{ $t("Loading") }}</div>
+ <div v-else-if="resource" id="eholdings_resources_show">
+ <h2>
+ {{ $t("Resource .id", { id: resource.resource_id }) }}
+ </h2>
+ <div>
+ <fieldset class="rows">
+ <legend>{{ $t("Resource information") }}</legend>
+ <ol>
+ <li v-if="resource.resource_id">
+ <label>{{ $t("Resource identifier") }}:</label>
+ <span>
+ {{ resource.resource_id }}
+ </span>
+ </li>
+ <li>
+ <label>{{ $t("Publication title") }}:</label>
+ <span
+ ><router-link
+ :to="`/cgi-bin/koha/erm/eholdings/ebsco/titles/${resource.title_id}`"
+ >{{
+ resource.title.publication_title
+ }}</router-link
+ ></span
+ >
+ </li>
+ <li>
+ <label>{{ $t("Publisher name") }}:</label>
+ <span>
+ {{ resource.title.publisher_name }}
+ </span>
+ </li>
+ <li>
+ <label>{{ $t("Publication type") }}:</label>
+ <span>
+ {{ resource.title.publication_type }}
+ </span>
+ </li>
+ <li v-if="resource.title.print_identifier">
+ <label>{{ $t("Print-format identifier") }}:</label>
+ <span>
+ {{ resource.title.print_identifier }}
+ </span>
+ </li>
+ <li v-if="resource.title.online_identifier">
+ <label>{{ $t("Online-format identifier") }}:</label>
+ <span>
+ {{ resource.title.online_identifier }}
+ </span>
+ </li>
+ </ol>
+ </fieldset>
+
+ <fieldset class="rows">
+ <ol>
+ <li>
+ <label>{{ $t("Package") }}:</label>
+ <span
+ ><router-link
+ :to="`/cgi-bin/koha/erm/eholdings/ebsco/packages/${resource.package_id}`"
+ >{{ resource.package.name }}</router-link
+ ></span
+ >
+ </li>
+
+ <li>
+ <label>{{ $t("Vendor") }}:</label>
+ <span v-if="resource.vendor">
+ {{ resource.vendor.name }}
+ </span>
+ </li>
+ <li v-if="resource.package.content_type">
+ <label>{{ $t("Package content type") }}:</label>
+ <span>{{ resource.package.content_type }}</span>
+ </li>
+ </ol>
+ </fieldset>
+
+ <fieldset class="rows">
+ <legend>Resource settings</legend>
+ <ol>
+ <li>
+ <label>{{ $t("Coverage dates") }}:</label>
+ <span
+ >{{ format_date(resource.started_on) }}-{{
+ format_date(resource.ended_on)
+ }}</span
+ >
+ </li>
+ </ol>
+ </fieldset>
+ </div>
+ </div>
+</template>
+
+<script>
+import { fetchEBSCOResource } from "../../fetch"
+import { useVendorStore } from "../../stores/vendors"
+import { storeToRefs } from "pinia"
+export default {
+ setup() {
+ const format_date = $date
+
+ const vendorStore = useVendorStore()
+ const { vendors } = storeToRefs(vendorStore)
+ return {
+ format_date,
+ vendors,
+ }
+ },
+ data() {
+ return {
+ resource: {
+ resource_id: null,
+ title_id: null,
+ package_id: null,
+ started_on: '',
+ ended_on: '',
+ proxy: '',
+ title: {},
+ package: {},
+ },
+ initialized: false,
+ }
+ },
+
+ beforeRouteEnter(to, from, next) {
+ next(vm => {
+ vm.getResource(to.params.resource_id)
+ })
+ },
+ beforeRouteUpdate(to, from) {
+ this.resource = this.getResource(to.params.resource_id)
+ },
+ methods: {
+ async getResource(resource_id) {
+ const resource = await fetchEBSCOResource(resource_id)
+ this.resource = resource
+ this.initialized = true
+ },
+ },
+ name: "EHoldingsEBSCOResourcesShow",
+}
+</script>
+<style scoped>
+fieldset.rows label {
+ width: 25rem;
+}
+</style>
--- /dev/null
+<template>
+ <div id="package_list_result">
+ <div id="filters">
+ <a href="#" @click.prevent="toggle_filters($event)"
+ ><i class="fa fa-search"></i>
+ {{ display_filters ? $t("Hide filters") : $t("Show filters") }}
+ </a>
+ <fieldset v-if="display_filters" id="filters">
+ <ol>
+ <li>
+ <label>{{ $t("Package name") }}:</label>
+ <input
+ type="text"
+ id="package_name_filter"
+ v-model="this.filters.package_name"
+ @keyup.enter="filter_table"
+ />
+ </li>
+ <li>
+ <label>{{ $t("Selection status") }}:</label>
+ <select
+ id="selection_type_filter"
+ v-model="this.filters.selection_type"
+ >
+ <option value="0">{{ $t("All") }}</option>
+ <option value="1">{{ $t("Selected") }}</option>
+ <option value="2">{{ $t("Not selected") }}</option>
+ </select>
+ </li>
+ </ol>
+ <input
+ @click="filter_table"
+ id="filter_table"
+ type="button"
+ :value="$t('Filter')"
+ />
+ </fieldset>
+ </div>
+ <table id="package_list"></table>
+ </div>
+</template>
+
+<script>
+
+import { createVNode, render } from 'vue'
+
+export default {
+ setup() {
+ return {
+ }
+ },
+ data() {
+ return {
+ filters: {
+ package_name: "",
+ selection_type: 0,
+ },
+ display_filters: false,
+ }
+ },
+ methods: {
+ show_resource: function (resource_id) {
+ this.$router.push("/cgi-bin/koha/erm/eholdings/ebsco/resources/" + resource_id)
+ },
+ toggle_filters: function (e) {
+ this.display_filters = !this.display_filters
+ },
+ filter_table: function () {
+ $("#package_list").DataTable().draw()
+ },
+ build_datatable: function () {
+ let show_resource = this.show_resource
+ let resources = this.resources
+ let filters = this.filters
+
+ $.fn.dataTable.ext.search = $.fn.dataTable.ext.search.filter((search) => search.name != 'apply_filter')
+ $('#package_list').dataTable($.extend(true, {}, dataTablesDefaults, {
+ data: resources,
+ embed: ['package.name'],
+ ordering: false,
+ dom: '<"top pager"<"table_entries"ilp>>tr<"bottom pager"ip>',
+ aLengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
+ autoWidth: false,
+ columns: [
+ {
+ title: __("Name"),
+ data: "package.name",
+ searchable: false,
+ orderable: false,
+ render: function (data, type, row, meta) {
+ // Rendering done in drawCallback
+ return ""
+ },
+ width: '100%',
+ },
+ ],
+ drawCallback: function (settings) {
+
+ var api = new $.fn.dataTable.Api(settings)
+
+ if (!api.rows({ search: 'applied' }).count()) return
+
+ $.each($(this).find("tbody tr td:first-child"), function (index, e) {
+ let row = api.row(index).data()
+ if (!row) return // Happen if the table is empty
+ let n = createVNode("a", {
+ role: "button",
+ href: "/cgi-bin/koha/erm/eholdings/ebsco/resources/" + row.resource_id,
+ onClick: (e) => {
+ e.preventDefault()
+ show_resource(row.resource_id)
+ }
+ },
+ `${row.package.name}`
+ )
+ if (row.is_selected) {
+ n = createVNode('span', {}, [n, " ", createVNode("i", { class: "fa fa-check-square-o", style: { color: "green" }, title: __("Is selected") })])
+ }
+ render(n, e)
+ })
+ },
+ initComplete: function () {
+ $.fn.dataTable.ext.search.push(
+ function apply_filter(settings, data, dataIndex, row) {
+ return row.package.name.match(new RegExp(filters.package_name, "i"))
+ && (filters.selection_type == 0
+ || filters.selection_type == 1 && row.is_selected
+ || filters.selection_type == 2 && !row.is_selected)
+ }
+ )
+ }
+ }))
+ }
+ },
+ mounted() {
+ this.build_datatable()
+ },
+ beforeUnmount() {
+ $('#package_list')
+ .DataTable()
+ .destroy(true)
+ },
+ props: {
+ resources: Array,
+ },
+ name: 'EHoldingsEBSCOTitlePackagesList',
+}
+</script>
+
+<style scoped>
+#package_list_result {
+ width: 60%;
+ padding-left: 26rem;
+}
+#package_list {
+ display: table;
+}
+#filters fieldset {
+ margin: 0;
+}
+</style>
--- /dev/null
+<template>
+ <div>
+ <fieldset>
+ {{ $t("Publication title") }}:
+ <input
+ type="text"
+ id="publication_title_filter"
+ v-model="filters.publication_title"
+ @keyup.enter="filter_table"
+ />
+ {{ $t("Publication type") }}:
+ <select
+ id="publication_type_filter"
+ v-model="filters.publication_type"
+ >
+ <option value="">{{ $t("All") }}</option>
+ <option
+ v-for="type in av_title_publication_types"
+ :key="type.authorised_values"
+ :value="type.authorised_value"
+ >
+ {{ type.lib }}
+ </option>
+ </select>
+ {{ $t("Selection status") }}:
+ <select id="selection_type_filter" v-model="filters.selection_type">
+ <option value="0">{{ $t("All") }}</option>
+ <option value="1">{{ $t("Selected") }}</option>
+ <option value="2">{{ $t("Not selected") }}</option>
+ </select>
+ <input
+ @click="filter_table"
+ id="filter_table"
+ type="button"
+ :value="$t('Submit')"
+ />
+ <span v-if="cannot_search">{{
+ $t("Please enter a search term")
+ }}</span>
+ </fieldset>
+ <div id="title_list_result" style="display: none">
+ <table id="title_list"></table>
+ </div>
+ </div>
+</template>
+
+<script>
+import { createVNode, render } from 'vue'
+import { useVendorStore } from "../../stores/vendors"
+import { useAVStore } from "../../stores/authorised_values"
+import { storeToRefs } from "pinia"
+
+export default {
+ setup() {
+ const vendorStore = useVendorStore()
+ const { vendors } = storeToRefs(vendorStore)
+
+ const AVStore = useAVStore()
+ const { av_title_publication_types } = storeToRefs(AVStore)
+ const { get_lib_from_av } = AVStore
+
+ return {
+ vendors,
+ av_title_publication_types,
+ get_lib_from_av,
+ }
+ },
+ data: function () {
+ return {
+ titles: [],
+ initialized: true,
+ filters: {
+ publication_title: this.$route.query.q || "",
+ publication_type: "",
+ selection_type: "",
+ },
+ cannot_search: false,
+ }
+ },
+ beforeRouteEnter(to, from, next) {
+ next(vm => {
+ vm.build_datatable()
+ })
+ },
+ methods: {
+ show_title: function (title_id) {
+ this.$router.push("/cgi-bin/koha/erm/eholdings/ebsco/titles/" + title_id)
+ },
+ filter_table: function () {
+ if (this.filters.publication_title.length) {
+ this.cannot_search = false
+ $("#title_list_result").show()
+ $("#title_list").DataTable().draw()
+ } else {
+ this.cannot_search = true
+ }
+ },
+ build_datatable: function () {
+ let show_title = this.show_title
+ let get_lib_from_av = this.get_lib_from_av
+ let filters = this.filters
+
+ window['vendors'] = this.vendors.map(e => {
+ e['_id'] = e['id']
+ e['_str'] = e['name']
+ return e
+ })
+ let vendors_map = this.vendors.reduce((map, e) => {
+ map[e.id] = e
+ return map
+ }, {})
+ window['av_title_publication_types'] = this.av_title_publication_types.map(e => {
+ e['_id'] = e['authorised_value']
+ e['_str'] = e['lib']
+ return e
+ })
+
+ let additional_filters = {
+ publication_title: function () {
+ return filters.publication_title || ""
+ },
+ publication_type: function () {
+ return filters.content_type_search || ""
+ },
+ selection_type: function () {
+ return filters.selection_type || ""
+ },
+ }
+ $('#title_list').kohaTable({
+ ajax: {
+ url: "/api/v1/erm/eholdings/ebsco/titles",
+ },
+ embed: ["resources.package"],
+ ordering: false,
+ dom: '<"top pager"<"table_entries"ilp>>tr<"bottom pager"ip>',
+ aLengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]],
+ deferLoading: true,
+ autoWidth: false,
+ columns: [
+ {
+ title: __("Title"),
+ data: "me.publication_title",
+ searchable: false,
+ orderable: false,
+ render: function (data, type, row, meta) {
+ // Rendering done in drawCallback
+ return ""
+ }
+ },
+ {
+ title: __("Vendor"),
+ data: "vendor_id",
+ searchable: false,
+ orderable: false,
+ render: function (data, type, row, meta) {
+ return row.vendor_id != undefined ? escape_str(vendors_map[row.vendor_id].name) : ""
+ }
+ },
+ {
+ title: __("Publication type"),
+ data: "publication_type",
+ searchable: false,
+ orderable: false,
+ render: function (data, type, row, meta) {
+ return escape_str(get_lib_from_av("av_title_publication_types", row.publication_type))
+ }
+ },
+ {
+ title: __("Identifier"),
+ data: "print_identifier:online_identifier",
+ searchable: false,
+ orderable: false,
+ render: function (data, type, row, meta) {
+ let print_identifier = row.print_identifier
+ let online_identifier = row.online_identifier
+ return (print_identifier ? escape_str(_("ISBN (Print): %s").format(print_identifier)) : "") +
+ (online_identifier ? escape_str(_("ISBN (Online): %s").format(online_identifier)) : "")
+ }
+ },
+ ],
+ drawCallback: function (settings) {
+
+ var api = new $.fn.dataTable.Api(settings)
+
+ if (!api.rows({ search: 'applied' }).count()) return
+
+ $.each($(this).find("tbody tr td:first-child"), function (index, e) {
+ let row = api.row(index).data()
+ if (!row) return // Happen if the table is empty
+ let n = createVNode("a", {
+ role: "button",
+ onClick: (e) => {
+ e.preventDefault()
+ show_title(row.title_id)
+ }
+ },
+ `${row.publication_title} (#${row.title_id})`
+ )
+ // TODO? We don't have is_selected at title level
+ //if (row.is_selected) {
+ // n = createVNode('span', {}, [n, " ", createVNode("i", { class: "fa fa-check-square-o", style: { color: "green" }, title: __("Is selected") })])
+ //}
+ render(n, e)
+ })
+ },
+ }, eholdings_titles_table_settings, 0, additional_filters)
+
+ if (filters.publication_title.length) {
+ this.filter_table()
+ }
+ },
+ },
+ name: "EHoldingsEBSCOTitlesList",
+}
+</script>
--- /dev/null
+<template>
+ <div v-if="!initialized">{{ $t("Loading") }}</div>
+ <div v-else-if="title" id="eholdings_title_show">
+ <h2>
+ {{ $t("Title .id", { id: title.title_id }) }}
+ </h2>
+ <div>
+ <fieldset class="rows">
+ <ol>
+ <li v-if="title.title_id">
+ <label>{{ $t("Title identifier") }}:</label>
+ <span>
+ {{ title.title_id }}
+ </span>
+ </li>
+ <li>
+ <label>{{ $t("Publication title") }}:</label>
+ <span>
+ {{ title.publication_title }}
+ <a
+ v-if="title.biblio_id"
+ :href="`/cgi-bin/koha/catalogue/detail.pl?biblionumber=${title.biblio_id}`"
+ >
+ {{ $t("Local bibliographic record") }}
+ </a>
+ </span>
+ </li>
+ <li v-if="title.print_identifier">
+ <label>{{ $t("Print-format identifier") }}:</label>
+ <span>
+ {{ title.print_identifier }}
+ </span>
+ </li>
+ <li v-if="title.online_identifier">
+ <label>{{ $t("Online-format identifier") }}:</label>
+ <span>
+ {{ title.online_identifier }}
+ </span>
+ </li>
+ <li v-if="title.date_first_issue_online">
+ <label
+ >{{
+ $t(
+ "Date of first serial issue available online"
+ )
+ }}:</label
+ >
+ <span>
+ {{ title.date_first_issue_online }}
+ </span>
+ </li>
+ <li v-if="title.num_first_vol_online">
+ <label
+ >{{
+ $t("Number of first volume available online")
+ }}:</label
+ >
+ <span>
+ {{ title.num_first_vol_online }}
+ </span>
+ </li>
+ <li v-if="title.num_first_issue_online">
+ <label
+ >{{
+ $t("Number of first issue available online")
+ }}:</label
+ >
+ <span>
+ {{ title.num_first_issue_online }}
+ </span>
+ </li>
+ <li v-if="title.date_last_issue_online">
+ <label
+ >{{
+ $t("Date of last issue available online")
+ }}:</label
+ >
+ <span>
+ {{ title.date_last_issue_online }}
+ </span>
+ </li>
+ <li v-if="title.num_last_vol_online">
+ <label
+ >{{
+ $t("Number of last volume available online")
+ }}:</label
+ >
+ <span>
+ {{ title.num_last_vol_online }}
+ </span>
+ </li>
+ <li v-if="title.num_last_issue_online">
+ <label
+ >{{
+ $t("Number of last issue available online")
+ }}:</label
+ >
+ <span>
+ {{ title.num_last_issue_online }}
+ </span>
+ </li>
+ <li v-if="title.title_url">
+ <label>{{ $t("Title-level URL") }}:</label>
+ <span>
+ {{ title.title_url }}
+ </span>
+ </li>
+ <li v-if="title.first_author">
+ <label>{{ $t("First author") }}:</label>
+ <span>
+ {{ title.first_author }}
+ </span>
+ </li>
+ <li v-if="title.embargo_info">
+ <label>{{ $t("Embargo information") }}:</label>
+ <span>
+ {{ title.embargo_info }}
+ </span>
+ </li>
+ <li v-if="title.coverage_depth">
+ <label>{{ $t("Coverage depth") }}:</label>
+ <span>
+ {{ title.coverage_depth }}
+ </span>
+ </li>
+ <li v-if="title.notes">
+ <label>{{ $t("Notes") }}:</label>
+ <span>
+ {{ title.notes }}
+ </span>
+ </li>
+ <li v-if="title.publisher_name">
+ <label>{{ $t("Publisher name") }}:</label>
+ <span>
+ {{ title.publisher_name }}
+ </span>
+ </li>
+ <li v-if="title.publication_type">
+ <label>{{ $t("Publication type") }}:</label>
+ <span
+ >{{
+ get_lib_from_av(
+ "av_title_publication_types",
+ title.publication_type
+ )
+ }}
+ </span>
+ </li>
+ <li v-if="title.date_monograph_published_print">
+ <label
+ >{{
+ $t(
+ "Date the monograph is first published in print"
+ )
+ }}:</label
+ >
+ <span>
+ {{ title.date_monograph_published_print }}
+ </span>
+ </li>
+ <li v-if="title.date_monograph_published_online">
+ <label
+ >{{
+ $t(
+ "Date the monograph is first published online"
+ )
+ }}:</label
+ >
+ <span>
+ {{ title.date_monograph_published_online }}
+ </span>
+ </li>
+ <li v-if="title.monograph_volume">
+ <label
+ >{{ $t("Number of volume for monograph") }}:</label
+ >
+ <span>
+ {{ title.monograph_volume }}
+ </span>
+ </li>
+ <li v-if="title.monograph_edition">
+ <label>{{ $t("Edition of the monograph") }}:</label>
+ <span>
+ {{ title.monograph_edition }}
+ </span>
+ </li>
+ <li v-if="title.first_editor">
+ <label>{{ $t("First editor") }}:</label>
+ <span>
+ {{ title.first_editor }}
+ </span>
+ </li>
+ <li v-if="title.parent_publication_title_id">
+ <label
+ >{{
+ $t(
+ "Title identifier of the parent publication"
+ )
+ }}:</label
+ >
+ <span>
+ {{ title.parent_publication_title_id }}
+ </span>
+ </li>
+ <li v-if="title.preceeding_publication_title_id">
+ <label
+ >{{
+ $t(
+ "Title identifier of any preceding publication title"
+ )
+ }}:</label
+ >
+ <span>
+ {{ title.preceeding_publication_title_id }}
+ </span>
+ </li>
+ <li v-if="title.access_type">
+ <label>{{ $t("Access type") }}:</label>
+ <span>
+ {{ title.access_type }}
+ </span>
+ </li>
+ <li>
+ <label>Packages ({{ title.resources.length }})</label>
+ <div v-if="title.resources.length">
+ <EHoldingsTitlePackagesList
+ :resources="title.resources"
+ />
+ </div>
+ </li>
+ </ol>
+ </fieldset>
+ <fieldset class="action">
+ <router-link
+ to="/cgi-bin/koha/erm/eholdings/ebsco/titles"
+ role="button"
+ class="cancel"
+ >{{ $t("Close") }}</router-link
+ >
+ </fieldset>
+ </div>
+ </div>
+</template>
+
+<script>
+import EHoldingsTitlePackagesList from "./EHoldingsEBSCOTitlePackagesList.vue"
+import { fetchEBSCOTitle } from "../../fetch"
+import { useAVStore } from "../../stores/authorised_values"
+export default {
+ setup() {
+ const AVStore = useAVStore()
+ const { get_lib_from_av } = AVStore
+
+ return {
+ get_lib_from_av,
+ }
+ },
+ data() {
+ return {
+ title: {
+ title_id: null,
+ publication_title: '',
+ external_id: '',
+ print_identifier: '',
+ online_identifier: '',
+ date_first_issue_online: '',
+ num_first_vol_online: '',
+ num_first_issue_online: '',
+ date_last_issue_online: '',
+ num_last_vol_online: '',
+ num_last_issue_online: '',
+ title_url: '',
+ first_author: '',
+ embargo_info: '',
+ coverage_depth: '',
+ notes: '',
+ publisher_name: '',
+ publication_type: '',
+ date_monograph_published_print: '',
+ date_monograph_published_online: '',
+ monograph_volume: '',
+ monograph_edition: '',
+ first_editor: '',
+ parent_publication_title_id: '',
+ preceeding_publication_title_id: '',
+ access_type: '',
+ resources: [],
+ },
+ initialized: false,
+ }
+ },
+ beforeRouteEnter(to, from, next) {
+ next(vm => {
+ vm.getTitle(to.params.title_id)
+ })
+ },
+ beforeRouteUpdate(to, from) {
+ this.title = this.getTitle(to.params.title_id)
+ },
+ methods: {
+ async getTitle(title_id) {
+ const title = await fetchEBSCOTitle(title_id)
+ this.title = title
+ this.initialized = true
+ },
+ },
+ components: {
+ EHoldingsTitlePackagesList,
+ },
+ name: "EHoldingsEBSCOTitlesShow",
+}
+</script>
+<style scoped>
+fieldset.rows label {
+ width: 25rem;
+}
+</style>
--- /dev/null
+<template>
+ <ul>
+ <li>
+ <router-link :to="`/cgi-bin/koha/erm/eholdings/local/packages`">
+ <i class="fa fa-file-text-o"></i>
+ {{ $t("Packages") }}</router-link
+ >
+ </li>
+ <li>
+ <router-link :to="`/cgi-bin/koha/erm/eholdings/local/titles`">
+ <i class="fa fa-file-text-o"></i>
+ {{ $t("Titles") }}</router-link
+ >
+ </li>
+ </ul>
+</template>
+
+<script>
+
+export default {
+ data() {
+ return {
+ }
+ },
+ methods: {
+ },
+ components: {
+ },
+};
+</script>
--- /dev/null
+<template>
+ <fieldset class="rows" id="package_agreements">
+ <legend>{{ $t("Agreements") }}</legend>
+ <fieldset
+ class="rows"
+ v-for="(package_agreement, counter) in package_agreements"
+ v-bind:key="counter"
+ >
+ <legend>
+ {{ $t("Agreement .counter", { counter: counter + 1 }) }}
+ <a href="#" @click.prevent="deleteAgreement(counter)"
+ ><i class="fa fa-trash"></i>
+ {{ $t("Remove this agreement") }}</a
+ >
+ </legend>
+ <ol>
+ <li>
+ <label :for="`agreement_id_${counter}`"
+ >{{ $t("Agreement") }}:
+ </label>
+ <select
+ v-model="package_agreement.agreement_id"
+ :id="`agreement_id_${counter}`"
+ required
+ >
+ <option value=""></option>
+ <option
+ v-for="agreement in agreements"
+ :key="agreement.agreement_id"
+ :value="agreement.agreement_id"
+ :selected="
+ agreement.agreement_id ==
+ package_agreement.agreement_id
+ ? true
+ : false
+ "
+ >
+ {{ agreement.name }}
+ </option>
+ </select>
+ <span class="required">{{ $t("Required") }}</span>
+ </li>
+ </ol>
+ </fieldset>
+ <a
+ v-if="agreements.length"
+ class="btn btn-default"
+ @click="addAgreement"
+ ><font-awesome-icon icon="plus" /> {{ $t("Add new agreement") }}</a
+ >
+ <span v-else>{{ $t("There are no agreements created yet") }}</span>
+ </fieldset>
+</template>
+
+<script>
+import { fetchAgreements } from "../../fetch"
+
+export default {
+ data() {
+ return {
+ agreements: [],
+ }
+ },
+ beforeCreate() {
+ fetchAgreements().then((agreements) => {
+ this.agreements = agreements
+ })
+ },
+ methods: {
+ addAgreement() {
+ this.package_agreements.push({
+ agreement_id: null,
+ })
+ },
+ deleteAgreement(counter) {
+ this.package_agreements.splice(counter, 1)
+ },
+ },
+ props: {
+ package_agreements: Array,
+ },
+ name: 'EHoldingsLocalPackageAgreements',
+}
+</script>
--- /dev/null
+<template>
+ <div id="title_list_result">
+ <table id="title_list"></table>
+ </div>
+</template>
+
+<script>
+
+import { createVNode, render } from 'vue'
+import { useAVStore } from "../../stores/authorised_values"
+import { storeToRefs } from "pinia"
+
+export default {
+ setup() {
+ const AVStore = useAVStore()
+ const { av_title_publication_types } = storeToRefs(AVStore)
+ const { get_lib_from_av } = AVStore
+
+ return {
+ av_title_publication_types,
+ get_lib_from_av,
+ }
+ },
+ data() {
+ return {
+ }
+ },
+ methods: {
+ show_resource: function (resource_id) {
+ this.$router.push("/cgi-bin/koha/erm/eholdings/local/resources/" + resource_id)
+ },
+ build_datatable: function () {
+ let show_resource = this.show_resource
+ let package_id = this.package_id
+ let get_lib_from_av = this.get_lib_from_av
+
+ window['av_title_publication_types'] = this.av_title_publication_types.map(e => {
+ e['_id'] = e['authorised_value']
+ e['_str'] = e['lib']
+ return e
+ })
+
+ $('#title_list').kohaTable({
+ ajax: {
+ url: "/api/v1/erm/eholdings/local/packages/" + package_id + "/resources",
+ },
+ embed: ['title'],
+ autoWidth: false,
+ columns: [
+ {
+ title: __("Name"),
+ data: "title.publication_title",
+ searchable: true,
+ orderable: true,
+ render: function (data, type, row, meta) {
+ // Rendering done in drawCallback
+ return ""
+ }
+ },
+ {
+ title: __("Publication type"),
+ data: "title.publication_type",
+ searchable: true,
+ orderable: true,
+ render: function (data, type, row, meta) {
+ return escape_str(get_lib_from_av("av_title_publication_types", row.title.publication_type))
+ }
+ },
+ ],
+ drawCallback: function (settings) {
+
+ var api = new $.fn.dataTable.Api(settings)
+
+ $.each($(this).find("tbody tr td:first-child"), function (index, e) {
+ let row = api.row(index).data()
+ if (!row) return // Happen if the table is empty
+ let n = createVNode("a", {
+ role: "button",
+ href: "/cgi-bin/koha/erm/eholdings/local/resources/" + row.resource_id,
+ onClick: (e) => {
+ e.preventDefault()
+ show_resource(row.resource_id)
+ }
+ },
+ `${row.title.publication_title}`
+ )
+ render(n, e)
+ })
+ },
+ preDrawCallback: function (settings) {
+ var table_id = settings.nTable.id
+ $("#" + table_id).find("thead th").eq(1).attr('data-filter', 'av_title_publication_types')
+ }
+ }, null, 1)
+ },
+ },
+ mounted() {
+ this.build_datatable()
+ },
+ beforeUnmount() {
+ $('#title_list')
+ .DataTable()
+ .destroy(true)
+ },
+ props: {
+ package_id: String,
+ },
+ name: 'EHoldingsLocalPackageTitlesList',
+}
+</script>
+
+<style scoped>
+#title_list_result {
+ width: 60%;
+ padding-left: 10rem;
+}
+#title_list {
+ display: table;
+}
+</style>
\ No newline at end of file
--- /dev/null
+<template>
+ <div v-if="!this.initialized">{{ $t("Loading") }}</div>
+ <div v-else id="packages_add">
+ <h2 v-if="erm_package.package_id">
+ {{ $t("Edit package .id", { id: erm_package.package_id }) }}
+ </h2>
+ <h2 v-else>{{ $t("New package") }}</h2>
+ <div>
+ <form @submit="onSubmit($event)">
+ <fieldset class="rows">
+ <ol>
+ <li>
+ <label class="required" for="package_name"
+ >{{ $t("Package name") }}:</label
+ >
+ <input
+ id="package_name"
+ v-model="erm_package.name"
+ :placeholder="$t('Package name')"
+ required
+ />
+ <span class="required">{{ $t("Required") }}</span>
+ </li>
+ <li>
+ <label for="package_vendor_id"
+ >{{ $t("Vendor") }}:</label
+ >
+ <select
+ id="package_vendor_id"
+ v-model="erm_package.vendor_id"
+ >
+ <option value=""></option>
+ <option
+ v-for="vendor in vendors"
+ :key="vendor.vendor_id"
+ :value="vendor.id"
+ :selected="
+ vendor.id == erm_package.vendor_id
+ ? true
+ : false
+ "
+ >
+ {{ vendor.name }}
+ </option>
+ </select>
+ </li>
+ <li>
+ <label for="package_type">{{ $t("Type") }}:</label>
+ <select
+ id="package_type"
+ v-model="erm_package.package_type"
+ >
+ <option value=""></option>
+ <option
+ v-for="type in av_package_types"
+ :key="type.authorised_values"
+ :value="type.authorised_value"
+ :selected="
+ type.authorised_value ==
+ erm_package.package_type
+ ? true
+ : false
+ "
+ >
+ {{ type.lib }}
+ </option>
+ </select>
+ </li>
+ <li>
+ <label for="package_content_type">{{
+ $t("Content type: ")
+ }}</label>
+ <select
+ id="package_content_type"
+ v-model="erm_package.content_type"
+ >
+ <option value=""></option>
+ <option
+ v-for="type in av_package_content_types"
+ :key="type.authorised_values"
+ :value="type.authorised_value"
+ :selected="
+ type.authorised_value ==
+ erm_package.content_type
+ ? true
+ : false
+ "
+ >
+ {{ type.lib }}
+ </option>
+ </select>
+ </li>
+
+ <EHoldingsPackageAgreements
+ :package_agreements="erm_package.package_agreements"
+ />
+ </ol>
+ </fieldset>
+ <fieldset class="action">
+ <input type="submit" value="Submit" />
+ <router-link
+ to="/cgi-bin/koha/erm/eholdings/local/packages"
+ role="button"
+ class="cancel"
+ >{{ $t("Cancel") }}</router-link
+ >
+ </fieldset>
+ </form>
+ </div>
+ </div>
+</template>
+
+<script>
+import EHoldingsPackageAgreements from "./EHoldingsLocalPackageAgreements.vue"
+import { useVendorStore } from "../../stores/vendors"
+import { useAVStore } from "../../stores/authorised_values"
+import { setMessage, setError } from "../../messages"
+import { fetchLocalPackage } from '../../fetch'
+import { storeToRefs } from "pinia"
+
+export default {
+ setup() {
+ const vendorStore = useVendorStore()
+ const { vendors } = storeToRefs(vendorStore)
+ const AVStore = useAVStore()
+ const {
+ av_package_types,
+ av_package_content_types,
+ } = storeToRefs(AVStore)
+
+ return {
+ vendors,
+ av_package_types,
+ av_package_content_types,
+ }
+ },
+ data() {
+ return {
+ erm_package: {
+ package_id: null,
+ name: '',
+ external_id: '',
+ package_type: '',
+ content_type: '',
+ package_agreements: [],
+ },
+ initialized: false,
+ }
+ },
+ beforeRouteEnter(to, from, next) {
+ next(vm => {
+ if (to.params.package_id) {
+ vm.erm_package = vm.getPackage(to.params.package_id)
+ } else {
+ vm.initialized = true
+ }
+ })
+ },
+ methods: {
+ async getPackage(package_id) {
+ const erm_package = await fetchLocalPackage(package_id)
+ this.erm_package = erm_package
+ this.initialized = true
+ },
+ onSubmit(e) {
+ e.preventDefault()
+
+ let erm_package = JSON.parse(JSON.stringify(this.erm_package)) // copy
+ let apiUrl = '/api/v1/erm/eholdings/local/packages'
+
+ let method = 'POST'
+ if (erm_package.package_id) {
+ method = 'PUT'
+ apiUrl += '/' + erm_package.package_id
+ }
+ delete erm_package.package_id
+ delete erm_package.resources
+ delete erm_package.vendor
+ delete erm_package.resources_count
+
+ erm_package.package_agreements = erm_package.package_agreements.map(({ package_id, agreement, ...keepAttrs }) => keepAttrs)
+
+ const options = {
+ method: method,
+ body: JSON.stringify(erm_package),
+ headers: {
+ 'Content-Type': 'application/json;charset=utf-8'
+ },
+ }
+
+ fetch(apiUrl, options)
+ .then(response => {
+ if (response.status == 200) {
+ this.$router.push("/cgi-bin/koha/erm/eholdings/local/packages")
+ setMessage(this.$t("Package updated"))
+ } else if (response.status == 201) {
+ this.$router.push("/cgi-bin/koha/erm/eholdings/local/packages")
+ setMessage(this.$t("Package created"))
+ } else {
+ setError(response.message || response.statusText)
+ }
+ }, (error) => {
+ setError(error)
+ }).catch(e => { console.log(e) })
+ },
+ },
+ components: {
+ EHoldingsPackageAgreements,
+ },
+ name: "EHoldingsEBSCOPackagesFormAdd",
+}
+</script>
--- /dev/null
+<template>
+ <div v-if="!this.initialized">{{ $t("Loading") }}</div>
+ <div v-else id="packages_confirm_delete">
+ <h2>{{ $t("Delete package") }}</h2>
+ <div>
+ <form @submit="onSubmit($event)">
+ <fieldset class="rows">
+ <ol>
+ <li>
+ {{ $t("Package name") }}:
+ {{ erm_package.name }}
+ </li>
+ </ol>
+ </fieldset>
+ <fieldset class="action">
+ <input
+ type="submit"
+ variant="primary"
+ :value="$t('Yes, delete')"
+ />
+ <router-link
+ to="/cgi-bin/koha/erm/eholdings/local/packages"
+ role="button"
+ class="cancel"
+ >{{ $t("No, do not delete") }}</router-link
+ >
+ </fieldset>
+ </form>
+ </div>
+ </div>
+</template>
+
+<script>
+import { fetchLocalPackage } from "../../fetch"
+import { setMessage, setError } from "../../messages"
+
+export default {
+ data() {
+ return {
+ erm_package: {},
+ initialized: false,
+ }
+ },
+ beforeRouteEnter(to, from, next) {
+ next(vm => {
+ vm.getPackage(to.params.package_id)
+ })
+ },
+ methods: {
+ async getPackage(package_id) {
+ const erm_package = await fetchLocalPackage(package_id)
+ this.erm_package = erm_package
+ this.initialized = true
+ },
+ onSubmit(e) {
+ e.preventDefault()
+
+ let apiUrl = '/api/v1/erm/eholdings/local/packages/' + this.erm_package.package_id
+
+ const options = {
+ method: 'DELETE',
+ headers: {
+ 'Content-Type': 'application/json;charset=utf-8'
+ },
+ }
+
+ fetch(apiUrl, options)
+ .then(
+ (response) => {
+ if (response.status == 204) {
+ setMessage(this.$t("Package deleted"))
+ this.$router.push("/cgi-bin/koha/erm/eholdings/local/packages")
+ } else {
+ setError(response.message || response.statusText)
+ }
+ }
+ ).catch(
+ (error) => {
+ setError(error)
+ }
+ )
+ }
+ },
+ name: "EHoldingsLocalPackagesFormConfirmDelete",
+}
+</script>
--- /dev/null
+<template>
+ <div>
+ <div v-if="!this.initialized">{{ $t("Loading") }}</div>
+ <div v-else-if="this.packages" id="packages_list">
+ <Toolbar />
+ <div v-if="this.packages.length" id="package_list_result">
+ <table id="package_list"></table>
+ </div>
+ <div v-else-if="this.initialized" class="dialog message">
+ {{ $t("There are no packages defined") }}
+ </div>
+ </div>
+ </div>
+</template>
+
+<script>
+import Toolbar from "./EHoldingsLocalPackagesToolbar.vue"
+import { createVNode, render } from 'vue'
+import { useVendorStore } from "../../stores/vendors"
+import { useAVStore } from "../../stores/authorised_values"
+import { storeToRefs } from "pinia"
+import { fetchLocalPackages } from "../../fetch"
+
+export default {
+ setup() {
+ const vendorStore = useVendorStore() // FIXME We only need that for 'manual'
+ const { vendors } = storeToRefs(vendorStore)
+
+ const AVStore = useAVStore()
+ const { av_package_types, av_package_content_types } = storeToRefs(AVStore)
+ const { get_lib_from_av } = AVStore
+
+ return {
+ vendors,
+ av_package_types,
+ av_package_content_types,
+ get_lib_from_av,
+ }
+ },
+ data: function () {
+ return {
+ packages: [],
+ initialized: false,
+ filters: {
+ package_name: this.$route.query.q || "",
+ },
+ }
+ },
+ beforeRouteEnter(to, from, next) {
+ next(vm => {
+ vm.getPackages().then(() => vm.build_datatable())
+ })
+ },
+ methods: {
+ async getPackages() {
+ const packages = await fetchLocalPackages()
+ this.packages = packages
+ this.initialized = true
+ },
+ show_package: function (package_id) {
+ this.$router.push("/cgi-bin/koha/erm/eholdings/local/packages/" + package_id)
+ },
+ edit_package: function (package_id) {
+ this.$router.push("/cgi-bin/koha/erm/eholdings/local/packages/edit/" + package_id)
+ },
+ delete_package: function (package_id) {
+ this.$router.push("/cgi-bin/koha/erm/eholdings/local/packages/delete/" + package_id)
+ },
+ build_datatable: function () {
+ let show_package = this.show_package
+ let edit_package = this.edit_package
+ let delete_package = this.delete_package
+ let get_lib_from_av = this.get_lib_from_av
+ let filters = this.filters
+
+ window['vendors'] = this.vendors.map(e => {
+ e['_id'] = e['id']
+ e['_str'] = e['name']
+ return e
+ })
+ window['av_package_types'] = this.av_package_types.map(e => {
+ e['_id'] = e['authorised_value']
+ e['_str'] = e['lib']
+ return e
+ })
+ window['av_package_content_types'] = this.av_package_content_types.map(e => {
+ e['_id'] = e['authorised_value']
+ e['_str'] = e['lib']
+ return e
+ })
+
+ $('#package_list').kohaTable({
+ ajax: {
+ url: "/api/v1/erm/eholdings/local/packages",
+ },
+ embed: ['resources+count', 'vendor.name'],
+ order: [[0, "asc"]],
+ search: { search: filters.package_name },
+ autoWidth: false,
+ columns: [
+ {
+ title: __("Name"),
+ data: "me.package_id:me.name",
+ searchable: true,
+ orderable: true,
+ render: function (data, type, row, meta) {
+ // Rendering done in drawCallback
+ return ""
+ }
+ },
+ {
+ title: __("Vendor"),
+ data: "vendor_id",
+ searchable: true,
+ orderable: true,
+ render: function (data, type, row, meta) {
+ return row.vendor ? escape_str(row.vendor.name) : ""
+ },
+ },
+ {
+ title: __("Type"),
+ data: "package_type",
+ searchable: true,
+ orderable: true,
+ render: function (data, type, row, meta) {
+ return escape_str(get_lib_from_av("av_package_types", row.package_type))
+ }
+ }, {
+ title: __("Content type"),
+ data: "content_type",
+ searchable: true,
+ orderable: true,
+ render: function (data, type, row, meta) {
+ return escape_str(get_lib_from_av("av_package_content_types", row.content_type))
+ }
+ },
+ {
+ title: __("Created on"),
+ data: "created_on",
+ searchable: false,
+ orderable: true,
+ render: function (data, type, row, meta) {
+ return $date(row.created_on)
+ }
+ },
+ {
+ title: __("Actions"),
+ data: function (row, type, val, meta) {
+ return '<div class="actions"></div>'
+ },
+ className: "actions noExport",
+ searchable: false,
+ orderable: false
+ }
+ ],
+ drawCallback: function (settings) {
+
+ var api = new $.fn.dataTable.Api(settings)
+
+ $.each($(this).find("td .actions"), function (index, e) {
+ let package_id = api.row(index).data().package_id
+ let editButton = createVNode("a", {
+ class: "btn btn-default btn-xs", role: "button", onClick: () => {
+ edit_package(package_id)
+ }
+ },
+ [createVNode("i", { class: "fa fa-pencil", 'aria-hidden': "true" }), __("Edit")])
+
+ let deleteButton = createVNode("a", {
+ class: "btn btn-default btn-xs", role: "button", onClick: () => {
+ delete_package(package_id)
+ }
+ },
+ [createVNode("i", { class: "fa fa-trash", 'aria-hidden': "true" }), __("Delete")])
+
+ let n = createVNode('span', {}, [editButton, " ", deleteButton])
+ render(n, e)
+ })
+
+ $.each($(this).find("tbody tr td:first-child"), function (index, e) {
+ let row = api.row(index).data()
+ if (!row) return // Happen if the table is empty
+ let n = createVNode("a", {
+ role: "button",
+ href: "/cgi-bin/koha/erm/eholdings/local/packages/" + row.package_id,
+ onClick: (e) => {
+ e.preventDefault()
+ show_package(row.package_id)
+ }
+ },
+ `${row.name} (#${row.package_id})`
+ )
+ render(n, e)
+ })
+ },
+ preDrawCallback: function (settings) {
+ var table_id = settings.nTable.id
+ $("#" + table_id).find("thead th").eq(1).attr('data-filter', 'vendors')
+ $("#" + table_id).find("thead th").eq(2).attr('data-filter', 'av_package_types')
+ $("#" + table_id).find("thead th").eq(3).attr('data-filter', 'av_package_content_types')
+ }
+ }, eholdings_packages_table_settings, 1)
+ },
+ },
+ components: { Toolbar },
+ name: "EHoldingsLocalPackagesList",
+}
+</script>
--- /dev/null
+<template>
+ <div v-if="!initialized">{{ $t("Loading") }}</div>
+ <div v-else-if="erm_package" id="packages_show">
+ <h2>
+ {{ $t("Package .id", { id: erm_package.package_id }) }}
+ <span class="action_links">
+ <router-link
+ :to="`/cgi-bin/koha/erm/eholdings/local/packages/edit/${erm_package.package_id}`"
+ :title="$t('Edit')"
+ ><i class="fa fa-pencil"></i
+ ></router-link>
+
+ <router-link
+ :to="`/cgi-bin/koha/erm/eholdings/local/packages/delete/${erm_package.package_id}`"
+ :title="$t('Delete')"
+ ><i class="fa fa-trash"></i
+ ></router-link>
+ </span>
+ </h2>
+ <div>
+ <fieldset class="rows">
+ <ol>
+ <li>
+ <label>{{ $t("Package name") }}:</label>
+ <span>
+ {{ erm_package.name }}
+ </span>
+ </li>
+ <li v-if="erm_package.vendor">
+ <label>{{ $t("Vendor") }}:</label>
+ <span>
+ <a
+ :href="`/cgi-bin/koha/acqui/booksellers.pl?booksellerid=${erm_package.vendor_id}`"
+ >{{ erm_package.vendor.name }}</a
+ >
+ </span>
+ </li>
+ <li v-if="erm_package.external_id">
+ <label>{{ $t("External ID") }}:</label>
+ <span>
+ <!-- FIXME Create a syspref to store the URL -->
+ <a
+ :href="`https://ptfs-europe-demo.folio.ebsco.com/eholdings/packages/${erm_package.vendor.external_id}-${erm_package.external_id}`"
+ >
+ {{ erm_package.external_id }}
+ </a>
+ </span>
+ </li>
+ <li>
+ <label>{{ $t("Package type") }}:</label>
+ <span>{{
+ get_lib_from_av(
+ "av_package_types",
+ erm_package.package_type
+ )
+ }}</span>
+ </li>
+ <li>
+ <label>{{ $t("Content type") }}:</label>
+ <span>{{
+ get_lib_from_av(
+ "av_package_content_types",
+ erm_package.content_type
+ )
+ }}</span>
+ </li>
+ <li v-if="erm_package.created_on">
+ <label>{{ $t("Created on") }}:</label>
+ <span>{{ format_date(erm_package.created_on) }}</span>
+ </li>
+
+ <li>
+ <label
+ >Titles ({{ erm_package.resources_count }})</label
+ >
+ <div v-if="erm_package.resources_count">
+ <EHoldingsPackageTitlesList
+ :package_id="erm_package.package_id.toString()"
+ />
+ </div>
+ </li>
+
+ <li></li>
+ </ol>
+ </fieldset>
+ <fieldset class="action">
+ <router-link
+ to="/cgi-bin/koha/erm/eholdings/local/packages"
+ role="button"
+ class="cancel"
+ >{{ $t("Close") }}</router-link
+ >
+ </fieldset>
+ </div>
+ </div>
+</template>
+
+<script>
+import EHoldingsPackageTitlesList from "./EHoldingsLocalPackageTitlesList.vue"
+import { useAVStore } from "../../stores/authorised_values"
+import { fetchLocalPackage } from "../../fetch"
+
+export default {
+ setup() {
+ const format_date = $date
+
+ const AVStore = useAVStore()
+ const { get_lib_from_av } = AVStore
+
+ return {
+ format_date,
+ get_lib_from_av,
+ }
+ },
+ data() {
+ return {
+ erm_package: {
+ package_id: null,
+ vendor_id: null,
+ name: '',
+ external_id: '',
+ package_type: '',
+ content_type: '',
+ created_on: null,
+ resources: null,
+ },
+ initialized: false,
+ }
+ },
+ beforeRouteEnter(to, from, next) {
+ next(vm => {
+ vm.getPackage(to.params.package_id)
+ })
+ },
+ beforeRouteUpdate(to, from) {
+ this.erm_package = this.getPackage(to.params.package_id)
+ },
+ methods: {
+ async getPackage(package_id) {
+ const erm_package = await fetchLocalPackage(package_id)
+ this.erm_package = erm_package
+ this.initialized = true
+ },
+ },
+ components: {
+ EHoldingsPackageTitlesList,
+ },
+ name: "EHoldingsLocalPackagesShow",
+}
+</script>
+<style scoped>
+.action_links a {
+ padding-left: 0.2em;
+ font-size: 11px;
+}
+fieldset.rows label {
+ width: 25rem;
+}
+</style>
--- /dev/null
+<template>
+ <router-link to="/cgi-bin/koha/erm/eholdings/local/packages/add" class="btn btn-default"
+ ><font-awesome-icon icon="plus" />
+ {{ $t("New package") }}</router-link
+ >
+</template>
+
+<script>
+export default {
+ name: "EHoldingsLocalPackagesToolbar",
+}
+</script>
--- /dev/null
+<template>
+ <div v-if="!initialized">{{ $t("Loading") }}</div>
+ <div v-else-if="resource" id="eholdings_resources_show">
+ <h2>
+ {{ $t("Resource .id", { id: resource.resource_id }) }}
+ </h2>
+ <div>
+ <fieldset class="rows">
+ <legend>{{ $t("Resource information") }}</legend>
+ <ol>
+ <li v-if="resource.resource_id">
+ <label>{{ $t("Resource identifier") }}:</label>
+ <span>
+ {{ resource.resource_id }}
+ </span>
+ </li>
+ <li>
+ <label>{{ $t("Publication title") }}:</label>
+ <span
+ ><router-link
+ :to="`/cgi-bin/koha/erm/eholdings/local/titles/${resource.title_id}`"
+ >{{
+ resource.title.publication_title
+ }}</router-link
+ ></span
+ >
+ </li>
+ <li>
+ <label>{{ $t("Publisher name") }}:</label>
+ <span>
+ {{ resource.title.publisher_name }}
+ </span>
+ </li>
+ <li>
+ <label>{{ $t("Publication type") }}:</label>
+ <span>
+ {{ resource.title.publication_type }}
+ </span>
+ </li>
+ <li v-if="resource.title.print_identifier">
+ <label>{{ $t("Print-format identifier") }}:</label>
+ <span>
+ {{ resource.title.print_identifier }}
+ </span>
+ </li>
+ <li v-if="resource.title.online_identifier">
+ <label>{{ $t("Online-format identifier") }}:</label>
+ <span>
+ {{ resource.title.online_identifier }}
+ </span>
+ </li>
+ </ol>
+ </fieldset>
+
+ <fieldset class="rows">
+ <ol>
+ <li>
+ <label>{{ $t("Package") }}:</label>
+ <span
+ ><router-link
+ :to="`/cgi-bin/koha/erm/eholdings/local/packages/${resource.package_id}`"
+ >{{ resource.package.name }}</router-link
+ ></span
+ >
+ </li>
+
+ <li>
+ <label>{{ $t("Vendor") }}:</label>
+ <span v-if="resource.vendor">
+ {{ resource.vendor.name }}
+ </span>
+ </li>
+ <li v-if="resource.package.content_type">
+ <label>{{ $t("Package content type") }}:</label>
+ <span>{{ resource.package.content_type }}</span>
+ </li>
+ </ol>
+ </fieldset>
+
+ <fieldset class="rows">
+ <legend>Resource settings</legend>
+ <ol>
+ <li>
+ <label>{{ $t("Coverage dates") }}:</label>
+ <span
+ >{{ format_date(resource.started_on) }}-{{
+ format_date(resource.ended_on)
+ }}</span
+ >
+ </li>
+ </ol>
+ </fieldset>
+ </div>
+ </div>
+</template>
+
+<script>
+import { fetchLocalResource } from "../../fetch"
+import { useVendorStore } from "../../stores/vendors"
+import { storeToRefs } from "pinia"
+export default {
+ setup() {
+ const format_date = $date
+
+ const vendorStore = useVendorStore()
+ const { vendors } = storeToRefs(vendorStore)
+ return {
+ format_date,
+ vendors,
+ }
+ },
+ data() {
+ return {
+ resource: {
+ resource_id: null,
+ title_id: null,
+ package_id: null,
+ started_on: '',
+ ended_on: '',
+ proxy: '',
+ title: {},
+ package: {},
+ },
+ initialized: false,
+ }
+ },
+
+ beforeRouteEnter(to, from, next) {
+ next(vm => {
+ vm.getResource(to.params.resource_id)
+ })
+ },
+ beforeRouteUpdate(to, from) {
+ this.resource = this.getResource(to.params.resource_id)
+ },
+ methods: {
+ async getResource(resource_id) {
+ const resource = await fetchLocalResource(resource_id)
+ this.resource = resource
+ this.initialized = true
+ },
+ },
+ name: "EHoldingsLocalResourcesShow",
+}
+</script>
+<style scoped>
+fieldset.rows label {
+ width: 25rem;
+}
+</style>
--- /dev/null
+<template>
+ <div id="package_list_result">
+ <table id="package_list"></table>
+ </div>
+</template>
+
+<script>
+
+import { createVNode, render } from 'vue'
+
+export default {
+ setup() {
+ return {
+ }
+ },
+ data() {
+ return {
+ }
+ },
+ methods: {
+ show_resource: function (resource_id) {
+ this.$router.push("/cgi-bin/koha/erm/eholdings/local/resources/" + resource_id)
+ },
+ build_datatable: function () {
+ let show_resource = this.show_resource
+ let resources = this.resources
+
+ $('#package_list').dataTable($.extend(true, {}, dataTablesDefaults, {
+ data: resources,
+ embed: ['package.name'],
+ order: [[0, "asc"]],
+ autoWidth: false,
+ columns: [
+ {
+ title: __("Name"),
+ data: "package.name",
+ searchable: true,
+ orderable: true,
+ render: function (data, type, row, meta) {
+ // Rendering done in drawCallback
+ return ""
+ },
+ width: '100%',
+ },
+ ],
+ drawCallback: function (settings) {
+
+ var api = new $.fn.dataTable.Api(settings)
+
+ $.each($(this).find("tbody tr td:first-child"), function (index, e) {
+ let row = api.row(index).data()
+ if (!row) return // Happen if the table is empty
+ let n = createVNode("a", {
+ role: "button",
+ href: "/cgi-bin/koha/erm/eholdings/local/resources/" + row.resource_id,
+ onClick: (e) => {
+ e.preventDefault()
+ show_resource(row.resource_id)
+ }
+ },
+ `${row.package.name}`
+ )
+ render(n, e)
+ })
+ },
+ }))
+ },
+ },
+ mounted() {
+ this.build_datatable()
+ },
+ beforeUnmount() {
+ $('#package_list')
+ .DataTable()
+ .destroy(true)
+ },
+ props: {
+ resources: Array,
+ },
+ name: 'EHoldingsLocalTitlePackagesList',
+}
+</script>
+
+<style scoped>
+#package_list_result {
+ width: 60%;
+ padding-left: 26rem;
+}
+#package_list {
+ display: table;
+}
+</style>
--- /dev/null
+<template>
+ <div v-if="!initialized">{{ $t("Loading") }}</div>
+ <div v-else id="titles_add">
+ <h2 v-if="title.title_id">
+ {{ $t("Edit title .id", { id: title.title_id }) }}
+ </h2>
+ <h2 v-else>{{ $t("New title") }}</h2>
+ <div>
+ <form @submit="onSubmit($event)">
+ <fieldset class="rows">
+ <ol>
+ <li v-if="title.title_id">
+ <label for="title_title_id"
+ >{{ $t("Title identifier") }}:</label
+ >
+ <span>
+ {{ title.title_id }}
+ </span>
+ </li>
+
+ <li>
+ <label class="required" for="title_name"
+ >{{ $t("Publication title") }}:</label
+ >
+ <input
+ id="title_publication_title"
+ v-model="title.publication_title"
+ :placeholder="$t('Publication title')"
+ required
+ />
+ <span class="required">{{ $t("Required") }}</span>
+ </li>
+
+ <li>
+ <label for="title_print_identifier"
+ >{{ $t("Print-format identifier") }}:</label
+ >
+ <input
+ id="title_print_identifier"
+ v-model="title.print_identifier"
+ :placeholder="$t('Print-format identifier')"
+ />
+ </li>
+
+ <li>
+ <label for="title_online_identifier"
+ >{{ $t("Online-format identifier") }}:</label
+ >
+ <input
+ id="title_online_identifier"
+ v-model="title.online_identifier"
+ :placeholder="$t('Online-format identifier')"
+ />
+ </li>
+
+ <li>
+ <label for="title_date_first_issue_online"
+ >{{
+ $t(
+ "Date of first serial issue available online"
+ )
+ }}:</label
+ >
+ <input
+ id="title_date_first_issue_online"
+ v-model="title.date_first_issue_online"
+ :placeholder="
+ $t(
+ 'Date of first serial issue available online'
+ )
+ "
+ />
+ </li>
+
+ <li>
+ <label for="title_num_first_vol_online"
+ >{{
+ $t(
+ "Number of first volume available online"
+ )
+ }}:</label
+ >
+ <input
+ id="title_num_first_vol_online"
+ v-model="title.num_first_vol_online"
+ :placeholder="
+ $t(
+ 'Number of first volume available online'
+ )
+ "
+ />
+ </li>
+
+ <li>
+ <label for="title_num_first_issue_online"
+ >{{
+ $t(
+ "Number of first issue available online"
+ )
+ }}:</label
+ >
+ <input
+ id="title_num_first_issue_online"
+ v-model="title.num_first_issue_online"
+ :placeholder="
+ $t('Number of first issue available online')
+ "
+ />
+ </li>
+
+ <li>
+ <label for="title_date_last_issue_online"
+ >{{
+ $t("Date of last issue available online")
+ }}:</label
+ >
+ <input
+ id="title_date_last_issue_online"
+ v-model="title.date_last_issue_online"
+ :placeholder="
+ $t('Date of last issue available online')
+ "
+ />
+ </li>
+
+ <li>
+ <label for="title_num_last_vol_online"
+ >{{
+ $t(
+ "Number of last volume available online"
+ )
+ }}:</label
+ >
+ <input
+ id="title_num_last_vol_online"
+ v-model="title.num_last_vol_online"
+ :placeholder="
+ $t('Number of last volume available online')
+ "
+ />
+ </li>
+
+ <li>
+ <label for="title_num_last_issue_online"
+ >{{
+ $t("Number of last issue available online")
+ }}:</label
+ >
+ <input
+ id="title_num_last_issue_online"
+ v-model="title.num_last_issue_online"
+ :placeholder="
+ $t('Number of last issue available online')
+ "
+ />
+ </li>
+
+ <li>
+ <label for="title_title_url"
+ >{{ $t("Title-level URL") }}:</label
+ >
+ <input
+ id="title_title_url"
+ v-model="title.title_url"
+ :placeholder="$t('Title-level URL')"
+ />
+ </li>
+
+ <li>
+ <label for="title_first_author"
+ >{{ $t("First author") }}:</label
+ >
+ <input
+ id="title_first_author"
+ v-model="title.first_author"
+ :placeholder="$t('First author')"
+ />
+ </li>
+
+ <li>
+ <label for="title_embargo_info"
+ >{{ $t("Embargo information") }}:</label
+ >
+ <input
+ id="title_embargo_info"
+ v-model="title.embargo_info"
+ :placeholder="$t('Embargo information')"
+ />
+ </li>
+
+ <li>
+ <label for="title_coverage_depth"
+ >{{ $t("Coverage depth") }}:</label
+ >
+ <input
+ id="title_coverage_depth"
+ v-model="title.coverage_depth"
+ :placeholder="$t('Coverage depth')"
+ />
+ </li>
+
+ <li>
+ <label for="title_notes">{{ $t("Notes") }}:</label>
+ <input
+ id="title_notes"
+ v-model="title.notes"
+ :placeholder="$t('Notes')"
+ />
+ </li>
+
+ <li>
+ <label for="title_publisher_name"
+ >{{ $t("Publisher name") }}:</label
+ >
+ <input
+ id="title_publisher_name"
+ v-model="title.publisher_name"
+ :placeholder="$t('Publisher name')"
+ />
+ </li>
+
+ <li>
+ <label for="title_publication_type"
+ >{{ $t("Publication type") }}:</label
+ >
+ <select
+ id="title_publication_type"
+ v-model="title.publication_type"
+ >
+ <option value=""></option>
+ <option
+ v-for="type in av_title_publication_types"
+ :key="type.authorised_values"
+ :value="type.authorised_value"
+ :selected="
+ type.authorised_value ==
+ title.publication_type
+ ? true
+ : false
+ "
+ >
+ {{ type.lib }}
+ </option>
+ </select>
+ </li>
+
+ <li>
+ <label for="title_date_monograph_published_print"
+ >{{
+ $t(
+ "Date the monograph is first published in print"
+ )
+ }}:</label
+ >
+ <input
+ id="title_date_monograph_published_print"
+ v-model="title.date_monograph_published_print"
+ :placeholder="
+ $t(
+ 'Date the monograph is first published in print'
+ )
+ "
+ />
+ </li>
+
+ <li>
+ <label for="title_date_monograph_published_online"
+ >{{
+ $t(
+ "Date the monograph is first published online"
+ )
+ }}:</label
+ >
+ <input
+ id="title_date_monograph_published_online"
+ v-model="title.date_monograph_published_online"
+ :placeholder="
+ $t(
+ 'Date the monograph is first published online'
+ )
+ "
+ />
+ </li>
+
+ <li>
+ <label for="title_monograph_volume"
+ >{{
+ $t("Number of volume for monograph")
+ }}:</label
+ >
+ <input
+ id="title_monograph_volume"
+ v-model="title.monograph_volume"
+ :placeholder="
+ $t('Number of volume for monograph')
+ "
+ />
+ </li>
+
+ <li>
+ <label for="title_monograph_edition"
+ >{{ $t("Edition of the monograph") }}:</label
+ >
+ <input
+ id="title_monograph_edition"
+ v-model="title.monograph_edition"
+ :placeholder="$t('Edition of the monograph')"
+ />
+ </li>
+
+ <li>
+ <label for="title_first_editor"
+ >{{ $t("First editor") }}:</label
+ >
+ <input
+ id="title_first_editor"
+ v-model="title.first_editor"
+ :placeholder="$t('First editor')"
+ />
+ </li>
+
+ <li>
+ <label for="title_parent_publication_title_id"
+ >{{
+ $t(
+ "Title identifier of the parent publication"
+ )
+ }}:</label
+ >
+ <input
+ id="title_parent_publication_title_id"
+ v-model="title.parent_publication_title_id"
+ :placeholder="
+ $t(
+ 'Title identifier of the parent publication'
+ )
+ "
+ />
+ </li>
+
+ <li>
+ <label for="title_preceeding_publication_title_id"
+ >{{
+ $t(
+ "Title identifier of any preceding publication title"
+ )
+ }}:</label
+ >
+ <input
+ id="title_preceeding_publication_title_id"
+ v-model="title.preceeding_publication_title_id"
+ :placeholder="
+ $t(
+ 'Title identifier of any preceding publication title'
+ )
+ "
+ />
+ </li>
+
+ <li>
+ <label for="title_access_type"
+ >{{
+ // FIXME May be fee-based (P) or Open Access (F).
+ $t("Access type")
+ }}:</label
+ >
+ <input
+ id="title_access_type"
+ v-model="title.access_type"
+ :placeholder="$t('Access type')"
+ />
+ </li>
+
+ <EHoldingsTitlesFormAddResources
+ :resources="title.resources"
+ />
+ </ol>
+ </fieldset>
+ <fieldset class="action">
+ <input type="submit" value="Submit" />
+ <router-link
+ to="/cgi-bin/koha/erm/eholdings/local/titles"
+ role="button"
+ class="cancel"
+ >{{ $t("Cancel") }}</router-link
+ >
+ </fieldset>
+ </form>
+ </div>
+ </div>
+</template>
+
+<script>
+import { useVendorStore } from "../../stores/vendors"
+import { useAVStore } from "../../stores/authorised_values"
+import EHoldingsTitlesFormAddResources from "./EHoldingsLocalTitlesFormAddResources.vue"
+import { setMessage, setError } from "../../messages"
+import { fetchLocalTitle } from '../../fetch'
+import { storeToRefs } from "pinia"
+
+export default {
+ setup() {
+ const vendorStore = useVendorStore()
+ const { vendors } = storeToRefs(vendorStore)
+
+ const AVStore = useAVStore()
+ const { av_title_publication_types } = storeToRefs(AVStore)
+ const { get_lib_from_av } = AVStore
+
+ return {
+ vendors,
+ av_title_publication_types,
+ get_lib_from_av,
+ }
+ },
+ data() {
+ return {
+ title: {
+ title_id: null,
+ publication_title: '',
+ external_id: '',
+ print_identifier: '',
+ online_identifier: '',
+ date_first_issue_online: '',
+ num_first_vol_online: '',
+ num_first_issue_online: '',
+ date_last_issue_online: '',
+ num_last_vol_online: '',
+ num_last_issue_online: '',
+ title_url: '',
+ first_author: '',
+ embargo_info: '',
+ coverage_depth: '',
+ notes: '',
+ publisher_name: '',
+ publication_type: '',
+ date_monograph_published_print: '',
+ date_monograph_published_online: '',
+ monograph_volume: '',
+ monograph_edition: '',
+ first_editor: '',
+ parent_publication_title_id: '',
+ preceeding_publication_title_id: '',
+ access_type: '',
+ resources: [],
+ },
+ initialized: false,
+ }
+ },
+ beforeRouteEnter(to, from, next) {
+ next(vm => {
+ if (to.params.title_id) {
+ vm.title = vm.getTitle(to.params.title_id)
+ } else {
+ vm.initialized = true
+ }
+ })
+ },
+ methods: {
+ async getTitle(title_id) {
+ const title = await fetchLocalTitle(title_id)
+ this.title = title
+ this.initialized = true
+ },
+ onSubmit(e) {
+ e.preventDefault()
+
+ let title = JSON.parse(JSON.stringify(this.title)) // copy
+ let apiUrl = '/api/v1/erm/eholdings/local/titles'
+
+ let method = 'POST'
+ if (title.title_id) {
+ method = 'PUT'
+ apiUrl += '/' + title.title_id
+ }
+ delete title.title_id
+ delete title.biblio_id
+
+ title.resources.forEach(r => {
+ r.started_on = r.started_on ? $date_to_rfc3339(r.started_on) : null
+ r.ended_on = r.ended_on ? $date_to_rfc3339(r.ended_on) : null
+ })
+
+ // Cannot use the map/keepAttrs because of the reserved keywork 'package'
+ title.resources.forEach(function (e) { delete e.package; delete e.resource_id })
+
+ const options = {
+ method: method,
+ body: JSON.stringify(title),
+ headers: {
+ 'Content-Type': 'application/json;charset=utf-8'
+ },
+ }
+
+ fetch(apiUrl, options)
+ .then(response => {
+ if (response.status == 200) {
+ this.$router.push("/cgi-bin/koha/erm/eholdings/local/titles")
+ setMessage(this.$t("Title updated"))
+ } else if (response.status == 201) {
+ this.$router.push("/cgi-bin/koha/erm/eholdings/local/titles")
+ setMessage(this.$t("Title created"))
+ } else {
+ setError(response.message || response.statusText)
+ }
+ }, (error) => {
+ setError(error)
+ }).catch(e => { console.log(e) })
+ },
+ },
+ components: { EHoldingsTitlesFormAddResources },
+ name: "EHoldingsLocalTitlesFormAdd",
+}
+</script>
+<style scoped>
+fieldset.rows label {
+ width: 25rem;
+}
+</style>
--- /dev/null
+<template>
+ <fieldset class="rows" id="resources">
+ <legend>{{ $t("Packages") }}</legend>
+ <fieldset
+ class="rows"
+ v-for="(resource, counter) in resources"
+ v-bind:key="counter"
+ >
+ <legend>
+ {{ $t("Package .counter", { counter: counter + 1 }) }}
+ <a href="#" @click.prevent="deletePackage(counter)"
+ ><i class="fa fa-trash"></i>
+ {{ $t("Remove from this package") }}</a
+ >
+ </legend>
+ <ol>
+ <li>
+ <label :for="`resource_id_${counter}`" class="required"
+ >{{ $t("Package") }}:
+ </label>
+ <select
+ v-model="resource.package_id"
+ :id="`resource_id_${counter}`"
+ required
+ >
+ <option value=""></option>
+ <option
+ v-for="p in packages"
+ :key="p.package_id"
+ :value="p.package_id"
+ :selected="
+ p.package_id == resource.package_id
+ ? true
+ : false
+ "
+ >
+ {{ p.name }}
+ </option>
+ </select>
+ <span class="required">{{ $t("Required") }}</span>
+ </li>
+ <li>
+ <label for="title_vendor_id">{{ $t("Vendor") }}:</label>
+ <select id="title_vendor_id" v-model="resource.vendor_id">
+ <option value=""></option>
+ <option
+ v-for="vendor in vendors"
+ :key="vendor.vendor_id"
+ :value="vendor.id"
+ :selected="
+ vendor.id == resource.vendor_id ? true : false
+ "
+ >
+ {{ vendor.name }}
+ </option>
+ </select>
+ </li>
+
+ <li>
+ <label :for="`started_on_${counter}`"
+ >{{ $t("Start date") }}:
+ </label>
+ <flat-pickr
+ :id="`started_on_${counter}`"
+ v-model="resource.started_on"
+ :config="fp_config"
+ :data-date_to="`ended_on_${counter}`"
+ />
+ </li>
+ <li>
+ <label :for="`ended_on_${counter}`"
+ >{{ $t("End date") }}:</label
+ >
+ <flat-pickr
+ :id="`ended_on_${counter}`"
+ v-model="resource.ended_on"
+ :config="fp_config"
+ />
+ </li>
+ <li>
+ <label :for="`${counter}`">{{ $t("Proxy") }}:</label>
+ <input
+ :id="`proxy_${counter}`"
+ v-model="resource.proxy"
+ :placeholder="$t('Proxy')"
+ />
+ </li>
+ </ol>
+ </fieldset>
+ <a v-if="packages.length" class="btn btn-default" @click="addPackage"
+ ><font-awesome-icon icon="plus" />
+ {{ $t("Add to another package") }}</a
+ >
+ <span v-else>{{ $t("There are no packages created yet") }}</span>
+ </fieldset>
+</template>
+
+<script>
+import flatPickr from 'vue-flatpickr-component'
+import { useVendorStore } from "../../stores/vendors"
+import { storeToRefs } from "pinia"
+import { fetchLocalPackages } from "../../fetch"
+
+export default {
+ setup() {
+ const vendorStore = useVendorStore() // FIXME We only need that for 'manual'
+ const { vendors } = storeToRefs(vendorStore)
+ return { vendors }
+ },
+ data() {
+ return {
+ packages: [],
+ fp_config: flatpickr_defaults,
+ dates_fixed: 0,
+ }
+ },
+ beforeCreate() {
+ fetchLocalPackages().then((packages) => this.packages = packages)
+ if (!this.dates_fixed) {
+ this.resources.forEach(r => {
+ r.started_on = $date(r.started_on)
+ r.ended_on = $date(r.ended_on)
+ })
+ this.dates_fixed = 1
+ }
+ },
+ methods: {
+ addPackage() {
+ this.resources.push({
+ package_id: null,
+ vendor_id: null,
+ started_on: null,
+ ended_on: null,
+ proxy: '',
+ })
+ },
+ deletePackage(counter) {
+ this.resources.splice(counter, 1)
+ },
+ },
+ props: {
+ resources: Array,
+ },
+ components: { flatPickr },
+ name: 'EHoldingsLocalTitlesFormAddResources',
+}
+</script>
--- /dev/null
+<template>
+ <div v-if="!initialized">{{ $t("Loading") }}</div>
+ <div v-else id="eholdings_confirm_delete">
+ <h2>{{ $t("Delete title") }}</h2>
+ <div>
+ <form @submit="onSubmit($event)">
+ <fieldset class="rows">
+ <ol>
+ <li>
+ {{ $t("Title") }}:
+ {{ eholding.publication_title }}
+ </li>
+ </ol>
+ </fieldset>
+ <fieldset class="action">
+ <input
+ type="submit"
+ variant="primary"
+ :value="$t('Yes, delete')"
+ />
+ <router-link
+ to="/cgi-bin/koha/erm/eholdings/local/titles"
+ role="button"
+ class="cancel"
+ >{{ $t("No, do not delete") }}</router-link
+ >
+ </fieldset>
+ </form>
+ </div>
+ </div>
+</template>
+
+<script>
+import { fetchLocalTitle } from "../../fetch"
+import { setMessage, setError } from "../../messages"
+
+export default {
+ data() {
+ return {
+ eholding: {},
+ initialized: false,
+ }
+ },
+ beforeRouteEnter(to, from, next) {
+ next(vm => {
+ vm.getEHolding(to.params.title_id)
+ })
+ },
+ methods: {
+ async getEHolding(title_id) {
+ const eholding = await fetchLocalTitle(title_id)
+ this.eholding = eholding
+ this.initialized = true
+ },
+ onSubmit(e) {
+ e.preventDefault()
+
+ let apiUrl = '/api/v1/erm/eholdings/local/titles/' + this.eholding.title_id
+
+ const options = {
+ method: 'DELETE',
+ headers: {
+ 'Content-Type': 'application/json;charset=utf-8'
+ },
+ }
+
+ fetch(apiUrl, options)
+ .then(
+ (response) => {
+ if (response.status == 204) {
+ setMessage(this.$t("Title deleted"))
+ this.$router.push("/cgi-bin/koha/erm/eholdings/local/titles")
+ } else {
+ setError(response.message || response.statusText)
+ }
+ }
+ ).catch(
+ (error) => {
+ setError(error)
+ }
+ )
+ }
+ },
+ name: "EHoldingsLocalTitlesFormConfirmDelete",
+}
+</script>
--- /dev/null
+<template>
+ <div>
+ <div v-if="!this.initialized">{{ $t("Loading") }}</div>
+ <div v-else-if="this.titles" id="titles_list">
+ <Toolbar />
+ <div v-if="this.titles.length" id="title_list_result">
+ <table v-if="this.titles.length" id="title_list"></table>
+ </div>
+ <div v-else-if="this.initialized" class="dialog message">
+ {{ $t("There are no titles defined") }}
+ </div>
+ </div>
+ </div>
+</template>
+
+<script>
+import Toolbar from "./EHoldingsLocalTitlesToolbar.vue"
+import { createVNode, render } from 'vue'
+import { useVendorStore } from "../../stores/vendors"
+import { useAVStore } from "../../stores/authorised_values"
+import { storeToRefs } from "pinia"
+import { fetchLocalTitles } from "../../fetch"
+
+export default {
+ setup() {
+ const vendorStore = useVendorStore()
+ const { vendors } = storeToRefs(vendorStore)
+
+ const AVStore = useAVStore()
+ const { av_title_publication_types } = storeToRefs(AVStore)
+ const { get_lib_from_av } = AVStore
+
+ return {
+ vendors,
+ av_title_publication_types,
+ get_lib_from_av,
+ }
+ },
+ data: function () {
+ return {
+ titles: [],
+ initialized: false,
+ filters: {
+ publication_title: this.$route.query.q || "",
+ },
+ cannot_search: false,
+ }
+ },
+ beforeRouteEnter(to, from, next) {
+ next(vm => {
+ vm.getTitles().then(() => vm.build_datatable())
+ })
+ },
+ methods: {
+ async getTitles() {
+ const titles = await fetchLocalTitles()
+ this.titles = titles
+ this.initialized = true
+ },
+ show_title: function (title_id) {
+ this.$router.push("/cgi-bin/koha/erm/eholdings/local/titles/" + title_id)
+ },
+ edit_title: function (title_id) {
+ this.$router.push("/cgi-bin/koha/erm/eholdings/local/titles/edit/" + title_id)
+ },
+ delete_title: function (title_id) {
+ this.$router.push("/cgi-bin/koha/erm/eholdings/local/titles/delete/" + title_id)
+ },
+ build_datatable: function () {
+ let show_title = this.show_title
+ let edit_title = this.edit_title
+ let delete_title = this.delete_title
+ let get_lib_from_av = this.get_lib_from_av
+ let filters = this.filters
+
+ window['vendors'] = this.vendors.map(e => {
+ e['_id'] = e['id']
+ e['_str'] = e['name']
+ return e
+ })
+ let vendors_map = this.vendors.reduce((map, e) => {
+ map[e.id] = e
+ return map
+ }, {})
+ window['av_title_publication_types'] = this.av_title_publication_types.map(e => {
+ e['_id'] = e['authorised_value']
+ e['_str'] = e['lib']
+ return e
+ })
+
+ $('#title_list').kohaTable({
+ ajax: {
+ url: "/api/v1/erm/eholdings/local/titles",
+ },
+ embed: ["resources.package"],
+ order: [[0, "asc"]],
+ search: { search: filters.publication_title },
+ autoWidth: false,
+ columns: [
+ {
+ title: __("Title"),
+ data: "me.publication_title",
+ searchable: true,
+ orderable: true,
+ render: function (data, type, row, meta) {
+ // Rendering done in drawCallback
+ return ""
+ }
+ },
+ {
+ title: __("Vendor"),
+ data: "vendor_id",
+ searchable: true,
+ orderable: true,
+ render: function (data, type, row, meta) {
+ return row.vendor_id != undefined ? escape_str(vendors_map[row.vendor_id].name) : ""
+ }
+ },
+ {
+ title: __("Publication type"),
+ data: "publication_type",
+ searchable: true,
+ orderable: true,
+ render: function (data, type, row, meta) {
+ return escape_str(get_lib_from_av("av_title_publication_types", row.publication_type))
+ }
+ },
+ {
+ title: __("Identifier"),
+ data: "print_identifier:online_identifier",
+ searchable: true,
+ orderable: true,
+ render: function (data, type, row, meta) {
+ let print_identifier = row.print_identifier
+ let online_identifier = row.online_identifier
+ return (print_identifier ? escape_str(_("ISBN (Print): %s").format(print_identifier)) : "") +
+ (online_identifier ? escape_str(_("ISBN (Online): %s").format(online_identifier)) : "")
+ }
+ },
+ {
+ title: __("Actions"),
+ data: function (row, type, val, meta) {
+ return '<div class="actions"></div>'
+ },
+ className: "actions noExport",
+ searchable: false,
+ orderable: false
+ }
+ ],
+ drawCallback: function (settings) {
+
+ var api = new $.fn.dataTable.Api(settings)
+
+ $.each($(this).find("td .actions"), function (index, e) {
+ let title_id = api.row(index).data().title_id
+ let editButton = createVNode("a", {
+ class: "btn btn-default btn-xs", role: "button", onClick: () => {
+ edit_title(title_id)
+ }
+ },
+ [createVNode("i", { class: "fa fa-pencil", 'aria-hidden': "true" }), __("Edit")])
+
+ let deleteButton = createVNode("a", {
+ class: "btn btn-default btn-xs", role: "button", onClick: () => {
+ delete_title(title_id)
+ }
+ },
+ [createVNode("i", { class: "fa fa-trash", 'aria-hidden': "true" }), __("Delete")])
+
+ let n = createVNode('span', {}, [editButton, " ", deleteButton])
+ render(n, e)
+ })
+
+ $.each($(this).find("tbody tr td:first-child"), function (index, e) {
+ let row = api.row(index).data()
+ if (!row) return // Happen if the table is empty
+ let n = createVNode("a", {
+ role: "button",
+ href: "/cgi-bin/koha/erm/eholdings/local/titles/" + row.title_id,
+ onClick: (e) => {
+ e.preventDefault()
+ show_title(row.title_id)
+ }
+ },
+ `${row.publication_title} (#${row.title_id})`
+ )
+ render(n, e)
+ })
+ },
+ preDrawCallback: function (settings) {
+ var table_id = settings.nTable.id
+ $("#" + table_id).find("thead th").eq(1).attr('data-filter', 'vendors')
+ }
+ }, eholdings_titles_table_settings, 1)
+ },
+ },
+ components: { Toolbar },
+ name: "EHoldingsLocalTitlesList",
+}
+</script>
--- /dev/null
+<template>
+ <div v-if="!initialized">{{ $t("Loading") }}</div>
+ <div v-else-if="title" id="eholdings_title_show">
+ <h2>
+ {{ $t("Title .id", { id: title.title_id }) }}
+ <span class="action_links">
+ <router-link
+ :to="`/cgi-bin/koha/erm/eholdings/local/titles/edit/${title.title_id}`"
+ :title="$t('Edit')"
+ ><i class="fa fa-pencil"></i
+ ></router-link>
+
+ <router-link
+ :to="`/cgi-bin/koha/erm/eholdings/local/titles/delete/${title.title_id}`"
+ :title="$t('Delete')"
+ ><i class="fa fa-trash"></i
+ ></router-link>
+ </span>
+ </h2>
+ <div>
+ <fieldset class="rows">
+ <ol>
+ <li v-if="title.title_id">
+ <label>{{ $t("Title identifier") }}:</label>
+ <span>
+ {{ title.title_id }}
+ </span>
+ </li>
+ <li>
+ <label>{{ $t("Publication title") }}:</label>
+ <span>
+ {{ title.publication_title }}
+ <a
+ v-if="title.biblio_id"
+ :href="`/cgi-bin/koha/catalogue/detail.pl?biblionumber=${title.biblio_id}`"
+ >
+ {{ $t("Local bibliographic record") }}
+ </a>
+ </span>
+ </li>
+ <li v-if="title.print_identifier">
+ <label>{{ $t("Print-format identifier") }}:</label>
+ <span>
+ {{ title.print_identifier }}
+ </span>
+ </li>
+ <li v-if="title.online_identifier">
+ <label>{{ $t("Online-format identifier") }}:</label>
+ <span>
+ {{ title.online_identifier }}
+ </span>
+ </li>
+ <li v-if="title.date_first_issue_online">
+ <label
+ >{{
+ $t(
+ "Date of first serial issue available online"
+ )
+ }}:</label
+ >
+ <span>
+ {{ title.date_first_issue_online }}
+ </span>
+ </li>
+ <li v-if="title.num_first_vol_online">
+ <label
+ >{{
+ $t("Number of first volume available online")
+ }}:</label
+ >
+ <span>
+ {{ title.num_first_vol_online }}
+ </span>
+ </li>
+ <li v-if="title.num_first_issue_online">
+ <label
+ >{{
+ $t("Number of first issue available online")
+ }}:</label
+ >
+ <span>
+ {{ title.num_first_issue_online }}
+ </span>
+ </li>
+ <li v-if="title.date_last_issue_online">
+ <label
+ >{{
+ $t("Date of last issue available online")
+ }}:</label
+ >
+ <span>
+ {{ title.date_last_issue_online }}
+ </span>
+ </li>
+ <li v-if="title.num_last_vol_online">
+ <label
+ >{{
+ $t("Number of last volume available online")
+ }}:</label
+ >
+ <span>
+ {{ title.num_last_vol_online }}
+ </span>
+ </li>
+ <li v-if="title.num_last_issue_online">
+ <label
+ >{{
+ $t("Number of last issue available online")
+ }}:</label
+ >
+ <span>
+ {{ title.num_last_issue_online }}
+ </span>
+ </li>
+ <li v-if="title.title_url">
+ <label>{{ $t("Title-level URL") }}:</label>
+ <span>
+ {{ title.title_url }}
+ </span>
+ </li>
+ <li v-if="title.first_author">
+ <label>{{ $t("First author") }}:</label>
+ <span>
+ {{ title.first_author }}
+ </span>
+ </li>
+ <li v-if="title.embargo_info">
+ <label>{{ $t("Embargo information") }}:</label>
+ <span>
+ {{ title.embargo_info }}
+ </span>
+ </li>
+ <li v-if="title.coverage_depth">
+ <label>{{ $t("Coverage depth") }}:</label>
+ <span>
+ {{ title.coverage_depth }}
+ </span>
+ </li>
+ <li v-if="title.notes">
+ <label>{{ $t("Notes") }}:</label>
+ <span>
+ {{ title.notes }}
+ </span>
+ </li>
+ <li v-if="title.publisher_name">
+ <label>{{ $t("Publisher name") }}:</label>
+ <span>
+ {{ title.publisher_name }}
+ </span>
+ </li>
+ <li v-if="title.publication_type">
+ <label>{{ $t("Publication type") }}:</label>
+ <span
+ >{{
+ get_lib_from_av(
+ "av_title_publication_types",
+ title.publication_type
+ )
+ }}
+ </span>
+ </li>
+ <li v-if="title.date_monograph_published_print">
+ <label
+ >{{
+ $t(
+ "Date the monograph is first published in print"
+ )
+ }}:</label
+ >
+ <span>
+ {{ title.date_monograph_published_print }}
+ </span>
+ </li>
+ <li v-if="title.date_monograph_published_online">
+ <label
+ >{{
+ $t(
+ "Date the monograph is first published online"
+ )
+ }}:</label
+ >
+ <span>
+ {{ title.date_monograph_published_online }}
+ </span>
+ </li>
+ <li v-if="title.monograph_volume">
+ <label
+ >{{ $t("Number of volume for monograph") }}:</label
+ >
+ <span>
+ {{ title.monograph_volume }}
+ </span>
+ </li>
+ <li v-if="title.monograph_edition">
+ <label>{{ $t("Edition of the monograph") }}:</label>
+ <span>
+ {{ title.monograph_edition }}
+ </span>
+ </li>
+ <li v-if="title.first_editor">
+ <label>{{ $t("First editor") }}:</label>
+ <span>
+ {{ title.first_editor }}
+ </span>
+ </li>
+ <li v-if="title.parent_publication_title_id">
+ <label
+ >{{
+ $t(
+ "Title identifier of the parent publication"
+ )
+ }}:</label
+ >
+ <span>
+ {{ title.parent_publication_title_id }}
+ </span>
+ </li>
+ <li v-if="title.preceeding_publication_title_id">
+ <label
+ >{{
+ $t(
+ "Title identifier of any preceding publication title"
+ )
+ }}:</label
+ >
+ <span>
+ {{ title.preceeding_publication_title_id }}
+ </span>
+ </li>
+ <li v-if="title.access_type">
+ <label>{{ $t("Access type") }}:</label>
+ <span>
+ {{ title.access_type }}
+ </span>
+ </li>
+ <li>
+ <label>Packages ({{ title.resources.length }})</label>
+ <div v-if="title.resources.length">
+ <EHoldingsTitlePackagesList
+ :resources="title.resources"
+ />
+ </div>
+ </li>
+ </ol>
+ </fieldset>
+ <fieldset class="action">
+ <router-link
+ to="/cgi-bin/koha/erm/eholdings/local/titles"
+ role="button"
+ class="cancel"
+ >{{ $t("Close") }}</router-link
+ >
+ </fieldset>
+ </div>
+ </div>
+</template>
+
+<script>
+import EHoldingsTitlePackagesList from "./EHoldingsLocalTitlePackagesList.vue"
+import { fetchLocalTitle } from "../../fetch"
+import { useAVStore } from "../../stores/authorised_values"
+export default {
+ setup() {
+ const AVStore = useAVStore()
+ const { get_lib_from_av } = AVStore
+
+ return {
+ get_lib_from_av,
+ }
+ },
+ data() {
+ return {
+ title: {
+ title_id: null,
+ publication_title: '',
+ external_id: '',
+ print_identifier: '',
+ online_identifier: '',
+ date_first_issue_online: '',
+ num_first_vol_online: '',
+ num_first_issue_online: '',
+ date_last_issue_online: '',
+ num_last_vol_online: '',
+ num_last_issue_online: '',
+ title_url: '',
+ first_author: '',
+ embargo_info: '',
+ coverage_depth: '',
+ notes: '',
+ publisher_name: '',
+ publication_type: '',
+ date_monograph_published_print: '',
+ date_monograph_published_online: '',
+ monograph_volume: '',
+ monograph_edition: '',
+ first_editor: '',
+ parent_publication_title_id: '',
+ preceeding_publication_title_id: '',
+ access_type: '',
+ resources: [],
+ },
+ initialized: false,
+ }
+ },
+ beforeRouteEnter(to, from, next) {
+ next(vm => {
+ vm.getTitle(to.params.title_id)
+ })
+ },
+ beforeRouteUpdate(to, from) {
+ this.title = this.getTitle(to.params.title_id)
+ },
+ methods: {
+ async getTitle(title_id) {
+ const title = await fetchLocalTitle(title_id)
+ this.title = title
+ this.initialized = true
+ },
+ },
+ components: {
+ EHoldingsTitlePackagesList,
+ },
+ name: "EHoldingsLocalTitlesShow",
+}
+</script>
+<style scoped>
+.action_links a {
+ padding-left: 0.2em;
+ font-size: 11px;
+}
+fieldset.rows label {
+ width: 25rem;
+}
+</style>
--- /dev/null
+<template>
+ <router-link to="/cgi-bin/koha/erm/eholdings/local/titles/add" class="btn btn-default"
+ ><font-awesome-icon icon="plus" />
+ {{ $t("New title") }}</router-link
+ >
+</template>
+
+<script>
+export default {
+ name: "EHoldingsLocalTitleToolbar",
+}
+</script>
<template>
<ul>
- <li>
- <router-link to="/cgi-bin/koha/erm/eholdings/packages">
+ <li v-for="provider in erm_providers" :key="provider">
+ <router-link
+ v-if="provider == 'local'"
+ :to="`/cgi-bin/koha/erm/eholdings/local`"
+ >
<i class="fa fa-file-text-o"></i>
- {{ $t("Packages") }}</router-link
+ {{ $t("Local") }}</router-link
+ >
+ <router-link
+ v-else-if="provider == 'ebsco'"
+ :to="`/cgi-bin/koha/erm/eholdings/ebsco`"
>
- </li>
- <li>
- <router-link to="/cgi-bin/koha/erm/eholdings/titles">
<i class="fa fa-file-text-o"></i>
- {{ $t("Titles") }}</router-link
+ {{ $t("EBSCO") }}</router-link
>
+ <ul>
+ <li>
+ <router-link
+ :to="`/cgi-bin/koha/erm/eholdings/${provider}/packages`"
+ >
+ <i class="fa fa-file-text-o"></i>
+ {{ $t("Packages") }}</router-link
+ >
+ </li>
+ <li>
+ <router-link
+ :to="`/cgi-bin/koha/erm/eholdings/${provider}/titles`"
+ >
+ <i class="fa fa-file-text-o"></i>
+ {{ $t("Titles") }}</router-link
+ >
+ </li>
+ </ul>
</li>
</ul>
</template>
<script>
export default {
+ setup() {
+ return { erm_providers, }
+ },
data() {
return {
}
+++ /dev/null
-<template>
- <fieldset class="rows" id="package_agreements">
- <legend>{{ $t("Agreements") }}</legend>
- <fieldset
- class="rows"
- v-for="(package_agreement, counter) in package_agreements"
- v-bind:key="counter"
- >
- <legend>
- {{ $t("Agreement .counter", { counter: counter + 1 }) }}
- <a href="#" @click.prevent="deleteAgreement(counter)"
- ><i class="fa fa-trash"></i>
- {{ $t("Remove this agreement") }}</a
- >
- </legend>
- <ol>
- <li>
- <label :for="`agreement_id_${counter}`"
- >{{ $t("Agreement") }}:
- </label>
- <select
- v-model="package_agreement.agreement_id"
- :id="`agreement_id_${counter}`"
- required
- >
- <option value=""></option>
- <option
- v-for="agreement in agreements"
- :key="agreement.agreement_id"
- :value="agreement.agreement_id"
- :selected="
- agreement.agreement_id ==
- package_agreement.agreement_id
- ? true
- : false
- "
- >
- {{ agreement.name }}
- </option>
- </select>
- <span class="required">{{ $t("Required") }}</span>
- </li>
- </ol>
- </fieldset>
- <a
- v-if="agreements.length"
- class="btn btn-default"
- @click="addAgreement"
- ><font-awesome-icon icon="plus" /> {{ $t("Add new agreement") }}</a
- >
- <span v-else>{{ $t("There are no agreements created yet") }}</span>
- </fieldset>
-</template>
-
-<script>
-import { fetchAgreements } from "../../fetch"
-
-export default {
- data() {
- return {
- agreements: [],
- }
- },
- beforeCreate() {
- fetchAgreements().then((agreements) => {
- this.agreements = agreements
- })
- },
- methods: {
- addAgreement() {
- this.package_agreements.push({
- agreement_id: null,
- })
- },
- deleteAgreement(counter) {
- this.package_agreements.splice(counter, 1)
- },
- },
- props: {
- package_agreements: Array,
- },
- name: 'EHoldingsPackageAgreements',
-}
-</script>
+++ /dev/null
-<template>
- <div id="title_list_result">
- <div id="filters" v-if="erm_provider != 'manual'">
- <a href="#" @click.prevent="toggle_filters($event)"
- ><i class="fa fa-search"></i>
- {{ display_filters ? $t("Hide filters") : $t("Show filters") }}
- </a>
- <fieldset v-if="display_filters">
- <ol>
- <li>
- <label>{{ $t("Title") }}:</label>
- <input
- type="text"
- id="publication_title_filter"
- v-model="filters.publication_title"
- @keyup.enter="filter_table"
- />
- </li>
- <li>
- <label>{{ $t("Publication type") }}:</label>
- <select
- id="publication_type_filter"
- v-model="filters.publication_type"
- >
- <option value="">{{ $t("All") }}</option>
- <option
- v-for="type in av_title_publication_types"
- :key="type.authorised_values"
- :value="type.authorised_value"
- >
- {{ type.lib }}
- </option>
- </select>
- </li>
- <li>
- <label>{{ $t("Selection status") }}:</label>
- <select
- id="selection_type_filter"
- v-model="filters.selection_type"
- >
- <option value="0">{{ $t("All") }}</option>
- <option value="1">{{ $t("Selected") }}</option>
- <option value="2">{{ $t("Not selected") }}</option>
- </select>
- </li>
- </ol>
-
- <input
- @click="filter_table"
- id="filter_table"
- type="button"
- :value="$t('Filter')"
- />
- </fieldset>
- </div>
- <table id="title_list"></table>
- </div>
-</template>
-
-<script>
-
-import { createVNode, render } from 'vue'
-import { useAVStore } from "../../stores/authorised_values"
-import { storeToRefs } from "pinia"
-
-export default {
- setup() {
- const AVStore = useAVStore()
- const { av_title_publication_types } = storeToRefs(AVStore)
- const { get_lib_from_av } = AVStore
-
- return {
- av_title_publication_types,
- get_lib_from_av,
- }
- },
- data() {
- return {
- filters: {
- publication_title: "",
- publication_type: "",
- selection_type: "",
- },
- display_filters: false,
- }
- },
- inject: ['erm_provider'],
- methods: {
- show_resource: function (resource_id) {
- this.$router.push("/cgi-bin/koha/erm/eholdings/resources/" + resource_id)
- },
- filter_table: function () {
- $("#title_list").DataTable().draw()
- },
- toggle_filters: function (e) {
- this.display_filters = !this.display_filters
- },
- build_datatable: function () {
- let show_resource = this.show_resource
- let package_id = this.package_id
- let get_lib_from_av = this.get_lib_from_av
- let filters = this.filters
-
- window['av_title_publication_types'] = this.av_title_publication_types.map(e => {
- e['_id'] = e['authorised_value']
- e['_str'] = e['lib']
- return e
- })
-
- let additional_filters = {}
- if (erm_provider != 'manual') {
- additional_filters = {
- publication_title: function () {
- return filters.publication_title || ""
- },
- publication_type: function () {
- return filters.publication_type || ""
- },
- selection_type: function () {
- return filters.selection_type || ""
- },
- }
- }
-
- $('#title_list').kohaTable({
- "ajax": {
- "url": "/api/v1/erm/eholdings/packages/" + package_id + "/resources",
- },
- ...(erm_provider != 'manual' ? { ordering: false } : {}),
- ...(erm_provider != 'manual' ? { dom: '<"top pager"<"table_entries"ilp>>tr<"bottom pager"ip>' } : {}),
- ...(erm_provider != 'manual' ? { aLengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]] } : {}),
- "embed": ['title'],
- autoWidth: false,
- "columns": [
- {
- "title": __("Name"),
- "data": "title.publication_title",
- "searchable": (erm_provider == 'manual') ? 1 : 0,
- "orderable": (erm_provider == 'manul') ? 1 : 0,
- "render": function (data, type, row, meta) {
- // Rendering done in drawCallback
- return ""
- }
- },
- {
- "title": __("Publication type"),
- "data": "title.publication_type",
- "searchable": (erm_provider == 'manual') ? 1 : 0,
- "orderable": (erm_provider == 'manul') ? 1 : 0,
- "render": function (data, type, row, meta) {
- return escape_str(get_lib_from_av("av_title_publication_types", row.title.publication_type))
- }
- },
- ],
- drawCallback: function (settings) {
-
- var api = new $.fn.dataTable.Api(settings)
-
- $.each($(this).find("tbody tr td:first-child"), function (index, e) {
- let row = api.row(index).data()
- if (!row) return // Happen if the table is empty
- let n = createVNode("a", {
- role: "button",
- href: "/cgi-bin/koha/erm/eholdings/resources/" + row.resource_id,
- onClick: (e) => {
- e.preventDefault()
- show_resource(row.resource_id)
- }
- },
- `${row.title.publication_title}`
- )
- if (row.is_selected) {
- n = createVNode('span', {}, [n, " ", createVNode("i", { class: "fa fa-check-square-o", style: { color: "green" }, title: __("Is selected") })])
- }
- render(n, e)
- })
- },
- ...(erm_provider == 'manual' ? {
- preDrawCallback: function (settings) {
- var table_id = settings.nTable.id
- if (erm_provider == 'manual') {
- $("#" + table_id).find("thead th").eq(1).attr('data-filter', 'av_title_publication_types')
- }
- }
- } : {}),
- }, null, erm_provider == 'manual' ? 1 : 0, additional_filters)
- },
- },
- mounted() {
- this.build_datatable()
- },
- beforeUnmount() {
- $('#title_list')
- .DataTable()
- .destroy(true)
- },
- props: {
- package_id: String,
- },
- name: 'EHoldingsPackageTitlesList',
-}
-</script>
-
-<style scoped>
-#title_list_result {
- width: 60%;
- padding-left: 10rem;
-}
-#title_list {
- display: table;
-}
-#filters {
- margin: 0;
-}
-</style>
\ No newline at end of file
+++ /dev/null
-<template>
- <div v-if="!this.initialized">{{ $t("Loading") }}</div>
- <div v-else id="packages_add">
- <h2 v-if="erm_package.package_id">
- {{ $t("Edit package .id", { id: erm_package.package_id }) }}
- </h2>
- <h2 v-else>{{ $t("New package") }}</h2>
- <div>
- <form @submit="onSubmit($event)">
- <fieldset class="rows">
- <ol>
- <li>
- <label class="required" for="package_name"
- >{{ $t("Package name") }}:</label
- >
- <input
- id="package_name"
- v-model="erm_package.name"
- :placeholder="$t('Package name')"
- required
- />
- <span class="required">{{ $t("Required") }}</span>
- </li>
- <li>
- <label for="package_vendor_id"
- >{{ $t("Vendor") }}:</label
- >
- <select
- id="package_vendor_id"
- v-model="erm_package.vendor_id"
- >
- <option value=""></option>
- <option
- v-for="vendor in vendors"
- :key="vendor.vendor_id"
- :value="vendor.id"
- :selected="
- vendor.id == erm_package.vendor_id
- ? true
- : false
- "
- >
- {{ vendor.name }}
- </option>
- </select>
- </li>
- <li>
- <label for="package_type">{{ $t("Type") }}:</label>
- <select
- id="package_type"
- v-model="erm_package.package_type"
- >
- <option value=""></option>
- <option
- v-for="type in av_package_types"
- :key="type.authorised_values"
- :value="type.authorised_value"
- :selected="
- type.authorised_value ==
- erm_package.package_type
- ? true
- : false
- "
- >
- {{ type.lib }}
- </option>
- </select>
- </li>
- <li>
- <label for="package_content_type">{{
- $t("Content type: ")
- }}</label>
- <select
- id="package_content_type"
- v-model="erm_package.content_type"
- >
- <option value=""></option>
- <option
- v-for="type in av_package_content_types"
- :key="type.authorised_values"
- :value="type.authorised_value"
- :selected="
- type.authorised_value ==
- erm_package.content_type
- ? true
- : false
- "
- >
- {{ type.lib }}
- </option>
- </select>
- </li>
-
- <EHoldingsPackageAgreements
- :package_agreements="erm_package.package_agreements"
- />
- </ol>
- </fieldset>
- <fieldset class="action">
- <input type="submit" value="Submit" />
- <router-link
- to="/cgi-bin/koha/erm/eholdings/packages"
- role="button"
- class="cancel"
- >{{ $t("Cancel") }}</router-link
- >
- </fieldset>
- </form>
- </div>
- </div>
-</template>
-
-<script>
-import EHoldingsPackageAgreements from "./EHoldingsPackageAgreements.vue"
-import { useVendorStore } from "../../stores/vendors"
-import { useAVStore } from "../../stores/authorised_values"
-import { setMessage, setError } from "../../messages"
-import { fetchPackage } from '../../fetch'
-import { storeToRefs } from "pinia"
-
-export default {
- setup() {
- const vendorStore = useVendorStore()
- const { vendors } = storeToRefs(vendorStore)
- const AVStore = useAVStore()
- const {
- av_package_types,
- av_package_content_types,
- } = storeToRefs(AVStore)
-
- return {
- vendors,
- av_package_types,
- av_package_content_types,
- }
- },
- data() {
- return {
- erm_package: {
- package_id: null,
- name: '',
- external_id: '',
- package_type: '',
- content_type: '',
- package_agreements: [],
- },
- initialized: false,
- }
- },
- beforeRouteEnter(to, from, next) {
- next(vm => {
- if (to.params.package_id) {
- vm.erm_package = vm.getPackage(to.params.package_id)
- } else {
- vm.initialized = true
- }
- })
- },
- methods: {
- async getPackage(package_id) {
- const erm_package = await fetchPackage(package_id)
- this.erm_package = erm_package
- this.initialized = true
- },
- onSubmit(e) {
- e.preventDefault()
-
- let erm_package = JSON.parse(JSON.stringify(this.erm_package)) // copy
- let apiUrl = '/api/v1/erm/eholdings/packages'
-
- let method = 'POST'
- if (erm_package.package_id) {
- method = 'PUT'
- apiUrl += '/' + erm_package.package_id
- }
- delete erm_package.package_id
- delete erm_package.resources
- delete erm_package.vendor
- delete erm_package.resources_count
-
- erm_package.package_agreements = erm_package.package_agreements.map(({ package_id, agreement, ...keepAttrs }) => keepAttrs)
-
- const options = {
- method: method,
- body: JSON.stringify(erm_package),
- headers: {
- 'Content-Type': 'application/json;charset=utf-8'
- },
- }
-
- fetch(apiUrl, options)
- .then(response => {
- if (response.status == 200) {
- this.$router.push("/cgi-bin/koha/erm/eholdings/packages")
- setMessage(this.$t("Package updated"))
- } else if (response.status == 201) {
- this.$router.push("/cgi-bin/koha/erm/eholdings/packages")
- setMessage(this.$t("Package created"))
- } else {
- setError(response.message || response.statusText)
- }
- }, (error) => {
- setError(error)
- }).catch(e => { console.log(e) })
- },
- },
- components: {
- EHoldingsPackageAgreements,
- },
- name: "EHoldingsPackagesFormAdd",
-}
-</script>
+++ /dev/null
-<template>
- <div v-if="!this.initialized">{{ $t("Loading") }}</div>
- <div v-else id="packages_confirm_delete">
- <h2>{{ $t("Delete package") }}</h2>
- <div>
- <form @submit="onSubmit($event)">
- <fieldset class="rows">
- <ol>
- <li>
- {{ $t("Package name") }}:
- {{ erm_package.name }}
- </li>
- </ol>
- </fieldset>
- <fieldset class="action">
- <input
- type="submit"
- variant="primary"
- :value="$t('Yes, delete')"
- />
- <router-link
- to="/cgi-bin/koha/erm/eholdings/packages"
- role="button"
- class="cancel"
- >{{ $t("No, do not delete") }}</router-link
- >
- </fieldset>
- </form>
- </div>
- </div>
-</template>
-
-<script>
-import { fetchPackage } from "../../fetch"
-import { setMessage, setError } from "../../messages"
-
-export default {
- data() {
- return {
- erm_package: {},
- initialized: false,
- }
- },
- beforeRouteEnter(to, from, next) {
- next(vm => {
- vm.getPackage(to.params.package_id)
- })
- },
- methods: {
- async getPackage(package_id) {
- const erm_package = await fetchPackage(package_id)
- this.erm_package = erm_package
- this.initialized = true
- },
- onSubmit(e) {
- e.preventDefault()
-
- let apiUrl = '/api/v1/erm/eholdings/packages/' + this.erm_package.package_id
-
- const options = {
- method: 'DELETE',
- headers: {
- 'Content-Type': 'application/json;charset=utf-8'
- },
- }
-
- fetch(apiUrl, options)
- .then(
- (response) => {
- if (response.status == 204) {
- setMessage(this.$t("Package deleted"))
- this.$router.push("/cgi-bin/koha/erm/eholdings/packages")
- } else {
- setError(response.message || response.statusText)
- }
- }
- ).catch(
- (error) => {
- setError(error)
- }
- )
- }
- },
- name: "EHoldingsPackagesFormConfirmDelete",
-}
-</script>
+++ /dev/null
-<template>
- <div v-if="erm_provider == 'manual'">
- <div v-if="!this.initialized">{{ $t("Loading") }}</div>
- <div v-else-if="this.packages" id="packages_list">
- <Toolbar />
- <div v-if="this.packages.length" id="package_list_result">
- <table id="package_list"></table>
- </div>
- <div v-else-if="this.initialized" class="dialog message">
- {{ $t("There are no packages defined") }}
- </div>
- </div>
- </div>
- <div v-else>
- <fieldset>
- {{ $t("Package name") }}:
- <input
- type="text"
- id="package_name_filter"
- v-model="filters.package_name"
- @keyup.enter="filter_table"
- />
- {{ $t("Content type") }}:
- <select id="content_type_filter" v-model="filters.content_type">
- <option value="">{{ $t("All") }}</option>
- <option
- v-for="type in av_package_content_types"
- :key="type.authorised_values"
- :value="type.authorised_value"
- >
- {{ type.lib }}
- </option>
- </select>
- {{ $t("Selection status") }}:
- <select id="selection_type_filter" v-model="filters.selection_type">
- <option value="0">{{ $t("All") }}</option>
- <option value="1">{{ $t("Selected") }}</option>
- <option value="2">{{ $t("Not selected") }}</option>
- </select>
- <input
- @click="filter_table"
- id="filter_table"
- type="button"
- :value="$t('Submit')"
- />
- </fieldset>
- <div id="package_list_result" style="display: none">
- <table id="package_list"></table>
- </div>
- </div>
-</template>
-
-<script>
-import Toolbar from "./EHoldingsPackagesToolbar.vue"
-import { createVNode, render } from 'vue'
-import { useVendorStore } from "../../stores/vendors"
-import { useAVStore } from "../../stores/authorised_values"
-import { storeToRefs } from "pinia"
-import { fetchPackages } from "../../fetch"
-
-export default {
- setup() {
- const vendorStore = useVendorStore() // FIXME We only need that for 'manual'
- const { vendors } = storeToRefs(vendorStore)
-
- const AVStore = useAVStore()
- const { av_package_types, av_package_content_types } = storeToRefs(AVStore)
- const { get_lib_from_av } = AVStore
-
- return {
- vendors,
- av_package_types,
- av_package_content_types,
- get_lib_from_av,
- }
- },
- inject: ['erm_provider'],
- data: function () {
- return {
- packages: [],
- initialized: false,
- filters: {
- package_name: this.$route.query.q || "",
- content_type: "",
- selection_type: "",
- },
- }
- },
- beforeRouteEnter(to, from, next) {
- next(vm => {
- vm.getPackages().then(() => vm.build_datatable())
- })
- },
- methods: {
- async getPackages() {
- if (erm_provider == 'manual') {
- const packages = await fetchPackages()
- this.packages = packages
- }
- this.initialized = true
- },
- show_package: function (package_id) {
- this.$router.push("/cgi-bin/koha/erm/eholdings/packages/" + package_id)
- },
- edit_package: function (package_id) {
- this.$router.push("/cgi-bin/koha/erm/eholdings/packages/edit/" + package_id)
- },
- delete_package: function (package_id) {
- this.$router.push("/cgi-bin/koha/erm/eholdings/packages/delete/" + package_id)
- },
- filter_table: function () {
- $("#package_list_result").show()
- $("#package_list").DataTable().draw()
- },
- build_datatable: function () {
- let show_package = this.show_package
- let edit_package = this.edit_package
- let delete_package = this.delete_package
- let get_lib_from_av = this.get_lib_from_av
- let filters = this.filters
-
- window['vendors'] = this.vendors.map(e => {
- e['_id'] = e['id']
- e['_str'] = e['name']
- return e
- })
- window['av_package_types'] = this.av_package_types.map(e => {
- e['_id'] = e['authorised_value']
- e['_str'] = e['lib']
- return e
- })
- window['av_package_content_types'] = this.av_package_content_types.map(e => {
- e['_id'] = e['authorised_value']
- e['_str'] = e['lib']
- return e
- })
-
- let additional_filters = {}
- if (erm_provider != 'manual') {
- additional_filters = {
- name: function () {
- return filters.package_name || ""
- },
- content_type: function () {
- return filters.content_type || ""
- },
- selection_type: function () {
- return filters.selection_type || ""
- },
- }
- }
-
- $('#package_list').kohaTable({
- "ajax": {
- "url": "/api/v1/erm/eholdings/packages",
- },
- "embed": ['resources+count', 'vendor.name'],
- ...(erm_provider == 'manual' ? { order: [[0, "asc"]] } : {}),
- ...(erm_provider != 'manual' ? { ordering: false } : {}),
- ...(erm_provider == 'manual' ? { search: { search: filters.package_name } } : {}),
- ...(erm_provider != 'manual' ? { dom: '<"top pager"<"table_entries"ilp>>tr<"bottom pager"ip>' } : {}),
- ...(erm_provider != 'manual' ? { aLengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]] } : {}),
- ...(erm_provider != 'manual' ? { deferLoading: true } : {}),
- autoWidth: false,
- "columns": [
- {
- "title": __("Name"),
- "data": "me.package_id:me.name",
- "searchable": (erm_provider == 'manual'),
- "orderable": (erm_provider == 'manul'),
- "render": function (data, type, row, meta) {
- // Rendering done in drawCallback
- return ""
- }
- },
- {
- "title": __("Vendor"),
- "data": "vendor_id",
- "searchable": (erm_provider == 'manual'),
- "orderable": (erm_provider == 'manul'),
- "render": function (data, type, row, meta) {
- return row.vendor ? escape_str(row.vendor.name) : ""
- },
- },
- {
- "title": __("Type"),
- "data": "package_type",
- "searchable": (erm_provider == 'manual'),
- "orderable": (erm_provider == 'manul'),
- "render": function (data, type, row, meta) {
- return escape_str(get_lib_from_av("av_package_types", row.package_type))
- }
- }, {
- "searchable": (erm_provider == 'manual'),
- "orderable": (erm_provider == 'manul'),
- "searchable": true,
- "orderable": true,
- "render": function (data, type, row, meta) {
- return escape_str(get_lib_from_av("av_package_content_types", row.content_type))
- }
- },
- erm_provider == 'manual' ?
- {
- "title": __("Created on"),
- "data": "created_on",
- "searchable": true,
- "orderable": true,
- "render": function (data, type, row, meta) {
- return $date(row.created_on)
- }
- } : null,
- erm_provider == 'manual' ?
- {
- "title": __("Actions"),
- "data": function (row, type, val, meta) {
- return '<div class="actions"></div>'
- },
- "className": "actions noExport",
- "searchable": false,
- "orderable": false
- } : null,
- ].filter(Boolean),
- drawCallback: function (settings) {
-
- var api = new $.fn.dataTable.Api(settings)
-
- $.each($(this).find("td .actions"), function (index, e) {
- let package_id = api.row(index).data().package_id
- let editButton = createVNode("a", {
- class: "btn btn-default btn-xs", role: "button", onClick: () => {
- edit_package(package_id)
- }
- },
- [createVNode("i", { class: "fa fa-pencil", 'aria-hidden': "true" }), __("Edit")])
-
- let deleteButton = createVNode("a", {
- class: "btn btn-default btn-xs", role: "button", onClick: () => {
- delete_package(package_id)
- }
- },
- [createVNode("i", { class: "fa fa-trash", 'aria-hidden': "true" }), __("Delete")])
-
- let n = createVNode('span', {}, [editButton, " ", deleteButton])
- render(n, e)
- })
-
- $.each($(this).find("tbody tr td:first-child"), function (index, e) {
- let row = api.row(index).data()
- if (!row) return // Happen if the table is empty
- let n = createVNode("a", {
- role: "button",
- href: "/cgi-bin/koha/erm/eholdings/packages/" + row.package_id,
- onClick: (e) => {
- e.preventDefault()
- show_package(row.package_id)
- }
- },
- `${row.name} (#${row.package_id})`
- )
- if (row.is_selected) {
- n = createVNode('span', {}, [n, " ", createVNode("i", { class: "fa fa-check-square-o", style: { color: "green" }, title: __("Is selected") })])
- }
- render(n, e)
- })
- },
- ...(erm_provider == 'manual' ? {
- preDrawCallback: function (settings) {
- var table_id = settings.nTable.id
- if (erm_provider == 'manual') {
- $("#" + table_id).find("thead th").eq(1).attr('data-filter', 'vendors')
- }
- $("#" + table_id).find("thead th").eq(2).attr('data-filter', 'av_package_types')
- $("#" + table_id).find("thead th").eq(3).attr('data-filter', 'av_package_content_types')
- }
- } : {}),
- }, eholdings_packages_table_settings, erm_provider == 'manual' ? 1 : 0, additional_filters)
-
- if (erm_provider != 'manual') {
- if (filters.package_name.length) {
- this.filter_table()
- }
- }
- },
- },
- beforeUnmount() {
- //$('#package_list')
- // .DataTable()
- // .destroy(true)
- },
- components: { Toolbar },
- name: "EHoldingsPackagesList",
-}
-</script>
+++ /dev/null
-<template>
- <div v-if="!initialized">{{ $t("Loading") }}</div>
- <div v-else-if="erm_package" id="packages_show">
- <h2>
- {{ $t("Package .id", { id: erm_package.package_id }) }}
- <span v-if="erm_provider == 'manual'" class="action_links">
- <router-link
- :to="`/cgi-bin/koha/erm/eholdings/packages/edit/${erm_package.package_id}`"
- :title="$t('Edit')"
- ><i class="fa fa-pencil"></i
- ></router-link>
-
- <router-link
- :to="`/cgi-bin/koha/erm/eholdings/packages/delete/${erm_package.package_id}`"
- :title="$t('Delete')"
- ><i class="fa fa-trash"></i
- ></router-link>
- </span>
- </h2>
- <div>
- <fieldset class="rows">
- <ol>
- <li>
- <label>{{ $t("Package name") }}:</label>
- <span>
- {{ erm_package.name }}
- </span>
- </li>
- <li v-if="erm_package.vendor">
- <label>{{ $t("Vendor") }}:</label>
- <span v-if="erm_provider == 'manual'">
- <a
- :href="`/cgi-bin/koha/acqui/booksellers.pl?booksellerid=${erm_package.vendor_id}`"
- >{{ erm_package.vendor.name }}</a
- >
- </span>
- <span v-else>{{ erm_package.vendor.name }}</span>
- </li>
- <li v-if="erm_package.external_id">
- <label>{{ $t("External ID") }}:</label>
- <span>
- <!-- FIXME Create a syspref to store the URL -->
- <a
- :href="`https://ptfs-europe-demo.folio.ebsco.com/eholdings/packages/${erm_package.vendor.external_id}-${erm_package.external_id}`"
- >
- {{ erm_package.external_id }}
- </a>
- </span>
- </li>
- <li>
- <label>{{ $t("Package type") }}:</label>
- <span>{{
- get_lib_from_av(
- "av_package_types",
- erm_package.package_type
- )
- }}</span>
- </li>
- <li>
- <label>{{ $t("Content type") }}:</label>
- <span>{{
- get_lib_from_av(
- "av_package_content_types",
- erm_package.content_type
- )
- }}</span>
- </li>
- <li v-if="erm_package.created_on">
- <label>{{ $t("Created on") }}:</label>
- <span>{{ format_date(erm_package.created_on) }}</span>
- </li>
-
- <li>
- <label
- >Titles ({{ erm_package.resources_count }})</label
- >
- <div v-if="erm_package.resources_count">
- <EHoldingsPackageTitlesList
- :package_id="erm_package.package_id.toString()"
- />
- </div>
- </li>
-
- <li></li>
- </ol>
- </fieldset>
- <fieldset class="action">
- <router-link
- to="/cgi-bin/koha/erm/eholdings/packages"
- role="button"
- class="cancel"
- >{{ $t("Close") }}</router-link
- >
- </fieldset>
- </div>
- </div>
-</template>
-
-<script>
-import EHoldingsPackageTitlesList from "./EHoldingsPackageTitlesList.vue"
-import { useAVStore } from "../../stores/authorised_values"
-import { fetchPackage } from "../../fetch"
-
-export default {
- setup() {
- const format_date = $date
-
- const AVStore = useAVStore()
- const { get_lib_from_av } = AVStore
-
- return {
- format_date,
- get_lib_from_av,
- }
- },
- inject: ['erm_provider'],
- data() {
- return {
- erm_package: {
- package_id: null,
- vendor_id: null,
- name: '',
- external_id: '',
- package_type: '',
- content_type: '',
- created_on: null,
- resources: null,
- },
- initialized: false,
- }
- },
- beforeRouteEnter(to, from, next) {
- next(vm => {
- vm.getPackage(to.params.package_id)
- })
- },
- beforeRouteUpdate(to, from) {
- this.erm_package = this.getPackage(to.params.package_id)
- },
- methods: {
- async getPackage(package_id) {
- const erm_package = await fetchPackage(package_id)
- this.erm_package = erm_package
- this.initialized = true
- },
- },
- components: {
- EHoldingsPackageTitlesList,
- },
- name: "EHoldingsPackagesShow",
-}
-</script>
-<style scoped>
-.action_links a {
- padding-left: 0.2em;
- font-size: 11px;
-}
-fieldset.rows label {
- width: 25rem;
-}
-</style>
+++ /dev/null
-<template>
- <router-link to="/cgi-bin/koha/erm/eholdings/packages/add" class="btn btn-default"
- ><font-awesome-icon icon="plus" />
- {{ $t("New package") }}</router-link
- >
-</template>
-
-<script>
-export default {
- name: "EHoldingsPackagesToolbar",
-}
-</script>
+++ /dev/null
-<template>
- <div v-if="!initialized">{{ $t("Loading") }}</div>
- <div v-else-if="resource" id="eholdings_resources_show">
- <h2>
- {{ $t("Resource .id", { id: resource.resource_id }) }}
- </h2>
- <div>
- <fieldset class="rows">
- <legend>{{ $t("Resource information") }}</legend>
- <ol>
- <li v-if="resource.resource_id">
- <label>{{ $t("Resource identifier") }}:</label>
- <span>
- {{ resource.resource_id }}
- </span>
- </li>
- <li>
- <label>{{ $t("Publication title") }}:</label>
- <span
- ><router-link
- :to="`/cgi-bin/koha/erm/eholdings/titles/${resource.title_id}`"
- >{{
- resource.title.publication_title
- }}</router-link
- ></span
- >
- </li>
- <li>
- <label>{{ $t("Publisher name") }}:</label>
- <span>
- {{ resource.title.publisher_name }}
- </span>
- </li>
- <li>
- <label>{{ $t("Publication type") }}:</label>
- <span>
- {{ resource.title.publication_type }}
- </span>
- </li>
- <li v-if="resource.title.print_identifier">
- <label>{{ $t("Print-format identifier") }}:</label>
- <span>
- {{ resource.title.print_identifier }}
- </span>
- </li>
- <li v-if="resource.title.online_identifier">
- <label>{{ $t("Online-format identifier") }}:</label>
- <span>
- {{ resource.title.online_identifier }}
- </span>
- </li>
- </ol>
- </fieldset>
-
- <fieldset class="rows">
- <ol>
- <li>
- <label>{{ $t("Package") }}:</label>
- <span
- ><router-link
- :to="`/cgi-bin/koha/erm/eholdings/packages/${resource.package_id}`"
- >{{ resource.package.name }}</router-link
- ></span
- >
- </li>
-
- <li>
- <label>{{ $t("Vendor") }}:</label>
- <span v-if="resource.vendor">
- {{ resource.vendor.name }}
- </span>
- </li>
- <li v-if="resource.package.content_type">
- <label>{{ $t("Package content type") }}:</label>
- <span>{{ resource.package.content_type }}</span>
- </li>
- </ol>
- </fieldset>
-
- <fieldset class="rows">
- <legend>Resource settings</legend>
- <ol>
- <li>
- <label>{{ $t("Coverage dates") }}:</label>
- <span
- >{{ format_date(resource.started_on) }}-{{
- format_date(resource.ended_on)
- }}</span
- >
- </li>
- </ol>
- </fieldset>
- </div>
- </div>
-</template>
-
-<script>
-import { fetchResource } from "../../fetch"
-import { useVendorStore } from "../../stores/vendors"
-import { storeToRefs } from "pinia"
-export default {
- setup() {
- const format_date = $date
-
- const vendorStore = useVendorStore()
- const { vendors } = storeToRefs(vendorStore)
- return {
- format_date,
- vendors,
- }
- },
- data() {
- return {
- resource: {
- resource_id: null,
- title_id: null,
- package_id: null,
- started_on: '',
- ended_on: '',
- proxy: '',
- title: {},
- package: {},
- },
- initialized: false,
- }
- },
-
- beforeRouteEnter(to, from, next) {
- next(vm => {
- vm.getResource(to.params.resource_id)
- })
- },
- beforeRouteUpdate(to, from) {
- this.resource = this.getResource(to.params.resource_id)
- },
- methods: {
- async getResource(resource_id) {
- const resource = await fetchResource(resource_id)
- this.resource = resource
- this.initialized = true
- },
- },
- name: "EHoldingsResourcesShow",
-}
-</script>
-<style scoped>
-fieldset.rows label {
- width: 25rem;
-}
-</style>
+++ /dev/null
-<template>
- <div id="package_list_result">
- <div id="filters" v-if="erm_provider != 'manual'">
- <a href="#" @click.prevent="toggle_filters($event)"
- ><i class="fa fa-search"></i>
- {{ display_filters ? $t("Hide filters") : $t("Show filters") }}
- </a>
- <fieldset v-if="display_filters" id="filters">
- <ol>
- <li>
- <label>{{ $t("Package name") }}:</label>
- <input
- type="text"
- id="package_name_filter"
- v-model="this.filters.package_name"
- @keyup.enter="filter_table"
- />
- </li>
- <li>
- <label>{{ $t("Selection status") }}:</label>
- <select
- id="selection_type_filter"
- v-model="this.filters.selection_type"
- >
- <option value="0">{{ $t("All") }}</option>
- <option value="1">{{ $t("Selected") }}</option>
- <option value="2">{{ $t("Not selected") }}</option>
- </select>
- </li>
- </ol>
- <input
- @click="filter_table"
- id="filter_table"
- type="button"
- :value="$t('Filter')"
- />
- </fieldset>
- </div>
- <table id="package_list"></table>
- </div>
-</template>
-
-<script>
-
-import { createVNode, render } from 'vue'
-
-export default {
- setup() {
- return {
- }
- },
- data() {
- return {
- filters: {
- package_name: "",
- selection_type: 0,
- },
- display_filters: false,
- }
- },
- inject: ['erm_provider'],
- methods: {
- show_resource: function (resource_id) {
- this.$router.push("/cgi-bin/koha/erm/eholdings/resources/" + resource_id)
- },
- toggle_filters: function (e) {
- this.display_filters = !this.display_filters
- },
- filter_table: function () {
- $("#package_list").DataTable().draw()
- },
- build_datatable: function () {
- let show_resource = this.show_resource
- let resources = this.resources
- let filters = this.filters
-
- $('#package_list').dataTable($.extend(true, {}, dataTablesDefaults, {
- data: resources,
- "embed": ['package.name'],
- ...(erm_provider == 'manual' ? { order: [[0, "asc"]] } : {}),
- ...(erm_provider != 'manual' ? { ordering: false } : {}),
- ...(erm_provider != 'manual' ? { dom: '<"top pager"<"table_entries"ilp>>tr<"bottom pager"ip>' } : {}),
- ...(erm_provider != 'manual' ? { aLengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]] } : {}),
- autoWidth: false,
- "columns": [
- {
- "title": __("Name"),
- "data": "package.name",
- "searchable": (erm_provider == 'manual'),
- "orderable": (erm_provider == 'manul'),
- "render": function (data, type, row, meta) {
- // Rendering done in drawCallback
- return ""
- },
- width: '100%',
- },
- ],
- drawCallback: function (settings) {
-
- var api = new $.fn.dataTable.Api(settings)
-
- $.each($(this).find("tbody tr td:first-child"), function (index, e) {
- let row = api.row(index).data()
- if (!row) return // Happen if the table is empty
- let n = createVNode("a", {
- role: "button",
- href: "/cgi-bin/koha/erm/eholdings/resources/" + row.resource_id,
- onClick: (e) => {
- e.preventDefault()
- show_resource(row.resource_id)
- }
- },
- `${row.package.name}`
- )
- if (row.is_selected) {
- n = createVNode('span', {}, [n, " ", createVNode("i", { class: "fa fa-check-square-o", style: { color: "green" }, title: __("Is selected") })])
- }
- render(n, e)
- })
- },
- ...(erm_provider != 'manual' ? {
- initComplete: function () {
- $.fn.dataTable.ext.search.push(
- function (settings, data, dataIndex, row) {
- console.log(filters.selection_type)
- return row.package.name.match(new RegExp(filters.package_name, "i"))
- && (filters.selection_type == 0
- || filters.selection_type == 1 && row.is_selected
- || filters.selection_type == 2 && !row.is_selected)
- }
- )
- }
- } : {}),
- }))
- },
- },
- mounted() {
- this.build_datatable()
- },
- beforeUnmount() {
- $('#package_list')
- .DataTable()
- .destroy(true)
- },
- props: {
- resources: Array,
- },
- name: 'EHoldingsTitlePackagesList',
-}
-</script>
-
-<style scoped>
-#package_list_result {
- width: 60%;
- padding-left: 26rem;
-}
-#package_list {
- display: table;
-}
-#filters fieldset {
- margin: 0;
-}
-</style>
+++ /dev/null
-<template>
- <div v-if="!initialized">{{ $t("Loading") }}</div>
- <div v-else id="titles_add">
- <h2 v-if="title.title_id">
- {{ $t("Edit title .id", { id: title.title_id }) }}
- </h2>
- <h2 v-else>{{ $t("New title") }}</h2>
- <div>
- <form @submit="onSubmit($event)">
- <fieldset class="rows">
- <ol>
- <li v-if="title.title_id">
- <label for="title_title_id"
- >{{ $t("Title identifier") }}:</label
- >
- <input
- id="title_title_id"
- v-model="title.title_id"
- :placeholder="$t('Title identifier')"
- />
- </li>
-
- <li>
- <label class="required" for="title_name"
- >{{ $t("Publication title") }}:</label
- >
- <input
- id="title_publication_title"
- v-model="title.publication_title"
- :placeholder="$t('Publication title')"
- required
- />
- <span class="required">{{ $t("Required") }}</span>
- </li>
-
- <li>
- <label for="title_print_identifier"
- >{{ $t("Print-format identifier") }}:</label
- >
- <input
- id="title_print_identifier"
- v-model="title.print_identifier"
- :placeholder="$t('Print-format identifier')"
- />
- </li>
-
- <li>
- <label for="title_online_identifier"
- >{{ $t("Online-format identifier") }}:</label
- >
- <input
- id="title_online_identifier"
- v-model="title.online_identifier"
- :placeholder="$t('Online-format identifier')"
- />
- </li>
-
- <li>
- <label for="title_date_first_issue_online"
- >{{
- $t(
- "Date of first serial issue available online"
- )
- }}:</label
- >
- <input
- id="title_date_first_issue_online"
- v-model="title.date_first_issue_online"
- :placeholder="
- $t(
- 'Date of first serial issue available online'
- )
- "
- />
- </li>
-
- <li>
- <label for="title_num_first_vol_online"
- >{{
- $t(
- "Number of first volume available online"
- )
- }}:</label
- >
- <input
- id="title_num_first_vol_online"
- v-model="title.num_first_vol_online"
- :placeholder="
- $t(
- 'Number of first volume available online'
- )
- "
- />
- </li>
-
- <li>
- <label for="title_num_first_issue_online"
- >{{
- $t(
- "Number of first issue available online"
- )
- }}:</label
- >
- <input
- id="title_num_first_issue_online"
- v-model="title.num_first_issue_online"
- :placeholder="
- $t('Number of first issue available online')
- "
- />
- </li>
-
- <li>
- <label for="title_date_last_issue_online"
- >{{
- $t("Date of last issue available online")
- }}:</label
- >
- <input
- id="title_date_last_issue_online"
- v-model="title.date_last_issue_online"
- :placeholder="
- $t('Date of last issue available online')
- "
- />
- </li>
-
- <li>
- <label for="title_num_last_vol_online"
- >{{
- $t(
- "Number of last volume available online"
- )
- }}:</label
- >
- <input
- id="title_num_last_vol_online"
- v-model="title.num_last_vol_online"
- :placeholder="
- $t('Number of last volume available online')
- "
- />
- </li>
-
- <li>
- <label for="title_num_last_issue_online"
- >{{
- $t("Number of last issue available online")
- }}:</label
- >
- <input
- id="title_num_last_issue_online"
- v-model="title.num_last_issue_online"
- :placeholder="
- $t('Number of last issue available online')
- "
- />
- </li>
-
- <li>
- <label for="title_title_url"
- >{{ $t("Title-level URL") }}:</label
- >
- <input
- id="title_title_url"
- v-model="title.title_url"
- :placeholder="$t('Title-level URL')"
- />
- </li>
-
- <li>
- <label for="title_first_author"
- >{{ $t("First author") }}:</label
- >
- <input
- id="title_first_author"
- v-model="title.first_author"
- :placeholder="$t('First author')"
- />
- </li>
-
- <li>
- <label for="title_embargo_info"
- >{{ $t("Embargo information") }}:</label
- >
- <input
- id="title_embargo_info"
- v-model="title.embargo_info"
- :placeholder="$t('Embargo information')"
- />
- </li>
-
- <li>
- <label for="title_coverage_depth"
- >{{ $t("Coverage depth") }}:</label
- >
- <input
- id="title_coverage_depth"
- v-model="title.coverage_depth"
- :placeholder="$t('Coverage depth')"
- />
- </li>
-
- <li>
- <label for="title_notes">{{ $t("Notes") }}:</label>
- <input
- id="title_notes"
- v-model="title.notes"
- :placeholder="$t('Notes')"
- />
- </li>
-
- <li>
- <label for="title_publisher_name"
- >{{ $t("Publisher name") }}:</label
- >
- <input
- id="title_publisher_name"
- v-model="title.publisher_name"
- :placeholder="$t('Publisher name')"
- />
- </li>
-
- <li>
- <label for="title_publication_type"
- >{{ $t("Publication type") }}:</label
- >
- <select
- id="title_publication_type"
- v-model="title.publication_type"
- >
- <option value=""></option>
- <option
- v-for="type in av_title_publication_types"
- :key="type.authorised_values"
- :value="type.authorised_value"
- :selected="
- type.authorised_value ==
- title.publication_type
- ? true
- : false
- "
- >
- {{ type.lib }}
- </option>
- </select>
- </li>
-
- <li>
- <label for="title_date_monograph_published_print"
- >{{
- $t(
- "Date the monograph is first published in print"
- )
- }}:</label
- >
- <input
- id="title_date_monograph_published_print"
- v-model="title.date_monograph_published_print"
- :placeholder="
- $t(
- 'Date the monograph is first published in print'
- )
- "
- />
- </li>
-
- <li>
- <label for="title_date_monograph_published_online"
- >{{
- $t(
- "Date the monograph is first published online"
- )
- }}:</label
- >
- <input
- id="title_date_monograph_published_online"
- v-model="title.date_monograph_published_online"
- :placeholder="
- $t(
- 'Date the monograph is first published online'
- )
- "
- />
- </li>
-
- <li>
- <label for="title_monograph_volume"
- >{{
- $t("Number of volume for monograph")
- }}:</label
- >
- <input
- id="title_monograph_volume"
- v-model="title.monograph_volume"
- :placeholder="
- $t('Number of volume for monograph')
- "
- />
- </li>
-
- <li>
- <label for="title_monograph_edition"
- >{{ $t("Edition of the monograph") }}:</label
- >
- <input
- id="title_monograph_edition"
- v-model="title.monograph_edition"
- :placeholder="$t('Edition of the monograph')"
- />
- </li>
-
- <li>
- <label for="title_first_editor"
- >{{ $t("First editor") }}:</label
- >
- <input
- id="title_first_editor"
- v-model="title.first_editor"
- :placeholder="$t('First editor')"
- />
- </li>
-
- <li>
- <label for="title_parent_publication_title_id"
- >{{
- $t(
- "Title identifier of the parent publication"
- )
- }}:</label
- >
- <input
- id="title_parent_publication_title_id"
- v-model="title.parent_publication_title_id"
- :placeholder="
- $t(
- 'Title identifier of the parent publication'
- )
- "
- />
- </li>
-
- <li>
- <label for="title_preceeding_publication_title_id"
- >{{
- $t(
- "Title identifier of any preceding publication title"
- )
- }}:</label
- >
- <input
- id="title_preceeding_publication_title_id"
- v-model="title.preceeding_publication_title_id"
- :placeholder="
- $t(
- 'Title identifier of any preceding publication title'
- )
- "
- />
- </li>
-
- <li>
- <label for="title_access_type"
- >{{
- // FIXME May be fee-based (P) or Open Access (F).
- $t("Access type")
- }}:</label
- >
- <input
- id="title_access_type"
- v-model="title.access_type"
- :placeholder="$t('Access type')"
- />
- </li>
-
- <EHoldingsTitlesFormAddResources
- :resources="title.resources"
- />
- </ol>
- </fieldset>
- <fieldset class="action">
- <input type="submit" value="Submit" />
- <router-link
- to="/cgi-bin/koha/erm/eholdings/titles"
- role="button"
- class="cancel"
- >{{ $t("Cancel") }}</router-link
- >
- </fieldset>
- </form>
- </div>
- </div>
-</template>
-
-<script>
-import { useVendorStore } from "../../stores/vendors"
-import { useAVStore } from "../../stores/authorised_values"
-import EHoldingsTitlesFormAddResources from "./EHoldingsTitlesFormAddResources.vue"
-import { setMessage, setError } from "../../messages"
-import { fetchTitle } from '../../fetch'
-import { storeToRefs } from "pinia"
-
-export default {
- setup() {
- const vendorStore = useVendorStore()
- const { vendors } = storeToRefs(vendorStore)
-
- const AVStore = useAVStore()
- const { av_title_publication_types } = storeToRefs(AVStore)
- const { get_lib_from_av } = AVStore
-
- return {
- vendors,
- av_title_publication_types,
- get_lib_from_av,
- }
- },
- data() {
- return {
- title: {
- title_id: null,
- publication_title: '',
- external_id: '',
- print_identifier: '',
- online_identifier: '',
- date_first_issue_online: '',
- num_first_vol_online: '',
- num_first_issue_online: '',
- date_last_issue_online: '',
- num_last_vol_online: '',
- num_last_issue_online: '',
- title_url: '',
- first_author: '',
- embargo_info: '',
- coverage_depth: '',
- notes: '',
- publisher_name: '',
- publication_type: '',
- date_monograph_published_print: '',
- date_monograph_published_online: '',
- monograph_volume: '',
- monograph_edition: '',
- first_editor: '',
- parent_publication_title_id: '',
- preceeding_publication_title_id: '',
- access_type: '',
- resources: [],
- },
- initialized: false,
- }
- },
- beforeRouteEnter(to, from, next) {
- next(vm => {
- if (to.params.title_id) {
- vm.title = vm.getTitle(to.params.title_id)
- } else {
- vm.initialized = true
- }
- })
- },
- methods: {
- async getTitle(title_id) {
- const title = await fetchTitle(title_id)
- this.title = title
- this.initialized = true
- },
- onSubmit(e) {
- e.preventDefault()
-
- let title = JSON.parse(JSON.stringify(this.title)) // copy
- let apiUrl = '/api/v1/erm/eholdings/titles'
-
- let method = 'POST'
- if (title.title_id) {
- method = 'PUT'
- apiUrl += '/' + title.title_id
- }
- delete title.title_id
- delete title.biblio_id
-
- title.resources.forEach(r => {
- r.started_on = r.started_on ? $date_to_rfc3339(r.started_on) : null
- r.ended_on = r.ended_on ? $date_to_rfc3339(r.ended_on) : null
- })
-
- // Cannot use the map/keepAttrs because of the reserved keywork 'package'
- title.resources.forEach(function (e) { delete e.package; delete e.resource_id })
-
- const options = {
- method: method,
- body: JSON.stringify(title),
- headers: {
- 'Content-Type': 'application/json;charset=utf-8'
- },
- }
-
- fetch(apiUrl, options)
- .then(response => {
- if (response.status == 200) {
- this.$router.push("/cgi-bin/koha/erm/eholdings/titles")
- setMessage(this.$t("Title updated"))
- } else if (response.status == 201) {
- this.$router.push("/cgi-bin/koha/erm/eholdings/titles")
- setMessage(this.$t("Title created"))
- } else {
- setError(response.message || response.statusText)
- }
- }, (error) => {
- setError(error)
- }).catch(e => { console.log(e) })
- },
- },
- components: { EHoldingsTitlesFormAddResources },
- name: "EHoldingsTitlesFormAdd",
-}
-</script>
-<style scoped>
-fieldset.rows label {
- width: 25rem;
-}
-</style>
+++ /dev/null
-<template>
- <fieldset class="rows" id="resources">
- <legend>{{ $t("Packages") }}</legend>
- <fieldset
- class="rows"
- v-for="(resource, counter) in resources"
- v-bind:key="counter"
- >
- <legend>
- {{ $t("Package .counter", { counter: counter + 1 }) }}
- <a href="#" @click.prevent="deletePackage(counter)"
- ><i class="fa fa-trash"></i>
- {{ $t("Remove from this package") }}</a
- >
- </legend>
- <ol>
- <li>
- <label :for="`resource_id_${counter}`" class="required"
- >{{ $t("Package") }}:
- </label>
- <select
- v-model="resource.package_id"
- :id="`resource_id_${counter}`"
- required
- >
- <option value=""></option>
- <option
- v-for="p in packages"
- :key="p.package_id"
- :value="p.package_id"
- :selected="
- p.package_id == resource.package_id
- ? true
- : false
- "
- >
- {{ p.name }}
- </option>
- </select>
- <span class="required">{{ $t("Required") }}</span>
- </li>
- <li>
- <label for="title_vendor_id">{{ $t("Vendor") }}:</label>
- <select id="title_vendor_id" v-model="resource.vendor_id">
- <option value=""></option>
- <option
- v-for="vendor in vendors"
- :key="vendor.vendor_id"
- :value="vendor.id"
- :selected="
- vendor.id == resource.vendor_id ? true : false
- "
- >
- {{ vendor.name }}
- </option>
- </select>
- </li>
-
- <li>
- <label :for="`started_on_${counter}`"
- >{{ $t("Start date") }}:
- </label>
- <flat-pickr
- :id="`started_on_${counter}`"
- v-model="resource.started_on"
- :config="fp_config"
- :data-date_to="`ended_on_${counter}`"
- />
- </li>
- <li>
- <label :for="`ended_on_${counter}`"
- >{{ $t("End date") }}:</label
- >
- <flat-pickr
- :id="`ended_on_${counter}`"
- v-model="resource.ended_on"
- :config="fp_config"
- />
- </li>
- <li>
- <label :for="`${counter}`">{{ $t("Proxy") }}:</label>
- <input
- :id="`proxy_${counter}`"
- v-model="resource.proxy"
- :placeholder="$t('Proxy')"
- />
- </li>
- </ol>
- </fieldset>
- <a v-if="packages.length" class="btn btn-default" @click="addPackage"
- ><font-awesome-icon icon="plus" />
- {{ $t("Add to another package") }}</a
- >
- <span v-else>{{ $t("There are no packages created yet") }}</span>
- </fieldset>
-</template>
-
-<script>
-import flatPickr from 'vue-flatpickr-component'
-import { useVendorStore } from "../../stores/vendors"
-import { storeToRefs } from "pinia"
-import { fetchPackages } from "../../fetch"
-
-export default {
- setup() {
- const vendorStore = useVendorStore() // FIXME We only need that for 'manual'
- const { vendors } = storeToRefs(vendorStore)
- return { vendors }
- },
- data() {
- return {
- packages: [],
- fp_config: flatpickr_defaults,
- dates_fixed: 0,
- }
- },
- beforeCreate() {
- fetchPackages().then((packages) => this.packages = packages)
- if (!this.dates_fixed) {
- this.resources.forEach(r => {
- r.started_on = $date(r.started_on)
- r.ended_on = $date(r.ended_on)
- })
- this.dates_fixed = 1
- }
- },
- methods: {
- addPackage() {
- this.resources.push({
- package_id: null,
- vendor_id: null,
- started_on: null,
- ended_on: null,
- proxy: '',
- })
- },
- deletePackage(counter) {
- this.resources.splice(counter, 1)
- },
- },
- props: {
- resources: Array,
- },
- components: { flatPickr },
- name: 'EHoldingsResources',
-}
-</script>
+++ /dev/null
-<template>
- <div v-if="!initialized">{{ $t("Loading") }}</div>
- <div v-else id="eholdings_confirm_delete">
- <h2>{{ $t("Delete title") }}</h2>
- <div>
- <form @submit="onSubmit($event)">
- <fieldset class="rows">
- <ol>
- <li>
- {{ $t("Title") }}:
- {{ eholding.publication_title }}
- </li>
- </ol>
- </fieldset>
- <fieldset class="action">
- <input
- type="submit"
- variant="primary"
- :value="$t('Yes, delete')"
- />
- <router-link
- to="/cgi-bin/koha/erm/eholdings/titles"
- role="button"
- class="cancel"
- >{{ $t("No, do not delete") }}</router-link
- >
- </fieldset>
- </form>
- </div>
- </div>
-</template>
-
-<script>
-import { fetchTitle } from "../../fetch"
-import { setMessage, setError } from "../../messages"
-
-export default {
- data() {
- return {
- eholding: {},
- initialized: false,
- }
- },
- beforeRouteEnter(to, from, next) {
- next(vm => {
- vm.getEHolding(to.params.title_id)
- })
- },
- methods: {
- async getEHolding(title_id) {
- const eholding = await fetchTitle(title_id)
- this.eholding = eholding
- this.initialized = true
- },
- onSubmit(e) {
- e.preventDefault()
-
- let apiUrl = '/api/v1/erm/eholdings/titles/' + this.eholding.title_id
-
- const options = {
- method: 'DELETE',
- headers: {
- 'Content-Type': 'application/json;charset=utf-8'
- },
- }
-
- fetch(apiUrl, options)
- .then(
- (response) => {
- if (response.status == 204) {
- setMessage(this.$t("Title deleted"))
- this.$router.push("/cgi-bin/koha/erm/eholdings/titles")
- } else {
- setError(response.message || response.statusText)
- }
- }
- ).catch(
- (error) => {
- setError(error)
- }
- )
- }
- },
- name: "EHoldingsTitlesFormConfirmDelete",
-}
-</script>
+++ /dev/null
-<template>
- <div v-if="erm_provider == 'manual'">
- <div v-if="!this.initialized">{{ $t("Loading") }}</div>
- <div v-else-if="this.titles" id="titles_list">
- <Toolbar />
- <div v-if="this.titles.length" id="title_list_result">
- <table v-if="this.titles.length" id="title_list"></table>
- </div>
- <div v-else-if="this.initialized" class="dialog message">
- {{ $t("There are no titles defined") }}
- </div>
- </div>
- </div>
- <div v-else>
- <fieldset>
- {{ $t("Publication title") }}:
- <input
- type="text"
- id="publication_title_filter"
- v-model="filters.publication_title"
- @keyup.enter="filter_table"
- />
- {{ $t("Publication type") }}:
- <select
- id="publication_type_filter"
- v-model="filters.publication_type"
- >
- <option value="">{{ $t("All") }}</option>
- <option
- v-for="type in av_title_publication_types"
- :key="type.authorised_values"
- :value="type.authorised_value"
- >
- {{ type.lib }}
- </option>
- </select>
- {{ $t("Selection status") }}:
- <select id="selection_type_filter" v-model="filters.selection_type">
- <option value="0">{{ $t("All") }}</option>
- <option value="1">{{ $t("Selected") }}</option>
- <option value="2">{{ $t("Not selected") }}</option>
- </select>
- <input
- @click="filter_table"
- id="filter_table"
- type="button"
- :value="$t('Submit')"
- />
- <span v-if="cannot_search">{{
- $t("Please enter a search term")
- }}</span>
- </fieldset>
- <div id="title_list_result" style="display: none">
- <table id="title_list"></table>
- </div>
- </div>
-</template>
-
-<script>
-import Toolbar from "./EHoldingsTitlesToolbar.vue"
-import { createVNode, render } from 'vue'
-import { useVendorStore } from "../../stores/vendors"
-import { useAVStore } from "../../stores/authorised_values"
-import { storeToRefs } from "pinia"
-import { fetchTitles } from "../../fetch"
-
-export default {
- setup() {
- const vendorStore = useVendorStore()
- const { vendors } = storeToRefs(vendorStore)
-
- const AVStore = useAVStore()
- const { av_title_publication_types } = storeToRefs(AVStore)
- const { get_lib_from_av } = AVStore
-
- return {
- vendors,
- av_title_publication_types,
- get_lib_from_av,
- }
- },
- data: function () {
- return {
- titles: [],
- initialized: false,
- filters: {
- publication_title: this.$route.query.q || "",
- publication_type: "",
- selection_type: "",
- },
- cannot_search: false,
- }
- },
- beforeRouteEnter(to, from, next) {
- next(vm => {
- vm.getTitles().then(() => vm.build_datatable())
- })
- },
- inject: ['erm_provider'],
- methods: {
- async getTitles() {
- if (erm_provider == 'manual') {
- const titles = await fetchTitles()
- this.titles = titles
- }
- this.initialized = true
- },
- show_title: function (title_id) {
- this.$router.push("/cgi-bin/koha/erm/eholdings/titles/" + title_id)
- },
- edit_title: function (title_id) {
- this.$router.push("/cgi-bin/koha/erm/eholdings/titles/edit/" + title_id)
- },
- delete_title: function (title_id) {
- this.$router.push("/cgi-bin/koha/erm/eholdings/titles/delete/" + title_id)
- },
- filter_table: function () {
- if (this.filters.publication_title.length) {
- this.cannot_search = false
- $("#title_list_result").show()
- $("#title_list").DataTable().draw()
- } else {
- this.cannot_search = true
- }
- },
- build_datatable: function () {
- let show_title = this.show_title
- let edit_title = this.edit_title
- let delete_title = this.delete_title
- let get_lib_from_av = this.get_lib_from_av
- let filters = this.filters
-
- window['vendors'] = this.vendors.map(e => {
- e['_id'] = e['id']
- e['_str'] = e['name']
- return e
- })
- let vendors_map = this.vendors.reduce((map, e) => {
- map[e.id] = e
- return map
- }, {})
- window['av_title_publication_types'] = this.av_title_publication_types.map(e => {
- e['_id'] = e['authorised_value']
- e['_str'] = e['lib']
- return e
- })
-
- let additional_filters = {}
- if (erm_provider != 'manual') {
- additional_filters = {
- publication_title: function () {
- return filters.publication_title || ""
- },
- publication_type: function () {
- return filters.content_type_search || ""
- },
- selection_type: function () {
- return filters.selection_type || ""
- },
- }
- }
- $('#title_list').kohaTable({
- "ajax": {
- "url": "/api/v1/erm/eholdings/titles",
- },
- embed: ["resources.package"],
- ...(erm_provider == 'manual' ? { order: [[0, "asc"]] } : {}),
- ...(erm_provider != 'manual' ? { ordering: false } : {}),
- ...(erm_provider == 'manual' ? { search: { search: filters.publication_title } } : {}),
- ...(erm_provider != 'manual' ? { dom: '<"top pager"<"table_entries"ilp>>tr<"bottom pager"ip>' } : {}),
- ...(erm_provider != 'manual' ? { aLengthMenu: [[10, 20, 50, 100], [10, 20, 50, 100]] } : {}),
- ...(erm_provider != 'manual' ? { deferLoading: true } : {}),
- autoWidth: false,
- "columns": [
- {
- "title": __("Title"),
- "data": "me.publication_title",
- "searchable": (erm_provider == 'manual'),
- "orderable": (erm_provider == 'manul'),
- "render": function (data, type, row, meta) {
- // Rendering done in drawCallback
- return ""
- }
- },
- {
- "title": __("Vendor"),
- "data": "vendor_id",
- "searchable": (erm_provider == 'manual'),
- "orderable": (erm_provider == 'manul'),
- "render": function (data, type, row, meta) {
- return row.vendor_id != undefined ? escape_str(vendors_map[row.vendor_id].name) : ""
- }
- },
- {
- "title": __("Publication type"),
- "data": "publication_type",
- "searchable": (erm_provider == 'manual'),
- "orderable": (erm_provider == 'manul'),
- "render": function (data, type, row, meta) {
- return escape_str(get_lib_from_av("av_title_publication_types", row.publication_type))
- }
- },
- {
- "title": __("Identifier"),
- "data": "print_identifier:online_identifier",
- "searchable": (erm_provider == 'manual'),
- "orderable": (erm_provider == 'manul'),
- "render": function (data, type, row, meta) {
- let print_identifier = row.print_identifier
- let online_identifier = row.online_identifier
- return (print_identifier ? escape_str(_("ISBN (Print): %s").format(print_identifier)) : "") +
- (online_identifier ? escape_str(_("ISBN (Online): %s").format(online_identifier)) : "")
- }
- },
- erm_provider == 'manual' ? {
- "title": __("Actions"),
- "data": function (row, type, val, meta) {
- return '<div class="actions"></div>'
- },
- "className": "actions noExport",
- "searchable": false,
- "orderable": false
- } : null,
- ].filter(Boolean),
- drawCallback: function (settings) {
-
- var api = new $.fn.dataTable.Api(settings)
-
- $.each($(this).find("td .actions"), function (index, e) {
- let title_id = api.row(index).data().title_id
- let editButton = createVNode("a", {
- class: "btn btn-default btn-xs", role: "button", onClick: () => {
- edit_title(title_id)
- }
- },
- [createVNode("i", { class: "fa fa-pencil", 'aria-hidden': "true" }), __("Edit")])
-
- let deleteButton = createVNode("a", {
- class: "btn btn-default btn-xs", role: "button", onClick: () => {
- delete_title(title_id)
- }
- },
- [createVNode("i", { class: "fa fa-trash", 'aria-hidden': "true" }), __("Delete")])
-
- let n = createVNode('span', {}, [editButton, " ", deleteButton])
- render(n, e)
- })
-
- $.each($(this).find("tbody tr td:first-child"), function (index, e) {
- let row = api.row(index).data()
- if (!row) return // Happen if the table is empty
- let n = createVNode("a", {
- role: "button",
- onClick: (e) => {
- e.preventDefault()
- show_title(row.title_id)
- }
- },
- `${row.publication_title} (#${row.title_id})`
- )
- // TODO? We don't have is_selected at title level
- //if (row.is_selected) {
- // n = createVNode('span', {}, [n, " ", createVNode("i", { class: "fa fa-check-square-o", style: { color: "green" }, title: __("Is selected") })])
- //}
- render(n, e)
- })
- },
- ...(erm_provider == 'manual' ? {
- preDrawCallback: function (settings) {
- var table_id = settings.nTable.id
- $("#" + table_id).find("thead th").eq(1).attr('data-filter', 'vendors')
- }
- } : {}),
- }, eholdings_titles_table_settings, erm_provider == 'manual' ? 1 : 0, additional_filters)
-
- if (erm_provider != 'manual') {
- if (filters.publication_title.length) {
- this.filter_table()
- }
- }
- },
- },
- beforeUnmount() {
- //$('#title_list')
- // .DataTable()
- // .destroy(true)
- },
- components: { Toolbar },
- name: "EHoldingsTitlesList",
-}
-</script>
+++ /dev/null
-<template>
- <div v-if="!initialized">{{ $t("Loading") }}</div>
- <div v-else-if="title" id="eholdings_title_show">
- <h2>
- {{ $t("Title .id", { id: title.title_id }) }}
- <span v-if="erm_provider == 'manual'" class="action_links">
- <router-link
- :to="`/cgi-bin/koha/erm/eholdings/titles/edit/${title.title_id}`"
- :title="$t('Edit')"
- ><i class="fa fa-pencil"></i
- ></router-link>
-
- <router-link
- :to="`/cgi-bin/koha/erm/eholdings/titles/delete/${title.title_id}`"
- :title="$t('Delete')"
- ><i class="fa fa-trash"></i
- ></router-link>
- </span>
- </h2>
- <div>
- <fieldset class="rows">
- <ol>
- <li v-if="title.title_id">
- <label>{{ $t("Title identifier") }}:</label>
- <span>
- {{ title.title_id }}
- </span>
- </li>
- <li>
- <label>{{ $t("Publication title") }}:</label>
- <span>
- {{ title.publication_title }}
- <a
- v-if="title.biblio_id"
- :href="`/cgi-bin/koha/catalogue/detail.pl?biblionumber=${title.biblio_id}`"
- >
- {{ $t("Local bibliographic record") }}
- </a>
- </span>
- </li>
- <li v-if="title.print_identifier">
- <label>{{ $t("Print-format identifier") }}:</label>
- <span>
- {{ title.print_identifier }}
- </span>
- </li>
- <li v-if="title.online_identifier">
- <label>{{ $t("Online-format identifier") }}:</label>
- <span>
- {{ title.online_identifier }}
- </span>
- </li>
- <li v-if="title.date_first_issue_online">
- <label
- >{{
- $t(
- "Date of first serial issue available online"
- )
- }}:</label
- >
- <span>
- {{ title.date_first_issue_online }}
- </span>
- </li>
- <li v-if="title.num_first_vol_online">
- <label
- >{{
- $t("Number of first volume available online")
- }}:</label
- >
- <span>
- {{ title.num_first_vol_online }}
- </span>
- </li>
- <li v-if="title.num_first_issue_online">
- <label
- >{{
- $t("Number of first issue available online")
- }}:</label
- >
- <span>
- {{ title.num_first_issue_online }}
- </span>
- </li>
- <li v-if="title.date_last_issue_online">
- <label
- >{{
- $t("Date of last issue available online")
- }}:</label
- >
- <span>
- {{ title.date_last_issue_online }}
- </span>
- </li>
- <li v-if="title.num_last_vol_online">
- <label
- >{{
- $t("Number of last volume available online")
- }}:</label
- >
- <span>
- {{ title.num_last_vol_online }}
- </span>
- </li>
- <li v-if="title.num_last_issue_online">
- <label
- >{{
- $t("Number of last issue available online")
- }}:</label
- >
- <span>
- {{ title.num_last_issue_online }}
- </span>
- </li>
- <li v-if="title.title_url">
- <label>{{ $t("Title-level URL") }}:</label>
- <span>
- {{ title.title_url }}
- </span>
- </li>
- <li v-if="title.first_author">
- <label>{{ $t("First author") }}:</label>
- <span>
- {{ title.first_author }}
- </span>
- </li>
- <li v-if="title.embargo_info">
- <label>{{ $t("Embargo information") }}:</label>
- <span>
- {{ title.embargo_info }}
- </span>
- </li>
- <li v-if="title.coverage_depth">
- <label>{{ $t("Coverage depth") }}:</label>
- <span>
- {{ title.coverage_depth }}
- </span>
- </li>
- <li v-if="title.notes">
- <label>{{ $t("Notes") }}:</label>
- <span>
- {{ title.notes }}
- </span>
- </li>
- <li v-if="title.publisher_name">
- <label>{{ $t("Publisher name") }}:</label>
- <span>
- {{ title.publisher_name }}
- </span>
- </li>
- <li v-if="title.publication_type">
- <label>{{ $t("Publication type") }}:</label>
- <span
- >{{
- get_lib_from_av(
- "av_title_publication_types",
- title.publication_type
- )
- }}
- </span>
- </li>
- <li v-if="title.date_monograph_published_print">
- <label
- >{{
- $t(
- "Date the monograph is first published in print"
- )
- }}:</label
- >
- <span>
- {{ title.date_monograph_published_print }}
- </span>
- </li>
- <li v-if="title.date_monograph_published_online">
- <label
- >{{
- $t(
- "Date the monograph is first published online"
- )
- }}:</label
- >
- <span>
- {{ title.date_monograph_published_online }}
- </span>
- </li>
- <li v-if="title.monograph_volume">
- <label
- >{{ $t("Number of volume for monograph") }}:</label
- >
- <span>
- {{ title.monograph_volume }}
- </span>
- </li>
- <li v-if="title.monograph_edition">
- <label>{{ $t("Edition of the monograph") }}:</label>
- <span>
- {{ title.monograph_edition }}
- </span>
- </li>
- <li v-if="title.first_editor">
- <label>{{ $t("First editor") }}:</label>
- <span>
- {{ title.first_editor }}
- </span>
- </li>
- <li v-if="title.parent_publication_title_id">
- <label
- >{{
- $t(
- "Title identifier of the parent publication"
- )
- }}:</label
- >
- <span>
- {{ title.parent_publication_title_id }}
- </span>
- </li>
- <li v-if="title.preceeding_publication_title_id">
- <label
- >{{
- $t(
- "Title identifier of any preceding publication title"
- )
- }}:</label
- >
- <span>
- {{ title.preceeding_publication_title_id }}
- </span>
- </li>
- <li v-if="title.access_type">
- <label>{{ $t("Acces type") }}:</label>
- <span>
- {{ title.access_type }}
- </span>
- </li>
- <li>
- <label>Packages ({{ title.resources.length }})</label>
- <div v-if="title.resources.length">
- <EHoldingsTitlePackagesList
- :resources="title.resources"
- />
- </div>
- </li>
- </ol>
- </fieldset>
- <fieldset class="action">
- <router-link
- to="/cgi-bin/koha/erm/eholdings/titles"
- role="button"
- class="cancel"
- >{{ $t("Close") }}</router-link
- >
- </fieldset>
- </div>
- </div>
-</template>
-
-<script>
-import EHoldingsTitlePackagesList from "./EHoldingsTitlePackagesList.vue"
-import { fetchTitle } from "../../fetch"
-import { useAVStore } from "../../stores/authorised_values"
-export default {
- setup() {
- const AVStore = useAVStore()
- const { get_lib_from_av } = AVStore
-
- return {
- get_lib_from_av,
- }
- },
- data() {
- return {
- title: {
- title_id: null,
- publication_title: '',
- external_id: '',
- print_identifier: '',
- online_identifier: '',
- date_first_issue_online: '',
- num_first_vol_online: '',
- num_first_issue_online: '',
- date_last_issue_online: '',
- num_last_vol_online: '',
- num_last_issue_online: '',
- title_url: '',
- first_author: '',
- embargo_info: '',
- coverage_depth: '',
- notes: '',
- publisher_name: '',
- publication_type: '',
- date_monograph_published_print: '',
- date_monograph_published_online: '',
- monograph_volume: '',
- monograph_edition: '',
- first_editor: '',
- parent_publication_title_id: '',
- preceeding_publication_title_id: '',
- access_type: '',
- resources: [],
- },
- initialized: false,
- }
- },
- inject: ['erm_provider'],
- beforeRouteEnter(to, from, next) {
- next(vm => {
- vm.getTitle(to.params.title_id)
- })
- },
- beforeRouteUpdate(to, from) {
- this.title = this.getTitle(to.params.title_id)
- },
- methods: {
- async getTitle(title_id) {
- const title = await fetchTitle(title_id)
- this.title = title
- this.initialized = true
- },
- },
- components: {
- EHoldingsTitlePackagesList,
- },
- name: "EHoldingsTitlesShow",
-}
-</script>
-<style scoped>
-.action_links a {
- padding-left: 0.2em;
- font-size: 11px;
-}
-fieldset.rows label {
- width: 25rem;
-}
-</style>
+++ /dev/null
-<template>
- <router-link to="/cgi-bin/koha/erm/eholdings/titles/add" class="btn btn-default"
- ><font-awesome-icon icon="plus" />
- {{ $t("New title") }}</router-link
- >
-</template>
-
-<script>
-export default {
- name: "EHoldingsTitleToolbar",
-}
-</script>
</li>
<li>
<router-link
- to="/cgi-bin/koha/erm/eholdings"
+ to="/cgi-bin/koha/erm/licenses"
>
<i class="fa fa-file-text-o"></i>
- eHoldings
- </router-link>
- <ul>
- <li>
- <router-link
- to="/cgi-bin/koha/erm/eholdings/packages"
- >
- <i
- class="fa fa-file-text-o"
- ></i>
- {{
- $t("Packages")
- }}</router-link
- >
- </li>
- <li>
- <router-link
- to="/cgi-bin/koha/erm/eholdings/titles"
- >
- <i
- class="fa fa-file-text-o"
- ></i>
- {{ $t("Titles") }}</router-link
- >
- </li>
- </ul>
+ {{ $t("Licenses") }}</router-link
+ >
</li>
<li>
<router-link
- to="/cgi-bin/koha/erm/licenses"
+ to="/cgi-bin/koha/erm/eholdings"
>
<i class="fa fa-file-text-o"></i>
- {{ $t("Licenses") }}</router-link
+ {{ $t("eHoldings") }}</router-link
>
</li>
+
+ <ul>
+ <li
+ v-for="provider in erm_providers"
+ :key="provider"
+ >
+ <router-link
+ v-if="provider == 'local'"
+ :to="`/cgi-bin/koha/erm/eholdings/local`"
+ >
+ <i class="fa fa-file-text-o"></i>
+ {{ $t("Local") }}</router-link
+ >
+ <router-link
+ v-else-if="provider == 'ebsco'"
+ :to="`/cgi-bin/koha/erm/eholdings/ebsco`"
+ >
+ <i class="fa fa-file-text-o"></i>
+ {{ $t("EBSCO") }}</router-link
+ >
+ <ul>
+ <li>
+ <router-link
+ :to="`/cgi-bin/koha/erm/eholdings/${provider}/packages`"
+ >
+ <i
+ class="
+ fa fa-file-text-o
+ "
+ ></i>
+ {{
+ $t("Packages")
+ }}</router-link
+ >
+ </li>
+ <li>
+ <router-link
+ :to="`/cgi-bin/koha/erm/eholdings/${provider}/titles`"
+ >
+ <i
+ class="
+ fa fa-file-text-o
+ "
+ ></i>
+ {{
+ $t("Titles")
+ }}</router-link
+ >
+ </li>
+ </ul>
+ </li>
+ </ul>
</ul>
</div>
</div>
return {
vendorStore,
+ erm_providers,
}
},
- provide: {
- erm_provider
- },
data() {
return {
component: "agreement",
return vendors;
};
-export const fetchPackage = async function (package_id) {
+const _fetchPackage = async function (apiUrl, package_id) {
if (!package_id) return;
- const apiUrl = "/api/v1/erm/eholdings/packages/" + package_id;
let erm_package;
await fetch(apiUrl, {
headers: {
);
return erm_package;
};
+export const fetchLocalPackage = function (package_id) {
+ const apiUrl = "/api/v1/erm/eholdings/local/packages/" + package_id;
+ return _fetchPackage(apiUrl, package_id);
+};
+export const fetchEBSCOPackage = function (package_id) {
+ const apiUrl = "/api/v1/erm/eholdings/ebsco/packages/" + package_id;
+ return _fetchPackage(apiUrl, package_id);
+};
-export const fetchPackages = async function () {
- const apiUrl = "/api/v1/erm/eholdings/packages";
+export const _fetchPackages = async function (apiUrl) {
let packages;
await fetch(apiUrl, {
headers: {
);
return packages;
};
+export const fetchLocalPackages = function () {
+ const apiUrl = "/api/v1/erm/eholdings/local/packages";
+ return _fetchPackages(apiUrl);
+};
+export const fetchEBSCOPackages = function () {
+ const apiUrl = "/api/v1/erm/eholdings/ebsco/packages";
+ return _fetchPackages(apiUrl);
+};
-export const fetchTitle = async function (title_id) {
+export const _fetchTitle = async function (apiUrl, title_id) {
if (!title_id) return;
- const apiUrl = "/api/v1/erm/eholdings/titles/" + title_id;
let title;
await fetch(apiUrl, {
headers: {
);
return title;
};
+export const fetchLocalTitle = function (title_id) {
+ const apiUrl = "/api/v1/erm/eholdings/local/titles/" + title_id;
+ return _fetchTitle(apiUrl, title_id);
+};
+export const fetchEBSCOTitle = function (title_id) {
+ const apiUrl = "/api/v1/erm/eholdings/ebsco/titles/" + title_id;
+ return _fetchTitle(apiUrl, title_id);
+};
-export const fetchTitles = async function () {
- const apiUrl = "/api/v1/erm/eholdings/titles";
+export const _fetchTitles = async function (apiUrl) {
let titles;
await fetch(apiUrl)
.then(checkError)
);
return titles;
};
+export const fetchLocalTitles = function () {
+ const apiUrl = "/api/v1/erm/eholdings/local/titles";
+ return _fetchTitles(apiUrl);
+};
+export const fetchEBSCOTitles = function () {
+ const apiUrl = "/api/v1/erm/eholdings/ebsco/titles";
+ return _fetchTitles(apiUrl);
+};
-export const fetchResource = async function (resource_id) {
+export const _fetchResource = async function (apiUrl, resource_id) {
if (!resource_id) return;
- const apiUrl = "/api/v1/erm/eholdings/resources/" + resource_id;
let resource;
await fetch(apiUrl, {
headers: {
);
return resource;
};
+export const fetchLocalResource = function (resource_id) {
+ const apiUrl = "/api/v1/erm/eholdings/local/resources/" + resource_id;
+ return _fetchResource(apiUrl, resource_id);
+};
+export const fetchEBSCOResource = function (resource_id) {
+ const apiUrl = "/api/v1/erm/eholdings/ebsco/resources/" + resource_id;
+ return _fetchResource(apiUrl, resource_id);
+};
-export const fetchResources = async function () {
- const apiUrl = "/api/v1/erm/eholdings/resources";
+export const _fetchResources = async function (apiUrl) {
let resources;
await fetch(apiUrl)
.then(checkError)
return resources;
};
-export const fetchPackageResources = async function (package_id) {
- const apiUrl =
- "/api/v1/erm/eholdings/packages/" + package_id + "/resources";
- let resources;
- await fetch(apiUrl, {
- headers: {
- "x-koha-embed": "title.publication_title",
- },
- })
- .then(checkError)
- .then(
- (result) => {
- resources = result;
- },
- (error) => {
- setError(error);
- }
- );
- return resources;
+export const fetchLocalResources = function () {
+ const apiUrl = "/api/v1/erm/eholdings/local/resources";
+ return _fetchResources(apiUrl);
+};
+export const fetchEBSCOResources = function () {
+ const apiUrl = "/api/v1/erm/eholdings/ebsco/resources";
+ return _fetchResources(apiUrl);
};
function checkError(response) {
const messages = Object.assign(languages);
const i18n = createI18n({ locale: "en", messages });
-createApp(App)
+const app = createApp(App)
.use(createPinia())
.use(router)
.use(i18n)
- .component("font-awesome-icon", FontAwesomeIcon)
- .mount("#erm");
+ .component("font-awesome-icon", FontAwesomeIcon);
+app.config.unwrapInjectedRef = true
+app.mount("#erm");
const mainStore = useMainStore();
const { removeMessages } = mainStore;
router.beforeEach((to, from) => {
import AgreementsFormAdd from "./components/ERM/AgreementsFormAdd.vue";
import AgreementsFormConfirmDelete from "./components/ERM/AgreementsFormConfirmDelete.vue";
import EHoldingsMain from "./components/ERM/EHoldingsMain.vue";
-import EHoldingsPackagesList from "./components/ERM/EHoldingsPackagesList.vue";
-import EHoldingsPackagesShow from "./components/ERM/EHoldingsPackagesShow.vue";
-import EHoldingsPackagesFormAdd from "./components/ERM/EHoldingsPackagesFormAdd.vue";
-import EHoldingsPackagesFormConfirmDelete from "./components/ERM/EHoldingsPackagesFormConfirmDelete.vue";
-import EHoldingsResourcesShow from "./components/ERM/EHoldingsResourcesShow.vue";
-import EHoldingsTitlesList from "./components/ERM/EHoldingsTitlesList.vue";
-import EHoldingsTitlesShow from "./components/ERM/EHoldingsTitlesShow.vue";
-import EHoldingsTitlesFormAdd from "./components/ERM/EHoldingsTitlesFormAdd.vue";
-import EHoldingsTitlesFormConfirmDelete from "./components/ERM/EHoldingsTitlesFormConfirmDelete.vue";
+import EHoldingsLocalHome from "./components/ERM/EHoldingsLocalHome.vue";
+import EHoldingsLocalPackagesFormAdd from "./components/ERM/EHoldingsLocalPackagesFormAdd.vue";
+import EHoldingsLocalTitlesFormConfirmDelete from "./components/ERM/EHoldingsLocalTitlesFormConfirmDelete.vue";
+import EHoldingsLocalTitlesFormAdd from "./components/ERM/EHoldingsLocalTitlesFormAdd.vue";
+import EHoldingsLocalPackagesList from "./components/ERM/EHoldingsLocalPackagesList.vue";
+import EHoldingsLocalPackagesShow from "./components/ERM/EHoldingsLocalPackagesShow.vue";
+import EHoldingsLocalPackagesFormConfirmDelete from "./components/ERM/EHoldingsLocalPackagesFormConfirmDelete.vue";
+import EHoldingsLocalResourcesShow from "./components/ERM/EHoldingsLocalResourcesShow.vue";
+import EHoldingsLocalTitlesList from "./components/ERM/EHoldingsLocalTitlesList.vue";
+import EHoldingsLocalTitlesShow from "./components/ERM/EHoldingsLocalTitlesShow.vue";
+import EHoldingsEBSCOHome from "./components/ERM/EHoldingsEBSCOHome.vue";
+import EHoldingsEBSCOPackagesList from "./components/ERM/EHoldingsEBSCOPackagesList.vue";
+import EHoldingsEBSCOPackagesShow from "./components/ERM/EHoldingsEBSCOPackagesShow.vue";
+import EHoldingsEBSCOResourcesShow from "./components/ERM/EHoldingsEBSCOResourcesShow.vue";
+import EHoldingsEBSCOTitlesList from "./components/ERM/EHoldingsEBSCOTitlesList.vue";
+import EHoldingsEBSCOTitlesShow from "./components/ERM/EHoldingsEBSCOTitlesShow.vue";
import LicensesList from "./components/ERM/LicensesList.vue";
import LicensesShow from "./components/ERM/LicensesShow.vue";
import LicensesFormAdd from "./components/ERM/LicensesFormAdd.vue";
text: "eHoldings", // $t("eHoldings")
path: "/cgi-bin/koha/erm/eholdings",
},
- titles: {
- text: "Titles", // $t("Titles")
- path: "/cgi-bin/koha/erm/eholdings/titles",
+ local: {
+ home: {
+ text: "Local", // $t("Local")
+ path: "/cgi-bin/koha/erm/eholdings/local",
+ },
+ titles: {
+ text: "Titles", // $t("Titles")
+ path: "/cgi-bin/koha/erm/eholdings/local/titles",
+ },
+ packages: {
+ text: "Packages", // $t("Packages")
+ path: "/cgi-bin/koha/erm/eholdings/local/packages",
+ },
},
- packages: {
- text: "Packages", // $t("Packages")
- path: "/cgi-bin/koha/erm/eholdings/packages",
+ ebsco: {
+ home: {
+ text: "EBSCO", // $t("EBSCO")
+ path: "/cgi-bin/koha/erm/eholdings/ebsco",
+ },
+ titles: {
+ text: "Titles", // $t("Titles")
+ path: "/cgi-bin/koha/erm/eholdings/ebsco/titles",
+ },
+ packages: {
+ text: "Packages", // $t("Packages")
+ path: "/cgi-bin/koha/erm/eholdings/ebsco/packages",
+ },
},
},
licenses: {
breadcrumbs.erm_home,
breadcrumbs.eholdings.home,
],
+ eholdings_local: [
+ breadcrumbs.home,
+ breadcrumbs.erm_home,
+ breadcrumbs.eholdings.home,
+ breadcrumbs.eholdings.local.home,
+ ],
+ eholdings_ebsco: [
+ breadcrumbs.home,
+ breadcrumbs.erm_home,
+ breadcrumbs.eholdings.home,
+ breadcrumbs.eholdings.ebsco.home,
+ ],
licenses: [breadcrumbs.home, breadcrumbs.erm_home, breadcrumbs.licenses],
};
+
function build_breadcrumb(parent_breadcrumb, current) {
let breadcrumb = parent_breadcrumb.flat(Infinity);
if (current) {
{
path: "/cgi-bin/koha/erm/eholdings",
component: { render: () => h(RouterView) },
+ meta: {
+ breadcrumb: () => breadcrumb_paths.eholdings,
+ },
children: [
{
path: "",
},
},
{
- path: "packages",
+ path: "local",
component: { render: () => h(RouterView) },
children: [
{
path: "",
- component: EHoldingsPackagesList,
- meta: {
- breadcrumb: () =>
- build_breadcrumb([
- breadcrumb_paths.eholdings,
- breadcrumbs.eholdings.packages,
- ]),
- },
- },
- {
- path: ":package_id",
- component: EHoldingsPackagesShow,
+ component: EHoldingsLocalHome,
meta: {
- breadcrumb: () =>
- build_breadcrumb(
- [
- breadcrumb_paths.eholdings,
- breadcrumbs.eholdings.packages,
- ],
- "Show package" // $t("Show package")
- ),
+ breadcrumb: () => breadcrumb_paths.eholdings_local,
},
},
{
- path: "delete/:package_id",
- component: EHoldingsPackagesFormConfirmDelete,
- meta: {
- breadcrumb: () =>
- build_breadcrumb(
- [
- breadcrumb_paths.eholdings,
- breadcrumbs.eholdings.packages,
- ],
- "Delete package" // $t("Delete package")
- ),
- },
+ path: "packages",
+ component: { render: () => h(RouterView) },
+ children: [
+ {
+ path: "",
+ component: EHoldingsLocalPackagesList,
+ meta: {
+ breadcrumb: () =>
+ build_breadcrumb([
+ breadcrumb_paths.eholdings_local,
+ breadcrumbs.eholdings.local
+ .packages,
+ ]),
+ },
+ },
+ {
+ path: ":package_id",
+ component: EHoldingsLocalPackagesShow,
+ meta: {
+ breadcrumb: () =>
+ build_breadcrumb(
+ [
+ breadcrumb_paths.eholdings_local,
+ breadcrumbs.eholdings.local
+ .packages,
+ ],
+ "Show package" // $t("Show package")
+ ),
+ },
+ },
+ {
+ path: "delete/:package_id",
+ component:
+ EHoldingsLocalPackagesFormConfirmDelete,
+ meta: {
+ breadcrumb: () =>
+ build_breadcrumb(
+ [
+ breadcrumb_paths.eholdings_local,
+ breadcrumbs.eholdings.local
+ .packages,
+ ],
+ "Delete package" // $t("Delete package")
+ ),
+ },
+ },
+ {
+ path: "add",
+ component: EHoldingsLocalPackagesFormAdd,
+ meta: {
+ breadcrumb: () =>
+ build_breadcrumb(
+ [
+ breadcrumb_paths.eholdings_local,
+ breadcrumbs.eholdings.local
+ .packages,
+ ],
+ "Add package" // $t("Add package")
+ ),
+ },
+ },
+ {
+ path: "edit/:package_id",
+ component: EHoldingsLocalPackagesFormAdd,
+ meta: {
+ breadcrumb: () =>
+ build_breadcrumb(
+ [
+ breadcrumb_paths.eholdings_local,
+ breadcrumbs.eholdings.local
+ .packages,
+ ],
+ "Edit package" // $t("Edit package")
+ ),
+ },
+ },
+ ],
},
{
- path: "add",
- component: EHoldingsPackagesFormAdd,
- meta: {
- breadcrumb: () =>
- build_breadcrumb(
- [
- breadcrumb_paths.eholdings,
- breadcrumbs.eholdings.packages,
- ],
- "Add package" // $t("Add package")
- ),
- },
+ path: "titles",
+ component: { render: () => h(RouterView) },
+ children: [
+ {
+ path: "",
+ component: EHoldingsLocalTitlesList,
+ meta: {
+ breadcrumb: () =>
+ build_breadcrumb([
+ breadcrumb_paths.eholdings_local,
+ breadcrumbs.eholdings.local.titles,
+ ]),
+ },
+ },
+ {
+ path: ":title_id",
+ component: EHoldingsLocalTitlesShow,
+ meta: {
+ breadcrumb: () =>
+ build_breadcrumb(
+ [
+ breadcrumb_paths.eholdings_local,
+ breadcrumbs.eholdings.local
+ .titles,
+ ],
+ "Show title" // $t("Show title")
+ ),
+ },
+ },
+ {
+ path: "delete/:title_id",
+ component:
+ EHoldingsLocalTitlesFormConfirmDelete,
+ meta: {
+ breadcrumb: () =>
+ build_breadcrumb(
+ [
+ breadcrumb_paths.eholdings_local,
+ breadcrumbs.eholdings.local
+ .titles,
+ ],
+ "Delete title" // $t("Delete title")
+ ),
+ },
+ },
+ {
+ path: "add",
+ component: EHoldingsLocalTitlesFormAdd,
+ meta: {
+ breadcrumb: () =>
+ build_breadcrumb(
+ [
+ breadcrumb_paths.eholdings_local,
+ breadcrumbs.eholdings.local
+ .titles,
+ ],
+ "Add title" // $t("Add title")
+ ),
+ },
+ },
+ {
+ path: "edit/:title_id",
+ component: EHoldingsLocalTitlesFormAdd,
+ meta: {
+ breadcrumb: () =>
+ build_breadcrumb(
+ [
+ breadcrumb_paths.eholdings_local,
+ breadcrumbs.eholdings.local
+ .titles,
+ ],
+ "Edit title" // $t("Edit title")
+ ),
+ },
+ },
+ ],
},
{
- path: "edit/:package_id",
- component: EHoldingsPackagesFormAdd,
+ path: "resources/:resource_id",
+ component: EHoldingsLocalResourcesShow,
meta: {
breadcrumb: () =>
build_breadcrumb(
[
- breadcrumb_paths.eholdings,
- breadcrumbs.eholdings.packages,
+ breadcrumb_paths.eholdings_local,
+ breadcrumbs.eholdings.local.titles,
],
- "Edit package" // $t("Edit package")
+ "Resource" // $t("Resource")
),
},
},
],
},
{
- path: "titles",
+ path: "ebsco",
component: { render: () => h(RouterView) },
children: [
{
path: "",
- component: EHoldingsTitlesList,
- meta: {
- breadcrumb: () =>
- build_breadcrumb([
- breadcrumb_paths.eholdings,
- breadcrumbs.eholdings.titles,
- ]),
- },
- },
- {
- path: ":title_id",
- component: EHoldingsTitlesShow,
+ component: EHoldingsEBSCOHome,
meta: {
- breadcrumb: () =>
- build_breadcrumb(
- [
- breadcrumb_paths.eholdings,
- breadcrumbs.eholdings.titles,
- ],
- "Show title" // $t("Show title")
- ),
+ breadcrumb: () => breadcrumb_paths.eholdings_ebsco,
},
},
{
- path: "delete/:title_id",
- component: EHoldingsTitlesFormConfirmDelete,
- meta: {
- breadcrumb: () =>
- build_breadcrumb(
- [
- breadcrumb_paths.eholdings,
- breadcrumbs.eholdings.titles,
- ],
- "Delete title" // $t("Delete title")
- ),
- },
+ path: "packages",
+ component: { render: () => h(RouterView) },
+ children: [
+ {
+ path: "",
+ component: EHoldingsEBSCOPackagesList,
+ meta: {
+ breadcrumb: () =>
+ build_breadcrumb([
+ breadcrumb_paths.eholdings_ebsco,
+ breadcrumbs.eholdings.ebsco
+ .packages,
+ ]),
+ },
+ },
+ {
+ path: ":package_id",
+ component: EHoldingsEBSCOPackagesShow,
+ meta: {
+ breadcrumb: () =>
+ build_breadcrumb(
+ [
+ breadcrumb_paths.eholdings_ebsco,
+ breadcrumbs.eholdings.ebsco
+ .packages,
+ ],
+ "Show package" // $t("Show package")
+ ),
+ },
+ },
+ ],
},
{
- path: "add",
- component: EHoldingsTitlesFormAdd,
- meta: {
- breadcrumb: () =>
- build_breadcrumb(
- [
- breadcrumb_paths.eholdings,
- breadcrumbs.eholdings.titles,
- ],
- "Add title" // $t("Add title")
- ),
- },
+ path: "titles",
+ component: { render: () => h(RouterView) },
+ children: [
+ {
+ path: "",
+ component: EHoldingsEBSCOTitlesList,
+ meta: {
+ breadcrumb: () =>
+ build_breadcrumb([
+ breadcrumb_paths.eholdings_ebsco,
+ breadcrumbs.eholdings.ebsco.titles,
+ ]),
+ },
+ },
+ {
+ path: ":title_id",
+ component: EHoldingsEBSCOTitlesShow,
+ meta: {
+ breadcrumb: () =>
+ build_breadcrumb(
+ [
+ breadcrumb_paths.eholdings_ebsco,
+ breadcrumbs.eholdings.ebsco
+ .titles,
+ ],
+ "Show title" // $t("Show title")
+ ),
+ },
+ },
+ ],
},
{
- path: "edit/:title_id",
- component: EHoldingsTitlesFormAdd,
+ path: "resources/:resource_id",
+ component: EHoldingsEBSCOResourcesShow,
meta: {
breadcrumb: () =>
build_breadcrumb(
[
- breadcrumb_paths.eholdings,
- breadcrumbs.eholdings.titles,
+ breadcrumb_paths.eholdings_ebsco,
+ breadcrumbs.eholdings.ebsco.titles,
],
- "Edit title" // $t("Edit title")
+ "Resource" // $t("Resource")
),
},
},
],
},
- {
- path: "resources/:resource_id",
- component: EHoldingsResourcesShow,
- meta: {
- breadcrumb: () =>
- build_breadcrumb(
- [
- breadcrumb_paths.eholdings,
- breadcrumbs.eholdings.titles,
- ],
- "Resource" // $t("Resource")
- ),
- },
- },
],
},
{