bump React to 18

This commit is contained in:
Tienson Qin
2025-04-07 10:27:26 +08:00
parent 48591f0085
commit 70e2012e29
51 changed files with 479 additions and 466 deletions

View File

@@ -1,7 +1,8 @@
{:paths ["src/main" "src/electron" "src/resources"]
:deps
{org.clojure/clojure {:mvn/version "1.11.1"}
rum/rum {:mvn/version "0.12.9"}
rum/rum {:git/url "https://github.com/logseq/rum" ;; fork
:sha "5d672bf84ed944414b9f61eeb83808ead7be9127"}
datascript/datascript {:git/url "https://github.com/logseq/datascript" ;; fork
:sha "1f84d10df4970f054489b0ee78799f64b8dd4ee2"}

4
deps/shui/deps.edn vendored
View File

@@ -3,6 +3,8 @@
{org.clojure/clojure {:mvn/version "1.11.1"}
org.clojure/clojurescript {:mvn/version "1.11.132"}
funcool/promesa {:mvn/version "11.0.678"}
rum/rum {:mvn/version "0.12.9"}
rum/rum {:git/url "https://github.com/logseq/rum" ;; fork
:sha "5d672bf84ed944414b9f61eeb83808ead7be9127"}
medley/medley {:mvn/version "1.4.0"}
cljs-bean/cljs-bean {:mvn/version "1.5.0"}}}

View File

@@ -1,10 +1,11 @@
(ns logseq.shui.demo
(:require [rum.core :as rum]
[logseq.shui.ui :as ui]
[dommy.core :refer-macros [sel1]]
(:require [dommy.core :refer-macros [sel1]]
[logseq.shui.dialog.core :as dialog-core]
[logseq.shui.form.core :refer [yup yup-resolver] :as form-core]
[logseq.shui.hooks :as hooks]
[logseq.shui.ui :as ui]
[promesa.core :as p]
[logseq.shui.dialog.core :as dialog-core]))
[rum.core :as rum]))
(rum/defc section-item
[title children]
@@ -511,7 +512,7 @@
[]
(let [el-ref (rum/use-ref nil)]
(rum/use-effect!
(hooks/use-effect!
(fn []
(let [^js container (get-main-scroll-container)
^js el (rum/deref el-ref)

View File

@@ -1,23 +1,24 @@
(ns logseq.shui.demo2
(:require [clojure.string :as string]
[rum.core :as rum]
[logseq.shui.ui :as ui]
[logseq.shui.popup.core :refer [install-popups update-popup! get-popup]]
[logseq.shui.select.multi :refer [x-select-content]]
(:require [cljs-bean.core :as bean]
[clojure.string :as string]
[frontend.components.icon :refer [emojis-cp emojis icon-search]]
[frontend.storage :as storage]
[cljs-bean.core :as bean]
[promesa.core :as p]))
[logseq.shui.hooks :as hooks]
[logseq.shui.popup.core :refer [install-popups update-popup! get-popup]]
[logseq.shui.select.multi :refer [x-select-content]]
[logseq.shui.ui :as ui]
[promesa.core :as p]
[rum.core :as rum]))
(defn do-fetch!
([action] (do-fetch! action nil))
([action query-str]
(-> (js/window.fetch
(str "https://movies-api14.p.rapidapi.com/" (name action) (when query-str (str "?" query-str)))
#js {:method "GET"
:headers #js {:X-RapidAPI-Key "808ffd08c0mshc67d496f6024b46p164350jsn7b35179966c9",
:X-RapidAPI-Host "movies-api14.p.rapidapi.com"}})
(p/then #(.json %)))))
(str "https://movies-api14.p.rapidapi.com/" (name action) (when query-str (str "?" query-str)))
#js {:method "GET"
:headers #js {:X-RapidAPI-Key "808ffd08c0mshc67d496f6024b46p164350jsn7b35179966c9",
:X-RapidAPI-Host "movies-api14.p.rapidapi.com"}})
(p/then #(.json %)))))
(rum/defc multi-select-demo
[]
@@ -35,96 +36,96 @@
rm-item! (fn [item-or-id]
(set-selected-items!
(remove #(or (= item-or-id %)
(= item-or-id (str (:id %))))
selected-items)))
(remove #(or (= item-or-id %)
(= item-or-id (str (:id %))))
selected-items)))
add-item! (fn [item] (set-selected-items! (conj selected-items item)))
[open? set-open!] (rum/use-state false)]
(rum/use-effect!
(fn []
(storage/set :ls-demo-multi-selected-items selected-items))
[selected-items])
(hooks/use-effect!
(fn []
(storage/set :ls-demo-multi-selected-items selected-items))
[selected-items])
(ui/card
(ui/card-header
(ui/card-title "Search Movies")
(ui/card-description "x multiselect for the remote items"))
(ui/card-content
(ui/card-header
(ui/card-title "Search Movies")
(ui/card-description "x multiselect for the remote items"))
(ui/card-content
;; Basic
(ui/dropdown-menu
{:open open?}
(ui/dropdown-menu
{:open open?}
;; trigger
(ui/dropdown-menu-trigger
[:div.border.p-2.rounded.w-full.cursor-pointer.flex.items-center.gap-1.flex-wrap
{:on-click (fn [^js e]
(let [^js target (.-target e)]
(if-let [^js c (some-> target (.closest ".close"))]
(some-> (.-dataset c) (.-k) (rm-item!))
(set-open! true))))}
(for [{:keys [id original_title class poster_path]} selected-items]
(ui/badge {:variant :secondary :class (str class " group relative")}
[:span.flex.items-center.gap-1.flex-nowrap
[:img {:src poster_path :class "w-[16px] scale-75"}]
[:b original_title]]
(ui/button
{:variant :destructive
:size :icon
:data-k id
:class "!rounded-full !h-4 !w-4 absolute top-[-7px] right-[-3px] group-hover:visible invisible close"}
(ui/tabler-icon "x" {:size 12}))))
(ui/button {:variant :link :size :sm} "+")])
(ui/dropdown-menu-trigger
[:div.border.p-2.rounded.w-full.cursor-pointer.flex.items-center.gap-1.flex-wrap
{:on-click (fn [^js e]
(let [^js target (.-target e)]
(if-let [^js c (some-> target (.closest ".close"))]
(some-> (.-dataset c) (.-k) (rm-item!))
(set-open! true))))}
(for [{:keys [id original_title class poster_path]} selected-items]
(ui/badge {:variant :secondary :class (str class " group relative")}
[:span.flex.items-center.gap-1.flex-nowrap
[:img {:src poster_path :class "w-[16px] scale-75"}]
[:b original_title]]
(ui/button
{:variant :destructive
:size :icon
:data-k id
:class "!rounded-full !h-4 !w-4 absolute top-[-7px] right-[-3px] group-hover:visible invisible close"}
(ui/tabler-icon "x" {:size 12}))))
(ui/button {:variant :link :size :sm} "+")])
;; content
(x-select-content items selected-items
{;; test item render
:open? open?
:close! #(set-open! false)
:search-enabled? true
:search-key q
:search-fn (fn [items]
(when (not fetching?) items))
:on-search-key-change (fn [v]
(set-q! v)
(if (string/blank? v)
(set-items! [])
(when (not fetching?)
(set-fetching? true)
(-> (do-fetch! :search (str "query=" v))
(p/then #(when-let [ret (bean/->clj %)]
(when-let [items (:contents ret)]
(set-items! (map (fn [item] (assoc item :id (:_id item))) (take 12 items))))))
(p/finally #(set-fetching? false))))))
(x-select-content items selected-items
{;; test item render
:open? open?
:close! #(set-open! false)
:search-enabled? true
:search-key q
:search-fn (fn [items]
(when (not fetching?) items))
:on-search-key-change (fn [v]
(set-q! v)
(if (string/blank? v)
(set-items! [])
(when (not fetching?)
(set-fetching? true)
(-> (do-fetch! :search (str "query=" v))
(p/then #(when-let [ret (bean/->clj %)]
(when-let [items (:contents ret)]
(set-items! (map (fn [item] (assoc item :id (:_id item))) (take 12 items))))))
(p/finally #(set-fetching? false))))))
:item-render (fn [item {:keys [selected?]}]
(if item
(ui/dropdown-menu-checkbox-item
{:checked selected?
:on-click (fn []
(if selected?
(rm-item! item)
(add-item! item))
:item-render (fn [item {:keys [selected?]}]
(if item
(ui/dropdown-menu-checkbox-item
{:checked selected?
:on-click (fn []
(if selected?
(rm-item! item)
(add-item! item))
;(set-open! false)
)}
[:div.flex.items-center.gap-2
[:span [:img {:src (:poster_path item)
:class "w-[20px]"}]]
[:span.flex.flex-col
[:b (:original_title item)]
[:small.opacity-50
{:class "text-[10px]"}
(:release_date item)]]])
(ui/dropdown-menu-separator)))
)}
[:div.flex.items-center.gap-2
[:span [:img {:src (:poster_path item)
:class "w-[20px]"}]]
[:span.flex.flex-col
[:b (:original_title item)]
[:small.opacity-50
{:class "text-[10px]"}
(:release_date item)]]])
(ui/dropdown-menu-separator)))
:head-render (fn [] (when (and fetching? (not (string/blank? q)))
[:b.flex.items-center.justify-center.py-4
(ui/tabler-icon "loader" {:class "animate-spin"})]))
:head-render (fn [] (when (and fetching? (not (string/blank? q)))
[:b.flex.items-center.justify-center.py-4
(ui/tabler-icon "loader" {:class "animate-spin"})]))
;:foot-render (fn [] [:b "footer"])
:content-props
{:align "start"
:class "w-80"}})))))
:content-props
{:align "start"
:class "w-80"}})))))
[:hr]
@@ -146,50 +147,50 @@
[open? set-open!] (rum/use-state false)]
(ui/card
(ui/card-header
(ui/card-title "Basic")
(ui/card-description "x multiselect for shui"))
(ui/card-content
[:label.block.flex.items-center.pb-3.cursor-pointer
(ui/checkbox {:checked search?
:on-click #(set-search? (not search?))})
[:small.pl-2 "Enable basic search input"]]
(ui/card-header
(ui/card-title "Basic")
(ui/card-description "x multiselect for shui"))
(ui/card-content
[:label.block.flex.items-center.pb-3.cursor-pointer
(ui/checkbox {:checked search?
:on-click #(set-search? (not search?))})
[:small.pl-2 "Enable basic search input"]]
;; Basic
(ui/dropdown-menu
{:open open?}
(ui/dropdown-menu
{:open open?}
;; trigger
(ui/dropdown-menu-trigger
[:p.border.p-2.rounded.w-full.cursor-pointer
{:on-click #(set-open! true)}
(for [{:keys [key value class]} selected-items]
(ui/badge {:variant :secondary :class class} (str "#" key " " value)))
(ui/button {:variant :link :size :sm} "+")])
(ui/dropdown-menu-trigger
[:p.border.p-2.rounded.w-full.cursor-pointer
{:on-click #(set-open! true)}
(for [{:keys [key value class]} selected-items]
(ui/badge {:variant :secondary :class class} (str "#" key " " value)))
(ui/button {:variant :link :size :sm} "+")])
;; content
(x-select-content items selected-items
{:close! #(set-open! false)
:search-enabled? search?
:search-key-render (fn [q {:keys [items]}]
(when (and (not (string/blank? q))
(not (seq items)))
[:b.flex.items-center.justify-center.py-4.gap-2.font-normal.opacity-80
(ui/tabler-icon "lemon") [:small "No fruits!"]]))
:on-chosen on-chosen
:value-render (fn [v {:keys [selected?]}]
(if selected?
[:b.text-red-800 v]
[:b.text-green-800 v]))
:content-props
{:class "w-48"}})))))
(x-select-content items selected-items
{:close! #(set-open! false)
:search-enabled? search?
:search-key-render (fn [q {:keys [items]}]
(when (and (not (string/blank? q))
(not (seq items)))
[:b.flex.items-center.justify-center.py-4.gap-2.font-normal.opacity-80
(ui/tabler-icon "lemon") [:small "No fruits!"]]))
:on-chosen on-chosen
:value-render (fn [v {:keys [selected?]}]
(if selected?
[:b.text-red-800 v]
[:b.text-green-800 v]))
:content-props
{:class "w-48"}})))))
[:hr]
(let [[items set-items!]
(rum/use-state
[{:key 1 :value "Apple" :class "bg-gray-800 text-gray-50"}
{:key 2 :value "Orange" :class "bg-orange-700 text-gray-50"}
nil
{:key 3 :value "Pear"}
{:key 4 :value "Banana" :class "bg-yellow-700 text-gray-700"}])
[{:key 1 :value "Apple" :class "bg-gray-800 text-gray-50"}
{:key 2 :value "Orange" :class "bg-orange-700 text-gray-50"}
nil
{:key 3 :value "Pear"}
{:key 4 :value "Banana" :class "bg-yellow-700 text-gray-700"}])
[selected-items set-selected-items!]
(rum/use-state [(last items) (first items)])
@@ -202,55 +203,54 @@
[open? set-open!] (rum/use-state false)]
(ui/card
(ui/card-header
(ui/card-title "Search & Custom")
(ui/card-description "x multiselect for shui"))
(ui/card-content
(ui/card-header
(ui/card-title "Search & Custom")
(ui/card-description "x multiselect for shui"))
(ui/card-content
;; Basic
(ui/dropdown-menu
{:open open?}
(ui/dropdown-menu
{:open open?}
;; trigger
(ui/dropdown-menu-trigger
[:p.border.p-2.rounded.w-full.cursor-pointer
{:on-click #(set-open! true)}
(for [{:keys [key value class]} selected-items]
(ui/badge {:variant :secondary :class class} (str "#" key " " value)))
(ui/button {:variant :link :size :sm} "+")])
(ui/dropdown-menu-trigger
[:p.border.p-2.rounded.w-full.cursor-pointer
{:on-click #(set-open! true)}
(for [{:keys [key value class]} selected-items]
(ui/badge {:variant :secondary :class class} (str "#" key " " value)))
(ui/button {:variant :link :size :sm} "+")])
;; content
(x-select-content items selected-items
{;; test item render
:open? open?
:close! #(set-open! false)
:search-enabled? true
:item-render (fn [item {:keys [selected?]}]
(if item
(ui/dropdown-menu-checkbox-item
{:checked selected?
:on-click (fn []
(if selected?
(rm-item! item)
(add-item! item)))}
(:value item))
(ui/dropdown-menu-separator)))
(x-select-content items selected-items
{;; test item render
:open? open?
:close! #(set-open! false)
:search-enabled? true
:item-render (fn [item {:keys [selected?]}]
(if item
(ui/dropdown-menu-checkbox-item
{:checked selected?
:on-click (fn []
(if selected?
(rm-item! item)
(add-item! item)))}
(:value item))
(ui/dropdown-menu-separator)))
:search-key-render
(fn [k {:keys [items x-item exist-fn]}]
(when (and
(not (string/blank? k))
(not (exist-fn)))
(x-item
{:on-click (fn []
(ui/toast! (str "Create: " k) :warning)
(set-open! false))}
(str "+ create: " k))))
:search-key-render
(fn [k {:keys [items x-item exist-fn]}]
(when (and
(not (string/blank? k))
(not (exist-fn)))
(x-item
{:on-click (fn []
(ui/toast! (str "Create: " k) :warning)
(set-open! false))}
(str "+ create: " k))))
;:head-render (fn [] [:b "header"])
;:foot-render (fn [] [:b "footer"])
:content-props
{:align "start"
:class "w-48"}})))))
])
:content-props
{:align "start"
:class "w-48"}})))))])
(rum/defc icon-picker-demo
[]
@@ -282,27 +282,27 @@
[:a.underline
{:on-click
#(ui/popup-show! %
(fn [_config]
[:div.max-h-72.overflow-auto.p-1
(emojis-cp (take 80 emojis)
{:on-chosen
(fn [_ t]
(set-emoji! t)
(ui/popup-hide-all!))})])
{:content-props {:class "w-72 p-0"}
:as-dropdown? true})}
(fn [_config]
[:div.max-h-72.overflow-auto.p-1
(emojis-cp (take 80 emojis)
{:on-chosen
(fn [_ t]
(set-emoji! t)
(ui/popup-hide-all!))})])
{:content-props {:class "w-72 p-0"}
:as-dropdown? true})}
(if emoji [:strong.px-1.text-6xl [:em-emoji emoji]] "emoji :O")] "."])]
[:<>
(emoji-picker nil)
[:p.py-4
(ui/button
{:variant :secondary
:on-click #(ui/popup-show! %
(fn []
[:p.p-4
(emoji-picker true)]))}
"Play a nested x popup.")]
{:variant :secondary
:on-click #(ui/popup-show! %
(fn []
[:p.p-4
(emoji-picker true)]))}
"Play a nested x popup.")]
[:p.py-4
(let [gen-content
@@ -312,60 +312,60 @@
(emoji-picker true)
[:strong.px-1.text-6xl q]])]
(ui/input
{:placeholder "Select a fruit."
:ref *q-ref
:value q
:on-change (fn [^js e]
(let [val (.-value (.-target e))]
(set-q! val)
(update-popup! :select-a-fruit-input [:content] (gen-content val))))
:class "w-1/5"
:on-focus (fn [^js e]
(let [id :select-a-fruit-input
[_ popup] (get-popup id)]
(if (not popup)
(ui/popup-show! (.-target e)
(gen-content q)
{:id id
:align "start"
:content-props
{:class "x-input-popup-content"
:onPointerDownOutside
(fn [^js e]
(js/console.log "===>> onPointerDownOutside:" e (rum/deref *q-ref))
(when-let [q-ref (rum/deref *q-ref)]
(let [^js target (or (.-relatedTarget e)
(.-target e))]
(js/console.log "t:" target)
(when (and
(not (.contains q-ref target))
(not (.closest target ".x-input-popup-content")))
(ui/popup-hide! id)))))
:onOpenAutoFocus #(.preventDefault %)}})
{:placeholder "Select a fruit."
:ref *q-ref
:value q
:on-change (fn [^js e]
(let [val (.-value (.-target e))]
(set-q! val)
(update-popup! :select-a-fruit-input [:content] (gen-content val))))
:class "w-1/5"
:on-focus (fn [^js e]
(let [id :select-a-fruit-input
[_ popup] (get-popup id)]
(if (not popup)
(ui/popup-show! (.-target e)
(gen-content q)
{:id id
:align "start"
:content-props
{:class "x-input-popup-content"
:onPointerDownOutside
(fn [^js e]
(js/console.log "===>> onPointerDownOutside:" e (rum/deref *q-ref))
(when-let [q-ref (rum/deref *q-ref)]
(let [^js target (or (.-relatedTarget e)
(.-target e))]
(js/console.log "t:" target)
(when (and
(not (.contains q-ref target))
(not (.closest target ".x-input-popup-content")))
(ui/popup-hide! id)))))
:onOpenAutoFocus #(.preventDefault %)}})
;; update content
(update-popup! id [:content]
(gen-content q)))))
(update-popup! id [:content]
(gen-content q)))))
;:on-blur (fn [^js e]
; (let [^js target (.-relatedTarget e)]
; (js/console.log "==>>>" target)
; (when-not (.closest target ".x-input-popup-content")
; (hide-x-popup! :select-a-fruit-input))))
}))]
}))]
[:div.w-full.p-4.border.rounded.dotted.h-48.mt-8.bg-gray-02
{:on-click #(ui/popup-show! %
(->> (range 8)
(map (fn [it]
(ui/dropdown-menu-item
{:on-select (fn []
(ui/toast! it)
(ui/popup-hide-all!))}
[:strong it]))))
{:as-dropdown? true
:content-props {:class "w-48"}})
(->> (range 8)
(map (fn [it]
(ui/dropdown-menu-item
{:on-select (fn []
(ui/toast! it)
(ui/popup-hide-all!))}
[:strong it]))))
{:as-dropdown? true
:content-props {:class "w-48"}})
:on-context-menu #(ui/popup-show! %
[:h1.text-3xl.font-bold "hi x popup for custom context menu!"])}]])])
[:h1.text-3xl.font-bold "hi x popup for custom context menu!"])}]])])
(rum/defc custom-trigger-content
[]
@@ -381,17 +381,16 @@
[:h1.text-3xl.font-bold.border-b.pb-4 "Sample dropdown/menu trigger"]
[:div.py-4
(ui/dropdown-menu
(ui/dropdown-menu-trigger
{:as-child true}
(ui/trigger-child-wrap
{:class "border p-6 border"}
(custom-trigger-content)))
(ui/dropdown-menu-content
(ui/dropdown-menu-item "A item")
(ui/dropdown-menu-item "B item")
(ui/dropdown-menu-item "C item")))]
])
(ui/dropdown-menu-trigger
{:as-child true}
(ui/trigger-child-wrap
{:class "border p-6 border"}
(custom-trigger-content)))
(ui/dropdown-menu-content
(ui/dropdown-menu-item "A item")
(ui/dropdown-menu-item "B item")
(ui/dropdown-menu-item "C item")))]])
(rum/defc page
[]
(sample-dropdown-trigger))
(sample-dropdown-trigger))

