@@ -, +, @@ - the js and css file for ColVis - a new DB table 'columns_settings' - a new template plugin 'ColumnsSettings' - a new package C4::Utils::DataTables::ColumnsSettings - a new admin page admin/columns_settings.pl - is_hidden: default is 0 - cannot_be_toggled: default is 0. - cannot_be_modified: default is 0 --- C4/Utils/DataTables/ColumnsSettings.pm | 123 ++++++++++++++++++ Koha/Template/Plugin/ColumnsSettings.pm | 67 ++++++++++ admin/columns_settings.pl | 59 +++++++++ admin/columns_settings.yml | 52 ++++++++ circ/circulation.pl | 1 + installer/data/mysql/kohastructure.sql | 11 ++ installer/data/mysql/updatedatabase.pl | 16 +++ .../prog/en/includes/columns_settings.inc | 27 ++++ koha-tmpl/intranet-tmpl/prog/en/js/datatables.js | 5 +- .../prog/en/modules/admin/admin-home.tt | 2 + .../prog/en/modules/admin/columns_settings.tt | 131 ++++++++++++++++++++ .../prog/en/modules/circ/circulation.tt | 66 +++++++--- 12 files changed, 541 insertions(+), 19 deletions(-) create mode 100644 C4/Utils/DataTables/ColumnsSettings.pm create mode 100644 Koha/Template/Plugin/ColumnsSettings.pm create mode 100755 admin/columns_settings.pl create mode 100644 admin/columns_settings.yml create mode 100644 koha-tmpl/intranet-tmpl/prog/en/includes/columns_settings.inc create mode 100644 koha-tmpl/intranet-tmpl/prog/en/modules/admin/columns_settings.tt --- a/C4/Utils/DataTables/ColumnsSettings.pm +++ a/C4/Utils/DataTables/ColumnsSettings.pm @@ -0,0 +1,123 @@ +package C4::Utils::DataTables::ColumnsSettings; + +use Modern::Perl; +use List::Util qw( first ); +use C4::Context; + +sub get_yaml { + my $yml_path = C4::Context->config('intranetdir') . '/admin/columns_settings.yml'; + my $yaml = eval { YAML::LoadFile( $yml_path ) }; + warn "ERROR: the yaml file for DT::ColumnsSettings is not correctly formated: $@" if $@; + return $yaml; +} +sub get_tables { + my ( $module, $page ) = @_; + my $list = get_yaml; + return $list->{modules}{$module}{$page}; +} + +sub get_excluded { + my ( $module, $page, $table ) = @_; + + my $list = get_yaml; + return $list->{modules}{$module}{$page}{$table}{cannot_be_toggled}; +} + +sub get_columns { + my ( $module, $page, $tablename ) = @_; + + my $list = get_yaml; + + my $dbh = C4::Context->dbh; + my $sth = $dbh->prepare(q{ + SELECT * + FROM columns_settings + WHERE module = ? + AND page = ? + AND tablename = ? + }); + + $sth->execute( $module, $page, $tablename ); + + while ( my $c = $sth->fetchrow_hashref ) { + my $column = first { $c->{columnname} eq $_->{columnname} } + @{ $list->{modules}{$c->{module}}{$c->{page}}{$c->{tablename}} }; + $column->{is_hidden} = $c->{is_hidden}; + $column->{cannot_be_toggled} = $c->{cannot_be_toggled}; + } + + return $list->{modules}{$module}{$page}{$tablename}; +} + +sub get_modules { + my $list = get_yaml; + + my $dbh = C4::Context->dbh; + my $sth = $dbh->prepare(q{ + SELECT * + FROM columns_settings + }); + + $sth->execute; + while ( my $c = $sth->fetchrow_hashref ) { + my $column = first { $c->{columnname} eq $_->{columnname} } + @{ $list->{modules}{$c->{module}}{$c->{page}}{$c->{tablename}} }; + $column->{is_hidden} = $c->{is_hidden}; + $column->{cannot_be_toggled} = $c->{cannot_be_toggled}; + } + + return $list->{modules}; +} + +sub update_columns { + my ( $params ) = @_; + my $columns = $params->{columns}; + my $dbh = C4::Context->dbh; + my $sth_check = $dbh->prepare(q{ + SELECT COUNT(*) + FROM columns_settings + WHERE module = ? + AND page = ? + AND tablename = ? + AND columnname = ? + }); + my $sth_update = $dbh->prepare(q{ + UPDATE columns_settings + SET is_hidden = ?, cannot_be_toggled = ? + WHERE module = ? + AND page = ? + AND tablename = ? + AND columnname = ? + }); + + my $sth_insert = $dbh->prepare(q{ + INSERT INTO columns_settings (is_hidden, cannot_be_toggled, module, page, tablename, columnname ) + VALUES ( ?, ?, ?, ?, ?, ? ) + }); + + + for my $c ( @$columns ) { + $sth_check->execute( $c->{module}, $c->{page}, $c->{tablename}, $c->{columnname} ); + if ( $sth_check->fetchrow ) { + $sth_update->execute( + $c->{is_hidden}, + $c->{cannot_be_toggled}, + $c->{module}, + $c->{page}, + $c->{tablename}, + $c->{columnname} + ); + } else { + $sth_insert->execute( + $c->{is_hidden}, + $c->{cannot_be_toggled}, + $c->{module}, + $c->{page}, + $c->{tablename}, + $c->{columnname} + ); + } + } +} + +1; --- a/Koha/Template/Plugin/ColumnsSettings.pm +++ a/Koha/Template/Plugin/ColumnsSettings.pm @@ -0,0 +1,67 @@ +package Koha::Template::Plugin::ColumnsSettings; + +# Copyright BibLibre 2013 + +# 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 2 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, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +use Modern::Perl; + +use Template::Plugin; +use base qw( Template::Plugin ); + +use YAML qw( LoadFile ); +use JSON qw( to_json ); + +use C4::Context qw( config ); +use C4::Utils::DataTables::ColumnsSettings; + +=pod + +This plugin allows to get the column configuration for a table. + +First, include the line '[% USE Tables %]' at the top +of the template to enable the plugin. + +To use, call ColumnsSettings.GetTables with the module and the page where the template is called. + +For example: [% ColumnsSettings.GetTables( 'circ', 'circulation' ) %] + +=cut + +sub GetTables { + my ( $self, $module, $page, $format ) = @_; + $format //= q{}; + + my $columns = C4::Utils::DataTables::ColumnsSettings::get_tables( $module, $page ); + + return $format eq 'json' + ? to_json( $columns ) + : $columns +} + +sub GetColumns { + my ( $self, $module, $page, $table, $format ) = @_; + $format //= q{}; + + my $columns = C4::Utils::DataTables::ColumnsSettings::get_columns( $module, $page, $table ); + + return $format eq 'json' + ? to_json( $columns ) + : $columns +} + +1; + --- a/admin/columns_settings.pl +++ a/admin/columns_settings.pl @@ -0,0 +1,59 @@ +#!/usr/bin/perl + +use Modern::Perl; +use CGI; +use YAML qw( LoadFile ); +use C4::Auth; +use C4::Context; +use C4::Output; +use C4::Utils::DataTables::ColumnsSettings qw( get_modules ); +my $input = new CGI; + +my ($template, $loggedinuser, $cookie) + = get_template_and_user({template_name => "admin/columns_settings.tt", + query => $input, + type => "intranet", + authnotrequired => 0, + flagsrequired => {parameters => 'parameters_remaining_permissions'}, + debug => 1, + }); + + +my $action = $input->param('action') // 'list'; + +if ( $action eq 'save' ) { + my $module = $input->param("module"); + + my @columnids = $input->param("columnid"); + my @columns; + for my $columnid ( @columnids ) { + next unless $columnid =~ m|^([^_]*)_([^_]*)_(.*)$|; + my $is_hidden = $input->param($columnid.'_hidden') // 0; + my $cannot_be_toggled = $input->param($columnid.'_cannot_be_toggled') // 0; + push @columns, + { + module => $module, + page => $1, + tablename => $2, + columnname => $3, + is_hidden => $is_hidden, + cannot_be_toggled => $cannot_be_toggled, + }; + } + + + C4::Utils::DataTables::ColumnsSettings::update_columns( + { + columns => \@columns, + } + ); + + $action = 'list'; +} + +if ( $action eq 'list' ) { + my $modules = C4::Utils::DataTables::ColumnsSettings::get_modules; + $template->param( modules => $modules ); +} + +output_html_with_http_headers $input, $cookie, $template->output; --- a/admin/columns_settings.yml +++ a/admin/columns_settings.yml @@ -0,0 +1,52 @@ +modules: + circ: + circulation: + issuest: + - + columnname: due_date + - + columnname: title + - + columnname: item_type + - + columnname: checked_out_on + - + columnname: checked_out_from + - + columnname: call_no + - + columnname: charge + - + columnname: price + - + columnname: renew + cannot_be_toggled: 1 + cannot_be_modified: 1 + - + columnname: check_in + cannot_be_toggled: 1 + cannot_be_modified: 1 + - + columnname: export + cannot_be_toggled: 1 + cannot_be_modified: 1 + + holdst: + - + columnname: hold_date + - + columnname: title + - + columnname: call_number + - + columnname: barcode + - + columnname: priority + - + columnname: delete + cannot_be_toggled: 1 + cannot_be_modified: 1 + - + columnname: info + cannot_be_toggled: 1 + cannot_be_modified: 1 --- a/circ/circulation.pl +++ a/circ/circulation.pl @@ -358,6 +358,7 @@ if ($borrowernumber) { $getreserv{transfered} = 0; $getreserv{nottransfered} = 0; + $getreserv{reservedate_sort} = $num_res->{'reservedate'}; $getreserv{reservedate} = format_date( $num_res->{'reservedate'} ); $getreserv{reservenumber} = $num_res->{'reservenumber'}; $getreserv{title} = $getiteminfo->{'title'}; --- a/installer/data/mysql/kohastructure.sql +++ a/installer/data/mysql/kohastructure.sql @@ -3078,6 +3078,17 @@ CREATE TABLE IF NOT EXISTS plugin_data ( PRIMARY KEY (plugin_class,plugin_key) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS columns_settings ( + module varchar(255) NOT NULL, + page varchar(255) NOT NULL, + tablename varchar(255) NOT NULL, + columnname varchar(255) NOT NULL, + cannot_be_toggled int(1) NOT NULL DEFAULT 0, + is_hidden int(1) NOT NULL DEFAULT 0, + PRIMARY KEY(module, page, tablename, columnname) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; --- a/installer/data/mysql/updatedatabase.pl +++ a/installer/data/mysql/updatedatabase.pl @@ -6784,6 +6784,22 @@ if ( CheckVersion($DBversion) ) { SetVersion ($DBversion); } +$DBversion = "3.13.00.XXX"; +if ( CheckVersion($DBversion) ) { + $dbh->do(q{ + CREATE TABLE IF NOT EXISTS columns_settings ( + module varchar(255) NOT NULL, + page varchar(255) NOT NULL, + tablename varchar(255) NOT NULL, + columnname varchar(255) NOT NULL, + cannot_be_toggled int(1) NOT NULL DEFAULT 0, + is_hidden int(1) NOT NULL DEFAULT 0, + PRIMARY KEY(module, page, tablename, columnname) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8 + }); + print "Upgrade to $DBversion done (Bug 10212 - Create new table columns_settings)\n"; + SetVersion ($DBversion); +} =head1 FUNCTIONS --- a/koha-tmpl/intranet-tmpl/prog/en/includes/columns_settings.inc +++ a/koha-tmpl/intranet-tmpl/prog/en/includes/columns_settings.inc @@ -0,0 +1,27 @@ +[% USE ColumnsSettings %] + + --- a/koha-tmpl/intranet-tmpl/prog/en/js/datatables.js +++ a/koha-tmpl/intranet-tmpl/prog/en/js/datatables.js @@ -23,7 +23,7 @@ var dataTablesDefaults = { "sSearch" : window.MSG_DT_SEARCH || "Search:", "sZeroRecords" : window.MSG_DT_ZERO_RECORDS || "No matching records found" }, - "sDom": '<"top pager"ilpf>t<"bottom pager"ip>' + "sDom": 'C<"top pager"ilpf>t<"bottom pager"ip>' }; @@ -493,4 +493,5 @@ jQuery.extend( jQuery.fn.dataTableExt.oSort, { "title-string-desc": function ( a, b ) { return ((a < b) ? 1 : ((a > b) ? -1 : 0)); } -} ); +} ); + --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/admin-home.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/admin-home.tt @@ -107,6 +107,8 @@
Define which servers to query for MARC data in the integrated Z39.50 client.
Did you mean?
Choose which plugins to use to suggest searches to patrons and staff.
+
Configure columns
+
Hide or show columns for tables.
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/columns_settings.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/columns_settings.tt @@ -0,0 +1,131 @@ +[% BLOCK pagelist %] +
+
+ + + [% FOR pagename IN module.keys %] +
[% pagename %]
+ [% SET tables = module %] + [% FOR tablename IN tables.$pagename.keys.sort %] + + + + + [% FOR column IN tables.$pagename.$tablename %] + + + + + + [% END %] + +
[% tablename %]
Column nameIs Hidden by defaultCannot be toggled
+ [% column.columnname %] + + + [% IF column.is_hidden %] + [% IF column.cannot_be_modified %] + + + [% ELSE %] + + [% END %] + [% ELSE %] + [% IF column.cannot_be_modified %] + + + [% ELSE %] + + [% END %] + [% END %] + + [% IF column.cannot_be_toggled %] + [% IF column.cannot_be_modified %] + + + [% ELSE %] + + [% END %] + [% ELSE %] + [% IF column.cannot_be_modified %] + + + [% ELSE %] + + [% END %] + [% END %] +
+ [% END %] + [% END %] + +
+
+[% END %] + +[% INCLUDE 'doc-head-open.inc' %] +Koha › Administration › Tables +[% INCLUDE 'doc-head-close.inc' %] + + + +[% INCLUDE 'header.inc' %] +[% INCLUDE 'cat-search.inc' %] + + +
+
+
+
+

