Bug 32030: Make the ERMProviders syspref multivaluated
authorJonathan Druart <jonathan.druart@bugs.koha-community.org>
Wed, 29 Jun 2022 15:42:28 +0000 (17:42 +0200)
committerTomas Cohen Arazi <tomascohen@theke.io>
Tue, 8 Nov 2022 12:44:09 +0000 (09:44 -0300)
Signed-off-by: Jonathan Field <jonathan.field@ptfs-europe.com>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>
Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
66 files changed:
Koha/REST/V1/ERM/EHoldings/Packages.pm
Koha/REST/V1/ERM/EHoldings/Packages/Local.pm [new file with mode: 0644]
Koha/REST/V1/ERM/EHoldings/Packages/Manual.pm [deleted file]
Koha/REST/V1/ERM/EHoldings/Resources.pm
Koha/REST/V1/ERM/EHoldings/Resources/Local.pm [new file with mode: 0644]
Koha/REST/V1/ERM/EHoldings/Resources/Manual.pm [deleted file]
Koha/REST/V1/ERM/EHoldings/Titles.pm
Koha/REST/V1/ERM/EHoldings/Titles/Local.pm [new file with mode: 0644]
Koha/REST/V1/ERM/EHoldings/Titles/Manual.pm [deleted file]
api/v1/swagger/paths/erm_eholdings_packages.yaml
api/v1/swagger/paths/erm_eholdings_packages_resources.yaml
api/v1/swagger/paths/erm_eholdings_resources.yaml
api/v1/swagger/paths/erm_eholdings_titles.yaml
api/v1/swagger/paths/erm_eholdings_titles_resources.yaml
api/v1/swagger/swagger.yaml
cypress/integration/Packages_spec.ts
installer/data/mysql/atomicupdate/erm.pl
installer/data/mysql/mandatory/sysprefs.sql
koha-tmpl/intranet-tmpl/prog/en/includes/erm-search.inc
koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/erm.pref
koha-tmpl/intranet-tmpl/prog/en/modules/erm/erm.tt
koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsEBSCOHome.vue [new file with mode: 0644]
koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsEBSCOPackageAgreements.vue [new file with mode: 0644]
koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsEBSCOPackageTitlesList.vue [new file with mode: 0644]
koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsEBSCOPackagesList.vue [new file with mode: 0644]
koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsEBSCOPackagesShow.vue [new file with mode: 0644]
koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsEBSCOResourcesShow.vue [new file with mode: 0644]
koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsEBSCOTitlePackagesList.vue [new file with mode: 0644]
koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsEBSCOTitlesList.vue [new file with mode: 0644]
koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsEBSCOTitlesShow.vue [new file with mode: 0644]
koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsLocalHome.vue [new file with mode: 0644]
koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsLocalPackageAgreements.vue [new file with mode: 0644]
koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsLocalPackageTitlesList.vue [new file with mode: 0644]
koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsLocalPackagesFormAdd.vue [new file with mode: 0644]
koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsLocalPackagesFormConfirmDelete.vue [new file with mode: 0644]
koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsLocalPackagesList.vue [new file with mode: 0644]
koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsLocalPackagesShow.vue [new file with mode: 0644]
koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsLocalPackagesToolbar.vue [new file with mode: 0644]
koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsLocalResourcesShow.vue [new file with mode: 0644]
koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsLocalTitlePackagesList.vue [new file with mode: 0644]
koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsLocalTitlesFormAdd.vue [new file with mode: 0644]
koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsLocalTitlesFormAddResources.vue [new file with mode: 0644]
koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsLocalTitlesFormConfirmDelete.vue [new file with mode: 0644]
koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsLocalTitlesList.vue [new file with mode: 0644]
koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsLocalTitlesShow.vue [new file with mode: 0644]
koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsLocalTitlesToolbar.vue [new file with mode: 0644]
koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsMain.vue
koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsPackageAgreements.vue [deleted file]
koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsPackageTitlesList.vue [deleted file]
koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsPackagesFormAdd.vue [deleted file]
koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsPackagesFormConfirmDelete.vue [deleted file]
koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsPackagesList.vue [deleted file]
koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsPackagesShow.vue [deleted file]
koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsPackagesToolbar.vue [deleted file]
koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsResourcesShow.vue [deleted file]
koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsTitlePackagesList.vue [deleted file]
koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsTitlesFormAdd.vue [deleted file]
koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsTitlesFormAddResources.vue [deleted file]
koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsTitlesFormConfirmDelete.vue [deleted file]
koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsTitlesList.vue [deleted file]
koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsTitlesShow.vue [deleted file]
koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsTitlesToolbar.vue [deleted file]
koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/ERMMain.vue
koha-tmpl/intranet-tmpl/prog/js/vue/fetch.js
koha-tmpl/intranet-tmpl/prog/js/vue/main-erm.ts
koha-tmpl/intranet-tmpl/prog/js/vue/routes.js

