Check-in [49380d500a]
Not logged in
Overview

SHA1 Hash:49380d500a1259b4dd10230c83d0816264d4e59d
Date: 2008-05-28 18:48:12
User: drh
Comment:Continuing work on the ticketing system.
Timelines: ancestors | descendants | both | trunk
Other Links: files | ZIP archive | manifest

Tags And Properties
Changes
[hide diffs]

Modified src/login.c from [659c4f23c6] to [43d8acf6c2].

@@ -311,11 +311,12 @@
     switch( zCap[i] ){
       case 's':   g.okSetup = 1;
       case 'a':   g.okAdmin = g.okRdTkt = g.okWrTkt = g.okQuery =
                               g.okRdWiki = g.okWrWiki = g.okNewWiki =
                               g.okApndWiki = g.okHistory = g.okClone =
-                              g.okNewTkt = g.okPassword = g.okRdAddr = 1;
+                              g.okNewTkt = g.okPassword = g.okRdAddr =
+                              g.okTktFmt = 1;
       case 'i':   g.okRead = g.okWrite = 1;                     break;
       case 'o':   g.okRead = 1;                                 break;
 
       case 'd':   g.okDelete = 1;                               break;
       case 'h':   g.okHistory = 1;                              break;
@@ -332,10 +333,11 @@
       case 'r':   g.okRdTkt = 1;                                break;
       case 'n':   g.okNewTkt = 1;                               break;
       case 'w':   g.okWrTkt = g.okRdTkt = g.okNewTkt =
                   g.okApndTkt = 1;                              break;
       case 'c':   g.okApndTkt = 1;                              break;
+      case 't':   g.okTktFmt = 1;                               break;
     }
   }
 }
 
 /*
@@ -364,10 +366,11 @@
       case 'o':  rc = g.okRead;      break;
       case 'p':  rc = g.okPassword;  break;
       case 'q':  rc = g.okQuery;     break;
       case 'r':  rc = g.okRdTkt;     break;
       case 's':  rc = g.okSetup;     break;
+      case 't':  rc = g.okTktFmt;    break;
       case 'w':  rc = g.okWrTkt;     break;
       default:   rc = 0;             break;
     }
   }
   return rc;

Modified src/main.c from [8f6eeea4b5] to [96c79d2faa].

@@ -114,10 +114,11 @@
   int okWrWiki;           /* k: edit wiki via web */
   int okRdTkt;            /* r: view tickets via web */
   int okNewTkt;           /* n: create new tickets */
   int okApndTkt;          /* c: append to tickets via the web */
   int okWrTkt;            /* w: make changes to tickets via web */
+  int okTktFmt;           /* t: create new ticket report formats */
   int okRdAddr;           /* e: read email addresses on tickets */
 
   FILE *fDebug;           /* Write debug information here, if the file exists */
 
   /* Storage for the aux() and/or option() SQL function arguments */

Modified src/report.c from [754ebac1f2] to [5e81235a00].

