Bug 32435: Add resolution states to Catalog concerns
[koha.git] / koha-tmpl / intranet-tmpl / prog / en / modules / cataloguing / concerns.tt
1 [% USE raw %]
2 [% USE Asset %]
3 [% USE AuthorisedValues %]
4 [% PROCESS 'i18n.inc' %]
5 [% SET status = AuthorisedValues.GetAuthValueDropbox('TICKET_STATUS') %]
6 [% SET footerjs = 1 %]
7 [% USE TablesSettings %]
8 [% INCLUDE 'doc-head-open.inc' %]
9 <title>[% FILTER collapse %]
10     [% t("Catalog concerns") | html %] &rsaquo;
11     [% t("Cataloging") | html %] &rsaquo;
12     [% t("Koha") | html %]
13 [% END %]</title>
14 [% INCLUDE 'doc-head-close.inc' %]
15 </head>
16
17 <body id="cat_concerns" class="cat">
18     [% INCLUDE 'header.inc' %]
19     [% INCLUDE 'cataloging-search.inc' %]
20
21     <nav id="breadcrumbs" aria-label="Breadcrumb" class="breadcrumb">
22         <ol>
23             <li>
24                 <a href="/cgi-bin/koha/mainpage.pl">Home</a>
25             </li>
26             <li>
27                 <a href="/cgi-bin/koha/cataloguing/cataloging-home.pl">Cataloging</a>
28             </li>
29             <li>
30                 <a href="#" aria-current="page">
31                     Catalog concerns
32                 </a>
33             </li>
34         </ol>
35     </nav>
36
37     <div class="main container-fluid">
38         <div class="row">
39             <div class="col-sm-10 col-sm-push-2">
40                 <main>
41                     [% INCLUDE 'messages.inc' %]
42                     <h1>Concerns</h1>
43
44                     <div class="page-section">
45                         <fieldset class="action filters" style="cursor:pointer;">
46                             <a id="resolved_filter" class="filtered"><i class="fa fa-bars"></i> Include resolved</a>
47                             [% FOR st IN status %]
48                             | <a id="[% st.authorised_value | html %]_filter"><i class="fa fa-filter"></i> Filter [% st.lib | html %]</a>
49                             [% END %]
50                         </fieldset>
51
52                         <table id="table_concerns">
53                             <thead>
54                                 <tr>
55                                     <th>Reported</th>
56                                     <th>Details</th>
57                                     <th>Title</th>
58                                     <th>Status</th>
59                                     <th data-class-name="actions noExport">Actions</th>
60                                 </tr>
61                             </thead>
62                         </table>
63                     </div>
64                 </main>
65             </div> <!-- /.col-sm-10.col-sm-push-2 -->
66
67             <div class="col-sm-2 col-sm-pull-10">
68                 <aside>
69                     [% INCLUDE 'cat-menu.inc' %]
70                 </aside>
71             </div> <!-- /.col-sm-2.col-sm-pull-10 -->
72         </div> <!-- /.row -->
73
74         [% INCLUDE 'modals/display_ticket.inc' %]
75
76 [% MACRO jsinclude BLOCK %]
77     [% INCLUDE 'datatables.inc' %]
78     [% INCLUDE 'columns_settings.inc' %]
79     [% INCLUDE 'js-date-format.inc' %]
80     [% INCLUDE 'js-patron-format.inc' %]
81     [% INCLUDE 'js-biblio-format.inc' %]
82     <script>
83         $(document).ready(function() {
84
85             logged_in_user_borrowernumber = [% logged_in_user.borrowernumber | html %];
86
87             var table_settings = [% TablesSettings.GetTableSettings('cataloguing', 'concerns', 'table_concerns', 'json') | $raw %];
88
89             var filter_resolved = true;
90             let additional_filters = {
91                 resolved_date: function(){
92                     if ( filter_resolved ) {
93                         return { "=": null };
94                     } else {
95                         return;
96                     }
97                 },
98                 source: 'catalog'
99             };
100
101             var tickets_url = '/api/v1/tickets';
102             var tickets = $("#table_concerns").kohaTable({
103                 "ajax": {
104                     "url": tickets_url
105                 },
106                 "embed": [
107                     "reporter",
108                     "resolver",
109                     "biblio",
110                     "updates+count",
111                     "+strings"
112                 ],
113                 'emptyTable': '<div class="dialog message">' + _("Congratulations, there are no catalog concerns.") + '</div>',
114                 "columnDefs": [{
115                     "targets": [0, 1, 2, 3],
116                     "render": function(data, type, row, meta) {
117                         if (type == 'display') {
118                             if (data != null) {
119                                 return data.escapeHtml();
120                             } else {
121                                 return "";
122                             }
123                         }
124                         return data;
125                     }
126                 }],
127                 "columns": [{
128                         "data": "reported_date:reporter.firstname",
129                         "render": function(data, type, row, meta) {
130                             let reported = '<span class="date clearfix">' + $datetime(row.reported_date) + '</span>';
131                             reported += '<span class="reporter clearfix">' + $patron_to_html(row.reporter, {
132                                 display_cardnumber: false,
133                                 url: true
134                             }) + '</span>';
135                             return reported;
136                         },
137                         "searchable": true,
138                         "orderable": true
139                     },
140                     {
141                         "data": "title:body",
142                         "render": function(data, type, row, meta) {
143                             let resolved = ( row.resolved_date ) ? true : false;
144                             let result = '<a role="button" href="#" data-toggle="modal" data-target="#ticketDetailsModal" data-concern="' + encodeURIComponent(row.ticket_id) + '" data-resolved="'+resolved+'">' + row.title + '</a>';
145                             if (row.updates_count) {
146                                 result += '<span class="pull-right"><a role="button" href="#" data-toggle="modal" data-target="#ticketDetailsModal" data-concern="' + encodeURIComponent(row.ticket_id) + '" data-resolved="'+resolved+'"><i class="fa fa-comment" aria-hidden="true"></i> ' + row.updates_count + '</a></span>';
147                             }
148                             result += '<div id="detail_' + row.ticket_id + '" class="hidden">' + row.body + '</div>';
149                             return result;
150                         },
151                         "searchable": true,
152                         "orderable": true
153                     },
154                     {
155                         "data": "biblio.title",
156                         "render": function(data, type, row, meta) {
157                             return $biblio_to_html(row.biblio, {
158                                 link: 1
159                             });
160                         },
161                         "searchable": true,
162                         "orderable": true
163                     },
164                     {
165                         "data": "resolver.firstname:resolver.surname:resolved_date:status",
166                         "render": function(data, type, row, meta) {
167                             let result = '';
168                             if (row.resolved_date) {
169                                 result += _("Resolved by") + ' <span>' + $patron_to_html(row.resolver, {
170                                     display_cardnumber: false,
171                                     url: true
172                                 }) + '</span>';
173                                 if (row.status) {
174                                     result += ' ' + _("as") + ' ';
175                                     result += row._strings.status ? escape_str(row._strings.status.str) : "";
176                                 }
177                                 result += '<span class="clearfix">' + $datetime(row.resolved_date) + '</span>';
178                             } else {
179                                 if (row.status) {
180                                     result += row._strings.status ? escape_str(row._strings.status.str) : "";
181                                 } else {
182                                     result += _("Open");
183                                 }
184                             }
185                             return result;
186                         },
187                         "searchable": true,
188                         "orderable": true
189                     },
190                     {
191                         "data": function(row, type, val, meta) {
192                             let resolved = ( row.resolved_date ) ? true : false;
193                             let result = '<a class="btn btn-default btn-xs" role="button" href="#" data-toggle="modal" data-target="#ticketDetailsModal" data-concern="' + encodeURIComponent(row.ticket_id) + '" data-resolved="'+resolved+'"><i class="fa-solid fa-eye" aria-hidden="true"></i> ' + _("Details") + '</a>';
194                             return result;
195                         },
196                         "searchable": false,
197                         "orderable": false
198                     },
199                 ],
200                 createdRow: function (row, data, dataIndex) {
201                     if ( data.status ) {
202                         $(row).addClass(data.status.toLowerCase());
203                     }
204                 },
205             }, table_settings, 1, additional_filters);
206
207             var txtActivefilter = _("Include resolved");
208             var txtInactivefilter = _("Filter resolved");
209             $('#resolved_filter').on("click", function() {
210                 if ($(this).hasClass('filtered')){
211                     filter_resolved = false;
212                     $(this).html('<i class="fa fa-filter"></i> '+txtActivefilter);
213                 } else {
214                     filter_resolved = true;
215                     $(this).html('<i class="fa fa-bars"></i> '+txtInactivefilter);
216                 }
217                 tickets.DataTable().draw();
218                 $(this).toggleClass('filtered');
219             });
220
221             [% FOR st IN status %]
222             $('#[% st.authorised_value | html %]_filter').on("click", function() {
223                 if ($(this).hasClass('filtered')){
224                     additional_filters.status.find((o, i) => {
225                         if (o["!="] === '[% st.authorised_value | html %]') {
226                             additional_filters.status.splice(i, 1);
227                             return true; // stop searching
228                         }
229                     });
230                     if ( additional_filters.status.length === 1 ){
231                         delete additional_filters.status;
232                     }
233                     $(this).html('<i class="fa fa-filter"></i> '+_("Filter ")+"[% st.lib | html %]");
234                 } else {
235                     if (!additional_filters.hasOwnProperty("status")) {
236                         additional_filters.status = [ '-and' ];
237                     }
238                     additional_filters.status.push({ '!=': "[% st.authorised_value | html %]" });
239                     $(this).html('<i class="fa fa-bars"></i> '+_("Include ")+"[% st.lib | html %]");
240                 }
241                 tickets.DataTable().draw();
242                 $(this).toggleClass('filtered');
243             });
244             [% END %]
245         });
246     </script>
247     [% Asset.js("js/modals/display_ticket.js") | $raw %]
248 [% END %]
249 [% INCLUDE 'intranet-bottom.inc' %]