fix: tag query filter

This commit is contained in:
email 2022-01-12 20:52:04 +08:00
parent 308adef98d
commit 6a40be9f8e
4 changed files with 51 additions and 11 deletions

@ -19,23 +19,36 @@ const MemoList: React.FC<Props> = () => {
const wrapperElement = useRef<HTMLDivElement>(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<string>();
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 &&

@ -100,7 +100,7 @@ const TagItemContainer: React.FC<TagItemContainerProps> = (props: TagItemContain
if (isActive) {
locationService.setTagQuery("");
} else {
utils.copyTextToClipboard(`# ${tag.text} `);
utils.copyTextToClipboard(`#${tag.text} `);
if (!["/", "/recycle"].includes(locationService.getState().pathname)) {
locationService.setPathname("/");
}

@ -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<string>();
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;
}

@ -37,8 +37,21 @@ const MemoTrash: React.FC<Props> = () => {
}
}
if (tagQuery && !memo.content.includes(`# ${tagQuery}`)) {
shouldShow = false;
if (tagQuery) {
const tagsSet = new Set<string>();
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 &&