Bug 36838: Add CSRF token to tags review AJAX requests
[koha.git] / koha-tmpl / intranet-tmpl / prog / js / pages / tags-review.js
1 review_ajax_params = {
2     url: "/cgi-bin/koha/tags/review.pl",
3     dataType: "script"
4 };
5
6 var ok_count  = 0;
7 var nok_count = 0;
8 var rej_count = 0;
9 var alerted = 0;
10
11 function pull_counts () {
12     ok_count  = parseInt(document.getElementById("terms_summary_approved_count"  ).innerHTML);
13     nok_count = parseInt(document.getElementById("terms_summary_unapproved_count").innerHTML);
14     rej_count = parseInt(document.getElementById("terms_summary_rejected_count"  ).innerHTML);
15 }
16
17 function count_approve () {
18     pull_counts();
19     if (nok_count > 0) {
20         $("#terms_summary_unapproved_count").html(nok_count -1);
21         $("#terms_summary_approved_count"  ).html( ok_count +1);
22     }
23 }
24
25 function count_reject () {
26     pull_counts();
27     if (nok_count > 0) {
28         $("#terms_summary_unapproved_count").html(nok_count -1);
29         $("#terms_summary_rejected_count"  ).html(rej_count +1);
30     }
31 }
32
33 var success_approve = function(tag){
34     // window.alert(__("AJAX approved tag: ") + tag);
35 };
36 var failure_approve = function(tag){
37     window.alert( __("AJAX failed to approve tag: %s").format(decodeURIComponent(tag)) );
38 };
39 var success_reject  = function(tag){
40     // window.alert(__("AJAX rejected tag: ") + tag);
41 };
42 var failure_reject  = function(tag){
43     window.alert( __("AJAX failed to reject tag: %s").format(decodeURIComponent(tag)) );
44 };
45 var success_test    = function(tag){
46     $('#verdict').html( __("%s is permitted!").format(decodeURIComponent(tag)) );
47 };
48 var failure_test    = function(tag){
49     $('#verdict').html( __("%s is prohibited!").format(decodeURIComponent(tag)) );
50 };
51 var indeterminate_test = function(tag){
52     $('#verdict').html( __("%s is neither permitted nor prohibited!").format(decodeURIComponent(tag)) );
53 };
54
55 var success_test_call = function() {
56     $('#test_button').prop('disabled', false);
57     $('#test_button').html("<i class='fa fa-check-square' aria-hidden='true'></i>" +__(" Test"));
58 };
59
60 $(document).ready(function() {
61     $("#tagst").dataTable($.extend(true, {}, dataTablesDefaults, {
62         "columnDefs":  [
63             { "orderable":  false, "searchable":  false, "targets":  [ 'NoSort' ] },
64             { "type":  "anti-the", "targets":  [ "anti-the" ] }
65         ],
66         "order":  [[ 2, "desc" ]],
67         "pagingType":  "full"
68     }));
69     $('.ajax_buttons' ).css({visibility:"visible"});
70     $("p.check").html("<div id=\"searchheader\"><a id=\"CheckAll\" href=\"/cgi-bin/koha/tags/review.pl\"><i class=\"fa fa-check\" aria-hidden=\"false\"><\/i> " + __("Select all") + "<\/a> | <a id=\"CheckNone\" href=\"/cgi-bin/koha/tags/review.pl\"><i class=\"fa fa-times\" aria-hidden=\"false\"><\/i> " + __("Clear all") + "<\/a> | <a id=\"CheckPending\" href=\"/cgi-bin/koha/tags/review.pl\"> " + __("Select all pending") + "<\/a><\/div>");
71
72     $("#CheckAll").on("click", function (e) {
73         e.preventDefault();
74         $("#tagst input:checkbox").each(function () {
75             $(this).prop("checked", true);
76         });
77     });
78
79     $("#CheckNone").on("click", function(e){
80         e.preventDefault();
81         $("#tagst input:checkbox").each(function(){
82             $(this).prop("checked", false );
83         });
84     });
85
86     $("#CheckPending").on("click", function (e) {
87         e.preventDefault();
88         $("#tagst input:checkbox").each(function () {
89             if( $(this).hasClass("pending") ){
90                 $(this).prop("checked", true);
91             } else {
92                 $(this).prop("checked", false);
93             }
94         });
95     });
96
97     $(".approval_btn").on('click',function(event) {
98         event.preventDefault();
99         pull_counts();
100         var getelement;
101         var gettitle;
102         // window.alert(__("Click detected on ") + event.target + ": " + $(event.target).html);
103         if ($(event.target).is('.ok')) {
104             $.ajax(Object.assign({}, {...review_ajax_params, type: "POST"}, {
105                 data: {
106                     tag: $(event.target).attr("title"),
107                     op: 'cud-approve',
108                     csrf_token: $('meta[name="csrf-token"]').attr('content')
109                 },
110                 success: count_approve // success_approve
111             }));
112             $(event.target).next(".rej").prop('disabled', false).css("color","#000");
113             $(event.target).next(".rej").html("<i class='fa fa-times' aria-hidden='false'></i> " + __("Reject"));
114             $(event.target).prop('disabled', true).css("color","#666");
115             $(event.target).html("<i class='fa fa-check' aria-hidden='false'></i> " + __("Approved") );
116             getelement = $(event.target).data("num");
117             gettitle = ".status" + getelement;
118             $(gettitle).text( __("Approved") );
119             $("#checkbox" + getelement ).attr("class", "approved");
120             if ($(gettitle).hasClass("pending") ){
121                 $(gettitle).toggleClass("pending approved");
122             } else {
123                 $(gettitle).toggleClass("rejected approved");
124             }
125         }
126         if ($(event.target).is('.rej')) {
127             $.ajax(Object.assign({}, {...review_ajax_params, type: "POST"}, {
128                 data: {
129                     tag: $(event.target).attr("title"),
130                     op: 'cud-reject',
131                     csrf_token: $('meta[name="csrf-token"]').attr('content')
132                 },
133                 success: count_reject // success_reject
134             }));
135             $(event.target).prev(".ok").prop('disabled', false).css("color","#000");
136             $(event.target).prev(".ok").html("<i class='fa fa-check' aria-hidden='false'></i> " + __("Approve"));
137             $(event.target).prop('disabled', true).css("color","#666");
138             $(event.target).html("<i class='fa fa-times' aria-hidden='false'></i> " + __("Rejected"));
139             getelement = $(event.target).data("num");
140             gettitle = ".status" + getelement;
141             $(gettitle).text(__("Rejected"));
142             $("#checkbox" + getelement).attr("class", "rejected");
143             if ($(gettitle).hasClass("pending") ){
144                 $(gettitle).toggleClass("pending rejected");
145             } else {
146                 $(gettitle).toggleClass("approved rejected");
147             }
148             return false;   // cancel submit
149         }
150         if ($(event.target).is('#test_button')) {
151             $(event.target).text( __("Testing...") ).prop('disabled', true);
152             $.ajax(Object.assign({}, {...review_ajax_params, type: "GET"}, {
153                 data: {
154                     tag: $('#test').val(),
155                     op: 'test',
156                 },
157                 success: success_test_call // success_reject
158             }));
159             return false;   // cancel submit
160         }
161     });
162     $("*").ajaxError(function(evt, request, settings){
163         if ((alerted +=1) <= 1){ window.alert( __("AJAX error (%s alert)").format(alerted) ); }
164     });
165
166     patron_autocomplete($("#approver"), { 'on-select-callback': function( event, ui ) {
167             $("#approver").val( ui.item.patron_id );
168             return false;
169         }
170     });
171 });