|
|
@@ -18,6 +18,8 @@
|
|
|
[frontend.handler.plugin :as plugin-handler]
|
|
|
[clojure.string :as string]))
|
|
|
|
|
|
+(defonce PER-PAGE-SIZE 15)
|
|
|
+
|
|
|
(rum/defcs installed-themes
|
|
|
<
|
|
|
(rum/local [] ::themes)
|
|
|
@@ -130,16 +132,20 @@
|
|
|
[:strong.inline-flex.px-3 "Loading ..."]))
|
|
|
|
|
|
(rum/defc category-tabs
|
|
|
- [t category on-action]
|
|
|
+ [t total-nums category on-action]
|
|
|
|
|
|
[:div.secondary-tabs.categories.flex
|
|
|
(ui/button
|
|
|
- [:span.flex.items-center (ui/icon "puzzle") (t :plugins)]
|
|
|
+ [:span.flex.items-center
|
|
|
+ (ui/icon "puzzle")
|
|
|
+ (t :plugins) (when (vector? total-nums) (str " (" (first total-nums) ")"))]
|
|
|
:intent "logseq"
|
|
|
:on-click #(on-action :plugins)
|
|
|
:class (if (= category :plugins) "active" ""))
|
|
|
(ui/button
|
|
|
- [:span.flex.items-center (ui/icon "palette") (t :themes)]
|
|
|
+ [:span.flex.items-center
|
|
|
+ (ui/icon "palette")
|
|
|
+ (t :themes) (when (vector? total-nums) (str " (" (last total-nums) ")"))]
|
|
|
:intent "logseq"
|
|
|
:on-click #(on-action :themes)
|
|
|
:class (if (= category :themes) "active" ""))])
|
|
|
@@ -269,8 +275,7 @@
|
|
|
(defn get-open-plugin-readme-handler
|
|
|
[url item repo]
|
|
|
#(plugin-handler/open-readme!
|
|
|
- url item (if repo remote-readme-display local-markdown-display))
|
|
|
- )
|
|
|
+ url item (if repo remote-readme-display local-markdown-display)))
|
|
|
|
|
|
(rum/defc plugin-item-card < rum/static
|
|
|
[t {:keys [id name title version url description author icon iir repo sponsors] :as item}
|
|
|
@@ -429,14 +434,14 @@
|
|
|
|
|
|
(rum/defc ^:large-vars/cleanup-todo panel-control-tabs < rum/static
|
|
|
[search-key *search-key category *category
|
|
|
- sort-by *sort-by filter-by *filter-by
|
|
|
+ sort-by *sort-by filter-by *filter-by total-nums
|
|
|
selected-unpacked-pkg market? develop-mode?
|
|
|
reload-market-fn agent-opts]
|
|
|
|
|
|
(let [*search-ref (rum/create-ref)]
|
|
|
[:div.pb-3.flex.justify-between.control-tabs.relative
|
|
|
[:div.flex.items-center.l
|
|
|
- (category-tabs t category #(reset! *category %))
|
|
|
+ (category-tabs t total-nums category #(reset! *category %))
|
|
|
|
|
|
(when (and develop-mode? (not market?))
|
|
|
[:div
|
|
|
@@ -601,6 +606,8 @@
|
|
|
(rum/local :downloads ::sort-by) ;; downloads / stars / letters / updates
|
|
|
(rum/local :default ::filter-by)
|
|
|
(rum/local nil ::error)
|
|
|
+ (rum/local nil ::cached-query-flag)
|
|
|
+ (rum/local 1 ::current-page)
|
|
|
{:did-mount
|
|
|
(fn [s]
|
|
|
(let [reload-fn (fn [force-refresh?]
|
|
|
@@ -614,51 +621,69 @@
|
|
|
(reload-fn false)
|
|
|
(assoc s ::reload (partial reload-fn true))))}
|
|
|
[state]
|
|
|
- (let [pkgs (state/sub :plugin/marketplace-pkgs)
|
|
|
- stats (state/sub :plugin/marketplace-stats)
|
|
|
- installed-plugins (state/sub :plugin/installed-plugins)
|
|
|
- installing (state/sub :plugin/installing)
|
|
|
- online? (state/sub :network/online?)
|
|
|
- develop-mode? (state/sub :ui/developer-mode?)
|
|
|
- agent-opts (state/sub [:electron/user-cfgs :settings/agent])
|
|
|
- *search-key (::search-key state)
|
|
|
- *category (::category state)
|
|
|
- *sort-by (::sort-by state)
|
|
|
- *filter-by (::filter-by state)
|
|
|
- *fetching (::fetching state)
|
|
|
- *error (::error state)
|
|
|
- filtered-pkgs (when (seq pkgs)
|
|
|
- (if (= @*category :themes)
|
|
|
- (filter #(:theme %) pkgs)
|
|
|
- (filter #(not (:theme %)) pkgs)))
|
|
|
- filtered-pkgs (if (and (seq filtered-pkgs) (not= :default @*filter-by))
|
|
|
- (filter #(apply
|
|
|
- (if (= :installed @*filter-by) identity not)
|
|
|
- [(contains? installed-plugins (keyword (:id %)))])
|
|
|
- filtered-pkgs)
|
|
|
- filtered-pkgs)
|
|
|
- filtered-pkgs (if-not (string/blank? @*search-key)
|
|
|
- (if-let [author (and (string/starts-with? @*search-key "@")
|
|
|
- (subs @*search-key 1))]
|
|
|
- (filter #(= author (:author %)) filtered-pkgs)
|
|
|
- (search/fuzzy-search
|
|
|
- filtered-pkgs @*search-key
|
|
|
- :limit 30
|
|
|
- :extract-fn :title))
|
|
|
- filtered-pkgs)
|
|
|
- filtered-pkgs (map #(if-let [stat (get stats (keyword (:id %)))]
|
|
|
- (let [downloads (:total_downloads stat)
|
|
|
- stars (:stargazers_count stat)]
|
|
|
- (assoc % :stat stat
|
|
|
- :stars stars
|
|
|
- :downloads downloads))
|
|
|
- %) filtered-pkgs)
|
|
|
- sorted-pkgs (apply sort-by
|
|
|
- (conj
|
|
|
- (case @*sort-by
|
|
|
- :letters [#(util/safe-lower-case (or (:title %) (:name %)))]
|
|
|
- [@*sort-by #(compare %2 %1)])
|
|
|
- filtered-pkgs))]
|
|
|
+ (let [pkgs (state/sub :plugin/marketplace-pkgs)
|
|
|
+ stats (state/sub :plugin/marketplace-stats)
|
|
|
+ installed-plugins (state/sub :plugin/installed-plugins)
|
|
|
+ installing (state/sub :plugin/installing)
|
|
|
+ online? (state/sub :network/online?)
|
|
|
+ develop-mode? (state/sub :ui/developer-mode?)
|
|
|
+ agent-opts (state/sub [:electron/user-cfgs :settings/agent])
|
|
|
+ *search-key (::search-key state)
|
|
|
+ *category (::category state)
|
|
|
+ *sort-by (::sort-by state)
|
|
|
+ *filter-by (::filter-by state)
|
|
|
+ *cached-query-flag (::cached-query-flag state)
|
|
|
+ *current-page (::current-page state)
|
|
|
+ *fetching (::fetching state)
|
|
|
+ *error (::error state)
|
|
|
+ theme-plugins (filter #(:theme %) pkgs)
|
|
|
+ normal-plugins (filter #(not (:theme %)) pkgs)
|
|
|
+ filtered-pkgs (when (seq pkgs)
|
|
|
+ (if (= @*category :themes) theme-plugins normal-plugins))
|
|
|
+ total-nums [(count normal-plugins) (count theme-plugins)]
|
|
|
+ filtered-pkgs (if (and (seq filtered-pkgs) (not= :default @*filter-by))
|
|
|
+ (filter #(apply
|
|
|
+ (if (= :installed @*filter-by) identity not)
|
|
|
+ [(contains? installed-plugins (keyword (:id %)))])
|
|
|
+ filtered-pkgs)
|
|
|
+ filtered-pkgs)
|
|
|
+ filtered-pkgs (if-not (string/blank? @*search-key)
|
|
|
+ (if-let [author (and (string/starts-with? @*search-key "@")
|
|
|
+ (subs @*search-key 1))]
|
|
|
+ (filter #(= author (:author %)) filtered-pkgs)
|
|
|
+ (search/fuzzy-search
|
|
|
+ filtered-pkgs @*search-key
|
|
|
+ :limit 30
|
|
|
+ :extract-fn :title))
|
|
|
+ filtered-pkgs)
|
|
|
+ filtered-pkgs (map #(if-let [stat (get stats (keyword (:id %)))]
|
|
|
+ (let [downloads (:total_downloads stat)
|
|
|
+ stars (:stargazers_count stat)]
|
|
|
+ (assoc % :stat stat
|
|
|
+ :stars stars
|
|
|
+ :downloads downloads))
|
|
|
+ %) filtered-pkgs)
|
|
|
+ sorted-plugins (apply sort-by
|
|
|
+ (conj
|
|
|
+ (case @*sort-by
|
|
|
+ :letters [#(util/safe-lower-case (or (:title %) (:name %)))]
|
|
|
+ [@*sort-by #(compare %2 %1)])
|
|
|
+ filtered-pkgs))
|
|
|
+
|
|
|
+ fn-query-flag (fn [] (string/join "_" (map #(str @%) [*filter-by *sort-by *search-key *category])))
|
|
|
+ str-query-flag (fn-query-flag)
|
|
|
+ _ (when (not= str-query-flag @*cached-query-flag)
|
|
|
+ (when-let [^js list-cnt (rum/ref-node state "list-ref")]
|
|
|
+ (set! (.-scrollTop list-cnt) 0))
|
|
|
+ (reset! *current-page 1))
|
|
|
+ _ (reset! *cached-query-flag str-query-flag)
|
|
|
+
|
|
|
+ page-total-items (count sorted-plugins)
|
|
|
+ sorted-plugins (if-not (> page-total-items PER-PAGE-SIZE)
|
|
|
+ sorted-plugins (take (* @*current-page PER-PAGE-SIZE) sorted-plugins))
|
|
|
+ load-more-pages! #(when (> page-total-items PER-PAGE-SIZE)
|
|
|
+ (when (< (* PER-PAGE-SIZE @*current-page) page-total-items)
|
|
|
+ (reset! *current-page (inc @*current-page))))]
|
|
|
|
|
|
[:div.cp__plugins-marketplace
|
|
|
|
|
|
@@ -666,7 +691,7 @@
|
|
|
@*search-key *search-key
|
|
|
@*category *category
|
|
|
@*sort-by *sort-by @*filter-by *filter-by
|
|
|
- nil true develop-mode? (::reload state)
|
|
|
+ total-nums nil true develop-mode? (::reload state)
|
|
|
agent-opts)
|
|
|
|
|
|
(cond
|
|
|
@@ -683,10 +708,10 @@
|
|
|
[:div.cp__plugins-marketplace-cnt
|
|
|
{:class (util/classnames [{:has-installing (boolean installing)}])}
|
|
|
[:div.cp__plugins-item-lists
|
|
|
+ {:ref "list-ref"}
|
|
|
[:div.cp__plugins-item-lists-inner
|
|
|
-
|
|
|
;; items list
|
|
|
- (for [item sorted-pkgs]
|
|
|
+ (for [item sorted-plugins]
|
|
|
(rum/with-key
|
|
|
(let [pid (keyword (:id item))
|
|
|
stat (:stat item)]
|
|
|
@@ -697,9 +722,8 @@
|
|
|
(:id item)))]
|
|
|
|
|
|
;; items loader
|
|
|
- (when (seq sorted-pkgs)
|
|
|
- (lazy-items-loader nil))
|
|
|
- ]])]))
|
|
|
+ (when (seq sorted-plugins)
|
|
|
+ (lazy-items-loader load-more-pages!))]])]))
|
|
|
|
|
|
(rum/defcs installed-plugins
|
|
|
< rum/static rum/reactive
|
|
|
@@ -725,10 +749,11 @@
|
|
|
*cached-query-flag (::cached-query-flag state)
|
|
|
*current-page (::current-page state)
|
|
|
default-filter-by? (= :default @*filter-by)
|
|
|
+ theme-plugins (filter #(:theme %) installed-plugins)
|
|
|
+ normal-plugins (filter #(not (:theme %)) installed-plugins)
|
|
|
filtered-plugins (when (seq installed-plugins)
|
|
|
- (if (= @*category :themes)
|
|
|
- (filter #(:theme %) installed-plugins)
|
|
|
- (filter #(not (:theme %)) installed-plugins)))
|
|
|
+ (if (= @*category :themes) theme-plugins normal-plugins))
|
|
|
+ total-nums [(count normal-plugins) (count theme-plugins)]
|
|
|
filtered-plugins (if-not default-filter-by?
|
|
|
(filter (fn [it]
|
|
|
(let [disabled (get-in it [:settings :disabled])]
|
|
|
@@ -764,12 +789,11 @@
|
|
|
(reset! *current-page 1))
|
|
|
_ (reset! *cached-query-flag str-query-flag)
|
|
|
|
|
|
- page-per-items 12
|
|
|
page-total-items (count sorted-plugins)
|
|
|
- sorted-plugins (if-not (> page-total-items page-per-items)
|
|
|
- sorted-plugins (take (* @*current-page page-per-items) sorted-plugins))
|
|
|
- load-more-pages! #(when (> page-total-items page-per-items)
|
|
|
- (when (< (* page-per-items @*current-page) page-total-items)
|
|
|
+ sorted-plugins (if-not (> page-total-items PER-PAGE-SIZE)
|
|
|
+ sorted-plugins (take (* @*current-page PER-PAGE-SIZE) sorted-plugins))
|
|
|
+ load-more-pages! #(when (> page-total-items PER-PAGE-SIZE)
|
|
|
+ (when (< (* PER-PAGE-SIZE @*current-page) page-total-items)
|
|
|
(reset! *current-page (inc @*current-page))))]
|
|
|
|
|
|
[:div.cp__plugins-installed
|
|
|
@@ -778,7 +802,7 @@
|
|
|
@*category *category
|
|
|
@*sort-by *sort-by
|
|
|
@*filter-by *filter-by
|
|
|
- selected-unpacked-pkg
|
|
|
+ total-nums selected-unpacked-pkg
|
|
|
false develop-mode? nil
|
|
|
agent-opts)
|
|
|
|