1 Namespaces

(ns exam-vault.routes.home
  (:require [compojure.core :refer :all]
	    [exam-vault.views.layout :as layout]
	    [exam-vault.views.transforms :as reshape]
	    [exam-vault.models.data :as data]
	    [exam-vault.models.accessors :as collect]
	    [ring.util.response :as resp]
	    [exam-vault.models.calc :as calc]))

2 Overview

The app is divided in to three sections for the moment. A module selector on the left, a question display area on the center and a topic mark distribution that pops up on the left More details on the functionalities available here:

3 Sidebar

(defn sidebar [modules selection]
  [:nav {:id "module-selector" :class "sidebar"}
   [:ul [:li {:class "stage-selection"} [:a "Stage 3"]]
    (reshape/listify (collect/module-data modules [:code :module]) selection)]])

4 Selected Modules

(defn selected-modules [module-list] (collect/get-modules module-list))

5 Topic Map

Creates a topic map by zipping together zeroes

(defn topics-map [module]
  (let [topics (:topics module)]
    (zipmap topics (repeat 0))))

6 Display Topic

(defn display-topics [module year]
  [:aside {:class "topic-selector"}
   [:h1 (str "Topic Share in ") [:strong year]]
   (reshape/htmlize-topics (merge-with + (topics-map module) (calc/topic-map (collect/select-questions (:papers module) year))))])

7 HTMLize Module

Uses the module info and year to create the HTML representation for the sidebar.

(defn htmlize-module [mod year]
  (let [{:keys [code module papers]} mod
	years (map :year papers)]
    [:section {:class "module-view"}
     [:nav {:class "years segmented-control"} (reshape/htmlize-years code year years)]
     [:div {:class "content-area"}
      [:div {:class "scrollable-area"}
       (reshape/htmlize-papers (collect/select-questions papers year))]
      (display-topics mod year)]]))

(defn get-years [module] (map :year (:papers module)))

(defn display-modules ([module modules]
			 (let [selection (collect/select-module module modules)]
			   (display-modules module modules (str (first (get-years selection))))))
  ([module modules year]
     (let [selection (collect/select-module module modules)]
       (layout/common
	(sidebar modules module)
	(htmlize-module selection year)))))

8 Home Routes

(defroutes home-routes
  (GET "/" {cookies :cookies}
       (if (cookies "modules") (resp/redirect "/modules") (resp/redirect "/login")))
  (context "/modules" {cookies :cookies}
	   (if-let [mods (:value (cookies "modules"))]
	     (let  [module-list (clojure.string/split mods #" ")
		    modules (selected-modules module-list)
		    username (:value (cookies "name"))
		    id (:value (cookies "id"))]
	       (routes
		(GET "/" [] (display-modules (:code (first modules)) modules))
		(context "/:module" [module]
			 (GET "/" [] (display-modules module modules))
			 (GET "/:year" [year] (display-modules module modules year)))))
	     (routes
	      (GET "/*" [] (resp/redirect "/login"))))))