diff --git a/src/commandpalette/commands/filter/Search fields.tid b/src/commandpalette/commands/filter/Search fields.tid index 24ea2b7..b03818b 100644 --- a/src/commandpalette/commands/filter/Search fields.tid +++ b/src/commandpalette/commands/filter/Search fields.tid @@ -3,3 +3,4 @@ description: < diff --git a/src/commandpalette/widgets/build-in-sub-plugins/command-message.ts b/src/commandpalette/widgets/build-in-sub-plugins/command-message.ts index 21371d0..5abac6d 100644 --- a/src/commandpalette/widgets/build-in-sub-plugins/command-message.ts +++ b/src/commandpalette/widgets/build-in-sub-plugins/command-message.ts @@ -35,7 +35,7 @@ export const plugin = { async getItems({ query }) { if (query === '') return []; if (cachedTiddlers.length === 0 || !cacheSystemTiddlers()) { - cachedTiddlers = await filterTiddlersAsync(`[all[tiddlers+shadows]tag[$:/tags/Messages]]`, true, []); + cachedTiddlers = await filterTiddlersAsync(`[all[tiddlers+shadows]tag[$:/tags/Messages]]`, { system: true }); } return cachedTiddlers .filter((tiddler): tiddler is ITiddlerFields => { diff --git a/src/commandpalette/widgets/build-in-sub-plugins/search-config.ts b/src/commandpalette/widgets/build-in-sub-plugins/search-config.ts index 87b3ee3..29bcac0 100644 --- a/src/commandpalette/widgets/build-in-sub-plugins/search-config.ts +++ b/src/commandpalette/widgets/build-in-sub-plugins/search-config.ts @@ -23,7 +23,7 @@ export const plugin = { sourceId: 'config', async getItems({ query }) { if (cachedTiddlers.length === 0 || !cacheSystemTiddlers()) { - cachedTiddlers = await filterTiddlersAsync(`[all[shadows]tag[$:/tags/ControlPanel/SettingsTab]]`, true); + cachedTiddlers = await filterTiddlersAsync(`[all[shadows]tag[$:/tags/ControlPanel/SettingsTab]]`, { system: true }); } return cachedTiddlers .filter((tiddler): tiddler is ITiddlerFields => { diff --git a/src/commandpalette/widgets/build-in-sub-plugins/search-filter.ts b/src/commandpalette/widgets/build-in-sub-plugins/search-filter.ts index 3190e64..6e804e6 100644 --- a/src/commandpalette/widgets/build-in-sub-plugins/search-filter.ts +++ b/src/commandpalette/widgets/build-in-sub-plugins/search-filter.ts @@ -19,14 +19,15 @@ export const plugin = { if (checkIsFilter(parameters)) { const { widget } = parameters.state.context as IContext; const onSelect = (item: ITiddlerFields) => { - parameters.setContext({ noNavigate: true, noClose: true, filter: (item.filter as string).trim(), newQuery: '' } satisfies IContext); + const filterGetTiddler = item['command-palette-get-tiddler'] !== 'no'; + parameters.setContext({ noNavigate: true, noClose: true, filter: (item.filter as string).trim(), newQuery: '', filterGetTiddler } satisfies IContext); }; sources.push({ sourceId: 'build-in-filter', async getItems({ query }) { if (query === '') return []; if (cachedTiddlers.length === 0 || !cacheSystemTiddlers()) { - cachedTiddlers = await filterTiddlersAsync(`[all[tiddlers+shadows]tag[$:/tags/Filter]]`, true); + cachedTiddlers = await filterTiddlersAsync(`[all[tiddlers+shadows]tag[$:/tags/Filter]]`, { system: true }); } const buildInFilters = cachedTiddlers .filter((tiddler): tiddler is ITiddlerFields => { @@ -64,7 +65,7 @@ export const plugin = { header() { return lingo('Filter'); }, - item({ item, createElement, state }) { + item({ item, createElement }) { const caption = renderTextWithCache(item.caption, widget); const description = item.description ? `${caption ? ' - ' : ''}${renderTextWithCache(item.description as string, widget)}` @@ -89,8 +90,11 @@ export const plugin = { sources.push({ sourceId: 'filter', async getItems({ query, state }) { - const isSystem = checkIsSearchSystem(parameters); - return await filterTiddlersAsync(`[all[tiddlers+shadows]]+${(state.context as IContext).filter} +[search[${isSystem ? query.slice(1) : query}]]`, isSystem); + const system = checkIsSearchSystem(parameters); + return await filterTiddlersAsync(`[all[tiddlers+shadows]]+${(state.context as IContext).filter} +[search[${system ? query.slice(1) : query}]]`, { + system, + toTiddler: ((state.context as IContext).filterGetTiddler ?? true), + }); }, getItemUrl({ item }) { return item.title; diff --git a/src/commandpalette/widgets/build-in-sub-plugins/search-layout.ts b/src/commandpalette/widgets/build-in-sub-plugins/search-layout.ts index 7b08f9c..85bc4a6 100644 --- a/src/commandpalette/widgets/build-in-sub-plugins/search-layout.ts +++ b/src/commandpalette/widgets/build-in-sub-plugins/search-layout.ts @@ -27,7 +27,7 @@ export const plugin = { sourceId: 'layout', async getItems({ query }) { if (cachedTiddlers.length === 0 || !cacheSystemTiddlers()) { - cachedTiddlers = await filterTiddlersAsync(`[all[tiddlers+shadows]tag[$:/tags/Layout]] [[$:/core/ui/PageTemplate]] +[!is[draft]sort[name]]`, true); + cachedTiddlers = await filterTiddlersAsync(`[all[tiddlers+shadows]tag[$:/tags/Layout]] [[$:/core/ui/PageTemplate]] +[!is[draft]sort[name]]`, { system: true }); } return cachedTiddlers.filter((tiddler): tiddler is ITiddlerFields => { // TODO: add pinyinfuse @@ -57,7 +57,7 @@ export const plugin = { : $tw.wiki.getTiddlerText('$:/language/PageTemplate/Name'); return `${lingo('Layout')} - ${lingo('CurrentLayout')}: ${currentLayoutName}`; }, - item({ item, createElement, state }) { + item({ item, createElement }) { if (typeof item.name === 'string' && item.name !== '') { const name = renderTextWithCache(item.name, widget); const description = renderTextWithCache(item.description, widget); diff --git a/src/commandpalette/widgets/build-in-sub-plugins/search-system-title.ts b/src/commandpalette/widgets/build-in-sub-plugins/search-system-title.ts index e9326ea..4149258 100644 --- a/src/commandpalette/widgets/build-in-sub-plugins/search-system-title.ts +++ b/src/commandpalette/widgets/build-in-sub-plugins/search-system-title.ts @@ -20,7 +20,7 @@ export const plugin = { async getItems({ query }) { if (query === '') return []; if (cachedTiddlers.length === 0 || !cacheSystemTiddlers()) { - cachedTiddlers = await filterTiddlersAsync(`[all[tiddlers+shadows]is[system]search[${query}]]`, true); + cachedTiddlers = await filterTiddlersAsync(`[all[tiddlers+shadows]is[system]search[${query}]]`, { system: true }); } return cachedTiddlers; }, diff --git a/src/commandpalette/widgets/build-in-sub-plugins/search-tags.ts b/src/commandpalette/widgets/build-in-sub-plugins/search-tags.ts index 1a5587a..033d14d 100644 --- a/src/commandpalette/widgets/build-in-sub-plugins/search-tags.ts +++ b/src/commandpalette/widgets/build-in-sub-plugins/search-tags.ts @@ -21,7 +21,7 @@ export const plugin = { sourceId: 'tags', async getItems({ query }) { // similar to $:/core/Filters/AllTags - return await filterTiddlersAsync(`[tags[]search[${query.slice(1)}]]`, true); + return await filterTiddlersAsync(`[tags[]search[${query.slice(1)}]]`, { system: true }); }, getItemUrl({ item }) { return item.title; @@ -33,7 +33,7 @@ export const plugin = { header() { return lingo('Tags'); }, - item({ item, createElement, state }) { + item({ item, createElement }) { if (typeof item.caption === 'string' && item.caption !== '') { return createElement('div', { onclick: () => { diff --git a/src/commandpalette/widgets/build-in-sub-plugins/search-user-text.ts b/src/commandpalette/widgets/build-in-sub-plugins/search-user-text.ts index 40f6d67..8aa8d0e 100644 --- a/src/commandpalette/widgets/build-in-sub-plugins/search-user-text.ts +++ b/src/commandpalette/widgets/build-in-sub-plugins/search-user-text.ts @@ -17,7 +17,7 @@ export const plugin = { async getItems({ query }) { if (query === '') return []; const filter = `[all[tiddlers]!is[system]] ${titleTextExclusionFilter()} :filter[has[text]get[text]!compare:string:eq[]]+[search:${getFieldsAsText()}[${query}]]`; - return await filterTiddlersAsync(filter, false, []); + return await filterTiddlersAsync(filter, { system: false, exclude: [] }); }, getItemUrl({ item }) { return item.title; diff --git a/src/commandpalette/widgets/build-in-sub-plugins/search-user-title-pinyin.ts b/src/commandpalette/widgets/build-in-sub-plugins/search-user-title-pinyin.ts index 48e36cc..e1b0102 100644 --- a/src/commandpalette/widgets/build-in-sub-plugins/search-user-title-pinyin.ts +++ b/src/commandpalette/widgets/build-in-sub-plugins/search-user-title-pinyin.ts @@ -24,7 +24,7 @@ export const plugin = { sourceId: 'title-pinyin', async getItems({ query }) { if (query === '') return []; - return await filterTiddlersAsync(`[all[tiddlers]!is[system]] ${titleTextExclusionFilter()} +[pinyinfuse:${getFieldsAsTitle()}[${query}]]`); + return await filterTiddlersAsync(`[all[tiddlers]!is[system]] ${titleTextExclusionFilter()} +[pinyinfuse:${getFieldsAsTitle()}[${query}]]`, {}); }, getItemUrl({ item }) { return item.title; diff --git a/src/commandpalette/widgets/build-in-sub-plugins/search-user-title.ts b/src/commandpalette/widgets/build-in-sub-plugins/search-user-title.ts index c48e841..5ee7f9c 100644 --- a/src/commandpalette/widgets/build-in-sub-plugins/search-user-title.ts +++ b/src/commandpalette/widgets/build-in-sub-plugins/search-user-title.ts @@ -16,7 +16,7 @@ export const plugin = { sourceId: 'title', async getItems({ query }) { if (query === '') return []; - return await filterTiddlersAsync(`[all[tiddlers]!is[system]] ${titleTextExclusionFilter()} +[search:${getFieldsAsTitle()}[${query}]]`); + return await filterTiddlersAsync(`[all[tiddlers]!is[system]] ${titleTextExclusionFilter()} +[search:${getFieldsAsTitle()}[${query}]]`, {}); }, getItemUrl({ item }) { return item.title; diff --git a/src/commandpalette/widgets/utils/context.ts b/src/commandpalette/widgets/utils/context.ts index fd13278..8e75a9f 100644 --- a/src/commandpalette/widgets/utils/context.ts +++ b/src/commandpalette/widgets/utils/context.ts @@ -5,6 +5,8 @@ export interface IContext { * Search under results of this filter. */ filter?: string; + /** Undefined means true. If is false, then it ask filter not to call `$tw.wiki.getTiddler(title)` */ + filterGetTiddler?: boolean; /** * Ask navigator to set query instead of navigate to a tiddler */ diff --git a/src/commandpalette/widgets/utils/filterTiddlersAsync.ts b/src/commandpalette/widgets/utils/filterTiddlersAsync.ts index da9e216..1329359 100644 --- a/src/commandpalette/widgets/utils/filterTiddlersAsync.ts +++ b/src/commandpalette/widgets/utils/filterTiddlersAsync.ts @@ -10,25 +10,27 @@ const tidGiWorkspaceID = ((window as any).meta?.())?.workspaceID; * @param exclude need to set to `[]`, otherwise it will exclude text field by default (only return skinny tiddlers) * @returns */ -export async function filterTiddlersAsync(filter: string, system?: boolean, exclude?: string[]): Promise { +export async function filterTiddlersAsync(filter: string, options: { exclude?: string[]; system?: boolean; toTiddler?: boolean }): Promise { + const { system = false, exclude, toTiddler = true } = options; if (isInTidGiDesktop && 'service' in window) { // by default tiddlyweb protocol omit all system tiddlers, need to turn off this // TODO: add param to turn off this in TidGi const wikiServer = (window.service as any).wiki; let previousServerConfigValue: string | undefined; - if (system === true) { + if (system) { previousServerConfigValue = await wikiServer.wikiOperationInServer('wiki-get-tiddler-text', tidGiWorkspaceID, ['$:/config/SyncSystemTiddlersFromServer']); await wikiServer.wikiOperationInServer('wiki-add-tiddler', tidGiWorkspaceID, [ '$:/config/SyncSystemTiddlersFromServer', 'yes', ]); } + // FIXME: this prevent [all[tiddlers+shadows]]+[fields[]]+[search[]] to work, need to modify tidgi side const resultFromIPC = await wikiServer.callWikiIpcServerRoute( tidGiWorkspaceID, 'getTiddlersJSON', filter, exclude, ); - if (system === true) { + if (system) { if (previousServerConfigValue === undefined) { await wikiServer.wikiOperationInServer('wiki-delete-tiddler', tidGiWorkspaceID, [ '$:/config/SyncSystemTiddlersFromServer', @@ -42,9 +44,10 @@ export async function filterTiddlersAsync(filter: string, system?: boolean, excl } return resultFromIPC.data as ITiddlerFields[]; } else { - // FIXME: this prevent [all[tiddlers+shadows]]+[fields[]]+[search[]] to work - return $tw.wiki.filterTiddlers(filter) - .map((title) => $tw.wiki.getTiddler(title)?.fields) - .filter(Boolean) as ITiddlerFields[]; + return toTiddler + ? $tw.wiki.filterTiddlers(filter) + .map((title) => $tw.wiki.getTiddler(title)?.fields) + .filter(Boolean) as ITiddlerFields[] + : $tw.wiki.filterTiddlers(filter).filter(Boolean).map((title) => ({ title })) as ITiddlerFields[]; } }