Bug 34587: Add default report capability to reports viewer

Signed-off-by: Jessica Zairo <jzairo@bywatersolutions.com>
Signed-off-by: Michaela Sieber <michaela.sieber@kit.edu>
Signed-off-by: Nick Clemens <nick@bywatersolutions.com>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
This commit is contained in:
Matt Blenkinsop 2023-06-15 11:43:53 +00:00 committed by Tomas Cohen Arazi
parent 73d3b48048
commit ffbcf83b95
Signed by: tomascohen
GPG key ID: 0A272EA1B2F3C15F
13 changed files with 985 additions and 138 deletions

View file

@ -0,0 +1,42 @@
package Koha::ERM::DefaultUsageReport;
# 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 base qw(Koha::Object);
=head1 NAME
Koha::ERM::DefaultUsageReport - Koha ErmDefaultUsageReport Object class
=head1 API
=head2 Class Methods
=cut
=head2 Internal methods
=head3 _type
=cut
sub _type {
return 'ErmDefaultUsageReport';
}
1;

View file

@ -0,0 +1,52 @@
package Koha::ERM::DefaultUsageReports;
# 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 Koha::Database;
use Koha::ERM::DefaultUsageReport;
use base qw(Koha::Objects);
=head1 NAME
Koha::ERM::DefaultUsageReports- Koha ErmDefaultUsageReport Object set class
=head1 API
=head2 Class Methods
=cut
=head3 type
=cut
sub _type {
return 'ErmDefaultUsageReport';
}
=head3 object_class
=cut
sub object_class {
return 'Koha::ERM::DefaultUsageReport';
}
1;

View file

@ -0,0 +1,225 @@
package Koha::REST::V1::ERM::DefaultUsageReports;
# 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::DefaultUsageReports;
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 $default_usage_report_set = Koha::ERM::DefaultUsageReports->new;
my $default_usage_report =
$c->objects->search($default_usage_report_set);
return $c->render( status => 200, openapi => $default_usage_report );
}
catch {
$c->unhandled_exception($_);
};
}
=head3 add
Controller function that handles adding a new Koha::ERM::DefaultUsageReport 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 $default_report =
Koha::ERM::DefaultUsageReport->new_from_api($body)->store;
$c->res->headers->location( $c->req->url->to_string . '/'
. $default_report->erm_default_usage_report_id );
return $c->render(
status => 201,
openapi => $default_report->to_api
);
}
);
}
catch {
my $to_api_mapping = Koha::ERM::DefaultUsageReport->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"
}
);
}
elsif ( $_->isa('Koha::Exceptions::PayloadTooLarge') ) {
return $c->render(
status => 413,
openapi => { error => $_->error }
);
}
}
$c->unhandled_exception($_);
};
}
=head3 update
Controller function that handles updating a Koha::ERM::DefaultUsageReport object
=cut
sub update {
my $c = shift->openapi->valid_input or return;
my $default_report_id =
$c->validation->param('erm_default_usage_report_id');
my $default_report =
Koha::ERM::DefaultUsageReports->find($default_report_id);
unless ($default_report) {
return $c->render(
status => 404,
openapi => { error => "Default report not found" }
);
}
return try {
Koha::Database->new->schema->txn_do(
sub {
my $body = $c->validation->param('body');
$default_report->set_from_api($body)->store;
$c->res->headers->location( $c->req->url->to_string . '/'
. $default_report->erm_default_usage_report_id );
return $c->render(
status => 200,
openapi => $default_report->to_api
);
}
);
}
catch {
my $to_api_mapping = Koha::ERM::DefaultUsageReport->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"
}
);
}
elsif ( $_->isa('Koha::Exceptions::PayloadTooLarge') ) {
return $c->render(
status => 413,
openapi => { error => $_->error }
);
}
}
$c->unhandled_exception($_);
};
}
=head3 delete
=cut
sub delete {
my $c = shift->openapi->valid_input or return;
my $default_report_id =
$c->validation->param('erm_default_usage_report_id');
my $default_report =
Koha::ERM::DefaultUsageReports->find($default_report_id);
unless ($default_report) {
return $c->render(
status => 404,
openapi => { error => "Default report not found" }
);
}
return try {
$default_report->delete;
return $c->render(
status => 204,
openapi => q{}
);
}
catch {
$c->unhandled_exception($_);
};
}
1;

