diff --git a/src/cljs/auto_ap/views/components/invoice_table.cljs b/src/cljs/auto_ap/views/components/invoice_table.cljs index 70a6dedf..09ca5d4d 100644 --- a/src/cljs/auto_ap/views/components/invoice_table.cljs +++ b/src/cljs/auto_ap/views/components/invoice_table.cljs @@ -164,7 +164,21 @@ visible-checks @(re-frame/subscribe [::visible-checks]) visible-expense-accounts @(re-frame/subscribe [::visible-expense-accounts]) selected-client @(re-frame/subscribe [::subs/client]) - percentage-size (if selected-client "%50%" "33%")] + percentage-size (if selected-client "%50%" "33%") + is-sorted-by-vendor? (seq (filter #(= "vendor" (:sort-key %)) sort)) + _ (println is-sorted-by-vendor? sort) + [invoice-groups] (if is-sorted-by-vendor? + (reduce + (fn [[acc last-vendor] invoice] + (if (not= (:id (:vendor invoice)) + last-vendor) + [(update-in acc [(clojure.core/count acc)] #(conj (or % []) invoice)) + (:id (:vendor invoice))] + [(update-in acc [(dec (clojure.core/count acc))] #(conj (or % []) invoice)) + (:id (:vendor invoice))])) + [[] nil] + (:invoices @invoice-page)) + [[(:invoices @invoice-page)]])] [:div [:div.level [:div.level-left @@ -174,86 +188,89 @@ [:div.level-item [sort-by-list {:sort sort :on-change opc}]]]] - [:table.table.is-fullwidth - [:thead - [:tr - (when check-boxes - [:th {:style {"width" "20px"}}]) - (when-not selected-client - [sorted-column {:on-sort opc - :style {:width percentage-size :cursor "pointer"} - :sort-name "Client" - :sort-key "client" - :sort sort} - "Client"]) - [sorted-column {:on-sort opc - :style {:width percentage-size :cursor "pointer"} - :sort-name "Vendor" - :sort-key "vendor" - :sort sort} - "Vendor"] - [sorted-column {:on-sort opc - :style {:width percentage-size :cursor "pointer"} - :sort-name "Invoice Number" - :sort-key "invoice-number" - :sort sort} - "Invoice #"] - [sorted-column {:on-sort opc - :style {:width "8em" :cursor "pointer"} - :sort-name "Date" - :sort-key "date" - :sort sort} - "Date"] - [sorted-column {:on-sort opc - :style {:width "8em" :cursor "pointer"} - :sort-name "Due" - :sort-key "due" - :sort sort} - "Due"] - [sorted-column {:on-sort opc - :style {:width "5em" :cursor "pointer"} - :sort-name "Location" - :sort-key "location" - :sort sort} - "Loc"] - [sorted-column {:on-sort opc - :style {:width "8em" :cursor "pointer"} - :sort-name "Total" - :sort-key "total" - :class "has-text-right" - :sort sort} - "Amount"] + (doall + (for [invoices invoice-groups] + ^{:key (:id (first invoices))} + [:table.table.is-fullwidth + [:thead + [:tr + (when check-boxes + [:th {:style {"width" "20px"}}]) + (when-not selected-client + [sorted-column {:on-sort opc + :style {:width percentage-size :cursor "pointer"} + :sort-name "Client" + :sort-key "client" + :sort sort} + "Client"]) + [sorted-column {:on-sort opc + :style {:width percentage-size :cursor "pointer"} + :sort-name "Vendor" + :sort-key "vendor" + :sort sort} + "Vendor"] + [sorted-column {:on-sort opc + :style {:width percentage-size :cursor "pointer"} + :sort-name "Invoice Number" + :sort-key "invoice-number" + :sort sort} + "Invoice #"] + [sorted-column {:on-sort opc + :style {:width "8em" :cursor "pointer"} + :sort-name "Date" + :sort-key "date" + :sort sort} + "Date"] + [sorted-column {:on-sort opc + :style {:width "8em" :cursor "pointer"} + :sort-name "Due" + :sort-key "due" + :sort sort} + "Due"] + [sorted-column {:on-sort opc + :style {:width "5em" :cursor "pointer"} + :sort-name "Location" + :sort-key "location" + :sort sort} + "Loc"] + [sorted-column {:on-sort opc + :style {:width "8em" :cursor "pointer"} + :sort-name "Total" + :sort-key "total" + :class "has-text-right" + :sort sort} + "Amount"] - [sorted-column {:on-sort opc - :style {:width "10em" :cursor "pointer"} - :sort-name "Outstanding" - :sort-key "outstanding-balance" - :class "has-text-right" - :sort sort} - "Outstanding"] - - [:th { - :style {:width "20rem" :cursor "pointer"} - - - } - ""]]] - [:tbody - - (if (:loading @status) - [:tr - [:td {:col-span 5} - [:i.fa.fa-spin.fa-spinner]]] - - (for [{:keys [client payments expense-accounts invoice-number date due total outstanding-balance id vendor] :as i} (:invoices @invoice-page)] - ^{:key id} - [row {:invoice i - :check-boxes check-boxes - :checked checked - :on-check-changed on-check-changed - :selected-client selected-client - :overrides overrides - :expense-event expense-event - :on-edit-invoice on-edit-invoice - :on-void-invoice on-void-invoice - :on-unvoid-invoice on-unvoid-invoice}]))]]])) + [sorted-column {:on-sort opc + :style {:width "10em" :cursor "pointer"} + :sort-name "Outstanding" + :sort-key "outstanding-balance" + :class "has-text-right" + :sort sort} + "Outstanding"] + + [:th { + :style {:width "20rem" :cursor "pointer"} + + + } + ""]]] + [:tbody + + (if (:loading @status) + [:tr + [:td {:col-span 5} + [:i.fa.fa-spin.fa-spinner]]] + + (for [{:keys [client payments expense-accounts invoice-number date due total outstanding-balance id vendor] :as i} invoices] + ^{:key id} + [row {:invoice i + :check-boxes check-boxes + :checked checked + :on-check-changed on-check-changed + :selected-client selected-client + :overrides overrides + :expense-event expense-event + :on-edit-invoice on-edit-invoice + :on-void-invoice on-void-invoice + :on-unvoid-invoice on-unvoid-invoice}]))]]))]))