Added drill-down in lists.

This commit is contained in:
Simon Brooke 2018-06-16 10:34:05 +01:00
parent e879b8b628
commit 40fc3a99cc
2 changed files with 88 additions and 65 deletions

View file

@ -281,7 +281,8 @@
" ||', '|| "
(compose-convenience-entity-field field entity application))
" AS "
(field-name field)))
(field-name field)
"_expanded"))
(defn emit-convenience-view
@ -290,59 +291,62 @@
[entity application]
(let [view-name (safe-name (str "lv_" (:table (:attrs entity))) :sql)
entity-fields (filter
#(= (:type (:attrs %)) "entity")
(properties entity))]
#(= (:type (:attrs %)) "entity")
(properties entity))]
(s/join
"\n"
(remove
nil?
(flatten
(list
(emit-header
"--"
(str "convenience view " view-name " of entity " (:name (:attrs entity)) " for lists, et cetera"))
(s/join
" "
(list "CREATE VIEW" view-name "AS"))
(str
"SELECT "
(s/join
",\n\t"
(map
#(if
(= (:type (:attrs %)) "entity")
(emit-convenience-entity-field % entity application)
(str (safe-name entity) "." (field-name %)))
(filter
#(not (= (:type (:attrs %)) "link"))
(all-properties entity) ))))
(str
"FROM " (s/join ", " (set (compose-convenience-view-select-list entity application true))))
(if
(not (empty? entity-fields))
(str
"WHERE "
(s/join
"\n\tAND "
(map
(fn [f]
(let
[farside (child
application
#(and
(entity? %)
(= (:name (:attrs %)) (:entity (:attrs f)))))]
(str
(safe-name (:table (:attrs entity)) :sql)
"."
(field-name f)
" = "
(safe-name (:table (:attrs farside)) :sql)
"."
(safe-name (first (key-names farside)) :sql))))
entity-fields))))
";"
(emit-permissions-grant view-name :SELECT (permissions entity application))))))))
"\n"
(remove
nil?
(flatten
(list
(emit-header
"--"
(str "convenience view " view-name " of entity " (:name (:attrs entity)) " for lists, et cetera"))
(s/join
" "
(list "CREATE VIEW" view-name "AS"))
(str
"SELECT "
(s/join
",\n\t"
(flatten
(map
#(if
(= (:type (:attrs %)) "entity")
(list
(emit-convenience-entity-field % entity application)
(str (safe-name entity) "." (field-name %)))
(str (safe-name entity) "." (field-name %)))
(filter
#(not (= (:type (:attrs %)) "link"))
(all-properties entity) )))))
(str
"FROM " (s/join ", " (set (compose-convenience-view-select-list entity application true))))
(if
(not (empty? entity-fields))
(str
"WHERE "
(s/join
"\n\tAND "
(map
(fn [f]
(let
[farside (child
application
#(and
(entity? %)
(= (:name (:attrs %)) (:entity (:attrs f)))))]
(str
(safe-name (:table (:attrs entity)) :sql)
"."
(field-name f)
" = "
(safe-name (:table (:attrs farside)) :sql)
"."
(safe-name (first (key-names farside)) :sql))))
entity-fields))))
";"
(emit-permissions-grant view-name :SELECT (permissions entity application))))))))
(defn emit-referential-integrity-link

View file

@ -362,6 +362,7 @@
taken from this `application`. If `page` is nil, generate a default page
template for the entity."
[page entity application]
;; TODO
)
@ -416,7 +417,21 @@
:value "Search"}}]})))}]})
(defn- list-tbody
(defn edit-link
[entity application parameters]
(str
(editor-name entity application)
"?"
(s/join
"&"
(map
#(let [n (:name (:attrs %1))]
(str n "={{ record." %2 " }}"))
(key-names entity)
parameters))))
(defn list-tbody
"Return a table body element for the list view for this `list-spec` of this `entity` within
this `application`."
[list-spec entity application]
@ -430,22 +445,26 @@
(concat
(map
(fn [field]
{:tag :td :content [(str "{{ record." (:property (:attrs field)) " }}")]})
{:tag :td :content
(let
[p (first (filter #(= (:name (:attrs %)) (:property (:attrs field))) (all-properties entity)))
e (first
(filter
#(= (:name (:attrs %)) (:entity (:attrs p)))
(children-with-tag application :entity)))
c (str "{{ record." (:property (:attrs field)) " }}")]
(if
(= (:type (:attrs p)) "entity")
[{:tag :a
:attrs {:href (edit-link e application (list (:name (:attrs p))))}
:content [(str "{{ record." (:property (:attrs field)) "_expanded }}")]}]
[c]))})
(fields list-spec))
[{:tag :td
:content
[{:tag :a
:attrs
{:href
(str
(editor-name entity application)
"?"
(s/join
"&"
(map
#(let [n (:name (:attrs %))]
(str n "={{ record." n "}}"))
(children (first (filter #(= (:tag %) :key) (children entity)))))))}
{:href (edit-link entity application (key-names entity))}
:content ["View"]}]}]))}
"{% endfor %}"]})