Skip to content

Commit

Permalink
feat: allow search field when add command-palette-get-tiddler: no
Browse files Browse the repository at this point in the history
  • Loading branch information
linonetwo committed Jun 5, 2024
1 parent 70f2ed6 commit 2f256f8
Show file tree
Hide file tree
Showing 13 changed files with 33 additions and 23 deletions.
1 change: 1 addition & 0 deletions src/commandpalette/commands/filter/Search fields.tid
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ description: <<lingo Filter/Fields/Description $:/plugins/linonetwo/commandpalet
tags: $:/tags/Filter
title: $:/plugins/linonetwo/commandpalette/Search fields
filter: [fields[]]
command-palette-get-tiddler: no
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ export const plugin = {
async getItems({ query }) {
if (query === '') return [];
if (cachedTiddlers.length === 0 || !cacheSystemTiddlers()) {
cachedTiddlers = await filterTiddlersAsync(`[all[tiddlers+shadows]tag[$:/tags/Actions]]`, true, []);
cachedTiddlers = await filterTiddlersAsync(`[all[tiddlers+shadows]tag[$:/tags/Actions]]`, { system: true, exclude: [] });
}
return cachedTiddlers
.filter(tiddler =>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 => {
Expand Down
14 changes: 9 additions & 5 deletions src/commandpalette/widgets/build-in-sub-plugins/search-filter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 => {
Expand Down Expand Up @@ -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)}`
Expand All @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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: () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
2 changes: 2 additions & 0 deletions src/commandpalette/widgets/utils/context.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
*/
Expand Down
17 changes: 10 additions & 7 deletions src/commandpalette/widgets/utils/filterTiddlersAsync.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<ITiddlerFields[]> {
export async function filterTiddlersAsync(filter: string, options: { exclude?: string[]; system?: boolean; toTiddler?: boolean }): Promise<ITiddlerFields[]> {
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',
Expand All @@ -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[];
}
}

0 comments on commit 2f256f8

Please sign in to comment.