diff --git a/src/components/Admin/User/AdminUserList/AdminUserList.js b/src/components/Admin/User/AdminUserList/AdminUserList.js index 6a64ace5..495ef998 100644 --- a/src/components/Admin/User/AdminUserList/AdminUserList.js +++ b/src/components/Admin/User/AdminUserList/AdminUserList.js @@ -92,7 +92,7 @@ const AdminUserList = (props) => { SortIcon={SortIcon} style={{ flex: 13 }} > - Role + Type {user.affiliation} - Type + Role diff --git a/src/components/AnnotationCard/AnnotationCard.js b/src/components/AnnotationCard/AnnotationCard.js index 38cad955..4461adaa 100644 --- a/src/components/AnnotationCard/AnnotationCard.js +++ b/src/components/AnnotationCard/AnnotationCard.js @@ -533,6 +533,7 @@ function AnnotationCard({ channelAnnos[side] = [{ ...annotationData, permissions: { ...newPermissions } }]; const ids = FilterAnnotations(channelAnnos, { annotatedBy: documentFilters.filters.annotatedBy.map((opt) => opt.email), + byGroup: (documentFilters.filters.byGroup || []).map((opt) => opt.id), byTags: documentFilters.filters.byTags.map((opt) => opt.name), permissions: documentFilters.filters.permissions, }); diff --git a/src/components/CreateEditDocument/CreateEditDocument.js b/src/components/CreateEditDocument/CreateEditDocument.js index e4eea955..e343444a 100644 --- a/src/components/CreateEditDocument/CreateEditDocument.js +++ b/src/components/CreateEditDocument/CreateEditDocument.js @@ -379,6 +379,7 @@ const CreateEditDocument = ({ const resourceTypeAdditionalMetadata = resourceTypeMetadataObj(rt); const newDocument = { + version: 4, uploadContentType: htmlValue ? contentType : 'text/slate-html', fileObj, title: title === '' ? (fileName || 'Untitled') : title, @@ -417,6 +418,7 @@ const CreateEditDocument = ({ const patchUrl = `/api/document/${document.id}`; const resourceTypeAdditionalMetadata = resourceTypeMetadataObj(rt); const newDocument = { + version: document.version, title: title === '' ? 'Untitled' : title, groups: orderOfGroupsShared.core.concat(orderOfGroupsShared.contributions), slug: document.slug, diff --git a/src/components/DashboardChannels/AnnotationTile.js b/src/components/DashboardChannels/AnnotationTile.js index 153ba800..0c924921 100644 --- a/src/components/DashboardChannels/AnnotationTile.js +++ b/src/components/DashboardChannels/AnnotationTile.js @@ -15,7 +15,7 @@ export default function AnnotationTile({ activityDate, draggable, tags, - maxNumberOfAnnotationTags = 3, + maxNumberOfAnnotationTags = 1, onClick = () => {}, onDelete, openInAnnotationStudio, @@ -40,8 +40,7 @@ export default function AnnotationTile({ if (tags.length > maxNumberOfAnnotationTags) { tileBadges = [ , - , - , + , ]; } else { tileBadges = tags.map((t, i) => 0 ? 5 : 0} />); diff --git a/src/components/DashboardChannels/AnnotationsChannel.js b/src/components/DashboardChannels/AnnotationsChannel.js index 0da9e219..2cd181b1 100644 --- a/src/components/DashboardChannels/AnnotationsChannel.js +++ b/src/components/DashboardChannels/AnnotationsChannel.js @@ -232,13 +232,16 @@ export default function AnnotationsChannel({ byDateCreated: , }; + const byWithGroupId = (anno) => byGroupFilterMatch(anno?.creator?.withGroupId ? [anno?.creator?.withGroupId] : [], [selectedGroupId]); + const buttons = [ { text: 'Mine', textWidth: 40, - count: annotations[slug]?.countByPermissions === undefined - ? 0 - : annotations[slug]?.countByPermissions.mine, + count: (annotations[slug]?.mine || [])?.filter(byWithGroupId).length || 0, + // count: annotations[slug]?.countByPermissions === undefined + // ? 0 + // : annotations[slug]?.countByPermissions.mine, selected: selectedPermissions === 'mine', onClick: () => { setSelectedPermissions('mine'); }, icon: , @@ -246,9 +249,10 @@ export default function AnnotationsChannel({ { text: 'Shared with group(s)', textWidth: 145, - count: annotations[slug]?.countByPermissions === undefined - ? 0 - : annotations[slug]?.countByPermissions.shared, + count: (annotations[slug]?.shared || [])?.filter(byWithGroupId).length || 0, + // count: annotations[slug]?.countByPermissions === undefined + // ? 0 + // : annotations[slug]?.countByPermissions.shared, selected: selectedPermissions === 'shared', onClick: () => { setSelectedPermissions('shared'); }, icon: , @@ -256,9 +260,10 @@ export default function AnnotationsChannel({ { text: 'Shared with me', textWidth: 115, - count: annotations[slug]?.countByPermissions === undefined - ? 0 - : annotations[slug]?.countByPermissions['shared-with-me'], + count: (annotations[slug] && (annotations[slug]['shared-with-me'] || [])?.filter(byWithGroupId).length) || 0, + // count: annotations[slug]?.countByPermissions === undefined + // ? 0 + // : annotations[slug]?.countByPermissions['shared-with-me'], selected: selectedPermissions === 'shared-with-me', onClick: () => { setSelectedPermissions('shared-with-me'); }, icon: , @@ -305,18 +310,23 @@ export default function AnnotationsChannel({ }; const filterAnnotations = (f) => { - const annotationMatchesFilters = (a) => ( + const annotationMatchesFilters = (a) => { + + return ( byPermissionsIdeaSpaceFilterMatch({ user: session.user, annotation: a, filterPermissions: f.byPermissions, }) - && byGroupFilterMatch(a.target.document.groups, f.byGroup) + && (mode === 'as' + ? byGroupFilterMatch(a.creator.withGroupId ? [a.creator.withGroupId] : [], [selectedGroupId]) + : byGroupFilterMatch(a.target.document.groups, f.byGroup) + ) && byDocumentFilterMatch(a.target.document.id, f.byDocument) && annotatedByFilterMatch(a.creator.id, f.annotatedBy) && byTagFilterMatch(a.body.tags, f.byTag) && byDateCreatedFilterMatch(a.created, f.byDateCreated) - ); + )}; const filteredAnnos = []; if (appliedFilters.byGroup.length === 0) { @@ -1284,25 +1294,27 @@ export default function AnnotationsChannel({ annotationTiles = ; } else if (annotations[slug] === undefined) { annotationTiles = ; - } else if (annotations[slug][selectedPermissions].length === 0) { + } else if (annotations[slug][selectedPermissions].filter(byWithGroupId).length === 0) { annotationTiles = ; } else { rawAnnotationTiles = annotations[slug][selectedPermissions]; + const byGroupRawAnnotationTiles = rawAnnotationTiles.filter(byWithGroupId) + if (selectedPermissions === 'mine') { - annotationTiles = rawAnnotationTiles.map((anno) => toAnnotationsTile(anno, { + annotationTiles = byGroupRawAnnotationTiles.map((anno) => toAnnotationsTile(anno, { maxNumberOfTags: maxNumberOfAnnotationTags, shareableLink: `${origin}/documents/${anno.target.document.slug}?mine=true&aid=${anno._id}`, setAlerts, })); } else if (selectedPermissions === 'shared') { - annotationTiles = rawAnnotationTiles.map((anno) => toAnnotationsTile(anno, { + annotationTiles = byGroupRawAnnotationTiles.map((anno) => toAnnotationsTile(anno, { maxNumberOfTags: maxNumberOfAnnotationTags, shareableLink: `${origin}/documents/${anno.target.document.slug}?mine=false&aid=${anno._id}`, setAlerts, })); } else if (selectedPermissions === 'shared-with-me') { - annotationTiles = rawAnnotationTiles.map((anno) => toAnnotationsTile(anno, { + annotationTiles = byGroupRawAnnotationTiles.map((anno) => toAnnotationsTile(anno, { maxNumberOfTags: maxNumberOfAnnotationTags, shareableLink: `${origin}/documents/${anno.target.document.slug}?mine=false&&sharedWithMe=true&aid=${anno._id}`, setAlerts, diff --git a/src/components/DashboardChannels/DocumentTile.js b/src/components/DashboardChannels/DocumentTile.js index dc99a3c9..c3497f04 100644 --- a/src/components/DashboardChannels/DocumentTile.js +++ b/src/components/DashboardChannels/DocumentTile.js @@ -43,7 +43,6 @@ export default function DocumentTile({ const g = groups.slice(); if (g.length > 0) { - console.log('groups: ', groups) const indexOfSelectedGroup = groups.findIndex((grp) => grp?._id === selectedGroupId); const selectedGroup = g.splice(indexOfSelectedGroup, 1)[0]; tileBadges = [ @@ -82,7 +81,7 @@ export default function DocumentTile({ )} color="grey" - text={`+${g.length} more`} + text={`+${g.length}`} marginLeft={5} />); } else { diff --git a/src/components/DashboardChannels/DocumentsChannel.js b/src/components/DashboardChannels/DocumentsChannel.js index 32eacabc..39804270 100644 --- a/src/components/DashboardChannels/DocumentsChannel.js +++ b/src/components/DashboardChannels/DocumentsChannel.js @@ -39,7 +39,7 @@ export default function DocumentsChannel({ documentPermissions, setDocumentPermissions, groupMembers, - maxNumberOfDocumentGroups = 3, + maxNumberOfDocumentGroups = 1, dashboardState, retry, setRetry, diff --git a/src/components/Document/Document.js b/src/components/Document/Document.js index 064d5b06..0a98f9c6 100644 --- a/src/components/Document/Document.js +++ b/src/components/Document/Document.js @@ -101,6 +101,7 @@ export default function Document({ displayAnnotationsInChannels, setAlerts, setShowCannotAnnotateDocumentToast, + defaultGroupFilteringId, }) { const myRef = useRef(); const documentZoomRef = useRef(documentZoom); @@ -291,6 +292,7 @@ export default function Document({ id: user.id, name: user.name, email: user.email, + withGroupId: defaultGroupFilteringId, }, permissions: { groups: [], diff --git a/src/components/FilterPopover/FilterPopover.js b/src/components/FilterPopover/FilterPopover.js index 8fcbc6d8..dfd79e8a 100644 --- a/src/components/FilterPopover/FilterPopover.js +++ b/src/components/FilterPopover/FilterPopover.js @@ -50,6 +50,8 @@ function FilterPopover({ session }) { setDocumentFilters, FilterAnnotations, documentGroupNameMapping, + defaultGroupFilteringId, + defaultGroupFilteringIdSelected, ] = useContext(DocumentFiltersContext); const [byTagsTypeheadMarginTop, setByTagsTypeheadMarginTop] = useState(0); @@ -105,10 +107,9 @@ function FilterPopover({ session }) { // OR filter const GetNumberOfMatchesForThisGroup = (annotations, currentFilters, filterGroupId) => { - const f = Object.assign(DeepCopyObj(currentFilters), { byGroup: [filterEmail] }); - // console.log('annotations: ', annotations) - // const ids = FilterAnnotations(annotations, f); - // return ids.left.length + ids.right.length; + const f = Object.assign(DeepCopyObj(currentFilters), { byGroup: [filterGroupId] }); + const ids = FilterAnnotations(annotations, f); + return ids.left.length + ids.right.length; }; // OR filter @@ -178,22 +179,51 @@ function FilterPopover({ session }) { matches: GetNumberOfMatchesForThisTag(annotations, filters, tag), }); } + + // third we will add this annotions byGroup + // take these new tags and map them into an object + // and add them to the existing list of byTags array + index = a.creator.withGroupId === undefined ? 0 : filterOptions.byGroup.findIndex((opt) => opt.id === a.creator.withGroupId); + if (index === -1) { + filterOptions.byGroup.push({ + id: a.creator.withGroupId, + name: documentGroupNameMapping.idToName[a.creator.withGroupId], + matches: GetNumberOfMatchesForThisGroup(annotations, filters, a.creator.withGroupId), + }); + } } } } + // we need to check if there are byGroup ids that were not accounted for because there are not annotations that are annotated with the group + const accountedForGroupIds = filterOptions.byGroup.map((opt) => opt.id); + const unaccountedForGroupIds = (documentGroupNameMapping?.array || []).filter((opt) => !accountedForGroupIds.includes(opt._id)) + unaccountedForGroupIds.map(({ _id, name }) => { + + filterOptions.byGroup.push({ + id: _id, + name: name, + matches: 0 + }); + + return null; + }) + return filterOptions; }; const f = { annotatedBy: documentFilters.filters.annotatedBy.map((opt) => opt.email), + byGroup: (documentFilters.filters.byGroup || []).map((opt) => opt.id), byTags: documentFilters.filters.byTags.map((opt) => opt.id), permissions: documentFilters.filters.permissions, }; const filterOptions = GenerateFilterOptions(session.user.email, channelAnnotations, f); + console.log('filterOptions: ', filterOptions) + const numberOfMatchesForNoTag = GetNumberOfMatchesForNoTag(channelAnnotations, f); const noTagText = `${numberOfMatchesForNoTag} annotation${numberOfMatchesForNoTag === 1 ? '' : 's'} with no tags`; @@ -210,11 +240,28 @@ function FilterPopover({ session }) { return Object.assign(s, { matches: m }); }); + useEffect(() => { + console.log('defaultGroupFilteringIdSelected: ', defaultGroupFilteringIdSelected) + if (!defaultGroupFilteringIdSelected) return; + + console.log('defaultGroupFilteringId: ', defaultGroupFilteringId) + + console.log('filterOptions.byGroup: ', filterOptions.byGroup) + + const selected = filterOptions.byGroup.find(({ id }) => id === defaultGroupFilteringId) + console.log('selected: ', selected) + if (selected) { + updateFilters('byGroup', [selected]) + } + }, [defaultGroupFilteringIdSelected]) + useEffect(() => { if (documentFilters.filterOnInit && documentFilters.annotationsLoaded) { const FilterOnInit = () => { + const annotationIds = FilterAnnotations(channelAnnotations, { annotatedBy: documentFilters.filters.annotatedBy.map((opt) => opt.email), + byGroup: (documentFilters.filters.byGroup || []).map((opt) => opt.id), byTags: documentFilters.filters.byTags.map((opt) => opt.name), permissions: documentFilters.filters.permissions, }); @@ -230,11 +277,12 @@ function FilterPopover({ session }) { }, [documentFilters]); const updateFilters = (type, selected) => { - + console.log('selected: ', selected) documentFilters.filters[type] = selected; const annotationIds = FilterAnnotations(channelAnnotations, { annotatedBy: documentFilters.filters.annotatedBy.map((opt) => opt.email), + byGroup: (documentFilters.filters.byGroup || []).map((opt) => opt.id), byTags: documentFilters.filters.byTags.map((opt) => opt.id), permissions: documentFilters.filters.permissions, }); @@ -323,42 +371,39 @@ function FilterPopover({ session }) { By Group { updateFilters('annotatedBy', selected); }} + UpdateSelectedTokensMatchesValue( + 'byGroup', + DeepCopyObj(documentFilters.filters.byGroup), + ) + } + onChange={(selected) => { updateFilters('byGroup', selected); }} onMenuToggle={(isOpen) => { if (isOpen) { - setByTagsTypeheadMarginTop($('#typehead-annotated-by').height() + 10); + setByTagsTypeheadMarginTop($('#typehead-by-group').height() + 10); } else { setByTagsTypeheadMarginTop(0); } }} onInputChange={() => { - setByTagsTypeheadMarginTop($('#typehead-annotated-by').height() + 10); + setByTagsTypeheadMarginTop($('#typehead-by-group').height() + 10); }} - options={filterOptions.annotatedBy} + options={filterOptions.byGroup} placeholder="Select one or more groups to filter by" /> - {byUserDisabled && ( - {`Coming soon! ${documentGroupNameMapping?.array?.length > 0 - ? 'This option will be enabled once it\'s fully implemented' - : 'This option is only enabled if this document is shared to multiple groups'}` + {defaultGroupFilteringIdSelected + ? '' : 'This option is only enabled for v4 and higher documnents (updated 10/06/2023)' } - )} @@ -486,7 +531,8 @@ function FilterPopover({ session }) { const filterActive = (documentFilters.filters.annotatedBy.length - + documentFilters.filters.byTags.length > 0); + + documentFilters.filters.byGroup.length + + documentFilters.filters.byTags.length > 0); const buttons = [ { @@ -614,8 +660,9 @@ function FilterPopover({ session }) { } #filter-popover { - max-width: 30vw; - width: 30vw; + max-width: 20vw; + width: 20vw; + min-width: 385px; } #filter-popover .card { diff --git a/src/components/TextAnalysisPopover/TextAnalysisPopover.js b/src/components/TextAnalysisPopover/TextAnalysisPopover.js index 4e8a5aca..e5abcfd7 100644 --- a/src/components/TextAnalysisPopover/TextAnalysisPopover.js +++ b/src/components/TextAnalysisPopover/TextAnalysisPopover.js @@ -159,8 +159,9 @@ function TextAnalysisPopover({ textAnalysisData, loadingTextAnalysisData, getTex } #filter-popover { - max-width: 30vw; - width: 30vw; + max-width: 20vw; + width: 20vw; + min-width: 385px; } #filter-popover .card { diff --git a/src/pages/api/document/[id].js b/src/pages/api/document/[id].js index 6578dfa9..5476f905 100644 --- a/src/pages/api/document/[id].js +++ b/src/pages/api/document/[id].js @@ -25,6 +25,7 @@ const handler = async (req, res) => { if (doc[0]) { const document = doc[0]; const { + version, title, slug, owner, @@ -60,6 +61,7 @@ const handler = async (req, res) => { textAnalysisId, } = document; res.status(200).json({ + version, title, slug, owner, @@ -100,6 +102,7 @@ const handler = async (req, res) => { const token = await getToken({ req, secret }); if (token && token.exp > 0) { const { + version, title, groups, slug, @@ -130,6 +133,7 @@ const handler = async (req, res) => { textAnalysisId, } = req.body; const fieldsToSet = { + version, title, groups, slug, diff --git a/src/pages/api/document/index.js b/src/pages/api/document/index.js index ce1c2dc7..c76e4c53 100644 --- a/src/pages/api/document/index.js +++ b/src/pages/api/document/index.js @@ -13,6 +13,7 @@ const handler = async (req, res) => { let { groups } = req.body; groups = groups ? groups.filter((group) => group !== '') : {}; const { + version, title, slug, resourceType, @@ -43,6 +44,7 @@ const handler = async (req, res) => { textAnalysisId, } = req.body; const metadata = { + version, title, slug, groups, diff --git a/src/pages/api/document/slug/[slug].js b/src/pages/api/document/slug/[slug].js index a1696691..74e9f53e 100644 --- a/src/pages/api/document/slug/[slug].js +++ b/src/pages/api/document/slug/[slug].js @@ -25,6 +25,7 @@ const handler = async (req, res) => { if (doc[0]) { const document = doc[0]; const { + version, _id, title, owner, @@ -59,6 +60,7 @@ const handler = async (req, res) => { textAnalysisId, } = document; res.status(200).json({ + version, id: _id, title, owner, diff --git a/src/pages/api/search/documents/index.js b/src/pages/api/search/documents/index.js index f3e4161c..52e17006 100644 --- a/src/pages/api/search/documents/index.js +++ b/src/pages/api/search/documents/index.js @@ -16,12 +16,12 @@ const handler = async (req, res) => { // eslint-disable-next-line no-useless-escape const r = query ? new RegExp(`\.\*${escapeRegExp(query)}\.\*`, 'i') : new RegExp('\.\*', 'i'); - let ownerCondition = condition.permissions === 'mine' ? { owner: token.sub } : {}; + let ownerCondition = condition?.permissions === 'mine' ? { owner: token.sub } : {}; if (condition?.groupOwnersAndManagers) { - const obj = { $in: condition.groupOwnersAndManagers }; - if (condition.permissions === 'core-documents') { + const obj = { $in: condition?.groupOwnersAndManagers }; + if (condition?.permissions === 'core-documents') { ownerCondition = { owner: obj }; - } else if (condition.permissions === 'shared') { + } else if (condition?.permissions === 'shared') { ownerCondition = { owner: { $not: obj } }; } } diff --git a/src/pages/documents/[slug]/index.jsx b/src/pages/documents/[slug]/index.jsx index fd3b8560..d18abba6 100644 --- a/src/pages/documents/[slug]/index.jsx +++ b/src/pages/documents/[slug]/index.jsx @@ -7,6 +7,7 @@ import { useState, useEffect, useRef } from 'react'; import { useSession } from 'next-auth/react'; import $ from 'jquery'; import { + Button, Modal, ProgressBar, Toast, @@ -39,7 +40,7 @@ import AnnotationsOverlay from '../../../components/AnnotationsOverlay'; import UnsavedChangesToast from '../../../components/UnsavedChangesToast/UnsavedChangesToast'; import adjustLine, { DeepCopyObj } from '../../../utils/docUIUtils'; import Footer from '../../../components/Footer'; -import { annotatedByFilterMatch, byPermissionsDocumentViewFilterMatch, byTagFilterMatch } from '../../../utils/annotationFilteringUtil'; +import { annotatedByFilterMatch, byGroupFilterMatch, byPermissionsDocumentViewFilterMatch, byTagFilterMatch } from '../../../utils/annotationFilteringUtil'; import MaxedTextLengthToast from '../../../components/MaxedTextLengthToast'; import MaxedAnnotationLengthToast from '../../../components/MaxedAnnotationLengthToast'; import RunTextAnalysisModal from '../../../components/RunTextAnalysisModal'; @@ -60,6 +61,8 @@ const DocumentPage = ({ } } + console.log('document: ', document) + const documentIsPDF = document && document.uploadContentType && document.uploadContentType.includes('pdf'); const focusedAnnotationsRef = useRef({ left: null, right: null }).current; @@ -84,6 +87,9 @@ const DocumentPage = ({ const [groupNameMapping, setGroupNameMapping] = useState(); const [documentTextLoading, setDocumentTextLoading] = useState(true); const [documentLoading, setDocumentLoading] = useState(true); + const [showGroupFilteringModal, setShowGroupFilteringModal] = useState(true); + const [defaultGroupFilteringId, setDefaultGroupFilteringId] = useState(); + const [foundDefaultGroupFilteringId, setFoundDefaultGroupFilteringId] = useState(); const [ initializedDocumentScrollEventListener, setInitializedDocumentScrollEventListener, @@ -181,6 +187,7 @@ const DocumentPage = ({ const AnnotationMatchesFilters = ( userEmail, a, filters, userId, ) => annotatedByFilterMatch(a.creator.email, filters.annotatedBy) + && byGroupFilterMatch(a.creator.withGroupId ? [a.creator.withGroupId] : [], filters.byGroup) && byTagFilterMatch(a.body.tags, filters.byTags) && byPermissionsDocumentViewFilterMatch( userEmail, @@ -652,27 +659,50 @@ const DocumentPage = ({ } }, [annotationChannel1Loaded, annotationChannel2Loaded]); + useEffect(() => { + + if (!annotationChannel1Loaded || !annotationChannel2Loaded || documentLoading) return; + + setShowGroupFilteringModal(true); + + // if all of these are false we can show the group filtering for document modal + }, [annotationChannel1Loaded, annotationChannel2Loaded, documentLoading]) + const cloudfrontUrl = process.env.NEXT_PUBLIC_SIGNING_URL.split('/url')[0]; useEffect(async () => { if (!document) return if (document.groups.length >= 0) { - const groupNamesRes = await getManyGroupNamesById(document.groups); - console.log('groupNamesRes: ', groupNamesRes) + const groupNamesRes = await getManyGroupNamesById(document.groups); const grpNameMapping = { array: groupNamesRes.groups || [], - idToName: {}, - nameToId: {}, + idToName: { + 'personal-group': 'Personal', + }, + nameToId: { + 'Personal': 'personal-group', + }, }; - grpNameMapping.array.map(({ id, name }) => { - grpNameMapping.idToName[id] = name; - grpNameMapping.nameToId[name] = id; + let defaultGrpFilteringId = undefined; + + grpNameMapping.array.map(({ _id, name }) => { + grpNameMapping.idToName[_id] = name; + grpNameMapping.nameToId[name] = _id; + + if (_id === query.gid) { + defaultGrpFilteringId = _id; + } return null; }); + setDefaultGroupFilteringId(defaultGrpFilteringId); + if (defaultGrpFilteringId) { + setFoundDefaultGroupFilteringId(true); + } + setGroupNameMapping(grpNameMapping) } @@ -889,6 +919,8 @@ const DocumentPage = ({ return Document could not be found; } + const defaultGroupFilteringIdSelected = (annotationChannel1Loaded && annotationChannel2Loaded) ? foundDefaultGroupFilteringId || showGroupFilteringModal === null : false; + return ( @@ -908,7 +940,7 @@ const DocumentPage = ({ ]} >