;; SX reference — defhandler definitions for attribute detail demos ;; ;; These serve the live demos on the Reference > Attributes detail pages. ;; --------------------------------------------------------------------------- ;; Shared: return server time ;; --------------------------------------------------------------------------- (defhandler ref-time (&key) (let ((now (format-time (now) "%H:%M:%S"))) (span :class "text-stone-800 text-sm" "Server time: " (strong now)))) ;; --------------------------------------------------------------------------- ;; sx-post: greet ;; --------------------------------------------------------------------------- (defhandler ref-greet (&key) (let ((name (or (form-data "name") "stranger"))) (span :class "text-stone-800 text-sm" "Hello, " (strong name) "!"))) ;; --------------------------------------------------------------------------- ;; sx-put: update status ;; --------------------------------------------------------------------------- (defhandler ref-status (&key) (let ((status (or (form-data "status") "unknown"))) (span :class "text-stone-700 text-sm" "Status: " (strong status) " — updated via PUT"))) ;; --------------------------------------------------------------------------- ;; sx-patch: update theme ;; --------------------------------------------------------------------------- (defhandler ref-theme (&key) (let ((theme (or (form-data "theme") "unknown"))) (str theme))) ;; --------------------------------------------------------------------------- ;; sx-delete: remove item ;; --------------------------------------------------------------------------- (defhandler ref-delete (&key item-id) "") ;; --------------------------------------------------------------------------- ;; sx-trigger: search ;; --------------------------------------------------------------------------- (defhandler ref-trigger-search (&key) (let ((q (or (request-arg "q") ""))) (if (empty? q) (span :class "text-stone-400 text-sm" "Start typing to trigger a search.") (span :class "text-stone-800 text-sm" "Results for: " (strong q))))) ;; --------------------------------------------------------------------------- ;; sx-swap: new item ;; --------------------------------------------------------------------------- (defhandler ref-swap-item (&key) (let ((now (format-time (now) "%H:%M:%S"))) (div :class "text-sm text-violet-700" "New item (" now ")"))) ;; --------------------------------------------------------------------------- ;; sx-swap-oob: update two targets ;; --------------------------------------------------------------------------- (defhandler ref-oob (&key) (let ((now (format-time (now) "%H:%M:%S"))) (<> (span :class "text-emerald-700 text-sm" "Main updated at " now) (div :id "ref-oob-side" :sx-swap-oob "innerHTML" (span :class "text-violet-700 text-sm" "OOB updated at " now))))) ;; --------------------------------------------------------------------------- ;; sx-select: page with multiple sections ;; --------------------------------------------------------------------------- (defhandler ref-select-page (&key) (let ((now (format-time (now) "%H:%M:%S"))) (<> (div :id "the-header" (h3 "Page header — not selected")) (div :id "the-content" (span :class "text-emerald-700 text-sm" "This fragment was selected from a larger response. Time: " now)) (div :id "the-footer" (p "Page footer — not selected"))))) ;; --------------------------------------------------------------------------- ;; sx-sync: slow echo ;; --------------------------------------------------------------------------- (defhandler ref-slow-echo (&key) (sleep 800) (let ((q (or (request-arg "q") ""))) (span :class "text-stone-800 text-sm" "Echo: " (strong q)))) ;; --------------------------------------------------------------------------- ;; sx-encoding: file upload name ;; --------------------------------------------------------------------------- (defhandler ref-upload-name (&key) (let ((name (or (file-name "file") "(no file)"))) (span :class "text-stone-800 text-sm" "Received: " (strong name)))) ;; --------------------------------------------------------------------------- ;; sx-headers: echo custom headers ;; --------------------------------------------------------------------------- (defhandler ref-echo-headers (&key) (let ((headers (request-headers :prefix "X-"))) (if (empty? headers) (span :class "text-stone-400 text-sm" "No custom headers received.") (ul :class "text-sm text-stone-700 space-y-1" (map (fn (h) (li (strong (first h)) ": " (last h))) headers))))) ;; --------------------------------------------------------------------------- ;; sx-include / sx-vals: echo all values ;; --------------------------------------------------------------------------- (defhandler ref-echo-vals (&key) (let ((vals (request-args))) (if (empty? vals) (span :class "text-stone-400 text-sm" "No values received.") (ul :class "text-sm text-stone-700 space-y-1" (map (fn (v) (li (strong (first v)) ": " (last v))) vals))))) ;; --------------------------------------------------------------------------- ;; sx-retry: flaky endpoint ;; --------------------------------------------------------------------------- (defhandler ref-flaky (&key) (let ((n (inc-counter "ref-flaky"))) (if (!= (mod n 3) 0) (error 503) (span :class "text-emerald-700 text-sm" "Success on attempt " n "!"))))