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 703-708 Link Here
703
                </div>
709
                </div>
704
                [% END #/IF outer_sup_results_loop %]
710
                [% END #/IF outer_sup_results_loop %]
705
711
712
                [% IF ( Koha.Preference('SavedSearchFilters') && CAN_user_parameters_manage_search_filters ) %]
713
                    <div id="search_filters_modal" class="modal" role="dialog" aria-hidden="true">
714
                        <div class="modal-dialog">
715
                        <div class="modal-content">
716
                            <div class="modal-header">
717
                                <button type="button" class="closebtn" data-dismiss="modal" aria-hidden="true">×</button>
718
                                <h3 id="search_filters_label">Save: '[% query_desc | html %]' with limits '[% limit_desc | html %]' as filter</h3>
719
                            </div>
720
                            <div class="modal-body">
721
                                <h6>Visibility:</h6>
722
                                <label for="show_filter_opac">Show in OPAC?</label>
723
                                <input type="checkbox" id="show_filter_opac" name="show_filter_opac">
724
                                <label for="show_filter_staff_client">Show in Staff client?</label>
725
                                <input type="checkbox" id="show_filter_staff_client" name="show_filter_staff_client">
726
                                <hr>
727
                                <h6>Save as new search filter:</h6>
728
                                <label for="new_filter">Name:</label>
729
                                <input id="new_filter" name="new_filter" type="text">
730
                                <a id="save_new_filter" class="btn btn-default btn-xs" href="#">Save</a>
731
                                </br>OR</br>
732
                                <h6>Replace existing search filter:</h6>
733
                                <label for="existing_filters">Choose</label>
734
                                <select id="existing_filters" name="existing_filters" class="search_filters_list"></select>
735
                                <a id="replace_existing_filter" class="btn btn-default btn-xs" href="#">Replace</a>
736
                            </div>
737
                            <div class="modal-footer">
738
                                <a href="#" data-dismiss="modal" aria-hidden="true" class="cancel">Cancel</a>
739
                            </div>
740
                        </div>
741
                        </div>
742
                    </div>
743
                [% END %]
744
706
                <form id="hold_form" method="get" action="/cgi-bin/koha/reserve/request.pl">
745
                <form id="hold_form" method="get" action="/cgi-bin/koha/reserve/request.pl">
707
                    <!-- Value will be set here by placeHold() -->
746
                    <!-- Value will be set here by placeHold() -->
708
                    <input type="hidden" name="findborrower" id="holdFor" value="" />
747
                    <input type="hidden" name="findborrower" id="holdFor" value="" />
Lines 728-733 Link Here
728
    [% Asset.js("js/browser.js") | $raw %]
767
    [% Asset.js("js/browser.js") | $raw %]
729
    [% Asset.js("lib/hc-sticky.js") | $raw %]
768
    [% Asset.js("lib/hc-sticky.js") | $raw %]
730
    [% Asset.js("js/coce.js") | $raw %]
769
    [% Asset.js("js/coce.js") | $raw %]
770
    [% Asset.css("css/humanmsg.css") | $raw %]
771
    [% Asset.js("lib/jquery/plugins/humanmsg.js") | $raw %]
772
    [% INCLUDE 'select2.inc' %]
731
    <script>
773
    <script>
732
        var PREF_AmazonCoverImages = parseInt( "[% Koha.Preference('AmazonCoverImages') | html %]", 10);
774
        var PREF_AmazonCoverImages = parseInt( "[% Koha.Preference('AmazonCoverImages') | html %]", 10);
733
        var q_array = new Array();  // will hold search terms, if present
775
        var q_array = new Array();  // will hold search terms, if present
Lines 761-766 Link Here
761
            query_desc: "[% To.json( query_desc ) | html %]",
803
            query_desc: "[% To.json( query_desc ) | html %]",
762
            query_cgi: "[% query_cgi | html %]",
804
            query_cgi: "[% query_cgi | html %]",
763
            limit_cgi: "[% limit_cgi | html %]",
805
            limit_cgi: "[% limit_cgi | html %]",
806
            query_json: [% query_json | $raw %],
807
            limit_json: [% limit_json | $raw %],
764
            sort_by: "[% sort_by | html %]",
808
            sort_by: "[% sort_by | html %]",
765
            gotoPage: "[% gotoPage | html %]",
809
            gotoPage: "[% gotoPage | html %]",
766
            gotoNumber: "[% gotoNumber | html %]",
810
            gotoNumber: "[% gotoNumber | html %]",
Lines 777-782 Link Here
777
            if( index){index += ":";}
821
            if( index){index += ":";}
778
            window.location.href = "/cgi-bin/koha/catalogue/search.pl?[% query_cgi | $raw %]&[% limit_cgi | $raw %]&[% sort_cgi | $raw %]&limit="+index+escape_str( $("#refiner").val() );
822
            window.location.href = "/cgi-bin/koha/catalogue/search.pl?[% query_cgi | $raw %]&[% limit_cgi | $raw %]&[% sort_cgi | $raw %]&limit="+index+escape_str( $("#refiner").val() );
779
        });