View File

@@ -1,11 +1,12 @@
(ns logseq.shui.dialog.core
(:require [rum.core :as rum]
[daiquiri.interpreter :refer [interpret]]
[medley.core :as medley]
[logseq.shui.util :as util]
(:require [daiquiri.interpreter :refer [interpret]]
[logseq.shui.base.core :as base]
[logseq.shui.form.core :as form]
[promesa.core :as p]))
[logseq.shui.hooks :as hooks]
[logseq.shui.util :as util]
[medley.core :as medley]
[promesa.core :as p]
[rum.core :as rum]))
;; provider
(def dialog (util/lsui-wrap "Dialog"))
@@ -130,10 +131,11 @@
:close :align :on-open-change :open? :root-props :content-props)
props (assoc-in props [:overlay-props :data-align] (name (or align :center)))]
(rum/use-effect!
(hooks/use-effect!
(fn []
(when (false? open?)
(js/setTimeout #(detach-modal! id) 128)))
(let [timeout (js/setTimeout #(detach-modal! id) 128)]
#(js/clearTimeout timeout))))
[open?])
(dialog
@@ -171,10 +173,11 @@
(let [{:keys [id title description content footer deferred open?]} config
props (dissoc config :id :title :description :content :footer :deferred :open? :alert?)]
(rum/use-effect!
(hooks/use-effect!
(fn []
(when (false? open?)
(js/setTimeout #(detach-modal! id) 128)))
(let [timeout (js/setTimeout #(detach-modal! id) 128)]
#(js/clearTimeout timeout))))
[open?])
(alert-dialog
@@ -209,14 +212,15 @@
*ok-ref (rum/use-ref nil)
*reminder-ref (rum/use-ref nil)]
(rum/use-effect!
(hooks/use-effect!
(fn []
(when ready?
(js/setTimeout
#(some-> (rum/deref *ok-ref) (.focus)) 128)))
(let [timeout (js/setTimeout
#(some-> (rum/deref *ok-ref) (.focus)) 128)]
#(js/clearTimeout timeout))))
[ready?])
(rum/use-effect!
(hooks/use-effect!
(fn []
(try
(if-let [reminder-v (and reminder? (js/localStorage.getItem (str id)))]

View File

@@ -1,4 +1,4 @@
(ns frontend.hooks
(ns logseq.shui.hooks
"React custom hooks."
(:refer-clojure :exclude [ref deref])
(:require [goog.functions :as gfun]
@@ -24,17 +24,23 @@
"setup-fn will be invoked every render of component when no deps arg provided"
([setup-fn] (rum/use-effect! setup-fn))
([setup-fn deps & {:keys [equal-fn]}]
(rum/use-effect! setup-fn (if (empty? deps)
deps
#js[(memo-deps equal-fn deps)]))))
(rum/use-effect! (fn [& deps]
(let [result (apply setup-fn deps)]
(when (fn? result) result)))
(if (empty? deps)
deps
#js[(memo-deps equal-fn deps)]))))
#_{:clj-kondo/ignore [:discouraged-var]}
(defn use-layout-effect!
([setup-fn] (rum/use-layout-effect! setup-fn))
([setup-fn deps & {:keys [equal-fn]}]
(rum/use-layout-effect! setup-fn (if (empty? deps)
deps
#js[(memo-deps equal-fn deps)]))))
(rum/use-layout-effect! (fn [& deps]
(let [result (apply setup-fn deps)]
(when (fn? result) result)))
(if (empty? deps)
deps
#js[(memo-deps equal-fn deps)]))))
#_{:clj-kondo/ignore [:discouraged-var]}
(defn use-callback

View File

@@ -1,14 +1,15 @@
(ns logseq.shui.select.multi
(:require [clojure.string :as string]
[rum.core :as rum]
[logseq.shui.form.core :as form]
[logseq.shui.hooks :as hooks]
[logseq.shui.popup.core :as popup]
[logseq.shui.form.core :as form]))
[rum.core :as rum]))
(defn- get-k [item]
(if (map? item)
(some->> ((juxt :id :key :label) item)
(remove nil?)
(first))
(remove nil?)
(first))
item))
(defn- get-v
@@ -21,27 +22,27 @@
(let [*el (rum/use-ref nil)
[down set-down!] (rum/use-state 0)]
(rum/use-effect!
(fn []
(when-let [^js item (and (> down 0)
(some-> (rum/deref *el)
(.closest ".head")
(.-nextSibling)))]
(some-> (if valid-search-key? (.-nextSibling item) item)
(.focus))))
[down])
(hooks/use-effect!
(fn []
(when-let [^js item (and (> down 0)
(some-> (rum/deref *el)
(.closest ".head")
(.-nextSibling)))]
(some-> (if valid-search-key? (.-nextSibling item) item)
(.focus))))
[down])
[:div.search-input
{:ref *el}
(form/input
(merge {:placeholder "search"
:on-key-up #(case (.-key %)
"ArrowDown" (set-down! (inc down))
"ArrowUp" nil
"Enter" (when (fn? on-enter) (on-enter))
:dune)
:auto-focus true}
input-props))]))
(merge {:placeholder "search"
:on-key-up #(case (.-key %)
"ArrowDown" (set-down! (inc down))
"ArrowUp" nil
"Enter" (when (fn? on-enter) (on-enter))
:dune)
:auto-focus true}
input-props))]))
(defn- simple-search-fn
[items q]
@@ -49,8 +50,8 @@
(if (string/blank? q)
items
(filter #(some-> (get-v %)
(string/lower-case)
(string/includes? q)) items))))
(string/lower-case)
(string/includes? q)) items))))
(rum/defc x-select-content
[items selected-items & {:keys [on-chosen item-render value-render
@@ -70,8 +71,8 @@
(when (and search-enabled? (not= "INPUT" (.-nodeName target)))
;; focus search input
(some-> (get-content-el target)
(.querySelector "input")
(.focus))))
(.querySelector "input")
(.focus))))
items (if search-enabled?
(if (fn? search-fn)
(search-fn items search-key1)
@@ -79,100 +80,100 @@
items)
close1! #(when (fn? close!) (close!))]
(rum/use-effect!
(fn []
(when (fn? on-search-key-change)
(on-search-key-change search-key1')))
[search-key1'])
(hooks/use-effect!
(fn []
(when (fn? on-search-key-change)
(on-search-key-change search-key1')))
[search-key1'])
(rum/use-effect!
(fn []
(when-let [t (when (and search-enabled? (false? open?))
(js/setTimeout #(set-search-key! "") 500))]
#(js/clearTimeout t)))
[open?])
(hooks/use-effect!
(fn []
(when-let [t (when (and search-enabled? (false? open?))
(js/setTimeout #(set-search-key! "") 500))]
#(js/clearTimeout t)))
[open?])
(x-content
(merge
{:onInteractOutside close1!
:onEscapeKeyDown close1!
:on-key-down (fn [^js e]
(when-let [^js target (.-target e)]
(case (.-key e)
"ArrowUp"
(when (= (some-> (get-item-nodes target) (first))
js/document.activeElement)
(focus-search-input! target))
"l" (when (or (.-metaKey e) (.-ctrlKey e))
(focus-search-input! target))
:dune)))
:class (str (:class content-props)
" ui__multi-select-content"
(when valid-search-key? " has-search-key"))}
(dissoc content-props :class))
(merge
{:onInteractOutside close1!
:onEscapeKeyDown close1!
:on-key-down (fn [^js e]
(when-let [^js target (.-target e)]
(case (.-key e)
"ArrowUp"
(when (= (some-> (get-item-nodes target) (first))
js/document.activeElement)
(focus-search-input! target))
"l" (when (or (.-metaKey e) (.-ctrlKey e))
(focus-search-input! target))
:dune)))
:class (str (:class content-props)
" ui__multi-select-content"
(when valid-search-key? " has-search-key"))}
(dissoc content-props :class))
;; header
(when (or search-enabled? (fn? head-render))
[:div.head
{:ref *head-ref}
(when search-enabled?
(search-input
{:value search-key1
:on-key-down (fn [^js e]
(.stopPropagation e)
(case (.-key e)
"Escape" (if (string/blank? search-key1)
(some-> (.-target e) (.closest "[data-radix-menu-content]") (.focus))
(set-search-key! ""))
:dune))
:on-change #(set-search-key! (.-value (.-target %)))}
(when (or search-enabled? (fn? head-render))
[:div.head
{:ref *head-ref}
(when search-enabled?
(search-input
{:value search-key1
:on-key-down (fn [^js e]
(.stopPropagation e)
(case (.-key e)
"Escape" (if (string/blank? search-key1)
(some-> (.-target e) (.closest "[data-radix-menu-content]") (.focus))
(set-search-key! ""))
:dune))
:on-change #(set-search-key! (.-value (.-target %)))}
{:on-enter (fn []
(when-let [head-el (and (not (string/blank? search-key1'))
(rum/deref *head-ref))]
(when-let [^js item (.-nextSibling head-el)]
(when (contains? #{"menuitemcheckbox" "menuitem"}
(.getAttribute item "role"))
(.click item)))))
:valid-search-key? valid-search-key?}))
(when head-render (head-render))])
{:on-enter (fn []
(when-let [head-el (and (not (string/blank? search-key1'))
(rum/deref *head-ref))]
(when-let [^js item (.-nextSibling head-el)]
(when (contains? #{"menuitemcheckbox" "menuitem"}
(.getAttribute item "role"))
(.click item)))))
:valid-search-key? valid-search-key?}))
(when head-render (head-render))])
;; items
(for [item items
:let [selected? (some #(let [k (get-k item)
k' (get-k %)]
(or (= item %)
(and (not (nil? k))
(not (nil? k'))
(= k k'))))
selected-items)]]
(if (fn? item-render)
(item-render item {:x-item x-item :selected? selected?})
(let [k (get-k item)
v (get-v item)]
(when k
(let [opts {:selected? selected?}
on-click' (:on-click item-props)
on-click (fn [e]
(for [item items
:let [selected? (some #(let [k (get-k item)
k' (get-k %)]
(or (= item %)
(and (not (nil? k))
(not (nil? k'))
(= k k'))))
selected-items)]]
(if (fn? item-render)
(item-render item {:x-item x-item :selected? selected?})
(let [k (get-k item)
v (get-v item)]
(when k
(let [opts {:selected? selected?}
on-click' (:on-click item-props)
on-click (fn [e]
;; TODO: return value
(when (fn? on-click') (on-click' e))
(when (fn? on-chosen)
(on-chosen item opts)))]
(x-item (merge {:data-k k :on-click on-click} item-props)
[:span.flex.items-center.gap-2.w-full
(form/checkbox {:checked selected?})
(let [v' (if (fn? v) (v item opts) v)]
(if (fn? value-render)
(value-render v' (assoc opts :item item)) v'))]))))))
(when (fn? on-click') (on-click' e))
(when (fn? on-chosen)
(on-chosen item opts)))]
(x-item (merge {:data-k k :on-click on-click} item-props)
[:span.flex.items-center.gap-2.w-full
(form/checkbox {:checked selected?})
(let [v' (if (fn? v) (v item opts) v)]
(if (fn? value-render)
(value-render v' (assoc opts :item item)) v'))]))))))
(when (and search-enabled?
(fn? search-key-render))
(let [exist-fn (fn []
(and (not (string/blank? search-key1))
(seq items)
(contains? (into #{} (map #(some-> (get-v %) (string/lower-case)) items))
(string/lower-case search-key1))))]
(search-key-render search-key1
{:items items :x-item x-item :exist-fn exist-fn})))
(when (and search-enabled?
(fn? search-key-render))
(let [exist-fn (fn []
(and (not (string/blank? search-key1))
(seq items)
(contains? (into #{} (map #(some-> (get-v %) (string/lower-case)) items))
(string/lower-case search-key1))))]
(search-key-render search-key1
{:items items :x-item x-item :exist-fn exist-fn})))
;; footer
(when (fn? foot-render)
[:div.foot
(foot-render)]))))
(when (fn? foot-render)
[:div.foot
(foot-render)]))))

View File

@@ -2,6 +2,7 @@
"Table"
(:require [clojure.set :as set]
[dommy.core :refer-macros [sel1]]
[logseq.shui.hooks :as hooks]
[logseq.shui.table.impl :as impl]
[rum.core :as rum]))
@@ -147,7 +148,7 @@
;; FIXME: ux
(defn- use-sticky-element!
[^js/HTMLElement container target-ref]
(rum/use-effect!
(hooks/use-effect!
(fn []
(let [^js el (rum/deref target-ref)
^js cls (.-classList el)
@@ -189,7 +190,7 @@
;; FIXME: another solution for the sticky header
(defn- use-sticky-element2!
[^js/HTMLDivElement target-ref]
(rum/use-effect!
(hooks/use-effect!
(fn []
(let [^js target (rum/deref target-ref)
^js container (or (.closest target ".sidebar-item-list") (get-main-scroll-container))
@@ -205,7 +206,7 @@
update-target-top! (fn []
(when (not (.contains target-cls "ls-fixed"))
(vreset! *el-top (+ (-> target (.getBoundingClientRect) (.-top))
(.-scrollTop container)))))
(.-scrollTop container)))))
update-footer! (fn []
(let [tw (.-scrollWidth table)]
(when (and table-footer (number? tw) (> tw 0))
@@ -228,7 +229,7 @@
table-in-top (+ scroll-top head-height)
table-bottom (.-bottom (.getBoundingClientRect table))
fixed? (and (> table-bottom (+ head-height 90))
(> table-in-top @*el-top))]
(> table-in-top @*el-top))]
(if fixed?
(.add target-cls "ls-fixed")
(.remove target-cls "ls-fixed"))
@@ -236,7 +237,7 @@
target-observe-handle! (fn [^js _e]
(when (not @*ticking?)
(js/window.requestAnimationFrame
#(do (target-observe!) (vreset! *ticking? false)))
#(do (target-observe!) (vreset! *ticking? false)))
(vreset! *ticking? true)))
resize-observer (js/ResizeObserver. update-target!)
page-resize-observer (js/ResizeObserver. (fn [] (update-target-top!)))]
@@ -251,8 +252,8 @@
;; teardown
#(do (.removeEventListener container "scroll" target-observe!)
(.disconnect resize-observer)
(.disconnect page-resize-observer))))))
(.disconnect resize-observer)
(.disconnect page-resize-observer))))))
[]))
(rum/defc table-header < rum/static

View File

@@ -1,8 +1,9 @@
(ns logseq.shui.toaster.core
(:require [rum.core :as rum]
(:require [cljs-bean.core :as bean]
[daiquiri.interpreter :refer [interpret]]
[logseq.shui.hooks :as hooks]
[logseq.shui.util :as util]
[cljs-bean.core :as bean]))
[rum.core :as rum]))
(defonce ^:private Toaster (util/lsui-wrap "Toaster"))
(defonce ^:private *toast (atom nil))
@@ -23,22 +24,22 @@
< rum/static
[]
(let [^js js-toast (js/window.LSUI.useToast)]
(rum/use-effect!
(fn []
(reset! *toast {:toast (.-toast js-toast)
:dismiss (.-dismiss js-toast)
:update (.-update js-toast)})
#())
[])
(hooks/use-effect!
(fn []
(reset! *toast {:toast (.-toast js-toast)
:dismiss (.-dismiss js-toast)
:update (.-update js-toast)})
#())
[])
[:<> (Toaster)]))
(defn update-html-props
[v]
(update-keys v
#(case %
:class :className
:for :htmlFor
%)))
#(case %
:class :className
:for :htmlFor
%)))
(defn interpret-vals
[config ks & args]
@@ -46,7 +47,7 @@
(let [v (get config k)
v (if (fn? v) (apply v args) v)]
(if (vector? v) (assoc config k (interpret v)) config)))
config ks))
config ks))
(defn toast!
([content-or-config] (toast! content-or-config :default nil))
@@ -56,12 +57,12 @@
(let [config (if (map? content-or-config)
content-or-config
(-> {:description content-or-config}
(merge (if (map? status) status {:variant status}))))
(merge (if (map? status) status {:variant status}))))
config (update-html-props (merge config opts))
id (or (:id config) (gen-id))
config (assoc config :id id)
config (interpret-vals config [:title :description :action :icon]
{:id id :dismiss! #(dismiss id) :update! #(toast! (assoc %1 :id id))})]
{:id id :dismiss! #(dismiss id) :update! #(toast! (assoc %1 :id id))})]
(js->clj (toast (clj->js config))))
:exception)))

View File

@@ -155,8 +155,8 @@
"pixi.js": "6.2.0",
"posthog-js": "1.10.2",
"prop-types": "^15.7.2",
"react": "17.0.2",
"react-dom": "17.0.2",
"react": "18.3.1",
"react-dom": "18.3.1",
"react-grid-layout": "0.16.6",
"react-intersection-observer": "^9.3.5",
"react-resize-context": "3.0.0",

View File

@@ -7,9 +7,9 @@
[frontend.context.i18n :refer [t]]
[frontend.db :as db]
[frontend.handler.page :as page-handler]
[frontend.hooks :as hooks]
[frontend.state :as state]
[logseq.common.config :as common-config]
[logseq.shui.hooks :as hooks]
[logseq.shui.ui :as shui]
[promesa.core :as p]
[rum.core :as rum]))

View File

@@ -8,10 +8,10 @@
[frontend.context.i18n :refer [t]]
[frontend.handler.assets :as assets-handler]
[frontend.handler.notification :as notification]
[frontend.hooks :as hooks]
[frontend.state :as state]
[frontend.ui :as ui]
[frontend.util :as util]
[logseq.shui.hooks :as hooks]
[logseq.shui.ui :as shui]
[medley.core :as medley]
[promesa.core :as p]

View File

@@ -55,7 +55,6 @@
[frontend.handler.route :as route-handler]
[frontend.handler.ui :as ui-handler]
[frontend.handler.whiteboard :as whiteboard-handler]
[frontend.hooks :as hooks]
[frontend.mixins :as mixins]
[frontend.mobile.intent :as mobile-intent]
[frontend.mobile.util :as mobile-util]
@@ -87,6 +86,7 @@
[logseq.graph-parser.text :as text]
[logseq.outliner.property :as outliner-property]
[logseq.shui.dialog.core :as shui-dialog]
[logseq.shui.hooks :as hooks]
[logseq.shui.ui :as shui]
[medley.core :as medley]
[promesa.core :as p]

View File

@@ -3,9 +3,9 @@
[frontend.components.header :as header]
[frontend.context.i18n :refer [t]]
[frontend.handler.notification :as notification]
[frontend.hooks :as hooks]
[frontend.ui :as ui]
[frontend.util :as util]
[logseq.shui.hooks :as hooks]
[reitit.frontend.easy :as rfe]
[rum.core :as rum]))

View File

@@ -18,7 +18,6 @@
[frontend.handler.page :as page-handler]
[frontend.handler.route :as route-handler]
[frontend.handler.whiteboard :as whiteboard-handler]
[frontend.hooks :as hooks]
[frontend.mixins :as mixins]
[frontend.modules.shortcut.core :as shortcut]
[frontend.modules.shortcut.utils :as shortcut-utils]
@@ -36,6 +35,7 @@
[logseq.common.util.block-ref :as block-ref]
[logseq.db :as ldb]
[logseq.graph-parser.text :as text]
[logseq.shui.hooks :as hooks]
[logseq.shui.ui :as shui]
[promesa.core :as p]
[rum.core :as rum]))

View File

@@ -2,8 +2,8 @@
(:require
["remove-accents" :as remove-accents]
[clojure.string :as string]
[frontend.hooks :as hooks]
[goog.string :as gstring]
[logseq.shui.hooks :as hooks]
[logseq.shui.ui :as shui]
[rum.core :as rum]))

View File

@@ -31,7 +31,6 @@
[frontend.handler.route :as route-handler]
[frontend.handler.user :as user-handler]
[frontend.handler.whiteboard :as whiteboard-handler]
[frontend.hooks :as hooks]
[frontend.mixins :as mixins]
[frontend.mobile.action-bar :as action-bar]
[frontend.mobile.footer :as footer]
@@ -52,6 +51,7 @@
[logseq.common.util.namespace :as ns-util]
[logseq.db :as ldb]
[logseq.shui.dialog.core :as shui-dialog]
[logseq.shui.hooks :as hooks]
[logseq.shui.popup.core :as shui-popup]
[logseq.shui.toaster.core :as shui-toaster]
[logseq.shui.ui :as shui]

View File

@@ -3,9 +3,9 @@
["@dnd-kit/sortable" :refer [useSortable arrayMove SortableContext verticalListSortingStrategy horizontalListSortingStrategy] :as sortable]
["@dnd-kit/utilities" :refer [CSS]]
[cljs-bean.core :as bean]
[frontend.hooks :as hooks]
[frontend.rum :as r]
[frontend.state :as state]
[logseq.shui.hooks :as hooks]
[rum.core :as rum]))
(def dnd-context (r/adapt-class DndContext))

View File

@@ -19,7 +19,6 @@
[frontend.handler.paste :as paste-handler]
[frontend.handler.property.util :as pu]
[frontend.handler.search :as search-handler]
[frontend.hooks :as hooks]
[frontend.mixins :as mixins]
[frontend.search :refer [fuzzy-search]]
[frontend.state :as state]
@@ -34,6 +33,7 @@
[logseq.db :as ldb]
[logseq.db.frontend.class :as db-class]
[logseq.graph-parser.property :as gp-property]
[logseq.shui.hooks :as hooks]
[logseq.shui.ui :as shui]
[promesa.core :as p]
[react-draggable]

View File

@@ -4,12 +4,12 @@
[frontend.components.file-based.datetime :as datetime-comp]
[frontend.handler.editor :as editor-handler]
[frontend.handler.file-based.repeated :as repeated]
[frontend.hooks :as hooks]
[frontend.state :as state]
[frontend.ui :as ui]
[frontend.util :as util]
[frontend.util.file-based.clock :as clock]
[frontend.util.file-based.drawer :as drawer]
[logseq.shui.hooks :as hooks]
[logseq.shui.ui :as shui]
[reitit.frontend.easy :as rfe]
[rum.core :as rum]))

View File

@@ -2,10 +2,10 @@
(:require [clojure.string :as string]
[frontend.handler.file-based.file :as file-handler]
[frontend.handler.shell :as shell]
[frontend.hooks :as hooks]
[frontend.state :as state]
[frontend.ui :as ui]
[frontend.util :as util]
[logseq.shui.hooks :as hooks]
[promesa.core :as p]
[rum.core :as rum]))
@@ -73,7 +73,7 @@
(ui/button "Revert"
:on-click (fn []
(file-handler/alter-file (state/get-current-repo)
path
content
{:re-render-root? true
:skip-compare? true})))]]]))
path
content
{:re-render-root? true
:skip-compare? true})))]]]))

View File

@@ -19,7 +19,6 @@
[frontend.handler.page :as page-handler]
[frontend.handler.repo :as repo-handler]
[frontend.handler.user :as user-handler]
[frontend.hooks :as hooks]
[frontend.mobile.util :as mobile-util]
[frontend.state :as state]
[frontend.storage :as storage]
@@ -29,6 +28,7 @@
[frontend.util.persist-var :as persist-var]
[goog.functions :refer [debounce]]
[logseq.common.util :as common-util]
[logseq.shui.hooks :as hooks]
[logseq.shui.ui :as shui]
[promesa.core :as p]
[reitit.frontend.easy :as rfe]

View File

@@ -1,9 +1,9 @@
(ns frontend.components.handbooks
(:require ;[shadow.lazy :as lazy]
[frontend.extensions.handbooks.core :as handbooks]
[frontend.hooks :as hooks]
[frontend.modules.layout.core :as layout]
[frontend.state :as state]
[logseq.shui.hooks :as hooks]
[rum.core :as rum]))
#_:clj-kondo/ignore

View File

@@ -23,7 +23,6 @@
[frontend.handler.plugin :as plugin-handler]
[frontend.handler.route :as route-handler]
[frontend.handler.user :as user-handler]
[frontend.hooks :as hooks]
[frontend.mobile.util :as mobile-util]
[frontend.state :as state]
[frontend.storage :as storage]
@@ -31,6 +30,7 @@
[frontend.util :as util]
[frontend.version :refer [version]]
[logseq.db :as ldb]
[logseq.shui.hooks :as hooks]
[logseq.shui.ui :as shui]
[logseq.shui.util :as shui-util]
[missionary.core :as m]

View File

@@ -6,7 +6,6 @@
[clojure.string :as string]
[frontend.config :as config]
[frontend.handler.property.util :as pu]
[frontend.hooks :as hooks]
[frontend.search :as search]
[frontend.storage :as storage]
[frontend.ui :as ui]
@@ -14,6 +13,7 @@
[goog.functions :refer [debounce]]
[goog.object :as gobj]
[logseq.db :as ldb]
[logseq.shui.hooks :as hooks]
[logseq.shui.ui :as shui]
[medley.core :as medley]
[promesa.core :as p]

View File

@@ -18,7 +18,6 @@
[frontend.handler.repo :as repo-handler]
[frontend.handler.route :as route-handler]
[frontend.handler.ui :as ui-handler]
[frontend.hooks :as hooks]
[frontend.persist-db.browser :as db-browser]
[frontend.state :as state]
[frontend.ui :as ui]
@@ -32,6 +31,7 @@
[logseq.graph-parser.exporter :as gp-exporter]
[logseq.shui.dialog.core :as shui-dialog]
[logseq.shui.form.core :as form-core]
[logseq.shui.hooks :as hooks]
[logseq.shui.ui :as shui]
[promesa.core :as p]
[rum.core :as rum]))

View File

@@ -8,7 +8,6 @@
[frontend.db.model :as db-model]
[frontend.db.react :as react]
[frontend.handler.editor :as editor-handler]
[frontend.hooks :as hooks]
[frontend.mixins :as mixins]
[frontend.modules.outliner.op :as outliner-op]
[frontend.modules.outliner.ui :as ui-outliner-tx]
@@ -16,6 +15,7 @@
[logseq.db.frontend.entity-util :as entity-util]
[logseq.db.frontend.property :as db-property]
[logseq.outliner.property :as outliner-property]
[logseq.shui.hooks :as hooks]
[logseq.shui.ui :as shui]
[promesa.core :as p]
[rum.core :as rum]))

View File

@@ -33,7 +33,6 @@
[frontend.handler.notification :as notification]
[frontend.handler.page :as page-handler]
[frontend.handler.route :as route-handler]
[frontend.hooks :as hooks]
[frontend.mixins :as mixins]
[frontend.mobile.util :as mobile-util]
[frontend.rum :as frontend-rum]
@@ -46,6 +45,7 @@
[logseq.common.util.page-ref :as page-ref]
[logseq.db :as ldb]
[logseq.graph-parser.mldoc :as gp-mldoc]
[logseq.shui.hooks :as hooks]
[logseq.shui.ui :as shui]
[promesa.core :as p]
[reitit.frontend.easy :as rfe]

View File

@@ -12,7 +12,6 @@
[frontend.handler.plugin :as plugin-handler]
[frontend.handler.plugin-config :as plugin-config-handler]
[frontend.handler.ui :as ui-handler]
[frontend.hooks :as hooks]
[frontend.mixins :as mixins]
[frontend.rum :as rum-utils]
[frontend.search :as search]
@@ -20,6 +19,7 @@
[frontend.storage :as storage]
[frontend.ui :as ui]
[frontend.util :as util]
[logseq.shui.hooks :as hooks]
[logseq.shui.ui :as shui]
[promesa.core :as p]
[rum.core :as rum]))

View File

@@ -3,10 +3,10 @@
[frontend.components.lazy-editor :as lazy-editor]
[frontend.handler.notification :as notification]
[frontend.handler.plugin :as plugin-handler]
[frontend.hooks :as hooks]
[frontend.ui :as ui]
[frontend.util :as util]
[goog.functions :refer [debounce]]
[logseq.shui.hooks :as hooks]
[logseq.shui.ui :as shui]
[rum.core :as rum]))

View File

@@ -18,7 +18,6 @@
[frontend.handler.property :as property-handler]
[frontend.handler.property.util :as pu]
[frontend.handler.route :as route-handler]
[frontend.hooks :as hooks]
[frontend.mixins :as mixins]
[frontend.modules.shortcut.core :as shortcut]
[frontend.state :as state]
@@ -31,6 +30,7 @@
[logseq.db.frontend.property.type :as db-property-type]
[logseq.outliner.core :as outliner-core]
[logseq.outliner.property :as outliner-property]
[logseq.shui.hooks :as hooks]
[logseq.shui.ui :as shui]
[promesa.core :as p]
[rum.core :as rum]))

View File

@@ -15,7 +15,6 @@
[frontend.handler.db-based.property :as db-property-handler]
[frontend.handler.property :as property-handler]
[frontend.handler.route :as route-handler]
[frontend.hooks :as hooks]
[frontend.state :as state]
[frontend.ui :as ui]
[frontend.util :as util]
@@ -25,6 +24,7 @@
[logseq.db.frontend.property :as db-property]
[logseq.db.frontend.property.type :as db-property-type]
[logseq.outliner.core :as outliner-core]
[logseq.shui.hooks :as hooks]
[logseq.shui.popup.core :as shui-popup]
[logseq.shui.ui :as shui]
[promesa.core :as p]

View File

@@ -23,7 +23,6 @@
[frontend.handler.property :as property-handler]
[frontend.handler.property.util :as pu]
[frontend.handler.route :as route-handler]
[frontend.hooks :as hooks]
[frontend.modules.outliner.ui :as ui-outliner-tx]
[frontend.search :as search]
[frontend.state :as state]
@@ -38,6 +37,7 @@
[logseq.db.frontend.property :as db-property]
[logseq.db.frontend.property.type :as db-property-type]
[logseq.outliner.property :as outliner-property]
[logseq.shui.hooks :as hooks]
[logseq.shui.ui :as shui]
[promesa.core :as p]
[rum.core :as rum]))
@@ -1340,12 +1340,12 @@
value-cp)))]]
(if show-tooltip?
(shui/tooltip-provider
(shui/tooltip
{:delayDuration 1200}
(shui/tooltip-trigger
{:onFocusCapture #(util/stop-propagation %)
:as-child true}
value-cp)
(shui/tooltip-content
(str "Change " (:block/title property)))))
(shui/tooltip
{:delayDuration 1200}
(shui/tooltip-trigger
{:onFocusCapture #(util/stop-propagation %)
:as-child true}
value-cp)
(shui/tooltip-content
(str "Change " (:block/title property)))))
value-cp))))))

View File

@@ -10,12 +10,12 @@
[frontend.db-mixins :as db-mixins]
[frontend.extensions.sci :as sci]
[frontend.handler.editor :as editor-handler]
[frontend.hooks :as hooks]
[frontend.state :as state]
[frontend.ui :as ui]
[frontend.util :as util]
[lambdaisland.glogi :as log]
[logseq.db :as ldb]
[logseq.shui.hooks :as hooks]
[rum.core :as rum]))
(defn- built-in-custom-query?

View File

@@ -11,7 +11,6 @@
[frontend.db.query-dsl :as query-dsl]
[frontend.handler.editor :as editor-handler]
[frontend.handler.query.builder :as query-builder]
[frontend.hooks :as hooks]
[frontend.mixins :as mixins]
[frontend.state :as state]
[frontend.ui :as ui]
@@ -23,6 +22,7 @@
[logseq.db.frontend.property.type :as db-property-type]
[logseq.db.sqlite.util :as sqlite-util]
[logseq.graph-parser.db :as gp-db]
[logseq.shui.hooks :as hooks]
[logseq.shui.ui :as shui]
[promesa.core :as p]
[rum.core :as rum]))

View File

@@ -16,11 +16,11 @@
[frontend.handler.editor :as editor-handler]
[frontend.handler.route :as route-handler]
[frontend.handler.ui :as ui-handler]
[frontend.hooks :as hooks]
[frontend.state :as state]
[frontend.ui :as ui]
[frontend.util :as util]
[logseq.db :as ldb]
[logseq.shui.hooks :as hooks]
[logseq.shui.ui :as shui]
[medley.core :as medley]
[reitit.frontend.easy :as rfe]

View File

@@ -3,10 +3,10 @@
[clojure.string :as string]
[electron.ipc :as ipc]
[frontend.handler.notification :as notification]
[frontend.hooks :as hooks]
[frontend.state :as state]
[frontend.ui :as ui]
[frontend.util :as util]
[logseq.shui.hooks :as hooks]
[logseq.shui.ui :as shui]
[medley.core :as medley]
[promesa.core :as p]

View File

@@ -21,7 +21,6 @@
[frontend.handler.route :as route-handler]
[frontend.handler.ui :as ui-handler]
[frontend.handler.user :as user-handler]
[frontend.hooks :as hooks]
[frontend.mobile.util :as mobile-util]
[frontend.modules.instrumentation.core :as instrument]
[frontend.modules.shortcut.data-helper :as shortcut-helper]
@@ -34,6 +33,7 @@
[goog.object :as gobj]
[goog.string :as gstring]
[logseq.db :as ldb]
[logseq.shui.hooks :as hooks]
[logseq.shui.ui :as shui]
[promesa.core :as p]
[reitit.frontend.easy :as rfe]

View File

@@ -3,7 +3,6 @@
[clojure.string :as string]
[frontend.context.i18n :refer [t]]
[frontend.handler.notification :as notification]
[frontend.hooks :as hooks]
[frontend.modules.shortcut.config :as shortcut-config]
[frontend.modules.shortcut.core :as shortcut]
[frontend.modules.shortcut.data-helper :as dh]
@@ -14,6 +13,7 @@
[frontend.util :as util]
[goog.events :as events]
[logseq.shui.dialog.core :as shui-dialog]
[logseq.shui.hooks :as hooks]
[logseq.shui.ui :as shui]
[promesa.core :as p]
[rum.core :as rum])

View File

@@ -8,12 +8,12 @@
[frontend.handler.plugin-config :as plugin-config-handler]
[frontend.handler.route :as route-handler]
[frontend.handler.ui :as ui-handler]
[frontend.hooks :as hooks]
[frontend.rum :refer [use-mounted]]
[frontend.state :as state]
[frontend.storage :as storage]
[frontend.ui :as ui]
[frontend.util :as util]
[logseq.shui.hooks :as hooks]
[logseq.shui.ui :as shui]
[rum.core :as rum]))

