rework views in instance domain

neo4j-4
Josha von Gizycki 5 years ago
parent 8a9c2a7a5b
commit 6d256c6d37

@ -9,16 +9,28 @@
WHERE s.uuid = {uuid} WHERE s.uuid = {uuid}
OPTIONAL MATCH OPTIONAL MATCH
(i)-[:tagged_with]->(t:tag) (i)-[:tagged_with]->(t:tag)
RETURN i, t") OPTIONAL MATCH
(i)<-[:of]-(p:property),
(p)-[:of]->(a:attribute)
RETURN i, t, p, a")
(defn flatten-grouped-rows [instance grouped-rows]
{:post [(spec/assert ::domain-instance/instance-with-tags-and-props %)]}
(assoc instance
:tags (->> grouped-rows
(map :t)
(filter some?)
distinct)
:properties (->> grouped-rows
(filter #(some? (:p %)))
(map #(assoc (:p %)
:attribute (:a %)))
distinct)))
(defn find-by-schema! [schema-uuid] (defn find-by-schema! [schema-uuid]
{:post [(spec/assert ::domain-instance/instances-with-tags %)]} {:post [(spec/assert ::domain-instance/instances-with-tags-and-props %)]}
(->> (neo4j/exec-query! findy-by-schema (->> (neo4j/exec-query! findy-by-schema
{:uuid schema-uuid}) {:uuid schema-uuid})
(group-by :i) (group-by :i)
(map #(assoc (key %) (map #(flatten-grouped-rows (key %) (val %)))
:tags (->> (val %)
(map :t)
(filter some?))))
(sort-by :name))) (sort-by :name)))
(neo4j/defquery create-instance (neo4j/defquery create-instance

@ -24,9 +24,15 @@
(spec/def ::contains-schema (spec/def ::contains-schema
(spec/keys :req-un [::db-schema/schema])) (spec/keys :req-un [::db-schema/schema]))
(spec/def ::instances-with-tags (spec/def ::instances-with-tags-and-props
(spec/coll-of (spec/merge ::instance (spec/coll-of (spec/merge ::instance
(spec/keys :req-un [::tags])))) (spec/keys :req-un [::tags
::properties]))))
(spec/def ::instance-with-tags-and-props
(spec/merge ::instance
(spec/keys :req-un [::tags
::properties])))
(spec/def ::instance-with-schema (spec/def ::instance-with-schema
(spec/merge ::instance ::contains-schema)) (spec/merge ::instance ::contains-schema))

@ -3,19 +3,21 @@
GET POST DELETE]] GET POST DELETE]]
[ring.util.response :as resp] [ring.util.response :as resp]
[formulare.core :as form] [formulare.core :as form]
[wanijo.instance [wanijo.instance.view.edit :refer [edit]]
[view :as view] [wanijo.instance.view.instances :refer [instances]]
[db :as domain] [wanijo.instance.view.show :refer [show]]
[forms :as forms-inst]] [wanijo.instance.view.link-selection :refer [link-selection]]
[wanijo.schema [wanijo.instance.view.starred :refer [starred]]
[db :as domain-schema] [wanijo.instance.db :as domain]
[middleware :as middleware-schema]] [wanijo.instance.forms :as forms-inst]
[wanijo.schema.db :as domain-schema]
[wanijo.schema.middleware :as middleware-schema]
[wanijo.link.db :as domain-link] [wanijo.link.db :as domain-link]
[wanijo.infrastructure.routing :refer [register! path]] [wanijo.infrastructure.routing :refer [register! path]]
[wanijo.attribute.db :as db-attr])) [wanijo.attribute.db :as db-attr]))
(defn list! [schema-uuid req] (defn list! [schema-uuid req]
(view/list! (domain-schema/find-by-uuid! schema-uuid) (instances (domain-schema/find-by-uuid! schema-uuid)
(domain/find-by-schema! schema-uuid) (domain/find-by-schema! schema-uuid)
(forms-inst/with-attributes (db-attr/required! schema-uuid)) (forms-inst/with-attributes (db-attr/required! schema-uuid))
req)) req))
@ -46,7 +48,7 @@
:starred :starred
(domain/is-starred! uuid (domain/is-starred! uuid
user-uuid))] user-uuid))]
(view/show! instance (show instance
(domain-schema/accessible-schemas! user-uuid) (domain-schema/accessible-schemas! user-uuid)
req))) req)))
@ -57,7 +59,7 @@
(let [instance (instance! uuid) (let [instance (instance! uuid)
attrs (db-attr/find-by-instance! uuid) attrs (db-attr/find-by-instance! uuid)
user-uuid (get-in req [:session :uuid])] user-uuid (get-in req [:session :uuid])]
(view/edit! instance (edit instance
(form! attrs) (form! attrs)
(forms-inst/instance->form-data instance) (forms-inst/instance->form-data instance)
(domain-schema/accessible-schemas! user-uuid) (domain-schema/accessible-schemas! user-uuid)
@ -74,7 +76,7 @@
(resp/redirect (path :instance-show instance))) (resp/redirect (path :instance-show instance)))
(show! uuid req)))) (show! uuid req))))
(defn delete! [uuid req] (defn delete! [uuid]
(let [schema (domain-schema/find-by-instance! uuid)] (let [schema (domain-schema/find-by-instance! uuid)]
(domain/delete! uuid) (domain/delete! uuid)
(resp/redirect (path :instance-list (resp/redirect (path :instance-list
@ -85,7 +87,7 @@
(domain/find-by-schema! schema-uuid))) (domain/find-by-schema! schema-uuid)))
(defn link-selection! [uuid schema-uuid req] (defn link-selection! [uuid schema-uuid req]
(view/link-selection (instance! uuid) (link-selection (instance! uuid)
(domain-schema/find-by-uuid! schema-uuid) (domain-schema/find-by-uuid! schema-uuid)
(link-form! schema-uuid) (link-form! schema-uuid)
req)) req))
@ -101,7 +103,7 @@
(resp/redirect (path :instance-edit-form {:uuid uuid}))) (resp/redirect (path :instance-edit-form {:uuid uuid})))
(link-selection! uuid schema-uuid req)))) (link-selection! uuid schema-uuid req))))
(defn delete-link! [uuid link-uuid req] (defn delete-link! [uuid link-uuid]
(domain-link/delete! link-uuid) (domain-link/delete! link-uuid)
(resp/redirect (path :instance-edit-form {:uuid uuid}))) (resp/redirect (path :instance-edit-form {:uuid uuid})))
@ -116,7 +118,7 @@
(resp/redirect (path :instance-show {:uuid uuid}))) (resp/redirect (path :instance-show {:uuid uuid})))
(defn list-starred! [req] (defn list-starred! [req]
(view/list-starred (starred
(domain/starred-by-user! (-> req :session :uuid)) (domain/starred-by-user! (-> req :session :uuid))
req)) req))
@ -139,8 +141,8 @@
[uuid :as req] [uuid :as req]
(edit! uuid req)) (edit! uuid req))
(DELETE (register! :instance-delete "/instance/:uuid") (DELETE (register! :instance-delete "/instance/:uuid")
[uuid :as req] [uuid]
(delete! uuid req)) (delete! uuid))
(GET (register! :instance-link-selection (GET (register! :instance-link-selection
"/instance/:uuid/link/:schema-uuid") "/instance/:uuid/link/:schema-uuid")
[uuid schema-uuid :as req] [uuid schema-uuid :as req]
@ -151,8 +153,8 @@
(create-link! uuid schema-uuid req)) (create-link! uuid schema-uuid req))
(DELETE (register! :instance-link-delete (DELETE (register! :instance-link-delete
"/instance/:uuid/link/:link-uuid") "/instance/:uuid/link/:link-uuid")
[uuid link-uuid :as req] [uuid link-uuid]
(delete-link! uuid link-uuid req)) (delete-link! uuid link-uuid))
(POST (register! :instance-mark-starred (POST (register! :instance-mark-starred
"/instance/:uuid/starred") "/instance/:uuid/starred")
[uuid :as req] [uuid :as req]

@ -1,263 +0,0 @@
(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.visualisation.viz :as viz]
[wanijo.infrastructure
[view :as view]
[routing :refer [path]]
[time :refer [prettify-dt]]]))
(defn tags-for-search [{tags :tags}]
[:span.tags-for-search
(reduce #(str %1 ":" (:name %2)) "" tags)])
(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))]
(tags-for-search 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 "☆")))
"&nbsp;"
(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-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] :as row} (:links-out instance)
:let [name (:name link)
empty (empty? name)
name (if empty [:i "empty"] (h name))]]
[:tr
[:td
name
(tags-for-search row)]
[: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] :as row} (:links-in instance)
:let [name (:name link)
empty (empty? name)
name (if empty [:i "empty"] (h name))]]
[:tr
[:td
name
(tags-for-search row)]
[: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))]])]]])
(when (seq (:tags instance))
[:section.tags
[:h2 "Tags"]
(view-tag/tag-table instance)])
[: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!"))]))

@ -0,0 +1,75 @@
(ns wanijo.instance.view.edit
(:require [hiccup.form :as hform]
[hiccup.core :refer [h]]
[ring.util.anti-forgery :refer [anti-forgery-field]]
[wanijo.infrastructure.view :as view]
[wanijo.infrastructure.routing :refer [path]]
[wanijo.infrastructure.time :refer [prettify-dt]]
[wanijo.tag.view :as view-tag]
[formulare.core :as form]))
(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))]])]]])
(when (seq (:tags instance))
[:section.tags
[:h2 "Tags"]
(view-tag/tag-table instance)])
[: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))]])]]]))

