diff --git a/C4/Utils/DataTables/ColumnsSettings.pm b/C4/Utils/DataTables/ColumnsSettings.pm new file mode 100644 index 0000000000..8b8c79fb5a --- /dev/null +++ b/C4/Utils/DataTables/ColumnsSettings.pm @@ -0,0 +1,106 @@ +package C4::Utils::DataTables::ColumnsSettings; + +use Modern::Perl; +use List::Util qw( first ); +use YAML; +use C4::Context; +use Koha::Database; + +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_columns { + my ( $module, $page, $tablename ) = @_; + + my $list = get_yaml; + + my $schema = Koha::Database->new->schema; + + my $rs = $schema->resultset('ColumnsSetting')->search( + { + module => $module, + page => $page, + tablename => $tablename, + } + ); + + while ( my $c = $rs->next ) { + 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 $schema = Koha::Database->new->schema; + my $rs = $schema->resultset('ColumnsSetting')->search; + + while ( my $c = $rs->next ) { + 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 $schema = Koha::Database->new->schema; + + for my $c (@$columns) { + $c->{is_hidden} //= 0; + $c->{cannot_be_toggled} //= 0; + + my $column = $schema->resultset('ColumnsSetting')->search( + { + module => $c->{module}, + page => $c->{page}, + tablename => $c->{tablename}, + columnname => $c->{columnname}, + } + ); + if ( $column->count ) { + $column = $column->first; + $column->update( + { + module => $c->{module}, + page => $c->{page}, + tablename => $c->{tablename}, + columnname => $c->{columnname}, + is_hidden => $c->{is_hidden}, + cannot_be_toggled => $c->{cannot_be_toggled}, + } + ); + } + else { + $schema->resultset('ColumnsSetting')->create( + { + module => $c->{module}, + page => $c->{page}, + tablename => $c->{tablename}, + columnname => $c->{columnname}, + is_hidden => $c->{is_hidden}, + cannot_be_toggled => $c->{cannot_be_toggled}, + } + ); + } + } +} + +1; diff --git a/Koha/Template/Plugin/ColumnsSettings.pm b/Koha/Template/Plugin/ColumnsSettings.pm new file mode 100644 index 0000000000..4617969d3a --- /dev/null +++ b/Koha/Template/Plugin/ColumnsSettings.pm @@ -0,0 +1,55 @@ +package Koha::Template::Plugin::ColumnsSettings; + +# This file is part of Koha. +# +# Copyright BibLibre 2014 +# +# 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 . + +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.GetColumns with the module, the page and the table where the template is called. + +For example: [% ColumnsSettings.GetColumns( 'circ', 'circulation', 'holdst' ) %] + +=cut + +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; diff --git a/admin/columns_settings.pl b/admin/columns_settings.pl new file mode 100755 index 0000000000..c0c117bb27 --- /dev/null +++ b/admin/columns_settings.pl @@ -0,0 +1,62 @@ +#!/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( + panel => ( $input->param('panel') || 0 ), + modules => $modules, + ); +} + +output_html_with_http_headers $input, $cookie, $template->output; diff --git a/admin/columns_settings.yml b/admin/columns_settings.yml new file mode 100644 index 0000000000..91d69f4b1d --- /dev/null +++ b/admin/columns_settings.yml @@ -0,0 +1,10 @@ +modules: + module_name: + page_name: + table_id: + - + columnname: my_column_name + - + columnname: my_other_column_name + cannot_be_toggled: 1 + cannot_be_modified: 1 diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/admin-menu.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/admin-menu.inc index ebd345c7f4..8d667e0437 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/includes/admin-menu.inc +++ b/koha-tmpl/intranet-tmpl/prog/en/includes/admin-menu.inc @@ -62,6 +62,7 @@
  • Z39.50 client targets
  • Did you mean?
  • +
  • Columns settings
  • diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/columns_settings.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/columns_settings.inc new file mode 100644 index 0000000000..5a62030da5 --- /dev/null +++ b/koha-tmpl/intranet-tmpl/prog/en/includes/columns_settings.inc @@ -0,0 +1,27 @@ +[% USE ColumnsSettings %] + + diff --git a/koha-tmpl/intranet-tmpl/prog/en/js/datatables.js b/koha-tmpl/intranet-tmpl/prog/en/js/datatables.js index c1224f0fe9..49ccb746dd 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/js/datatables.js +++ b/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>tr<"bottom pager"ip>', + "sDom": 'C<"top pager"ilpf>tr<"bottom pager"ip>', "aLengthMenu": [[10, 20, 50, 100, -1], [10, 20, 50, 100, window.MSG_DT_ALL || "All"]], "iDisplayLength": 20 }; diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/admin-home.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/admin-home.tt index 217b069c35..54242fd542 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/admin-home.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/admin-home.tt @@ -104,6 +104,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.
    diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/columns_settings.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/columns_settings.tt new file mode 100644 index 0000000000..5d7d1338e5 --- /dev/null +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/columns_settings.tt @@ -0,0 +1,144 @@ +[% SET panel_id = 0 %] +[% BLOCK pagelist %] +
    +
    + + + + [% SET panel_id = panel_id + 1 %] + [% IF module.keys and module.keys.size > 0 %] + [% FOR pagename IN module.keys %] +
    [% pagename %]
    + [% SET tables = module %] + [% IF tables.$pagename.keys and tables.$pagename.keys.size > 0 %] + [% 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 %] + + [% ELSE %] + There is no table to configure for this module. + [% END %] + [% END %] + [% ELSE %] + There is no page using the table configuration in this module. + [% END %] +
    +
    +[% END %] + +[% INCLUDE 'doc-head-open.inc' %] +Koha › Administration › Columns settings +[% INCLUDE 'doc-head-close.inc' %] + + + +[% INCLUDE 'header.inc' %] +[% INCLUDE 'cat-search.inc' %] + + +
    +
    +
    +
    +

    Columns settings

    +
    +

    Acquisition

    +
    +

    Acquisition tables

    + [% PROCESS pagelist module=modules.acqui modulename="acqui" %] +
    + +

    Administration

    +
    +

    Administration tables

    + [% PROCESS pagelist module=modules.admin modulename="admin" %] +
    + +

    Authorities

    +
    +

    Authorities tables

    + [% PROCESS pagelist module=modules.authorities modulename="authorities" %] +
    + +

    Catalog

    +
    +

    Catalogue tables

    + [% PROCESS pagelist module=modules.catalogue modulename="catalogue" %] +
    + +

    Cataloging

    +
    +

    Cataloguing tables

    + [% PROCESS pagelist module=modules.cataloguing modulename="cataloguing" %] +
    + +

    Circulation

    +
    +

    Circulation tables

    + [% PROCESS pagelist module=modules.circ modulename="circ" %] +
    +
    +
    +
    + +
    + [% INCLUDE 'admin-menu.inc' %] +
    +
    +[% INCLUDE 'intranet-bottom.inc' %]