@@ -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 > = { } ;
@@ -1133,11 +1140,32 @@ export const ClipboardPanel = () => {
11331140 const [ isSearchExpanded , setIsSearchExpanded ] = useState ( false ) ;
11341141 const [ sortDirection , setSortDirection ] = useState < "asc" | "desc" > ( "asc" ) ;
11351142 const [ selectedNodeType , setSelectedNodeType ] = useState ( "All" ) ;
1143+ const [ nodeTypesByPage , setNodeTypesByPage ] = useState <
1144+ Record < string , string [ ] >
1145+ > ( { } ) ;
1146+
1147+ const handleNodeTypesChange = useCallback (
1148+ ( pageUid : string , types : string [ ] ) => {
1149+ setNodeTypesByPage ( ( prev ) => ( { ...prev , [ pageUid ] : types } ) ) ;
1150+ } ,
1151+ [ ] ,
1152+ ) ;
11361153
11371154 const availableNodeTypes = useMemo ( ( ) => {
1138- const types = getDiscourseNodes ( ) . filter ( excludeDefaultNodes ) ;
1139- return [ "All" , ...types . map ( ( t ) => t . text ) ] ;
1140- } , [ ] ) ;
1155+ const pageUids = new Set ( pages . map ( ( p ) => p . uid ) ) ;
1156+ const allTypes = new Set (
1157+ Object . entries ( nodeTypesByPage )
1158+ . filter ( ( [ uid ] ) => pageUids . has ( uid ) )
1159+ . flatMap ( ( [ , types ] ) => types ) ,
1160+ ) ;
1161+ return [ "All" , ...Array . from ( allTypes ) . sort ( ) ] ;
1162+ } , [ nodeTypesByPage , pages ] ) ;
1163+
1164+ useEffect ( ( ) => {
1165+ if ( selectedNodeType !== "All" && ! availableNodeTypes . includes ( selectedNodeType ) ) {
1166+ setSelectedNodeType ( "All" ) ;
1167+ }
1168+ } , [ availableNodeTypes , selectedNodeType ] ) ;
11411169
11421170 const hasActiveFilters = ! ! searchQuery || selectedNodeType !== "All" ;
11431171
@@ -1331,6 +1359,7 @@ export const ClipboardPanel = () => {
13311359 searchQuery = { searchQuery }
13321360 sortDirection = { sortDirection }
13331361 selectedNodeType = { selectedNodeType }
1362+ onNodeTypesChange = { handleNodeTypesChange }
13341363 />
13351364 ) ) }
13361365 </ div >
0 commit comments