|
1573 | 1573 | db-id (cond (map? item) (:db/id item) |
1574 | 1574 | (number? item) item |
1575 | 1575 | :else nil) |
1576 | | - [item set-item!] (hooks/use-state nil) |
| 1576 | + entity (when db-id |
| 1577 | + (let [e (db/entity db-id)] |
| 1578 | + (when (= :full (:block.temp/load-status e)) |
| 1579 | + e))) |
| 1580 | + [item set-item!] (hooks/use-state entity) |
1577 | 1581 | opts (if list-view? |
1578 | 1582 | {:skip-refresh? true |
1579 | 1583 | :children? false} |
|
1642 | 1646 | (shui/table-footer (add-new-row (:view-entity option) table)))]])))) |
1643 | 1647 |
|
1644 | 1648 | (rum/defc list-view < rum/static |
1645 | | - [{:keys [config ref-matched-children-ids view-feature-type] :as option} view-entity {:keys [rows]} *scroller-ref] |
1646 | | - (let [references-view? (contains? #{:linked-references :unlinked-references} view-feature-type) |
1647 | | - lazy-item-render (fn [rows idx] |
| 1649 | + [{:keys [config ref-matched-children-ids groups?] :as option} view-entity {:keys [rows]} *scroller-ref] |
| 1650 | + (let [lazy-item-render (fn [rows idx] |
1648 | 1651 | (lazy-item rows idx (assoc option :list-view? true) |
1649 | 1652 | (fn [block] |
1650 | 1653 | (let [config' (cond-> |
|
1654 | 1657 | (= :linked-references (:logseq.property.view/feature-type view-entity)) |
1655 | 1658 | (assoc :ref-matched-children-ids ref-matched-children-ids))] |
1656 | 1659 | (block-container config' block))))) |
1657 | | - list-cp (fn [rows] |
| 1660 | + list-cp (fn [rows groups?] |
1658 | 1661 | (when (seq rows) |
1659 | | - (if references-view? |
| 1662 | + (if groups? |
1660 | 1663 | [:div.content |
1661 | 1664 | (for [[idx _row] (medley/indexed rows)] |
1662 | 1665 | (lazy-item-render rows idx))] |
|
1674 | 1677 | breadcrumb (state/get-component :block/breadcrumb) |
1675 | 1678 | all-numbers? (every? number? rows)] |
1676 | 1679 | (if all-numbers? |
1677 | | - (list-cp rows) |
| 1680 | + (list-cp rows groups?) |
1678 | 1681 | (for [[idx row] (medley/indexed rows)] |
1679 | 1682 | (if (and (vector? row) (uuid? (first row))) |
1680 | 1683 | (let [[first-block-id blocks] row] |
|
1684 | 1687 | (breadcrumb (assoc config :list-view? true) |
1685 | 1688 | (state/get-current-repo) first-block-id |
1686 | 1689 | {:show-page? false})] |
1687 | | - (list-cp blocks)]) |
| 1690 | + (list-cp blocks groups?)]) |
1688 | 1691 | (rum/with-key |
1689 | 1692 | (lazy-item-render rows idx) |
1690 | 1693 | (str "partition-" idx))))))) |
|
1809 | 1812 | (ui/icon "arrows-up-down"))) |
1810 | 1813 |
|
1811 | 1814 | (rum/defc view-cp |
1812 | | - [view-entity table option* {:keys [*scroller-ref display-type row-selection]}] |
| 1815 | + [view-entity table option* {:keys [*scroller-ref display-type row-selection groups?]}] |
1813 | 1816 | (let [[viewid] (hooks/use-state #(random-uuid)) |
1814 | 1817 | option (assoc option* |
1815 | 1818 | :view-entity view-entity |
1816 | | - :viewid viewid)] |
| 1819 | + :viewid viewid |
| 1820 | + :groups? groups?)] |
1817 | 1821 | [:div {:id viewid} |
1818 | 1822 | (case display-type |
1819 | 1823 | :logseq.property.view/type.list |
|
2096 | 2100 | :skipAnimationFrameInResizeObserver true |
2097 | 2101 | :total-count (count (:rows table)) |
2098 | 2102 | :item-content (fn [idx] |
2099 | | - (let [[value group] (nth (:rows table) idx)] |
2100 | | - (let [add-new-object! (when (fn? add-new-object!) |
2101 | | - (fn [_] |
2102 | | - (add-new-object! view-entity table |
2103 | | - {:properties {(:db/ident group-by-property) (or (and (map? value) (:db/id value)) value)}}))) |
2104 | | - table' (shui/table-option (-> table-map |
2105 | | - (assoc-in [:data-fns :add-new-object!] add-new-object!) |
2106 | | - (assoc :data group ; data for this group |
2107 | | - ))) |
2108 | | - readable-property-value #(cond (and (map? %) (or (:block/title %) (:logseq.property/value %))) |
2109 | | - (db-property/property-value-content %) |
2110 | | - (= (:db/ident %) :logseq.property/empty-placeholder) |
2111 | | - "Empty" |
2112 | | - :else |
2113 | | - (str %)) |
2114 | | - group-by-page? (or (= :block/page group-by-property-ident) |
2115 | | - (and (not db-based?) (contains? #{:linked-references :unlinked-references} display-type)))] |
2116 | | - (rum/with-key |
2117 | | - (ui/foldable |
2118 | | - [:div |
2119 | | - {:class (when-not list-view? "my-2")} |
2120 | | - (cond |
2121 | | - group-by-page? |
2122 | | - (if value |
2123 | | - (let [c (state/get-component :block/page-cp)] |
2124 | | - (c {:disable-preview? true} value)) |
2125 | | - [:div.text-muted-foreground.text-sm |
2126 | | - "Pages"]) |
2127 | | - |
2128 | | - (some? value) |
2129 | | - (let [icon (pu/get-block-property-value value :logseq.property/icon)] |
2130 | | - [:div.flex.flex-row.gap-1.items-center |
2131 | | - (when icon (icon-component/icon icon {:color? true})) |
2132 | | - (readable-property-value value)]) |
2133 | | - :else |
2134 | | - (str "No " (:block/title group-by-property)))] |
2135 | | - (let [render (view-cp view-entity (assoc table' :rows group) option view-opts)] |
2136 | | - (if list-view? [:div.-ml-2 render] render)) |
2137 | | - {:title-trigger? false}) |
2138 | | - (str (:db/id view-entity) "-group-idx-" idx)))))})]) |
| 2103 | + (let [[value group] (nth (:rows table) idx) |
| 2104 | + add-new-object! (when (fn? add-new-object!) |
| 2105 | + (fn [_] |
| 2106 | + (add-new-object! view-entity table |
| 2107 | + {:properties {(:db/ident group-by-property) (or (and (map? value) (:db/id value)) value)}}))) |
| 2108 | + table' (shui/table-option (-> table-map |
| 2109 | + (assoc-in [:data-fns :add-new-object!] add-new-object!) |
| 2110 | + (assoc :data group ; data for this group |
| 2111 | + ))) |
| 2112 | + readable-property-value #(cond (and (map? %) (or (:block/title %) (:logseq.property/value %))) |
| 2113 | + (db-property/property-value-content %) |
| 2114 | + (= (:db/ident %) :logseq.property/empty-placeholder) |
| 2115 | + "Empty" |
| 2116 | + :else |
| 2117 | + (str %)) |
| 2118 | + group-by-page? (or (= :block/page group-by-property-ident) |
| 2119 | + (and (not db-based?) (contains? #{:linked-references :unlinked-references} display-type)))] |
| 2120 | + (rum/with-key |
| 2121 | + (ui/foldable |
| 2122 | + [:div |
| 2123 | + {:class (when-not list-view? "my-2")} |
| 2124 | + (cond |
| 2125 | + group-by-page? |
| 2126 | + (if value |
| 2127 | + (let [c (state/get-component :block/page-cp)] |
| 2128 | + (c {:disable-preview? true} value)) |
| 2129 | + [:div.text-muted-foreground.text-sm |
| 2130 | + "Pages"]) |
| 2131 | + |
| 2132 | + (some? value) |
| 2133 | + (let [icon (pu/get-block-property-value value :logseq.property/icon)] |
| 2134 | + [:div.flex.flex-row.gap-1.items-center |
| 2135 | + (when icon (icon-component/icon icon {:color? true})) |
| 2136 | + (readable-property-value value)]) |
| 2137 | + :else |
| 2138 | + (str "No " (:block/title group-by-property)))] |
| 2139 | + (fn [] |
| 2140 | + (let [render (view-cp view-entity |
| 2141 | + (assoc table' :rows group) |
| 2142 | + option |
| 2143 | + (assoc view-opts :groups? (or group-by-page? |
| 2144 | + group-by-property-ident)))] |
| 2145 | + (if list-view? [:div.-ml-2 render] render))) |
| 2146 | + {:title-trigger? false}) |
| 2147 | + (str (:db/id view-entity) "-group-idx-" idx))))})]) |
2139 | 2148 | (view-cp view-entity table |
2140 | 2149 | (assoc option :group-by-property-ident group-by-property-ident) |
2141 | 2150 | view-opts)))]) |
|
0 commit comments