refactor: remove :block/format for db graphs (#11667)

This commit is contained in:
Tienson Qin
2025-01-05 12:10:47 +08:00
committed by GitHub
parent b24ad28bac
commit 8a0a05183e
76 changed files with 922 additions and 989 deletions

View File

@@ -16,23 +16,23 @@
[clojure.string :as string]
[electron.backup-file :as backup-file]
[electron.configs :as cfgs]
[electron.db :as db]
[electron.file-sync-rsapi :as rsapi]
[electron.find-in-page :as find]
[electron.fs-watcher :as watcher]
[electron.git :as git]
[electron.handler-interface :refer [handle]]
[electron.logger :as logger]
[electron.plugin :as plugin]
[electron.db :as db]
[electron.server :as server]
[electron.shell :as shell]
[electron.state :as state]
[electron.utils :as utils]
[electron.window :as win]
[electron.handler-interface :refer [handle]]
[logseq.db.sqlite.util :as sqlite-util]
[logseq.db.sqlite.common-db :as sqlite-common-db]
[goog.functions :refer [debounce]]
[logseq.common.graph :as common-graph]
[logseq.db.sqlite.common-db :as sqlite-common-db]
[logseq.db.sqlite.util :as sqlite-util]
[promesa.core :as p]))
(defmethod handle :mkdir [_window [_ dir]]
@@ -466,7 +466,6 @@
(debounced-configure-auto-commit!)
nil)
(defmethod handle :installMarketPlugin [_ [_ manifest]]
(plugin/install-or-update! manifest))

View File

