Fossil SCM

Continuing work on the ticketing system.

drh 2008-05-28 18:48 trunk
Commit 49380d500a1259b4dd10230c83d0816264d4e59d
+4 -1
--- src/login.c
+++ src/login.c
@@ -311,11 +311,12 @@
311311
switch( zCap[i] ){
312312
case 's': g.okSetup = 1;
313313
case 'a': g.okAdmin = g.okRdTkt = g.okWrTkt = g.okQuery =
314314
g.okRdWiki = g.okWrWiki = g.okNewWiki =
315315
g.okApndWiki = g.okHistory = g.okClone =
316
- g.okNewTkt = g.okPassword = g.okRdAddr = 1;
316
+ g.okNewTkt = g.okPassword = g.okRdAddr =
317
+ g.okTktFmt = 1;
317318
case 'i': g.okRead = g.okWrite = 1; break;
318319
case 'o': g.okRead = 1; break;
319320
320321
case 'd': g.okDelete = 1; break;
321322
case 'h': g.okHistory = 1; break;
@@ -332,10 +333,11 @@
332333
case 'r': g.okRdTkt = 1; break;
333334
case 'n': g.okNewTkt = 1; break;
334335
case 'w': g.okWrTkt = g.okRdTkt = g.okNewTkt =
335336
g.okApndTkt = 1; break;
336337
case 'c': g.okApndTkt = 1; break;
338
+ case 't': g.okTktFmt = 1; break;
337339
}
338340
}
339341
}
340342
341343
/*
@@ -364,10 +366,11 @@
364366
case 'o': rc = g.okRead; break;
365367
case 'p': rc = g.okPassword; break;
366368
case 'q': rc = g.okQuery; break;
367369
case 'r': rc = g.okRdTkt; break;
368370
case 's': rc = g.okSetup; break;
371
+ case 't': rc = g.okTktFmt; break;
369372
case 'w': rc = g.okWrTkt; break;
370373
default: rc = 0; break;
371374
}
372375
}
373376
return rc;
374377
--- src/login.c
+++ src/login.c
@@ -311,11 +311,12 @@
311 switch( zCap[i] ){
312 case 's': g.okSetup = 1;
313 case 'a': g.okAdmin = g.okRdTkt = g.okWrTkt = g.okQuery =
314 g.okRdWiki = g.okWrWiki = g.okNewWiki =
315 g.okApndWiki = g.okHistory = g.okClone =
316 g.okNewTkt = g.okPassword = g.okRdAddr = 1;
 
317 case 'i': g.okRead = g.okWrite = 1; break;
318 case 'o': g.okRead = 1; break;
319
320 case 'd': g.okDelete = 1; break;
321 case 'h': g.okHistory = 1; break;
@@ -332,10 +333,11 @@
332 case 'r': g.okRdTkt = 1; break;
333 case 'n': g.okNewTkt = 1; break;
334 case 'w': g.okWrTkt = g.okRdTkt = g.okNewTkt =
335 g.okApndTkt = 1; break;
336 case 'c': g.okApndTkt = 1; break;
 
337 }
338 }
339 }
340
341 /*
@@ -364,10 +366,11 @@
364 case 'o': rc = g.okRead; break;
365 case 'p': rc = g.okPassword; break;
366 case 'q': rc = g.okQuery; break;
367 case 'r': rc = g.okRdTkt; break;
368 case 's': rc = g.okSetup; break;
 
369 case 'w': rc = g.okWrTkt; break;
370 default: rc = 0; break;
371 }
372 }
373 return rc;
374
--- src/login.c
+++ src/login.c
@@ -311,11 +311,12 @@
311 switch( zCap[i] ){
312 case 's': g.okSetup = 1;
313 case 'a': g.okAdmin = g.okRdTkt = g.okWrTkt = g.okQuery =
314 g.okRdWiki = g.okWrWiki = g.okNewWiki =
315 g.okApndWiki = g.okHistory = g.okClone =
316 g.okNewTkt = g.okPassword = g.okRdAddr =
317 g.okTktFmt = 1;
318 case 'i': g.okRead = g.okWrite = 1; break;
319 case 'o': g.okRead = 1; break;
320
321 case 'd': g.okDelete = 1; break;
322 case 'h': g.okHistory = 1; break;
@@ -332,10 +333,11 @@
333 case 'r': g.okRdTkt = 1; break;
334 case 'n': g.okNewTkt = 1; break;
335 case 'w': g.okWrTkt = g.okRdTkt = g.okNewTkt =
336 g.okApndTkt = 1; break;
337 case 'c': g.okApndTkt = 1; break;
338 case 't': g.okTktFmt = 1; break;
339 }
340 }
341 }
342
343 /*
@@ -364,10 +366,11 @@
366 case 'o': rc = g.okRead; break;
367 case 'p': rc = g.okPassword; break;
368 case 'q': rc = g.okQuery; break;
369 case 'r': rc = g.okRdTkt; break;
370 case 's': rc = g.okSetup; break;
371 case 't': rc = g.okTktFmt; break;
372 case 'w': rc = g.okWrTkt; break;
373 default: rc = 0; break;
374 }
375 }
376 return rc;
377
+1
--- src/main.c
+++ src/main.c
@@ -114,10 +114,11 @@
114114
int okWrWiki; /* k: edit wiki via web */
115115
int okRdTkt; /* r: view tickets via web */
116116
int okNewTkt; /* n: create new tickets */
117117
int okApndTkt; /* c: append to tickets via the web */
118118
int okWrTkt; /* w: make changes to tickets via web */
119
+ int okTktFmt; /* t: create new ticket report formats */
119120
int okRdAddr; /* e: read email addresses on tickets */
120121
121122
FILE *fDebug; /* Write debug information here, if the file exists */
122123
123124
/* Storage for the aux() and/or option() SQL function arguments */
124125
--- src/main.c
+++ src/main.c
@@ -114,10 +114,11 @@
114 int okWrWiki; /* k: edit wiki via web */
115 int okRdTkt; /* r: view tickets via web */
116 int okNewTkt; /* n: create new tickets */
117 int okApndTkt; /* c: append to tickets via the web */
118 int okWrTkt; /* w: make changes to tickets via web */
 
