View | Details | Raw Unified | Return to bug 17170
Collapse All | Expand All

(-)a/Koha/SearchFilter.pm (-1 / +1 lines)
Lines 15-21 package Koha::SearchFilter; Link Here
15
# along with Koha; if not, see <http://www.gnu.org/licenses>.
15
# along with Koha; if not, see <http://www.gnu.org/licenses>.
16
16
17
use Modern::Perl;
17
use Modern::Perl;
18
18
use JSON qw( encode_json decode_json );
19
19
20
use Koha::Database;
20
use Koha::Database;
21
21
(-)a/catalogue/search.pl (+24 lines)
Lines 156-163 use Koha::SearchEngine::Search; Link Here
156
use Koha::SearchEngine::QueryBuilder;
156
use Koha::SearchEngine::QueryBuilder;
157
use Koha::Virtualshelves;
157
use Koha::Virtualshelves;
158
use Koha::SearchFields;
158
use Koha::SearchFields;
159
use Koha::SearchFilters;
159
160
160
use URI::Escape;
161
use URI::Escape;
162
use JSON qw( decode_json encode_json );
161
163
162
my $DisplayMultiPlaceHold = C4::Context->preference("DisplayMultiPlaceHold");
164
my $DisplayMultiPlaceHold = C4::Context->preference("DisplayMultiPlaceHold");
163
# create a new CGI object
165
# create a new CGI object
Lines 485-490 $template->param ( QUERY_INPUTS => \@query_inputs, Link Here
485
487
486
## parse the limit_cgi string and put it into a form suitable for <input>s
488
## parse the limit_cgi string and put it into a form suitable for <input>s
487
my @limit_inputs;
489
my @limit_inputs;
490
my %active_filters;
488
if ($limit_cgi) {
491
if ($limit_cgi) {
489
    for my $this_cgi ( split('&', $limit_cgi) ) {
492
    for my $this_cgi ( split('&', $limit_cgi) ) {
490
        next unless $this_cgi;
493
        next unless $this_cgi;
Lines 498-503 if ($limit_cgi) { Link Here
498
        my $input_value = $2;
501
        my $input_value = $2;
499
        $input_name =~ s/=$//;
502
        $input_name =~ s/=$//;
500
        push @limit_inputs, { input_name => $input_name, input_value => Encode::decode_utf8( uri_unescape($input_value) ) };
503
        push @limit_inputs, { input_name => $input_name, input_value => Encode::decode_utf8( uri_unescape($input_value) ) };
504
        if( $input_value =~ /search_filter/ ){
505
            my ($filter_id) = ( uri_unescape($input_value) =~ /^search_filter:(.*)$/ );
506
            $active_filters{$filter_id} = 1;
507
        }
508
501
    }
509
    }
502
}
510
}
503
$template->param ( LIMIT_INPUTS => \@limit_inputs );
511
$template->param ( LIMIT_INPUTS => \@limit_inputs );
Lines 607-615 for (my $i=0;$i<@servers;$i++) { Link Here
607
        $template->param (z3950_search_params => C4::Search::z3950_search_args($z3950par || $query_desc));
615
        $template->param (z3950_search_params => C4::Search::z3950_search_args($z3950par || $query_desc));
608
        $template->param(limit_cgi => $limit_cgi);
616
        $template->param(limit_cgi => $limit_cgi);
609
        $template->param(query_cgi => $query_cgi);
617
        $template->param(query_cgi => $query_cgi);
618
        $template->param(query_json => encode_json({
619
            operators => \@operators,
620
            operands => \@operands,
621
            indexes => \@indexes
622
        }));
623
        $template->param(limit_json => encode_json({
624
            limits => \@limits
625
        }));
610
        $template->param(query_desc => $query_desc);
626
        $template->param(query_desc => $query_desc);
611
        $template->param(limit_desc => $limit_desc);
627
        $template->param(limit_desc => $limit_desc);
612
        $template->param(offset     => $offset);
628
        $template->param(offset     => $offset);
629
        $template->param(offset     => $offset);
630
613
631
614
        if ($hits) {
632
        if ($hits) {
615
            $template->param(total => $hits);
633
            $template->param(total => $hits);
Lines 698-703 for my $facet ( @$facets ) { Link Here
698
    }
716
    }
699
}
717
}
700
718
719
720
$template->param(
721
    search_filters => Koha::SearchFilters->search({ staff_client => 1 }, { order_by => "name" }),
722
    active_filters => \%active_filters,
723
) if C4::Context->preference('SavedSearchFilters');
724
701
$template->param(
725
$template->param(
702
            #classlist => $classlist,
726
            #classlist => $classlist,
703
            total => $total,
727
            total => $total,
(-)a/koha-tmpl/intranet-tmpl/prog/en/includes/facets.inc (+18 lines)
Lines 1-11 Link Here
1
[% USE raw %]
1
[% USE raw %]
2
[% USE AuthorisedValues %]
2
[% USE AuthorisedValues %]
3
[% USE Languages %]
3
[% USE Languages %]
4
4
[% IF ( opacfacets ) %]
5
[% IF ( opacfacets ) %]
5
[% IF ( facets_loop ) %]
6
[% IF ( facets_loop ) %]
6
<div id="search-facets">
7
<div id="search-facets">
7
<h4>Refine your search</h4>
8
<h4>Refine your search</h4>
8
<ul>
9
<ul>
10
[% IF Koha.Preference("SavedSearchFilters") && search_filters.count > 0 %]
11
<li id="search-filters">
12
<span id="filter_facets">Custom search filters</span>
13
<ul>
14
    [% SET base_url = "/cgi-bin/koha/catalogue/search.pl?" _ query_cgi _ limit_cgi %]
15
    [% FOREACH search_filter IN search_filters %]
16
    <li>
17
        [% IF active_filters.${search_filter.id} %]
18
            <span class="filter_label">[% search_filter.name | html %]<a href="[% base_url _ '&nolimit=search_filter:' _ search_filter.id | url %]">[X]</a></span>
19
        [% ELSE %]
20
            <span class="filter_label"><a href="[% base_url _ '&limit=search_filter:' _ search_filter.id | url %]">[% search_filter.name | html %]</a></span>
21
        [% END %]
22
    </li>
23
    [% END %]
24
</ul>
25
</li>
26
[% END %]
9
    <li id="availability_facet">Availability<ul><li>[% IF ( available ) %]<strong>Showing only available items</strong></li><li><a href="/cgi-bin/koha/catalogue/search.pl?[% query_cgi | $raw %][% limit_cgi_not_availablity | $raw %][% IF ( sort_by ) %]&amp;sort_by=[% sort_by | uri %][% END %]">Show all items</a>[% ELSE %]<a href="/cgi-bin/koha/catalogue/search.pl?[% query_cgi | $raw %][% limit_cgi | $raw %][% IF ( sort_by ) %]&amp;sort_by=[% sort_by | uri %][% END %]&amp;limit=available">Limit to currently available items</a>[% END %]</li></ul>
27
    <li id="availability_facet">Availability<ul><li>[% IF ( available ) %]<strong>Showing only available items</strong></li><li><a href="/cgi-bin/koha/catalogue/search.pl?[% query_cgi | $raw %][% limit_cgi_not_availablity | $raw %][% IF ( sort_by ) %]&amp;sort_by=[% sort_by | uri %][% END %]">Show all items</a>[% ELSE %]<a href="/cgi-bin/koha/catalogue/search.pl?[% query_cgi | $raw %][% limit_cgi | $raw %][% IF ( sort_by ) %]&amp;sort_by=[% sort_by | uri %][% END %]&amp;limit=available">Limit to currently available items</a>[% END %]</li></ul>
10
	[% IF ( related ) %] <li>(related searches: [% FOREACH relate IN related %][% relate.related_search | html %][% END %])</li>[% END %]
28
	[% IF ( related ) %] <li>(related searches: [% FOREACH relate IN related %][% relate.related_search | html %][% END %])</li>[% END %]
11
	</li>
29
	</li>
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/results.tt (+121 lines)
Lines 79-84 Link Here
79
                            <input type="submit" id="refine" value="Search">
79
                            <input type="submit" id="refine" value="Search">
80
                        </form>
80
                        </form>
81
                    </div>
81
                    </div>
82
                    [% IF ( Koha.Preference('SavedSearchFilters') && CAN_user_parameters_manage_search_filters ) %]
83
                        | <a href="#" id="save_search_filter">Save search as filter</a>
84
                    [% END %]
82
85
83
                    <div class="searchheader" id="searchheader">
86
                    <div class="searchheader" id="searchheader">
84
                        <div id="selection_ops">
87
                        <div id="selection_ops">
Lines 341-346 Link Here
341
                                <p><a href="/cgi-bin/koha/acqui/basket.pl?basketno=[% searchtoorder_basketno | uri %]">View basket<a></p>
344
                                <p><a href="/cgi-bin/koha/acqui/basket.pl?basketno=[% searchtoorder_basketno | uri %]">View basket<a></p>
342
                            [% END %]
345
                            [% END %]
343
                            <a href="/cgi-bin/koha/catalogue/search.pl?advsearch=1&edit_search=1&[% query_cgi | $raw %]&[% limit_cgi | $raw %]&sort_by=[% sort_by | $raw %]">Edit this search</a>
346
                            <a href="/cgi-bin/koha/catalogue/search.pl?advsearch=1&edit_search=1&[% query_cgi | $raw %]&[% limit_cgi | $raw %]&sort_by=[% sort_by | $raw %]">Edit this search</a>
347
                            [% IF ( Koha.Preference('SavedSearchFilters') &&CAN_user_parameters_manage_search_filters ) %]
348
                                | <a href="#" id="save_search_filter">Save search as filter</a>
349
                            [% END %]
344
                        [% ELSE %]
350
                        [% ELSE %]
345
                            <p>You did not specify any search criteria.</p>
351
                            <p>You did not specify any search criteria.</p>
346
                        [% END %]
352
                        [% END %]
Lines 704-709 Link Here
704
                </div>
710
                </div>
705
                [% END #/IF outer_sup_results_loop %]
711
                [% END #/IF outer_sup_results_loop %]
706
712
713
                [% IF ( Koha.Preference('SavedSearchFilters') && CAN_user_parameters_manage_search_filters ) %]
714
                    <div id="search_filters_modal" class="modal" role="dialog" aria-hidden="true">
715
                        <div class="modal-dialog">
716
                        <div class="modal-content">
717
                            <div class="modal-header">
718
                                <button type="button" class="closebtn" data-dismiss="modal" aria-hidden="true">×</button>
719
                                <h3 id="search_filters_label">Save: '[% query_desc | html %]' with limits '[% limit_desc | html %]' as filter</h3>
720
                            </div>
721
                            <div class="modal-body">
722
                                <h6>Visibility:</h6>
723
                                <label for="show_filter_opac">Show in OPAC?</label>
724
                                <input type="checkbox" id="show_filter_opac" name="show_filter_opac">
725
                                <label for="show_filter_staff_client">Show in Staff client?</label>
726
                                <input type="checkbox" id="show_filter_staff_client" name="show_filter_staff_client">
727
                                <hr>
728
                                <h6>Save as new search filter:</h6>
729
                                <label for="new_filter">Name:</label>
730
                                <input id="new_filter" name="new_filter" type="text">
731
                                <a id="save_new_filter" class="btn btn-default btn-xs" href="#">Save</a>
732
                                </br>OR</br>
733
                                <h6>Replace existing search filter:</h6>
734
                                <label for="existing_filters">Choose</label>
735
                                <select id="existing_filters" name="existing_filters" class="search_filters_list"></select>
736
                                <a id="replace_existing_filter" class="btn btn-default btn-xs" href="#">Replace</a>
737
                            </div>
738
                            <div class="modal-footer">
739
                                <a href="#" data-dismiss="modal" aria-hidden="true" class="cancel">Cancel</a>
740
                            </div>
741
                        </div>
742
                        </div>
743
                    </div>
744
                [% END %]
745
707
                <form id="hold_form" method="get" action="/cgi-bin/koha/reserve/request.pl">
746
                <form id="hold_form" method="get" action="/cgi-bin/koha/reserve/request.pl">
708
                    <!-- Value will be set here by placeHold() -->
747
                    <!-- Value will be set here by placeHold() -->
709
                    <input type="hidden" name="findborrower" id="holdFor" value="" />
748
                    <input type="hidden" name="findborrower" id="holdFor" value="" />
Lines 729-734 Link Here
729
    [% Asset.js("js/browser.js") | $raw %]
768
    [% Asset.js("js/browser.js") | $raw %]
730
    [% Asset.js("lib/hc-sticky.js") | $raw %]
769
    [% Asset.js("lib/hc-sticky.js") | $raw %]
731
    [% Asset.js("js/coce.js") | $raw %]
770
    [% Asset.js("js/coce.js") | $raw %]
771
    [% Asset.css("css/humanmsg.css") | $raw %]
772
    [% Asset.js("lib/jquery/plugins/humanmsg.js") | $raw %]
773
    [% INCLUDE 'select2.inc' %]
732
    <script>
774
    <script>
733
        var PREF_AmazonCoverImages = parseInt( "[% Koha.Preference('AmazonCoverImages') | html %]", 10);
775
        var PREF_AmazonCoverImages = parseInt( "[% Koha.Preference('AmazonCoverImages') | html %]", 10);
734
        var q_array = new Array();  // will hold search terms, if present
776
        var q_array = new Array();  // will hold search terms, if present
Lines 762-767 Link Here
762
            query_desc: "[% To.json( query_desc ) | html %]",
804
            query_desc: "[% To.json( query_desc ) | html %]",
763
            query_cgi: "[% query_cgi | html %]",
805
            query_cgi: "[% query_cgi | html %]",
764
            limit_cgi: "[% limit_cgi | html %]",
806
            limit_cgi: "[% limit_cgi | html %]",
807
            query_json: [% query_json | $raw %],
808
            limit_json: [% limit_json | $raw %],
765
            sort_by: "[% sort_by | html %]",
809
            sort_by: "[% sort_by | html %]",
766
            gotoPage: "[% gotoPage | html %]",
810
            gotoPage: "[% gotoPage | html %]",
767
            gotoNumber: "[% gotoNumber | html %]",
811
            gotoNumber: "[% gotoNumber | html %]",
Lines 778-783 Link Here
778
            if( index){index += ":";}
822
            if( index){index += ":";}
779
            window.location.href = "/cgi-bin/koha/catalogue/search.pl?[% query_cgi | $raw %]&[% limit_cgi | $raw %]&[% sort_cgi | $raw %]&limit="+index+escape_str( $("#refiner").val() );
823
            window.location.href = "/cgi-bin/koha/catalogue/search.pl?[% query_cgi | $raw %]&[% limit_cgi | $raw %]&[% sort_cgi | $raw %]&limit="+index+escape_str( $("#refiner").val() );
780
        });
824
        });
825
826
        [% IF ( CAN_user_parameters_manage_search_filters ) %]
827
            function getFilters(id) {
828
                const select = $("#existing_filters");
829
                $("option[value!='']", select).remove();
830
                return new Promise(function(resolve, reject) {
831
                    $.ajax("/api/v1/search_filters")
832
                    .then(resolve, reject);
833
                })
834
                .then(function(filters) {
835
                    filters.forEach(function(filter) {
836
                        const opt = $("<option/>");
837
                        select.append(opt);
838
                        if(id && filter.search_filter_id == id) {
839
                            opt.prop('selected', true);
840
                        }
841
                        opt.attr("value", filter.search_filter_id);
842
                        opt.attr("title", "Query:" + filter.filter_query + " Limit:"+filter.filter_limits);
843
                        opt.text(filter.name);
844
                        opt.data("filter", filter);
845
                    });
846
                })
847
                .then(function(){
848
                    select.change();
849
                });
850
            }
851
            $("#save_search_filter").click(function(){
852
                getFilters();
853
                $("#search_filters_modal").modal('show');
854
            });
855
            $("#save_new_filter").click(function(){
856
                let name = $("#new_filter").val().trim();
857
                if(!name){
858
                    humanMsg.displayAlert( _("You must provide a name for the new filter"), { className: 'human Error' } );
859
                    return;
860
                }
861
                let opac = $("#show_filter_opac").prop('checked');
862
                let staff = $("#show_filter_staff_client").prop('checked');
863
                save_search_filter(name,null,opac,staff);
864
            });
865
            $("#replace_existing_filter").click(function(){
866
                let id = $("#existing_filters").val();
867
                let name = $("#existing_filters option[value="+id+"]").text();
868
                console.log(id,name);
869
                save_search_filter(name,id);
870
            });
871
            function save_search_filter(name,id,opac,staff){
872
                let options = {
873
                    url: '/api/v1/search_filters',
874
                    contentType: "application/json",
875
                    data: JSON.stringify({
876
                        name: name,
877
                        filter_query: JSON.stringify(search_result.query_json),
878
                        filter_limits: JSON.stringify(search_result.limit_json),
879
                        opac: opac,
880
                        staff_client: staff,
881
                    })
882
                };
883
                if (id){
884
                    options.method = "PUT";
885
                    options.url = options.url+"/"+id
886
                } else {
887
                    options.method = "POST";
888
                }
889
                $.ajax(options)
890
                    .then(function(result) {
891
                        $("#search_filters_modal").modal('hide');
892
                        humanMsg.displayAlert( _("Saved filter: ") + name  , { className: 'human Success' } );
893
                        getFilters();
894
                    })
895
                    .fail(function(err) {
896
                        console.log(err);
897
                        humanMsg.displayAlert( _("There was an error during saving:") + err.responseText, { className: 'humanError' } );
898
                    });
899
            }
900
901
        [% END %]
781
    </script>
902
    </script>
782
    [% Asset.js("js/pages/results.js") | $raw %]
903
    [% Asset.js("js/pages/results.js") | $raw %]
783
[% END %]
904
[% END %]
(-)a/koha-tmpl/opac-tmpl/bootstrap/en/includes/opac-facets.inc (+17 lines)
Lines 5-10 Link Here
5
    <div id="search-facets">
5
    <div id="search-facets">
6
        <h2><a href="#" class="menu-collapse-toggle">Refine your search</a></h2>
6
        <h2><a href="#" class="menu-collapse-toggle">Refine your search</a></h2>
7
        <ul class="menu-collapse">
7
        <ul class="menu-collapse">
8
            [% IF Koha.Preference("SavedSearchFilters") && search_filters.size > 0 %]
9
            <li id="search-filters">
10
            <h3 id="filter_facets">Custom search filters</h3>
11
            <ul>
12
                [% SET base_url = "/cgi-bin/koha/opac-search.pl?" _ query_cgi _ limit_cgi %]
13
                [% FOREACH search_filter IN search_filters %]
14
                <li>
15
                    [% IF active_filters.${search_filter.id} %]
16
                        <span class="filter_label">[% search_filter.name | html %]<a href="[% base_url _ '&nolimit=search_filter:' _ search_filter.id | url %]">[X]</a></span>
17
                    [% ELSE %]
18
                        <span class="filter_label"><a href="[% base_url _ '&limit=search_filter:' _ search_filter.id | url %]">[% search_filter.name | html %]</a></span>
19
                    [% END %]
20
                </li>
21
                [% END %]
22
            </ul>
23
            </li>
24
            [% END %]
8
            <li id="availability_facet"><h3 id="facet-availability">Availability</h3>
25
            <li id="availability_facet"><h3 id="facet-availability">Availability</h3>
9
                <ul>
26
                <ul>
10
                    <li>
27
                    <li>
(-)a/opac/opac-search.pl (-1 / +10 lines)
Lines 864-869 for my $facet ( @$facets ) { Link Here
864
    }
864
    }
865
}
865
}
866
866
867
my @search_filters = Koha::SearchFilters->search({ opac => 1 }, { order_by => "name" })->as_list;
868
my %active_filters;
869
foreach my $sf (@search_filters){
870
    $active_filters{$sf->id} = 1 if grep { "search_filter:".$sf->id eq $_->{input_value} } @limit_inputs;
871
}
872
$template->param(
873
    search_filters => \@search_filters,
874
    active_filters => \%active_filters,
875
) if C4::Context->preference('SavedSearchFilters');
876
867
877
868
$template->param(
878
$template->param(
869
            #classlist => $classlist,
879
            #classlist => $classlist,
870
- 

Return to bug 17170