@box/metadata-template-browser 2.5.5 → 3.0.0

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{useBrowseNode,useBrowseState,useBrowserActions,useConsumerState,useNavigationState,useSearchState,useSelectionState}from"../esm/lib/contexts/hooks.js";import{t as LoaderSkeleton}from"./loader-skeleton.js";import{BrowseList}from"../esm/lib/components/browse-list/browse-list.js";import{SearchList}from"../esm/lib/components/search-list/search-list.js";import{useIsInitialBrowseLoading}from"../esm/lib/hooks/use-is-initial-browse-loading.js";import{useFocusFirstRowAfterNavigation}from"../esm/lib/hooks/use-focus-first-row-after-navigation.js";import classNames from"clsx";import{useCallback,useMemo,useRef}from"react";import{jsx,jsxs}from"react/jsx-runtime";import '../styles/metadata-template-browser-list-box.css';var metadata_template_browser_list_box_module_default={listBox:`_listBox_1qbmg_1`,browseWrapper:`_browseWrapper_1qbmg_9`,hidden:`_hidden_1qbmg_16`};function MetadataTemplateBrowserListBox(){let{isDisabled}=useConsumerState(),isInitialBrowseLoading=useIsInitialBrowseLoading(),{searchValue,searchResults}=useSearchState(),{namespaces,templates}=useBrowseNode(),{isFetching}=useBrowseState(),{selectedTemplateId}=useSelectionState(),{selectTemplate,navigateTo}=useBrowserActions(),{path}=useNavigationState(),isSearchActive=searchValue.length>0,browseContainerRef=useRef(null);useFocusFirstRowAfterNavigation({containerRef:browseContainerRef,path,isFetching});let handleRowAction=useCallback(key=>{if(isDisabled)return;let id=String(key);if(isSearchActive){let template=searchResults.find(t=>t.id===id);template&&selectTemplate(template);return}let template=templates.find(t=>t.id===id);if(template){selectTemplate(template);return}let namespace=namespaces.find(ns=>ns.id===id);namespace&&navigateTo(namespace)},[isDisabled,isSearchActive,searchResults,templates,namespaces,selectTemplate,navigateTo]),selectedKeys=useMemo(()=>selectedTemplateId?new Set([selectedTemplateId]):new Set,[selectedTemplateId]);return isInitialBrowseLoading?jsx(`div`,{className:metadata_template_browser_list_box_module_default.listBox,children:jsx(LoaderSkeleton,{})}):jsxs(`div`,{className:metadata_template_browser_list_box_module_default.listBox,children:[jsx(`div`,{ref:browseContainerRef,"aria-hidden":isSearchActive,className:classNames(metadata_template_browser_list_box_module_default.browseWrapper,isSearchActive&&metadata_template_browser_list_box_module_default.hidden),children:jsx(BrowseList,{onAction:handleRowAction,selectedKeys})}),isSearchActive&&jsx(SearchList,{onAction:handleRowAction,selectedKeys})]})}export{MetadataTemplateBrowserListBox as t};
1
+ import{useBrowseNode,useBrowseState,useBrowserActions,useConsumerState,useNavigationState,useSearchState,useSelectionState}from"../esm/lib/contexts/hooks.js";import{t as LoaderSkeleton}from"./loader-skeleton.js";import{BrowseList}from"../esm/lib/components/browse-list/browse-list.js";import{SearchList}from"../esm/lib/components/search-list/search-list.js";import{useIsInitialBrowseLoading}from"../esm/lib/hooks/use-is-initial-browse-loading.js";import{useFocusFirstRowAfterNavigation}from"../esm/lib/hooks/use-focus-first-row-after-navigation.js";import classNames from"clsx";import{useCallback,useMemo,useRef}from"react";import{jsx,jsxs}from"react/jsx-runtime";import '../styles/metadata-template-browser-list-box.css';var metadata_template_browser_list_box_module_default={listBox:`_listBox_1qbmg_1`,browseWrapper:`_browseWrapper_1qbmg_9`,hidden:`_hidden_1qbmg_16`};function MetadataTemplateBrowserListBox(){let{isDisabled}=useConsumerState(),isInitialBrowseLoading=useIsInitialBrowseLoading(),{searchValue,searchResults}=useSearchState(),{namespaces,templates}=useBrowseNode(),{isFetching}=useBrowseState(),{selectedTemplateId}=useSelectionState(),{selectTemplate,navigateTo}=useBrowserActions(),{path}=useNavigationState(),isSearchActive=searchValue.length>0,browseContainerRef=useRef(null);useFocusFirstRowAfterNavigation({containerRef:browseContainerRef,path,isFetching});let handleRowAction=useCallback(key=>{if(isDisabled)return;let id=String(key);if(isSearchActive){let template=searchResults.find(t=>t.id===id);template&&selectTemplate(template);return}let template=templates.find(t=>t.id===id);if(template){selectTemplate(template);return}let namespace=namespaces.find(ns=>ns.fqn===id);namespace&&navigateTo(namespace)},[isDisabled,isSearchActive,searchResults,templates,namespaces,selectTemplate,navigateTo]),selectedKeys=useMemo(()=>selectedTemplateId?new Set([selectedTemplateId]):new Set,[selectedTemplateId]);return isInitialBrowseLoading?jsx(`div`,{className:metadata_template_browser_list_box_module_default.listBox,children:jsx(LoaderSkeleton,{})}):jsxs(`div`,{className:metadata_template_browser_list_box_module_default.listBox,children:[jsx(`div`,{ref:browseContainerRef,"aria-hidden":isSearchActive,className:classNames(metadata_template_browser_list_box_module_default.browseWrapper,isSearchActive&&metadata_template_browser_list_box_module_default.hidden),children:jsx(BrowseList,{onAction:handleRowAction,selectedKeys})}),isSearchActive&&jsx(SearchList,{onAction:handleRowAction,selectedKeys})]})}export{MetadataTemplateBrowserListBox as t};
@@ -1 +1 @@
1
- import{useBrowseNode,useBrowseState,useBrowserActions,useConsumerState,useNavigationState}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{NamespaceRow}from"../namespace-row/namespace-row.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{NoTemplates}from"@box/blueprint-web-assets/illustrations/Medium";function BrowseList({onAction,selectedKeys}){let{formatMessage}=useIntl(),{namespaces,templates,isNamespacesExhausted,namespaceNextMarker,templateNextMarker}=useBrowseNode(),{isFetching,isFetchingMore,browseError,loadMoreError}=useBrowseState(),{loadMore,retry,editTemplate,createTemplate}=useBrowserActions(),{namespaceFQN,canCreateInCurrentNamespace}=useNavigationState(),{isDisabled}=useConsumerState(),hasMoreBrowseItems=namespaceNextMarker!==void 0||isNamespacesExhausted&&templateNextMarker!==void 0,renderItem=useCallback(item=>item.kind===`namespace`?jsx(NamespaceRow,{namespace:item.namespace}):jsx(TemplateRow,{onEdit:editTemplate,template:item.template,variant:TemplateRowVariant.Browse}),[editTemplate]);if(isFetching)return jsx(LoaderSkeleton,{});if(browseError!==null)return jsx(ErrorState,{body:formatMessage(messages.browseErrorBody),onRetry:retry});let items=[...namespaces.map(namespace=>({id:namespace.id,kind:`namespace`,namespace})),...templates.map(template=>({id:template.id,kind:`template`,template}))];return items.length===0?jsx(EmptyState,{body:jsx(Text,{as:`p`,children:formatMessage(messages.emptyStateBody)}),illustration:NoTemplates,size:`small`,children:canCreateInCurrentNamespace&&jsx(EmptyState.PrimaryAction,{disabled:isDisabled,onClick:()=>createTemplate(namespaceFQN),children:formatMessage(messages.createFirstTemplateButtonLabel)})}):jsx(VirtualizedGridList,{ariaLabel:formatMessage(messages.listAriaLabel),isFetchingMore,items,listType:TemplateRowVariant.Browse,loadMoreError,onAction,hasMoreItems:hasMoreBrowseItems,onLoadMore:loadMore,onRetry:loadMore,selectedKeys,children:renderItem})}export{BrowseList};
1
+ import{useBrowseNode,useBrowseState,useBrowserActions,useConsumerState,useNavigationState}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{NamespaceRow}from"../namespace-row/namespace-row.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{NoTemplates}from"@box/blueprint-web-assets/illustrations/Medium";function BrowseList({onAction,selectedKeys}){let{formatMessage}=useIntl(),{namespaces,templates,isNamespacesExhausted,namespaceNextMarker,templateNextMarker}=useBrowseNode(),{isFetching,isFetchingMore,browseError,loadMoreError}=useBrowseState(),{loadMore,retry,editTemplate,createTemplate}=useBrowserActions(),{namespaceFQN,canCreateInCurrentNamespace}=useNavigationState(),{isDisabled}=useConsumerState(),hasMoreBrowseItems=namespaceNextMarker!==void 0||isNamespacesExhausted&&templateNextMarker!==void 0,renderItem=useCallback(item=>item.kind===`namespace`?jsx(NamespaceRow,{namespace:item.namespace}):jsx(TemplateRow,{onEdit:editTemplate,template:item.template,variant:TemplateRowVariant.Browse}),[editTemplate]);if(isFetching)return jsx(LoaderSkeleton,{});if(browseError!==null)return jsx(ErrorState,{body:formatMessage(messages.browseErrorBody),onRetry:retry});let items=[...namespaces.map(namespace=>({id:namespace.fqn,kind:`namespace`,namespace})),...templates.map(template=>({id:template.id,kind:`template`,template}))];return items.length===0?jsx(EmptyState,{body:jsx(Text,{as:`p`,children:formatMessage(messages.emptyStateBody)}),illustration:NoTemplates,size:`small`,children:canCreateInCurrentNamespace&&jsx(EmptyState.PrimaryAction,{disabled:isDisabled,onClick:()=>createTemplate(namespaceFQN),children:formatMessage(messages.createFirstTemplateButtonLabel)})}):jsx(VirtualizedGridList,{ariaLabel:formatMessage(messages.listAriaLabel),isFetchingMore,items,listType:TemplateRowVariant.Browse,loadMoreError,onAction,hasMoreItems:hasMoreBrowseItems,onLoadMore:loadMore,onRetry:loadMore,selectedKeys,children:renderItem})}export{BrowseList};
@@ -1 +1 @@
1
- import{useConsumerState}from"../../contexts/hooks.js";import{t as BrowserRow}from"../../../../chunks/browser-row.js";import{messages}from"./messages.js";import{IconButton}from"@box/blueprint-web";import{useIntl}from"react-intl";import{jsx}from"react/jsx-runtime";import{ChevronRight,Folder}from"@box/blueprint-web-assets/icons/Medium";function NamespaceRow({namespace}){let{formatMessage}=useIntl(),{isDisabled}=useConsumerState();return jsx(BrowserRow,{id:namespace.id,leadingIcon:jsx(Folder,{}),title:namespace.displayName,trailingSlot:jsx(IconButton,{"aria-label":formatMessage(messages.navigateAriaLabel,{displayName:namespace.displayName}),disabled:isDisabled,icon:ChevronRight,size:`x-small`})})}export{NamespaceRow};
1
+ import{useConsumerState}from"../../contexts/hooks.js";import{t as BrowserRow}from"../../../../chunks/browser-row.js";import{messages}from"./messages.js";import{IconButton}from"@box/blueprint-web";import{useIntl}from"react-intl";import{jsx}from"react/jsx-runtime";import{ChevronRight,Folder}from"@box/blueprint-web-assets/icons/Medium";function NamespaceRow({namespace}){let{formatMessage}=useIntl(),{isDisabled}=useConsumerState();return jsx(BrowserRow,{id:namespace.fqn,leadingIcon:jsx(Folder,{}),title:namespace.displayName,trailingSlot:jsx(IconButton,{"aria-label":formatMessage(messages.navigateAriaLabel,{displayName:namespace.displayName}),disabled:isDisabled,icon:ChevronRight,size:`x-small`})})}export{NamespaceRow};
@@ -1 +1 @@
1
- import{EMPTY_BROWSE_NODE}from"../constants.js";var BrowserActionType=function(BrowserActionType){return BrowserActionType.NavigateTo=`NAVIGATE_TO`,BrowserActionType.NavigateBack=`NAVIGATE_BACK`,BrowserActionType.BrowseFetchStart=`BROWSE_FETCH_START`,BrowserActionType.BrowseLoaded=`BROWSE_LOADED`,BrowserActionType.InitialLoadError=`INITIAL_LOAD_ERROR`,BrowserActionType.BrowseError=`BROWSE_ERROR`,BrowserActionType.BrowsePageCancelled=`BROWSE_PAGE_CANCELLED`,BrowserActionType.LoadMoreStart=`LOAD_MORE_START`,BrowserActionType.LoadMoreNamespacesLoaded=`LOAD_MORE_NAMESPACES_LOADED`,BrowserActionType.LoadMoreTemplatesLoaded=`LOAD_MORE_TEMPLATES_LOADED`,BrowserActionType.LoadMoreError=`LOAD_MORE_ERROR`,BrowserActionType.LoadMoreCancelled=`LOAD_MORE_CANCELLED`,BrowserActionType.SearchValueChange=`SEARCH_VALUE_CHANGE`,BrowserActionType.SearchFetchStart=`SEARCH_FETCH_START`,BrowserActionType.SearchLoaded=`SEARCH_LOADED`,BrowserActionType.SearchError=`SEARCH_ERROR`,BrowserActionType.SearchClear=`SEARCH_CLEAR`,BrowserActionType.LoadMoreSearchLoaded=`LOAD_MORE_SEARCH_LOADED`,BrowserActionType.TemplateSelect=`TEMPLATE_SELECT`,BrowserActionType.TemplateCreated=`TEMPLATE_CREATED`,BrowserActionType.TemplateUpdated=`TEMPLATE_UPDATED`,BrowserActionType}({}),initialState={namespaceFQN:``,path:[],canCreateInCurrentNamespace:!1,canCreateAtRoot:!1,browseByFqn:new Map,isFetching:!0,isFetchingMore:!1,initialLoadError:null,browseError:null,loadMoreError:null,searchValue:``,searchQuery:``,searchResults:[],searchNextMarker:void 0,isFetchingSearch:!1,searchError:null,selectedTemplateId:null};function resolveCanCreateForFqn(state,fqn){let pathEntry=state.path.find(entry=>entry.fqn===fqn);if(pathEntry?.canCreate!==void 0)return pathEntry.canCreate;for(let node of state.browseByFqn.values()){let match=node.namespaces.find(namespace=>namespace.id===fqn);if(match)return match.canCreate??!1}return state.canCreateAtRoot}function mergeTemplates(existing,incoming){let incomingIds=new Set(incoming.map(template=>template.id));return[...existing.filter(template=>!incomingIds.has(template.id)),...incoming]}function appendUniqueTemplates(existing,incoming){let existingIds=new Set(existing.map(template=>template.id));return[...existing,...incoming.filter(template=>!existingIds.has(template.id))]}function setBrowseNode(browseByFqn,fqn,node){return new Map(browseByFqn).set(fqn,node)}function replaceTemplateById(templates,updated){let found=!1,next=templates.map(template=>template.id===updated.id?(found=!0,updated):template);return found?next:null}function browserReducer(state,action){switch(action.type){case`NAVIGATE_TO`:return{...state,namespaceFQN:action.namespace.id,path:[...state.path,{fqn:action.namespace.id,displayName:action.namespace.displayName,canCreate:action.namespace.canCreate}],canCreateInCurrentNamespace:action.namespace.canCreate??!1,initialLoadError:null,browseError:null,loadMoreError:null};case`NAVIGATE_BACK`:return{...state,namespaceFQN:action.fqn,path:state.path.filter(entry=>action.fqn===entry.fqn||action.fqn.startsWith(`${entry.fqn}.`)),canCreateInCurrentNamespace:resolveCanCreateForFqn(state,action.fqn),initialLoadError:null,browseError:null,loadMoreError:null};case`BROWSE_FETCH_START`:return{...state,isFetching:!0,initialLoadError:null,browseError:null};case`BROWSE_PAGE_CANCELLED`:return{...state,isFetching:!1};case`BROWSE_LOADED`:{let previous=state.browseByFqn.get(state.namespaceFQN);return{...state,isFetching:!1,browseByFqn:setBrowseNode(state.browseByFqn,state.namespaceFQN,{namespaces:action.namespaces,namespaceNextMarker:action.namespaceNextMarker,isNamespacesExhausted:!action.namespaceNextMarker,templates:previous?mergeTemplates(previous.templates,action.templates):action.templates,templateNextMarker:action.templateNextMarker})}}case`INITIAL_LOAD_ERROR`:return{...state,isFetching:!1,initialLoadError:action.error};case`BROWSE_ERROR`:return{...state,isFetching:!1,browseError:action.error};case`LOAD_MORE_START`:return{...state,isFetchingMore:!0,loadMoreError:null};case`LOAD_MORE_NAMESPACES_LOADED`:{let current=state.browseByFqn.get(state.namespaceFQN)??EMPTY_BROWSE_NODE,namespacesExhausted=!action.nextMarker;return{...state,isFetchingMore:!1,browseByFqn:setBrowseNode(state.browseByFqn,state.namespaceFQN,{...current,namespaces:[...current.namespaces,...action.entries],namespaceNextMarker:action.nextMarker,isNamespacesExhausted:namespacesExhausted,...action.templates!==void 0&&{templates:mergeTemplates(current.templates,action.templates),templateNextMarker:action.templateNextMarker}})}}case`LOAD_MORE_TEMPLATES_LOADED`:{let current=state.browseByFqn.get(state.namespaceFQN)??EMPTY_BROWSE_NODE;return{...state,isFetchingMore:!1,browseByFqn:setBrowseNode(state.browseByFqn,state.namespaceFQN,{...current,templates:appendUniqueTemplates(current.templates,action.entries),templateNextMarker:action.nextMarker})}}case`LOAD_MORE_ERROR`:return{...state,isFetchingMore:!1,loadMoreError:action.error};case`LOAD_MORE_CANCELLED`:return{...state,isFetchingMore:!1,loadMoreError:null};case`SEARCH_VALUE_CHANGE`:return{...state,searchValue:action.value};case`SEARCH_FETCH_START`:return{...state,isFetchingSearch:!0,searchQuery:action.query,searchResults:[],searchNextMarker:void 0,searchError:null};case`SEARCH_LOADED`:return{...state,isFetchingSearch:!1,searchResults:action.results,searchNextMarker:action.nextMarker};case`SEARCH_ERROR`:return{...state,isFetchingSearch:!1,searchError:action.error};case`SEARCH_CLEAR`:return{...state,searchValue:``,searchQuery:``,searchResults:[],searchNextMarker:void 0,isFetchingSearch:!1,searchError:null};case`LOAD_MORE_SEARCH_LOADED`:return{...state,isFetchingMore:!1,searchResults:[...state.searchResults,...action.entries],searchNextMarker:action.nextMarker};case`TEMPLATE_SELECT`:return{...state,selectedTemplateId:action.template.id};case`TEMPLATE_CREATED`:{let node=state.browseByFqn.get(action.namespaceFQN);return node?{...state,browseByFqn:setBrowseNode(state.browseByFqn,action.namespaceFQN,{...node,templates:[action.template,...node.templates.filter(template=>template.id!==action.template.id)]})}:state}case`TEMPLATE_UPDATED`:{let browseChanged=!1,browseByFqn=new Map(state.browseByFqn);for(let[fqn,node]of state.browseByFqn){let templates=replaceTemplateById(node.templates,action.template);templates&&(browseByFqn.set(fqn,{...node,templates}),browseChanged=!0)}let searchResults=replaceTemplateById(state.searchResults,action.template);return!browseChanged&&searchResults===null?state:{...state,...browseChanged&&{browseByFqn},...searchResults!==null&&{searchResults}}}default:return state}}export{BrowserActionType,browserReducer,initialState};
1
+ import{EMPTY_BROWSE_NODE}from"../constants.js";var BrowserActionType=function(BrowserActionType){return BrowserActionType.NavigateTo=`NAVIGATE_TO`,BrowserActionType.NavigateBack=`NAVIGATE_BACK`,BrowserActionType.BrowseFetchStart=`BROWSE_FETCH_START`,BrowserActionType.BrowseLoaded=`BROWSE_LOADED`,BrowserActionType.InitialLoadError=`INITIAL_LOAD_ERROR`,BrowserActionType.BrowseError=`BROWSE_ERROR`,BrowserActionType.BrowsePageCancelled=`BROWSE_PAGE_CANCELLED`,BrowserActionType.LoadMoreStart=`LOAD_MORE_START`,BrowserActionType.LoadMoreNamespacesLoaded=`LOAD_MORE_NAMESPACES_LOADED`,BrowserActionType.LoadMoreTemplatesLoaded=`LOAD_MORE_TEMPLATES_LOADED`,BrowserActionType.LoadMoreError=`LOAD_MORE_ERROR`,BrowserActionType.LoadMoreCancelled=`LOAD_MORE_CANCELLED`,BrowserActionType.SearchValueChange=`SEARCH_VALUE_CHANGE`,BrowserActionType.SearchFetchStart=`SEARCH_FETCH_START`,BrowserActionType.SearchLoaded=`SEARCH_LOADED`,BrowserActionType.SearchError=`SEARCH_ERROR`,BrowserActionType.SearchClear=`SEARCH_CLEAR`,BrowserActionType.LoadMoreSearchLoaded=`LOAD_MORE_SEARCH_LOADED`,BrowserActionType.TemplateSelect=`TEMPLATE_SELECT`,BrowserActionType.TemplateCreated=`TEMPLATE_CREATED`,BrowserActionType.TemplateUpdated=`TEMPLATE_UPDATED`,BrowserActionType}({}),initialState={namespaceFQN:``,path:[],canCreateInCurrentNamespace:!1,canCreateAtRoot:!1,browseByFqn:new Map,isFetching:!0,isFetchingMore:!1,initialLoadError:null,browseError:null,loadMoreError:null,searchValue:``,searchQuery:``,searchResults:[],searchNextMarker:void 0,isFetchingSearch:!1,searchError:null,selectedTemplateId:null};function resolveCanCreateForFqn(state,fqn){let pathEntry=state.path.find(entry=>entry.fqn===fqn);if(pathEntry?.canCreate!==void 0)return pathEntry.canCreate;for(let node of state.browseByFqn.values()){let match=node.namespaces.find(namespace=>namespace.fqn===fqn);if(match)return match.canCreate??!1}return state.canCreateAtRoot}function mergeTemplates(existing,incoming){let incomingIds=new Set(incoming.map(template=>template.id));return[...existing.filter(template=>!incomingIds.has(template.id)),...incoming]}function appendUniqueTemplates(existing,incoming){let existingIds=new Set(existing.map(template=>template.id));return[...existing,...incoming.filter(template=>!existingIds.has(template.id))]}function setBrowseNode(browseByFqn,fqn,node){return new Map(browseByFqn).set(fqn,node)}function replaceTemplateById(templates,updated){let found=!1,next=templates.map(template=>template.id===updated.id?(found=!0,updated):template);return found?next:null}function browserReducer(state,action){switch(action.type){case`NAVIGATE_TO`:return{...state,namespaceFQN:action.namespace.fqn,path:[...state.path,{fqn:action.namespace.fqn,displayName:action.namespace.displayName,canCreate:action.namespace.canCreate}],canCreateInCurrentNamespace:action.namespace.canCreate??!1,initialLoadError:null,browseError:null,loadMoreError:null};case`NAVIGATE_BACK`:return{...state,namespaceFQN:action.fqn,path:state.path.filter(entry=>action.fqn===entry.fqn||action.fqn.startsWith(`${entry.fqn}.`)),canCreateInCurrentNamespace:resolveCanCreateForFqn(state,action.fqn),initialLoadError:null,browseError:null,loadMoreError:null};case`BROWSE_FETCH_START`:return{...state,isFetching:!0,initialLoadError:null,browseError:null};case`BROWSE_PAGE_CANCELLED`:return{...state,isFetching:!1};case`BROWSE_LOADED`:{let previous=state.browseByFqn.get(state.namespaceFQN);return{...state,isFetching:!1,browseByFqn:setBrowseNode(state.browseByFqn,state.namespaceFQN,{namespaces:action.namespaces,namespaceNextMarker:action.namespaceNextMarker,isNamespacesExhausted:!action.namespaceNextMarker,templates:previous?mergeTemplates(previous.templates,action.templates):action.templates,templateNextMarker:action.templateNextMarker})}}case`INITIAL_LOAD_ERROR`:return{...state,isFetching:!1,initialLoadError:action.error};case`BROWSE_ERROR`:return{...state,isFetching:!1,browseError:action.error};case`LOAD_MORE_START`:return{...state,isFetchingMore:!0,loadMoreError:null};case`LOAD_MORE_NAMESPACES_LOADED`:{let current=state.browseByFqn.get(state.namespaceFQN)??EMPTY_BROWSE_NODE,namespacesExhausted=!action.nextMarker;return{...state,isFetchingMore:!1,browseByFqn:setBrowseNode(state.browseByFqn,state.namespaceFQN,{...current,namespaces:[...current.namespaces,...action.entries],namespaceNextMarker:action.nextMarker,isNamespacesExhausted:namespacesExhausted,...action.templates!==void 0&&{templates:mergeTemplates(current.templates,action.templates),templateNextMarker:action.templateNextMarker}})}}case`LOAD_MORE_TEMPLATES_LOADED`:{let current=state.browseByFqn.get(state.namespaceFQN)??EMPTY_BROWSE_NODE;return{...state,isFetchingMore:!1,browseByFqn:setBrowseNode(state.browseByFqn,state.namespaceFQN,{...current,templates:appendUniqueTemplates(current.templates,action.entries),templateNextMarker:action.nextMarker})}}case`LOAD_MORE_ERROR`:return{...state,isFetchingMore:!1,loadMoreError:action.error};case`LOAD_MORE_CANCELLED`:return{...state,isFetchingMore:!1,loadMoreError:null};case`SEARCH_VALUE_CHANGE`:return{...state,searchValue:action.value};case`SEARCH_FETCH_START`:return{...state,isFetchingSearch:!0,searchQuery:action.query,searchResults:[],searchNextMarker:void 0,searchError:null};case`SEARCH_LOADED`:return{...state,isFetchingSearch:!1,searchResults:action.results,searchNextMarker:action.nextMarker};case`SEARCH_ERROR`:return{...state,isFetchingSearch:!1,searchError:action.error};case`SEARCH_CLEAR`:return{...state,searchValue:``,searchQuery:``,searchResults:[],searchNextMarker:void 0,isFetchingSearch:!1,searchError:null};case`LOAD_MORE_SEARCH_LOADED`:return{...state,isFetchingMore:!1,searchResults:[...state.searchResults,...action.entries],searchNextMarker:action.nextMarker};case`TEMPLATE_SELECT`:return{...state,selectedTemplateId:action.template.id};case`TEMPLATE_CREATED`:{let node=state.browseByFqn.get(action.namespaceFQN);return node?{...state,browseByFqn:setBrowseNode(state.browseByFqn,action.namespaceFQN,{...node,templates:[action.template,...node.templates.filter(template=>template.id!==action.template.id)]})}:state}case`TEMPLATE_UPDATED`:{let browseChanged=!1,browseByFqn=new Map(state.browseByFqn);for(let[fqn,node]of state.browseByFqn){let templates=replaceTemplateById(node.templates,action.template);templates&&(browseByFqn.set(fqn,{...node,templates}),browseChanged=!0)}let searchResults=replaceTemplateById(state.searchResults,action.template);return!browseChanged&&searchResults===null?state:{...state,...browseChanged&&{browseByFqn},...searchResults!==null&&{searchResults}}}default:return state}}export{BrowserActionType,browserReducer,initialState};
@@ -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 toNavigation=state=>({namespaceFQN:state.namespaceFQN,path:state.path,canCreateInCurrentNamespace:state.canCreateInCurrentNamespace}),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=()=>{let wasLoading=browsePageAbortControllerRef.current!==null;return browsePageAbortControllerRef.current?.abort(),browsePageAbortControllerRef.current=null,dispatch({type:BrowserActionType.BrowsePageCancelled}),wasLoading},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)),browsePageAbortControllerRef.current?.signal===signal&&(browsePageAbortControllerRef.current=null),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=async fqn=>{let isCached=stateRef.current.browseByFqn.has(fqn),wasLoading=abandonBrowsePage();if(abandonBrowseLoadMore(),dispatch({type:BrowserActionType.NavigateBack,fqn}),callEventCallback(()=>eventServiceRef.current.onNamespaceChange?.(fqn)),isCached){wasLoading&&callEventCallback(()=>eventServiceRef.current.onNewViewLoading?.(!1));return}let signal=startBrowsePageRequest();dispatch({type:BrowserActionType.BrowseFetchStart}),callEventCallback(()=>eventServiceRef.current.onNewViewLoading?.(!0)),await fetchBrowsePage(fqn,signal,BrowserActionType.BrowseError),signal.aborted||callEventCallback(()=>eventServiceRef.current.onNewViewLoading?.(!1))},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 navigation=toNavigation(stateRef.current),template=await runTemplateMutation(()=>itemsServiceRef.current.createTemplate?.(namespaceFQN,navigation));template&&(dispatch({type:BrowserActionType.TemplateCreated,template,namespaceFQN}),dispatch({type:BrowserActionType.TemplateSelect,template}),callEventCallback(()=>eventServiceRef.current.onTemplateSelect?.(template)))},editTemplate=async templateId=>{let navigation=toNavigation(stateRef.current),template=await runTemplateMutation(()=>itemsServiceRef.current.updateTemplate?.(templateId,navigation));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 toNavigation=state=>({namespaceFQN:state.namespaceFQN,path:state.path,canCreateInCurrentNamespace:state.canCreateInCurrentNamespace}),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=()=>{let wasLoading=browsePageAbortControllerRef.current!==null;return browsePageAbortControllerRef.current?.abort(),browsePageAbortControllerRef.current=null,dispatch({type:BrowserActionType.BrowsePageCancelled}),wasLoading},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)),browsePageAbortControllerRef.current?.signal===signal&&(browsePageAbortControllerRef.current=null),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.fqn,signal,BrowserActionType.BrowseError);signal.aborted||(callEventCallback(()=>eventServiceRef.current.onNewViewLoading?.(!1)),success&&callEventCallback(()=>eventServiceRef.current.onNamespaceChange?.(namespace.fqn)))},navigateBack=async fqn=>{let isCached=stateRef.current.browseByFqn.has(fqn),wasLoading=abandonBrowsePage();if(abandonBrowseLoadMore(),dispatch({type:BrowserActionType.NavigateBack,fqn}),callEventCallback(()=>eventServiceRef.current.onNamespaceChange?.(fqn)),isCached){wasLoading&&callEventCallback(()=>eventServiceRef.current.onNewViewLoading?.(!1));return}let signal=startBrowsePageRequest();dispatch({type:BrowserActionType.BrowseFetchStart}),callEventCallback(()=>eventServiceRef.current.onNewViewLoading?.(!0)),await fetchBrowsePage(fqn,signal,BrowserActionType.BrowseError),signal.aborted||callEventCallback(()=>eventServiceRef.current.onNewViewLoading?.(!1))},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 navigation=toNavigation(stateRef.current),template=await runTemplateMutation(()=>itemsServiceRef.current.createTemplate?.(namespaceFQN,navigation));template&&(dispatch({type:BrowserActionType.TemplateCreated,template,namespaceFQN}),dispatch({type:BrowserActionType.TemplateSelect,template}),callEventCallback(()=>eventServiceRef.current.onTemplateSelect?.(template)))},editTemplate=async templateId=>{let navigation=toNavigation(stateRef.current),template=await runTemplateMutation(()=>itemsServiceRef.current.updateTemplate?.(templateId,navigation));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};
@@ -3,7 +3,8 @@ export declare enum TemplateRowVariant {
3
3
  Search = "search"
4
4
  }