119 int okRdAddr; /* e: read email addresses on tickets */
120
121 FILE *fDebug; /* Write debug information here, if the file exists */
122
123 /* Storage for the aux() and/or option() SQL function arguments */
124
--- src/main.c
+++ src/main.c
@@ -114,10 +114,11 @@
114 int okWrWiki; /* k: edit wiki via web */
115 int okRdTkt; /* r: view tickets via web */
116 int okNewTkt; /* n: create new tickets */
117 int okApndTkt; /* c: append to tickets via the web */
118 int okWrTkt; /* w: make changes to tickets via web */
119 int okTktFmt; /* t: create new ticket report formats */
120 int okRdAddr; /* e: read email addresses on tickets */
121
122 FILE *fDebug; /* Write debug information here, if the file exists */
123
124 /* Storage for the aux() and/or option() SQL function arguments */
125
+10 -36
--- src/report.c
+++ src/report.c
@@ -35,17 +35,18 @@
3535
** WEBPAGE: /reportlist
3636
*/
3737
void view_list(void){
3838
Stmt q;
3939
int rn = 0;
40
+ int cnt = 1;
4041
4142
login_check_credentials();
4243
if( !g.okRdTkt && !g.okNewTkt ){ login_needed(); return; }
4344
style_header("Bug Report Main Menu");
4445
if( g.okNewTkt ){
4546
@ <p>Enter a new bug report:</p>
46
- @ <ol><li value="0"><a href="tktnew">New bug report</a></li></ol>
47
+ @ <ol><li value="1"><a href="tktnew">New bug report</a></li></ol>
4748
@
4849
}
4950
if( !g.okRdTkt ){
5051
@ <p>You are not authorized to view existing bug reports.</p>
5152
}else{
@@ -54,16 +55,17 @@
5455
@ <ol>
5556
while( db_step(&q)==SQLITE_ROW ){
5657
rn = db_column_int(&q, 0);
5758
const char *zTitle = db_column_text(&q, 1);
5859
const char *zOwner = db_column_text(&q, 2);
59
- @ <li value="%d(rn)"><a href="rptview?rn=%d(rn)"
60
+ cnt++;
61
+ @ <li value="%d(cnt)"><a href="rptview?rn=%d(rn)"
6062
@ rel="nofollow">%h(zTitle)</a>&nbsp;&nbsp;&nbsp;
6163
if( g.okWrite && zOwner && zOwner[0] ){
6264
@ (by <i>%h(zOwner)</i>)
6365
}
64
- if( g.okWrTkt ){
66
+ if( g.okTktFmt ){
6567
@ [<a href="rptedit?rn=%d(rn)&amp;copy=1" rel="nofollow">copy</a>]
6668
}
6769
if( g.okAdmin || (g.okWrTkt && zOwner && strcmp(g.zLogin,zOwner)==0) ){
6870
@ [<a href="rptedit?rn=%d(rn)" rel="nofollow">edit</a>]
6971
}
@@ -70,14 +72,14 @@
7072
@ [<a href="rptsql?rn=%d(rn)" rel="nofollow">sql</a>]
7173
@ </li>
7274
}
7375
}
7476
@ </ol>
75
- if( g.okWrTkt ){
77
+ if( g.okTktFmt ){
7678
@ <p>Create a new bug report display format:</p>
7779
@ <ol>
78
- @ <li value="%d(rn+1)"><a href="rptnew">New report format</a></li>
80
+ @ <li value="%d(cnt+1)"><a href="rptnew">New report format</a></li>
7981
@ </ol>
8082
}
8183
style_footer();
8284
}
8385
@@ -293,11 +295,11 @@
293295
void view_edit(void){
294296
int rn;
295297
const char *zTitle;
296298
const char *z;
297299
const char *zOwner;
298
- char *zClrKey;
300
+ const char *zClrKey;
299301
char *zSQL;
300302
char *zErr = 0;
301303
302304
login_check_credentials();
303305
if( !g.okQuery ){
@@ -360,40 +362,12 @@
360362
cgi_redirect(mprintf("rptview?rn=%d", rn));
361363
return;
362364
}
363365
}else if( rn==0 ){
364366
zTitle = "";
365
- zSQL =
366
- @ SELECT
367
- @ CASE WHEN status IN ('new','active') THEN '#f2dcdc'
368
- @ WHEN status='review' THEN '#e8e8bd'
369
- @ WHEN status='fixed' THEN '#cfe8bd'
370
- @ WHEN status='tested' THEN '#bde5d6'
371
- @ WHEN status='defer' THEN '#cacae5'
372
- @ ELSE '#c8c8c8' END AS 'bgcolor',
373
- @ tn AS '#',
374
- @ type AS 'Type',
375
- @ status AS 'Status',
376
- @ sdate(origtime) AS 'Created',
377
- @ owner AS 'By',
378
- @ subsystem AS 'Subsys',
379
- @ sdate(changetime) AS 'Changed',
380
- @ assignedto AS 'Assigned',
381
- @ severity AS 'Svr',
382
- @ priority AS 'Pri',
383
- @ title AS 'Title'
384
- @ FROM ticket
385
- ;
386
- zClrKey =
387
- @ #ffffff Key:
388
- @ #f2dcdc Active
389
- @ #e8e8e8 Review
390
- @ #cfe8bd Fixed
391
- @ #bde5d6 Tested
392
- @ #cacae5 Deferred
393
- @ #c8c8c8 Closed
394
- ;
367
+ zSQL = ticket_report_template();
368
+ zClrKey = ticket_key_template();
395369
}else{
396370
Stmt q;
397371
db_prepare(&q, "SELECT title, sqlcode, owner, cols "
398372
"FROM reportfmt WHERE rn=%d",rn);
399373
if( db_step(&q)==SQLITE_ROW ){
400374
--- src/report.c
+++ src/report.c
@@ -35,17 +35,18 @@
35 ** WEBPAGE: /reportlist
36 */
37 void view_list(void){
38 Stmt q;
39 int rn = 0;
 
40
41 login_check_credentials();
42 if( !g.okRdTkt && !g.okNewTkt ){ login_needed(); return; }
43 style_header("Bug Report Main Menu");
44 if( g.okNewTkt ){
45 @ <p>Enter a new bug report:</p>
46 @ <ol><li value="0"><a href="tktnew">New bug report</a></li></ol>
47 @
48 }
49 if( !g.okRdTkt ){
50 @ <p>You are not authorized to view existing bug reports.</p>
51 }else{
@@ -54,16 +55,17 @@
54 @ <ol>
55 while( db_step(&q)==SQLITE_ROW ){
56 rn = db_column_int(&q, 0);
57 const char *zTitle = db_column_text(&q, 1);
58 const char *zOwner = db_column_text(&q, 2);
59 @ <li value="%d(rn)"><a href="rptview?rn=%d(rn)"
 
60 @ rel="nofollow">%h(zTitle)</a>&nbsp;&nbsp;&nbsp;
61 if( g.okWrite && zOwner && zOwner[0] ){
62 @ (by <i>%h(zOwner)</i>)
63 }
64 if( g.okWrTkt ){
65 @ [<a href="rptedit?rn=%d(rn)&amp;copy=1" rel="nofollow">copy</a>]
66 }
67 if( g.okAdmin || (g.okWrTkt && zOwner && strcmp(g.zLogin,zOwner)==0) ){
68 @ [<a href="rptedit?rn=%d(rn)" rel="nofollow">edit</a>]
69 }
@@ -70,14 +72,14 @@
70 @ [<a href="rptsql?rn=%d(rn)" rel="nofollow">sql</a>]
71 @ </li>
72 }
73 }
74 @ </ol>
75 if( g.okWrTkt ){
76 @ <p>Create a new bug report display format:</p>
77 @ <ol>
78 @ <li value="%d(rn+1)"><a href="rptnew">New report format</a></li>
79 @ </ol>
80 }
81 style_footer();
82 }
83
@@ -293,11 +295,11 @@
293 void view_edit(void){
294 int rn;
295 const char *zTitle;
296 const char *z;
297 const char *zOwner;
298 char *zClrKey;
299 char *zSQL;
300 char *zErr = 0;
301
302 login_check_credentials();
303 if( !g.okQuery ){
@@ -360,40 +362,12 @@
360 cgi_redirect(mprintf("rptview?rn=%d", rn));
361 return;
362 }
363 }else if( rn==0 ){
364 zTitle = "";
365 zSQL =
366 @ SELECT
367 @ CASE WHEN status IN ('new','active') THEN '#f2dcdc'
368 @ WHEN status='review' THEN '#e8e8bd'
369 @ WHEN status='fixed' THEN '#cfe8bd'
370 @ WHEN status='tested' THEN '#bde5d6'
371 @ WHEN status='defer' THEN '#cacae5'
372 @ ELSE '#c8c8c8' END AS 'bgcolor',
373 @ tn AS '#',
374 @ type AS 'Type',
375 @ status AS 'Status',
376 @ sdate(origtime) AS 'Created',
377 @ owner AS 'By',
378 @ subsystem AS 'Subsys',
379 @ sdate(changetime) AS 'Changed',
380 @ assignedto AS 'Assigned',
381 @ severity AS 'Svr',
382 @ priority AS 'Pri',
383 @ title AS 'Title'
384 @ FROM ticket
385 ;
386 zClrKey =
387 @ #ffffff Key:
388 @ #f2dcdc Active
389 @ #e8e8e8 Review
390 @ #cfe8bd Fixed
391 @ #bde5d6 Tested
392 @ #cacae5 Deferred
393 @ #c8c8c8 Closed
394 ;
395 }else{
396 Stmt q;
397 db_prepare(&q, "SELECT title, sqlcode, owner, cols "
398 "FROM reportfmt WHERE rn=%d",rn);
399 if( db_step(&q)==SQLITE_ROW ){
400
--- src/report.c
+++ src/report.c
@@ -35,17 +35,18 @@
35 ** WEBPAGE: /reportlist
36 */
37 void view_list(void){
38 Stmt q;
39 int rn = 0;
40 int cnt = 1;
41
42 login_check_credentials();
43 if( !g.okRdTkt && !g.okNewTkt ){ login_needed(); return; }
44 style_header("Bug Report Main Menu");
45 if( g.okNewTkt ){
46 @ <p>Enter a new bug report:</p>
47 @ <ol><li value="1"><a href="tktnew">New bug report</a></li></ol>
48 @
49 }
50 if( !g.okRdTkt ){
51 @ <p>You are not authorized to view existing bug reports.</p>
52 }else{
@@ -54,16 +55,17 @@
55 @ <ol>
56 while( db_step(&q)==SQLITE_ROW ){
57 rn = db_column_int(&q, 0);
58 const char *zTitle = db_column_text(&q, 1);
59 const char *zOwner = db_column_text(&q, 2);
60 cnt++;
61 @ <li value="%d(cnt)"><a href="rptview?rn=%d(rn)"
62 @ rel="nofollow">%h(zTitle)</a>&nbsp;&nbsp;&nbsp;
63 if( g.okWrite && zOwner && zOwner[0] ){
64 @ (by <i>%h(zOwner)</i>)
65 }
66 if( g.okTktFmt ){
67 @ [<a href="rptedit?rn=%d(rn)&amp;copy=1" rel="nofollow">copy</a>]
68 }
69 if( g.okAdmin || (g.okWrTkt && zOwner && strcmp(g.zLogin,zOwner)==0) ){
70 @ [<a href="rptedit?rn=%d(rn)" rel="nofollow">edit</a>]
71 }
@@ -70,14 +72,14 @@
72 @ [<a href="rptsql?rn=%d(rn)" rel="nofollow">sql</a>]
73 @ </li>
74 }
75 }
76 @ </ol>
77 if( g.okTktFmt ){
78 @ <p>Create a new bug report display format:</p>
79 @ <ol>
80 @ <li value="%d(cnt+1)"><a href="rptnew">New report format</a></li>
81 @ </ol>
82 }
83 style_footer();
84 }
85
@@ -293,11 +295,11 @@
295 void view_edit(void){
296 int rn;
297 const char *zTitle;
298 const char *z;
299 const char *zOwner;
300 const char *zClrKey;
301 char *zSQL;
302 char *zErr = 0;
303
304 login_check_credentials();
305 if( !g.okQuery ){
@@ -360,40 +362,12 @@
362 cgi_redirect(mprintf("rptview?rn=%d", rn));
363 return;
364 }
365 }else if( rn==0 ){
366 zTitle = "";
367 zSQL = ticket_report_template();
368 zClrKey = ticket_key_template();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
369 }else{
370 Stmt q;
371 db_prepare(&q, "SELECT title, sqlcode, owner, cols "
372 "FROM reportfmt WHERE rn=%d",rn);
373 if( db_step(&q)==SQLITE_ROW ){
374
+9 -3
--- src/setup.c
+++ src/setup.c
@@ -148,10 +148,11 @@
148148
@ <li value="15"><b>Check-Out</b>: Check out versions</li>
149149
@ <li value="16"><b>Password</b>: Change your own password</li>
150150
@ <li value="17"><b>Query</b>: Create new queries against tickets</li>
151151
@ <li value="18"><b>Read-Tkt</b>: View tickets</li>
152152
@ <li value="19"><b>Setup:</b> Setup and configure this website</li>
153
+ @ <li value="20"><b>Tkt-Report:</b> Create new bug summary reports</li>
153154
@ <li value="23"><b>Write-Tkt</b>: Edit tickets</li>
154155
@ </ol>
155156
@ </p></li>
156157
@
157158
@ <li><p>
@@ -171,10 +172,11 @@
171172
*/
172173
void user_edit(void){
173174
const char *zId, *zLogin, *zInfo, *zCap;
174175
char *oaa, *oas, *oar, *oaw, *oan, *oai, *oaj, *oao, *oap;
175176
char *oak, *oad, *oaq, *oac, *oaf, *oam, *oah, *oag, *oae;
177
+ char *oat;
176178
int doWrite;
177179
int uid;
178180
int higherUser = 0; /* True if user being edited is SETUP and the */
179181
/* user doing the editing is ADMIN. Disallow editing */
180182
@@ -205,11 +207,11 @@
205207
*/
206208
doWrite = cgi_all("login","info","pw") && !higherUser;
207209
if( doWrite ){
208210
const char *zPw;
209211
const char *zLogin;
210
- char zCap[30];
212
+ char zCap[50];
211213
int i = 0;
212214
int aa = P("aa")!=0;
213215
int ad = P("ad")!=0;
214216
int ae = P("ae")!=0;
215217
int ai = P("ai")!=0;
@@ -225,10 +227,11 @@
225227
int ac = P("ac")!=0;
226228
int af = P("af")!=0;
227229
int am = P("am")!=0;
228230
int ah = P("ah")!=0;
229231
int ag = P("ag")!=0;
232
+ int at = P("at")!=0;
230233
if( aa ){ zCap[i++] = 'a'; }
231234
if( ac ){ zCap[i++] = 'c'; }
232235
if( ad ){ zCap[i++] = 'd'; }
233236
if( ae ){ zCap[i++] = 'e'; }
234237
if( af ){ zCap[i++] = 'f'; }
@@ -242,10 +245,11 @@
242245
if( ao ){ zCap[i++] = 'o'; }
243246
if( ap ){ zCap[i++] = 'p'; }
244247
if( aq ){ zCap[i++] = 'q'; }
245248
if( ar ){ zCap[i++] = 'r'; }
246249
if( as ){ zCap[i++] = 's'; }
250
+ if( at ){ zCap[i++] = 't'; }
247251
if( aw ){ zCap[i++] = 'w'; }
248252
249253
zCap[i] = 0;
250254
zPw = P("pw");
251255
if( zPw==0 || zPw[0]==0 ){
@@ -276,11 +280,11 @@
276280
*/
277281
zLogin = "";
278282
zInfo = "";
279283
zCap = "";
280284
oaa = oac = oad = oae = oaf = oag = oah = oai = oaj = oak = oam =
281
- oan = oao = oap = oaq = oar = oas = oaw = "";
285
+ oan = oao = oap = oaq = oar = oas = oat = oaw = "";
282286
if( uid ){
283287
zLogin = db_text("", "SELECT login FROM user WHERE uid=%d", uid);
284288
zInfo = db_text("", "SELECT info FROM user WHERE uid=%d", uid);
285289
zCap = db_text("", "SELECT cap FROM user WHERE uid=%d", uid);
286290
if( strchr(zCap, 'a') ) oaa = " checked";
@@ -298,10 +302,11 @@
298302
if( strchr(zCap, 'o') ) oao = " checked";
299303
if( strchr(zCap, 'p') ) oap = " checked";
300304
if( strchr(zCap, 'q') ) oaq = " checked";
301305
if( strchr(zCap, 'r') ) oar = " checked";
302306
if( strchr(zCap, 's') ) oas = " checked";
307
+ if( strchr(zCap, 't') ) oat = " checked";
303308
if( strchr(zCap, 'w') ) oaw = " checked";
304309
}
305310
306311
/* Begin generating the page
307312
*/
@@ -350,11 +355,12 @@
350355
@ <input type="checkbox" name="am"%s(oam)>Append Wiki</input><br>
351356
@ <input type="checkbox" name="ak"%s(oak)>Write Wiki</input><br>
352357
@ <input type="checkbox" name="ar"%s(oar)>Read Tkt</input><br>
353358
@ <input type="checkbox" name="an"%s(oan)>New Tkt</input><br>
354359
@ <input type="checkbox" name="ac"%s(oac)>Append Tkt</input><br>
355
- @ <input type="checkbox" name="aw"%s(oaw)>Write Tkt</input>
360
+ @ <input type="checkbox" name="aw"%s(oaw)>Write Tkt</input><br>
361
+ @ <input type="checkbox" name="at"%s(oat)>Tkt Report</input>
356362
@ </td>
357363
@ </tr>
358364
@ <tr>
359365
@ <td align="right">Password:</td>
360366
@ <td><input type="password" name="pw" value=""></td>
361367
--- src/setup.c
+++ src/setup.c
@@ -148,10 +148,11 @@
148 @ <li value="15"><b>Check-Out</b>: Check out versions</li>
149 @ <li value="16"><b>Password</b>: Change your own password</li>
150 @ <li value="17"><b>Query</b>: Create new queries against tickets</li>
151 @ <li value="18"><b>Read-Tkt</b>: View tickets</li>
152 @ <li value="19"><b>Setup:</b> Setup and configure this website</li>
 
153 @ <li value="23"><b>Write-Tkt</b>: Edit tickets</li>
154 @ </ol>
155 @ </p></li>
156 @
157 @ <li><p>
@@ -171,10 +172,11 @@
171 */
172 void user_edit(void){
173 const char *zId, *zLogin, *zInfo, *zCap;
174 char *oaa, *oas, *oar, *oaw, *oan, *oai, *oaj, *oao, *oap;
175 char *oak, *oad, *oaq, *oac, *oaf, *oam, *oah, *oag, *oae;
 
176 int doWrite;
177 int uid;
178 int higherUser = 0; /* True if user being edited is SETUP and the */
179 /* user doing the editing is ADMIN. Disallow editing */
180
@@ -205,11 +207,11 @@
205 */
206 doWrite = cgi_all("login","info","pw") && !higherUser;
207 if( doWrite ){
208 const char *zPw;
209 const char *zLogin;
210 char zCap[30];
211 int i = 0;
212 int aa = P("aa")!=0;
213 int ad = P("ad")!=0;
214 int ae = P("ae")!=0;
215 int ai = P("ai")!=0;
@@ -225,10 +227,11 @@
225 int ac = P("ac")!=0;
226 int af = P("af")!=0;
227 int am = P("am")!=0;
228 int ah = P("ah")!=0;
229 int ag = P("ag")!=0;
 
230 if( aa ){ zCap[i++] = 'a'; }
231 if( ac ){ zCap[i++] = 'c'; }
232 if( ad ){ zCap[i++] = 'd'; }
233 if( ae ){ zCap[i++] = 'e'; }
234 if( af ){ zCap[i++] = 'f'; }
@@ -242,10 +245,11 @@
242 if( ao ){ zCap[i++] = 'o'; }
243 if( ap ){ zCap[i++] = 'p'; }
244 if( aq ){ zCap[i++] = 'q'; }
245 if( ar ){ zCap[i++] = 'r'; }
246 if( as ){ zCap[i++] = 's'; }
 
247 if( aw ){ zCap[i++] = 'w'; }
248
249 zCap[i] = 0;
250 zPw = P("pw");
251 if( zPw==0 || zPw[0]==0 ){
@@ -276,11 +280,11 @@
276 */
277 zLogin = "";
278 zInfo = "";
279 zCap = "";
280 oaa = oac = oad = oae = oaf = oag = oah = oai = oaj = oak = oam =
281 oan = oao = oap = oaq = oar = oas = oaw = "";
282 if( uid ){
283 zLogin = db_text("", "SELECT login FROM user WHERE uid=%d", uid);
284 zInfo = db_text("", "SELECT info FROM user WHERE uid=%d", uid);
285 zCap = db_text("", "SELECT cap FROM user WHERE uid=%d", uid);
286 if( strchr(zCap, 'a') ) oaa = " checked";
@@ -298,10 +302,11 @@
298 if( strchr(zCap, 'o') ) oao = " checked";
299 if( strchr(zCap, 'p') ) oap = " checked";
300 if( strchr(zCap, 'q') ) oaq = " checked";
301 if( strchr(zCap, 'r') ) oar = " checked";
302 if( strchr(zCap, 's') ) oas = " checked";
 
303 if( strchr(zCap, 'w') ) oaw = " checked";
304 }
305
306 /* Begin generating the page
307 */
@@ -350,11 +355,12 @@
350 @ <input type="checkbox" name="am"%s(oam)>Append Wiki</input><br>
351 @ <input type="checkbox" name="ak"%s(oak)>Write Wiki</input><br>
352 @ <input type="checkbox" name="ar"%s(oar)>Read Tkt</input><br>
353 @ <input type="checkbox" name="an"%s(oan)>New Tkt</input><br>
354 @ <input type="checkbox" name="ac"%s(oac)>Append Tkt</input><br>
355 @ <input type="checkbox" name="aw"%s(oaw)>Write Tkt</input>
 
356 @ </td>
357 @ </tr>
358 @ <tr>
359 @ <td align="right">Password:</td>
360 @ <td><input type="password" name="pw" value=""></td>
361
--- src/setup.c
+++ src/setup.c
@@ -148,10 +148,11 @@
148 @ <li value="15"><b>Check-Out</b>: Check out versions</li>
149 @ <li value="16"><b>Password</b>: Change your own password</li>
150 @ <li value="17"><b>Query</b>: Create new queries against tickets</li>
151 @ <li value="18"><b>Read-Tkt</b>: View tickets</li>
152 @ <li value="19"><b>Setup:</b> Setup and configure this website</li>
153 @ <li value="20"><b>Tkt-Report:</b> Create new bug summary reports</li>
154 @ <li value="23"><b>Write-Tkt</b>: Edit tickets</li>
155 @ </ol>
156 @ </p></li>
157 @
158 @ <li><p>
@@ -171,10 +172,11 @@
172 */
173 void user_edit(void){
174 const char *zId, *zLogin, *zInfo, *zCap;
175 char *oaa, *oas, *oar, *oaw, *oan, *oai, *oaj, *oao, *oap;
176 char *oak, *oad, *oaq, *oac, *oaf, *oam, *oah, *oag, *oae;
177 char *oat;
178 int doWrite;
179 int uid;
180 int higherUser = 0; /* True if user being edited is SETUP and the */
181 /* user doing the editing is ADMIN. Disallow editing */
182
@@ -205,11 +207,11 @@
207 */
208 doWrite = cgi_all("login","info","pw") && !higherUser;
209 if( doWrite ){
210 const char *zPw;
211 const char *zLogin;
212 char zCap[50];
213 int i = 0;
214 int aa = P("aa")!=0;
215 int ad = P("ad")!=0;
216 int ae = P("ae")!=0;
217 int ai = P("ai")!=0;
@@ -225,10 +227,11 @@
227 int ac = P("ac")!=0;
228 int af = P("af")!=0;
229 int am = P("am")!=0;
230 int ah = P("ah")!=0;
231 int ag = P("ag")!=0;
232 int at = P("at")!=0;
233 if( aa ){ zCap[i++] = 'a'; }
234 if( ac ){ zCap[i++] = 'c'; }
235 if( ad ){ zCap[i++] = 'd'; }
236 if( ae ){ zCap[i++] = 'e'; }
237 if( af ){ zCap[i++] = 'f'; }
@@ -242,10 +245,11 @@
245 if( ao ){ zCap[i++] = 'o'; }
246 if( ap ){ zCap[i++] = 'p'; }
247 if( aq ){ zCap[i++] = 'q'; }
248 if( ar ){ zCap[i++] = 'r'; }
249 if( as ){ zCap[i++] = 's'; }
250 if( at ){ zCap[i++] = 't'; }
251 if( aw ){ zCap[i++] = 'w'; }
252
253 zCap[i] = 0;
254 zPw = P("pw");
255 if( zPw==0 || zPw[0]==0 ){
@@ -276,11 +280,11 @@
280 */
281 zLogin = "";
282 zInfo = "";
283 zCap = "";
284 oaa = oac = oad = oae = oaf = oag = oah = oai = oaj = oak = oam =
285 oan = oao = oap = oaq = oar = oas = oat = oaw = "";
286 if( uid ){
287 zLogin = db_text("", "SELECT login FROM user WHERE uid=%d", uid);
288 zInfo = db_text("", "SELECT info FROM user WHERE uid=%d", uid);
289 zCap = db_text("", "SELECT cap FROM user WHERE uid=%d", uid);
290 if( strchr(zCap, 'a') ) oaa = " checked";
@@ -298,10 +302,11 @@
302 if( strchr(zCap, 'o') ) oao = " checked";
303 if( strchr(zCap, 'p') ) oap = " checked";
304 if( strchr(zCap, 'q') ) oaq = " checked";
305 if( strchr(zCap, 'r') ) oar = " checked";
306 if( strchr(zCap, 's') ) oas = " checked";
307 if( strchr(zCap, 't') ) oat = " checked";
308 if( strchr(zCap, 'w') ) oaw = " checked";
309 }
310
311 /* Begin generating the page
312 */
@@ -350,11 +355,12 @@
355 @ <input type="checkbox" name="am"%s(oam)>Append Wiki</input><br>
356 @ <input type="checkbox" name="ak"%s(oak)>Write Wiki</input><br>
357 @ <input type="checkbox" name="ar"%s(oar)>Read Tkt</input><br>
358 @ <input type="checkbox" name="an"%s(oan)>New Tkt</input><br>
359 @ <input type="checkbox" name="ac"%s(oac)>Append Tkt</input><br>
360 @ <input type="checkbox" name="aw"%s(oaw)>Write Tkt</input><br>
361 @ <input type="checkbox" name="at"%s(oat)>Tkt Report</input>
362 @ </td>
363 @ </tr>
364 @ <tr>
365 @ <td align="right">Password:</td>
366 @ <td><input type="password" name="pw" value=""></td>
367
+3 -2
--- src/tkt.c
+++ src/tkt.c
@@ -102,12 +102,13 @@
102102
static void initializeVariablesFromDb(void){
103103
const char *zName;
104104
Stmt q;
105105
int i, n, size, j;
106106
107
- zName = PD("name","");
108
- db_prepare(&q, "SELECT * FROM ticket WHERE tkt_uuid GLOB '%q*'", zName);
107
+ zName = PD("name","-none-");
108
+ db_prepare(&q, "SELECT datetime(tkt_mtime) AS tkt_datetime, *"
109
+ " FROM ticket WHERE tkt_uuid GLOB '%q*'", zName);
109110
if( db_step(&q)==SQLITE_ROW ){
110111
n = db_column_count(&q);
111112
for(i=0; i<n; i++){
112113
const char *zVal = db_column_text(&q, i);
113114
const char *zName = db_column_name(&q, i);
114115
--- src/tkt.c
+++ src/tkt.c
@@ -102,12 +102,13 @@
102 static void initializeVariablesFromDb(void){
103 const char *zName;
104 Stmt q;
105 int i, n, size, j;
106
107 zName = PD("name","");
108 db_prepare(&q, "SELECT * FROM ticket WHERE tkt_uuid GLOB '%q*'", zName);
 
109 if( db_step(&q)==SQLITE_ROW ){
110 n = db_column_count(&q);
111 for(i=0; i<n; i++){
112 const char *zVal = db_column_text(&q, i);
113 const char *zName = db_column_name(&q, i);
114
--- src/tkt.c
+++ src/tkt.c
@@ -102,12 +102,13 @@
102 static void initializeVariablesFromDb(void){
103 const char *zName;
104 Stmt q;
105 int i, n, size, j;
106
107 zName = PD("name","-none-");
108 db_prepare(&q, "SELECT datetime(tkt_mtime) AS tkt_datetime, *"
109 " FROM ticket WHERE tkt_uuid GLOB '%q*'", zName);
110 if( db_step(&q)==SQLITE_ROW ){
111 n = db_column_count(&q);
112 for(i=0; i<n; i++){
113 const char *zVal = db_column_text(&q, i);
114 const char *zName = db_column_name(&q, i);
115
+122 -19
--- src/tktsetup.c
+++ src/tktsetup.c
@@ -48,12 +48,14 @@
4848
"HTML with embedded TH1 code for the \"new ticket\" webpage.");
4949
setup_menu_entry("View Ticket Page", "tktsetup_viewpage",
5050
"HTML with embedded TH1 code for the \"view ticket\" webpage.");
5151
setup_menu_entry("Edit Ticket Page", "tktsetup_editpage",
5252
"HTML with embedded TH1 code for the \"edit ticket\" webpage.");
53
- setup_menu_entry("Report Format", "tktsetup_drep",
53
+ setup_menu_entry("Report Template", "tktsetup_rpttplt",
5454
"The default ticket report format.");
55
+ setup_menu_entry("Key Template", "tktsetup_keytplt",
56
+ "The default color key for reports.");
5557
@ </table>
5658
style_footer();
5759
}
5860
5961
/* @-comment: ** */
@@ -198,11 +200,11 @@
198200
@ Drive_By_Patch
199201
@ }
200202
@ set status_choices {
201203
@ Open
202204
@ Verified
203
-@ In_Process
205
+@ Review
204206
@ Deferred
205207
@ Fixed
206208
@ Tested
207209
@ Closed
208210
@ }
@@ -240,10 +242,11 @@
240242
@ if {[info exists submit]} {
241243
@ set status Open
242244
@ submit_ticket
243245
@ }
244246
@ </th1>
247
+@ <h1 align="center">Enter A New Bug Report</h1>
245248
@ <table cellpadding="5">
246249
@ <tr>
247250
@ <td colspan="2">
248251
@ Enter a one-line summary of the problem:<br>
249252
@ <input type="text" name="title" size="60" value="$<title>">
@@ -274,11 +277,11 @@
274277
@
275278
@ <tr>
276279
@ <td align="right">EMail:
277280
@ <input type="text" name="contact" value="$<contact>" size="30">
278281
@ </td>
279
-@ <td>Not publically visible. Used by developers to contact you with
282
+@ <td><u>Not publicly visible</u>. Used by developers to contact you with
280283
@ questions.</td>
281284
@ </tr>
282285
@
283286
@ <tr>
284287
@ <td colspan="2">
@@ -337,42 +340,52 @@
337340
);
338341
}
339342
340343
static const char zDefaultView[] =
341344
@ <table cellpadding="5">
342
-@ <tr><td align="right">Title:</td><td>
345
+@ <tr><td align="right">Ticket&nbsp;UUID:</td><td bgcolor="#d0d0d0" colspan="3">
346
+@ $<tkt_uuid>
347
+@ </td></tr>
348
+@ <tr><td align="right">Title:</td>
349
+@ <td bgcolor="#d0d0d0" colspan="3" valign="top">
343350
@ $<title>
344351
@ </td></tr>
345
-@ <tr><td align="right">Status:</td><td>
352
+@ <tr><td align="right">Status:</td><td bgcolor="#d0d0d0">
346353
@ $<status>
347
-@ </td></tr>
348
-@ <tr><td align="right">Type:</td><td>
354
+@ </td>
355
+@ <td align="right">Type:</td><td bgcolor="#d0d0d0">
349356
@ $<type>
350357
@ </td></tr>
351
-@ <tr><td align="right">Severity:</td><td>
358
+@ <tr><td align="right">Severity:</td><td bgcolor="#d0d0d0">
352359
@ $<severity>
353
-@ </td></tr>
354
-@ <tr><td align="right">Priority:</td><td>
360
+@ </td>
361
+@ <td align="right">Priority:</td><td bgcolor="#d0d0d0">
355362
@ $<priority>
356363
@ </td></tr>
357
-@ <tr><td align="right">Resolution:</td><td>
364
+@ <tr><td align="right">Subsystem:</td><td bgcolor="#d0d0d0">
365
+@ $<subsystem>
366
+@ </td>
367
+@ <td align="right">Resolution:</td><td bgcolor="#d0d0d0">
358368
@ $<resolution>
359369
@ </td></tr>
360
-@ <tr><td align="right">Subsystem:</td><td>
361
-@ $<subsystem>
362
-@ </td></tr>
370
+@ <tr><td align="right">Last&nbsp;Modified:</td><td bgcolor="#d0d0d0">
371
+@ $<tkt_datetime>
372
+@ </td>
363373
@ <th1>enable_output [hascap e]</th1>
364
-@ <tr><td align="right">Contact:</td><td>
374
+@ <td align="right">Contact:</td><td bgcolor="#d0d0d0">
365375
@ $<contact>
366
-@ </td></tr>
376
+@ </td>
367377
@ <th1>enable_output 1</th1>
368
-@ <tr><td align="right">Version&nbsp;Found&nbsp;In:</td><td>
378
+@ </tr>
379
+@ <tr><td align="right">Version&nbsp;Found&nbsp;In:</td>
380
+@ <td colspan="3" valign="top" bgcolor="#d0d0d0">
369381
@ $<foundin>
370382
@ </td></tr>
371
-@ <tr><td colspan="2">
383
+@ <tr><td>Description &amp; Comments:</td></tr>
384
+@ <tr><td colspan="4" bgcolor="#d0d0d0">
372385
@ Description And Comments:<br>
373
-@ <th1>wiki $comment</th1>
386
+@ <span bgcolor="#d0d0d0"><th1>wiki $comment</th1></span>
374387
@ </td></tr>
375388
@ </table>
376389
;
377390
378391
@@ -502,5 +515,95 @@
502515
0,
503516
0,
504517
40
505518
);
506519
}
520
+
521
+/*
522
+** The default template ticket report format:
523
+*/
524
+static char zDefaultReport[] =
525
+@ SELECT
526
+@ CASE WHEN status IN ('Open','Verified') THEN '#f2dcdc'
527
+@ WHEN status='Review' THEN '#e8e8e8'
528
+@ WHEN status='Fixed' THEN '#cfe8bd'
529
+@ WHEN status='Tested' THEN '#bde5d6'
530
+@ WHEN status='Deferred' THEN '#cacae5'
531
+@ ELSE '#c8c8c8' END AS 'bgcolor',
532
+@ substr(tkt_uuid,1,10) AS '#',
533
+@ datetime(tkt_mtime) AS 'mtime',
534
+@ type,
535
+@ status,
536
+@ subsystem,
537
+@ title,
538
+@ comment AS '_comments'
539
+@ FROM ticket
540
+;
541
+
542
+
543
+/*
544
+** Return the template ticket report format:
545
+*/
546
+char *ticket_report_template(void){
547
+ return db_get("ticket-report-template", zDefaultReport);
548
+}
549
+
550
+/*
551
+** WEBPAGE: tktsetup_rpttplt
552
+*/
553
+void tktsetup_rpttplt_page(void){
554
+ static const char zDesc[] =
555
+ @ <p>Enter the default ticket report format template. This is the
556
+ @ the template report format that initial appears when creating a
557
+ @ new ticket summary report.</p>
558
+ ;
559
+ tktsetup_generic(
560
+ "Default Report Template",
561
+ "ticket-report-template",
562
+ zDefaultReport,
563
+ zDesc,
564
+ 0,
565
+ 0,
566
+ 20
567
+ );
568
+}
569
+
570
+/*
571
+** The default template ticket key:
572
+*/
573
+static const char zDefaultKey[] =
574
+@ #ffffff Key:
575
+@ #f2dcdc Active
576
+@ #e8e8e8 Review
577
+@ #cfe8bd Fixed
578
+@ #bde5d6 Tested
579
+@ #cacae5 Deferred
580
+@ #c8c8c8 Closed
581
+;
582
+
583
+
584
+/*
585
+** Return the template ticket report format:
586
+*/
587
+const char *ticket_key_template(void){
588
+ return db_get("ticket-key-template", (char*)zDefaultKey);
589
+}
590
+
591
+/*
592
+** WEBPAGE: tktsetup_keytplt
593
+*/
594
+void tktsetup_keytplt_page(void){
595
+ static const char zDesc[] =
596
+ @ <p>Enter the default ticket report key template. This is the
597
+ @ the template report format that initial appears when creating a
598
+ @ new ticket summary report.</p>
599
+ ;
600
+ tktsetup_generic(
601
+ "Default Report Template",
602
+ "ticket-report-template",
603
+ zDefaultReport,
604
+ zDesc,
605
+ 0,
606
+ 0,
607
+ 20
608
+ );
609
+}
507610
--- src/tktsetup.c
+++ src/tktsetup.c
@@ -48,12 +48,14 @@
48 "HTML with embedded TH1 code for the \"new ticket\" webpage.");
49 setup_menu_entry("View Ticket Page", "tktsetup_viewpage",
50 "HTML with embedded TH1 code for the \"view ticket\" webpage.");
51 setup_menu_entry("Edit Ticket Page", "tktsetup_editpage",
52 "HTML with embedded TH1 code for the \"edit ticket\" webpage.");
53 setup_menu_entry("Report Format", "tktsetup_drep",
54 "The default ticket report format.");
 
 
55 @ </table>
56 style_footer();
57 }
58
59 /* @-comment: ** */
@@ -198,11 +200,11 @@
198 @ Drive_By_Patch
199 @ }
200 @ set status_choices {
201 @ Open
202 @ Verified
203 @ In_Process
204 @ Deferred
205 @ Fixed
206 @ Tested
207 @ Closed
208 @ }
@@ -240,10 +242,11 @@
240 @ if {[info exists submit]} {
241 @ set status Open
242 @ submit_ticket
243 @ }
244 @ </th1>
 
245 @ <table cellpadding="5">
246 @ <tr>
247 @ <td colspan="2">
248 @ Enter a one-line summary of the problem:<br>
249 @ <input type="text" name="title" size="60" value="$<title>">
@@ -274,11 +277,11 @@
274 @
275 @ <tr>
276 @ <td align="right">EMail:
277 @ <input type="text" name="contact" value="$<contact>" size="30">
278 @ </td>
279 @ <td>Not publically visible. Used by developers to contact you with
280 @ questions.</td>
281 @ </tr>
282 @
283 @ <tr>
284 @ <td colspan="2">
@@ -337,42 +340,52 @@
337 );
338 }
339
340 static const char zDefaultView[] =
341 @ <table cellpadding="5">
342 @ <tr><td align="right">Title:</td><td>
 
 
 
 
343 @ $<title>
344 @ </td></tr>
345 @ <tr><td align="right">Status:</td><td>
346 @ $<status>
347 @ </td></tr>
348 @ <tr><td align="right">Type:</td><td>
349 @ $<type>
350 @ </td></tr>
351 @ <tr><td align="right">Severity:</td><td>
352 @ $<severity>
353 @ </td></tr>
354 @ <tr><td align="right">Priority:</td><td>
355 @ $<priority>
356 @ </td></tr>
357 @ <tr><td align="right">Resolution:</td><td>
 
 
 
358 @ $<resolution>
359 @ </td></tr>
360 @ <tr><td align="right">Subsystem:</td><td>
361 @ $<subsystem>
362 @ </td></tr>
363 @ <th1>enable_output [hascap e]</th1>
364 @ <tr><td align="right">Contact:</td><td>
365 @ $<contact>
366 @ </td></tr>
367 @ <th1>enable_output 1</th1>
368 @ <tr><td align="right">Version&nbsp;Found&nbsp;In:</td><td>
 
 
369 @ $<foundin>
370 @ </td></tr>
371 @ <tr><td colspan="2">
 
372 @ Description And Comments:<br>
373 @ <th1>wiki $comment</th1>
374 @ </td></tr>
375 @ </table>
376 ;
377
378
@@ -502,5 +515,95 @@
502 0,
503 0,
504 40
505 );
506 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
507
--- src/tktsetup.c
+++ src/tktsetup.c
@@ -48,12 +48,14 @@
48 "HTML with embedded TH1 code for the \"new ticket\" webpage.");
49 setup_menu_entry("View Ticket Page", "tktsetup_viewpage",
50 "HTML with embedded TH1 code for the \"view ticket\" webpage.");
51 setup_menu_entry("Edit Ticket Page", "tktsetup_editpage",
52 "HTML with embedded TH1 code for the \"edit ticket\" webpage.");
53 setup_menu_entry("Report Template", "tktsetup_rpttplt",
54 "The default ticket report format.");
55 setup_menu_entry("Key Template", "tktsetup_keytplt",
56 "The default color key for reports.");
57 @ </table>
58 style_footer();
59 }
60
61 /* @-comment: ** */
@@ -198,11 +200,11 @@
200 @ Drive_By_Patch
201 @ }
202 @ set status_choices {
203 @ Open
204 @ Verified
205 @ Review
206 @ Deferred
207 @ Fixed
208 @ Tested
209 @ Closed
210 @ }
@@ -240,10 +242,11 @@
242 @ if {[info exists submit]} {
243 @ set status Open
244 @ submit_ticket
245 @ }
246 @ </th1>
247 @ <h1 align="center">Enter A New Bug Report</h1>
248 @ <table cellpadding="5">
249 @ <tr>
250 @ <td colspan="2">
251 @ Enter a one-line summary of the problem:<br>
252 @ <input type="text" name="title" size="60" value="$<title>">
@@ -274,11 +277,11 @@
277 @
278 @ <tr>
279 @ <td align="right">EMail:
280 @ <input type="text" name="contact" value="$<contact>" size="30">
281 @ </td>
282 @ <td><u>Not publicly visible</u>. Used by developers to contact you with
283 @ questions.</td>
284 @ </tr>
285 @
286 @ <tr>
287 @ <td colspan="2">
@@ -337,42 +340,52 @@
340 );
341 }
342
343 static const char zDefaultView[] =
344 @ <table cellpadding="5">
345 @ <tr><td align="right">Ticket&nbsp;UUID:</td><td bgcolor="#d0d0d0" colspan="3">
346 @ $<tkt_uuid>
347 @ </td></tr>
348 @ <tr><td align="right">Title:</td>
349 @ <td bgcolor="#d0d0d0" colspan="3" valign="top">
350 @ $<title>
351 @ </td></tr>
352 @ <tr><td align="right">Status:</td><td bgcolor="#d0d0d0">
353 @ $<status>
354 @ </td>
355 @ <td align="right">Type:</td><td bgcolor="#d0d0d0">
356 @ $<type>
357 @ </td></tr>
358 @ <tr><td align="right">Severity:</td><td bgcolor="#d0d0d0">
359 @ $<severity>
360 @ </td>
361 @ <td align="right">Priority:</td><td bgcolor="#d0d0d0">
362 @ $<priority>
363 @ </td></tr>
364 @ <tr><td align="right">Subsystem:</td><td bgcolor="#d0d0d0">
365 @ $<subsystem>
366 @ </td>
367 @ <td align="right">Resolution:</td><td bgcolor="#d0d0d0">
368 @ $<resolution>
369 @ </td></tr>
370 @ <tr><td align="right">Last&nbsp;Modified:</td><td bgcolor="#d0d0d0">
371 @ $<tkt_datetime>
372 @ </td>
373 @ <th1>enable_output [hascap e]</th1>
374 @ <td align="right">Contact:</td><td bgcolor="#d0d0d0">
375 @ $<contact>
376 @ </td>
377 @ <th1>enable_output 1</th1>
378 @ </tr>
379 @ <tr><td align="right">Version&nbsp;Found&nbsp;In:</td>
380 @ <td colspan="3" valign="top" bgcolor="#d0d0d0">
381 @ $<foundin>
382 @ </td></tr>
383 @ <tr><td>Description &amp; Comments:</td></tr>
384 @ <tr><td colspan="4" bgcolor="#d0d0d0">
385 @ Description And Comments:<br>
386 @ <span bgcolor="#d0d0d0"><th1>wiki $comment</th1></span>
387 @ </td></tr>
388 @ </table>
389 ;
390
391
@@ -502,5 +515,95 @@
515 0,
516 0,
517 40
518 );
519 }
520
521 /*
522 ** The default template ticket report format:
523 */
524 static char zDefaultReport[] =
525 @ SELECT
526 @ CASE WHEN status IN ('Open','Verified') THEN '#f2dcdc'
527 @ WHEN status='Review' THEN '#e8e8e8'
528 @ WHEN status='Fixed' THEN '#cfe8bd'
529 @ WHEN status='Tested' THEN '#bde5d6'
530 @ WHEN status='Deferred' THEN '#cacae5'
531 @ ELSE '#c8c8c8' END AS 'bgcolor',
532 @ substr(tkt_uuid,1,10) AS '#',
533 @ datetime(tkt_mtime) AS 'mtime',
534 @ type,
535 @ status,
536 @ subsystem,
537 @ title,
538 @ comment AS '_comments'
539 @ FROM ticket
540 ;
541
542
543 /*
544 ** Return the template ticket report format:
545 */
546 char *ticket_report_template(void){
547 return db_get("ticket-report-template", zDefaultReport);
548 }
549
550 /*
551 ** WEBPAGE: tktsetup_rpttplt
552 */
553 void tktsetup_rpttplt_page(void){
554 static const char zDesc[] =
555 @ <p>Enter the default ticket report format template. This is the
556 @ the template report format that initial appears when creating a
557 @ new ticket summary report.</p>
558 ;
559 tktsetup_generic(
560 "Default Report Template",
561 "ticket-report-template",
562 zDefaultReport,
563 zDesc,
564 0,
565 0,
566 20
567 );
568 }
569
570 /*
571 ** The default template ticket key:
572 */
573 static const char zDefaultKey[] =
574 @ #ffffff Key:
575 @ #f2dcdc Active
576 @ #e8e8e8 Review
577 @ #cfe8bd Fixed
578 @ #bde5d6 Tested
579 @ #cacae5 Deferred
580 @ #c8c8c8 Closed
581 ;
582
583
584 /*
585 ** Return the template ticket report format:
586 */
587 const char *ticket_key_template(void){
588 return db_get("ticket-key-template", (char*)zDefaultKey);
589 }
590
591 /*
592 ** WEBPAGE: tktsetup_keytplt
593 */
594 void tktsetup_keytplt_page(void){
595 static const char zDesc[] =
596 @ <p>Enter the default ticket report key template. This is the
597 @ the template report format that initial appears when creating a
598 @ new ticket summary report.</p>
599 ;
600 tktsetup_generic(
601 "Default Report Template",
602 "ticket-report-template",
603 zDefaultReport,
604 zDesc,
605 0,
606 0,
607 20
608 );
609 }
610

Keyboard Shortcuts

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