@box/metadata-template-browser 2.2.19 → 2.3.1
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.
- package/dist/chunks/metadata-template-browser-container.js +1 -1
- package/dist/chunks/metadata-template-browser-controller.js +1 -1
- package/dist/chunks/metadata-template-browser-list-box.js +1 -1
- package/dist/esm/lib/components/browse-list/browse-list.js +1 -1
- package/dist/esm/lib/constants.js +1 -1
- package/dist/esm/lib/contexts/contexts.js +1 -1
- package/dist/esm/lib/contexts/hooks.js +1 -1
- package/dist/esm/lib/contexts/index.js +1 -1
- package/dist/esm/lib/contexts/provider.js +1 -1
- package/dist/esm/lib/contexts/reducer.js +1 -1
- package/dist/esm/lib/contexts/use-template-browser-actions.js +1 -1
- package/dist/esm/lib/hooks/use-is-initial-browse-loading.js +1 -1
- package/dist/types/lib/components/breadcrumb-navigation/breadcrumb-navigation.d.ts +1 -1
- package/dist/types/lib/constants.d.ts +3 -1
- package/dist/types/lib/contexts/contexts.d.ts +7 -5
- package/dist/types/lib/contexts/hooks.d.ts +10 -2
- package/dist/types/lib/contexts/index.d.ts +1 -1
- package/dist/types/lib/contexts/reducer.d.ts +24 -9
- package/dist/types/lib/contexts/use-template-browser-actions.d.ts +2 -2
- package/dist/types/lib/metadata-template-browser.d.ts +6 -3
- package/dist/types/lib/stories/shared/create-mock-items-service.d.ts +4 -0
- package/dist/types/lib/types.d.ts +35 -18
- package/package.json +7 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
import{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(),{
|
|
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 +1 @@
|
|
|
1
|
-
import{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(),{
|
|
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 +1 @@
|
|
|
1
|
-
import{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,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.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 +1 @@
|
|
|
1
|
-
import{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,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
|
|
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 +1 @@
|
|
|
1
|
-
var LOAD_MORE_ERROR_ROW_ID=`LOAD_MORE_ERROR_ROW_ID`,LOAD_MORE_LOADING_ROW_ID=`LOAD_MORE_LOADING_ROW_ID`,LOAD_MORE_SENTINEL_ID=`LOAD_MORE_SENTINEL_ID`,PAGE_SIZE=200,SEARCH_DEBOUNCE_MS=500,emptyNamespacesResponse={entries:[]},emptyTemplatesResponse={entries:[]};export{LOAD_MORE_ERROR_ROW_ID,LOAD_MORE_LOADING_ROW_ID,LOAD_MORE_SENTINEL_ID,PAGE_SIZE,SEARCH_DEBOUNCE_MS,emptyNamespacesResponse,emptyTemplatesResponse};
|
|
1
|
+
var LOAD_MORE_ERROR_ROW_ID=`LOAD_MORE_ERROR_ROW_ID`,LOAD_MORE_LOADING_ROW_ID=`LOAD_MORE_LOADING_ROW_ID`,LOAD_MORE_SENTINEL_ID=`LOAD_MORE_SENTINEL_ID`,PAGE_SIZE=200,SEARCH_DEBOUNCE_MS=500,emptyNamespacesResponse={entries:[]},emptyTemplatesResponse={entries:[]},EMPTY_BROWSE_NODE={namespaces:[],templates:[],isNamespacesExhausted:!1,namespaceNextMarker:void 0,templateNextMarker:void 0};export{EMPTY_BROWSE_NODE,LOAD_MORE_ERROR_ROW_ID,LOAD_MORE_LOADING_ROW_ID,LOAD_MORE_SENTINEL_ID,PAGE_SIZE,SEARCH_DEBOUNCE_MS,emptyNamespacesResponse,emptyTemplatesResponse};
|
|
@@ -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,
|
|
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 +1 @@
|
|
|
1
|
-
import{BrowseStateContext,BrowserActionsContext,ConsumerStateContext,NavigationStateContext,SearchStateContext,SelectionStateContext}from"./contexts.js";import{useContext}from"react";function useNavigationState(){let context=useContext(NavigationStateContext);if(context===null)throw Error(`useNavigationState must be used within a MetadataTemplateBrowserProvider`);return context}function useBrowseState(){let context=useContext(BrowseStateContext);if(context===null)throw Error(`useBrowseState must be used within a MetadataTemplateBrowserProvider`);return context}function useSearchState(){let context=useContext(SearchStateContext);if(context===null)throw Error(`useSearchState must be used within a MetadataTemplateBrowserProvider`);return context}function useSelectionState(){let context=useContext(SelectionStateContext);if(context===null)throw Error(`useSelectionState must be used within a MetadataTemplateBrowserProvider`);return context}function useConsumerState(){let context=useContext(ConsumerStateContext);if(context===null)throw Error(`useConsumerState must be used within a ConsumerStateContextProvider`);return context}function useBrowserActions(){let context=useContext(BrowserActionsContext);if(context===null)throw Error(`useBrowserActions must be used within a MetadataTemplateBrowserProvider`);return context}export{useBrowseState,useBrowserActions,useConsumerState,useNavigationState,useSearchState,useSelectionState};
|
|
1
|
+
import{EMPTY_BROWSE_NODE}from"../constants.js";import{BrowseStateContext,BrowserActionsContext,ConsumerStateContext,NavigationStateContext,SearchStateContext,SelectionStateContext}from"./contexts.js";import{useContext}from"react";function useNavigationState(){let context=useContext(NavigationStateContext);if(context===null)throw Error(`useNavigationState must be used within a MetadataTemplateBrowserProvider`);return context}function useBrowseState(){let context=useContext(BrowseStateContext);if(context===null)throw Error(`useBrowseState must be used within a MetadataTemplateBrowserProvider`);return context}function useBrowseNode(){let{browseByFqn}=useBrowseState(),{namespaceFQN}=useNavigationState();return browseByFqn.get(namespaceFQN)??EMPTY_BROWSE_NODE}function useSearchState(){let context=useContext(SearchStateContext);if(context===null)throw Error(`useSearchState must be used within a MetadataTemplateBrowserProvider`);return context}function useSelectionState(){let context=useContext(SelectionStateContext);if(context===null)throw Error(`useSelectionState must be used within a MetadataTemplateBrowserProvider`);return context}function useConsumerState(){let context=useContext(ConsumerStateContext);if(context===null)throw Error(`useConsumerState must be used within a ConsumerStateContextProvider`);return context}function useBrowserActions(){let context=useContext(BrowserActionsContext);if(context===null)throw Error(`useBrowserActions must be used within a MetadataTemplateBrowserProvider`);return context}export{useBrowseNode,useBrowseState,useBrowserActions,useConsumerState,useNavigationState,useSearchState,useSelectionState};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{browserReducer,initialState}from"./reducer.js";import{ConsumerStateContext,ConsumerStateContextProvider}from"./contexts.js";import{MetadataTemplateBrowserProvider}from"./provider.js";import{useBrowseState,useBrowserActions,useConsumerState,useNavigationState,useSearchState,useSelectionState}from"./hooks.js";export{ConsumerStateContext,ConsumerStateContextProvider,MetadataTemplateBrowserProvider,browserReducer,initialState,useBrowseState,useBrowserActions,useConsumerState,useNavigationState,useSearchState,useSelectionState};
|
|
1
|
+
import{browserReducer,initialState}from"./reducer.js";import{ConsumerStateContext,ConsumerStateContextProvider}from"./contexts.js";import{MetadataTemplateBrowserProvider}from"./provider.js";import{useBrowseNode,useBrowseState,useBrowserActions,useConsumerState,useNavigationState,useSearchState,useSelectionState}from"./hooks.js";export{ConsumerStateContext,ConsumerStateContextProvider,MetadataTemplateBrowserProvider,browserReducer,initialState,useBrowseNode,useBrowseState,useBrowserActions,useConsumerState,useNavigationState,useSearchState,useSelectionState};
|
|
@@ -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}),stateRef=useRef(state);stateRef.current=state;let
|
|
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 +1 @@
|
|
|
1
|
-
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.LoadMoreStart=`LOAD_MORE_START`,BrowserActionType.LoadMoreNamespacesLoaded=`LOAD_MORE_NAMESPACES_LOADED`,BrowserActionType.LoadMoreTemplatesLoaded=`LOAD_MORE_TEMPLATES_LOADED`,BrowserActionType.LoadMoreError=`LOAD_MORE_ERROR`,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}({}),initialState={namespaceFQN:``,path:[],canCreateInCurrentNamespace:!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:!1,isFetchingMore:!1,initialLoadError:null,browseError:null,loadMoreError:null,searchValue:``,searchQuery:``,searchResults:[],searchNextMarker:void 0,isFetchingSearch:!1,searchError:null,selectedTemplateId:null};function resolveCanCreateForFqn(state,fqn){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}],canCreateInCurrentNamespace:action.namespace.canCreate??!1,initialLoadError:null,browseError:null,loadMoreError:null};case`NAVIGATE_BACK`:return state.browseByFqn.has(action.fqn)?{...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}:state;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{
|
|
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 +1 @@
|
|
|
1
|
-
import{useBrowseState,useConsumerState,useNavigationState}from"../contexts/hooks.js";function useIsInitialBrowseLoading(){let{isLoading:isConsumerLoading}=useConsumerState(),{path}=useNavigationState(),{isFetching,namespaces,templates}=
|
|
1
|
+
import{useBrowseNode,useBrowseState,useConsumerState,useNavigationState}from"../contexts/hooks.js";function useIsInitialBrowseLoading(){let{isLoading:isConsumerLoading}=useConsumerState(),{path}=useNavigationState(),{isFetching}=useBrowseState(),{namespaces,templates}=useBrowseNode(),hasItems=namespaces.length>0||templates.length>0;return isConsumerLoading||isFetching&&!hasItems&&path.length===0}export{useIsInitialBrowseLoading};
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Always visible except during active search. At root level shows a single
|
|
5
5
|
* non-interactive "Enterprise" crumb. As the user drills in, parent crumbs
|
|
6
|
-
* become clickable and call `navigateBack`
|
|
6
|
+
* become clickable and call `navigateBack` to restore that FQN from `browseByFqn`.
|
|
7
7
|
* The current level (last crumb) is always non-interactive.
|
|
8
8
|
*
|
|
9
9
|
* When the consumer sets `isDisabled`, crumbs are non-interactive (`isInteractive={false}`),
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { FetchResponse, MetadataNamespace, MetadataTemplate } from './types';
|
|
1
|
+
import { BrowseNode, FetchResponse, MetadataNamespace, MetadataTemplate } from './types';
|
|
2
2
|
export declare const LOAD_MORE_ERROR_ROW_ID = "LOAD_MORE_ERROR_ROW_ID";
|
|
3
3
|
export declare const LOAD_MORE_LOADING_ROW_ID = "LOAD_MORE_LOADING_ROW_ID";
|
|
4
4
|
export declare const LOAD_MORE_SENTINEL_ID = "LOAD_MORE_SENTINEL_ID";
|
|
@@ -6,3 +6,5 @@ export declare const PAGE_SIZE = 200;
|
|
|
6
6
|
export declare const SEARCH_DEBOUNCE_MS = 500;
|
|
7
7
|
export declare const emptyNamespacesResponse: FetchResponse<MetadataNamespace>;
|
|
8
8
|
export declare const emptyTemplatesResponse: FetchResponse<MetadataTemplate>;
|
|
9
|
+
/** Shared empty fallback when `browseByFqn` has no entry for the current FQN yet. */
|
|
10
|
+
export declare const EMPTY_BROWSE_NODE: BrowseNode;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { MutableRefObject } from 'react';
|
|
2
|
-
import { BrowserActionsContextValue, BrowseStateContextValue, ConsumerStateContextValue, EventService, ItemsService,
|
|
2
|
+
import { BrowserActionsContextValue, BrowseStateContextValue, ConsumerStateContextValue, EventService, ItemsService, NavigationStateContextValue, SearchStateContextValue, SelectionStateContextValue } from '../types';
|
|
3
3
|
import { BrowserAction, BrowserState } from './reducer';
|
|
4
4
|
/** Holds the current namespace FQN and breadcrumb path for navigation. */
|
|
5
5
|
export declare const NavigationStateContext: import('react').Context<NavigationStateContextValue | null>;
|
|
@@ -7,12 +7,15 @@ interface NavigationStateContextProviderProps extends NavigationStateContextValu
|
|
|
7
7
|
readonly children: React.ReactNode;
|
|
8
8
|
}
|
|
9
9
|
export declare function NavigationStateContextProvider({ children, namespaceFQN, path, canCreateInCurrentNamespace, }: Readonly<NavigationStateContextProviderProps>): import("react/jsx-runtime").JSX.Element;
|
|
10
|
-
/**
|
|
10
|
+
/**
|
|
11
|
+
* Holds `browseByFqn` (namespaces/templates per FQN) plus browse fetch/error flags.
|
|
12
|
+
* Read the current FQN's node with `useBrowseNode`.
|
|
13
|
+
*/
|
|
11
14
|
export declare const BrowseStateContext: import('react').Context<BrowseStateContextValue | null>;
|
|
12
15
|
interface BrowseStateContextProviderProps extends BrowseStateContextValue {
|
|
13
16
|
readonly children: React.ReactNode;
|
|
14
17
|
}
|
|
15
|
-
export declare function BrowseStateContextProvider({ children,
|
|
18
|
+
export declare function BrowseStateContextProvider({ children, browseByFqn, isFetching, isFetchingMore, initialLoadError, browseError, loadMoreError, }: Readonly<BrowseStateContextProviderProps>): import("react/jsx-runtime").JSX.Element;
|
|
16
19
|
/** Holds the search input value, debounced query, results, and search-specific fetch/error state. */
|
|
17
20
|
export declare const SearchStateContext: import('react').Context<SearchStateContextValue | null>;
|
|
18
21
|
interface SearchStateContextProviderProps extends SearchStateContextValue {
|
|
@@ -42,7 +45,6 @@ interface BrowserActionsContextProviderProps {
|
|
|
42
45
|
readonly eventServiceRef: MutableRefObject<EventService>;
|
|
43
46
|
readonly stateRef: MutableRefObject<BrowserState>;
|
|
44
47
|
readonly dispatch: React.Dispatch<BrowserAction>;
|
|
45
|
-
readonly levelCache: MutableRefObject<Map<string, LevelCache>>;
|
|
46
48
|
}
|
|
47
|
-
export declare function BrowserActionsContextProvider({ children, itemsServiceRef, eventServiceRef, stateRef, dispatch,
|
|
49
|
+
export declare function BrowserActionsContextProvider({ children, itemsServiceRef, eventServiceRef, stateRef, dispatch, }: Readonly<BrowserActionsContextProviderProps>): import("react/jsx-runtime").JSX.Element;
|
|
48
50
|
export {};
|
|
@@ -1,8 +1,16 @@
|
|
|
1
|
-
import { BrowserActionsContextValue, BrowseStateContextValue, ConsumerStateContextValue, NavigationStateContextValue, SearchStateContextValue, SelectionStateContextValue } from '../types';
|
|
1
|
+
import { BrowserActionsContextValue, BrowseNode, BrowseStateContextValue, ConsumerStateContextValue, NavigationStateContextValue, SearchStateContextValue, SelectionStateContextValue } from '../types';
|
|
2
2
|
/** Returns the current namespace FQN and breadcrumb path. Must be used inside `MetadataTemplateBrowserProvider`. */
|
|
3
3
|
export declare function useNavigationState(): NavigationStateContextValue;
|
|
4
|
-
/**
|
|
4
|
+
/**
|
|
5
|
+
* Returns browse fetch/error flags and the full `browseByFqn` map.
|
|
6
|
+
* Prefer `useBrowseNode` for the current FQN's namespaces and templates.
|
|
7
|
+
*/
|
|
5
8
|
export declare function useBrowseState(): BrowseStateContextValue;
|
|
9
|
+
/**
|
|
10
|
+
* Returns the `BrowseNode` for the current `namespaceFQN`, or an empty node when
|
|
11
|
+
* that FQN has not been loaded yet.
|
|
12
|
+
*/
|
|
13
|
+
export declare function useBrowseNode(): BrowseNode;
|
|
6
14
|
/** Returns search state: input value, debounced query, results, and search-specific fetch/error. Must be used inside `MetadataTemplateBrowserProvider`. */
|
|
7
15
|
export declare function useSearchState(): SearchStateContextValue;
|
|
8
16
|
/** Returns the currently selected template ID (`null` when nothing is selected). Must be used inside `MetadataTemplateBrowserProvider`. */
|
|
@@ -4,4 +4,4 @@ export { ConsumerStateContext, ConsumerStateContextProvider } from './contexts';
|
|
|
4
4
|
export type { ConsumerStateContextProviderProps } from './contexts';
|
|
5
5
|
export { MetadataTemplateBrowserProvider } from './provider';
|
|
6
6
|
export type { MetadataTemplateBrowserProviderProps } from './provider';
|
|
7
|
-
export { useBrowserActions, useBrowseState, useConsumerState, useNavigationState, useSearchState, useSelectionState, } from './hooks';
|
|
7
|
+
export { useBrowserActions, useBrowseNode, useBrowseState, useConsumerState, useNavigationState, useSearchState, useSelectionState, } from './hooks';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BreadcrumbEntry,
|
|
1
|
+
import { BreadcrumbEntry, BrowseNode, MetadataNamespace, MetadataTemplate } from '../types';
|
|
2
2
|
export declare enum BrowserActionType {
|
|
3
3
|
NavigateTo = "NAVIGATE_TO",
|
|
4
4
|
NavigateBack = "NAVIGATE_BACK",
|
|
@@ -6,28 +6,33 @@ export declare enum BrowserActionType {
|
|
|
6
6
|
BrowseLoaded = "BROWSE_LOADED",
|
|
7
7
|
InitialLoadError = "INITIAL_LOAD_ERROR",
|
|
8
8
|
BrowseError = "BROWSE_ERROR",
|
|
9
|
+
/** Page-fetch abort: clears `isFetching` only. */
|
|
10
|
+
BrowsePageCancelled = "BROWSE_PAGE_CANCELLED",
|
|
9
11
|
LoadMoreStart = "LOAD_MORE_START",
|
|
10
12
|
LoadMoreNamespacesLoaded = "LOAD_MORE_NAMESPACES_LOADED",
|
|
11
13
|
LoadMoreTemplatesLoaded = "LOAD_MORE_TEMPLATES_LOADED",
|
|
12
14
|
LoadMoreError = "LOAD_MORE_ERROR",
|
|
15
|
+
/** Load-more abort (browse or search): clears `isFetchingMore` only. */
|
|
16
|
+
LoadMoreCancelled = "LOAD_MORE_CANCELLED",
|
|
13
17
|
SearchValueChange = "SEARCH_VALUE_CHANGE",
|
|
14
18
|
SearchFetchStart = "SEARCH_FETCH_START",
|
|
15
19
|
SearchLoaded = "SEARCH_LOADED",
|
|
16
20
|
SearchError = "SEARCH_ERROR",
|
|
17
21
|
SearchClear = "SEARCH_CLEAR",
|
|
18
22
|
LoadMoreSearchLoaded = "LOAD_MORE_SEARCH_LOADED",
|
|
19
|
-
TemplateSelect = "TEMPLATE_SELECT"
|
|
23
|
+
TemplateSelect = "TEMPLATE_SELECT",
|
|
24
|
+
TemplateCreated = "TEMPLATE_CREATED",
|
|
25
|
+
TemplateUpdated = "TEMPLATE_UPDATED"
|
|
20
26
|
}
|
|
21
|
-
/** Complete reducer state for the metadata template browser
|
|
27
|
+
/** Complete reducer state for the metadata template browser. */
|
|
22
28
|
export interface BrowserState {
|
|
23
29
|
namespaceFQN: string;
|
|
24
30
|
path: BreadcrumbEntry[];
|
|
25
31
|
canCreateInCurrentNamespace: boolean;
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
templateNextMarker: string | undefined;
|
|
32
|
+
/** Root-level create flag from `canCreateAtRoot`; used when navigating back to the enterprise FQN. */
|
|
33
|
+
canCreateAtRoot: boolean;
|
|
34
|
+
/** Child namespaces/templates per FQN. Current view is `browseByFqn.get(namespaceFQN)`. */
|
|
35
|
+
browseByFqn: ReadonlyMap<string, BrowseNode>;
|
|
31
36
|
isFetching: boolean;
|
|
32
37
|
isFetchingMore: boolean;
|
|
33
38
|
initialLoadError: string | null;
|
|
@@ -48,7 +53,6 @@ export type BrowserAction = {
|
|
|
48
53
|
} | {
|
|
49
54
|
type: BrowserActionType.NavigateBack;
|
|
50
55
|
fqn: string;
|
|
51
|
-
cached: LevelCache;
|
|
52
56
|
} | {
|
|
53
57
|
type: BrowserActionType.BrowseFetchStart;
|
|
54
58
|
} | {
|
|
@@ -63,6 +67,8 @@ export type BrowserAction = {
|
|
|
63
67
|
} | {
|
|
64
68
|
type: BrowserActionType.BrowseError;
|
|
65
69
|
error: string;
|
|
70
|
+
} | {
|
|
71
|
+
type: BrowserActionType.BrowsePageCancelled;
|
|
66
72
|
} | {
|
|
67
73
|
type: BrowserActionType.LoadMoreStart;
|
|
68
74
|
} | {
|
|
@@ -79,6 +85,8 @@ export type BrowserAction = {
|
|
|
79
85
|
} | {
|
|
80
86
|
type: BrowserActionType.LoadMoreError;
|
|
81
87
|
error: string;
|
|
88
|
+
} | {
|
|
89
|
+
type: BrowserActionType.LoadMoreCancelled;
|
|
82
90
|
} | {
|
|
83
91
|
type: BrowserActionType.SearchValueChange;
|
|
84
92
|
value: string;
|
|
@@ -101,6 +109,13 @@ export type BrowserAction = {
|
|
|
101
109
|
} | {
|
|
102
110
|
type: BrowserActionType.TemplateSelect;
|
|
103
111
|
template: MetadataTemplate;
|
|
112
|
+
} | {
|
|
113
|
+
type: BrowserActionType.TemplateCreated;
|
|
114
|
+
template: MetadataTemplate;
|
|
115
|
+
namespaceFQN: string;
|
|
116
|
+
} | {
|
|
117
|
+
type: BrowserActionType.TemplateUpdated;
|
|
118
|
+
template: MetadataTemplate;
|
|
104
119
|
};
|
|
105
120
|
export declare const initialState: BrowserState;
|
|
106
121
|
/** Pure reducer for `BrowserState`. */
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { MutableRefObject } from 'react';
|
|
2
|
-
import { BrowserActionsContextValue, EventService, ItemsService
|
|
2
|
+
import { BrowserActionsContextValue, EventService, ItemsService } from '../types';
|
|
3
3
|
import { BrowserAction, BrowserState } from './reducer';
|
|
4
4
|
/**
|
|
5
5
|
* Returns a stable memoized object of all browser action creators.
|
|
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
|
|
9
|
+
export declare function useTemplateBrowserActions(itemsServiceRef: MutableRefObject<ItemsService>, eventServiceRef: MutableRefObject<EventService>, stateRef: MutableRefObject<BrowserState>, dispatch: React.Dispatch<BrowserAction>): BrowserActionsContextValue;
|
|
@@ -2,9 +2,12 @@ import { EventService, ItemsService } from './types';
|
|
|
2
2
|
export interface MetadataTemplateBrowserProps {
|
|
3
3
|
/** Enterprise ID used as the root namespace FQN (e.g. "enterprise_123"). */
|
|
4
4
|
enterpriseId: string;
|
|
5
|
-
/**
|
|
5
|
+
/**
|
|
6
|
+
* Data service implementation: reads for namespaces, templates, and search, plus the
|
|
7
|
+
* optional create and update operations that back the browser's own affordances.
|
|
8
|
+
*/
|
|
6
9
|
itemsService: ItemsService;
|
|
7
|
-
/** Observer callbacks invoked on state transitions (namespace change, search, template selection
|
|
10
|
+
/** Observer callbacks invoked on state transitions (namespace change, search, template selection). */
|
|
8
11
|
eventService: EventService;
|
|
9
12
|
/**
|
|
10
13
|
* When true, suppresses the initial data fetch and shows loading in the list
|
|
@@ -17,7 +20,7 @@ export interface MetadataTemplateBrowserProps {
|
|
|
17
20
|
initialSelectedTemplateId?: string;
|
|
18
21
|
/**
|
|
19
22
|
* Whether template creation is allowed at the root (enterprise) namespace.
|
|
20
|
-
* When true and `
|
|
23
|
+
* When true and `itemsService.createTemplate` is provided, a create-template
|
|
21
24
|
* button is shown below the breadcrumb in browse mode.
|
|
22
25
|
* @default false
|
|
23
26
|
*/
|
|
@@ -47,6 +47,10 @@ export interface CreateMockItemsServiceOptions {
|
|
|
47
47
|
errors?: Partial<Record<ItemsServiceMethod, ErrorConfig>>;
|
|
48
48
|
/** Throws only on paginated calls (when a marker is present) to the given method. */
|
|
49
49
|
loadMoreErrors?: Partial<Record<ItemsServiceMethod, Error | string>>;
|
|
50
|
+
/** Optional create operation; omit to leave create affordances without a backing op. */
|
|
51
|
+
createTemplate?: ItemsService['createTemplate'];
|
|
52
|
+
/** Optional update operation; omit to leave row edit without a backing op. */
|
|
53
|
+
updateTemplate?: ItemsService['updateTemplate'];
|
|
50
54
|
}
|
|
51
55
|
export declare const DEFAULT_TEMPLATES_BY_FQN: Record<string, MetadataTemplate[]>;
|
|
52
56
|
export declare const createMockItemsService: (options?: CreateMockItemsServiceOptions) => ItemsService;
|
|
@@ -48,20 +48,38 @@ export interface ItemsService {
|
|
|
48
48
|
getNamespaces?: (namespaceFQN: string, params: FetchParams) => Promise<FetchResponse<MetadataNamespace>>;
|
|
49
49
|
getTemplates?: (namespaceFQN: string, params: FetchParams) => Promise<FetchResponse<MetadataTemplate>>;
|
|
50
50
|
getSearchResults?: (query: string, params: FetchParams) => Promise<FetchResponse<MetadataTemplate>>;
|
|
51
|
+
/**
|
|
52
|
+
* Creates a template in `namespaceFQN`, resolving with it so the browser can show
|
|
53
|
+
* it immediately, or with `undefined` when the user abandoned the operation.
|
|
54
|
+
*
|
|
55
|
+
* The implementation owns its own UI (a form, a modal, a wizard) and its own
|
|
56
|
+
* failure reporting. A rejection is swallowed rather than surfaced as a list
|
|
57
|
+
* error, so reject only once the failure has been reported to the user.
|
|
58
|
+
*
|
|
59
|
+
* Providing this method is what enables the browser's create-template
|
|
60
|
+
* affordances; `canCreateAtRoot` and `MetadataNamespace.canCreate` decide where
|
|
61
|
+
* they appear.
|
|
62
|
+
*/
|
|
63
|
+
createTemplate?: (namespaceFQN: string) => Promise<MetadataTemplate | undefined>;
|
|
64
|
+
/**
|
|
65
|
+
* Updates the template identified by `templateId` under the same contract as
|
|
66
|
+
* `createTemplate`, resolving with the updated template or `undefined`.
|
|
67
|
+
*
|
|
68
|
+
* Providing this method is what enables the row edit affordance;
|
|
69
|
+
* `MetadataTemplate.canEdit` decides which rows show it.
|
|
70
|
+
*/
|
|
71
|
+
updateTemplate?: (templateId: string) => Promise<MetadataTemplate | undefined>;
|
|
51
72
|
}
|
|
52
73
|
export interface EventService {
|
|
53
74
|
onNamespaceChange?: (namespaceFQN: string) => Promise<void>;
|
|
54
75
|
onSearchChange?: (query: string) => Promise<void>;
|
|
55
76
|
onTemplateSelect?: (template: MetadataTemplate) => Promise<void>;
|
|
56
|
-
onTemplateEdit?: (templateId: string) => void;
|
|
57
77
|
/**
|
|
58
78
|
* Called when an **initial-load, navigation, or search** fetch starts (`true`) or
|
|
59
79
|
* settles (`false`). Not called during `loadMore` pagination — that operation is
|
|
60
80
|
* tracked separately by the `isFetchingMore` flag in `BrowseStateContextValue`.
|
|
61
81
|
*/
|
|
62
82
|
onNewViewLoading?: (isFetching: boolean) => void;
|
|
63
|
-
/** Called when the user clicks the create-template affordance while browsing a namespace. */
|
|
64
|
-
onCreateTemplate?: (namespaceFQN: string) => void;
|
|
65
83
|
}
|
|
66
84
|
export interface BreadcrumbEntry {
|
|
67
85
|
fqn: string;
|
|
@@ -81,12 +99,20 @@ export interface NavigationStateContextValue {
|
|
|
81
99
|
/** True when the current namespace (or root) allows template creation. */
|
|
82
100
|
canCreateInCurrentNamespace: boolean;
|
|
83
101
|
}
|
|
84
|
-
|
|
102
|
+
/**
|
|
103
|
+
* Child namespaces and templates for one browse FQN, plus that level's pagination.
|
|
104
|
+
* Stored in `browseByFqn` and read for the current FQN via `useBrowseNode`.
|
|
105
|
+
*/
|
|
106
|
+
export interface BrowseNode {
|
|
85
107
|
namespaces: MetadataNamespace[];
|
|
86
108
|
templates: MetadataTemplate[];
|
|
87
109
|
isNamespacesExhausted: boolean;
|
|
88
110
|
namespaceNextMarker: string | undefined;
|
|
89
111
|
templateNextMarker: string | undefined;
|
|
112
|
+
}
|
|
113
|
+
export interface BrowseStateContextValue {
|
|
114
|
+
/** Browse data keyed by namespace FQN. The current view is `browseByFqn.get(namespaceFQN)`. */
|
|
115
|
+
browseByFqn: ReadonlyMap<string, BrowseNode>;
|
|
90
116
|
isFetching: boolean;
|
|
91
117
|
isFetchingMore: boolean;
|
|
92
118
|
initialLoadError: string | null;
|
|
@@ -108,7 +134,7 @@ export interface BrowserActionsContextValue {
|
|
|
108
134
|
initialLoad: () => Promise<void>;
|
|
109
135
|
/** Navigates into a namespace, loading its child namespaces and templates. */
|
|
110
136
|
navigateTo: (namespace: MetadataNamespace) => Promise<void>;
|
|
111
|
-
/** Navigates back to the level identified by `fqn`,
|
|
137
|
+
/** Navigates back to the level identified by `fqn`, already stored in `browseByFqn`. */
|
|
112
138
|
navigateBack: (fqn: string) => void;
|
|
113
139
|
/** Updates the search query; an empty string exits search mode and returns to browse. */
|
|
114
140
|
setSearchValue: (value: string) => void;
|
|
@@ -120,19 +146,10 @@ export interface BrowserActionsContextValue {
|
|
|
120
146
|
loadMore: () => Promise<void>;
|
|
121
147
|
/** Notifies the event service that the user has selected a template. */
|
|
122
148
|
selectTemplate: (template: MetadataTemplate) => Promise<void>;
|
|
123
|
-
/**
|
|
124
|
-
editTemplate: (templateId: string) => void
|
|
125
|
-
/**
|
|
126
|
-
createTemplate: (namespaceFQN: string) => void
|
|
149
|
+
/** Runs the items service's update operation and shows the returned template in place. */
|
|
150
|
+
editTemplate: (templateId: string) => Promise<void>;
|
|
151
|
+
/** Runs the items service's create operation and shows the returned template at the top of the namespace. */
|
|
152
|
+
createTemplate: (namespaceFQN: string) => Promise<void>;
|
|
127
153
|
/** Re-runs the failing operation based on the current mode (browse or search). */
|
|
128
154
|
retry: () => Promise<void>;
|
|
129
155
|
}
|
|
130
|
-
export interface LevelCache {
|
|
131
|
-
namespaces: MetadataNamespace[];
|
|
132
|
-
templates: MetadataTemplate[];
|
|
133
|
-
namespaceNextMarker: string | undefined;
|
|
134
|
-
templateNextMarker: string | undefined;
|
|
135
|
-
isNamespacesExhausted: boolean;
|
|
136
|
-
/** Cached `canCreateInCurrentNamespace` for this namespace, restored on `navigateBack`. */
|
|
137
|
-
canCreate: boolean;
|
|
138
|
-
}
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@box/metadata-template-browser",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.3.1",
|
|
4
4
|
"license": "SEE LICENSE IN LICENSE",
|
|
5
5
|
"peerDependencies": {
|
|
6
|
-
"@box/blueprint-web": "^16.20.
|
|
7
|
-
"@box/blueprint-web-assets": "^5.7.
|
|
6
|
+
"@box/blueprint-web": "^16.20.4",
|
|
7
|
+
"@box/blueprint-web-assets": "^5.7.11",
|
|
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": "^16.20.
|
|
16
|
-
"@box/blueprint-web-assets": "^5.7.
|
|
17
|
-
"@box/eslint-plugin-blueprint": "2.2.
|
|
18
|
-
"@box/storybook-utils": "1.2.
|
|
15
|
+
"@box/blueprint-web": "^16.20.4",
|
|
16
|
+
"@box/blueprint-web-assets": "^5.7.11",
|
|
17
|
+
"@box/eslint-plugin-blueprint": "2.2.7",
|
|
18
|
+
"@box/storybook-utils": "1.2.20",
|
|
19
19
|
"react-intl": "^6.4.2"
|
|
20
20
|
},
|
|
21
21
|
"publishConfig": {
|