Migrate ui/registry/feature_catalogue to New Platform plugin (#48818)
This commit is contained in:
parent
2d1c239fdd
commit
23a9058cc4
|
@ -1132,13 +1132,14 @@ import { setup, start } from '../core_plugins/visualizations/public/legacy';
|
|||
| `import 'ui/filter_bar'` | `import { FilterBar } from '../data/public'` | `import '../data/public/legacy` should be called to load legacy directives |
|
||||
| `import 'ui/query_bar'` | `import { QueryBar, QueryBarInput } from '../data/public'` | Directives are deprecated. |
|
||||
| `import 'ui/search_bar'` | `import { SearchBar } from '../data/public'` | Directive is deprecated. |
|
||||
| `import 'ui/kbn_top_nav'` | `import { TopNavMenu } from '../navigation/public'` | Directive is still available in `ui/kbn_top_nav`. |
|
||||
| `import 'ui/kbn_top_nav'` | `import { TopNavMenu } from '../navigation/public'` | Directive is still available in `ui/kbn_top_nav`. |
|
||||
| `ui/saved_objects/components/saved_object_finder` | `import { SavedObjectFinder } from '../kibana_react/public'` | |
|
||||
| `core_plugins/interpreter` | `data.expressions` | still in progress |
|
||||
| `ui/courier` | `data.search` | still in progress |
|
||||
| `ui/embeddable` | `embeddables` | still in progress |
|
||||
| `ui/filter_manager` | `data.filter` | -- |
|
||||
| `ui/index_patterns` | `data.indexPatterns` | still in progress |
|
||||
| `ui/registry/feature_catalogue | `feature_catalogue.register` | Must add `feature_catalogue` as a dependency in your kibana.json. |
|
||||
| `ui/registry/vis_types` | `visualizations.types` | -- |
|
||||
| `ui/vis` | `visualizations.types` | -- |
|
||||
| `ui/vis/vis_factory` | `visualizations.types` | -- |
|
||||
|
@ -1180,7 +1181,7 @@ This table shows where these uiExports have moved to in the New Platform. In mos
|
|||
| `fieldFormatEditors` | | |
|
||||
| `fieldFormats` | | |
|
||||
| `hacks` | n/a | Just run the code in your plugin's `start` method. |
|
||||
| `home` | | Should be an API on the home plugin. |
|
||||
| `home` | [`plugins.feature_catalogue.register`](./src/plugins/feature_catalogue) | Must add `feature_catalogue` as a dependency in your kibana.json. |
|
||||
| `indexManagement` | | Should be an API on the indexManagement plugin. |
|
||||
| `injectDefaultVars` | n/a | Plugins will only be able to "whitelist" config values for the frontend. See [#41990](https://github.com/elastic/kibana/issues/41990) |
|
||||
| `inspectorViews` | | Should be an API on the data (?) plugin. |
|
||||
|
|
|
@ -37,7 +37,7 @@ function getRoute() {
|
|||
return {
|
||||
template,
|
||||
resolve: {
|
||||
directories: () => getServices().getFeatureCatalogueRegistryProvider().then(catalogue => catalogue.inTitleOrder)
|
||||
directories: () => getServices().getFeatureCatalogueEntries()
|
||||
},
|
||||
controller($scope, $route) {
|
||||
const { chrome, addBasePath } = getServices();
|
||||
|
|
|
@ -27,7 +27,7 @@ import { wrapInI18nContext } from 'ui/i18n';
|
|||
// @ts-ignore
|
||||
import { uiModules as modules } from 'ui/modules';
|
||||
import routes from 'ui/routes';
|
||||
import { npStart } from 'ui/new_platform';
|
||||
import { npSetup, npStart } from 'ui/new_platform';
|
||||
import { IPrivate } from 'ui/private';
|
||||
import { FeatureCatalogueRegistryProvider } from 'ui/registry/feature_catalogue';
|
||||
import { createUiStatsReporter, METRIC_TYPE } from '../../../ui_metric/public';
|
||||
|
@ -55,10 +55,14 @@ export function getServices() {
|
|||
indexPatternService: data.indexPatterns.indexPatterns,
|
||||
shouldShowTelemetryOptIn,
|
||||
telemetryOptInProvider,
|
||||
getFeatureCatalogueRegistryProvider: async () => {
|
||||
getFeatureCatalogueEntries: async () => {
|
||||
const injector = await chrome.dangerouslyGetActiveInjector();
|
||||
const Private = injector.get<IPrivate>('Private');
|
||||
return Private(FeatureCatalogueRegistryProvider as any);
|
||||
// Merge legacy registry with new registry
|
||||
(Private(FeatureCatalogueRegistryProvider as any) as any).inTitleOrder.map(
|
||||
npSetup.plugins.feature_catalogue.register
|
||||
);
|
||||
return npStart.plugins.feature_catalogue.get();
|
||||
},
|
||||
|
||||
trackUiMetric: createUiStatsReporter('Kibana_home'),
|
||||
|
|
|
@ -28,11 +28,16 @@ import {
|
|||
Start as InspectorStart,
|
||||
} from '../../../../plugins/inspector/public';
|
||||
import { EuiUtilsStart } from '../../../../plugins/eui_utils/public';
|
||||
import {
|
||||
FeatureCatalogueSetup,
|
||||
FeatureCatalogueStart,
|
||||
} from '../../../../plugins/feature_catalogue/public';
|
||||
|
||||
export interface PluginsSetup {
|
||||
data: ReturnType<DataPlugin['setup']>;
|
||||
embeddable: EmbeddableSetup;
|
||||
expressions: ReturnType<ExpressionsPlugin['setup']>;
|
||||
feature_catalogue: FeatureCatalogueSetup;
|
||||
inspector: InspectorSetup;
|
||||
uiActions: IUiActionsSetup;
|
||||
}
|
||||
|
@ -42,6 +47,7 @@ export interface PluginsStart {
|
|||
embeddable: EmbeddableStart;
|
||||
eui_utils: EuiUtilsStart;
|
||||
expressions: ReturnType<ExpressionsPlugin['start']>;
|
||||
feature_catalogue: FeatureCatalogueStart;
|
||||
inspector: InspectorStart;
|
||||
uiActions: IUiActionsStart;
|
||||
}
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
|
||||
import { uiRegistry } from './_registry';
|
||||
import { capabilities } from '../capabilities';
|
||||
export { FeatureCatalogueCategory } from '../../../../plugins/feature_catalogue/public';
|
||||
|
||||
export const FeatureCatalogueRegistryProvider = uiRegistry({
|
||||
name: 'featureCatalogue',
|
||||
|
@ -30,9 +31,3 @@ export const FeatureCatalogueRegistryProvider = uiRegistry({
|
|||
return !isDisabledViaCapabilities && Object.keys(featureCatalogItem).length > 0;
|
||||
}
|
||||
});
|
||||
|
||||
export const FeatureCatalogueCategory = {
|
||||
ADMIN: 'admin',
|
||||
DATA: 'data',
|
||||
OTHER: 'other'
|
||||
};
|
||||
|
|
26
src/plugins/feature_catalogue/README.md
Normal file
26
src/plugins/feature_catalogue/README.md
Normal file
|
@ -0,0 +1,26 @@
|
|||
# Feature catalogue plugin
|
||||
|
||||
Replaces the legacy `ui/registry/feature_catalogue` module for registering "features" that should be showed in the home
|
||||
page's feature catalogue. This should not be confused with the "feature" plugin for registering features used to derive
|
||||
UI capabilities for feature controls.
|
||||
|
||||
## Example registration
|
||||
|
||||
```ts
|
||||
// For legacy plugins
|
||||
import { npSetup } from 'ui/new_platform';
|
||||
npSetup.plugins.feature_catalogue.register(/* same details here */);
|
||||
|
||||
// For new plugins: first add 'feature_catalogue` to the list of `optionalPlugins`
|
||||
// in your kibana.json file. Then access the plugin directly in `setup`:
|
||||
|
||||
class MyPlugin {
|
||||
setup(core, plugins) {
|
||||
if (plugins.feature_catalogue) {
|
||||
plugins.feature_catalogue.register(/* same details here. */);
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Note that the old module supported providing a Angular DI function to receive Angular dependencies. This is no longer supported as we migrate away from Angular and will be removed in 8.0.
|
6
src/plugins/feature_catalogue/kibana.json
Normal file
6
src/plugins/feature_catalogue/kibana.json
Normal file
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"id": "feature_catalogue",
|
||||
"version": "kibana",
|
||||
"server": false,
|
||||
"ui": true
|
||||
}
|
24
src/plugins/feature_catalogue/public/index.ts
Normal file
24
src/plugins/feature_catalogue/public/index.ts
Normal file
|
@ -0,0 +1,24 @@
|
|||
/*
|
||||
* Licensed to Elasticsearch B.V. under one or more contributor
|
||||
* license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright
|
||||
* ownership. Elasticsearch B.V. licenses this file to you under
|
||||
* the Apache License, Version 2.0 (the "License"); you may
|
||||
* not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
export { FeatureCatalogueSetup, FeatureCatalogueStart } from './plugin';
|
||||
export { FeatureCatalogueEntry, FeatureCatalogueCategory } from './services';
|
||||
import { FeatureCataloguePlugin } from './plugin';
|
||||
|
||||
export const plugin = () => new FeatureCataloguePlugin();
|
25
src/plugins/feature_catalogue/public/plugin.test.mocks.ts
Normal file
25
src/plugins/feature_catalogue/public/plugin.test.mocks.ts
Normal file
|
@ -0,0 +1,25 @@
|
|||
/*
|
||||
* Licensed to Elasticsearch B.V. under one or more contributor
|
||||
* license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright
|
||||
* ownership. Elasticsearch B.V. licenses this file to you under
|
||||
* the Apache License, Version 2.0 (the "License"); you may
|
||||
* not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
import { featureCatalogueRegistryMock } from './services/feature_catalogue_registry.mock';
|
||||
|
||||
export const registryMock = featureCatalogueRegistryMock.create();
|
||||
jest.doMock('./services', () => ({
|
||||
FeatureCatalogueRegistry: jest.fn(() => registryMock),
|
||||
}));
|
49
src/plugins/feature_catalogue/public/plugin.test.ts
Normal file
49
src/plugins/feature_catalogue/public/plugin.test.ts
Normal file
|
@ -0,0 +1,49 @@
|
|||
/*
|
||||
* Licensed to Elasticsearch B.V. under one or more contributor
|
||||
* license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright
|
||||
* ownership. Elasticsearch B.V. licenses this file to you under
|
||||
* the Apache License, Version 2.0 (the "License"); you may
|
||||
* not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
import { registryMock } from './plugin.test.mocks';
|
||||
import { FeatureCataloguePlugin } from './plugin';
|
||||
|
||||
describe('FeatureCataloguePlugin', () => {
|
||||
beforeEach(() => {
|
||||
registryMock.setup.mockClear();
|
||||
registryMock.start.mockClear();
|
||||
});
|
||||
|
||||
describe('setup', () => {
|
||||
test('wires up and returns registry', async () => {
|
||||
const setup = await new FeatureCataloguePlugin().setup();
|
||||
expect(registryMock.setup).toHaveBeenCalledWith();
|
||||
expect(setup.register).toBeDefined();
|
||||
});
|
||||
});
|
||||
|
||||
describe('start', () => {
|
||||
test('wires up and returns registry', async () => {
|
||||
const service = new FeatureCataloguePlugin();
|
||||
await service.setup();
|
||||
const core = { application: { capabilities: { catalogue: {} } } } as any;
|
||||
const start = await service.start(core);
|
||||
expect(registryMock.start).toHaveBeenCalledWith({
|
||||
capabilities: core.application.capabilities,
|
||||
});
|
||||
expect(start.get).toBeDefined();
|
||||
});
|
||||
});
|
||||
});
|
50
src/plugins/feature_catalogue/public/plugin.ts
Normal file
50
src/plugins/feature_catalogue/public/plugin.ts
Normal file
|
@ -0,0 +1,50 @@
|
|||
/*
|
||||
* Licensed to Elasticsearch B.V. under one or more contributor
|
||||
* license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright
|
||||
* ownership. Elasticsearch B.V. licenses this file to you under
|
||||
* the Apache License, Version 2.0 (the "License"); you may
|
||||
* not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
import { CoreStart, Plugin } from 'src/core/public';
|
||||
import {
|
||||
FeatureCatalogueRegistry,
|
||||
FeatureCatalogueRegistrySetup,
|
||||
FeatureCatalogueRegistryStart,
|
||||
} from './services';
|
||||
|
||||
export class FeatureCataloguePlugin
|
||||
implements Plugin<FeatureCatalogueSetup, FeatureCatalogueStart> {
|
||||
private readonly featuresCatalogueRegistry = new FeatureCatalogueRegistry();
|
||||
|
||||
public async setup() {
|
||||
return {
|
||||
...this.featuresCatalogueRegistry.setup(),
|
||||
};
|
||||
}
|
||||
|
||||
public async start(core: CoreStart) {
|
||||
return {
|
||||
...this.featuresCatalogueRegistry.start({
|
||||
capabilities: core.application.capabilities,
|
||||
}),
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/** @public */
|
||||
export type FeatureCatalogueSetup = FeatureCatalogueRegistrySetup;
|
||||
|
||||
/** @public */
|
||||
export type FeatureCatalogueStart = FeatureCatalogueRegistryStart;
|
|
@ -0,0 +1,54 @@
|
|||
/*
|
||||
* Licensed to Elasticsearch B.V. under one or more contributor
|
||||
* license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright
|
||||
* ownership. Elasticsearch B.V. licenses this file to you under
|
||||
* the Apache License, Version 2.0 (the "License"); you may
|
||||
* not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
import {
|
||||
FeatureCatalogueRegistrySetup,
|
||||
FeatureCatalogueRegistryStart,
|
||||
FeatureCatalogueRegistry,
|
||||
} from './feature_catalogue_registry';
|
||||
|
||||
const createSetupMock = (): jest.Mocked<FeatureCatalogueRegistrySetup> => {
|
||||
const setup = {
|
||||
register: jest.fn(),
|
||||
};
|
||||
return setup;
|
||||
};
|
||||
|
||||
const createStartMock = (): jest.Mocked<FeatureCatalogueRegistryStart> => {
|
||||
const start = {
|
||||
get: jest.fn(),
|
||||
};
|
||||
return start;
|
||||
};
|
||||
|
||||
const createMock = (): jest.Mocked<PublicMethodsOf<FeatureCatalogueRegistry>> => {
|
||||
const service = {
|
||||
setup: jest.fn(),
|
||||
start: jest.fn(),
|
||||
};
|
||||
service.setup.mockImplementation(createSetupMock);
|
||||
service.start.mockImplementation(createStartMock);
|
||||
return service;
|
||||
};
|
||||
|
||||
export const featureCatalogueRegistryMock = {
|
||||
createSetup: createSetupMock,
|
||||
createStart: createStartMock,
|
||||
create: createMock,
|
||||
};
|
|
@ -0,0 +1,87 @@
|
|||
/*
|
||||
* Licensed to Elasticsearch B.V. under one or more contributor
|
||||
* license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright
|
||||
* ownership. Elasticsearch B.V. licenses this file to you under
|
||||
* the Apache License, Version 2.0 (the "License"); you may
|
||||
* not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
import {
|
||||
FeatureCatalogueRegistry,
|
||||
FeatureCatalogueCategory,
|
||||
FeatureCatalogueEntry,
|
||||
} from './feature_catalogue_registry';
|
||||
|
||||
const DASHBOARD_FEATURE: FeatureCatalogueEntry = {
|
||||
id: 'dashboard',
|
||||
title: 'Dashboard',
|
||||
description: 'Display and share a collection of visualizations and saved searches.',
|
||||
icon: 'dashboardApp',
|
||||
path: `/app/kibana#dashboard`,
|
||||
showOnHomePage: true,
|
||||
category: FeatureCatalogueCategory.DATA,
|
||||
};
|
||||
|
||||
describe('FeatureCatalogueRegistry', () => {
|
||||
describe('setup', () => {
|
||||
test('throws when registering duplicate id', () => {
|
||||
const setup = new FeatureCatalogueRegistry().setup();
|
||||
setup.register(DASHBOARD_FEATURE);
|
||||
expect(() => setup.register(DASHBOARD_FEATURE)).toThrowErrorMatchingInlineSnapshot(
|
||||
`"Feature with id [dashboard] has already been registered. Use a unique id."`
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
describe('start', () => {
|
||||
describe('capabilities filtering', () => {
|
||||
test('retains items with no entry in capabilities', () => {
|
||||
const service = new FeatureCatalogueRegistry();
|
||||
service.setup().register(DASHBOARD_FEATURE);
|
||||
const capabilities = { catalogue: {} } as any;
|
||||
expect(service.start({ capabilities }).get()).toEqual([DASHBOARD_FEATURE]);
|
||||
});
|
||||
|
||||
test('retains items with true in capabilities', () => {
|
||||
const service = new FeatureCatalogueRegistry();
|
||||
service.setup().register(DASHBOARD_FEATURE);
|
||||
const capabilities = { catalogue: { dashboard: true } } as any;
|
||||
expect(service.start({ capabilities }).get()).toEqual([DASHBOARD_FEATURE]);
|
||||
});
|
||||
|
||||
test('removes items with false in capabilities', () => {
|
||||
const service = new FeatureCatalogueRegistry();
|
||||
service.setup().register(DASHBOARD_FEATURE);
|
||||
const capabilities = { catalogue: { dashboard: false } } as any;
|
||||
expect(service.start({ capabilities }).get()).toEqual([]);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('title sorting', () => {
|
||||
test('sorts by title ascending', () => {
|
||||
const service = new FeatureCatalogueRegistry();
|
||||
const setup = service.setup();
|
||||
setup.register({ id: '1', title: 'Orange' } as any);
|
||||
setup.register({ id: '2', title: 'Apple' } as any);
|
||||
setup.register({ id: '3', title: 'Banana' } as any);
|
||||
const capabilities = { catalogue: {} } as any;
|
||||
expect(service.start({ capabilities }).get()).toEqual([
|
||||
{ id: '2', title: 'Apple' },
|
||||
{ id: '3', title: 'Banana' },
|
||||
{ id: '1', title: 'Orange' },
|
||||
]);
|
||||
});
|
||||
});
|
||||
});
|
|
@ -0,0 +1,86 @@
|
|||
/*
|
||||
* Licensed to Elasticsearch B.V. under one or more contributor
|
||||
* license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright
|
||||
* ownership. Elasticsearch B.V. licenses this file to you under
|
||||
* the Apache License, Version 2.0 (the "License"); you may
|
||||
* not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
import { Capabilities } from 'src/core/public';
|
||||
import { IconType } from '@elastic/eui';
|
||||
|
||||
/** @public */
|
||||
export enum FeatureCatalogueCategory {
|
||||
ADMIN = 'admin',
|
||||
DATA = 'data',
|
||||
OTHER = 'other',
|
||||
}
|
||||
|
||||
/** @public */
|
||||
export interface FeatureCatalogueEntry {
|
||||
/** Unique string identifier for this feature. */
|
||||
readonly id: string;
|
||||
/** Title of feature displayed to the user. */
|
||||
readonly title: string;
|
||||
/** {@link FeatureCatalogueCategory} to display this feature in. */
|
||||
readonly category: FeatureCatalogueCategory;
|
||||
/** One-line description of feature displayed to the user. */
|
||||
readonly description: string;
|
||||
/** EUI `IconType` for icon to be displayed to the user. EUI supports any known EUI icon, SVG URL, or ReactElement. */
|
||||
readonly icon: IconType;
|
||||
/** URL path to link to this future. Should not include the basePath. */
|
||||
readonly path: string;
|
||||
/** Whether or not this link should be shown on the front page of Kibana. */
|
||||
readonly showOnHomePage: boolean;
|
||||
}
|
||||
|
||||
export class FeatureCatalogueRegistry {
|
||||
private readonly features = new Map<string, FeatureCatalogueEntry>();
|
||||
|
||||
public setup() {
|
||||
return {
|
||||
register: (feature: FeatureCatalogueEntry) => {
|
||||
if (this.features.has(feature.id)) {
|
||||
throw new Error(
|
||||
`Feature with id [${feature.id}] has already been registered. Use a unique id.`
|
||||
);
|
||||
}
|
||||
|
||||
this.features.set(feature.id, feature);
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
public start({ capabilities }: { capabilities: Capabilities }) {
|
||||
return {
|
||||
get: (): readonly FeatureCatalogueEntry[] =>
|
||||
[...this.features.values()]
|
||||
.filter(entry => capabilities.catalogue[entry.id] !== false)
|
||||
.sort(compareByKey('title')),
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
export type FeatureCatalogueRegistrySetup = ReturnType<FeatureCatalogueRegistry['setup']>;
|
||||
export type FeatureCatalogueRegistryStart = ReturnType<FeatureCatalogueRegistry['start']>;
|
||||
|
||||
const compareByKey = <T>(key: keyof T) => (left: T, right: T) => {
|
||||
if (left[key] < right[key]) {
|
||||
return -1;
|
||||
} else if (left[key] > right[key]) {
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
};
|
20
src/plugins/feature_catalogue/public/services/index.ts
Normal file
20
src/plugins/feature_catalogue/public/services/index.ts
Normal file
|
@ -0,0 +1,20 @@
|
|||
/*
|
||||
* Licensed to Elasticsearch B.V. under one or more contributor
|
||||
* license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright
|
||||
* ownership. Elasticsearch B.V. licenses this file to you under
|
||||
* the Apache License, Version 2.0 (the "License"); you may
|
||||
* not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
export * from './feature_catalogue_registry';
|
Loading…
Reference in a new issue