@@ -47,6 +47,7 @@ const ALL_COLUMN_IDS = ['name', 'type', 'description', 'version', 'tags', 'tools
4747type ColumnId = ( typeof ALL_COLUMN_IDS ) [ number ] ;
4848
4949const COLUMN_VISIBILITY_STORAGE_KEY = 'atk.browse.columnVisibility' ;
50+ const SHOW_ORG_SCOPED_STORAGE_KEY = 'atk.browse.showOrgScoped' ;
5051
5152interface BrowseCardListProps {
5253 isDownloading : ( ref : { name : string ; org ?: string ; type : AssetType ; version : string } ) => boolean ;
@@ -95,6 +96,15 @@ export function BrowseRoute() {
9596 }
9697 } , [ columnVisibility ] ) ;
9798
99+ const [ showOrgScoped , setShowOrgScoped ] = useState < boolean > ( loadShowOrgScoped ) ;
100+ useEffect ( ( ) => {
101+ try {
102+ window . localStorage . setItem ( SHOW_ORG_SCOPED_STORAGE_KEY , JSON . stringify ( showOrgScoped ) ) ;
103+ } catch {
104+ /* ignore persistence errors */
105+ }
106+ } , [ showOrgScoped ] ) ;
107+
98108 const assets = useMemo < RegistryAsset [ ] > ( ( ) => data ?. assets ?? [ ] , [ data ] ) ;
99109
100110 const { allOrgs, allTags, allTools } = useMemo ( ( ) => {
@@ -116,6 +126,7 @@ export function BrowseRoute() {
116126
117127 const rows = useMemo < BrowseRow [ ] > ( ( ) => {
118128 const filtered = assets . filter ( ( asset ) => {
129+ if ( ! showOrgScoped && orgFilter . size === 0 && asset . org ) return false ;
119130 if ( typeFilter . size > 0 && ! typeFilter . has ( asset . type ) ) return false ;
120131 if ( tagFilter . size > 0 && ! asset . tags . some ( ( t ) => tagFilter . has ( t ) ) ) return false ;
121132 const latest = asset . versions [ asset . latest ] ;
@@ -135,7 +146,7 @@ export function BrowseRoute() {
135146 }
136147
137148 return ordered . map ( toRow ) ;
138- } , [ assets , typeFilter , tagFilter , toolFilter , orgFilter , search ] ) ;
149+ } , [ assets , typeFilter , tagFilter , toolFilter , orgFilter , search , showOrgScoped ] ) ;
139150
140151 const columns = useMemo < ColumnDef < BrowseRow > [ ] > (
141152 ( ) => [
@@ -322,6 +333,18 @@ export function BrowseRoute() {
322333 options = { allOrgs }
323334 selected = { orgFilter }
324335 />
336+ < label
337+ className = 'flex cursor-pointer items-center gap-2 rounded-md border border-input bg-transparent px-3 py-1.5 text-sm text-foreground hover:border-primary/60 hover:bg-accent'
338+ htmlFor = 'toggle-show-org-scoped'
339+ >
340+ < Checkbox
341+ checked = { showOrgScoped }
342+ data-testid = 'toggle-show-org-scoped'
343+ id = 'toggle-show-org-scoped'
344+ onChange = { ( event ) => setShowOrgScoped ( event . target . checked ) }
345+ />
346+ < span > Show org-scoped assets</ span >
347+ </ label >
325348 { hasActiveFilters ? (
326349 < Button
327350 className = 'ml-auto'
@@ -647,6 +670,18 @@ function loadColumnVisibility(): VisibilityState {
647670 }
648671}
649672
673+ function loadShowOrgScoped ( ) : boolean {
674+ if ( typeof window === 'undefined' ) return false ;
675+ try {
676+ const raw = window . localStorage . getItem ( SHOW_ORG_SCOPED_STORAGE_KEY ) ;
677+ if ( raw === null ) return false ;
678+ const parsed : unknown = JSON . parse ( raw ) ;
679+ return typeof parsed === 'boolean' ? parsed : false ;
680+ } catch {
681+ return false ;
682+ }
683+ }
684+
650685function parseSort ( value : string ) : SortingState {
651686 if ( ! value ) return [ ] ;
652687 const [ id , dir ] = value . split ( ':' ) ;
0 commit comments