feat(plugins/org): add overwrites to membership and ownership cards

Signed-off-by: secustor <sebastian@poxhofer.at>
This commit is contained in:
secustor
2025-09-09 14:48:48 +02:00
parent 309941a451
commit 8b7351f3df
4 changed files with 91 additions and 20 deletions
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-org': patch
---
Add `initialRelationAggregation` and `showAggregateMembersToggle` options to `EntityMembersListCard` as well to `EntityOwnershipCard`
+5
View File
@@ -22,6 +22,11 @@ app:
ownerEntityRefs: [cubic-belugas]
extensions:
- entity-card:org/members-list:
config:
showAggregateMembersToggle: true
initialRelationAggregation: aggregated
# - apis.plugin.graphiql.browse.gitlab: true
# - graphiql-endpoint:graphiql/gitlab: true
+34 -6
View File
@@ -63,13 +63,17 @@ const _default: OverridableFrontendPlugin<
};
}>;
'entity-card:org/members-list': ExtensionDefinition<{
kind: 'entity-card';
name: 'members-list';
config: {
initialRelationAggregation: 'direct' | 'aggregated' | undefined;
showAggregateMembersToggle: boolean | undefined;
} & {
filter: EntityPredicate | undefined;
type: 'content' | 'summary' | 'info' | undefined;
};
configInput: {
showAggregateMembersToggle?: boolean | undefined;
initialRelationAggregation?: 'direct' | 'aggregated' | undefined;
} & {
filter?: EntityPredicate | undefined;
type?: 'content' | 'summary' | 'info' | undefined;
};
@@ -96,7 +100,17 @@ const _default: OverridableFrontendPlugin<
optional: true;
}
>;
inputs: {};
inputs: {
[x: string]: ExtensionInput<
ExtensionDataRef,
{
optional: boolean;
singleton: boolean;
}
>;
};
kind: 'entity-card';
name: 'members-list';
params: {
loader: () => Promise<JSX.Element>;
filter?: string | EntityPredicate | ((entity: Entity) => boolean);
@@ -104,13 +118,17 @@ const _default: OverridableFrontendPlugin<
};
}>;
'entity-card:org/ownership': ExtensionDefinition<{
kind: 'entity-card';
name: 'ownership';
config: {
initialRelationAggregation: 'direct' | 'aggregated' | undefined;
showAggregateMembersToggle: boolean | undefined;
} & {
filter: EntityPredicate | undefined;
type: 'content' | 'summary' | 'info' | undefined;
};
configInput: {
showAggregateMembersToggle?: boolean | undefined;
initialRelationAggregation?: 'direct' | 'aggregated' | undefined;
} & {
filter?: EntityPredicate | undefined;
type?: 'content' | 'summary' | 'info' | undefined;
};
@@ -137,7 +155,17 @@ const _default: OverridableFrontendPlugin<
optional: true;
}
>;
inputs: {};
inputs: {
[x: string]: ExtensionInput<
ExtensionDataRef,
{
optional: boolean;
singleton: boolean;
}
>;
};
kind: 'entity-card';
name: 'ownership';
params: {
loader: () => Promise<JSX.Element>;
filter?: string | EntityPredicate | ((entity: Entity) => boolean);
+47 -14
View File
@@ -36,26 +36,59 @@ const EntityGroupProfileCard = EntityCardBlueprint.make({
});
/** @alpha */
const EntityMembersListCard = EntityCardBlueprint.make({
const EntityMembersListCard = EntityCardBlueprint.makeWithOverrides({
name: 'members-list',
params: {
filter: { kind: 'group' },
loader: async () =>
import('./components/Cards/Group/MembersList/MembersListCard').then(m =>
compatWrapper(<m.MembersListCard />),
),
config: {
schema: {
initialRelationAggregation: z =>
z.enum(['direct', 'aggregated']).optional(),
showAggregateMembersToggle: z => z.boolean().optional(),
},
},
factory(originalFactory, { config }) {
return originalFactory({
filter: { kind: 'group' },
loader: async () =>
import('./components/Cards/Group/MembersList/MembersListCard').then(m =>
compatWrapper(
<m.MembersListCard
relationAggregation={config.initialRelationAggregation}
showAggregateMembersToggle={config.showAggregateMembersToggle}
/>,
),
),
});
},
});
/** @alpha */
const EntityOwnershipCard = EntityCardBlueprint.make({
const EntityOwnershipCard = EntityCardBlueprint.makeWithOverrides({
name: 'ownership',
params: {
filter: { kind: { $in: ['group', 'user'] } },
loader: async () =>
import('./components/Cards/OwnershipCard/OwnershipCard').then(m =>
compatWrapper(<m.OwnershipCard />),
),
config: {
schema: {
initialRelationAggregation: z =>
z.enum(['direct', 'aggregated']).optional(),
showAggregateMembersToggle: z => z.boolean().optional(),
},
},
factory(originalFactory, { config }) {
return originalFactory({
filter: { kind: { $in: ['group', 'user'] } },
loader: async () =>
import('./components/Cards/OwnershipCard/OwnershipCard').then(m =>
compatWrapper(
<m.OwnershipCard
relationAggregation={config.initialRelationAggregation}
// harmonize the exposed alpha endpoints, but keep the default behaviour
hideRelationsToggle={
config.showAggregateMembersToggle === undefined
? undefined
: !config.showAggregateMembersToggle
}
/>,
),
),
});
},
});