Columns settings

+
+

Acquisition

+
+ Acquisition tables +
+ +

Administration

+
+ Administration tables +
+ +

Authorities

+
+ Authorities tables +
+ +

Acquisition

+
+ Acquisition tables +
+ +

Catalogue

+
+ Catalogue tables +
+ +

Cataloguing

+
+ Cataloguing tables +
+ +

Circulation

+
+

Circulation tables

+ [% PROCESS pagelist module=modules.circ modulename="circ" %] +
+
+
+
+ +
+ [% INCLUDE 'admin-menu.inc' %] +
+
+[% INCLUDE 'intranet-bottom.inc' %] --- a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt @@ -1,4 +1,5 @@ [% USE KohaDates %] +[% USE ColumnsSettings %] [% IF ( export_remove_fields OR export_with_csv_profile ) %] [% SET exports_enabled = 1 %] [% END %] @@ -12,10 +13,15 @@ [% INCLUDE 'doc-head-close.inc' %] [% INCLUDE 'calendar.inc' %] -[% IF ( UseTablesortForCirc ) %] - -[% INCLUDE 'datatables-strings.inc' %] -[% END %] +[% IF ( UseTablesortForCirc ) %] + + + + [% INCLUDE 'datatables-strings.inc' %] + + + [% INCLUDE 'columns_settings.inc' %] +[% END %]