@@ -56,9 +56,6 @@ import { openBlockInSidebar, createBlock } from "roamjs-components/writes";
5656import getPageTitleByPageUid from "roamjs-components/queries/getPageTitleByPageUid" ;
5757import getPageUidByPageTitle from "roamjs-components/queries/getPageUidByPageTitle" ;
5858import findDiscourseNode from "~/utils/findDiscourseNode" ;
59- import getDiscourseNodes , {
60- excludeDefaultNodes ,
61- } from "~/utils/getDiscourseNodes" ;
6259import calcCanvasNodeSizeAndImg from "~/utils/calcCanvasNodeSizeAndImg" ;
6360import { useExtensionAPI } from "roamjs-components/components/ExtensionApiContext" ;
6461import { getDiscourseNodeColors } from "~/utils/getDiscourseNodeColors" ;
@@ -432,13 +429,15 @@ const ClipboardPageSection = ({
432429 searchQuery,
433430 sortDirection,
434431 selectedNodeType,
432+ onNodeTypesChange,
435433} : {
436434 page : ClipboardPage ;
437435 onRemove : ( uid : string ) => void ;
438436 showNodesOnCanvas : boolean ;
439437 searchQuery : string ;
440438 sortDirection : "asc" | "desc" ;
441439 selectedNodeType : string ;
440+ onNodeTypesChange : ( pageUid : string , types : string [ ] ) => void ;
442441} ) => {
443442 const [ isOpen , setIsOpen ] = useState ( true ) ;
444443 const [ discourseNodes , setDiscourseNodes ] = useState <
@@ -591,6 +590,14 @@ const ClipboardPageSection = ({
591590 ] ,
592591 ) ;
593592
593+ useEffect ( ( ) => {
594+ const candidateNodes = showNodesOnCanvas
595+ ? groupedNodes
596+ : groupedNodes . filter ( ( n ) => n . shapes . length === 0 ) ;
597+ const types = [ ...new Set ( candidateNodes . map ( ( n ) => n . type ) ) ] ;
598+ onNodeTypesChange ( page . uid , types ) ;
599+ } , [ groupedNodes , page . uid , onNodeTypesChange , showNodesOnCanvas ] ) ;
600+
594601 useEffect ( ( ) => {
595602 setOpenSections ( ( prev ) => {
596603 const next : Record < string , boolean > = { } ;
@@ -1132,11 +1139,32 @@ export const ClipboardPanel = () => {
11321139 const [ isSearchExpanded , setIsSearchExpanded ] = useState ( false ) ;
11331140 const [ sortDirection , setSortDirection ] = useState < "asc" | "desc" > ( "asc" ) ;
11341141 const [ selectedNodeType , setSelectedNodeType ] = useState ( "All" ) ;
1142+ const [ nodeTypesByPage , setNodeTypesByPage ] = useState <
1143+ Record < string , string [ ] >
1144+ > ( { } ) ;
1145+
1146+ const handleNodeTypesChange = useCallback (
1147+ ( pageUid : string , types : string [ ] ) => {
1148+ setNodeTypesByPage ( ( prev ) => ( { ...prev , [ pageUid ] : types } ) ) ;
1149+ } ,
1150+ [ ] ,
1151+ ) ;
11351152
11361153 const availableNodeTypes = useMemo ( ( ) => {
1137- const types = getDiscourseNodes ( ) . filter ( excludeDefaultNodes ) ;
1138- return [ "All" , ...types . map ( ( t ) => t . text ) ] ;
1139- } , [ ] ) ;
1154+ const pageUids = new Set ( pages . map ( ( p ) => p . uid ) ) ;
1155+ const allTypes = new Set (
1156+ Object . entries ( nodeTypesByPage )
1157+ . filter ( ( [ uid ] ) => pageUids . has ( uid ) )
1158+ . flatMap ( ( [ , types ] ) => types ) ,
1159+ ) ;
1160+ return [ "All" , ...Array . from ( allTypes ) . sort ( ) ] ;
1161+ } , [ nodeTypesByPage , pages ] ) ;
1162+
1163+ useEffect ( ( ) => {
1164+ if ( selectedNodeType !== "All" && ! availableNodeTypes . includes ( selectedNodeType ) ) {
1165+ setSelectedNodeType ( "All" ) ;
1166+ }
1167+ } , [ availableNodeTypes , selectedNodeType ] ) ;
11401168
11411169 const hasActiveFilters = ! ! searchQuery || selectedNodeType !== "All" ;
11421170
@@ -1330,6 +1358,7 @@ export const ClipboardPanel = () => {
13301358 searchQuery = { searchQuery }
13311359 sortDirection = { sortDirection }
13321360 selectedNodeType = { selectedNodeType }
1361+ onNodeTypesChange = { handleNodeTypesChange }
13331362 />
13341363 ) ) }
13351364 </ div >
0 commit comments