Check-in [ce277cadda]
Not logged in
Overview

SHA1 Hash:ce277caddac488a112e53841b93cc31bdcfd7468
Date: 2008-05-25 19:36:47
User: drh
Comment:Incremental work on tickets and especially ticket configuration.
Timelines: ancestors | descendants | both | trunk
Other Links: files | ZIP archive | manifest

Tags And Properties
Changes
[hide diffs]

Modified src/report.c from [341078a2b9] to [754ebac1f2].

@@ -676,11 +676,11 @@
   char **azArg,    /* Text of data in all columns */
   char **azName    /* Names of the columns */
 ){
   struct GenerateHTML *pState = (struct GenerateHTML*)pUser;
   int i;
-  int tn;            /* Ticket number.  (value of column named '#') */
+  const char *zTid;  /* Ticket UUID.  (value of column named '#') */
   int rn;            /* Report number */
   char *zBg = 0;     /* Use this background color */
   char zPage[30];    /* Text version of the ticket number */
 
   /* Get the report number
@@ -717,30 +717,29 @@
     }
 
     /* The first time this routine is called, output a table header
     */
     @ <tr>
-    tn = -1;
+    zTid = 0;
     for(i=0; i<nArg; i++){
       char *zName = azName[i];
       if( i==pState->iBg ) continue;
       if( pState->iNewRow>=0 && i>=pState->iNewRow ){
-        if( g.okWrite && tn>=0 ){
+        if( g.okWrite && zTid ){
           @ <th>&nbsp;</th>
-          tn = -1;
+          zTid = 0;
         }
         if( zName[0]=='_' ) zName++;
         @ </tr><tr><th colspan=%d(pState->nCol)>%h(zName)</th>
       }else{
         if( zName[0]=='#' ){
-          tn = i;
-        }else{
-          @ <th>%h(zName)</th>
+          zTid = zName;
         }
+        @ <th>%h(zName)</th>
       }
     }
-    if( g.okWrite && tn>=0 ){
+    if( g.okWrite && zTid ){
       @ <th>&nbsp;</th>
     }
     @ </tr>
   }
   if( azArg==0 ){
@@ -761,39 +760,42 @@
   /* Output the data for this entry from the database
   */
   zBg = pState->iBg>=0 ? azArg[pState->iBg] : 0;
   if( zBg==0 ) zBg = "white";
   @ <tr bgcolor="%h(zBg)">
-  tn = 0;
+  zTid = 0;
   zPage[0] = 0;
   for(i=0; i<nArg; i++){
     char *zData;
     if( i==pState->iBg ) continue;
     zData = azArg[i];
     if( zData==0 ) zData = "";
     if( pState->iNewRow>=0 && i>=pState->iNewRow ){
-      if( tn>0 && g.okWrite ){
-        @ <td valign="top"><a href="tktedit?tn=%d(tn),%d(rn)">edit</a></td>
-        tn = 0;
+      if( zTid && g.okWrite ){
+        @ <td valign="top"><a href="tktedit/%h(zTid)">edit</a></td>
+        zTid = 0;
       }
       if( zData[0] ){
+        Blob content;
         @ </tr><tr bgcolor="%h(zBg)"><td colspan=%d(pState->nCol)>
-        @ %h(zData)
+        blob_init(&content, zData, -1);
+        wiki_convert(&content, 0, 0);
+        blob_reset(&content);
       }
     }else if( azName[i][0]=='#' ){
-      tn = atoi(zData);
-      @ <td valign="top"><a href="tktview?tn=%d(tn),%d(rn)">%h(zData)</a></td>
+      zTid = zData;
+      @ <td valign="top"><a href="tktview?name=%h(zData)">%h(zData)</a></td>
     }else if( zData[0]==0 ){
       @ <td valign="top">&nbsp;</td>
     }else{
       @ <td valign="top">
       @ %h(zData)
       @ </td>
     }
   }
-  if( tn>0 && g.okWrite ){
-    @ <td valign="top"><a href="tktedit?tn=%d(tn),%d(rn)">edit</a></td>
+  if( zTid && g.okWrite ){
+    @ <td valign="top"><a href="tktedit/%h(zTid)">edit</a></td>
   }
   @ </tr>
   return 0;
 }
 

Modified src/setup.c from [b4cd5e8549] to [9b54ba173a].

@@ -66,11 +66,11 @@
     "Control access settings.");
   setup_menu_entry("Configuration", "setup_config",
     "Configure the WWW components of the repository");
   setup_menu_entry("Timeline", "setup_timeline",
     "Timeline display preferences");
-  setup_menu_entry("Tickets", "setup_ticket",
+  setup_menu_entry("Tickets", "tktsetup",
     "Configure the trouble-ticketing system for this repository");
   setup_menu_entry("CSS", "setup_editcss",
     "Edit the Cascading Style Sheet used by all pages of this repository");
   setup_menu_entry("Header", "setup_header",
     "Edit HTML text inserted at the top of every page");

Modified src/tktsetup.c from [eeccd454b7] to [3051830ac9].

@@ -28,17 +28,427 @@
 #include "tktsetup.h"
 #include <assert.h>
 
 /*
 ** Main sub-menu for configuring the ticketing system.
-** WEBPAGE: /tktsetup
+** WEBPAGE: tktsetup
 */
 void tktsetup_page(void){
   login_check_credentials();
   if( !g.okSetup ){
     login_needed();
   }
 
   style_header("Ticket Setup");
-  @ <i>TBD...</i>
+  @ <table border="0" cellspacing="20">
+  setup_menu_entry("Table", "tktsetup_tab",
+    "Specify the schema of the  \"ticket\" table in the database.");
+  setup_menu_entry("Common", "tktsetup_com",
+    "Common TH1 code run before all ticket processing.");
+  setup_menu_entry("New Ticket Page", "tktsetup_newpage",
+    "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",
+    "The default ticket report format.");
+  @ </table>
+  style_footer();
+}
+
+/* @-comment: ** */
+static char zDefaultTab[] =
+@ CREATE TABLE ticket(
+@   -- Do not change any column that begins with tkt_
+@   tkt_id INTEGER PRIMARY KEY,
+@   tkt_uuid TEXT,
+@   tkt_mtime DATE,
+@   -- Add as many field as required below this line
+@   type TEXT,
+@   status TEXT,
+@   subsystem TEXT,
+@   priority TEXT,
+@   severity TEXT,
+@   foundin TEXT,
+@   contact TEXT,
+@   resolution TEXT,
+@   title TEXT,
+@   comment TEXT,
+@   -- Do not alter this UNIQUE clause:
+@   UNIQUE(tkt_uuid, tkt_mtime)
+@ );
+;
+
+/*
+** Common implementation for the ticket setup editor pages.
+*/
+static void tktsetup_generic(
+  const char *zTitle,           /* Page title */
+  const char *zDbField,         /* Configuration field being edited */
+  char *zDfltValue,             /* Default text value */
+  const char *zDesc,            /* Description of this field */
+  int height                    /* Height of the edit box */
+){
+  const char *z;
+  int isSubmit;
+
+  login_check_credentials();
+  if( !g.okSetup ){
+    login_needed();
+  }
+  if( P("setup") ){
+    cgi_redirect("tktsetup");
+  }
+  isSubmit = P("submit")!=0;
+  db_begin_transaction();
+  z = P("x");
+  if( z==0 ){
+    z = db_get(zDbField, zDfltValue);
+  }
+  style_header("Edit %s", zTitle);
+  if( P("clear")!=0 ){
+    db_unset(zDbField, 0);
+    z = zDfltValue;
+  }else if( isSubmit ){
+    db_set(zDbField, z, 0);
+  }
+  @ <form action="%s(g.zBaseURL)/%s(g.zPath)" method="POST">
+  @ %s(zDesc)
+  @ <textarea name="tab" rows="%d(height)" cols="80">%h(z)</textarea>
+  @ <br />
+  @ <input type="submit" name="submit" value="Apply Changes">
+  @ <input type="submit" name="clear" value="Revert To Default">
+  @ <input type="submit" name="setup" value="Ticket Setup Menu">
+  @ </form>
+  @ <hr>
+  @ <h2>Default %s(zTitle)</h2>
+  @ <blockquote><pre>
+  @ %h(zDfltValue)
+  @ </pre></blockquote>
+  db_end_transaction(0);
   style_footer();
+}
+
+/*
+** WEBPAGE: tktsetup_tab
+*/
+void tktsetup_tab_page(void){
+  static const char zDesc[] =
+  @ <p>Enter a valid CREATE TABLE statement for the "ticket" table.  The
+  @ table must contain columns named "tkt_id", "tkt_uuid", and "tkt_mtime"
+  @ with an unique index on "tkt_uuid" and "tkt_mtime".</p>
+  ;
+  tktsetup_generic(
+    "Ticket Table Schema",
+    "ticket-table",
+    zDefaultTab,
+    zDesc,
+    20
+  );
+}
+
+static char zDefaultCom[] =
+@ set type_choices {
+@    Code_Defect
+@    Build_Problem
+@    Documentation
+@    Feature_Request
+@    Incident
+@ }
+@ set priority_choices {
+@   Immediate
+@   High
+@   Medium
+@   Low
+@   Zero
+@ }
+@ set severity_choices {
+@   Critical
+@   Severe
+@   Important
+@   Minor
+@   Cosmetic
+@ }
+@ set resolution_choices {
+@   Open
+@   Fixed
+@   Rejected
+@   Unable_To_Reproduce
+@   Works_As_Designed
+@   External_Bug
+@   Not_A_Bug
+@   Duplicate
+@   Overcome_By_Events
+@   Drive_By_Patch
+@ }
+@ set status_choices {
+@   Open
+@   Verified
+@   In_Process
+@   Deferred
+@   Fixed
+@   Tested
+@   Closed
+@ }
+@ set subsystem_choices {one two three}
+;
+
+/*
+** WEBPAGE: tktsetup_com
+*/
+void tktsetup_com_page(void){
+  static const char zDesc[] =
+  @ <p>Enter TH1 script that initializes variables prior to generating
+  @ any of the ticket view, edit, or creation pages.</p>
+  ;
+  tktsetup_generic(
+    "Ticket Common Script",
+    "ticket-common",
+    zDefaultCom,
+    zDesc,
+    30
+  );
+}
+
+static char zDefaultNew[] =
+@ <th1>
+@   if {[info exists submit]} {
+@      set status Open
+@      submit_ticket
+@   }
+@ </th1>
+@ <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>">
+@ </td>
+@ </tr>
+@
+@ <tr>
+@ <td align="right">Type:
+@ <th1>combobox type $type_choices 1</th1>
+@ </td>
+@ <td>What type of ticket is this?</td>
+@ </tr>
+@
+@ <tr>
+@ <td align="right">Version:
+@ <input type="text" name="foundin" size="20" value="$<foundin>">
+@ </td>
+@ <td>In what version or build number do you observe the problem?</td>
+@ </tr>
+@
+@ <tr>
+@ <td align="right">Severity:
+@ <th1>combobox severity $severity_choices 1</th1>
+@ </td>
+@ <td>How debilitating is the problem?  How badly does the problem
+@ effect the operation of the product?</td>
+@ </tr>
+@
+@ <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
+@ questions.</td>
+@ </tr>
+@
+@ <tr>
+@ <td colspan="2">
+@ Enter a detailed description of the problem.
+@ For code defects, be sure to provide details on exactly how
+@ the problem can be reproduced.  Provide as much detail as
+@ possible.
+@ <br>
+@ <th1>set nline [linecount $comment 50 10]</th1>
+@ <textarea name="comment" cols="80" rows="$nline"
+@  wrap="virtual" class="wikiedit">$<comment></textarea><br>
+@ <input type="submit" name="preview" value="Preview">
+@ </tr>
+@
+@ <th1>enable_output [info exists preview]</th1>
+@ <tr><td colspan="2">
+@ Description Preview:<br><hr>
+@ <th1>wiki $comment</th1>
+@ <hr>
+@ </td></tr>
+@ <th1>enable_output 1</th1>
+@
+@ <tr>
+@ <td align="right">
+@ <input type="submit" name="submit" value="Submit">
+@ </td>
+@ <td>After filling in the information above, press this button to create
+@ the new ticket</td>
+@ </tr>
+@ </table>
+;
+
+/*
+** WEBPAGE: tktsetup_newpage
+*/
+void tktsetup_newpage_page(void){
+  static const char zDesc[] =
+  @ <p>Enter HTML with embedded TH1 script that will render the "new ticket"
+  @ page</p>
+  ;
+  tktsetup_generic(
+    "HTML For New Tickets",
+    "ticket-newpage",
+    zDefaultNew,
+    zDesc,
+    40
+  );
+}
+
+static char zDefaultView[] =
+@ <table cellpadding="5">
+@ <tr><td align="right">Title:</td><td>
+@ $<title>
+@ </td></tr>
+@ <tr><td align="right">Status:</td><td>
+@ $<status>
+@ </td></tr>
+@ <tr><td align="right">Type:</td><td>
+@ $<type>
+@ </td></tr>
+@ <tr><td align="right">Severity:</td><td>
+@ $<severity>
+@ </td></tr>
+@ <tr><td align="right">Priority:</td><td>
+@ $<priority>
+@ </td></tr>
+@ <tr><td align="right">Resolution:</td><td>
+@ $<resolution>
+@ </td></tr>
+@ <tr><td align="right">Subsystem:</td><td>
+@ $<subsystem>
+@ </td></tr>
+@ <th1>enable_output [hascap e]</th1>
+@   <tr><td align="right">Contact:</td><td>
+@   $<contact>
+@   </td></tr>
+@ <th1>enable_output 1</th1>
+@ <tr><td align="right">Version&nbsp;Found&nbsp;In:</td><td>
+@ $<foundin>
+@ </td></tr>
+@ <tr><td colspan="2">
+@ Description And Comments:<br>
+@ <th1>wiki $comment</th1>
+@ </td></tr>
+@ </table>
+;
+
+
+/*
+** WEBPAGE: tktsetup_viewpage
+*/
+void tktsetup_viewpage_page(void){
+  static const char zDesc[] =
+  @ <p>Enter HTML with embedded TH1 script that will render the "view ticket"
+  @ page</p>
+  ;
+  tktsetup_generic(
+    "HTML For Viewing Tickets",
+    "ticket-viewpage",
+    zDefaultView,
+    zDesc,
+    40
+  );
+}
+
+static char zDefaultEdit[] =
+@ <th1>
+@   if {![info exists username]} {set username $login}
+@   if {[info exists submit]} {
+@     if {[info exists cmappnd]} {
+@       if {[string length $cmappnd]>0} {
+@         set ctxt "\n\n<hr><i>[htmlize $login]"
+@         if {$username ne $login} {
+@           set ctxt "$ctxt claiming to be [htmlize $username]"
+@         }
+@         set ctxt "$ctxt added on [date]:</i><br>\n$cmappnd"
+@         append_field comment $ctxt
+@       }
+@     }
+@     submit_ticket
+@   }
+@ </th1>
+@ <table cellpadding="5">
+@ <tr><td align="right">Title:</td><td>
+@ <input type="text" name="title" value="$<title>" size="60">
+@ </td></tr>
+@ <tr><td align="right">Status:</td><td>
+@ <th1>combobox status $status_choices 1</th1>
+@ </td></tr>
+@ <tr><td align="right">Type:</td><td>
+@ <th1>combobox type $type_choices 1</th1>
+@ </td></tr>
+@ <tr><td align="right">Severity:</td><td>
+@ <th1>combobox severity $severity_choices 1</th1>
+@ </td></tr>
+@ <tr><td align="right">Priority:</td><td>
+@ <th1>combobox priority $priority_choices 1</th1>
+@ </td></tr>
+@ <tr><td align="right">Resolution:</td><td>
+@ <th1>combobox resolution $resolution_choices 1</th1>
+@ </td></tr>
+@ <tr><td align="right">Subsystem:</td><td>
+@ <th1>combobox subsystem $subsystem_choices 1</th1>
+@ </td></tr>
+@ <th1>enable_output [hascap e]</th1>
+@   <tr><td align="right">Contact:</td><td>
+@   <input type="text" name="contact" size="40" value="$<contact>">
+@   </td></tr>
+@ <th1>enable_output 1</th1>
+@ <tr><td align="right">Version&nbsp;Found&nbsp;In:</td><td>
+@ <input type="text" name="foundin" size="50" value="$<foundin>">
+@ </td></tr>
+@ <tr><td colspan="2">
+@ <th1>
+@   if {![info exists eall]} {set eall 0}
+@   if {[info exists aonlybtn]} {set eall 0}
+@   if {[info exists eallbtn]} {set eall 1}
+@   if {![hascap w]} {set eall 0}
+@   if {![info exists cmappnd]} {set cmappnd {}}
+@   set nline [linecount $comment 15 10]
+@   enable_output $eall
+@ </th1>
+@   Description And Comments:<br>
+@   <textarea name="comment" cols="80" rows="$nline"
+@    wrap="virtual" class="wikiedit">$<comment></textarea><br>
+@   <input type="hidden" name="eall" value="1">
+@   <input type="submit" name="aonlybtn" value="Append Remark">
+@ <th1>enable_output [expr {!$eall}]</th1>
+@   Append Remark from
+@   <input type="text" name="username" value="$<username>" size="30">:<br>
+@   <textarea name="cmappnd" cols="80" rows="15"
+@    wrap="virtual" class="wikiedit">$<cmappnd></textarea><br>
+@ <th1>enable_output [expr {[hascap w] && !$eall}]</th1>
+@   <input type="submit" name="eallbtn" value="Edit All">
+@ <th1>enable_output 1</th1>
+@ </td></tr>
+@ <tr><td align="right"></td><td>
+@ <input type="submit" name="submit" value="Submit Changes">
+@ </td></tr>
+@ </table>
+;
+
+/*
+** WEBPAGE: tktsetup_editpage
+*/
+void tktsetup_editpage_page(void){
+  static const char zDesc[] =
+  @ <p>Enter HTML with embedded TH1 script that will render the "edit ticket"
+  @ page</p>
+  ;
+  tktsetup_generic(
+    "HTML For Editing Tickets",
+    "ticket-editpage",
+    zDefaultEdit,
+    zDesc,
+    40
+  );
 }