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<{