Bug 25288: (QA follow-up) Escape data and restore empty list behaviour
authorTomas Cohen Arazi <tomascohen@theke.io>
Wed, 6 May 2020 21:50:29 +0000 (18:50 -0300)
committerJonathan Druart <jonathan.druart@bugs.koha-community.org>
Wed, 24 Jun 2020 13:15:41 +0000 (15:15 +0200)
After the QA round on bug 25279, some things needed to get fixed:
- Data needs to be escaped
- When no library is defined, we should keep the original behaviour and
  message.
- aria-hidden="true" for FontAwesome coding guideline enforced
- Added role="button" as well.

This patch does that.

Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>

admin/branches.pl
koha-tmpl/intranet-tmpl/prog/en/modules/admin/branches.tt

index c3eeea7..b609c20 100755 (executable)
@@ -147,6 +147,9 @@ if ( $op eq 'add_form' ) {
     $op = 'list';
 }
 
+$template->param( libraries_count => Koha::Libraries->search->count )
+    if $op eq 'list';
+
 $template->param(
     messages => \@messages,
     op       => $op,
index 3c9ca49..d7de9e8 100644 (file)
 
 [% IF op == 'list' %]
     <h3>Libraries</h3>
-    <table id="libraries">
-        <thead>
-            <tr>
-                <th>Name</th>
-                <th>Code</th>
-                <th>Address</th>
-                <th>MARC organization code</th>
-                <th>IP</th>
-                <th>Pickup location</th>
-                <th>Actions</th>
-            </tr>
-        </thead>
-    </table>
+    [% IF libraries_count > 0 %]
+        <table id="libraries">
+            <thead>
+                <tr>
+                    <th>Name</th>
+                    <th>Code</th>
+                    <th>Address</th>
+                    <th>MARC organization code</th>
+                    <th>IP</th>
+                    <th>Pickup location</th>
+                    <th data-class-name="actions">Actions</th>
+                </tr>
+            </thead>
+        </table>
+    [% ELSE %]
+        <div class="dialog message">There are no libraries defined. <a href="/cgi-bin/koha/admin/branches.pl?op=add_form">Start defining libraries</a>.</div>
+    [% END %]
 [% END %]
 
             </main>
         var columns_settings = [% ColumnsSettings.GetColumns( 'admin', 'libraries', 'libraries', 'json' ) | $raw %];
         $(document).ready(function() {
 
+            const to_html = (x) => $('<div/>').text(x).html();
+
             var libraries_url = '/api/v1/libraries';
             var libraries = $("#libraries").api({
                 "ajax": {
                     "url": libraries_url
                 },
-                'dom': 'C<"top pager"ilpfB><"#filter_c">tr<"bottom pager"ip>',
                 'emptyTable': '<div class="dialog message">'+_("There are no libraries defined.")+' <a href="/cgi-bin/koha/admin/branches.pl?op=add_form">'+_("Start defining libraries")+'</a>.</div>',
+                "columnDefs": [ {
+                    "targets": [0,1,3,4,7,8,9,10,11,12,13,14,15],
+                    "render": function (data, type, row, meta) {
+                        if ( type == 'display' ) {
+                            return to_html(data);
+                        }
+                        return data;
+                    }
+                } ],
                 "columns": [
                     {
                         "data": "name",
                     {
                         "data": function( row, type, val, meta ) {
                             const library_info = [];
-                            if ( row.address1 != null ) library_info.push(row.address1);
-                            if ( row.address2 != null ) library_info.push(row.address2);
-                            if ( row.address3 != null ) library_info.push(row.address3);
+                            if ( row.address1 != null ) library_info.push(to_html(row.address1));
+                            if ( row.address2 != null ) library_info.push(to_html(row.address2));
+                            if ( row.address3 != null ) library_info.push(to_html(row.address3));
                             // geographical_location = city, state postal_code
                             const locations = [];
-                            if ( row.city != null ) locations.push(row.city);
-                            if ( row.state != null ) locations.push(row.state);
+                            if ( row.city != null ) locations.push(to_html(row.city));
+                            if ( row.state != null ) locations.push(to_html(row.state));
                             const geographical_location = locations.join(', ');
                             if ( geographical_location != '' && row.postal_code != null) {
-                                library_info.push(geographical_location+' '+row.postal_code);
+                                library_info.push(geographical_location+' '+to_html(row.postal_code));
                             }
                             else {
                                 library_info.push(geographical_location);
                             }
-                            if ( row.country != null ) library_info.push(row.country);
-                            if ( row.phone != null ) library_info.push(_("Ph: ") + row.phone);
-                            if ( row.fax != null ) library_info.push(_("Fax: ") + row.fax);
-                            if ( row.email != null ) library_info.push('<a href="mailto:'+row.email+'">'+row.email+'</a>');
-                            if ( row.url != null ) library_info.push('<a href="'+row.url+'">'+row.url+'</a>');
-                            if ( row.opac_info != null ) library_info.push(_("OPAC Info") + ': <div>'+row.opac_info+'</div>');
-                            if ( row.notes != null ) library_info.push(_("Notes")+': '+row.notes);
+                            if ( row.country != null ) library_info.push(to_html(row.country));
+                            if ( row.phone != null ) library_info.push(_("Ph: ") + to_html(row.phone));
+                            if ( row.fax != null ) library_info.push(_("Fax: ") + to_html(row.fax));
+                            if ( row.email != null ) library_info.push('<a href="mailto:'+encodeURIComponent(row.email)+'">'+to_html(row.email)+'</a>');
+                            if ( row.url != null ) library_info.push('<a href="'+encodeURIComponent(row.url)+'">'+to_html(row.url)+'</a>');
+                            if ( row.opac_info != null ) library_info.push(_("OPAC Info") + ': <div>'+to_html(row.opac_info)+'</div>');
+                            if ( row.notes != null ) library_info.push(_("Notes")+': '+to_html(row.notes));
                             return library_info.join('<br/>');
                         },
                         "searchable": false,
                     {
                         "data": function( row, type, val, meta ) {
 
-                            var result = '<a class="btn btn-default btn-xs" href="/cgi-bin/koha/admin/branches.pl?op=add_form&amp;branchcode='+row.library_id+'"><i class="fa fa-pencil"></i> '+_("Edit")+'</a>';
+                            var result = '<a class="btn btn-default btn-xs" href="/cgi-bin/koha/admin/branches.pl?op=add_form&amp;branchcode='+encodeURIComponent(row.library_id)+'" role="button"><i class="fa fa-pencil" aria-hidden="true"></i> '+_("Edit")+'</a>';
                             result += '<form action="/cgi-bin/koha/admin/branches.pl" method="post">';
-                            result += '<input type="hidden" name="branchcode" value="'+row.library_id+'" />';
+                            result += '<input type="hidden" name="branchcode" value="'+to_html(row.library_id)+'" />'+"\n";
                             result += '<input type="hidden" name="op" value="delete_confirm" />';
-                            result += '<button type="submit" id="delete_library_'+row.library_id+'" class="btn btn-default btn-xs"><i class="fa fa-trash"></i> '+_("Delete")+'</button></form>';
+                            result += '<button type="submit" id="delete_library_'+to_html(row.library_id)+'" class="btn btn-default btn-xs" role="button"><i class="fa fa-trash" aria-hidden="true"></i> '+_("Delete")+'</button></form>';
 
                             return result;