@@ -47,10 +47,11 @@
47 47 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ForumPost *pNext; /* Next in chronological order */
48 48 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ForumPost *pPrev; /* Previous in chronological order */
49 49 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ForumPost *pDisplay; /* Next in display order */
50 50 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nEdit; /* Number of edits to this post */
51 51 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nIndent; /* Number of levels of indentation for this post */
52 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int fClosed; /* tagxref.tagtype if this (sub)thread has a closed tag. */
52 53 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
53 54 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
54 55 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
55 56 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** A single instance of the following tracks all entries for a thread.
56 57 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
@@ -77,10 +78,27 @@
77 78 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_bind_int(&q, "$rid", rid);
78 79 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
res = db_step(&q)==SQLITE_ROW;
79 80 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_reset(&q);
80 81 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return res;
81 82 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
83 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
84 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
85 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Returns true if p, or any parent of p, has an active "closed" tag.
86 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Returns 0 if !p. For an edited chain of post, the tag is checked on
87 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the final edit in the chain, as that permits that a post can be
88 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** locked and later unlocked.
89 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
90 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int forum_post_is_closed(ForumPost *p){
91 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !p ) return 0;
92 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p->pEditTail ) p = p->pEditTail;
93 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p->fClosed ) return p->fClosed;
94 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ else if( p->pIrt ){
95 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return forum_post_is_closed(p->pIrt->pEditTail
96 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ? p->pIrt->pEditTail : p->pIrt);
97 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
98 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 0;
99 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
82 100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
83 101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
84 102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Delete a complete ForumThread and all its entries.
85 103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
86 104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static void forumthread_delete(ForumThread *pThread){
@@ -215,10 +233,11 @@
215 233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(; p; p=p->pEditPrev ){
216 234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->nEdit = pPost->nEdit;
217 235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->pEditTail = pPost;
218 236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
219 237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pPost->fClosed = rid_has_active_tag_name(pPost->fpid, "closed");
220 239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
221 240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_finalize(&q);
222 241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
223 242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( computeHierarchy ){
224 243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Compute the hierarchical display order */
@@ -300,13 +319,15 @@
300 319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pThread = forumthread_create(froot, 1);
301 320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_print("Chronological:\n");
302 321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_print(
303 322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* 0 1 2 3 4 5 6 7 */
304 323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123 */
305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- " sid rev fpid pIrt pEditPrev pEditTail hash\n");
324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " sid rev closed fpid pIrt pEditPrev pEditTail hash\n");
306 325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(p=pThread->pFirst; p; p=p->pNext){
307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fossil_print("%4d %4d %9d %9d %9d %9d %8.8s\n", p->sid, p->rev,
326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_print("%4d %4d %7d %9d %9d %9d %9d %8.8s\n",
327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->sid, p->rev,
328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->fClosed,
308 329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->fpid, p->pIrt ? p->pIrt->fpid : 0,
309 330 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->pEditPrev ? p->pEditPrev->fpid : 0,
310 331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->pEditTail ? p->pEditTail->fpid : 0, p->zUuid);
311 332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
312 333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_print("\nDisplay\n");
@@ -458,23 +479,25 @@
458 479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zHist; /* History query string */
459 480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Manifest *pManifest; /* Manifest comprising the current post */
460 481 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int bPrivate; /* True for posts awaiting moderation */
461 482 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int bSameUser; /* True if author is also the reader */
462 483 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iIndent; /* Indent level */
484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int fClosed; /* True if (sub)thread is closed */
463 485 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zMimetype;/* Formatting MIME type */
464 486 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
465 487 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Get the manifest for the post. Abort if not found (e.g. shunned). */
466 488 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pManifest = manifest_get(p->fpid, CFTYPE_FORUM, 0);
467 489 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !pManifest ) return;
468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
490 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fClosed = forum_post_is_closed(p);
469 491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* When not in raw mode, create the border around the post. */
470 492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !bRaw ){
471 493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Open the <div> enclosing the post. Set the class string to mark the post
472 494 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** as selected and/or obsolete. */
473 495 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
iIndent = (p->pEditHead ? p->pEditHead->nIndent : p->nIndent)-1;
474 496 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ <div id='forum%d(p->fpid)' class='forumTime\
475 497 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ %s(bSelect ? " forumSel" : "")\
498 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ %s(fClosed ? " forumClosed" : "")\
476 499 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ %s(p->pEditTail ? " forumObs" : "")' \
477 500 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( iIndent && iIndentScale ){
478 501 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ style='margin-left:%d(iIndent*iIndentScale)ex;'>
479 502 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
480 503 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ >
@@ -490,11 +513,11 @@
490 513 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** * The post is unedited
491 514 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** * The post was last edited by the original author
492 515 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** * The post was last edited by a different person
493 516 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
494 517 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( p->pEditHead ){
495 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zDate = db_text(0, "SELECT datetime(%.17g,toLocal())",
518 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zDate = db_text(0, "SELECT datetime(%.17g,toLocal())",
496 519 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->pEditHead->rDate);
497 520 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
498 521 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zPosterName = forum_post_display_name(p, pManifest);
499 522 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zEditorName = zPosterName;
500 523 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -502,11 +525,11 @@
502 525 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( p->pEditPrev ){
503 526 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zPosterName = forum_post_display_name(p->pEditHead, 0);
504 527 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zEditorName = forum_post_display_name(p, pManifest);
505 528 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zHist = bHist ? "" : zQuery[0]==0 ? "?hist" : "&hist";
506 529 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ <h3 class='forumPostHdr'>(%d(p->sid)\
507 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ .%0*d(fossil_num_digits(p->nEdit))(p->rev)) \
530 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ .%0*d(fossil_num_digits(p->nEdit))(p->rev))
508 531 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( fossil_strcmp(zPosterName, zEditorName)==0 ){
509 532 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ By %s(zPosterName) on %h(zDate) edited from \
510 533 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ %z(href("%R/forumpost/%S%s%s",p->pEditPrev->zUuid,zQuery,zHist))\
511 534 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ %d(p->sid).%0*d(fossil_num_digits(p->nEdit))(p->pEditPrev->rev)</a>
512 535 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
@@ -515,11 +538,11 @@
515 538 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ %z(href("%R/forumpost/%S%s%s",p->pEditPrev->zUuid,zQuery,zHist))\
516 539 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ %d(p->sid).%0*d(fossil_num_digits(p->nEdit))(p->pEditPrev->rev)</a>
517 540 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
518 541 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
519 542 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zPosterName = forum_post_display_name(p, pManifest);
520 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ <h3 class='forumPostHdr'>(%d(p->sid)) \
543 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <h3 class='forumPostHdr'>(%d(p->sid))
521 544 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ By %s(zPosterName) on %h(zDate)
522 545 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
523 546 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_free(zDate);
524 547 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
525 548 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -581,15 +604,22 @@
581 604 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** edited, create a form with various interaction buttons. */
582 605 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( g.perm.WrForum && !p->pEditTail ){
583 606 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ <div><form action="%R/forumedit" method="POST">
584 607 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ <input type="hidden" name="fpid" value="%s(p->zUuid)">
585 608 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !bPrivate ){
586 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Reply and Edit are only available if the post has been approved. */
587 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ <input type="submit" name="reply" value="Reply">
588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( g.perm.Admin || bSameUser ){
589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ <input type="submit" name="edit" value="Edit">
590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ <input type="submit" name="nullout" value="Delete">
609 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Reply and Edit are only available if the post has been
610 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** approved. Closed threads can only be edited or replied to
611 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** by an admin but a user may delete their own posts even if
612 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** they are closed. */
613 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( g.perm.Admin || !fClosed ){
614 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <input type="submit" name="reply" value="Reply">
615 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( g.perm.Admin || (bSameUser && !fClosed) ){
616 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <input type="submit" name="edit" value="Edit">
617 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
618 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( g.perm.Admin || bSameUser ){
619 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <input type="submit" name="nullout" value="Delete">
620 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
591 621 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
592 622 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( g.perm.ModForum ){
593 623 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Allow moderators to approve or reject pending posts. Also allow
594 624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** forum supervisors to mark non-special users as trusted and therefore
595 625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** able to post unmoderated. */
596 626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!