View file

@ -0,0 +1,78 @@
use utf8;
package Koha::Schema::Result::ErmDefaultUsageReport;
# Created by DBIx::Class::Schema::Loader
# DO NOT MODIFY THE FIRST PART OF THIS FILE
=head1 NAME
Koha::Schema::Result::ErmDefaultUsageReport
=cut
use strict;
use warnings;
use base 'DBIx::Class::Core';
=head1 TABLE: C<erm_default_usage_reports>
=cut
__PACKAGE__->table("erm_default_usage_reports");
=head1 ACCESSORS
=head2 erm_default_usage_report_id
data_type: 'integer'
is_auto_increment: 1
is_nullable: 0
primary key
=head2 report_name
data_type: 'varchar'
is_nullable: 1
size: 50
name of the default report
=head2 report_url_params
data_type: 'longtext'
is_nullable: 1
url params for the default report
=cut
__PACKAGE__->add_columns(
"erm_default_usage_report_id",
{ data_type => "integer", is_auto_increment => 1, is_nullable => 0 },
"report_name",
{ data_type => "varchar", is_nullable => 1, size => 50 },
"report_url_params",
{ data_type => "longtext", is_nullable => 1 },
);
=head1 PRIMARY KEY
=over 4
=item * L</erm_default_usage_report_id>
=back
=cut
__PACKAGE__->set_primary_key("erm_default_usage_report_id");
# Created by DBIx::Class::Schema::Loader v0.07049 @ 2023-06-15 10:27:53
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:rA1k44Zr273CfmPirG8RMA
# You can replace this text with custom code or comments, and it will be preserved on regeneration
1;

View file

@ -0,0 +1,18 @@
---
type: object
properties:
erm_default_usage_report_id:
type: integer
description: internally assigned default_usage_report identifier
readOnly: true
report_name:
description: report_name
type: string
report_url_params:
description: report_url_params
type: string
additionalProperties: false
required:
- report_name
- report_url_params

View file

