From 90eeb81111a31254a01a9adac05b5afb69d65f2e Mon Sep 17 00:00:00 2001
From: Andreas Berger
Date: Mon, 13 Jan 2025 09:16:43 +0100
Subject: [PATCH 1/9] Harmonize `CatalogTable`
- Show pagination text for `OffsetPagination`
- Use same `OffsetPaginatedCatalogTable` also as fallback if no pagination is set
- Do not show paging if there is only one page
Signed-off-by: Andreas Berger
---
.changeset/funny-papayas-tell.md | 9 ++++
.../components/CatalogTable/CatalogTable.tsx | 47 +++++++------------
.../CursorPaginatedCatalogTable.tsx | 1 -
.../OffsetPaginatedCatalogTable.tsx | 9 ++--
4 files changed, 30 insertions(+), 36 deletions(-)
create mode 100644 .changeset/funny-papayas-tell.md
diff --git a/.changeset/funny-papayas-tell.md b/.changeset/funny-papayas-tell.md
new file mode 100644
index 0000000000000..d3c58e95c31fe
--- /dev/null
+++ b/.changeset/funny-papayas-tell.md
@@ -0,0 +1,9 @@
+---
+'@backstage/plugin-catalog': minor
+---
+
+Harmonize `CatalogTable`
+
+- Show pagination text for `OffsetPagination`
+- Use same `OffsetPaginatedCatalogTable` also as fallback if no pagination is set
+- Do not show paging if there is only one page
diff --git a/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx b/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx
index 0b2d2e4a4cdd0..85b86dfcd8db2 100644
--- a/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx
+++ b/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx
@@ -23,7 +23,6 @@ import {
} from '@backstage/catalog-model';
import {
CodeSnippet,
- Table,
TableColumn,
TableProps,
WarningPanel,
@@ -47,7 +46,7 @@ import { OffsetPaginatedCatalogTable } from './OffsetPaginatedCatalogTable';
import { CursorPaginatedCatalogTable } from './CursorPaginatedCatalogTable';
import { defaultCatalogTableColumnsFunc } from './defaultCatalogTableColumnsFunc';
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
-import { catalogTranslationRef } from '../../alpha/translation';
+import { catalogTranslationRef } from '../../alpha';
import { FavoriteToggleIcon } from '@backstage/core-components';
/**
@@ -194,7 +193,8 @@ export const CatalogTable = (props: CatalogTableProps) => {
.join(' ');
const actions = props.actions || defaultActions;
- const options = {
+ const options: TableProps['options'] = {
+ paginationPosition: 'both',
actionsColumnIndex: -1,
loadingType: 'linear' as const,
showEmptyDataSourceMessage: !loading,
@@ -202,6 +202,12 @@ export const CatalogTable = (props: CatalogTableProps) => {
...tableOptions,
};
+ if (paginationMode !== 'cursor' && paginationMode !== 'offset') {
+ entities.sort(refCompare);
+ }
+
+ const rows = entities.map(toEntityRow);
+
if (paginationMode === 'cursor') {
return (
{
actions={actions}
subtitle={subtitle}
options={options}
- data={entities.map(toEntityRow)}
+ data={rows}
next={pageInfo?.next}
prev={pageInfo?.prev}
/>
);
- } else if (paginationMode === 'offset') {
- return (
-
- );
}
- const rows = entities.sort(refCompare).map(toEntityRow);
- const pageSize = 20;
- const showPagination = rows.length > pageSize;
-
+ // else use offset paging
return (
-
- isLoading={loading}
+
);
};
diff --git a/plugins/catalog/src/components/CatalogTable/CursorPaginatedCatalogTable.tsx b/plugins/catalog/src/components/CatalogTable/CursorPaginatedCatalogTable.tsx
index 843d5be2c83c1..8f490fc2698b2 100644
--- a/plugins/catalog/src/components/CatalogTable/CursorPaginatedCatalogTable.tsx
+++ b/plugins/catalog/src/components/CatalogTable/CursorPaginatedCatalogTable.tsx
@@ -37,7 +37,6 @@ export function CursorPaginatedCatalogTable(props: PaginatedCatalogTableProps) {
columns={columns}
data={data}
options={{
- paginationPosition: 'both',
...options,
// These settings are configured to force server side pagination
pageSizeOptions: [],
diff --git a/plugins/catalog/src/components/CatalogTable/OffsetPaginatedCatalogTable.tsx b/plugins/catalog/src/components/CatalogTable/OffsetPaginatedCatalogTable.tsx
index 7ebf791046357..d8197a99b2327 100644
--- a/plugins/catalog/src/components/CatalogTable/OffsetPaginatedCatalogTable.tsx
+++ b/plugins/catalog/src/components/CatalogTable/OffsetPaginatedCatalogTable.tsx
@@ -36,21 +36,23 @@ export function OffsetPaginatedCatalogTable(
useEffect(() => {
if (totalItems && page * limit >= totalItems) {
- setOffset!(Math.max(0, totalItems - limit));
+ setOffset?.(Math.max(0, totalItems - limit));
} else {
- setOffset!(Math.max(0, page * limit));
+ setOffset?.(Math.max(0, page * limit));
}
}, [setOffset, page, limit, totalItems]);
+ const showPagination = (totalItems ?? data.length) > limit;
+
return (
);
From 6a3dc95fe5948abfc893cc57c7250e6a53d686ad Mon Sep 17 00:00:00 2001
From: Andreas Berger
Date: Mon, 13 Jan 2025 10:38:35 +0100
Subject: [PATCH 2/9] fix api-reports (why ever they changed?)
Signed-off-by: Andreas Berger
---
plugins/app-visualizer/report.api.md | 42 +-
plugins/catalog-import/report-alpha.api.md | 30 +-
plugins/catalog/report-alpha.api.md | 544 ++++++++++-----------
plugins/devtools/report-alpha.api.md | 70 +--
plugins/kubernetes/report-alpha.api.md | 30 +-
plugins/scaffolder/report-alpha.api.md | 72 +--
plugins/search/report-alpha.api.md | 30 +-
plugins/techdocs/report-alpha.api.md | 70 +--
8 files changed, 444 insertions(+), 444 deletions(-)
diff --git a/plugins/app-visualizer/report.api.md b/plugins/app-visualizer/report.api.md
index 48eca04ed8543..f0855c9531370 100644
--- a/plugins/app-visualizer/report.api.md
+++ b/plugins/app-visualizer/report.api.md
@@ -16,6 +16,27 @@ const visualizerPlugin: FrontendPlugin<
{},
{},
{
+ 'nav-item:app-visualizer': ExtensionDefinition<{
+ kind: 'nav-item';
+ name: undefined;
+ config: {};
+ configInput: {};
+ output: ConfigurableExtensionDataRef<
+ {
+ title: string;
+ icon: IconComponent;
+ routeRef: RouteRef;
+ },
+ 'core.nav-item.target',
+ {}
+ >;
+ inputs: {};
+ params: {
+ title: string;
+ icon: IconComponent;
+ routeRef: RouteRef;
+ };
+ }>;
'page:app-visualizer': ExtensionDefinition<{
kind: 'page';
name: undefined;
@@ -46,27 +67,6 @@ const visualizerPlugin: FrontendPlugin<
routeRef?: RouteRef | undefined;
};
}>;
- 'nav-item:app-visualizer': ExtensionDefinition<{
- kind: 'nav-item';
- name: undefined;
- config: {};
- configInput: {};
- output: ConfigurableExtensionDataRef<
- {
- title: string;
- icon: IconComponent;
- routeRef: RouteRef;
- },
- 'core.nav-item.target',
- {}
- >;
- inputs: {};
- params: {
- title: string;
- icon: IconComponent;
- routeRef: RouteRef;
- };
- }>;
}
>;
export default visualizerPlugin;
diff --git a/plugins/catalog-import/report-alpha.api.md b/plugins/catalog-import/report-alpha.api.md
index c13f7a1a4a862..1706404b943ca 100644
--- a/plugins/catalog-import/report-alpha.api.md
+++ b/plugins/catalog-import/report-alpha.api.md
@@ -18,6 +18,21 @@ const _default: FrontendPlugin<
},
{},
{
+ 'api:catalog-import': ExtensionDefinition<{
+ kind: 'api';
+ name: undefined;
+ config: {};
+ configInput: {};
+ output: ConfigurableExtensionDataRef<
+ AnyApiFactory,
+ 'core.api.factory',
+ {}
+ >;
+ inputs: {};
+ params: {
+ factory: AnyApiFactory;
+ };
+ }>;
'page:catalog-import': ExtensionDefinition<{
kind: 'page';
name: undefined;
@@ -48,21 +63,6 @@ const _default: FrontendPlugin<
routeRef?: RouteRef | undefined;
};
}>;
- 'api:catalog-import': ExtensionDefinition<{
- kind: 'api';
- name: undefined;
- config: {};
- configInput: {};
- output: ConfigurableExtensionDataRef<
- AnyApiFactory,
- 'core.api.factory',
- {}
- >;
- inputs: {};
- params: {
- factory: AnyApiFactory;
- };
- }>;
}
>;
export default _default;
diff --git a/plugins/catalog/report-alpha.api.md b/plugins/catalog/report-alpha.api.md
index bdd9240d537d1..f597331e8133f 100644
--- a/plugins/catalog/report-alpha.api.md
+++ b/plugins/catalog/report-alpha.api.md
@@ -146,30 +146,24 @@ const _default: FrontendPlugin<
unregisterRedirect: ExternalRouteRef;
},
{
- 'nav-item:catalog': ExtensionDefinition<{
- kind: 'nav-item';
+ 'api:catalog': ExtensionDefinition<{
+ kind: 'api';
name: undefined;
config: {};
configInput: {};
output: ConfigurableExtensionDataRef<
- {
- title: string;
- icon: IconComponent;
- routeRef: RouteRef;
- },
- 'core.nav-item.target',
+ AnyApiFactory,
+ 'core.api.factory',
{}
>;
inputs: {};
params: {
- title: string;
- icon: IconComponent;
- routeRef: RouteRef;
+ factory: AnyApiFactory;
};
}>;
- 'api:catalog': ExtensionDefinition<{
+ 'api:catalog/starred-entities': ExtensionDefinition<{
kind: 'api';
- name: undefined;
+ name: 'starred-entities';
config: {};
configInput: {};
output: ConfigurableExtensionDataRef<
@@ -182,9 +176,9 @@ const _default: FrontendPlugin<
factory: AnyApiFactory;
};
}>;
- 'api:catalog/starred-entities': ExtensionDefinition<{
+ 'api:catalog/entity-presentation': ExtensionDefinition<{
kind: 'api';
- name: 'starred-entities';
+ name: 'entity-presentation';
config: {};
configInput: {};
output: ConfigurableExtensionDataRef<
@@ -197,19 +191,276 @@ const _default: FrontendPlugin<
factory: AnyApiFactory;
};
}>;
- 'api:catalog/entity-presentation': ExtensionDefinition<{
- kind: 'api';
- name: 'entity-presentation';
+ 'page:catalog': ExtensionDefinition<{
+ config: {
+ path: string | undefined;
+ };
+ configInput: {
+ path?: string | undefined;
+ };
+ output:
+ | ConfigurableExtensionDataRef
+ | ConfigurableExtensionDataRef
+ | ConfigurableExtensionDataRef<
+ RouteRef,
+ 'core.routing.ref',
+ {
+ optional: true;
+ }
+ >;
+ inputs: {
+ filters: ExtensionInput<
+ ConfigurableExtensionDataRef,
+ {
+ singleton: false;
+ optional: false;
+ }
+ >;
+ };
+ kind: 'page';
+ name: undefined;
+ params: {
+ defaultPath: string;
+ loader: () => Promise;
+ routeRef?: RouteRef | undefined;
+ };
+ }>;
+ 'page:catalog/entity': ExtensionDefinition<{
+ config: {
+ path: string | undefined;
+ };
+ configInput: {
+ path?: string | undefined;
+ };
+ output:
+ | ConfigurableExtensionDataRef
+ | ConfigurableExtensionDataRef
+ | ConfigurableExtensionDataRef<
+ RouteRef,
+ 'core.routing.ref',
+ {
+ optional: true;
+ }
+ >;
+ inputs: {
+ contents: ExtensionInput<
+ | ConfigurableExtensionDataRef
+ | ConfigurableExtensionDataRef
+ | ConfigurableExtensionDataRef<
+ RouteRef,
+ 'core.routing.ref',
+ {
+ optional: true;
+ }
+ >
+ | ConfigurableExtensionDataRef<
+ string,
+ 'catalog.entity-content-title',
+ {}
+ >
+ | ConfigurableExtensionDataRef<
+ (entity: Entity) => boolean,
+ 'catalog.entity-filter-function',
+ {
+ optional: true;
+ }
+ >
+ | ConfigurableExtensionDataRef<
+ string,
+ 'catalog.entity-filter-expression',
+ {
+ optional: true;
+ }
+ >,
+ {
+ singleton: false;
+ optional: false;
+ }
+ >;
+ };
+ kind: 'page';
+ name: 'entity';
+ params: {
+ defaultPath: string;
+ loader: () => Promise;
+ routeRef?: RouteRef | undefined;
+ };
+ }>;
+ 'catalog-filter:catalog/tag': ExtensionDefinition<{
+ kind: 'catalog-filter';
+ name: 'tag';
config: {};
configInput: {};
output: ConfigurableExtensionDataRef<
- AnyApiFactory,
- 'core.api.factory',
+ JSX_2.Element,
+ 'core.reactElement',
+ {}
+ >;
+ inputs: {};
+ params: {
+ loader: () => Promise;
+ };
+ }>;
+ 'catalog-filter:catalog/kind': ExtensionDefinition<{
+ config: {
+ initialFilter: string;
+ };
+ configInput: {
+ initialFilter?: string | undefined;
+ };
+ output: ConfigurableExtensionDataRef<
+ JSX_2.Element,
+ 'core.reactElement',
+ {}
+ >;
+ inputs: {
+ [x: string]: ExtensionInput<
+ AnyExtensionDataRef,
+ {
+ optional: boolean;
+ singleton: boolean;
+ }
+ >;
+ };
+ kind: 'catalog-filter';
+ name: 'kind';
+ params: {
+ loader: () => Promise;
+ };
+ }>;
+ 'catalog-filter:catalog/type': ExtensionDefinition<{
+ kind: 'catalog-filter';
+ name: 'type';
+ config: {};
+ configInput: {};
+ output: ConfigurableExtensionDataRef<
+ JSX_2.Element,
+ 'core.reactElement',
+ {}
+ >;
+ inputs: {};
+ params: {
+ loader: () => Promise;
+ };
+ }>;
+ 'catalog-filter:catalog/mode': ExtensionDefinition<{
+ config: {
+ mode: 'all' | 'owners-only' | undefined;
+ };
+ configInput: {
+ mode?: 'all' | 'owners-only' | undefined;
+ };
+ output: ConfigurableExtensionDataRef<
+ JSX_2.Element,
+ 'core.reactElement',
+ {}
+ >;
+ inputs: {
+ [x: string]: ExtensionInput<
+ AnyExtensionDataRef,
+ {
+ optional: boolean;
+ singleton: boolean;
+ }
+ >;
+ };
+ kind: 'catalog-filter';
+ name: 'mode';
+ params: {
+ loader: () => Promise;
+ };
+ }>;
+ 'catalog-filter:catalog/namespace': ExtensionDefinition<{
+ kind: 'catalog-filter';
+ name: 'namespace';
+ config: {};
+ configInput: {};
+ output: ConfigurableExtensionDataRef<
+ JSX_2.Element,
+ 'core.reactElement',
+ {}
+ >;
+ inputs: {};
+ params: {
+ loader: () => Promise;
+ };
+ }>;
+ 'catalog-filter:catalog/lifecycle': ExtensionDefinition<{
+ kind: 'catalog-filter';
+ name: 'lifecycle';
+ config: {};
+ configInput: {};
+ output: ConfigurableExtensionDataRef<
+ JSX_2.Element,
+ 'core.reactElement',
+ {}
+ >;
+ inputs: {};
+ params: {
+ loader: () => Promise;
+ };
+ }>;
+ 'catalog-filter:catalog/processing-status': ExtensionDefinition<{
+ kind: 'catalog-filter';
+ name: 'processing-status';
+ config: {};
+ configInput: {};
+ output: ConfigurableExtensionDataRef<
+ JSX_2.Element,
+ 'core.reactElement',
+ {}
+ >;
+ inputs: {};
+ params: {
+ loader: () => Promise;
+ };
+ }>;
+ 'catalog-filter:catalog/list': ExtensionDefinition<{
+ config: {
+ initialFilter: 'all' | 'owned' | 'starred';
+ };
+ configInput: {
+ initialFilter?: 'all' | 'owned' | 'starred' | undefined;
+ };
+ output: ConfigurableExtensionDataRef<
+ JSX_2.Element,
+ 'core.reactElement',
+ {}
+ >;
+ inputs: {
+ [x: string]: ExtensionInput<
+ AnyExtensionDataRef,
+ {
+ optional: boolean;
+ singleton: boolean;
+ }
+ >;
+ };
+ kind: 'catalog-filter';
+ name: 'list';
+ params: {
+ loader: () => Promise;
+ };
+ }>;
+ 'nav-item:catalog': ExtensionDefinition<{
+ kind: 'nav-item';
+ name: undefined;
+ config: {};
+ configInput: {};
+ output: ConfigurableExtensionDataRef<
+ {
+ title: string;
+ icon: IconComponent;
+ routeRef: RouteRef;
+ },
+ 'core.nav-item.target',
{}
>;
inputs: {};
params: {
- factory: AnyApiFactory;
+ title: string;
+ icon: IconComponent;
+ routeRef: RouteRef;
};
}>;
'entity-card:catalog/about': ExtensionDefinition<{
@@ -595,257 +846,6 @@ const _default: FrontendPlugin<
filter?: string | ((entity: Entity) => boolean) | undefined;
};
}>;
- 'catalog-filter:catalog/tag': ExtensionDefinition<{
- kind: 'catalog-filter';
- name: 'tag';
- config: {};
- configInput: {};
- output: ConfigurableExtensionDataRef<
- JSX_2.Element,
- 'core.reactElement',
- {}
- >;
- inputs: {};
- params: {
- loader: () => Promise;
- };
- }>;
- 'catalog-filter:catalog/kind': ExtensionDefinition<{
- config: {
- initialFilter: string;
- };
- configInput: {
- initialFilter?: string | undefined;
- };
- output: ConfigurableExtensionDataRef<
- JSX_2.Element,
- 'core.reactElement',
- {}
- >;
- inputs: {
- [x: string]: ExtensionInput<
- AnyExtensionDataRef,
- {
- optional: boolean;
- singleton: boolean;
- }
- >;
- };
- kind: 'catalog-filter';
- name: 'kind';
- params: {
- loader: () => Promise;
- };
- }>;
- 'catalog-filter:catalog/type': ExtensionDefinition<{
- kind: 'catalog-filter';
- name: 'type';
- config: {};
- configInput: {};
- output: ConfigurableExtensionDataRef<
- JSX_2.Element,
- 'core.reactElement',
- {}
- >;
- inputs: {};
- params: {
- loader: () => Promise;
- };
- }>;
- 'catalog-filter:catalog/mode': ExtensionDefinition<{
- config: {
- mode: 'all' | 'owners-only' | undefined;
- };
- configInput: {
- mode?: 'all' | 'owners-only' | undefined;
- };
- output: ConfigurableExtensionDataRef<
- JSX_2.Element,
- 'core.reactElement',
- {}
- >;
- inputs: {
- [x: string]: ExtensionInput<
- AnyExtensionDataRef,
- {
- optional: boolean;
- singleton: boolean;
- }
- >;
- };
- kind: 'catalog-filter';
- name: 'mode';
- params: {
- loader: () => Promise;
- };
- }>;
- 'catalog-filter:catalog/namespace': ExtensionDefinition<{
- kind: 'catalog-filter';
- name: 'namespace';
- config: {};
- configInput: {};
- output: ConfigurableExtensionDataRef<
- JSX_2.Element,
- 'core.reactElement',
- {}
- >;
- inputs: {};
- params: {
- loader: () => Promise;
- };
- }>;
- 'catalog-filter:catalog/lifecycle': ExtensionDefinition<{
- kind: 'catalog-filter';
- name: 'lifecycle';
- config: {};
- configInput: {};
- output: ConfigurableExtensionDataRef<
- JSX_2.Element,
- 'core.reactElement',
- {}
- >;
- inputs: {};
- params: {
- loader: () => Promise;
- };
- }>;
- 'catalog-filter:catalog/processing-status': ExtensionDefinition<{
- kind: 'catalog-filter';
- name: 'processing-status';
- config: {};
- configInput: {};
- output: ConfigurableExtensionDataRef<
- JSX_2.Element,
- 'core.reactElement',
- {}
- >;
- inputs: {};
- params: {
- loader: () => Promise;
- };
- }>;
- 'catalog-filter:catalog/list': ExtensionDefinition<{
- config: {
- initialFilter: 'all' | 'owned' | 'starred';
- };
- configInput: {
- initialFilter?: 'all' | 'owned' | 'starred' | undefined;
- };
- output: ConfigurableExtensionDataRef<
- JSX_2.Element,
- 'core.reactElement',
- {}
- >;
- inputs: {
- [x: string]: ExtensionInput<
- AnyExtensionDataRef,
- {
- optional: boolean;
- singleton: boolean;
- }
- >;
- };
- kind: 'catalog-filter';
- name: 'list';
- params: {
- loader: () => Promise;
- };
- }>;
- 'page:catalog': ExtensionDefinition<{
- config: {
- path: string | undefined;
- };
- configInput: {
- path?: string | undefined;
- };
- output:
- | ConfigurableExtensionDataRef
- | ConfigurableExtensionDataRef
- | ConfigurableExtensionDataRef<
- RouteRef,
- 'core.routing.ref',
- {
- optional: true;
- }
- >;
- inputs: {
- filters: ExtensionInput<
- ConfigurableExtensionDataRef,
- {
- singleton: false;
- optional: false;
- }
- >;
- };
- kind: 'page';
- name: undefined;
- params: {
- defaultPath: string;
- loader: () => Promise;
- routeRef?: RouteRef | undefined;
- };
- }>;
- 'page:catalog/entity': ExtensionDefinition<{
- config: {
- path: string | undefined;
- };
- configInput: {
- path?: string | undefined;
- };
- output:
- | ConfigurableExtensionDataRef
- | ConfigurableExtensionDataRef
- | ConfigurableExtensionDataRef<
- RouteRef,
- 'core.routing.ref',
- {
- optional: true;
- }
- >;
- inputs: {
- contents: ExtensionInput<
- | ConfigurableExtensionDataRef
- | ConfigurableExtensionDataRef
- | ConfigurableExtensionDataRef<
- RouteRef,
- 'core.routing.ref',
- {
- optional: true;
- }
- >
- | ConfigurableExtensionDataRef<
- string,
- 'catalog.entity-content-title',
- {}
- >
- | ConfigurableExtensionDataRef<
- (entity: Entity) => boolean,
- 'catalog.entity-filter-function',
- {
- optional: true;
- }
- >
- | ConfigurableExtensionDataRef<
- string,
- 'catalog.entity-filter-expression',
- {
- optional: true;
- }
- >,
- {
- singleton: false;
- optional: false;
- }
- >;
- };
- kind: 'page';
- name: 'entity';
- params: {
- defaultPath: string;
- loader: () => Promise;
- routeRef?: RouteRef | undefined;
- };
- }>;
'search-result-list-item:catalog': ExtensionDefinition<{
kind: 'search-result-list-item';
name: undefined;
diff --git a/plugins/devtools/report-alpha.api.md b/plugins/devtools/report-alpha.api.md
index e3261e0f053ce..d76ac7c54ff95 100644
--- a/plugins/devtools/report-alpha.api.md
+++ b/plugins/devtools/report-alpha.api.md
@@ -19,34 +19,19 @@ const _default: FrontendPlugin<
},
{},
{
- 'page:devtools': ExtensionDefinition<{
- kind: 'page';
+ 'api:devtools': ExtensionDefinition<{
+ kind: 'api';
name: undefined;
- config: {
- path: string | undefined;
- };
- configInput: {
- path?: string | undefined;
- };
- output:
- | ConfigurableExtensionDataRef<
- React_2.JSX.Element,
- 'core.reactElement',
- {}
- >
- | ConfigurableExtensionDataRef
- | ConfigurableExtensionDataRef<
- RouteRef,
- 'core.routing.ref',
- {
- optional: true;
- }
- >;
+ config: {};
+ configInput: {};
+ output: ConfigurableExtensionDataRef<
+ AnyApiFactory,
+ 'core.api.factory',
+ {}
+ >;
inputs: {};
params: {
- defaultPath: string;
- loader: () => Promise;
- routeRef?: RouteRef | undefined;
+ factory: AnyApiFactory;
};
}>;
'nav-item:devtools': ExtensionDefinition<{
@@ -70,19 +55,34 @@ const _default: FrontendPlugin<
routeRef: RouteRef;
};
}>;
- 'api:devtools': ExtensionDefinition<{
- kind: 'api';
+ 'page:devtools': ExtensionDefinition<{
+ kind: 'page';
name: undefined;
- config: {};
- configInput: {};
- output: ConfigurableExtensionDataRef<
- AnyApiFactory,
- 'core.api.factory',
- {}
- >;
+ config: {
+ path: string | undefined;
+ };
+ configInput: {
+ path?: string | undefined;
+ };
+ output:
+ | ConfigurableExtensionDataRef<
+ React_2.JSX.Element,
+ 'core.reactElement',
+ {}
+ >
+ | ConfigurableExtensionDataRef
+ | ConfigurableExtensionDataRef<
+ RouteRef,
+ 'core.routing.ref',
+ {
+ optional: true;
+ }
+ >;
inputs: {};
params: {
- factory: AnyApiFactory;
+ defaultPath: string;
+ loader: () => Promise;
+ routeRef?: RouteRef | undefined;
};
}>;
}
diff --git a/plugins/kubernetes/report-alpha.api.md b/plugins/kubernetes/report-alpha.api.md
index 19f055429164c..c2b954022eac4 100644
--- a/plugins/kubernetes/report-alpha.api.md
+++ b/plugins/kubernetes/report-alpha.api.md
@@ -22,6 +22,21 @@ const _default: FrontendPlugin<
},
{},
{
+ 'api:kubernetes': ExtensionDefinition<{
+ kind: 'api';
+ name: undefined;
+ config: {};
+ configInput: {};
+ output: ConfigurableExtensionDataRef<
+ AnyApiFactory,
+ 'core.api.factory',
+ {}
+ >;
+ inputs: {};
+ params: {
+ factory: AnyApiFactory;
+ };
+ }>;
'page:kubernetes': ExtensionDefinition<{
kind: 'page';
name: undefined;
@@ -48,21 +63,6 @@ const _default: FrontendPlugin<
routeRef?: RouteRef | undefined;
};
}>;
- 'api:kubernetes': ExtensionDefinition<{
- kind: 'api';
- name: undefined;
- config: {};
- configInput: {};
- output: ConfigurableExtensionDataRef<
- AnyApiFactory,
- 'core.api.factory',
- {}
- >;
- inputs: {};
- params: {
- factory: AnyApiFactory;
- };
- }>;
'entity-content:kubernetes/kubernetes': ExtensionDefinition<{
kind: 'entity-content';
name: 'kubernetes';
diff --git a/plugins/scaffolder/report-alpha.api.md b/plugins/scaffolder/report-alpha.api.md
index 7623350d963c7..6018c04372e8f 100644
--- a/plugins/scaffolder/report-alpha.api.md
+++ b/plugins/scaffolder/report-alpha.api.md
@@ -53,6 +53,42 @@ const _default: FrontendPlugin<
}>;
},
{
+ 'api:scaffolder': ExtensionDefinition<{
+ kind: 'api';
+ name: undefined;
+ config: {};
+ configInput: {};
+ output: ConfigurableExtensionDataRef<
+ AnyApiFactory,
+ 'core.api.factory',
+ {}
+ >;
+ inputs: {};
+ params: {
+ factory: AnyApiFactory;
+ };
+ }>;
+ 'nav-item:scaffolder': ExtensionDefinition<{
+ kind: 'nav-item';
+ name: undefined;
+ config: {};
+ configInput: {};
+ output: ConfigurableExtensionDataRef<
+ {
+ title: string;
+ icon: IconComponent;
+ routeRef: RouteRef;
+ },
+ 'core.nav-item.target',
+ {}
+ >;
+ inputs: {};
+ params: {
+ title: string;
+ icon: IconComponent;
+ routeRef: RouteRef;
+ };
+ }>;
'api:scaffolder/form-fields': ExtensionDefinition<{
config: {};
configInput: {};
@@ -133,27 +169,6 @@ const _default: FrontendPlugin<
routeRef?: RouteRef | undefined;
};
}>;
- 'nav-item:scaffolder': ExtensionDefinition<{
- kind: 'nav-item';
- name: undefined;
- config: {};
- configInput: {};
- output: ConfigurableExtensionDataRef<
- {
- title: string;
- icon: IconComponent;
- routeRef: RouteRef;
- },
- 'core.nav-item.target',
- {}
- >;
- inputs: {};
- params: {
- title: string;
- icon: IconComponent;
- routeRef: RouteRef;
- };
- }>;
'scaffolder-form-field:scaffolder/repo-url-picker': ExtensionDefinition<{
kind: 'scaffolder-form-field';
name: 'repo-url-picker';
@@ -169,21 +184,6 @@ const _default: FrontendPlugin<
field: () => Promise;
};
}>;
- 'api:scaffolder': ExtensionDefinition<{
- kind: 'api';
- name: undefined;
- config: {};
- configInput: {};
- output: ConfigurableExtensionDataRef<
- AnyApiFactory,
- 'core.api.factory',
- {}
- >;
- inputs: {};
- params: {
- factory: AnyApiFactory;
- };
- }>;
}
>;
export default _default;
diff --git a/plugins/search/report-alpha.api.md b/plugins/search/report-alpha.api.md
index 7581e1c25ff8e..ad9b86c2444d0 100644
--- a/plugins/search/report-alpha.api.md
+++ b/plugins/search/report-alpha.api.md
@@ -23,6 +23,21 @@ const _default: FrontendPlugin<
},
{},
{
+ 'api:search': ExtensionDefinition<{
+ kind: 'api';
+ name: undefined;
+ config: {};
+ configInput: {};
+ output: ConfigurableExtensionDataRef<
+ AnyApiFactory,
+ 'core.api.factory',
+ {}
+ >;
+ inputs: {};
+ params: {
+ factory: AnyApiFactory;
+ };
+ }>;
'nav-item:search': ExtensionDefinition<{
kind: 'nav-item';
name: undefined;
@@ -44,21 +59,6 @@ const _default: FrontendPlugin<
routeRef: RouteRef;
};
}>;
- 'api:search': ExtensionDefinition<{
- kind: 'api';
- name: undefined;
- config: {};
- configInput: {};
- output: ConfigurableExtensionDataRef<
- AnyApiFactory,
- 'core.api.factory',
- {}
- >;
- inputs: {};
- params: {
- factory: AnyApiFactory;
- };
- }>;
'page:search': ExtensionDefinition<{
config: {
noTrack: boolean;
diff --git a/plugins/techdocs/report-alpha.api.md b/plugins/techdocs/report-alpha.api.md
index d39c9d31ed24c..1c53e6f60f475 100644
--- a/plugins/techdocs/report-alpha.api.md
+++ b/plugins/techdocs/report-alpha.api.md
@@ -31,34 +31,19 @@ const _default: FrontendPlugin<
},
{},
{
- 'page:techdocs': ExtensionDefinition<{
- kind: 'page';
+ 'api:techdocs': ExtensionDefinition<{
+ kind: 'api';
name: undefined;
- config: {
- path: string | undefined;
- };
- configInput: {
- path?: string | undefined;
- };
- output:
- | ConfigurableExtensionDataRef<
- React_2.JSX.Element,
- 'core.reactElement',
- {}
- >
- | ConfigurableExtensionDataRef
- | ConfigurableExtensionDataRef<
- RouteRef,
- 'core.routing.ref',
- {
- optional: true;
- }
- >;
+ config: {};
+ configInput: {};
+ output: ConfigurableExtensionDataRef<
+ AnyApiFactory,
+ 'core.api.factory',
+ {}
+ >;
inputs: {};
params: {
- defaultPath: string;
- loader: () => Promise;
- routeRef?: RouteRef | undefined;
+ factory: AnyApiFactory;
};
}>;
'nav-item:techdocs': ExtensionDefinition<{
@@ -82,19 +67,34 @@ const _default: FrontendPlugin<
routeRef: RouteRef;
};
}>;
- 'api:techdocs': ExtensionDefinition<{
- kind: 'api';
+ 'page:techdocs': ExtensionDefinition<{
+ kind: 'page';
name: undefined;
- config: {};
- configInput: {};
- output: ConfigurableExtensionDataRef<
- AnyApiFactory,
- 'core.api.factory',
- {}
- >;
+ config: {
+ path: string | undefined;
+ };
+ configInput: {
+ path?: string | undefined;
+ };
+ output:
+ | ConfigurableExtensionDataRef<
+ React_2.JSX.Element,
+ 'core.reactElement',
+ {}
+ >
+ | ConfigurableExtensionDataRef
+ | ConfigurableExtensionDataRef<
+ RouteRef,
+ 'core.routing.ref',
+ {
+ optional: true;
+ }
+ >;
inputs: {};
params: {
- factory: AnyApiFactory;
+ defaultPath: string;
+ loader: () => Promise;
+ routeRef?: RouteRef | undefined;
};
}>;
'api:techdocs/storage': ExtensionDefinition<{
From e478a6d7ebbef32cfbfd9bf3e3c819db753bb149 Mon Sep 17 00:00:00 2001
From: Andreas Berger
Date: Fri, 17 Jan 2025 15:53:08 +0100
Subject: [PATCH 3/9] distinguish between client and server side paging
Signed-off-by: Andreas Berger
---
.../components/CatalogTable/CatalogTable.tsx | 3 ++-
.../OffsetPaginatedCatalogTable.tsx | 24 ++++++++++---------
2 files changed, 15 insertions(+), 12 deletions(-)
diff --git a/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx b/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx
index 85b86dfcd8db2..10743ac09715b 100644
--- a/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx
+++ b/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx
@@ -23,6 +23,7 @@ import {
} from '@backstage/catalog-model';
import {
CodeSnippet,
+ FavoriteToggleIcon,
TableColumn,
TableProps,
WarningPanel,
@@ -47,7 +48,6 @@ import { CursorPaginatedCatalogTable } from './CursorPaginatedCatalogTable';
import { defaultCatalogTableColumnsFunc } from './defaultCatalogTableColumnsFunc';
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
import { catalogTranslationRef } from '../../alpha';
-import { FavoriteToggleIcon } from '@backstage/core-components';
/**
* Props for {@link CatalogTable}.
@@ -236,6 +236,7 @@ export const CatalogTable = (props: CatalogTableProps) => {
subtitle={subtitle}
options={options}
data={rows}
+ clientPagination={paginationMode === 'none'}
/>
);
};
diff --git a/plugins/catalog/src/components/CatalogTable/OffsetPaginatedCatalogTable.tsx b/plugins/catalog/src/components/CatalogTable/OffsetPaginatedCatalogTable.tsx
index d8197a99b2327..5a8072a29520a 100644
--- a/plugins/catalog/src/components/CatalogTable/OffsetPaginatedCatalogTable.tsx
+++ b/plugins/catalog/src/components/CatalogTable/OffsetPaginatedCatalogTable.tsx
@@ -25,9 +25,12 @@ import { CatalogTableToolbar } from './CatalogTableToolbar';
* @internal
*/
export function OffsetPaginatedCatalogTable(
- props: TableProps,
+ props: TableProps & {
+ // If true, the pagination will be handled client side, the table will use all rows provided in the data prop
+ clientPagination?: boolean;
+ },
) {
- const { columns, data, options, ...restProps } = props;
+ const { columns, data, options, clientPagination, ...restProps } = props;
const { setLimit, setOffset, limit, totalItems, offset } = useEntityList();
const [page, setPage] = React.useState(
@@ -42,7 +45,8 @@ export function OffsetPaginatedCatalogTable(
}
}, [setOffset, page, limit, totalItems]);
- const showPagination = (totalItems ?? data.length) > limit;
+ const showPagination =
+ (clientPagination ? data.length : totalItems ?? data.length) > limit;
return (
{
- setPage(newPage);
- }}
- onRowsPerPageChange={pageSize => {
- setLimit(pageSize);
- }}
- totalCount={totalItems}
+ page={clientPagination ? undefined : page}
+ onPageChange={clientPagination ? undefined : newPage => setPage(newPage)}
+ onRowsPerPageChange={
+ clientPagination ? undefined : pageSize => setLimit(pageSize)
+ }
+ totalCount={clientPagination ? undefined : totalItems}
{...restProps}
/>
);
From 8ce838cb4f4e366e2429bb4faf6b2326b64cd9de Mon Sep 17 00:00:00 2001
From: Andreas Berger
Date: Fri, 17 Jan 2025 16:05:15 +0100
Subject: [PATCH 4/9] use paging mode from context
Signed-off-by: Andreas Berger
---
.../components/CatalogTable/CatalogTable.tsx | 1 -
.../OffsetPaginatedCatalogTable.tsx | 33 ++++++++++---------
2 files changed, 18 insertions(+), 16 deletions(-)
diff --git a/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx b/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx
index 10743ac09715b..838216c8bc0dc 100644
--- a/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx
+++ b/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx
@@ -236,7 +236,6 @@ export const CatalogTable = (props: CatalogTableProps) => {
subtitle={subtitle}
options={options}
data={rows}
- clientPagination={paginationMode === 'none'}
/>
);
};
diff --git a/plugins/catalog/src/components/CatalogTable/OffsetPaginatedCatalogTable.tsx b/plugins/catalog/src/components/CatalogTable/OffsetPaginatedCatalogTable.tsx
index 5a8072a29520a..9b6d7b2a12138 100644
--- a/plugins/catalog/src/components/CatalogTable/OffsetPaginatedCatalogTable.tsx
+++ b/plugins/catalog/src/components/CatalogTable/OffsetPaginatedCatalogTable.tsx
@@ -25,28 +25,29 @@ import { CatalogTableToolbar } from './CatalogTableToolbar';
* @internal
*/
export function OffsetPaginatedCatalogTable(
- props: TableProps & {
- // If true, the pagination will be handled client side, the table will use all rows provided in the data prop
- clientPagination?: boolean;
- },
+ props: TableProps,
) {
- const { columns, data, options, clientPagination, ...restProps } = props;
- const { setLimit, setOffset, limit, totalItems, offset } = useEntityList();
+ const { columns, data, options, ...restProps } = props;
+ const { setLimit, setOffset, limit, totalItems, offset, paginationMode } =
+ useEntityList();
+ const clientPagination = paginationMode === 'none';
const [page, setPage] = React.useState(
offset && limit ? Math.floor(offset / limit) : 0,
);
useEffect(() => {
+ if (clientPagination) {
+ return;
+ }
if (totalItems && page * limit >= totalItems) {
setOffset?.(Math.max(0, totalItems - limit));
} else {
setOffset?.(Math.max(0, page * limit));
}
- }, [setOffset, page, limit, totalItems]);
+ }, [setOffset, page, limit, totalItems, clientPagination]);
- const showPagination =
- (clientPagination ? data.length : totalItems ?? data.length) > limit;
+ const showPagination = (totalItems ?? data.length) > limit;
return (
setPage(newPage)}
- onRowsPerPageChange={
- clientPagination ? undefined : pageSize => setLimit(pageSize)
- }
- totalCount={clientPagination ? undefined : totalItems}
+ {...(clientPagination
+ ? {}
+ : {
+ page,
+ onPageChange: newPage => setPage(newPage),
+ onRowsPerPageChange: pageSize => setLimit(pageSize),
+ totalCount: totalItems,
+ })}
{...restProps}
/>
);
From 601c4833f905abf3bea7c6e33737d6281b375621 Mon Sep 17 00:00:00 2001
From: Andreas Berger
Date: Fri, 17 Jan 2025 16:08:41 +0100
Subject: [PATCH 5/9] clean up code
Signed-off-by: Andreas Berger
---
.../components/CatalogTable/OffsetPaginatedCatalogTable.tsx | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/plugins/catalog/src/components/CatalogTable/OffsetPaginatedCatalogTable.tsx b/plugins/catalog/src/components/CatalogTable/OffsetPaginatedCatalogTable.tsx
index 9b6d7b2a12138..39f3f9a10b41c 100644
--- a/plugins/catalog/src/components/CatalogTable/OffsetPaginatedCatalogTable.tsx
+++ b/plugins/catalog/src/components/CatalogTable/OffsetPaginatedCatalogTable.tsx
@@ -67,8 +67,8 @@ export function OffsetPaginatedCatalogTable(
? {}
: {
page,
- onPageChange: newPage => setPage(newPage),
- onRowsPerPageChange: pageSize => setLimit(pageSize),
+ onPageChange: setPage,
+ onRowsPerPageChange: setLimit,
totalCount: totalItems,
})}
{...restProps}
From 9bddc75afbad11e0e3395de1bebe59b9813e92d4 Mon Sep 17 00:00:00 2001
From: Andreas Berger
Date: Fri, 17 Jan 2025 16:11:41 +0100
Subject: [PATCH 6/9] fix tests
Signed-off-by: Andreas Berger
---
.../CatalogTable/OffsetPaginatedCatalogTable.test.tsx | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/plugins/catalog/src/components/CatalogTable/OffsetPaginatedCatalogTable.test.tsx b/plugins/catalog/src/components/CatalogTable/OffsetPaginatedCatalogTable.test.tsx
index e2e73c5af86a8..e506ccfa99a51 100644
--- a/plugins/catalog/src/components/CatalogTable/OffsetPaginatedCatalogTable.test.tsx
+++ b/plugins/catalog/src/components/CatalogTable/OffsetPaginatedCatalogTable.test.tsx
@@ -108,7 +108,13 @@ describe('OffsetPaginatedCatalogTable', () => {
await renderInTestApp(
wrapInContext(
,
- { setOffset: offsetFn, limit: 10, totalItems: data.length, offset: 0 },
+ {
+ setOffset: offsetFn,
+ limit: 10,
+ totalItems: data.length,
+ offset: 0,
+ paginationMode: 'offset',
+ },
),
);
From 7ad946826b8b04963c3def72e343d6f9267500d6 Mon Sep 17 00:00:00 2001
From: Andreas Berger
Date: Fri, 17 Jan 2025 16:21:44 +0100
Subject: [PATCH 7/9] optimize code
Signed-off-by: Andreas Berger
---
.../CatalogTable/OffsetPaginatedCatalogTable.tsx | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/plugins/catalog/src/components/CatalogTable/OffsetPaginatedCatalogTable.tsx b/plugins/catalog/src/components/CatalogTable/OffsetPaginatedCatalogTable.tsx
index 39f3f9a10b41c..c32e74b6645ce 100644
--- a/plugins/catalog/src/components/CatalogTable/OffsetPaginatedCatalogTable.tsx
+++ b/plugins/catalog/src/components/CatalogTable/OffsetPaginatedCatalogTable.tsx
@@ -37,14 +37,14 @@ export function OffsetPaginatedCatalogTable(
);
useEffect(() => {
- if (clientPagination) {
+ if (clientPagination || !setOffset) {
return;
}
- if (totalItems && page * limit >= totalItems) {
- setOffset?.(Math.max(0, totalItems - limit));
- } else {
- setOffset?.(Math.max(0, page * limit));
+ let newOffset = page * limit;
+ if (totalItems && newOffset >= totalItems) {
+ newOffset = totalItems - limit;
}
+ setOffset(Math.max(0, newOffset));
}, [setOffset, page, limit, totalItems, clientPagination]);
const showPagination = (totalItems ?? data.length) > limit;
From cbda2c644d7d6994a8fbbbdbf8f765e0b149ccc3 Mon Sep 17 00:00:00 2001
From: Andreas Berger
Date: Mon, 20 Jan 2025 08:42:54 +0100
Subject: [PATCH 8/9] do always show paging bar, so the user can change the
limit even if there is only one page available
Signed-off-by: Andreas Berger
---
.../components/CatalogTable/OffsetPaginatedCatalogTable.tsx | 3 ---
1 file changed, 3 deletions(-)
diff --git a/plugins/catalog/src/components/CatalogTable/OffsetPaginatedCatalogTable.tsx b/plugins/catalog/src/components/CatalogTable/OffsetPaginatedCatalogTable.tsx
index c32e74b6645ce..9bae10a403781 100644
--- a/plugins/catalog/src/components/CatalogTable/OffsetPaginatedCatalogTable.tsx
+++ b/plugins/catalog/src/components/CatalogTable/OffsetPaginatedCatalogTable.tsx
@@ -47,8 +47,6 @@ export function OffsetPaginatedCatalogTable(
setOffset(Math.max(0, newOffset));
}, [setOffset, page, limit, totalItems, clientPagination]);
- const showPagination = (totalItems ?? data.length) > limit;
-
return (
Date: Mon, 17 Feb 2025 16:51:21 +0100
Subject: [PATCH 9/9] Revert "fix api-reports (why ever they changed?)"
This reverts commit 6a3dc95fe5948abfc893cc57c7250e6a53d686ad.
Signed-off-by: Andreas Berger
---
plugins/app-visualizer/report.api.md | 42 +-
plugins/catalog-import/report-alpha.api.md | 30 +-
plugins/catalog/report-alpha.api.md | 544 ++++++++++-----------
plugins/devtools/report-alpha.api.md | 70 +--
plugins/kubernetes/report-alpha.api.md | 30 +-
plugins/scaffolder/report-alpha.api.md | 72 +--
plugins/search/report-alpha.api.md | 30 +-
plugins/techdocs/report-alpha.api.md | 70 +--
8 files changed, 444 insertions(+), 444 deletions(-)
diff --git a/plugins/app-visualizer/report.api.md b/plugins/app-visualizer/report.api.md
index f0855c9531370..48eca04ed8543 100644
--- a/plugins/app-visualizer/report.api.md
+++ b/plugins/app-visualizer/report.api.md
@@ -16,27 +16,6 @@ const visualizerPlugin: FrontendPlugin<
{},
{},
{
- 'nav-item:app-visualizer': ExtensionDefinition<{
- kind: 'nav-item';
- name: undefined;
- config: {};
- configInput: {};
- output: ConfigurableExtensionDataRef<
- {
- title: string;
- icon: IconComponent;
- routeRef: RouteRef;
- },
- 'core.nav-item.target',
- {}
- >;
- inputs: {};
- params: {
- title: string;
- icon: IconComponent;
- routeRef: RouteRef;
- };
- }>;
'page:app-visualizer': ExtensionDefinition<{
kind: 'page';
name: undefined;
@@ -67,6 +46,27 @@ const visualizerPlugin: FrontendPlugin<
routeRef?: RouteRef | undefined;
};
}>;
+ 'nav-item:app-visualizer': ExtensionDefinition<{
+ kind: 'nav-item';
+ name: undefined;
+ config: {};
+ configInput: {};
+ output: ConfigurableExtensionDataRef<
+ {
+ title: string;
+ icon: IconComponent;
+ routeRef: RouteRef;
+ },
+ 'core.nav-item.target',
+ {}
+ >;
+ inputs: {};
+ params: {
+ title: string;
+ icon: IconComponent;
+ routeRef: RouteRef;
+ };
+ }>;
}
>;
export default visualizerPlugin;
diff --git a/plugins/catalog-import/report-alpha.api.md b/plugins/catalog-import/report-alpha.api.md
index 1706404b943ca..c13f7a1a4a862 100644
--- a/plugins/catalog-import/report-alpha.api.md
+++ b/plugins/catalog-import/report-alpha.api.md
@@ -18,21 +18,6 @@ const _default: FrontendPlugin<
},
{},
{
- 'api:catalog-import': ExtensionDefinition<{
- kind: 'api';
- name: undefined;
- config: {};
- configInput: {};
- output: ConfigurableExtensionDataRef<
- AnyApiFactory,
- 'core.api.factory',
- {}
- >;
- inputs: {};
- params: {
- factory: AnyApiFactory;
- };
- }>;
'page:catalog-import': ExtensionDefinition<{
kind: 'page';
name: undefined;
@@ -63,6 +48,21 @@ const _default: FrontendPlugin<
routeRef?: RouteRef | undefined;
};
}>;
+ 'api:catalog-import': ExtensionDefinition<{
+ kind: 'api';
+ name: undefined;
+ config: {};
+ configInput: {};
+ output: ConfigurableExtensionDataRef<
+ AnyApiFactory,
+ 'core.api.factory',
+ {}
+ >;
+ inputs: {};
+ params: {
+ factory: AnyApiFactory;
+ };
+ }>;
}
>;
export default _default;
diff --git a/plugins/catalog/report-alpha.api.md b/plugins/catalog/report-alpha.api.md
index f597331e8133f..bdd9240d537d1 100644
--- a/plugins/catalog/report-alpha.api.md
+++ b/plugins/catalog/report-alpha.api.md
@@ -146,24 +146,30 @@ const _default: FrontendPlugin<
unregisterRedirect: ExternalRouteRef;
},
{
- 'api:catalog': ExtensionDefinition<{
- kind: 'api';
+ 'nav-item:catalog': ExtensionDefinition<{
+ kind: 'nav-item';
name: undefined;
config: {};
configInput: {};
output: ConfigurableExtensionDataRef<
- AnyApiFactory,
- 'core.api.factory',
+ {
+ title: string;
+ icon: IconComponent;
+ routeRef: RouteRef;
+ },
+ 'core.nav-item.target',
{}
>;
inputs: {};
params: {
- factory: AnyApiFactory;
+ title: string;
+ icon: IconComponent;
+ routeRef: RouteRef;
};
}>;
- 'api:catalog/starred-entities': ExtensionDefinition<{
+ 'api:catalog': ExtensionDefinition<{
kind: 'api';
- name: 'starred-entities';
+ name: undefined;
config: {};
configInput: {};
output: ConfigurableExtensionDataRef<
@@ -176,9 +182,9 @@ const _default: FrontendPlugin<
factory: AnyApiFactory;
};
}>;
- 'api:catalog/entity-presentation': ExtensionDefinition<{
+ 'api:catalog/starred-entities': ExtensionDefinition<{
kind: 'api';
- name: 'entity-presentation';
+ name: 'starred-entities';
config: {};
configInput: {};
output: ConfigurableExtensionDataRef<
@@ -191,276 +197,19 @@ const _default: FrontendPlugin<
factory: AnyApiFactory;
};
}>;
- 'page:catalog': ExtensionDefinition<{
- config: {
- path: string | undefined;
- };
- configInput: {
- path?: string | undefined;
- };
- output:
- | ConfigurableExtensionDataRef
- | ConfigurableExtensionDataRef
- | ConfigurableExtensionDataRef<
- RouteRef,
- 'core.routing.ref',
- {
- optional: true;
- }
- >;
- inputs: {
- filters: ExtensionInput<
- ConfigurableExtensionDataRef,
- {
- singleton: false;
- optional: false;
- }
- >;
- };
- kind: 'page';
- name: undefined;
- params: {
- defaultPath: string;
- loader: () => Promise;
- routeRef?: RouteRef | undefined;
- };
- }>;
- 'page:catalog/entity': ExtensionDefinition<{
- config: {
- path: string | undefined;
- };
- configInput: {
- path?: string | undefined;
- };
- output:
- | ConfigurableExtensionDataRef
- | ConfigurableExtensionDataRef
- | ConfigurableExtensionDataRef<
- RouteRef,
- 'core.routing.ref',
- {
- optional: true;
- }
- >;
- inputs: {
- contents: ExtensionInput<
- | ConfigurableExtensionDataRef
- | ConfigurableExtensionDataRef
- | ConfigurableExtensionDataRef<
- RouteRef,
- 'core.routing.ref',
- {
- optional: true;
- }
- >
- | ConfigurableExtensionDataRef<
- string,
- 'catalog.entity-content-title',
- {}
- >
- | ConfigurableExtensionDataRef<
- (entity: Entity) => boolean,
- 'catalog.entity-filter-function',
- {
- optional: true;
- }
- >
- | ConfigurableExtensionDataRef<
- string,
- 'catalog.entity-filter-expression',
- {
- optional: true;
- }
- >,
- {
- singleton: false;
- optional: false;
- }
- >;
- };
- kind: 'page';
- name: 'entity';
- params: {
- defaultPath: string;
- loader: () => Promise;
- routeRef?: RouteRef | undefined;
- };
- }>;
- 'catalog-filter:catalog/tag': ExtensionDefinition<{
- kind: 'catalog-filter';
- name: 'tag';
- config: {};
- configInput: {};
- output: ConfigurableExtensionDataRef<
- JSX_2.Element,
- 'core.reactElement',
- {}
- >;
- inputs: {};
- params: {
- loader: () => Promise;
- };
- }>;
- 'catalog-filter:catalog/kind': ExtensionDefinition<{
- config: {
- initialFilter: string;
- };
- configInput: {
- initialFilter?: string | undefined;
- };
- output: ConfigurableExtensionDataRef<
- JSX_2.Element,
- 'core.reactElement',
- {}
- >;
- inputs: {
- [x: string]: ExtensionInput<
- AnyExtensionDataRef,
- {
- optional: boolean;
- singleton: boolean;
- }
- >;
- };
- kind: 'catalog-filter';
- name: 'kind';
- params: {
- loader: () => Promise;
- };
- }>;
- 'catalog-filter:catalog/type': ExtensionDefinition<{
- kind: 'catalog-filter';
- name: 'type';
- config: {};
- configInput: {};
- output: ConfigurableExtensionDataRef<
- JSX_2.Element,
- 'core.reactElement',
- {}
- >;
- inputs: {};
- params: {
- loader: () => Promise;
- };
- }>;
- 'catalog-filter:catalog/mode': ExtensionDefinition<{
- config: {
- mode: 'all' | 'owners-only' | undefined;
- };
- configInput: {
- mode?: 'all' | 'owners-only' | undefined;
- };
- output: ConfigurableExtensionDataRef<
- JSX_2.Element,
- 'core.reactElement',
- {}
- >;
- inputs: {
- [x: string]: ExtensionInput<
- AnyExtensionDataRef,
- {
- optional: boolean;
- singleton: boolean;
- }
- >;
- };
- kind: 'catalog-filter';
- name: 'mode';
- params: {
- loader: () => Promise;
- };
- }>;
- 'catalog-filter:catalog/namespace': ExtensionDefinition<{
- kind: 'catalog-filter';
- name: 'namespace';
- config: {};
- configInput: {};
- output: ConfigurableExtensionDataRef<
- JSX_2.Element,
- 'core.reactElement',
- {}
- >;
- inputs: {};
- params: {
- loader: () => Promise;
- };
- }>;
- 'catalog-filter:catalog/lifecycle': ExtensionDefinition<{
- kind: 'catalog-filter';
- name: 'lifecycle';
- config: {};
- configInput: {};
- output: ConfigurableExtensionDataRef<
- JSX_2.Element,
- 'core.reactElement',
- {}
- >;
- inputs: {};
- params: {
- loader: () => Promise;
- };
- }>;
- 'catalog-filter:catalog/processing-status': ExtensionDefinition<{
- kind: 'catalog-filter';
- name: 'processing-status';
- config: {};
- configInput: {};
- output: ConfigurableExtensionDataRef<
- JSX_2.Element,
- 'core.reactElement',
- {}
- >;
- inputs: {};
- params: {
- loader: () => Promise;
- };
- }>;
- 'catalog-filter:catalog/list': ExtensionDefinition<{
- config: {
- initialFilter: 'all' | 'owned' | 'starred';
- };
- configInput: {
- initialFilter?: 'all' | 'owned' | 'starred' | undefined;
- };
- output: ConfigurableExtensionDataRef<
- JSX_2.Element,
- 'core.reactElement',
- {}
- >;
- inputs: {
- [x: string]: ExtensionInput<
- AnyExtensionDataRef,
- {
- optional: boolean;
- singleton: boolean;
- }
- >;
- };
- kind: 'catalog-filter';
- name: 'list';
- params: {
- loader: () => Promise;
- };
- }>;
- 'nav-item:catalog': ExtensionDefinition<{
- kind: 'nav-item';
- name: undefined;
+ 'api:catalog/entity-presentation': ExtensionDefinition<{
+ kind: 'api';
+ name: 'entity-presentation';
config: {};
configInput: {};
output: ConfigurableExtensionDataRef<
- {
- title: string;
- icon: IconComponent;
- routeRef: RouteRef;
- },
- 'core.nav-item.target',
+ AnyApiFactory,
+ 'core.api.factory',
{}
>;
inputs: {};
params: {
- title: string;
- icon: IconComponent;
- routeRef: RouteRef;
+ factory: AnyApiFactory;
};
}>;
'entity-card:catalog/about': ExtensionDefinition<{
@@ -846,6 +595,257 @@ const _default: FrontendPlugin<
filter?: string | ((entity: Entity) => boolean) | undefined;
};
}>;
+ 'catalog-filter:catalog/tag': ExtensionDefinition<{
+ kind: 'catalog-filter';
+ name: 'tag';
+ config: {};
+ configInput: {};
+ output: ConfigurableExtensionDataRef<
+ JSX_2.Element,
+ 'core.reactElement',
+ {}
+ >;
+ inputs: {};
+ params: {
+ loader: () => Promise;
+ };
+ }>;
+ 'catalog-filter:catalog/kind': ExtensionDefinition<{
+ config: {
+ initialFilter: string;
+ };
+ configInput: {
+ initialFilter?: string | undefined;
+ };
+ output: ConfigurableExtensionDataRef<
+ JSX_2.Element,
+ 'core.reactElement',
+ {}
+ >;
+ inputs: {
+ [x: string]: ExtensionInput<
+ AnyExtensionDataRef,
+ {
+ optional: boolean;
+ singleton: boolean;
+ }
+ >;
+ };
+ kind: 'catalog-filter';
+ name: 'kind';
+ params: {
+ loader: () => Promise;
+ };
+ }>;
+ 'catalog-filter:catalog/type': ExtensionDefinition<{
+ kind: 'catalog-filter';
+ name: 'type';
+ config: {};
+ configInput: {};
+ output: ConfigurableExtensionDataRef<
+ JSX_2.Element,
+ 'core.reactElement',
+ {}
+ >;
+ inputs: {};
+ params: {
+ loader: () => Promise;
+ };
+ }>;
+ 'catalog-filter:catalog/mode': ExtensionDefinition<{
+ config: {
+ mode: 'all' | 'owners-only' | undefined;
+ };
+ configInput: {
+ mode?: 'all' | 'owners-only' | undefined;
+ };
+ output: ConfigurableExtensionDataRef<
+ JSX_2.Element,
+ 'core.reactElement',
+ {}
+ >;
+ inputs: {
+ [x: string]: ExtensionInput<
+ AnyExtensionDataRef,
+ {
+ optional: boolean;
+ singleton: boolean;
+ }
+ >;
+ };
+ kind: 'catalog-filter';
+ name: 'mode';
+ params: {
+ loader: () => Promise;
+ };
+ }>;
+ 'catalog-filter:catalog/namespace': ExtensionDefinition<{
+ kind: 'catalog-filter';
+ name: 'namespace';
+ config: {};
+ configInput: {};
+ output: ConfigurableExtensionDataRef<
+ JSX_2.Element,
+ 'core.reactElement',
+ {}
+ >;
+ inputs: {};
+ params: {
+ loader: () => Promise;
+ };
+ }>;
+ 'catalog-filter:catalog/lifecycle': ExtensionDefinition<{
+ kind: 'catalog-filter';
+ name: 'lifecycle';
+ config: {};
+ configInput: {};
+ output: ConfigurableExtensionDataRef<
+ JSX_2.Element,
+ 'core.reactElement',
+ {}
+ >;
+ inputs: {};
+ params: {
+ loader: () => Promise;
+ };
+ }>;
+ 'catalog-filter:catalog/processing-status': ExtensionDefinition<{
+ kind: 'catalog-filter';
+ name: 'processing-status';
+ config: {};
+ configInput: {};
+ output: ConfigurableExtensionDataRef<
+ JSX_2.Element,
+ 'core.reactElement',
+ {}
+ >;
+ inputs: {};
+ params: {
+ loader: () => Promise;
+ };
+ }>;
+ 'catalog-filter:catalog/list': ExtensionDefinition<{
+ config: {
+ initialFilter: 'all' | 'owned' | 'starred';
+ };
+ configInput: {
+ initialFilter?: 'all' | 'owned' | 'starred' | undefined;
+ };
+ output: ConfigurableExtensionDataRef<
+ JSX_2.Element,
+ 'core.reactElement',
+ {}
+ >;
+ inputs: {
+ [x: string]: ExtensionInput<
+ AnyExtensionDataRef,
+ {
+ optional: boolean;
+ singleton: boolean;
+ }
+ >;
+ };
+ kind: 'catalog-filter';
+ name: 'list';
+ params: {
+ loader: () => Promise;
+ };
+ }>;
+ 'page:catalog': ExtensionDefinition<{
+ config: {
+ path: string | undefined;
+ };
+ configInput: {
+ path?: string | undefined;
+ };
+ output:
+ | ConfigurableExtensionDataRef
+ | ConfigurableExtensionDataRef
+ | ConfigurableExtensionDataRef<
+ RouteRef,
+ 'core.routing.ref',
+ {
+ optional: true;
+ }
+ >;
+ inputs: {
+ filters: ExtensionInput<
+ ConfigurableExtensionDataRef,
+ {
+ singleton: false;
+ optional: false;
+ }
+ >;
+ };
+ kind: 'page';
+ name: undefined;
+ params: {
+ defaultPath: string;
+ loader: () => Promise;
+ routeRef?: RouteRef | undefined;
+ };
+ }>;
+ 'page:catalog/entity': ExtensionDefinition<{
+ config: {
+ path: string | undefined;
+ };
+ configInput: {
+ path?: string | undefined;
+ };
+ output:
+ | ConfigurableExtensionDataRef
+ | ConfigurableExtensionDataRef
+ | ConfigurableExtensionDataRef<
+ RouteRef,
+ 'core.routing.ref',
+ {
+ optional: true;
+ }
+ >;
+ inputs: {
+ contents: ExtensionInput<
+ | ConfigurableExtensionDataRef
+ | ConfigurableExtensionDataRef
+ | ConfigurableExtensionDataRef<
+ RouteRef,
+ 'core.routing.ref',
+ {
+ optional: true;
+ }
+ >
+ | ConfigurableExtensionDataRef<
+ string,
+ 'catalog.entity-content-title',
+ {}
+ >
+ | ConfigurableExtensionDataRef<
+ (entity: Entity) => boolean,
+ 'catalog.entity-filter-function',
+ {
+ optional: true;
+ }
+ >
+ | ConfigurableExtensionDataRef<
+ string,
+ 'catalog.entity-filter-expression',
+ {
+ optional: true;
+ }
+ >,
+ {
+ singleton: false;
+ optional: false;
+ }
+ >;
+ };
+ kind: 'page';
+ name: 'entity';
+ params: {
+ defaultPath: string;
+ loader: () => Promise;
+ routeRef?: RouteRef | undefined;
+ };
+ }>;
'search-result-list-item:catalog': ExtensionDefinition<{
kind: 'search-result-list-item';
name: undefined;
diff --git a/plugins/devtools/report-alpha.api.md b/plugins/devtools/report-alpha.api.md
index d76ac7c54ff95..e3261e0f053ce 100644
--- a/plugins/devtools/report-alpha.api.md
+++ b/plugins/devtools/report-alpha.api.md
@@ -19,19 +19,34 @@ const _default: FrontendPlugin<
},
{},
{
- 'api:devtools': ExtensionDefinition<{
- kind: 'api';
+ 'page:devtools': ExtensionDefinition<{
+ kind: 'page';
name: undefined;
- config: {};
- configInput: {};
- output: ConfigurableExtensionDataRef<
- AnyApiFactory,
- 'core.api.factory',
- {}
- >;
+ config: {
+ path: string | undefined;
+ };
+ configInput: {
+ path?: string | undefined;
+ };
+ output:
+ | ConfigurableExtensionDataRef<
+ React_2.JSX.Element,
+ 'core.reactElement',
+ {}
+ >
+ | ConfigurableExtensionDataRef
+ | ConfigurableExtensionDataRef<
+ RouteRef,
+ 'core.routing.ref',
+ {
+ optional: true;
+ }
+ >;
inputs: {};
params: {
- factory: AnyApiFactory;
+ defaultPath: string;
+ loader: () => Promise;
+ routeRef?: RouteRef | undefined;
};
}>;
'nav-item:devtools': ExtensionDefinition<{
@@ -55,34 +70,19 @@ const _default: FrontendPlugin<
routeRef: RouteRef;
};
}>;
- 'page:devtools': ExtensionDefinition<{
- kind: 'page';
+ 'api:devtools': ExtensionDefinition<{
+ kind: 'api';
name: undefined;
- config: {
- path: string | undefined;
- };
- configInput: {
- path?: string | undefined;
- };
- output:
- | ConfigurableExtensionDataRef<
- React_2.JSX.Element,
- 'core.reactElement',
- {}
- >
- | ConfigurableExtensionDataRef
- | ConfigurableExtensionDataRef<
- RouteRef,
- 'core.routing.ref',
- {
- optional: true;
- }
- >;
+ config: {};
+ configInput: {};
+ output: ConfigurableExtensionDataRef<
+ AnyApiFactory,
+ 'core.api.factory',
+ {}
+ >;
inputs: {};
params: {
- defaultPath: string;
- loader: () => Promise;
- routeRef?: RouteRef | undefined;
+ factory: AnyApiFactory;
};
}>;
}
diff --git a/plugins/kubernetes/report-alpha.api.md b/plugins/kubernetes/report-alpha.api.md
index c2b954022eac4..19f055429164c 100644
--- a/plugins/kubernetes/report-alpha.api.md
+++ b/plugins/kubernetes/report-alpha.api.md
@@ -22,21 +22,6 @@ const _default: FrontendPlugin<
},
{},
{
- 'api:kubernetes': ExtensionDefinition<{
- kind: 'api';
- name: undefined;
- config: {};
- configInput: {};
- output: ConfigurableExtensionDataRef<
- AnyApiFactory,
- 'core.api.factory',
- {}
- >;
- inputs: {};
- params: {
- factory: AnyApiFactory;
- };
- }>;
'page:kubernetes': ExtensionDefinition<{
kind: 'page';
name: undefined;
@@ -63,6 +48,21 @@ const _default: FrontendPlugin<
routeRef?: RouteRef | undefined;
};
}>;
+ 'api:kubernetes': ExtensionDefinition<{
+ kind: 'api';
+ name: undefined;
+ config: {};
+ configInput: {};
+ output: ConfigurableExtensionDataRef<
+ AnyApiFactory,
+ 'core.api.factory',
+ {}
+ >;
+ inputs: {};
+ params: {
+ factory: AnyApiFactory;
+ };
+ }>;
'entity-content:kubernetes/kubernetes': ExtensionDefinition<{
kind: 'entity-content';
name: 'kubernetes';
diff --git a/plugins/scaffolder/report-alpha.api.md b/plugins/scaffolder/report-alpha.api.md
index 6018c04372e8f..7623350d963c7 100644
--- a/plugins/scaffolder/report-alpha.api.md
+++ b/plugins/scaffolder/report-alpha.api.md
@@ -53,42 +53,6 @@ const _default: FrontendPlugin<
}>;
},
{
- 'api:scaffolder': ExtensionDefinition<{
- kind: 'api';
- name: undefined;
- config: {};
- configInput: {};
- output: ConfigurableExtensionDataRef<
- AnyApiFactory,
- 'core.api.factory',
- {}
- >;
- inputs: {};
- params: {
- factory: AnyApiFactory;
- };
- }>;
- 'nav-item:scaffolder': ExtensionDefinition<{
- kind: 'nav-item';
- name: undefined;
- config: {};
- configInput: {};
- output: ConfigurableExtensionDataRef<
- {
- title: string;
- icon: IconComponent;
- routeRef: RouteRef;
- },
- 'core.nav-item.target',
- {}
- >;
- inputs: {};
- params: {
- title: string;
- icon: IconComponent;
- routeRef: RouteRef;
- };
- }>;
'api:scaffolder/form-fields': ExtensionDefinition<{
config: {};
configInput: {};
@@ -169,6 +133,27 @@ const _default: FrontendPlugin<
routeRef?: RouteRef | undefined;
};
}>;
+ 'nav-item:scaffolder': ExtensionDefinition<{
+ kind: 'nav-item';
+ name: undefined;
+ config: {};
+ configInput: {};
+ output: ConfigurableExtensionDataRef<
+ {
+ title: string;
+ icon: IconComponent;
+ routeRef: RouteRef;
+ },
+ 'core.nav-item.target',
+ {}
+ >;
+ inputs: {};
+ params: {
+ title: string;
+ icon: IconComponent;
+ routeRef: RouteRef;
+ };
+ }>;
'scaffolder-form-field:scaffolder/repo-url-picker': ExtensionDefinition<{
kind: 'scaffolder-form-field';
name: 'repo-url-picker';
@@ -184,6 +169,21 @@ const _default: FrontendPlugin<
field: () => Promise;
};
}>;
+ 'api:scaffolder': ExtensionDefinition<{
+ kind: 'api';
+ name: undefined;
+ config: {};
+ configInput: {};
+ output: ConfigurableExtensionDataRef<
+ AnyApiFactory,
+ 'core.api.factory',
+ {}
+ >;
+ inputs: {};
+ params: {
+ factory: AnyApiFactory;
+ };
+ }>;
}
>;
export default _default;
diff --git a/plugins/search/report-alpha.api.md b/plugins/search/report-alpha.api.md
index ad9b86c2444d0..7581e1c25ff8e 100644
--- a/plugins/search/report-alpha.api.md
+++ b/plugins/search/report-alpha.api.md
@@ -23,21 +23,6 @@ const _default: FrontendPlugin<
},
{},
{
- 'api:search': ExtensionDefinition<{
- kind: 'api';
- name: undefined;
- config: {};
- configInput: {};
- output: ConfigurableExtensionDataRef<
- AnyApiFactory,
- 'core.api.factory',
- {}
- >;
- inputs: {};
- params: {
- factory: AnyApiFactory;
- };
- }>;
'nav-item:search': ExtensionDefinition<{
kind: 'nav-item';
name: undefined;
@@ -59,6 +44,21 @@ const _default: FrontendPlugin<
routeRef: RouteRef;
};
}>;
+ 'api:search': ExtensionDefinition<{
+ kind: 'api';
+ name: undefined;
+ config: {};
+ configInput: {};
+ output: ConfigurableExtensionDataRef<
+ AnyApiFactory,
+ 'core.api.factory',
+ {}
+ >;
+ inputs: {};
+ params: {
+ factory: AnyApiFactory;
+ };
+ }>;
'page:search': ExtensionDefinition<{
config: {
noTrack: boolean;
diff --git a/plugins/techdocs/report-alpha.api.md b/plugins/techdocs/report-alpha.api.md
index 1c53e6f60f475..d39c9d31ed24c 100644
--- a/plugins/techdocs/report-alpha.api.md
+++ b/plugins/techdocs/report-alpha.api.md
@@ -31,19 +31,34 @@ const _default: FrontendPlugin<
},
{},
{
- 'api:techdocs': ExtensionDefinition<{
- kind: 'api';
+ 'page:techdocs': ExtensionDefinition<{
+ kind: 'page';
name: undefined;
- config: {};
- configInput: {};
- output: ConfigurableExtensionDataRef<
- AnyApiFactory,
- 'core.api.factory',
- {}
- >;
+ config: {
+ path: string | undefined;
+ };
+ configInput: {
+ path?: string | undefined;
+ };
+ output:
+ | ConfigurableExtensionDataRef<
+ React_2.JSX.Element,
+ 'core.reactElement',
+ {}
+ >
+ | ConfigurableExtensionDataRef
+ | ConfigurableExtensionDataRef<
+ RouteRef,
+ 'core.routing.ref',
+ {
+ optional: true;
+ }
+ >;
inputs: {};
params: {
- factory: AnyApiFactory;
+ defaultPath: string;
+ loader: () => Promise;
+ routeRef?: RouteRef | undefined;
};
}>;
'nav-item:techdocs': ExtensionDefinition<{
@@ -67,34 +82,19 @@ const _default: FrontendPlugin<
routeRef: RouteRef;
};
}>;
- 'page:techdocs': ExtensionDefinition<{
- kind: 'page';
+ 'api:techdocs': ExtensionDefinition<{
+ kind: 'api';
name: undefined;
- config: {
- path: string | undefined;
- };
- configInput: {
- path?: string | undefined;
- };
- output:
- | ConfigurableExtensionDataRef<
- React_2.JSX.Element,
- 'core.reactElement',
- {}
- >
- | ConfigurableExtensionDataRef
- | ConfigurableExtensionDataRef<
- RouteRef,
- 'core.routing.ref',
- {
- optional: true;
- }
- >;
+ config: {};
+ configInput: {};
+ output: ConfigurableExtensionDataRef<
+ AnyApiFactory,
+ 'core.api.factory',
+ {}
+ >;
inputs: {};
params: {
- defaultPath: string;
- loader: () => Promise;
- routeRef?: RouteRef | undefined;
+ factory: AnyApiFactory;
};
}>;
'api:techdocs/storage': ExtensionDefinition<{