@@ -35,17 +35,18 @@
 ** WEBPAGE: /reportlist
 */
 void view_list(void){
   Stmt q;
   int rn = 0;
+  int cnt = 1;
 
   login_check_credentials();
   if( !g.okRdTkt && !g.okNewTkt ){ login_needed(); return; }
   style_header("Bug Report Main Menu");
   if( g.okNewTkt ){
     @ <p>Enter a new bug report:</p>
-    @ <ol><li value="0"><a href="tktnew">New bug report</a></li></ol>
+    @ <ol><li value="1"><a href="tktnew">New bug report</a></li></ol>
     @
   }
   if( !g.okRdTkt ){
     @ <p>You are not authorized to view existing bug reports.</p>
   }else{
@@ -54,16 +55,17 @@
     @ <ol>
     while( db_step(&q)==SQLITE_ROW ){
       rn = db_column_int(&q, 0);
       const char *zTitle = db_column_text(&q, 1);
       const char *zOwner = db_column_text(&q, 2);
-      @ <li value="%d(rn)"><a href="rptview?rn=%d(rn)"
+      cnt++;
+      @ <li value="%d(cnt)"><a href="rptview?rn=%d(rn)"
       @        rel="nofollow">%h(zTitle)</a>&nbsp;&nbsp;&nbsp;
       if( g.okWrite && zOwner && zOwner[0] ){
         @ (by <i>%h(zOwner)</i>)
       }
-      if( g.okWrTkt ){
+      if( g.okTktFmt ){
         @ [<a href="rptedit?rn=%d(rn)&amp;copy=1" rel="nofollow">copy</a>]
       }
       if( g.okAdmin || (g.okWrTkt && zOwner && strcmp(g.zLogin,zOwner)==0) ){
         @ [<a href="rptedit?rn=%d(rn)" rel="nofollow">edit</a>]
       }
@@ -70,14 +72,14 @@
       @ [<a href="rptsql?rn=%d(rn)" rel="nofollow">sql</a>]
       @ </li>
     }
   }
   @ </ol>
-  if( g.okWrTkt ){
+  if( g.okTktFmt ){
     @ <p>Create a new bug report display format:</p>
     @ <ol>
-    @ <li value="%d(rn+1)"><a href="rptnew">New report format</a></li>
+    @ <li value="%d(cnt+1)"><a href="rptnew">New report format</a></li>
     @ </ol>
   }
   style_footer();
 }
 
@@ -293,11 +295,11 @@
 void view_edit(void){
   int rn;
   const char *zTitle;
   const char *z;
   const char *zOwner;
-  char *zClrKey;
+  const char *zClrKey;
   char *zSQL;
   char *zErr = 0;
 
   login_check_credentials();
   if( !g.okQuery ){
@@ -360,40 +362,12 @@
       cgi_redirect(mprintf("rptview?rn=%d", rn));
       return;
     }
   }else if( rn==0 ){
     zTitle = "";
-    zSQL =
-      @ SELECT
-      @   CASE WHEN status IN ('new','active') THEN '#f2dcdc'
-      @        WHEN status='review' THEN '#e8e8bd'
-      @        WHEN status='fixed' THEN '#cfe8bd'
-      @        WHEN status='tested' THEN '#bde5d6'
-      @        WHEN status='defer' THEN '#cacae5'
-      @        ELSE '#c8c8c8' END AS 'bgcolor',
-      @   tn AS '#',
-      @   type AS 'Type',
-      @   status AS 'Status',
-      @   sdate(origtime) AS 'Created',
-      @   owner AS 'By',
-      @   subsystem AS 'Subsys',
-      @   sdate(changetime) AS 'Changed',
-      @   assignedto AS 'Assigned',
-      @   severity AS 'Svr',
-      @   priority AS 'Pri',
-      @   title AS 'Title'
-      @ FROM ticket
-    ;
-    zClrKey =
-      @ #ffffff Key:
-      @ #f2dcdc Active
-      @ #e8e8e8 Review
-      @ #cfe8bd Fixed
-      @ #bde5d6 Tested
-      @ #cacae5 Deferred
-      @ #c8c8c8 Closed
-    ;
+    zSQL = ticket_report_template();
+    zClrKey = ticket_key_template();
   }else{
     Stmt q;
     db_prepare(&q, "SELECT title, sqlcode, owner, cols "
                      "FROM reportfmt WHERE rn=%d",rn);
     if( db_step(&q)==SQLITE_ROW ){

Modified src/setup.c from [bebb1229f9] to [8169d5ad06].

@@ -148,10 +148,11 @@
   @ <li value="15"><b>Check-Out</b>: Check out versions</li>
   @ <li value="16"><b>Password</b>: Change your own password</li>
   @ <li value="17"><b>Query</b>: Create new queries against tickets</li>
   @ <li value="18"><b>Read-Tkt</b>: View tickets</li>
   @ <li value="19"><b>Setup:</b> Setup and configure this website</li>
+  @ <li value="20"><b>Tkt-Report:</b> Create new bug summary reports</li>
   @ <li value="23"><b>Write-Tkt</b>: Edit tickets</li>
   @ </ol>
   @ </p></li>
   @
   @ <li><p>
@@ -171,10 +172,11 @@
 */
 void user_edit(void){
   const char *zId, *zLogin, *zInfo, *zCap;
   char *oaa, *oas, *oar, *oaw, *oan, *oai, *oaj, *oao, *oap;
   char *oak, *oad, *oaq, *oac, *oaf, *oam, *oah, *oag, *oae;
+  char *oat;
   int doWrite;
   int uid;
   int higherUser = 0;  /* True if user being edited is SETUP and the */
                        /* user doing the editing is ADMIN.  Disallow editing */
 
@@ -205,11 +207,11 @@
   */
   doWrite = cgi_all("login","info","pw") && !higherUser;
   if( doWrite ){
     const char *zPw;
     const char *zLogin;
-    char zCap[30];
+    char zCap[50];
     int i = 0;
     int aa = P("aa")!=0;
     int ad = P("ad")!=0;
     int ae = P("ae")!=0;
     int ai = P("ai")!=0;
@@ -225,10 +227,11 @@
     int ac = P("ac")!=0;
     int af = P("af")!=0;
     int am = P("am")!=0;
     int ah = P("ah")!=0;
     int ag = P("ag")!=0;
+    int at = P("at")!=0;
     if( aa ){ zCap[i++] = 'a'; }
     if( ac ){ zCap[i++] = 'c'; }
     if( ad ){ zCap[i++] = 'd'; }
     if( ae ){ zCap[i++] = 'e'; }
     if( af ){ zCap[i++] = 'f'; }
@@ -242,10 +245,11 @@
     if( ao ){ zCap[i++] = 'o'; }
     if( ap ){ zCap[i++] = 'p'; }
     if( aq ){ zCap[i++] = 'q'; }
     if( ar ){ zCap[i++] = 'r'; }
     if( as ){ zCap[i++] = 's'; }
+    if( at ){ zCap[i++] = 't'; }
     if( aw ){ zCap[i++] = 'w'; }
 
     zCap[i] = 0;
     zPw = P("pw");
     if( zPw==0 || zPw[0]==0 ){
@@ -276,11 +280,11 @@
   */
   zLogin = "";
   zInfo = "";
   zCap = "";
   oaa = oac = oad = oae = oaf = oag = oah = oai = oaj = oak = oam =
-        oan = oao = oap = oaq = oar = oas = oaw = "";
+        oan = oao = oap = oaq = oar = oas = oat = oaw = "";
   if( uid ){
     zLogin = db_text("", "SELECT login FROM user WHERE uid=%d", uid);
     zInfo = db_text("", "SELECT info FROM user WHERE uid=%d", uid);
     zCap = db_text("", "SELECT cap FROM user WHERE uid=%d", uid);
     if( strchr(zCap, 'a') ) oaa = " checked";
@@ -298,10 +302,11 @@
     if( strchr(zCap, 'o') ) oao = " checked";
     if( strchr(zCap, 'p') ) oap = " checked";
     if( strchr(zCap, 'q') ) oaq = " checked";
     if( strchr(zCap, 'r') ) oar = " checked";
     if( strchr(zCap, 's') ) oas = " checked";
+    if( strchr(zCap, 't') ) oat = " checked";
     if( strchr(zCap, 'w') ) oaw = " checked";
   }
 
   /* Begin generating the page
   */
@@ -350,11 +355,12 @@
   @     <input type="checkbox" name="am"%s(oam)>Append Wiki</input><br>
   @     <input type="checkbox" name="ak"%s(oak)>Write Wiki</input><br>
   @     <input type="checkbox" name="ar"%s(oar)>Read Tkt</input><br>
   @     <input type="checkbox" name="an"%s(oan)>New Tkt</input><br>
   @     <input type="checkbox" name="ac"%s(oac)>Append Tkt</input><br>
-  @     <input type="checkbox" name="aw"%s(oaw)>Write Tkt</input>
+  @     <input type="checkbox" name="aw"%s(oaw)>Write Tkt</input><br>
+  @     <input type="checkbox" name="at"%s(oat)>Tkt Report</input>
   @   </td>
   @ </tr>
   @ <tr>
   @   <td align="right">Password:</td>
   @   <td><input type="password" name="pw" value=""></td>

Modified src/tkt.c from [0e6ecf299d] to [0ee8650d53].

@@ -102,12 +102,13 @@
 static void initializeVariablesFromDb(void){
   const char *zName;
   Stmt q;
   int i, n, size, j;
 
-  zName = PD("name","");
-  db_prepare(&q, "SELECT * FROM ticket WHERE tkt_uuid GLOB '%q*'", zName);
+  zName = PD("name","-none-");
+  db_prepare(&q, "SELECT datetime(tkt_mtime) AS tkt_datetime, *"
+                 "  FROM ticket WHERE tkt_uuid GLOB '%q*'", zName);
   if( db_step(&q)==SQLITE_ROW ){
     n = db_column_count(&q);
     for(i=0; i<n; i++){
       const char *zVal = db_column_text(&q, i);
       const char *zName = db_column_name(&q, i);

Modified src/tktsetup.c from [bcb0231e49] to [05495fef8d].

@@ -48,12 +48,14 @@
     "HTML with embedded TH1 code for the \"new ticket\" webpage.");
   setup_menu_entry("View Ticket Page", "tktsetup_viewpage",
     "HTML with embedded TH1 code for the \"view ticket\" webpage.");
   setup_menu_entry("Edit Ticket Page", "tktsetup_editpage",
     "HTML with embedded TH1 code for the \"edit ticket\" webpage.");
-  setup_menu_entry("Report Format", "tktsetup_drep",
+  setup_menu_entry("Report Template", "tktsetup_rpttplt",
     "The default ticket report format.");
+  setup_menu_entry("Key Template", "tktsetup_keytplt",
+    "The default color key for reports.");
   @ </table>
   style_footer();
 }
 
 /* @-comment: ** */
@@ -198,11 +200,11 @@
 @   Drive_By_Patch
 @ }
 @ set status_choices {
 @   Open
 @   Verified
-@   In_Process
+@   Review
 @   Deferred
 @   Fixed
 @   Tested
 @   Closed
 @ }
@@ -240,10 +242,11 @@
 @   if {[info exists submit]} {
 @      set status Open
 @      submit_ticket
 @   }
 @ </th1>
+@ <h1 align="center">Enter A New Bug Report</h1>
 @ <table cellpadding="5">
 @ <tr>
 @ <td colspan="2">
 @ Enter a one-line summary of the problem:<br>
 @ <input type="text" name="title" size="60" value="$<title>">
@@ -274,11 +277,11 @@
 @
 @ <tr>
 @ <td align="right">EMail:
 @ <input type="text" name="contact" value="$<contact>" size="30">
 @ </td>
-@ <td>Not publically visible. Used by developers to contact you with
+@ <td><u>Not publicly visible</u>. Used by developers to contact you with
 @ questions.</td>
 @ </tr>
 @
 @ <tr>
 @ <td colspan="2">
@@ -337,42 +340,52 @@
   );
 }
 
 static const char zDefaultView[] =
 @ <table cellpadding="5">
-@ <tr><td align="right">Title:</td><td>
+@ <tr><td align="right">Ticket&nbsp;UUID:</td><td bgcolor="#d0d0d0" colspan="3">
+@ $<tkt_uuid>
+@ </td></tr>
+@ <tr><td align="right">Title:</td>
+@ <td bgcolor="#d0d0d0" colspan="3" valign="top">
 @ $<title>
 @ </td></tr>
-@ <tr><td align="right">Status:</td><td>
+@ <tr><td align="right">Status:</td><td bgcolor="#d0d0d0">
 @ $<status>
-@ </td></tr>
-@ <tr><td align="right">Type:</td><td>
+@ </td>
+@ <td align="right">Type:</td><td bgcolor="#d0d0d0">
 @ $<type>
 @ </td></tr>
-@ <tr><td align="right">Severity:</td><td>
+@ <tr><td align="right">Severity:</td><td bgcolor="#d0d0d0">
 @ $<severity>
-@ </td></tr>
-@ <tr><td align="right">Priority:</td><td>
+@ </td>
+@ <td align="right">Priority:</td><td bgcolor="#d0d0d0">
 @ $<priority>
 @ </td></tr>
-@ <tr><td align="right">Resolution:</td><td>
+@ <tr><td align="right">Subsystem:</td><td bgcolor="#d0d0d0">
+@ $<subsystem>
+@ </td>
+@ <td align="right">Resolution:</td><td bgcolor="#d0d0d0">
 @ $<resolution>
 @ </td></tr>
-@ <tr><td align="right">Subsystem:</td><td>
-@ $<subsystem>
-@ </td></tr>
+@ <tr><td align="right">Last&nbsp;Modified:</td><td bgcolor="#d0d0d0">
+@ $<tkt_datetime>
+@ </td>
 @ <th1>enable_output [hascap e]</th1>
-@   <tr><td align="right">Contact:</td><td>
+@   <td align="right">Contact:</td><td bgcolor="#d0d0d0">
 @   $<contact>
-@   </td></tr>
+@   </td>
 @ <th1>enable_output 1</th1>
-@ <tr><td align="right">Version&nbsp;Found&nbsp;In:</td><td>
+@ </tr>
+@ <tr><td align="right">Version&nbsp;Found&nbsp;In:</td>
+@ <td colspan="3" valign="top" bgcolor="#d0d0d0">
 @ $<foundin>
 @ </td></tr>
-@ <tr><td colspan="2">
+@ <tr><td>Description &amp; Comments:</td></tr>
+@ <tr><td colspan="4" bgcolor="#d0d0d0">
 @ Description And Comments:<br>
-@ <th1>wiki $comment</th1>
+@ <span  bgcolor="#d0d0d0"><th1>wiki $comment</th1></span>
 @ </td></tr>
 @ </table>
 ;
 
 
@@ -500,7 +513,97 @@
     zDefaultEdit,
     zDesc,
     0,
     0,
     40
+  );
+}
+
+/*
+** The default template ticket report format:
+*/
+static char zDefaultReport[] =
+@ SELECT
+@   CASE WHEN status IN ('Open','Verified') THEN '#f2dcdc'
+@        WHEN status='Review' THEN '#e8e8e8'
+@        WHEN status='Fixed' THEN '#cfe8bd'
+@        WHEN status='Tested' THEN '#bde5d6'
+@        WHEN status='Deferred' THEN '#cacae5'
+@        ELSE '#c8c8c8' END AS 'bgcolor',
+@   substr(tkt_uuid,1,10) AS '#',
+@   datetime(tkt_mtime) AS 'mtime',
+@   type,
+@   status,
+@   subsystem,
+@   title,
+@   comment AS '_comments'
+@ FROM ticket
+;
+
+
+/*
+** Return the template ticket report format:
+*/
+char *ticket_report_template(void){
+  return db_get("ticket-report-template", zDefaultReport);
+}
+
+/*
+** WEBPAGE: tktsetup_rpttplt
+*/
+void tktsetup_rpttplt_page(void){
+  static const char zDesc[] =
+  @ <p>Enter the default ticket report format template.  This is the
+  @ the template report format that initial appears when creating a
+  @ new ticket summary report.</p>
+  ;
+  tktsetup_generic(
+    "Default Report Template",
+    "ticket-report-template",
+    zDefaultReport,
+    zDesc,
+    0,
+    0,
+    20
+  );
+}
+
+/*
+** The default template ticket key:
+*/
+static const char zDefaultKey[] =
+@ #ffffff Key:
+@ #f2dcdc Active
+@ #e8e8e8 Review
+@ #cfe8bd Fixed
+@ #bde5d6 Tested
+@ #cacae5 Deferred
+@ #c8c8c8 Closed
+;
+
+
+/*
+** Return the template ticket report format:
+*/
+const char *ticket_key_template(void){
+  return db_get("ticket-key-template", (char*)zDefaultKey);
+}
+
+/*
+** WEBPAGE: tktsetup_keytplt
+*/
+void tktsetup_keytplt_page(void){
+  static const char zDesc[] =
+  @ <p>Enter the default ticket report key template.  This is the
+  @ the template report format that initial appears when creating a
+  @ new ticket summary report.</p>
+  ;
+  tktsetup_generic(
+    "Default Report Template",
+    "ticket-report-template",
+    zDefaultReport,
+    zDesc,
+    0,
+    0,
+    20
   );
 }