@ -0,0 +1,36 @@
(ns wanijo.instance.view.instances
(:require [hiccup.form :as hform]
[hiccup.core :refer [h]]
[formulare.core :as form]
[wanijo.instance.view.view :as view-instance]
[wanijo.infrastructure.view :as view]
[wanijo.infrastructure.routing :refer [path]]
[wanijo.infrastructure.time :refer [prettify-dt]]))
(defn instances [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))]
(view-instance/tags-for-search instance)]
[:td (prettify-dt (:updated_at instance))]
[:td (prettify-dt (:created_at instance))]])]]]))

@ -0,0 +1,21 @@
(ns wanijo.instance.view.link-selection
(:require [hiccup.form :as hform]
[hiccup.core :refer [h]]
[wanijo.infrastructure.view :as view]
[wanijo.infrastructure.routing :refer [path]]
[formulare.core :as form]))
(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!"))]))

@ -0,0 +1,126 @@
(ns wanijo.instance.view.show
(:require [hiccup.form :as hform]
[hiccup.core :refer [h]]
[ring.util.anti-forgery :refer [anti-forgery-field]]
[wanijo.infrastructure.view :as view]
[wanijo.infrastructure.routing :refer [path]]
[wanijo.infrastructure.time :refer [prettify-dt]]
[wanijo.instance.view.view :as view-instance]
[wanijo.tag.view :as view-tag]
[markdown.core :as md]
[wanijo.visualisation.viz :as viz]))
(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 "☆")))
"&nbsp;"
(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-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] :as row} (:links-out instance)
:let [name (:name link)
empty (empty? name)
name (if empty [:i "empty"] (h name))]]
[:tr
[:td
name
(view-instance/tags-for-search row)]
[: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] :as row} (:links-in instance)
:let [name (:name link)
empty (empty? name)
name (if empty [:i "empty"] (h name))]]
[:tr
[:td
name
(view-instance/tags-for-search row)]
[: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)]]]))

@ -0,0 +1,27 @@
(ns wanijo.instance.view.starred
(:require [hiccup.core :refer [h]]
[wanijo.infrastructure.view :as view]
[wanijo.infrastructure.routing :refer [path]]
[wanijo.infrastructure.time :refer [prettify-dt]]))
(defn 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))]])]]]))

@ -0,0 +1,6 @@
(ns wanijo.instance.view.view
(:require [hiccup.core :refer [h]]))
(defn tags-for-search [{tags :tags}]
[:span.tags-for-search
(reduce #(str %1 ":" (h (:name %2))) "" tags)])
Loading…
Cancel
Save