View File

@@ -6,10 +6,10 @@
[frontend.handler.notification :as notification]
[frontend.handler.route :as route-handler]
[frontend.handler.user :as user]
[frontend.hooks :as hooks]
[frontend.modules.shortcut.core :as shortcut]
[frontend.rum :refer [adapt-class]]
[frontend.state :as state]
[logseq.shui.hooks :as hooks]
[logseq.shui.ui :as shui]
[rum.core :as rum]))

View File

@@ -26,7 +26,6 @@
[frontend.handler.property :as property-handler]
[frontend.handler.property.util :as pu]
[frontend.handler.ui :as ui-handler]
[frontend.hooks :as hooks]
[frontend.mixins :as mixins]
[frontend.state :as state]
[frontend.ui :as ui]
@@ -36,6 +35,7 @@
[logseq.db :as ldb]
[logseq.db.frontend.property :as db-property]
[logseq.db.frontend.property.type :as db-property-type]
[logseq.shui.hooks :as hooks]
[logseq.shui.table.core :as table-core]
[logseq.shui.ui :as shui]
[promesa.core :as p]

View File

@@ -9,7 +9,6 @@
[frontend.extensions.lightbox :as lightbox]
[frontend.extensions.video.youtube :as youtube]
[frontend.handler.notification :as notification]
[frontend.hooks :as hooks]
[frontend.modules.shortcut.config :as shortcut-config]
[frontend.rum :as r]
[frontend.search :as search]
@@ -17,6 +16,7 @@
[frontend.storage :as storage]
[frontend.ui :as ui]
[frontend.util :as util]
[logseq.shui.hooks :as hooks]
[medley.core :as medley]
[promesa.core :as p]
[rum.core :as rum]))