index 7e7b983..1e7fdf8 100644 (file)
@@ -22,7 +22,7 @@ use Mojo::Base 'Mojolicious::Controller';
 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
@@ -34,11 +34,13 @@ use Koha::REST::V1::ERM::EHoldings::Packages::EBSCO;
 =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);
     }
 }
 
@@ -49,11 +51,13 @@ Controller function that handles retrieving a single Koha::ERM::EHoldings::Packa
 =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);
     }
 }
 
@@ -64,11 +68,13 @@ Controller function that handles adding a new Koha::ERM::EHoldings::Package obje
 =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);
     }
 }
 
@@ -79,11 +85,13 @@ Controller function that handles updating a Koha::ERM::EHoldings::Package object
 =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);
     }
 };
 
@@ -92,11 +100,13 @@ sub update {
 =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);
     }
 }
 
diff --git a/Koha/REST/V1/ERM/EHoldings/Packages/Local.pm b/Koha/REST/V1/ERM/EHoldings/Packages/Local.pm
new file mode 100644 (file)
index 0000000..7bae58f
--- /dev/null
@@ -0,0 +1,238 @@
+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;
diff --git a/Koha/REST/V1/ERM/EHoldings/Packages/Manual.pm b/Koha/REST/V1/ERM/EHoldings/Packages/Manual.pm
deleted file mode 100644 (file)
index 27731ae..0000000
+++ /dev/null
@@ -1,210 +0,0 @@
-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;
index e752a21..707b10f 100644 (file)
@@ -19,7 +19,7 @@ use Modern::Perl;
 
 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 );
@@ -34,11 +34,13 @@ use Try::Tiny qw( catch try );
 =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);
     }
 }
 
@@ -49,11 +51,13 @@ Controller function that handles retrieving a single Koha::ERM::EHoldings::Resou
 =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);
     }
 }
 
diff --git a/Koha/REST/V1/ERM/EHoldings/Resources/Local.pm b/Koha/REST/V1/ERM/EHoldings/Resources/Local.pm
new file mode 100644 (file)
index 0000000..81b4a38
--- /dev/null
@@ -0,0 +1,83 @@
+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;
diff --git a/Koha/REST/V1/ERM/EHoldings/Resources/Manual.pm b/Koha/REST/V1/ERM/EHoldings/Resources/Manual.pm
deleted file mode 100644 (file)
index 537e345..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-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;
index 6b2975f..d48d615 100644 (file)
@@ -22,7 +22,7 @@ use Mojo::Base 'Mojolicious::Controller';
 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
@@ -34,11 +34,13 @@ use Koha::REST::V1::ERM::EHoldings::Titles::EBSCO;
 =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);
     }
 }
 
