From 3dbc417885c39a2568ace6435c77b5a9a087645b Mon Sep 17 00:00:00 2001 From: gered Date: Mon, 1 Aug 2016 13:43:25 -0400 Subject: [PATCH] add cards listing to list details page the filter to turn on/off the option to restrict shown cards to those that are in the list being viewed is implemented in kind of a hacky way that likely is a good indication that the search/filtering code probably needs to be redesigned... ugh. --- resources/public/css/app.css | 2 +- src/mtgcoll/client/components/search.cljs | 16 +++++-- src/mtgcoll/client/routes/lists.cljs | 58 +++++++++++++++++++---- src/mtgcoll/client/routes/sets.cljs | 2 +- 4 files changed, 62 insertions(+), 16 deletions(-) diff --git a/resources/public/css/app.css b/resources/public/css/app.css index a5602b2..d9c4f8f 100644 --- a/resources/public/css/app.css +++ b/resources/public/css/app.css @@ -145,7 +145,7 @@ div.card-title > h1 > small { margin-left: 20px; } -.set-details { +.set-details, .list-details { padding-bottom: 15px; margin-bottom: 15px; border-bottom: 1px solid #eee; diff --git a/src/mtgcoll/client/components/search.cljs b/src/mtgcoll/client/components/search.cljs index 8eccc0a..3faad68 100644 --- a/src/mtgcoll/client/components/search.cljs +++ b/src/mtgcoll/client/components/search.cljs @@ -178,7 +178,7 @@ :value value))) (defn search-field - [filter existing-search-fields remove-button on-enter] + [filter existing-search-fields remove-button on-enter exclude-filters] (let [field (:field @filter) field-type (:type @filter) invalid? (:invalid? @filter) @@ -195,6 +195,9 @@ (remove #(and (contains? existing-search-fields (first %)) (not= (:field @filter) (first %)))) + (remove + (fn [[k _]] + (some #{k} exclude-filters))) (map (fn [[k v]] [k (:label v)])) (sort-by second) (map @@ -293,7 +296,7 @@ (doall))) (defn search-filter-selector - [search-filters & [{:keys [fixed-active-filters no-filters-message?] :as options}]] + [search-filters & [{:keys [fixed-active-filters exclude-filters no-filters-message? extra] :as options}]] (let [fixed-filter-fields (mapv :field fixed-active-filters) selected-search-fields (-> (get-selected-search-fields @search-filters) (into fixed-filter-fields)) @@ -315,7 +318,8 @@ :bsStyle "danger" :on-click #(remove-filter! filter search-filters)} [bs/Glyphicon {:glyph "minus"}] " Remove Filter"] - #(apply-search-filters! search-filters fixed-active-filters)]) + #(apply-search-filters! search-filters fixed-active-filters) + exclude-filters]) filters) [bs/Row [bs/Col {:sm 2} @@ -323,7 +327,7 @@ {:block true :on-click #(add-filter! search-filters)} [bs/Glyphicon {:glyph "plus"}] " Add Filter"]] - [bs/Col {:sm 6} + [bs/Col {:sm 10} [bs/Button {:bsStyle "primary" :on-click #(apply-search-filters! search-filters fixed-active-filters)} @@ -332,4 +336,6 @@ [bs/Button {:bsStyle "warning" :on-click #(reset-search-filters! search-filters fixed-active-filters)} - "Reset"]]]])) \ No newline at end of file + "Reset"] + " " + extra]]])) \ No newline at end of file diff --git a/src/mtgcoll/client/routes/lists.cljs b/src/mtgcoll/client/routes/lists.cljs index d390c0c..32f8512 100644 --- a/src/mtgcoll/client/routes/lists.cljs +++ b/src/mtgcoll/client/routes/lists.cljs @@ -6,9 +6,12 @@ [webtools.reagent.bootstrap :as bs] [webtools.cljs.ajax :as ajax] [webtools.cljs.utils :refer [->url redirect!]] + [mtgcoll.common :as c] [mtgcoll.client.auth :as auth] [mtgcoll.client.page :refer [set-active-breadcrumb! set-error!]] [mtgcoll.client.utils :refer [get-field-value]] + [mtgcoll.client.components.cards :refer [card-list-table ->card-list-pager]] + [mtgcoll.client.components.search :as s] [mtgcoll.client.components.utils :refer [click-to-edit-textarea markdown confirm-modal]])) (defn create-list-form @@ -122,6 +125,41 @@ :on-error #(set-error! "Server error while deleting the list.") :on-success #(redirect! "#/lists"))) +(defonce list-cards-search-filters + (r/atom (s/->search-filters))) + +(defn list-cards-list + [list-id] + (let [limit-to-list? (r/atom true) + fixed-filters [{:field :owned? :value true :comparison :=}] + active-search-filters (r/cursor list-cards-search-filters [:active-filters]) + pager (r/cursor list-cards-search-filters [:pager])] + (s/apply-search-filters! list-cards-search-filters fixed-filters) + (fn [list-id] + (let [fixed-filters (if @limit-to-list? [{:field :owned? :value true :comparison :=}] [])] + [:div.list-cards-list + [s/search-filter-selector list-cards-search-filters + {:fixed-active-filters fixed-filters + :exclude-filters [:owned? :owned-foil?] + :extra [:span {:style {:margin-left "40px"}} + [bs/Checkbox + (merge + (if @limit-to-list? {:checked true}) + {:inline true + :value true + :on-change (fn [e] + (let [value (boolean (get-field-value e))] + (reset! limit-to-list? value) + (swap! active-search-filters + (fn [active-filters] + (->> active-filters + (remove #(= :owned? (:field %))) + (into (if value + [{:field :owned? :value true :comparison :=}] + [])))))))}) + "Limit To List Cards Only?"]]}] + [card-list-table list-id @active-search-filters pager #_{:no-owned-highlight? @limit-to-list?}]])))) + (defvc list-details [list-id] (let [show-delete-confirm? (r/atom false)] @@ -147,16 +185,18 @@ [bs/MenuItem {:on-click #(change-list-visibility! list-id (not (:is_public @list)))} (if (:is_public @list) "Make Private" "Make Public")] [bs/MenuItem {:on-click #(reset! show-delete-confirm? true)} "Delete"]]]) [bs/PageHeader (:name @list)] - (if (auth/can-modify-data?) - [click-to-edit-textarea - (:notes @list) - {:placeholder "List Notes" - :rows 10 - :on-update #(on-update-list-notes! list-id %) - :render markdown}] - [markdown (:notes @list)]) [confirm-modal show-delete-confirm? {:title "Confirm Delete" :body [:p "Are you sure you want to delete the " [:strong (:name @list)] " list? This cannot be undone."] - :on-yes #(delete-list! list-id)}]]))))) \ No newline at end of file + :on-yes #(delete-list! list-id)}] + [:div.list-details + (if (auth/can-modify-data?) + [click-to-edit-textarea + (:notes @list) + {:placeholder "List Notes" + :rows 10 + :on-update #(on-update-list-notes! list-id %) + :render markdown}] + [markdown (:notes @list)])] + [list-cards-list list-id]]))))) \ No newline at end of file diff --git a/src/mtgcoll/client/routes/sets.cljs b/src/mtgcoll/client/routes/sets.cljs index 1d59c03..9162730 100644 --- a/src/mtgcoll/client/routes/sets.cljs +++ b/src/mtgcoll/client/routes/sets.cljs @@ -65,7 +65,7 @@ pager (r/cursor set-cards-search-filters [:pager]) list-id c/owned-list-id] (s/apply-search-filters! set-cards-search-filters fixed-filters) - (fn [] + (fn [set-code] [:div.set-cards-list [s/search-filter-selector set-cards-search-filters {:fixed-active-filters fixed-filters}] [card-list-table list-id @active-search-filters pager]])))