Skip to content

Commit

Permalink
Merge pull request #133 from heralden/feature/expand-export-modal
Browse files Browse the repository at this point in the history
Expand export modal
  • Loading branch information
heralden authored Nov 28, 2022
2 parents e468dd1 + 5e43310 commit 84b758b
Show file tree
Hide file tree
Showing 5 changed files with 336 additions and 81 deletions.
10 changes: 9 additions & 1 deletion less/modal.less
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,10 @@
background-color: #337ab7;
}
}

.format-dropdown {
width: auto;
}
}

.filter-manager {
Expand Down Expand Up @@ -150,7 +154,7 @@
}
}

.save-body {
.modal-body {
.optional-attributes {
margin-top: 2.5em;
position: relative;
Expand All @@ -164,5 +168,9 @@
background-color: white;
padding: 0 1em;
}

label {
font-weight: normal;
}
}
}
17 changes: 14 additions & 3 deletions src/im_tables/db.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -72,13 +72,23 @@
:comments? true
:html? true
:highlight? true}
:data-out {:selected-format :tsv
:data-out {:filename "results"
:format "tsv"
:accepted-formats {:tsv :all
:csv :all
:xml :all
:json :all
:fasta [:Gene :Protein]
:gff3 [:Gene :Protein]
:bed [:Gene :Protein]
:rdf :all
:ntriples :all}
:order-formats [:tsv :csv :fasta :rdf :ntriples]
:order-formats [:tsv :csv :xml :json :fasta :gff3 :bed :rdf :ntriples]
:columnheaders nil
:size nil
:start 0
:select nil
:remove #{}
:export-data-package false
:compression nil}
:links {:vocab {:mine "flymine"}
Expand All @@ -96,4 +106,5 @@
:summary {}
:selection {}
:filters {}
:tree-view {:selection #{}}}})
:tree-view {:selection #{}}
:export-preview nil}})
124 changes: 121 additions & 3 deletions src/im_tables/events/exporttable.cljs
Original file line number Diff line number Diff line change
@@ -1,19 +1,137 @@
(ns im-tables.events.exporttable
(:require [re-frame.core :refer [reg-event-db reg-event-fx reg-fx]]
[oops.core :refer [oget ocall ocall! ocall+]]
[clojure.string :refer [join]]
[clojure.string :refer [join replace]]
[imcljs.fetch :as fetch]
[im-tables.interceptors :refer [sandbox]]))

;; REMEMBER KIDS, some gene identifiers have a comma in them, because insanity.
;; This means we default to tsv for Good Reasons. (This is set in the app-db!)

(reg-event-db
:exporttable/prepare-options
(sandbox)
(fn [db [_ loc]]
(update-in db [:settings :data-out] assoc

:size (get-in db [:response :iTotalRecords])
:start 0

:select (get-in db [:query :select])
:remove #{}

:filename
(str (when-let [mine-ns (not-empty (get-in db [:settings :links :vocab :mine]))]
(str mine-ns "_"))
"results_"
;; This creates a filename friendly date and time string.
(let [date (js/Date.)]
;; Adjust for the timezone and daylight saving components, so we can convert to ISO format without displaying zero UTC time.
(.setMinutes date (- (.getMinutes date) (.getTimezoneOffset date)))
(-> (.toISOString date)
;; Remove the millisecond counter and Z suffix, as we removed the UTC offset above.
(replace #"\..*$" "")
;; Replace the : character as it's not supported in most filesystems.
(replace #":" "-")))))))

(reg-event-fx
:exporttable/fetch-preview
(sandbox)
(fn [{db :db} [_ loc]]
(let [data-out (get-in db [:settings :data-out])
options (merge
(select-keys data-out [:format :columnheaders :start])
{:size 3})
query (cond-> (:query db)
(:select data-out) (assoc :select (vec (keep #(when-not (contains? (:remove data-out) %) %)
(:select data-out)))))]
(if (contains? #{"fasta" "gff3" "bed"} (:format options))
{:db (assoc-in db [:cache :export-preview] "Previews are not supported for bioinformatics formats")}
{:db (assoc-in db [:cache :export-preview] nil)
:im-tables/im-operation-chan {:channel (fetch/fetch-custom-format (:service db) query options)
:on-success [:exporttable/fetch-preview-success loc]
:on-failure [:exporttable/fetch-preview-failure loc]}}))))

(reg-event-db
:exporttable/fetch-preview-success
(sandbox)
(fn [db [_ loc res]]
(assoc-in db [:cache :export-preview] (if (coll? res) (.stringify js/JSON (clj->js res) nil 4) res))))

(reg-event-db
:exporttable/fetch-preview-failure
(sandbox)
(fn [db [_ loc res]]
(assoc-in db [:cache :export-preview] (or (not-empty (:body res))
"Failed to fetch preview"))))

(reg-event-db
:exporttable/set-filename
(sandbox)
(fn [db [_ loc filename]]
(assoc-in db [:settings :data-out :filename] filename)))

(reg-event-fx
:exporttable/set-format
;;sets preferred format for the file export
(sandbox)
(fn [db [_ loc format]]
(assoc-in db [:settings :data-out :selected-format] (keyword format))))
(fn [{db :db} [_ loc format]]
{:db (assoc-in db [:settings :data-out :format] format)
:dispatch [:exporttable/fetch-preview loc]}))

(reg-event-fx
:exporttable/set-column-headers
(sandbox)
(fn [{db :db} [_ loc colum-headers-type]]
{:db (assoc-in db [:settings :data-out :columnheaders] colum-headers-type)
:dispatch [:exporttable/fetch-preview loc]}))

(reg-event-fx
:exporttable/set-rows-size
(sandbox)
(fn [{db :db} [_ loc size]]
{:db (assoc-in db [:settings :data-out :size] size)}))

(reg-event-fx
:exporttable/set-rows-start
(sandbox)
(fn [{db :db} [_ loc offset]]
{:db (assoc-in db [:settings :data-out :start] offset)}))

(defn toggle-join [set x]
(if (contains? set x)
(disj set x)
(conj set x)))

(reg-event-fx
:exporttable/toggle-select-view
(sandbox)
(fn [{db :db} [_ loc view]]
{:db (update-in db [:settings :data-out :remove] toggle-join view)
:dispatch [:exporttable/fetch-preview loc]}))

(defn swap-views-up-down
"Swap two views that are beside each other. Assumes that index up is directly
before index down."
[select up down]
(vec (concat (take up select)
[(get select down)
(get select up)]
(drop (inc down) select))))

(reg-event-fx
:exporttable/move-view-down
(sandbox)
(fn [{db :db} [_ loc index]]
{:db (update-in db [:settings :data-out :select] swap-views-up-down index (inc index))
:dispatch [:exporttable/fetch-preview loc]}))

(reg-event-fx
:exporttable/move-view-up
(sandbox)
(fn [{db :db} [_ loc index]]
{:db (update-in db [:settings :data-out :select] swap-views-up-down (dec index) index)
:dispatch [:exporttable/fetch-preview loc]}))

(reg-event-db
:exporttable/toggle-export-data-package
Expand Down
27 changes: 19 additions & 8 deletions src/im_tables/subs.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,11 @@
(fn [db [_ prefix]]
(get-in db (glue prefix [:cache :tree-view :selection]))))

(reg-sub
:exporttable/preview
(fn [db [_ prefix]]
(get-in db (glue prefix [:cache :export-preview]))))

(reg-sub
:modal
(fn [db [_ prefix]]
Expand Down Expand Up @@ -373,17 +378,23 @@
(subscribe [:assets/service loc])
(subscribe [:main/query loc])
(subscribe [:assets/model loc])])
(fn [[{:keys [selected-format export-data-package compression]} {:keys [root token]} query model]
(fn [[{:keys [filename format columnheaders size start select remove export-data-package compression]} {:keys [root token]} query model]
[_ _loc]]
(let [fasta? (= selected-format :fasta)]
(str root "/service/query/results" (when fasta? "/fasta")
"?format=" (name selected-format)
"&filename=" "results"
(let [sequence? (contains? #{"fasta" "gff3" "bed"} format)]
(str root "/service/query/results" (when sequence? (str "/" format))
"?format=" format
"&filename=" (or filename "results")
"&query=" (js/encodeURIComponent
(im-query/->xml model (cond-> query
fasta? (assoc :select ["id"]))))
(im-query/->xml model (cond
sequence? (assoc query :select ["id"])
select (assoc query :select (vec (keep #(when-not (contains? remove %) %) select)))
:else query)))
(when size (str "&size=" size))
(when start (str "&start=" start))
(when columnheaders
(str "&columnheaders=" columnheaders))
(if export-data-package
"&exportDataPackage=true&compress=zip"
(when compression
(str "&compress=" (name compression))))
(str "&compress=" compression)))
"&token=" token))))
Loading

0 comments on commit 84b758b

Please sign in to comment.