PasteRack.org
Paste # 14179
2014-09-01 15:37:15

Fork as a new paste.

Paste viewed 55 times.


Embed:

st.rkt

#lang web-server/insta

; TODOS
; Add conditional formlet for changing real/ideal

(require web-server/formlets
         racket/date
         "model.rkt")

(date-display-format 'iso-8601)
(define (get-date)
  (date->string (seconds->date (current-seconds)) #true))

; start: request -> response
(define (start request)
  (render-top
   (initialize-chart!
    (build-path (current-directory)
                "st-chart-data.sqlite"))
    request))

; render-st-page: entry request -> response
; consumes an entry and a request, and produces the HTML page
; of the content of the entry
(define (render-st-page a-entries a-entry request)
  (local [; new-entry-formlet : formlet (values string?)
          ; A formlet for requesting a title of an entry
          (define new-entry-formlet
            (formlet
             (#%# ,{input-string . => . title})
             (values title "Ideal" "Real" (get-date) "" (entry-id a-entry))))
          
          (define (response-generator embed/url)
            (response/xexpr
             `(html (head (title "Structural Tension")
                          (link ((rel "stylesheet")
                                 (href "/style.css")
                                 (type "text/css"))))
                    (body (h1 "Structural Tension")
                          (a ((href ,(embed/url render-top)))
                             "Back to Top")
                          ,(render-entry a-entries embed/url)
                          (form ((action
                                  ,(embed/url insert-entry-handler)))
                                ,@(formlet-display new-entry-formlet)
                                (input ([type "submit"])))))))
          
          (define (insert-entry-handler request)
            (define-values (title)
              (formlet-process new-entry-formlet request))
            (entries-insert-entry! a-entries ;fill in rest
                                   )
            (render-st-page a-entries (redirect/get)))]
    (send/suspend/dispatch response-generator)))

; render-top: request -> response
; Renders the top-level ST chart
(define (render-top a-entries request)
  (render-st-page a-entries (entries-top a-entries) request))

; render-entry: entry (handler -> string) -> response
(define (render-entry a-entry embed/url)
  `(div ((class "entry"))
        (h2 ,(entry-title a-entry))
        (h3 ,(entry-ideal a-entry))
        ,(render-steps a-entry embed/url)
        (h3 ,(entry-real a-entry))))

; render-step: entry (handler -> string) -> xexpr
(define (render-step a-entry embed/url)
  (local [(define (view-entry-handler request)
            (render-st-page a-entry request))]
    `(div ((class "step"))
          (p ,(entry-title a-entry)
             " "
             (a ((href ,(embed/url view-entry-handler)))
                "view")))))

; render-steps: entry (handler -> string) -> xexpr
(define (render-steps e embed/url)
  (local [(define (render-step/embed/url a-step)
            (render-step a-step embed/url))]
    `(div ((class "steps"))
          ,@(map render-step/embed/url (entry-children e)))))