Fossil SCM

Improvements to the /bigbloblist page. Fix the output_table_sorting_javascript() routine so that the sort is stable even when selecting a field that defaults to sorting in reverse order.

drh 2015-12-05 20:04 UTC trunk
Commit f982642315990886e7a9c2a4abd1928ca00f9695
2 files changed +12 -7 +80 -31
+12 -7
--- src/name.c
+++ src/name.c
@@ -1017,11 +1017,11 @@
10171017
int rid = db_column_int(&q,0);
10181018
const char *zUuid = db_column_text(&q, 1);
10191019
const char *zDesc = db_column_text(&q, 2);
10201020
int isPriv = db_column_int(&q,3);
10211021
@ <tr><td align="right">%d(rid)</td>
1022
- @ <td>&nbsp;%z(href("%R/info/%!S",zUuid))%s(zUuid)</a>&nbsp;</td>
1022
+ @ <td>&nbsp;%z(href("%R/info/%!S",zUuid))%S(zUuid)</a>&nbsp;</td>
10231023
@ <td align="left">%h(zDesc)</td>
10241024
if( isPriv ){
10251025
@ <td>(unpublished)</td>
10261026
}
10271027
@ </tr>
@@ -1054,33 +1054,38 @@
10541054
" LIMIT %d;", n
10551055
);
10561056
describe_artifacts("IN toshow");
10571057
db_prepare(&q,
10581058
"SELECT description.rid, description.uuid, description.summary,"
1059
- " length(blob.content), coalesce(delta.srcid,'')"
1059
+ " length(blob.content), coalesce(delta.srcid,''),"
1060
+ " datetime(description.ctime)"
10601061
" FROM description, blob LEFT JOIN delta ON delta.rid=blob.rid"
10611062
" WHERE description.rid=blob.rid"
10621063
" ORDER BY length(content) DESC"
10631064
);
1064
- @ <table cellpadding="0" cellspacing="0" border="1">
1065
- @ <tr><th align="right">Size<th align="right">RID
1066
- @ <th align="right">Delta From<th>SHA1<th>Description
1065
+ @ <table cellpadding="2" cellspacing="0" border="1" id="bigblobtab">
1066
+ @ <thead><tr><th align="right">Size<th align="right">RID
1067
+ @ <th align="right">Delta From<th>SHA1<th>Description<th>Date</tr></thead>
1068
+ @ <tbody>
10671069
while( db_step(&q)==SQLITE_ROW ){
10681070
int rid = db_column_int(&q,0);
10691071
const char *zUuid = db_column_text(&q, 1);
10701072
const char *zDesc = db_column_text(&q, 2);
10711073
int sz = db_column_int(&q,3);
10721074
const char *zSrcId = db_column_text(&q,4);
1075
+ const char *zDate = db_column_text(&q,5);
10731076
@ <tr><td align="right">%d(sz)</td>
10741077
@ <td align="right">%d(rid)</td>
10751078
@ <td align="right">%s(zSrcId)</td>
1076
- @ <td>&nbsp;%z(href("%R/info/%!S",zUuid))%s(zUuid)</a>&nbsp;</td>
1079
+ @ <td>&nbsp;%z(href("%R/info/%!S",zUuid))%S(zUuid)</a>&nbsp;</td>
10771080
@ <td align="left">%h(zDesc)</td>
1081
+ @ <td align="left">%z(href("%R/timeline?c=%T",zDate))%s(zDate)</a></td>
10781082
@ </tr>
10791083
}
1080
- @ </table>
1084
+ @ </tbody></table>
10811085
db_finalize(&q);
1086
+ output_table_sorting_javascript("bigblobtab", "NnnttT", -1);
10821087
style_footer();
10831088
}
10841089
10851090
/*
10861091
** COMMAND: test-unsent
10871092
--- src/name.c
+++ src/name.c
@@ -1017,11 +1017,11 @@
1017 int rid = db_column_int(&q,0);
1018 const char *zUuid = db_column_text(&q, 1);
1019 const char *zDesc = db_column_text(&q, 2);
1020 int isPriv = db_column_int(&q,3);
1021 @ <tr><td align="right">%d(rid)</td>
1022 @ <td>&nbsp;%z(href("%R/info/%!S",zUuid))%s(zUuid)</a>&nbsp;</td>
1023 @ <td align="left">%h(zDesc)</td>
1024 if( isPriv ){
1025 @ <td>(unpublished)</td>
1026 }
1027 @ </tr>
@@ -1054,33 +1054,38 @@
1054 " LIMIT %d;", n
1055 );
1056 describe_artifacts("IN toshow");
1057 db_prepare(&q,
1058 "SELECT description.rid, description.uuid, description.summary,"
1059 " length(blob.content), coalesce(delta.srcid,'')"
 
1060 " FROM description, blob LEFT JOIN delta ON delta.rid=blob.rid"
1061 " WHERE description.rid=blob.rid"
1062 " ORDER BY length(content) DESC"
1063 );
1064 @ <table cellpadding="0" cellspacing="0" border="1">
1065 @ <tr><th align="right">Size<th align="right">RID
1066 @ <th align="right">Delta From<th>SHA1<th>Description
 
1067 while( db_step(&q)==SQLITE_ROW ){
1068 int rid = db_column_int(&q,0);
1069 const char *zUuid = db_column_text(&q, 1);
1070 const char *zDesc = db_column_text(&q, 2);
1071 int sz = db_column_int(&q,3);
1072 const char *zSrcId = db_column_text(&q,4);
 
1073 @ <tr><td align="right">%d(sz)</td>
1074 @ <td align="right">%d(rid)</td>
1075 @ <td align="right">%s(zSrcId)</td>
1076 @ <td>&nbsp;%z(href("%R/info/%!S",zUuid))%s(zUuid)</a>&nbsp;</td>
1077 @ <td align="left">%h(zDesc)</td>
 
1078 @ </tr>
1079 }
1080 @ </table>
1081 db_finalize(&q);
 
1082 style_footer();
1083 }
1084
1085 /*
1086 ** COMMAND: test-unsent
1087
--- src/name.c
+++ src/name.c
@@ -1017,11 +1017,11 @@
1017 int rid = db_column_int(&q,0);
1018 const char *zUuid = db_column_text(&q, 1);
1019 const char *zDesc = db_column_text(&q, 2);
1020 int isPriv = db_column_int(&q,3);
1021 @ <tr><td align="right">%d(rid)</td>
1022 @ <td>&nbsp;%z(href("%R/info/%!S",zUuid))%S(zUuid)</a>&nbsp;</td>
1023 @ <td align="left">%h(zDesc)</td>
1024 if( isPriv ){
1025 @ <td>(unpublished)</td>
1026 }
1027 @ </tr>
@@ -1054,33 +1054,38 @@
1054 " LIMIT %d;", n
1055 );
1056 describe_artifacts("IN toshow");
1057 db_prepare(&q,
1058 "SELECT description.rid, description.uuid, description.summary,"
1059 " length(blob.content), coalesce(delta.srcid,''),"
1060 " datetime(description.ctime)"
1061 " FROM description, blob LEFT JOIN delta ON delta.rid=blob.rid"
1062 " WHERE description.rid=blob.rid"
1063 " ORDER BY length(content) DESC"
1064 );
1065 @ <table cellpadding="2" cellspacing="0" border="1" id="bigblobtab">
1066 @ <thead><tr><th align="right">Size<th align="right">RID
1067 @ <th align="right">Delta From<th>SHA1<th>Description<th>Date</tr></thead>
1068 @ <tbody>
1069 while( db_step(&q)==SQLITE_ROW ){
1070 int rid = db_column_int(&q,0);
1071 const char *zUuid = db_column_text(&q, 1);
1072 const char *zDesc = db_column_text(&q, 2);
1073 int sz = db_column_int(&q,3);
1074 const char *zSrcId = db_column_text(&q,4);
1075 const char *zDate = db_column_text(&q,5);
1076 @ <tr><td align="right">%d(sz)</td>
1077 @ <td align="right">%d(rid)</td>
1078 @ <td align="right">%s(zSrcId)</td>
1079 @ <td>&nbsp;%z(href("%R/info/%!S",zUuid))%S(zUuid)</a>&nbsp;</td>
1080 @ <td align="left">%h(zDesc)</td>
1081 @ <td align="left">%z(href("%R/timeline?c=%T",zDate))%s(zDate)</a></td>
1082 @ </tr>
1083 }
1084 @ </tbody></table>
1085 db_finalize(&q);
1086 output_table_sorting_javascript("bigblobtab", "NnnttT", -1);
1087 style_footer();
1088 }
1089
1090 /*
1091 ** COMMAND: test-unsent
1092
+80 -31
--- src/report.c
+++ src/report.c
@@ -977,13 +977,28 @@
977977
@ this.columnTypes = columnTypes;
978978
@ this.sort = function (cell) {
979979
@ var column = cell.cellIndex;
980980
@ var sortFn;
981981
@ switch( cell.sortType ){
982
- @ case "N": case "n": sortFn = this.sortNumeric; break;
983
- @ case "T": case "t": sortFn = this.sortText; break;
984
- @ case "K": case "k": sortFn = this.sortKey; break;
982
+ if( strchr(zColumnTypes,'n') ){
983
+ @ case "n": sortFn = this.sortNumeric; break;
984
+ }
985
+ if( strchr(zColumnTypes,'N') ){
986
+ @ case "N": sortFn = this.sortReverseNumeric; break;
987
+ }
988
+ if( strchr(zColumnTypes,'t') ){
989
+ @ case "t": sortFn = this.sortText; break;
990
+ }
991
+ if( strchr(zColumnTypes,'T') ){
992
+ @ case "T": sortFn = this.sortReverseText; break;
993
+ }
994
+ if( strchr(zColumnTypes,'k') ){
995
+ @ case "k": sortFn = this.sortKey; break;
996
+ }
997
+ if( strchr(zColumnTypes,'K') ){
998
+ @ case "K": sortFn = this.sortReverseKey; break;
999
+ }
9851000
@ default: return;
9861001
@ }
9871002
@ this.sortIndex = column;
9881003
@ var newRows = new Array();
9891004
@ for (j = 0; j < this.tbody[0].rows.length; j++) {
@@ -993,13 +1008,10 @@
9931008
@ newRows.reverse();
9941009
@ this.prevColumn = -this.prevColumn;
9951010
@ }else{
9961011
@ newRows.sort(sortFn);
9971012
@ this.prevColumn = this.sortIndex+1;
998
- @ if( cell.sortType>="A" && cell.sortType<="Z" ){
999
- @ newRows.reverse();
1000
- @ }
10011013
@ }
10021014
@ for (i=0;i<newRows.length;i++) {
10031015
@ this.tbody[0].appendChild(newRows[i]);
10041016
@ }
10051017
@ this.setHdrIcons();
@@ -1019,35 +1031,72 @@
10191031
@ var clsName = hdrCell.className.replace(/\s*\bsort\s*\w+/, '');
10201032
@ clsName += ' sort ' + sortType;
10211033
@ hdrCell.className = clsName;
10221034
@ }
10231035
@ }
1024
- @ this.sortText = function(a,b) {
1025
- @ var i = thisObject.sortIndex;
1026
- @ aa = a.cells[i].textContent.replace(/^\W+/,'').toLowerCase();
1027
- @ bb = b.cells[i].textContent.replace(/^\W+/,'').toLowerCase();
1028
- @ if(aa==bb) return a.rowIndex-b.rowIndex;
1029
- @ if(aa<bb) return -1;
1030
- @ return 1;
1031
- @ }
1032
- @ this.sortNumeric = function(a,b) {
1033
- @ var i = thisObject.sortIndex;
1034
- @ aa = parseFloat(a.cells[i].textContent);
1035
- @ if (isNaN(aa)) aa = 0;
1036
- @ bb = parseFloat(b.cells[i].textContent);
1037
- @ if (isNaN(bb)) bb = 0;
1038
- @ if(aa==bb) return a.rowIndex-b.rowIndex;
1039
- @ return aa-bb;
1040
- @ }
1041
- @ this.sortKey = function(a,b) {
1042
- @ var i = thisObject.sortIndex;
1043
- @ aa = a.cells[i].getAttribute("data-sortkey");
1044
- @ bb = b.cells[i].getAttribute("data-sortkey");
1045
- @ if(aa==bb) return a.rowIndex-b.rowIndex;
1046
- @ if(aa<bb) return -1;
1047
- @ return 1;
1048
- @ }
1036
+ if( strchr(zColumnTypes,'t') ){
1037
+ @ this.sortText = function(a,b) {
1038
+ @ var i = thisObject.sortIndex;
1039
+ @ aa = a.cells[i].textContent.replace(/^\W+/,'').toLowerCase();
1040
+ @ bb = b.cells[i].textContent.replace(/^\W+/,'').toLowerCase();
1041
+ @ if(aa<bb) return -1;
1042
+ @ if(aa==bb) return a.rowIndex-b.rowIndex;
1043
+ @ return 1;
1044
+ @ }
1045
+ }
1046
+ if( strchr(zColumnTypes,'T') ){
1047
+ @ this.sortReverseText = function(a,b) {
1048
+ @ var i = thisObject.sortIndex;
1049
+ @ aa = a.cells[i].textContent.replace(/^\W+/,'').toLowerCase();
1050
+ @ bb = b.cells[i].textContent.replace(/^\W+/,'').toLowerCase();
1051
+ @ if(aa<bb) return +1;
1052
+ @ if(aa==bb) return a.rowIndex-b.rowIndex;
1053
+ @ return -1;
1054
+ @ }
1055
+ }
1056
+ if( strchr(zColumnTypes,'n') ){
1057
+ @ this.sortNumeric = function(a,b) {
1058
+ @ var i = thisObject.sortIndex;
1059
+ @ aa = parseFloat(a.cells[i].textContent);
1060
+ @ if (isNaN(aa)) aa = 0;
1061
+ @ bb = parseFloat(b.cells[i].textContent);
1062
+ @ if (isNaN(bb)) bb = 0;
1063
+ @ if(aa==bb) return a.rowIndex-b.rowIndex;
1064
+ @ return aa-bb;
1065
+ @ }
1066
+ }
1067
+ if( strchr(zColumnTypes,'N') ){
1068
+ @ this.sortReverseNumeric = function(a,b) {
1069
+ @ var i = thisObject.sortIndex;
1070
+ @ aa = parseFloat(a.cells[i].textContent);
1071
+ @ if (isNaN(aa)) aa = 0;
1072
+ @ bb = parseFloat(b.cells[i].textContent);
1073
+ @ if (isNaN(bb)) bb = 0;
1074
+ @ if(aa==bb) return a.rowIndex-b.rowIndex;
1075
+ @ return bb-aa;
1076
+ @ }
1077
+ }
1078
+ if( strchr(zColumnTypes,'k') ){
1079
+ @ this.sortKey = function(a,b) {
1080
+ @ var i = thisObject.sortIndex;
1081
+ @ aa = a.cells[i].getAttribute("data-sortkey");
1082
+ @ bb = b.cells[i].getAttribute("data-sortkey");
1083
+ @ if(aa<bb) return -1;
1084
+ @ if(aa==bb) return a.rowIndex-b.rowIndex;
1085
+ @ return 1;
1086
+ @ }
1087
+ }
1088
+ if( strchr(zColumnTypes,'K') ){
1089
+ @ this.sortReverseKey = function(a,b) {
1090
+ @ var i = thisObject.sortIndex;
1091
+ @ aa = a.cells[i].getAttribute("data-sortkey");
1092
+ @ bb = b.cells[i].getAttribute("data-sortkey");
1093
+ @ if(aa<bb) return +1;
1094
+ @ if(aa==bb) return a.rowIndex-b.rowIndex;
1095
+ @ return -1;
1096
+ @ }
1097
+ }
10491098
@ var x = tableEl.getElementsByTagName('thead');
10501099
@ if(!(this.tbody && this.tbody[0].rows && this.tbody[0].rows.length>0)){
10511100
@ return;
10521101
@ }
10531102
@ if(x && x[0].rows && x[0].rows.length > 0) {
10541103
--- src/report.c
+++ src/report.c
@@ -977,13 +977,28 @@
977 @ this.columnTypes = columnTypes;
978 @ this.sort = function (cell) {
979 @ var column = cell.cellIndex;
980 @ var sortFn;
981 @ switch( cell.sortType ){
982 @ case "N": case "n": sortFn = this.sortNumeric; break;
983 @ case "T": case "t": sortFn = this.sortText; break;
984 @ case "K": case "k": sortFn = this.sortKey; break;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
985 @ default: return;
986 @ }
987 @ this.sortIndex = column;
988 @ var newRows = new Array();
989 @ for (j = 0; j < this.tbody[0].rows.length; j++) {
@@ -993,13 +1008,10 @@
993 @ newRows.reverse();
994 @ this.prevColumn = -this.prevColumn;
995 @ }else{
996 @ newRows.sort(sortFn);
997 @ this.prevColumn = this.sortIndex+1;
998 @ if( cell.sortType>="A" && cell.sortType<="Z" ){
999 @ newRows.reverse();
1000 @ }
1001 @ }
1002 @ for (i=0;i<newRows.length;i++) {
1003 @ this.tbody[0].appendChild(newRows[i]);
1004 @ }
1005 @ this.setHdrIcons();
@@ -1019,35 +1031,72 @@
1019 @ var clsName = hdrCell.className.replace(/\s*\bsort\s*\w+/, '');
1020 @ clsName += ' sort ' + sortType;
1021 @ hdrCell.className = clsName;
1022 @ }
1023 @ }
1024 @ this.sortText = function(a,b) {
1025 @ var i = thisObject.sortIndex;
1026 @ aa = a.cells[i].textContent.replace(/^\W+/,'').toLowerCase();
1027 @ bb = b.cells[i].textContent.replace(/^\W+/,'').toLowerCase();
1028 @ if(aa==bb) return a.rowIndex-b.rowIndex;
1029 @ if(aa<bb) return -1;
1030 @ return 1;
1031 @ }
1032 @ this.sortNumeric = function(a,b) {
1033 @ var i = thisObject.sortIndex;
1034 @ aa = parseFloat(a.cells[i].textContent);
1035 @ if (isNaN(aa)) aa = 0;
1036 @ bb = parseFloat(b.cells[i].textContent);
1037 @ if (isNaN(bb)) bb = 0;
1038 @ if(aa==bb) return a.rowIndex-b.rowIndex;
1039 @ return aa-bb;
1040 @ }
1041 @ this.sortKey = function(a,b) {
1042 @ var i = thisObject.sortIndex;
1043 @ aa = a.cells[i].getAttribute("data-sortkey");
1044 @ bb = b.cells[i].getAttribute("data-sortkey");
1045 @ if(aa==bb) return a.rowIndex-b.rowIndex;
1046 @ if(aa<bb) return -1;
1047 @ return 1;
1048 @ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1049 @ var x = tableEl.getElementsByTagName('thead');
1050 @ if(!(this.tbody && this.tbody[0].rows && this.tbody[0].rows.length>0)){
1051 @ return;
1052 @ }
1053 @ if(x && x[0].rows && x[0].rows.length > 0) {
1054
--- src/report.c
+++ src/report.c
@@ -977,13 +977,28 @@
977 @ this.columnTypes = columnTypes;
978 @ this.sort = function (cell) {
979 @ var column = cell.cellIndex;
980 @ var sortFn;
981 @ switch( cell.sortType ){
982 if( strchr(zColumnTypes,'n') ){
983 @ case "n": sortFn = this.sortNumeric; break;
984 }
985 if( strchr(zColumnTypes,'N') ){
986 @ case "N": sortFn = this.sortReverseNumeric; break;
987 }
988 if( strchr(zColumnTypes,'t') ){
989 @ case "t": sortFn = this.sortText; break;
990 }
991 if( strchr(zColumnTypes,'T') ){
992 @ case "T": sortFn = this.sortReverseText; break;
993 }
994 if( strchr(zColumnTypes,'k') ){
995 @ case "k": sortFn = this.sortKey; break;
996 }
997 if( strchr(zColumnTypes,'K') ){
998 @ case "K": sortFn = this.sortReverseKey; break;
999 }
1000 @ default: return;
1001 @ }
1002 @ this.sortIndex = column;
1003 @ var newRows = new Array();
1004 @ for (j = 0; j < this.tbody[0].rows.length; j++) {
@@ -993,13 +1008,10 @@
1008 @ newRows.reverse();
1009 @ this.prevColumn = -this.prevColumn;
1010 @ }else{
1011 @ newRows.sort(sortFn);
1012 @ this.prevColumn = this.sortIndex+1;
 
 
 
1013 @ }
1014 @ for (i=0;i<newRows.length;i++) {
1015 @ this.tbody[0].appendChild(newRows[i]);
1016 @ }
1017 @ this.setHdrIcons();
@@ -1019,35 +1031,72 @@
1031 @ var clsName = hdrCell.className.replace(/\s*\bsort\s*\w+/, '');
1032 @ clsName += ' sort ' + sortType;
1033 @ hdrCell.className = clsName;
1034 @ }
1035 @ }
1036 if( strchr(zColumnTypes,'t') ){
1037 @ this.sortText = function(a,b) {
1038 @ var i = thisObject.sortIndex;
1039 @ aa = a.cells[i].textContent.replace(/^\W+/,'').toLowerCase();
1040 @ bb = b.cells[i].textContent.replace(/^\W+/,'').toLowerCase();
1041 @ if(aa<bb) return -1;
1042 @ if(aa==bb) return a.rowIndex-b.rowIndex;
1043 @ return 1;
1044 @ }
1045 }
1046 if( strchr(zColumnTypes,'T') ){
1047 @ this.sortReverseText = function(a,b) {
1048 @ var i = thisObject.sortIndex;
1049 @ aa = a.cells[i].textContent.replace(/^\W+/,'').toLowerCase();
1050 @ bb = b.cells[i].textContent.replace(/^\W+/,'').toLowerCase();
1051 @ if(aa<bb) return +1;
1052 @ if(aa==bb) return a.rowIndex-b.rowIndex;
1053 @ return -1;
1054 @ }
1055 }
1056 if( strchr(zColumnTypes,'n') ){
1057 @ this.sortNumeric = function(a,b) {
1058 @ var i = thisObject.sortIndex;
1059 @ aa = parseFloat(a.cells[i].textContent);
1060 @ if (isNaN(aa)) aa = 0;
1061 @ bb = parseFloat(b.cells[i].textContent);
1062 @ if (isNaN(bb)) bb = 0;
1063 @ if(aa==bb) return a.rowIndex-b.rowIndex;
1064 @ return aa-bb;
1065 @ }
1066 }
1067 if( strchr(zColumnTypes,'N') ){
1068 @ this.sortReverseNumeric = function(a,b) {
1069 @ var i = thisObject.sortIndex;
1070 @ aa = parseFloat(a.cells[i].textContent);
1071 @ if (isNaN(aa)) aa = 0;
1072 @ bb = parseFloat(b.cells[i].textContent);
1073 @ if (isNaN(bb)) bb = 0;
1074 @ if(aa==bb) return a.rowIndex-b.rowIndex;
1075 @ return bb-aa;
1076 @ }
1077 }
1078 if( strchr(zColumnTypes,'k') ){
1079 @ this.sortKey = function(a,b) {
1080 @ var i = thisObject.sortIndex;
1081 @ aa = a.cells[i].getAttribute("data-sortkey");
1082 @ bb = b.cells[i].getAttribute("data-sortkey");
1083 @ if(aa<bb) return -1;
1084 @ if(aa==bb) return a.rowIndex-b.rowIndex;
1085 @ return 1;
1086 @ }
1087 }
1088 if( strchr(zColumnTypes,'K') ){
1089 @ this.sortReverseKey = function(a,b) {
1090 @ var i = thisObject.sortIndex;
1091 @ aa = a.cells[i].getAttribute("data-sortkey");
1092 @ bb = b.cells[i].getAttribute("data-sortkey");
1093 @ if(aa<bb) return +1;
1094 @ if(aa==bb) return a.rowIndex-b.rowIndex;
1095 @ return -1;
1096 @ }
1097 }
1098 @ var x = tableEl.getElementsByTagName('thead');
1099 @ if(!(this.tbody && this.tbody[0].rows && this.tbody[0].rows.length>0)){
1100 @ return;
1101 @ }
1102 @ if(x && x[0].rows && x[0].rows.length > 0) {
1103

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button