Fossil SCM
Integrated user=drh flag into more of the stats_report links. When user!='', the byweek report now only lists years for which the user produced events.
Commit
7eeaf16e72526994a5480872ab80e30852a4c021
Parent
52dc6c80ec741f9…
1 file changed
+32
-8
+32
-8
| --- src/timeline.c | ||
| +++ src/timeline.c | ||
| @@ -2069,22 +2069,33 @@ | ||
| 2069 | 2069 | int nYear = zYear ? strlen(zYear) : 0; |
| 2070 | 2070 | int i = 0; |
| 2071 | 2071 | Stmt qYears = empty_Stmt; |
| 2072 | 2072 | char * zDefaultYear = NULL; |
| 2073 | 2073 | char const * zUserName = P("user"); |
| 2074 | + Blob sql = empty_blob; | |
| 2075 | + if(!zUserName) zUserName = P("u"); | |
| 2074 | 2076 | cgi_printf("Select year: "); |
| 2075 | - db_prepare(&qYears, | |
| 2076 | - "SELECT DISTINCT substr(date(mtime),1,4) AS y " | |
| 2077 | - "FROM event GROUP BY y ORDER BY y"); | |
| 2078 | 2077 | |
| 2078 | + blob_append(&sql, | |
| 2079 | + "SELECT DISTINCT substr(date(mtime),1,4) AS y " | |
| 2080 | + "FROM event WHERE 1 ", -1); | |
| 2081 | + if(zUserName&&*zUserName){ | |
| 2082 | + blob_appendf(&sql,"AND user=%Q ", zUserName); | |
| 2083 | + } | |
| 2084 | + blob_append(&sql,"GROUP BY y ORDER BY y", -1); | |
| 2085 | + db_prepare(&qYears, blob_str(&sql)); | |
| 2086 | + blob_reset(&sql); | |
| 2079 | 2087 | while( SQLITE_ROW == db_step(&qYears) ){ |
| 2080 | 2088 | char const * zT = db_column_text(&qYears, 0); |
| 2081 | 2089 | if( i++ ){ |
| 2082 | 2090 | cgi_printf(" "); |
| 2083 | 2091 | } |
| 2084 | - cgi_printf("<a href='?view=byweek&y=%s'>%s</a>", | |
| 2085 | - zT, zT); | |
| 2092 | + cgi_printf("<a href='?view=byweek&y=%s", zT); | |
| 2093 | + if(zUserName && *zUserName){ | |
| 2094 | + cgi_printf("&user=%t",zUserName); | |
| 2095 | + } | |
| 2096 | + cgi_printf("'>%s</a>",zT); | |
| 2086 | 2097 | } |
| 2087 | 2098 | db_finalize(&qYears); |
| 2088 | 2099 | cgi_printf("<br/>"); |
| 2089 | 2100 | if(!zYear || !*zYear){ |
| 2090 | 2101 | zDefaultYear = db_text("????", "SELECT strftime('%%Y')"); |
| @@ -2093,11 +2104,11 @@ | ||
| 2093 | 2104 | } |
| 2094 | 2105 | if(4 == nYear){ |
| 2095 | 2106 | int const nPixelsPerEvent = 3; /* for sizing the "graph" part */ |
| 2096 | 2107 | Stmt stWeek = empty_Stmt; |
| 2097 | 2108 | int rowCount = 0; |
| 2098 | - Blob sql = empty_blob; | |
| 2109 | + int total = 0; | |
| 2099 | 2110 | Blob header = empty_blob; |
| 2100 | 2111 | blob_appendf(&header, "Timeline events for the calendar weeks " |
| 2101 | 2112 | "of %h", zYear); |
| 2102 | 2113 | blob_appendf(&sql, |
| 2103 | 2114 | "SELECT DISTINCT strftime('%%%%W',mtime) AS wk, " |
| @@ -2126,13 +2137,19 @@ | ||
| 2126 | 2137 | blob_reset(&sql); |
| 2127 | 2138 | while( SQLITE_ROW == db_step(&stWeek) ){ |
| 2128 | 2139 | char const * zWeek = db_column_text(&stWeek,0); |
| 2129 | 2140 | int nCount = db_column_int(&stWeek,1); |
| 2130 | 2141 | int const graphSize = nPixelsPerEvent * nCount; |
| 2142 | + total += nCount; | |
| 2131 | 2143 | cgi_printf("<tr class='row%d'>", ++rowCount % 2 ); |
| 2132 | - cgi_printf("<td><a href='%s/timeline?yw=%t-%s'>%s</a></td>", | |
| 2133 | - g.zTop, zYear, zWeek, zWeek); | |
| 2144 | + cgi_printf("<td><a href='%s/timeline?yw=%t-%s", | |
| 2145 | + g.zTop, zYear, zWeek); | |
| 2146 | + if(zUserName && *zUserName){ | |
| 2147 | + cgi_printf("&u=%t",zUserName); | |
| 2148 | + } | |
| 2149 | + cgi_printf("'>%s</a></td>",zWeek); | |
| 2150 | + | |
| 2134 | 2151 | cgi_printf("<td>%d</td>",nCount); |
| 2135 | 2152 | cgi_printf("<td>"); |
| 2136 | 2153 | if(nCount){ |
| 2137 | 2154 | cgi_printf("<div class='statistics-report-graph-line'" |
| 2138 | 2155 | "style='height:16px;width:%dpx;'></div>", |
| @@ -2140,10 +2157,16 @@ | ||
| 2140 | 2157 | } |
| 2141 | 2158 | cgi_printf("</td></tr>"); |
| 2142 | 2159 | } |
| 2143 | 2160 | db_finalize(&stWeek); |
| 2144 | 2161 | free(zDefaultYear); |
| 2162 | + if(total){ | |
| 2163 | + cgi_printf("<tr class='row%d'>", ++rowCount%2); | |
| 2164 | + cgi_printf("<td colspan='2'>Total events:</td><td>%d</td>", | |
| 2165 | + total); | |
| 2166 | + cgi_printf("</tr>"); | |
| 2167 | + } | |
| 2145 | 2168 | cgi_printf("</tbody></table>"); |
| 2146 | 2169 | output_table_sorting_javascript("statsTable","tnx"); |
| 2147 | 2170 | } |
| 2148 | 2171 | } |
| 2149 | 2172 | |
| @@ -2159,10 +2182,11 @@ | ||
| 2159 | 2182 | */ |
| 2160 | 2183 | void stats_report_page(){ |
| 2161 | 2184 | HQuery url; /* URL for various branch links */ |
| 2162 | 2185 | char const * zView = P("view"); /* Which view/report to show. */ |
| 2163 | 2186 | char const *zUserName = P("user"); |
| 2187 | + if(!zUserName) zUserName = P("u"); | |
| 2164 | 2188 | url_initialize(&url, "stats_report"); |
| 2165 | 2189 | |
| 2166 | 2190 | if(zUserName && *zUserName){ |
| 2167 | 2191 | url_add_parameter(&url,"user", zUserName); |
| 2168 | 2192 | timeline_submenu(&url, "(Remove User Flag)", "view", zView, "user"); |
| 2169 | 2193 |
| --- src/timeline.c | |
| +++ src/timeline.c | |
| @@ -2069,22 +2069,33 @@ | |
| 2069 | int nYear = zYear ? strlen(zYear) : 0; |
| 2070 | int i = 0; |
| 2071 | Stmt qYears = empty_Stmt; |
| 2072 | char * zDefaultYear = NULL; |
| 2073 | char const * zUserName = P("user"); |
| 2074 | cgi_printf("Select year: "); |
| 2075 | db_prepare(&qYears, |
| 2076 | "SELECT DISTINCT substr(date(mtime),1,4) AS y " |
| 2077 | "FROM event GROUP BY y ORDER BY y"); |
| 2078 | |
| 2079 | while( SQLITE_ROW == db_step(&qYears) ){ |
| 2080 | char const * zT = db_column_text(&qYears, 0); |
| 2081 | if( i++ ){ |
| 2082 | cgi_printf(" "); |
| 2083 | } |
| 2084 | cgi_printf("<a href='?view=byweek&y=%s'>%s</a>", |
| 2085 | zT, zT); |
| 2086 | } |
| 2087 | db_finalize(&qYears); |
| 2088 | cgi_printf("<br/>"); |
| 2089 | if(!zYear || !*zYear){ |
| 2090 | zDefaultYear = db_text("????", "SELECT strftime('%%Y')"); |
| @@ -2093,11 +2104,11 @@ | |
| 2093 | } |
| 2094 | if(4 == nYear){ |
| 2095 | int const nPixelsPerEvent = 3; /* for sizing the "graph" part */ |
| 2096 | Stmt stWeek = empty_Stmt; |
| 2097 | int rowCount = 0; |
| 2098 | Blob sql = empty_blob; |
| 2099 | Blob header = empty_blob; |
| 2100 | blob_appendf(&header, "Timeline events for the calendar weeks " |
| 2101 | "of %h", zYear); |
| 2102 | blob_appendf(&sql, |
| 2103 | "SELECT DISTINCT strftime('%%%%W',mtime) AS wk, " |
| @@ -2126,13 +2137,19 @@ | |
| 2126 | blob_reset(&sql); |
| 2127 | while( SQLITE_ROW == db_step(&stWeek) ){ |
| 2128 | char const * zWeek = db_column_text(&stWeek,0); |
| 2129 | int nCount = db_column_int(&stWeek,1); |
| 2130 | int const graphSize = nPixelsPerEvent * nCount; |
| 2131 | cgi_printf("<tr class='row%d'>", ++rowCount % 2 ); |
| 2132 | cgi_printf("<td><a href='%s/timeline?yw=%t-%s'>%s</a></td>", |
| 2133 | g.zTop, zYear, zWeek, zWeek); |
| 2134 | cgi_printf("<td>%d</td>",nCount); |
| 2135 | cgi_printf("<td>"); |
| 2136 | if(nCount){ |
| 2137 | cgi_printf("<div class='statistics-report-graph-line'" |
| 2138 | "style='height:16px;width:%dpx;'></div>", |
| @@ -2140,10 +2157,16 @@ | |
| 2140 | } |
| 2141 | cgi_printf("</td></tr>"); |
| 2142 | } |
| 2143 | db_finalize(&stWeek); |
| 2144 | free(zDefaultYear); |
| 2145 | cgi_printf("</tbody></table>"); |
| 2146 | output_table_sorting_javascript("statsTable","tnx"); |
| 2147 | } |
| 2148 | } |
| 2149 | |
| @@ -2159,10 +2182,11 @@ | |
| 2159 | */ |
| 2160 | void stats_report_page(){ |
| 2161 | HQuery url; /* URL for various branch links */ |
| 2162 | char const * zView = P("view"); /* Which view/report to show. */ |
| 2163 | char const *zUserName = P("user"); |
| 2164 | url_initialize(&url, "stats_report"); |
| 2165 | |
| 2166 | if(zUserName && *zUserName){ |
| 2167 | url_add_parameter(&url,"user", zUserName); |
| 2168 | timeline_submenu(&url, "(Remove User Flag)", "view", zView, "user"); |
| 2169 |
| --- src/timeline.c | |
| +++ src/timeline.c | |
| @@ -2069,22 +2069,33 @@ | |
| 2069 | int nYear = zYear ? strlen(zYear) : 0; |
| 2070 | int i = 0; |
| 2071 | Stmt qYears = empty_Stmt; |
| 2072 | char * zDefaultYear = NULL; |
| 2073 | char const * zUserName = P("user"); |
| 2074 | Blob sql = empty_blob; |
| 2075 | if(!zUserName) zUserName = P("u"); |
| 2076 | cgi_printf("Select year: "); |
| 2077 | |
| 2078 | blob_append(&sql, |
| 2079 | "SELECT DISTINCT substr(date(mtime),1,4) AS y " |
| 2080 | "FROM event WHERE 1 ", -1); |
| 2081 | if(zUserName&&*zUserName){ |
| 2082 | blob_appendf(&sql,"AND user=%Q ", zUserName); |
| 2083 | } |
| 2084 | blob_append(&sql,"GROUP BY y ORDER BY y", -1); |
| 2085 | db_prepare(&qYears, blob_str(&sql)); |
| 2086 | blob_reset(&sql); |
| 2087 | while( SQLITE_ROW == db_step(&qYears) ){ |
| 2088 | char const * zT = db_column_text(&qYears, 0); |
| 2089 | if( i++ ){ |
| 2090 | cgi_printf(" "); |
| 2091 | } |
| 2092 | cgi_printf("<a href='?view=byweek&y=%s", zT); |
| 2093 | if(zUserName && *zUserName){ |
| 2094 | cgi_printf("&user=%t",zUserName); |
| 2095 | } |
| 2096 | cgi_printf("'>%s</a>",zT); |
| 2097 | } |
| 2098 | db_finalize(&qYears); |
| 2099 | cgi_printf("<br/>"); |
| 2100 | if(!zYear || !*zYear){ |
| 2101 | zDefaultYear = db_text("????", "SELECT strftime('%%Y')"); |
| @@ -2093,11 +2104,11 @@ | |
| 2104 | } |
| 2105 | if(4 == nYear){ |
| 2106 | int const nPixelsPerEvent = 3; /* for sizing the "graph" part */ |
| 2107 | Stmt stWeek = empty_Stmt; |
| 2108 | int rowCount = 0; |
| 2109 | int total = 0; |
| 2110 | Blob header = empty_blob; |
| 2111 | blob_appendf(&header, "Timeline events for the calendar weeks " |
| 2112 | "of %h", zYear); |
| 2113 | blob_appendf(&sql, |
| 2114 | "SELECT DISTINCT strftime('%%%%W',mtime) AS wk, " |
| @@ -2126,13 +2137,19 @@ | |
| 2137 | blob_reset(&sql); |
| 2138 | while( SQLITE_ROW == db_step(&stWeek) ){ |
| 2139 | char const * zWeek = db_column_text(&stWeek,0); |
| 2140 | int nCount = db_column_int(&stWeek,1); |
| 2141 | int const graphSize = nPixelsPerEvent * nCount; |
| 2142 | total += nCount; |
| 2143 | cgi_printf("<tr class='row%d'>", ++rowCount % 2 ); |
| 2144 | cgi_printf("<td><a href='%s/timeline?yw=%t-%s", |
| 2145 | g.zTop, zYear, zWeek); |
| 2146 | if(zUserName && *zUserName){ |
| 2147 | cgi_printf("&u=%t",zUserName); |
| 2148 | } |
| 2149 | cgi_printf("'>%s</a></td>",zWeek); |
| 2150 | |
| 2151 | cgi_printf("<td>%d</td>",nCount); |
| 2152 | cgi_printf("<td>"); |
| 2153 | if(nCount){ |
| 2154 | cgi_printf("<div class='statistics-report-graph-line'" |
| 2155 | "style='height:16px;width:%dpx;'></div>", |
| @@ -2140,10 +2157,16 @@ | |
| 2157 | } |
| 2158 | cgi_printf("</td></tr>"); |
| 2159 | } |
| 2160 | db_finalize(&stWeek); |
| 2161 | free(zDefaultYear); |
| 2162 | if(total){ |
| 2163 | cgi_printf("<tr class='row%d'>", ++rowCount%2); |
| 2164 | cgi_printf("<td colspan='2'>Total events:</td><td>%d</td>", |
| 2165 | total); |
| 2166 | cgi_printf("</tr>"); |
| 2167 | } |
| 2168 | cgi_printf("</tbody></table>"); |
| 2169 | output_table_sorting_javascript("statsTable","tnx"); |
| 2170 | } |
| 2171 | } |
| 2172 | |
| @@ -2159,10 +2182,11 @@ | |
| 2182 | */ |
| 2183 | void stats_report_page(){ |
| 2184 | HQuery url; /* URL for various branch links */ |
| 2185 | char const * zView = P("view"); /* Which view/report to show. */ |
| 2186 | char const *zUserName = P("user"); |
| 2187 | if(!zUserName) zUserName = P("u"); |
| 2188 | url_initialize(&url, "stats_report"); |
| 2189 | |
| 2190 | if(zUserName && *zUserName){ |
| 2191 | url_add_parameter(&url,"user", zUserName); |
| 2192 | timeline_submenu(&url, "(Remove User Flag)", "view", zView, "user"); |
| 2193 |