@@ -49,11 +51,13 @@ Controller function that handles retrieving a single Koha::ERM::EHoldings::Packa
 =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);
     }
 }
 
@@ -64,11 +68,13 @@ Controller function that handles adding a new Koha::ERM::EHoldings::Title object
 =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);
     }
 }
 
@@ -80,11 +86,13 @@ Controller function that handles updating a Koha::ERM::EHoldings::Title object
 =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);
     }
 }
 
@@ -93,12 +101,14 @@ sub update {
 =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;
diff --git a/Koha/REST/V1/ERM/EHoldings/Titles/Local.pm b/Koha/REST/V1/ERM/EHoldings/Titles/Local.pm
new file mode 100644 (file)
index 0000000..51e6307
--- /dev/null
@@ -0,0 +1,241 @@
+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;
diff --git a/Koha/REST/V1/ERM/EHoldings/Titles/Manual.pm b/Koha/REST/V1/ERM/EHoldings/Titles/Manual.pm
deleted file mode 100644 (file)
index 4564d2d..0000000
+++ /dev/null
@@ -1,241 +0,0 @@
-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;
index 71078f4..2cefd89 100644 (file)
@@ -1,5 +1,5 @@
 ---
-/erm/eholdings/packages:
+/erm/eholdings/{provider}/packages:
   get:
     x-mojo-to: ERM::EHoldings::Packages#list
     operationId: listErmEHoldingsPackages
@@ -9,6 +9,11 @@
     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:
index f948388..071b07e 100644 (file)
@@ -1,5 +1,5 @@
 ---
-/erm/eholdings/packages/{package_id}/resources:
+/erm/eholdings/{provider}/packages/{package_id}/resources:
   get:
     x-mojo-to: ERM::EHoldings::Resources#list
     operationId: listErmEHoldingsPackagesResources
@@ -9,6 +9,11 @@
     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
index 3d8ac9a..1d299f9 100644 (file)
@@ -1,5 +1,5 @@
 ---
-/erm/eholdings/resources:
+/erm/eholdings/{provider}/resources:
   get:
     x-mojo-to: ERM::EHoldings::Resources#list
     operationId: listErmEHoldingsResources
@@ -9,6 +9,11 @@
     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
@@ -74,7 +79,7 @@
     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:
index a5df76c..56344f6 100644 (file)
@@ -1,5 +1,5 @@
 ---
-/erm/eholdings/titles:
+/erm/eholdings/{provider}/titles:
   get:
     x-mojo-to: ERM::EHoldings::Titles#list
     operationId: listErmEHoldingsTitles
@@ -9,6 +9,11 @@
     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:
index 645dd52..af8652a 100644 (file)
@@ -1,5 +1,5 @@
 ---
-/erm/eholdings/titles/{title_id}/resources:
+/erm/eholdings/{provider}/titles/{title_id}/resources:
   get:
     x-mojo-to: ERM::EHoldings::Resources#list
     operationId: listErmEHoldingsTitlesResources
index 9aae93a..3487383 100644 (file)
@@ -171,22 +171,22 @@ paths:
     $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}":
index 4cb17d0..9bce51f 100644 (file)
@@ -20,7 +20,7 @@ describe("Package CRUD operations", () => {
 
     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",
         });
