diff --git a/src/sb/app/board/data.cljc b/src/sb/app/board/data.cljc index 9b48c94a..e40adffa 100644 --- a/src/sb/app/board/data.cljc +++ b/src/sb/app/board/data.cljc @@ -70,7 +70,7 @@ (? :entity/social-feed) (? :entity/deleted-at) (? :entity/created-by) - + (? :entity/uploads) (? :board/custom-css) (? :board/custom-js) (? :board/home-page-message) @@ -130,6 +130,7 @@ :membership/roles]) (def project-fields `[~@entity.data/listing-fields + :entity/field-entries {:entity/video [:video/url]} {:entity/parent [:entity/id]} {:membership/_entity [~@entity.data/id-fields diff --git a/src/sb/app/collection/data.cljc b/src/sb/app/collection/data.cljc index b9094142..1f1a0adb 100644 --- a/src/sb/app/collection/data.cljc +++ b/src/sb/app/collection/data.cljc @@ -8,6 +8,7 @@ :entity/kind :collection/boards :entity/title + (? :entity/uploads) (? :entity/domain-name) (? :image/avatar) (? :image/background)]}}) \ No newline at end of file diff --git a/src/sb/app/entity/data.cljc b/src/sb/app/entity/data.cljc index b9842482..aeb6cd2e 100644 --- a/src/sb/app/entity/data.cljc +++ b/src/sb/app/entity/data.cljc @@ -66,6 +66,7 @@ :entity/website {:doc "External website for entity" s- :http/url} :entity/social-feed {s- :social/feed} + :entity/uploads (sch/ref :many) :entity/images {s- [:map-of [:qualified-keyword {:namespace :image}] :http/url]} diff --git a/src/sb/app/field/ui.cljc b/src/sb/app/field/ui.cljc index 2d8fede0..cc078847 100644 --- a/src/sb/app/field/ui.cljc +++ b/src/sb/app/field/ui.cljc @@ -624,9 +624,13 @@ :field.type/prose [prose-field ?entry props] (str "no match" field)))) -(defn show-image-list:card [{:keys [image-list/images]}] - (when-let [{:keys [entity/id]} (first images)] - [:img.max-h-80 {:src (asset.ui/asset-src id :card)}])) +(defn show-image-list:card [field {:keys [image-list/images]}] + (when-let [image (first images)] + [:img.max-h-80 {:src (asset.ui/asset-src image :card)}])) + +(comment + (sb.server.datalevin/entity [:entity/id #uuid "b30e4733-0c90-3491-be07-99af22250f92"]) + (sch/kind #uuid "b30e4733-0c90-3491-be07-99af22250f92")) (ui/defview show-prose:card [field {:as m :prose/keys [format string]}] (when-not (str/blank? string) diff --git a/src/sb/app/membership/data.cljc b/src/sb/app/membership/data.cljc index e9fc25c2..354f91d8 100644 --- a/src/sb/app/membership/data.cljc +++ b/src/sb/app/membership/data.cljc @@ -54,7 +54,7 @@ :entity/kind :membership/entity :membership/member - + (? :entity/uploads) (? :membership/inactive?) (? :membership/email-frequency) (? :entity/custom-tags) diff --git a/src/sb/app/org/data.cljc b/src/sb/app/org/data.cljc index 823f7708..7824e550 100644 --- a/src/sb/app/org/data.cljc +++ b/src/sb/app/org/data.cljc @@ -19,6 +19,7 @@ :entity/title :entity/kind :entity/created-by + (? :entity/uploads) (? :image/avatar) (? :image/background) (? :image/sub-header) diff --git a/src/sb/app/project/data.cljc b/src/sb/app/project/data.cljc index 7851e7b0..106c0c77 100644 --- a/src/sb/app/project/data.cljc +++ b/src/sb/app/project/data.cljc @@ -46,6 +46,7 @@ :entity/parent :entity/title :entity/created-at + (? :entity/uploads) (? :entity/updated-at) (? :entity/draft?) (? :entity/archived?) diff --git a/src/sb/app/project/ui.cljc b/src/sb/app/project/ui.cljc index fb4c7ffd..04a14414 100644 --- a/src/sb/app/project/ui.cljc +++ b/src/sb/app/project/ui.cljc @@ -203,17 +203,19 @@ {:as entity :keys [entity/parent entity/title + entity/description entity/field-entries membership/roles]}] (let [board-members (->> (:membership/_entity entity) (mapv :membership/member))] [:a.flex-v.hover:bg-gray-100.rounded-lg.bg-slate-100.py-3.gap-3. {:href (routing/entity-path entity 'ui/show)} - [:div.flex.relative.gap-3.items-start.px-3.cursor-default.flex-auto [:div.flex-grow.flex-v.gap-1 [:div.leading-snug.line-clamp-2.font-semibold.text-lg title] - [:div.text-gray-500.contents (field.ui/show-entries project-fields field-entries)]]] + [:div.text-gray-500 description] + [:div.text-gray-500.contents + (field.ui/show-entries project-fields field-entries)]]] ;; TEAM [:div.flex.flex-wrap.gap-2.px-3 diff --git a/src/sb/build.clj b/src/sb/build.clj index c16c7271..feda1b8c 100644 --- a/src/sb/build.clj +++ b/src/sb/build.clj @@ -7,7 +7,8 @@ [sb.migrate.one-time :as one-time] [sb.routing :as routing] [sb.server.core] - [sb.transit :as t])) + [sb.transit :as t] + [sb.util :as u])) (comment (require '[shadow.cljs.devtools.api :as shadow]) diff --git a/src/sb/migrate/one_time.clj b/src/sb/migrate/one_time.clj index 334b9afc..442d3313 100644 --- a/src/sb/migrate/one_time.clj +++ b/src/sb/migrate/one_time.clj @@ -450,8 +450,6 @@ (re-find #"youtube" v) v :else (str "https://www.youtube.com/watch?v=" v)))) -(def ^:dynamic *assets* nil) - (defn parse-fields [managed-by-k to-k] (fn [m] (if-some [field-ks (->> (keys m) @@ -460,30 +458,32 @@ (let [managed-by (managed-by-k m)] (try (reduce (fn [m k] - (let [field-id (composite-uuid :field - (to-uuid :board managed-by) - (to-uuid :field (subs (name k) 6))) - v (m k) - field-type (:field/type (@!all-fields field-id)) + (let [field-id (composite-uuid :field + (to-uuid :board managed-by) + (to-uuid :field (subs (name k) 6))) + v (m k) + field-type (:field/type (@!all-fields field-id)) + image-list-assets (when (= field-type :field.type/image-list) + (mapv assets/link-asset (cond-> v (string? v) vector))) ;; NOTE - we ignore fields that do not have a spec - entry-value (when field-type - (case field-type - :field.type/image-list (let [v (cond-> v (string? v) vector)] - (when (seq v) - (let [assets (mapv assets/link-asset v)] - (some-> *assets* (swap! into assets)) - {:image-list/images (mapv #(select-keys % [:entity/id]) assets)}))) - :field.type/link-list {:link-list/links - (mapv #(rename-keys % {:label :link/label - :url :link/url}) v)} - :field.type/select {:select/value v} - :field.type/prose (prose v) - :field.type/video {:video/url (video-url v)} - (throw (Exception. (str "Field type not found " - {:field/type field-type - :field-spec/id field-id - })))))] + entry-value (when field-type + (case field-type + :field.type/image-list (when (seq image-list-assets) + {:image-list/images (mapv #(select-keys % [:entity/id]) + image-list-assets)}) + :field.type/link-list {:link-list/links + (mapv #(rename-keys % {:label :link/label + :url :link/url}) v)} + :field.type/select {:select/value v} + :field.type/prose (prose v) + :field.type/video {:video/url (video-url v)} + (throw (Exception. (str "Field type not found " + {:field/type field-type + :field-spec/id field-id + })))))] (-> (dissoc m k) + (cond-> (seq image-list-assets) + (update :entity/uploads (fnil into []) image-list-assets)) (cond-> entry-value (assoc-in [to-k field-id] entry-value))))) m @@ -1268,11 +1268,9 @@ (defn all-entities "Flat list of all entities (no inline nesting)" [] - (binding [*assets* (atom [])] - (let [entities (into [] - (flatten-entities-xf) - (root-entities))] - (into entities @*assets*)))) + (into [] + (flatten-entities-xf) + (root-entities))) (defn contains-somewhere? "Deep walk of a data structure to see if `v` exists anywhere inside it (via =)" diff --git a/src/sb/server/assets.clj b/src/sb/server/assets.clj index 397c5b4e..69ea8305 100644 --- a/src/sb/server/assets.clj +++ b/src/sb/server/assets.clj @@ -2,15 +2,13 @@ (:require [amazonica.aws.s3 :as s3] [clj-http.client :as http] [clojure.java.io :as io] - [ring.util.response :as resp] - [sb.authorize :as az] + [re-db.api :as db] [sb.server.datalevin :as dl] [sb.server.env :as env] [sb.server.images :as images] [sb.util :as u] [sb.validate :as sv] - [sb.validate :as validate] - [re-db.api :as db])) + [sb.validate :as validate])) (defn init-db! "Ensure current bucket is in the db" @@ -117,8 +115,7 @@ (or (dl/entity lookup-ref) (do (dl/transact! [(-> #:asset.variant{:provider (:db/id provider) :params param-string} - (validate/assert :asset.variant/as-map) - (assoc :db/id -1))]) + (validate/assert :asset.variant/as-map))]) (dl/entity lookup-ref))))) (defn ensure-content-type! @@ -144,7 +141,8 @@ (case (:asset.provider/type provider) :asset.provider/s3 (str (:s3/bucket-host provider) "/" - (:entity/id asset)))) + (:entity/id asset)) + (throw (ex-info "Unknown provider" {:provider provider :asset (datalevin.core/touch asset)})))) (defn asset-link [asset] (or (:asset/link asset) @@ -185,6 +183,9 @@ (variant-link asset variant))))) (comment - (variant-link! (datalevin.core/entity @(re-db.api/conn) [:entity/id #uuid "b3665e87-4be8-301d-94e3-4417038ed016"]) - {:op "bound" :width 200 :height 200} - )) + (let [entity-id [:entity/id #uuid"b30e4733-0c90-3491-be07-99af22250f92"] + profile-pic [:entity/id #uuid "b3665e87-4be8-301d-94e3-4417038ed016"]] + #_(variant-link! (datalevin.core/entity @(re-db.api/conn) entitiy-id) + {:op "bound" :width 200 :height 200} + ) + (datalevin.core/touch (datalevin.core/entity @(re-db.api/conn) entity-id))))