diff --git a/backend/src/app/services/queries/files.clj b/backend/src/app/services/queries/files.clj index 0aa6b134d2..8fa7106ec0 100644 --- a/backend/src/app/services/queries/files.clj +++ b/backend/src/app/services/queries/files.clj @@ -247,6 +247,7 @@ (def ^:private sql:file-libraries "select fl.*, + ? as is_indirect, flr.synced_at as synced_at from file as fl inner join file_library_rel as flr on (flr.library_file_id = fl.id) @@ -254,8 +255,23 @@ and fl.deleted_at is null") (defn retrieve-file-libraries - [conn file-id] - (into [] decode-row-xf (db/exec! conn [sql:file-libraries file-id]))) + [conn is-indirect file-id] + (let [direct-libraries + (into [] decode-row-xf (db/exec! conn [sql:file-libraries is-indirect file-id])) + + select-distinct + (fn [used-libraries new-libraries] + (remove (fn [new-library] + (some #(= (:id %) (:id new-library)) used-libraries)) + new-libraries))] + + (reduce (fn [used-libraries library] + (concat used-libraries + (select-distinct + used-libraries + (retrieve-file-libraries conn true (:id library))))) + direct-libraries + direct-libraries))) (s/def ::file-libraries (s/keys :req-un [::profile-id ::file-id])) @@ -264,7 +280,7 @@ [{:keys [profile-id file-id] :as params}] (db/with-atomic [conn db/pool] (check-edition-permissions! conn profile-id file-id) - (retrieve-file-libraries conn file-id))) + (retrieve-file-libraries conn false file-id))) ;; --- Query: Single File Library diff --git a/common/app/common/data.cljc b/common/app/common/data.cljc index c938e0b757..3034e369b5 100644 --- a/common/app/common/data.cljc +++ b/common/app/common/data.cljc @@ -136,6 +136,16 @@ [mfn coll] (into {} (map (fn [[key val]] [key (mfn key val)]) coll))) +(defn filterm + "Filter values of a map that satisfy a predicate" + [pred coll] + (into {} (filter pred coll))) + +(defn removem + "Remove values of a map that satisfy a predicate" + [pred coll] + (into {} (remove pred coll))) + (defn map-perm "Maps a function to each pair of values that can be combined inside the function without repetition. diff --git a/frontend/src/app/main/ui/workspace/libraries.cljs b/frontend/src/app/main/ui/workspace/libraries.cljs index 1b22620817..8138379361 100644 --- a/frontend/src/app/main/ui/workspace/libraries.cljs +++ b/frontend/src/app/main/ui/workspace/libraries.cljs @@ -7,6 +7,7 @@ (ns app.main.ui.workspace.libraries (:require + [app.common.data :as d] [rumext.alpha :as mf] [cuerdas.core :as str] [okulary.core :as l] @@ -142,7 +143,6 @@ :value (tr "workspace.libraries.update") :on-click #(update-library (:id library))}]])]])])) - (mf/defc libraries-dialog {::mf/register modal/components ::mf/register-as :libraries-dialog} @@ -152,7 +152,9 @@ locale (mf/deref i18n/locale) project (mf/deref refs/workspace-project) file (mf/deref workspace-file) - libraries (mf/deref refs/workspace-libraries) + libraries (->> (mf/deref refs/workspace-libraries) + (d/removem (fn [[key val]] + (:is-indirect val)))) shared-files (mf/deref refs/workspace-shared-files) change-tab #(reset! selected-tab %) diff --git a/frontend/src/app/main/ui/workspace/sidebar/assets.cljs b/frontend/src/app/main/ui/workspace/sidebar/assets.cljs index ae5dd213ba..42f4678519 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/assets.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/assets.cljs @@ -631,7 +631,9 @@ (mf/defc assets-toolbox [] - (let [libraries (mf/deref refs/workspace-libraries) + (let [libraries (->> (mf/deref refs/workspace-libraries) + (vals) + (remove :is-indirect)) file (mf/deref refs/workspace-file) locale (mf/deref i18n/locale) team-id (mf/use-ctx ctx/current-team-id) @@ -697,7 +699,7 @@ :open? true :filters @filters}] - (for [file (->> (vals libraries) + (for [file (->> libraries (sort-by #(str/lower (:name %))))] [:& file-library {:key (:id file)