commit cd2633e28a3445cdd51f1df19bab033e8f874f51
parent 55b507cdf8d001930076bc350e0a2956383ac6d4
Author: Natasha Kerensikova <natgh@instinctive.eu>
Date: Thu, 14 May 2026 18:56:35 +0000
Feed updates are reported in gruik push response
Diffstat:
| M | src/cgi.scm | | | 52 | +++++++++++++++++++++++++++++++++++++++++++++------- |
1 file changed, 45 insertions(+), 7 deletions(-)
diff --git a/src/cgi.scm b/src/cgi.scm
@@ -736,19 +736,57 @@ END-OF-CSS
(define (fragment-diff-sel-counts before after)
(let ((diff (diff-sel-counts before after)))
(if (null? diff) '()
+ `((table
+ ,@(map (lambda (line)
+ (cons 'tr (map (lambda (v) (list 'td (->string v))) line)))
+ diff))))))
+
+(define (feed-sig-base)
+ (query (map-rows (lambda (row) (append row (build-signature (caddr row)))))
+ (sql db "SELECT id,title,selector FROM feed WHERE active=1;")))
+(define (fragment-sig-diff id title diff)
+ `((p ,(conc "Feed #" id ": " title))
+ (ul ,@(map (lambda (hunk) (cond
+ ((eqv? (car hunk) 'add)
+ `(li ,(conc "added item #" (cadr hunk)
+ " at " (rfc-3339 (caddr hunk)))))
+ ((eqv? (car hunk) 'del)
+ `(li ,(conc "removed item #" (cadr hunk)
+ " at " (rfc-3339 (caddr hunk)))))
+ ((eqv? (car hunk) 'chg)
+ `(li ,(conc "updated item #" (cadr hunk)
+ " from " (rfc-3339 (caddr hunk))
+ " to " (rfc-3339 (cadddr hunk)))))
+ (else `(li ,(conc "malformed hunk: " hunk)))))
+ diff))))
+(define (fragment-diff-feed* base-sig)
+ (let ((id (car base-sig))
+ (title (cadr base-sig))
+ (selector (caddr base-sig))
+ (old-sig (cdddr base-sig)))
+ (let ((diff (diff-signature old-sig (build-signature selector))))
+ (if (null? diff)
+ '()
+ (fragment-sig-diff id title diff)))))
+(define (fragment-diff-feed base-sigs)
+ (join (map fragment-diff-feed* base-sigs)))
+
+(define (fragment-push-report frag-diff-sel frag-diff-sig)
+ (if (and (null? frag-diff-sel) (null? frag-diff-sig))
+ '()
`(form
- (table (@ (class "form-body"))
- ,@(map (lambda (line)
- (cons 'tr (map (lambda (v) (list 'td (->string v))) line)))
- diff))
+ (div (@ (class "form-body")) ,@frag-diff-sel ,@frag-diff-sig)
(button (@ (class rsub) (onclick "this.closest('form').remove()"))
- "Dismiss")))))
+ "Dismiss"))))
(define (htmx-push-gruik id)
- (let ((before (db-sel-counts)))
+ (let ((before (db-sel-counts))
+ (base-sigs (feed-sig-base)))
(db-push-gruik id)
(htmx-output
- (fragment-diff-sel-counts before (db-sel-counts)))))
+ (fragment-push-report
+ (fragment-diff-sel-counts before (db-sel-counts))
+ (fragment-diff-feed base-sigs)))))
(define (xdo-edit)
(let ((id (db-edit)))