@ -0,0 +1,266 @@
---
/erm/default_usage_reports:
get:
x-mojo-to: ERM::DefaultUsageReports#list
operationId: listErmDefaultUsageReports
tags:
- default_usage_report
summary: List default_usage_reports
produces:
- application/json
parameters:
- description: Case insensitive search on erm_default_usage_report_id
in: query
name: erm_default_usage_report_id
required: false
type: integer
- description: Case insensitive search on default_usage_report report_name
in: query
name: report_name
required: false
type: integer
- description: Case insensitive search on default_usage_report report_url_params
in: query
name: report_url_params
required: false
type: integer
- $ref: "../swagger.yaml#/parameters/match"
- $ref: "../swagger.yaml#/parameters/order_by"
- $ref: "../swagger.yaml#/parameters/page"
- $ref: "../swagger.yaml#/parameters/per_page"
- $ref: "../swagger.yaml#/parameters/q_param"
- $ref: "../swagger.yaml#/parameters/q_body"
- $ref: "../swagger.yaml#/parameters/q_header"
responses:
200:
description: A list of default_usage_reports
schema:
items:
$ref: "../swagger.yaml#/definitions/erm_default_usage_report"
type: array
400:
description: Bad request
schema:
$ref: "../swagger.yaml#/definitions/error"
403:
description: Access forbidden
schema:
$ref: "../swagger.yaml#/definitions/error"
500:
description: |-
Internal server error. Possible `error_code` attribute values:
* `internal_server_error`
schema:
$ref: "../swagger.yaml#/definitions/error"
503:
description: Under maintenance
schema:
$ref: "../swagger.yaml#/definitions/error"
x-koha-authorization:
permissions:
erm: 1
post:
x-mojo-to: ERM::DefaultUsageReports#add
operationId: addErmDefaultUsageReports
tags:
- default_usage_report
summary: Add default_usage_report
consumes:
- application/json
produces:
- application/json
parameters:
- description: A JSON object containing information about the new default_usage_report
in: body
name: body
required: true
schema:
$ref: "../swagger.yaml#/definitions/erm_default_usage_report"
responses:
201:
description: A successfully created default_usage_report
schema:
items:
$ref: "../swagger.yaml#/definitions/erm_default_usage_report"
400:
description: Bad parameter
schema:
$ref: "../swagger.yaml#/definitions/error"
401:
description: Authentication required
schema:
$ref: "../swagger.yaml#/definitions/error"
403:
description: Access forbidden
schema:
$ref: "../swagger.yaml#/definitions/error"
404:
description: Ressource not found
schema:
$ref: "../swagger.yaml#/definitions/error"
409:
description: Conflict in creating resource
schema:
$ref: "../swagger.yaml#/definitions/error"
413:
description: Payload too large
schema:
$ref: "../swagger.yaml#/definitions/error"
500:
description: |-
Internal server error. Possible `error_code` attribute values:
* `internal_server_error`
schema:
$ref: "../swagger.yaml#/definitions/error"
503:
description: Under maintenance
schema:
$ref: "../swagger.yaml#/definitions/error"
x-koha-authorization:
permissions:
erm: 1
"/erm/default_usage_reports/{erm_default_usage_report_id}":
get:
x-mojo-to: ERM::DefaultUsageReports#get
operationId: getERMDefaultUsageReport
tags:
- default_usage_report
summary: get default_usage_report
produces:
- application/json
parameters:
- $ref: "../swagger.yaml#/parameters/erm_default_usage_report_id_pp"
responses:
200:
description: default_usage_report
schema:
items:
$ref: "../swagger.yaml#/definitions/erm_default_usage_report"
401:
description: authentication required
schema:
$ref: "../swagger.yaml#/definitions/error"
403:
description: access forbidden
schema:
$ref: "../swagger.yaml#/definitions/error"
404:
description: ressource not found
schema:
$ref: "../swagger.yaml#/definitions/error"
500:
description: |-
internal server error. possible `error_code` attribute values:
* `internal_server_error`
schema:
$ref: "../swagger.yaml#/definitions/error"
503:
description: under maintenance
schema:
$ref: "../swagger.yaml#/definitions/error"
x-koha-authorization:
permissions:
erm: 1
put:
x-mojo-to: ERM::DefaultUsageReports#update
operationId: updateERMDefaultUsageReports
tags:
- default_usage_report
summary: update default_usage_report
consumes:
- application/json
produces:
- application/json
parameters:
- $ref: "../swagger.yaml#/parameters/erm_default_usage_report_id_pp"
- name: body
in: body
description: a json object containing new information about existing default_usage_report
required: true
schema:
$ref: "../swagger.yaml#/definitions/erm_default_usage_report"
responses:
200:
description: a successfully updated default_usage_report
schema:
items:
$ref: "../swagger.yaml#/definitions/erm_default_usage_report"
400:
description: bad parameter
schema:
$ref: "../swagger.yaml#/definitions/error"
403:
description: access forbidden
schema:
$ref: "../swagger.yaml#/definitions/error"
404:
description: ressource not found
schema:
$ref: "../swagger.yaml#/definitions/error"
409:
description: conflict in updating resource
schema:
$ref: "../swagger.yaml#/definitions/error"
413:
description: Payload too large
schema:
$ref: "../swagger.yaml#/definitions/error"
500:
description: |-
internal server error. possible `error_code` attribute values:
* `internal_server_error`
schema:
$ref: "../swagger.yaml#/definitions/error"
503:
description: under maintenance
schema:
$ref: "../swagger.yaml#/definitions/error"
x-koha-authorization:
permissions:
erm: 1
delete:
x-mojo-to: ERM::DefaultUsageReports#delete
operationId: deleteERMDefaultUsageReports
tags:
- default_usage_report
summary: Delete default_usage_report
produces:
- application/json
parameters:
- $ref: "../swagger.yaml#/parameters/erm_default_usage_report_id_pp"
responses:
204:
description: default_usage_report deleted
400:
description: default_usage_report deletion failed
schema:
$ref: "../swagger.yaml#/definitions/error"
401:
description: authentication required
schema:
$ref: "../swagger.yaml#/definitions/error"
403:
description: access forbidden
schema:
$ref: "../swagger.yaml#/definitions/error"
404:
description: ressource not found
schema:
$ref: "../swagger.yaml#/definitions/error"
409:
description: conflict in deleting resource
schema:
$ref: "../swagger.yaml#/definitions/error"
500:
description: |-
internal server error. possible `error_code` attribute values:
* `internal_server_error`
schema:
$ref: "../swagger.yaml#/definitions/error"
503:
description: under maintenance
schema:
$ref: "../swagger.yaml#/definitions/error"
x-koha-authorization:
permissions:
erm: 1

