mirror of
https://github.com/logseq/logseq.git
synced 2026-06-01 19:01:22 +00:00
Merge branch 'master' into feat/google-login
This commit is contained in:
@@ -8,6 +8,7 @@
|
||||
[frontend.state :as state]
|
||||
[frontend.db :as db]
|
||||
[frontend.db.model :as model]
|
||||
[frontend.db.query-dsl :as query-dsl]
|
||||
[dommy.core :as d]
|
||||
[datascript.core :as dc]
|
||||
[goog.dom :as gdom]
|
||||
@@ -402,6 +403,13 @@
|
||||
(let [inline-list (mldoc/inline->edn v (mldoc/default-config format))]
|
||||
[:div.inline.mr-1 (map-inline {} inline-list)])))
|
||||
|
||||
(defn selection-range-in-block? []
|
||||
(and (= "Range" (. (js/window.getSelection) -type))
|
||||
(-> (js/window.getSelection)
|
||||
(.-anchorNode)
|
||||
(.-parentNode)
|
||||
(.closest ".block-content"))))
|
||||
|
||||
(defn- render-macro
|
||||
[config name arguments macro-content format]
|
||||
(if macro-content
|
||||
@@ -436,6 +444,8 @@
|
||||
(not (= (:id config) "contents")))
|
||||
[:span.text-gray-500 "]]"])]))
|
||||
|
||||
(declare custom-query)
|
||||
|
||||
(defn inline
|
||||
[{:keys [html-export?] :as config} item]
|
||||
(match item
|
||||
@@ -647,6 +657,13 @@
|
||||
[title])
|
||||
arguments)]
|
||||
(cond
|
||||
(= name "query")
|
||||
[:div.dsl-query
|
||||
(let [query (string/join "," arguments)]
|
||||
(custom-query (assoc config :dsl-query? true)
|
||||
{:title [:code.p-1 (str "Query: " query)]
|
||||
:query query}))]
|
||||
|
||||
(= name "youtube")
|
||||
(let [url (first arguments)]
|
||||
(when-let [youtube-id (cond
|
||||
@@ -659,14 +676,17 @@
|
||||
:else
|
||||
nil)]
|
||||
(when-not (string/blank? youtube-id)
|
||||
[:iframe
|
||||
{:allow-full-screen "allowfullscreen"
|
||||
:allow
|
||||
"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
|
||||
:frame-border "0"
|
||||
:src (str "https://www.youtube.com/embed/" youtube-id)
|
||||
:height "315"
|
||||
:width "560"}])))
|
||||
(let [width (min (- (util/get-width) 96)
|
||||
560)
|
||||
height (int (* width (/ 315 560)))]
|
||||
[:iframe
|
||||
{:allow-full-screen "allowfullscreen"
|
||||
:allow
|
||||
"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
|
||||
:frame-border "0"
|
||||
:src (str "https://www.youtube.com/embed/" youtube-id)
|
||||
:height height
|
||||
:width width}]))))
|
||||
|
||||
(= name "embed")
|
||||
(let [a (first arguments)]
|
||||
@@ -1040,10 +1060,11 @@
|
||||
(when (seq properties)
|
||||
[:div.blocks-properties.text-sm.opacity-80.my-1.p-2
|
||||
(for [[k v] properties]
|
||||
^{:key (str (:block/uuid block) "-" k)}
|
||||
[:div.my-1
|
||||
[:b k]
|
||||
[:span.mr-1 ":"]
|
||||
(inline-text (:block/format block) v)])])))
|
||||
(inline-text (:block/format block) (str v))])])))
|
||||
|
||||
(rum/defcs timestamp-cp < rum/reactive
|
||||
(rum/local false ::show?)
|
||||
@@ -1082,48 +1103,49 @@
|
||||
(rum/defc block-content < rum/reactive
|
||||
[config {:block/keys [uuid title level body meta content marker dummy? page format repo children pre-block? properties collapsed? idx block-refs-count scheduled scheduled-ast deadline deadline-ast repeated?] :as block} edit-input-id block-id slide?]
|
||||
(let [dragging? (rum/react *dragging?)
|
||||
attrs {:blockid (str uuid)
|
||||
attrs {:blockid (str uuid)
|
||||
;; FIXME: Click to copy a selection instead of click first and then copy
|
||||
;; It seems that `util/caret-range` can't get the correct range
|
||||
:on-click (fn [e]
|
||||
(let [target (gobj/get e "target")]
|
||||
(when-not (or (util/link? target)
|
||||
(util/input? target)
|
||||
(util/details-or-summary? target)
|
||||
(and (util/sup? target)
|
||||
(d/has-class? target "fn")))
|
||||
(editor-handler/clear-selection! nil)
|
||||
(editor-handler/unhighlight-block!)
|
||||
(let [cursor-range (util/caret-range (gdom/getElement block-id))
|
||||
properties-hidden? (text/properties-hidden? properties)
|
||||
content (text/remove-level-spaces content format)
|
||||
content (if properties-hidden? (text/remove-properties! content) content)]
|
||||
(state/set-editing!
|
||||
edit-input-id
|
||||
content
|
||||
block
|
||||
cursor-range))
|
||||
(util/stop e))))
|
||||
:on-drag-over (fn [event]
|
||||
(util/stop event)
|
||||
(when-not (dnd-same-block? uuid)
|
||||
(show-dnd-separator (str uuid "-nested"))))
|
||||
:on-click (fn [e]
|
||||
(when-not (selection-range-in-block?)
|
||||
(let [target (gobj/get e "target")]
|
||||
(when-not (or (util/link? target)
|
||||
(util/input? target)
|
||||
(util/details-or-summary? target)
|
||||
(and (util/sup? target)
|
||||
(d/has-class? target "fn")))
|
||||
(editor-handler/clear-selection! nil)
|
||||
(editor-handler/unhighlight-block!)
|
||||
(let [cursor-range (util/caret-range (gdom/getElement block-id))
|
||||
properties-hidden? (text/properties-hidden? properties)
|
||||
content (text/remove-level-spaces content format)
|
||||
content (if properties-hidden? (text/remove-properties! content) content)]
|
||||
(state/set-editing!
|
||||
edit-input-id
|
||||
content
|
||||
block
|
||||
cursor-range))
|
||||
(util/stop e)))))
|
||||
:on-drag-over (fn [event]
|
||||
(util/stop event)
|
||||
(when-not (dnd-same-block? uuid)
|
||||
(show-dnd-separator (str uuid "-nested"))))
|
||||
:on-drag-leave (fn [event]
|
||||
(hide-dnd-separator (str uuid))
|
||||
(hide-dnd-separator (str uuid "-nested"))
|
||||
(hide-dnd-separator (str uuid "-top")))
|
||||
:on-drop (fn [event]
|
||||
(util/stop event)
|
||||
(when-not (dnd-same-block? uuid)
|
||||
(let [from-dom-id (get-data-transfer-attr event "block-dom-id")]
|
||||
(dnd/move-block @*dragging-block
|
||||
block
|
||||
from-dom-id
|
||||
false
|
||||
true)))
|
||||
(reset! *dragging? false)
|
||||
(reset! *dragging-block nil)
|
||||
(editor-handler/unhighlight-block!))}]
|
||||
:on-drop (fn [event]
|
||||
(util/stop event)
|
||||
(when-not (dnd-same-block? uuid)
|
||||
(let [from-dom-id (get-data-transfer-attr event "block-dom-id")]
|
||||
(dnd/move-block @*dragging-block
|
||||
block
|
||||
from-dom-id
|
||||
false
|
||||
true)))
|
||||
(reset! *dragging? false)
|
||||
(reset! *dragging-block nil)
|
||||
(editor-handler/unhighlight-block!))}]
|
||||
[:div.flex.relative
|
||||
[:div.flex-1.flex-col.relative.block-content
|
||||
(cond-> {:id (str "block-content-" uuid)}
|
||||
@@ -1529,33 +1551,47 @@
|
||||
|
||||
(defn built-in-custom-query?
|
||||
[title]
|
||||
(contains? #{"🔨 NOW" "📅 NEXT"}
|
||||
title))
|
||||
(let [repo (state/get-current-repo)]
|
||||
(let [queries (state/sub [:config repo :default-queries :journals])]
|
||||
(when (seq queries)
|
||||
(boolean (some #(= % title) (map :title queries)))))))
|
||||
|
||||
(defn- trigger-custom-query!
|
||||
[state]
|
||||
(let [[config query] (:rum/args state)
|
||||
query-atom (if (:dsl-query? config)
|
||||
(query-dsl/query (state/get-current-repo) (:query query))
|
||||
(db/custom-query query))]
|
||||
(assoc state :query-atom query-atom)))
|
||||
|
||||
(rum/defcs custom-query < rum/reactive
|
||||
{:will-mount (fn [state]
|
||||
(let [[config query] (:rum/args state)
|
||||
query-atom (db/custom-query query)]
|
||||
(assoc state :query-atom query-atom)))
|
||||
{:will-mount trigger-custom-query!
|
||||
:did-mount (fn [state]
|
||||
(when-let [query (last (:rum/args state))]
|
||||
(state/add-custom-query-component! query (:rum/react-component state)))
|
||||
state)
|
||||
:did-remount (fn [_old_state state]
|
||||
(trigger-custom-query! state))
|
||||
:will-unmount (fn [state]
|
||||
(when-let [query (last (:rum/args state))]
|
||||
(state/remove-custom-query-component! query)
|
||||
(db/remove-custom-query! (state/get-current-repo) query))
|
||||
state)}
|
||||
[state config {:keys [title query inputs view collapsed? children?] :as q}]
|
||||
(let [query-atom (:query-atom state)]
|
||||
(let [dsl-query? (:dsl-query? config)
|
||||
query-atom (:query-atom state)]
|
||||
(let [current-block-uuid (or (:block/uuid (:block config))
|
||||
(:block/uuid config))
|
||||
;; exclude the current one, otherwise it'll loop forever
|
||||
remove-blocks (if current-block-uuid [current-block-uuid] nil)
|
||||
query-result (and query-atom (rum/react query-atom))
|
||||
|
||||
result (if (and query-result dsl-query?)
|
||||
query-result
|
||||
(db/custom-query-result-transform query-result remove-blocks q))
|
||||
result (if query-result
|
||||
(db/custom-query-result-transform query-result remove-blocks q))
|
||||
view-f (sci/eval-string (pr-str view))
|
||||
view-f (and view (sci/eval-string (pr-str view)))
|
||||
only-blocks? (:block/uuid (first result))
|
||||
blocks-grouped-by-page? (and (seq result)
|
||||
(coll? (first result))
|
||||
@@ -1582,6 +1618,7 @@
|
||||
(and (seq result)
|
||||
(or only-blocks? blocks-grouped-by-page?))
|
||||
(->hiccup result (cond-> (assoc config
|
||||
;; :editor-box editor/box
|
||||
:custom-query? true
|
||||
:group-by-page? blocks-grouped-by-page?)
|
||||
children?
|
||||
@@ -1592,9 +1629,9 @@
|
||||
;; page list
|
||||
(and (seq result)
|
||||
(:page/name (first result)))
|
||||
[:ol
|
||||
[:ul#query-pages.mt-1
|
||||
(for [{:page/keys [name original-name] :as page-entity} result]
|
||||
[:li
|
||||
[:li.mt-1
|
||||
[:a {:href (rfe/href :page {:name name})
|
||||
:on-click (fn [e]
|
||||
(util/stop e)
|
||||
|
||||
@@ -87,7 +87,15 @@
|
||||
.ls-block {
|
||||
min-height: 24px;
|
||||
padding: 2px 0;
|
||||
margin-top: 1px;
|
||||
border-bottom: 1px solid transparent;
|
||||
|
||||
&.selected {
|
||||
border-bottom-color: var(--ls-primary-background-color);
|
||||
|
||||
&:last-child {
|
||||
border-bottom-color: transparent;
|
||||
}
|
||||
}
|
||||
|
||||
img {
|
||||
box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
|
||||
(rum/defc custom-context-menu-content
|
||||
[]
|
||||
[:div#custom-context-menu.w-48.rounded-md.shadow-lg.transition.ease-out.duration-100.transform.opacity-100.scale-100.enter-done.absolute {:style {:z-index 4}}
|
||||
[:div#custom-context-menu
|
||||
[:div.py-1.rounded-md.bg-base-3.shadow-xs
|
||||
(ui/menu-link
|
||||
{:key "cut"
|
||||
@@ -111,7 +111,7 @@
|
||||
(let [properties (:block/properties block)
|
||||
heading (get properties "heading")
|
||||
heading? (= heading "true")]
|
||||
[:div#custom-context-menu.w-64.rounded-md.shadow-lg.transition.ease-out.duration-100.transform.opacity-100.scale-100.enter-done.absolute {:style {:z-index 4}}
|
||||
[:div#custom-context-menu
|
||||
[:div.py-1.rounded-md.bg-base-3.shadow-xs
|
||||
[:div.flex-row.flex.justify-between.py-4.pl-2
|
||||
[:div.flex-row.flex.justify-between
|
||||
@@ -177,7 +177,7 @@
|
||||
(ui/menu-link
|
||||
{:key "Copy block ref"
|
||||
:on-click (fn [_e]
|
||||
(editor-handler/copy-block-ref! block-id))}
|
||||
(editor-handler/copy-block-ref! block-id #(str "((" % "))")))}
|
||||
"Copy block ref")
|
||||
|
||||
(block-template block-id)
|
||||
|
||||
@@ -9,4 +9,11 @@
|
||||
.content a.initial-color:hover {
|
||||
color: initial;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
#custom-context-menu {
|
||||
@apply rounded-md shadow-lg transition ease-out duration-100 transform
|
||||
opacity-100 scale-100 absolute;
|
||||
|
||||
z-index: calc(var(--ls-z-index-level-1) + 1);
|
||||
}
|
||||
@@ -59,7 +59,8 @@
|
||||
(if collapse?
|
||||
(svg/arrow-right)
|
||||
(svg/arrow-down))]
|
||||
[:span.cp__diff-file-header-content path]
|
||||
[:span.cp__diff-file-header-content {:style {:word-break "break-word"}}
|
||||
path]
|
||||
(when resolved?
|
||||
[:span.text-green-600
|
||||
{:dangerouslySetInnerHTML
|
||||
|
||||
@@ -643,7 +643,7 @@
|
||||
(when-let [element (gdom/getElement id)]
|
||||
(.focus element)))
|
||||
state)
|
||||
:did-remount (fn [state]
|
||||
:did-remount (fn [_old-state state]
|
||||
(keyboards-handler/esc-save! state)
|
||||
state)
|
||||
:will-unmount (fn [state]
|
||||
|
||||
@@ -370,7 +370,8 @@
|
||||
[:div.text-sm.ml-1.mb-4.flex-1.inline-flex
|
||||
{:key "page-file"}
|
||||
[:span.opacity-50 {:style {:margin-top 2}} (t :file/file)]
|
||||
[:a.bg-base-2.px-1.ml-1.mr-3 {:style {:border-radius 4}
|
||||
[:a.bg-base-2.px-1.ml-1.mr-3 {:style {:border-radius 4
|
||||
:word-break "break-word"}
|
||||
:href (str "/file/" (util/url-encode file-path))}
|
||||
file-path]
|
||||
|
||||
|
||||
@@ -1,3 +1,12 @@
|
||||
.white-theme .cp__right-sidebar-settings a {
|
||||
html[data-theme=light] {
|
||||
.cp__right-sidebar-settings a {
|
||||
color: var(--ls-primary-text-color);
|
||||
}
|
||||
|
||||
.cp__right-sidebar {
|
||||
.block-content {
|
||||
--ls-page-inline-code-bg-color: var(--ls-quaternary-background-color);
|
||||
--ls-page-blockquote-bg-color: var(--ls-quaternary-background-color);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
[frontend.search :as search]
|
||||
[clojure.string :as string]
|
||||
[goog.dom :as gdom]
|
||||
[medley.core :as medley]
|
||||
[frontend.context.i18n :as i18n]))
|
||||
|
||||
(rum/defc dropdown-content-wrapper [state content]
|
||||
@@ -24,6 +25,46 @@
|
||||
"exited" "transition ease-in duration-75 transform opacity-0 scale-95")}
|
||||
content])
|
||||
|
||||
(defn- partition-between
|
||||
"Split `coll` at positions where `pred?` is true."
|
||||
[pred? coll]
|
||||
(let [switch (reductions not= true (map pred? coll (rest coll)))]
|
||||
(map (partial map first) (partition-by second (map list coll switch)))))
|
||||
|
||||
(rum/defc highlight-fuzzy
|
||||
[content indexes]
|
||||
(let [n (count content)
|
||||
max-hightlighted-len 64
|
||||
max-surrounding-len 32
|
||||
|
||||
first-index (first indexes)
|
||||
last-index (nth indexes (dec (count indexes)))
|
||||
last-index (min (+ first-index max-hightlighted-len -1) last-index)
|
||||
last-index* (+ last-index max-surrounding-len)
|
||||
indexes (take-while #(<= % last-index*) indexes)
|
||||
content-begin (max 0 (- first-index max-surrounding-len))
|
||||
content-end (min n (+ last-index 1 max-surrounding-len)) ; exclusive
|
||||
|
||||
; finds inconsecutive sections
|
||||
sections (partition-between #(> (- %2 %) 1) indexes)
|
||||
hl-ranges (for [sec sections
|
||||
:let [begin (first sec)
|
||||
end (-> sec last inc)]]
|
||||
[begin end]) ; `end` is exclusive
|
||||
hl-ranges* (concat [[content-begin content-begin]]
|
||||
hl-ranges
|
||||
[[content-end content-end]])
|
||||
normal-ranges (for [[[_ begin] [end _]] (partition 2 1 hl-ranges*)] [begin end])
|
||||
normal-hl-pairs (partition-all 2 (medley/interleave-all normal-ranges hl-ranges))]
|
||||
[:p
|
||||
(mapcat
|
||||
(fn [[normal highlighted]]
|
||||
[(when-some [[begin end] normal]
|
||||
[:span (subs content begin end)])
|
||||
(when-some [[begin end] highlighted]
|
||||
[:mark (subs content begin end)])])
|
||||
normal-hl-pairs)]))
|
||||
|
||||
(rum/defc highlight
|
||||
[content q]
|
||||
(let [q-pattern (->> q
|
||||
@@ -135,11 +176,11 @@
|
||||
data]
|
||||
|
||||
:block
|
||||
(let [{:block/keys [page content]} data]
|
||||
(let [{:block/keys [page content indexes]} data]
|
||||
(let [page (:page/original-name page)]
|
||||
[:div.flex-1
|
||||
[:div.text-sm.font-medium page]
|
||||
(highlight content search-q)]))
|
||||
(highlight-fuzzy content indexes)]))
|
||||
|
||||
nil))})])))
|
||||
|
||||
|
||||
@@ -68,6 +68,7 @@
|
||||
preferred-workflow (keyword (state/sub [:me :preferred_workflow]))
|
||||
preferred-language (state/sub [:preferred-language])
|
||||
enable-timetracking? (state/enable-timetracking?)
|
||||
enable-block-time? (state/enable-block-time?)
|
||||
show-brackets? (state/show-brackets?)
|
||||
github-token (state/sub [:me :access-token])
|
||||
cors-proxy (state/sub [:me :cors_proxy])
|
||||
@@ -128,101 +129,112 @@
|
||||
[:a {:href (str "/file/" (util/url-encode (str config/app-name "/" config/config-file)))}
|
||||
(t :settings-page/edit-config-edn)])
|
||||
|
||||
(when logged? [:hr])
|
||||
[:hr]
|
||||
|
||||
(when logged?
|
||||
[:div.mt-6.sm:mt-5
|
||||
[:div.sm:grid.sm:grid-cols-3.sm:gap-4.sm:items-start.sm:pt-5
|
||||
[:label.block.text-sm.font-medium.leading-5.sm:mt-px.sm:pt-2.opacity-70
|
||||
{:for "preferred_format"}
|
||||
(t :settings-page/preferred-file-format)]
|
||||
[:div.mt-1.sm:mt-0.sm:col-span-2
|
||||
[:div.max-w-lg.rounded-md.shadow-sm.sm:max-w-xs
|
||||
[:select.mt-1.form-select.block.w-full.pl-3.pr-10.py-2.text-base.leading-6.border-gray-300.focus:outline-none.focus:shadow-outline-blue.focus:border-blue-300.sm:text-sm.sm:leading-5
|
||||
{:on-change (fn [e]
|
||||
(let [format (-> (util/evalue e)
|
||||
[:div.mt-6.sm:mt-5
|
||||
[:div.sm:grid.sm:grid-cols-3.sm:gap-4.sm:items-start.sm:pt-5
|
||||
[:label.block.text-sm.font-medium.leading-5.sm:mt-px.sm:pt-2.opacity-70
|
||||
{:for "preferred_format"}
|
||||
(t :settings-page/preferred-file-format)]
|
||||
[:div.mt-1.sm:mt-0.sm:col-span-2
|
||||
[:div.max-w-lg.rounded-md.shadow-sm.sm:max-w-xs
|
||||
[:select.mt-1.form-select.block.w-full.pl-3.pr-10.py-2.text-base.leading-6.border-gray-300.focus:outline-none.focus:shadow-outline-blue.focus:border-blue-300.sm:text-sm.sm:leading-5
|
||||
{:on-change (fn [e]
|
||||
(let [format (-> (util/evalue e)
|
||||
(string/lower-case)
|
||||
keyword)]
|
||||
(user-handler/set-preferred-format! format)))}
|
||||
(for [format [:org :markdown]]
|
||||
[:option (cond->
|
||||
{:key (name format)}
|
||||
(= format preferred-format)
|
||||
(assoc :selected "selected"))
|
||||
(string/capitalize (name format))])]]]]
|
||||
[:div.mt-6.sm:grid.sm:grid-cols-3.sm:gap-4.sm:items-start.sm:pt-5
|
||||
[:label.block.text-sm.font-medium.leading-5.sm:mt-px.sm:pt-2.opacity-70
|
||||
{:for "preferred_workflow"}
|
||||
(t :settings-page/preferred-workflow)]
|
||||
[:div.mt-1.sm:mt-0.sm:col-span-2
|
||||
[:div.max-w-lg.rounded-md.shadow-sm.sm:max-w-xs
|
||||
[:select.mt-1.form-select.block.w-full.pl-3.pr-10.py-2.text-base.leading-6.border-gray-300.focus:outline-none.focus:shadow-outline-blue.focus:border-blue-300.sm:text-sm.sm:leading-5
|
||||
{:on-change (fn [e]
|
||||
(let [workflow (-> (util/evalue e)
|
||||
(string/lower-case)
|
||||
keyword)]
|
||||
(user-handler/set-preferred-format! format)))}
|
||||
(for [format [:org :markdown]]
|
||||
[:option (cond->
|
||||
{:key (name format)}
|
||||
(= format preferred-format)
|
||||
(assoc :selected "selected"))
|
||||
(string/capitalize (name format))])]]]]
|
||||
[:div.mt-6.sm:grid.sm:grid-cols-3.sm:gap-4.sm:items-start.sm:pt-5
|
||||
[:label.block.text-sm.font-medium.leading-5.sm:mt-px.sm:pt-2.opacity-70
|
||||
{:for "preferred_workflow"}
|
||||
(t :settings-page/preferred-workflow)]
|
||||
[:div.mt-1.sm:mt-0.sm:col-span-2
|
||||
[:div.max-w-lg.rounded-md.shadow-sm.sm:max-w-xs
|
||||
[:select.mt-1.form-select.block.w-full.pl-3.pr-10.py-2.text-base.leading-6.border-gray-300.focus:outline-none.focus:shadow-outline-blue.focus:border-blue-300.sm:text-sm.sm:leading-5
|
||||
{:on-change (fn [e]
|
||||
(let [workflow (-> (util/evalue e)
|
||||
(string/lower-case)
|
||||
keyword)
|
||||
workflow (if (= workflow :now/later)
|
||||
:now
|
||||
:todo)]
|
||||
(user-handler/set-preferred-workflow! workflow)))}
|
||||
(for [workflow [:now :todo]]
|
||||
[:option (cond->
|
||||
{:key (name workflow)}
|
||||
(= workflow preferred-workflow)
|
||||
(assoc :selected "selected"))
|
||||
(if (= workflow :now)
|
||||
"NOW/LATER"
|
||||
"TODO/DOING")])]]]]
|
||||
keyword)
|
||||
workflow (if (= workflow :now/later)
|
||||
:now
|
||||
:todo)]
|
||||
(user-handler/set-preferred-workflow! workflow)))}
|
||||
(for [workflow [:now :todo]]
|
||||
[:option (cond->
|
||||
{:key (name workflow)}
|
||||
(= workflow preferred-workflow)
|
||||
(assoc :selected "selected"))
|
||||
(if (= workflow :now)
|
||||
"NOW/LATER"
|
||||
"TODO/DOING")])]]]]
|
||||
|
||||
[:div.mt-6.sm:grid.sm:grid-cols-3.sm:gap-4.sm:items-start.sm:pt-5
|
||||
[:label.block.text-sm.font-medium.leading-5.opacity-70
|
||||
{:for "enable_timetracking"}
|
||||
(t :settings-page/enable-timetracking)]
|
||||
[:div.mt-1.sm:mt-0.sm:col-span-2
|
||||
[:div.max-w-lg.rounded-md.sm:max-w-xs
|
||||
(ui/toggle enable-timetracking?
|
||||
(fn []
|
||||
(let [value (not enable-timetracking?)]
|
||||
(config-handler/set-config! :feature/enable-timetracking? value))))]]]
|
||||
[:div.mt-6.sm:grid.sm:grid-cols-3.sm:gap-4.sm:items-start.sm:pt-5
|
||||
[:label.block.text-sm.font-medium.leading-5.opacity-70
|
||||
{:for "enable_timetracking"}
|
||||
(t :settings-page/enable-timetracking)]
|
||||
[:div.mt-1.sm:mt-0.sm:col-span-2
|
||||
[:div.max-w-lg.rounded-md.sm:max-w-xs
|
||||
(ui/toggle enable-timetracking?
|
||||
(fn []
|
||||
(let [value (not enable-timetracking?)]
|
||||
(config-handler/set-config! :feature/enable-timetracking? value))))]]]
|
||||
|
||||
[:hr]
|
||||
[:div.mt-6.sm:grid.sm:grid-cols-3.sm:gap-4.sm:items-start.sm:pt-5
|
||||
[:label.block.text-sm.font-medium.leading-5.opacity-70
|
||||
{:for "enable_block_time"}
|
||||
(t :settings-page/enable-block-time)]
|
||||
[:div.mt-1.sm:mt-0.sm:col-span-2
|
||||
[:div.max-w-lg.rounded-md.sm:max-w-xs
|
||||
(ui/toggle enable-block-time?
|
||||
(fn []
|
||||
(let [value (not enable-block-time?)]
|
||||
(config-handler/set-config! :feature/enable-block-time? value))))]]]
|
||||
|
||||
(ui/admonition
|
||||
:important
|
||||
[:p (t :settings-page/dont-use-other-peoples-proxy-servers)
|
||||
[:a {:href "https://github.com/isomorphic-git/cors-proxy"
|
||||
:target "_blank"}
|
||||
"https://github.com/isomorphic-git/cors-proxy"]])
|
||||
[:hr]
|
||||
|
||||
[:div.mt-6.sm:mt-5.sm:grid.sm:grid-cols-3.sm:gap-4.sm:items-start.sm:pt-5
|
||||
[:label.block.text-sm.font-medium.leading-5.sm:mt-px.sm:pt-2.opacity-70
|
||||
{:for "cors"}
|
||||
(t :settings-page/custom-cors-proxy-server)]
|
||||
[:div.mt-1.sm:mt-0.sm:col-span-2
|
||||
[:div.max-w-lg.rounded-md.shadow-sm.sm:max-w-xs
|
||||
[:input#pat.form-input.block.w-full.transition.duration-150.ease-in-out.sm:text-sm.sm:leading-5
|
||||
{:default-value cors-proxy
|
||||
:on-blur (fn [event]
|
||||
(when-let [server (util/evalue event)]
|
||||
(user-handler/set-cors! server)
|
||||
(notification/show! "Custom CORS proxy updated successfully!" :success)))
|
||||
:on-key-press (fn [event]
|
||||
(let [k (gobj/get event "key")]
|
||||
(if (= "Enter" k)
|
||||
(when-let [server (util/evalue event)]
|
||||
(user-handler/set-cors! server)
|
||||
(notification/show! "Custom CORS proxy updated successfully!" :success)))))}]]]]
|
||||
(when logged?
|
||||
[:div
|
||||
(ui/admonition
|
||||
:important
|
||||
[:p (t :settings-page/dont-use-other-peoples-proxy-servers)
|
||||
[:a {:href "https://github.com/isomorphic-git/cors-proxy"
|
||||
:target "_blank"}
|
||||
"https://github.com/isomorphic-git/cors-proxy"]])
|
||||
[:div.mt-6.sm:mt-5.sm:grid.sm:grid-cols-3.sm:gap-4.sm:items-start.sm:pt-5
|
||||
[:label.block.text-sm.font-medium.leading-5.sm:mt-px.sm:pt-2.opacity-70
|
||||
{:for "cors"}
|
||||
(t :settings-page/custom-cors-proxy-server)]
|
||||
[:div.mt-1.sm:mt-0.sm:col-span-2
|
||||
[:div.max-w-lg.rounded-md.shadow-sm.sm:max-w-xs
|
||||
[:input#pat.form-input.block.w-full.transition.duration-150.ease-in-out.sm:text-sm.sm:leading-5
|
||||
{:default-value cors-proxy
|
||||
:on-blur (fn [event]
|
||||
(when-let [server (util/evalue event)]
|
||||
(user-handler/set-cors! server)
|
||||
(notification/show! "Custom CORS proxy updated successfully!" :success)))
|
||||
:on-key-press (fn [event]
|
||||
(let [k (gobj/get event "key")]
|
||||
(if (= "Enter" k)
|
||||
(when-let [server (util/evalue event)]
|
||||
(user-handler/set-cors! server)
|
||||
(notification/show! "Custom CORS proxy updated successfully!" :success)))))}]]]]
|
||||
|
||||
[:hr]
|
||||
[:hr]])
|
||||
|
||||
[:div.sm:grid.sm:grid-cols-3.sm:gap-4.sm:items-start.sm:pt-5
|
||||
[:label.block.text-sm.font-medium.leading-5.sm:mt-px.sm:pt-2.opacity-70
|
||||
{:for "developer_mode"}
|
||||
(t :settings-page/developer-mode)]
|
||||
[:div.mt-1.sm:mt-0.sm:col-span-2
|
||||
[:div.max-w-lg.rounded-md.shadow-sm.sm:max-w-xs
|
||||
(ui/button (if developer-mode? (t :settings-page/disable-developer-mode) (t :settings-page/enable-developer-mode))
|
||||
:on-click #(state/set-developer-mode! (not developer-mode?)))]]]
|
||||
[:div.sm:grid.sm:grid-cols-3.sm:gap-4.sm:items-start.sm:pt-5
|
||||
[:label.block.text-sm.font-medium.leading-5.sm:mt-px.sm:pt-2.opacity-70
|
||||
{:for "developer_mode"}
|
||||
(t :settings-page/developer-mode)]
|
||||
[:div.mt-1.sm:mt-0.sm:col-span-2
|
||||
[:div.max-w-lg.rounded-md.shadow-sm.sm:max-w-xs
|
||||
(ui/button (if developer-mode? (t :settings-page/disable-developer-mode) (t :settings-page/enable-developer-mode))
|
||||
:on-click #(state/set-developer-mode! (not developer-mode?)))]]]
|
||||
|
||||
[:br]
|
||||
(t :settings-page/developer-mode-desc)])]])))
|
||||
[:br]
|
||||
(t :settings-page/developer-mode-desc)]]])))
|
||||
|
||||
@@ -115,7 +115,7 @@
|
||||
height: calc(100vh - 3rem);
|
||||
overflow-x: hidden;
|
||||
overflow-y: auto;
|
||||
z-index: 9;
|
||||
z-index: var(--ls-z-index-level-1);
|
||||
transition: width 0.3s, opacity 0.2s;
|
||||
border-radius: var(--ls-border-radius-low) 0 0 0;
|
||||
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
:root {
|
||||
scrollbar-width: thin;
|
||||
scrollbar-color: var(--ls-scrollbar-foreground-color) var(--ls-scrollbar-background-color);
|
||||
|
||||
--ls-z-index-level-0: 0;
|
||||
--ls-z-index-level-1: 9;
|
||||
--ls-z-index-level-2: 99;
|
||||
--ls-z-index-level-3: 999;
|
||||
--ls-z-index-level-4: 9999;
|
||||
--ls-z-index-level-5: 99999;
|
||||
}
|
||||
|
||||
html:not(.is-mac) {
|
||||
|
||||
Reference in New Issue
Block a user