@drodil/backstage-plugin-qeta 3.59.10 → 4.0.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/README.md +6 -11
- package/config.schema.json +58 -0
- package/dist/components/ArticlePage/ArticlePage.esm.js +61 -15
- package/dist/components/ArticlePage/ArticlePage.esm.js.map +1 -1
- package/dist/components/ArticlesPage/ArticlesPage.esm.js +9 -22
- package/dist/components/ArticlesPage/ArticlesPage.esm.js.map +1 -1
- package/dist/components/AskPage/AskPage.esm.js +10 -7
- package/dist/components/AskPage/AskPage.esm.js.map +1 -1
- package/dist/components/CollectionCreatePage/CollectionCreatePage.esm.js +8 -5
- package/dist/components/CollectionCreatePage/CollectionCreatePage.esm.js.map +1 -1
- package/dist/components/CollectionPage/CollectionPage.esm.js +47 -87
- package/dist/components/CollectionPage/CollectionPage.esm.js.map +1 -1
- package/dist/components/CollectionsPage/CollectionsPage.esm.js +8 -5
- package/dist/components/CollectionsPage/CollectionsPage.esm.js.map +1 -1
- package/dist/components/ContentHealthCard/ContentHealthCard.esm.js +61 -89
- package/dist/components/ContentHealthCard/ContentHealthCard.esm.js.map +1 -1
- package/dist/components/ContentHealthCard/ContentHealthCard.module.css.esm.js +8 -0
- package/dist/components/ContentHealthCard/ContentHealthCard.module.css.esm.js.map +1 -0
- package/dist/components/ContentHealthCard/ReviewList.esm.js +27 -60
- package/dist/components/ContentHealthCard/ReviewList.esm.js.map +1 -1
- package/dist/components/ContentHealthCard/ReviewList.module.css.esm.js +8 -0
- package/dist/components/ContentHealthCard/ReviewList.module.css.esm.js.map +1 -0
- package/dist/components/CreateLinkPage/CreateLinkPage.esm.js +9 -6
- package/dist/components/CreateLinkPage/CreateLinkPage.esm.js.map +1 -1
- package/dist/components/EntityPage/EntityPage.esm.js +48 -58
- package/dist/components/EntityPage/EntityPage.esm.js.map +1 -1
- package/dist/components/EntityPostsContent/EntityPostsContent.esm.js +2 -3
- package/dist/components/EntityPostsContent/EntityPostsContent.esm.js.map +1 -1
- package/dist/components/FavoritePage/FavoritePage.esm.js +3 -14
- package/dist/components/FavoritePage/FavoritePage.esm.js.map +1 -1
- package/dist/components/HomePage/HomePage.esm.js +17 -60
- package/dist/components/HomePage/HomePage.esm.js.map +1 -1
- package/dist/components/HomePage/HomePage.module.css.esm.js +8 -0
- package/dist/components/HomePage/HomePage.module.css.esm.js.map +1 -0
- package/dist/components/LinkPage/LinkPage.esm.js +60 -61
- package/dist/components/LinkPage/LinkPage.esm.js.map +1 -1
- package/dist/components/LinksPage/LinksPage.esm.js +9 -16
- package/dist/components/LinksPage/LinksPage.esm.js.map +1 -1
- package/dist/components/ModeratorPage/ModeratorPage.esm.js +19 -29
- package/dist/components/ModeratorPage/ModeratorPage.esm.js.map +1 -1
- package/dist/components/ModeratorPage/ModeratorPage.module.css.esm.js +8 -0
- package/dist/components/ModeratorPage/ModeratorPage.module.css.esm.js.map +1 -0
- package/dist/components/QetaPage/QetaPage.esm.js +187 -239
- package/dist/components/QetaPage/QetaPage.esm.js.map +1 -1
- package/dist/components/QetaPage/QetaPage.module.css.esm.js +8 -0
- package/dist/components/QetaPage/QetaPage.module.css.esm.js.map +1 -0
- package/dist/components/QetaSearchResultListItem/QetaSearchResultListItem.esm.js +67 -78
- package/dist/components/QetaSearchResultListItem/QetaSearchResultListItem.esm.js.map +1 -1
- package/dist/components/QetaSearchResultListItem/QetaSearchResultListItem.module.css.esm.js +8 -0
- package/dist/components/QetaSearchResultListItem/QetaSearchResultListItem.module.css.esm.js.map +1 -0
- package/dist/components/QuestionPage/QuestionPage.esm.js +122 -97
- package/dist/components/QuestionPage/QuestionPage.esm.js.map +1 -1
- package/dist/components/QuestionsPage/QuestionsPage.esm.js +8 -5
- package/dist/components/QuestionsPage/QuestionsPage.esm.js.map +1 -1
- package/dist/components/ReviewPage/ReviewPage.esm.js +53 -18
- package/dist/components/ReviewPage/ReviewPage.esm.js.map +1 -1
- package/dist/components/RightContent/ArticlesRightContent.esm.js +2 -2
- package/dist/components/RightContent/ArticlesRightContent.esm.js.map +1 -1
- package/dist/components/RightContent/DefaultRightContent.esm.js +2 -2
- package/dist/components/RightContent/DefaultRightContent.esm.js.map +1 -1
- package/dist/components/RightContent/EntityRightContent.esm.js +2 -2
- package/dist/components/RightContent/EntityRightContent.esm.js.map +1 -1
- package/dist/components/RightContent/LinkedPosts.esm.js +5 -19
- package/dist/components/RightContent/LinkedPosts.esm.js.map +1 -1
- package/dist/components/RightContent/LinkedPosts.module.css.esm.js +8 -0
- package/dist/components/RightContent/LinkedPosts.module.css.esm.js.map +1 -0
- package/dist/components/RightContent/LinksRightContent.esm.js +2 -2
- package/dist/components/RightContent/LinksRightContent.esm.js.map +1 -1
- package/dist/components/RightContent/PostRightContent.esm.js +4 -4
- package/dist/components/RightContent/PostRightContent.esm.js.map +1 -1
- package/dist/components/RightContent/QuestionsRightContent.esm.js +2 -2
- package/dist/components/RightContent/QuestionsRightContent.esm.js.map +1 -1
- package/dist/components/RightContent/RightContent.esm.js +46 -61
- package/dist/components/RightContent/RightContent.esm.js.map +1 -1
- package/dist/components/RightContent/RightContent.module.css.esm.js +8 -0
- package/dist/components/RightContent/RightContent.module.css.esm.js.map +1 -0
- package/dist/components/RightContent/SimilarQuestions.esm.js +3 -16
- package/dist/components/RightContent/SimilarQuestions.esm.js.map +1 -1
- package/dist/components/RightContent/SimilarQuestions.module.css.esm.js +8 -0
- package/dist/components/RightContent/SimilarQuestions.module.css.esm.js.map +1 -0
- package/dist/components/RightContent/TagRightContent.esm.js +2 -2
- package/dist/components/RightContent/TagRightContent.esm.js.map +1 -1
- package/dist/components/SettingsPage/SettingsPage.esm.js +198 -200
- package/dist/components/SettingsPage/SettingsPage.esm.js.map +1 -1
- package/dist/components/SettingsPage/SettingsPage.module.css.esm.js +8 -0
- package/dist/components/SettingsPage/SettingsPage.module.css.esm.js.map +1 -0
- package/dist/components/Statistics/GlobalStatsContent.esm.js +5 -5
- package/dist/components/Statistics/GlobalStatsContent.esm.js.map +1 -1
- package/dist/components/Statistics/StatisticsPage.esm.js +21 -20
- package/dist/components/Statistics/StatisticsPage.esm.js.map +1 -1
- package/dist/components/Statistics/StatisticsPage.module.css.esm.js +8 -0
- package/dist/components/Statistics/StatisticsPage.module.css.esm.js.map +1 -0
- package/dist/components/TagPage/TagPage.esm.js +58 -87
- package/dist/components/TagPage/TagPage.esm.js.map +1 -1
- package/dist/components/TechDocsAskQuestionAddon/TechDocsAskQuestionAddon.esm.js +23 -32
- package/dist/components/TechDocsAskQuestionAddon/TechDocsAskQuestionAddon.esm.js.map +1 -1
- package/dist/components/TechDocsAskQuestionAddon/TechDocsAskQuestionAddon.module.css.esm.js +8 -0
- package/dist/components/TechDocsAskQuestionAddon/TechDocsAskQuestionAddon.module.css.esm.js.map +1 -0
- package/dist/components/UserPage/UserPage.esm.js +158 -234
- package/dist/components/UserPage/UserPage.esm.js.map +1 -1
- package/dist/components/UserPage/UserPage.module.css.esm.js +8 -0
- package/dist/components/UserPage/UserPage.module.css.esm.js.map +1 -0
- package/dist/components/UserPage/UserStatsContent.esm.js +5 -5
- package/dist/components/UserPage/UserStatsContent.esm.js.map +1 -1
- package/dist/components/UsersPage/UsersPage.esm.js +3 -9
- package/dist/components/UsersPage/UsersPage.esm.js.map +1 -1
- package/dist/components/WritePage/WritePage.esm.js +9 -6
- package/dist/components/WritePage/WritePage.esm.js.map +1 -1
- package/dist/index.d.ts +283 -77
- package/dist/index.esm.js +262 -7
- package/dist/index.esm.js.map +1 -1
- package/dist/node_modules_dist/style-inject/dist/style-inject.es.esm.js +29 -0
- package/dist/node_modules_dist/style-inject/dist/style-inject.es.esm.js.map +1 -0
- package/dist/{package.json.esm.js → plugins/qeta/package.json.esm.js} +8 -13
- package/dist/{package.json.esm.js.map → plugins/qeta/package.json.esm.js.map} +1 -1
- package/package.json +9 -18
- package/dist/alpha.d.ts +0 -255
- package/dist/alpha.esm.js +0 -238
- package/dist/alpha.esm.js.map +0 -1
- package/dist/components/EntityCards/EntityPostsContainerCard.esm.js +0 -13
- package/dist/components/EntityCards/EntityPostsContainerCard.esm.js.map +0 -1
- package/dist/components/EntityCards/EntityPostsGridCard.esm.js +0 -20
- package/dist/components/EntityCards/EntityPostsGridCard.esm.js.map +0 -1
- package/dist/components/ReviewPage/index.esm.js +0 -6
- package/dist/components/ReviewPage/index.esm.js.map +0 -1
- package/dist/plugin.esm.js +0 -84
- package/dist/plugin.esm.js.map +0 -1
|
@@ -3,18 +3,15 @@ import { useState, useEffect } from 'react';
|
|
|
3
3
|
import { useParams } from 'react-router-dom';
|
|
4
4
|
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
|
|
5
5
|
import { useApi } from '@backstage/core-plugin-api';
|
|
6
|
-
import { qetaTranslationRef,
|
|
6
|
+
import { qetaTranslationRef, useQetaConfig, EntitiesContainer, useQetaApi, EntityFollowButton, AskQuestionButton, WriteArticleButton, CreateLinkButton, PostsContainer } from '@drodil/backstage-plugin-qeta-react';
|
|
7
7
|
import { useEntityPresentation, catalogApiRef, EntityRefLink } from '@backstage/plugin-catalog-react';
|
|
8
|
-
import
|
|
9
|
-
import QuestionAnswerIcon from '@material-ui/icons/QuestionAnswer';
|
|
10
|
-
import PeopleIcon from '@material-ui/icons/People';
|
|
11
|
-
import { Skeleton } from '@material-ui/lab';
|
|
12
|
-
import { WarningPanel } from '@backstage/core-components';
|
|
8
|
+
import { Header, Skeleton, Alert } from '@backstage/ui';
|
|
13
9
|
|
|
14
10
|
const SingleEntityPage = ({ entityRef }) => {
|
|
15
11
|
const { t } = useTranslationRef(qetaTranslationRef);
|
|
12
|
+
const { disabled } = useQetaConfig();
|
|
16
13
|
const [entity, setEntity] = useState(void 0);
|
|
17
|
-
const {
|
|
14
|
+
const { primaryTitle } = useEntityPresentation(entityRef);
|
|
18
15
|
const catalogApi = useApi(catalogApiRef);
|
|
19
16
|
useEffect(() => {
|
|
20
17
|
catalogApi.getEntityByRef(entityRef).then((e) => setEntity(e));
|
|
@@ -24,56 +21,56 @@ const SingleEntityPage = ({ entityRef }) => {
|
|
|
24
21
|
loading,
|
|
25
22
|
error
|
|
26
23
|
} = useQetaApi((api) => api.getEntity(entityRef), [entityRef]);
|
|
24
|
+
if (disabled.entities) {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
27
|
if (loading) {
|
|
28
|
-
return /* @__PURE__ */ jsx(Skeleton, {
|
|
28
|
+
return /* @__PURE__ */ jsx(Skeleton, { width: "100%", height: 200 });
|
|
29
29
|
}
|
|
30
30
|
if (error || !resp) {
|
|
31
|
-
return /* @__PURE__ */ jsx(
|
|
31
|
+
return /* @__PURE__ */ jsx(
|
|
32
|
+
Alert,
|
|
33
|
+
{
|
|
34
|
+
status: "danger",
|
|
35
|
+
title: t("questionPage.errorLoading"),
|
|
36
|
+
description: error?.message
|
|
37
|
+
}
|
|
38
|
+
);
|
|
32
39
|
}
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
defaultKind: "Component",
|
|
38
|
-
hideIcon: true
|
|
39
|
-
}
|
|
40
|
-
) });
|
|
41
|
-
const description = `${entity?.kind} ${entity?.spec?.type ? `(${entity?.spec?.type})` : ""}`;
|
|
40
|
+
const description = [
|
|
41
|
+
`${entity?.kind} ${entity?.spec?.type ? `(${entity?.spec?.type})` : ""}`,
|
|
42
|
+
entity?.metadata?.description
|
|
43
|
+
].filter(Boolean).join(" \xB7 ");
|
|
42
44
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
43
|
-
/* @__PURE__ */
|
|
44
|
-
|
|
45
|
+
/* @__PURE__ */ jsx(
|
|
46
|
+
Header,
|
|
45
47
|
{
|
|
46
|
-
title,
|
|
47
|
-
titleIcon: /* @__PURE__ */ jsx(CategoryOutlined, { fontSize: "large" }),
|
|
48
|
+
title: primaryTitle,
|
|
48
49
|
description,
|
|
49
|
-
|
|
50
|
+
metadata: [
|
|
51
|
+
...[
|
|
52
|
+
{
|
|
53
|
+
label: t("metadata.posts"),
|
|
54
|
+
value: resp.postsCount
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
label: t("metadata.followers"),
|
|
58
|
+
value: resp.followerCount
|
|
59
|
+
}
|
|
60
|
+
],
|
|
61
|
+
...entity?.spec?.owner ? [
|
|
62
|
+
{
|
|
63
|
+
label: t("metadata.owner"),
|
|
64
|
+
value: /* @__PURE__ */ jsx(EntityRefLink, { entityRef: entity.spec.owner })
|
|
65
|
+
}
|
|
66
|
+
] : []
|
|
67
|
+
],
|
|
68
|
+
customActions: /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
50
69
|
/* @__PURE__ */ jsx(EntityFollowButton, { entityRef: resp.entityRef }),
|
|
51
70
|
/* @__PURE__ */ jsx(AskQuestionButton, { entity: resp.entityRef }),
|
|
52
71
|
/* @__PURE__ */ jsx(WriteArticleButton, { entity: resp.entityRef }),
|
|
53
72
|
/* @__PURE__ */ jsx(CreateLinkButton, { entity: resp.entityRef })
|
|
54
|
-
]
|
|
55
|
-
}
|
|
56
|
-
),
|
|
57
|
-
resp && /* @__PURE__ */ jsx(
|
|
58
|
-
ContentHeaderCard,
|
|
59
|
-
{
|
|
60
|
-
description: entity?.metadata?.description,
|
|
61
|
-
imageIcon: Icon ? /* @__PURE__ */ jsx("div", { style: { fontSize: "80px", display: "flex" }, children: /* @__PURE__ */ jsx(Icon, { fontSize: "inherit" }) }) : /* @__PURE__ */ jsx(CategoryOutlined, { style: { fontSize: 80 } }),
|
|
62
|
-
stats: [
|
|
63
|
-
{
|
|
64
|
-
label: t("common.postsLabel", {
|
|
65
|
-
count: resp.postsCount,
|
|
66
|
-
itemType: "post"
|
|
67
|
-
}),
|
|
68
|
-
value: resp.postsCount,
|
|
69
|
-
icon: /* @__PURE__ */ jsx(QuestionAnswerIcon, { fontSize: "small" })
|
|
70
|
-
},
|
|
71
|
-
{
|
|
72
|
-
label: t("common.followersLabel", { count: resp.followerCount }),
|
|
73
|
-
value: resp.followerCount,
|
|
74
|
-
icon: /* @__PURE__ */ jsx(PeopleIcon, { fontSize: "small" })
|
|
75
|
-
}
|
|
76
|
-
]
|
|
73
|
+
] })
|
|
77
74
|
}
|
|
78
75
|
),
|
|
79
76
|
/* @__PURE__ */ jsx(
|
|
@@ -90,22 +87,15 @@ const SingleEntityPage = ({ entityRef }) => {
|
|
|
90
87
|
const EntityPage = () => {
|
|
91
88
|
const { entityRef } = useParams();
|
|
92
89
|
const { t } = useTranslationRef(qetaTranslationRef);
|
|
90
|
+
const { disabled } = useQetaConfig();
|
|
91
|
+
if (disabled.entities) {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
93
94
|
if (entityRef) {
|
|
94
95
|
return /* @__PURE__ */ jsx(SingleEntityPage, { entityRef });
|
|
95
96
|
}
|
|
96
97
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
97
|
-
/* @__PURE__ */
|
|
98
|
-
ContentHeader,
|
|
99
|
-
{
|
|
100
|
-
title: t("entitiesPage.defaultTitle"),
|
|
101
|
-
titleIcon: /* @__PURE__ */ jsx(CategoryOutlined, { fontSize: "large" }),
|
|
102
|
-
children: [
|
|
103
|
-
/* @__PURE__ */ jsx(AskQuestionButton, {}),
|
|
104
|
-
/* @__PURE__ */ jsx(WriteArticleButton, {}),
|
|
105
|
-
/* @__PURE__ */ jsx(CreateLinkButton, {})
|
|
106
|
-
]
|
|
107
|
-
}
|
|
108
|
-
),
|
|
98
|
+
/* @__PURE__ */ jsx(Header, { title: t("entitiesPage.defaultTitle") }),
|
|
109
99
|
/* @__PURE__ */ jsx(EntitiesContainer, {})
|
|
110
100
|
] });
|
|
111
101
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EntityPage.esm.js","sources":["../../../src/components/EntityPage/EntityPage.tsx"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"EntityPage.esm.js","sources":["../../../src/components/EntityPage/EntityPage.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { useApi } from '@backstage/core-plugin-api';\nimport {\n AskQuestionButton,\n CreateLinkButton,\n EntitiesContainer,\n EntityFollowButton,\n PostsContainer,\n qetaTranslationRef,\n useQetaApi,\n useQetaConfig,\n WriteArticleButton,\n} from '@drodil/backstage-plugin-qeta-react';\nimport {\n catalogApiRef,\n EntityRefLink,\n useEntityPresentation,\n} from '@backstage/plugin-catalog-react';\nimport { Alert, Header, Skeleton } from '@backstage/ui';\nimport { Entity } from '@backstage/catalog-model';\n\nconst SingleEntityPage = ({ entityRef }: { entityRef: string }) => {\n const { t } = useTranslationRef(qetaTranslationRef);\n const { disabled } = useQetaConfig();\n const [entity, setEntity] = useState<Entity | undefined>(undefined);\n const { primaryTitle } = useEntityPresentation(entityRef);\n const catalogApi = useApi(catalogApiRef);\n\n useEffect(() => {\n catalogApi.getEntityByRef(entityRef).then(e => setEntity(e));\n }, [catalogApi, entityRef]);\n\n const {\n value: resp,\n loading,\n error,\n } = useQetaApi(api => api.getEntity(entityRef), [entityRef]);\n\n if (disabled.entities) {\n return null;\n }\n\n if (loading) {\n return <Skeleton width=\"100%\" height={200} />;\n }\n\n if (error || !resp) {\n return (\n <Alert\n status=\"danger\"\n title={t('questionPage.errorLoading')}\n description={error?.message}\n />\n );\n }\n\n const description = [\n `${entity?.kind} ${entity?.spec?.type ? `(${entity?.spec?.type})` : ''}`,\n entity?.metadata?.description,\n ]\n .filter(Boolean)\n .join(' · ');\n\n return (\n <>\n <Header\n title={primaryTitle}\n description={description}\n metadata={[\n ...[\n {\n label: t('metadata.posts'),\n value: resp.postsCount,\n },\n {\n label: t('metadata.followers'),\n value: resp.followerCount,\n },\n ],\n ...(entity?.spec?.owner\n ? [\n {\n label: t('metadata.owner'),\n value: (\n <EntityRefLink entityRef={entity.spec.owner as string} />\n ),\n },\n ]\n : []),\n ]}\n customActions={\n <>\n <EntityFollowButton entityRef={resp.entityRef} />\n <AskQuestionButton entity={resp.entityRef} />\n <WriteArticleButton entity={resp.entityRef} />\n <CreateLinkButton entity={resp.entityRef} />\n </>\n }\n />\n <PostsContainer\n entity={entityRef}\n filterPanelProps={{ showEntityFilter: false }}\n defaultView=\"list\"\n showTypeLabel\n />\n </>\n );\n};\n\nexport const EntityPage = () => {\n const { entityRef } = useParams();\n const { t } = useTranslationRef(qetaTranslationRef);\n const { disabled } = useQetaConfig();\n\n if (disabled.entities) {\n return null;\n }\n\n if (entityRef) {\n return <SingleEntityPage entityRef={entityRef} />;\n }\n\n return (\n <>\n <Header title={t('entitiesPage.defaultTitle')} />\n <EntitiesContainer />\n </>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -4,9 +4,8 @@ import { QetaProvider, PostsContainer } from '@drodil/backstage-plugin-qeta-reac
|
|
|
4
4
|
import { Content } from '@backstage/core-components';
|
|
5
5
|
import { isUserEntity, stringifyEntityRef } from '@backstage/catalog-model';
|
|
6
6
|
import { useEntity, catalogApiRef } from '@backstage/plugin-catalog-react';
|
|
7
|
-
import { Container } from '@
|
|
7
|
+
import { Skeleton, Container } from '@backstage/ui';
|
|
8
8
|
import { useApi } from '@backstage/core-plugin-api';
|
|
9
|
-
import { Skeleton } from '@material-ui/lab';
|
|
10
9
|
|
|
11
10
|
const EntityPostsContent = (props) => {
|
|
12
11
|
const [view, setView] = useState(props.view ?? "list");
|
|
@@ -46,7 +45,7 @@ const EntityPostsContent = (props) => {
|
|
|
46
45
|
});
|
|
47
46
|
}, [catalog, entity, props.relations]);
|
|
48
47
|
if (loading) {
|
|
49
|
-
return /* @__PURE__ */ jsx(Skeleton, {
|
|
48
|
+
return /* @__PURE__ */ jsx(Skeleton, { width: "100%", height: 200 });
|
|
50
49
|
}
|
|
51
50
|
return /* @__PURE__ */ jsx(
|
|
52
51
|
QetaProvider,
|
|
@@ -1 +1 @@
|
|
|
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 type { FilterPredicate } from '@backstage/filter-predicates';\nimport { Container } from '@
|
|
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 type { FilterPredicate } from '@backstage/filter-predicates';\nimport { Container, Skeleton } from '@backstage/ui';\nimport { PluggableList } from 'unified';\nimport { useApi } from '@backstage/core-plugin-api';\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: FilterPredicate[] = props.relations.map(\n relation =>\n ({\n [`relations.${relation}`]: stringifyEntityRef(entity),\n }) as FilterPredicate,\n );\n catalog\n .queryEntities({\n query: { $any: 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 width=\"100%\" 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":";;;;;;;;;AA0BO,MAAM,kBAAA,GAAqB,CAAC,KAAA,KAAmC;AACpE,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,IAAI,QAAA,CAAmB,KAAA,CAAM,QAAQ,MAAM,CAAA;AAC/D,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,SAAA,EAAU;AAC7B,EAAA,MAAM,OAAA,GAAU,OAAO,aAAa,CAAA;AACpC,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAI,QAAA;AAAA,IAC5C,MAAM;AACJ,MAAA,IAAI,YAAA,CAAa,MAAM,CAAA,EAAG;AACxB,QAAA,OAAO,EAAE,MAAA,EAAQ,kBAAA,CAAmB,MAAM,CAAA,EAAE;AAAA,MAC9C;AACA,MAAA,OAAO,EAAE,MAAA,EAAQ,KAAA,CAAM,MAAA,IAAU,kBAAA,CAAmB,MAAM,CAAA,EAAE;AAAA,IAC9D;AAAA,GACF;AAEA,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAkB,IAAI,CAAA;AACpD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,KAAA,CAAM,SAAA,EAAW,MAAA,EAAQ;AAC5B,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,OAAA,GAA6B,MAAM,SAAA,CAAU,GAAA;AAAA,MACjD,CAAA,QAAA,MACG;AAAA,QACC,CAAC,CAAA,UAAA,EAAa,QAAQ,CAAA,CAAE,GAAG,mBAAmB,MAAM;AAAA,OACtD;AAAA,KACJ;AACA,IAAA,OAAA,CACG,aAAA,CAAc;AAAA,MACb,KAAA,EAAO,EAAE,IAAA,EAAM,OAAA,EAAQ;AAAA,MACvB,MAAA,EAAQ,CAAC,MAAA,EAAQ,eAAA,EAAiB,oBAAoB;AAAA,KACvD,CAAA,CACA,IAAA,CAAK,CAAA,QAAA,KAAY;AAChB,MAAA,kBAAA,CAAmB,CAAA,IAAA,MAAS;AAAA,QAC1B,GAAG,IAAA;AAAA,QACH,QAAA,EAAU,QAAA,CAAS,KAAA,CAAM,GAAA,CAAI,kBAAkB,CAAA;AAAA,QAC/C,gBAAA,EAAkB;AAAA,OACpB,CAAE,CAAA;AACF,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AACX,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB,CAAC,CAAA;AAAA,EACL,GAAG,CAAC,OAAA,EAAS,MAAA,EAAQ,KAAA,CAAM,SAAS,CAAC,CAAA;AAErC,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,uBAAO,GAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EAAM,MAAA,EAAO,QAAQ,GAAA,EAAK,CAAA;AAAA,EAC7C;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,eAAe,KAAA,CAAM,aAAA;AAAA,MACrB,eAAe,KAAA,CAAM,aAAA;AAAA,MAErB,QAAA,kBAAA,GAAA,CAAC,OAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,SAAA,EAAA,EACC,QAAA,kBAAA,GAAA;AAAA,QAAC,cAAA;AAAA,QAAA;AAAA,UACE,GAAG,KAAA;AAAA,UACH,GAAG,eAAA;AAAA,UACJ,IAAA;AAAA,UACA,YAAA,EAAc;AAAA;AAAA,SAElB,CAAA,EACF;AAAA;AAAA,GACF;AAEJ;;;;"}
|
|
@@ -1,23 +1,12 @@
|
|
|
1
1
|
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { qetaTranslationRef,
|
|
3
|
-
import
|
|
2
|
+
import { qetaTranslationRef, PostsContainer } from '@drodil/backstage-plugin-qeta-react';
|
|
3
|
+
import { Header } from '@backstage/ui';
|
|
4
4
|
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
|
|
5
5
|
|
|
6
6
|
const FavoritePage = () => {
|
|
7
7
|
const { t } = useTranslationRef(qetaTranslationRef);
|
|
8
8
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
9
|
-
/* @__PURE__ */
|
|
10
|
-
ContentHeader,
|
|
11
|
-
{
|
|
12
|
-
title: t("favoritePage.title"),
|
|
13
|
-
titleIcon: /* @__PURE__ */ jsx(StarBorder, { fontSize: "large" }),
|
|
14
|
-
children: [
|
|
15
|
-
/* @__PURE__ */ jsx(AskQuestionButton, {}),
|
|
16
|
-
/* @__PURE__ */ jsx(WriteArticleButton, {}),
|
|
17
|
-
/* @__PURE__ */ jsx(CreateLinkButton, {})
|
|
18
|
-
]
|
|
19
|
-
}
|
|
20
|
-
),
|
|
9
|
+
/* @__PURE__ */ jsx(Header, { title: t("favoritePage.title") }),
|
|
21
10
|
/* @__PURE__ */ jsx(
|
|
22
11
|
PostsContainer,
|
|
23
12
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FavoritePage.esm.js","sources":["../../../src/components/FavoritePage/FavoritePage.tsx"],"sourcesContent":["import {\n
|
|
1
|
+
{"version":3,"file":"FavoritePage.esm.js","sources":["../../../src/components/FavoritePage/FavoritePage.tsx"],"sourcesContent":["import {\n PostsContainer,\n qetaTranslationRef,\n} from '@drodil/backstage-plugin-qeta-react';\nimport { Header } from '@backstage/ui';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\n\nexport const FavoritePage = () => {\n const { t } = useTranslationRef(qetaTranslationRef);\n\n return (\n <>\n <Header title={t('favoritePage.title')} />\n <PostsContainer\n favorite\n showNoQuestionsBtn={false}\n showTypeLabel\n defaultView=\"list\"\n prefix=\"favorites\"\n />\n </>\n );\n};\n"],"names":[],"mappings":";;;;;AAOO,MAAM,eAAe,MAAM;AAChC,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,kBAAkB,CAAA;AAElD,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,MAAA,EAAA,EAAO,KAAA,EAAO,CAAA,CAAE,oBAAoB,CAAA,EAAG,CAAA;AAAA,oBACxC,GAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACC,QAAA,EAAQ,IAAA;AAAA,QACR,kBAAA,EAAoB,KAAA;AAAA,QACpB,aAAA,EAAa,IAAA;AAAA,QACb,WAAA,EAAY,MAAA;AAAA,QACZ,MAAA,EAAO;AAAA;AAAA;AACT,GAAA,EACF,CAAA;AAEJ;;;;"}
|
|
@@ -1,78 +1,35 @@
|
|
|
1
1
|
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { qetaTranslationRef,
|
|
3
|
-
import {
|
|
2
|
+
import { qetaTranslationRef, useQetaConfig, AskQuestionButton, WriteArticleButton, CreateLinkButton, SuggestionsCard, FollowedItemsCard, ImpactCard, CommunityActivityCard, Timeline } from '@drodil/backstage-plugin-qeta-react';
|
|
3
|
+
import { Header, Box } from '@backstage/ui';
|
|
4
4
|
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
|
|
5
|
-
import
|
|
5
|
+
import styles from './HomePage.module.css.esm.js';
|
|
6
6
|
|
|
7
|
-
const useStyles = makeStyles((theme) => ({
|
|
8
|
-
flexRow: {
|
|
9
|
-
display: "flex",
|
|
10
|
-
flexWrap: "wrap",
|
|
11
|
-
gap: theme.spacing(2),
|
|
12
|
-
width: "100%",
|
|
13
|
-
marginBottom: theme.spacing(2),
|
|
14
|
-
alignItems: "stretch"
|
|
15
|
-
},
|
|
16
|
-
suggestionColumn: {
|
|
17
|
-
flex: "3 1 350px",
|
|
18
|
-
display: "flex",
|
|
19
|
-
minWidth: 0,
|
|
20
|
-
"& > *": {
|
|
21
|
-
flex: 1,
|
|
22
|
-
maxHeight: 460,
|
|
23
|
-
overflowY: "auto"
|
|
24
|
-
}
|
|
25
|
-
},
|
|
26
|
-
followedColumn: {
|
|
27
|
-
flex: "1 1 250px",
|
|
28
|
-
display: "flex",
|
|
29
|
-
minWidth: 0,
|
|
30
|
-
"& > *": {
|
|
31
|
-
flex: 1,
|
|
32
|
-
maxHeight: 460,
|
|
33
|
-
overflowY: "auto"
|
|
34
|
-
}
|
|
35
|
-
},
|
|
36
|
-
equalColumn: {
|
|
37
|
-
flex: "1 1 395px",
|
|
38
|
-
display: "flex",
|
|
39
|
-
minWidth: 0,
|
|
40
|
-
"& > *": {
|
|
41
|
-
flex: 1,
|
|
42
|
-
maxHeight: 460,
|
|
43
|
-
overflowY: "auto"
|
|
44
|
-
}
|
|
45
|
-
},
|
|
46
|
-
timelineWrapper: {
|
|
47
|
-
width: "100%",
|
|
48
|
-
marginTop: theme.spacing(2)
|
|
49
|
-
}
|
|
50
|
-
}));
|
|
51
7
|
const HomePage = () => {
|
|
52
|
-
const classes = useStyles();
|
|
53
8
|
const { t } = useTranslationRef(qetaTranslationRef);
|
|
9
|
+
const { disabled } = useQetaConfig();
|
|
10
|
+
const showSuggestions = !disabled.questions || !disabled.articles || !disabled.links;
|
|
11
|
+
const showFollowed = !disabled.tags || !disabled.entities || !disabled.collections;
|
|
54
12
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
55
|
-
/* @__PURE__ */
|
|
56
|
-
|
|
13
|
+
/* @__PURE__ */ jsx(
|
|
14
|
+
Header,
|
|
57
15
|
{
|
|
58
16
|
title: t("homePage.title"),
|
|
59
|
-
|
|
60
|
-
children: [
|
|
17
|
+
customActions: /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
61
18
|
/* @__PURE__ */ jsx(AskQuestionButton, {}),
|
|
62
19
|
/* @__PURE__ */ jsx(WriteArticleButton, {}),
|
|
63
20
|
/* @__PURE__ */ jsx(CreateLinkButton, {})
|
|
64
|
-
]
|
|
21
|
+
] })
|
|
65
22
|
}
|
|
66
23
|
),
|
|
67
|
-
/* @__PURE__ */ jsxs(Box, { className:
|
|
68
|
-
/* @__PURE__ */ jsx(Box, { className:
|
|
69
|
-
/* @__PURE__ */ jsx(Box, { className:
|
|
24
|
+
(showSuggestions || showFollowed) && /* @__PURE__ */ jsxs(Box, { className: styles.flexRow, children: [
|
|
25
|
+
showSuggestions && /* @__PURE__ */ jsx(Box, { className: styles.suggestionColumn, children: /* @__PURE__ */ jsx(SuggestionsCard, {}) }),
|
|
26
|
+
showFollowed && /* @__PURE__ */ jsx(Box, { className: styles.followedColumn, children: /* @__PURE__ */ jsx(FollowedItemsCard, {}) })
|
|
70
27
|
] }),
|
|
71
|
-
/* @__PURE__ */ jsxs(Box, { className:
|
|
72
|
-
/* @__PURE__ */ jsx(Box, { className:
|
|
73
|
-
/* @__PURE__ */ jsx(Box, { className:
|
|
28
|
+
/* @__PURE__ */ jsxs(Box, { className: styles.flexRow, children: [
|
|
29
|
+
/* @__PURE__ */ jsx(Box, { className: styles.equalColumn, children: /* @__PURE__ */ jsx(ImpactCard, {}) }),
|
|
30
|
+
/* @__PURE__ */ jsx(Box, { className: styles.equalColumn, children: /* @__PURE__ */ jsx(CommunityActivityCard, {}) })
|
|
74
31
|
] }),
|
|
75
|
-
/* @__PURE__ */ jsx(Box, { className:
|
|
32
|
+
/* @__PURE__ */ jsx(Box, { className: styles.timelineWrapper, children: /* @__PURE__ */ jsx(Timeline, {}) })
|
|
76
33
|
] });
|
|
77
34
|
};
|
|
78
35
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HomePage.esm.js","sources":["../../../src/components/HomePage/HomePage.tsx"],"sourcesContent":["import {\n AskQuestionButton,\n
|
|
1
|
+
{"version":3,"file":"HomePage.esm.js","sources":["../../../src/components/HomePage/HomePage.tsx"],"sourcesContent":["import {\n AskQuestionButton,\n CreateLinkButton,\n ImpactCard,\n qetaTranslationRef,\n SuggestionsCard,\n WriteArticleButton,\n Timeline,\n CommunityActivityCard,\n FollowedItemsCard,\n useQetaConfig,\n} from '@drodil/backstage-plugin-qeta-react';\nimport { Box, Header } from '@backstage/ui';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport styles from './HomePage.module.css';\n\nexport const HomePage = () => {\n const { t } = useTranslationRef(qetaTranslationRef);\n const { disabled } = useQetaConfig();\n\n const showSuggestions =\n !disabled.questions || !disabled.articles || !disabled.links;\n const showFollowed =\n !disabled.tags || !disabled.entities || !disabled.collections;\n\n return (\n <>\n <Header\n title={t('homePage.title')}\n customActions={\n <>\n <AskQuestionButton />\n <WriteArticleButton />\n <CreateLinkButton />\n </>\n }\n />\n\n {(showSuggestions || showFollowed) && (\n <Box className={styles.flexRow}>\n {showSuggestions && (\n <Box className={styles.suggestionColumn}>\n <SuggestionsCard />\n </Box>\n )}\n {showFollowed && (\n <Box className={styles.followedColumn}>\n <FollowedItemsCard />\n </Box>\n )}\n </Box>\n )}\n\n <Box className={styles.flexRow}>\n <Box className={styles.equalColumn}>\n <ImpactCard />\n </Box>\n <Box className={styles.equalColumn}>\n <CommunityActivityCard />\n </Box>\n </Box>\n\n <Box className={styles.timelineWrapper}>\n <Timeline />\n </Box>\n </>\n );\n};\n"],"names":[],"mappings":";;;;;;AAgBO,MAAM,WAAW,MAAM;AAC5B,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,kBAAkB,CAAA;AAClD,EAAA,MAAM,EAAE,QAAA,EAAS,GAAI,aAAA,EAAc;AAEnC,EAAA,MAAM,eAAA,GACJ,CAAC,QAAA,CAAS,SAAA,IAAa,CAAC,QAAA,CAAS,QAAA,IAAY,CAAC,QAAA,CAAS,KAAA;AACzD,EAAA,MAAM,YAAA,GACJ,CAAC,QAAA,CAAS,IAAA,IAAQ,CAAC,QAAA,CAAS,QAAA,IAAY,CAAC,QAAA,CAAS,WAAA;AAEpD,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,gBAAgB,CAAA;AAAA,QACzB,+BACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,iBAAA,EAAA,EAAkB,CAAA;AAAA,8BAClB,kBAAA,EAAA,EAAmB,CAAA;AAAA,8BACnB,gBAAA,EAAA,EAAiB;AAAA,SAAA,EACpB;AAAA;AAAA,KAEJ;AAAA,IAAA,CAEE,mBAAmB,YAAA,qBACnB,IAAA,CAAC,GAAA,EAAA,EAAI,SAAA,EAAW,OAAO,OAAA,EACpB,QAAA,EAAA;AAAA,MAAA,eAAA,wBACE,GAAA,EAAA,EAAI,SAAA,EAAW,OAAO,gBAAA,EACrB,QAAA,kBAAA,GAAA,CAAC,mBAAgB,CAAA,EACnB,CAAA;AAAA,MAED,YAAA,wBACE,GAAA,EAAA,EAAI,SAAA,EAAW,OAAO,cAAA,EACrB,QAAA,kBAAA,GAAA,CAAC,qBAAkB,CAAA,EACrB;AAAA,KAAA,EAEJ,CAAA;AAAA,oBAGF,IAAA,CAAC,GAAA,EAAA,EAAI,SAAA,EAAW,MAAA,CAAO,OAAA,EACrB,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,OAAI,SAAA,EAAW,MAAA,CAAO,WAAA,EACrB,QAAA,kBAAA,GAAA,CAAC,cAAW,CAAA,EACd,CAAA;AAAA,0BACC,GAAA,EAAA,EAAI,SAAA,EAAW,OAAO,WAAA,EACrB,QAAA,kBAAA,GAAA,CAAC,yBAAsB,CAAA,EACzB;AAAA,KAAA,EACF,CAAA;AAAA,wBAEC,GAAA,EAAA,EAAI,SAAA,EAAW,OAAO,eAAA,EACrB,QAAA,kBAAA,GAAA,CAAC,YAAS,CAAA,EACZ;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import styleInject from '../../node_modules_dist/style-inject/dist/style-inject.es.esm.js';
|
|
2
|
+
|
|
3
|
+
var css_248z = "@layer components {\n .HomePage_flexRow__9c80de9abf {\n display: flex;\n flex-wrap: wrap;\n gap: var(--bui-space-4);\n width: 100%;\n margin-bottom: var(--bui-space-4);\n align-items: stretch;\n }\n\n .HomePage_suggestionColumn__9c80de9abf {\n flex: 3 1 350px;\n display: flex;\n min-width: 0;\n }\n\n .HomePage_suggestionColumn__9c80de9abf > * {\n flex: 1;\n max-height: 460px;\n overflow-y: auto;\n }\n\n .HomePage_followedColumn__9c80de9abf {\n flex: 1 1 250px;\n display: flex;\n min-width: 0;\n }\n\n .HomePage_followedColumn__9c80de9abf > * {\n flex: 1;\n max-height: 460px;\n overflow-y: auto;\n }\n\n .HomePage_equalColumn__9c80de9abf {\n flex: 1 1 395px;\n display: flex;\n min-width: 0;\n }\n\n .HomePage_equalColumn__9c80de9abf > * {\n flex: 1;\n max-height: 460px;\n overflow-y: auto;\n }\n\n .HomePage_timelineWrapper__9c80de9abf {\n width: 100%;\n margin-top: var(--bui-space-4);\n }\n}\n";
|
|
4
|
+
var styles = {"flexRow":"HomePage_flexRow__9c80de9abf","suggestionColumn":"HomePage_suggestionColumn__9c80de9abf","followedColumn":"HomePage_followedColumn__9c80de9abf","equalColumn":"HomePage_equalColumn__9c80de9abf","timelineWrapper":"HomePage_timelineWrapper__9c80de9abf"};
|
|
5
|
+
styleInject(css_248z);
|
|
6
|
+
|
|
7
|
+
export { styles as default };
|
|
8
|
+
//# sourceMappingURL=HomePage.module.css.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HomePage.module.css.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
|
|
@@ -2,27 +2,14 @@ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
|
2
2
|
import { useParams } from 'react-router-dom';
|
|
3
3
|
import { useState, useEffect } from 'react';
|
|
4
4
|
import { useSignal } from '@backstage/plugin-signals-react';
|
|
5
|
-
import {
|
|
6
|
-
import { qetaApiRef, qetaTranslationRef, useQetaApi, ContentHeader, PostHistoryButton, FollowPostButton, CreateLinkButton, AddToCollectionButton, FaviconItem, DraftBanner, DeletedBanner, LinkCard, RelativeTimeWithTooltip, UpdatedByLink } from '@drodil/backstage-plugin-qeta-react';
|
|
7
|
-
import { Skeleton } from '@material-ui/lab';
|
|
5
|
+
import { qetaTranslationRef, useQetaConfig, useQetaApi, EditButton, DeleteButton, RestoreButton, PostHistoryButton, FollowPostButton, AddToCollectionButton, DraftBanner, DeletedBanner, LinkCard, RelativeTimeWithTooltip, AuthorHeaderItem } from '@drodil/backstage-plugin-qeta-react';
|
|
8
6
|
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
|
|
9
|
-
import {
|
|
10
|
-
import { useApi } from '@backstage/core-plugin-api';
|
|
7
|
+
import { Skeleton, Alert, Header } from '@backstage/ui';
|
|
11
8
|
|
|
12
|
-
const useDescriptionStyles = makeStyles(
|
|
13
|
-
() => ({
|
|
14
|
-
root: {},
|
|
15
|
-
box: {
|
|
16
|
-
display: "inline"
|
|
17
|
-
}
|
|
18
|
-
}),
|
|
19
|
-
{ name: "QetaDescription" }
|
|
20
|
-
);
|
|
21
9
|
const LinkPage = () => {
|
|
22
10
|
const { id } = useParams();
|
|
23
|
-
const qetaApi = useApi(qetaApiRef);
|
|
24
11
|
const { t } = useTranslationRef(qetaTranslationRef);
|
|
25
|
-
const
|
|
12
|
+
const { disabled } = useQetaConfig();
|
|
26
13
|
const [score, setScore] = useState(0);
|
|
27
14
|
const { lastSignal } = useSignal(`qeta:post_${id}`);
|
|
28
15
|
const {
|
|
@@ -41,63 +28,75 @@ const LinkPage = () => {
|
|
|
41
28
|
setScore(lastSignal.score);
|
|
42
29
|
}
|
|
43
30
|
}, [lastSignal]);
|
|
31
|
+
if (disabled.links) {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
44
34
|
if (loading) {
|
|
45
|
-
return /* @__PURE__ */ jsx(Skeleton, {
|
|
35
|
+
return /* @__PURE__ */ jsx(Skeleton, { width: "100%", height: 200 });
|
|
46
36
|
}
|
|
47
37
|
if (error || post === void 0) {
|
|
48
|
-
return /* @__PURE__ */ jsx(
|
|
38
|
+
return /* @__PURE__ */ jsx(
|
|
39
|
+
Alert,
|
|
40
|
+
{
|
|
41
|
+
status: "danger",
|
|
42
|
+
title: t("linkPage.errorLoading"),
|
|
43
|
+
description: error?.message
|
|
44
|
+
}
|
|
45
|
+
);
|
|
49
46
|
}
|
|
50
47
|
if (post.type !== "link") {
|
|
51
|
-
return /* @__PURE__ */ jsx(
|
|
48
|
+
return /* @__PURE__ */ jsx(
|
|
49
|
+
Alert,
|
|
50
|
+
{
|
|
51
|
+
status: "warning",
|
|
52
|
+
title: "Not found",
|
|
53
|
+
description: t("linkPage.notFound")
|
|
54
|
+
}
|
|
55
|
+
);
|
|
52
56
|
}
|
|
53
|
-
const
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
t("
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
t("
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
57
|
+
const getMetadata = (q) => {
|
|
58
|
+
const metadata = [
|
|
59
|
+
{
|
|
60
|
+
label: t("postHeader.postedAtTime"),
|
|
61
|
+
value: /* @__PURE__ */ jsx(RelativeTimeWithTooltip, { value: q.created })
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
label: t("postHeader.author"),
|
|
65
|
+
value: /* @__PURE__ */ jsx(AuthorHeaderItem, { userEntityRef: q.author })
|
|
66
|
+
}
|
|
67
|
+
];
|
|
68
|
+
if (q.updated) {
|
|
69
|
+
metadata.push({
|
|
70
|
+
label: t("postHeader.updatedAtTime"),
|
|
71
|
+
value: /* @__PURE__ */ jsx(RelativeTimeWithTooltip, { value: q.updated })
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
if (q.updatedBy) {
|
|
75
|
+
metadata.push({
|
|
76
|
+
label: t("postHeader.updatedBy"),
|
|
77
|
+
value: /* @__PURE__ */ jsx(AuthorHeaderItem, { userEntityRef: q.updatedBy })
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
metadata.push({
|
|
81
|
+
label: t("postHeader.clicks"),
|
|
82
|
+
value: score
|
|
83
|
+
});
|
|
84
|
+
return metadata;
|
|
73
85
|
};
|
|
74
86
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
75
|
-
/* @__PURE__ */
|
|
76
|
-
|
|
87
|
+
/* @__PURE__ */ jsx(
|
|
88
|
+
Header,
|
|
77
89
|
{
|
|
78
|
-
title: post.
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
style: { color: "inherit", textDecoration: "none" },
|
|
85
|
-
"data-testid": "link-title",
|
|
86
|
-
onClick: (event) => {
|
|
87
|
-
event.stopPropagation();
|
|
88
|
-
qetaApi.clickLink(post.id);
|
|
89
|
-
},
|
|
90
|
-
children: post.title
|
|
91
|
-
}
|
|
92
|
-
) : post.title,
|
|
93
|
-
titleIcon: post.url ? /* @__PURE__ */ jsx(FaviconItem, { entity: post }) : void 0,
|
|
94
|
-
description: getDescription(post),
|
|
95
|
-
children: [
|
|
90
|
+
title: post.title,
|
|
91
|
+
metadata: getMetadata(post),
|
|
92
|
+
customActions: /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
93
|
+
/* @__PURE__ */ jsx(EditButton, { entity: post, compact: true }),
|
|
94
|
+
/* @__PURE__ */ jsx(DeleteButton, { entity: post, compact: true }),
|
|
95
|
+
/* @__PURE__ */ jsx(RestoreButton, { entity: post, compact: true }),
|
|
96
96
|
/* @__PURE__ */ jsx(PostHistoryButton, { post, onRestore: retry }),
|
|
97
97
|
/* @__PURE__ */ jsx(FollowPostButton, { post }),
|
|
98
|
-
/* @__PURE__ */ jsx(CreateLinkButton, {}),
|
|
99
98
|
/* @__PURE__ */ jsx(AddToCollectionButton, { post })
|
|
100
|
-
]
|
|
99
|
+
] })
|
|
101
100
|
}
|
|
102
101
|
),
|
|
103
102
|
post.status === "draft" && /* @__PURE__ */ jsx(DraftBanner, {}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LinkPage.esm.js","sources":["../../../src/components/LinkPage/LinkPage.tsx"],"sourcesContent":["import { useParams } from 'react-router-dom';\nimport { useEffect, useState } from 'react';\nimport { useSignal } from '@backstage/plugin-signals-react';\nimport {
|
|
1
|
+
{"version":3,"file":"LinkPage.esm.js","sources":["../../../src/components/LinkPage/LinkPage.tsx"],"sourcesContent":["import { useParams } from 'react-router-dom';\nimport { useEffect, useState } from 'react';\nimport { useSignal } from '@backstage/plugin-signals-react';\nimport { PostResponse, QetaSignal } from '@drodil/backstage-plugin-qeta-common';\nimport {\n AddToCollectionButton,\n AuthorHeaderItem,\n DeleteButton,\n DeletedBanner,\n DraftBanner,\n EditButton,\n FollowPostButton,\n LinkCard,\n PostHistoryButton,\n qetaTranslationRef,\n RelativeTimeWithTooltip,\n RestoreButton,\n useQetaApi,\n useQetaConfig,\n} from '@drodil/backstage-plugin-qeta-react';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { Alert, Header, HeaderMetadataItem, Skeleton } from '@backstage/ui';\n\nexport const LinkPage = () => {\n const { id } = useParams();\n const { t } = useTranslationRef(qetaTranslationRef);\n const { disabled } = useQetaConfig();\n const [score, setScore] = useState(0);\n const { lastSignal } = useSignal<QetaSignal>(`qeta:post_${id}`);\n\n const {\n value: post,\n loading,\n error,\n retry,\n } = useQetaApi(api => api.getPost(id), [id]);\n\n useEffect(() => {\n if (post) {\n setScore(post.score);\n }\n }, [post]);\n\n useEffect(() => {\n if (lastSignal?.type === 'post_stats') {\n setScore(lastSignal.score);\n }\n }, [lastSignal]);\n\n if (disabled.links) {\n return null;\n }\n\n if (loading) {\n return <Skeleton width=\"100%\" height={200} />;\n }\n\n if (error || post === undefined) {\n return (\n <Alert\n status=\"danger\"\n title={t('linkPage.errorLoading')}\n description={error?.message}\n />\n );\n }\n\n if (post.type !== 'link') {\n return (\n <Alert\n status=\"warning\"\n title=\"Not found\"\n description={t('linkPage.notFound')}\n />\n );\n }\n\n const getMetadata = (q: PostResponse): HeaderMetadataItem[] => {\n const metadata: HeaderMetadataItem[] = [\n {\n label: t('postHeader.postedAtTime'),\n value: <RelativeTimeWithTooltip value={q.created} />,\n },\n {\n label: t('postHeader.author'),\n value: <AuthorHeaderItem userEntityRef={q.author} />,\n },\n ];\n\n if (q.updated) {\n metadata.push({\n label: t('postHeader.updatedAtTime'),\n value: <RelativeTimeWithTooltip value={q.updated} />,\n });\n }\n if (q.updatedBy) {\n metadata.push({\n label: t('postHeader.updatedBy'),\n value: <AuthorHeaderItem userEntityRef={q.updatedBy} />,\n });\n }\n metadata.push({\n label: t('postHeader.clicks'),\n value: score,\n });\n\n return metadata;\n };\n\n return (\n <>\n <Header\n title={post.title}\n metadata={getMetadata(post)}\n customActions={\n <>\n <EditButton entity={post} compact />\n <DeleteButton entity={post} compact />\n <RestoreButton entity={post} compact />\n <PostHistoryButton post={post} onRestore={retry} />\n <FollowPostButton post={post} />\n <AddToCollectionButton post={post} />\n </>\n }\n />\n {post.status === 'draft' && <DraftBanner />}\n {post.status === 'deleted' && <DeletedBanner />}\n <LinkCard link={post} />\n </>\n );\n};\n"],"names":[],"mappings":"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"}
|