5
5
  export interface MetadataNamespace {
6
- id: string;
6
+ /** Namespace address, for example `enterprise_123.legal`. Drill-down and breadcrumbs use this value. */
7
+ fqn: string;
7
8
  displayName: string;
8
9
  /** When true, the browser shows a create-template affordance while browsing this namespace. */
9
10
  canCreate?: boolean;
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@box/metadata-template-browser",
3
- "version": "2.5.5",
3
+ "version": "3.0.0",
4
4
  "license": "SEE LICENSE IN LICENSE",
5
5
  "peerDependencies": {
6
- "@box/blueprint-web": "^17.19.1",
7
- "@box/blueprint-web-assets": "^5.11.4",
6
+ "@box/blueprint-web": "^17.20.0",
7
+ "@box/blueprint-web-assets": "^5.11.6",
8
8
  "lodash": "^4.17.15",
9
9
  "react": "^18.0.0",
10
10
  "react-aria-components": "1.16.0",
@@ -12,10 +12,10 @@
12
12
  "react-intl": "^6.4.2"
13
13
  },
14
14
  "devDependencies": {
15
- "@box/blueprint-web": "^17.19.1",
16
- "@box/blueprint-web-assets": "^5.11.4",
17
- "@box/eslint-plugin-blueprint": "2.2.26",
18
- "@box/storybook-utils": "1.3.4",
15
+ "@box/blueprint-web": "^17.20.0",
16
+ "@box/blueprint-web-assets": "^5.11.6",
17
+ "@box/eslint-plugin-blueprint": "2.2.27",
18
+ "@box/storybook-utils": "1.4.1",
19
19
  "react-intl": "^6.4.2"
20
20
  },
21
21
  "publishConfig": {