Split out property related fns

in order to make editor ns more maintainable
This commit is contained in:
Gabriel Horner
2023-04-28 18:18:34 -04:00
committed by Tienson Qin
parent f73d964899
commit 9628fc52b9
11 changed files with 182 additions and 163 deletions

View File

@@ -64,6 +64,7 @@
frontend.handler.common.plugin plugin-common-handler
frontend.handler.common.developer dev-common-handler
frontend.handler.config config-handler
frontend.handler.editor.property editor-property
frontend.handler.events events
frontend.handler.global-config global-config-handler
frontend.handler.ui ui-handler

View File

@@ -10,6 +10,7 @@
[frontend.extensions.srs :as srs]
[frontend.handler.common :as common-handler]
[frontend.handler.editor :as editor-handler]
[frontend.handler.editor.property :as editor-property]
[frontend.handler.image :as image-handler]
[frontend.handler.notification :as notification]
[frontend.handler.page :as page-handler]
@@ -31,8 +32,8 @@
(rum/defc custom-context-menu-content
[]
[:.menu-links-wrapper
(ui/menu-background-color #(editor-handler/batch-add-block-property! (state/get-selection-block-ids) :background-color %)
#(editor-handler/batch-remove-block-property! (state/get-selection-block-ids) :background-color))
(ui/menu-background-color #(editor-property/batch-add-block-property! (state/get-selection-block-ids) :background-color %)
#(editor-property/batch-remove-block-property! (state/get-selection-block-ids) :background-color))
(ui/menu-heading #(editor-handler/batch-set-heading! (state/get-selection-block-ids) %)
#(editor-handler/batch-set-heading! (state/get-selection-block-ids) true)
@@ -157,9 +158,9 @@
[:p (t :context-menu/template-exists-warning)]
:error)
(do
(editor-handler/set-block-property! block-id :template title)
(editor-property/set-block-property! block-id :template title)
(when (false? template-including-parent?)
(editor-handler/set-block-property! block-id :template-including-parent false))
(editor-property/set-block-property! block-id :template-including-parent false))
(state/hide-custom-context-menu!)))))))]
[:hr.menu-separator]])
(ui/menu-link
@@ -176,8 +177,8 @@
(when-let [block (db/entity [:block/uuid block-id])]
(let [heading (-> block :block/properties :heading (or false))]
[:.menu-links-wrapper
(ui/menu-background-color #(editor-handler/set-block-property! block-id :background-color %)
#(editor-handler/remove-block-property! block-id :background-color))
(ui/menu-background-color #(editor-property/set-block-property! block-id :background-color %)
#(editor-property/remove-block-property! block-id :background-color))
(ui/menu-heading heading
#(editor-handler/set-heading! block-id %)

View File

@@ -12,6 +12,7 @@
[lambdaisland.glogi :as log]
[frontend.extensions.sci :as sci]
[frontend.handler.editor :as editor-handler]
[frontend.handler.editor.property :as editor-property]
[logseq.graph-parser.util :as gp-util]))
(defn built-in-custom-query?
@@ -206,12 +207,12 @@
(when (and current-block (not view-f) (nil? table-view?) (not page-list?))
(if table?
[:a.flex.ml-1.fade-link {:title "Switch to list view"
:on-click (fn [] (editor-handler/set-block-property! current-block-uuid
:on-click (fn [] (editor-property/set-block-property! current-block-uuid
"query-table"
false))}
(ui/icon "list" {:style {:font-size 20}})]
[:a.flex.ml-1.fade-link {:title "Switch to table view"
:on-click (fn [] (editor-handler/set-block-property! current-block-uuid
:on-click (fn [] (editor-property/set-block-property! current-block-uuid
"query-table"
true))}
(ui/icon "table" {:style {:font-size 20}})]))

View File

@@ -4,7 +4,7 @@
[frontend.db :as db]
[frontend.db.query-dsl :as query-dsl]
[frontend.handler.common :as common-handler]
[frontend.handler.editor :as editor-handler]
[frontend.handler.editor.property :as editor-property]
[frontend.state :as state]
[frontend.util :as util]
[frontend.util.clock :as clock]
@@ -80,8 +80,8 @@
[title column {:keys [sort-by-column sort-desc?]} block-id]
[:th.whitespace-nowrap
[:a {:on-click (fn []
(editor-handler/set-block-property! block-id :query-sort-by (name column))
(editor-handler/set-block-property! block-id :query-sort-desc (not sort-desc?)))}
(editor-property/set-block-property! block-id :query-sort-by (name column))
(editor-property/set-block-property! block-id :query-sort-desc (not sort-desc?)))}
[:div.flex.items-center
[:span.mr-1 title]
(when (= sort-by-column column)

View File

@@ -6,6 +6,7 @@
[frontend.db.utils :as db-utils]
[frontend.fs :as fs]
[frontend.handler.editor :as editor-handler]
[frontend.handler.editor.property :as editor-property]
[frontend.handler.page :as page-handler]
[frontend.handler.assets :as assets-handler]
[frontend.handler.notification :as notification]
@@ -132,7 +133,7 @@
(get-in highlight [:content :image])
(js/Date.now))
:hl-color (get-in highlight [:properties :color])}]
(editor-handler/set-block-property! (:block/uuid block) k v))))
(editor-property/set-block-property! (:block/uuid block) k v))))
(defn unlink-hl-area-image$
[^js _viewer current hl]

View File

@@ -13,6 +13,7 @@
[frontend.db-mixins :as db-mixins]
[frontend.state :as state]
[frontend.handler.editor :as editor-handler]
[frontend.handler.editor.property :as editor-property]
[frontend.components.block :as component-block]
[frontend.components.macro :as component-macro]
[frontend.components.select :as component-select]
@@ -483,7 +484,7 @@
:on-click (fn []
(score-and-next-card 1 card card-index finished? phase review-records cb)
(let [tomorrow (tc/to-string (t/plus (t/today) (t/days 1)))]
(editor-handler/set-block-property! root-block-id card-next-schedule-property tomorrow)))})
(editor-property/set-block-property! root-block-id card-next-schedule-property tomorrow)))})
(btn-with-shortcut {:btn-text (if (util/mobile?) "Hard" "Took a while to recall")
:shortcut "t"

View File

@@ -7,7 +7,7 @@
[frontend.db.model :as model]
[frontend.fs :as fs]
[logseq.common.path :as path]
[frontend.handler.editor :as editor]
[frontend.handler.editor.property :as editor-property]
[frontend.handler.file :as file-handler]
[frontend.handler.page :as page-handler]
[frontend.handler.ui :as ui-handler]
@@ -33,7 +33,7 @@
nil))]
(let [id-property (:id (:block/properties block))]
(when-not (= (str id-property) (str block-id))
(editor/set-block-property! block-id "id" block-id)))))))
(editor-property/set-block-property! block-id "id" block-id)))))))
(defn- handle-add-and-change!
[repo path content db-content mtime backup?]

View File

@@ -1,6 +1,7 @@
(ns frontend.handler.dnd
"Provides fns for drag n drop"
(:require [frontend.handler.editor :as editor-handler]
[frontend.handler.editor.property :as editor-property]
[frontend.modules.outliner.core :as outliner-core]
[frontend.modules.outliner.tree :as tree]
[frontend.modules.outliner.transaction :as outliner-tx]
@@ -20,7 +21,7 @@
;; alt pressed, make a block-ref
(and alt-key? (= (count blocks) 1))
(do
(editor-handler/set-block-property! (:block/uuid first-block)
(editor-property/set-block-property! (:block/uuid first-block)
:id
(str (:block/uuid first-block)))
(editor-handler/api-insert-new-block!

View File

@@ -19,6 +19,7 @@
[frontend.handler.assets :as assets-handler]
[frontend.handler.block :as block-handler]
[frontend.handler.common :as common-handler]
[frontend.handler.editor.property :as editor-property]
[frontend.handler.export.html :as export-html]
[frontend.handler.export.text :as export-text]
[frontend.handler.notification :as notification]
@@ -62,10 +63,8 @@
(defonce *asset-uploading? (atom false))
(defonce *asset-uploading-process (atom 0))
(declare set-block-property!)
(declare remove-block-property!)
(declare batch-add-block-property!)
(declare batch-remove-block-property!)
(def clear-selection! editor-property/clear-selection!)
(def edit-block! editor-property/edit-block!)
(defn get-block-own-order-list-type
[block]
@@ -74,12 +73,12 @@
(defn set-block-own-order-list-type!
[block type]
(when-let [uuid (:block/uuid block)]
(set-block-property! uuid :logseq.order-list-type (name type))))
(editor-property/set-block-property! uuid :logseq.order-list-type (name type))))
(defn remove-block-own-order-list-type!
[block]
(when-let [uuid (:block/uuid block)]
(remove-block-property! uuid :logseq.order-list-type)))
(editor-property/remove-block-property! uuid :logseq.order-list-type)))
(defn own-order-number-list?
[block]
@@ -96,8 +95,8 @@
blocks-uuids (some->> blocks (map :block/uuid) (remove nil?))
order-list-prop :logseq.order-list-type]
(if has-ordered?
(batch-remove-block-property! blocks-uuids order-list-prop)
(batch-add-block-property! blocks-uuids order-list-prop "number")))))
(editor-property/batch-remove-block-property! blocks-uuids order-list-prop)
(editor-property/batch-add-block-property! blocks-uuids order-list-prop "number")))))
(defn get-selection-and-format
[]
@@ -234,69 +233,7 @@
(doseq [block blocks]
(gdom-classes/remove block "block-highlight"))))
(defn- get-edit-input-id-with-block-id
[block-id]
(when-let [first-block (util/get-first-block-by-id block-id)]
(string/replace (gobj/get first-block "id")
"ls-block"
"edit-block")))
(defn clear-selection!
[]
(state/clear-selection!))
(defn- text-range-by-lst-fst-line [content [direction pos]]
(case direction
:up
(let [last-new-line (or (string/last-index-of content \newline) -1)
end (+ last-new-line pos 1)]
(subs content 0 end))
:down
(-> (string/split-lines content)
first
(or "")
(subs 0 pos))))
;; id: block dom id, "ls-block-counter-uuid"
(defn edit-block!
([block pos id]
(edit-block! block pos id nil))
([block pos id {:keys [custom-content tail-len move-cursor? retry-times]
:or {tail-len 0
move-cursor? true
retry-times 0}
:as opts}]
(when-not (> retry-times 2)
(when-not config/publishing?
(when-let [block-id (:block/uuid block)]
(let [block (or (db/pull [:block/uuid block-id]) block)
edit-input-id (if (uuid? id)
(get-edit-input-id-with-block-id id)
(-> (str (subs id 0 (- (count id) 36)) block-id)
(string/replace "ls-block" "edit-block")))
content (or custom-content (:block/content block) "")
content-length (count content)
text-range (cond
(vector? pos)
(text-range-by-lst-fst-line content pos)
(and (> tail-len 0) (>= (count content) tail-len))
(subs content 0 (- (count content) tail-len))
(or (= :max pos) (<= content-length pos))
content
:else
(subs content 0 pos))
content (-> (property/remove-built-in-properties (:block/format block)
content)
(drawer/remove-logbook))]
(clear-selection!)
(if edit-input-id
(state/set-editing! edit-input-id content block text-range move-cursor?)
;; Block may not be rendered yet
(js/setTimeout (fn [] (edit-block! block pos id (update opts :retry-times inc))) 10))))))))
(defn- another-block-with-same-id-exists?
[current-id block-id]
(when-let [id (and (string? block-id) (parse-uuid block-id))]
@@ -914,72 +851,6 @@
:block/properties-order (or (keys properties) [])
:block/content content})))
(defn- batch-set-block-property!
"col: a collection of [block-id property-key property-value]."
[col]
#_:clj-kondo/ignore
(when-let [repo (state/get-current-repo)]
(let [col' (group-by first col)]
(outliner-tx/transact!
{:outliner-op :save-block}
(doseq [[block-id items] col']
(let [block-id (if (string? block-id) (uuid block-id) block-id)
new-properties (zipmap (map second items)
(map last items))]
(when-let [block (db/entity [:block/uuid block-id])]
(let [format (:block/format block)
content (:block/content block)
properties (:block/properties block)
properties-text-values (:block/properties-text-values block)
properties (-> (merge properties new-properties)
gp-util/remove-nils-non-nested)
properties-text-values (-> (merge properties-text-values new-properties)
gp-util/remove-nils-non-nested)
property-ks (->> (concat (:block/properties-order block)
(map second items))
(filter (set (keys properties)))
distinct
vec)
content (property/remove-properties format content)
kvs (for [key property-ks] [key (or (get properties-text-values key)
(get properties key))])
content (property/insert-properties format content kvs)
content (property/remove-empty-properties content)
block {:block/uuid block-id
:block/properties properties
:block/properties-order property-ks
:block/properties-text-values properties-text-values
:block/content content}]
(outliner-core/save-block! block)))))))
(let [block-id (ffirst col)
block-id (if (string? block-id) (uuid block-id) block-id)
input-pos (or (state/get-edit-pos) :max)]
;; update editing input content
(when-let [editing-block (state/get-edit-block)]
(when (= (:block/uuid editing-block) block-id)
(edit-block! editing-block
input-pos
(state/get-edit-input-id)))))))
(defn batch-add-block-property!
[block-ids property-key property-value]
(batch-set-block-property! (map #(vector % property-key property-value) block-ids)))
(defn batch-remove-block-property!
[block-ids property-key]
(batch-set-block-property! (map #(vector % property-key nil) block-ids)))
(defn remove-block-property!
[block-id key]
(let [key (keyword key)]
(batch-set-block-property! [[block-id key nil]])))
(defn set-block-property!
[block-id key value]
(let [key (keyword key)]
(batch-set-block-property! [[block-id key value]])))
(defn set-block-query-properties!
[block-id all-properties key add?]
(when-let [block (db/entity [:block/uuid block-id])]
@@ -993,8 +864,8 @@
(remove #{key} query-properties))
query-properties (vec query-properties)]
(if (seq query-properties)
(set-block-property! block-id :query-properties (str query-properties))
(remove-block-property! block-id :query-properties)))))
(editor-property/set-block-property! block-id :query-properties (str query-properties))
(editor-property/remove-block-property! block-id :query-properties)))))
(defn set-block-timestamp!
[block-id key value]
@@ -1038,7 +909,7 @@
[block-id :id (str block-id)])))
block-ids)
col (remove nil? col)]
(batch-set-block-property! col)))
(editor-property/batch-set-block-property! col)))
(defn copy-block-ref!
([block-id]
@@ -2031,9 +1902,9 @@
:command :block-ref})
;; Save it so it'll be parsed correctly in the future
(set-block-property! (:block/uuid chosen)
:id
uuid-string)
(editor-property/set-block-property! (:block/uuid chosen)
:id
uuid-string)
(when-let [input (gdom/getElement id)]
(.focus input)))))

