4 [% USE TablesSettings %]
5 [% INCLUDE 'doc-head-open.inc' %]
7 Catalog concerns › Tools › Koha
9 [% INCLUDE 'doc-head-close.inc' %]
12 <body id="cat_concerns" class="cat">
13 [% INCLUDE 'header.inc' %]
14 [% INCLUDE 'cataloging-search.inc' %]
16 <nav id="breadcrumbs" aria-label="Breadcrumb" class="breadcrumb">
19 <a href="/cgi-bin/koha/mainpage.pl">Home</a>
22 <a href="/cgi-bin/koha/cataloguing/cataloging-home.pl">Cataloging</a>
25 <a href="#" aria-current="page">
32 <div class="main container-fluid">
34 <div class="col-sm-10 col-sm-push-2">
38 <div class="page-section">
39 <fieldset class="action" style="cursor:pointer;">
40 <a id="hideResolved"><i class="fa fa-minus-square"></i> Hide resolved</a>
41 | <a id="showAll"><i class="fa fa-bars"></i> Show all</a>
44 <table id="table_concerns">
51 <th data-class-name="actions noExport">Actions</th>
57 </div> <!-- /.col-sm-10.col-sm-push-2 -->
59 <div class="col-sm-2 col-sm-pull-10">
61 [% INCLUDE 'cat-menu.inc' %]
63 </div> <!-- /.col-sm-2.col-sm-pull-10 -->
66 <!-- Display updates concern modal -->
67 <div class="modal" id="ticketDetailsModal" tabindex="-1" role="dialog" aria-labelledby="ticketDetailsLabel">
68 <div class="modal-dialog modal-lg" role="document">
69 <div class="modal-content">
70 <div class="modal-header">
71 <button type="button" class="closebtn" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
72 <h4 class="modal-title" id="displayUpdateLabel">Ticket details</h4>
74 <div class="modal-body">
75 <div id="concern-details"></div>
76 <fieldset class="rows">
79 <label for="message">Update: </label>
80 <textarea id="update_message" name="message"></textarea>
83 <label for="public">Notify: </label>
84 <input type="checkbox" name="public" id="public">
88 </div> <!-- /.modal-body -->
89 <div class="modal-footer">
90 <input type="hidden" name="ticket_id" id="ticket_id">
91 <button type="button" class="btn btn-default" id="resolveTicket">Resolve</button>
92 <button type="submit" class="btn btn-primary" id="updateTicket">Comment</button>
93 </div> <!-- /.modal-footer -->
94 </div> <!-- /.modal-content -->
95 </div> <!-- /.modal-dialog -->
96 </div> <!-- /#displayUpdateModal -->
98 [% MACRO jsinclude BLOCK %]
99 [% INCLUDE 'datatables.inc' %]
100 [% INCLUDE 'columns_settings.inc' %]
101 [% INCLUDE 'js-date-format.inc' %]
102 [% INCLUDE 'js-patron-format.inc' %]
103 [% INCLUDE 'js-biblio-format.inc' %]
105 $(document).ready(function() {
107 var logged_in_user_borrowernumber = "[% logged_in_user.borrowernumber | html %]";
109 var table_settings = [% TablesSettings.GetTableSettings('cataloguing', 'concerns', 'table_concerns', 'json') | $raw %];
111 var tickets_url = '/api/v1/tickets';
112 var tickets = $("#table_concerns").kohaTable({
122 'emptyTable': '<div class="dialog message">' + _("Congratulations, there are no catalog concerns.") + '</div>',
124 "targets": [0, 1, 2, 3],
125 "render": function(data, type, row, meta) {
126 if (type == 'display') {
128 return data.escapeHtml();
137 "data": "reported_date:reporter.firstname",
138 "render": function(data, type, row, meta) {
139 let reported = '<span class="date clearfix">' + $datetime(row.reported_date) + '</span>';
140 reported += '<span class="reporter clearfix">' + $patron_to_html(row.reporter, {
141 display_cardnumber: false,
150 "data": "title:body",
151 "render": function(data, type, row, meta) {
152 let result = '<a role="button" href="#" data-toggle="modal" data-target="#ticketDetailsModal" data-concern="' + encodeURIComponent(row.ticket_id) + '">' + row.title + '</a>';
153 if (row.updates_count) {
154 result += '<span class="pull-right"><a role="button" href="#" data-toggle="modal" data-target="#ticketDetailsModal" data-concern="' + encodeURIComponent(row.ticket_id) + '"><i class="fa fa-comment" aria-hidden="true"></i> ' + row.updates_count + '</a></span>';
156 result += '<div id="detail_' + row.ticket_id + '" class="hidden">' + row.body + '</div>';
163 "data": "biblio.title",
164 "render": function(data, type, row, meta) {
165 return $biblio_to_html(row.biblio, {
173 "data": "resolver.firstname:resolver.surname:resolved_date",
174 "render": function(data, type, row, meta) {
176 if (row.resolved_date) {
177 result += _("Resolved by:") + ' <span>' + $patron_to_html(row.resolver, {
178 display_cardnumber: false,
181 result += '<span class="clearfix">' + $datetime(row.resolved_date) + '</span>';
191 "data": function(row, type, val, meta) {
192 let result = '<a class="btn btn-default btn-xs" role="button" href="#" data-toggle="modal" data-target="#ticketDetailsModal" data-concern="' + encodeURIComponent(row.ticket_id) + '"><i class="fa fa-eye" aria-hidden="true"></i> ' + _("Details") + '</a>';
199 }, table_settings, 1);
201 $('#hideResolved').on("click", function() {
202 // It would be great if we could pass null here but it gets stringified
203 tickets.DataTable().columns('3').search('special:undefined').draw();
206 $('#showAll').on("click", function() {
207 tickets.DataTable().columns('3').search('').draw();
210 $('#ticketDetailsModal').on('show.bs.modal', function(event) {
212 let button = $(event.relatedTarget);
213 let ticket_id = button.data('concern');
214 modal.find('.modal-footer input').val(ticket_id);
216 let detail = $('#detail_' + ticket_id).text();
218 let display = '<div class="list-group">';
219 display += '<div class="list-group-item">';
220 display += '<span class="wrapfix">' + detail + '</span>';
222 display += '<div id="concern-updates" class="list-group-item">';
223 display += '<span>Loading updates . . .</span>';
227 let details = modal.find('#concern-details');
228 details.html(display);
231 url: "/api/v1/tickets/" + ticket_id + "/updates",
234 "x-koha-embed": "user"
236 }).success(function(data) {
237 let updates_display = $('#concern-updates');
239 data.forEach(function(item, index) {
240 updates += '<div class="list-group-item">';
241 updates += '<span class="wrapfix">' + item.message + '</span>';
242 updates += '<span class="clearfix">' + $patron_to_html(item.user, {
243 display_cardnumber: false,
245 }) + ' (' + $datetime(item.date) + ')</span>';
248 updates_display.html(updates);
249 }).error(function() {
254 $('#ticketDetailsModal').on('click', '#updateTicket', function(e) {
255 let ticket_id = $('#ticket_id').val();
257 'public': $('#public').is(":checked"),
258 message: $('#update_message').val(),
259 user_id: logged_in_user_borrowernumber
263 url: "/api/v1/tickets/" + ticket_id + "/updates",
265 data: JSON.stringify(params),
266 ontentType: "application/json; charset=utf-8"
267 }).success(function() {
268 $("#ticketDetailsModal").modal('hide');
269 tickets.DataTable().ajax.reload(function(data) {
270 $("#concern_action_result_dialog").hide();
271 $("#concern_delete_success").html(_("Concern #%s updated successfully.").format(ticket_id)).show();
273 }).error(function() {
274 $("#concern_update_error").html(_("Error resolving concern #%s. Check the logs.").format(ticket_id)).show();
278 $('#ticketDetailsModal').on('click', '#resolveTicket', function(e) {
279 let ticket_id = $('#ticket_id').val();
281 'public': $('#public').is(":checked"),
282 message: $('#update_message').val(),
283 user_id: logged_in_user_borrowernumber,
288 url: "/api/v1/tickets/" + ticket_id + "/updates",
290 data: JSON.stringify(params),
291 ontentType: "application/json; charset=utf-8"
292 }).success(function() {
293 $("#ticketDetailsModal").modal('hide');
294 tickets.DataTable().ajax.reload(function(data) {
295 $("#concern_action_result_dialog").hide();
296 $("#concern_delete_success").html(_("Concern #%s updated successfully.").format(ticket_id)).show();
298 }).error(function() {
299 $("#concern_update_error").html(_("Error resolving concern #%s. Check the logs.").format(ticket_id)).show();
306 [% INCLUDE 'intranet-bottom.inc' %]