Check-in [73c23a4279]
Not logged in
Overview

SHA1 Hash:73c23a4279b97ad3198f907770eb4efeadc3d104
Date: 2009-01-22 13:52:27
User: drh
Comment:Add the ability to cancel existing tags from the web interface, on the "vedit" page. Disable the display of "Leaf" on the timeline for closed leaves.
Timelines: ancestors | descendants | both | trunk
Other Links: files | ZIP archive | manifest

Tags And Properties
Changes
[hide diffs]

Modified src/info.c from [5f178b6ba9] to [e59b0728c7].

@@ -1165,12 +1165,15 @@
   const char *zNewComment;
   const char *zUser;
   const char *zNewUser;
   const char *zColor;
   const char *zNewColor;
+  const char *zNewTagFlag;
   const char *zNewTag;
+  const char *zNewBrFlag;
   const char *zNewBranch;
+  const char *zCloseFlag;
   int fPropagateColor;
   char *zUuid;
   Blob comment;
   Stmt q;
   static const struct SampleColors {
@@ -1188,10 +1191,11 @@
      { "#ffc0ff", "#ffc0ff" },
      { "#ffc0d0", "#ffc0d0" },
      { "#fff0c0", "#fff0c0" },
      { "#c0c0c0", "#c0c0c0" },
   };
+  int nColor = sizeof(aColor)/sizeof(aColor[0]);
   int i;
 
   login_check_credentials();
   if( !g.okWrite ){ login_needed(); return; }
   rid = atoi(PD("r","0"));
@@ -1209,14 +1213,15 @@
   zNewUser = PD("u",zUser);
   zColor = db_text("", "SELECT bgcolor"
                         "  FROM event WHERE objid=%d", rid);
   zNewColor = PD("clr",zColor);
   fPropagateColor = P("pclr")!=0;
-  zNewTag = P("newtag")!=0 ? P("tagname") : 0;
-  if( zNewTag && zNewTag[0]==0 ) zNewTag = 0;
-  zNewBranch = P("newbr")!=0 ? P("brname") : 0;
-  if( zNewBranch && zNewBranch[0]==0 ) zNewBranch = 0;
+  zNewTagFlag = P("newtag") ? " checked" : "";
+  zNewTag = PD("tagname","");
+  zNewBrFlag = P("newbr") ? " checked" : "";
+  zNewBranch = PD("brname","");
+  zCloseFlag = P("close") ? " checked" : "";
   if( P("apply") ){
     Blob ctrl;
     char *zDate;
     int nChng = 0;
 
@@ -1242,14 +1247,32 @@
                     zNewComment);
     }
     if( strcmp(zUser,zNewUser)!=0 ){
       db_multi_exec("REPLACE INTO newtags VALUES('user','+',%Q)", zNewUser);
     }