823
        });
824
825
        [% IF ( CAN_user_parameters_manage_search_filters ) %]
826
            function getFilters(id) {
827
                const select = $("#existing_filters");
828
                $("option[value!='']", select).remove();
829
                return new Promise(function(resolve, reject) {
830
                    $.ajax("/api/v1/search_filters")
831
                    .then(resolve, reject);
832
                })
833
                .then(function(filters) {
834
                    filters.forEach(function(filter) {
835
                        const opt = $("<option/>");
836
                        select.append(opt);
837
                        if(id && filter.search_filter_id == id) {
838
                            opt.prop('selected', true);
839
                        }
840
                        opt.attr("value", filter.search_filter_id);
841
                        opt.attr("title", "Query:" + filter.filter_query + " Limit:"+filter.filter_limits);
842
                        opt.text(filter.name);
843
                        opt.data("filter", filter);
844
                    });
845
                })
846
                .then(function(){
847
                    select.change();
848
                });
849
            }
850
            $("#save_search_filter").click(function(){
851
                getFilters();
852
                $("#search_filters_modal").modal('show');
853
            });
854
            $("#save_new_filter").click(function(){
855
                let name = $("#new_filter").val().trim();
856
                if(!name){
857
                    humanMsg.displayAlert( _("You must provide a name for the new filter"), { className: 'human Error' } );
858
                    return;
859
                }
860
                let opac = $("#show_filter_opac").prop('checked');
861
                let staff = $("#show_filter_staff_client").prop('checked');
862
                save_search_filter(name,null,opac,staff);
863
            });
864
            $("#replace_existing_filter").click(function(){
865
                let id = $("#existing_filters").val();
866
                let name = $("#existing_filters option[value="+id+"]").text();
867
                console.log(id,name);
868
                save_search_filter(name,id);
869
            });
870
            function save_search_filter(name,id,opac,staff){
871
                let options = {
872
                    url: '/api/v1/search_filters',
873
                    contentType: "application/json",
874
                    data: JSON.stringify({
875
                        name: name,
876
                        filter_query: JSON.stringify(search_result.query_json),
877
                        filter_limits: JSON.stringify(search_result.limit_json),
878
                        opac: opac,
879
                        staff_client: staff,
880
                    })
881
                };
882
                if (id){
883
                    options.method = "PUT";
884
                    options.url = options.url+"/"+id
885
                } else {
886
                    options.method = "POST";
887
                }
888
                $.ajax(options)
889
                    .then(function(result) {
890
                        $("#search_filters_modal").modal('hide');
891
                        humanMsg.displayAlert( _("Saved filter: ") + name  , { className: 'human Success' } );
892
                        getFilters();
893
                    })
894
                    .fail(function(err) {
895
                        console.log(err);
896
                        humanMsg.displayAlert( _("There was an error during saving:") + err.responseText, { className: 'humanError' } );
897
                    });
898
            }
899
900
        [% END %]
780
    </script>
901
    </script>
781
    [% Asset.js("js/pages/results.js") | $raw %]
902
    [% Asset.js("js/pages/results.js") | $raw %]
782
[% END %]
903
[% 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