@@ -31,15 +31,15 @@ describe("Package CRUD operations", () => {
         );
 
         // 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: {
@@ -47,14 +47,14 @@ describe("Package CRUD operations", () => {
                 "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");
 
@@ -71,7 +71,7 @@ describe("Package CRUD operations", () => {
         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",
         });
@@ -81,7 +81,7 @@ describe("Package CRUD operations", () => {
         );
 
         // 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,
         });
@@ -95,7 +95,7 @@ describe("Package CRUD operations", () => {
         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: {
@@ -103,10 +103,10 @@ describe("Package CRUD operations", () => {
                 "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();
@@ -120,7 +120,7 @@ describe("Package CRUD operations", () => {
         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",
         });
@@ -130,7 +130,7 @@ describe("Package CRUD operations", () => {
         );
 
         // 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,
         });
@@ -144,7 +144,7 @@ describe("Package CRUD operations", () => {
         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: {
@@ -152,10 +152,10 @@ describe("Package CRUD operations", () => {
                 "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"
         );
@@ -176,7 +176,7 @@ describe("Package CRUD operations", () => {
         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: {
@@ -184,8 +184,8 @@ describe("Package CRUD operations", () => {
                 "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")
@@ -194,7 +194,7 @@ describe("Package CRUD operations", () => {
         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",
         });
@@ -204,7 +204,7 @@ describe("Package CRUD operations", () => {
         );
 
         // 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,
         });
index 7363647..e9bf90a 100755 (executable)
@@ -313,7 +313,7 @@ return {
 
         $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)
index d908408..2f9c815 100644 (file)
@@ -222,7 +222,7 @@ INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `
 ('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'),
index 35778ba..31fe999 100644 (file)
@@ -11,7 +11,7 @@
     </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" />
@@ -19,7 +19,7 @@
     </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" />
index d577115..ff0a42e 100644 (file)
@@ -7,10 +7,10 @@ E-Resource management:
                   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
index 432bd5a..e472cf2 100644 (file)
@@ -49,7 +49,8 @@
         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>
 
diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsEBSCOHome.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsEBSCOHome.vue
new file mode 100644 (file)
index 0000000..68e81fc
--- /dev/null
@@ -0,0 +1,30 @@
+<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>
diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsEBSCOPackageAgreements.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsEBSCOPackageAgreements.vue
new file mode 100644 (file)
index 0000000..3426197
--- /dev/null
@@ -0,0 +1,84 @@
+<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>
diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsEBSCOPackageTitlesList.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsEBSCOPackageTitlesList.vue
new file mode 100644 (file)
index 0000000..5fa6445
--- /dev/null
@@ -0,0 +1,203 @@
+<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
diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsEBSCOPackagesList.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsEBSCOPackagesList.vue
new file mode 100644 (file)
index 0000000..899cd22
--- /dev/null
@@ -0,0 +1,199 @@
+<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>
diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsEBSCOPackagesShow.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsEBSCOPackagesShow.vue
new file mode 100644 (file)
index 0000000..4b2b84a
--- /dev/null
@@ -0,0 +1,137 @@
+<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>
diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsEBSCOResourcesShow.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsEBSCOResourcesShow.vue
new file mode 100644 (file)
index 0000000..83d1554
--- /dev/null
@@ -0,0 +1,150 @@
+<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>
diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsEBSCOTitlePackagesList.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsEBSCOTitlePackagesList.vue
new file mode 100644 (file)
index 0000000..0d734a6
--- /dev/null
@@ -0,0 +1,161 @@
+<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>
diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsEBSCOTitlesList.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsEBSCOTitlesList.vue
new file mode 100644 (file)
index 0000000..6eab990
--- /dev/null
@@ -0,0 +1,215 @@
+<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>
diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsEBSCOTitlesShow.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsEBSCOTitlesShow.vue
new file mode 100644 (file)
index 0000000..a4dadd6
--- /dev/null
@@ -0,0 +1,317 @@
+<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>
diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsLocalHome.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsLocalHome.vue
new file mode 100644 (file)
index 0000000..f878f44
--- /dev/null
@@ -0,0 +1,30 @@
+<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>
diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsLocalPackageAgreements.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsLocalPackageAgreements.vue
new file mode 100644 (file)
index 0000000..d4fa981
--- /dev/null
@@ -0,0 +1,84 @@
+<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>
diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsLocalPackageTitlesList.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsLocalPackageTitlesList.vue
new file mode 100644 (file)
index 0000000..73c6838
--- /dev/null
@@ -0,0 +1,120 @@
+<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
diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsLocalPackagesFormAdd.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsLocalPackagesFormAdd.vue
new file mode 100644 (file)
index 0000000..3cf50fe
--- /dev/null
@@ -0,0 +1,212 @@
+<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>
diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsLocalPackagesFormConfirmDelete.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsLocalPackagesFormConfirmDelete.vue
new file mode 100644 (file)
index 0000000..3dd251c
--- /dev/null
@@ -0,0 +1,86 @@
+<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>
diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsLocalPackagesList.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsLocalPackagesList.vue
new file mode 100644 (file)
index 0000000..49b2fe9
--- /dev/null
@@ -0,0 +1,208 @@
+<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>
diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsLocalPackagesShow.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsLocalPackagesShow.vue
new file mode 100644 (file)
index 0000000..02d41ad
--- /dev/null
@@ -0,0 +1,159 @@
+<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>
diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsLocalPackagesToolbar.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsLocalPackagesToolbar.vue
new file mode 100644 (file)
index 0000000..7f06efa
--- /dev/null
@@ -0,0 +1,12 @@
+<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>
diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsLocalResourcesShow.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsLocalResourcesShow.vue
new file mode 100644 (file)
index 0000000..00b2c94
--- /dev/null
@@ -0,0 +1,150 @@
+<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>
diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsLocalTitlePackagesList.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsLocalTitlePackagesList.vue
new file mode 100644 (file)
index 0000000..e655f98
--- /dev/null
@@ -0,0 +1,92 @@
+<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>
diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsLocalTitlesFormAdd.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsLocalTitlesFormAdd.vue
new file mode 100644 (file)
index 0000000..0fdb5cb
--- /dev/null
@@ -0,0 +1,519 @@
+<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>
diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsLocalTitlesFormAddResources.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsLocalTitlesFormAddResources.vue
new file mode 100644 (file)
index 0000000..77a6ff4
--- /dev/null
@@ -0,0 +1,147 @@
+<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>
diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsLocalTitlesFormConfirmDelete.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsLocalTitlesFormConfirmDelete.vue
new file mode 100644 (file)
index 0000000..6a74e00
--- /dev/null
@@ -0,0 +1,86 @@
+<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>
diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsLocalTitlesList.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsLocalTitlesList.vue
new file mode 100644 (file)
index 0000000..ffe6c0d
--- /dev/null
@@ -0,0 +1,200 @@
+<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>
diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsLocalTitlesShow.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsLocalTitlesShow.vue
new file mode 100644 (file)
index 0000000..91066d3
--- /dev/null
@@ -0,0 +1,334 @@
+<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>
diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsLocalTitlesToolbar.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsLocalTitlesToolbar.vue
new file mode 100644 (file)
index 0000000..c0e1368
--- /dev/null
@@ -0,0 +1,12 @@
+<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>
index 4ee8015..dcc5beb 100644 (file)
@@ -1,16 +1,38 @@
 <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>
@@ -18,6 +40,9 @@
 <script>
 
 export default {
+    setup() {
+        return { erm_providers, }
+    },
     data() {
         return {
         }
diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsPackageAgreements.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsPackageAgreements.vue
deleted file mode 100644 (file)
index f5b6707..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-<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>
diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsPackageTitlesList.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsPackageTitlesList.vue
deleted file mode 100644 (file)
index 3871cf8..0000000
+++ /dev/null
@@ -1,215 +0,0 @@
-<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
diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsPackagesFormAdd.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsPackagesFormAdd.vue
deleted file mode 100644 (file)
index 20e2545..0000000
+++ /dev/null
@@ -1,212 +0,0 @@
-<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>
diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsPackagesFormConfirmDelete.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsPackagesFormConfirmDelete.vue
deleted file mode 100644 (file)
index 532eef0..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-<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>
diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsPackagesList.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsPackagesList.vue
deleted file mode 100644 (file)
index 53f32b9..0000000
+++ /dev/null
@@ -1,293 +0,0 @@
-<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>
diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsPackagesShow.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsPackagesShow.vue
deleted file mode 100644 (file)
index 6a8263a..0000000
+++ /dev/null
@@ -1,161 +0,0 @@
-<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>
diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsPackagesToolbar.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsPackagesToolbar.vue
deleted file mode 100644 (file)
index bc75151..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-<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>
diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsResourcesShow.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsResourcesShow.vue
deleted file mode 100644 (file)
index 4a43c81..0000000
+++ /dev/null
@@ -1,150 +0,0 @@
-<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>
diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsTitlePackagesList.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsTitlePackagesList.vue
deleted file mode 100644 (file)
index bfb9c6d..0000000
+++ /dev/null
@@ -1,163 +0,0 @@
-<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>
diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsTitlesFormAdd.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsTitlesFormAdd.vue
deleted file mode 100644 (file)
index 17d4a8f..0000000
+++ /dev/null
@@ -1,521 +0,0 @@
-<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>
diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsTitlesFormAddResources.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsTitlesFormAddResources.vue
deleted file mode 100644 (file)
index 4620228..0000000
+++ /dev/null
@@ -1,147 +0,0 @@
-<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>
diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsTitlesFormConfirmDelete.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsTitlesFormConfirmDelete.vue
deleted file mode 100644 (file)
index 8ff9e0d..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-<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>
diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsTitlesList.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsTitlesList.vue
deleted file mode 100644 (file)
index 710e3ce..0000000
+++ /dev/null
@@ -1,291 +0,0 @@
-<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>
diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsTitlesShow.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsTitlesShow.vue
deleted file mode 100644 (file)
index 24fadec..0000000
+++ /dev/null
@@ -1,335 +0,0 @@
-<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>
diff --git a/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsTitlesToolbar.vue b/koha-tmpl/intranet-tmpl/prog/js/vue/components/ERM/EHoldingsTitlesToolbar.vue
deleted file mode 100644 (file)
index 1381a21..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-<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>
index 149524b..c43219e 100644 (file)
                                 </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>
@@ -97,11 +125,9 @@ export default {
 
         return {
             vendorStore,
+            erm_providers,
         }
     },
-    provide: {
-        erm_provider
-    },
     data() {
         return {
             component: "agreement",
index 4ad4dc6..712d34d 100644 (file)
@@ -104,9 +104,8 @@ export const fetchVendors = async function () {
     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: {
@@ -125,9 +124,16 @@ export const fetchPackage = async function (package_id) {
         );
     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: {
@@ -145,10 +151,17 @@ export const fetchPackages = async function () {
         );
     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: {
@@ -166,9 +179,16 @@ export const fetchTitle = async function (title_id) {
         );
     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)
@@ -182,10 +202,17 @@ export const fetchTitles = async function () {
         );
     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: {
@@ -203,9 +230,16 @@ export const fetchResource = async function (resource_id) {
         );
     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)
@@ -220,25 +254,13 @@ export const fetchResources = async function () {
     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) {
index 2a3f60f..0f22978 100644 (file)
@@ -23,12 +23,13 @@ const languages = { en };
 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) => {
index ed28a06..be9a8cf 100644 (file)
@@ -6,15 +6,22 @@ import AgreementsShow from "./components/ERM/AgreementsShow.vue";
 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";
@@ -38,13 +45,33 @@ const breadcrumbs = {
             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: {
@@ -63,8 +90,21 @@ const breadcrumb_paths = {
         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) {
@@ -144,6 +184,9 @@ export const routes = [
     {
         path: "/cgi-bin/koha/erm/eholdings",
         component: { render: () => h(RouterView) },
+        meta: {
+            breadcrumb: () => breadcrumb_paths.eholdings,
+        },
         children: [
             {
                 path: "",
@@ -153,165 +196,281 @@ export const routes = [
                 },
             },
             {
-                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")
-                        ),
-                },
-            },
         ],
     },
     {