improve(plugin): add page related api

pull/2714/head
charlie 2021-08-17 16:53:33 +08:00
parent 0750d0c09a
commit 6697e35258
4 changed files with 94 additions and 47 deletions

View File

@ -799,7 +799,7 @@ class LSPluginCore
const data = Array.from(perfTable.values()).reduce((ac, it) => {
const { options, status, disabled } = it.o
ac [it.o.id] = {
ac[it.o.id] = {
name: options.name,
entry: options.entry,
status: status,

View File

@ -73,11 +73,11 @@ export type IUserOffHook = () => void
export type IUserHook<E = any, R = IUserOffHook> = (callback: (e: IHookEvent & E) => void) => IUserOffHook
export type IUserSlotHook<E = any> = (callback: (e: IHookEvent & UISlotIdentity & E) => void) => void
export type BlockID = number
export type EntityID = number
export type BlockUUID = string
export type BlockUUIDTuple = ['uuid', BlockUUID]
export type IEntityID = { id: BlockID }
export type IEntityID = { id: EntityID }
export type IBatchBlock = { content: string, properties?: Record<string, any>, children?: Array<IBatchBlock> }
export interface AppUserInfo {
@ -111,7 +111,7 @@ export interface AppGraphInfo {
* Block - Logseq's fundamental data structure.
*/
export interface BlockEntity {
id: BlockID // db id
id: EntityID // db id
uuid: BlockUUID
left: IEntityID
format: 'markdown' | 'org'
@ -137,13 +137,14 @@ export interface BlockEntity {
* Page is just a block with some specific properties.
*/
export interface PageEntity {
id: BlockID
id: EntityID
uuid: BlockUUID
name: string
originalName: string
'journal?': boolean
file?: IEntityID
namespace?: IEntityID
format?: 'markdown' | 'org'
journalDay?: number
}
@ -305,15 +306,29 @@ export interface IEditorProxy extends Record<string, any> {
) => Promise<void>
getBlock: (
srcBlock: BlockIdentity | BlockID,
srcBlock: BlockIdentity | EntityID,
opts?: Partial<{ includeChildren: boolean }>
) => Promise<BlockEntity | null>
getPage: (
srcPage: PageIdentity | BlockID,
srcPage: PageIdentity | EntityID,
opts?: Partial<{ includeChildren: boolean }>
) => Promise<PageEntity | null>
createPage: (
pageName: BlockPageName,
properties?: {},
opts?: Partial<{ redirect: boolean, createFirstBlock: boolean, format: BlockEntity['format'] }>
) => Promise<PageEntity | null>
deletePage: (
pageName: BlockPageName
) => Promise<void>
renamePage: (oldName: string, newName: string) => Promise<void>
getAllPages: (repo?: string) => Promise<any>
getPreviousSiblingBlock: (
srcBlock: BlockIdentity
) => Promise<BlockEntity | null>
@ -454,7 +469,7 @@ export interface ILSPluginUser extends EventEmitter<LSPluginUserEvents> {
* key: 'open-calendar',
* path: '#search',
* template: `
* <a data-on-click="openCalendar" onclick="alert('abc')" style="opacity: .6; display: inline-flex; padding-left: 3px;">
* <a data-on-click="openCalendar" onclick="alert('abc')' style="opacity: .6; display: inline-flex; padding-left: 3px;'>
* <i class="iconfont icon-Calendaralt2"></i>
* </a>
* `

View File

@ -117,7 +117,8 @@
(when redirect?
(route-handler/redirect! {:to :page
:path-params {:name page}})))))))
:path-params {:name page}}))
page)))))
(defn page-add-property!
[page-name key value]

View File

@ -4,6 +4,7 @@
[frontend.db.utils :as db-utils]
[frontend.handler.block :as block-handler]
[frontend.handler.editor :as editor-handler]
[frontend.handler.page :as page-handler]
[frontend.handler.dnd :as editor-dnd-handler]
[frontend.modules.outliner.core :as outliner]
[frontend.modules.outliner.tree :as outliner-tree]
@ -36,11 +37,11 @@
[input]
(when input
(walk/postwalk
(fn [a]
(cond
(keyword? a) (csk/->camelCase (name a))
(uuid? a) (str a)
:else a)) input)))
(fn [a]
(cond
(keyword? a) (csk/->camelCase (name a))
(uuid? a) (str a)
:else a)) input)))
(defn- parse-hiccup-ui
[input]
@ -54,14 +55,14 @@
(def ^:export get_user_configs
(fn []
(bean/->js
(normalize-keyword-for-json
{:preferred-language (:preferred-language @state/state)
:preferred-theme-mode (if (= (:ui/theme @state/state) "light") "white" "dark")
:preferred-format (state/get-preferred-format)
:preferred-workflow (state/get-preferred-workflow)
:preferred-todo (state/get-preferred-todo)
:current-graph (state/get-current-repo)
:me (state/get-me)}))))
(normalize-keyword-for-json
{:preferred-language (:preferred-language @state/state)
:preferred-theme-mode (if (= (:ui/theme @state/state) "light") "white" "dark")
:preferred-format (state/get-preferred-format)
:preferred-workflow (state/get-preferred-workflow)
:preferred-todo (state/get-preferred-todo)
:current-graph (state/get-current-repo)
:me (state/get-me)}))))
(def ^:export get_current_graph
(fn []
@ -141,29 +142,29 @@
(def ^:export write_plugin_storage_file
(fn [plugin-id file content]
(write_dotdir_file!
file content
(let [plugin-id (util/node-path.basename plugin-id)]
(util/node-path.join "storages" plugin-id)))))
file content
(let [plugin-id (util/node-path.basename plugin-id)]
(util/node-path.join "storages" plugin-id)))))
(def ^:export read_plugin_storage_file
(fn [plugin-id file]
(let [plugin-id (util/node-path.basename plugin-id)]
(read_dotdir_file
file (util/node-path.join "storages" plugin-id)))))
file (util/node-path.join "storages" plugin-id)))))
(def ^:export unlink_plugin_storage_file
(fn [plugin-id file]
(let [plugin-id (util/node-path.basename plugin-id)]
(unlink_dotdir_file!
file (util/node-path.join "storages" plugin-id)))))
file (util/node-path.join "storages" plugin-id)))))
(def ^:export exist_plugin_storage_file
(fn [plugin-id file]
(p/let [root (plugin-handler/get-ls-dotdir-root)
plugin-id (util/node-path.basename plugin-id)
exist? (fs/file-exists?
(util/node-path.join root "storages" plugin-id)
file)]
(util/node-path.join root "storages" plugin-id)
file)]
exist?)))
(def ^:export clear_plugin_storage_files
@ -212,20 +213,20 @@
(fn [pid ^js cmd-actions]
(when-let [[cmd actions] (bean/->clj cmd-actions)]
(plugin-handler/register-plugin-slash-command
pid [cmd (mapv #(into [(keyword (first %))]
(rest %)) actions)]))))
pid [cmd (mapv #(into [(keyword (first %))]
(rest %)) actions)]))))
(def ^:export register_plugin_simple_command
(fn [pid ^js cmd-action]
(when-let [[cmd action] (bean/->clj cmd-action)]
(plugin-handler/register-plugin-simple-command
pid cmd (assoc action 0 (keyword (first action)))))))
pid cmd (assoc action 0 (keyword (first action)))))))
(def ^:export register_plugin_ui_item
(fn [pid type ^js opts]
(when-let [opts (bean/->clj opts)]
(plugin-handler/register-plugin-ui-item
pid (assoc opts :type type)))))
pid (assoc opts :type type)))))
;; app
(def ^:export relaunch
@ -244,16 +245,16 @@
(def ^:export push_state
(fn [^js k ^js params ^js query]
(rfe/push-state
(keyword k)
(bean/->clj params)
(bean/->clj query))))
(keyword k)
(bean/->clj params)
(bean/->clj query))))
(def ^:export replace_state
(fn [^js k ^js params ^js query]
(rfe/replace-state
(keyword k)
(bean/->clj params)
(bean/->clj query))))
(keyword k)
(bean/->clj params)
(bean/->clj query))))
;; editor
(def ^:export check_editing
@ -307,6 +308,36 @@
(if-not (contains? page :block/left)
(bean/->js (normalize-keyword-for-json (db-utils/pull (:db/id page))))))))
(def ^:export get_all_pages
(fn [repo]
(let [pages (page-handler/get-all-pages repo)]
(bean/->js (normalize-keyword-for-json pages)))))
(def ^:export create_page
(fn [name ^js properties ^js opts]
(some-> (if-let [page (db-model/get-page name)]
page
(let [properties (bean/->clj properties)
{:keys [redirect createFirstBlock format]} (bean/->clj opts)
name (page-handler/create!
name
{:redirect? (if (boolean? redirect) redirect true)
:create-first-block? (if (boolean? createFirstBlock) createFirstBlock true)
:format format
:properties properties})]
(db-model/get-page name)))
(:db/id)
(db-utils/pull)
(normalize-keyword-for-json)
(bean/->js))))
(def ^:export delete_page
(fn [name]
(p/create (fn [ok] (page-handler/delete! name ok)))))
(def ^:export rename_page
page-handler/rename!)
(def ^:export edit_block
(fn [block-uuid {:keys [pos] :or {pos :max} :as opts}]
(when-let [block-uuid (and block-uuid (medley/uuid block-uuid))]
@ -319,12 +350,12 @@
page-name (and isPageBlock block-uuid-or-page-name)
block-uuid (if isPageBlock nil (medley/uuid block-uuid-or-page-name))
new-block (editor-handler/api-insert-new-block!
content
{:block-uuid block-uuid
:sibling? sibling
:before? before
:page page-name
:properties properties})]
content
{:block-uuid block-uuid
:sibling? sibling
:before? before
:page page-name
:properties properties})]
(bean/->js (normalize-keyword-for-json new-block)))))
(def ^:export insert_batch_block
@ -334,7 +365,7 @@
(let [bb (if-not (vector? bb) (vector bb) bb)
{:keys [sibling]} (bean/->clj opts)
_ (editor-handler/paste-block-tree-after-target
(:db/id block) sibling bb (:block/format block))]
(:db/id block) sibling bb (:block/format block))]
nil)))))
(def ^:export remove_block
@ -342,7 +373,7 @@
(let [includeChildren true
repo (state/get-current-repo)]
(editor-handler/delete-block-aux!
{:block/uuid (medley/uuid block-uuid) :repo repo} includeChildren))))
{:block/uuid (medley/uuid block-uuid) :repo repo} includeChildren))))
(def ^:export update_block
(fn [block-uuid content ^js opts]