View File

@@ -14,13 +14,13 @@
[frontend.extensions.pdf.windows :as pdf-windows]
[frontend.handler.notification :as notification]
[frontend.handler.property :as property-handler]
[frontend.hooks :as hooks]
[frontend.modules.shortcut.core :as shortcut]
[frontend.rum :refer [use-atom]]
[frontend.state :as state]
[frontend.ui :as ui]
[frontend.util :as util]
[goog.functions :refer [debounce]]
[logseq.shui.hooks :as hooks]
[logseq.shui.ui :as shui]
[medley.core :as medley]
[promesa.core :as p]

View File

@@ -13,13 +13,13 @@
[frontend.extensions.pdf.windows :refer [resolve-own-container] :as pdf-windows]
[frontend.handler.assets :as assets-handler]
[frontend.handler.notification :as notification]
[frontend.hooks :as hooks]
[frontend.rum :refer [use-atom]]
[frontend.state :as state]
[frontend.storage :as storage]
[frontend.ui :as ui]
[frontend.util :as util]
[logseq.publishing.db :as publish-db]
[logseq.shui.hooks :as hooks]
[logseq.shui.ui :as shui]
[promesa.core :as p]
[rum.core :as rum]))

View File

@@ -19,7 +19,6 @@
[frontend.handler.page :as page-handler]
[frontend.handler.route :as route-handler]
[frontend.handler.whiteboard :as whiteboard-handler]
[frontend.hooks :as hooks]
[frontend.rum :as r]
[frontend.search :as search]
[frontend.state :as state]
@@ -28,6 +27,7 @@
[frontend.util.text :as text-util]
[goog.object :as gobj]
[logseq.common.util :as common-util]
[logseq.shui.hooks :as hooks]
[logseq.shui.ui :as shui]
[promesa.core :as p]
[rum.core :as rum]))

