View Issue Details

IDProjectCategoryView StatusLast Update
0004024Composr non-bundled addons[All Projects] General / Uncategorisedpublic2020-01-23 16:04
ReporterChris GrahamAssigned ToChris Graham 
SeverityFeature-request 
Status resolvedResolutionfixed 
Summary0004024: Issues with sortable tables block
Description1) Cannot do default reverse sorting
2) Blank cells create various issues
3) IDs should be able to have dashes
4) When rows are filtered the bottom of the table looks ugly
Additional InformationPatch attached.
TagsRoadmap: v11
Time estimation (hours)0.2
Sponsorship open

Activities

Chris Graham

2020-01-03 20:23

administrator  

changes.diff (6,102 bytes)
diff --git a/sources_custom/blocks/main_sortable_table.php b/sources_custom/blocks/main_sortable_table.php
index f8d42c97..9c8a54ca 100644
--- a/sources_custom/blocks/main_sortable_table.php
+++ b/sources_custom/blocks/main_sortable_table.php
@@ -237,22 +237,6 @@ class Block_main_sortable_table
                     continue;
                 }
 
-                foreach ($row as $j => $val) {
-                    foreach (is_array($transform) ? $transform : array($transform) as $_transform) {
-                        switch ($_transform) {
-                            case 'ucwords':
-                                $val = cms_mb_ucwords($val);
-                                break;
-
-                            case 'non-numeric-italics':
-                                if (!is_numeric($val)) {
-                                    $row[$j] = protect_from_escaping('<em>' . escape_html($val) . '</em>');
-                                }
-                                break;
-                        }
-                    }
-                }
-
                 $_rows[] = $row;
 
                 $i++;
@@ -400,6 +384,20 @@ class Block_main_sortable_table
         foreach ($_rows as $i => &$row) {
             foreach ($row as $j => &$value) {
                 $value = $this->apply_formatting($value, $headers[$j]['SORTABLE_TYPE']);
+
+                foreach (is_array($transform) ? $transform : array($transform) as $_transform) {
+                    switch ($_transform) {
+                        case 'ucwords':
+                            $value = cms_mb_ucwords($value);
+                            break;
+
+                        case 'non-numeric-italics':
+                            if ((!is_numeric($val)) && ($val != '')) {
+                                $value = protect_from_escaping('<em>' . escape_html($value) . '</em>');
+                            }
+                            break;
+                    }
+                }
             }
 
             $tooltip_values = array();
@@ -420,8 +418,13 @@ class Block_main_sortable_table
 
         // Final render...
 
-        $id = (preg_match('#^[\w_]+$#', $guid) != 0) ? $guid : uniqid('', false);
+        $id = (preg_match('#^[\w_\-]+$#', $guid) != 0) ? $guid : uniqid('', false);
 
+        $reverse_sorting = false;
+        if ((!empty($map['default_sort_column'])) && (substr($map['default_sort_column'], 0, 1) == '!')) {
+            $reverse_sorting = true;
+            $map['default_sort_column'] = substr($map['default_sort_column'], 1);
+        }
         $_default_sort_column = max(0, empty($map['default_sort_column']) ? 0 : (intval(str_replace($letters, $numbers, $map['default_sort_column'])) - 1));
         $default_sort_column = ($columns_display == array()) ? $_default_sort_column : array_search($_default_sort_column + 1, $columns_display);
         if ($default_sort_column === false) {
@@ -432,7 +435,7 @@ class Block_main_sortable_table
         return do_template('SORTABLE_TABLE', array(
             '_GUID' => $guid,
             'ID' => $id,
-            'DEFAULT_SORT_COLUMN' => strval($default_sort_column),
+            'DEFAULT_SORT_COLUMN' => ($reverse_sorting ? '!' : '') . strval($default_sort_column),
             'MAX' => strval($max),
             'HEADERS' => $headers,
             'ROWS' => $rows,
diff --git a/themes/default/javascript_custom/sortable_tables.js b/themes/default/javascript_custom/sortable_tables.js
index e489a94d..456fa7b0 100644
--- a/themes/default/javascript_custom/sortable_tables.js
+++ b/themes/default/javascript_custom/sortable_tables.js
@@ -731,6 +731,7 @@ var SortableTable = (function(){
     // Scrape each row of each tbody
     var bodies = t.tBodies;
     if (bodies==null || bodies.length==0) { return; }
+    var mostRecentVisibleRow = null;
     for (var i=0,L=bodies.length; i<L; i++) {
       var tb = bodies[i];
       for (var j=0,L2=tb.rows.length; j<L2; j++) {
@@ -780,19 +781,31 @@ var SortableTable = (function(){
         if (!hasClass(row,'table-nofilter'))
           row.style.display = hideRow?"none":"";
 
-        if (row.className.replace(/^(\s*(first|last)\s*)*$/, '') == '') {
+        if (row.className.replace(/^(\s*(first|last)\s*)*$/, '') == '') { // If no other styles on the row
             var classes = [];
-            if (unfilteredrowcount == pagestart) {
-                classes.push('first');
-            }
-            if (unfilteredrowcount == pageend) {
-                classes.push('last');
+            if (!hideRow) {
+                if (unfilteredrowcount == pagestart) {
+                    classes.push('first');
+                }
+                if (unfilteredrowcount == pageend) {
+                    classes.push('last');
+                }
+                mostRecentVisibleRow = row;
             }
             row.className = classes.join(' ');
         }
       }
     }
 
+    if (mostRecentVisibleRow !== null) {
+        var classes = [];
+        if (unfilteredrowcount == pagestart) {
+            classes.push('first');
+        }
+        classes.push('last');
+        mostRecentVisibleRow.className = classes.join(' ');
+    }
+
     if (def(page)) {
       // Check to see if filtering has put us past the requested page index. If it has, 
       // then go back to the last page and show it.
@@ -931,7 +944,12 @@ var SortableTable = (function(){
     }
     // Do auto-sort if necessary
     if ((val = classValue(t,table.AutoSortColumnPrefix)) || (hasClass(t,table.AutoSortClassName))) {
-      table.autosort(t,{'col':(val==null)?null:+val});
+      var autoSortArgs = {'col':(val==null)?null:window.parseInt(val.replace(/^!/,''))};
+      if (val.substr(0, 1) == '!') {
+        autoSortArgs['forcedirection'] = true;
+        autoSortArgs['desc'] = true;
+      }
+      table.autosort(t,autoSortArgs);
     }
     // Do auto-stripe if necessary
     if (tdata.stripeclass && hasClass(t,table.AutoStripeClassName)) {
@@ -1077,4 +1095,4 @@ var SortableTable = (function(){
   }
 
   return table;
-})();
\ No newline at end of file
+})();
changes.diff (6,102 bytes)

Issue History

Date Modified Username Field Change
2020-01-03 20:23 Chris Graham New Issue
2020-01-03 20:23 Chris Graham Tag Attached: Roadmap: v11
2020-01-03 20:23 Chris Graham File Added: changes.diff
2020-01-03 20:24 Chris Graham Time estimation (hours) => 0.2
2020-01-23 16:04 Chris Graham Assigned To => Chris Graham
2020-01-23 16:04 Chris Graham Status non-assigned => resolved
2020-01-23 16:04 Chris Graham Resolution open => fixed
2023-02-26 18:29 Chris Graham Category General => General / Uncategorised