diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine/engine_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine/engine_logic.test.ts index 0189edbbf871f..334886bcc981c 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine/engine_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine/engine_logic.test.ts @@ -53,6 +53,7 @@ describe('EngineLogic', () => { isEngineSchemaEmpty: true, isMetaEngine: false, isSampleEngine: false, + canCrawl: true, hasSchemaErrors: false, hasSchemaConflicts: false, hasUnconfirmedSchemaFields: false, @@ -356,7 +357,7 @@ describe('EngineLogic', () => { }); }); - describe('isSampleEngine', () => { + describe('isSampleEngine & canCrawl', () => { it('should be set based on engine.sample', () => { const engine = { ...mockEngineData, sample: true }; mount({ engine }); @@ -365,11 +366,12 @@ describe('EngineLogic', () => { ...DEFAULT_VALUES_WITH_ENGINE, engine, isSampleEngine: true, + canCrawl: false, }); }); }); - describe('isMetaEngine', () => { + describe('isMetaEngine & canCrawl', () => { it('should be set based on engine.type', () => { const engine = { ...mockEngineData, type: EngineTypes.meta }; mount({ engine }); @@ -378,6 +380,7 @@ describe('EngineLogic', () => { ...DEFAULT_VALUES_WITH_ENGINE, engine, isMetaEngine: true, + canCrawl: false, }); }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine/engine_logic.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine/engine_logic.ts index bfa77450176f6..601fe7d587fb4 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine/engine_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine/engine_logic.ts @@ -23,6 +23,7 @@ interface EngineValues { isEngineSchemaEmpty: boolean; isMetaEngine: boolean; isSampleEngine: boolean; + canCrawl: boolean; hasSchemaErrors: boolean; hasSchemaConflicts: boolean; hasUnconfirmedSchemaFields: boolean; @@ -101,6 +102,10 @@ export const EngineLogic = kea>({ ], isMetaEngine: [() => [selectors.engine], (engine) => engine?.type === EngineTypes.meta], isSampleEngine: [() => [selectors.engine], (engine) => !!engine?.sample], + canCrawl: [ + () => [selectors.isMetaEngine, selectors.isSampleEngine], + (isMetaEngine, isSampleEngine) => !isMetaEngine && !isSampleEngine, + ], // Indexed engines hasSchemaErrors: [ () => [selectors.engine], diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine/engine_nav.test.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine/engine_nav.test.tsx index e088678a13562..de491d6b0db62 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine/engine_nav.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine/engine_nav.test.tsx @@ -167,7 +167,7 @@ describe('useEngineNav', () => { const myRole = { canViewEngineCrawler: true }; it('returns a crawler nav item', () => { - setMockValues({ ...values, myRole }); + setMockValues({ ...values, myRole, canCrawl: true }); expect(useEngineNav()).toEqual([ ...BASE_NAV, { @@ -179,8 +179,8 @@ describe('useEngineNav', () => { ]); }); - it('does not return a crawler nav item for meta engines', () => { - setMockValues({ ...values, myRole, isMetaEngine: true }); + it('does not return a crawler nav item for engines that cannot crawl (e.g. meta engines, sample engine)', () => { + setMockValues({ ...values, myRole, canCrawl: false }); expect(useEngineNav()).toEqual(BASE_NAV); }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine/engine_nav.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine/engine_nav.tsx index 70f2d04a5123d..9d26ea2a80271 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine/engine_nav.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine/engine_nav.tsx @@ -68,6 +68,7 @@ export const useEngineNav = () => { dataLoading, isSampleEngine, isMetaEngine, + canCrawl, hasSchemaErrors, hasSchemaConflicts, hasUnconfirmedSchemaFields, @@ -185,7 +186,7 @@ export const useEngineNav = () => { }); } - if (canViewEngineCrawler && !isMetaEngine) { + if (canViewEngineCrawler && canCrawl) { navItems.push({ id: 'crawler', name: CRAWLER_TITLE, diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine/engine_router.test.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine/engine_router.test.tsx index ed35bfbe97842..1b6fbd0a8e4ed 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine/engine_router.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine/engine_router.test.tsx @@ -39,6 +39,8 @@ describe('EngineRouter', () => { ...mockEngineValues, dataLoading: false, engineNotFound: false, + isMetaEngine: false, + canCrawl: false, myRole: {}, }; const actions = { @@ -175,14 +177,18 @@ describe('EngineRouter', () => { }); it('renders a source engines view', () => { - setMockValues({ ...values, myRole: { canViewMetaEngineSourceEngines: true } }); + setMockValues({ + ...values, + myRole: { canViewMetaEngineSourceEngines: true }, + isMetaEngine: true, + }); const wrapper = shallow(); expect(wrapper.find(SourceEngines)).toHaveLength(1); }); it('renders a crawler view', () => { - setMockValues({ ...values, myRole: { canViewEngineCrawler: true } }); + setMockValues({ ...values, myRole: { canViewEngineCrawler: true }, canCrawl: true }); const wrapper = shallow(); expect(wrapper.find(CrawlerRouter)).toHaveLength(1); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine/engine_router.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine/engine_router.tsx index 2d1bd32a0fff5..a9a492eafc69d 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine/engine_router.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine/engine_router.tsx @@ -66,7 +66,9 @@ export const EngineRouter: React.FC = () => { } = useValues(AppLogic); const { engineName: engineNameFromUrl } = useParams() as { engineName: string }; - const { engineName, dataLoading, engineNotFound } = useValues(EngineLogic); + const { engineName, dataLoading, engineNotFound, isMetaEngine, canCrawl } = useValues( + EngineLogic + ); const { setEngineName, initializeEngine, pollEmptyEngine, stopPolling, clearEngine } = useActions( EngineLogic ); @@ -120,12 +122,12 @@ export const EngineRouter: React.FC = () => { )} - {canViewMetaEngineSourceEngines && ( + {canViewMetaEngineSourceEngines && isMetaEngine && ( )} - {canViewEngineCrawler && ( + {canViewEngineCrawler && canCrawl && (