@drodil/backstage-plugin-qeta 3.55.8 → 3.56.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/alpha.d.ts CHANGED
@@ -89,6 +89,7 @@ declare const _default: _backstage_frontend_plugin_api.OverridableFrontendPlugin
89
89
  initialPageSize: number | undefined;
90
90
  type: "question" | "article" | "link" | undefined;
91
91
  view: "grid" | "list" | undefined;
92
+ relations: string[] | undefined;
92
93
  path: string | undefined;
93
94
  title: string | undefined;
94
95
  filter: _backstage_plugin_catalog_react_alpha.EntityPredicate | undefined;
@@ -96,6 +97,7 @@ declare const _default: _backstage_frontend_plugin_api.OverridableFrontendPlugin
96
97
  };
97
98
  configInput: {
98
99
  type?: "question" | "article" | "link" | undefined;
100
+ relations?: string[] | undefined;
99
101
  view?: "grid" | "list" | undefined;
100
102
  showFilters?: boolean | undefined;
101
103
  showTitle?: boolean | undefined;
package/dist/alpha.esm.js CHANGED
@@ -134,7 +134,8 @@ const EntityPostsContent = EntityContentBlueprint.makeWithOverrides({
134
134
  showNoQuestionsBtn: (z) => z.boolean().optional(),
135
135
  initialPageSize: (z) => z.number().optional(),
136
136
  type: (z) => z.enum(["question", "article", "link"]).optional(),
137
- view: (z) => z.enum(["list", "grid"]).optional()
137
+ view: (z) => z.enum(["list", "grid"]).optional(),
138
+ relations: (z) => z.array(z.string()).optional()
138
139
  }
139
140
  },
140
141
  inputs: {
@@ -1 +1 @@
1
- {"version":3,"file":"alpha.esm.js","sources":["../src/alpha.tsx"],"sourcesContent":["import {\n ApiBlueprint,\n coreExtensionData,\n createExtensionBlueprint,\n createExtensionDataRef,\n createExtensionInput,\n createFrontendPlugin,\n NavItemBlueprint,\n PageBlueprint,\n} from '@backstage/frontend-plugin-api';\nimport {\n compatWrapper,\n convertLegacyRouteRef,\n convertLegacyRouteRefs,\n} from '@backstage/core-compat-api';\nimport { qetaApiRef, qetaRouteRef } from '@drodil/backstage-plugin-qeta-react';\nimport {\n configApiRef,\n discoveryApiRef,\n fetchApiRef,\n} from '@backstage/core-plugin-api';\nimport {\n getSupportedEntityKinds,\n QetaClient,\n} from '@drodil/backstage-plugin-qeta-common';\nimport ContactSupportIcon from '@material-ui/icons/ContactSupport';\nimport { EntityContentBlueprint } from '@backstage/plugin-catalog-react/alpha';\nimport { Entity } from '@backstage/catalog-model';\nimport {\n SearchFilterResultTypeBlueprint,\n SearchResultListItemBlueprint,\n} from '@backstage/plugin-search-react/alpha';\nimport { TechDocsAddonLocations } from '@backstage/plugin-techdocs-react';\nimport { AddonBlueprint } from '@backstage/plugin-techdocs-react/alpha';\nimport { TechDocsAskQuestionAddon } from './components/TechDocsAskQuestionAddon';\nimport { Pluggable } from 'unified';\n\nconst qetaApi = ApiBlueprint.make({\n params: defineParams =>\n defineParams({\n api: qetaApiRef,\n deps: {\n discoveryApi: discoveryApiRef,\n fetchApi: fetchApiRef,\n },\n factory({ discoveryApi, fetchApi }) {\n return new QetaClient({ discoveryApi, fetchApi });\n },\n }),\n});\n\nexport const QetaPageIntroElementBlueprint = createExtensionBlueprint({\n kind: 'intro-element',\n attachTo: { id: 'page:qeta', input: 'introElement' },\n output: [coreExtensionData.reactElement],\n factory(params: { element: JSX.Element }) {\n return [coreExtensionData.reactElement(params.element)];\n },\n});\n\nexport const QetaPageHeaderElementBlueprint = createExtensionBlueprint({\n kind: 'header-element',\n attachTo: { id: 'page:qeta', input: 'headerElements' },\n output: [coreExtensionData.reactElement],\n factory(params: { element: JSX.Element }) {\n return [coreExtensionData.reactElement(params.element)];\n },\n});\n\nexport const markdownPlugin = createExtensionDataRef<Pluggable>().with({\n id: 'qeta.markdown-plugin',\n});\n\nexport const QetaMarkdownRehypePluginBlueprint = createExtensionBlueprint({\n kind: 'markdown-plugin',\n attachTo: [\n { id: 'page:qeta', input: 'rehypePlugins' },\n { id: 'entity-posts-content', input: 'rehypePlugins' },\n ],\n output: [markdownPlugin],\n factory(params: { plugin: Pluggable }) {\n return [markdownPlugin(params.plugin)];\n },\n});\n\nexport const QetaMarkdownRemarkPluginBlueprint = createExtensionBlueprint({\n kind: 'markdown-plugin',\n attachTo: [\n { id: 'page:qeta', input: 'remarkPlugins' },\n { id: 'entity-posts-content', input: 'remarkPlugins' },\n ],\n output: [markdownPlugin],\n factory(params: { plugin: Pluggable }) {\n return [markdownPlugin(params.plugin)];\n },\n});\n\nconst qetaPage = PageBlueprint.makeWithOverrides({\n config: {\n schema: {\n subtitle: z => z.string().optional(),\n themeId: z => z.string().optional(),\n headerTooltip: z => z.string().optional(),\n headerType: z => z.string().optional(),\n headerTypeLink: z => z.string().optional(),\n },\n },\n inputs: {\n introElement: createExtensionInput([coreExtensionData.reactElement], {\n singleton: true,\n optional: true,\n }),\n headerElements: createExtensionInput([coreExtensionData.reactElement], {\n singleton: false,\n optional: true,\n }),\n rehypePlugins: createExtensionInput([markdownPlugin], {\n singleton: false,\n optional: true,\n }),\n remarkPlugins: createExtensionInput([markdownPlugin], {\n singleton: false,\n optional: true,\n }),\n },\n factory: (originalFactory, { config, inputs }) => {\n const introElement = inputs.introElement?.get(\n coreExtensionData.reactElement,\n );\n const headerElements = inputs.headerElements.map(e =>\n e.get(coreExtensionData.reactElement),\n );\n const remarkPlugins = inputs.remarkPlugins.map(e => e.get(markdownPlugin));\n const rehypePlugins = inputs.rehypePlugins.map(e => e.get(markdownPlugin));\n return originalFactory({\n path: config.path ?? '/qeta',\n routeRef: convertLegacyRouteRef(qetaRouteRef),\n loader: () =>\n import('./components/QetaPage').then(m =>\n compatWrapper(\n <m.QetaPage\n {...config}\n introElement={introElement}\n headerElements={headerElements}\n remarkPlugins={remarkPlugins}\n rehypePlugins={rehypePlugins}\n />,\n ),\n ),\n });\n },\n});\n\nconst EntityPostsContent = EntityContentBlueprint.makeWithOverrides({\n name: 'entity-posts-content',\n config: {\n schema: {\n showFilters: z => z.boolean().optional(),\n showTitle: z => z.boolean().optional(),\n showAskButton: z => z.boolean().optional(),\n showWriteButton: z => z.boolean().optional(),\n showLinkButton: z => z.boolean().optional(),\n showNoQuestionsBtn: z => z.boolean().optional(),\n initialPageSize: z => z.number().optional(),\n type: z => z.enum(['question', 'article', 'link']).optional(),\n view: z => z.enum(['list', 'grid']).optional(),\n },\n },\n inputs: {\n rehypePlugins: createExtensionInput([markdownPlugin], {\n singleton: false,\n optional: true,\n }),\n remarkPlugins: createExtensionInput([markdownPlugin], {\n singleton: false,\n optional: true,\n }),\n },\n factory: (originalFactory, { config, apis, inputs }) => {\n return originalFactory({\n path: config.path ?? '/qeta',\n title: config.title ?? 'Q&A',\n filter: (entity: Entity) => {\n const configApi = apis.get(configApiRef);\n const supportedKinds = getSupportedEntityKinds(configApi);\n const entityKind = entity.kind.toLowerCase();\n return supportedKinds?.includes(entityKind);\n },\n loader: async () => {\n const remarkPlugins = inputs.remarkPlugins.map(e =>\n e.get(markdownPlugin),\n );\n const rehypePlugins = inputs.rehypePlugins.map(e =>\n e.get(markdownPlugin),\n );\n return import(\n './components/EntityPostsContent/EntityPostsContent.tsx'\n ).then(m =>\n compatWrapper(\n <m.EntityPostsContent\n {...config}\n remarkPlugins={remarkPlugins}\n rehypePlugins={rehypePlugins}\n />,\n ),\n );\n },\n });\n },\n});\n\nconst qetaNavItem = NavItemBlueprint.make({\n params: {\n title: 'Q&A',\n routeRef: convertLegacyRouteRef(qetaRouteRef),\n icon: ContactSupportIcon,\n },\n});\n\nconst qetaSearchResultItem = SearchResultListItemBlueprint.make({\n params: {\n predicate: result => result.type === 'qeta',\n component: () =>\n import('./components/QetaSearchResultListItem').then(\n m => m.QetaSearchResultListItem,\n ),\n },\n});\n\nconst qetaPostSearchFilterType = SearchFilterResultTypeBlueprint.make({\n name: 'qeta',\n params: {\n value: 'qeta',\n name: 'Q&A',\n icon: <ContactSupportIcon />,\n },\n});\n\nconst techDocsAskQuestionAddon = AddonBlueprint.make({\n name: 'ask-question',\n params: {\n name: 'AskQuestion',\n location: TechDocsAddonLocations.Content,\n component: TechDocsAskQuestionAddon,\n },\n});\n\n/**\n * Backstage frontend plugin.\n *\n * @alpha\n */\nexport default createFrontendPlugin({\n pluginId: 'qeta',\n info: { packageJson: () => import('../package.json') },\n routes: convertLegacyRouteRefs({\n root: qetaRouteRef,\n }),\n extensions: [\n qetaApi,\n qetaPage,\n EntityPostsContent,\n qetaNavItem,\n qetaSearchResultItem,\n qetaPostSearchFilterType,\n techDocsAskQuestionAddon,\n ],\n});\n\nexport { qetaTranslationRef } from '@drodil/backstage-plugin-qeta-react';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"alpha.esm.js","sources":["../src/alpha.tsx"],"sourcesContent":["import {\n ApiBlueprint,\n coreExtensionData,\n createExtensionBlueprint,\n createExtensionDataRef,\n createExtensionInput,\n createFrontendPlugin,\n NavItemBlueprint,\n PageBlueprint,\n} from '@backstage/frontend-plugin-api';\nimport {\n compatWrapper,\n convertLegacyRouteRef,\n convertLegacyRouteRefs,\n} from '@backstage/core-compat-api';\nimport { qetaApiRef, qetaRouteRef } from '@drodil/backstage-plugin-qeta-react';\nimport {\n configApiRef,\n discoveryApiRef,\n fetchApiRef,\n} from '@backstage/core-plugin-api';\nimport {\n getSupportedEntityKinds,\n QetaClient,\n} from '@drodil/backstage-plugin-qeta-common';\nimport ContactSupportIcon from '@material-ui/icons/ContactSupport';\nimport { EntityContentBlueprint } from '@backstage/plugin-catalog-react/alpha';\nimport { Entity } from '@backstage/catalog-model';\nimport {\n SearchFilterResultTypeBlueprint,\n SearchResultListItemBlueprint,\n} from '@backstage/plugin-search-react/alpha';\nimport { TechDocsAddonLocations } from '@backstage/plugin-techdocs-react';\nimport { AddonBlueprint } from '@backstage/plugin-techdocs-react/alpha';\nimport { TechDocsAskQuestionAddon } from './components/TechDocsAskQuestionAddon';\nimport { Pluggable } from 'unified';\n\nconst qetaApi = ApiBlueprint.make({\n params: defineParams =>\n defineParams({\n api: qetaApiRef,\n deps: {\n discoveryApi: discoveryApiRef,\n fetchApi: fetchApiRef,\n },\n factory({ discoveryApi, fetchApi }) {\n return new QetaClient({ discoveryApi, fetchApi });\n },\n }),\n});\n\nexport const QetaPageIntroElementBlueprint = createExtensionBlueprint({\n kind: 'intro-element',\n attachTo: { id: 'page:qeta', input: 'introElement' },\n output: [coreExtensionData.reactElement],\n factory(params: { element: JSX.Element }) {\n return [coreExtensionData.reactElement(params.element)];\n },\n});\n\nexport const QetaPageHeaderElementBlueprint = createExtensionBlueprint({\n kind: 'header-element',\n attachTo: { id: 'page:qeta', input: 'headerElements' },\n output: [coreExtensionData.reactElement],\n factory(params: { element: JSX.Element }) {\n return [coreExtensionData.reactElement(params.element)];\n },\n});\n\nexport const markdownPlugin = createExtensionDataRef<Pluggable>().with({\n id: 'qeta.markdown-plugin',\n});\n\nexport const QetaMarkdownRehypePluginBlueprint = createExtensionBlueprint({\n kind: 'markdown-plugin',\n attachTo: [\n { id: 'page:qeta', input: 'rehypePlugins' },\n { id: 'entity-posts-content', input: 'rehypePlugins' },\n ],\n output: [markdownPlugin],\n factory(params: { plugin: Pluggable }) {\n return [markdownPlugin(params.plugin)];\n },\n});\n\nexport const QetaMarkdownRemarkPluginBlueprint = createExtensionBlueprint({\n kind: 'markdown-plugin',\n attachTo: [\n { id: 'page:qeta', input: 'remarkPlugins' },\n { id: 'entity-posts-content', input: 'remarkPlugins' },\n ],\n output: [markdownPlugin],\n factory(params: { plugin: Pluggable }) {\n return [markdownPlugin(params.plugin)];\n },\n});\n\nconst qetaPage = PageBlueprint.makeWithOverrides({\n config: {\n schema: {\n subtitle: z => z.string().optional(),\n themeId: z => z.string().optional(),\n headerTooltip: z => z.string().optional(),\n headerType: z => z.string().optional(),\n headerTypeLink: z => z.string().optional(),\n },\n },\n inputs: {\n introElement: createExtensionInput([coreExtensionData.reactElement], {\n singleton: true,\n optional: true,\n }),\n headerElements: createExtensionInput([coreExtensionData.reactElement], {\n singleton: false,\n optional: true,\n }),\n rehypePlugins: createExtensionInput([markdownPlugin], {\n singleton: false,\n optional: true,\n }),\n remarkPlugins: createExtensionInput([markdownPlugin], {\n singleton: false,\n optional: true,\n }),\n },\n factory: (originalFactory, { config, inputs }) => {\n const introElement = inputs.introElement?.get(\n coreExtensionData.reactElement,\n );\n const headerElements = inputs.headerElements.map(e =>\n e.get(coreExtensionData.reactElement),\n );\n const remarkPlugins = inputs.remarkPlugins.map(e => e.get(markdownPlugin));\n const rehypePlugins = inputs.rehypePlugins.map(e => e.get(markdownPlugin));\n return originalFactory({\n path: config.path ?? '/qeta',\n routeRef: convertLegacyRouteRef(qetaRouteRef),\n loader: () =>\n import('./components/QetaPage').then(m =>\n compatWrapper(\n <m.QetaPage\n {...config}\n introElement={introElement}\n headerElements={headerElements}\n remarkPlugins={remarkPlugins}\n rehypePlugins={rehypePlugins}\n />,\n ),\n ),\n });\n },\n});\n\nconst EntityPostsContent = EntityContentBlueprint.makeWithOverrides({\n name: 'entity-posts-content',\n config: {\n schema: {\n showFilters: z => z.boolean().optional(),\n showTitle: z => z.boolean().optional(),\n showAskButton: z => z.boolean().optional(),\n showWriteButton: z => z.boolean().optional(),\n showLinkButton: z => z.boolean().optional(),\n showNoQuestionsBtn: z => z.boolean().optional(),\n initialPageSize: z => z.number().optional(),\n type: z => z.enum(['question', 'article', 'link']).optional(),\n view: z => z.enum(['list', 'grid']).optional(),\n relations: z => z.array(z.string()).optional(),\n },\n },\n inputs: {\n rehypePlugins: createExtensionInput([markdownPlugin], {\n singleton: false,\n optional: true,\n }),\n remarkPlugins: createExtensionInput([markdownPlugin], {\n singleton: false,\n optional: true,\n }),\n },\n factory: (originalFactory, { config, apis, inputs }) => {\n return originalFactory({\n path: config.path ?? '/qeta',\n title: config.title ?? 'Q&A',\n filter: (entity: Entity) => {\n const configApi = apis.get(configApiRef);\n const supportedKinds = getSupportedEntityKinds(configApi);\n const entityKind = entity.kind.toLowerCase();\n return supportedKinds?.includes(entityKind);\n },\n loader: async () => {\n const remarkPlugins = inputs.remarkPlugins.map(e =>\n e.get(markdownPlugin),\n );\n const rehypePlugins = inputs.rehypePlugins.map(e =>\n e.get(markdownPlugin),\n );\n return import(\n './components/EntityPostsContent/EntityPostsContent.tsx'\n ).then(m =>\n compatWrapper(\n <m.EntityPostsContent\n {...config}\n remarkPlugins={remarkPlugins}\n rehypePlugins={rehypePlugins}\n />,\n ),\n );\n },\n });\n },\n});\n\nconst qetaNavItem = NavItemBlueprint.make({\n params: {\n title: 'Q&A',\n routeRef: convertLegacyRouteRef(qetaRouteRef),\n icon: ContactSupportIcon,\n },\n});\n\nconst qetaSearchResultItem = SearchResultListItemBlueprint.make({\n params: {\n predicate: result => result.type === 'qeta',\n component: () =>\n import('./components/QetaSearchResultListItem').then(\n m => m.QetaSearchResultListItem,\n ),\n },\n});\n\nconst qetaPostSearchFilterType = SearchFilterResultTypeBlueprint.make({\n name: 'qeta',\n params: {\n value: 'qeta',\n name: 'Q&A',\n icon: <ContactSupportIcon />,\n },\n});\n\nconst techDocsAskQuestionAddon = AddonBlueprint.make({\n name: 'ask-question',\n params: {\n name: 'AskQuestion',\n location: TechDocsAddonLocations.Content,\n component: TechDocsAskQuestionAddon,\n },\n});\n\n/**\n * Backstage frontend plugin.\n *\n * @alpha\n */\nexport default createFrontendPlugin({\n pluginId: 'qeta',\n info: { packageJson: () => import('../package.json') },\n routes: convertLegacyRouteRefs({\n root: qetaRouteRef,\n }),\n extensions: [\n qetaApi,\n qetaPage,\n EntityPostsContent,\n qetaNavItem,\n qetaSearchResultItem,\n qetaPostSearchFilterType,\n techDocsAskQuestionAddon,\n ],\n});\n\nexport { qetaTranslationRef } from '@drodil/backstage-plugin-qeta-react';\n"],"names":[],"mappings":"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"}
@@ -1,19 +1,50 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
- import { useState } from 'react';
2
+ import { useState, useEffect } from 'react';
3
3
  import { QetaProvider, PostsContainer } from '@drodil/backstage-plugin-qeta-react';
4
4
  import { Content } from '@backstage/core-components';
5
5
  import { isUserEntity, stringifyEntityRef } from '@backstage/catalog-model';
6
- import { useEntity } from '@backstage/plugin-catalog-react';
6
+ import { useEntity, catalogApiRef } from '@backstage/plugin-catalog-react';
7
7
  import { Container } from '@material-ui/core';
8
+ import { useApi } from '@backstage/core-plugin-api';
9
+ import { Skeleton } from '@material-ui/lab';
8
10
 
9
11
  const EntityPostsContent = (props) => {
10
- const [view, setView] = useState("list");
12
+ const [view, setView] = useState(props.view ?? "list");
11
13
  const { entity } = useEntity();
12
- const additionalProps = {};
13
- if (isUserEntity(entity)) {
14
- additionalProps.author = stringifyEntityRef(entity);
15
- } else {
16
- additionalProps.entity = props.entity ?? stringifyEntityRef(entity);
14
+ const catalog = useApi(catalogApiRef);
15
+ const [additionalProps, setAdditionalProps] = useState(
16
+ () => {
17
+ if (isUserEntity(entity)) {
18
+ return { author: stringifyEntityRef(entity) };
19
+ }
20
+ return { entity: props.entity ?? stringifyEntityRef(entity) };
21
+ }
22
+ );
23
+ const [loading, setLoading] = useState(true);
24
+ useEffect(() => {
25
+ if (!props.relations?.length) {
26
+ setLoading(false);
27
+ return;
28
+ }
29
+ const filters = props.relations.map((relation) => {
30
+ return { [`relations.${relation}`]: stringifyEntityRef(entity) };
31
+ });
32
+ catalog.getEntities({
33
+ filter: filters,
34
+ fields: ["kind", "metadata.name", "metadata.namespace"]
35
+ }).then((entities) => {
36
+ setAdditionalProps((prev) => ({
37
+ ...prev,
38
+ entities: entities.items.map(stringifyEntityRef),
39
+ entitiesRelation: "or"
40
+ }));
41
+ setLoading(false);
42
+ }).catch(() => {
43
+ setLoading(false);
44
+ });
45
+ }, [catalog, entity, props.relations]);
46
+ if (loading) {
47
+ return /* @__PURE__ */ jsx(Skeleton, { variant: "rect", height: 200 });
17
48
  }
18
49
  return /* @__PURE__ */ jsx(
19
50
  QetaProvider,
@@ -1 +1 @@
1
- {"version":3,"file":"EntityPostsContent.esm.js","sources":["../../../src/components/EntityPostsContent/EntityPostsContent.tsx"],"sourcesContent":["import { useState } from 'react';\nimport {\n PostsContainer,\n PostsContainerProps,\n QetaProvider,\n ViewType,\n} from '@drodil/backstage-plugin-qeta-react';\nimport { Content } from '@backstage/core-components';\nimport { isUserEntity, stringifyEntityRef } from '@backstage/catalog-model';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport { Container } from '@material-ui/core';\nimport { PluggableList } from 'unified';\n\nexport type EntityPostsContentProps = PostsContainerProps & {\n remarkPlugins?: PluggableList;\n rehypePlugins?: PluggableList;\n};\n\nexport const EntityPostsContent = (props: EntityPostsContentProps) => {\n const [view, setView] = useState<ViewType>('list');\n const { entity } = useEntity();\n const additionalProps: PostsContainerProps = {};\n if (isUserEntity(entity)) {\n additionalProps.author = stringifyEntityRef(entity);\n } else {\n additionalProps.entity = props.entity ?? stringifyEntityRef(entity);\n }\n\n return (\n <QetaProvider\n remarkPlugins={props.remarkPlugins}\n rehypePlugins={props.rehypePlugins}\n >\n <Content>\n <Container>\n <PostsContainer\n {...props}\n {...additionalProps}\n view={view}\n onViewChange={setView}\n />\n </Container>\n </Content>\n </QetaProvider>\n );\n};\n"],"names":[],"mappings":";;;;;;;;AAkBa,MAAA,kBAAA,GAAqB,CAAC,KAAmC,KAAA;AACpE,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAmB,MAAM,CAAA;AACjD,EAAM,MAAA,EAAE,MAAO,EAAA,GAAI,SAAU,EAAA;AAC7B,EAAA,MAAM,kBAAuC,EAAC;AAC9C,EAAI,IAAA,YAAA,CAAa,MAAM,CAAG,EAAA;AACxB,IAAgB,eAAA,CAAA,MAAA,GAAS,mBAAmB,MAAM,CAAA;AAAA,GAC7C,MAAA;AACL,IAAA,eAAA,CAAgB,MAAS,GAAA,KAAA,CAAM,MAAU,IAAA,kBAAA,CAAmB,MAAM,CAAA;AAAA;AAGpE,EACE,uBAAA,GAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,eAAe,KAAM,CAAA,aAAA;AAAA,MACrB,eAAe,KAAM,CAAA,aAAA;AAAA,MAErB,QAAA,kBAAA,GAAA,CAAC,OACC,EAAA,EAAA,QAAA,kBAAA,GAAA,CAAC,SACC,EAAA,EAAA,QAAA,kBAAA,GAAA;AAAA,QAAC,cAAA;AAAA,QAAA;AAAA,UACE,GAAG,KAAA;AAAA,UACH,GAAG,eAAA;AAAA,UACJ,IAAA;AAAA,UACA,YAAc,EAAA;AAAA;AAAA,SAElB,CACF,EAAA;AAAA;AAAA,GACF;AAEJ;;;;"}
1
+ {"version":3,"file":"EntityPostsContent.esm.js","sources":["../../../src/components/EntityPostsContent/EntityPostsContent.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport {\n PostsContainer,\n PostsContainerProps,\n QetaProvider,\n ViewType,\n} from '@drodil/backstage-plugin-qeta-react';\nimport { Content } from '@backstage/core-components';\nimport { isUserEntity, stringifyEntityRef } from '@backstage/catalog-model';\nimport { catalogApiRef, useEntity } from '@backstage/plugin-catalog-react';\nimport { Container } from '@material-ui/core';\nimport { PluggableList } from 'unified';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { Skeleton } from '@material-ui/lab';\n\nexport type EntityPostsContentProps = PostsContainerProps & {\n remarkPlugins?: PluggableList;\n rehypePlugins?: PluggableList;\n /**\n * Relation names of the current entity to show posts too.\n * For example for a system, you can also show all posts from components\n * related to the system by passing `partOf` relation.\n */\n relations?: string[];\n};\n\nexport const EntityPostsContent = (props: EntityPostsContentProps) => {\n const [view, setView] = useState<ViewType>(props.view ?? 'list');\n const { entity } = useEntity();\n const catalog = useApi(catalogApiRef);\n const [additionalProps, setAdditionalProps] = useState<PostsContainerProps>(\n () => {\n if (isUserEntity(entity)) {\n return { author: stringifyEntityRef(entity) };\n }\n return { entity: props.entity ?? stringifyEntityRef(entity) };\n },\n );\n\n const [loading, setLoading] = useState<boolean>(true);\n useEffect(() => {\n if (!props.relations?.length) {\n setLoading(false);\n return;\n }\n const filters = props.relations.map(relation => {\n return { [`relations.${relation}`]: stringifyEntityRef(entity) };\n });\n catalog\n .getEntities({\n filter: filters,\n fields: ['kind', 'metadata.name', 'metadata.namespace'],\n })\n .then(entities => {\n setAdditionalProps(prev => ({\n ...prev,\n entities: entities.items.map(stringifyEntityRef),\n entitiesRelation: 'or',\n }));\n setLoading(false);\n })\n .catch(() => {\n setLoading(false);\n });\n }, [catalog, entity, props.relations]);\n\n if (loading) {\n return <Skeleton variant=\"rect\" height={200} />;\n }\n\n return (\n <QetaProvider\n remarkPlugins={props.remarkPlugins}\n rehypePlugins={props.rehypePlugins}\n >\n <Content>\n <Container>\n <PostsContainer\n {...props}\n {...additionalProps}\n view={view}\n onViewChange={setView}\n />\n </Container>\n </Content>\n </QetaProvider>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;AA0Ba,MAAA,kBAAA,GAAqB,CAAC,KAAmC,KAAA;AACpE,EAAA,MAAM,CAAC,IAAM,EAAA,OAAO,IAAI,QAAmB,CAAA,KAAA,CAAM,QAAQ,MAAM,CAAA;AAC/D,EAAM,MAAA,EAAE,MAAO,EAAA,GAAI,SAAU,EAAA;AAC7B,EAAM,MAAA,OAAA,GAAU,OAAO,aAAa,CAAA;AACpC,EAAM,MAAA,CAAC,eAAiB,EAAA,kBAAkB,CAAI,GAAA,QAAA;AAAA,IAC5C,MAAM;AACJ,MAAI,IAAA,YAAA,CAAa,MAAM,CAAG,EAAA;AACxB,QAAA,OAAO,EAAE,MAAA,EAAQ,kBAAmB,CAAA,MAAM,CAAE,EAAA;AAAA;AAE9C,MAAA,OAAO,EAAE,MAAQ,EAAA,KAAA,CAAM,MAAU,IAAA,kBAAA,CAAmB,MAAM,CAAE,EAAA;AAAA;AAC9D,GACF;AAEA,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAkB,IAAI,CAAA;AACpD,EAAA,SAAA,CAAU,MAAM;AACd,IAAI,IAAA,CAAC,KAAM,CAAA,SAAA,EAAW,MAAQ,EAAA;AAC5B,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA;AAAA;AAEF,IAAA,MAAM,OAAU,GAAA,KAAA,CAAM,SAAU,CAAA,GAAA,CAAI,CAAY,QAAA,KAAA;AAC9C,MAAO,OAAA,EAAE,CAAC,CAAa,UAAA,EAAA,QAAQ,EAAE,GAAG,kBAAA,CAAmB,MAAM,CAAE,EAAA;AAAA,KAChE,CAAA;AACD,IAAA,OAAA,CACG,WAAY,CAAA;AAAA,MACX,MAAQ,EAAA,OAAA;AAAA,MACR,MAAQ,EAAA,CAAC,MAAQ,EAAA,eAAA,EAAiB,oBAAoB;AAAA,KACvD,CACA,CAAA,IAAA,CAAK,CAAY,QAAA,KAAA;AAChB,MAAA,kBAAA,CAAmB,CAAS,IAAA,MAAA;AAAA,QAC1B,GAAG,IAAA;AAAA,QACH,QAAU,EAAA,QAAA,CAAS,KAAM,CAAA,GAAA,CAAI,kBAAkB,CAAA;AAAA,QAC/C,gBAAkB,EAAA;AAAA,OAClB,CAAA,CAAA;AACF,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,KACjB,CACA,CAAA,KAAA,CAAM,MAAM;AACX,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,KACjB,CAAA;AAAA,KACF,CAAC,OAAA,EAAS,MAAQ,EAAA,KAAA,CAAM,SAAS,CAAC,CAAA;AAErC,EAAA,IAAI,OAAS,EAAA;AACX,IAAA,uBAAQ,GAAA,CAAA,QAAA,EAAA,EAAS,OAAQ,EAAA,MAAA,EAAO,QAAQ,GAAK,EAAA,CAAA;AAAA;AAG/C,EACE,uBAAA,GAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,eAAe,KAAM,CAAA,aAAA;AAAA,MACrB,eAAe,KAAM,CAAA,aAAA;AAAA,MAErB,QAAA,kBAAA,GAAA,CAAC,OACC,EAAA,EAAA,QAAA,kBAAA,GAAA,CAAC,SACC,EAAA,EAAA,QAAA,kBAAA,GAAA;AAAA,QAAC,cAAA;AAAA,QAAA;AAAA,UACE,GAAG,KAAA;AAAA,UACH,GAAG,eAAA;AAAA,UACJ,IAAA;AAAA,UACA,YAAc,EAAA;AAAA;AAAA,SAElB,CACF,EAAA;AAAA;AAAA,GACF;AAEJ;;;;"}
package/dist/index.d.ts CHANGED
@@ -66,6 +66,12 @@ declare const EntityPostsGridCard: (props: PostsContainerProps) => react_jsx_run
66
66
  type EntityPostsContentProps = PostsContainerProps & {
67
67
  remarkPlugins?: PluggableList;
68
68
  rehypePlugins?: PluggableList;
69
+ /**
70
+ * Relation names of the current entity to show posts too.
71
+ * For example for a system, you can also show all posts from components
72
+ * related to the system by passing `partOf` relation.
73
+ */
74
+ relations?: string[];
69
75
  };
70
76
  declare const EntityPostsContent: (props: EntityPostsContentProps) => react_jsx_runtime.JSX.Element;
71
77
 
@@ -6,7 +6,7 @@ var keywords = [
6
6
  "frontend",
7
7
  "backstage.io"
8
8
  ];
9
- var version = "3.55.8";
9
+ var version = "3.56.0";
10
10
  var main = "src/index.ts";
11
11
  var types = "src/index.ts";
12
12
  var prepublishOnly = "yarn tsc && yarn build";
package/package.json CHANGED
@@ -7,7 +7,7 @@
7
7
  "frontend",
8
8
  "backstage.io"
9
9
  ],
10
- "version": "3.55.8",
10
+ "version": "3.56.0",
11
11
  "main": "./dist/index.esm.js",
12
12
  "types": "./dist/index.d.ts",
13
13
  "prepublishOnly": "yarn tsc && yarn build",
@@ -85,8 +85,8 @@
85
85
  "@backstage/plugin-search-react": "^1.10.2",
86
86
  "@backstage/plugin-signals-react": "^0.0.18",
87
87
  "@backstage/plugin-techdocs-react": "^1.3.7",
88
- "@drodil/backstage-plugin-qeta-common": "^3.55.8",
89
- "@drodil/backstage-plugin-qeta-react": "^3.55.8",
88
+ "@drodil/backstage-plugin-qeta-common": "^3.56.0",
89
+ "@drodil/backstage-plugin-qeta-react": "^3.56.0",
90
90
  "@material-ui/core": "^4.12.2",
91
91
  "@material-ui/icons": "^4.11.3",
92
92
  "@material-ui/lab": "4.0.0-alpha.61",