View file

@ -44,6 +44,8 @@ definitions:
$ref: ./definitions/erm_counter_file.yaml
erm_counter_log:
$ref: ./definitions/erm_counter_log.yaml
erm_default_usage_report:
$ref: ./definitions/erm_default_usage_report.yaml
erm_eholdings_title:
$ref: ./definitions/erm_eholdings_title.yaml
erm_eholdings_package:
@ -599,6 +601,12 @@ parameters:
name: erm_counter_log_id
required: true
type: integer
erm_default_usage_report_id_pp:
description: ERM default_usage_report internal identifier
in: path
name: erm_default_usage_report_id
required: true
type: integer
erm_usage_data_provider_id_pp:
description: ERM usage_data_provider internal identifier
in: path

View file

@ -226,6 +226,23 @@ return {
} else {
say $out "erm_usage_yus table already exists - skipping to next table";
}
unless( TableExists( 'erm_default_usage_reports')) {
$dbh->do(
q{
CREATE TABLE `erm_default_usage_reports` (
`erm_default_usage_report_id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'primary key',
`report_name` varchar(50) DEFAULT NULL COMMENT 'name of the default report',
`report_url_params` longtext DEFAULT NULL COMMENT 'url params for the default report',
PRIMARY KEY (`erm_default_usage_report_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
}
);
say $out "Added new table erm_default_usage_reports";
} else {
say $out "erm_default_usage_reports table already exists - skipping to next table";
}
$dbh->do(q{
INSERT IGNORE INTO authorised_value_categories (category_name, is_system)

View file

@ -3181,6 +3181,21 @@ CREATE TABLE `erm_usage_mus` (
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `erm_default_usage_reports`
--
DROP TABLE IF EXISTS `erm_default_usage_reports`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `erm_default_usage_reports` (
`erm_default_usage_report_id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'primary key',
`report_name` varchar(50) DEFAULT NULL COMMENT 'name of the default report',
`report_url_params` longtext DEFAULT NULL COMMENT 'url params for the default report',
PRIMARY KEY (`erm_default_usage_report_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `erm_usage_titles`
--

View file

@ -268,13 +268,24 @@
</fieldset>
<fieldset class="action">
<ButtonSubmit />
<button
@click="clearForm($event)"
style="padding: 0.5em 1em; margin-left: 0.5em"
>
<button @click="clearForm($event)" class="button_format">
Clear
</button>
</fieldset>
<div class="save_report">
<input
id="report_name"
v-model="report_name"
:placeholder="$__('Enter report name')"
class="year_input"
/>
<button
@click="saveToDefaultReports($event)"
class="button_format"
>
Save report
</button>
</div>
</form>
</div>
</template>
@ -468,6 +479,7 @@ export default {
usage_data_provider_list: [...this.usage_data_providers],
time_period_columns_builder: null,
request_url: null,
report_name: "",
}
},
methods: {
@ -525,68 +537,7 @@ export default {
buildCustomReport(e) {
e.preventDefault()
const queryObject = this.query
const {
start_year,
end_year,
data_display,
report_type,
metric_types,
} = queryObject
if (!report_type || !start_year || !end_year) {
alert(
"You have not filled in all the required fields, please try again"
)
return
}
// validate if the year is a valid string
const valid_start_year = this.validateYear(start_year)
const valid_end_year = this.validateYear(end_year)
if (!valid_start_year || !valid_end_year) {
this.setError(
this.$__("Please enter a year with the format YYYY")
)
return
}
// If no metric types are selected then all possible values should be included for backend data filtering
if (!metric_types || (metric_types && metric_types.length === 0)) {
const final_metric_types = this.metric_types_options.map(
metric => {
return metric.value
}
)
queryObject.metric_types = final_metric_types
}
const metric_report_type =
data_display === "metric_type" ? true : false
const url = !data_display.includes("yearly")
? this.buildMonthlyUrlQuery(
queryObject,
this.time_period_columns_builder,
metric_report_type
)
: this.buildYearlyUrlQuery(queryObject)
const type = data_display
const columns = this.defineColumns(
this.title_property_column_options
)
const yearly_filter = data_display.includes("monthly")
? this.yearly_filter_required
: false
const urlParams = {
url,
columns,
queryObject,
yearly_filter,
type,
tp_columns: this.time_period_columns_builder,
}
const urlParams = this.validateFormAndCreateUrlParams()
this.$router.push({
name: "UsageStatisticsReportsViewer",
@ -879,6 +830,93 @@ export default {
return columns
},
async saveToDefaultReports(e) {
e.preventDefault()
if (!this.report_name) {
alert("Please provide a report name")
return
}
const params = this.validateFormAndCreateUrlParams()
const report = {
report_name: this.report_name,
report_url_params: JSON.stringify(params),
}
const client = APIClient.erm
await client.default_usage_reports.create(report).then(
success => {
this.setMessage(this.$__("Report saved successfully"))
},
error => {}
)
},
validateFormAndCreateUrlParams() {
const queryObject = { ...this.query }
const {
start_year,
end_year,
data_display,
report_type,
metric_types,
} = queryObject
if (!report_type || !start_year || !end_year) {
alert(
"You have not filled in all the required fields, please try again"
)
return
}
// validate if the year is a valid string
const valid_start_year = this.validateYear(start_year)
const valid_end_year = this.validateYear(end_year)
if (!valid_start_year || !valid_end_year) {
this.setError(
this.$__("Please enter a year with the format YYYY")
)
return
}
// If no metric types are selected then all possible values should be included for backend data filtering
if (!metric_types || (metric_types && metric_types.length === 0)) {
const final_metric_types = this.metric_types_options.map(
metric => {
return metric.value
}
)
queryObject.metric_types = final_metric_types
}
const metric_report_type =
data_display === "metric_type" ? true : false
const url = !data_display.includes("yearly")
? this.buildMonthlyUrlQuery(
queryObject,
this.time_period_columns_builder,
metric_report_type
)
: this.buildYearlyUrlQuery(queryObject)
const type = data_display
const columns = this.defineColumns(
this.title_property_column_options
)
const yearly_filter = data_display.includes("monthly")
? this.yearly_filter_required
: false
const urlParams = {
url,
columns,
queryObject,
yearly_filter,
type,
tp_columns: this.time_period_columns_builder,
}
return urlParams
},
},
props: ["usage_data_providers"],
components: {
@ -939,5 +977,15 @@ input:not([type="submit"]):not([type="search"]):not([type="button"]):not([type="
}
.year_input {
width: 30%;
min-height: 2em;
}
.button_format {
padding: 0.5em 1em;
margin-left: 0.5em;
}
.save_report {
display: flex;
gap: 0.5em;
margin-top: 1em;
}
</style>

View file

@ -15,7 +15,7 @@
role="tab"
data-content="default"
@click="changeCustomOrDefault"
>Default</a
>Saved reports</a
>
</li>
<li
@ -29,38 +29,14 @@
role="tab"
data-content="custom"
@click="changeCustomOrDefault"
>Custom</a
>Create report</a
>
</li>
</ul>
</div>
<div class="tab-content">
<div v-if="custom_or_default === 'default'">
<form
class="default-report"
@submit="displayDefaultReport($event)"
>
<h2>{{ $__("Select default report") }}</h2>
<fieldset class="rows">
<ol>
<li>
<label for="default_reports"
>{{ $__("Choose report") }}:</label
>
<v-select
id="default_report"
v-model="query.default_report"
label="description"
:reduce="report => report"
:options="default_reports"
/>
</li>
</ol>
</fieldset>
<fieldset class="action">
<ButtonSubmit />
</fieldset>
</form>
<UsageStatisticsSavedReports />
</div>
<div v-if="custom_or_default === 'custom'">
<UsageStatisticsReportBuilder
@ -76,6 +52,7 @@ import { inject } from "vue"
import ButtonSubmit from "../ButtonSubmit.vue"
import { APIClient } from "../../fetch/api-client.js"
import UsageStatisticsReportBuilder from "./UsageStatisticsReportBuilder.vue"
import UsageStatisticsSavedReports from "./UsageStatisticsSavedReports.vue"
export default {
setup() {
@ -92,25 +69,9 @@ export default {
return {
initialized: false,
custom_or_default: "default",
query: {
interval: "monthly",
report_type: null,
metric_types: null,
usage_data_providers: null,
titles: null,
start_month: null,
start_year: null,
end_month: null,
end_year: null,
},
default_reports: [
"Top resource requests",
"Publisher rollup",
"Provider rollup",
"Yearly usage requests",
"Titles",
// etc etc
],
default_usage_report: null,
default_usage_reports: [],
usage_data_providers: [],
}
},
beforeRouteEnter(to, from, next) {
@ -118,9 +79,9 @@ export default {
vm.getUsageDataProviders()
})
},
beforeRouteUpdate(to, from) {
this.usage_data_provider = this.getUsageDataProviders()
},
// beforeRouteUpdate(to, from) {
// this.usage_data_provider = this.getUsageDataProviders()
// },
methods: {
async getUsageDataProviders() {
const client = APIClient.erm
@ -142,13 +103,11 @@ export default {
changeCustomOrDefault(e) {
this.custom_or_default = e.target.getAttribute("data-content")
},
displayDefaultReport(e) {
e.preventDefault()
},
},
components: {
ButtonSubmit,
UsageStatisticsReportBuilder,
UsageStatisticsSavedReports,
},
name: "UsageStatisticsReportsHome",
}

View file

@ -0,0 +1,82 @@
<template>
<div v-if="!initialized">{{ $__("Loading") }}</div>
<div v-else>
<div v-if="!this.default_usage_reports.length">
{{
$__(
"You have not saved any reports yet, please create a report."
)
}}
</div>
<form
v-else
class="default-report"
@submit="displayDefaultReport($event)"
>
<h2>{{ $__("Select saved report") }}</h2>
<fieldset class="rows">
<ol>
<li>
<label for="default_usage_reports"
>{{ $__("Choose report") }}:</label
>
<v-select
id="default_usage_reports"
v-model="default_usage_report"
label="report_name"
:reduce="report => report.report_url_params"
:options="default_usage_reports"
/>
</li>
</ol>
</fieldset>
<fieldset class="action">
<ButtonSubmit />
</fieldset>
</form>
</div>
</template>
<script>
import ButtonSubmit from "../ButtonSubmit.vue"
import { APIClient } from "../../fetch/api-client.js"
export default {
data() {
return {
initialized: false,
default_usage_report: null,
default_usage_reports: [],
}
},
mounted() {
this.getDefaultUsageReports()
},
methods: {
async getDefaultUsageReports() {
const client = APIClient.erm
await client.default_usage_reports.getAll().then(
default_usage_reports => {
this.default_usage_reports = default_usage_reports
this.initialized = true
},
error => {}
)
},
displayDefaultReport(e) {
e.preventDefault()
this.$router.push({
name: "UsageStatisticsReportsViewer",
query: { data: this.default_usage_report },
})
},
},
components: {
ButtonSubmit,
},
name: "UsageStatisticsSaveReports",
}
</script>
<style></style>

View file

@ -253,20 +253,20 @@ export class ERMAPIClient extends HttpClient {
get usage_data_providers() {
return {
get: (id) =>
get: id =>
this.get({
endpoint: "usage_data_providers/" + id,
}),
getAll: (query) =>
getAll: query =>
this.get({
endpoint: "usage_data_providers",
query
query,
}),
delete: (id) =>
delete: id =>
this.delete({
endpoint: "usage_data_providers/" + id,
}),
create: (usage_data_provider) =>
create: usage_data_provider =>
this.post({
endpoint: "usage_data_providers",
body: usage_data_provider,
@ -278,38 +278,51 @@ export class ERMAPIClient extends HttpClient {
}),
run: (id, begin_date, end_date) =>
this.get({
endpoint: "usage_data_providers/" + id + "/run?begin_date="+ begin_date + "&end_date=" + end_date,
endpoint:
"usage_data_providers/" +
id +
"/run?begin_date=" +
begin_date +
"&end_date=" +
end_date,
}),
test: (id) =>
test: id =>
this.get({
endpoint: "usage_data_providers/" + id + "/test_connection",
}),
//count: () => this.count("usage_data_providers"), //TODO: Implement count method
count: (query = {}) =>
this.count({
endpoint:
"usage_data_providers?" +
new URLSearchParams({
_page: 1,
_per_page: 1,
...(query && { q: JSON.stringify(query) }),
}),
}),
};
}
get usage_titles() {
return {
get: (id) =>
get: id =>
this.get({
endpoint: "usage_titles/" + id,
headers: {
"x-koha-embed":
"usage_mus",
"x-koha-embed": "usage_mus",
},
}),
getAll: (query) =>
getAll: query =>
this.getAll({
endpoint: "usage_titles",
query
query,
}),
getReport: (query, embed) =>
this.get({
endpoint: "usage_titles/report",
query,
headers: {
"x-koha-embed":
`${embed}`,
"x-koha-embed": `${embed}`,
},
}),
count: (query = {}) =>
@ -327,19 +340,43 @@ export class ERMAPIClient extends HttpClient {
get counter_files() {
return {
getAll: (query) =>
getAll: query =>
this.get({
endpoint: "counter_files",
query,
headers: {
"x-koha-embed":
"counter_logs",
}
"x-koha-embed": "counter_logs",
},
}),
delete: (id) =>
delete: id =>
this.delete({
endpoint: "counter_files/" + id,
}),
count: (query = {}) =>
this.count({
endpoint:
"counter_files?" +
new URLSearchParams({
_page: 1,
_per_page: 1,
...(query && { q: JSON.stringify(query) }),
}),
}),
};
}
get default_usage_reports() {
return {
getAll: query =>
this.get({
endpoint: "default_usage_reports",
query,
}),
create: default_usage_report =>
this.post({
endpoint: "default_usage_reports",
body: default_usage_report,
}),
};
}
}