diff --git a/packages/tools/src/filterName.ts b/packages/tools/src/filterName.ts index 8cdc38d43..72b434b1f 100644 --- a/packages/tools/src/filterName.ts +++ b/packages/tools/src/filterName.ts @@ -36,6 +36,37 @@ export function filterName(filter: string, ...names: string[]) { return true; } +export function filterNameCompoud( + filter: string, + namesMain: string[], + namesChild: string[] +): 'main' | 'child' | 'both' | 'none' { + if (!filter) return 'both'; + + // const camelVariants = [name.replace(/[^A-Z]/g, '')] + const tokens = filter.split(' ').map(x => x.trim()); + + const namesCompactedMain = _compact(namesMain); + const namesCompactedChild = _compact(namesChild); + + let isMainOnly = true; + let isChildOnly = true; + + for (const token of tokens) { + const foundMain = namesCompactedMain.find(name => camelMatch(token, name)); + const foundChild = namesCompactedChild.find(name => camelMatch(token, name)); + if (!foundMain && !foundChild) return 'none'; + + if (!foundMain) isMainOnly = false; + if (!foundChild) isChildOnly = false; + } + + if (isMainOnly && isChildOnly) return 'both'; + if (isMainOnly) return 'main'; + if (isChildOnly) return 'child'; + return 'none'; +} + export function tokenizeBySearchFilter(text: string, filter: string): { token: string; isMatch: boolean }[] { const tokens = filter.split(' ').map(x => x.trim()); diff --git a/packages/web/src/appobj/AppObjectList.svelte b/packages/web/src/appobj/AppObjectList.svelte index e67f15658..785c85835 100644 --- a/packages/web/src/appobj/AppObjectList.svelte +++ b/packages/web/src/appobj/AppObjectList.svelte @@ -34,13 +34,31 @@ let expandLimited = false; $: matcher = module.createMatcher && module.createMatcher(filter, passProps?.searchSettings); - $: childMatcher = module.createChildMatcher && module.createChildMatcher(filter, passProps?.searchSettings); $: dataLabeled = _.compact( (list || []).map(data => { - const isMatched = !matcher || matcher(data); - const isChildMatched = - module.disableShowChildrenWithParentMatch && isMatched ? false : !childMatcher || childMatcher(data); + const matchResult = matcher ? matcher(data) : true; + + let isMatched = true; + let isChildMatched = true; + + if (matchResult == false) { + isMatched = false; + isChildMatched = false; + } else if (matchResult == 'child') { + isMatched = true; + isChildMatched = true; + } else if (matchResult == 'main') { + isMatched = true; + isChildMatched = false; + } else if (matchResult == 'none') { + isMatched = false; + isChildMatched = false; + } else if (matchResult == 'both') { + isMatched = true; + isChildMatched = !module.disableShowChildrenWithParentMatch; + } + const group = groupFunc ? groupFunc(data) : undefined; return { group, data, isMatched, isChildMatched }; }) diff --git a/packages/web/src/appobj/ConnectionAppObject.svelte b/packages/web/src/appobj/ConnectionAppObject.svelte index 355d10930..f19616fd3 100644 --- a/packages/web/src/appobj/ConnectionAppObject.svelte +++ b/packages/web/src/appobj/ConnectionAppObject.svelte @@ -3,13 +3,11 @@ export const createMatcher = filter => props => { const { _id, displayName, server } = props; const databases = getLocalStorage(`database_list_${_id}`) || []; - return filterName(filter, displayName, server, ...databases.map(x => x.name)); - }; - export const createChildMatcher = filter => props => { - if (!filter) return false; - const { _id } = props; - const databases = getLocalStorage(`database_list_${_id}`) || []; - return filterName(filter, ...databases.map(x => x.name)); + return filterNameCompoud( + filter, + [displayName, server], + databases.map(x => x.name) + ); }; export function openConnection(connection, disableExpand = false) { if (connection.singleDatabase) { @@ -106,7 +104,7 @@ openedConnections, openedSingleDatabaseConnections, } from '../stores'; - import { filterName } from 'dbgate-tools'; + import { filterName, filterNameCompoud } from 'dbgate-tools'; import { showModal } from '../modals/modalTools'; import ConfirmModal from '../modals/ConfirmModal.svelte'; import InputTextModal from '../modals/InputTextModal.svelte'; diff --git a/packages/web/src/appobj/DatabaseObjectAppObject.svelte b/packages/web/src/appobj/DatabaseObjectAppObject.svelte index c2d5bbb6d..de1fd3f4e 100644 --- a/packages/web/src/appobj/DatabaseObjectAppObject.svelte +++ b/packages/web/src/appobj/DatabaseObjectAppObject.svelte @@ -5,42 +5,25 @@ export const createMatcher = (filter, cfg = DEFAULT_SEARCH_SETTINGS) => ({ schemaName, pureName, objectComment, tableEngine, columns, objectTypeField, createSql }) => { - const filterArgs = []; - if (cfg.schemaName) filterArgs.push(schemaName); + const mainArgs = []; + const childArgs = []; + if (cfg.schemaName) mainArgs.push(schemaName); if (objectTypeField == 'tables') { - if (cfg.tableName) filterArgs.push(pureName); - if (cfg.tableComment) filterArgs.push(objectComment); - if (cfg.tableEngine) filterArgs.push(tableEngine); + if (cfg.tableName) mainArgs.push(pureName); + if (cfg.tableComment) mainArgs.push(objectComment); + if (cfg.tableEngine) mainArgs.push(tableEngine); for (const column of columns || []) { - if (cfg.columnName) filterArgs.push(column.columnName); - if (cfg.columnComment) filterArgs.push(column.columnComment); - if (cfg.columnDataType) filterArgs.push(column.dataType); + if (cfg.columnName) childArgs.push(column.columnName); + if (cfg.columnComment) childArgs.push(column.columnComment); + if (cfg.columnDataType) childArgs.push(column.dataType); } } else { - if (cfg.sqlObjectName) filterArgs.push(pureName); - if (cfg.sqlObjectText) filterArgs.push(createSql); + if (cfg.sqlObjectName) mainArgs.push(pureName); + if (cfg.sqlObjectText) childArgs.push(createSql); } - const res = filterName(filter, ...filterArgs); - return res; - }; - - export const createChildMatcher = - (filter, cfg = DEFAULT_SEARCH_SETTINGS) => - ({ columns, objectTypeField, createSql }) => { - const filterArgs = []; - if (objectTypeField == 'tables') { - for (const column of columns || []) { - if (cfg.columnName) filterArgs.push(column.columnName); - if (cfg.columnComment) filterArgs.push(column.columnComment); - if (cfg.columnDataType) filterArgs.push(column.dataType); - } - } else { - if (cfg.sqlObjectText) filterArgs.push(createSql); - } - - const res = filterName(filter, ...filterArgs); + const res = filterNameCompoud(filter, mainArgs, childArgs); return res; }; @@ -929,6 +912,7 @@ import { extractDbNameFromComposite, filterName, + filterNameCompoud, generateDbPairingId, getAlterDatabaseScript, getConnectionLabel, diff --git a/packages/web/src/stores.ts b/packages/web/src/stores.ts index 997bfcae4..dd60b6b53 100644 --- a/packages/web/src/stores.ts +++ b/packages/web/src/stores.ts @@ -167,7 +167,7 @@ export const DEFAULT_SEARCH_SETTINGS = { tableName: true, viewName: true, columnName: true, - columnDataType: true, + columnDataType: false, tableComment: true, columnComment: true, sqlObjectName: true,