View File

@@ -9,11 +9,11 @@
[frontend.extensions.zotero.setting :as setting]
[frontend.handler.notification :as notification]
[frontend.handler.route :as route-handler]
[frontend.hooks :as hooks]
[frontend.state :as state]
[frontend.ui :as ui]
[frontend.util :as util]
[goog.dom :as gdom]
[logseq.shui.hooks :as hooks]
[logseq.shui.ui :as shui]
[promesa.core :as p]
[rum.core :as rum]))

View File

@@ -6,13 +6,13 @@
[frontend.handler.file-based.nfs :as nfs-handler]
[frontend.handler.notification :as notification]
[frontend.handler.page :as page-handler]
[frontend.hooks :as hooks]
[frontend.mobile.util :as mobile-util]
[frontend.modules.shortcut.core :as shortcut]
[frontend.state :as state]
[frontend.ui :as ui]
[frontend.util :as util]
[logseq.common.path :as path]
[logseq.shui.hooks :as hooks]
[logseq.shui.ui :as shui]
[promesa.core :as p]
[rum.core :as rum]))

View File

@@ -5,7 +5,7 @@
[clojure.string :as string]
[clojure.walk :as w]
[daiquiri.interpreter :as interpreter]
[frontend.hooks :as hooks]
[logseq.shui.hooks :as hooks]
[rum.core :refer [use-state] :as rum]))
;; copy from https://github.com/priornix/antizer/blob/35ba264cf48b84e6597743e28b3570d8aa473e74/src/antizer/core.cljs

