diff --git a/packages/tools/src/filterName.ts b/packages/tools/src/filterName.ts index 72b434b1f..0676d701a 100644 --- a/packages/tools/src/filterName.ts +++ b/packages/tools/src/filterName.ts @@ -67,24 +67,56 @@ export function filterNameCompoud( return 'none'; } -export function tokenizeBySearchFilter(text: string, filter: string): { token: string; isMatch: boolean }[] { - const tokens = filter.split(' ').map(x => x.trim()); - - const result = []; - let lastMatch = 0; - for (const token of tokens) { - const index = text.indexOf(token, lastMatch); - if (index < 0) { - result.push({ token, isMatch: false }); - continue; +export function tokenizeBySearchFilter(text: string, filter: string): { text: string; isMatch: boolean }[] { + const camelTokens = []; + const stdTokens = []; + for (const token of filter.split(' ').map(x => x.trim())) { + if (token.replace(/[A-Z]/g, '').length == 0) { + camelTokens.push(token); + } else { + stdTokens.push(token.toUpperCase()); } - - result.push({ token: text.substring(lastMatch, index), isMatch: false }); - result.push({ token: text.substring(index, index + token.length), isMatch: true }); - lastMatch = index + token.length; } - result.push({ token: text.substring(lastMatch), isMatch: false }); + let res = [ + { + text, + isMatch: false, + }, + ]; - return result; + for (const token of stdTokens) { + const nextres = []; + for (const item of res) { + const index = item.text?.toUpperCase().indexOf(token); + if (index < 0) { + nextres.push(item); + } else { + nextres.push({ text: item.text.substring(0, index), isMatch: false }); + nextres.push({ text: item.text.substring(index, index + token.length), isMatch: true }); + nextres.push({ text: item.text.substring(index + token.length), isMatch: false }); + } + } + res = nextres; + } + + return res; + + // const result = []; + // let lastMatch = 0; + // for (const token of tokens) { + // const index = text.indexOf(token, lastMatch); + // if (index < 0) { + // result.push({ token, isMatch: false }); + // continue; + // } + + // result.push({ token: text.substring(lastMatch, index), isMatch: false }); + // result.push({ token: text.substring(index, index + token.length), isMatch: true }); + // lastMatch = index + token.length; + // } + + // result.push({ token: text.substring(lastMatch), isMatch: false }); + + // return result; } diff --git a/packages/web/src/appobj/AppObjectCore.svelte b/packages/web/src/appobj/AppObjectCore.svelte index 8545f5f3d..8b26e55a3 100644 --- a/packages/web/src/appobj/AppObjectCore.svelte +++ b/packages/web/src/appobj/AppObjectCore.svelte @@ -5,6 +5,7 @@ import CheckboxField from '../forms/CheckboxField.svelte'; import { copyTextToClipboard } from '../utility/clipboard'; import { showSnackbarSuccess } from '../utility/snackbar'; + import TokenizedFilteredText from '../widgets/TokenizedFilteredText.svelte'; const dispatch = createEventDispatcher(); @@ -134,7 +135,7 @@ {#if colorMark} {/if} - {title} + {#if statusIconBefore} @@ -156,7 +157,7 @@ {/if} {#if extInfo} - {extInfo} + {/if} {#if onPin} diff --git a/packages/web/src/widgets/SqlObjectList.svelte b/packages/web/src/widgets/SqlObjectList.svelte index 17c6783a9..7af64f669 100644 --- a/packages/web/src/widgets/SqlObjectList.svelte +++ b/packages/web/src/widgets/SqlObjectList.svelte @@ -274,7 +274,9 @@ ? isExpandedBySearch ? SubProcedureLineList : SubProcedureParamList - : SubTableColumnList} + : isExpandedBySearch && (data.objectTypeField == 'views' || data.objectTypeField == 'matviews') + ? SubProcedureLineList + : SubTableColumnList} isExpandable={data => data.objectTypeField == 'tables' || data.objectTypeField == 'views' || diff --git a/packages/web/src/widgets/TokenizedFilteredText.svelte b/packages/web/src/widgets/TokenizedFilteredText.svelte new file mode 100644 index 000000000..3a7575a46 --- /dev/null +++ b/packages/web/src/widgets/TokenizedFilteredText.svelte @@ -0,0 +1,26 @@ + + +{#if tokenized} + {#each tokenized as token} + {#if token.isMatch} + {token.text} + {:else} + {token.text} + {/if} + {/each} +{:else} + {text} +{/if} + +