You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
wanijo/src/wanijo/instance/view.clj

252 lines
8.6 KiB

(ns wanijo.instance.view
(:require [hiccup
[form :as hform]
[core :refer [h]]]
[ring.util.anti-forgery :refer [anti-forgery-field]]
[markdown.core :as md]
[formulare.core :as form]
[wanijo.tag.view :as view-tag]
[wanijo.instance.domain :as domain]
[wanijo.visualisation.viz :as viz]
[wanijo.framework
[view :as view]
[routing :refer [path]]
[time :refer [prettify-dt]]]))
(defn list! [schema instances new-form req]
(view/layout!
:request req
:content
[[:h1 "All Instances of schema "
[:span.schema-title__name (h (:name schema))]]
[:h1 "New Instance"]
(hform/form-to [:post (path :instance-new)]
(form/render-widgets new-form {} req)
(hform/hidden-field "schema-uuid"
(:uuid schema))
(hform/submit-button "Create!"))
[:table
[:thead
[:tr
[:th "Name"]
[:th "Updated"]
[:th "Created"]]]
[:tbody
(for [instance instances]
[:tr
[:td
[:a {:href (path :instance-show instance)}
(h (:name instance))]]
[:td (prettify-dt (:updated_at instance))]
[:td (prettify-dt (:created_at instance))]])]]]))
(defn list-starred [instances req]
(view/layout!
:request req
:content
[[:h1 "Starred instances"]
[:table
[:thead
[:tr
[:th "Name"]
[:th "Starred"]
[:th "Updated"]
[:th "Created"]]]
[:tbody
(for [instance instances]
[:tr
[:td
[:a {:href (path :instance-show instance)}
(h (:name instance))]]
[:td (prettify-dt (:starred_at instance))]
[:td (prettify-dt (:updated_at instance))]
[:td (prettify-dt (:created_at instance))]])]]]))
(defn show! [instance schemas req]
(view/layout!
:request req
:content
[[:h1
(if (:starred instance)
(hform/form-to {:class "inline"}
[:delete (path :instance-mark-starred instance)]
(anti-forgery-field)
(hform/submit-button "★"))
(hform/form-to {:class "inline"}
[:post (path :instance-mark-starred instance)]
(anti-forgery-field)
(hform/submit-button "☆")))
" "
(h (-> instance :schema :name))
" "
[:small (h (:name instance))]]
[:p [:small
[:a {:href (path :instance-list
{:schema-uuid (-> instance :schema :uuid)})}
"Back to List"]
" | "
[:a {:href (path :instance-edit-form instance)}
"Edit Instance"]
" | "
[:a {:href (path :vis-explore {:instance-uuid (:uuid instance)})}
"Explore from here"]]]
(when (seq (:tags instance))
[:section.tags
(view-tag/tag-list (:tags instance))])
(when (seq (:properties instance))
[:section.properties
[:h2 "Properties"]
(for [prop (:properties instance)
:let [attr (:attribute prop)
type (:type attr)
render-fn (case type
"date" #(str (prettify-dt %))
"markdown" md/md-to-html-string
#(str "<p>" % "</p>"))]]
(list [:h3 (h (:name attr))]
[:div {:class (str "instance-content "
"attr-type-" type)}
(render-fn (:value prop))]))])
(when (or (seq (:links-out instance))
(seq (:links-in instance)))
[:section.visualisation
[:h2 "Visualisation"]
[:p (viz/single-instance instance)]])
(when (seq (:links-out instance))
[:section.links-out
[:h2 "Outgoing Links"]
[:table
[:thead
[:tr
[:th "Name"]
[:th "Instance"]
[:th "Schema"]
[:th "Created"]]]
[:tbody
(for [{:keys [link target schema]} (:links-out instance)
:let [name (:name link)
empty (empty? name)
name (if empty [:i "empty"] (h name))]]
[:tr
[:td name]
[:td [:a {:href (path :instance-show target)}
(h (:name target))]]
[:td [:a {:href (path :instance-list
{:schema-uuid (:uuid schema)})}
(h (:name schema))]]
[:td (prettify-dt (:created_at link))]])]]])
(when (seq (:links-in instance))
[:section.links-in
[:h2 "Incoming Links"]
[:table
[:thead
[:tr
[:th "Name"]
[:th "Instance"]
[:th "Schema"]
[:th "Created"]]]
[:tbody
(for [{:keys [link source schema]} (:links-in instance)
:let [name (:name link)
empty (empty? name)
name (if empty [:i "empty"] (h name))]]
[:tr
[:td name]
[:td [:a {:href (path :instance-show source)}
(h (:name source))]]
[:td [:a {:href (path :instance-list
{:schema-uuid (:uuid schema)})}
(h (:name schema))]]
[:td (prettify-dt (:created_at link))]])]]])
[:section.quick-edits
[:h2 "Quick edits"]
[:section.link-instance
[:h3 "Link Instance with Instance of Schema..."]
[:ul
(for [schema schemas]
[:li
[:a {:href (path :instance-link-selection
{:uuid (:uuid instance)
:schema-uuid (:uuid schema)})}
(h (:name schema))]])]]
[:section.tag-instance
[:h3 "Add or create Tags"]
(view-tag/new-tag-form instance)]]]))
(defn edit! [instance form form-data schemas req]
(view/layout!
:request req
:content
[[:h1
(h (-> instance :schema :name))
"&nbsp;"
[:small (h (:name instance))]]
[:p [:small
[:a {:href (path :instance-list
{:schema-uuid (-> instance :schema :uuid)})}
"Back to List"]
" | "
[:a {:href (path :instance-show instance)}
"Back to Instance"]]]
[:section.edit-instance
[:h2 "Edit Instance"]
(hform/form-to [:post (path :instance-edit instance)]
(form/render-widgets form form-data req)
(hform/submit-button "Edit!"))
(hform/form-to [:delete (path :instance-delete instance)]
(anti-forgery-field)
(view/delete-btn))]
(when (seq (:links-out instance))
[:section.links-out
[:h2 "Outgoing Links"]
[:table
[:thead
[:tr
[:th "Name"]
[:th "Instance"]
[:th "Schema"]
[:th "Created"]
[:th]]]
[:tbody
(for [{:keys [link target schema]} (:links-out instance)
:let [name (:name link)
empty (empty? name)
name (if empty [:i "empty"] (h name))]]
[:tr
[:td name]
[:td [:a {:href (path :instance-show target)}
(h (:name target))]]
[:td [:a {:href (path :instance-list
{:schema-uuid (:uuid schema)})}
(h (:name schema))]]
[:td (prettify-dt (:created_at link))]
[:td (hform/form-to [:delete (path :instance-link-delete
{:uuid (:uuid instance)
:link-uuid (:uuid link)})]
(anti-forgery-field)
(view/delete-btn))]])]]])
[:section.link-instance
[:h2 "Link Instance with Instance of Schema..."]
[:ul
(for [schema schemas]
[:li
[:a {:href (path :instance-link-selection
{:uuid (:uuid instance)
:schema-uuid (:uuid schema)})}
(h (:name schema))]])]]]))
(defn link-selection [instance schema form req]
(view/layout!
:request req
:content
[[:h1
[:small "Link " (-> instance :schema :name) " "]
(h (:name instance))
[:small " with "]
(h (:name schema))]
(hform/form-to [:post (path :instance-link-create
{:uuid (:uuid instance)
:schema-uuid (:uuid schema)})]
(form/render-widgets form nil req)
(hform/submit-button "Link!"))]))