-    if( zNewTag ){
+    db_prepare(&q,
+       "SELECT tag.tagid, tagname FROM tagxref, tag"
+       " WHERE tagxref.rid=%d AND tagtype>0 AND tagxref.tagid=tag.tagid",
+       rid
+    );
+    while( db_step(&q)==SQLITE_ROW ){
+      int tagid = db_column_int(&q, 0);
+      const char *zTag = db_column_text(&q, 1);
+      char zLabel[30];
+      sprintf(zLabel, "c%d", tagid);
+      if( P(zLabel) ){
+        db_multi_exec("REPLACE INTO newtags VALUES(%Q,'-',NULL)", zTag);
+      }
+    }
+    db_finalize(&q);
+    if( zCloseFlag[0] ){
+      db_multi_exec("REPLACE INTO newtags VALUES('closed','+',NULL)");
+    }
+    if( zNewTagFlag[0] ){
       db_multi_exec("REPLACE INTO newtags VALUES('sym-%q','+',NULL)", zNewTag);
     }
-    if( zNewBranch ){
+    if( zNewBrFlag[0] ){
       db_multi_exec(
         "REPLACE INTO newtags "
         " SELECT tagname, '-', NULL FROM tagxref, tag"
         "  WHERE tagxref.rid=%d AND tagtype==2"
         "    AND tagname GLOB 'sym-*'"
@@ -1344,12 +1367,19 @@
   @ </td></tr>
 
   @ <tr><td align="right" valign="top"><b>Background Color:</b></td>
   @ <td valign="top">
   @ <table border=0 cellpadding=0 cellspacing=1>
+  @ <tr><td colspan="6" align="left">
+  if( fPropagateColor ){
+    @ <input type="checkbox" name="pclr" checked>
+  }else{
+    @ <input type="checkbox" name="pclr">
+  }
+  @ Propagate color to descendants</input></td></tr>
   @ <tr>
-  for(i=0; i<sizeof(aColor)/sizeof(aColor[0]); i++){
+  for(i=0; i<nColor; i++){
     if( aColor[i].zColor[0] ){
       @ <td bgcolor="%h(aColor[i].zColor)">
     }else{
       @ <td>
     }
@@ -1357,42 +1387,67 @@
       @ <input type="radio" name="clr" value="%h(aColor[i].zColor)" checked>
     }else{
       @ <input type="radio" name="clr" value="%h(aColor[i].zColor)">
     }
     @ %h(aColor[i].zCName)</input></td>
-  }
-  @ </tr><tr><td colspan="9" align="left">
-  if( fPropagateColor ){
-    @ <input type="checkbox" name="pclr" checked>
-  }else{
-    @ <input type="checkbox" name="pclr">
+    if( (i%6)==5 && i+1<nColor ){
+      @ </tr><tr>
+    }
   }
-  @ Propagate color to descendants</input></td></tr>
+  @ </tr>
   @ </table>
   @ </td></tr>
 
   @ <tr><td align="right" valign="top"><b>Tags:</b></td>
   @ <td valign="top">
-  @ <input type="checkbox" name="newtag">
+  @ <input type="checkbox" name="newtag"%s(zNewTagFlag)>
   @ Add the following new tag name to this check-in:
-  @ <input type="text" width="15" name="tagname">
+  @ <input type="text" width="15" name="tagname" value="%h(zNewTag)">
+  db_prepare(&q,
+     "SELECT tag.tagid, tagname FROM tagxref, tag"
+     " WHERE tagxref.rid=%d AND tagtype>0 AND tagxref.tagid=tag.tagid"
+     " ORDER BY CASE WHEN tagname GLOB 'sym-*' THEN substr(tagname,5)"
+     "               ELSE tagname END",
+     rid
+  );
+  while( db_step(&q)==SQLITE_ROW ){
+    int tagid = db_column_int(&q, 0);
+    const char *zTagName = db_column_text(&q, 1);
+    char zLabel[30];
+    sprintf(zLabel, "c%d", tagid);
+    if( P(zLabel) ){
+      @ <br><input type="checkbox" name="c%d(tagid)" checked>
+    }else{
+      @ <br><input type="checkbox" name="c%d(tagid)">
+    }
+    if( strncmp(zTagName, "sym-", 4)==0 ){
+      @ Cancel tag <b>%h(&zTagName[4])</b>
+    }else{
+      @ Cancel special tag <b>%h(zTagName)</b>
+    }
+  }
+  db_finalize(&q);
   @ </td></tr>
 
   if( db_exists("SELECT 1 FROM tagxref WHERE rid=%d AND tagid=%d AND srcid>0",
                 rid, TAG_BRANCH)==0 ){
     @ <tr><td align="right" valign="top"><b>Branching:</b></td>
     @ <td valign="top">
-    @ <input type="checkbox" name="newbr">
+    @ <input type="checkbox" name="newbr"%s(zNewBrFlag)>
     @ Make this check-in the start of a new branch named:
-    @ <input type="text" width="15" name="brname">
+    @ <input type="text" width="15" name="brname" value="%h(zNewBranch)">
     @ </td></tr>
   }
 
-  if( is_a_leaf(rid) ){
+  if( is_a_leaf(rid)
+   && !db_exists("SELECT 1 FROM tagxref "
+                 " WHERE tagid=%d AND rid=%d AND tagtype>0",
+                 TAG_CLOSED, rid)
+  ){
     @ <tr><td align="right" valign="top"><b>Leaf Closure:</b></td>
     @ <td valign="top">
-    @ <input type="checkbox" name="close">
+    @ <input type="checkbox" name="close"%s(zCloseFlag)>
     @ Mark this leaf as "closed" so that it no longer appears on the
     @ "leaves" page and is no longer labeled as a "<b>Leaf</b>".
     @ </td></tr>
   }
 

Modified src/timeline.c from [4c13ae2995] to [16fff7bd26].

@@ -253,10 +253,13 @@
     @   datetime(event.mtime,'localtime') AS timestamp,
     @   coalesce(ecomment, comment),
     @   coalesce(euser, user),
     @   (SELECT count(*) FROM plink WHERE pid=blob.rid AND isprim=1),
     @   (SELECT count(*) FROM plink WHERE cid=blob.rid),
+    @   NOT EXISTS(SELECT 1 FROM tagxref
+    @               WHERE tagid=%d AND tagtype>0 AND rid=blob.rid)
+    @   AND
     @   NOT EXISTS(SELECT 1 FROM plink
     @               WHERE pid=blob.rid
     @                AND coalesce((SELECT value FROM tagxref
     @                              WHERE tagid=%d AND rid=plink.pid), 'trunk')
     @                  = coalesce((SELECT value FROM tagxref
@@ -268,11 +271,11 @@
     @       AND tagxref.rid=blob.rid AND tagxref.tagtype>0)
     @  FROM event JOIN blob
     @ WHERE blob.rid=event.objid
   ;
   if( zBase==0 ){
-    zBase = mprintf(zBaseSql, TAG_BRANCH, TAG_BRANCH);
+    zBase = mprintf(zBaseSql, TAG_CLOSED, TAG_BRANCH, TAG_BRANCH);
   }
   return zBase;
 }
 
 /*