Fossil SCM

Add the email address editing to the subscriber information screen (/alerts). Improved cross-linking between subscriber and user editing screens for administrators.

drh 2020-03-25 17:48 trunk
Commit 54a6f098ec4e41c2bbf4d6daf1be4de861190206c763491fba00c20a6f083cb1
2 files changed +57 -45 +17 -3
+57 -45
--- src/alerts.c
+++ src/alerts.c
@@ -183,11 +183,11 @@
183183
** is an administrator.
184184
*/
185185
void alert_submenu_common(void){
186186
if( g.perm.Admin ){
187187
if( fossil_strcmp(g.zPath,"subscribers") ){
188
- style_submenu_element("List Subscribers","%R/subscribers");
188
+ style_submenu_element("Subscribers","%R/subscribers");
189189
}
190190
if( fossil_strcmp(g.zPath,"subscribe") ){
191191
style_submenu_element("Add New Subscriber","%R/subscribe");
192192
}
193193
}
@@ -1514,10 +1514,11 @@
15141514
void alert_page(void){
15151515
const char *zName = P("name");
15161516
Stmt q;
15171517
int sa, sc, sf, st, sw;
15181518
int sdigest, sdonotcall, sverified;
1519
+ int isLogin; /* Logged in as an individual */
15191520
const char *ssub;
15201521
const char *semail;
15211522
const char *smip;
15221523
const char *suname;
15231524
const char *mtime;
@@ -1529,11 +1530,12 @@
15291530
login_check_credentials();
15301531
if( !g.perm.EmailAlert ){
15311532
login_needed(g.anon.EmailAlert);
15321533
return;
15331534
}
1534
- if( zName==0 && login_is_individual() ){
1535
+ isLogin = login_is_individual();
1536
+ if( zName==0 && isLogin ){
15351537
zName = db_text(0, "SELECT hex(subscriberCode) FROM subscriber"
15361538
" WHERE suname=%Q", g.zLogin);
15371539
}
15381540
if( zName==0 || !validate16(zName, -1) ){
15391541
cgi_redirect("subscribe");
@@ -1543,54 +1545,46 @@
15431545
if( P("submit")!=0 && cgi_csrf_safe(1) ){
15441546
int sdonotcall = PB("sdonotcall");
15451547
int sdigest = PB("sdigest");
15461548
char ssub[10];
15471549
int nsub = 0;
1550
+ Blob update;
15481551
if( PB("sa") ) ssub[nsub++] = 'a';
15491552
if( g.perm.Read && PB("sc") ) ssub[nsub++] = 'c';
15501553
if( g.perm.RdForum && PB("sf") ) ssub[nsub++] = 'f';
15511554
if( g.perm.RdTkt && PB("st") ) ssub[nsub++] = 't';
15521555
if( g.perm.RdWiki && PB("sw") ) ssub[nsub++] = 'w';
15531556
ssub[nsub] = 0;
1554
- if( g.perm.Admin ){
1555
- const char *suname = PT("suname");
1556
- int sverified = PB("sverified");
1557
- if( suname && suname[0]==0 ) suname = 0;
1558
- db_multi_exec(
1559
- "UPDATE subscriber SET"
1560
- " sdonotcall=%d,"
1561
- " sdigest=%d,"
1562
- " ssub=%Q,"
1563
- " mtime=strftime('%%s','now'),"
1564
- " smip=%Q,"
1565
- " suname=%Q,"
1566
- " sverified=%d"
1567
- " WHERE subscriberCode=hextoblob(%Q)",
1568
- sdonotcall,
1569
- sdigest,
1570
- ssub,
1571
- g.zIpAddr,
1572
- suname,
1573
- sverified,
1574
- zName
1575
- );
1576
- }else{
1577
- db_multi_exec(
1578
- "UPDATE subscriber SET"
1579
- " sdonotcall=%d,"
1580
- " sdigest=%d,"
1581
- " ssub=%Q,"
1582
- " mtime=strftime('%%s','now'),"
1583
- " smip=%Q"
1584
- " WHERE subscriberCode=hextoblob(%Q)",
1585
- sdonotcall,
1586
- sdigest,
1587
- ssub,
1588
- g.zIpAddr,
1589
- zName
1590
- );
1591
- }
1557
+ blob_init(&update, "UPDATE subscriber SET", -1);
1558
+ blob_append_sql(&update,
1559
+ " sdonotcall=%d,"
1560
+ " sdigest=%d,"
1561
+ " ssub=%Q,"
1562
+ " mtime=strftime('%%s','now'),"
1563
+ " smip=%Q",
1564
+ sdonotcall,
1565
+ sdigest,
1566
+ ssub,
1567
+ g.zIpAddr
1568
+ );
1569
+ if( g.perm.Admin ){
1570
+ const char *suname = PT("suname");
1571
+ int sverified = PB("sverified");
1572
+ if( suname && suname[0]==0 ) suname = 0;
1573
+ blob_append_sql(&update,
1574
+ ", suname=%Q,"
1575
+ " sverified=%d",
1576
+ suname,
1577
+ sverified
1578
+ );
1579
+ }
1580
+ if( isLogin ){
1581
+ blob_append_sql(&update, ", semail=%Q", P("semail"));
1582
+ }
1583
+ blob_append_sql(&update," WHERE subscriberCode=hextoblob(%Q)", zName);
1584
+ db_exec_sql(blob_str(&update));
1585
+ blob_reset(&update);
15921586
}
15931587
if( P("delete")!=0 && cgi_csrf_safe(1) ){
15941588
if( !PB("dodelete") ){
15951589
eErr = 9;
15961590
zErr = mprintf("Select this checkbox and press \"Unsubscribe\" again to"
@@ -1647,13 +1641,18 @@
16471641
form_begin(0, "%R/alerts");
16481642
@ <input type="hidden" name="name" value="%h(zName)">
16491643
@ <table class="subscribe">
16501644
@ <tr>
16511645
@ <td class="form_label">Email&nbsp;Address:</td>
1652
- @ <td>%h(semail)</td>
1646
+ if( isLogin ){
1647
+ @ <td><input type="text" name="semail" value="%h(semail)" size="30"></td>
1648
+ }else{
1649
+ @ <td>%h(semail)</td>
1650
+ }
16531651
@ </tr>
16541652
if( g.perm.Admin ){
1653
+ int uid;
16551654
@ <tr>
16561655
@ <td class='form_label'>Created:</td>
16571656
@ <td>%h(sctime)</td>
16581657
@ </tr>
16591658
@ <tr>
@@ -1665,11 +1664,16 @@
16651664
@ <td>%h(smip)</td>
16661665
@ </tr>
16671666
@ <tr>
16681667
@ <td class="form_label">User:</td>
16691668
@ <td><input type="text" name="suname" value="%h(suname?suname:"")" \
1670
- @ size="30"></td>
1669
+ @ size="30">\
1670
+ uid = db_int(0, "SELECT uid FROM user WHERE login=%Q", suname);
1671
+ if( uid ){
1672
+ @ &nbsp;&nbsp;<a href='%R/setup_uedit?id=%d(uid)'>\
1673
+ @ (login info for %h(suname))</a>\
1674
+ }
16711675
@ </tr>
16721676
}
16731677
@ <tr>
16741678
@ <td class="form_label">Topics:</td>
16751679
@ <td><label><input type="checkbox" name="sa" %s(sa?"checked":"")>\
@@ -1704,11 +1708,11 @@
17041708
#endif
17051709
if( g.perm.Admin ){
17061710
@ <tr>
17071711
@ <td class="form_label">Admin Options:</td><td>
17081712
@ <label><input type="checkbox" name="sdonotcall" \
1709
- @ %s(sdonotcall?"checked":"")> Do not call</label><br>
1713
+ @ %s(sdonotcall?"checked":"")> Do not disturb</label><br>
17101714
@ <label><input type="checkbox" name="sverified" \
17111715
@ %s(sverified?"checked":"")>\
17121716
@ Verified</label></td></tr>
17131717
}
17141718
if( eErr==9 ){
@@ -1903,10 +1907,11 @@
19031907
if( !g.perm.Admin ){
19041908
login_needed(0);
19051909
return;
19061910
}
19071911
alert_submenu_common();
1912
+ style_submenu_element("Users","setup_ulist");
19081913
style_header("Subscriber List");
19091914
blob_init(&sql, 0, 0);
19101915
blob_append_sql(&sql,
19111916
"SELECT hex(subscriberCode)," /* 0 */
19121917
" semail," /* 1 */
@@ -1913,11 +1918,12 @@
19131918
" ssub," /* 2 */
19141919
" suname," /* 3 */
19151920
" sverified," /* 4 */
19161921
" sdigest," /* 5 */
19171922
" mtime," /* 6 */
1918
- " date(sctime,'unixepoch')" /* 7 */
1923
+ " date(sctime,'unixepoch')," /* 7 */
1924
+ " (SELECT uid FROM user WHERE login=subscriber.suname)" /* 8 */
19191925
" FROM subscriber"
19201926
);
19211927
if( P("only")!=0 ){
19221928
blob_append_sql(&sql, " WHERE ssub LIKE '%%%q%%'", P("only"));
19231929
style_submenu_element("Show All","%R/subscribers");
@@ -1939,16 +1945,22 @@
19391945
@ </tr>
19401946
@ </thead><tbody>
19411947
while( db_step(&q)==SQLITE_ROW ){
19421948
sqlite3_int64 iMtime = db_column_int64(&q, 6);
19431949
double rAge = (iNow - iMtime)/86400.0;
1950
+ int uid = db_column_int(&q, 8);
1951
+ const char *zUname = db_column_text(&q, 3);
19441952
@ <tr>
19451953
@ <td><a href='%R/alerts/%s(db_column_text(&q,0))'>\
19461954
@ %h(db_column_text(&q,1))</a></td>
19471955
@ <td>%h(db_column_text(&q,2))</td>
19481956
@ <td>%s(db_column_int(&q,5)?"digest":"")</td>
1949
- @ <td>%h(db_column_text(&q,3))</td>
1957
+ if( uid ){
1958
+ @ <td><a href='%R/setup_uedit?id=%d(uid)'>%h(zUname)</a>
1959
+ }else{
1960
+ @ <td>%h(zUname)</td>
1961
+ }
19501962
@ <td>%s(db_column_int(&q,4)?"yes":"pending")</td>
19511963
@ <td data-sortkey='%010llx(iMtime)'>%z(human_readable_age(rAge))</td>
19521964
@ <td>%h(db_column_text(&q,7))</td>
19531965
@ </tr>
19541966
}
19551967
--- src/alerts.c
+++ src/alerts.c
@@ -183,11 +183,11 @@
183 ** is an administrator.
184 */
185 void alert_submenu_common(void){
186 if( g.perm.Admin ){
187 if( fossil_strcmp(g.zPath,"subscribers") ){
188 style_submenu_element("List Subscribers","%R/subscribers");
189 }
190 if( fossil_strcmp(g.zPath,"subscribe") ){
191 style_submenu_element("Add New Subscriber","%R/subscribe");
192 }
193 }
@@ -1514,10 +1514,11 @@
1514 void alert_page(void){
1515 const char *zName = P("name");
1516 Stmt q;
1517 int sa, sc, sf, st, sw;
1518 int sdigest, sdonotcall, sverified;
 
1519 const char *ssub;
1520 const char *semail;
1521 const char *smip;
1522 const char *suname;
1523 const char *mtime;
@@ -1529,11 +1530,12 @@
1529 login_check_credentials();
1530 if( !g.perm.EmailAlert ){
1531 login_needed(g.anon.EmailAlert);
1532 return;
1533 }
1534 if( zName==0 && login_is_individual() ){
 
1535 zName = db_text(0, "SELECT hex(subscriberCode) FROM subscriber"
1536 " WHERE suname=%Q", g.zLogin);
1537 }
1538 if( zName==0 || !validate16(zName, -1) ){
1539 cgi_redirect("subscribe");
@@ -1543,54 +1545,46 @@
1543 if( P("submit")!=0 && cgi_csrf_safe(1) ){
1544 int sdonotcall = PB("sdonotcall");
1545 int sdigest = PB("sdigest");
1546 char ssub[10];
1547 int nsub = 0;
 
1548 if( PB("sa") ) ssub[nsub++] = 'a';
1549 if( g.perm.Read && PB("sc") ) ssub[nsub++] = 'c';
1550 if( g.perm.RdForum && PB("sf") ) ssub[nsub++] = 'f';
1551 if( g.perm.RdTkt && PB("st") ) ssub[nsub++] = 't';
1552 if( g.perm.RdWiki && PB("sw") ) ssub[nsub++] = 'w';
1553 ssub[nsub] = 0;
1554 if( g.perm.Admin ){
1555 const char *suname = PT("suname");
1556 int sverified = PB("sverified");
1557 if( suname && suname[0]==0 ) suname = 0;
1558 db_multi_exec(
1559 "UPDATE subscriber SET"
1560 " sdonotcall=%d,"
1561 " sdigest=%d,"
1562 " ssub=%Q,"
1563 " mtime=strftime('%%s','now'),"
1564 " smip=%Q,"
1565 " suname=%Q,"
1566 " sverified=%d"
1567 " WHERE subscriberCode=hextoblob(%Q)",
1568 sdonotcall,
1569 sdigest,
1570 ssub,
1571 g.zIpAddr,
1572 suname,
1573 sverified,
1574 zName
1575 );
1576 }else{
1577 db_multi_exec(
1578 "UPDATE subscriber SET"
1579 " sdonotcall=%d,"
1580 " sdigest=%d,"
1581 " ssub=%Q,"
1582 " mtime=strftime('%%s','now'),"
1583 " smip=%Q"
1584 " WHERE subscriberCode=hextoblob(%Q)",
1585 sdonotcall,
1586 sdigest,
1587 ssub,
1588 g.zIpAddr,
1589 zName
1590 );
1591 }
1592 }
1593 if( P("delete")!=0 && cgi_csrf_safe(1) ){
1594 if( !PB("dodelete") ){
1595 eErr = 9;
1596 zErr = mprintf("Select this checkbox and press \"Unsubscribe\" again to"
@@ -1647,13 +1641,18 @@
1647 form_begin(0, "%R/alerts");
1648 @ <input type="hidden" name="name" value="%h(zName)">
1649 @ <table class="subscribe">
1650 @ <tr>
1651 @ <td class="form_label">Email&nbsp;Address:</td>
1652 @ <td>%h(semail)</td>
 
 
 
 
1653 @ </tr>
1654 if( g.perm.Admin ){
 
1655 @ <tr>
1656 @ <td class='form_label'>Created:</td>
1657 @ <td>%h(sctime)</td>
1658 @ </tr>
1659 @ <tr>
@@ -1665,11 +1664,16 @@
1665 @ <td>%h(smip)</td>
1666 @ </tr>
1667 @ <tr>
1668 @ <td class="form_label">User:</td>
1669 @ <td><input type="text" name="suname" value="%h(suname?suname:"")" \
1670 @ size="30"></td>
 
 
 
 
 
1671 @ </tr>
1672 }
1673 @ <tr>
1674 @ <td class="form_label">Topics:</td>
1675 @ <td><label><input type="checkbox" name="sa" %s(sa?"checked":"")>\
@@ -1704,11 +1708,11 @@
1704 #endif
1705 if( g.perm.Admin ){
1706 @ <tr>
1707 @ <td class="form_label">Admin Options:</td><td>
1708 @ <label><input type="checkbox" name="sdonotcall" \
1709 @ %s(sdonotcall?"checked":"")> Do not call</label><br>
1710 @ <label><input type="checkbox" name="sverified" \
1711 @ %s(sverified?"checked":"")>\
1712 @ Verified</label></td></tr>
1713 }
1714 if( eErr==9 ){
@@ -1903,10 +1907,11 @@
1903 if( !g.perm.Admin ){
1904 login_needed(0);
1905 return;
1906 }
1907 alert_submenu_common();
 
1908 style_header("Subscriber List");
1909 blob_init(&sql, 0, 0);
1910 blob_append_sql(&sql,
1911 "SELECT hex(subscriberCode)," /* 0 */
1912 " semail," /* 1 */
@@ -1913,11 +1918,12 @@
1913 " ssub," /* 2 */
1914 " suname," /* 3 */
1915 " sverified," /* 4 */
1916 " sdigest," /* 5 */
1917 " mtime," /* 6 */
1918 " date(sctime,'unixepoch')" /* 7 */
 
1919 " FROM subscriber"
1920 );
1921 if( P("only")!=0 ){
1922 blob_append_sql(&sql, " WHERE ssub LIKE '%%%q%%'", P("only"));
1923 style_submenu_element("Show All","%R/subscribers");
@@ -1939,16 +1945,22 @@
1939 @ </tr>
1940 @ </thead><tbody>
1941 while( db_step(&q)==SQLITE_ROW ){
1942 sqlite3_int64 iMtime = db_column_int64(&q, 6);
1943 double rAge = (iNow - iMtime)/86400.0;
 
 
1944 @ <tr>
1945 @ <td><a href='%R/alerts/%s(db_column_text(&q,0))'>\
1946 @ %h(db_column_text(&q,1))</a></td>
1947 @ <td>%h(db_column_text(&q,2))</td>
1948 @ <td>%s(db_column_int(&q,5)?"digest":"")</td>
1949 @ <td>%h(db_column_text(&q,3))</td>
 
 
 
 
1950 @ <td>%s(db_column_int(&q,4)?"yes":"pending")</td>
1951 @ <td data-sortkey='%010llx(iMtime)'>%z(human_readable_age(rAge))</td>
1952 @ <td>%h(db_column_text(&q,7))</td>
1953 @ </tr>
1954 }
1955
--- src/alerts.c
+++ src/alerts.c
@@ -183,11 +183,11 @@
183 ** is an administrator.
184 */
185 void alert_submenu_common(void){
186 if( g.perm.Admin ){
187 if( fossil_strcmp(g.zPath,"subscribers") ){
188 style_submenu_element("Subscribers","%R/subscribers");
189 }
190 if( fossil_strcmp(g.zPath,"subscribe") ){
191 style_submenu_element("Add New Subscriber","%R/subscribe");
192 }
193 }
@@ -1514,10 +1514,11 @@
1514 void alert_page(void){
1515 const char *zName = P("name");
1516 Stmt q;
1517 int sa, sc, sf, st, sw;
1518 int sdigest, sdonotcall, sverified;
1519 int isLogin; /* Logged in as an individual */
1520 const char *ssub;
1521 const char *semail;
1522 const char *smip;
1523 const char *suname;
1524 const char *mtime;
@@ -1529,11 +1530,12 @@
1530 login_check_credentials();
1531 if( !g.perm.EmailAlert ){
1532 login_needed(g.anon.EmailAlert);
1533 return;
1534 }
1535 isLogin = login_is_individual();
1536 if( zName==0 && isLogin ){
1537 zName = db_text(0, "SELECT hex(subscriberCode) FROM subscriber"
1538 " WHERE suname=%Q", g.zLogin);
1539 }
1540 if( zName==0 || !validate16(zName, -1) ){
1541 cgi_redirect("subscribe");
@@ -1543,54 +1545,46 @@
1545 if( P("submit")!=0 && cgi_csrf_safe(1) ){
1546 int sdonotcall = PB("sdonotcall");
1547 int sdigest = PB("sdigest");
1548 char ssub[10];
1549 int nsub = 0;
1550 Blob update;
1551 if( PB("sa") ) ssub[nsub++] = 'a';
1552 if( g.perm.Read && PB("sc") ) ssub[nsub++] = 'c';
1553 if( g.perm.RdForum && PB("sf") ) ssub[nsub++] = 'f';
1554 if( g.perm.RdTkt && PB("st") ) ssub[nsub++] = 't';
1555 if( g.perm.RdWiki && PB("sw") ) ssub[nsub++] = 'w';
1556 ssub[nsub] = 0;
1557 blob_init(&update, "UPDATE subscriber SET", -1);
1558 blob_append_sql(&update,
1559 " sdonotcall=%d,"
1560 " sdigest=%d,"
1561 " ssub=%Q,"
1562 " mtime=strftime('%%s','now'),"
1563 " smip=%Q",
1564 sdonotcall,
1565 sdigest,
1566 ssub,
1567 g.zIpAddr
1568 );
1569 if( g.perm.Admin ){
1570 const char *suname = PT("suname");
1571 int sverified = PB("sverified");
1572 if( suname && suname[0]==0 ) suname = 0;
1573 blob_append_sql(&update,
1574 ", suname=%Q,"
1575 " sverified=%d",
1576 suname,
1577 sverified
1578 );
1579 }
1580 if( isLogin ){
1581 blob_append_sql(&update, ", semail=%Q", P("semail"));
1582 }
1583 blob_append_sql(&update," WHERE subscriberCode=hextoblob(%Q)", zName);
1584 db_exec_sql(blob_str(&update));
1585 blob_reset(&update);
 
 
 
 
 
 
 
 
 
1586 }
1587 if( P("delete")!=0 && cgi_csrf_safe(1) ){
1588 if( !PB("dodelete") ){
1589 eErr = 9;
1590 zErr = mprintf("Select this checkbox and press \"Unsubscribe\" again to"
@@ -1647,13 +1641,18 @@
1641 form_begin(0, "%R/alerts");
1642 @ <input type="hidden" name="name" value="%h(zName)">
1643 @ <table class="subscribe">
1644 @ <tr>
1645 @ <td class="form_label">Email&nbsp;Address:</td>
1646 if( isLogin ){
1647 @ <td><input type="text" name="semail" value="%h(semail)" size="30"></td>
1648 }else{
1649 @ <td>%h(semail)</td>
1650 }
1651 @ </tr>
1652 if( g.perm.Admin ){
1653 int uid;
1654 @ <tr>
1655 @ <td class='form_label'>Created:</td>
1656 @ <td>%h(sctime)</td>
1657 @ </tr>
1658 @ <tr>
@@ -1665,11 +1664,16 @@
1664 @ <td>%h(smip)</td>
1665 @ </tr>
1666 @ <tr>
1667 @ <td class="form_label">User:</td>
1668 @ <td><input type="text" name="suname" value="%h(suname?suname:"")" \
1669 @ size="30">\
1670 uid = db_int(0, "SELECT uid FROM user WHERE login=%Q", suname);
1671 if( uid ){
1672 @ &nbsp;&nbsp;<a href='%R/setup_uedit?id=%d(uid)'>\
1673 @ (login info for %h(suname))</a>\
1674 }
1675 @ </tr>
1676 }
1677 @ <tr>
1678 @ <td class="form_label">Topics:</td>
1679 @ <td><label><input type="checkbox" name="sa" %s(sa?"checked":"")>\
@@ -1704,11 +1708,11 @@
1708 #endif
1709 if( g.perm.Admin ){
1710 @ <tr>
1711 @ <td class="form_label">Admin Options:</td><td>
1712 @ <label><input type="checkbox" name="sdonotcall" \
1713 @ %s(sdonotcall?"checked":"")> Do not disturb</label><br>
1714 @ <label><input type="checkbox" name="sverified" \
1715 @ %s(sverified?"checked":"")>\
1716 @ Verified</label></td></tr>
1717 }
1718 if( eErr==9 ){
@@ -1903,10 +1907,11 @@
1907 if( !g.perm.Admin ){
1908 login_needed(0);
1909 return;
1910 }
1911 alert_submenu_common();
1912 style_submenu_element("Users","setup_ulist");
1913 style_header("Subscriber List");
1914 blob_init(&sql, 0, 0);
1915 blob_append_sql(&sql,
1916 "SELECT hex(subscriberCode)," /* 0 */
1917 " semail," /* 1 */
@@ -1913,11 +1918,12 @@
1918 " ssub," /* 2 */
1919 " suname," /* 3 */
1920 " sverified," /* 4 */
1921 " sdigest," /* 5 */
1922 " mtime," /* 6 */
1923 " date(sctime,'unixepoch')," /* 7 */
1924 " (SELECT uid FROM user WHERE login=subscriber.suname)" /* 8 */
1925 " FROM subscriber"
1926 );
1927 if( P("only")!=0 ){
1928 blob_append_sql(&sql, " WHERE ssub LIKE '%%%q%%'", P("only"));
1929 style_submenu_element("Show All","%R/subscribers");
@@ -1939,16 +1945,22 @@
1945 @ </tr>
1946 @ </thead><tbody>
1947 while( db_step(&q)==SQLITE_ROW ){
1948 sqlite3_int64 iMtime = db_column_int64(&q, 6);
1949 double rAge = (iNow - iMtime)/86400.0;
1950 int uid = db_column_int(&q, 8);
1951 const char *zUname = db_column_text(&q, 3);
1952 @ <tr>
1953 @ <td><a href='%R/alerts/%s(db_column_text(&q,0))'>\
1954 @ %h(db_column_text(&q,1))</a></td>
1955 @ <td>%h(db_column_text(&q,2))</td>
1956 @ <td>%s(db_column_int(&q,5)?"digest":"")</td>
1957 if( uid ){
1958 @ <td><a href='%R/setup_uedit?id=%d(uid)'>%h(zUname)</a>
1959 }else{
1960 @ <td>%h(zUname)</td>
1961 }
1962 @ <td>%s(db_column_int(&q,4)?"yes":"pending")</td>
1963 @ <td data-sortkey='%010llx(iMtime)'>%z(human_readable_age(rAge))</td>
1964 @ <td>%h(db_column_text(&q,7))</td>
1965 @ </tr>
1966 }
1967
+17 -3
--- src/setupuser.c
+++ src/setupuser.c
@@ -45,10 +45,13 @@
4545
}
4646
4747
style_submenu_element("Add", "setup_uedit");
4848
style_submenu_element("Log", "access_log");
4949
style_submenu_element("Help", "setup_ulist_notes");
50
+ if( alert_tables_exist() ){
51
+ style_submenu_element("Subscribers", "subscribers");
52
+ }
5053
style_header("User List");
5154
if( zWith==0 || zWith[0]==0 ){
5255
@ <table border=1 cellpadding=2 cellspacing=0 class='userTable'>
5356
@ <thead><tr>
5457
@ <th>Category
@@ -517,22 +520,33 @@
517520
@ <input type="hidden" name="referer" value="%h(cgi_referer("setup_ulist"))">
518521
@ <table width="100%%">
519522
@ <tr>
520523
@ <td class="usetupEditLabel">User ID:</td>
521524
if( uid ){
522
- @ <td>%d(uid) <input type="hidden" name="id" value="%d(uid)" /></td>
525
+ @ <td>%d(uid) <input type="hidden" name="id" value="%d(uid)" />\
526
+ @ </td>
523527
}else{
524528
@ <td>(new user)<input type="hidden" name="id" value="0" /></td>
525529
}
526530
@ </tr>
527531
@ <tr>
528532
@ <td class="usetupEditLabel">Login:</td>
529533
if( login_is_special(zLogin) ){
530534
@ <td><b>%h(zLogin)</b></td>
531535
}else{
532
- @ <td><input type="text" name="login" value="%h(zLogin)" /></td>
533
- @ </tr>
536
+ @ <td><input type="text" name="login" value="%h(zLogin)" />\
537
+ if( alert_tables_exist() ){
538
+ char *zSCode; /* Subscriber Code */
539
+ zSCode = db_text(0, "SELECT hex(subscriberCode) FROM subscriber"
540
+ " WHERE suname=%Q", zLogin);
541
+ if( zSCode && zSCode[0] ){
542
+ @ &nbsp;&nbsp;<a href="%R/alerts/%s(zSCode)">\
543
+ @ (subscription info for %h(zLogin))</a>\
544
+ }
545
+ fossil_free(zSCode);
546
+ }
547
+ @ </td></tr>
534548
@ <tr>
535549
@ <td class="usetupEditLabel">Contact&nbsp;Info:</td>
536550
@ <td><textarea name="info" cols="40" rows="2">%h(zInfo)</textarea></td>
537551
}
538552
@ </tr>
539553
--- src/setupuser.c
+++ src/setupuser.c
@@ -45,10 +45,13 @@
45 }
46
47 style_submenu_element("Add", "setup_uedit");
48 style_submenu_element("Log", "access_log");
49 style_submenu_element("Help", "setup_ulist_notes");
 
 
 
50 style_header("User List");
51 if( zWith==0 || zWith[0]==0 ){
52 @ <table border=1 cellpadding=2 cellspacing=0 class='userTable'>
53 @ <thead><tr>
54 @ <th>Category
@@ -517,22 +520,33 @@
517 @ <input type="hidden" name="referer" value="%h(cgi_referer("setup_ulist"))">
518 @ <table width="100%%">
519 @ <tr>
520 @ <td class="usetupEditLabel">User ID:</td>
521 if( uid ){
522 @ <td>%d(uid) <input type="hidden" name="id" value="%d(uid)" /></td>
 
523 }else{
524 @ <td>(new user)<input type="hidden" name="id" value="0" /></td>
525 }
526 @ </tr>
527 @ <tr>
528 @ <td class="usetupEditLabel">Login:</td>
529 if( login_is_special(zLogin) ){
530 @ <td><b>%h(zLogin)</b></td>
531 }else{
532 @ <td><input type="text" name="login" value="%h(zLogin)" /></td>
533 @ </tr>
 
 
 
 
 
 
 
 
 
 
534 @ <tr>
535 @ <td class="usetupEditLabel">Contact&nbsp;Info:</td>
536 @ <td><textarea name="info" cols="40" rows="2">%h(zInfo)</textarea></td>
537 }
538 @ </tr>
539
--- src/setupuser.c
+++ src/setupuser.c
@@ -45,10 +45,13 @@
45 }
46
47 style_submenu_element("Add", "setup_uedit");
48 style_submenu_element("Log", "access_log");
49 style_submenu_element("Help", "setup_ulist_notes");
50 if( alert_tables_exist() ){
51 style_submenu_element("Subscribers", "subscribers");
52 }
53 style_header("User List");
54 if( zWith==0 || zWith[0]==0 ){
55 @ <table border=1 cellpadding=2 cellspacing=0 class='userTable'>
56 @ <thead><tr>
57 @ <th>Category
@@ -517,22 +520,33 @@
520 @ <input type="hidden" name="referer" value="%h(cgi_referer("setup_ulist"))">
521 @ <table width="100%%">
522 @ <tr>
523 @ <td class="usetupEditLabel">User ID:</td>
524 if( uid ){
525 @ <td>%d(uid) <input type="hidden" name="id" value="%d(uid)" />\
526 @ </td>
527 }else{
528 @ <td>(new user)<input type="hidden" name="id" value="0" /></td>
529 }
530 @ </tr>
531 @ <tr>
532 @ <td class="usetupEditLabel">Login:</td>
533 if( login_is_special(zLogin) ){
534 @ <td><b>%h(zLogin)</b></td>
535 }else{
536 @ <td><input type="text" name="login" value="%h(zLogin)" />\
537 if( alert_tables_exist() ){
538 char *zSCode; /* Subscriber Code */
539 zSCode = db_text(0, "SELECT hex(subscriberCode) FROM subscriber"
540 " WHERE suname=%Q", zLogin);
541 if( zSCode && zSCode[0] ){
542 @ &nbsp;&nbsp;<a href="%R/alerts/%s(zSCode)">\
543 @ (subscription info for %h(zLogin))</a>\
544 }
545 fossil_free(zSCode);
546 }
547 @ </td></tr>
548 @ <tr>
549 @ <td class="usetupEditLabel">Contact&nbsp;Info:</td>
550 @ <td><textarea name="info" cols="40" rows="2">%h(zInfo)</textarea></td>
551 }
552 @ </tr>
553

Keyboard Shortcuts

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