@drodil/backstage-plugin-qeta 3.18.1 → 3.20.1

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/configSchema.d.ts CHANGED
@@ -6,6 +6,10 @@ export interface Config {
6
6
  * @visibility frontend
7
7
  */
8
8
  allowAnonymous?: boolean;
9
+ /**
10
+ * @visibility frontend
11
+ */
12
+ permissions?: boolean;
9
13
  /**
10
14
  * Determine what kind of entities can be attached to questions.
11
15
  * For example [System, Component, API, Location, Template]. Default is [Component, System].
@@ -51,7 +51,7 @@ const AskPage = () => {
51
51
  content: data.content
52
52
  });
53
53
  };
54
- return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(ContentHeader, { title }), /* @__PURE__ */ React.createElement(Grid, { container: true, spacing: 3, direction: "column" }, /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(InfoCard, null, /* @__PURE__ */ React.createElement(
54
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(ContentHeader, { title }), /* @__PURE__ */ React.createElement(Grid, { container: true, spacing: 3, direction: "column" }, /* @__PURE__ */ React.createElement(Grid, { item: true, style: { width: "100%" } }, /* @__PURE__ */ React.createElement(InfoCard, null, /* @__PURE__ */ React.createElement(
55
55
  PostForm,
56
56
  {
57
57
  id,
@@ -1 +1 @@
1
- {"version":3,"file":"AskPage.esm.js","sources":["../../../src/components/AskPage/AskPage.tsx"],"sourcesContent":["import { ContentHeader, InfoCard, Progress } from '@backstage/core-components';\nimport React, { useState } from 'react';\nimport {\n AIAnswerCard,\n PostForm,\n SelectTemplateList,\n useAI,\n useQetaApi,\n useTranslation,\n} from '@drodil/backstage-plugin-qeta-react';\nimport { useParams, useSearchParams } from 'react-router-dom';\nimport { useEntityPresentation } from '@backstage/plugin-catalog-react';\nimport { filterTags, Template } from '@drodil/backstage-plugin-qeta-common';\nimport { Grid } from '@material-ui/core';\n\nexport const AskPage = () => {\n const { id } = useParams();\n const [searchParams] = useSearchParams();\n const { isNewQuestionsEnabled } = useAI();\n const { value, loading } = useQetaApi(api => api.getTemplates());\n const [draft, setDraft] = useState<\n { title: string; content: string } | undefined\n >(undefined);\n const [template, setTemplate] = useState<Template | null | undefined>(\n undefined,\n );\n\n const entity = searchParams.get('entity') ?? undefined;\n const entityPage = searchParams.get('entityPage') === 'true';\n const tags = filterTags(searchParams.get('tags'));\n const { t } = useTranslation();\n let title;\n if (id) {\n title = t('askPage.title.existingQuestion');\n } else if (entity) {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const representation = useEntityPresentation(entity);\n title = t('askPage.title.entityQuestion', {\n entity: representation.primaryTitle,\n });\n } else {\n title = t('askPage.title.newQuestion');\n }\n\n if (loading) {\n return <Progress />;\n }\n\n if (\n !id &&\n value &&\n value.templates &&\n value.total > 0 &&\n template === undefined\n ) {\n return (\n <SelectTemplateList\n templates={value}\n onTemplateSelect={temp => setTemplate(temp)}\n />\n );\n }\n\n const handleFormChange = (data: { title: string; content: string }) => {\n if (!isNewQuestionsEnabled) {\n return;\n }\n setDraft({\n title: data.title,\n content: data.content,\n });\n };\n\n return (\n <>\n <ContentHeader title={title} />\n <Grid container spacing={3} direction=\"column\">\n <Grid item>\n <InfoCard>\n <PostForm\n id={id}\n entity={entity}\n entityPage={entityPage}\n tags={tags}\n type=\"question\"\n template={template}\n onFormChange={handleFormChange}\n />\n <AIAnswerCard draft={draft} />\n </InfoCard>\n </Grid>\n </Grid>\n </>\n );\n};\n"],"names":[],"mappings":";;;;;;;;AAeO,MAAM,UAAU,MAAM;AAC3B,EAAM,MAAA,EAAE,EAAG,EAAA,GAAI,SAAU,EAAA;AACzB,EAAM,MAAA,CAAC,YAAY,CAAA,GAAI,eAAgB,EAAA;AACvC,EAAM,MAAA,EAAE,qBAAsB,EAAA,GAAI,KAAM,EAAA;AACxC,EAAM,MAAA,EAAE,OAAO,OAAQ,EAAA,GAAI,WAAW,CAAO,GAAA,KAAA,GAAA,CAAI,cAAc,CAAA;AAC/D,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAExB,KAAS,CAAA,CAAA;AACX,EAAM,MAAA,CAAC,QAAU,EAAA,WAAW,CAAI,GAAA,QAAA;AAAA,IAC9B,KAAA;AAAA,GACF;AAEA,EAAA,MAAM,MAAS,GAAA,YAAA,CAAa,GAAI,CAAA,QAAQ,CAAK,IAAA,KAAA,CAAA;AAC7C,EAAA,MAAM,UAAa,GAAA,YAAA,CAAa,GAAI,CAAA,YAAY,CAAM,KAAA,MAAA;AACtD,EAAA,MAAM,IAAO,GAAA,UAAA,CAAW,YAAa,CAAA,GAAA,CAAI,MAAM,CAAC,CAAA;AAChD,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,cAAe,EAAA;AAC7B,EAAI,IAAA,KAAA;AACJ,EAAA,IAAI,EAAI,EAAA;AACN,IAAA,KAAA,GAAQ,EAAE,gCAAgC,CAAA;AAAA,aACjC,MAAQ,EAAA;AAEjB,IAAM,MAAA,cAAA,GAAiB,sBAAsB,MAAM,CAAA;AACnD,IAAA,KAAA,GAAQ,EAAE,8BAAgC,EAAA;AAAA,MACxC,QAAQ,cAAe,CAAA;AAAA,KACxB,CAAA;AAAA,GACI,MAAA;AACL,IAAA,KAAA,GAAQ,EAAE,2BAA2B,CAAA;AAAA;AAGvC,EAAA,IAAI,OAAS,EAAA;AACX,IAAA,2CAAQ,QAAS,EAAA,IAAA,CAAA;AAAA;AAGnB,EACE,IAAA,CAAC,MACD,KACA,IAAA,KAAA,CAAM,aACN,KAAM,CAAA,KAAA,GAAQ,CACd,IAAA,QAAA,KAAa,KACb,CAAA,EAAA;AACA,IACE,uBAAA,KAAA,CAAA,aAAA;AAAA,MAAC,kBAAA;AAAA,MAAA;AAAA,QACC,SAAW,EAAA,KAAA;AAAA,QACX,gBAAA,EAAkB,CAAQ,IAAA,KAAA,WAAA,CAAY,IAAI;AAAA;AAAA,KAC5C;AAAA;AAIJ,EAAM,MAAA,gBAAA,GAAmB,CAAC,IAA6C,KAAA;AACrE,IAAA,IAAI,CAAC,qBAAuB,EAAA;AAC1B,MAAA;AAAA;AAEF,IAAS,QAAA,CAAA;AAAA,MACP,OAAO,IAAK,CAAA,KAAA;AAAA,MACZ,SAAS,IAAK,CAAA;AAAA,KACf,CAAA;AAAA,GACH;AAEA,EAAA,iFAEK,KAAA,CAAA,aAAA,CAAA,aAAA,EAAA,EAAc,OAAc,CAC7B,kBAAA,KAAA,CAAA,aAAA,CAAC,QAAK,SAAS,EAAA,IAAA,EAAC,OAAS,EAAA,CAAA,EAAG,WAAU,QACpC,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,QAAK,IAAI,EAAA,IAAA,EAAA,sCACP,QACC,EAAA,IAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,EAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,MACA,IAAA;AAAA,MACA,IAAK,EAAA,UAAA;AAAA,MACL,QAAA;AAAA,MACA,YAAc,EAAA;AAAA;AAAA,qBAEf,KAAA,CAAA,aAAA,CAAA,YAAA,EAAA,EAAa,OAAc,CAC9B,CACF,CACF,CACF,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"AskPage.esm.js","sources":["../../../src/components/AskPage/AskPage.tsx"],"sourcesContent":["import { ContentHeader, InfoCard, Progress } from '@backstage/core-components';\nimport React, { useState } from 'react';\nimport {\n AIAnswerCard,\n PostForm,\n SelectTemplateList,\n useAI,\n useQetaApi,\n useTranslation,\n} from '@drodil/backstage-plugin-qeta-react';\nimport { useParams, useSearchParams } from 'react-router-dom';\nimport { useEntityPresentation } from '@backstage/plugin-catalog-react';\nimport { filterTags, Template } from '@drodil/backstage-plugin-qeta-common';\nimport { Grid } from '@material-ui/core';\n\nexport const AskPage = () => {\n const { id } = useParams();\n const [searchParams] = useSearchParams();\n const { isNewQuestionsEnabled } = useAI();\n const { value, loading } = useQetaApi(api => api.getTemplates());\n const [draft, setDraft] = useState<\n { title: string; content: string } | undefined\n >(undefined);\n const [template, setTemplate] = useState<Template | null | undefined>(\n undefined,\n );\n\n const entity = searchParams.get('entity') ?? undefined;\n const entityPage = searchParams.get('entityPage') === 'true';\n const tags = filterTags(searchParams.get('tags'));\n const { t } = useTranslation();\n let title;\n if (id) {\n title = t('askPage.title.existingQuestion');\n } else if (entity) {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const representation = useEntityPresentation(entity);\n title = t('askPage.title.entityQuestion', {\n entity: representation.primaryTitle,\n });\n } else {\n title = t('askPage.title.newQuestion');\n }\n\n if (loading) {\n return <Progress />;\n }\n\n if (\n !id &&\n value &&\n value.templates &&\n value.total > 0 &&\n template === undefined\n ) {\n return (\n <SelectTemplateList\n templates={value}\n onTemplateSelect={temp => setTemplate(temp)}\n />\n );\n }\n\n const handleFormChange = (data: { title: string; content: string }) => {\n if (!isNewQuestionsEnabled) {\n return;\n }\n setDraft({\n title: data.title,\n content: data.content,\n });\n };\n\n return (\n <>\n <ContentHeader title={title} />\n <Grid container spacing={3} direction=\"column\">\n <Grid item style={{ width: '100%' }}>\n <InfoCard>\n <PostForm\n id={id}\n entity={entity}\n entityPage={entityPage}\n tags={tags}\n type=\"question\"\n template={template}\n onFormChange={handleFormChange}\n />\n <AIAnswerCard draft={draft} />\n </InfoCard>\n </Grid>\n </Grid>\n </>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -10,20 +10,18 @@ const HomePage = () => {
10
10
  loading: loadingUser,
11
11
  error: userError
12
12
  } = useIdentityApi((api) => api.getBackstageIdentity(), []);
13
- return /* @__PURE__ */ React.createElement(Grid, { container: true, spacing: 4 }, /* @__PURE__ */ React.createElement(Grid, { item: true, md: 12, lg: 9, xl: 10 }, /* @__PURE__ */ React.createElement(ContentHeader, { title: t("homePage.title") }, /* @__PURE__ */ React.createElement(ButtonContainer, null, /* @__PURE__ */ React.createElement(AskQuestionButton, null), /* @__PURE__ */ React.createElement(WriteArticleButton, null))), /* @__PURE__ */ React.createElement(Grid, { container: true }, /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React.createElement(SuggestionsCard, null)), user && !loadingUser && !userError && /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React.createElement(
13
+ return /* @__PURE__ */ React.createElement(Grid, { container: true, spacing: 4 }, /* @__PURE__ */ React.createElement(Grid, { item: true, md: 12, lg: 9, xl: 10 }, /* @__PURE__ */ React.createElement(ContentHeader, { title: t("homePage.title") }, /* @__PURE__ */ React.createElement(ButtonContainer, null, /* @__PURE__ */ React.createElement(AskQuestionButton, null), /* @__PURE__ */ React.createElement(WriteArticleButton, null))), /* @__PURE__ */ React.createElement(Grid, { container: true }, /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React.createElement(SuggestionsCard, null)), /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React.createElement(
14
14
  PostsCard,
15
15
  {
16
- type: "own",
17
- title: t("highlights.own.title"),
18
- options: { author: user.userEntityRef },
16
+ title: t("highlights.unanswered.title"),
17
+ options: { noAnswers: true, random: true, type: "question" },
19
18
  postType: "question"
20
19
  }
21
- )), /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React.createElement(
20
+ )), user && !loadingUser && !userError && /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React.createElement(
22
21
  PostsCard,
23
22
  {
24
- type: "own",
25
- title: t("highlights.unanswered.title"),
26
- options: { noAnswers: true, random: true, type: "question" },
23
+ title: t("highlights.own.title"),
24
+ options: { author: user.userEntityRef },
27
25
  postType: "question"
28
26
  }
29
27
  )))), /* @__PURE__ */ React.createElement(Grid, { item: true, lg: 3, xl: 2 }, /* @__PURE__ */ React.createElement(ImpactCard, null), /* @__PURE__ */ React.createElement(FollowedTagsList, null), /* @__PURE__ */ React.createElement(FollowedEntitiesList, null), /* @__PURE__ */ React.createElement(FollowedCollectionsList, null)));
@@ -1 +1 @@
1
- {"version":3,"file":"HomePage.esm.js","sources":["../../../src/components/HomePage/HomePage.tsx"],"sourcesContent":["import { ContentHeader } from '@backstage/core-components';\nimport {\n AskQuestionButton,\n ButtonContainer,\n FollowedCollectionsList,\n FollowedEntitiesList,\n FollowedTagsList,\n ImpactCard,\n PostsCard,\n SuggestionsCard,\n useIdentityApi,\n useTranslation,\n WriteArticleButton,\n} from '@drodil/backstage-plugin-qeta-react';\nimport React from 'react';\nimport { Grid } from '@material-ui/core';\n\nexport const HomePage = () => {\n const { t } = useTranslation();\n const {\n value: user,\n loading: loadingUser,\n error: userError,\n } = useIdentityApi(api => api.getBackstageIdentity(), []);\n\n return (\n <Grid container spacing={4}>\n <Grid item md={12} lg={9} xl={10}>\n <ContentHeader title={t('homePage.title')}>\n <ButtonContainer>\n <AskQuestionButton />\n <WriteArticleButton />\n </ButtonContainer>\n </ContentHeader>\n <Grid container>\n <Grid item xs={12}>\n <SuggestionsCard />\n </Grid>\n {user && !loadingUser && !userError && (\n <Grid item xs={12}>\n <PostsCard\n type=\"own\"\n title={t('highlights.own.title')}\n options={{ author: user.userEntityRef }}\n postType=\"question\"\n />\n </Grid>\n )}\n <Grid item xs={12}>\n <PostsCard\n type=\"own\"\n title={t('highlights.unanswered.title')}\n options={{ noAnswers: true, random: true, type: 'question' }}\n postType=\"question\"\n />\n </Grid>\n </Grid>\n </Grid>\n <Grid item lg={3} xl={2}>\n <ImpactCard />\n <FollowedTagsList />\n <FollowedEntitiesList />\n <FollowedCollectionsList />\n </Grid>\n </Grid>\n );\n};\n"],"names":[],"mappings":";;;;;AAiBO,MAAM,WAAW,MAAM;AAC5B,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,cAAe,EAAA;AAC7B,EAAM,MAAA;AAAA,IACJ,KAAO,EAAA,IAAA;AAAA,IACP,OAAS,EAAA,WAAA;AAAA,IACT,KAAO,EAAA;AAAA,MACL,cAAe,CAAA,CAAA,GAAA,KAAO,IAAI,oBAAqB,EAAA,EAAG,EAAE,CAAA;AAExD,EACE,uBAAA,KAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,SAAA,EAAS,IAAC,EAAA,OAAA,EAAS,CACvB,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,EAAI,EAAA,EAAA,EAAI,GAAG,EAAI,EAAA,EAAA,EAAA,kBAC3B,KAAA,CAAA,aAAA,CAAA,aAAA,EAAA,EAAc,KAAO,EAAA,CAAA,CAAE,gBAAgB,CAAA,EAAA,kBACrC,KAAA,CAAA,aAAA,CAAA,eAAA,EAAA,IAAA,kBACE,KAAA,CAAA,aAAA,CAAA,iBAAA,EAAA,IAAkB,CACnB,kBAAA,KAAA,CAAA,aAAA,CAAC,wBAAmB,CACtB,CACF,CACA,kBAAA,KAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,SAAA,EAAS,IACb,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,EACb,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,qBAAgB,CACnB,CAAA,EACC,IAAQ,IAAA,CAAC,WAAe,IAAA,CAAC,SACxB,oBAAA,KAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,EACb,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,IAAK,EAAA,KAAA;AAAA,MACL,KAAA,EAAO,EAAE,sBAAsB,CAAA;AAAA,MAC/B,OAAS,EAAA,EAAE,MAAQ,EAAA,IAAA,CAAK,aAAc,EAAA;AAAA,MACtC,QAAS,EAAA;AAAA;AAAA,GAEb,CAEF,kBAAA,KAAA,CAAA,aAAA,CAAC,QAAK,IAAI,EAAA,IAAA,EAAC,IAAI,EACb,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,IAAK,EAAA,KAAA;AAAA,MACL,KAAA,EAAO,EAAE,6BAA6B,CAAA;AAAA,MACtC,SAAS,EAAE,SAAA,EAAW,MAAM,MAAQ,EAAA,IAAA,EAAM,MAAM,UAAW,EAAA;AAAA,MAC3D,QAAS,EAAA;AAAA;AAAA,GAEb,CACF,CACF,CACA,kBAAA,KAAA,CAAA,aAAA,CAAC,QAAK,IAAI,EAAA,IAAA,EAAC,EAAI,EAAA,CAAA,EAAG,EAAI,EAAA,CAAA,EAAA,sCACnB,UAAW,EAAA,IAAA,CAAA,kBACX,KAAA,CAAA,aAAA,CAAA,gBAAA,EAAA,IAAiB,CAClB,kBAAA,KAAA,CAAA,aAAA,CAAC,0BAAqB,CACtB,kBAAA,KAAA,CAAA,aAAA,CAAC,uBAAwB,EAAA,IAAA,CAC3B,CACF,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"HomePage.esm.js","sources":["../../../src/components/HomePage/HomePage.tsx"],"sourcesContent":["import { ContentHeader } from '@backstage/core-components';\nimport {\n AskQuestionButton,\n ButtonContainer,\n FollowedCollectionsList,\n FollowedEntitiesList,\n FollowedTagsList,\n ImpactCard,\n PostsCard,\n SuggestionsCard,\n useIdentityApi,\n useTranslation,\n WriteArticleButton,\n} from '@drodil/backstage-plugin-qeta-react';\nimport React from 'react';\nimport { Grid } from '@material-ui/core';\n\nexport const HomePage = () => {\n const { t } = useTranslation();\n const {\n value: user,\n loading: loadingUser,\n error: userError,\n } = useIdentityApi(api => api.getBackstageIdentity(), []);\n\n return (\n <Grid container spacing={4}>\n <Grid item md={12} lg={9} xl={10}>\n <ContentHeader title={t('homePage.title')}>\n <ButtonContainer>\n <AskQuestionButton />\n <WriteArticleButton />\n </ButtonContainer>\n </ContentHeader>\n <Grid container>\n <Grid item xs={12}>\n <SuggestionsCard />\n </Grid>\n <Grid item xs={12}>\n <PostsCard\n title={t('highlights.unanswered.title')}\n options={{ noAnswers: true, random: true, type: 'question' }}\n postType=\"question\"\n />\n </Grid>\n {user && !loadingUser && !userError && (\n <Grid item xs={12}>\n <PostsCard\n title={t('highlights.own.title')}\n options={{ author: user.userEntityRef }}\n postType=\"question\"\n />\n </Grid>\n )}\n </Grid>\n </Grid>\n <Grid item lg={3} xl={2}>\n <ImpactCard />\n <FollowedTagsList />\n <FollowedEntitiesList />\n <FollowedCollectionsList />\n </Grid>\n </Grid>\n );\n};\n"],"names":[],"mappings":";;;;;AAiBO,MAAM,WAAW,MAAM;AAC5B,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,cAAe,EAAA;AAC7B,EAAM,MAAA;AAAA,IACJ,KAAO,EAAA,IAAA;AAAA,IACP,OAAS,EAAA,WAAA;AAAA,IACT,KAAO,EAAA;AAAA,MACL,cAAe,CAAA,CAAA,GAAA,KAAO,IAAI,oBAAqB,EAAA,EAAG,EAAE,CAAA;AAExD,EACE,uBAAA,KAAA,CAAA,aAAA,CAAC,QAAK,SAAS,EAAA,IAAA,EAAC,SAAS,CACvB,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,IAAI,EAAI,EAAA,CAAA,EAAG,EAAI,EAAA,EAAA,EAAA,kBAC3B,KAAA,CAAA,aAAA,CAAA,aAAA,EAAA,EAAc,OAAO,CAAE,CAAA,gBAAgB,CACtC,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,eACC,EAAA,IAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,uBAAkB,CACnB,kBAAA,KAAA,CAAA,aAAA,CAAC,kBAAmB,EAAA,IAAA,CACtB,CACF,CAAA,sCACC,IAAK,EAAA,EAAA,SAAA,EAAS,IACb,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,MAAC,EAAI,EAAA,EAAA,EAAA,kBACZ,KAAA,CAAA,aAAA,CAAA,eAAA,EAAA,IAAgB,CACnB,CAAA,sCACC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,EACb,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,EAAE,6BAA6B,CAAA;AAAA,MACtC,SAAS,EAAE,SAAA,EAAW,MAAM,MAAQ,EAAA,IAAA,EAAM,MAAM,UAAW,EAAA;AAAA,MAC3D,QAAS,EAAA;AAAA;AAAA,GAEb,CAAA,EACC,IAAQ,IAAA,CAAC,WAAe,IAAA,CAAC,SACxB,oBAAA,KAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,EACb,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,EAAE,sBAAsB,CAAA;AAAA,MAC/B,OAAS,EAAA,EAAE,MAAQ,EAAA,IAAA,CAAK,aAAc,EAAA;AAAA,MACtC,QAAS,EAAA;AAAA;AAAA,GAEb,CAEJ,CACF,CACA,kBAAA,KAAA,CAAA,aAAA,CAAC,QAAK,IAAI,EAAA,IAAA,EAAC,EAAI,EAAA,CAAA,EAAG,EAAI,EAAA,CAAA,EAAA,sCACnB,UAAW,EAAA,IAAA,CAAA,kBACX,KAAA,CAAA,aAAA,CAAA,gBAAA,EAAA,IAAiB,CAClB,kBAAA,KAAA,CAAA,aAAA,CAAC,0BAAqB,CACtB,kBAAA,KAAA,CAAA,aAAA,CAAC,uBAAwB,EAAA,IAAA,CAC3B,CACF,CAAA;AAEJ;;;;"}
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ import { PostsTable } from '@drodil/backstage-plugin-qeta-react';
3
+
4
+ const Content = (props) => {
5
+ return /* @__PURE__ */ React.createElement(PostsTable, { hideTitle: true, ...props });
6
+ };
7
+
8
+ export { Content };
9
+ //# sourceMappingURL=Content.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Content.esm.js","sources":["../../../src/components/PostsTableCard/Content.tsx"],"sourcesContent":["import React from 'react';\nimport { PostsTable } from '@drodil/backstage-plugin-qeta-react';\nimport { PostType } from '@drodil/backstage-plugin-qeta-common';\n\nexport const Content = (props: {\n rowsPerPage?: number;\n quickFilter?: 'latest' | 'favorites' | 'most_viewed';\n postType?: PostType;\n}) => {\n return <PostsTable hideTitle {...props} />;\n};\n"],"names":[],"mappings":";;;AAIa,MAAA,OAAA,GAAU,CAAC,KAIlB,KAAA;AACJ,EAAA,uBAAQ,KAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,SAAS,EAAA,IAAA,EAAE,GAAG,KAAO,EAAA,CAAA;AAC1C;;;;"}
@@ -0,0 +1,105 @@
1
+ import React from 'react';
2
+ import { DateTime } from 'luxon';
3
+ import { Link } from '@backstage/core-components';
4
+ import { HighlightedSearchResultText } from '@backstage/plugin-search-react';
5
+ import CollectionsBookmarkIcon from '@material-ui/icons/CollectionsBookmark';
6
+ import { makeStyles, ListItem, ListItemIcon, ListItemText, Divider } from '@material-ui/core';
7
+ import { truncate, removeMarkdownFormatting } from '@drodil/backstage-plugin-qeta-common';
8
+ import { useTranslation } from '@drodil/backstage-plugin-qeta-react';
9
+ import { EntityRefLink } from '@backstage/plugin-catalog-react';
10
+ import HelpOutlined from '@material-ui/icons/HelpOutlined';
11
+ import PlaylistPlay from '@material-ui/icons/PlaylistPlay';
12
+ import DOMPurify from 'dompurify';
13
+ import { capitalize } from 'lodash';
14
+
15
+ const useStyles = makeStyles({
16
+ excerptText: {
17
+ display: "block",
18
+ marginTop: "0.2rem",
19
+ marginBottom: "0.4rem",
20
+ fontSize: "0.8rem"
21
+ },
22
+ excerpt: {
23
+ lineHeight: "1.55"
24
+ },
25
+ itemText: {
26
+ wordBreak: "break-all"
27
+ }
28
+ });
29
+ const isQetaSearchDocument = (document) => {
30
+ return "docType" in document && (document.docType === "qeta_post" || document.docType === "qeta_collection");
31
+ };
32
+ const isQetaPostDocument = (document) => {
33
+ return document.docType === "qeta_post";
34
+ };
35
+ const isQetaCollectionDocument = (document) => {
36
+ return document.docType === "qeta_collection";
37
+ };
38
+ const Excerpt = (props) => {
39
+ const { document, highlight } = props;
40
+ const classes = useStyles();
41
+ const { t } = useTranslation();
42
+ const text = DOMPurify.sanitize(
43
+ truncate(
44
+ removeMarkdownFormatting(highlight?.fields.text ?? document.text),
45
+ 300
46
+ )
47
+ );
48
+ if (isQetaPostDocument(document)) {
49
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement("span", { className: classes.excerptText }, capitalize(t(`common.${document.postType}`)), " \xB7 ", t("searchResult.created"), " ", DateTime.fromISO(document.created.toString()).toRelative(), " \xB7 ", /* @__PURE__ */ React.createElement(EntityRefLink, { entityRef: document.author, hideIcon: true }), " \xB7 ", t("common.score", { score: document.score.toString(10) }), " \xB7 ", t("common.viewsShort", { count: document.views }), document.answerCount && /* @__PURE__ */ React.createElement(React.Fragment, null, " \xB7 ", t("common.answers", { count: document.answerCount }))), /* @__PURE__ */ React.createElement(React.Fragment, null, highlight?.fields.text ? /* @__PURE__ */ React.createElement(
50
+ HighlightedSearchResultText,
51
+ {
52
+ text,
53
+ preTag: highlight.preTag,
54
+ postTag: highlight.postTag
55
+ }
56
+ ) : text));
57
+ } else if (isQetaCollectionDocument(document)) {
58
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement("span", { className: classes.excerptText }, capitalize(t(`common.collection`)), " \xB7 ", t("searchResult.created"), " ", DateTime.fromISO(document.created.toString()).toRelative(), " \xB7 ", /* @__PURE__ */ React.createElement(EntityRefLink, { entityRef: document.owner, hideIcon: true })), /* @__PURE__ */ React.createElement(React.Fragment, null, highlight?.fields.text ? /* @__PURE__ */ React.createElement(
59
+ HighlightedSearchResultText,
60
+ {
61
+ text,
62
+ preTag: highlight.preTag,
63
+ postTag: highlight.postTag
64
+ }
65
+ ) : text));
66
+ }
67
+ return null;
68
+ };
69
+ const ResultIcon = (props) => {
70
+ const { document } = props;
71
+ if (isQetaPostDocument(document)) {
72
+ if (document.postType === "article") {
73
+ return /* @__PURE__ */ React.createElement(CollectionsBookmarkIcon, null);
74
+ }
75
+ return /* @__PURE__ */ React.createElement(HelpOutlined, null);
76
+ }
77
+ return /* @__PURE__ */ React.createElement(PlaylistPlay, null);
78
+ };
79
+ const QetaSearchResultListItem = (props) => {
80
+ const classes = useStyles();
81
+ const { result, highlight, hideIcon } = props;
82
+ if (!result || !isQetaSearchDocument(result)) {
83
+ return null;
84
+ }
85
+ const title = /* @__PURE__ */ React.createElement(Link, { noTrack: true, to: result.location }, highlight?.fields.title ? /* @__PURE__ */ React.createElement(
86
+ HighlightedSearchResultText,
87
+ {
88
+ text: highlight.fields.title,
89
+ preTag: highlight.preTag,
90
+ postTag: highlight.postTag
91
+ }
92
+ ) : result.title);
93
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(ListItem, { alignItems: "center" }, hideIcon !== true && /* @__PURE__ */ React.createElement(ListItemIcon, null, /* @__PURE__ */ React.createElement(ResultIcon, { document: result })), /* @__PURE__ */ React.createElement(
94
+ ListItemText,
95
+ {
96
+ primary: title,
97
+ secondary: /* @__PURE__ */ React.createElement(Excerpt, { document: result, highlight }),
98
+ className: classes.itemText,
99
+ primaryTypographyProps: { variant: "h6" }
100
+ }
101
+ )), /* @__PURE__ */ React.createElement(Divider, { component: "li" }));
102
+ };
103
+
104
+ export { QetaSearchResultListItem };
105
+ //# sourceMappingURL=QetaSearchResultListItem.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QetaSearchResultListItem.esm.js","sources":["../../../src/components/QetaSearchResultListItem/QetaSearchResultListItem.tsx"],"sourcesContent":["import React from 'react';\nimport { DateTime } from 'luxon';\nimport { Link } from '@backstage/core-components';\nimport {\n IndexableDocument,\n ResultHighlight,\n} from '@backstage/plugin-search-common';\nimport { HighlightedSearchResultText } from '@backstage/plugin-search-react';\nimport CollectionsBookmarkIcon from '@material-ui/icons/CollectionsBookmark';\nimport {\n Divider,\n ListItem,\n ListItemIcon,\n ListItemText,\n makeStyles,\n} from '@material-ui/core';\nimport {\n QetaCollectionDocument,\n QetaPostDocument,\n QetaSearchDocument,\n removeMarkdownFormatting,\n truncate,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { useTranslation } from '@drodil/backstage-plugin-qeta-react';\nimport { EntityRefLink } from '@backstage/plugin-catalog-react';\nimport HelpOutlined from '@material-ui/icons/HelpOutlined';\nimport PlaylistPlay from '@material-ui/icons/PlaylistPlay';\nimport DOMPurify from 'dompurify';\nimport { capitalize } from 'lodash';\n\nconst useStyles = makeStyles({\n excerptText: {\n display: 'block',\n marginTop: '0.2rem',\n marginBottom: '0.4rem',\n fontSize: '0.8rem',\n },\n excerpt: {\n lineHeight: '1.55',\n },\n itemText: {\n wordBreak: 'break-all',\n },\n});\n\nexport interface QetaSearchResultProps {\n result?: IndexableDocument;\n highlight?: ResultHighlight;\n rank?: number;\n hideIcon?: boolean;\n}\n\nconst isQetaSearchDocument = (\n document: IndexableDocument,\n): document is QetaSearchDocument => {\n return (\n 'docType' in document &&\n (document.docType === 'qeta_post' || document.docType === 'qeta_collection')\n );\n};\n\nconst isQetaPostDocument = (\n document: QetaSearchDocument,\n): document is QetaPostDocument => {\n return document.docType === 'qeta_post';\n};\n\nconst isQetaCollectionDocument = (\n document: QetaSearchDocument,\n): document is QetaCollectionDocument => {\n return document.docType === 'qeta_collection';\n};\n\nconst Excerpt = (props: {\n document: QetaSearchDocument;\n highlight?: ResultHighlight;\n}) => {\n const { document, highlight } = props;\n const classes = useStyles();\n const { t } = useTranslation();\n\n const text = DOMPurify.sanitize(\n truncate(\n removeMarkdownFormatting(highlight?.fields.text ?? document.text),\n 300,\n ),\n );\n if (isQetaPostDocument(document)) {\n return (\n <>\n <span className={classes.excerptText}>\n {capitalize(t(`common.${document.postType}`))}\n {' · '}\n {t('searchResult.created')}{' '}\n {DateTime.fromISO(document.created.toString() as string).toRelative()}\n {' · '}\n <EntityRefLink entityRef={document.author} hideIcon />\n {' · '}\n {t('common.score', { score: document.score.toString(10) })}\n {' · '}\n {t('common.viewsShort', { count: document.views })}\n {document.answerCount && (\n <>\n {' · '}\n {t('common.answers', { count: document.answerCount })}\n </>\n )}\n </span>\n <>\n {highlight?.fields.text ? (\n <HighlightedSearchResultText\n text={text}\n preTag={highlight.preTag}\n postTag={highlight.postTag}\n />\n ) : (\n text\n )}\n </>\n </>\n );\n } else if (isQetaCollectionDocument(document)) {\n return (\n <>\n <span className={classes.excerptText}>\n {capitalize(t(`common.collection`))}\n {' · '}\n {t('searchResult.created')}{' '}\n {DateTime.fromISO(document.created.toString() as string).toRelative()}\n {' · '}\n <EntityRefLink entityRef={document.owner} hideIcon />\n </span>\n <>\n {highlight?.fields.text ? (\n <HighlightedSearchResultText\n text={text}\n preTag={highlight.preTag}\n postTag={highlight.postTag}\n />\n ) : (\n text\n )}\n </>\n </>\n );\n }\n\n return null;\n};\n\nconst ResultIcon = (props: { document: QetaSearchDocument }) => {\n const { document } = props;\n if (isQetaPostDocument(document)) {\n if (document.postType === 'article') {\n return <CollectionsBookmarkIcon />;\n }\n return <HelpOutlined />;\n }\n\n return <PlaylistPlay />;\n};\n\nexport const QetaSearchResultListItem = (props: QetaSearchResultProps) => {\n const classes = useStyles();\n const { result, highlight, hideIcon } = props;\n\n if (!result || !isQetaSearchDocument(result)) {\n return null;\n }\n\n const title = (\n <Link noTrack to={result.location}>\n {highlight?.fields.title ? (\n <HighlightedSearchResultText\n text={highlight.fields.title}\n preTag={highlight.preTag}\n postTag={highlight.postTag}\n />\n ) : (\n result.title\n )}\n </Link>\n );\n\n return (\n <>\n <ListItem alignItems=\"center\">\n {hideIcon !== true && (\n <ListItemIcon>\n <ResultIcon document={result} />\n </ListItemIcon>\n )}\n <ListItemText\n primary={title}\n secondary={<Excerpt document={result} highlight={highlight} />}\n className={classes.itemText}\n primaryTypographyProps={{ variant: 'h6' }}\n />\n </ListItem>\n\n <Divider component=\"li\" />\n </>\n );\n};\n"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -2,6 +2,8 @@ import * as _backstage_plugin_home_react from '@backstage/plugin-home-react';
2
2
  import * as react from 'react';
3
3
  import react__default from 'react';
4
4
  import * as _backstage_core_plugin_api from '@backstage/core-plugin-api';
5
+ import { PostType } from '@drodil/backstage-plugin-qeta-common';
6
+ import { IndexableDocument, ResultHighlight } from '@backstage/plugin-search-common';
5
7
 
6
8
  declare const qetaPlugin: _backstage_core_plugin_api.BackstagePlugin<{
7
9
  root: _backstage_core_plugin_api.RouteRef<undefined>;
@@ -16,7 +18,16 @@ declare const QetaPage: (props?: {
16
18
  headerTypeLink?: string;
17
19
  introElement?: react.ReactNode;
18
20
  }) => react.JSX.Element;
19
- declare const QuestionTableCard: (props: _backstage_plugin_home_react.CardExtensionProps<{
21
+ declare const PostsTableCard: (props: _backstage_plugin_home_react.CardExtensionProps<{
22
+ postType?: PostType;
23
+ rowsPerPage?: number;
24
+ quickFilter?: string;
25
+ }>) => React.JSX.Element;
26
+ /**
27
+ * @deprecated Use PostsTableCard instead
28
+ */
29
+ declare const QuestionsTableCard: (props: _backstage_plugin_home_react.CardExtensionProps<{
30
+ postType?: PostType;
20
31
  rowsPerPage?: number;
21
32
  quickFilter?: string;
22
33
  }>) => React.JSX.Element;
@@ -24,8 +35,17 @@ declare const QuestionTableCard: (props: _backstage_plugin_home_react.CardExtens
24
35
  declare const Content: (props: {
25
36
  rowsPerPage?: number;
26
37
  quickFilter?: "latest" | "favorites" | "most_viewed";
38
+ postType?: PostType;
27
39
  }) => react__default.JSX.Element;
28
40
 
29
41
  declare const StatisticsPage: () => react__default.JSX.Element;
30
42
 
31
- export { Content, QetaPage, QuestionTableCard, StatisticsPage, qetaPlugin };
43
+ interface QetaSearchResultProps {
44
+ result?: IndexableDocument;
45
+ highlight?: ResultHighlight;
46
+ rank?: number;
47
+ hideIcon?: boolean;
48
+ }
49
+ declare const QetaSearchResultListItem: (props: QetaSearchResultProps) => react__default.JSX.Element | null;
50
+
51
+ export { Content, PostsTableCard, QetaPage, QetaSearchResultListItem, QuestionsTableCard, StatisticsPage, qetaPlugin };
package/dist/index.esm.js CHANGED
@@ -1,4 +1,5 @@
1
- export { QetaPage, QuestionTableCard, qetaPlugin } from './plugin.esm.js';
2
- export { Content } from './components/QuestionTableCard/Content.esm.js';
1
+ export { PostsTableCard, QetaPage, QuestionsTableCard, qetaPlugin } from './plugin.esm.js';
2
+ export { Content } from './components/PostsTableCard/Content.esm.js';
3
3
  export { StatisticsPage } from './components/Statistics/StatisticsPage.esm.js';
4
+ export { QetaSearchResultListItem } from './components/QetaSearchResultListItem/QetaSearchResultListItem.esm.js';
4
5
  //# sourceMappingURL=index.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
1
+ {"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
@@ -23,12 +23,12 @@ const QetaPage = qetaPlugin.provide(
23
23
  mountPoint: qetaRouteRef
24
24
  })
25
25
  );
26
- const QuestionTableCard = qetaPlugin.provide(
26
+ const PostsTableCard = qetaPlugin.provide(
27
27
  createCardExtension({
28
- name: "QuestionsTableCard",
28
+ name: "PostsTableCard",
29
29
  title: "Q&A",
30
- description: "Shows Q&A questions",
31
- components: () => import('./components/QuestionTableCard/index.esm.js'),
30
+ description: "Shows Q&A posts",
31
+ components: () => import('./components/PostsTableCard/index.esm.js'),
32
32
  layout: {
33
33
  height: { minRows: 6 },
34
34
  width: { minColumns: 6 }
@@ -38,6 +38,12 @@ const QuestionTableCard = qetaPlugin.provide(
38
38
  title: "Q&A",
39
39
  type: "object",
40
40
  properties: {
41
+ postType: {
42
+ title: "Post type",
43
+ type: "string",
44
+ enum: ["question", "article"],
45
+ default: void 0
46
+ },
41
47
  rowsPerPage: {
42
48
  title: "Rows per page",
43
49
  type: "number",
@@ -55,6 +61,7 @@ const QuestionTableCard = qetaPlugin.provide(
55
61
  }
56
62
  })
57
63
  );
64
+ const QuestionsTableCard = PostsTableCard;
58
65
 
59
- export { QetaPage, QuestionTableCard, qetaPlugin };
66
+ export { PostsTableCard, QetaPage, QuestionsTableCard, qetaPlugin };
60
67
  //# sourceMappingURL=plugin.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.esm.js","sources":["../src/plugin.ts"],"sourcesContent":["import {\n createApiFactory,\n createPlugin,\n createRoutableExtension,\n discoveryApiRef,\n fetchApiRef,\n} from '@backstage/core-plugin-api';\nimport { createCardExtension } from '@backstage/plugin-home-react';\nimport { qetaApiRef, qetaRouteRef } from '@drodil/backstage-plugin-qeta-react';\nimport { QetaClient } from '@drodil/backstage-plugin-qeta-common';\n\nexport const qetaPlugin = createPlugin({\n id: 'qeta',\n routes: {\n root: qetaRouteRef,\n },\n apis: [\n createApiFactory({\n api: qetaApiRef,\n deps: { fetchApi: fetchApiRef, discoveryApi: discoveryApiRef },\n factory: ({ fetchApi, discoveryApi }) =>\n new QetaClient({ fetchApi, discoveryApi }),\n }),\n ],\n});\n\nexport const QetaPage = qetaPlugin.provide(\n createRoutableExtension({\n name: 'QetaPage',\n component: () => import('./components/QetaPage').then(m => m.QetaPage),\n mountPoint: qetaRouteRef,\n }),\n);\n\nexport const QuestionTableCard = qetaPlugin.provide(\n createCardExtension<{ rowsPerPage?: number; quickFilter?: string }>({\n name: 'QuestionsTableCard',\n title: 'Q&A',\n description: 'Shows Q&A questions',\n components: () => import('./components/QuestionTableCard'),\n layout: {\n height: { minRows: 6 },\n width: { minColumns: 6 },\n },\n settings: {\n schema: {\n title: 'Q&A',\n type: 'object',\n properties: {\n rowsPerPage: {\n title: 'Rows per page',\n type: 'number',\n enum: [5, 10, 20, 30, 40, 50],\n default: 10,\n },\n quickFilter: {\n title: 'Default filter',\n type: 'string',\n enum: ['latest', 'favorites', 'most_viewed'],\n default: 'latest',\n },\n },\n },\n },\n }),\n);\n"],"names":[],"mappings":";;;;;AAWO,MAAM,aAAa,YAAa,CAAA;AAAA,EACrC,EAAI,EAAA,MAAA;AAAA,EACJ,MAAQ,EAAA;AAAA,IACN,IAAM,EAAA;AAAA,GACR;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,gBAAiB,CAAA;AAAA,MACf,GAAK,EAAA,UAAA;AAAA,MACL,IAAM,EAAA,EAAE,QAAU,EAAA,WAAA,EAAa,cAAc,eAAgB,EAAA;AAAA,MAC7D,OAAA,EAAS,CAAC,EAAE,QAAU,EAAA,YAAA,EACpB,KAAA,IAAI,UAAW,CAAA,EAAE,QAAU,EAAA,YAAA,EAAc;AAAA,KAC5C;AAAA;AAEL,CAAC;AAEM,MAAM,WAAW,UAAW,CAAA,OAAA;AAAA,EACjC,uBAAwB,CAAA;AAAA,IACtB,IAAM,EAAA,UAAA;AAAA,IACN,SAAA,EAAW,MAAM,OAAO,oCAAuB,EAAE,IAAK,CAAA,CAAA,CAAA,KAAK,EAAE,QAAQ,CAAA;AAAA,IACrE,UAAY,EAAA;AAAA,GACb;AACH;AAEO,MAAM,oBAAoB,UAAW,CAAA,OAAA;AAAA,EAC1C,mBAAoE,CAAA;AAAA,IAClE,IAAM,EAAA,oBAAA;AAAA,IACN,KAAO,EAAA,KAAA;AAAA,IACP,WAAa,EAAA,qBAAA;AAAA,IACb,UAAA,EAAY,MAAM,OAAO,6CAAgC,CAAA;AAAA,IACzD,MAAQ,EAAA;AAAA,MACN,MAAA,EAAQ,EAAE,OAAA,EAAS,CAAE,EAAA;AAAA,MACrB,KAAA,EAAO,EAAE,UAAA,EAAY,CAAE;AAAA,KACzB;AAAA,IACA,QAAU,EAAA;AAAA,MACR,MAAQ,EAAA;AAAA,QACN,KAAO,EAAA,KAAA;AAAA,QACP,IAAM,EAAA,QAAA;AAAA,QACN,UAAY,EAAA;AAAA,UACV,WAAa,EAAA;AAAA,YACX,KAAO,EAAA,eAAA;AAAA,YACP,IAAM,EAAA,QAAA;AAAA,YACN,MAAM,CAAC,CAAA,EAAG,IAAI,EAAI,EAAA,EAAA,EAAI,IAAI,EAAE,CAAA;AAAA,YAC5B,OAAS,EAAA;AAAA,WACX;AAAA,UACA,WAAa,EAAA;AAAA,YACX,KAAO,EAAA,gBAAA;AAAA,YACP,IAAM,EAAA,QAAA;AAAA,YACN,IAAM,EAAA,CAAC,QAAU,EAAA,WAAA,EAAa,aAAa,CAAA;AAAA,YAC3C,OAAS,EAAA;AAAA;AACX;AACF;AACF;AACF,GACD;AACH;;;;"}
1
+ {"version":3,"file":"plugin.esm.js","sources":["../src/plugin.ts"],"sourcesContent":["import {\n createApiFactory,\n createPlugin,\n createRoutableExtension,\n discoveryApiRef,\n fetchApiRef,\n} from '@backstage/core-plugin-api';\nimport { createCardExtension } from '@backstage/plugin-home-react';\nimport { qetaApiRef, qetaRouteRef } from '@drodil/backstage-plugin-qeta-react';\nimport { PostType, QetaClient } from '@drodil/backstage-plugin-qeta-common';\n\nexport const qetaPlugin = createPlugin({\n id: 'qeta',\n routes: {\n root: qetaRouteRef,\n },\n apis: [\n createApiFactory({\n api: qetaApiRef,\n deps: { fetchApi: fetchApiRef, discoveryApi: discoveryApiRef },\n factory: ({ fetchApi, discoveryApi }) =>\n new QetaClient({ fetchApi, discoveryApi }),\n }),\n ],\n});\n\nexport const QetaPage = qetaPlugin.provide(\n createRoutableExtension({\n name: 'QetaPage',\n component: () => import('./components/QetaPage').then(m => m.QetaPage),\n mountPoint: qetaRouteRef,\n }),\n);\n\nexport const PostsTableCard = qetaPlugin.provide(\n createCardExtension<{\n postType?: PostType;\n rowsPerPage?: number;\n quickFilter?: string;\n }>({\n name: 'PostsTableCard',\n title: 'Q&A',\n description: 'Shows Q&A posts',\n components: () => import('./components/PostsTableCard'),\n layout: {\n height: { minRows: 6 },\n width: { minColumns: 6 },\n },\n settings: {\n schema: {\n title: 'Q&A',\n type: 'object',\n properties: {\n postType: {\n title: 'Post type',\n type: 'string',\n enum: ['question', 'article'],\n default: undefined,\n },\n rowsPerPage: {\n title: 'Rows per page',\n type: 'number',\n enum: [5, 10, 20, 30, 40, 50],\n default: 10,\n },\n quickFilter: {\n title: 'Default filter',\n type: 'string',\n enum: ['latest', 'favorites', 'most_viewed'],\n default: 'latest',\n },\n },\n },\n },\n }),\n);\n\n/**\n * @deprecated Use PostsTableCard instead\n */\nexport const QuestionsTableCard = PostsTableCard;\n"],"names":[],"mappings":";;;;;AAWO,MAAM,aAAa,YAAa,CAAA;AAAA,EACrC,EAAI,EAAA,MAAA;AAAA,EACJ,MAAQ,EAAA;AAAA,IACN,IAAM,EAAA;AAAA,GACR;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,gBAAiB,CAAA;AAAA,MACf,GAAK,EAAA,UAAA;AAAA,MACL,IAAM,EAAA,EAAE,QAAU,EAAA,WAAA,EAAa,cAAc,eAAgB,EAAA;AAAA,MAC7D,OAAA,EAAS,CAAC,EAAE,QAAU,EAAA,YAAA,EACpB,KAAA,IAAI,UAAW,CAAA,EAAE,QAAU,EAAA,YAAA,EAAc;AAAA,KAC5C;AAAA;AAEL,CAAC;AAEM,MAAM,WAAW,UAAW,CAAA,OAAA;AAAA,EACjC,uBAAwB,CAAA;AAAA,IACtB,IAAM,EAAA,UAAA;AAAA,IACN,SAAA,EAAW,MAAM,OAAO,oCAAuB,EAAE,IAAK,CAAA,CAAA,CAAA,KAAK,EAAE,QAAQ,CAAA;AAAA,IACrE,UAAY,EAAA;AAAA,GACb;AACH;AAEO,MAAM,iBAAiB,UAAW,CAAA,OAAA;AAAA,EACvC,mBAIG,CAAA;AAAA,IACD,IAAM,EAAA,gBAAA;AAAA,IACN,KAAO,EAAA,KAAA;AAAA,IACP,WAAa,EAAA,iBAAA;AAAA,IACb,UAAA,EAAY,MAAM,OAAO,0CAA6B,CAAA;AAAA,IACtD,MAAQ,EAAA;AAAA,MACN,MAAA,EAAQ,EAAE,OAAA,EAAS,CAAE,EAAA;AAAA,MACrB,KAAA,EAAO,EAAE,UAAA,EAAY,CAAE;AAAA,KACzB;AAAA,IACA,QAAU,EAAA;AAAA,MACR,MAAQ,EAAA;AAAA,QACN,KAAO,EAAA,KAAA;AAAA,QACP,IAAM,EAAA,QAAA;AAAA,QACN,UAAY,EAAA;AAAA,UACV,QAAU,EAAA;AAAA,YACR,KAAO,EAAA,WAAA;AAAA,YACP,IAAM,EAAA,QAAA;AAAA,YACN,IAAA,EAAM,CAAC,UAAA,EAAY,SAAS,CAAA;AAAA,YAC5B,OAAS,EAAA,KAAA;AAAA,WACX;AAAA,UACA,WAAa,EAAA;AAAA,YACX,KAAO,EAAA,eAAA;AAAA,YACP,IAAM,EAAA,QAAA;AAAA,YACN,MAAM,CAAC,CAAA,EAAG,IAAI,EAAI,EAAA,EAAA,EAAI,IAAI,EAAE,CAAA;AAAA,YAC5B,OAAS,EAAA;AAAA,WACX;AAAA,UACA,WAAa,EAAA;AAAA,YACX,KAAO,EAAA,gBAAA;AAAA,YACP,IAAM,EAAA,QAAA;AAAA,YACN,IAAM,EAAA,CAAC,QAAU,EAAA,WAAA,EAAa,aAAa,CAAA;AAAA,YAC3C,OAAS,EAAA;AAAA;AACX;AACF;AACF;AACF,GACD;AACH;AAKO,MAAM,kBAAqB,GAAA;;;;"}
package/package.json CHANGED
@@ -7,7 +7,7 @@
7
7
  "frontend",
8
8
  "backstage.io"
9
9
  ],
10
- "version": "3.18.1",
10
+ "version": "3.20.1",
11
11
  "main": "dist/index.esm.js",
12
12
  "types": "dist/index.d.ts",
13
13
  "prepublishOnly": "yarn tsc && yarn build",
@@ -53,12 +53,17 @@
53
53
  "@backstage/core-plugin-api": "^1.10.3",
54
54
  "@backstage/plugin-catalog-react": "^1.15.1",
55
55
  "@backstage/plugin-home-react": "^0.1.22",
56
+ "@backstage/plugin-search-common": "^1.2.17",
57
+ "@backstage/plugin-search-react": "^1.8.5",
56
58
  "@backstage/plugin-signals-react": "^0.0.9",
57
- "@drodil/backstage-plugin-qeta-common": "^3.18.1",
58
- "@drodil/backstage-plugin-qeta-react": "^3.18.1",
59
+ "@drodil/backstage-plugin-qeta-common": "^3.20.1",
60
+ "@drodil/backstage-plugin-qeta-react": "^3.20.1",
59
61
  "@material-ui/core": "^4.12.2",
60
62
  "@material-ui/icons": "^4.11.3",
61
63
  "@material-ui/lab": "4.0.0-alpha.61",
64
+ "dompurify": "^3.2.4",
65
+ "lodash": "^4.17.21",
66
+ "luxon": "^3.5.0",
62
67
  "react-use": "^17.4.0"
63
68
  },
64
69
  "peerDependencies": {
@@ -80,6 +85,8 @@
80
85
  "@backstage/plugin-search-react": "^1.8.5",
81
86
  "@backstage/plugin-signals": "^0.0.15",
82
87
  "@testing-library/jest-dom": "^6.1.3",
88
+ "@types/lodash": "^4.14.199",
89
+ "@types/luxon": "^3",
83
90
  "cross-fetch": "^3.1.5"
84
91
  },
85
92
  "files": [
@@ -1,9 +0,0 @@
1
- import React from 'react';
2
- import { QuestionsTable } from '@drodil/backstage-plugin-qeta-react';
3
-
4
- const Content = (props) => {
5
- return /* @__PURE__ */ React.createElement(QuestionsTable, { hideTitle: true, ...props });
6
- };
7
-
8
- export { Content };
9
- //# sourceMappingURL=Content.esm.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Content.esm.js","sources":["../../../src/components/QuestionTableCard/Content.tsx"],"sourcesContent":["import React from 'react';\nimport { QuestionsTable } from '@drodil/backstage-plugin-qeta-react';\n\nexport const Content = (props: {\n rowsPerPage?: number;\n quickFilter?: 'latest' | 'favorites' | 'most_viewed';\n}) => {\n return <QuestionsTable hideTitle {...props} />;\n};\n"],"names":[],"mappings":";;;AAGa,MAAA,OAAA,GAAU,CAAC,KAGlB,KAAA;AACJ,EAAA,uBAAQ,KAAA,CAAA,aAAA,CAAA,cAAA,EAAA,EAAe,SAAS,EAAA,IAAA,EAAE,GAAG,KAAO,EAAA,CAAA;AAC9C;;;;"}