@box/metadata-template-browser 2.3.3 → 2.3.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- import{useBrowserActions,useConsumerState,useNavigationState,useSearchState}from"../esm/lib/contexts/hooks.js";import{messages}from"../esm/lib/components/breadcrumb-navigation/messages.js";import{Breadcrumb}from"@box/blueprint-web";import classNames from"clsx";import{useIntl}from"react-intl";import{jsx}from"react/jsx-runtime";import '../styles/breadcrumb-navigation.css';var breadcrumb_navigation_module_default={breadcrumb:`_breadcrumb_a03s0_1`,disabled:`_disabled_a03s0_6`};function BreadcrumbNavigation(){let{formatMessage}=useIntl(),{isDisabled}=useConsumerState(),{path,namespaceFQN}=useNavigationState(),{searchValue}=useSearchState(),{navigateBack}=useBrowserActions();if(searchValue.length>0)return null;let firstPathEntry=path[0],rootFqn=firstPathEntry?firstPathEntry.fqn.split(`.`).slice(0,-1).join(`.`):namespaceFQN,currentFqn=path.at(-1)?.fqn??namespaceFQN,crumbs=[{id:rootFqn,name:formatMessage(messages.enterpriseCrumbLabel)},...path.map(entry=>({id:entry.fqn,name:entry.displayName}))],handleCrumbClick=id=>{isDisabled||id!==currentFqn&&navigateBack(id)};return jsx(`div`,{className:classNames(breadcrumb_navigation_module_default.breadcrumb,{[breadcrumb_navigation_module_default.disabled]:isDisabled}),children:jsx(Breadcrumb,{breadcrumbAriaLabel:formatMessage(messages.breadcrumbAriaLabel),crumbs,isInteractive:!isDisabled,onPageLinkClick:handleCrumbClick,size:`small`,truncatedLinksIconAriaLabel:formatMessage(messages.truncatedLinksIconAriaLabel)})})}export{BreadcrumbNavigation as t};
1
+ import{useBrowserActions,useConsumerState,useNavigationState,useSearchState}from"../esm/lib/contexts/hooks.js";import{messages}from"../esm/lib/components/breadcrumb-navigation/messages.js";import{Breadcrumb}from"@box/blueprint-web";import classNames from"clsx";import{useIntl}from"react-intl";import{jsx}from"react/jsx-runtime";import '../styles/breadcrumb-navigation.css';var breadcrumb_navigation_module_default={breadcrumb:`_breadcrumb_a03s0_1`,disabled:`_disabled_a03s0_6`};function BreadcrumbNavigation(){let{formatMessage}=useIntl(),{isDisabled,isNamespacesEnabled}=useConsumerState(),{path,namespaceFQN}=useNavigationState(),{searchValue}=useSearchState(),{navigateBack}=useBrowserActions();if(!isNamespacesEnabled||searchValue.length>0)return null;let firstPathEntry=path[0],rootFqn=firstPathEntry?firstPathEntry.fqn.split(`.`).slice(0,-1).join(`.`):namespaceFQN,currentFqn=path.at(-1)?.fqn??namespaceFQN,crumbs=[{id:rootFqn,name:formatMessage(messages.enterpriseCrumbLabel)},...path.map(entry=>({id:entry.fqn,name:entry.displayName}))],handleCrumbClick=id=>{isDisabled||id!==currentFqn&&navigateBack(id)};return jsx(`div`,{className:classNames(breadcrumb_navigation_module_default.breadcrumb,{[breadcrumb_navigation_module_default.disabled]:isDisabled}),children:jsx(Breadcrumb,{breadcrumbAriaLabel:formatMessage(messages.breadcrumbAriaLabel),crumbs,isInteractive:!isDisabled,onPageLinkClick:handleCrumbClick,size:`small`,truncatedLinksIconAriaLabel:formatMessage(messages.truncatedLinksIconAriaLabel)})})}export{BreadcrumbNavigation as t};
@@ -1 +1 @@
1
- import{useConsumerState}from"../esm/lib/contexts/hooks.js";import{EllipsizableText,Tooltip}from"@box/blueprint-web";import classNames from"clsx";import{jsx,jsxs}from"react/jsx-runtime";import{GridListItem}from"react-aria-components";import '../styles/browser-row.css';var browser_row_module_default={row:`_row_1q43q_2`,leadingIcon:`_leadingIcon_1q43q_15`,content:`_content_1q43q_22`,trailingSlotHoverOnly:`_trailingSlotHoverOnly_1q43q_29`,item:`_item_1q43q_33`,disabled:`_disabled_1q43q_54`,applied:`_applied_1q43q_61`,trailingSlot:`_trailingSlot_1q43q_29`,subtitle:`_subtitle_1q43q_90`};function BrowserRow({id,leadingIcon,title,subtitle,trailingSlot,isTrailingSlotHoverOnly,isApplied,tooltipContent}){let{isDisabled}=useConsumerState(),trailingSlotClassName=classNames(browser_row_module_default.trailingSlot,{[browser_row_module_default.trailingSlotHoverOnly]:isTrailingSlotHoverOnly}),rowContent=jsxs(`div`,{className:browser_row_module_default.row,children:[leadingIcon!==void 0&&jsx(`div`,{"aria-hidden":`true`,className:browser_row_module_default.leadingIcon,"data-testid":`leading-icon`,children:leadingIcon}),jsxs(`div`,{className:browser_row_module_default.content,children:[jsx(EllipsizableText,{as:`span`,lineClamp:1,variant:`bodyDefault`,children:title}),subtitle&&jsx(`div`,{className:browser_row_module_default.subtitle,children:subtitle})]}),trailingSlot!==void 0&&jsx(`div`,{className:trailingSlotClassName,children:trailingSlot})]}),textValue=typeof tooltipContent==`string`?`${title}. ${tooltipContent}`:title,item=jsx(GridListItem,{"aria-disabled":isApplied&&!isDisabled?!0:void 0,className:classNames(browser_row_module_default.item,{[browser_row_module_default.disabled]:isDisabled,[browser_row_module_default.applied]:isApplied&&!isDisabled}),id,isDisabled,textValue,children:rowContent});return tooltipContent===void 0?item:jsx(Tooltip,{content:tooltipContent,children:item})}export{BrowserRow as t};
1
+ import{useConsumerState}from"../esm/lib/contexts/hooks.js";import{Text,Tooltip}from"@box/blueprint-web";import classNames from"clsx";import{useRef,useState}from"react";import{jsx,jsxs}from"react/jsx-runtime";import{GridListItem}from"react-aria-components";import '../styles/browser-row.css';var browser_row_module_default={row:`_row_10rt4_2`,leadingIcon:`_leadingIcon_10rt4_15`,content:`_content_10rt4_27`,title:`_title_10rt4_34`,trailingSlotHoverOnly:`_trailingSlotHoverOnly_10rt4_44`,item:`_item_10rt4_48`,disabled:`_disabled_10rt4_69`,applied:`_applied_10rt4_76`,trailingSlot:`_trailingSlot_10rt4_44`,subtitle:`_subtitle_10rt4_105`};function BrowserRow({id,leadingIcon,title,subtitle,trailingSlot,isTrailingSlotHoverOnly,isApplied,tooltipContent}){let{isDisabled}=useConsumerState(),rowRef=useRef(null),[isTooltipOpen,setIsTooltipOpen]=useState(!1),trailingSlotClassName=classNames(browser_row_module_default.trailingSlot,{[browser_row_module_default.trailingSlotHoverOnly]:isTrailingSlotHoverOnly}),handleTooltipOpenChange=open=>{if(!open){setIsTooltipOpen(!1);return}let titleElement=rowRef.current?.querySelector(`[data-browser-row-title]`),isTitleEllipsized=!!(titleElement&&titleElement.scrollWidth>titleElement.clientWidth);setIsTooltipOpen(tooltipContent!==void 0||isTitleEllipsized)},rowContent=jsxs(`div`,{className:browser_row_module_default.row,children:[leadingIcon!==void 0&&jsx(`div`,{"aria-hidden":`true`,className:browser_row_module_default.leadingIcon,"data-testid":`leading-icon`,children:leadingIcon}),jsxs(`div`,{className:browser_row_module_default.content,children:[jsx(Text,{as:`span`,className:browser_row_module_default.title,"data-browser-row-title":``,variant:`bodyDefault`,children:title}),subtitle&&jsx(`div`,{className:browser_row_module_default.subtitle,children:subtitle})]}),trailingSlot!==void 0&&jsx(`div`,{className:trailingSlotClassName,children:trailingSlot})]}),textValue=typeof tooltipContent==`string`&&tooltipContent!==title?`${title}. ${tooltipContent}`:title,item=jsx(GridListItem,{"aria-disabled":isApplied&&!isDisabled?!0:void 0,className:classNames(browser_row_module_default.item,{[browser_row_module_default.disabled]:isDisabled,[browser_row_module_default.applied]:isApplied&&!isDisabled}),id,isDisabled,ref:rowRef,textValue,children:rowContent});return jsx(Tooltip,{content:tooltipContent??title,onOpenChange:handleTooltipOpenChange,open:isTooltipOpen,children:item})}export{BrowserRow as t};
@@ -1 +1 @@
1
- import{useBrowseNode,useBrowseState,useBrowserActions,useConsumerState,useNavigationState,useSearchState}from"../esm/lib/contexts/hooks.js";import{t as BreadcrumbNavigation}from"./breadcrumb-navigation.js";import{messages}from"../esm/lib/components/messages.js";import{useIsInitialBrowseLoading}from"../esm/lib/hooks/use-is-initial-browse-loading.js";import{t as MetadataTemplateBrowserListBox}from"./metadata-template-browser-list-box.js";import{Button,SearchInput}from"@box/blueprint-web";import{useIntl}from"react-intl";import{jsx,jsxs}from"react/jsx-runtime";import{Plus}from"@box/blueprint-web-assets/icons/Fill";import '../styles/metadata-template-browser-container.css';var metadata_template_browser_container_module_default={container:`_container_1dqk1_1`,searchInput:`_searchInput_1dqk1_9`,createTemplateButton:`_createTemplateButton_1dqk1_13`};function MetadataTemplateBrowserContainer(){let{formatMessage}=useIntl(),{isDisabled}=useConsumerState(),{setSearchValue,createTemplate}=useBrowserActions(),{namespaceFQN,canCreateInCurrentNamespace}=useNavigationState(),{searchValue}=useSearchState(),{namespaces,templates,isNamespacesExhausted}=useBrowseNode(),{isFetching}=useBrowseState(),isInitialBrowseLoading=useIsInitialBrowseLoading(),isBrowseListEmpty=!isFetching&&isNamespacesExhausted&&namespaces.length===0&&templates.length===0,showCreateButton=canCreateInCurrentNamespace&&!isInitialBrowseLoading&&!isFetching&&!isBrowseListEmpty&&searchValue.length===0;return jsxs(`div`,{className:metadata_template_browser_container_module_default.container,children:[jsx(SearchInput,{className:metadata_template_browser_container_module_default.searchInput,disabled:isDisabled||isInitialBrowseLoading,onChange:setSearchValue,placeholder:formatMessage(messages.searchInputPlaceholder),searchInputAriaLabel:formatMessage(messages.searchInputAriaLabel),searchInputClearAriaLabel:formatMessage(messages.searchInputClearAriaLabel)}),!isInitialBrowseLoading&&jsx(BreadcrumbNavigation,{}),showCreateButton&&jsx(Button,{className:metadata_template_browser_container_module_default.createTemplateButton,disabled:isDisabled,startIcon:Plus,onClick:()=>createTemplate(namespaceFQN),variant:`tertiary`,size:`large`,children:formatMessage(messages.createTemplateButtonLabel)}),jsx(MetadataTemplateBrowserListBox,{})]})}export{MetadataTemplateBrowserContainer as t};
1
+ import{useBrowseNode,useBrowseState,useBrowserActions,useConsumerState,useNavigationState,useSearchState}from"../esm/lib/contexts/hooks.js";import{t as BreadcrumbNavigation}from"./breadcrumb-navigation.js";import{messages}from"../esm/lib/components/messages.js";import{useIsInitialBrowseLoading}from"../esm/lib/hooks/use-is-initial-browse-loading.js";import{t as MetadataTemplateBrowserListBox}from"./metadata-template-browser-list-box.js";import{Button,SearchInput}from"@box/blueprint-web";import classNames from"clsx";import{useIntl}from"react-intl";import{jsx,jsxs}from"react/jsx-runtime";import{Plus}from"@box/blueprint-web-assets/icons/Medium";import '../styles/metadata-template-browser-container.css';var metadata_template_browser_container_module_default={container:`_container_1wehq_1`,searchInput:`_searchInput_1wehq_9`,searchInputWithBreadcrumb:`_searchInputWithBreadcrumb_1wehq_13`,createTemplateButton:`_createTemplateButton_1wehq_17`};function MetadataTemplateBrowserContainer(){let{formatMessage}=useIntl(),{isDisabled,isNamespacesEnabled}=useConsumerState(),{setSearchValue,createTemplate}=useBrowserActions(),{namespaceFQN,canCreateInCurrentNamespace}=useNavigationState(),{searchValue}=useSearchState(),{namespaces,templates,isNamespacesExhausted}=useBrowseNode(),{isFetching}=useBrowseState(),isInitialBrowseLoading=useIsInitialBrowseLoading(),isBrowseListEmpty=!isFetching&&isNamespacesExhausted&&namespaces.length===0&&templates.length===0,showCreateButton=canCreateInCurrentNamespace&&!isInitialBrowseLoading&&!isFetching&&!isBrowseListEmpty&&searchValue.length===0;return jsxs(`div`,{className:metadata_template_browser_container_module_default.container,children:[jsx(SearchInput,{className:classNames(metadata_template_browser_container_module_default.searchInput,{[metadata_template_browser_container_module_default.searchInputWithBreadcrumb]:!isInitialBrowseLoading&&isNamespacesEnabled&&searchValue.length===0}),disabled:isDisabled||isInitialBrowseLoading,onChange:setSearchValue,placeholder:formatMessage(messages.searchInputPlaceholder),searchInputAriaLabel:formatMessage(messages.searchInputAriaLabel),searchInputClearAriaLabel:formatMessage(messages.searchInputClearAriaLabel)}),!isInitialBrowseLoading&&jsx(BreadcrumbNavigation,{}),showCreateButton&&jsx(Button,{className:metadata_template_browser_container_module_default.createTemplateButton,disabled:isDisabled,startIcon:Plus,onClick:()=>createTemplate(namespaceFQN),variant:`tertiary`,size:`large`,children:formatMessage(messages.createTemplateButtonLabel)}),jsx(MetadataTemplateBrowserListBox,{})]})}export{MetadataTemplateBrowserContainer as t};
@@ -1 +1 @@
1
- import{useBrowseNode,useBrowseState,useBrowserActions,useConsumerState,useNavigationState}from"../esm/lib/contexts/hooks.js";import{ErrorState}from"../esm/lib/components/error-state/error-state.js";import{messages}from"../esm/lib/components/messages.js";import{t as MetadataTemplateBrowserContainer}from"./metadata-template-browser-container.js";import{EmptyState,Text}from"@box/blueprint-web";import{useIntl}from"react-intl";import{useEffect,useRef}from"react";import{jsx,jsxs}from"react/jsx-runtime";import{NoTemplates}from"@box/blueprint-web-assets/illustrations/Medium";import '../styles/metadata-template-browser-controller.css';var metadata_template_browser_controller_module_default={container:`_container_14phx_1`};function MetadataTemplateBrowserController(){let{isLoading:isConsumerLoading}=useConsumerState(),{formatMessage}=useIntl(),{initialLoad,retry}=useBrowserActions(),{path,canCreateInCurrentNamespace}=useNavigationState(),{namespaces,templates}=useBrowseNode(),{isFetching,initialLoadError}=useBrowseState(),hasInitiallyLoadedRef=useRef(!1);useEffect(()=>{!isConsumerLoading&&!hasInitiallyLoadedRef.current&&(hasInitiallyLoadedRef.current=!0,initialLoad())},[isConsumerLoading,initialLoad]);let hasItems=namespaces.length>0||templates.length>0,hasInitialLoadError=initialLoadError!==null,isAtRoot=path.length===0,isBrowseEmpty=!isFetching&&!isConsumerLoading&&!hasItems&&!hasInitialLoadError&&isAtRoot&&!canCreateInCurrentNamespace,showContainer=!hasInitialLoadError&&!isBrowseEmpty;return jsxs(`div`,{className:metadata_template_browser_controller_module_default.container,children:[hasInitialLoadError&&jsx(ErrorState,{body:formatMessage(messages.initialLoadErrorBody),onRetry:retry}),isBrowseEmpty&&jsx(EmptyState,{body:jsx(Text,{as:`p`,children:formatMessage(messages.initialEmptyStateBody)}),illustration:NoTemplates,size:`small`}),showContainer&&jsx(MetadataTemplateBrowserContainer,{})]})}export{MetadataTemplateBrowserController as t};
1
+ import{useBrowseNode,useBrowseState,useBrowserActions,useConsumerState,useNavigationState}from"../esm/lib/contexts/hooks.js";import{ErrorState}from"../esm/lib/components/error-state/error-state.js";import{messages}from"../esm/lib/components/messages.js";import{t as MetadataTemplateBrowserContainer}from"./metadata-template-browser-container.js";import{EmptyState,Text}from"@box/blueprint-web";import{useIntl}from"react-intl";import{useEffect,useRef}from"react";import{jsx,jsxs}from"react/jsx-runtime";import{NoTemplates}from"@box/blueprint-web-assets/illustrations/Medium";import '../styles/metadata-template-browser-controller.css';var metadata_template_browser_controller_module_default={container:`_container_14phx_1`};function MetadataTemplateBrowserController(){let{isLoading:isConsumerLoading,isNamespacesEnabled}=useConsumerState(),{formatMessage}=useIntl(),{initialLoad,retry}=useBrowserActions(),{path,canCreateInCurrentNamespace}=useNavigationState(),{namespaces,templates}=useBrowseNode(),{isFetching,initialLoadError}=useBrowseState(),hasInitiallyLoadedRef=useRef(!1);useEffect(()=>{!isConsumerLoading&&!hasInitiallyLoadedRef.current&&(hasInitiallyLoadedRef.current=!0,initialLoad())},[isConsumerLoading,initialLoad]);let hasItems=namespaces.length>0||templates.length>0,hasInitialLoadError=initialLoadError!==null,isAtRoot=path.length===0,isBrowseEmpty=!isFetching&&!isConsumerLoading&&!hasItems&&!hasInitialLoadError&&isAtRoot&&!canCreateInCurrentNamespace&&isNamespacesEnabled,showContainer=!hasInitialLoadError&&!isBrowseEmpty;return jsxs(`div`,{className:metadata_template_browser_controller_module_default.container,children:[hasInitialLoadError&&jsx(ErrorState,{body:formatMessage(messages.initialLoadErrorBody),onRetry:retry}),isBrowseEmpty&&jsx(EmptyState,{body:jsx(Text,{as:`p`,children:formatMessage(messages.initialEmptyStateBody)}),illustration:NoTemplates,size:`small`}),showContainer&&jsx(MetadataTemplateBrowserContainer,{})]})}export{MetadataTemplateBrowserController as t};
@@ -1 +1 @@
1
- import{useBrowseState,useBrowserActions,useSearchState}from"../../contexts/hooks.js";import{t as TemplateRowVariant}from"../../../../chunks/types.js";import{ErrorState}from"../error-state/error-state.js";import{t as LoaderSkeleton}from"../../../../chunks/loader-skeleton.js";import{TemplateRow}from"../template-row/template-row.js";import{t as VirtualizedGridList}from"../../../../chunks/virtualized-grid-list.js";import{messages}from"./messages.js";import{EmptyState,Text}from"@box/blueprint-web";import{useIntl}from"react-intl";import{useCallback}from"react";import{jsx}from"react/jsx-runtime";import{CustomTemplate}from"@box/blueprint-web-assets/illustrations/Small";function SearchList({onAction,selectedKeys}){let{formatMessage}=useIntl(),{searchResults,searchNextMarker,isFetchingSearch,searchError}=useSearchState(),{isFetchingMore,loadMoreError}=useBrowseState(),{loadMore,retry,editTemplate}=useBrowserActions(),hasMoreSearchItems=searchNextMarker!==void 0,renderItem=useCallback(item=>jsx(TemplateRow,{onEdit:editTemplate,template:item.template,variant:TemplateRowVariant.Search}),[editTemplate]);if(isFetchingSearch)return jsx(LoaderSkeleton,{});if(searchError!==null)return jsx(ErrorState,{body:formatMessage(messages.searchErrorBody),onRetry:retry});if(searchResults.length===0)return jsx(EmptyState,{body:jsx(Text,{as:`p`,children:formatMessage(messages.emptyStateBody)}),heading:jsx(Text,{as:`p`,children:formatMessage(messages.emptyStateHeading)}),illustration:CustomTemplate,size:`small`});let items=searchResults.map(template=>({id:template.id,template}));return jsx(VirtualizedGridList,{ariaLabel:formatMessage(messages.listAriaLabel),isFetchingMore,items,listType:TemplateRowVariant.Search,loadMoreError,onAction,hasMoreItems:hasMoreSearchItems,onLoadMore:loadMore,onRetry:loadMore,selectedKeys,children:renderItem})}export{SearchList};
1
+ import{useBrowseState,useBrowserActions,useConsumerState,useSearchState}from"../../contexts/hooks.js";import{t as TemplateRowVariant}from"../../../../chunks/types.js";import{ErrorState}from"../error-state/error-state.js";import{t as LoaderSkeleton}from"../../../../chunks/loader-skeleton.js";import{TemplateRow}from"../template-row/template-row.js";import{t as VirtualizedGridList}from"../../../../chunks/virtualized-grid-list.js";import{messages}from"./messages.js";import{EmptyState,Text}from"@box/blueprint-web";import{useIntl}from"react-intl";import{useCallback,useMemo}from"react";import{jsx}from"react/jsx-runtime";import{CustomTemplate}from"@box/blueprint-web-assets/illustrations/Small";var hasAncestorPath=template=>Array.isArray(template.ancestors)&&template.ancestors.length>0;function SearchList({onAction,selectedKeys}){let{formatMessage}=useIntl(),{isNamespacesEnabled}=useConsumerState(),{searchResults,searchNextMarker,isFetchingSearch,searchError}=useSearchState(),{isFetchingMore,loadMoreError}=useBrowseState(),{loadMore,retry,editTemplate}=useBrowserActions(),hasMoreSearchItems=searchNextMarker!==void 0,rowVariant=useMemo(()=>isNamespacesEnabled&&searchResults.some(hasAncestorPath)?TemplateRowVariant.Search:TemplateRowVariant.Browse,[isNamespacesEnabled,searchResults]),renderItem=useCallback(item=>jsx(TemplateRow,{onEdit:editTemplate,template:item.template,variant:rowVariant}),[editTemplate,rowVariant]);if(isFetchingSearch)return jsx(LoaderSkeleton,{});if(searchError!==null)return jsx(ErrorState,{body:formatMessage(messages.searchErrorBody),onRetry:retry});if(searchResults.length===0)return jsx(EmptyState,{body:jsx(Text,{as:`p`,children:formatMessage(messages.emptyStateBody)}),heading:jsx(Text,{as:`p`,children:formatMessage(messages.emptyStateHeading)}),illustration:CustomTemplate,size:`small`});let items=searchResults.map(template=>({id:template.id,template}));return jsx(VirtualizedGridList,{ariaLabel:formatMessage(messages.listAriaLabel),isFetchingMore,items,listType:rowVariant,loadMoreError,onAction,hasMoreItems:hasMoreSearchItems,onLoadMore:loadMore,onRetry:loadMore,selectedKeys,children:renderItem})}export{SearchList};
@@ -1 +1 @@
1
- import{useTemplateBrowserActions}from"./use-template-browser-actions.js";import{createContext,useMemo}from"react";import{jsx}from"react/jsx-runtime";var NavigationStateContext=createContext(null);function NavigationStateContextProvider({children,namespaceFQN,path,canCreateInCurrentNamespace}){let value=useMemo(()=>({namespaceFQN,path,canCreateInCurrentNamespace}),[namespaceFQN,path,canCreateInCurrentNamespace]);return jsx(NavigationStateContext.Provider,{value,children})}var BrowseStateContext=createContext(null);function BrowseStateContextProvider({children,browseByFqn,isFetching,isFetchingMore,initialLoadError,browseError,loadMoreError}){let value=useMemo(()=>({browseByFqn,isFetching,isFetchingMore,initialLoadError,browseError,loadMoreError}),[browseByFqn,isFetching,isFetchingMore,initialLoadError,browseError,loadMoreError]);return jsx(BrowseStateContext.Provider,{value,children})}var SearchStateContext=createContext(null);function SearchStateContextProvider({children,searchValue,searchQuery,searchResults,searchNextMarker,isFetchingSearch,searchError}){let value=useMemo(()=>({searchValue,searchQuery,searchResults,searchNextMarker,isFetchingSearch,searchError}),[searchValue,searchQuery,searchResults,searchNextMarker,isFetchingSearch,searchError]);return jsx(SearchStateContext.Provider,{value,children})}var SelectionStateContext=createContext(null);function SelectionStateContextProvider({children,selectedTemplateId}){let value=useMemo(()=>({selectedTemplateId}),[selectedTemplateId]);return jsx(SelectionStateContext.Provider,{value,children})}var ConsumerStateContext=createContext(null),EMPTY_APPLIED_TEMPLATE_IDS=new Set;function ConsumerStateContextProvider({children,isLoading=!1,isDisabled=!1,appliedTemplateIds=EMPTY_APPLIED_TEMPLATE_IDS}){let value=useMemo(()=>({isLoading,isDisabled,appliedTemplateIds}),[isLoading,isDisabled,appliedTemplateIds]);return jsx(ConsumerStateContext.Provider,{value,children})}var BrowserActionsContext=createContext(null);function BrowserActionsContextProvider({children,itemsServiceRef,eventServiceRef,stateRef,dispatch}){let actions=useTemplateBrowserActions(itemsServiceRef,eventServiceRef,stateRef,dispatch);return jsx(BrowserActionsContext.Provider,{value:actions,children})}export{BrowseStateContext,BrowseStateContextProvider,BrowserActionsContext,BrowserActionsContextProvider,ConsumerStateContext,ConsumerStateContextProvider,NavigationStateContext,NavigationStateContextProvider,SearchStateContext,SearchStateContextProvider,SelectionStateContext,SelectionStateContextProvider};
1
+ import{useTemplateBrowserActions}from"./use-template-browser-actions.js";import{createContext,useMemo}from"react";import{jsx}from"react/jsx-runtime";var NavigationStateContext=createContext(null);function NavigationStateContextProvider({children,namespaceFQN,path,canCreateInCurrentNamespace}){let value=useMemo(()=>({namespaceFQN,path,canCreateInCurrentNamespace}),[namespaceFQN,path,canCreateInCurrentNamespace]);return jsx(NavigationStateContext.Provider,{value,children})}var BrowseStateContext=createContext(null);function BrowseStateContextProvider({children,browseByFqn,isFetching,isFetchingMore,initialLoadError,browseError,loadMoreError}){let value=useMemo(()=>({browseByFqn,isFetching,isFetchingMore,initialLoadError,browseError,loadMoreError}),[browseByFqn,isFetching,isFetchingMore,initialLoadError,browseError,loadMoreError]);return jsx(BrowseStateContext.Provider,{value,children})}var SearchStateContext=createContext(null);function SearchStateContextProvider({children,searchValue,searchQuery,searchResults,searchNextMarker,isFetchingSearch,searchError}){let value=useMemo(()=>({searchValue,searchQuery,searchResults,searchNextMarker,isFetchingSearch,searchError}),[searchValue,searchQuery,searchResults,searchNextMarker,isFetchingSearch,searchError]);return jsx(SearchStateContext.Provider,{value,children})}var SelectionStateContext=createContext(null);function SelectionStateContextProvider({children,selectedTemplateId}){let value=useMemo(()=>({selectedTemplateId}),[selectedTemplateId]);return jsx(SelectionStateContext.Provider,{value,children})}var ConsumerStateContext=createContext(null),EMPTY_APPLIED_TEMPLATE_IDS=new Set;function ConsumerStateContextProvider({children,isLoading=!1,isDisabled=!1,isNamespacesEnabled=!1,appliedTemplateIds=EMPTY_APPLIED_TEMPLATE_IDS}){let value=useMemo(()=>({isLoading,isDisabled,isNamespacesEnabled,appliedTemplateIds}),[isLoading,isDisabled,isNamespacesEnabled,appliedTemplateIds]);return jsx(ConsumerStateContext.Provider,{value,children})}var BrowserActionsContext=createContext(null);function BrowserActionsContextProvider({children,itemsServiceRef,eventServiceRef,isNamespacesEnabledRef,stateRef,dispatch}){let actions=useTemplateBrowserActions(itemsServiceRef,eventServiceRef,isNamespacesEnabledRef,stateRef,dispatch);return jsx(BrowserActionsContext.Provider,{value:actions,children})}export{BrowseStateContext,BrowseStateContextProvider,BrowserActionsContext,BrowserActionsContextProvider,ConsumerStateContext,ConsumerStateContextProvider,NavigationStateContext,NavigationStateContextProvider,SearchStateContext,SearchStateContextProvider,SelectionStateContext,SelectionStateContextProvider};
@@ -1 +1 @@
1
- import{browserReducer,initialState}from"./reducer.js";import{BrowseStateContextProvider,BrowserActionsContextProvider,NavigationStateContextProvider,SearchStateContextProvider,SelectionStateContextProvider}from"./contexts.js";import{useReducer,useRef}from"react";import{jsx}from"react/jsx-runtime";function MetadataTemplateBrowserProvider({children,namespaceFQN,itemsService,eventService,initialSelectedTemplateId,canCreateAtRoot=!1}){let[state,dispatch]=useReducer(browserReducer,{...initialState,namespaceFQN,selectedTemplateId:initialSelectedTemplateId??null,canCreateInCurrentNamespace:canCreateAtRoot,canCreateAtRoot}),stateRef=useRef(state);stateRef.current=state;let itemsServiceRef=useRef(itemsService);itemsServiceRef.current=itemsService;let eventServiceRef=useRef(eventService);return eventServiceRef.current=eventService,jsx(NavigationStateContextProvider,{namespaceFQN:state.namespaceFQN,path:state.path,canCreateInCurrentNamespace:state.canCreateInCurrentNamespace,children:jsx(BrowseStateContextProvider,{browseByFqn:state.browseByFqn,isFetching:state.isFetching,isFetchingMore:state.isFetchingMore,initialLoadError:state.initialLoadError,browseError:state.browseError,loadMoreError:state.loadMoreError,children:jsx(SearchStateContextProvider,{searchValue:state.searchValue,searchQuery:state.searchQuery,searchResults:state.searchResults,searchNextMarker:state.searchNextMarker,isFetchingSearch:state.isFetchingSearch,searchError:state.searchError,children:jsx(SelectionStateContextProvider,{selectedTemplateId:state.selectedTemplateId,children:jsx(BrowserActionsContextProvider,{itemsServiceRef,eventServiceRef,stateRef,dispatch,children})})})})})}export{MetadataTemplateBrowserProvider};
1
+ import{browserReducer,initialState}from"./reducer.js";import{BrowseStateContextProvider,BrowserActionsContextProvider,NavigationStateContextProvider,SearchStateContextProvider,SelectionStateContextProvider}from"./contexts.js";import{useReducer,useRef}from"react";import{jsx}from"react/jsx-runtime";function MetadataTemplateBrowserProvider({children,namespaceFQN,itemsService,eventService,initialSelectedTemplateId,canCreateAtRoot=!1,isNamespacesEnabled=!1}){let[state,dispatch]=useReducer(browserReducer,{...initialState,namespaceFQN,selectedTemplateId:initialSelectedTemplateId??null,canCreateInCurrentNamespace:canCreateAtRoot,canCreateAtRoot}),stateRef=useRef(state);stateRef.current=state;let itemsServiceRef=useRef(itemsService);itemsServiceRef.current=itemsService;let eventServiceRef=useRef(eventService);eventServiceRef.current=eventService;let isNamespacesEnabledRef=useRef(isNamespacesEnabled);return isNamespacesEnabledRef.current=isNamespacesEnabled,jsx(NavigationStateContextProvider,{namespaceFQN:state.namespaceFQN,path:state.path,canCreateInCurrentNamespace:state.canCreateInCurrentNamespace,children:jsx(BrowseStateContextProvider,{browseByFqn:state.browseByFqn,isFetching:state.isFetching,isFetchingMore:state.isFetchingMore,initialLoadError:state.initialLoadError,browseError:state.browseError,loadMoreError:state.loadMoreError,children:jsx(SearchStateContextProvider,{searchValue:state.searchValue,searchQuery:state.searchQuery,searchResults:state.searchResults,searchNextMarker:state.searchNextMarker,isFetchingSearch:state.isFetchingSearch,searchError:state.searchError,children:jsx(SelectionStateContextProvider,{selectedTemplateId:state.selectedTemplateId,children:jsx(BrowserActionsContextProvider,{itemsServiceRef,eventServiceRef,isNamespacesEnabledRef,stateRef,dispatch,children})})})})})}export{MetadataTemplateBrowserProvider};
@@ -1 +1 @@
1
- import{EMPTY_BROWSE_NODE,emptyNamespacesResponse,emptyTemplatesResponse}from"../constants.js";import{BrowserActionType}from"./reducer.js";import{useMemo,useRef}from"react";import debounce from"lodash/debounce";var rejectOnAbort=signal=>new Promise((_,reject)=>{if(signal.aborted){reject(new DOMException(`Aborted`,`AbortError`));return}signal.addEventListener(`abort`,()=>reject(new DOMException(`Aborted`,`AbortError`)),{once:!0})}),callEventCallback=callback=>{try{let result=callback();result instanceof Promise&&result.catch(()=>void 0)}catch{}},runTemplateMutation=async operation=>{try{return await operation()}catch{return}},normalizeSearchQuery=value=>value.trim().replaceAll(/\s+/g,` `),getErrorMessage=error=>error instanceof Error?error.message:typeof error==`string`?error:`An unknown error occurred`,runAbortable=async(signal,fetchFn,onSuccess,onError)=>{try{let result=await fetchFn();signal.aborted||onSuccess(result)}catch(error){signal.aborted||onError(error)}};function useTemplateBrowserActions(itemsServiceRef,eventServiceRef,stateRef,dispatch){let browsePageAbortControllerRef=useRef(null),browseLoadMoreAbortControllerRef=useRef(null),searchAbortControllerRef=useRef(null),abandonBrowsePage=()=>{browsePageAbortControllerRef.current?.abort(),browsePageAbortControllerRef.current=null,dispatch({type:BrowserActionType.BrowsePageCancelled})},abandonBrowseLoadMore=()=>{browseLoadMoreAbortControllerRef.current?.abort(),browseLoadMoreAbortControllerRef.current=null,dispatch({type:BrowserActionType.LoadMoreCancelled})},startBrowsePageRequest=()=>{browsePageAbortControllerRef.current?.abort();let controller=new AbortController;return browsePageAbortControllerRef.current=controller,controller.signal},startBrowseLoadMoreRequest=()=>{browseLoadMoreAbortControllerRef.current?.abort();let controller=new AbortController;return browseLoadMoreAbortControllerRef.current=controller,controller.signal},startSearchRequest=()=>{searchAbortControllerRef.current?.abort();let controller=new AbortController;return searchAbortControllerRef.current=controller,controller.signal},cancelSearchRequest=()=>{searchAbortControllerRef.current?.abort(),searchAbortControllerRef.current=null},debouncedSearchRef=useRef(debounce(async query=>{let signal=startSearchRequest();callEventCallback(()=>eventServiceRef.current.onSearchChange?.(query)),callEventCallback(()=>eventServiceRef.current.onNewViewLoading?.(!0)),await runAbortable(signal,()=>fetchSearchResults(query,signal),response=>dispatch({type:BrowserActionType.SearchLoaded,results:response.entries,nextMarker:response.next_marker}),error=>dispatch({type:BrowserActionType.SearchError,error:getErrorMessage(error)})),signal.aborted||callEventCallback(()=>eventServiceRef.current.onNewViewLoading?.(!1))},500)),fetchNamespaces=(fqn,signal,marker)=>{let fn=itemsServiceRef.current.getNamespaces;return fn?Promise.race([fn(fqn,{limit:200,marker,signal}),rejectOnAbort(signal)]):Promise.resolve(emptyNamespacesResponse)},fetchTemplates=(fqn,signal,marker)=>{let fn=itemsServiceRef.current.getTemplates;return fn?Promise.race([fn(fqn,{limit:200,marker,signal}),rejectOnAbort(signal)]):Promise.resolve(emptyTemplatesResponse)},fetchSearchResults=(query,signal,marker)=>{let fn=itemsServiceRef.current.getSearchResults;return fn?Promise.race([fn(query,{limit:200,marker,signal}),rejectOnAbort(signal)]):Promise.resolve(emptyTemplatesResponse)},dispatchError=(type,error)=>{dispatch({type,error:getErrorMessage(error)})},fetchBrowsePage=async(fqn,signal,errorAction)=>{let success=!1;return await runAbortable(signal,async()=>{let namespacesResponse=await fetchNamespaces(fqn,signal);return[namespacesResponse,namespacesResponse.next_marker?emptyTemplatesResponse:await fetchTemplates(fqn,signal)]},([namespacesResponse,templatesResponse])=>{dispatch({type:BrowserActionType.BrowseLoaded,namespaces:namespacesResponse.entries,namespaceNextMarker:namespacesResponse.next_marker,templates:templatesResponse.entries,templateNextMarker:templatesResponse.next_marker}),success=!0},error=>dispatchError(errorAction,error)),success},initialLoad=async()=>{let signal=startBrowsePageRequest(),{namespaceFQN}=stateRef.current;dispatch({type:BrowserActionType.BrowseFetchStart}),callEventCallback(()=>eventServiceRef.current.onNewViewLoading?.(!0)),await fetchBrowsePage(namespaceFQN,signal,BrowserActionType.InitialLoadError),signal.aborted||callEventCallback(()=>eventServiceRef.current.onNewViewLoading?.(!1))},navigateTo=async namespace=>{abandonBrowseLoadMore();let signal=startBrowsePageRequest();dispatch({type:BrowserActionType.NavigateTo,namespace}),dispatch({type:BrowserActionType.BrowseFetchStart}),callEventCallback(()=>eventServiceRef.current.onNewViewLoading?.(!0));let success=await fetchBrowsePage(namespace.id,signal,BrowserActionType.BrowseError);signal.aborted||(callEventCallback(()=>eventServiceRef.current.onNewViewLoading?.(!1)),success&&callEventCallback(()=>eventServiceRef.current.onNamespaceChange?.(namespace.id)))},navigateBack=fqn=>{stateRef.current.browseByFqn.has(fqn)&&(abandonBrowsePage(),abandonBrowseLoadMore(),dispatch({type:BrowserActionType.NavigateBack,fqn}),callEventCallback(()=>eventServiceRef.current.onNamespaceChange?.(fqn)))},setSearchValue=value=>{dispatch({type:BrowserActionType.SearchValueChange,value});let normalizedQuery=normalizeSearchQuery(value);if(normalizedQuery===``){debouncedSearchRef.current.cancel(),cancelSearchRequest(),abandonBrowseLoadMore(),dispatch({type:BrowserActionType.SearchClear}),callEventCallback(()=>eventServiceRef.current.onSearchChange?.(``)),callEventCallback(()=>eventServiceRef.current.onNewViewLoading?.(!1));return}abandonBrowseLoadMore(),cancelSearchRequest(),dispatch({type:BrowserActionType.SearchFetchStart,query:normalizedQuery}),debouncedSearchRef.current(normalizedQuery)},loadMore=async()=>{let{namespaceFQN,searchQuery,searchNextMarker,browseByFqn}=stateRef.current,{namespaceNextMarker,templateNextMarker,isNamespacesExhausted}=browseByFqn.get(namespaceFQN)??EMPTY_BROWSE_NODE,isSearchMode=!!searchQuery,hasMoreSearchResults=isSearchMode&&!!searchNextMarker,hasMoreNamespaces=!isSearchMode&&!isNamespacesExhausted&&!!namespaceNextMarker,hasMoreTemplates=!isSearchMode&&!!templateNextMarker;if(!(hasMoreSearchResults||hasMoreNamespaces||hasMoreTemplates))return;dispatch({type:BrowserActionType.LoadMoreStart});let dispatchLoadMoreError=error=>{dispatch({type:BrowserActionType.LoadMoreError,error:getErrorMessage(error)})};if(hasMoreSearchResults){let signal=startSearchRequest();await runAbortable(signal,()=>fetchSearchResults(searchQuery,signal,searchNextMarker),response=>dispatch({type:BrowserActionType.LoadMoreSearchLoaded,entries:response.entries,nextMarker:response.next_marker}),dispatchLoadMoreError);return}if(hasMoreNamespaces){let signal=startBrowseLoadMoreRequest();await runAbortable(signal,async()=>{let namespacesResponse=await fetchNamespaces(namespaceFQN,signal,namespaceNextMarker);return[namespacesResponse,namespacesResponse.next_marker?emptyTemplatesResponse:await fetchTemplates(namespaceFQN,signal)]},([namespacesResponse,templatesResponse])=>{let namespacesExhausted=!namespacesResponse.next_marker;dispatch({type:BrowserActionType.LoadMoreNamespacesLoaded,entries:namespacesResponse.entries,nextMarker:namespacesResponse.next_marker,...namespacesExhausted&&{templates:templatesResponse.entries,templateNextMarker:templatesResponse.next_marker}})},dispatchLoadMoreError);return}if(hasMoreTemplates){let signal=startBrowseLoadMoreRequest();await runAbortable(signal,()=>fetchTemplates(namespaceFQN,signal,templateNextMarker),response=>{dispatch({type:BrowserActionType.LoadMoreTemplatesLoaded,entries:response.entries,nextMarker:response.next_marker})},dispatchLoadMoreError)}},selectTemplate=async template=>{stateRef.current.selectedTemplateId!==template.id&&(dispatch({type:BrowserActionType.TemplateSelect,template}),callEventCallback(()=>eventServiceRef.current.onTemplateSelect?.(template)))},createTemplate=async namespaceFQN=>{let template=await runTemplateMutation(()=>itemsServiceRef.current.createTemplate?.(namespaceFQN));template&&(dispatch({type:BrowserActionType.TemplateCreated,template,namespaceFQN}),dispatch({type:BrowserActionType.TemplateSelect,template}),callEventCallback(()=>eventServiceRef.current.onTemplateSelect?.(template)))},editTemplate=async templateId=>{let template=await runTemplateMutation(()=>itemsServiceRef.current.updateTemplate?.(templateId));template&&dispatch({type:BrowserActionType.TemplateUpdated,template})},retry=async()=>{let{searchError,searchQuery,loadMoreError,initialLoadError,browseError,namespaceFQN}=stateRef.current;if(searchError){abandonBrowseLoadMore();let signal=startSearchRequest();dispatch({type:BrowserActionType.SearchFetchStart,query:searchQuery}),callEventCallback(()=>eventServiceRef.current.onNewViewLoading?.(!0)),await runAbortable(signal,()=>fetchSearchResults(searchQuery,signal),response=>dispatch({type:BrowserActionType.SearchLoaded,results:response.entries,nextMarker:response.next_marker}),error=>dispatch({type:BrowserActionType.SearchError,error:getErrorMessage(error)})),signal.aborted||callEventCallback(()=>eventServiceRef.current.onNewViewLoading?.(!1));return}if(loadMoreError){await loadMore();return}if(initialLoadError||browseError){let signal=startBrowsePageRequest(),errorAction=initialLoadError?BrowserActionType.InitialLoadError:BrowserActionType.BrowseError;dispatch({type:BrowserActionType.BrowseFetchStart}),callEventCallback(()=>eventServiceRef.current.onNewViewLoading?.(!0)),await fetchBrowsePage(namespaceFQN,signal,errorAction),signal.aborted||callEventCallback(()=>eventServiceRef.current.onNewViewLoading?.(!1))}};return useMemo(()=>({initialLoad,navigateTo,navigateBack,setSearchValue,loadMore,selectTemplate,editTemplate,createTemplate,retry}),[])}export{useTemplateBrowserActions};
1
+ import{EMPTY_BROWSE_NODE,emptyNamespacesResponse,emptyTemplatesResponse}from"../constants.js";import{BrowserActionType}from"./reducer.js";import{useMemo,useRef}from"react";import debounce from"lodash/debounce";var rejectOnAbort=signal=>new Promise((_,reject)=>{if(signal.aborted){reject(new DOMException(`Aborted`,`AbortError`));return}signal.addEventListener(`abort`,()=>reject(new DOMException(`Aborted`,`AbortError`)),{once:!0})}),callEventCallback=callback=>{try{let result=callback();result instanceof Promise&&result.catch(()=>void 0)}catch{}},runTemplateMutation=async operation=>{try{return await operation()}catch{return}},normalizeSearchQuery=value=>value.trim().replaceAll(/\s+/g,` `),getErrorMessage=error=>error instanceof Error?error.message:typeof error==`string`?error:`An unknown error occurred`,runAbortable=async(signal,fetchFn,onSuccess,onError)=>{try{let result=await fetchFn();signal.aborted||onSuccess(result)}catch(error){signal.aborted||onError(error)}},MISSING_GET_NAMESPACES_MESSAGE=`[MetadataTemplateBrowser] isNamespacesEnabled is true but itemsService.getNamespaces is not implemented. Provide getNamespaces on itemsService to load namespace folders.`;function useTemplateBrowserActions(itemsServiceRef,eventServiceRef,isNamespacesEnabledRef,stateRef,dispatch){let browsePageAbortControllerRef=useRef(null),browseLoadMoreAbortControllerRef=useRef(null),searchAbortControllerRef=useRef(null),hasLoggedMissingGetNamespacesRef=useRef(!1),abandonBrowsePage=()=>{browsePageAbortControllerRef.current?.abort(),browsePageAbortControllerRef.current=null,dispatch({type:BrowserActionType.BrowsePageCancelled})},abandonBrowseLoadMore=()=>{browseLoadMoreAbortControllerRef.current?.abort(),browseLoadMoreAbortControllerRef.current=null,dispatch({type:BrowserActionType.LoadMoreCancelled})},startBrowsePageRequest=()=>{browsePageAbortControllerRef.current?.abort();let controller=new AbortController;return browsePageAbortControllerRef.current=controller,controller.signal},startBrowseLoadMoreRequest=()=>{browseLoadMoreAbortControllerRef.current?.abort();let controller=new AbortController;return browseLoadMoreAbortControllerRef.current=controller,controller.signal},startSearchRequest=()=>{searchAbortControllerRef.current?.abort();let controller=new AbortController;return searchAbortControllerRef.current=controller,controller.signal},cancelSearchRequest=()=>{searchAbortControllerRef.current?.abort(),searchAbortControllerRef.current=null},debouncedSearchRef=useRef(debounce(async query=>{let signal=startSearchRequest();callEventCallback(()=>eventServiceRef.current.onSearchChange?.(query)),callEventCallback(()=>eventServiceRef.current.onNewViewLoading?.(!0)),await runAbortable(signal,()=>fetchSearchResults(query,signal),response=>dispatch({type:BrowserActionType.SearchLoaded,results:response.entries,nextMarker:response.next_marker}),error=>dispatch({type:BrowserActionType.SearchError,error:getErrorMessage(error)})),signal.aborted||callEventCallback(()=>eventServiceRef.current.onNewViewLoading?.(!1))},500)),fetchNamespaces=(fqn,signal,marker)=>{if(!isNamespacesEnabledRef.current)return Promise.resolve(emptyNamespacesResponse);let fn=itemsServiceRef.current.getNamespaces;return fn?Promise.race([fn(fqn,{limit:200,marker,signal}),rejectOnAbort(signal)]):(hasLoggedMissingGetNamespacesRef.current||(hasLoggedMissingGetNamespacesRef.current=!0,typeof process<`u`&&process.env.NODE_ENV!==`production`&&console.warn(MISSING_GET_NAMESPACES_MESSAGE)),Promise.resolve(emptyNamespacesResponse))},fetchTemplates=(fqn,signal,marker)=>{let fn=itemsServiceRef.current.getTemplates;return fn?Promise.race([fn(fqn,{limit:200,marker,signal}),rejectOnAbort(signal)]):Promise.resolve(emptyTemplatesResponse)},fetchSearchResults=(query,signal,marker)=>{let fn=itemsServiceRef.current.getSearchResults;return fn?Promise.race([fn(query,{limit:200,marker,signal}),rejectOnAbort(signal)]):Promise.resolve(emptyTemplatesResponse)},dispatchError=(type,error)=>{dispatch({type,error:getErrorMessage(error)})},fetchBrowsePage=async(fqn,signal,errorAction)=>{let success=!1;return await runAbortable(signal,async()=>{let namespacesResponse=await fetchNamespaces(fqn,signal);return[namespacesResponse,namespacesResponse.next_marker?emptyTemplatesResponse:await fetchTemplates(fqn,signal)]},([namespacesResponse,templatesResponse])=>{dispatch({type:BrowserActionType.BrowseLoaded,namespaces:namespacesResponse.entries,namespaceNextMarker:namespacesResponse.next_marker,templates:templatesResponse.entries,templateNextMarker:templatesResponse.next_marker}),success=!0},error=>dispatchError(errorAction,error)),success},initialLoad=async()=>{let signal=startBrowsePageRequest(),{namespaceFQN}=stateRef.current;dispatch({type:BrowserActionType.BrowseFetchStart}),callEventCallback(()=>eventServiceRef.current.onNewViewLoading?.(!0)),await fetchBrowsePage(namespaceFQN,signal,BrowserActionType.InitialLoadError),signal.aborted||callEventCallback(()=>eventServiceRef.current.onNewViewLoading?.(!1))},navigateTo=async namespace=>{abandonBrowseLoadMore();let signal=startBrowsePageRequest();dispatch({type:BrowserActionType.NavigateTo,namespace}),dispatch({type:BrowserActionType.BrowseFetchStart}),callEventCallback(()=>eventServiceRef.current.onNewViewLoading?.(!0));let success=await fetchBrowsePage(namespace.id,signal,BrowserActionType.BrowseError);signal.aborted||(callEventCallback(()=>eventServiceRef.current.onNewViewLoading?.(!1)),success&&callEventCallback(()=>eventServiceRef.current.onNamespaceChange?.(namespace.id)))},navigateBack=fqn=>{stateRef.current.browseByFqn.has(fqn)&&(abandonBrowsePage(),abandonBrowseLoadMore(),dispatch({type:BrowserActionType.NavigateBack,fqn}),callEventCallback(()=>eventServiceRef.current.onNamespaceChange?.(fqn)))},setSearchValue=value=>{dispatch({type:BrowserActionType.SearchValueChange,value});let normalizedQuery=normalizeSearchQuery(value);if(normalizedQuery===``){debouncedSearchRef.current.cancel(),cancelSearchRequest(),abandonBrowseLoadMore(),dispatch({type:BrowserActionType.SearchClear}),callEventCallback(()=>eventServiceRef.current.onSearchChange?.(``)),callEventCallback(()=>eventServiceRef.current.onNewViewLoading?.(!1));return}abandonBrowseLoadMore(),cancelSearchRequest(),dispatch({type:BrowserActionType.SearchFetchStart,query:normalizedQuery}),debouncedSearchRef.current(normalizedQuery)},loadMore=async()=>{let{namespaceFQN,searchQuery,searchNextMarker,browseByFqn}=stateRef.current,{namespaceNextMarker,templateNextMarker,isNamespacesExhausted}=browseByFqn.get(namespaceFQN)??EMPTY_BROWSE_NODE,isSearchMode=!!searchQuery,hasMoreSearchResults=isSearchMode&&!!searchNextMarker,hasMoreNamespaces=!isSearchMode&&!isNamespacesExhausted&&!!namespaceNextMarker,hasMoreTemplates=!isSearchMode&&!!templateNextMarker;if(!(hasMoreSearchResults||hasMoreNamespaces||hasMoreTemplates))return;dispatch({type:BrowserActionType.LoadMoreStart});let dispatchLoadMoreError=error=>{dispatch({type:BrowserActionType.LoadMoreError,error:getErrorMessage(error)})};if(hasMoreSearchResults){let signal=startSearchRequest();await runAbortable(signal,()=>fetchSearchResults(searchQuery,signal,searchNextMarker),response=>dispatch({type:BrowserActionType.LoadMoreSearchLoaded,entries:response.entries,nextMarker:response.next_marker}),dispatchLoadMoreError);return}if(hasMoreNamespaces){let signal=startBrowseLoadMoreRequest();await runAbortable(signal,async()=>{let namespacesResponse=await fetchNamespaces(namespaceFQN,signal,namespaceNextMarker);return[namespacesResponse,namespacesResponse.next_marker?emptyTemplatesResponse:await fetchTemplates(namespaceFQN,signal)]},([namespacesResponse,templatesResponse])=>{let namespacesExhausted=!namespacesResponse.next_marker;dispatch({type:BrowserActionType.LoadMoreNamespacesLoaded,entries:namespacesResponse.entries,nextMarker:namespacesResponse.next_marker,...namespacesExhausted&&{templates:templatesResponse.entries,templateNextMarker:templatesResponse.next_marker}})},dispatchLoadMoreError);return}if(hasMoreTemplates){let signal=startBrowseLoadMoreRequest();await runAbortable(signal,()=>fetchTemplates(namespaceFQN,signal,templateNextMarker),response=>{dispatch({type:BrowserActionType.LoadMoreTemplatesLoaded,entries:response.entries,nextMarker:response.next_marker})},dispatchLoadMoreError)}},selectTemplate=async template=>{stateRef.current.selectedTemplateId!==template.id&&(dispatch({type:BrowserActionType.TemplateSelect,template}),callEventCallback(()=>eventServiceRef.current.onTemplateSelect?.(template)))},createTemplate=async namespaceFQN=>{let template=await runTemplateMutation(()=>itemsServiceRef.current.createTemplate?.(namespaceFQN));template&&(dispatch({type:BrowserActionType.TemplateCreated,template,namespaceFQN}),dispatch({type:BrowserActionType.TemplateSelect,template}),callEventCallback(()=>eventServiceRef.current.onTemplateSelect?.(template)))},editTemplate=async templateId=>{let template=await runTemplateMutation(()=>itemsServiceRef.current.updateTemplate?.(templateId));template&&dispatch({type:BrowserActionType.TemplateUpdated,template})},retry=async()=>{let{searchError,searchQuery,loadMoreError,initialLoadError,browseError,namespaceFQN}=stateRef.current;if(searchError){abandonBrowseLoadMore();let signal=startSearchRequest();dispatch({type:BrowserActionType.SearchFetchStart,query:searchQuery}),callEventCallback(()=>eventServiceRef.current.onNewViewLoading?.(!0)),await runAbortable(signal,()=>fetchSearchResults(searchQuery,signal),response=>dispatch({type:BrowserActionType.SearchLoaded,results:response.entries,nextMarker:response.next_marker}),error=>dispatch({type:BrowserActionType.SearchError,error:getErrorMessage(error)})),signal.aborted||callEventCallback(()=>eventServiceRef.current.onNewViewLoading?.(!1));return}if(loadMoreError){await loadMore();return}if(initialLoadError||browseError){let signal=startBrowsePageRequest(),errorAction=initialLoadError?BrowserActionType.InitialLoadError:BrowserActionType.BrowseError;dispatch({type:BrowserActionType.BrowseFetchStart}),callEventCallback(()=>eventServiceRef.current.onNewViewLoading?.(!0)),await fetchBrowsePage(namespaceFQN,signal,errorAction),signal.aborted||callEventCallback(()=>eventServiceRef.current.onNewViewLoading?.(!1))}};return useMemo(()=>({initialLoad,navigateTo,navigateBack,setSearchValue,loadMore,selectTemplate,editTemplate,createTemplate,retry}),[])}export{useTemplateBrowserActions};
@@ -1 +1 @@
1
- import{ConsumerStateContextProvider}from"./contexts/contexts.js";import{MetadataTemplateBrowserProvider}from"./contexts/provider.js";import{t as MetadataTemplateBrowserController}from"../../chunks/metadata-template-browser-controller.js";import{TooltipProvider}from"@box/blueprint-web";import{jsx}from"react/jsx-runtime";function MetadataTemplateBrowser({enterpriseId,itemsService,eventService,isLoading,isDisabled,initialSelectedTemplateId,canCreateAtRoot,appliedTemplateIds}){return jsx(TooltipProvider,{children:jsx(ConsumerStateContextProvider,{appliedTemplateIds,isDisabled,isLoading,children:jsx(MetadataTemplateBrowserProvider,{namespaceFQN:enterpriseId,itemsService,eventService,initialSelectedTemplateId,canCreateAtRoot,children:jsx(MetadataTemplateBrowserController,{})})})})}export{MetadataTemplateBrowser};
1
+ import{ConsumerStateContextProvider}from"./contexts/contexts.js";import{MetadataTemplateBrowserProvider}from"./contexts/provider.js";import{t as MetadataTemplateBrowserController}from"../../chunks/metadata-template-browser-controller.js";import{TooltipProvider}from"@box/blueprint-web";import{jsx}from"react/jsx-runtime";function MetadataTemplateBrowser({enterpriseId,itemsService,eventService,isLoading,isDisabled,isNamespacesEnabled,initialSelectedTemplateId,canCreateAtRoot,appliedTemplateIds}){return jsx(TooltipProvider,{children:jsx(ConsumerStateContextProvider,{appliedTemplateIds,isDisabled,isLoading,isNamespacesEnabled,children:jsx(MetadataTemplateBrowserProvider,{namespaceFQN:enterpriseId,itemsService,eventService,initialSelectedTemplateId,canCreateAtRoot,isNamespacesEnabled,children:jsx(MetadataTemplateBrowserController,{})})})})}export{MetadataTemplateBrowser};
@@ -1 +1 @@
1
- ._row_1q43q_2{border-radius:var(--bp-radius-06);box-sizing:border-box;cursor:pointer;align-items:center;gap:var(--bp-space-020,8px);outline-offset:-2px;padding:var(--bp-space-020,8px) var(--bp-space-030,12px);flex:1;width:100%;display:flex}._leadingIcon_1q43q_15{flex-shrink:0;align-items:center;display:flex}._content_1q43q_22{flex:1;min-width:0}._trailingSlotHoverOnly_1q43q_29{opacity:0}._item_1q43q_33{outline:none;min-height:40px;display:flex}._item_1q43q_33:hover ._row_1q43q_2{background-color:var(--bp-surface-surface-hover)}._item_1q43q_33[data-selected] ._row_1q43q_2{background-color:var(--bp-surface-item-small-surface-selected);outline:var(--bp-border-02) solid var(--bp-border-list-item-border-selected)}._item_1q43q_33[data-focus-visible] ._row_1q43q_2{outline:2px solid var(--bp-outline-focus-on-light)}._item_1q43q_33._disabled_1q43q_54 ._row_1q43q_2{cursor:default;opacity:.3}._item_1q43q_33._applied_1q43q_61 ._row_1q43q_2{cursor:default}._item_1q43q_33._applied_1q43q_61 ._content_1q43q_22,._item_1q43q_33._applied_1q43q_61 ._leadingIcon_1q43q_15{opacity:.3}._item_1q43q_33._disabled_1q43q_54[data-focus-visible] ._row_1q43q_2{opacity:1}._item_1q43q_33:is(._disabled_1q43q_54,._applied_1q43q_61):hover:not([data-selected]) ._row_1q43q_2,._item_1q43q_33:is(._disabled_1q43q_54,._applied_1q43q_61)[data-hovered]:not([data-selected]) ._row_1q43q_2{background-color:#0000}._item_1q43q_33:hover ._trailingSlotHoverOnly_1q43q_29,._item_1q43q_33[data-hovered] ._trailingSlotHoverOnly_1q43q_29,._item_1q43q_33:focus-within ._trailingSlotHoverOnly_1q43q_29{opacity:1}._trailingSlot_1q43q_29{flex-shrink:0}._subtitle_1q43q_90{overflow-wrap:break-word;display:block}
1
+ ._row_10rt4_2{border-radius:var(--bp-radius-06);box-sizing:border-box;cursor:pointer;align-items:center;gap:var(--bp-space-020,8px);outline-offset:-2px;padding:var(--bp-space-020,8px) var(--bp-space-030,12px);flex:1;width:100%;display:flex}._leadingIcon_10rt4_15{flex-shrink:0;align-items:center;display:flex}._leadingIcon_10rt4_15>svg{height:var(--bp-size-050);width:var(--bp-size-050)}._content_10rt4_27{flex:1;min-width:0}._title_10rt4_34{overflow-wrap:normal;text-overflow:ellipsis;white-space:nowrap;min-width:0;max-width:100%;display:block;overflow:hidden}._trailingSlotHoverOnly_10rt4_44{opacity:0}._item_10rt4_48{outline:none;min-height:40px;display:flex}._item_10rt4_48:hover ._row_10rt4_2{background-color:var(--bp-surface-surface-hover)}._item_10rt4_48[data-selected] ._row_10rt4_2{background-color:var(--bp-surface-item-small-surface-selected);outline:var(--bp-border-02) solid var(--bp-border-list-item-border-selected)}._item_10rt4_48[data-focus-visible] ._row_10rt4_2{outline:2px solid var(--bp-outline-focus-on-light)}._item_10rt4_48._disabled_10rt4_69 ._row_10rt4_2{cursor:default;opacity:.3}._item_10rt4_48._applied_10rt4_76 ._row_10rt4_2{cursor:default}._item_10rt4_48._applied_10rt4_76 ._content_10rt4_27,._item_10rt4_48._applied_10rt4_76 ._leadingIcon_10rt4_15{opacity:.3}._item_10rt4_48._disabled_10rt4_69[data-focus-visible] ._row_10rt4_2{opacity:1}._item_10rt4_48:is(._disabled_10rt4_69,._applied_10rt4_76):hover:not([data-selected]) ._row_10rt4_2,._item_10rt4_48:is(._disabled_10rt4_69,._applied_10rt4_76)[data-hovered]:not([data-selected]) ._row_10rt4_2{background-color:#0000}._item_10rt4_48:hover ._trailingSlotHoverOnly_10rt4_44,._item_10rt4_48[data-hovered] ._trailingSlotHoverOnly_10rt4_44,._item_10rt4_48:focus-within ._trailingSlotHoverOnly_10rt4_44{opacity:1}._trailingSlot_10rt4_44{flex-shrink:0}._subtitle_10rt4_105{overflow-wrap:break-word;display:block}
@@ -1 +1 @@
1
- ._container_1dqk1_1{flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}._searchInput_1dqk1_9{margin-bottom:var(--space-4)}._createTemplateButton_1dqk1_13{justify-content:flex-start;display:flex}
1
+ ._container_1wehq_1{flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}._searchInput_1wehq_9{margin-bottom:var(--bp-space-020)}._searchInputWithBreadcrumb_1wehq_13{margin-bottom:var(--bp-space-040)}._createTemplateButton_1wehq_17{justify-content:flex-start;display:flex}
@@ -1,10 +1,11 @@
1
1
  /**
2
2
  * Renders the namespace path breadcrumb below the search input.
3
3
  *
4
- * Always visible except during active search. At root level shows a single
5
- * non-interactive "Enterprise" crumb. As the user drills in, parent crumbs
6
- * become clickable and call `navigateBack` to restore that FQN from `browseByFqn`.
7
- * The current level (last crumb) is always non-interactive.
4
+ * Hidden when namespaces are disabled (`isNamespacesEnabled={false}`) or during
5
+ * active search. At root level shows a single non-interactive "Enterprise" crumb.
6
+ * As the user drills in, parent crumbs become clickable and call `navigateBack`
7
+ * to restore that FQN from `browseByFqn`. The current level (last crumb) is
8
+ * always non-interactive.
8
9
  *
9
10
  * When the consumer sets `isDisabled`, crumbs are non-interactive (`isInteractive={false}`),
10
11
  * navigation is guarded, and the bar uses the same muted styling as disabled list rows.
@@ -1,9 +1,9 @@
1
1
  interface BrowserRowProps {
2
2
  /** react-aria requires a unique string key for each item in the list */
3
3
  readonly id: string;
4
- /** 16px icon on the left. Omit to render no icon. */
4
+ /** 20px icon on the left. Omit to render no icon. */
5
5
  readonly leadingIcon?: React.ReactNode;
6
- /** Primary display text — rendered via EllipsizableText */
6
+ /** Primary display text — CSS-truncated with a row-level tooltip when ellipsized. */
7
7
  readonly title: string;
8
8
  /** Optional second line below the title. Used by SearchTemplateRow for breadcrumb path. */
9
9
  readonly subtitle?: React.ReactNode;
@@ -26,6 +26,7 @@ interface BrowserRowProps {
26
26
  /**
27
27
  * When provided, a tooltip with this content is shown on hover over the row.
28
28
  * Typically used together with `isApplied` to explain why the row is disabled.
29
+ * Takes precedence over the auto tooltip for an ellipsized title.
29
30
  */
30
31
  readonly tooltipContent?: React.ReactNode;
31
32
  }
@@ -34,17 +34,19 @@ export interface ConsumerStateContextProviderProps {
34
34
  readonly children: React.ReactNode;
35
35
  readonly isLoading?: boolean;
36
36
  readonly isDisabled?: boolean;
37
+ readonly isNamespacesEnabled?: boolean;
37
38
  readonly appliedTemplateIds?: ReadonlySet<string>;
38
39
  }
39
- export declare function ConsumerStateContextProvider({ children, isLoading, isDisabled, appliedTemplateIds, }: Readonly<ConsumerStateContextProviderProps>): import("react/jsx-runtime").JSX.Element;
40
+ export declare function ConsumerStateContextProvider({ children, isLoading, isDisabled, isNamespacesEnabled, appliedTemplateIds, }: Readonly<ConsumerStateContextProviderProps>): import("react/jsx-runtime").JSX.Element;
40
41
  /** Exposes all browser action creators (navigate, search, select, retry, etc.) to the component tree. */
41
42
  export declare const BrowserActionsContext: import('react').Context<BrowserActionsContextValue | null>;
42
43
  interface BrowserActionsContextProviderProps {
43
44
  readonly children: React.ReactNode;
44
45
  readonly itemsServiceRef: MutableRefObject<ItemsService>;
45
46
  readonly eventServiceRef: MutableRefObject<EventService>;
47
+ readonly isNamespacesEnabledRef: MutableRefObject<boolean>;
46
48
  readonly stateRef: MutableRefObject<BrowserState>;
47
49
  readonly dispatch: React.Dispatch<BrowserAction>;
48
50
  }
49
- export declare function BrowserActionsContextProvider({ children, itemsServiceRef, eventServiceRef, stateRef, dispatch, }: Readonly<BrowserActionsContextProviderProps>): import("react/jsx-runtime").JSX.Element;
51
+ export declare function BrowserActionsContextProvider({ children, itemsServiceRef, eventServiceRef, isNamespacesEnabledRef, stateRef, dispatch, }: Readonly<BrowserActionsContextProviderProps>): import("react/jsx-runtime").JSX.Element;
50
52
  export {};
@@ -15,7 +15,7 @@ export declare function useBrowseNode(): BrowseNode;
15
15
  export declare function useSearchState(): SearchStateContextValue;
16
16
  /** Returns the currently selected template ID (`null` when nothing is selected). Must be used inside `MetadataTemplateBrowserProvider`. */
17
17
  export declare function useSelectionState(): SelectionStateContextValue;
18
- /** Returns consumer-driven `isLoading` / `isDisabled` from `MetadataTemplateBrowser`. Must be used inside `ConsumerStateContextProvider`. */
18
+ /** Returns consumer-driven `isLoading` / `isDisabled` / `isNamespacesEnabled` from `MetadataTemplateBrowser`. Must be used inside `ConsumerStateContextProvider`. */
19
19
  export declare function useConsumerState(): ConsumerStateContextValue;
20
20
  /** Returns all browser action creators (navigate, search, select, retry, etc.). Must be used inside `MetadataTemplateBrowserProvider`. */
21
21
  export declare function useBrowserActions(): BrowserActionsContextValue;
@@ -11,10 +11,16 @@ export interface MetadataTemplateBrowserProviderProps {
11
11
  * @default false
12
12
  */
13
13
  readonly canCreateAtRoot?: boolean;
14
+ /**
15
+ * When true, browse actions call `itemsService.getNamespaces`. When false,
16
+ * `getNamespaces` is never invoked even if provided.
17
+ * @default false
18
+ */
19
+ readonly isNamespacesEnabled?: boolean;
14
20
  }
15
21
  /**
16
22
  * Root context provider for the metadata template browser. Initialises the
17
23
  * reducer, wraps consumer-provided services in stable refs, and composes all
18
24
  * state and actions contexts in a single tree.
19
25
  */
20
- export declare function MetadataTemplateBrowserProvider({ children, namespaceFQN, itemsService, eventService, initialSelectedTemplateId, canCreateAtRoot, }: Readonly<MetadataTemplateBrowserProviderProps>): import("react/jsx-runtime").JSX.Element;
26
+ export declare function MetadataTemplateBrowserProvider({ children, namespaceFQN, itemsService, eventService, initialSelectedTemplateId, canCreateAtRoot, isNamespacesEnabled, }: Readonly<MetadataTemplateBrowserProviderProps>): import("react/jsx-runtime").JSX.Element;
@@ -6,4 +6,4 @@ import { BrowserAction, BrowserState } from './reducer';
6
6
  * Services and state are accessed via refs to avoid recreating actions on
7
7
  * every render. Consumed exclusively by `BrowserActionsContextProvider`.
8
8
  */
9
- export declare function useTemplateBrowserActions(itemsServiceRef: MutableRefObject<ItemsService>, eventServiceRef: MutableRefObject<EventService>, stateRef: MutableRefObject<BrowserState>, dispatch: React.Dispatch<BrowserAction>): BrowserActionsContextValue;
9
+ export declare function useTemplateBrowserActions(itemsServiceRef: MutableRefObject<ItemsService>, eventServiceRef: MutableRefObject<EventService>, isNamespacesEnabledRef: MutableRefObject<boolean>, stateRef: MutableRefObject<BrowserState>, dispatch: React.Dispatch<BrowserAction>): BrowserActionsContextValue;
@@ -16,6 +16,13 @@ export interface MetadataTemplateBrowserProps {
16
16
  isLoading?: boolean;
17
17
  /** When true, disables the search input and all row interactions. */
18
18
  isDisabled?: boolean;
19
+ /**
20
+ * When true, loads child namespaces via `itemsService.getNamespaces` and shows
21
+ * namespace navigation (rows + breadcrumb). When false, skips `getNamespaces`
22
+ * even if provided and hides the breadcrumb bar.
23
+ * @default false
24
+ */
25
+ isNamespacesEnabled?: boolean;
19
26
  /** Template ID to auto-select after the initial load completes. */
20
27
  initialSelectedTemplateId?: string;
21
28
  /**
@@ -35,4 +42,4 @@ export interface MetadataTemplateBrowserProps {
35
42
  * Public entry point for the metadata template browser.
36
43
  * Wraps the provider and controller into a single composable component.
37
44
  */
38
- export declare function MetadataTemplateBrowser({ enterpriseId, itemsService, eventService, isLoading, isDisabled, initialSelectedTemplateId, canCreateAtRoot, appliedTemplateIds, }: Readonly<MetadataTemplateBrowserProps>): import("react/jsx-runtime").JSX.Element;
45
+ export declare function MetadataTemplateBrowser({ enterpriseId, itemsService, eventService, isLoading, isDisabled, isNamespacesEnabled, initialSelectedTemplateId, canCreateAtRoot, appliedTemplateIds, }: Readonly<MetadataTemplateBrowserProps>): import("react/jsx-runtime").JSX.Element;
@@ -126,6 +126,12 @@ export interface SelectionStateContextValue {
126
126
  export interface ConsumerStateContextValue {
127
127
  isLoading: boolean;
128
128
  isDisabled: boolean;
129
+ /**
130
+ * When true, the browser loads child namespaces via `itemsService.getNamespaces`
131
+ * and shows namespace navigation (rows + breadcrumb). When false, `getNamespaces`
132
+ * is never called even if provided, and the breadcrumb bar is hidden.
133
+ */
134
+ isNamespacesEnabled: boolean;
129
135
  /** Set of template IDs that are already applied and should be shown as disabled with a tooltip. */
130
136
  appliedTemplateIds: ReadonlySet<string>;
131
137
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@box/metadata-template-browser",
3
- "version": "2.3.3",
3
+ "version": "2.3.5",
4
4
  "license": "SEE LICENSE IN LICENSE",
5
5
  "peerDependencies": {
6
6
  "@box/blueprint-web": "^16.20.6",