View File

@@ -18,7 +18,6 @@
[frontend.db-mixins :as db-mixins]
[frontend.handler.notification :as notification]
[frontend.handler.plugin :as plugin-handler]
[frontend.hooks :as hooks]
[frontend.mixins :as mixins]
[frontend.mobile.util :as mobile-util]
[frontend.modules.shortcut.config :as shortcut-config]
@@ -32,6 +31,7 @@
[goog.dom :as gdom]
[goog.object :as gobj]
[lambdaisland.glogi :as log]
[logseq.shui.hooks :as hooks]
[logseq.shui.icon.v2 :as shui.icon.v2]
[logseq.shui.popup.core :as shui-popup]
[logseq.shui.ui :as shui]

View File

@@ -6943,14 +6943,13 @@ raw-body@2.5.2:
iconv-lite "0.4.24"
unpipe "1.0.0"
react-dom@17.0.2:
version "17.0.2"
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23"
integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==
react-dom@18.3.1:
version "18.3.1"
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4"
integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==
dependencies:
loose-envify "^1.1.0"
object-assign "^4.1.1"
scheduler "^0.20.2"
scheduler "^0.23.2"
react-draggable@3.x:
version "3.3.2"
@@ -7038,13 +7037,12 @@ react-virtuoso@4.12.5:
resolved "https://registry.yarnpkg.com/react-virtuoso/-/react-virtuoso-4.12.5.tgz#cf92efc2527e56d6df1d4d63c6e4dd3fac5a4030"
integrity sha512-YeCbRRsC9CLf0buD0Rct7WsDbzf+yBU1wGbo05/XjbcN2nJuhgh040m3y3+6HVogTZxEqVm45ac9Fpae4/MxRQ==
react@17.0.2:
version "17.0.2"
resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037"
integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==
react@18.3.1:
version "18.3.1"
resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891"
integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==
dependencies:
loose-envify "^1.1.0"
object-assign "^4.1.1"
read-cache@^1.0.0:
version "1.0.0"
@@ -7472,13 +7470,12 @@ sax@>=0.6.0:
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
scheduler@^0.20.2:
version "0.20.2"
resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91"
integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==
scheduler@^0.23.2:
version "0.23.2"
resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3"
integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==
dependencies:
loose-envify "^1.1.0"
object-assign "^4.1.1"
semver-compare@^1.0.0:
version "1.0.0"