diff --git a/web/src/components/MemoList.tsx b/web/src/components/MemoList.tsx index 20bb2361..4c283895 100644 --- a/web/src/components/MemoList.tsx +++ b/web/src/components/MemoList.tsx @@ -19,23 +19,36 @@ const MemoList: React.FC = () => { const wrapperElement = useRef(null); const { tag: tagQuery, duration, type: memoType, text: textQuery, filter: queryId } = query; - const showMemoFilter = Boolean(tagQuery || (duration && duration.from < duration.to) || memoType || textQuery); + const queryFilter = queryService.getQueryById(queryId); + const showMemoFilter = Boolean(tagQuery || (duration && duration.from < duration.to) || memoType || textQuery || queryFilter); const shownMemos = - showMemoFilter || queryId + showMemoFilter || queryFilter ? memos.filter((memo) => { let shouldShow = true; - const query = queryService.getQueryById(queryId); - if (query) { - const filters = JSON.parse(query.querystring) as Filter[]; + if (queryFilter) { + const filters = JSON.parse(queryFilter.querystring) as Filter[]; if (Array.isArray(filters)) { shouldShow = checkShouldShowMemoWithFilters(memo, filters); } } - if (tagQuery && !memo.content.includes(`#${tagQuery} `) && !memo.content.includes(`# ${tagQuery} `)) { - shouldShow = false; + if (tagQuery) { + const tagsSet = new Set(); + for (const t of Array.from(memo.content.match(TAG_REG) ?? [])) { + const tag = t.replace(TAG_REG, "$1").trim(); + const items = tag.split("/"); + let temp = ""; + for (const i of items) { + temp += i; + tagsSet.add(temp); + temp += "/"; + } + } + if (!tagsSet.has(tagQuery)) { + shouldShow = false; + } } if ( duration && diff --git a/web/src/components/TagList.tsx b/web/src/components/TagList.tsx index a5d14c66..62081142 100644 --- a/web/src/components/TagList.tsx +++ b/web/src/components/TagList.tsx @@ -100,7 +100,7 @@ const TagItemContainer: React.FC = (props: TagItemContain if (isActive) { locationService.setTagQuery(""); } else { - utils.copyTextToClipboard(`# ${tag.text} `); + utils.copyTextToClipboard(`#${tag.text} `); if (!["/", "/recycle"].includes(locationService.getState().pathname)) { locationService.setPathname("/"); } diff --git a/web/src/helpers/filter.ts b/web/src/helpers/filter.ts index 68d1ca7c..9c6d985c 100644 --- a/web/src/helpers/filter.ts +++ b/web/src/helpers/filter.ts @@ -119,7 +119,21 @@ export const checkShouldShowMemo = (memo: Model.Memo, filter: Filter) => { let shouldShow = true; if (type === "TAG") { - let contained = memo.content.includes(`#${value} `) || memo.content.includes(`# ${value} `); + let contained = true; + const tagsSet = new Set(); + for (const t of Array.from(memo.content.match(TAG_REG) ?? [])) { + const tag = t.replace(TAG_REG, "$1").trim(); + const items = tag.split("/"); + let temp = ""; + for (const i of items) { + temp += i; + tagsSet.add(temp); + temp += "/"; + } + } + if (!tagsSet.has(value)) { + contained = false; + } if (operator === "NOT_CONTAIN") { contained = !contained; } diff --git a/web/src/pages/MemoTrash.tsx b/web/src/pages/MemoTrash.tsx index c54d6548..43b6e7a7 100644 --- a/web/src/pages/MemoTrash.tsx +++ b/web/src/pages/MemoTrash.tsx @@ -37,8 +37,21 @@ const MemoTrash: React.FC = () => { } } - if (tagQuery && !memo.content.includes(`# ${tagQuery}`)) { - shouldShow = false; + if (tagQuery) { + const tagsSet = new Set(); + for (const t of Array.from(memo.content.match(TAG_REG) ?? [])) { + const tag = t.replace(TAG_REG, "$1").trim(); + const items = tag.split("/"); + let temp = ""; + for (const i of items) { + temp += i; + tagsSet.add(temp); + temp += "/"; + } + } + if (!tagsSet.has(tagQuery)) { + shouldShow = false; + } } if ( duration &&