diff --git a/src/adl/to_psql.clj b/src/adl/to_psql.clj index dd4dcf1..faf2b21 100644 --- a/src/adl/to_psql.clj +++ b/src/adl/to_psql.clj @@ -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 diff --git a/src/adl/to_selmer_templates.clj b/src/adl/to_selmer_templates.clj index 69faf38..a813092 100644 --- a/src/adl/to_selmer_templates.clj +++ b/src/adl/to_selmer_templates.clj @@ -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 %}"]})