diff --git a/app/src/boot/globalEvent/searchKeydown.ts b/app/src/boot/globalEvent/searchKeydown.ts index cb2595360..43770bdb3 100644 --- a/app/src/boot/globalEvent/searchKeydown.ts +++ b/app/src/boot/globalEvent/searchKeydown.ts @@ -30,7 +30,7 @@ export const searchKeydown = (app: App, event: KeyboardEvent) => { let dialog: Dialog; let edit; let unRefEdit; - let config: ISearchOption; + let config: Config.IUILayoutTabSearchConfig; window.siyuan.dialogs.find((item) => { if (item.element.contains(range.startContainer) && item.element.querySelector("#searchList")) { element = item.element.querySelector(".b3-dialog__body"); diff --git a/app/src/boot/onGetConfig.ts b/app/src/boot/onGetConfig.ts index 734da944e..a746e8240 100644 --- a/app/src/boot/onGetConfig.ts +++ b/app/src/boot/onGetConfig.ts @@ -29,10 +29,10 @@ import {sendGlobalShortcut} from "./globalEvent/keydown"; import {closeWindow} from "../window/closeWin"; import {checkFold} from "../util/noRelyPCFunction"; -const matchKeymap = (keymap: Record, key1: "general" | "editor", key2?: "general" | "insert" | "heading" | "list" | "table") => { +const matchKeymap = (keymap: Config.IKeys, key1: "general" | "editor", key2?: "general" | "insert" | "heading" | "list" | "table") => { if (key1 === "general") { if (!window.siyuan.config.keymap[key1]) { - window.siyuan.config.keymap[key1] = keymap; + window.siyuan.config.keymap[key1] = keymap as Config.IKeymapGeneral; return false; } } else { @@ -41,7 +41,7 @@ const matchKeymap = (keymap: Record, key1: "general" | "edi return false; } if (!window.siyuan.config.keymap[key1][key2]) { - window.siyuan.config.keymap[key1][key2] = keymap; + (window.siyuan.config.keymap[key1][key2] as Config.IKeymapEditor[typeof key2]) = keymap as Config.IKeymapEditor[typeof key2]; return false; } } diff --git a/app/src/config/about.ts b/app/src/config/about.ts index 5d8c11a4e..3d3f52d17 100644 --- a/app/src/config/about.ts +++ b/app/src/config/about.ts @@ -354,7 +354,7 @@ export const about = { }); /// #endif about.element.querySelector("#aboutConfirm").addEventListener("click", () => { - const scheme = (about.element.querySelector("#aboutScheme") as HTMLInputElement).value; + const scheme = (about.element.querySelector("#aboutScheme") as HTMLInputElement).value as Config.TSystemNetworkProxyScheme; const host = (about.element.querySelector("#aboutHost") as HTMLInputElement).value; const port = (about.element.querySelector("#aboutPort") as HTMLInputElement).value; fetchPost("/api/system/setNetworkProxy", {scheme, host, port}, async () => { diff --git a/app/src/config/keymap.ts b/app/src/config/keymap.ts index 277aa97bd..d20d05a78 100644 --- a/app/src/config/keymap.ts +++ b/app/src/config/keymap.ts @@ -12,7 +12,7 @@ import {sendGlobalShortcut} from "../boot/globalEvent/keydown"; export const keymap = { element: undefined as Element, - _genItem(keymap: Record, keys: string) { + _genItem(keymap: Record, keys: string) { let html = ""; Object.keys(keymap).forEach(key => { if (window.siyuan.languages[key]) { diff --git a/app/src/constants.ts b/app/src/constants.ts index 929dbe839..7b8ad9715 100644 --- a/app/src/constants.ts +++ b/app/src/constants.ts @@ -451,7 +451,7 @@ export abstract class Constants { plugin: {}, }; - public static readonly SIYUAN_EMPTY_LAYOUT: Record = { + public static readonly SIYUAN_EMPTY_LAYOUT: Config.IUiLayout = { hideDock: false, layout: { "direction": "tb", @@ -482,7 +482,14 @@ export abstract class Constants { "size": "auto", "type": "center", "instance": "Layout", - "children": [{"instance": "Wnd", "children": [{"instance": "Tab", "children": []}]}] + "children": [{ + "instance": "Wnd", + "children": [], + // "children": [{ + // "instance": "Tab", + // "children": [] + // }] + }] }, { "direction": "tb", "size": "0px", @@ -580,9 +587,7 @@ export abstract class Constants { } }; - public static readonly SIYUAN_DEFAULT_REPLACETYPES: { - [key: string]: boolean; - } = { + public static readonly SIYUAN_DEFAULT_REPLACETYPES: Required = { "text": true, "imgText": true, "imgTitle": true, diff --git a/app/src/layout/Wnd.ts b/app/src/layout/Wnd.ts index 4063ec6bc..df66374ff 100644 --- a/app/src/layout/Wnd.ts +++ b/app/src/layout/Wnd.ts @@ -47,9 +47,9 @@ export class Wnd { public element: HTMLElement; public headersElement: HTMLElement; public children: Tab[] = []; - public resize?: TDirection; + public resize?: Config.TUILayoutDirection; - constructor(app: App, resize?: TDirection, parentType?: TLayout) { + constructor(app: App, resize?: Config.TUILayoutDirection, parentType?: Config.TUILayoutType) { this.id = genUUID(); this.app = app; this.resize = resize; @@ -896,7 +896,7 @@ export class Wnd { /// #endif } - public split(direction: TDirection) { + public split(direction: Config.TUILayoutDirection) { if (this.children.length === 1 && !this.children[0].headElement) { // 场景:没有打开的文档,点击标签面板打开 return this; diff --git a/app/src/layout/dock/index.ts b/app/src/layout/dock/index.ts index 0e536d47e..9c7b3f316 100644 --- a/app/src/layout/dock/index.ts +++ b/app/src/layout/dock/index.ts @@ -35,7 +35,7 @@ export class Dock { app: App, data: { pin: boolean, - data: IDockTab[][] + data: Config.IUILayoutDockTab[][] }, position: TDockPosition }) { @@ -679,7 +679,7 @@ export class Dock { return max; } - public genButton(data: IDockTab[], index: number, tabIndex?: number) { + public genButton(data: Config.IUILayoutDockTab[], index: number, tabIndex?: number) { let html = ""; data.forEach(item => { if (typeof tabIndex === "undefined" && !TYPES.includes(item.type)) { diff --git a/app/src/layout/getAll.ts b/app/src/layout/getAll.ts index 21e3576f3..ef51f9036 100644 --- a/app/src/layout/getAll.ts +++ b/app/src/layout/getAll.ts @@ -131,19 +131,19 @@ export const getAllTabs = () => { }; export const getAllDocks = () => { - const docks: IDockTab[] = []; - window.siyuan.config.uiLayout.left.data.forEach((item: IDockTab[]) => { - item.forEach((dock: IDockTab) => { + const docks: Config.IUILayoutDockTab[] = []; + window.siyuan.config.uiLayout.left.data.forEach((item) => { + item.forEach((dock) => { docks.push(dock); }); }); - window.siyuan.config.uiLayout.right.data.forEach((item: IDockTab[]) => { - item.forEach((dock: IDockTab) => { + window.siyuan.config.uiLayout.right.data.forEach((item) => { + item.forEach((dock) => { docks.push(dock); }); }); - window.siyuan.config.uiLayout.bottom.data.forEach((item: IDockTab[]) => { - item.forEach((dock: IDockTab) => { + window.siyuan.config.uiLayout.bottom.data.forEach((item) => { + item.forEach((dock) => { docks.push(dock); }); }); diff --git a/app/src/layout/index.ts b/app/src/layout/index.ts index cf7512dde..2a6f5a795 100644 --- a/app/src/layout/index.ts +++ b/app/src/layout/index.ts @@ -11,14 +11,14 @@ export class Layout { public element: HTMLElement; public children?: Array; public parent?: Layout; - public direction: TDirection; - public type?: TLayout; + public direction: Config.TUILayoutDirection; + public type?: Config.TUILayoutType; public id?: string; - public resize?: TDirection; + public resize?: Config.TUILayoutDirection; public size?: string; constructor(options?: ILayoutOptions) { - const mergedOptions = Object.assign({ + const mergedOptions: ILayoutOptions = Object.assign({ direction: "tb", size: "auto", type: "normal" diff --git a/app/src/layout/util.ts b/app/src/layout/util.ts index 1e3d64ee8..e39e389ca 100644 --- a/app/src/layout/util.ts +++ b/app/src/layout/util.ts @@ -1,39 +1,39 @@ -import {Layout} from "./index"; -import {Wnd} from "./Wnd"; -import {Tab} from "./Tab"; -import {Model} from "./Model"; -import {Graph} from "./dock/Graph"; -import {Editor} from "../editor"; -import {Files} from "./dock/Files"; -import {Outline} from "./dock/Outline"; -import {Bookmark} from "./dock/Bookmark"; -import {Tag} from "./dock/Tag"; -import {getAllModels, getAllTabs} from "./getAll"; -import {Asset} from "../asset"; -import {Search} from "../search"; -import {Dock} from "./dock"; -import {focusByOffset, focusByRange, getSelectionOffset} from "../protyle/util/selection"; -import {hideElements} from "../protyle/ui/hideElements"; -import {fetchPost} from "../util/fetch"; -import {hasClosestBlock, hasClosestByClassName} from "../protyle/util/hasClosest"; -import {getContenteditableElement} from "../protyle/wysiwyg/getBlock"; -import {Constants} from "../constants"; -import {saveScroll} from "../protyle/scroll/saveScroll"; -import {Backlink} from "./dock/Backlink"; -import {openFileById} from "../editor/util"; -import {isWindow} from "../util/functions"; +import { Layout } from "./index"; +import { Wnd } from "./Wnd"; +import { Tab } from "./Tab"; +import { Model } from "./Model"; +import { Graph } from "./dock/Graph"; +import { Editor } from "../editor"; +import { Files } from "./dock/Files"; +import { Outline } from "./dock/Outline"; +import { Bookmark } from "./dock/Bookmark"; +import { Tag } from "./dock/Tag"; +import { getAllModels, getAllTabs } from "./getAll"; +import { Asset } from "../asset"; +import { Search } from "../search"; +import { Dock } from "./dock"; +import { focusByOffset, focusByRange, getSelectionOffset } from "../protyle/util/selection"; +import { hideElements } from "../protyle/ui/hideElements"; +import { fetchPost } from "../util/fetch"; +import { hasClosestBlock, hasClosestByClassName } from "../protyle/util/hasClosest"; +import { getContenteditableElement } from "../protyle/wysiwyg/getBlock"; +import { Constants } from "../constants"; +import { saveScroll } from "../protyle/scroll/saveScroll"; +import { Backlink } from "./dock/Backlink"; +import { openFileById } from "../editor/util"; +import { isWindow } from "../util/functions"; /// #if !BROWSER -import {setTabPosition} from "../window/setHeader"; +import { setTabPosition } from "../window/setHeader"; /// #endif -import {showMessage} from "../dialog/message"; -import {getIdZoomInByPath} from "../util/pathName"; -import {Custom} from "./dock/Custom"; -import {newCardModel} from "../card/newCardTab"; -import {App} from "../index"; -import {afterLoadPlugin} from "../plugin/loader"; -import {setTitle} from "../dialog/processSystem"; -import {newCenterEmptyTab, resizeTabs} from "./tabUtil"; -import {setStorageVal} from "../protyle/util/compatibility"; +import { showMessage } from "../dialog/message"; +import { getIdZoomInByPath } from "../util/pathName"; +import { Custom } from "./dock/Custom"; +import { newCardModel } from "../card/newCardTab"; +import { App } from "../index"; +import { afterLoadPlugin } from "../plugin/loader"; +import { setTitle } from "../dialog/processSystem"; +import { newCenterEmptyTab, resizeTabs } from "./tabUtil"; +import { setStorageVal } from "../protyle/util/compatibility"; export const setPanelFocus = (element: Element) => { if (element.getAttribute("data-type") === "wnd") { @@ -136,7 +136,7 @@ export const getWndByLayout: (layout: Layout) => Wnd = (layout: Layout) => { const dockToJSON = (dock: Dock) => { const json = []; const subDockToJSON = (index: number) => { - const data: IDockTab[] = []; + const data: Config.IUILayoutDockTab[] = []; dock.element.querySelectorAll(`span[data-index="${index}"]`).forEach(item => { data.push({ type: item.getAttribute("data-type"), @@ -169,7 +169,7 @@ const dockToJSON = (dock: Dock) => { }; export const resetLayout = () => { - fetchPost("/api/system/setUILayout", {layout: {}}, () => { + fetchPost("/api/system/setUILayout", { layout: {} }, () => { window.siyuan.storage[Constants.LOCAL_FILEPOSITION] = {}; setStorageVal(Constants.LOCAL_FILEPOSITION, window.siyuan.storage[Constants.LOCAL_FILEPOSITION]); window.siyuan.storage[Constants.LOCAL_DIALOGPOSITION] = {}; @@ -270,7 +270,7 @@ export const getAllLayout = () => { return layoutJSON; }; -const initInternalDock = (dockItem: IDockTab[]) => { +const initInternalDock = (dockItem: Config.IUILayoutDockTab[]) => { dockItem.forEach((existSubItem) => { if (existSubItem.hotkeyLangId) { existSubItem.title = window.siyuan.languages[existSubItem.hotkeyLangId]; @@ -280,22 +280,26 @@ const initInternalDock = (dockItem: IDockTab[]) => { }; const JSONToDock = (json: any, app: App) => { - json.left.data.forEach((existItem: IDockTab[]) => { + json.left.data.forEach((existItem: Config.IUILayoutDockTab[]) => { initInternalDock(existItem); }); - json.right.data.forEach((existItem: IDockTab[]) => { + json.right.data.forEach((existItem: Config.IUILayoutDockTab[]) => { initInternalDock(existItem); }); - json.bottom.data.forEach((existItem: IDockTab[]) => { + json.bottom.data.forEach((existItem: Config.IUILayoutDockTab[]) => { initInternalDock(existItem); }); window.siyuan.layout.centerLayout = window.siyuan.layout.layout.children[0].children[1] as Layout; - window.siyuan.layout.leftDock = new Dock({position: "Left", data: json.left, app}); - window.siyuan.layout.rightDock = new Dock({position: "Right", data: json.right, app}); - window.siyuan.layout.bottomDock = new Dock({position: "Bottom", data: json.bottom, app}); + window.siyuan.layout.leftDock = new Dock({ position: "Left", data: json.left, app }); + window.siyuan.layout.rightDock = new Dock({ position: "Right", data: json.right, app }); + window.siyuan.layout.bottomDock = new Dock({ position: "Bottom", data: json.bottom, app }); }; -export const JSONToCenter = (app: App, json: ILayoutJSON, layout?: Layout | Wnd | Tab | Model) => { +export const JSONToCenter = ( + app: App, + json: Config.TUILayoutItem, + layout?: Layout | Wnd | Tab | Model, +) => { let child: Layout | Wnd | Tab | Model; if (json.instance === "Layout") { if (!layout) { @@ -408,7 +412,7 @@ export const JSONToCenter = (app: App, json: ILayoutJSON, layout?: Layout | Wnd } (layout as Tab).headElement.setAttribute("data-initdata", JSON.stringify(json)); } - if (json.children) { + if ("children" in json) { if (Array.isArray(json.children)) { json.children.forEach((item: any) => { JSONToCenter(app, item, layout ? child : window.siyuan.layout.layout); diff --git a/app/src/mobile/menu/search.ts b/app/src/mobile/menu/search.ts index d0de71a65..b05a33441 100644 --- a/app/src/mobile/menu/search.ts +++ b/app/src/mobile/menu/search.ts @@ -27,7 +27,7 @@ import {addClearButton} from "../../util/addClearButton"; import {checkFold} from "../../util/noRelyPCFunction"; import {getDefaultType} from "../../search/getDefault"; -const replace = (element: Element, config: ISearchOption, isAll: boolean) => { +const replace = (element: Element, config: Config.IUILayoutTabSearchConfig, isAll: boolean) => { if (config.method === 1 || config.method === 2) { showMessage(window.siyuan.languages._kernel[132]); return; @@ -106,7 +106,7 @@ const replace = (element: Element, config: ISearchOption, isAll: boolean) => { }); }; -const updateConfig = (element: Element, newConfig: ISearchOption, config: ISearchOption) => { +const updateConfig = (element: Element, newConfig: Config.IUILayoutTabSearchConfig, config: Config.IUILayoutTabSearchConfig) => { if (config.hasReplace !== newConfig.hasReplace) { if (newConfig.hasReplace) { element.querySelector('[data-type="toggle-replace"]').classList.add("toolbar__icon--active"); @@ -162,7 +162,7 @@ const updateConfig = (element: Element, newConfig: ISearchOption, config: ISearc window.siyuan.menus.menu.remove(); }; -const onRecentBlocks = (data: IBlock[], config: ISearchOption, response?: IWebSocketData) => { +const onRecentBlocks = (data: IBlock[], config: Config.IUILayoutTabSearchConfig, response?: IWebSocketData) => { const listElement = document.querySelector("#searchList"); let resultHTML = ""; data.forEach((item: IBlock, index: number) => { @@ -212,7 +212,7 @@ ${unicode2Emoji(childItem.ial.icon, "b3-list-item__graphic", true)} }; let toolbarSearchTimeout = 0; -export const updateSearchResult = (config: ISearchOption, element: Element, rmCurrentCriteria = false) => { +export const updateSearchResult = (config: Config.IUILayoutTabSearchConfig, element: Element, rmCurrentCriteria = false) => { clearTimeout(toolbarSearchTimeout); toolbarSearchTimeout = window.setTimeout(() => { if (rmCurrentCriteria) { @@ -260,7 +260,7 @@ export const updateSearchResult = (config: ISearchOption, element: Element, rmCu }, Constants.TIMEOUT_INPUT); }; -const initSearchEvent = (app: App, element: Element, config: ISearchOption) => { +const initSearchEvent = (app: App, element: Element, config: Config.IUILayoutTabSearchConfig) => { const searchInputElement = document.getElementById("toolbarSearch") as HTMLInputElement; searchInputElement.value = config.k || ""; searchInputElement.addEventListener("compositionend", (event: InputEvent) => { @@ -298,7 +298,7 @@ const initSearchEvent = (app: App, element: Element, config: ISearchOption) => { inputElement: replaceInputElement, className: "toolbar__icon", }); - const criteriaData: ISearchOption[] = []; + const criteriaData: Config.IUILayoutTabSearchConfig[] = []; initCriteriaMenu(element.querySelector("#criteria"), criteriaData, config); const assetsElement = document.querySelector("#searchAssetsPanel"); @@ -616,7 +616,7 @@ const initSearchEvent = (app: App, element: Element, config: ISearchOption) => { }, false); }; -export const popSearch = (app: App, config = window.siyuan.storage[Constants.LOCAL_SEARCHDATA] as ISearchOption) => { +export const popSearch = (app: App, config = window.siyuan.storage[Constants.LOCAL_SEARCHDATA] as Config.IUILayoutTabSearchConfig) => { activeBlur(); hideKeyboardToolbar(); let includeChild = true; diff --git a/app/src/plugin/API.ts b/app/src/plugin/API.ts index 1be7d9d56..20e25803a 100644 --- a/app/src/plugin/API.ts +++ b/app/src/plugin/API.ts @@ -62,7 +62,7 @@ openTab = (options: { asset?: { path: string, }, - search?: ISearchOption + search?: Config.IUILayoutTabSearchConfig card?: { type: TCardType, id?: string, // cardType 为 all 时不传,否则传文档或笔记本 id diff --git a/app/src/plugin/loader.ts b/app/src/plugin/loader.ts index bbe66899f..4b1cbc6c5 100644 --- a/app/src/plugin/loader.ts +++ b/app/src/plugin/loader.ts @@ -86,9 +86,9 @@ export const loadPlugin = async (app: App, item: IPluginData) => { }; -const updateDock = (dockItem: IDockTab[], index: number, plugin: Plugin, type: string) => { +const updateDock = (dockItem: Config.IUILayoutDockTab[], index: number, plugin: Plugin, type: string) => { const dockKeys = Object.keys(plugin.docks); - dockItem.forEach((tabItem: IDockTab, tabIndex: number) => { + dockItem.forEach((tabItem: Config.IUILayoutDockTab, tabIndex: number) => { if (dockKeys.includes(tabItem.type)) { if (type === "Left") { plugin.docks[tabItem.type].config.position = index === 0 ? "LeftTop" : "LeftBottom"; @@ -214,13 +214,13 @@ export const afterLoadPlugin = (plugin: Plugin) => { } /// #if !MOBILE - window.siyuan.config.uiLayout.left.data.forEach((dockItem: IDockTab[], index: number) => { + window.siyuan.config.uiLayout.left.data.forEach((dockItem: Config.IUILayoutDockTab[], index: number) => { updateDock(dockItem, index, plugin, "Left"); }); - window.siyuan.config.uiLayout.right.data.forEach((dockItem: IDockTab[], index: number) => { + window.siyuan.config.uiLayout.right.data.forEach((dockItem: Config.IUILayoutDockTab[], index: number) => { updateDock(dockItem, index, plugin, "Right"); }); - window.siyuan.config.uiLayout.bottom.data.forEach((dockItem: IDockTab[], index: number) => { + window.siyuan.config.uiLayout.bottom.data.forEach((dockItem: Config.IUILayoutDockTab[], index: number) => { updateDock(dockItem, index, plugin, "Bottom"); }); Object.keys(plugin.docks).forEach(key => { diff --git a/app/src/search/index.ts b/app/src/search/index.ts index 60dd59ffe..34651f103 100644 --- a/app/src/search/index.ts +++ b/app/src/search/index.ts @@ -7,10 +7,10 @@ import {App} from "../index"; export class Search extends Model { public element: HTMLElement; - public config: ISearchOption; + public config: Config.IUILayoutTabSearchConfig; public editors: { edit: Protyle, unRefEdit: Protyle }; - constructor(options: { tab: Tab, config: ISearchOption, app: App }) { + constructor(options: { tab: Tab, config: Config.IUILayoutTabSearchConfig, app: App }) { super({ app: options.app, id: options.tab.id, diff --git a/app/src/search/menu.ts b/app/src/search/menu.ts index e3f6a407c..ae51231b7 100644 --- a/app/src/search/menu.ts +++ b/app/src/search/menu.ts @@ -9,7 +9,7 @@ import {setStorageVal} from "../protyle/util/compatibility"; import {confirmDialog} from "../dialog/confirmDialog"; import {goUnRef, updateSearchResult} from "../mobile/menu/search"; -export const filterMenu = (config: ISearchOption, cb: () => void) => { +export const filterMenu = (config: Config.IUILayoutTabSearchConfig, cb: () => void) => { const filterDialog = new Dialog({ title: window.siyuan.languages.searchType, content: `
@@ -181,16 +181,16 @@ export const filterMenu = (config: ISearchOption, cb: () => void) => { }); btnsElement[1].addEventListener("click", () => { filterDialog.element.querySelectorAll(".b3-switch").forEach((item: HTMLInputElement) => { - config.types[item.getAttribute("data-type") as TSearchFilter] = item.checked; + config.types[item.getAttribute("data-type") as keyof (typeof config.types)] = item.checked; }); cb(); filterDialog.destroy(); }); }; -export const replaceFilterMenu = (config: ISearchOption) => { +export const replaceFilterMenu = (config: Config.IUILayoutTabSearchConfig) => { let html = ""; - Object.keys(Constants.SIYUAN_DEFAULT_REPLACETYPES).forEach((key) => { + Object.keys(Constants.SIYUAN_DEFAULT_REPLACETYPES).forEach((key: keyof Config.IUILayoutTabSearchConfigReplaceTypes) => { html += `