View File

@@ -0,0 +1,141 @@
(ns frontend.handler.editor.property
"Property related fns for the editor"
(:require [clojure.string :as string]
[frontend.config :as config]
[frontend.db :as db]
[frontend.modules.outliner.core :as outliner-core]
[frontend.modules.outliner.transaction :as outliner-tx]
[frontend.state :as state]
[frontend.util :as util]
[frontend.util.drawer :as drawer]
[frontend.util.property :as property]
[goog.object :as gobj]
[logseq.graph-parser.util :as gp-util]))
(defn clear-selection!
[]
(state/clear-selection!))
(defn- get-edit-input-id-with-block-id
[block-id]
(when-let [first-block (util/get-first-block-by-id block-id)]
(string/replace (gobj/get first-block "id")
"ls-block"
"edit-block")))
(defn- text-range-by-lst-fst-line [content [direction pos]]
(case direction
:up
(let [last-new-line (or (string/last-index-of content \newline) -1)
end (+ last-new-line pos 1)]
(subs content 0 end))
:down
(-> (string/split-lines content)
first
(or "")
(subs 0 pos))))
(defn edit-block!
([block pos id]
(edit-block! block pos id nil))
([block pos id {:keys [custom-content tail-len move-cursor? retry-times]
:or {tail-len 0
move-cursor? true
retry-times 0}
:as opts}]
(when-not (> retry-times 2)
(when-not config/publishing?
(when-let [block-id (:block/uuid block)]
(let [block (or (db/pull [:block/uuid block-id]) block)
edit-input-id (if (uuid? id)
(get-edit-input-id-with-block-id id)
(-> (str (subs id 0 (- (count id) 36)) block-id)
(string/replace "ls-block" "edit-block")))
content (or custom-content (:block/content block) "")
content-length (count content)
text-range (cond
(vector? pos)
(text-range-by-lst-fst-line content pos)
(and (> tail-len 0) (>= (count content) tail-len))
(subs content 0 (- (count content) tail-len))
(or (= :max pos) (<= content-length pos))
content
:else
(subs content 0 pos))
content (-> (property/remove-built-in-properties (:block/format block)
content)
(drawer/remove-logbook))]
(clear-selection!)
(if edit-input-id
(state/set-editing! edit-input-id content block text-range move-cursor?)
;; Block may not be rendered yet
(js/setTimeout (fn [] (edit-block! block pos id (update opts :retry-times inc))) 10))))))))
(defn batch-set-block-property!
"col: a collection of [block-id property-key property-value]."
[col]
#_:clj-kondo/ignore
(when-let [repo (state/get-current-repo)]
(let [col' (group-by first col)]
(outliner-tx/transact!
{:outliner-op :save-block}
(doseq [[block-id items] col']
(let [block-id (if (string? block-id) (uuid block-id) block-id)
new-properties (zipmap (map second items)
(map last items))]
(when-let [block (db/entity [:block/uuid block-id])]
(let [format (:block/format block)
content (:block/content block)
properties (:block/properties block)
properties-text-values (:block/properties-text-values block)
properties (-> (merge properties new-properties)
gp-util/remove-nils-non-nested)
properties-text-values (-> (merge properties-text-values new-properties)
gp-util/remove-nils-non-nested)
property-ks (->> (concat (:block/properties-order block)
(map second items))
(filter (set (keys properties)))
distinct
vec)
content (property/remove-properties format content)
kvs (for [key property-ks] [key (or (get properties-text-values key)
(get properties key))])
content (property/insert-properties format content kvs)
content (property/remove-empty-properties content)
block {:block/uuid block-id
:block/properties properties
:block/properties-order property-ks
:block/properties-text-values properties-text-values
:block/content content}]
(outliner-core/save-block! block)))))))
(let [block-id (ffirst col)
block-id (if (string? block-id) (uuid block-id) block-id)
input-pos (or (state/get-edit-pos) :max)]
;; update editing input content
(when-let [editing-block (state/get-edit-block)]
(when (= (:block/uuid editing-block) block-id)
(edit-block! editing-block
input-pos
(state/get-edit-input-id)))))))
(defn batch-add-block-property!
[block-ids property-key property-value]
(batch-set-block-property! (map #(vector % property-key property-value) block-ids)))
(defn batch-remove-block-property!
[block-ids property-key]
(batch-set-block-property! (map #(vector % property-key nil) block-ids)))
(defn remove-block-property!
[block-id key]
(let [key (keyword key)]
(batch-set-block-property! [[block-id key nil]])))
(defn set-block-property!
[block-id key value]
(let [key (keyword key)]
(batch-set-block-property! [[block-id key value]])))

View File

@@ -21,6 +21,7 @@
[frontend.fs :as fs]
[frontend.handler.dnd :as editor-dnd-handler]
[frontend.handler.editor :as editor-handler]
[frontend.handler.editor.property :as editor-property]
[frontend.handler.export :as export-handler]
[frontend.handler.page :as page-handler]
[frontend.handler.plugin :as plugin-handler]
@@ -733,11 +734,11 @@
(def ^:export upsert_block_property
(fn [block-uuid key value]
(editor-handler/set-block-property! (sdk-utils/uuid-or-throw-error block-uuid) key value)))
(editor-property/set-block-property! (sdk-utils/uuid-or-throw-error block-uuid) key value)))
(def ^:export remove_block_property
(fn [block-uuid key]
(editor-handler/remove-block-property! (sdk-utils/uuid-or-throw-error block-uuid) key)))
(editor-property/remove-block-property! (sdk-utils/uuid-or-throw-error block-uuid) key)))
(def ^:export get_block_property
(fn [block-uuid key]
@@ -986,14 +987,14 @@
exist? (page-handler/template-exists? template-name)]
(if (or (not exist?) (true? overwrite))
(do (when-let [old-target (and exist? (db-model/get-template-by-name template-name))]
(editor-handler/remove-block-property! (:block/uuid old-target) :template))
(editor-handler/set-block-property! target-uuid :template template-name))
(editor-property/remove-block-property! (:block/uuid old-target) :template))
(editor-property/set-block-property! target-uuid :template template-name))
(throw (js/Error. "Template already exists!"))))))
(defn ^:export remove_template
[name]
(when-let [target (db-model/get-template-by-name name)]
(editor-handler/remove-block-property! (:block/uuid target) :template)))
(editor-property/remove-block-property! (:block/uuid target) :template)))
;; search
(defn ^:export search