Table of Contents
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"))))))