@@ -1,7 +1,7 @@
(ns frontend.background-tasks
"Some background tasks"
(:require [frontend.flows :as flows]
[frontend.common.missionary :as c.m]
(:require [frontend.common.missionary :as c.m]
[frontend.flows :as flows]
[logseq.db.frontend.entity-plus :as entity-plus]
[missionary.core :as m]))

View File

@@ -5,28 +5,28 @@
[frontend.date :as date]
[frontend.db :as db]
[frontend.extensions.video.youtube :as youtube]
[frontend.handler.db-based.property :as db-property-handler]
[frontend.handler.db-based.property.util :as db-pu]
[frontend.handler.draw :as draw]
[frontend.handler.file-based.property :as file-property-handler]
[frontend.handler.file-based.status :as file-based-status]
[frontend.handler.notification :as notification]
[frontend.handler.plugin :as plugin-handler]
[frontend.handler.property.file :as property-file]
[frontend.search :as search]
[frontend.state :as state]
[frontend.util :as util]
[frontend.util.cursor :as cursor]
[frontend.util.file-based.priority :as priority]
[frontend.handler.file-based.property :as file-property-handler]
[frontend.handler.db-based.property.util :as db-pu]
[frontend.handler.property.file :as property-file]
[goog.dom :as gdom]
[goog.object :as gobj]
[logseq.common.config :as common-config]
[logseq.graph-parser.property :as gp-property]
[logseq.common.util :as common-util]
[logseq.common.util.block-ref :as block-ref]
[logseq.common.util.macro :as macro-util]
[logseq.common.util.page-ref :as page-ref]
[promesa.core :as p]
[frontend.handler.file-based.status :as file-based-status]
[frontend.handler.db-based.property :as db-property-handler]
[logseq.common.util.macro :as macro-util]))
[logseq.graph-parser.property :as gp-property]
[promesa.core :as p]))
;; TODO: move to frontend.handler.editor.commands
@@ -830,7 +830,7 @@
(when-let [input-id (state/get-edit-input-id)]
(when-let [current-input (gdom/getElement input-id)]
(let [current-block (state/get-edit-block)
format (:block/format current-block)]
format (get current-block :block/format :markdown)]
(if (config/db-based-graph?)
(state/pub-event! [:editor/set-heading current-block heading])
(if (= format :markdown)
@@ -930,6 +930,6 @@
(defn exec-plugin-simple-command!
[pid {:keys [block-id] :as cmd} action]
(let [format (and block-id (:block/format (db/entity [:block/uuid block-id])))
(let [format (and block-id (get (db/entity [:block/uuid block-id]) :block/format :markdown))
inputs (vector (conj action (assoc cmd :pid pid)))]
(handle-steps inputs format)))

View File

@@ -4,6 +4,7 @@
(:require ["/frontend/utils" :as utils]
[cljs-bean.core :as bean]
[cljs.core.match :refer [match]]
[clojure.set :as set]
[clojure.string :as string]
[datascript.core :as d]
[datascript.impl.entity :as e]
@@ -90,8 +91,7 @@
[promesa.core :as p]
[reitit.frontend.easy :as rfe]
[rum.core :as rum]
[shadow.loader :as loader]
[clojure.set :as set]))
[shadow.loader :as loader]))
;; local state
(defonce *dragging?
@@ -1337,7 +1337,7 @@
[config metadata s full-text]
(let [media-formats (set (map name config/media-formats))
metadata-show (:show (common-util/safe-read-map-string metadata))
format (get-in config [:block :block/format])]
format (get-in config [:block :block/format] :markdown)]
(or
(and
(= :org format)
@@ -1475,7 +1475,7 @@
id label*)))
["Page_ref" page]
(let [format (get-in config [:block :block/format])]
(let [format (get-in config [:block :block/format] :markdown)]
(if (and (= format :org)
(show-link? config nil page page)
(not (contains? #{"pdf" "mp4" "ogg" "webm"} (util/get-file-ext page))))
@@ -1496,7 +1496,7 @@
[protocol path] (or (and (= "Complex" (first url)) url)
(and (= "File" (first url)) ["file" (second url)]))]
(cond
(and (= (get-in config [:block :block/format]) :org)
(and (= (get-in config [:block :block/format] :markdown) :org)
(= "Complex" protocol)
(= (string/lower-case (:protocol path)) "id")
(string? (:link path))
@@ -2196,7 +2196,8 @@
(rum/defc ^:large-vars/cleanup-todo text-block-title
[config {:block/keys [format marker pre-block? properties] :as block}]
(let [block (if-not (:block.temp/ast-title block)
(let [format (or format :markdown)
block (if-not (:block.temp/ast-title block)
(merge block (block/parse-title-and-body uuid format pre-block?
(:block/title block)))
block)
@@ -2406,7 +2407,7 @@
(rum/with-key elem (str (random-uuid)))))
:else
(inline-text config (:block/format block) (str v)))]]))
(inline-text config (get block :block/format :markdown) (str v)))]]))
(rum/defc properties-cp
[config {:block/keys [pre-block?] :as block}]
@@ -2765,7 +2766,8 @@
(rum/defc ^:large-vars/cleanup-todo block-content < rum/reactive
[config {:block/keys [uuid properties scheduled deadline format pre-block?] :as block} edit-input-id block-id slide?]
(let [collapsed? (:collapsed? config)
(let [format (or format :markdown)
collapsed? (:collapsed? config)
repo (state/get-current-repo)
db-based? (config/db-based-graph? (state/get-current-repo))
content (if db-based?
@@ -2923,7 +2925,8 @@
::hide-block-refs? (atom default-hide?)
::refs-count *refs-count)))}
[state config {:block/keys [uuid format] :as block} {:keys [edit-input-id block-id edit? hide-block-refs-count?]}]
(let [*hide-block-refs? (get state ::hide-block-refs?)
(let [format (or format :markdown)
*hide-block-refs? (get state ::hide-block-refs?)
*refs-count (get state ::refs-count)
hide-block-refs? (rum/react *hide-block-refs?)
editor-box (state/get-component :editor/box)
@@ -3114,7 +3117,7 @@
[block (page-cp {} block)]
(let [result (block/parse-title-and-body
uuid
(:block/format block)
(get block :block/format :markdown)
(:block/pre-block? block)
title)
ast-body (:block.temp/ast-body result)
@@ -3212,7 +3215,7 @@
(contains? transfer-types "Files")
(let [files (.-files data-transfer)
format (:block/format target-block)]
format (get target-block :block/format :markdown)]
;; When editing, this event will be handled by editor-handler/upload-asset(editor-on-paste)
(when (and (config/local-file-based-graph? repo) (not (state/editing?)))
;; Basically the same logic as editor-handler/upload-asset,
@@ -3525,7 +3528,7 @@
(block-reference {} (str uuid) nil)
;; Not embed self
[:div.flex.flex-col.w-full
(let [block (merge block (block/parse-title-and-body uuid (:block/format block) pre-block? title))
(let [block (merge block (block/parse-title-and-body uuid (get block :block/format :markdown) pre-block? title))
hide-block-refs-count? (or (and (:embed? config)
(= (:block/uuid block) (:embed-id config)))
table?)]

View File

@@ -380,7 +380,7 @@
(when-let [default-home (state/get-default-home)]
(let [page (:page default-home)
page (when (and (string? page)
(not (string/blank? page)))
(not (string/blank? page)))
(db/get-page page))]
(if page
default-home
@@ -598,7 +598,7 @@
:upload-files
{:drop (fn [_e files]
(when-let [id (state/get-edit-input-id)]
(let [format (:block/format (state/get-edit-block))]
(let [format (get (state/get-edit-block) :block/format :markdown)]
(editor-handler/upload-asset! id files format editor-handler/*asset-uploading? true))))})
(common-handler/listen-to-scroll! element)
(when (:margin-less-pages? (first (:rum/args state))) ;; makes sure full screen pages displaying without scrollbar

View File

@@ -10,6 +10,7 @@
[frontend.config :as config]
[frontend.context.i18n :refer [t]]
[frontend.db :as db]
[frontend.extensions.fsrs :as fsrs]
[frontend.extensions.srs :as srs]
[frontend.handler.common.developer :as dev-common-handler]
[frontend.handler.editor :as editor-handler]
@@ -21,7 +22,6 @@
[frontend.persist-db.browser :as db-browser]
[frontend.state :as state]
[frontend.ui :as ui]
[logseq.shui.ui :as shui]
[frontend.util :as util]
[frontend.util.url :as url-util]
[goog.dom :as gdom]
@@ -29,10 +29,10 @@
[logseq.common.util :as common-util]
[logseq.common.util.block-ref :as block-ref]
[logseq.common.util.page-ref :as page-ref]
[promesa.core :as p]
[rum.core :as rum]
[logseq.db :as ldb]
[frontend.extensions.fsrs :as fsrs]))
[logseq.shui.ui :as shui]
[promesa.core :as p]
[rum.core :as rum]))
;; TODO i18n support
@@ -348,7 +348,8 @@
{:key "(Dev) Show block AST"
:on-click (fn []
(let [block (db/entity [:block/uuid block-id])]
(dev-common-handler/show-content-ast (:block/title block) (:block/format block))))}
(dev-common-handler/show-content-ast (:block/title block)
(get block :block/format :markdown))))}
(t :dev/show-block-ast))
(shui/dropdown-menu-item
{:key "(Dev) Show block content history"

View File

@@ -12,13 +12,13 @@
[frontend.db :as db]
[frontend.db.model :as db-model]
[frontend.extensions.zotero :as zotero]
[frontend.handler.block :as block-handler]
[frontend.handler.editor :as editor-handler :refer [get-state]]
[frontend.handler.editor.lifecycle :as lifecycle]
[frontend.handler.page :as page-handler]
[frontend.handler.paste :as paste-handler]
[frontend.handler.property.util :as pu]
[frontend.handler.search :as search-handler]
[frontend.handler.block :as block-handler]
[frontend.mixins :as mixins]
[frontend.search :refer [fuzzy-search]]
[frontend.state :as state]
@@ -30,13 +30,13 @@
[goog.string :as gstring]
[logseq.common.util :as common-util]
[logseq.db :as ldb]
[logseq.db.frontend.class :as db-class]
[logseq.graph-parser.property :as gp-property]
[logseq.shui.popup.core :as shui-popup]
[logseq.shui.ui :as shui]
[promesa.core :as p]
[react-draggable]
[rum.core :as rum]
[logseq.db.frontend.class :as db-class]))
[rum.core :as rum]))
(defn filter-commands
[page? commands]

View File

@@ -5,15 +5,15 @@
[frontend.db.query-dsl :as query-dsl]
[frontend.format.block :as block]
[frontend.handler.common :as common-handler]
[frontend.handler.file-based.property :as file-property-handler]
[frontend.handler.property :as property-handler]
[frontend.state :as state]
[frontend.util :as util]
[frontend.util.file-based.clock :as clock]
[frontend.handler.file-based.property :as file-property-handler]
[logseq.graph-parser.text :as text]
[medley.core :as medley]
[rum.core :as rum]
[promesa.core :as p]
[logseq.graph-parser.text :as text]))
[rum.core :as rum]))
;; Util fns
;; ========
@@ -136,7 +136,7 @@
uuid (:block/uuid row)
{:block/keys [title]} (block/parse-title-and-body
(:block/uuid row)
(:block/format row)
(get row :block/format :markdown)
(:block/pre-block? row)
content)]
(if (seq title)
@@ -201,7 +201,7 @@
(sortable-title title column sort-state (:block/uuid current-block))))]]
[:tbody
(for [row sort-result']
(let [format (:block/format row)]
(let [format (get row :block/format :markdown)]
[:tr.cursor
(for [column columns]
(let [[cell-format value] (build-column-value row
@@ -220,9 +220,9 @@
:on-pointer-up (fn []
(when (and @*mouse-down? (not @select?))
(state/sidebar-add-block!
(state/get-current-repo)
(:db/id row)
:block-ref)
(state/get-current-repo)
(:db/id row)
:block-ref)
(reset! *mouse-down? false)))}
(when (some? value)
(render-column-value {:row-block row
@@ -241,4 +241,4 @@
;; as user needs to know if there result is sorted
sort-state (get-sort-state current-block)
sort-result' (sort-result result' (assoc sort-state :page? page?))]
(result-table-v1 config current-block sort-result' sort-state columns options map-inline page-cp ->elem inline-text))))
(result-table-v1 config current-block sort-result' sort-state columns options map-inline page-cp ->elem inline-text))))

View File

@@ -1,8 +1,8 @@
(ns frontend.components.imports
"Import data into Logseq."
(:require [clojure.string :as string]
[cljs-time.core :as t]
(:require [cljs-time.core :as t]
[cljs.pprint :as pprint]
[clojure.string :as string]
[frontend.components.onboarding.setups :as setups]
[frontend.components.repo :as repo]
[frontend.components.svg :as svg]
@@ -23,15 +23,15 @@
[frontend.util.fs :as fs-util]
[goog.functions :refer [debounce]]
[goog.object :as gobj]
[lambdaisland.glogi :as log]
[logseq.common.path :as path]
[logseq.db.frontend.validate :as db-validate]
[logseq.graph-parser.exporter :as gp-exporter]
[promesa.core :as p]
[rum.core :as rum]
[logseq.shui.ui :as shui]
[logseq.shui.dialog.core :as shui-dialog]
[logseq.shui.form.core :as form-core]
[lambdaisland.glogi :as log]
[logseq.db.frontend.validate :as db-validate]))
[logseq.shui.ui :as shui]
[promesa.core :as p]
[rum.core :as rum]))
;; Can't name this component as `frontend.components.import` since shadow-cljs
;; will complain about it.

View File

@@ -1,26 +1,26 @@
(ns frontend.components.objects
"Provides table views for class objects and property related objects"
(:require [frontend.components.views :as views]
(:require [clojure.string :as string]
[frontend.components.filepicker :as filepicker]
[frontend.components.views :as views]
[frontend.db :as db]
[logseq.db :as ldb]
[frontend.db-mixins :as db-mixins]
[frontend.db.async :as db-async]
[frontend.db.model :as db-model]
[frontend.db.react :as react]
[frontend.handler.editor :as editor-handler]
[frontend.mixins :as mixins]
[frontend.state :as state]
[logseq.outliner.property :as outliner-property]
[promesa.core :as p]
[rum.core :as rum]
[frontend.modules.outliner.ui :as ui-outliner-tx]
[frontend.modules.outliner.op :as outliner-op]
[frontend.db.react :as react]
[logseq.shui.ui :as shui]
[frontend.util :as util]
[frontend.modules.outliner.ui :as ui-outliner-tx]
[frontend.state :as state]
[frontend.ui :as ui]
[frontend.util :as util]
[logseq.common.config :as common-config]
[frontend.components.filepicker :as filepicker]
[clojure.string :as string]))
[logseq.db :as ldb]
[logseq.outliner.property :as outliner-property]
[logseq.shui.ui :as shui]
[promesa.core :as p]
[rum.core :as rum]))
(defn- get-class-objects
[class]
@@ -256,21 +256,21 @@
:show-add-property? false
;; Relationships with built-in properties must not be deleted e.g. built-in? or parent
:on-delete-rows (when-not (:logseq.property/built-in? property)
(fn [table selected-rows]
(let [pages (->> selected-rows (filter ldb/page?) (remove :logseq.property/built-in?))
blocks (->> selected-rows (remove ldb/page?) (remove :logseq.property/built-in?))]
(p/do!
(set-data! (get-property-related-objects (state/get-current-repo) property))
(when-let [f (get-in table [:data-fns :set-row-selection!])]
(f {}))
(ui-outliner-tx/transact!
{:outliner-op :delete-blocks}
(when (seq blocks)
(outliner-op/delete-blocks! blocks nil))
(let [page-ids (map :db/id pages)
tx-data (map (fn [pid] [:db/retract pid (:db/ident property)]) page-ids)]
(when (seq tx-data)
(outliner-op/transact! tx-data {:outliner-op :save-block}))))))))}))))
(fn [table selected-rows]
(let [pages (->> selected-rows (filter ldb/page?) (remove :logseq.property/built-in?))
blocks (->> selected-rows (remove ldb/page?) (remove :logseq.property/built-in?))]
(p/do!
(set-data! (get-property-related-objects (state/get-current-repo) property))
(when-let [f (get-in table [:data-fns :set-row-selection!])]
(f {}))
(ui-outliner-tx/transact!
{:outliner-op :delete-blocks}
(when (seq blocks)
(outliner-op/delete-blocks! blocks nil))
(let [page-ids (map :db/id pages)
tx-data (map (fn [pid] [:db/retract pid (:db/ident property)]) page-ids)]
(when (seq tx-data)
(outliner-op/transact! tx-data {:outliner-op :save-block}))))))))}))))
;; Show all nodes containing the given property
(rum/defcs property-related-objects < rum/reactive db-mixins/query mixins/container-id

View File

@@ -1,9 +1,11 @@
(ns frontend.components.page
(:require ["/frontend/utils" :as utils]
[clojure.string :as string]
[dommy.core :as dom]
[frontend.components.block :as component-block]
[frontend.components.class :as class-component]
[frontend.components.content :as content]
[frontend.components.db-based.page :as db-page]
[frontend.components.editor :as editor]
[frontend.components.file-based.hierarchy :as hierarchy]
[frontend.components.objects :as objects]
@@ -11,7 +13,6 @@
[frontend.components.query :as query]
[frontend.components.reference :as reference]
[frontend.components.scheduled-deadlines :as scheduled]
[frontend.components.db-based.page :as db-page]
[frontend.components.svg :as svg]
[frontend.config :as config]
[frontend.context.i18n :refer [t]]
@@ -34,6 +35,7 @@
[frontend.handler.route :as route-handler]
[frontend.mixins :as mixins]
[frontend.mobile.util :as mobile-util]
[frontend.rum :as frontend-rum]
[frontend.state :as state]
[frontend.ui :as ui]
[frontend.util :as util]
@@ -46,9 +48,7 @@
[logseq.shui.ui :as shui]
[promesa.core :as p]
[reitit.frontend.easy :as rfe]
[rum.core :as rum]
[frontend.rum :as frontend-rum]
[dommy.core :as dom]))
[rum.core :as rum]))
(defn- get-page-name
[state]
@@ -421,7 +421,7 @@
(string/includes? title page-ref/right-brackets))]
(cond untitled? [:span.opacity-50 (t :untitled)]
nested? (component-block/map-inline {} (gp-mldoc/inline->edn title (mldoc/get-default-config
(:block/format page))))
(get page :block/format :markdown))))
:else title))])]])))))
(rum/defc db-page-title-actions

View File

@@ -173,6 +173,6 @@
(let [page (db/pull '[:block/format {:block/file [:file/content]}] (:db/id page))]
(dev-common-handler/show-content-ast
(get-in page [:block/file :file/content])
(:block/format page))))}})]
(get page :block/format :markdown))))}})]
(flatten)
(remove nil?))))))

View File

@@ -1,27 +1,27 @@
(ns frontend.components.plugins
(:require [rum.core :as rum]
[frontend.state :as state]
[cljs-bean.core :as bean]
[frontend.context.i18n :refer [t]]
[frontend.ui :as ui]
[logseq.shui.ui :as shui]
[frontend.handler.ui :as ui-handler]
[frontend.handler.editor :as editor-handler]
[frontend.handler.plugin-config :as plugin-config-handler]
[frontend.handler.common.plugin :as plugin-common-handler]
[frontend.search :as search]
[frontend.util :as util]
[frontend.mixins :as mixins]
[frontend.config :as config]
(:require [cljs-bean.core :as bean]
[clojure.string :as string]
[electron.ipc :as ipc]
[promesa.core :as p]
[frontend.components.svg :as svg]
[frontend.components.plugins-settings :as plugins-settings]
[frontend.components.svg :as svg]
[frontend.config :as config]
[frontend.context.i18n :refer [t]]
[frontend.handler.common.plugin :as plugin-common-handler]
[frontend.handler.editor :as editor-handler]
[frontend.handler.notification :as notification]
[frontend.handler.plugin :as plugin-handler]
[frontend.storage :as storage]
[frontend.handler.plugin-config :as plugin-config-handler]
[frontend.handler.ui :as ui-handler]
[frontend.mixins :as mixins]
[frontend.rum :as rum-utils]
[clojure.string :as string]))
[frontend.search :as search]
[frontend.state :as state]
[frontend.storage :as storage]
[frontend.ui :as ui]
[frontend.util :as util]
[logseq.shui.ui :as shui]
[promesa.core :as p]
[rum.core :as rum]))
(declare open-waiting-updates-modal!)
(defonce PER-PAGE-SIZE 15)
@@ -256,20 +256,20 @@
#(-> (shui/dialog-confirm!
[:b (t :plugin/delete-alert name)])
(p/then (fn []
(plugin-common-handler/unregister-plugin id)
(plugin-common-handler/unregister-plugin id)
(when (util/electron?)
(plugin-config-handler/remove-plugin id)))))}
(when (util/electron?)
(plugin-config-handler/remove-plugin id)))))}
(t :plugin/uninstall)]]]
(when (seq sponsors)
[:div.de.sponsors
[:strong (ui/icon "coffee")]
[:ul.menu-list
(for [link sponsors]
[:li {:key link}
[:a {:href link :target "_blank"}
[:span.flex.items-center link (ui/icon "external-link")]]])]])]
[:div.de.sponsors
[:strong (ui/icon "coffee")]
[:ul.menu-list
(for [link sponsors]
[:li {:key link}
[:a {:href link :target "_blank"}
[:span.flex.items-center link (ui/icon "external-link")]]])]])]
[:div.r.flex.items-center
(when (and unpacked? (not disabled?))
@@ -305,70 +305,70 @@
url item (if (or repo webPkg) remote-readme-display local-markdown-display)))
(rum/defc plugin-item-card < rum/static
[t {:keys [id name title version url description author icon iir repo sponsors webPkg] :as item}
disabled? market? *search-key has-other-pending?
installing-or-updating? installed? stat coming-update]
[t {:keys [id name title version url description author icon iir repo sponsors webPkg] :as item}
disabled? market? *search-key has-other-pending?
installing-or-updating? installed? stat coming-update]
(let [name (or title name "Untitled")
web? (not (nil? webPkg))
unpacked? (and (not web?) (not iir))
new-version (state/coming-update-new-version? coming-update)]
[:div.cp__plugins-item-card
{:key (str "lsp-card-" id)
:class (util/classnames
[{:market market?
:installed installed?
:updating installing-or-updating?
:has-new-version new-version}])}
(let [name (or title name "Untitled")
web? (not (nil? webPkg))
unpacked? (and (not web?) (not iir))
new-version (state/coming-update-new-version? coming-update)]
[:div.cp__plugins-item-card
{:key (str "lsp-card-" id)
:class (util/classnames
[{:market market?
:installed installed?
:updating installing-or-updating?
:has-new-version new-version}])}
[:div.l.link-block.cursor-pointer
{:on-click (get-open-plugin-readme-handler url item repo)}
(if (and icon (not (string/blank? icon)))
[:img.icon {:src (if market? (plugin-handler/pkg-asset id icon) icon)}]
svg/folder)
(when (and (not market?) unpacked?)
[:span.flex.justify-center.text-xs.text-error.pt-2 (t :plugin/unpacked)])]
[:div.r
[:h3.head.text-xl.font-bold.pt-1.5
[:span.l.link-block.cursor-pointer
[:div.l.link-block.cursor-pointer
{:on-click (get-open-plugin-readme-handler url item repo)}
name]
(when (not market?) [:sup.inline-block.px-1.text-xs.opacity-50 version])]
(if (and icon (not (string/blank? icon)))
[:img.icon {:src (if market? (plugin-handler/pkg-asset id icon) icon)}]
svg/folder)
[:div.desc.text-xs.opacity-70
[:p description]
(when (and (not market?) unpacked?)
[:span.flex.justify-center.text-xs.text-error.pt-2 (t :plugin/unpacked)])]
[:div.r
[:h3.head.text-xl.font-bold.pt-1.5
[:span.l.link-block.cursor-pointer
{:on-click (get-open-plugin-readme-handler url item repo)}
name]
(when (not market?) [:sup.inline-block.px-1.text-xs.opacity-50 version])]
[:div.desc.text-xs.opacity-70
[:p description]
;;[:small (js/JSON.stringify (bean/->js settings))]
]
]
;; Author & Identity
[:div.flag
[:p.text-xs.pr-2.flex.justify-between
[:small {:on-click #(when-let [^js el (js/document.querySelector ".cp__plugins-page .search-ctls input")]
(reset! *search-key (str "@" author))
(.select el))} author]
[:small {:on-click #(do
(notification/show! "Copied!" :success)
(util/copy-to-clipboard! id))}
(str "ID: " id)]]]
[:div.flag
[:p.text-xs.pr-2.flex.justify-between
[:small {:on-click #(when-let [^js el (js/document.querySelector ".cp__plugins-page .search-ctls input")]
(reset! *search-key (str "@" author))
(.select el))} author]
[:small {:on-click #(do
(notification/show! "Copied!" :success)
(util/copy-to-clipboard! id))}
(str "ID: " id)]]]
;; Github repo
[:div.flag.is-top.opacity-50
(when repo
[:a.flex {:target "_blank"
:href (plugin-handler/gh-repo-url repo)}
(svg/github {:width 16 :height 16})])]
[:div.flag.is-top.opacity-50
(when repo
[:a.flex {:target "_blank"
:href (plugin-handler/gh-repo-url repo)}
(svg/github {:width 16 :height 16})])]
(if market?
(if market?
;; market ctls
(card-ctls-of-market item stat installed? installing-or-updating?)
(card-ctls-of-market item stat installed? installing-or-updating?)
;; installed ctls
(card-ctls-of-installed
id name url sponsors unpacked? disabled?
installing-or-updating? has-other-pending? new-version item))]]))
(card-ctls-of-installed
id name url sponsors unpacked? disabled?
installing-or-updating? has-other-pending? new-version item))]]))
(rum/defc panel-tab-search < rum/static
[search-key *search-key *search-ref]
@@ -606,17 +606,17 @@
:options {:on-click #(plugin-handler/user-check-enabled-for-updates! (not= :plugins category))}}])
(when (util/electron?)
[{:title [:span.flex.items-center.gap-1 (ui/icon "world") (t :settings-page/network-proxy)]
:options {:on-click #(state/pub-event! [:go/proxy-settings agent-opts])}}
[{:title [:span.flex.items-center.gap-1 (ui/icon "world") (t :settings-page/network-proxy)]
:options {:on-click #(state/pub-event! [:go/proxy-settings agent-opts])}}
{:title [:span.flex.items-center.gap-1 (ui/icon "arrow-down-circle") (t :plugin.install-from-file/menu-title)]
:options {:on-click plugin-config-handler/open-replace-plugins-modal}}])
{:title [:span.flex.items-center.gap-1 (ui/icon "arrow-down-circle") (t :plugin.install-from-file/menu-title)]
:options {:on-click plugin-config-handler/open-replace-plugins-modal}}])
[{:hr true}]
(when (and (state/developer-mode?)
(util/electron?))
[{:title [:span.flex.items-center.gap-1 (ui/icon "file-code") (t :plugin/open-preferences)]
[{:title [:span.flex.items-center.gap-1 (ui/icon "file-code") (t :plugin/open-preferences)]
:options {:on-click
#(p/let [root (plugin-handler/get-ls-dotdir-root)]
(js/apis.openPath (str root "/preferences.json")))}}
@@ -1273,14 +1273,14 @@
:class (when (not market?) "active")
:size :sm
:variant :text}
(t :plugin/installed))
(t :plugin/installed))
(shui/button {:on-click #(set-active! :marketplace)
:class (when market? "active")
:size :sm
:variant :text}
(shui/tabler-icon "apps")
(t :plugin/marketplace))]]
(shui/tabler-icon "apps")
(t :plugin/marketplace))]]
[:div.panels
(if market?

View File

@@ -1,13 +1,13 @@
(ns frontend.components.plugins-settings
(:require [logseq.shui.ui :as shui]
[rum.core :as rum]
[frontend.util :as util]
[frontend.ui :as ui]
[frontend.handler.plugin :as plugin-handler]
(:require [cljs-bean.core :as bean]
[frontend.components.lazy-editor :as lazy-editor]
[frontend.handler.notification :as notification]
[cljs-bean.core :as bean]
[goog.functions :refer [debounce]]))
[frontend.handler.plugin :as plugin-handler]
[frontend.ui :as ui]
[frontend.util :as util]
[goog.functions :refer [debounce]]
[logseq.shui.ui :as shui]
[rum.core :as rum]))
(defn- dom-purify
[html opts]
@@ -85,8 +85,7 @@
:radio (ui/radio-list options #(update-setting! key %) nil)
:checkbox (ui/checkbox-list options #(update-setting! key %) nil)
;; select
(ui/select options (fn [_ value ] (update-setting! key value))))
]]]))
(ui/select options (fn [_ value] (update-setting! key value))))]]]))
(rum/defc render-item-object
[_val {:keys [key title description _default]} pid]
@@ -144,16 +143,16 @@
[:div.code-mode-wrap.pl-3.pr-1.py-1.mb-8.-ml-1
(let [content' (js/JSON.stringify (bean/->js settings) nil 2)]
(lazy-editor/editor {:file? false}
(str "code-edit-lsp-settings")
{:data-lang "json"}
content' {}))
(str "code-edit-lsp-settings")
{:data-lang "json"}
content' {}))
[:div.flex.justify-end.pt-2.gap-2
(shui/button {:size :sm :variant :ghost
:on-click (fn [^js e]
(let [^js cm (util/get-cm-instance (-> (.-target e) (.closest ".code-mode-wrap")))
content' (some-> (.toJSON plugin-settings) (js/JSON.stringify nil 2))]
(.setValue cm content')))}
"Reset")
"Reset")
(shui/button {:size :sm
:on-click (fn [^js e]
(try
@@ -164,7 +163,7 @@
(set-edit-mode! nil))
(catch js/Error e
(notification/show! (.-message e) :error))))}
"Save")]]
"Save")]]
;; render with gui items
(for [desc schema

View File

@@ -2,13 +2,13 @@
"DB query result view"
(:require [frontend.components.views :as views]
[frontend.db :as db]
[logseq.db :as ldb]
[rum.core :as rum]
[frontend.mixins :as mixins]
[promesa.core :as p]
[frontend.modules.outliner.ui :as ui-outliner-tx]
[frontend.modules.outliner.op :as outliner-op]
[frontend.state]))
[frontend.modules.outliner.ui :as ui-outliner-tx]
[frontend.state]
[logseq.db :as ldb]
[promesa.core :as p]
[rum.core :as rum]))
(defn- columns
[config result]

View File

@@ -2,28 +2,28 @@
(:require [cljs-bean.core :as bean]
[clojure.string :as string]
[frontend.components.block :as block]
[frontend.components.cmdk.core :as cmdk]
[frontend.components.icon :as icon]
[frontend.components.onboarding :as onboarding]
[frontend.components.page :as page]
[frontend.components.profiler :as profiler]
[frontend.components.shortcut-help :as shortcut-help]
[frontend.components.cmdk.core :as cmdk]
[frontend.context.i18n :refer [t]]
[frontend.date :as date]
[frontend.db :as db]
[frontend.db.rtc.debug-ui :as rtc-debug-ui]
[frontend.extensions.slide :as slide]
[frontend.handler.editor :as editor-handler]
[frontend.handler.route :as route-handler]
[frontend.handler.ui :as ui-handler]
[frontend.state :as state]
[frontend.ui :as ui]
[logseq.shui.ui :as shui]
[frontend.util :as util]
[logseq.db :as ldb]
[logseq.shui.ui :as shui]
[medley.core :as medley]
[reitit.frontend.easy :as rfe]
[rum.core :as rum]
[frontend.db.rtc.debug-ui :as rtc-debug-ui]
[frontend.handler.route :as route-handler]
[logseq.db :as ldb]
[frontend.components.icon :as icon]
[frontend.components.profiler :as profiler]))
[rum.core :as rum]))
(rum/defc toggle
[]

View File

@@ -644,8 +644,8 @@
(when (util/electron?)
(when (not= (boolean value) on?)
(ui/button (t :plugin/restart)
:on-click #(js/logseq.api.relaunch)
:small? true :intent "logseq")))]))
:on-click #(js/logseq.api.relaunch)
:small? true :intent "logseq")))]))
(rum/defc http-server-enabled-switcher
[t]

View File

@@ -2,15 +2,15 @@
(:require [rum.core :as rum]))
(defonce arrow-right-v2
[:svg.h-3.w-3
{:version "1.1"
:view-box "0 0 128 128"
:fill "currentColor"
:display "inline-block"
:style {:margin-top -3}}
[:path
{:d
"M99.069 64.173c0 2.027-.77 4.054-2.316 5.6l-55.98 55.98a7.92 7.92 0 01-11.196 0c-3.085-3.086-3.092-8.105 0-11.196l50.382-50.382-50.382-50.382a7.92 7.92 0 010-11.195c3.086-3.085 8.104-3.092 11.196 0l55.98 55.98a7.892 7.892 0 012.316 5.595z"}]])
[:svg.h-3.w-3
{:version "1.1"
:view-box "0 0 128 128"
:fill "currentColor"
:display "inline-block"
:style {:margin-top -3}}
[:path
{:d
"M99.069 64.173c0 2.027-.77 4.054-2.316 5.6l-55.98 55.98a7.92 7.92 0 01-11.196 0c-3.085-3.086-3.092-8.105 0-11.196l50.382-50.382-50.382-50.382a7.92 7.92 0 010-11.195c3.086-3.085 8.104-3.092 11.196 0l55.98 55.98a7.892 7.892 0 012.316 5.595z"}]])
(defn loader-fn [opts]
[:svg.animate-spin
@@ -46,8 +46,8 @@
(hero-icon "M4 4V9H4.58152M19.9381 11C19.446 7.05369 16.0796 4 12 4C8.64262 4 5.76829 6.06817 4.58152 9M4.58152 9H9M20 20V15H19.4185M19.4185 15C18.2317 17.9318 15.3574 20 12 20C7.92038 20 4.55399 16.9463 4.06189 13M19.4185 15H15"
(cond-> (merge {:fill "none"} opts)
(number? size)
(assoc :height size :width size)))))
(number? size)
(assoc :height size :width size)))))
(def close (hero-icon "M6 18L18 6M6 6L18 18"))
(def folder (hero-icon "M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z"))
@@ -102,9 +102,9 @@
([opts]
[:svg.h-8.w-8.warning
(merge
{:view-box "0 0 576 512"
:fill "var(--color-orange-600)"}
opts)
{:view-box "0 0 576 512"
:fill "var(--color-orange-600)"}
opts)
[:path
{:d
"M569.517 440.013C587.975 472.007 564.806 512 527.94 512H48.054c-36.937 0-59.999-40.055-41.577-71.987L246.423 23.985c18.467-32.009 64.72-31.951 83.154 0l239.94 416.028zM288 354c-25.405 0-46 20.595-46 46s20.595 46 46 46 46-20.595 46-46-20.595-46-46-46zm-43.673-165.346l7.418 136c.347 6.364 5.609 11.346 11.982 11.346h48.546c6.373 0 11.635-4.982 11.982-11.346l7.418-136c.375-6.874-5.098-12.654-11.982-12.654h-63.383c-6.884 0-12.356 5.78-11.981 12.654z"}]]))
@@ -121,7 +121,6 @@
C339.535,328.526,339.142,287.519,322.397,252.352z M201.513,216.553c0,0-16.568-16.568-21.323-21.035
c37.027-10.806,61.375,4.323,61.375,4.323C218.946,192.781,201.513,216.553,201.513,216.553z"}]])
(rum/defc caret-up
[]
[:svg.h-4.w-4
@@ -132,7 +131,6 @@
:display "inline-block"}
[:path {:d "M288.662 352H31.338c-17.818 0-26.741-21.543-14.142-34.142l128.662-128.662c7.81-7.81 20.474-7.81 28.284 0l128.662 128.662c12.6 12.599 3.676 34.142-14.142 34.142z"}]])
(rum/defc caret-down
[]
[:svg.h-4.w-4
@@ -198,12 +196,11 @@
{:stroke "currentColor", :view-box "0 0 24 24", :fill "none"}
[:path
{:d
"M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z",
"M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z",
:stroke-width "2",
:stroke-linejoin "round",
:stroke-linecap "round"}]])
(defn search2
([] (search2 nil))
([size]

View File

@@ -1,20 +1,20 @@
(ns frontend.components.theme
(:require [electron.ipc :as ipc]
[frontend.extensions.pdf.core :as pdf]
[frontend.components.settings :as settings]
[frontend.config :as config]
[frontend.context.i18n :refer [t]]
[frontend.extensions.pdf.core :as pdf]
[frontend.handler.plugin :as plugin-handler]
[frontend.handler.plugin-config :as plugin-config-handler]
[frontend.handler.route :as route-handler]
[frontend.handler.ui :as ui-handler]
[frontend.ui :as ui]
[logseq.shui.ui :as shui]
[frontend.util :as util]
[frontend.state :as state]
[frontend.components.settings :as settings]
[frontend.rum :refer [use-mounted]]
[frontend.state :as state]
[frontend.storage :as storage]
[rum.core :as rum]
[frontend.context.i18n :refer [t]]))
[frontend.ui :as ui]
[frontend.util :as util]
[logseq.shui.ui :as shui]
[rum.core :as rum]))
(rum/defc scrollbar-measure
[]
@@ -87,8 +87,8 @@
#(when config/lsp-enabled?
(plugin-handler/load-plugin-preferences)
(comp
(plugin-handler/setup-install-listener!)
(plugin-config-handler/setup-install-listener!)))
(plugin-handler/setup-install-listener!)
(plugin-config-handler/setup-install-listener!)))
[])
(rum/use-effect!

View File

@@ -5,13 +5,13 @@
[frontend.mobile.util :as mobile-util]
[frontend.state :as state]
[frontend.util :as util]
[logseq.common.path :as path]
[logseq.common.config :as common-config]
[logseq.common.util :as common-util]
[shadow.resource :as rc]
[goog.crypt.Md5]
[goog.crypt :as crypt]
[logseq.db.sqlite.util :as sqlite-util]))
[goog.crypt.Md5]
[logseq.common.config :as common-config]
[logseq.common.path :as path]
[logseq.common.util :as common-util]
[logseq.db.sqlite.util :as sqlite-util]
[shadow.resource :as rc]))
(goog-define DEV-RELEASE false)
(defonce dev-release? DEV-RELEASE)
@@ -75,8 +75,8 @@
;; User level configuration for whether plugins are enabled
(defonce lsp-enabled?
(and util/plugin-platform?
(not (false? feature-plugin-system-on?))
(state/lsp-enabled?-or-theme)))
(not (false? feature-plugin-system-on?))
(state/lsp-enabled?-or-theme)))
(defn plugin-config-enabled?
[]

View File

@@ -1,15 +1,15 @@
(ns frontend.db
"Main entry ns for db related fns"
(:require [frontend.db.conn :as conn]
(:require [frontend.config :as config]
[frontend.db.conn :as conn]
[frontend.db.model]
[frontend.db.react :as react]
[frontend.db.utils]
[frontend.namespaces :refer [import-vars]]
[logseq.db :as ldb]
[frontend.modules.outliner.ui :as ui-outliner-tx]
[frontend.modules.outliner.op :as outliner-op]
[frontend.modules.outliner.ui :as ui-outliner-tx]
[frontend.namespaces :refer [import-vars]]
[frontend.state :as state]
[frontend.config :as config]
[logseq.db :as ldb]
[logseq.outliner.op]))
(import-vars

View File

@@ -6,19 +6,19 @@
[clojure.string :as string]
[clojure.walk :as walk]
[datascript.core :as d]
[frontend.config :as config]
[frontend.date :as date]
[frontend.db.conn :as conn]
[frontend.db.react :as react]
[frontend.db.utils :as db-utils]
[frontend.state :as state]
[frontend.util :as util :refer [react]]
[logseq.db.frontend.rules :as rules]
[logseq.db.frontend.content :as db-content]
[logseq.graph-parser.db :as gp-db]
[logseq.common.util :as common-util]
[logseq.common.util.date-time :as date-time-util]
[frontend.config :as config]
[logseq.db :as ldb]))
[logseq.db :as ldb]
[logseq.db.frontend.content :as db-content]
[logseq.db.frontend.rules :as rules]
[logseq.graph-parser.db :as gp-db]))
;; TODO: extract to specific models and move data transform logic to the
;; corresponding handlers.
@@ -204,7 +204,7 @@ independent of format as format specific heading characters are stripped"
(or
(let [page (some->> page-name (ldb/get-page (conn/get-db)))]
(or
(:block/format page)
(get page :block/format :markdown)
(when-let [file (:block/file page)]
(when-let [path (:file/path (db-utils/entity (:db/id file)))]
(common-util/get-format path)))))

View File

@@ -771,9 +771,9 @@
a seq of [original-block new-content-string]"
[block]
(when-let [content (:block/title block)]
(let [format (:block/format block)
(let [format (get block :block/format :markdown)
content (-> (property-file/remove-built-in-properties-when-file-based
(state/get-current-repo) (:block/format block) content)
(state/get-current-repo) format content)
(drawer/remove-logbook))
[title body] (mldoc/get-title&body content format)]
[block (str title " #" card-hash-tag "\n" body)])))

View File

@@ -6,12 +6,12 @@
[frontend.date :as date]
[frontend.db :as db]
[frontend.format :as format]
[frontend.format.mldoc :as mldoc]
[frontend.handler.notification :as notification]
[frontend.state :as state]
[logseq.graph-parser.block :as gp-block]
[logseq.graph-parser.property :as gp-property]
[lambdaisland.glogi :as log]
[frontend.format.mldoc :as mldoc]))
[logseq.graph-parser.block :as gp-block]
[logseq.graph-parser.property :as gp-property]))
(defn extract-blocks
"Wrapper around logseq.graph-parser.block/extract-blocks that adds in system state
@@ -29,7 +29,7 @@ and handles unexpected failure."
:db-graph-mode? (config/db-based-graph? repo)})]
(if (config/db-based-graph? repo)
(map (fn [block]
(cond-> (dissoc block :block/properties :block/macros :block/properties-order)
(cond-> (dissoc block :block/format :block/properties :block/macros :block/properties-order)
(:block/properties block)
(merge (update-keys (:block/properties block)
(fn [k]
@@ -79,16 +79,18 @@ and handles unexpected failure."
parse-config (mldoc/get-default-config format)
;; Disable extraction for display-type blocks as there isn't a reason to have
;; it enabled yet and can cause visible bugs when '#' is used
blocks (if (and (config/db-based-graph? (state/get-current-repo))
db-based? (config/db-based-graph? (state/get-current-repo))
blocks (if (and db-based?
(:logseq.property.node/display-type block))
[block]
(let [ast (format/to-edn title format parse-config)]
(extract-blocks ast title format {:parse-block block})))
new-block (first blocks)
block (cond->
(merge block new-block)
block (cond-> (merge block new-block)
(> (count blocks) 1)
(assoc :block/warning :multiple-blocks))
(assoc :block/warning :multiple-blocks)
db-based?
(dissoc :block/format))
block (dissoc block :block.temp/ast-body :block/level)]
(if uuid (assoc block :block/uuid uuid) block))))
@@ -97,7 +99,7 @@ and handles unexpected failure."
(when (map? block)
(merge block
(parse-title-and-body (:block/uuid block)
(:block/format block)
(get block :block/format :markdown)
(:block/pre-block? block)
(:block/title block)))))
([block-uuid format pre-block? content]

View File

@@ -1,7 +1,8 @@
(ns frontend.handler
"Main ns that handles application startup. Closest ns that we have to a
system. Contains a couple of small system components"
(:require [electron.ipc :as ipc]
(:require [cljs-bean.core :as bean]
[electron.ipc :as ipc]
[electron.listener :as el]
[frontend.components.block :as block]
[frontend.components.editor :as editor]
@@ -10,36 +11,35 @@
[frontend.components.whiteboard :as whiteboard]
[frontend.config :as config]
[frontend.context.i18n :as i18n]
[frontend.db.restore :as db-restore]
[frontend.db.react :as react]
[frontend.db.restore :as db-restore]
[frontend.error :as error]
[frontend.handler.command-palette :as command-palette]
[frontend.handler.events :as events]
[frontend.handler.file-based.events]
[frontend.handler.file :as file-handler]
[frontend.handler.file-based.events]
[frontend.handler.global-config :as global-config-handler]
[frontend.handler.notification :as notification]
[frontend.handler.page :as page-handler]
[frontend.handler.plugin-config :as plugin-config-handler]
[frontend.handler.repo :as repo-handler]
[frontend.handler.repo-config :as repo-config-handler]
[frontend.handler.test :as test]
[frontend.handler.ui :as ui-handler]
[frontend.handler.user :as user-handler]
[frontend.idb :as idb]
[frontend.mobile.core :as mobile]
[frontend.mobile.util :as mobile-util]
[frontend.modules.instrumentation.core :as instrument]
[frontend.modules.shortcut.core :as shortcut]
[frontend.persist-db :as persist-db]
[frontend.persist-db.browser :as db-browser]
[frontend.state :as state]
[frontend.util :as util]
[frontend.util.persist-var :as persist-var]
[goog.object :as gobj]
[lambdaisland.glogi :as log]
[promesa.core :as p]
[frontend.mobile.core :as mobile]
[cljs-bean.core :as bean]
[frontend.handler.test :as test]
[frontend.persist-db.browser :as db-browser]
[frontend.persist-db :as persist-db]))
[promesa.core :as p]))
(defn- set-global-error-notification!
[]

View File

@@ -3,27 +3,27 @@
[clojure.set :as set]
[clojure.string :as string]
[clojure.walk :as walk]
[datascript.impl.entity :as de]
[dommy.core :as dom]
[frontend.config :as config]
[frontend.db :as db]
[logseq.db :as ldb]
[frontend.db.model :as db-model]
[frontend.handler.file-based.property.util :as property-util]
[frontend.handler.property.util :as pu]
[frontend.mobile.haptics :as haptics]
[logseq.outliner.core :as outliner-core]
[frontend.modules.outliner.ui :as ui-outliner-tx]
[frontend.modules.outliner.op :as outliner-op]
[logseq.outliner.op]
[frontend.modules.outliner.ui :as ui-outliner-tx]
[frontend.state :as state]
[frontend.util :as util]
[frontend.util.file-based.drawer :as drawer]
[goog.dom :as gdom]
[logseq.graph-parser.block :as gp-block]
[logseq.db.sqlite.util :as sqlite-util]
[frontend.config :as config]
[frontend.handler.file-based.property.util :as property-util]
[frontend.handler.property.util :as pu]
[dommy.core :as dom]
[goog.object :as gobj]
[promesa.core :as p]
[datascript.impl.entity :as de]))
[logseq.db :as ldb]
[logseq.db.sqlite.util :as sqlite-util]
[logseq.graph-parser.block :as gp-block]
[logseq.outliner.core :as outliner-core]
[logseq.outliner.op]
[promesa.core :as p]))
;; Fns
@@ -242,7 +242,7 @@
:else
(subs content 0 pos))
content (sanity-block-content repo (:block/format block) content)]
content (sanity-block-content repo (get block :block/format :markdown) content)]
(state/clear-selection!)
(edit-block-aux repo block content text-range (assoc opts :pos pos)))))))

View File

@@ -1,12 +1,12 @@
(ns frontend.handler.command-palette
"System-component-like ns for command palette's functionality"
(:require [cljs.spec.alpha :as s]
[frontend.modules.shortcut.data-helper :as shortcut-helper]
[frontend.handler.plugin :as plugin-handler]
[frontend.modules.shortcut.data-helper :as shortcut-helper]
[frontend.spec :as spec]
[frontend.state :as state]
[lambdaisland.glogi :as log]
[frontend.storage :as storage]))
[frontend.storage :as storage]
[lambdaisland.glogi :as log]))
(s/def :command/id keyword?)
(s/def :command/desc string?)

View File

@@ -71,7 +71,7 @@
(defn ^:export show-block-ast []
(if-let [{:block/keys [title format]} (:block (first (state/get-editor-args)))]
(show-content-ast title format)
(show-content-ast title (or format :markdown))
(notification/show! "No block found" :warning)))
(defn ^:export show-page-data []
@@ -85,7 +85,8 @@
(let [page-data (db/pull '[:block/format {:block/file [:file/content]}]
(page-util/get-current-page-id))]
(if (get-in page-data [:block/file :file/content])
(show-content-ast (get-in page-data [:block/file :file/content]) (:block/format page-data))
(show-content-ast (get-in page-data [:block/file :file/content])
(get page-data :block/format :markdown))
(notification/show! "No page found" :warning)))))
(defn ^:export validate-db []

View File

@@ -1,29 +1,29 @@
(ns frontend.handler.common.plugin
"Common plugin related fns for handlers and api"
(:require [frontend.state :as state]
(:require [cljs-bean.core :as bean]
[electron.ipc :as ipc]
[frontend.state :as state]
[frontend.util :as util]
[promesa.core :as p]
[cljs-bean.core :as bean]
[electron.ipc :as ipc]))
[promesa.core :as p]))
(defn get-web-plugin-checker-url!
([repo] (get-web-plugin-checker-url! repo ""))
([repo version]
(util/node-path.join "https://plugins.logseq.io/r2"
repo (if (not (string? version)) "" version))))
repo (if (not (string? version)) "" version))))
(defn fetch-web-plugin-entry-info
[repo version]
(p/let [url (get-web-plugin-checker-url! repo version)
^js res (js/window.fetch url)]
(if (and (.-ok res)
(= (.-status res) 200))
(= (.-status res) 200))
(-> (.json res)
(p/then #(bean/->clj %)))
(p/then #(bean/->clj %)))
(-> (.text res)
(p/then
(fn [error-text]
(throw (js/Error. (str "web-plugin-entry-error:" error-text)))))))))
(p/then
(fn [error-text]
(throw (js/Error. (str "web-plugin-entry-error:" error-text)))))))))
(defn installed?
"For the given plugin id, returns boolean indicating if it is installed"
@@ -39,28 +39,28 @@
[{:keys [version repo only-check] :as manifest}]
(js/console.log "[plugin]" (if only-check "Checking" "Installing") " #" repo)
(-> (fetch-web-plugin-entry-info repo (if only-check "" version))
(p/then (fn [web-pkg]
(let [web-pkg (merge web-pkg (dissoc manifest :stat))
latest-version (:version web-pkg)
valid-latest-version (when only-check
(let [coerced-current-version (.coerce util/sem-ver version)
coerced-latest-version (.coerce util/sem-ver latest-version)]
(if (and coerced-current-version
coerced-latest-version
(util/sem-ver.lt coerced-current-version coerced-latest-version))
latest-version
(throw (js/Error. :no-new-version)))))]
(emit-lsp-updates!
{:status :completed
:only-check only-check
:payload (if only-check
(assoc manifest :latest-version valid-latest-version :latest-notes "TODO: update notes")
(assoc manifest :dst repo :version latest-version :web-pkg web-pkg))}))))
(p/catch (fn [^js e]
(emit-lsp-updates!
{:status :error
:only-check only-check
:payload (assoc manifest :error-code (.-message e))})))))
(p/then (fn [web-pkg]
(let [web-pkg (merge web-pkg (dissoc manifest :stat))
latest-version (:version web-pkg)
valid-latest-version (when only-check
(let [coerced-current-version (.coerce util/sem-ver version)
coerced-latest-version (.coerce util/sem-ver latest-version)]
(if (and coerced-current-version
coerced-latest-version
(util/sem-ver.lt coerced-current-version coerced-latest-version))
latest-version
(throw (js/Error. :no-new-version)))))]
(emit-lsp-updates!
{:status :completed
:only-check only-check
:payload (if only-check
(assoc manifest :latest-version valid-latest-version :latest-notes "TODO: update notes")
(assoc manifest :dst repo :version latest-version :web-pkg web-pkg))}))))
(p/catch (fn [^js e]
(emit-lsp-updates!
{:status :error
:only-check only-check
:payload (assoc manifest :error-code (.-message e))})))))
(defn install-marketplace-plugin!
"Installs plugin given plugin map with id"

View File

@@ -1,13 +1,13 @@
(ns frontend.handler.config
"Fns for setting repo config"
(:require [clojure.string :as string]
[frontend.state :as state]
(:require [borkdude.rewrite-edn :as rewrite]
[clojure.string :as string]
[frontend.config :as config]
[frontend.db :as db]
[frontend.handler.db-based.editor :as db-editor-handler]
[frontend.handler.file :as file-handler]
[frontend.handler.repo-config :as repo-config-handler]
[frontend.handler.db-based.editor :as db-editor-handler]
[frontend.db :as db]
[borkdude.rewrite-edn :as rewrite]
[frontend.config :as config]))
[frontend.state :as state]))
(defn parse-repo-config
"Parse repo configuration file content"
@@ -22,8 +22,8 @@
(let [result (parse-repo-config (if (string/blank? content) "{}" content))
ks (if (vector? k) k [k])
v (cond->> v
(map? v)
(reduce-kv (fn [a k v] (rewrite/assoc a k v)) (rewrite/parse-string "{}")))
(map? v)
(reduce-kv (fn [a k v] (rewrite/assoc a k v)) (rewrite/parse-string "{}")))
new-result (rewrite/assoc-in result ks v)
new-content (str new-result)]
(if (config/db-based-graph? repo)

View File

@@ -57,7 +57,8 @@
block-with-title? (mldoc/block-with-title? first-elem-type)
content' (str (config/get-block-pattern :markdown) (if block-with-title? " " "\n") title)
parsed-block (block/parse-block (assoc block :block/title content'))
block' (merge block parsed-block {:block/title title})]
block' (-> (merge block parsed-block {:block/title title})
(dissoc :block/format))]
(update block' :block/refs
(fn [refs]
(-> refs

View File

@@ -1,14 +1,14 @@
(ns frontend.handler.dnd
"Provides fns for drag and drop"
(:require [frontend.handler.editor :as editor-handler]
(:require [frontend.db :as db]
[frontend.handler.block :as block-handler]
[frontend.handler.editor :as editor-handler]
[frontend.handler.property :as property-handler]
[logseq.db :as ldb]
[frontend.modules.outliner.ui :as ui-outliner-tx]
[frontend.modules.outliner.op :as outliner-op]
[logseq.common.util.block-ref :as block-ref]
[frontend.modules.outliner.ui :as ui-outliner-tx]
[frontend.state :as state]
[frontend.db :as db]
[frontend.handler.block :as block-handler]))
[logseq.common.util.block-ref :as block-ref]
[logseq.db :as ldb]))
(defn move-blocks
[^js event blocks target-block original-block move-to]
@@ -18,8 +18,8 @@
top? (= move-to :top)
nested? (= move-to :nested)
alt-key? (and event (.-altKey event))
current-format (:block/format first-block)
target-format (:block/format target-block)
current-format (get first-block :block/format :markdown)
target-format (get target-block :block/format :markdown)
target-block (if nested? target-block
(or original-block target-block))]
(cond

View File

@@ -134,7 +134,7 @@
:selection-end selection-end
:selection (some-> selection
string/trim)
:format (:block/format block)
:format (get block :block/format :markdown)
:value value
:block block
:edit-id edit-id
@@ -173,7 +173,7 @@
(defn highlight-format! []
(when-let [block (state/get-edit-block)]
(let [format (:block/format block)]
(let [format (get block :block/format :markdown)]
(format-text! #(config/get-highlight format)))))
(defn strike-through-format! []
@@ -283,6 +283,7 @@
{:keys [force?]
:as opts}]
(let [{:block/keys [uuid format repo title properties]} block
format (or format :markdown)
repo (or repo (state/get-current-repo))
format (or format (state/get-preferred-format))
block-id (when (and (not (config/db-based-graph? repo)) (map? properties))
@@ -526,7 +527,7 @@
edit-block? true}}]
(when (or page block-uuid)
(let [repo (state/get-current-repo)
db-base? (config/db-based-graph? repo)
db-based? (config/db-based-graph? repo)
before? (if page false before?)
sibling? (boolean sibling?)
sibling? (if before? true (if page false sibling?))
@@ -541,15 +542,17 @@
(when last-block-id
(db/entity last-block-id))))
format (or
(:block/format block)
(get block :block/format :markdown)
(db/get-page-format (:block/name block))
(state/get-preferred-format))
content (if (and (not db-base?) (seq properties))
content (if (and (not db-based?) (seq properties))
(property-file/insert-properties-when-file-based repo format content properties)
content)
new-block (-> (select-keys block [:block/page])
(assoc :block/title content
:block/format format))
new-block (cond->
(-> (select-keys block [:block/page])
(assoc :block/title content))
(not db-based?)
(assoc :block/format format))
new-block (assoc new-block :block/page
(if page
(:db/id block)
@@ -586,7 +589,7 @@
:keep-uuid? true
:ordered-list? ordered-list?
:replace-empty-target? replace-empty-target?})
(when (and db-base? (seq properties))
(when (and db-based? (seq properties))
(property-handler/set-block-properties! repo (:block/uuid new-block) properties)))
(when edit-block?
(if (and replace-empty-target?
@@ -602,7 +605,7 @@
(when-let [page (db/get-page page-title)]
(let [class-or-property? (or (ldb/class? page) (ldb/property? page))]
(when (or class-or-property? (db/page-empty? (state/get-current-repo) (:db/id page)))
(let [format (or (:block/format page) (state/get-preferred-format))
(let [format (get page :block/format :markdown)
new-block {:block/title ""
:block/format format}]
(ui-outliner-tx/transact!
@@ -857,7 +860,7 @@
(outliner-op/delete-blocks! blocks' nil))
(when sibling-block
(let [{:keys [edit-block-f]} (move-to-prev-block repo sibling-block
(:block/format block)
(get block :block/format :markdown)
"")]
(when edit-block-f (edit-block-f))))))))
@@ -963,7 +966,7 @@
[k v'])) b)
(into {}))
(assoc :db/id (:db/id b)))))))]
(common-handler/copy-to-clipboard-without-id-property! repo (:block/format block) content (when html? html) copied-blocks))
(common-handler/copy-to-clipboard-without-id-property! repo (get block :block/format :markdown) content (when html? html) copied-blocks))
(state/set-block-op-type! :copy)
(notification/show! "Copied!" :success)))))
@@ -997,7 +1000,7 @@
(map (fn [{:keys [id level]}]
(if (config/db-based-graph? (state/get-current-repo))
(str (string/join (repeat (dec level) "\t")) "- " (page-ref/->page-ref id))
(condp = (:block/format block)
(condp = (get block :block/format :markdown)
:org
(str (string/join (repeat level "*")) " " (block-ref/->block-ref id))
:markdown
@@ -1193,7 +1196,7 @@
[_top-level-block-uuids md-content] (compose-copied-blocks-contents repo [block-id])
html (export-html/export-blocks-as-html repo [block-id] nil)
sorted-blocks (tree/get-sorted-block-and-children repo (:db/id block))]
(common-handler/copy-to-clipboard-without-id-property! repo (:block/format block) md-content html sorted-blocks)
(common-handler/copy-to-clipboard-without-id-property! repo (get block :block/format :markdown) md-content html sorted-blocks)
(state/set-block-op-type! :cut)
(delete-block-aux! block))))
@@ -1289,7 +1292,7 @@
(save-block!
{:block block :repo repo :opts (dissoc opts :properties)}
(if (seq properties)
(property-file/insert-properties-when-file-based repo (:block/format block) content properties)
(property-file/insert-properties-when-file-based repo (get block :block/format :markdown) content properties)
content))))
([{:keys [block repo opts] :as _state} value]
(let [repo (or repo (state/get-current-repo))]
@@ -2057,14 +2060,14 @@
(merge (apply dissoc block (conj (when-not keep-uuid? [:block/_refs]) :block/pre-block? :block/meta))
(cond->
{:block/page {:db/id (:db/id page)}
:block/format format
:block/title new-content}
(not db-based?)
(assoc :block/properties (apply dissoc (:block/properties block)
(concat
(when-not keep-uuid? [:id])
[:custom_id :custom-id]
exclude-properties)))
exclude-properties))
:block/format format)
(not db-based?)
(assoc :block/properties-text-values (apply dissoc (:block/properties-text-values block)
(concat
@@ -2134,7 +2137,7 @@
{:outliner-op :insert-blocks
:additional-tx revert-cut-txs}
(when target-block'
(let [format (or (:block/format target-block') (state/get-preferred-format))
(let [format (get target-block' :block/format :markdown)
repo (state/get-current-repo)
blocks' (map (fn [block]
(paste-block-cleanup repo block page exclude-properties format content-update-fn keep-uuid?))
@@ -2218,7 +2221,7 @@
(when (:db/id block)
(let [journal? (ldb/journal? target)
target (or target (state/get-edit-block))
format (:block/format block)
format (get block :block/format :markdown)
block-uuid (:block/uuid block)
template-including-parent? (not (false? (:template-including-parent (:block/properties block))))
blocks (db/get-block-and-children repo block-uuid)
@@ -2363,7 +2366,7 @@
(when block
(let [input (state/get-input)
content (gobj/get input "value")
format (:block/format (:block (get-state)))
format (get (:block (get-state)) :block/format :markdown)
property-key (:raw-content (thingatpt/property-key-at-point input))
org? (= format :org)
move-to-pos (if org? 2 3)]
@@ -2643,7 +2646,8 @@
:down util/get-next-block-non-collapsed)
current-block (util/rec-get-node input "ls-block")
sibling-block (f current-block {:up-down? true})
{:block/keys [uuid title format]} (state/get-edit-block)]
{:block/keys [uuid title format]} (state/get-edit-block)
format (or format :markdown)]
(if sibling-block
(when-let [sibling-block-id (dom/attr sibling-block "blockid")]
(let [container-id (some-> (dom/attr sibling-block "containerid") js/parseInt)
@@ -2693,6 +2697,7 @@
(let [up? (= :left direction)
pos (if up? :max 0)
{:block/keys [format uuid] :as block} (or block (state/get-edit-block))
format (or format :markdown)
repo (state/get-current-repo)
editing-block (gdom/getElement (state/get-editing-block-dom-id))
f (if up? util/get-prev-block-non-collapsed util/get-next-block-non-collapsed)
@@ -3486,7 +3491,7 @@
(file-editor-handler/valid-custom-query-block? block)))
(and
(:outliner/block-title-collapse-enabled? (state/get-config))
(block-with-title? (:block/format block)
(block-with-title? (get block :block/format :markdown)
(:block/title block)
semantic?))))
false)))))
@@ -3844,7 +3849,7 @@
(when-let [{:keys [start end link]} (thingatpt/block-ref-at-point)]
(when-let [block (db/entity [:block/uuid link])]
(let [block-content (:block/title block)
format (or (:block/format block) :markdown)
format (get block :block/format :markdown)
block-content-without-prop (-> (property-file/remove-properties-when-file-based repo format block-content)
(drawer/remove-logbook))]
(when-let [input (state/get-input)]
@@ -3876,7 +3881,8 @@
match (block-ref/->block-ref ref-id)
ref-block (db/entity [:block/uuid ref-id])
block-ref-content (->> (or (:block/title ref-block) "")
(property-file/remove-built-in-properties-when-file-based repo (:block/format ref-block))
(property-file/remove-built-in-properties-when-file-based repo
(get ref-block :block/format :markdown))
(drawer/remove-logbook))
content (string/replace-first (:block/title block) match
block-ref-content)]

View File

@@ -5,13 +5,12 @@
[clojure.string :as string]
[clojure.zip :as z]
[frontend.db :as db]
[frontend.format.mldoc :as mldoc]
[frontend.handler.export.common :as common :refer [*state*]]
[frontend.handler.export.zip-helper :refer [get-level goto-last
goto-level]]
[frontend.state :as state]
[frontend.util :as util :refer [concatv mapcatv removev]]
[hiccups.runtime :as h]
[frontend.format.mldoc :as mldoc]
[malli.core :as m]))
(def ^:private hiccup-malli-schema
@@ -425,8 +424,8 @@
(common/get-page-content root-block-uuids-or-page-uuid)
(common/root-block-uuids->content repo root-block-uuids-or-page-uuid))
first-block (and (coll? root-block-uuids-or-page-uuid)
(db/entity [:block/uuid (first root-block-uuids-or-page-uuid)]))
format (or (:block/format first-block) (state/get-preferred-format))]
(db/entity [:block/uuid (first root-block-uuids-or-page-uuid)]))
format (get first-block :block/format :markdown)]
(export-helper content format options)))
;;; export fns (ends)

View File

@@ -4,19 +4,18 @@
(:require ["/frontend/utils" :as utils]
[clojure.string :as string]
[clojure.zip :as z]
[frontend.config :as config]
[frontend.db :as db]
[frontend.extensions.zip :as zip]
[frontend.format.mldoc :as mldoc]
[frontend.handler.export.common :as common :refer
[*state* raw-text simple-asts->string space]]
[frontend.handler.export.zip-helper :refer [get-level goto-last
goto-level]]
[frontend.state :as state]
[frontend.util :as util :refer [concatv mapcatv removev]]
[goog.dom :as gdom]
[hiccups.runtime :as h]
[frontend.format.mldoc :as mldoc]
[promesa.core :as p]
[frontend.config :as config]))
[promesa.core :as p]))
;;; *opml-state*
(def ^:private ^:dynamic
@@ -151,7 +150,6 @@
(mapcatv (fn [inline] (cons space (inline-ast->simple-ast inline))) inline-coll)
[(raw-text "}")]))
(defn- inline-superscript
[inline-coll]
(concatv [(raw-text "^{")]
@@ -215,7 +213,6 @@
[{:keys [local_part domain]}]
[(raw-text (str "<" local_part "@" domain ">"))])
(defn- inline-ast->simple-ast
[inline]
(let [[ast-type ast-content] inline]
@@ -448,7 +445,7 @@
"untitled")
first-block (and (coll? root-block-uuids-or-page-uuid)
(db/entity [:block/uuid (first root-block-uuids-or-page-uuid)]))
format (or (:block/format first-block) (state/get-preferred-format))]
format (get first-block :block/format :markdown)]
(export-helper content format options :title title))))
(defn- export-files-as-opml

View File

@@ -2,19 +2,18 @@
"export blocks/pages as text"
(:refer-clojure :exclude [map filter mapcat concat remove newline])
(:require [clojure.string :as string]
[frontend.config :as config]
[frontend.db :as db]
[frontend.extensions.zip :as zip]
[frontend.format.mldoc :as mldoc]
[frontend.handler.export.common :as common :refer
[*state* indent newline* raw-text simple-ast-malli-schema
simple-asts->string space]]
[logseq.graph-parser.schema.mldoc :as mldoc-schema]
[frontend.state :as state]
[frontend.util :as util :refer [concatv mapcatv removev]]
[goog.dom :as gdom]
[frontend.format.mldoc :as mldoc]
[logseq.graph-parser.schema.mldoc :as mldoc-schema]
[malli.core :as m]
[promesa.core :as p]
[frontend.config :as config]))
[promesa.core :as p]))
;;; block-ast, inline-ast -> simple-ast
@@ -67,7 +66,7 @@
""))
current-level (get *state* :current-level 1)
indent' (when (> current-level 1)
(indent (dec current-level) 0))
(indent (dec current-level) 0))
items* (block-list items :in-list? true)]
(concatv [indent' number* checkbox* space]
content*
@@ -503,7 +502,6 @@
simple-asts (mapcatv block-ast->simple-ast ast***)]
(simple-asts->string simple-asts)))))
(defn export-blocks-as-markdown
"options:
:indent-style \"dashes\" | \"spaces\" | \"no-indent\"
@@ -521,8 +519,8 @@
(common/get-page-content root-block-uuids-or-page-uuid)
(common/root-block-uuids->content repo root-block-uuids-or-page-uuid))
first-block (and (coll? root-block-uuids-or-page-uuid)
(db/entity [:block/uuid (first root-block-uuids-or-page-uuid)]))
format (or (:block/format first-block) (state/get-preferred-format))]
(db/entity [:block/uuid (first root-block-uuids-or-page-uuid)]))
format (get first-block :block/format :markdown)]
(export-helper content format options))
(catch :default e
(js/console.error e)))))

View File

@@ -1,29 +1,29 @@
(ns frontend.handler.file-based.editor
"File-based graph implementation"
(:require [clojure.string :as string]
[frontend.config :as config]
[frontend.commands :as commands]
[frontend.config :as config]
[frontend.date :as date]
[frontend.format.block :as block]
[frontend.db :as db]
[frontend.db.query-dsl :as query-dsl]
[frontend.format.block :as block]
[frontend.format.mldoc :as mldoc]
[frontend.state :as state]
[frontend.handler.block :as block-handler]
[frontend.handler.file-based.property :as file-property-handler]
[frontend.handler.file-based.property.util :as property-util]
[frontend.handler.file-based.repeated :as repeated]
[frontend.handler.file-based.status :as status]
[frontend.handler.property.file :as property-file]
[frontend.modules.outliner.op :as outliner-op]
[frontend.modules.outliner.ui :as ui-outliner-tx]
[frontend.state :as state]
[frontend.util :as util]
[frontend.util.file-based.clock :as clock]
[frontend.util.file-based.drawer :as drawer]
[frontend.handler.file-based.repeated :as repeated]
[frontend.handler.block :as block-handler]
[frontend.handler.file-based.status :as status]
[frontend.handler.property.file :as property-file]
[frontend.handler.file-based.property :as file-property-handler]
[frontend.handler.file-based.property.util :as property-util]
[logseq.db.frontend.schema :as db-schema]
[logseq.common.util.block-ref :as block-ref]
[logseq.common.util :as common-util]
[logseq.db :as ldb]))
[logseq.common.util.block-ref :as block-ref]
[logseq.db :as ldb]
[logseq.db.frontend.schema :as db-schema]))
(defn- remove-non-existed-refs!
[refs]
@@ -67,7 +67,7 @@
[block value]
(if (and (state/enable-timetracking?)
(not= (:block/title block) value))
(let [format (:block/format block)
(let [format (get block :block/format :markdown)
new-marker (last (util/safe-re-find (status/marker-pattern format) (or value "")))
new-value (with-marker-time value block format
new-marker
@@ -140,7 +140,7 @@
(when-let [block (cond (string? block-or-id) (db/entity [:block/uuid (uuid block-or-id)])
(uuid? block-or-id) (db/entity [:block/uuid block-or-id])
:else block-or-id)]
(let [format (:block/format block)
(let [format (get block :block/format :markdown)
content (:block/title block)
properties (:block/properties block)
properties (if (nil? value)
@@ -158,7 +158,7 @@
(defn- set-heading-aux!
[block-id heading]
(let [block (db/pull [:block/uuid block-id])
format (:block/format block)
format (get block :block/format :markdown)
old-heading (get-in block [:block/properties :heading])]
(if (= format :markdown)
(cond
@@ -240,7 +240,7 @@
(when content
(when (and (string/includes? content "#+BEGIN_QUERY")
(string/includes? content "#+END_QUERY"))
(let [ast (mldoc/->edn (string/trim content) (or (:block/format entity) :markdown))
(let [ast (mldoc/->edn (string/trim content) (get entity :block/format :markdown))
q (mldoc/extract-first-query-from-ast ast)]
(some? (:query (common-util/safe-read-map-string q))))))))

View File

@@ -32,7 +32,7 @@
new-properties (zipmap (map second items)
(map last items))]
(when-let [block (db/entity [:block/uuid block-id])]
(let [format (:block/format block)
(let [format (get block :block/format :markdown)
content (:block/title block)
properties (:block/properties block)
properties-text-values (:block/properties-text-values block)

View File

@@ -1,25 +1,25 @@
(ns ^:no-doc frontend.handler.paste
(:require [frontend.state :as state]
[frontend.db :as db]
[frontend.format.block :as block]
[logseq.common.util :as common-util]
[logseq.graph-parser.block :as gp-block]
[logseq.common.util.block-ref :as block-ref]
(:require ["/frontend/utils" :as utils]
[clojure.string :as string]
[frontend.util :as util]
[frontend.handler.editor :as editor-handler]
[frontend.extensions.html-parser :as html-parser]
[goog.object :as gobj]
[frontend.mobile.util :as mobile-util]
[frontend.util.thingatpt :as thingatpt]
["/frontend/utils" :as utils]
[frontend.commands :as commands]
[frontend.util.text :as text-util]
[frontend.format.mldoc :as mldoc]
[lambdaisland.glogi :as log]
[promesa.core :as p]
[frontend.config :as config]
[logseq.db.frontend.content :as db-content]))
[frontend.db :as db]
[frontend.extensions.html-parser :as html-parser]
[frontend.format.block :as block]
[frontend.format.mldoc :as mldoc]
[frontend.handler.editor :as editor-handler]
[frontend.mobile.util :as mobile-util]
[frontend.state :as state]
[frontend.util :as util]
[frontend.util.text :as text-util]
[frontend.util.thingatpt :as thingatpt]
[goog.object :as gobj]
[lambdaisland.glogi :as log]
[logseq.common.util :as common-util]
[logseq.common.util.block-ref :as block-ref]
[logseq.db.frontend.content :as db-content]
[logseq.graph-parser.block :as gp-block]
[promesa.core :as p]))
(defn- paste-text-parseable
[format text]
@@ -235,7 +235,9 @@
(loop [files files]
(when-let [file (first files)]
(when-let [block (state/get-edit-block)]
(editor-handler/upload-asset! id #js[file] (:block/format block) editor-handler/*asset-uploading? true))
(editor-handler/upload-asset! id #js[file]
(get block :block/format :markdown)
editor-handler/*asset-uploading? true))
(recur (rest files))))
(util/stop e))))

View File

@@ -1,39 +1,39 @@
(ns frontend.handler.plugin
"System-component-like ns that provides all high level plugin functionality"
(:require [promesa.core :as p]
[rum.core :as rum]
[frontend.util :as util]
[clojure.walk :as walk]
[logseq.graph-parser.mldoc :as gp-mldoc]
[frontend.handler.notification :as notification]
[frontend.handler.common.plugin :as plugin-common-handler]
[frontend.modules.shortcut.utils :as shortcut-utils]
[frontend.storage :as storage]
[camel-snake-kebab.core :as csk]
[frontend.state :as state]
[medley.core :as medley]
[frontend.fs :as fs]
[frontend.idb :as idb]
[electron.ipc :as ipc]
(:require [camel-snake-kebab.core :as csk]
[cljs-bean.core :as bean]
[clojure.string :as string]
[lambdaisland.glogi :as log]
[clojure.walk :as walk]
[electron.ipc :as ipc]
[frontend.components.svg :as svg]
[logseq.shui.ui :as shui]
[frontend.context.i18n :refer [t]]
[frontend.config :as config]
[frontend.format :as format]))
[frontend.context.i18n :refer [t]]
[frontend.format :as format]
[frontend.fs :as fs]
[frontend.handler.common.plugin :as plugin-common-handler]
[frontend.handler.notification :as notification]
[frontend.idb :as idb]
[frontend.modules.shortcut.utils :as shortcut-utils]
[frontend.state :as state]
[frontend.storage :as storage]
[frontend.util :as util]
[lambdaisland.glogi :as log]
[logseq.graph-parser.mldoc :as gp-mldoc]
[logseq.shui.ui :as shui]
[medley.core :as medley]
[promesa.core :as p]
[rum.core :as rum]))
(defn- normalize-keyword-for-json
[input]
(when input
(let [f (fn [[k v]] (if (keyword? k) [(csk/->camelCase (name k)) v] [k v]))]
(walk/postwalk
(fn [x]
(cond
(map? x) (into {} (map f x))
(uuid? x) (str x)
:else x)) input))))
(fn [x]
(cond
(map? x) (into {} (map f x))
(uuid? x) (str x)
:else x)) input))))
(defn invoke-exported-api
[type & args]
@@ -58,7 +58,7 @@
(defn setup-global-apis-for-web!
[]
(when (and util/web-platform?
(nil? js/window.apis))
(nil? js/window.apis))
(let [^js e (js/window.EventEmitter3.)]
(set! (. js/window -apis) e))))
@@ -70,19 +70,19 @@
(defn load-plugin-preferences
[]
(-> (invoke-exported-api :load_user_preferences)
(p/then #(bean/->clj %))
(p/then #(state/set-state! :plugin/preferences %))
(p/catch
#(js/console.error %))))
(p/then #(bean/->clj %))
(p/then #(state/set-state! :plugin/preferences %))
(p/catch
#(js/console.error %))))
(defn save-plugin-preferences!
([input] (save-plugin-preferences! input true))
([input reload-state?]
(when-let [^js input (and (map? input) (bean/->js input))]
(p/then
(js/LSPluginCore.saveUserPreferences input)
#(when reload-state?
(load-plugin-preferences))))))
(js/LSPluginCore.saveUserPreferences input)
#(when reload-state?
(load-plugin-preferences))))))
(defn gh-repo-url [repo]
(str "https://github.com/" repo))
@@ -96,66 +96,66 @@
[refresh?]
(if (or refresh? (nil? (:plugin/marketplace-pkgs @state/state)))
(p/create
(fn [resolve reject]
(let [on-ok (fn [res]
(if-let [res (and res (bean/->clj res))]
(let [pkgs (:packages res)
pkgs (if (util/electron?) pkgs
(some->> pkgs (filterv #(or (true? (:web %)) (not (true? (:effect %)))))))]
(state/set-state! :plugin/marketplace-pkgs pkgs)
(resolve pkgs))
(reject nil)))]
(if (state/http-proxy-enabled-or-val?)
(-> (ipc/ipc :httpFetchJSON plugins-url)
(p/then on-ok)
(p/catch reject))
(util/fetch plugins-url on-ok reject)))))
(fn [resolve reject]
(let [on-ok (fn [res]
(if-let [res (and res (bean/->clj res))]
(let [pkgs (:packages res)
pkgs (if (util/electron?) pkgs
(some->> pkgs (filterv #(or (true? (:web %)) (not (true? (:effect %)))))))]
(state/set-state! :plugin/marketplace-pkgs pkgs)
(resolve pkgs))
(reject nil)))]
(if (state/http-proxy-enabled-or-val?)
(-> (ipc/ipc :httpFetchJSON plugins-url)
(p/then on-ok)
(p/catch reject))
(util/fetch plugins-url on-ok reject)))))
(p/resolved (:plugin/marketplace-pkgs @state/state))))
(defn load-marketplace-stats
[refresh?]
(if (or refresh? (nil? (:plugin/marketplace-stats @state/state)))
(p/create
(fn [resolve reject]
(let [on-ok (fn [^js res]
(if-let [res (and res (bean/->clj res))]
(do
(state/set-state!
:plugin/marketplace-stats
(into {} (map (fn [[k stat]]
[k (assoc stat
:total_downloads
(reduce (fn [a b] (+ a (get b 2))) 0 (:releases stat)))])
res)))
(resolve nil))
(reject nil)))]
(if (state/http-proxy-enabled-or-val?)
(-> (ipc/ipc :httpFetchJSON stats-url)
(p/then on-ok)
(p/catch reject))
(util/fetch stats-url on-ok reject)))))
(fn [resolve reject]
(let [on-ok (fn [^js res]
(if-let [res (and res (bean/->clj res))]
(do
(state/set-state!
:plugin/marketplace-stats
(into {} (map (fn [[k stat]]
[k (assoc stat
:total_downloads
(reduce (fn [a b] (+ a (get b 2))) 0 (:releases stat)))])
res)))
(resolve nil))
(reject nil)))]
(if (state/http-proxy-enabled-or-val?)
(-> (ipc/ipc :httpFetchJSON stats-url)
(p/then on-ok)
(p/catch reject))
(util/fetch stats-url on-ok reject)))))
(p/resolved nil)))
(defn check-or-update-marketplace-plugin!
[{:keys [id] :as pkg} error-handler]
(when-not (and (:plugin/installing @state/state)
(not (plugin-common-handler/installed? id)))
(not (plugin-common-handler/installed? id)))
(state/set-state! :plugin/installing pkg)
(-> (load-marketplace-plugins false)
(p/then (fn [manifests]
(let [mft (some #(when (= (:id %) id) %) manifests)
opts (merge (dissoc pkg :logger) mft)]
(p/then (fn [manifests]
(let [mft (some #(when (= (:id %) id) %) manifests)
opts (merge (dissoc pkg :logger) mft)]
;;TODO: (throw (js/Error. [:not-found-in-marketplace id]))
(if (util/electron?)
(ipc/ipc :updateMarketPlugin opts)
(plugin-common-handler/async-install-or-update-for-web! opts)))
true))
(p/catch (fn [^js e]
(state/reset-all-updates-state)
(error-handler e)
(state/set-state! :plugin/installing nil)
(js/console.error e))))))
(if (util/electron?)
(ipc/ipc :updateMarketPlugin opts)
(plugin-common-handler/async-install-or-update-for-web! opts)))
true))
(p/catch (fn [^js e]
(state/reset-all-updates-state)
(error-handler e)
(state/set-state! :plugin/installing nil)
(js/console.error e))))))
(defn get-plugin-inst
[pid]
@@ -176,17 +176,17 @@
(when-let [matched (medley/find-first #(= (:key (second %)) key) commands)]
(let [[_ cmd action pid] matched]
(state/pub-event!
[:exec-plugin-cmd {:type type :key key :pid pid :cmd (assoc cmd :args args) :action action}])))))
[:exec-plugin-cmd {:type type :key key :pid pid :cmd (assoc cmd :args args) :action action}])))))
(defn open-updates-downloading
[]
(when (and (not (:plugin/updates-downloading? @state/state))
(seq (state/all-available-coming-updates)))
(seq (state/all-available-coming-updates)))
(->> (:plugin/updates-coming @state/state)
(map #(if (state/coming-update-new-version? (second %1))
(update % 1 dissoc :error-code) %1))
(into {})
(state/set-state! :plugin/updates-coming))
(map #(if (state/coming-update-new-version? (second %1))
(update % 1 dissoc :error-code) %1))
(into {})
(state/set-state! :plugin/updates-coming))
(state/set-state! :plugin/updates-downloading? true)))
(defn close-updates-downloading
@@ -221,29 +221,29 @@
;; update plugin
(when-let [^js pl (get-plugin-inst id)]
(p/then
(.reload pl)
#(do
(.reload pl)
#(do
;;(if theme (select-a-plugin-theme id))
(when (not (util/electron?))
(set! (.-version (.-options pl)) (:version web-pkg))
(set! (.-webPkg (.-options pl)) (bean/->js web-pkg))
(invoke-exported-api :save_installed_web_plugin (.toJSON pl false)))
(notification/show!
(t :plugin/update-plugin name (.-version (.-options pl))) :success)
(state/consume-updates-from-coming-plugin! payload true))))
(when (not (util/electron?))
(set! (.-version (.-options pl)) (:version web-pkg))
(set! (.-webPkg (.-options pl)) (bean/->js web-pkg))
(invoke-exported-api :save_installed_web_plugin (.toJSON pl false)))
(notification/show!
(t :plugin/update-plugin name (.-version (.-options pl))) :success)
(state/consume-updates-from-coming-plugin! payload true))))
;; register plugin
(-> (js/LSPluginCore.register (bean/->js {:key id :url dst :webPkg web-pkg}))
(p/then (fn []
(when-let [^js pl (get-plugin-inst id)]
(when theme (js/setTimeout #(select-a-plugin-theme id) 300))
(when (.-isWebPlugin pl)
(invoke-exported-api :save_installed_web_plugin (.toJSON pl false)))
(notification/show!
(t :plugin/installed-plugin name) :success))))
(p/catch (fn [^js e]
(notification/show!
(str "Install failed: " name "\n" (.-message e))
:error)))))))
(p/then (fn []
(when-let [^js pl (get-plugin-inst id)]
(when theme (js/setTimeout #(select-a-plugin-theme id) 300))
(when (.-isWebPlugin pl)
(invoke-exported-api :save_installed_web_plugin (.toJSON pl false)))
(notification/show!
(t :plugin/installed-plugin name) :success))))
(p/catch (fn [^js e]
(notification/show!
(str "Install failed: " name "\n" (.-message e))
:error)))))))
:error
(let [error-code (keyword (string/replace (:error-code payload) #"^[\s\:\[]+" ""))
@@ -266,10 +266,10 @@
;; notify human tips
(notification/show!
(str
(if (= :error type) "[Error]" "")
(str "<" (:id payload) "> ")
msg) type)))
(str
(if (= :error type) "[Error]" "")
(str "<" (:id payload) "> ")
msg) type)))
(when-not fake-error?
(js/console.error "Update Error:" (:error-code payload))))
@@ -294,8 +294,8 @@
[plugin-metadata]
(when-let [pid (keyword (:id plugin-metadata))]
(some->> plugin-metadata
(normalize-plugin-metadata)
(swap! state/state update-in [:plugin/installed-plugins] assoc pid))))
(normalize-plugin-metadata)
(swap! state/state update-in [:plugin/installed-plugins] assoc pid))))
(defn host-mounted!
[]
@@ -306,7 +306,7 @@
(when-let [pid (keyword pid)]
(when (contains? (:plugin/installed-plugins @state/state) pid)
(swap! state/state update-in [:plugin/installed-slash-commands pid]
(fnil merge {}) (hash-map cmd (mapv #(conj % {:pid pid}) actions)))
(fnil merge {}) (hash-map cmd (mapv #(conj % {:pid pid}) actions)))
(state/pub-event! [:rebuild-slash-commands-list])
true)))
@@ -332,7 +332,7 @@
(get keybinding-mode-handler-map (keyword mode)))
:action (fn []
(state/pub-event!
[:exec-plugin-cmd {:type type :key key :pid pid :cmd cmd :action action}]))}]
[:exec-plugin-cmd {:type type :key key :pid pid :cmd cmd :action action}]))}]
palette-cmd))
(defn simple-cmd-keybinding->shortcut-args
@@ -340,8 +340,8 @@
(let [id (keyword (str "plugin." pid "/" key))
binding (:binding keybinding)
binding (some->> (if (string? binding) [binding] (vec binding))
(remove string/blank?)
(map shortcut-utils/undecorate-binding))
(remove string/blank?)
(map shortcut-utils/undecorate-binding))
binding (if util/mac?
(or (:mac keybinding) binding) binding)
mode (or (:mode keybinding) :global)
@@ -354,7 +354,7 @@
(when-let [pid (keyword pid)]
(when (contains? (:plugin/installed-plugins @state/state) pid)
(swap! state/state update-in [:plugin/simple-commands pid]
(fnil conj []) [type cmd action pid])
(fnil conj []) [type cmd action pid])
true)))
(defn unregister-plugin-simple-command
@@ -368,7 +368,7 @@
(let [items (or (get-in @state/state [:plugin/installed-ui-items pid]) [])
items (filter #(not= key (:key (second %))) items)]
(swap! state/state assoc-in [:plugin/installed-ui-items pid]
(conj items [type opts pid])))
(conj items [type opts pid])))
true)))
(defn unregister-plugin-ui-items
@@ -383,7 +383,7 @@
;; TODO: conditions
;; (when (contains? #{:error nil} (get-in @state/state (conj path key))))
(swap! state/state update-in path
(fnil assoc {}) key (merge opts {:pid pid}))
(fnil assoc {}) key (merge opts {:pid pid}))
true))))
(defn unregister-plugin-resources
@@ -426,7 +426,7 @@
(fn [pid key {subs' :subs :keys [render] :as opts}]
(when-let [key (and key (keyword key))]
(register-plugin-resources pid type
(merge opts {:key key :subs subs' :render render}))
(merge opts {:key key :subs subs' :render render}))
(swap! *providers conj pid)
#(swap! *providers disj pid))))
@@ -436,49 +436,49 @@
(fn [key]
(when-let [key (and (seq @*providers) key (keyword key))]
(when-let [rs (->> @*providers
(map (fn [pid] (state/get-plugin-resource pid type key)))
(remove nil?)
(flatten)
(seq))]
(map (fn [pid] (state/get-plugin-resource pid type key)))
(remove nil?)
(flatten)
(seq))]
(if many? rs (first rs)))))))
(defonce *fenced-code-providers (atom #{}))
(def register-fenced-code-renderer
;; [pid key payload]
(create-local-renderer-register
:fenced-code-renderers *fenced-code-providers))
:fenced-code-renderers *fenced-code-providers))
(def hook-fenced-code-by-lang
;; [key]
(create-local-renderer-getter
:fenced-code-renderers *fenced-code-providers))
:fenced-code-renderers *fenced-code-providers))
(def *extensions-enhancer-providers (atom #{}))
(def register-extensions-enhancer
;; a plugin can only register one enhancer for a type
(create-local-renderer-register
:extensions-enhancers *extensions-enhancer-providers))
:extensions-enhancers *extensions-enhancer-providers))
(def hook-extensions-enhancers-by-key
;; multiple plug-ins can obtain more than one enhancer
(create-local-renderer-getter
:extensions-enhancers *extensions-enhancer-providers true))
:extensions-enhancers *extensions-enhancer-providers true))
(def *route-renderer-providers (atom #{}))
(def register-route-renderer
(create-local-renderer-register
:route-renderers *route-renderer-providers))
:route-renderers *route-renderer-providers))
(def get-route-renderers
(create-local-renderer-getter
:route-renderers *route-renderer-providers true))
:route-renderers *route-renderer-providers true))
(defonce *daemon-renderer-providers (atom #{}))
(def register-daemon-renderer
;; [pid key payload]
(create-local-renderer-register
:daemon-renderers *daemon-renderer-providers))
:daemon-renderers *daemon-renderer-providers))
(def get-daemon-renderers
;; [key]
(create-local-renderer-getter
:daemon-renderers *daemon-renderer-providers true))
:daemon-renderers *daemon-renderer-providers true))
(defn select-a-plugin-theme
[pid]
@@ -492,7 +492,7 @@
;; TODO: force settings related ui reactive
;; Sometimes toggle to `disable` not working
;; But related-option data updated?
(assoc settings :disabled (boolean (:disabled settings)))))
(assoc settings :disabled (boolean (:disabled settings)))))
(defn open-settings-file-in-default-app!
[id-or-plugin]
@@ -513,18 +513,17 @@
([] (open-report-modal! nil nil))
([pid name]
(shui/dialog-open!
[:div.p-1
(when pid
[:h1.opacity-90.font-bold.pb-1.flex.item-center.gap-1
[:span.text-red-rx-10.flex.items-center (shui/tabler-icon "alert-triangle-filled" {:size 20})]
[:span name " " [:code "#" (str pid)]]])
[:p
"If any plugin is unavailable or you think it contains malicious code,
[:div.p-1
(when pid
[:h1.opacity-90.font-bold.pb-1.flex.item-center.gap-1
[:span.text-red-rx-10.flex.items-center (shui/tabler-icon "alert-triangle-filled" {:size 20})]
[:span name " " [:code "#" (str pid)]]])
[:p
"If any plugin is unavailable or you think it contains malicious code,
please email " [:a.hover:underline {:href (str "mailto://support@logseq.com?subject=Report plugin from Logseq Marketplace"
(when pid (str " (#" pid ")")))} "support@logseq.com"]
" . Mention the name of the plugin and the URL of its GitHub repository.
The Logseq team usually responds within a business day."]
])))
(when pid (str " (#" pid ")")))} "support@logseq.com"]
" . Mention the name of the plugin and the URL of its GitHub repository.
The Logseq team usually responds within a business day."]])))
(defn parse-user-md-content
[content {:keys [url]}]
@@ -532,11 +531,11 @@
(when-not (string/blank? content)
(let [content (if-not (string/blank? url)
(string/replace
content #"!\[[^\]]*\]\((.*?)\s*(\"(?:.*[^\"])\")?\s*\)"
(fn [[matched link]]
(if (and link (not (string/starts-with? link "http")))
(string/replace matched link (util/node-path.join url link))
matched)))
content #"!\[[^\]]*\]\((.*?)\s*(\"(?:.*[^\"])\")?\s*\)"
(fn [[matched link]]
(if (and link (not (string/starts-with? link "http")))
(string/replace matched link (util/node-path.join url link))
matched)))
content)]
(format/to-html content :markdown (gp-mldoc/default-config :markdown))))
(catch :default e
@@ -553,10 +552,10 @@
(and (string/blank? (string/trim content)) (throw (js/Error. "blank readme content")))
(state/set-state! :plugin/active-readme [content item])
(shui/dialog-open! (fn [_] (display))
{:label "plugin-readme"
:content-props {:class "max-h-[86vh] overflow-auto"}}))
(p/catch #(do (js/console.warn %)
(notification/show! "No README content." :warning))))
{:label "plugin-readme"
:content-props {:class "max-h-[86vh] overflow-auto"}}))
(p/catch #(do (js/console.warn %)
(notification/show! "No README content." :warning))))
;; market
(shui/dialog-open! (fn [_] (display item nil)) {:label "plugin-readme"}))))
@@ -576,12 +575,12 @@
(when config/lsp-enabled?
(try
(js-invoke js/LSPluginCore
(str "hook" (string/capitalize (name tag)))
(name type)
(if (coll? payload)
(bean/->js (normalize-keyword-for-json payload))
payload)
(if (keyword? plugin-id) (name plugin-id) plugin-id))
(str "hook" (string/capitalize (name tag)))
(name type)
(if (coll? payload)
(bean/->js (normalize-keyword-for-json payload))
payload)
(if (keyword? plugin-id) (name plugin-id) plugin-id))
(catch :default e
(log/error :invoke-hook-exception e)))))
@@ -619,8 +618,7 @@
(-> (if (util/electron?)
(ipc/ipc "getLogseqDotDirRoot")
"LSPUserDotRoot/")
(p/then #(do (reset! *ls-dotdir-root %) %))))
(p/then #(do (reset! *ls-dotdir-root %) %))))
(defn make-fn-to-load-dotdir-json
[dirname ^js default]
@@ -708,7 +706,7 @@
(defn cancel-user-checking!
[]
(when (and (get-user-checking?)
(not (get-auto-checking?)))
(not (get-auto-checking?)))
(state/set-state! :plugin/updates-pending {})))
(defn user-check-enabled-for-updates!
@@ -721,22 +719,22 @@
;; TODO: too many requests may be limited by Github api
(when-let [plugins (seq (take 32 (state/get-enabled?-installed-plugins theme?)))]
(->> plugins
(map (fn [v] [(keyword (:id v)) v]))
(into {})
(state/set-state! :plugin/updates-pending))
(map (fn [v] [(keyword (:id v)) v]))
(into {})
(state/set-state! :plugin/updates-pending))
(state/pub-event! [:plugin/consume-updates])))))
(defn auto-check-enabled-for-updates!
[]
(when (and (not (get-updates-downloading?))
(not (get-auto-checking?))
(not (get-user-checking?)))
(not (get-auto-checking?))
(not (get-user-checking?)))
;; TODO: take some plugins used recently
(when-let [plugins (seq (take 16 (shuffle (state/get-enabled?-installed-plugins nil))))]
(->> plugins
(map (fn [v] [(keyword (:id v)) v]))
(into {})
(state/set-state! :plugin/updates-pending))
(map (fn [v] [(keyword (:id v)) v]))
(into {})
(state/set-state! :plugin/updates-pending))
(state/pub-event! [:plugin/consume-updates])
(set-auto-checking! true))))
@@ -791,7 +789,7 @@
(let [el (js/document.createElement "div")]
(.appendChild js/document.body el)
(rum/mount
(lsp-indicator) el))
(lsp-indicator) el))
(-> (p/let [root (init-ls-dotdir-root)
_ (.setupPluginCore js/LSPlugin (bean/->js {:localUserConfigRoot root :dotConfigRoot root}))
@@ -809,7 +807,7 @@
(.on "registered"
(fn [^js pl]
(register-plugin
(bean/->clj (.parse js/JSON (.stringify js/JSON pl))))))
(bean/->clj (.parse js/JSON (.stringify js/JSON pl))))))
(.on "beforeload"
(fn [^js pl]
@@ -820,7 +818,7 @@
(.on "reloaded"
(fn [^js pl]
(register-plugin
(bean/->clj (.parse js/JSON (.stringify js/JSON pl))))))
(bean/->clj (.parse js/JSON (.stringify js/JSON pl))))))
(.on "unregistered" (fn [pid]
(let [pid (keyword pid)]
@@ -879,43 +877,43 @@
(when-let [plugins (and perf-table (.entries perf-table))]
(->> plugins
(keep
(fn [[_k ^js v]]
(when-let [end (and (some-> v (.-o) (.-disabled) (not))
(.-e v))]
(when (and (number? end)
(fn [[_k ^js v]]
(when-let [end (and (some-> v (.-o) (.-disabled) (not))
(.-e v))]
(when (and (number? end)
;; valid end time
(> end 0)
(> end 0)
;; greater than 6s
(> (- end (.-s v)) 6000))
v))))
(> (- end (.-s v)) 6000))
v))))
((fn [perfs]
(doseq [perf perfs]
(state/pub-event! [:plugin/loader-perf-tip (bean/->clj perf)])))))))))
default-plugins (get-user-default-plugins)
[plugins0, plugins-async] (if (and (seq default-plugins)
(not (util/electron?)))
((juxt (fn [its] (filterv #(:theme %) its))
(fn [its] (filterv #(not (:theme %)) its)))
default-plugins)
[default-plugins])
(not (util/electron?)))
((juxt (fn [its] (filterv #(:theme %) its))
(fn [its] (filterv #(not (:theme %)) its)))
default-plugins)
[default-plugins])
_ (.register js/LSPluginCore (bean/->js (if (seq plugins0) plugins0 [])) true)]
plugins-async)
(p/then
(fn [plugins-async]
(state/set-state! :plugin/indicator-text nil)
(p/then
(fn [plugins-async]
(state/set-state! :plugin/indicator-text nil)
;; wait for the plugin register async messages
(js/setTimeout
(js/setTimeout
(fn [] (callback)
(some-> (seq plugins-async)
(p/delay 16)
(p/then #(.register js/LSPluginCore (bean/->js plugins-async) true))))
(p/delay 16)
(p/then #(.register js/LSPluginCore (bean/->js plugins-async) true))))
(if (util/electron?) 64 0))))
(p/catch
(fn [^js e]
(log/error :setup-plugin-system-error e)
(state/set-state! :plugin/indicator-text (str "Fatal: " e))))))
(p/catch
(fn [^js e]
(log/error :setup-plugin-system-error e)
(state/set-state! :plugin/indicator-text (str "Fatal: " e))))))
(defn setup!
"setup plugin core handler"

View File

@@ -3,23 +3,23 @@
global-config component. This component is only enabled? if both the
global-config and plugin components are enabled. plugin.edn is automatically updated
when a plugin is installed, updated or removed"
(:require [frontend.handler.global-config :as global-config-handler]
[logseq.common.path :as path]
[promesa.core :as p]
[borkdude.rewrite-edn :as rewrite]
[frontend.fs :as fs]
[frontend.state :as state]
[frontend.handler.notification :as notification]
[frontend.handler.common.plugin :as plugin-common-handler]
[frontend.util :as util]
(:require [borkdude.rewrite-edn :as rewrite]
[cljs-bean.core :as bean]
[clojure.edn :as edn]
[clojure.set :as set]
[clojure.pprint :as pprint]
[clojure.set :as set]
[frontend.fs :as fs]
[frontend.handler.common.plugin :as plugin-common-handler]
[frontend.handler.global-config :as global-config-handler]
[frontend.handler.notification :as notification]
[frontend.schema.handler.plugin-config :as plugin-config-schema]
[frontend.state :as state]
[frontend.util :as util]
[lambdaisland.glogi :as log]
[logseq.common.path :as path]
[malli.core :as m]
[malli.error :as me]
[frontend.schema.handler.plugin-config :as plugin-config-schema]
[cljs-bean.core :as bean]
[lambdaisland.glogi :as log]))
[promesa.core :as p]))
(defn plugin-config-path
"Full path to plugins.edn"
@@ -40,7 +40,7 @@ when a plugin is installed, updated or removed"
str)]
;; fs protocols require repo and dir when they aren't necessary. For this component,
;; neither is needed so these are blank and nil respectively
(fs/write-file! "" nil (plugin-config-path) updated-content {:skip-compare? true})))
(fs/write-file! "" nil (plugin-config-path) updated-content {:skip-compare? true})))
(defn remove-plugin
"Removes a plugin from plugin.edn"
@@ -80,16 +80,16 @@ returns map of plugins to install and uninstall"
(p/catch
(p/let [edn-plugins* (fs/read-file nil (plugin-config-path))
edn-plugins (edn/read-string edn-plugins*)]
(if-let [errors (->> edn-plugins (m/explain plugin-config-schema/Plugins-edn) me/humanize)]
(do
(notification/show! "Invalid plugins.edn provided. See javascript console for specific errors"
:error)
(log/error :plugin-edn-errors errors)
(println "Invalid plugins.edn, errors: " errors))
(let [plugins-to-change (determine-plugins-to-change
(:plugin/installed-plugins @state/state)
edn-plugins)]
(state/pub-event! [:go/plugins-from-file plugins-to-change]))))
(if-let [errors (->> edn-plugins (m/explain plugin-config-schema/Plugins-edn) me/humanize)]
(do
(notification/show! "Invalid plugins.edn provided. See javascript console for specific errors"
:error)
(log/error :plugin-edn-errors errors)
(println "Invalid plugins.edn, errors: " errors))
(let [plugins-to-change (determine-plugins-to-change
(:plugin/installed-plugins @state/state)
edn-plugins)]
(state/pub-event! [:go/plugins-from-file plugins-to-change]))))
(fn [e]
(if (= :reader-exception (:type (ex-data e)))
(notification/show! "Malformed plugins.edn provided. Please check the file has correct edn syntax."
@@ -117,12 +117,12 @@ returns map of plugins to install and uninstall"
(when (and (= status "completed") (not only-check))
(let [{:keys [theme effect]} payload]
(add-or-update-plugin
(assoc payload
:version (:installed-version payload)
:effect (boolean effect)
(assoc payload
:version (:installed-version payload)
:effect (boolean effect)
;; Manual installation doesn't have theme field but
;; plugin.edn requires this field
:theme (boolean theme)))))))]
:theme (boolean theme)))))))]
(when (util/electron?)
(js/window.apis.addListener channel listener))
;;teardown

View File

@@ -1,23 +1,23 @@
(ns frontend.handler.route
"Provides fns used for routing throughout the app"
(:require [frontend.config :as config]
(:require [clojure.string :as string]
[frontend.config :as config]
[frontend.context.i18n :refer [t]]
[frontend.date :as date]
[frontend.db :as db]
[frontend.db.model :as model]
[frontend.extensions.pdf.utils :as pdf-utils]
[frontend.handler.notification :as notification]
[frontend.handler.property.util :as pu]
[frontend.handler.recent :as recent-handler]
[frontend.handler.search :as search-handler]
[frontend.handler.ui :as ui-handler]
[frontend.handler.property.util :as pu]
[frontend.state :as state]
[frontend.util :as util]
[frontend.extensions.pdf.utils :as pdf-utils]
[logseq.graph-parser.text :as text]
[reitit.frontend.easy :as rfe]
[frontend.context.i18n :refer [t]]
[clojure.string :as string]
[logseq.common.util :as common-util]
[frontend.handler.notification :as notification]
[logseq.db :as ldb]))
[logseq.db :as ldb]
[logseq.graph-parser.text :as text]
[reitit.frontend.easy :as rfe]))
(defn redirect!
"If `push` is truthy, previous page will be left in history."
@@ -139,7 +139,8 @@
block-title (when (and block? (not page))
(when-let [block (db/entity [:block/uuid (uuid name)])]
(let [content (text/remove-level-spaces (:block/title block)
(:block/format block) (config/get-block-pattern (:block/format block)))]
(get block :block/format :markdown)
(config/get-block-pattern (get block :block/format :markdown)))]
(if (> (count content) 48)
(str (subs content 0 48) "...")
content))))

View File

@@ -12,10 +12,10 @@
[frontend.state :as state]
[frontend.storage :as storage]
[frontend.util :as util]
[logseq.shui.dialog.core :as shui-dialog]
[goog.dom :as gdom]
[goog.object :as gobj]
[logseq.common.path :as path]
[logseq.shui.dialog.core :as shui-dialog]
[logseq.shui.ui :as shui]
[promesa.core :as p]
[rum.core :as rum]))

View File

@@ -5,7 +5,6 @@
[frontend.config :as config]
[promesa.core :as p]))
;; offline db
;; To maintain backward compatibility

View File

@@ -49,7 +49,7 @@
nil
:else " ")
format (:block/format block)]
format (get block :block/format :markdown)]
(p/let [filename (take-or-choose-photo)]
(when (not-empty filename)
(commands/simple-insert!

View File

@@ -3,7 +3,6 @@
["capacitor-voice-recorder" :refer [VoiceRecorder]]
[clojure.string :as string]
[frontend.date :as date]
[frontend.db :as db]
[frontend.handler.assets :as assets-handler]
[frontend.handler.editor :as editor-handler]
[frontend.state :as state]
@@ -47,7 +46,7 @@
(p/let [page (or (state/get-current-page) (string/lower-case (date/journal-name)))
filename (str (date/get-date-time-string-2) ".aac")
edit-block (state/get-edit-block)
format (or (:block/format edit-block) (db/get-page-format page))
format (get edit-block :block/format :markdown)
path (assets-handler/get-asset-path filename)
_file (p/catch
(.writeFile Filesystem (clj->js {:data database64

View File

@@ -474,6 +474,19 @@
[:db/retract (:e d) :logseq.task/deadline]))
datoms))))))
(defn- remove-block-format-from-db
[conn _search-db]
(let [db @conn]
(when (ldb/db-based-graph? db)
(let [datoms (d/datoms db :avet :block/uuid)
tx-data (map
(fn [d]
[:db/retract (:e d) :block/format])
datoms)]
(ldb/transact! conn tx-data {:db-migrate? true})
(d/reset-schema! conn (dissoc (:schema db) :block/format))
[]))))
(defn- deprecate-logseq-user-ns
[conn _search-db]
(let [db @conn]
@@ -582,7 +595,8 @@
[55 {:fix update-deadline-to-datetime}]
[56 {:properties [:logseq.property/enable-history?
:logseq.property.history/block :logseq.property.history/property
:logseq.property.history/ref-value :logseq.property.history/scalar-value]}]])
:logseq.property.history/ref-value :logseq.property.history/scalar-value]}]
[57 {:fix remove-block-format-from-db}]])
(let [max-schema-version (apply max (map first schema-version->updates))]
(assert (<= db-schema/version max-schema-version))

View File

@@ -1,12 +1,12 @@
(ns frontend.worker.export
"Export data"
(:require [datascript.core :as d]
(:require [cljs-bean.core :as bean]
[datascript.core :as d]
[frontend.common.file.core :as common-file]
[logseq.db :as ldb]
[logseq.db.sqlite.util :as sqlite-util]
[logseq.graph-parser.property :as gp-property]
[logseq.outliner.tree :as otree]
[cljs-bean.core :as bean]
[logseq.db.sqlite.util :as sqlite-util]))
[logseq.outliner.tree :as otree]))
(defn- safe-keywordize
[block]
@@ -35,7 +35,7 @@
(let [b' (if (seq (:block/properties b))
(update b :block/title
(fn [content]
(gp-property/remove-properties (:block/format b) content)))
(gp-property/remove-properties (get b :block/format :markdown) content)))
b)]
(safe-keywordize b'))) blocks))
children (if whiteboard?

View File

@@ -1,15 +1,15 @@
(ns frontend.worker.handler.page
"Page operations"
(:require [logseq.db :as ldb]
[logseq.graph-parser.db :as gp-db]
[logseq.graph-parser.block :as gp-block]
[logseq.db.sqlite.util :as sqlite-util]
[datascript.core :as d]
(:require [datascript.core :as d]
[frontend.worker.handler.page.db-based.page :as db-worker-page]
[frontend.worker.handler.page.file-based.page :as file-worker-page]
[logseq.common.config :as common-config]
[logseq.common.util :as common-util]
[logseq.db :as ldb]
[logseq.db.frontend.content :as db-content]
[frontend.worker.handler.page.db-based.page :as db-worker-page]
[frontend.worker.handler.page.file-based.page :as file-worker-page]))
[logseq.db.sqlite.util :as sqlite-util]
[logseq.graph-parser.block :as gp-block]
[logseq.graph-parser.db :as gp-db]))
(defn rtc-create-page!
[conn config title {:keys [uuid]}]
@@ -17,10 +17,9 @@
(let [date-formatter (common-config/get-date-formatter config)
title (db-worker-page/sanitize-title title)
page-name (common-util/page-name-sanity-lc title)
page (-> (gp-block/page-name->map title @conn true date-formatter
{:page-uuid uuid
:skip-existing-page-check? true})
(assoc :block/format :markdown))
page (gp-block/page-name->map title @conn true date-formatter
{:page-uuid uuid
:skip-existing-page-check? true})
result (ldb/transact! conn [page] {:persist-op? false
:outliner-op :create-page})]
[result page-name (:block/uuid page)]))

View File

@@ -70,15 +70,14 @@
title))
(defn build-first-block-tx
[page-uuid format]
[page-uuid]
(let [page-id [:block/uuid page-uuid]]
[(sqlite-util/block-with-timestamps
{:block/uuid (ldb/new-block-id)
:block/page page-id
:block/parent page-id
:block/order (db-order/gen-key nil nil)
:block/title ""
:block/format format})]))
:block/title ""})]))
(defn- get-page-by-parent-name
[db parent-title child-title]
@@ -115,11 +114,10 @@
(ldb/get-page db part)
(get-page-by-parent-name db (nth parts (dec idx)) part))
result (or page
(-> (gp-block/page-name->map part db true date-formatter
{:page-uuid (when last-part? block-uuid)
:skip-existing-page-check? true
:class? class?})
(assoc :block/format :markdown)))]
(gp-block/page-name->map part db true date-formatter
{:page-uuid (when last-part? block-uuid)
:skip-existing-page-check? true
:class? class?}))]
result))
parts))]
(cond
@@ -193,14 +191,12 @@
[:db/retract [:block/uuid (:block/uuid existing-page)] :block/tags :logseq.class/Page]]]
{:tx-meta tx-meta
:tx-data tx-data})))
(let [format :markdown
page (-> (gp-block/page-name->map title db true date-formatter
{:class? class?
:page-uuid (when (uuid? uuid) uuid)
:skip-existing-page-check? (if (some? skip-existing-page-check?)
skip-existing-page-check?
true)})
(assoc :block/format format))
(let [page (gp-block/page-name->map title db true date-formatter
{:class? class?
:page-uuid (when (uuid? uuid) uuid)
:skip-existing-page-check? (if (some? skip-existing-page-check?)
skip-existing-page-check?
true)})
[page parents] (if (and (text/namespace-page? title) split-namespace?)
(let [pages (split-namespace-pages db page date-formatter)]
[(last pages) (butlast pages)])
@@ -222,7 +218,7 @@
create-first-block?
(not (or whiteboard? class?))
page-txs)
(build-first-block-tx (:block/uuid (first page-txs)) format))
(build-first-block-tx (:block/uuid (first page-txs))))
txs (concat
;; transact doesn't support entities
(remove de/entity? parents)

View File

@@ -4,6 +4,7 @@
(:require [cljs-http-missionary.client :as http]
[clojure.set :as set]
[datascript.core :as d]
[frontend.common.missionary :as c.m]
[frontend.worker.crypt :as crypt]
[frontend.worker.db-listener :as db-listener]
[frontend.worker.rtc.client-op :as client-op]
@@ -12,7 +13,6 @@
[frontend.worker.rtc.ws-util :as ws-util]
[frontend.worker.state :as worker-state]
[frontend.worker.util :as worker-util]
[frontend.common.missionary :as c.m]
[logseq.db :as ldb]
[logseq.db.frontend.malli-schema :as db-malli-schema]
[logseq.db.frontend.schema :as db-schema]
@@ -161,11 +161,6 @@
parent
(page-of-block id->block-map parent)))))))
(defn- convert-block-fields
[block]
(cond-> block
(:block/uuid block) (assoc :block/format :markdown)))
(defn- fill-block-fields
[blocks]
(let [groups (group-by #(boolean (:block/name %)) blocks)
@@ -173,10 +168,9 @@
id->block (into {} (map (juxt :db/id identity) blocks))
block-id->page-id (into {} (map (fn [b] [(:db/id b) (:db/id (page-of-block id->block b))]) other-blocks))]
(mapv (fn [b]
(let [b (convert-block-fields b)]
(if-let [page-id (block-id->page-id (:db/id b))]
(assoc b :block/page page-id)
b)))
(if-let [page-id (block-id->page-id (:db/id b))]
(assoc b :block/page page-id)
b))
blocks)))
(defn- blocks->card-one-attrs

View File

@@ -189,8 +189,7 @@
(transact-db! :move-blocks repo conn [b] local-parent false)
(transact-db! :insert-blocks repo conn
[{:block/uuid block-uuid
:block/title ""
:block/format :markdown}]
:block/title ""}]
local-parent {:sibling? false :keep-uuid? true}))
(transact-db! :update-block-order-directly repo conn block-uuid first-remote-parent remote-block-order))

View File

@@ -1,61 +1,61 @@
(ns ^:no-doc logseq.api
(:require [cljs-bean.core :as bean]
[cljs.reader]
[goog.object :as gobj]
[datascript.core :as d]
[frontend.db.conn :as conn]
[logseq.common.util :as common-util]
[logseq.sdk.core]
[logseq.sdk.git]
[logseq.sdk.experiments]
[logseq.sdk.utils :as sdk-utils]
[logseq.sdk.ui :as sdk-ui]
[logseq.sdk.assets :as sdk-assets]
[clojure.string :as string]
[datascript.core :as d]
[electron.ipc :as ipc]
[frontend.commands :as commands]
[frontend.config :as config]
[frontend.handler.config :as config-handler]
[frontend.handler.recent :as recent-handler]
[frontend.handler.route :as route-handler]
[frontend.db :as db]
[frontend.idb :as idb]
[frontend.db.async :as db-async]
[frontend.db.conn :as conn]
[frontend.db.model :as db-model]
[frontend.db.query-custom :as query-custom]
[frontend.db.query-dsl :as query-dsl]
[frontend.db.utils :as db-utils]
[frontend.db.query-react :as query-react]
[frontend.db.utils :as db-utils]
[frontend.fs :as fs]
[frontend.handler.code :as code-handler]
[frontend.handler.command-palette :as palette-handler]
[frontend.handler.common.plugin :as plugin-common-handler]
[frontend.handler.config :as config-handler]
[frontend.handler.db-based.property :as db-property-handler]
[frontend.handler.dnd :as editor-dnd-handler]
[frontend.handler.editor :as editor-handler]
[frontend.handler.export :as export-handler]
[frontend.handler.page :as page-handler]
[frontend.handler.plugin :as plugin-handler]
[frontend.handler.common.plugin :as plugin-common-handler]
[frontend.handler.property :as property-handler]
[frontend.handler.db-based.property :as db-property-handler]
[logseq.outliner.core :as outliner-core]
[frontend.handler.recent :as recent-handler]
[frontend.handler.route :as route-handler]
[frontend.handler.search :as search-handler]
[frontend.handler.shell :as shell]
[frontend.idb :as idb]
[frontend.loader :as loader]
[frontend.modules.layout.core]
[frontend.modules.outliner.tree :as outliner-tree]
[frontend.handler.command-palette :as palette-handler]
[frontend.modules.shortcut.core :as st]
[frontend.modules.shortcut.config :as shortcut-config]
[frontend.modules.shortcut.core :as st]
[frontend.state :as state]
[frontend.util :as util]
[frontend.util.cursor :as cursor]
[frontend.loader :as loader]
[goog.dom :as gdom]
[lambdaisland.glogi :as log]
[promesa.core :as p]
[reitit.frontend.easy :as rfe]
[frontend.version :as fv]
[frontend.handler.shell :as shell]
[frontend.modules.layout.core]
[frontend.handler.code :as code-handler]
[frontend.handler.search :as search-handler]
[goog.dom :as gdom]
[goog.object :as gobj]
[lambdaisland.glogi :as log]
[logseq.api.block :as api-block]
[logseq.common.util :as common-util]
[logseq.db :as ldb]
[logseq.db.frontend.property.util :as db-property-util]))
[logseq.db.frontend.property.util :as db-property-util]
[logseq.outliner.core :as outliner-core]
[logseq.sdk.assets :as sdk-assets]
[logseq.sdk.core]
[logseq.sdk.experiments]
[logseq.sdk.git]
[logseq.sdk.ui :as sdk-ui]
[logseq.sdk.utils :as sdk-utils]
[promesa.core :as p]
[reitit.frontend.easy :as rfe]))
;; Alert: this namespace shouldn't invoke any reactive queries
@@ -209,7 +209,7 @@
(if (util/electron?)
(fs/read-file nil (util/node-path.join path "package.json"))
(do (js/console.log "==>>> TODO: load plugin package.json from local???")
""))))
""))))
(def ^:export load_plugin_readme
(fn [path]
@@ -388,26 +388,26 @@
key data)))
(defn ^:export load_installed_web_plugins
[]
(let [getter (plugin-handler/make-fn-to-load-dotdir-json "installed-plugins-for-web" #js {})]
(some-> (getter :all) (p/then second))))
[]
(let [getter (plugin-handler/make-fn-to-load-dotdir-json "installed-plugins-for-web" #js {})]
(some-> (getter :all) (p/then second))))
(defn ^:export save_installed_web_plugin
([^js plugin] (save_installed_web_plugin plugin false))
([^js plugin remove?]
(when-let [id (some-> plugin (.-key) (name))]
(let [setter (plugin-handler/make-fn-to-save-dotdir-json "installed-plugins-for-web")
plugin (js/JSON.parse (js/JSON.stringify plugin))]
(p/let [^js plugins (or (load_installed_web_plugins) #js {})]
(if (true? remove?)
(when (aget plugins id)
([^js plugin] (save_installed_web_plugin plugin false))
([^js plugin remove?]
(when-let [id (some-> plugin (.-key) (name))]
(let [setter (plugin-handler/make-fn-to-save-dotdir-json "installed-plugins-for-web")
plugin (js/JSON.parse (js/JSON.stringify plugin))]
(p/let [^js plugins (or (load_installed_web_plugins) #js {})]
(if (true? remove?)
(when (aget plugins id)
(js-delete plugins id))
(gobj/set plugins id plugin))
(setter :all plugins))))))
(gobj/set plugins id plugin))
(setter :all plugins))))))
(defn ^:export unlink_installed_web_plugin
[key]
(save_installed_web_plugin #js {:key key} true))
[key]
(save_installed_web_plugin #js {:key key} true))
(def ^:export unlink_plugin_user_settings
(plugin-handler/make-fn-to-unlink-dotdir-json "settings"))
@@ -779,7 +779,7 @@
block (if before
(db/pull (:db/id (ldb/get-left-sibling (db/entity (:db/id block))))) block)]
(some-> (editor-handler/insert-block-tree-after-target
(:db/id block) sibling bb (:block/format block) keep-uuid?)
(:db/id block) sibling bb (get block :block/format :markdown) keep-uuid?)
(p/then (fn [results]
(some-> results (ldb/read-transit-str)
:blocks (sdk-utils/normalize-keyword-for-json) (bean/->js)))))))))))

View File

@@ -48,12 +48,10 @@
:block/uuid page1-uuid
:block/created-at 1724836490809
:block/updated-at 1724836490809
:block/type "page"
:block/format :markdown}
:block/type "page"}
{:block/uuid block1-uuid
:block/updated-at 1724836490810
:block/created-at 1724836490810
:block/format :markdown
:block/title "block1"
:block/parent "page"
:block/order "a0"
@@ -65,13 +63,11 @@
:block/title "insert-500-blocks"
:block/created-at 1725024677501
:block/updated-at 1725024677501
:block/type "page"
:block/format :markdown}
:block/type "page"}
(map (fn [i order]
{:block/uuid (random-uuid)
:block/created-at 1725024677501
:block/updated-at 1725024677501
:block/format :markdown
:block/title (str "x" i)
:block/parent "page"
:block/order order
@@ -83,7 +79,6 @@
:block/updated-at 1725455235108
:block/created-at 1725455235108
:block/journal-day 20240907
:block/format :markdown
:block/title "Sep 7th, 2024"
:block/name "sep 7th, 2024"
:block/type "journal"}
@@ -105,12 +100,10 @@
:block/title "move-blocks-concurrently"
:block/created-at 1725024677501
:block/updated-at 1725024677501
:block/type "page"
:block/format :markdown}
:block/type "page"}
{:block/uuid block2-uuid
:block/created-at 1725024677501
:block/updated-at 1725024677501
:block/format :markdown
:block/title "x1"
:block/parent "page"
:block/order "a0"
@@ -118,7 +111,6 @@
{:block/uuid block3-uuid
:block/created-at 1725024677501
:block/updated-at 1725024677501
:block/format :markdown
:block/title "x2"
:block/parent "page"
:block/order "a1"
@@ -126,7 +118,6 @@
{:block/uuid block4-uuid
:block/created-at 1725024677501
:block/updated-at 1725024677501
:block/format :markdown
:block/title "x3"
:block/parent "page"
:block/order "a2"
@@ -134,7 +125,6 @@
{:block/uuid block5-uuid
:block/created-at 1725024677501
:block/updated-at 1725024677501
:block/format :markdown
:block/title "x4"
:block/parent "page"
:block/order "a3"
@@ -142,7 +132,6 @@
{:block/uuid block6-uuid
:block/created-at 1725024677501
:block/updated-at 1725024677501
:block/format :markdown
:block/title "x5"
:block/parent "page"
:block/order "a4"
@@ -150,7 +139,6 @@
{:block/uuid block7-uuid
:block/created-at 1725024677501
:block/updated-at 1725024677501
:block/format :markdown
:block/title "x6"
:block/parent "page"
:block/order "a5"
@@ -192,13 +180,11 @@
:block/title "step6-delete-blocks"
:block/created-at 1725024677501
:block/updated-at 1725024677501
:block/type "page"
:block/format :markdown}
:block/type "page"}
{:db/id "b1"
:block/uuid step6-block1-uuid
:block/created-at 1725024677501
:block/updated-at 1725024677501
:block/format :markdown
:block/title "x1"
:block/parent "page"
:block/order "a0"
@@ -207,7 +193,6 @@
:block/uuid step6-block2-uuid
:block/created-at 1725024677501
:block/updated-at 1725024677501
:block/format :markdown
:block/title "x2"
:block/parent "b1"
:block/order "a0"
@@ -216,7 +201,6 @@
:block/uuid step6-block3-uuid
:block/created-at 1725024677501
:block/updated-at 1725024677501
:block/format :markdown
:block/title "x3"
:block/parent "page"
:block/order "a1"
@@ -225,7 +209,6 @@
:block/uuid step6-block4-uuid
:block/created-at 1725024677501
:block/updated-at 1725024677501
:block/format :markdown
:block/title "x4"
:block/parent "b3"
:block/order "a0"
@@ -234,7 +217,6 @@
:block/uuid step6-block5-uuid
:block/created-at 1725024677501
:block/updated-at 1725024677501
:block/format :markdown
:block/title "x5"
:block/parent "b4"
:block/order "a0"

View File

@@ -3,11 +3,11 @@
[const]
[datascript.core :as d]
[datascript.transit :as dt]
[frontend.common.missionary :as c.m]
[frontend.worker.rtc.client-op :as client-op]
[frontend.worker.rtc.core :as rtc.core]
[frontend.worker.rtc.log-and-state :as rtc-log-and-state]
[frontend.worker.state :as worker-state]
[frontend.common.missionary :as c.m]
[logseq.db :as ldb]
[logseq.db.frontend.order :as db-order]
[logseq.outliner.batch-tx :as batch-tx]
@@ -124,14 +124,12 @@
:block/title "message-page"
:block/created-at 1725024677501
:block/updated-at 1725024677501
:block/type "page"
:block/format :markdown}
:block/type "page"}
{:block/uuid (random-uuid)
:block/parent "page"
:block/order min-order
:block/title (dt/write-transit-str message)
:block/page "page"
:block/format :markdown
:block/updated-at 1724836490810
:block/created-at 1724836490810}]]
(batch-tx/with-batch-tx-mode conn {:e2e-test const/downloaded-test-repo :skip-store-conn true}

View File

@@ -3,7 +3,6 @@
(:require [clojure.test.check.generators :as gen]
[datascript.core :as d]))
(defn gen-available-block-uuid
[db & {:keys [page-uuid]}]
(let [query (cond-> '[:find ?block-uuid]
@@ -46,10 +45,8 @@
(gen/elements coll)
(gen/return nil))))
;;; generators for outliner operations
(defn gen-insert-blocks-op
[db & {:keys [opts] :as args}]
(gen/let [target-block-uuid (gen-available-block-uuid db (select-keys args [:page-uuid]))
@@ -58,8 +55,7 @@
(let [block-uuid (random-uuid)]
[:insert-blocks
[[{:block/uuid block-uuid
:block/title content
:block/format :markdown}]
:block/title content}]
(:db/id (d/entity db [:block/uuid target-block-uuid]))
opts]]))))

View File

@@ -193,15 +193,13 @@ This can be called in synchronous contexts as no async fns should be invoked"
:block/page page-id
:block/parent page-id
:block/order (db-order/gen-key nil)
:block/title "block 1"
:block/format :markdown}
:block/title "block 1"}
;; second block
{:block/uuid second-block-uuid
:block/page page-id
:block/parent page-id
:block/order (db-order/gen-key nil)
:block/title "block 2"
:block/format :markdown}]
:block/title "block 2"}]
(map sqlite-util/block-with-timestamps))))
(defn start-and-destroy-db

View File

@@ -1,10 +1,10 @@
(ns frontend.worker.rtc.client-test
(:require
[cljs.test :refer [deftest is testing]]
[frontend.worker.rtc.client :as subject]
[logseq.db.frontend.schema :as db-schema]
[datascript.core :as d]
[logseq.db :as ldb]))
[frontend.worker.rtc.client :as subject]
[logseq.db :as ldb]
[logseq.db.frontend.schema :as db-schema]))
(def empty-db (d/empty-db db-schema/schema-for-db-based-graph))
@@ -14,7 +14,6 @@
db (d/db-with empty-db [{:block/uuid block-uuid,
:block/updated-at 1720017595873,
:block/created-at 1720017595872,
:block/format :markdown,
:db/ident :user.class/yyy,
:block/type "class",
:block/name "yyy",
@@ -47,7 +46,6 @@
:block/updated-at 1716880036491
:block/created-at 1716880036491
:block/schema {:type :number}
:block/format :markdown
:db/cardinality :db.cardinality/one
:db/ident :user.property/xxx,
:block/type "property",

View File

@@ -9,9 +9,9 @@
[frontend.worker.rtc.db-listener :as subject]
[frontend.worker.rtc.fixture :as r.fixture]
[frontend.worker.state :as worker-state]
[logseq.db.test.helper :as db-test]
[logseq.outliner.batch-tx :as batch-tx]
[logseq.outliner.core :as outliner-core]
[logseq.db.test.helper :as db-test]))
[logseq.outliner.core :as outliner-core]))
(t/use-fixtures :each
test-helper/db-based-start-and-destroy-db-map-fixture
@@ -49,7 +49,6 @@
[:db/add 1000000 :block/updated-at 1716882111476]
[:db/add 1000000 :block/created-at 1716882111476]
[:db/add 1000000 :block/schema {:type :number}]
[:db/add 1000000 :block/format :markdown]
[:db/add 1000000 :db/cardinality :db.cardinality/one]
[:db/add 1000000 :db/ident :user.property/qqq]
[:db/add 1000000 :block/tags :logseq.class/Property]
@@ -87,7 +86,6 @@
[:db/add 1000000 :block/updated-at 1720019497643 536870954]
[:db/add 1000000 :logseq.property/parent :logseq.class/Root 536870954]
[:db/add 1000000 :block/created-at 1720019497643 536870954]
[:db/add 1000000 :block/format :markdown 536870954]
[:db/add 1000000 :db/ident :user.class/zzz 536870954]
[:db/add 1000000 :block/tags :logseq.class/Tag 536870954]
[:db/add 1000000 :block/name "zzz" 536870954]
@@ -100,17 +98,18 @@
[[:update-page {:block-uuid #uuid "66856a29-6eb3-4122-af97-8580a853c6a6"}]
[:update {:block-uuid #uuid "66856a29-6eb3-4122-af97-8580a853c6a6",
:av-coll
[[:block/updated-at "[\"~#'\",1720019497643]"]
[:block/created-at "[\"~#'\",1720019497643]"]
[:block/tags #uuid "00000002-5389-0208-3000-000000000000"]
[:block/title "[\"~#'\",\"zzz\"]"]
[:logseq.property/parent #uuid "00000002-2737-8382-7000-000000000000"]
(set
[[:block/updated-at "[\"~#'\",1720019497643]"]
[:block/created-at "[\"~#'\",1720019497643]"]
[:block/tags #uuid "00000002-5389-0208-3000-000000000000"]
[:block/title "[\"~#'\",\"zzz\"]"]
[:logseq.property/parent #uuid "00000002-2737-8382-7000-000000000000"]
;;1. shouldn't have :db/ident, :db/ident is special, will be handled later
]}]]
])}]]
(map (fn [[op-type _t op-value]]
[op-type (cond-> op-value
(:av-coll op-value)
(assoc :av-coll (map #(take 2 %) (:av-coll op-value))))])
(assoc :av-coll (set (map #(take 2 %) (:av-coll op-value)))))])
ops))))))
(deftest listen-db-changes-and-validate-generated-rtc-ops
@@ -135,11 +134,9 @@
(batch-tx/with-batch-tx-mode conn
{:persist-op? true}
(outliner-core/insert-blocks! repo conn [{:block/uuid block-uuid1
:block/title "block1"
:block/format :markdown}
:block/title "block1"}
{:block/uuid block-uuid2
:block/title "block2"
:block/format :markdown}]
:block/title "block2"}]
target-entity
{:sibling? false :keep-uuid? true}))
(is (=