From 17f977aaee0baa6c454ee50a11b1f9089e75735c Mon Sep 17 00:00:00 2001 From: max-debug022 Date: Mon, 13 Nov 2023 17:05:37 +0100 Subject: [PATCH] Add the possibility to search for a path. (#1154) This change adds the possibility to search for page-paths. The matches are highlighted in the same way as RegEx-Textsearch matches, which means there is possibly more than one match per page in the page search. In addition, when searching for a path, the page-tree-row shows the matching path. --- .changeset/sour-cheetahs-relax.md | 5 +++++ .../src/pages/pageSearch/usePageSearch.ts | 19 +++++++++++++++++-- .../src/pages/pageTree/PageLabel.tsx | 10 ++++++++-- 3 files changed, 30 insertions(+), 4 deletions(-) create mode 100644 .changeset/sour-cheetahs-relax.md diff --git a/.changeset/sour-cheetahs-relax.md b/.changeset/sour-cheetahs-relax.md new file mode 100644 index 0000000000..f007181338 --- /dev/null +++ b/.changeset/sour-cheetahs-relax.md @@ -0,0 +1,5 @@ +--- +"@comet/cms-admin": minor +--- + +Add the possibility to search for a path in PageSearch diff --git a/packages/admin/cms-admin/src/pages/pageSearch/usePageSearch.ts b/packages/admin/cms-admin/src/pages/pageSearch/usePageSearch.ts index 3315f6543f..0fd5cf3b27 100644 --- a/packages/admin/cms-admin/src/pages/pageSearch/usePageSearch.ts +++ b/packages/admin/cms-admin/src/pages/pageSearch/usePageSearch.ts @@ -6,7 +6,7 @@ import { TextMatch } from "../../common/MarkedMatches"; import { GQLPageSearchFragment } from "../../graphql.generated"; import { PageTreePage } from "../pageTree/usePageTree"; -export type PageSearchMatch = TextMatch & { page: { id: string; ancestorIds: string[] } }; +export type PageSearchMatch = TextMatch & { page: { id: string; ancestorIds: string[] }; where: "name" | "path" }; export const pageSearchFragment = gql` fragment PageSearch on PageTreeNode { @@ -102,7 +102,7 @@ const usePageSearch = ({ tree, domain, setExpandedIds, onUpdateCurrentMatch, pag if (pageExactMatch) { const { id, name, ancestorIds } = pageExactMatch; - matches.push({ page: { id, ancestorIds }, start: 0, end: name.length - 1, focused: true }); + matches.push({ page: { id, ancestorIds }, start: 0, end: name.length - 1, focused: true, where: "name" }); } } catch { const regex = new RegExp(`(${escapeRegExp(query)})`, "gi"); @@ -110,13 +110,28 @@ const usePageSearch = ({ tree, domain, setExpandedIds, onUpdateCurrentMatch, pag inorderPages.forEach((page) => { let match; + while ((match = regex.exec(page.path)) !== null) { + const { id, ancestorIds } = page; + const where = "path"; + matches.push({ + page: { id, ancestorIds }, + start: match.index, + end: match.index + query.length - 1, + focused: matches.length === 0, + where, + }); + } + regex.lastIndex = 0; + while ((match = regex.exec(page.name)) !== null) { const { id, ancestorIds } = page; + const where = "name"; matches.push({ page: { id, ancestorIds }, start: match.index, end: match.index + query.length - 1, focused: matches.length === 0, + where, }); } }); diff --git a/packages/admin/cms-admin/src/pages/pageTree/PageLabel.tsx b/packages/admin/cms-admin/src/pages/pageTree/PageLabel.tsx index d84c9f94fa..523b51f3bb 100644 --- a/packages/admin/cms-admin/src/pages/pageTree/PageLabel.tsx +++ b/packages/admin/cms-admin/src/pages/pageTree/PageLabel.tsx @@ -17,14 +17,20 @@ interface PageLabelProps { const PageLabel: React.FunctionComponent = ({ page, disabled, onClick }) => { const { documentTypes } = usePageTreeContext(); const documentType = documentTypes[page.documentType]; + const pathMatches = page.matches.filter((match) => match.where === "path"); return ( - + match.where === "name")} /> + {pathMatches.length > 0 && ( + + + + )} {page.visibility === "Archived" && ( = ({ page, disabled, on /> )} - {documentType.InfoTag !== undefined && ( @@ -60,6 +65,7 @@ const LinkContent = styled("div")` margin-left: ${({ theme }) => theme.spacing(2)}; display: flex; min-width: 0; + flex-direction: column; `; const LinkText = styled(Typography)`