Permalink
Browse files

Added most of the support for adding a project to my projects list. I…

… still need to add the code to put the forms contents into the data store, but I'm learning as I go. I also need to put in some sort of authorization system at some point, right now anyone who uses this will be able to add projects if they want to, it is security by obscurity. On a brighter note, I'm learning a lot about how to use enlive!
  • Loading branch information...
1 parent 707faac commit ac7cfb229a423169a83055fd5dfca685df2ec80d @jColeChanged committed Nov 23, 2010
Showing with 63 additions and 15 deletions.
  1. +2 −1 project.clj
  2. +41 −6 src/mysite/core.clj
  3. +20 −8 src/mysite/projects/add.html
View
@@ -4,7 +4,8 @@
[org.clojure/clojure-contrib "1.2.0"]
[compojure "0.5.3"]
[ring/ring-jetty-adapter "0.3.1"]
- [enlive "1.0.0-SNAPSHOT"]]
+ [enlive "1.0.0-SNAPSHOT"]
+ [pour "0.1.0"]]
:dev-dependencies [[appengine-magic "0.3.0-SNAPSHOT"]
[swank-clojure "1.2.1"]]
:namespaces [mysite.app_servlet])
View
@@ -1,21 +1,56 @@
(ns mysite.core
- (:use compojure.core)
+ (:use compojure.core, ring.middleware.keyword-params, ring.middleware.params,
+ ring.util.response, pour.core, pour.validators)
(:require [net.cgrand.enlive-html :as html])
(:require [appengine-magic.core :as ae]))
+;; Forms
+(defform add-project-form
+ :title [required "Title is required."]
+ :pitch [required "Pitch is required."]
+ :details [required "Details are required."]
+ :priority [required "A priority is required."
+ an-integer "The priority must be an integer."])
+
+(defn set-input
+ [id form]
+ (html/set-attr :value (str (id (:values form)))))
+
+(defn set-error
+ [id form]
+ (html/html-content (id (:errors form))))
+
;; Templates
-(html/deftemplate add-project "mysite/projects/add.html" [] [] [])
+(html/deftemplate add-project-template "mysite/projects/add.html"
+ [form-data]
+ [:div#title :input] (set-input :title form-data)
+ [:div#title :p] (set-error :title form-data)
+ [:div#pitch :input] (set-input :pitch form-data)
+ [:div#pitch :p] (set-error :pitch form-data)
+ [:div#details :textarea] (html/html-content (:details (:values form-data)))
+ [:div#details :p] (set-error :details form-data)
+ [:div#priority :input] (set-input :priority form-data)
+ [:div#priority :p] (set-error :priority form-data))
+
(defn show-project
- [request]
- (str request))
+ [params]
+ (let [form-data (add-project-form params)]
+ (if (empty? (:errors form-data))
+ (redirect "/projects/list/")
+ (add-project-template form-data))))
(defroutes mysite-app-handler
- (GET "/projects/add/" [] (add-project))
- (POST "/projects/add/" [] show-project)
+ (GET "/projects/add/" [] (add-project-template 0))
+ (POST "/projects/add/" {params :params} (show-project params))
(GET "*" req
{:status 200
:headers {"Content-Type" "text/plain"}
:body "making changes live*"}))
+(def mysite-app-handler
+ (-> mysite-app-handler
+ wrap-params
+ wrap-keyword-params
+ wrap-params))
(ae/def-appengine-app mysite-app #'mysite-app-handler)
@@ -4,14 +4,26 @@
<body>
<h1>Add a project</h1>
<form method="POST" action="/projects/add/">
- <label for="title">Title</label><br />
- <input name="title" type="text"></input><br />
- <label for="pitch">Pitch</label><br />
- <input name="pitch" type="text"></input><br />
- <label for="details">Details</label><br />
- <textarea name="details" rows="10" cols="80"></textarea><br />
- <label for="priority">Priority</label><br />
- <input name="priority" type="text"></input><br />
+ <div id="title">
+ <label for="title">Title</label><br />
+ <input name="title" type="text"></input>
+ <p class="error"></p>
+ </div>
+ <div id="pitch">
+ <label for="pitch">Pitch</label><br />
+ <input name="pitch" type="text"></input><br />
+ <p class="error"></p>
+ </div>
+ <div id="details">
+ <label for="details">Details</label><br />
+ <textarea id="details" name="details" rows="10" cols="80"></textarea><br />
+ <p class="error"></p>
+ </div>
+ <div id="priority">
+ <label for="priority">Priority</label><br />
+ <input id="priority" name="priority" type="text"></input><br />
+ <p class="error"></p>
+ </div>
<input type="submit" value="Add project"></input>
</form>
<body>

0 comments on commit ac7cfb2

Please sign in to comment.