@drodil/backstage-plugin-qeta 3.50.0 → 3.51.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.
Files changed (27) hide show
  1. package/dist/components/ContentHealthCard/ContentHealthCard.esm.js +149 -0
  2. package/dist/components/ContentHealthCard/ContentHealthCard.esm.js.map +1 -0
  3. package/dist/components/ContentHealthCard/ReviewList.esm.js +77 -0
  4. package/dist/components/ContentHealthCard/ReviewList.esm.js.map +1 -0
  5. package/dist/components/QetaPage/QetaPage.esm.js +8 -4
  6. package/dist/components/QetaPage/QetaPage.esm.js.map +1 -1
  7. package/dist/components/QuestionPage/QuestionPage.esm.js +5 -3
  8. package/dist/components/QuestionPage/QuestionPage.esm.js.map +1 -1
  9. package/dist/components/ReviewPage/ReviewPage.esm.js +162 -0
  10. package/dist/components/ReviewPage/ReviewPage.esm.js.map +1 -0
  11. package/dist/components/ReviewPage/index.esm.js +2 -0
  12. package/dist/components/ReviewPage/index.esm.js.map +1 -0
  13. package/dist/components/RightContent/PostRightContent.esm.js +52 -0
  14. package/dist/components/RightContent/PostRightContent.esm.js.map +1 -0
  15. package/dist/components/RightContent/RightContent.esm.js +18 -1
  16. package/dist/components/RightContent/RightContent.esm.js.map +1 -1
  17. package/dist/components/RightContent/SimilarPosts.esm.js +40 -0
  18. package/dist/components/RightContent/SimilarPosts.esm.js.map +1 -0
  19. package/dist/components/RightContent/SimilarQuestions.esm.js +6 -6
  20. package/dist/components/RightContent/SimilarQuestions.esm.js.map +1 -1
  21. package/dist/index.d.ts +2 -1
  22. package/dist/index.esm.js +1 -1
  23. package/dist/package.json.esm.js +2 -1
  24. package/dist/package.json.esm.js.map +1 -1
  25. package/dist/plugin.esm.js +8 -1
  26. package/dist/plugin.esm.js.map +1 -1
  27. package/package.json +4 -3
@@ -0,0 +1,149 @@
1
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
+ import { useState } from 'react';
3
+ import { qetaCreatePostReviewPermission, qetaReadPostReviewPermission } from '@drodil/backstage-plugin-qeta-common';
4
+ import { makeStyles, Card, CardHeader, CardContent, Typography, LinearProgress, Tooltip, Button, Divider } from '@material-ui/core';
5
+ import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
6
+ import { usePermission } from '@backstage/plugin-permission-react';
7
+ import { qetaTranslationRef, useQetaApi, ObsoleteModal, ValidReviewModal } from '@drodil/backstage-plugin-qeta-react';
8
+ import CheckIcon from '@material-ui/icons/Check';
9
+ import BlockIcon from '@material-ui/icons/Block';
10
+ import { Alert } from '@material-ui/lab';
11
+ import { ReviewList } from './ReviewList.esm.js';
12
+
13
+ const useStyles = makeStyles((theme) => ({
14
+ card: {
15
+ marginBottom: theme.spacing(2)
16
+ },
17
+ cardHeader: {
18
+ paddingBottom: 0
19
+ },
20
+ scoreContainer: {
21
+ display: "flex",
22
+ alignItems: "center",
23
+ marginBottom: theme.spacing(1)
24
+ },
25
+ scoreLabel: {
26
+ flexGrow: 1,
27
+ marginRight: theme.spacing(2)
28
+ },
29
+ progressBar: {
30
+ flexGrow: 2,
31
+ height: 10,
32
+ borderRadius: 5
33
+ },
34
+ actions: {
35
+ marginTop: theme.spacing(2),
36
+ display: "flex",
37
+ justifyContent: "flex-end",
38
+ gap: theme.spacing(1)
39
+ },
40
+ obsoleteAlert: {
41
+ marginTop: theme.spacing(1)
42
+ },
43
+ divider: {
44
+ marginTop: theme.spacing(2),
45
+ marginBottom: theme.spacing(1)
46
+ }
47
+ }));
48
+ const ContentHealthCard = ({ post }) => {
49
+ const classes = useStyles();
50
+ const { t } = useTranslationRef(qetaTranslationRef);
51
+ const { allowed: canReview } = usePermission({
52
+ permission: qetaCreatePostReviewPermission
53
+ });
54
+ const { allowed: canRead } = usePermission({
55
+ permission: qetaReadPostReviewPermission
56
+ });
57
+ const { value: reviews } = useQetaApi(
58
+ (api) => api.getPostReviews(post.id),
59
+ [post.id]
60
+ );
61
+ const [openObsoleteModal, setOpenObsoleteModal] = useState(false);
62
+ const [openValidModal, setOpenValidModal] = useState(false);
63
+ const handleRefresh = () => {
64
+ window.location.reload();
65
+ };
66
+ if (!canRead) {
67
+ return null;
68
+ }
69
+ const getProgressColor = (score) => {
70
+ if (score > 70) return "primary";
71
+ if (score > 40) return "secondary";
72
+ return "secondary";
73
+ };
74
+ return /* @__PURE__ */ jsxs(Card, { className: classes.card, children: [
75
+ /* @__PURE__ */ jsx(
76
+ CardHeader,
77
+ {
78
+ title: t("contentHealth.cardTitle"),
79
+ titleTypographyProps: { variant: "h6" },
80
+ className: classes.cardHeader
81
+ }
82
+ ),
83
+ /* @__PURE__ */ jsxs(CardContent, { children: [
84
+ post.status !== "obsolete" && post.needsReview && /* @__PURE__ */ jsx(Typography, { variant: "body2", paragraph: true, children: t("contentHealth.description") }),
85
+ /* @__PURE__ */ jsx("div", { className: classes.scoreContainer, children: /* @__PURE__ */ jsx(Typography, { variant: "body1", className: classes.scoreLabel, children: t("contentHealth.healthScore", {
86
+ score: String(post.healthScore)
87
+ }) }) }),
88
+ /* @__PURE__ */ jsx(
89
+ LinearProgress,
90
+ {
91
+ variant: "determinate",
92
+ value: post.healthScore ?? 0,
93
+ className: classes.progressBar,
94
+ color: getProgressColor(post.healthScore ?? 0)
95
+ }
96
+ ),
97
+ post.status === "obsolete" && /* @__PURE__ */ jsx(Alert, { severity: "warning", className: classes.obsoleteAlert, children: t("contentHealth.obsoleteWarning") }),
98
+ canReview && (post.needsReview || post.status === "obsolete") && /* @__PURE__ */ jsxs("div", { className: classes.actions, children: [
99
+ /* @__PURE__ */ jsx(Tooltip, { title: t("contentHealth.markValid"), children: /* @__PURE__ */ jsx(
100
+ Button,
101
+ {
102
+ variant: "outlined",
103
+ color: "primary",
104
+ size: "small",
105
+ startIcon: /* @__PURE__ */ jsx(CheckIcon, {}),
106
+ onClick: () => setOpenValidModal(true),
107
+ children: t("contentHealth.valid")
108
+ }
109
+ ) }),
110
+ /* @__PURE__ */ jsx(Tooltip, { title: t("contentHealth.markObsolete"), children: /* @__PURE__ */ jsx(
111
+ Button,
112
+ {
113
+ variant: "outlined",
114
+ color: "secondary",
115
+ size: "small",
116
+ startIcon: /* @__PURE__ */ jsx(BlockIcon, {}),
117
+ onClick: () => setOpenObsoleteModal(true),
118
+ children: t("contentHealth.obsolete")
119
+ }
120
+ ) })
121
+ ] }),
122
+ /* @__PURE__ */ jsx(
123
+ ObsoleteModal,
124
+ {
125
+ open: openObsoleteModal,
126
+ onClose: () => setOpenObsoleteModal(false),
127
+ post,
128
+ onConfirm: handleRefresh
129
+ }
130
+ ),
131
+ /* @__PURE__ */ jsx(
132
+ ValidReviewModal,
133
+ {
134
+ open: openValidModal,
135
+ onClose: () => setOpenValidModal(false),
136
+ post,
137
+ onConfirm: handleRefresh
138
+ }
139
+ ),
140
+ reviews && reviews.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
141
+ /* @__PURE__ */ jsx(Divider, { className: classes.divider }),
142
+ /* @__PURE__ */ jsx(ReviewList, { reviews })
143
+ ] })
144
+ ] })
145
+ ] });
146
+ };
147
+
148
+ export { ContentHealthCard };
149
+ //# sourceMappingURL=ContentHealthCard.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContentHealthCard.esm.js","sources":["../../../src/components/ContentHealthCard/ContentHealthCard.tsx"],"sourcesContent":["import { useState } from 'react';\nimport {\n Post,\n qetaCreatePostReviewPermission,\n qetaReadPostReviewPermission,\n} from '@drodil/backstage-plugin-qeta-common';\nimport {\n Button,\n Typography,\n makeStyles,\n LinearProgress,\n Tooltip,\n Card,\n CardContent,\n CardHeader,\n Divider,\n} from '@material-ui/core';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { usePermission } from '@backstage/plugin-permission-react';\nimport {\n qetaTranslationRef,\n ObsoleteModal,\n ValidReviewModal,\n useQetaApi,\n} from '@drodil/backstage-plugin-qeta-react';\nimport CheckIcon from '@material-ui/icons/Check';\nimport BlockIcon from '@material-ui/icons/Block';\nimport { Alert } from '@material-ui/lab';\nimport { ReviewList } from './ReviewList';\n\nconst useStyles = makeStyles(theme => ({\n card: {\n marginBottom: theme.spacing(2),\n },\n cardHeader: {\n paddingBottom: 0,\n },\n scoreContainer: {\n display: 'flex',\n alignItems: 'center',\n marginBottom: theme.spacing(1),\n },\n scoreLabel: {\n flexGrow: 1,\n marginRight: theme.spacing(2),\n },\n progressBar: {\n flexGrow: 2,\n height: 10,\n borderRadius: 5,\n },\n actions: {\n marginTop: theme.spacing(2),\n display: 'flex',\n justifyContent: 'flex-end',\n gap: theme.spacing(1),\n },\n obsoleteAlert: {\n marginTop: theme.spacing(1),\n },\n divider: {\n marginTop: theme.spacing(2),\n marginBottom: theme.spacing(1),\n },\n}));\n\nexport const ContentHealthCard = ({ post }: { post: Post }) => {\n const classes = useStyles();\n const { t } = useTranslationRef(qetaTranslationRef);\n const { allowed: canReview } = usePermission({\n permission: qetaCreatePostReviewPermission,\n });\n const { allowed: canRead } = usePermission({\n permission: qetaReadPostReviewPermission,\n });\n\n const { value: reviews } = useQetaApi(\n api => api.getPostReviews(post.id),\n [post.id],\n );\n\n const [openObsoleteModal, setOpenObsoleteModal] = useState(false);\n const [openValidModal, setOpenValidModal] = useState(false);\n\n const handleRefresh = () => {\n window.location.reload();\n };\n\n if (!canRead) {\n return null;\n }\n\n const getProgressColor = (score: number) => {\n if (score > 70) return 'primary';\n if (score > 40) return 'secondary';\n return 'secondary';\n };\n\n return (\n <Card className={classes.card}>\n <CardHeader\n title={t('contentHealth.cardTitle')}\n titleTypographyProps={{ variant: 'h6' }}\n className={classes.cardHeader}\n />\n <CardContent>\n {post.status !== 'obsolete' && post.needsReview && (\n <Typography variant=\"body2\" paragraph>\n {t('contentHealth.description')}\n </Typography>\n )}\n <div className={classes.scoreContainer}>\n <Typography variant=\"body1\" className={classes.scoreLabel}>\n {t('contentHealth.healthScore', {\n score: String(post.healthScore),\n })}\n </Typography>\n </div>\n <LinearProgress\n variant=\"determinate\"\n value={post.healthScore ?? 0}\n className={classes.progressBar}\n color={getProgressColor(post.healthScore ?? 0)}\n />\n\n {post.status === 'obsolete' && (\n <Alert severity=\"warning\" className={classes.obsoleteAlert}>\n {t('contentHealth.obsoleteWarning')}\n </Alert>\n )}\n\n {canReview && (post.needsReview || post.status === 'obsolete') && (\n <div className={classes.actions}>\n <Tooltip title={t('contentHealth.markValid')}>\n <Button\n variant=\"outlined\"\n color=\"primary\"\n size=\"small\"\n startIcon={<CheckIcon />}\n onClick={() => setOpenValidModal(true)}\n >\n {t('contentHealth.valid')}\n </Button>\n </Tooltip>\n <Tooltip title={t('contentHealth.markObsolete')}>\n <Button\n variant=\"outlined\"\n color=\"secondary\"\n size=\"small\"\n startIcon={<BlockIcon />}\n onClick={() => setOpenObsoleteModal(true)}\n >\n {t('contentHealth.obsolete')}\n </Button>\n </Tooltip>\n </div>\n )}\n\n <ObsoleteModal\n open={openObsoleteModal}\n onClose={() => setOpenObsoleteModal(false)}\n post={post}\n onConfirm={handleRefresh}\n />\n <ValidReviewModal\n open={openValidModal}\n onClose={() => setOpenValidModal(false)}\n post={post}\n onConfirm={handleRefresh}\n />\n\n {reviews && reviews.length > 0 && (\n <>\n <Divider className={classes.divider} />\n <ReviewList reviews={reviews} />\n </>\n )}\n </CardContent>\n </Card>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
2
+ import { makeStyles, Typography, List, ListItem, ListItemText } from '@material-ui/core';
3
+ import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
4
+ import { qetaTranslationRef, UserLink, RelativeTimeWithTooltip } from '@drodil/backstage-plugin-qeta-react';
5
+
6
+ const useStyles = makeStyles((theme) => ({
7
+ reviewList: {
8
+ padding: 0,
9
+ marginTop: theme.spacing(1)
10
+ },
11
+ reviewItem: {
12
+ paddingLeft: 0,
13
+ paddingRight: 0,
14
+ paddingTop: theme.spacing(0.5),
15
+ paddingBottom: theme.spacing(0.5),
16
+ borderBottom: `1px solid ${theme.palette.divider}`,
17
+ "&:last-child": {
18
+ borderBottom: "none"
19
+ }
20
+ },
21
+ reviewMeta: {
22
+ display: "flex",
23
+ alignItems: "baseline",
24
+ gap: theme.spacing(0.5),
25
+ flexWrap: "wrap"
26
+ },
27
+ reviewUserLink: {
28
+ fontSize: "0.75rem"
29
+ },
30
+ reviewStatus: {
31
+ fontWeight: 500
32
+ },
33
+ reviewComment: {
34
+ marginTop: theme.spacing(0.25),
35
+ fontSize: "0.8rem"
36
+ }
37
+ }));
38
+ const ReviewList = ({ reviews }) => {
39
+ const classes = useStyles();
40
+ const { t } = useTranslationRef(qetaTranslationRef);
41
+ if (!reviews || reviews.length === 0) {
42
+ return null;
43
+ }
44
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
45
+ /* @__PURE__ */ jsx(Typography, { variant: "subtitle2", children: t("contentHealth.reviewHistory", {}) }),
46
+ /* @__PURE__ */ jsx(List, { className: classes.reviewList, children: reviews.map((review) => /* @__PURE__ */ jsx(ListItem, { className: classes.reviewItem, dense: true, children: /* @__PURE__ */ jsx(
47
+ ListItemText,
48
+ {
49
+ primary: /* @__PURE__ */ jsxs("div", { className: classes.reviewMeta, children: [
50
+ /* @__PURE__ */ jsx("span", { className: classes.reviewUserLink, children: /* @__PURE__ */ jsx(UserLink, { entityRef: review.reviewer }) }),
51
+ /* @__PURE__ */ jsx(
52
+ Typography,
53
+ {
54
+ variant: "caption",
55
+ className: classes.reviewStatus,
56
+ color: review.status === "valid" ? "primary" : "secondary",
57
+ children: review.status === "valid" ? t("contentHealth.valid") : t("contentHealth.obsolete")
58
+ }
59
+ ),
60
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "textSecondary", children: /* @__PURE__ */ jsx(RelativeTimeWithTooltip, { value: review.created }) })
61
+ ] }),
62
+ secondary: review.comment ? /* @__PURE__ */ jsx(
63
+ Typography,
64
+ {
65
+ variant: "body2",
66
+ color: "textSecondary",
67
+ className: classes.reviewComment,
68
+ children: review.comment
69
+ }
70
+ ) : null
71
+ }
72
+ ) }, review.id)) })
73
+ ] });
74
+ };
75
+
76
+ export { ReviewList };
77
+ //# sourceMappingURL=ReviewList.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReviewList.esm.js","sources":["../../../src/components/ContentHealthCard/ReviewList.tsx"],"sourcesContent":["import { PostReview } from '@drodil/backstage-plugin-qeta-common';\nimport {\n Typography,\n makeStyles,\n List,\n ListItem,\n ListItemText,\n} from '@material-ui/core';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport {\n qetaTranslationRef,\n UserLink,\n RelativeTimeWithTooltip,\n} from '@drodil/backstage-plugin-qeta-react';\n\nconst useStyles = makeStyles(theme => ({\n reviewList: {\n padding: 0,\n marginTop: theme.spacing(1),\n },\n reviewItem: {\n paddingLeft: 0,\n paddingRight: 0,\n paddingTop: theme.spacing(0.5),\n paddingBottom: theme.spacing(0.5),\n borderBottom: `1px solid ${theme.palette.divider}`,\n '&:last-child': {\n borderBottom: 'none',\n },\n },\n reviewMeta: {\n display: 'flex',\n alignItems: 'baseline',\n gap: theme.spacing(0.5),\n flexWrap: 'wrap',\n },\n reviewUserLink: {\n fontSize: '0.75rem',\n },\n reviewStatus: {\n fontWeight: 500,\n },\n reviewComment: {\n marginTop: theme.spacing(0.25),\n fontSize: '0.8rem',\n },\n}));\n\nexport const ReviewList = ({ reviews }: { reviews: PostReview[] }) => {\n const classes = useStyles();\n const { t } = useTranslationRef(qetaTranslationRef);\n\n if (!reviews || reviews.length === 0) {\n return null;\n }\n\n return (\n <>\n <Typography variant=\"subtitle2\">\n {t('contentHealth.reviewHistory', {})}\n </Typography>\n <List className={classes.reviewList}>\n {reviews.map(review => (\n <ListItem key={review.id} className={classes.reviewItem} dense>\n <ListItemText\n primary={\n <div className={classes.reviewMeta}>\n <span className={classes.reviewUserLink}>\n <UserLink entityRef={review.reviewer} />\n </span>\n <Typography\n variant=\"caption\"\n className={classes.reviewStatus}\n color={review.status === 'valid' ? 'primary' : 'secondary'}\n >\n {review.status === 'valid'\n ? t('contentHealth.valid')\n : t('contentHealth.obsolete')}\n </Typography>\n <Typography variant=\"caption\" color=\"textSecondary\">\n <RelativeTimeWithTooltip value={review.created} />\n </Typography>\n </div>\n }\n secondary={\n review.comment ? (\n <Typography\n variant=\"body2\"\n color=\"textSecondary\"\n className={classes.reviewComment}\n >\n {review.comment}\n </Typography>\n ) : null\n }\n />\n </ListItem>\n ))}\n </List>\n </>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -1,13 +1,13 @@
1
1
  import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import { Page, Header, Content } from '@backstage/core-components';
3
- import { Routes, Route } from 'react-router-dom';
3
+ import { useLocation, Routes, Route } from 'react-router-dom';
4
4
  import { AskPage } from '../AskPage/AskPage.esm.js';
5
5
  import { QuestionPage } from '../QuestionPage/QuestionPage.esm.js';
6
6
  import { TagPage } from '../TagPage/TagPage.esm.js';
7
7
  import { UserPage } from '../UserPage/UserPage.esm.js';
8
8
  import { FavoritePage } from '../FavoritePage/FavoritePage.esm.js';
9
9
  import { StatisticsPage } from '../Statistics/StatisticsPage.esm.js';
10
- import { QetaProvider, LeftMenuButton, LeftMenu, questionsRouteRef, askRouteRef, articlesRouteRef, writeRouteRef, linksRouteRef, createLinkRouteRef, favoriteQuestionsRouteRef, editQuestionRouteRef, editArticleRouteRef, editLinkRouteRef, questionRouteRef, linkRouteRef, articleRouteRef, tagsRouteRef, tagRouteRef, usersRouteRef, userRouteRef, statisticsRouteRef, collectionsRouteRef, collectionCreateRouteRef, collectionEditRouteRef, collectionRouteRef, entitiesRouteRef, entityRouteRef, moderatorRouteRef } from '@drodil/backstage-plugin-qeta-react';
10
+ import { QetaProvider, LeftMenuButton, LeftMenu, questionsRouteRef, askRouteRef, articlesRouteRef, writeRouteRef, linksRouteRef, createLinkRouteRef, favoriteQuestionsRouteRef, editQuestionRouteRef, editArticleRouteRef, editLinkRouteRef, questionRouteRef, linkRouteRef, articleRouteRef, tagsRouteRef, tagRouteRef, usersRouteRef, userRouteRef, statisticsRouteRef, collectionsRouteRef, collectionCreateRouteRef, collectionEditRouteRef, collectionRouteRef, entitiesRouteRef, entityRouteRef, moderatorRouteRef, reviewRouteRef } from '@drodil/backstage-plugin-qeta-react';
11
11
  import { QuestionsPage } from '../QuestionsPage/QuestionsPage.esm.js';
12
12
  import { HomePage } from '../HomePage/HomePage.esm.js';
13
13
  import { ArticlesPage } from '../ArticlesPage/ArticlesPage.esm.js';
@@ -22,6 +22,7 @@ import { CollectionCreatePage } from '../CollectionCreatePage/CollectionCreatePa
22
22
  import { EntityPage } from '../EntityPage/EntityPage.esm.js';
23
23
  import { UsersPage } from '../UsersPage/UsersPage.esm.js';
24
24
  import { ModeratorPage } from '../ModeratorPage/ModeratorPage.esm.js';
25
+ import { ReviewPage } from '../ReviewPage/ReviewPage.esm.js';
25
26
  import { makeStyles, Container, Grid, Box } from '@material-ui/core';
26
27
  import { useSidebarSettings } from '../../hooks/useSidebarSettings.esm.js';
27
28
  import { RightContent } from '../RightContent/RightContent.esm.js';
@@ -76,6 +77,8 @@ const QetaPage = (props) => {
76
77
  rehypePlugins
77
78
  } = props ?? {};
78
79
  const { leftCompact, rightCompact, toggleLeft, toggleRight } = useSidebarSettings();
80
+ const location = useLocation();
81
+ const hideRightSidebar = location.pathname.includes("/review") || location.pathname.includes("/moderate");
79
82
  const classes = useStyles({
80
83
  leftCompact,
81
84
  rightCompact
@@ -221,9 +224,10 @@ const QetaPage = (props) => {
221
224
  path: moderatorRouteRef.path,
222
225
  element: /* @__PURE__ */ jsx(ModeratorPage, {})
223
226
  }
224
- )
227
+ ),
228
+ /* @__PURE__ */ jsx(Route, { path: reviewRouteRef.path, element: /* @__PURE__ */ jsx(ReviewPage, {}) })
225
229
  ] }) }),
226
- /* @__PURE__ */ jsx(Grid, { item: true, className: classes.rightSidebarColumn, children: /* @__PURE__ */ jsx(RightContent, { compact: rightCompact, onToggle: toggleRight }) })
230
+ !hideRightSidebar && /* @__PURE__ */ jsx(Grid, { item: true, className: classes.rightSidebarColumn, children: /* @__PURE__ */ jsx(RightContent, { compact: rightCompact, onToggle: toggleRight }) })
227
231
  ] }) })
228
232
  ] })
229
233
  ] }) });
@@ -1 +1 @@
1
- {"version":3,"file":"QetaPage.esm.js","sources":["../../../src/components/QetaPage/QetaPage.tsx"],"sourcesContent":["import { ReactNode } from 'react';\nimport { Content, Header, Page } from '@backstage/core-components';\nimport { Route, Routes } from 'react-router-dom';\nimport { AskPage } from '../AskPage';\nimport { QuestionPage } from '../QuestionPage/QuestionPage';\nimport { TagPage } from '../TagPage/TagPage';\nimport { UserPage } from '../UserPage/UserPage';\nimport { FavoritePage } from '../FavoritePage/FavoritePage';\nimport { StatisticsPage } from '../Statistics';\nimport {\n articleRouteRef,\n articlesRouteRef,\n askRouteRef,\n collectionCreateRouteRef,\n collectionEditRouteRef,\n collectionRouteRef,\n collectionsRouteRef,\n createLinkRouteRef,\n editArticleRouteRef,\n editLinkRouteRef,\n editQuestionRouteRef,\n entitiesRouteRef,\n entityRouteRef,\n favoriteQuestionsRouteRef,\n LeftMenu,\n LeftMenuButton,\n linkRouteRef,\n linksRouteRef,\n moderatorRouteRef,\n QetaProvider,\n questionRouteRef,\n questionsRouteRef,\n statisticsRouteRef,\n tagRouteRef,\n tagsRouteRef,\n userRouteRef,\n usersRouteRef,\n writeRouteRef,\n} from '@drodil/backstage-plugin-qeta-react';\nimport { QuestionsPage } from '../QuestionsPage/QuestionsPage';\nimport { HomePage } from '../HomePage/HomePage';\nimport { ArticlesPage } from '../ArticlesPage/ArticlesPage';\nimport { WritePage } from '../WritePage/WritePage';\nimport { ArticlePage } from '../ArticlePage/ArticlePage';\nimport { LinksPage } from '../LinksPage/LinksPage.tsx';\nimport { LinkPage } from '../LinkPage/LinkPage.tsx';\nimport { CreateLinkPage } from '../CreateLinkPage/CreateLinkPage.tsx';\nimport { CollectionsPage } from '../CollectionsPage/CollectionsPage';\nimport { CollectionPage } from '../CollectionPage/CollectionPage';\nimport { CollectionCreatePage } from '../CollectionCreatePage/CollectionCreatePage';\nimport { EntityPage } from '../EntityPage/EntityPage';\nimport { UsersPage } from '../UsersPage/UsersPage';\nimport { ModeratorPage } from '../ModeratorPage/ModeratorPage';\nimport { Box, Container, Grid, makeStyles } from '@material-ui/core';\nimport { useSidebarSettings } from '../../hooks/useSidebarSettings';\nimport { RightContent } from '../RightContent/RightContent';\nimport type { PluggableList } from 'unified';\n\ntype Props = {\n title?: string;\n subtitle?: string;\n headerElements?: ReactNode[];\n themeId?: string;\n headerTooltip?: string;\n headerType?: string;\n headerTypeLink?: string;\n introElement?: ReactNode;\n remarkPlugins?: PluggableList;\n rehypePlugins?: PluggableList;\n};\n\ntype StyleProps = {\n leftCompact: boolean;\n rightCompact: boolean;\n};\n\nconst useStyles = makeStyles(theme => ({\n sidebarColumn: {\n padding: 0,\n transition: 'all 0.2s ease-in-out',\n flexShrink: 0,\n [theme.breakpoints.up('lg')]: {\n width: (props: StyleProps) => (props.leftCompact ? 72 : 220),\n minWidth: (props: StyleProps) => (props.leftCompact ? 72 : 220),\n },\n [theme.breakpoints.down('md')]: {\n width: '100%',\n marginBottom: theme.spacing(1),\n },\n },\n rightSidebarColumn: {\n padding: 0,\n transition: 'all 0.2s ease-in-out',\n flexShrink: 0,\n [theme.breakpoints.up('lg')]: {\n width: (props: StyleProps) => (props.rightCompact ? 72 : 300),\n minWidth: (props: StyleProps) => (props.rightCompact ? 72 : 300),\n },\n [theme.breakpoints.down('md')]: {\n width: '100%',\n marginTop: theme.spacing(1),\n },\n },\n mainColumn: {\n paddingRight: 0,\n minWidth: 0,\n transition: 'all 0.2s ease-in-out',\n [theme.breakpoints.down('md')]: {\n paddingLeft: 0,\n },\n },\n}));\n\nexport const QetaPage = (props?: Props) => {\n const {\n title = 'Q&A',\n subtitle,\n headerElements,\n themeId = 'tool',\n headerTooltip,\n headerType,\n headerTypeLink,\n introElement,\n remarkPlugins,\n rehypePlugins,\n } = props ?? {};\n const { leftCompact, rightCompact, toggleLeft, toggleRight } =\n useSidebarSettings();\n\n const classes = useStyles({\n leftCompact,\n rightCompact,\n });\n\n return (\n <QetaProvider remarkPlugins={remarkPlugins} rehypePlugins={rehypePlugins}>\n <Page themeId={themeId}>\n <Header\n title={title}\n subtitle={subtitle}\n type={headerType}\n typeLink={headerTypeLink}\n tooltip={headerTooltip}\n >\n {headerElements}\n </Header>\n <Content className=\"qetaHomePage\">\n {introElement}\n <Container maxWidth=\"xl\">\n <Grid container spacing={3} justifyContent=\"flex-start\">\n <Grid item className={classes.sidebarColumn}>\n <Box display={{ xs: 'block', lg: 'none' }}>\n <LeftMenuButton />\n </Box>\n <Box display={{ xs: 'none', lg: 'block' }}>\n <LeftMenu compact={leftCompact} onToggle={toggleLeft} />\n </Box>\n </Grid>\n <Grid item xs className={classes.mainColumn}>\n <Routes>\n <Route path=\"/\" element={<HomePage />} />\n <Route\n path={questionsRouteRef.path}\n element={<QuestionsPage />}\n />\n <Route path={askRouteRef.path} element={<AskPage />} />\n <Route\n path={articlesRouteRef.path}\n element={<ArticlesPage />}\n />\n <Route path={writeRouteRef.path} element={<WritePage />} />\n <Route path={linksRouteRef.path} element={<LinksPage />} />\n <Route\n path={createLinkRouteRef.path}\n element={<CreateLinkPage />}\n />\n <Route\n path={favoriteQuestionsRouteRef.path}\n element={<FavoritePage />}\n />\n <Route\n path={editQuestionRouteRef.path}\n element={<AskPage />}\n />\n <Route\n path={editArticleRouteRef.path}\n element={<WritePage />}\n />\n <Route\n path={editLinkRouteRef.path}\n element={<CreateLinkPage />}\n />\n <Route\n path={questionRouteRef.path}\n element={<QuestionPage />}\n />\n <Route path={linkRouteRef.path} element={<LinkPage />} />\n <Route\n path={articleRouteRef.path}\n element={<ArticlePage />}\n />\n <Route path={tagsRouteRef.path} element={<TagPage />} />\n <Route path={tagRouteRef.path} element={<TagPage />} />\n <Route path={usersRouteRef.path} element={<UsersPage />} />\n <Route path={userRouteRef.path} element={<UserPage />} />\n <Route\n path={statisticsRouteRef.path}\n element={<StatisticsPage />}\n />\n <Route\n path={collectionsRouteRef.path}\n element={<CollectionsPage />}\n />\n <Route\n path={collectionCreateRouteRef.path}\n element={<CollectionCreatePage />}\n />\n <Route\n path={collectionEditRouteRef.path}\n element={<CollectionCreatePage />}\n />\n <Route\n path={collectionRouteRef.path}\n element={<CollectionPage />}\n />\n <Route\n path={entitiesRouteRef.path}\n element={<EntityPage />}\n />\n <Route path={entityRouteRef.path} element={<EntityPage />} />\n <Route\n path={moderatorRouteRef.path}\n element={<ModeratorPage />}\n />\n </Routes>\n </Grid>\n <Grid item className={classes.rightSidebarColumn}>\n <RightContent compact={rightCompact} onToggle={toggleRight} />\n </Grid>\n </Grid>\n </Container>\n </Content>\n </Page>\n </QetaProvider>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"QetaPage.esm.js","sources":["../../../src/components/QetaPage/QetaPage.tsx"],"sourcesContent":["import { ReactNode } from 'react';\nimport { Content, Header, Page } from '@backstage/core-components';\nimport { Route, Routes, useLocation } from 'react-router-dom';\nimport { AskPage } from '../AskPage';\nimport { QuestionPage } from '../QuestionPage/QuestionPage';\nimport { TagPage } from '../TagPage/TagPage';\nimport { UserPage } from '../UserPage/UserPage';\nimport { FavoritePage } from '../FavoritePage/FavoritePage';\nimport { StatisticsPage } from '../Statistics';\nimport {\n articleRouteRef,\n articlesRouteRef,\n askRouteRef,\n collectionCreateRouteRef,\n collectionEditRouteRef,\n collectionRouteRef,\n collectionsRouteRef,\n createLinkRouteRef,\n editArticleRouteRef,\n editLinkRouteRef,\n editQuestionRouteRef,\n entitiesRouteRef,\n entityRouteRef,\n favoriteQuestionsRouteRef,\n LeftMenu,\n LeftMenuButton,\n linkRouteRef,\n linksRouteRef,\n moderatorRouteRef,\n QetaProvider,\n questionRouteRef,\n questionsRouteRef,\n statisticsRouteRef,\n tagRouteRef,\n tagsRouteRef,\n userRouteRef,\n usersRouteRef,\n writeRouteRef,\n reviewRouteRef,\n} from '@drodil/backstage-plugin-qeta-react';\nimport { QuestionsPage } from '../QuestionsPage/QuestionsPage';\nimport { HomePage } from '../HomePage/HomePage';\nimport { ArticlesPage } from '../ArticlesPage/ArticlesPage';\nimport { WritePage } from '../WritePage/WritePage';\nimport { ArticlePage } from '../ArticlePage/ArticlePage';\nimport { LinksPage } from '../LinksPage/LinksPage.tsx';\nimport { LinkPage } from '../LinkPage/LinkPage.tsx';\nimport { CreateLinkPage } from '../CreateLinkPage/CreateLinkPage.tsx';\nimport { CollectionsPage } from '../CollectionsPage/CollectionsPage';\nimport { CollectionPage } from '../CollectionPage/CollectionPage';\nimport { CollectionCreatePage } from '../CollectionCreatePage/CollectionCreatePage';\nimport { EntityPage } from '../EntityPage/EntityPage';\nimport { UsersPage } from '../UsersPage/UsersPage';\nimport { ModeratorPage } from '../ModeratorPage/ModeratorPage';\nimport { ReviewPage } from '../ReviewPage/ReviewPage';\nimport { Box, Container, Grid, makeStyles } from '@material-ui/core';\nimport { useSidebarSettings } from '../../hooks/useSidebarSettings';\nimport { RightContent } from '../RightContent/RightContent';\nimport type { PluggableList } from 'unified';\n\ntype Props = {\n title?: string;\n subtitle?: string;\n headerElements?: ReactNode[];\n themeId?: string;\n headerTooltip?: string;\n headerType?: string;\n headerTypeLink?: string;\n introElement?: ReactNode;\n remarkPlugins?: PluggableList;\n rehypePlugins?: PluggableList;\n};\n\ntype StyleProps = {\n leftCompact: boolean;\n rightCompact: boolean;\n};\n\nconst useStyles = makeStyles(theme => ({\n sidebarColumn: {\n padding: 0,\n transition: 'all 0.2s ease-in-out',\n flexShrink: 0,\n [theme.breakpoints.up('lg')]: {\n width: (props: StyleProps) => (props.leftCompact ? 72 : 220),\n minWidth: (props: StyleProps) => (props.leftCompact ? 72 : 220),\n },\n [theme.breakpoints.down('md')]: {\n width: '100%',\n marginBottom: theme.spacing(1),\n },\n },\n rightSidebarColumn: {\n padding: 0,\n transition: 'all 0.2s ease-in-out',\n flexShrink: 0,\n [theme.breakpoints.up('lg')]: {\n width: (props: StyleProps) => (props.rightCompact ? 72 : 300),\n minWidth: (props: StyleProps) => (props.rightCompact ? 72 : 300),\n },\n [theme.breakpoints.down('md')]: {\n width: '100%',\n marginTop: theme.spacing(1),\n },\n },\n mainColumn: {\n paddingRight: 0,\n minWidth: 0,\n transition: 'all 0.2s ease-in-out',\n [theme.breakpoints.down('md')]: {\n paddingLeft: 0,\n },\n },\n}));\n\nexport const QetaPage = (props?: Props) => {\n const {\n title = 'Q&A',\n subtitle,\n headerElements,\n themeId = 'tool',\n headerTooltip,\n headerType,\n headerTypeLink,\n introElement,\n remarkPlugins,\n rehypePlugins,\n } = props ?? {};\n const { leftCompact, rightCompact, toggleLeft, toggleRight } =\n useSidebarSettings();\n const location = useLocation();\n\n // Hide right sidebar on review and moderator pages\n const hideRightSidebar =\n location.pathname.includes('/review') ||\n location.pathname.includes('/moderate');\n\n const classes = useStyles({\n leftCompact,\n rightCompact,\n });\n\n return (\n <QetaProvider remarkPlugins={remarkPlugins} rehypePlugins={rehypePlugins}>\n <Page themeId={themeId}>\n <Header\n title={title}\n subtitle={subtitle}\n type={headerType}\n typeLink={headerTypeLink}\n tooltip={headerTooltip}\n >\n {headerElements}\n </Header>\n <Content className=\"qetaHomePage\">\n {introElement}\n <Container maxWidth=\"xl\">\n <Grid container spacing={3} justifyContent=\"flex-start\">\n <Grid item className={classes.sidebarColumn}>\n <Box display={{ xs: 'block', lg: 'none' }}>\n <LeftMenuButton />\n </Box>\n <Box display={{ xs: 'none', lg: 'block' }}>\n <LeftMenu compact={leftCompact} onToggle={toggleLeft} />\n </Box>\n </Grid>\n <Grid item xs className={classes.mainColumn}>\n <Routes>\n <Route path=\"/\" element={<HomePage />} />\n <Route\n path={questionsRouteRef.path}\n element={<QuestionsPage />}\n />\n <Route path={askRouteRef.path} element={<AskPage />} />\n <Route\n path={articlesRouteRef.path}\n element={<ArticlesPage />}\n />\n <Route path={writeRouteRef.path} element={<WritePage />} />\n <Route path={linksRouteRef.path} element={<LinksPage />} />\n <Route\n path={createLinkRouteRef.path}\n element={<CreateLinkPage />}\n />\n <Route\n path={favoriteQuestionsRouteRef.path}\n element={<FavoritePage />}\n />\n <Route\n path={editQuestionRouteRef.path}\n element={<AskPage />}\n />\n <Route\n path={editArticleRouteRef.path}\n element={<WritePage />}\n />\n <Route\n path={editLinkRouteRef.path}\n element={<CreateLinkPage />}\n />\n <Route\n path={questionRouteRef.path}\n element={<QuestionPage />}\n />\n <Route path={linkRouteRef.path} element={<LinkPage />} />\n <Route\n path={articleRouteRef.path}\n element={<ArticlePage />}\n />\n <Route path={tagsRouteRef.path} element={<TagPage />} />\n <Route path={tagRouteRef.path} element={<TagPage />} />\n <Route path={usersRouteRef.path} element={<UsersPage />} />\n <Route path={userRouteRef.path} element={<UserPage />} />\n <Route\n path={statisticsRouteRef.path}\n element={<StatisticsPage />}\n />\n <Route\n path={collectionsRouteRef.path}\n element={<CollectionsPage />}\n />\n <Route\n path={collectionCreateRouteRef.path}\n element={<CollectionCreatePage />}\n />\n <Route\n path={collectionEditRouteRef.path}\n element={<CollectionCreatePage />}\n />\n <Route\n path={collectionRouteRef.path}\n element={<CollectionPage />}\n />\n <Route\n path={entitiesRouteRef.path}\n element={<EntityPage />}\n />\n <Route path={entityRouteRef.path} element={<EntityPage />} />\n <Route\n path={moderatorRouteRef.path}\n element={<ModeratorPage />}\n />\n <Route path={reviewRouteRef.path} element={<ReviewPage />} />\n </Routes>\n </Grid>\n {!hideRightSidebar && (\n <Grid item className={classes.rightSidebarColumn}>\n <RightContent compact={rightCompact} onToggle={toggleRight} />\n </Grid>\n )}\n </Grid>\n </Container>\n </Content>\n </Page>\n </QetaProvider>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
2
  import { useState, useEffect, useCallback, useMemo, Fragment as Fragment$1 } from 'react';
3
3
  import { WarningPanel } from '@backstage/core-components';
4
4
  import { useParams } from 'react-router-dom';
5
- import { qetaTranslationRef, useQetaApi, ContentHeader, AskQuestionButton, ContentHeaderButton, AddToCollectionButton, DraftBanner, DeletedBanner, QuestionCard, AIAnswerCard, AnswerCard, AnswerForm, RelativeTimeWithTooltip, UpdatedByLink } from '@drodil/backstage-plugin-qeta-react';
5
+ import { qetaTranslationRef, useQetaApi, ContentHeader, AskQuestionButton, ContentHeaderButton, AddToCollectionButton, DraftBanner, DeletedBanner, ObsoleteBanner, QuestionCard, AIAnswerCard, AnswerCard, AnswerForm, RelativeTimeWithTooltip, UpdatedByLink } from '@drodil/backstage-plugin-qeta-react';
6
6
  import Comment from '@material-ui/icons/Comment';
7
7
  import { useSignal } from '@backstage/plugin-signals-react';
8
8
  import { makeStyles, Box, Grid, Typography, FormControl, TextField, MenuItem } from '@material-ui/core';
@@ -163,6 +163,7 @@ const QuestionPage = () => {
163
163
  }
164
164
  },
165
165
  icon: /* @__PURE__ */ jsx(Comment, {}),
166
+ disabled: question.status === "obsolete",
166
167
  children: t("questionPage.answerButton")
167
168
  }
168
169
  ),
@@ -172,9 +173,10 @@ const QuestionPage = () => {
172
173
  ),
173
174
  question.status === "draft" && /* @__PURE__ */ jsx(DraftBanner, {}),
174
175
  question.status === "deleted" && /* @__PURE__ */ jsx(DeletedBanner, {}),
176
+ question.status === "obsolete" && /* @__PURE__ */ jsx(ObsoleteBanner, {}),
175
177
  /* @__PURE__ */ jsx(QuestionCard, { question }),
176
178
  /* @__PURE__ */ jsx(AIAnswerCard, { question, debounceMs: 0 }),
177
- question.status === "active" && /* @__PURE__ */ jsxs(Fragment, { children: [
179
+ (question.status === "active" || question.status === "obsolete") && /* @__PURE__ */ jsxs(Fragment, { children: [
178
180
  /* @__PURE__ */ jsx(Box, { sx: { mt: 3, mb: 2 }, children: /* @__PURE__ */ jsxs(Grid, { container: true, justifyContent: "space-between", alignItems: "center", children: [
179
181
  /* @__PURE__ */ jsx(Grid, { item: true, children: /* @__PURE__ */ jsx(Typography, { variant: "h6", children: t("common.answersCount", {
180
182
  count: answersCount
@@ -225,7 +227,7 @@ const QuestionPage = () => {
225
227
  }
226
228
  ) }, a.id) }, a.id);
227
229
  }),
228
- /* @__PURE__ */ jsx("div", { id: "qeta-answer-form", children: /* @__PURE__ */ jsx(AnswerForm, { post: question, onPost: onAnswerPost }) })
230
+ question.status === "active" && /* @__PURE__ */ jsx("div", { id: "qeta-answer-form", children: /* @__PURE__ */ jsx(AnswerForm, { post: question, onPost: onAnswerPost }) })
229
231
  ] })
230
232
  ] });
231
233
  };
@@ -1 +1 @@
1
- {"version":3,"file":"QuestionPage.esm.js","sources":["../../../src/components/QuestionPage/QuestionPage.tsx"],"sourcesContent":["import { Fragment, useCallback, useEffect, useMemo, useState } from 'react';\nimport { WarningPanel } from '@backstage/core-components';\nimport { useParams } from 'react-router-dom';\nimport {\n AddToCollectionButton,\n AIAnswerCard,\n AnswerCard,\n AnswerForm,\n AskQuestionButton,\n ContentHeader,\n ContentHeaderButton,\n DeletedBanner,\n DraftBanner,\n qetaTranslationRef,\n QuestionCard,\n RelativeTimeWithTooltip,\n UpdatedByLink,\n useQetaApi,\n} from '@drodil/backstage-plugin-qeta-react';\nimport Comment from '@material-ui/icons/Comment';\nimport {\n Answer,\n AnswerResponse,\n PostResponse,\n QetaSignal,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { useSignal } from '@backstage/plugin-signals-react';\nimport {\n Box,\n FormControl,\n Grid,\n makeStyles,\n MenuItem,\n TextField,\n Typography,\n} from '@material-ui/core';\nimport { Skeleton } from '@material-ui/lab';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport HelpOutline from '@material-ui/icons/HelpOutline';\n\nconst useDescriptionStyles = makeStyles(\n () => ({\n root: {},\n box: {\n display: 'inline',\n },\n }),\n { name: 'QetaDescription' },\n);\n\nexport const QuestionPage = () => {\n const { id } = useParams();\n const { t } = useTranslationRef(qetaTranslationRef);\n const [answers, setAnswers] = useState<AnswerResponse[]>([]);\n const [newAnswers, setNewAnswers] = useState<AnswerResponse[]>([]);\n const [answerSort, setAnswerSort] = useState<string>('default');\n const dStyles = useDescriptionStyles();\n\n const [answersCount, setAnswersCount] = useState(0);\n const [views, setViews] = useState(0);\n\n const { lastSignal } = useSignal<QetaSignal>(`qeta:post_${id}`);\n\n const {\n value: question,\n loading,\n error,\n } = useQetaApi(api => api.getPost(id), [id]);\n\n useEffect(() => {\n if (question) {\n setAnswersCount(question.answersCount);\n setViews(question.views);\n setAnswers(question.answers ?? []);\n }\n }, [question]);\n\n useEffect(() => {\n if (lastSignal?.type === 'post_stats') {\n setAnswersCount(lastSignal.answersCount);\n setViews(lastSignal.views);\n }\n }, [lastSignal]);\n\n const sortAnswers = useCallback(\n (a: Answer, b: Answer) => {\n if (answerSort === 'default') {\n return 1;\n }\n\n const parts = answerSort.split('_');\n const field = parts[0];\n const order = parts[1];\n\n let ret = -1;\n switch (field) {\n case 'created':\n ret = a.created > b.created ? -1 : 1;\n break;\n case 'score':\n ret = a.score > b.score ? -1 : 1;\n break;\n case 'author':\n ret = a.author > b.author ? -1 : 1;\n break;\n case 'comments':\n ret = (a.comments?.length ?? 0) > (b.comments?.length ?? 0) ? -1 : 1;\n break;\n case 'updated':\n ret = (a.updated ?? a.created) > (b.updated ?? b.created) ? -1 : 1;\n break;\n default:\n return 1;\n }\n\n if (order === 'desc') {\n ret *= -1;\n }\n return ret;\n },\n [answerSort],\n );\n\n const sortedAnswers = useMemo(() => {\n const allAnswers = [...answers, ...newAnswers];\n return allAnswers.sort(sortAnswers);\n }, [answers, newAnswers, sortAnswers]);\n\n const onAnswerPost = (answer: AnswerResponse) => {\n setNewAnswers(newAnswers.concat([answer]));\n setAnswersCount(prev => prev + 1);\n };\n\n const onAnswerDelete = (answer: AnswerResponse) => {\n setNewAnswers(newAnswers.filter(a => a.id !== answer.id));\n setAnswers(answers.filter(a => a.id !== answer.id));\n setAnswersCount(prev => prev - 1);\n };\n\n const getDescription = (q: PostResponse) => {\n return (\n <span className={dStyles.root}>\n <Box fontWeight=\"fontWeightMedium\" className={dStyles.box}>\n {t('authorBox.postedAtTime')}{' '}\n <RelativeTimeWithTooltip value={q.created} />\n {' · '}\n </Box>\n {q.updated && (\n <Fragment>\n <Box fontWeight=\"fontWeightMedium\" className={dStyles.box}>\n {t('authorBox.updatedAtTime')}{' '}\n <RelativeTimeWithTooltip value={q.updated} />{' '}\n {t('authorBox.updatedBy')} <UpdatedByLink entity={q} />\n {' · '}\n </Box>\n </Fragment>\n )}\n <Box fontWeight=\"fontWeightMedium\" className={dStyles.box}>\n {t('common.viewsCount', { count: views })}\n </Box>\n </span>\n );\n };\n\n if (loading) {\n return (\n <Box role=\"status\" aria-label={t('common.loading')}>\n <Skeleton variant=\"rect\" height={200} animation=\"wave\" />\n <Box mt={2}>\n <Skeleton variant=\"text\" height={40} width=\"60%\" animation=\"wave\" />\n <Skeleton variant=\"text\" height={20} width=\"40%\" animation=\"wave\" />\n <Skeleton variant=\"text\" height={20} width=\"80%\" animation=\"wave\" />\n </Box>\n </Box>\n );\n }\n\n if (error || question === undefined) {\n return (\n <WarningPanel\n severity=\"error\"\n title={t('questionPage.errorLoading')}\n aria-live=\"assertive\"\n >\n {error?.message}\n </WarningPanel>\n );\n }\n\n if (question.type !== 'question') {\n return (\n <WarningPanel title=\"Not found\" message={t('questionPage.notFound')} />\n );\n }\n\n return (\n <>\n <ContentHeader\n title={question.title}\n description={getDescription(question)}\n titleIcon={<HelpOutline fontSize=\"large\" />}\n >\n <AskQuestionButton />\n <ContentHeaderButton\n onClick={() => {\n const element = document.getElementById('qeta-answer-form');\n if (element) {\n element.scrollIntoView({ behavior: 'smooth' });\n const input = element.querySelector('textarea');\n if (input) {\n input.focus();\n }\n }\n }}\n icon={<Comment />}\n >\n {t('questionPage.answerButton')}\n </ContentHeaderButton>\n <AddToCollectionButton post={question} />\n </ContentHeader>\n {question.status === 'draft' && <DraftBanner />}\n {question.status === 'deleted' && <DeletedBanner />}\n <QuestionCard question={question} />\n <AIAnswerCard question={question} debounceMs={0} />\n {question.status === 'active' && (\n <>\n <Box sx={{ mt: 3, mb: 2 }}>\n <Grid container justifyContent=\"space-between\" alignItems=\"center\">\n <Grid item>\n <Typography variant=\"h6\">\n {t('common.answersCount', {\n count: answersCount,\n })}\n </Typography>\n </Grid>\n {sortedAnswers.length > 1 && (\n <Grid item>\n <FormControl>\n <TextField\n select\n size=\"small\"\n label={t('questionPage.sortAnswers.label')}\n value={answerSort}\n onChange={val =>\n setAnswerSort(val.target.value as string)\n }\n inputProps={{\n name: 'sortAnswers',\n id: 'sort-answers',\n 'aria-label': t('questionPage.sortAnswers.label'),\n 'aria-describedby': 'sort-answers-helper',\n }}\n variant=\"outlined\"\n SelectProps={{\n MenuProps: {\n 'aria-label': t('questionPage.sortAnswers.menuLabel'),\n },\n }}\n >\n <MenuItem value=\"default\">\n {t('questionPage.sortAnswers.default')}\n </MenuItem>\n <MenuItem value=\"created_desc\">\n {t('questionPage.sortAnswers.createdDesc')}\n </MenuItem>\n <MenuItem value=\"created_asc\">\n {t('questionPage.sortAnswers.createdAsc')}\n </MenuItem>\n <MenuItem value=\"score_desc\">\n {t('questionPage.sortAnswers.scoreDesc')}\n </MenuItem>\n <MenuItem value=\"score_asc\">\n {t('questionPage.sortAnswers.scoreAsc')}\n </MenuItem>\n <MenuItem value=\"comments_desc\">\n {t('questionPage.sortAnswers.commentsDesc')}\n </MenuItem>\n <MenuItem value=\"comments_asc\">\n {t('questionPage.sortAnswers.commentsAsc')}\n </MenuItem>\n <MenuItem value=\"author_desc\">\n {t('questionPage.sortAnswers.authorDesc')}\n </MenuItem>\n <MenuItem value=\"author_asc\">\n {t('questionPage.sortAnswers.authorAsc')}\n </MenuItem>\n <MenuItem value=\"updated_desc\">\n {t('questionPage.sortAnswers.updatedDesc')}\n </MenuItem>\n <MenuItem value=\"updated_asc\">\n {t('questionPage.sortAnswers.updatedAsc')}\n </MenuItem>\n </TextField>\n </FormControl>\n </Grid>\n )}\n </Grid>\n </Box>\n {sortedAnswers.map(a => {\n return (\n <Fragment key={a.id}>\n <Box key={a.id} sx={{ mb: 1 }}>\n <AnswerCard\n answer={a}\n question={question}\n onAnswerDelete={onAnswerDelete}\n />\n </Box>\n </Fragment>\n );\n })}\n\n <div id=\"qeta-answer-form\">\n <AnswerForm post={question} onPost={onAnswerPost} />\n </div>\n </>\n )}\n </>\n );\n};\n"],"names":["Fragment"],"mappings":"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"}
1
+ {"version":3,"file":"QuestionPage.esm.js","sources":["../../../src/components/QuestionPage/QuestionPage.tsx"],"sourcesContent":["import { Fragment, useCallback, useEffect, useMemo, useState } from 'react';\nimport { WarningPanel } from '@backstage/core-components';\nimport { useParams } from 'react-router-dom';\nimport {\n AddToCollectionButton,\n AIAnswerCard,\n AnswerCard,\n AnswerForm,\n AskQuestionButton,\n ContentHeader,\n ContentHeaderButton,\n DeletedBanner,\n DraftBanner,\n ObsoleteBanner,\n qetaTranslationRef,\n QuestionCard,\n RelativeTimeWithTooltip,\n UpdatedByLink,\n useQetaApi,\n} from '@drodil/backstage-plugin-qeta-react';\nimport Comment from '@material-ui/icons/Comment';\nimport {\n Answer,\n AnswerResponse,\n PostResponse,\n QetaSignal,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { useSignal } from '@backstage/plugin-signals-react';\nimport {\n Box,\n FormControl,\n Grid,\n makeStyles,\n MenuItem,\n TextField,\n Typography,\n} from '@material-ui/core';\nimport { Skeleton } from '@material-ui/lab';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport HelpOutline from '@material-ui/icons/HelpOutline';\n\nconst useDescriptionStyles = makeStyles(\n () => ({\n root: {},\n box: {\n display: 'inline',\n },\n }),\n { name: 'QetaDescription' },\n);\n\nexport const QuestionPage = () => {\n const { id } = useParams();\n const { t } = useTranslationRef(qetaTranslationRef);\n const [answers, setAnswers] = useState<AnswerResponse[]>([]);\n const [newAnswers, setNewAnswers] = useState<AnswerResponse[]>([]);\n const [answerSort, setAnswerSort] = useState<string>('default');\n const dStyles = useDescriptionStyles();\n\n const [answersCount, setAnswersCount] = useState(0);\n const [views, setViews] = useState(0);\n\n const { lastSignal } = useSignal<QetaSignal>(`qeta:post_${id}`);\n\n const {\n value: question,\n loading,\n error,\n } = useQetaApi(api => api.getPost(id), [id]);\n\n useEffect(() => {\n if (question) {\n setAnswersCount(question.answersCount);\n setViews(question.views);\n setAnswers(question.answers ?? []);\n }\n }, [question]);\n\n useEffect(() => {\n if (lastSignal?.type === 'post_stats') {\n setAnswersCount(lastSignal.answersCount);\n setViews(lastSignal.views);\n }\n }, [lastSignal]);\n\n const sortAnswers = useCallback(\n (a: Answer, b: Answer) => {\n if (answerSort === 'default') {\n return 1;\n }\n\n const parts = answerSort.split('_');\n const field = parts[0];\n const order = parts[1];\n\n let ret = -1;\n switch (field) {\n case 'created':\n ret = a.created > b.created ? -1 : 1;\n break;\n case 'score':\n ret = a.score > b.score ? -1 : 1;\n break;\n case 'author':\n ret = a.author > b.author ? -1 : 1;\n break;\n case 'comments':\n ret = (a.comments?.length ?? 0) > (b.comments?.length ?? 0) ? -1 : 1;\n break;\n case 'updated':\n ret = (a.updated ?? a.created) > (b.updated ?? b.created) ? -1 : 1;\n break;\n default:\n return 1;\n }\n\n if (order === 'desc') {\n ret *= -1;\n }\n return ret;\n },\n [answerSort],\n );\n\n const sortedAnswers = useMemo(() => {\n const allAnswers = [...answers, ...newAnswers];\n return allAnswers.sort(sortAnswers);\n }, [answers, newAnswers, sortAnswers]);\n\n const onAnswerPost = (answer: AnswerResponse) => {\n setNewAnswers(newAnswers.concat([answer]));\n setAnswersCount(prev => prev + 1);\n };\n\n const onAnswerDelete = (answer: AnswerResponse) => {\n setNewAnswers(newAnswers.filter(a => a.id !== answer.id));\n setAnswers(answers.filter(a => a.id !== answer.id));\n setAnswersCount(prev => prev - 1);\n };\n\n const getDescription = (q: PostResponse) => {\n return (\n <span className={dStyles.root}>\n <Box fontWeight=\"fontWeightMedium\" className={dStyles.box}>\n {t('authorBox.postedAtTime')}{' '}\n <RelativeTimeWithTooltip value={q.created} />\n {' · '}\n </Box>\n {q.updated && (\n <Fragment>\n <Box fontWeight=\"fontWeightMedium\" className={dStyles.box}>\n {t('authorBox.updatedAtTime')}{' '}\n <RelativeTimeWithTooltip value={q.updated} />{' '}\n {t('authorBox.updatedBy')} <UpdatedByLink entity={q} />\n {' · '}\n </Box>\n </Fragment>\n )}\n <Box fontWeight=\"fontWeightMedium\" className={dStyles.box}>\n {t('common.viewsCount', { count: views })}\n </Box>\n </span>\n );\n };\n\n if (loading) {\n return (\n <Box role=\"status\" aria-label={t('common.loading')}>\n <Skeleton variant=\"rect\" height={200} animation=\"wave\" />\n <Box mt={2}>\n <Skeleton variant=\"text\" height={40} width=\"60%\" animation=\"wave\" />\n <Skeleton variant=\"text\" height={20} width=\"40%\" animation=\"wave\" />\n <Skeleton variant=\"text\" height={20} width=\"80%\" animation=\"wave\" />\n </Box>\n </Box>\n );\n }\n\n if (error || question === undefined) {\n return (\n <WarningPanel\n severity=\"error\"\n title={t('questionPage.errorLoading')}\n aria-live=\"assertive\"\n >\n {error?.message}\n </WarningPanel>\n );\n }\n\n if (question.type !== 'question') {\n return (\n <WarningPanel title=\"Not found\" message={t('questionPage.notFound')} />\n );\n }\n\n return (\n <>\n <ContentHeader\n title={question.title}\n description={getDescription(question)}\n titleIcon={<HelpOutline fontSize=\"large\" />}\n >\n <AskQuestionButton />\n <ContentHeaderButton\n onClick={() => {\n const element = document.getElementById('qeta-answer-form');\n if (element) {\n element.scrollIntoView({ behavior: 'smooth' });\n const input = element.querySelector('textarea');\n if (input) {\n input.focus();\n }\n }\n }}\n icon={<Comment />}\n disabled={question.status === 'obsolete'}\n >\n {t('questionPage.answerButton')}\n </ContentHeaderButton>\n <AddToCollectionButton post={question} />\n </ContentHeader>\n {question.status === 'draft' && <DraftBanner />}\n {question.status === 'deleted' && <DeletedBanner />}\n {question.status === 'obsolete' && <ObsoleteBanner />}\n <QuestionCard question={question} />\n <AIAnswerCard question={question} debounceMs={0} />\n {(question.status === 'active' || question.status === 'obsolete') && (\n <>\n <Box sx={{ mt: 3, mb: 2 }}>\n <Grid container justifyContent=\"space-between\" alignItems=\"center\">\n <Grid item>\n <Typography variant=\"h6\">\n {t('common.answersCount', {\n count: answersCount,\n })}\n </Typography>\n </Grid>\n {sortedAnswers.length > 1 && (\n <Grid item>\n <FormControl>\n <TextField\n select\n size=\"small\"\n label={t('questionPage.sortAnswers.label')}\n value={answerSort}\n onChange={val =>\n setAnswerSort(val.target.value as string)\n }\n inputProps={{\n name: 'sortAnswers',\n id: 'sort-answers',\n 'aria-label': t('questionPage.sortAnswers.label'),\n 'aria-describedby': 'sort-answers-helper',\n }}\n variant=\"outlined\"\n SelectProps={{\n MenuProps: {\n 'aria-label': t('questionPage.sortAnswers.menuLabel'),\n },\n }}\n >\n <MenuItem value=\"default\">\n {t('questionPage.sortAnswers.default')}\n </MenuItem>\n <MenuItem value=\"created_desc\">\n {t('questionPage.sortAnswers.createdDesc')}\n </MenuItem>\n <MenuItem value=\"created_asc\">\n {t('questionPage.sortAnswers.createdAsc')}\n </MenuItem>\n <MenuItem value=\"score_desc\">\n {t('questionPage.sortAnswers.scoreDesc')}\n </MenuItem>\n <MenuItem value=\"score_asc\">\n {t('questionPage.sortAnswers.scoreAsc')}\n </MenuItem>\n <MenuItem value=\"comments_desc\">\n {t('questionPage.sortAnswers.commentsDesc')}\n </MenuItem>\n <MenuItem value=\"comments_asc\">\n {t('questionPage.sortAnswers.commentsAsc')}\n </MenuItem>\n <MenuItem value=\"author_desc\">\n {t('questionPage.sortAnswers.authorDesc')}\n </MenuItem>\n <MenuItem value=\"author_asc\">\n {t('questionPage.sortAnswers.authorAsc')}\n </MenuItem>\n <MenuItem value=\"updated_desc\">\n {t('questionPage.sortAnswers.updatedDesc')}\n </MenuItem>\n <MenuItem value=\"updated_asc\">\n {t('questionPage.sortAnswers.updatedAsc')}\n </MenuItem>\n </TextField>\n </FormControl>\n </Grid>\n )}\n </Grid>\n </Box>\n {sortedAnswers.map(a => {\n return (\n <Fragment key={a.id}>\n <Box key={a.id} sx={{ mb: 1 }}>\n <AnswerCard\n answer={a}\n question={question}\n onAnswerDelete={onAnswerDelete}\n />\n </Box>\n </Fragment>\n );\n })}\n\n {question.status === 'active' && (\n <div id=\"qeta-answer-form\">\n <AnswerForm post={question} onPost={onAnswerPost} />\n </div>\n )}\n </>\n )}\n </>\n );\n};\n"],"names":["Fragment"],"mappings":";;;;;;;;;;;;AAyCA,MAAM,oBAAuB,GAAA,UAAA;AAAA,EAC3B,OAAO;AAAA,IACL,MAAM,EAAC;AAAA,IACP,GAAK,EAAA;AAAA,MACH,OAAS,EAAA;AAAA;AACX,GACF,CAAA;AAAA,EACA,EAAE,MAAM,iBAAkB;AAC5B,CAAA;AAEO,MAAM,eAAe,MAAM;AAChC,EAAM,MAAA,EAAE,EAAG,EAAA,GAAI,SAAU,EAAA;AACzB,EAAA,MAAM,EAAE,CAAA,EAAM,GAAA,iBAAA,CAAkB,kBAAkB,CAAA;AAClD,EAAA,MAAM,CAAC,OAAS,EAAA,UAAU,CAAI,GAAA,QAAA,CAA2B,EAAE,CAAA;AAC3D,EAAA,MAAM,CAAC,UAAY,EAAA,aAAa,CAAI,GAAA,QAAA,CAA2B,EAAE,CAAA;AACjE,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAiB,SAAS,CAAA;AAC9D,EAAA,MAAM,UAAU,oBAAqB,EAAA;AAErC,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAS,CAAC,CAAA;AAClD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAS,CAAC,CAAA;AAEpC,EAAA,MAAM,EAAE,UAAW,EAAA,GAAI,SAAsB,CAAA,CAAA,UAAA,EAAa,EAAE,CAAE,CAAA,CAAA;AAE9D,EAAM,MAAA;AAAA,IACJ,KAAO,EAAA,QAAA;AAAA,IACP,OAAA;AAAA,IACA;AAAA,GACF,GAAI,WAAW,CAAO,GAAA,KAAA,GAAA,CAAI,QAAQ,EAAE,CAAA,EAAG,CAAC,EAAE,CAAC,CAAA;AAE3C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,QAAU,EAAA;AACZ,MAAA,eAAA,CAAgB,SAAS,YAAY,CAAA;AACrC,MAAA,QAAA,CAAS,SAAS,KAAK,CAAA;AACvB,MAAW,UAAA,CAAA,QAAA,CAAS,OAAW,IAAA,EAAE,CAAA;AAAA;AACnC,GACF,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,SAAA,CAAU,MAAM;AACd,IAAI,IAAA,UAAA,EAAY,SAAS,YAAc,EAAA;AACrC,MAAA,eAAA,CAAgB,WAAW,YAAY,CAAA;AACvC,MAAA,QAAA,CAAS,WAAW,KAAK,CAAA;AAAA;AAC3B,GACF,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,MAAM,WAAc,GAAA,WAAA;AAAA,IAClB,CAAC,GAAW,CAAc,KAAA;AACxB,MAAA,IAAI,eAAe,SAAW,EAAA;AAC5B,QAAO,OAAA,CAAA;AAAA;AAGT,MAAM,MAAA,KAAA,GAAQ,UAAW,CAAA,KAAA,CAAM,GAAG,CAAA;AAClC,MAAM,MAAA,KAAA,GAAQ,MAAM,CAAC,CAAA;AACrB,MAAM,MAAA,KAAA,GAAQ,MAAM,CAAC,CAAA;AAErB,MAAA,IAAI,GAAM,GAAA,CAAA,CAAA;AACV,MAAA,QAAQ,KAAO;AAAA,QACb,KAAK,SAAA;AACH,UAAA,GAAA,GAAM,CAAE,CAAA,OAAA,GAAU,CAAE,CAAA,OAAA,GAAU,CAAK,CAAA,GAAA,CAAA;AACnC,UAAA;AAAA,QACF,KAAK,OAAA;AACH,UAAA,GAAA,GAAM,CAAE,CAAA,KAAA,GAAQ,CAAE,CAAA,KAAA,GAAQ,CAAK,CAAA,GAAA,CAAA;AAC/B,UAAA;AAAA,QACF,KAAK,QAAA;AACH,UAAA,GAAA,GAAM,CAAE,CAAA,MAAA,GAAS,CAAE,CAAA,MAAA,GAAS,CAAK,CAAA,GAAA,CAAA;AACjC,UAAA;AAAA,QACF,KAAK,UAAA;AACH,UAAO,GAAA,GAAA,CAAA,CAAA,CAAE,UAAU,MAAU,IAAA,CAAA,KAAM,EAAE,QAAU,EAAA,MAAA,IAAU,KAAK,CAAK,CAAA,GAAA,CAAA;AACnE,UAAA;AAAA,QACF,KAAK,SAAA;AACH,UAAO,GAAA,GAAA,CAAA,CAAA,CAAE,WAAW,CAAE,CAAA,OAAA,KAAY,EAAE,OAAW,IAAA,CAAA,CAAE,WAAW,CAAK,CAAA,GAAA,CAAA;AACjE,UAAA;AAAA,QACF;AACE,UAAO,OAAA,CAAA;AAAA;AAGX,MAAA,IAAI,UAAU,MAAQ,EAAA;AACpB,QAAO,GAAA,IAAA,CAAA,CAAA;AAAA;AAET,MAAO,OAAA,GAAA;AAAA,KACT;AAAA,IACA,CAAC,UAAU;AAAA,GACb;AAEA,EAAM,MAAA,aAAA,GAAgB,QAAQ,MAAM;AAClC,IAAA,MAAM,UAAa,GAAA,CAAC,GAAG,OAAA,EAAS,GAAG,UAAU,CAAA;AAC7C,IAAO,OAAA,UAAA,CAAW,KAAK,WAAW,CAAA;AAAA,GACjC,EAAA,CAAC,OAAS,EAAA,UAAA,EAAY,WAAW,CAAC,CAAA;AAErC,EAAM,MAAA,YAAA,GAAe,CAAC,MAA2B,KAAA;AAC/C,IAAA,aAAA,CAAc,UAAW,CAAA,MAAA,CAAO,CAAC,MAAM,CAAC,CAAC,CAAA;AACzC,IAAgB,eAAA,CAAA,CAAA,IAAA,KAAQ,OAAO,CAAC,CAAA;AAAA,GAClC;AAEA,EAAM,MAAA,cAAA,GAAiB,CAAC,MAA2B,KAAA;AACjD,IAAA,aAAA,CAAc,WAAW,MAAO,CAAA,CAAA,CAAA,KAAK,EAAE,EAAO,KAAA,MAAA,CAAO,EAAE,CAAC,CAAA;AACxD,IAAA,UAAA,CAAW,QAAQ,MAAO,CAAA,CAAA,CAAA,KAAK,EAAE,EAAO,KAAA,MAAA,CAAO,EAAE,CAAC,CAAA;AAClD,IAAgB,eAAA,CAAA,CAAA,IAAA,KAAQ,OAAO,CAAC,CAAA;AAAA,GAClC;AAEA,EAAM,MAAA,cAAA,GAAiB,CAAC,CAAoB,KAAA;AAC1C,IAAA,uBACG,IAAA,CAAA,MAAA,EAAA,EAAK,SAAW,EAAA,OAAA,CAAQ,IACvB,EAAA,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,GAAI,EAAA,EAAA,UAAA,EAAW,kBAAmB,EAAA,SAAA,EAAW,QAAQ,GACnD,EAAA,QAAA,EAAA;AAAA,QAAA,CAAA,CAAE,wBAAwB,CAAA;AAAA,QAAG,GAAA;AAAA,wBAC7B,GAAA,CAAA,uBAAA,EAAA,EAAwB,KAAO,EAAA,CAAA,CAAE,OAAS,EAAA,CAAA;AAAA,QAC1C;AAAA,OACH,EAAA,CAAA;AAAA,MACC,CAAA,CAAE,OACD,oBAAA,GAAA,CAACA,UAAA,EAAA,EACC,QAAC,kBAAA,IAAA,CAAA,GAAA,EAAA,EAAI,UAAW,EAAA,kBAAA,EAAmB,SAAW,EAAA,OAAA,CAAQ,GACnD,EAAA,QAAA,EAAA;AAAA,QAAA,CAAA,CAAE,yBAAyB,CAAA;AAAA,QAAG,GAAA;AAAA,wBAC9B,GAAA,CAAA,uBAAA,EAAA,EAAwB,KAAO,EAAA,CAAA,CAAE,OAAS,EAAA,CAAA;AAAA,QAAG,GAAA;AAAA,QAC7C,EAAE,qBAAqB,CAAA;AAAA,QAAE,GAAA;AAAA,wBAAC,GAAA,CAAC,aAAc,EAAA,EAAA,MAAA,EAAQ,CAAG,EAAA,CAAA;AAAA,QACpD;AAAA,OAAA,EACH,CACF,EAAA,CAAA;AAAA,sBAED,GAAA,CAAA,GAAA,EAAA,EAAI,UAAW,EAAA,kBAAA,EAAmB,SAAW,EAAA,OAAA,CAAQ,GACnD,EAAA,QAAA,EAAA,CAAA,CAAE,mBAAqB,EAAA,EAAE,KAAO,EAAA,KAAA,EAAO,CAC1C,EAAA;AAAA,KACF,EAAA,CAAA;AAAA,GAEJ;AAEA,EAAA,IAAI,OAAS,EAAA;AACX,IAAA,4BACG,GAAI,EAAA,EAAA,IAAA,EAAK,UAAS,YAAY,EAAA,CAAA,CAAE,gBAAgB,CAC/C,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,YAAS,OAAQ,EAAA,MAAA,EAAO,MAAQ,EAAA,GAAA,EAAK,WAAU,MAAO,EAAA,CAAA;AAAA,sBACvD,IAAA,CAAC,GAAI,EAAA,EAAA,EAAA,EAAI,CACP,EAAA,QAAA,EAAA;AAAA,wBAAC,GAAA,CAAA,QAAA,EAAA,EAAS,SAAQ,MAAO,EAAA,MAAA,EAAQ,IAAI,KAAM,EAAA,KAAA,EAAM,WAAU,MAAO,EAAA,CAAA;AAAA,wBAClE,GAAA,CAAC,YAAS,OAAQ,EAAA,MAAA,EAAO,QAAQ,EAAI,EAAA,KAAA,EAAM,KAAM,EAAA,SAAA,EAAU,MAAO,EAAA,CAAA;AAAA,wBAClE,GAAA,CAAC,YAAS,OAAQ,EAAA,MAAA,EAAO,QAAQ,EAAI,EAAA,KAAA,EAAM,KAAM,EAAA,SAAA,EAAU,MAAO,EAAA;AAAA,OACpE,EAAA;AAAA,KACF,EAAA,CAAA;AAAA;AAIJ,EAAI,IAAA,KAAA,IAAS,aAAa,KAAW,CAAA,EAAA;AACnC,IACE,uBAAA,GAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,QAAS,EAAA,OAAA;AAAA,QACT,KAAA,EAAO,EAAE,2BAA2B,CAAA;AAAA,QACpC,WAAU,EAAA,WAAA;AAAA,QAET,QAAO,EAAA,KAAA,EAAA;AAAA;AAAA,KACV;AAAA;AAIJ,EAAI,IAAA,QAAA,CAAS,SAAS,UAAY,EAAA;AAChC,IAAA,2BACG,YAAa,EAAA,EAAA,KAAA,EAAM,aAAY,OAAS,EAAA,CAAA,CAAE,uBAAuB,CAAG,EAAA,CAAA;AAAA;AAIzE,EAAA,uBAEI,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAA,IAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QACC,OAAO,QAAS,CAAA,KAAA;AAAA,QAChB,WAAA,EAAa,eAAe,QAAQ,CAAA;AAAA,QACpC,SAAW,kBAAA,GAAA,CAAC,WAAY,EAAA,EAAA,QAAA,EAAS,OAAQ,EAAA,CAAA;AAAA,QAEzC,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,iBAAkB,EAAA,EAAA,CAAA;AAAA,0BACnB,GAAA;AAAA,YAAC,mBAAA;AAAA,YAAA;AAAA,cACC,SAAS,MAAM;AACb,gBAAM,MAAA,OAAA,GAAU,QAAS,CAAA,cAAA,CAAe,kBAAkB,CAAA;AAC1D,gBAAA,IAAI,OAAS,EAAA;AACX,kBAAA,OAAA,CAAQ,cAAe,CAAA,EAAE,QAAU,EAAA,QAAA,EAAU,CAAA;AAC7C,kBAAM,MAAA,KAAA,GAAQ,OAAQ,CAAA,aAAA,CAAc,UAAU,CAAA;AAC9C,kBAAA,IAAI,KAAO,EAAA;AACT,oBAAA,KAAA,CAAM,KAAM,EAAA;AAAA;AACd;AACF,eACF;AAAA,cACA,IAAA,sBAAO,OAAQ,EAAA,EAAA,CAAA;AAAA,cACf,QAAA,EAAU,SAAS,MAAW,KAAA,UAAA;AAAA,cAE7B,YAAE,2BAA2B;AAAA;AAAA,WAChC;AAAA,0BACA,GAAA,CAAC,qBAAsB,EAAA,EAAA,IAAA,EAAM,QAAU,EAAA;AAAA;AAAA;AAAA,KACzC;AAAA,IACC,QAAS,CAAA,MAAA,KAAW,OAAW,oBAAA,GAAA,CAAC,WAAY,EAAA,EAAA,CAAA;AAAA,IAC5C,QAAS,CAAA,MAAA,KAAW,SAAa,oBAAA,GAAA,CAAC,aAAc,EAAA,EAAA,CAAA;AAAA,IAChD,QAAS,CAAA,MAAA,KAAW,UAAc,oBAAA,GAAA,CAAC,cAAe,EAAA,EAAA,CAAA;AAAA,oBACnD,GAAA,CAAC,gBAAa,QAAoB,EAAA,CAAA;AAAA,oBACjC,GAAA,CAAA,YAAA,EAAA,EAAa,QAAoB,EAAA,UAAA,EAAY,CAAG,EAAA,CAAA;AAAA,IAAA,CAC/C,SAAS,MAAW,KAAA,QAAA,IAAY,QAAS,CAAA,MAAA,KAAW,+BAElD,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,GAAI,EAAA,EAAA,EAAA,EAAI,EAAE,EAAA,EAAI,GAAG,EAAI,EAAA,CAAA,EACpB,EAAA,QAAA,kBAAA,IAAA,CAAC,QAAK,SAAS,EAAA,IAAA,EAAC,cAAe,EAAA,eAAA,EAAgB,YAAW,QACxD,EAAA,QAAA,EAAA;AAAA,wBAAC,GAAA,CAAA,IAAA,EAAA,EAAK,MAAI,IACR,EAAA,QAAA,kBAAA,GAAA,CAAC,cAAW,OAAQ,EAAA,IAAA,EACjB,YAAE,qBAAuB,EAAA;AAAA,UACxB,KAAO,EAAA;AAAA,SACR,GACH,CACF,EAAA,CAAA;AAAA,QACC,aAAA,CAAc,SAAS,CACtB,oBAAA,GAAA,CAAC,QAAK,IAAI,EAAA,IAAA,EACR,8BAAC,WACC,EAAA,EAAA,QAAA,kBAAA,IAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YACC,MAAM,EAAA,IAAA;AAAA,YACN,IAAK,EAAA,OAAA;AAAA,YACL,KAAA,EAAO,EAAE,gCAAgC,CAAA;AAAA,YACzC,KAAO,EAAA,UAAA;AAAA,YACP,QAAU,EAAA,CAAA,GAAA,KACR,aAAc,CAAA,GAAA,CAAI,OAAO,KAAe,CAAA;AAAA,YAE1C,UAAY,EAAA;AAAA,cACV,IAAM,EAAA,aAAA;AAAA,cACN,EAAI,EAAA,cAAA;AAAA,cACJ,YAAA,EAAc,EAAE,gCAAgC,CAAA;AAAA,cAChD,kBAAoB,EAAA;AAAA,aACtB;AAAA,YACA,OAAQ,EAAA,UAAA;AAAA,YACR,WAAa,EAAA;AAAA,cACX,SAAW,EAAA;AAAA,gBACT,YAAA,EAAc,EAAE,oCAAoC;AAAA;AACtD,aACF;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,QAAS,EAAA,EAAA,KAAA,EAAM,SACb,EAAA,QAAA,EAAA,CAAA,CAAE,kCAAkC,CACvC,EAAA,CAAA;AAAA,kCACC,QAAS,EAAA,EAAA,KAAA,EAAM,cACb,EAAA,QAAA,EAAA,CAAA,CAAE,sCAAsC,CAC3C,EAAA,CAAA;AAAA,kCACC,QAAS,EAAA,EAAA,KAAA,EAAM,aACb,EAAA,QAAA,EAAA,CAAA,CAAE,qCAAqC,CAC1C,EAAA,CAAA;AAAA,kCACC,QAAS,EAAA,EAAA,KAAA,EAAM,YACb,EAAA,QAAA,EAAA,CAAA,CAAE,oCAAoC,CACzC,EAAA,CAAA;AAAA,kCACC,QAAS,EAAA,EAAA,KAAA,EAAM,WACb,EAAA,QAAA,EAAA,CAAA,CAAE,mCAAmC,CACxC,EAAA,CAAA;AAAA,kCACC,QAAS,EAAA,EAAA,KAAA,EAAM,eACb,EAAA,QAAA,EAAA,CAAA,CAAE,uCAAuC,CAC5C,EAAA,CAAA;AAAA,kCACC,QAAS,EAAA,EAAA,KAAA,EAAM,cACb,EAAA,QAAA,EAAA,CAAA,CAAE,sCAAsC,CAC3C,EAAA,CAAA;AAAA,kCACC,QAAS,EAAA,EAAA,KAAA,EAAM,aACb,EAAA,QAAA,EAAA,CAAA,CAAE,qCAAqC,CAC1C,EAAA,CAAA;AAAA,kCACC,QAAS,EAAA,EAAA,KAAA,EAAM,YACb,EAAA,QAAA,EAAA,CAAA,CAAE,oCAAoC,CACzC,EAAA,CAAA;AAAA,kCACC,QAAS,EAAA,EAAA,KAAA,EAAM,cACb,EAAA,QAAA,EAAA,CAAA,CAAE,sCAAsC,CAC3C,EAAA,CAAA;AAAA,kCACC,QAAS,EAAA,EAAA,KAAA,EAAM,aACb,EAAA,QAAA,EAAA,CAAA,CAAE,qCAAqC,CAC1C,EAAA;AAAA;AAAA;AAAA,WAEJ,CACF,EAAA;AAAA,OAAA,EAEJ,CACF,EAAA,CAAA;AAAA,MACC,aAAA,CAAc,IAAI,CAAK,CAAA,KAAA;AACtB,QACE,uBAAA,GAAA,CAACA,YAAA,EACC,QAAA,kBAAA,GAAA,CAAC,OAAe,EAAI,EAAA,EAAE,EAAI,EAAA,CAAA,EACxB,EAAA,QAAA,kBAAA,GAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,MAAQ,EAAA,CAAA;AAAA,YACR,QAAA;AAAA,YACA;AAAA;AAAA,SAJM,EAAA,EAAA,CAAA,CAAE,EAMZ,CAAA,EAAA,EAPa,EAAE,EAQjB,CAAA;AAAA,OAEH,CAAA;AAAA,MAEA,QAAS,CAAA,MAAA,KAAW,QACnB,oBAAA,GAAA,CAAC,KAAI,EAAA,EAAA,EAAA,EAAG,kBACN,EAAA,QAAA,kBAAA,GAAA,CAAC,UAAW,EAAA,EAAA,IAAA,EAAM,QAAU,EAAA,MAAA,EAAQ,cAAc,CACpD,EAAA;AAAA,KAEJ,EAAA;AAAA,GAEJ,EAAA,CAAA;AAEJ;;;;"}
@@ -0,0 +1,162 @@
1
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
+ import { useState } from 'react';
3
+ import { qetaTranslationRef, useQetaApi, questionRouteRef, articleRouteRef, linkRouteRef, UserLink, RelativeTimeWithTooltip, ObsoleteModal, ValidReviewModal, DeleteModal } from '@drodil/backstage-plugin-qeta-react';
4
+ import { useRouteRef } from '@backstage/core-plugin-api';
5
+ import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
6
+ import { Link, WarningPanel, Table } from '@backstage/core-components';
7
+ import { Grid, Tooltip, IconButton, Box, Typography } from '@material-ui/core';
8
+ import CheckIcon from '@material-ui/icons/Check';
9
+ import BlockIcon from '@material-ui/icons/Block';
10
+ import DeleteIcon from '@material-ui/icons/Delete';
11
+
12
+ const ReviewPage = () => {
13
+ const { t } = useTranslationRef(qetaTranslationRef);
14
+ const {
15
+ value: response,
16
+ loading,
17
+ error,
18
+ retry
19
+ } = useQetaApi(
20
+ (api) => api.getPosts({
21
+ reviewNeeded: true,
22
+ includeHealth: true,
23
+ includeVotes: false,
24
+ includeAttachments: false,
25
+ includeExperts: false,
26
+ includeTags: false,
27
+ limit: 100,
28
+ order: "asc",
29
+ orderBy: "created",
30
+ includeEntities: false,
31
+ includeAnswers: false,
32
+ checkAccess: true
33
+ })
34
+ );
35
+ const questionRoute = useRouteRef(questionRouteRef);
36
+ const articleRoute = useRouteRef(articleRouteRef);
37
+ const linkRoute = useRouteRef(linkRouteRef);
38
+ const getPostLink = (post) => {
39
+ if (post.type === "article") {
40
+ return articleRoute({ id: post.id.toString() });
41
+ }
42
+ if (post.type === "question") {
43
+ return questionRoute({ id: post.id.toString() });
44
+ }
45
+ if (post.type === "link") {
46
+ return linkRoute({ id: post.id.toString() });
47
+ }
48
+ return "#";
49
+ };
50
+ const [openObsoleteModal, setOpenObsoleteModal] = useState(false);
51
+ const [openValidModal, setOpenValidModal] = useState(false);
52
+ const [selectedPost, setSelectedPost] = useState(null);
53
+ const [openDeleteModal, setOpenDeleteModal] = useState(false);
54
+ const [postToDelete, setPostToDelete] = useState(null);
55
+ const openMarkObsolete = (post) => {
56
+ setSelectedPost(post);
57
+ setOpenObsoleteModal(true);
58
+ };
59
+ const openMarkValid = (post) => {
60
+ setSelectedPost(post);
61
+ setOpenValidModal(true);
62
+ };
63
+ const openDelete = (post) => {
64
+ setPostToDelete(post);
65
+ setOpenDeleteModal(true);
66
+ };
67
+ const columns = [
68
+ {
69
+ title: t("reviewPage.table.title"),
70
+ field: "title",
71
+ render: (row) => /* @__PURE__ */ jsx(Link, { to: getPostLink(row), children: row.title })
72
+ },
73
+ {
74
+ title: t("reviewPage.table.author"),
75
+ field: "author",
76
+ render: (row) => /* @__PURE__ */ jsx(UserLink, { entityRef: row.author })
77
+ },
78
+ {
79
+ title: t("reviewPage.table.created"),
80
+ field: "created",
81
+ render: (row) => /* @__PURE__ */ jsx(RelativeTimeWithTooltip, { value: row.created })
82
+ },
83
+ {
84
+ title: t("reviewPage.table.healthScore"),
85
+ field: "healthScore",
86
+ render: (row) => `${row.healthScore ?? 0}%`
87
+ },
88
+ {
89
+ title: t("reviewPage.table.actions"),
90
+ field: "actions",
91
+ render: (row) => /* @__PURE__ */ jsxs(Grid, { container: true, spacing: 1, children: [
92
+ /* @__PURE__ */ jsx(Grid, { item: true, children: /* @__PURE__ */ jsx(Tooltip, { title: t("contentHealth.markValid"), children: /* @__PURE__ */ jsx(IconButton, { color: "primary", onClick: () => openMarkValid(row), children: /* @__PURE__ */ jsx(CheckIcon, {}) }) }) }),
93
+ /* @__PURE__ */ jsx(Grid, { item: true, children: /* @__PURE__ */ jsx(Tooltip, { title: t("contentHealth.markObsolete"), children: /* @__PURE__ */ jsx(
94
+ IconButton,
95
+ {
96
+ color: "secondary",
97
+ onClick: () => openMarkObsolete(row),
98
+ children: /* @__PURE__ */ jsx(BlockIcon, {})
99
+ }
100
+ ) }) }),
101
+ row.canDelete && /* @__PURE__ */ jsx(Grid, { item: true, children: /* @__PURE__ */ jsx(Tooltip, { title: t("deleteModal.deleteButton"), children: /* @__PURE__ */ jsx(IconButton, { color: "secondary", onClick: () => openDelete(row), children: /* @__PURE__ */ jsx(DeleteIcon, {}) }) }) })
102
+ ] })
103
+ }
104
+ ];
105
+ if (error) {
106
+ return /* @__PURE__ */ jsx(WarningPanel, { severity: "error", title: t("reviewPage.errorLoading"), children: error.message });
107
+ }
108
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
109
+ /* @__PURE__ */ jsx(Box, { mb: 2, children: /* @__PURE__ */ jsx(Typography, { variant: "body1", children: t("reviewPage.description") }) }),
110
+ /* @__PURE__ */ jsx(
111
+ Table,
112
+ {
113
+ options: { paging: true, pageSize: 10, search: true },
114
+ data: response?.posts || [],
115
+ columns,
116
+ title: t("reviewPage.title"),
117
+ isLoading: loading
118
+ }
119
+ ),
120
+ selectedPost && /* @__PURE__ */ jsxs(Fragment, { children: [
121
+ /* @__PURE__ */ jsx(
122
+ ObsoleteModal,
123
+ {
124
+ open: openObsoleteModal,
125
+ onClose: () => {
126
+ setOpenObsoleteModal(false);
127
+ setSelectedPost(null);
128
+ },
129
+ post: selectedPost,
130
+ onConfirm: retry
131
+ }
132
+ ),
133
+ /* @__PURE__ */ jsx(
134
+ ValidReviewModal,
135
+ {
136
+ open: openValidModal,
137
+ onClose: () => {
138
+ setOpenValidModal(false);
139
+ setSelectedPost(null);
140
+ },
141
+ post: selectedPost,
142
+ onConfirm: retry
143
+ }
144
+ )
145
+ ] }),
146
+ postToDelete && /* @__PURE__ */ jsx(
147
+ DeleteModal,
148
+ {
149
+ open: openDeleteModal,
150
+ onClose: () => {
151
+ setOpenDeleteModal(false);
152
+ setPostToDelete(null);
153
+ },
154
+ entity: postToDelete,
155
+ onDelete: retry
156
+ }
157
+ )
158
+ ] });
159
+ };
160
+
161
+ export { ReviewPage };
162
+ //# sourceMappingURL=ReviewPage.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReviewPage.esm.js","sources":["../../../src/components/ReviewPage/ReviewPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport {\n useQetaApi,\n qetaTranslationRef,\n UserLink,\n linkRouteRef,\n DeleteModal,\n ObsoleteModal,\n ValidReviewModal,\n RelativeTimeWithTooltip,\n} from '@drodil/backstage-plugin-qeta-react';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport {\n Table,\n TableColumn,\n Link,\n WarningPanel,\n} from '@backstage/core-components';\nimport { Grid, Tooltip, IconButton, Box, Typography } from '@material-ui/core';\nimport CheckIcon from '@material-ui/icons/Check';\nimport BlockIcon from '@material-ui/icons/Block';\nimport DeleteIcon from '@material-ui/icons/Delete';\nimport { Post } from '@drodil/backstage-plugin-qeta-common';\nimport {\n questionRouteRef,\n articleRouteRef,\n} from '@drodil/backstage-plugin-qeta-react';\n\nexport const ReviewPage = () => {\n const { t } = useTranslationRef(qetaTranslationRef);\n const {\n value: response,\n loading,\n error,\n retry,\n } = useQetaApi(api =>\n api.getPosts({\n reviewNeeded: true,\n includeHealth: true,\n includeVotes: false,\n includeAttachments: false,\n includeExperts: false,\n includeTags: false,\n limit: 100,\n order: 'asc',\n orderBy: 'created',\n includeEntities: false,\n includeAnswers: false,\n checkAccess: true,\n }),\n );\n\n const questionRoute = useRouteRef(questionRouteRef);\n const articleRoute = useRouteRef(articleRouteRef);\n const linkRoute = useRouteRef(linkRouteRef);\n\n const getPostLink = (post: Post) => {\n if (post.type === 'article') {\n return articleRoute({ id: post.id.toString() });\n }\n if (post.type === 'question') {\n return questionRoute({ id: post.id.toString() });\n }\n if (post.type === 'link') {\n return linkRoute({ id: post.id.toString() });\n }\n return '#';\n };\n\n const [openObsoleteModal, setOpenObsoleteModal] = useState(false);\n const [openValidModal, setOpenValidModal] = useState(false);\n const [selectedPost, setSelectedPost] = useState<Post | null>(null);\n const [openDeleteModal, setOpenDeleteModal] = useState(false);\n const [postToDelete, setPostToDelete] = useState<Post | null>(null);\n\n const openMarkObsolete = (post: Post) => {\n setSelectedPost(post);\n setOpenObsoleteModal(true);\n };\n\n const openMarkValid = (post: Post) => {\n setSelectedPost(post);\n setOpenValidModal(true);\n };\n\n const openDelete = (post: Post) => {\n setPostToDelete(post);\n setOpenDeleteModal(true);\n };\n\n const columns: TableColumn<Post>[] = [\n {\n title: t('reviewPage.table.title'),\n field: 'title',\n render: row => <Link to={getPostLink(row)}>{row.title}</Link>,\n },\n {\n title: t('reviewPage.table.author'),\n field: 'author',\n render: row => <UserLink entityRef={row.author} />,\n },\n {\n title: t('reviewPage.table.created'),\n field: 'created',\n render: row => <RelativeTimeWithTooltip value={row.created} />,\n },\n {\n title: t('reviewPage.table.healthScore'),\n field: 'healthScore',\n render: row => `${row.healthScore ?? 0}%`,\n },\n {\n title: t('reviewPage.table.actions'),\n field: 'actions',\n render: row => (\n <Grid container spacing={1}>\n <Grid item>\n <Tooltip title={t('contentHealth.markValid')}>\n <IconButton color=\"primary\" onClick={() => openMarkValid(row)}>\n <CheckIcon />\n </IconButton>\n </Tooltip>\n </Grid>\n <Grid item>\n <Tooltip title={t('contentHealth.markObsolete')}>\n <IconButton\n color=\"secondary\"\n onClick={() => openMarkObsolete(row)}\n >\n <BlockIcon />\n </IconButton>\n </Tooltip>\n </Grid>\n {row.canDelete && (\n <Grid item>\n <Tooltip title={t('deleteModal.deleteButton')}>\n <IconButton color=\"secondary\" onClick={() => openDelete(row)}>\n <DeleteIcon />\n </IconButton>\n </Tooltip>\n </Grid>\n )}\n </Grid>\n ),\n },\n ];\n\n if (error) {\n return (\n <WarningPanel severity=\"error\" title={t('reviewPage.errorLoading')}>\n {error.message}\n </WarningPanel>\n );\n }\n\n return (\n <>\n <Box mb={2}>\n <Typography variant=\"body1\">{t('reviewPage.description')}</Typography>\n </Box>\n <Table\n options={{ paging: true, pageSize: 10, search: true }}\n data={response?.posts || []}\n columns={columns}\n title={t('reviewPage.title')}\n isLoading={loading}\n />\n\n {selectedPost && (\n <>\n <ObsoleteModal\n open={openObsoleteModal}\n onClose={() => {\n setOpenObsoleteModal(false);\n setSelectedPost(null);\n }}\n post={selectedPost}\n onConfirm={retry}\n />\n <ValidReviewModal\n open={openValidModal}\n onClose={() => {\n setOpenValidModal(false);\n setSelectedPost(null);\n }}\n post={selectedPost}\n onConfirm={retry}\n />\n </>\n )}\n\n {postToDelete && (\n <DeleteModal\n open={openDeleteModal}\n onClose={() => {\n setOpenDeleteModal(false);\n setPostToDelete(null);\n }}\n entity={postToDelete}\n onDelete={retry}\n />\n )}\n </>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { ReviewPage } from './ReviewPage.esm.js';
2
+ //# sourceMappingURL=index.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,52 @@
1
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
2
+ import { useParams } from 'react-router-dom';
3
+ import { qetaTranslationRef, useQetaApi, PostHighlightList, FollowedTagsList, FollowedUsersList, FollowedEntitiesList, FollowedCollectionsList } from '@drodil/backstage-plugin-qeta-react';
4
+ import { DefaultRightContent } from './DefaultRightContent.esm.js';
5
+ import { ContentHealthCard } from '../ContentHealthCard/ContentHealthCard.esm.js';
6
+ import { SimilarPosts } from './SimilarPosts.esm.js';
7
+ import { Box } from '@material-ui/core';
8
+ import Whatshot from '@material-ui/icons/Whatshot';
9
+ import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
10
+
11
+ const PostRightContent = (props) => {
12
+ const { id: paramId } = useParams();
13
+ const id = props?.id || paramId;
14
+ const { t } = useTranslationRef(qetaTranslationRef);
15
+ const { value: post } = useQetaApi((api) => api.getPost(id), [id]);
16
+ let title;
17
+ if (post?.type === "article") {
18
+ title = t("highlights.hotArticles.title");
19
+ } else if (post?.type === "link") {
20
+ title = t("highlights.hotLinks.title");
21
+ } else {
22
+ title = t("highlights.hotQuestions.title");
23
+ }
24
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
25
+ post && /* @__PURE__ */ jsxs(Fragment, { children: [
26
+ /* @__PURE__ */ jsx(Box, { mb: 2, children: /* @__PURE__ */ jsx(ContentHealthCard, { post }) }),
27
+ /* @__PURE__ */ jsx(SimilarPosts, { post }),
28
+ /* @__PURE__ */ jsx(
29
+ PostHighlightList,
30
+ {
31
+ type: "hot",
32
+ title,
33
+ noQuestionsLabel: t("highlights.hotQuestions.noQuestionsLabel"),
34
+ icon: /* @__PURE__ */ jsx(Whatshot, { fontSize: "small" }),
35
+ postType: post.type,
36
+ options: {
37
+ tags: post.tags,
38
+ entities: post.entities
39
+ }
40
+ }
41
+ ),
42
+ /* @__PURE__ */ jsx(FollowedTagsList, {}),
43
+ /* @__PURE__ */ jsx(FollowedUsersList, {}),
44
+ /* @__PURE__ */ jsx(FollowedEntitiesList, {}),
45
+ /* @__PURE__ */ jsx(FollowedCollectionsList, {})
46
+ ] }),
47
+ !post && /* @__PURE__ */ jsx(DefaultRightContent, {})
48
+ ] });
49
+ };
50
+
51
+ export { PostRightContent };
52
+ //# sourceMappingURL=PostRightContent.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PostRightContent.esm.js","sources":["../../../src/components/RightContent/PostRightContent.tsx"],"sourcesContent":["import { useParams } from 'react-router-dom';\nimport {\n FollowedCollectionsList,\n FollowedEntitiesList,\n FollowedTagsList,\n FollowedUsersList,\n PostHighlightList,\n useQetaApi,\n} from '@drodil/backstage-plugin-qeta-react';\nimport { DefaultRightContent } from './DefaultRightContent';\nimport { ContentHealthCard } from '../ContentHealthCard';\nimport { SimilarPosts } from './SimilarPosts';\nimport { Box } from '@material-ui/core';\nimport Whatshot from '@material-ui/icons/Whatshot';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '@drodil/backstage-plugin-qeta-react';\n\nexport const PostRightContent = (props?: { id?: string }) => {\n const { id: paramId } = useParams();\n const id = props?.id || paramId;\n const { t } = useTranslationRef(qetaTranslationRef);\n\n const { value: post } = useQetaApi(api => api.getPost(id), [id]);\n\n let title: string;\n\n if (post?.type === 'article') {\n title = t('highlights.hotArticles.title');\n } else if (post?.type === 'link') {\n title = t('highlights.hotLinks.title');\n } else {\n title = t('highlights.hotQuestions.title');\n }\n\n return (\n <>\n {post && (\n <>\n <Box mb={2}>\n <ContentHealthCard post={post} />\n </Box>\n <SimilarPosts post={post} />\n <PostHighlightList\n type=\"hot\"\n title={title}\n noQuestionsLabel={t('highlights.hotQuestions.noQuestionsLabel')}\n icon={<Whatshot fontSize=\"small\" />}\n postType={post.type}\n options={{\n tags: post.tags,\n entities: post.entities,\n }}\n />\n <FollowedTagsList />\n <FollowedUsersList />\n <FollowedEntitiesList />\n <FollowedCollectionsList />\n </>\n )}\n {!post && <DefaultRightContent />}\n </>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;AAiBa,MAAA,gBAAA,GAAmB,CAAC,KAA4B,KAAA;AAC3D,EAAA,MAAM,EAAE,EAAA,EAAI,OAAQ,EAAA,GAAI,SAAU,EAAA;AAClC,EAAM,MAAA,EAAA,GAAK,OAAO,EAAM,IAAA,OAAA;AACxB,EAAA,MAAM,EAAE,CAAA,EAAM,GAAA,iBAAA,CAAkB,kBAAkB,CAAA;AAElD,EAAA,MAAM,EAAE,KAAA,EAAO,IAAK,EAAA,GAAI,UAAW,CAAA,CAAA,GAAA,KAAO,GAAI,CAAA,OAAA,CAAQ,EAAE,CAAA,EAAG,CAAC,EAAE,CAAC,CAAA;AAE/D,EAAI,IAAA,KAAA;AAEJ,EAAI,IAAA,IAAA,EAAM,SAAS,SAAW,EAAA;AAC5B,IAAA,KAAA,GAAQ,EAAE,8BAA8B,CAAA;AAAA,GAC1C,MAAA,IAAW,IAAM,EAAA,IAAA,KAAS,MAAQ,EAAA;AAChC,IAAA,KAAA,GAAQ,EAAE,2BAA2B,CAAA;AAAA,GAChC,MAAA;AACL,IAAA,KAAA,GAAQ,EAAE,+BAA+B,CAAA;AAAA;AAG3C,EAAA,uBAEK,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,IAAA,IAAA,oBAEG,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,OAAI,EAAI,EAAA,CAAA,EACP,QAAC,kBAAA,GAAA,CAAA,iBAAA,EAAA,EAAkB,MAAY,CACjC,EAAA,CAAA;AAAA,sBACA,GAAA,CAAC,gBAAa,IAAY,EAAA,CAAA;AAAA,sBAC1B,GAAA;AAAA,QAAC,iBAAA;AAAA,QAAA;AAAA,UACC,IAAK,EAAA,KAAA;AAAA,UACL,KAAA;AAAA,UACA,gBAAA,EAAkB,EAAE,0CAA0C,CAAA;AAAA,UAC9D,IAAM,kBAAA,GAAA,CAAC,QAAS,EAAA,EAAA,QAAA,EAAS,OAAQ,EAAA,CAAA;AAAA,UACjC,UAAU,IAAK,CAAA,IAAA;AAAA,UACf,OAAS,EAAA;AAAA,YACP,MAAM,IAAK,CAAA,IAAA;AAAA,YACX,UAAU,IAAK,CAAA;AAAA;AACjB;AAAA,OACF;AAAA,0BACC,gBAAiB,EAAA,EAAA,CAAA;AAAA,0BACjB,iBAAkB,EAAA,EAAA,CAAA;AAAA,0BAClB,oBAAqB,EAAA,EAAA,CAAA;AAAA,0BACrB,uBAAwB,EAAA,EAAA;AAAA,KAC3B,EAAA,CAAA;AAAA,IAED,CAAC,IAAQ,oBAAA,GAAA,CAAC,mBAAoB,EAAA,EAAA;AAAA,GACjC,EAAA,CAAA;AAEJ;;;;"}
@@ -2,7 +2,7 @@ import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import { useState, useEffect } from 'react';
3
3
  import { useRouteRef } from '@backstage/core-plugin-api';
4
4
  import { AskRightContent } from './AskRightContent.esm.js';
5
- import { qetaTranslationRef, questionsRouteRef, articlesRouteRef, usersRouteRef, tagsRouteRef, linksRouteRef, collectionsRouteRef, entitiesRouteRef, favoriteQuestionsRouteRef, qetaRouteRef, askRouteRef, editQuestionRouteRef, userRouteRef, tagRouteRef, entityRouteRef } from '@drodil/backstage-plugin-qeta-react';
5
+ import { qetaTranslationRef, questionsRouteRef, articlesRouteRef, usersRouteRef, tagsRouteRef, linksRouteRef, collectionsRouteRef, entitiesRouteRef, favoriteQuestionsRouteRef, qetaRouteRef, askRouteRef, editQuestionRouteRef, userRouteRef, tagRouteRef, entityRouteRef, questionRouteRef, articleRouteRef, linkRouteRef } from '@drodil/backstage-plugin-qeta-react';
6
6
  import { makeStyles, Box, Tooltip, IconButton } from '@material-ui/core';
7
7
  import { useLocation, useSearchParams, matchPath } from 'react-router-dom';
8
8
  import { filterTags } from '@drodil/backstage-plugin-qeta-common';
@@ -21,6 +21,7 @@ import MenuOpenIcon from '@material-ui/icons/MenuOpen';
21
21
  import ChevronLeftIcon from '@material-ui/icons/ChevronLeft';
22
22
  import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
23
23
  import { DefaultRightContent } from './DefaultRightContent.esm.js';
24
+ import { PostRightContent } from './PostRightContent.esm.js';
24
25
 
25
26
  const useStyles = makeStyles((theme) => ({
26
27
  container: {
@@ -105,6 +106,19 @@ const RightContent = (props) => {
105
106
  { path: favoritePath(), end: true },
106
107
  location.pathname
107
108
  );
109
+ const questionMatch = matchPath(
110
+ { path: `${rootPath}${questionRouteRef.path}` },
111
+ location.pathname
112
+ );
113
+ const articleMatch = matchPath(
114
+ { path: `${rootPath}${articleRouteRef.path}` },
115
+ location.pathname
116
+ );
117
+ const linkMatch = matchPath(
118
+ { path: `${rootPath}${linkRouteRef.path}` },
119
+ location.pathname
120
+ );
121
+ const isPostPage = !!(questionMatch || articleMatch || linkMatch);
108
122
  const isHome = matchPath({ path: homePath(), end: true }, location.pathname) || location.pathname === homePath();
109
123
  const [entityRef, setEntityRef] = useState(void 0);
110
124
  const [tags, setTags] = useState(void 0);
@@ -152,6 +166,9 @@ const RightContent = (props) => {
152
166
  content = /* @__PURE__ */ jsx(HomeRightContent, {});
153
167
  } else if (isAsk) {
154
168
  content = /* @__PURE__ */ jsx(AskRightContent, {});
169
+ } else if (isPostPage) {
170
+ const id = questionMatch?.params.id || articleMatch?.params.id || linkMatch?.params.id;
171
+ content = /* @__PURE__ */ jsx(PostRightContent, { id });
155
172
  } else if (isQuestions) {
156
173
  content = /* @__PURE__ */ jsx(QuestionsRightContent, { tags, entityRef });
157
174
  } else if (isArticles) {
@@ -1 +1 @@
1
- {"version":3,"file":"RightContent.esm.js","sources":["../../../src/components/RightContent/RightContent.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport { AskRightContent } from './AskRightContent';\nimport {\n articlesRouteRef,\n askRouteRef,\n collectionsRouteRef,\n editQuestionRouteRef,\n entitiesRouteRef,\n entityRouteRef,\n favoriteQuestionsRouteRef,\n linksRouteRef,\n qetaRouteRef,\n questionsRouteRef,\n tagRouteRef,\n tagsRouteRef,\n userRouteRef,\n usersRouteRef,\n qetaTranslationRef,\n} from '@drodil/backstage-plugin-qeta-react';\nimport { Box, IconButton, makeStyles, Tooltip } from '@material-ui/core';\nimport { matchPath, useLocation, useSearchParams } from 'react-router-dom';\nimport { filterTags } from '@drodil/backstage-plugin-qeta-common';\nimport { HomeRightContent } from './HomeRightContent';\nimport { QuestionsRightContent } from './QuestionsRightContent';\nimport { ArticlesRightContent } from './ArticlesRightContent';\nimport { LinksRightContent } from './LinksRightContent';\nimport { FavoriteRightContent } from './FavoriteRightContent';\nimport { UsersRightContent } from './UsersRightContent';\nimport { TagRightContent } from './TagRightContent';\nimport { TagsRightContent } from './TagsRightContent';\nimport { EntitiesRightContent } from './EntitiesRightContent';\nimport { EntityRightContent } from './EntityRightContent';\nimport { CollectionsRightContent } from './CollectionsRightContent';\nimport MenuOpenIcon from '@material-ui/icons/MenuOpen';\nimport ChevronLeftIcon from '@material-ui/icons/ChevronLeft';\n\nconst useStyles = makeStyles(theme => ({\n container: {\n width: (props: { compact: boolean }) => (props.compact ? '72px' : '300px'),\n padding: (props: { compact: boolean }) =>\n props.compact ? theme.spacing(1) : theme.spacing(0, 0, 0, 2),\n transition: 'width 0.2s ease-in-out',\n display: 'flex',\n flexDirection: 'column',\n overflowX: 'hidden',\n },\n toggleButton: {\n marginRight: 'auto',\n marginBottom: theme.spacing(1),\n },\n content: {\n display: (props: { compact: boolean }) =>\n props.compact ? 'none' : 'block',\n opacity: (props: { compact: boolean }) => (props.compact ? 0 : 1),\n transition: 'opacity 0.2s ease-in-out',\n },\n}));\n\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { DefaultRightContent } from './DefaultRightContent';\n\nexport const RightContent = (props: {\n compact?: boolean;\n onToggle?: () => void;\n}) => {\n const { compact = false, onToggle } = props;\n const classes = useStyles({ compact });\n const location = useLocation();\n const [searchParams] = useSearchParams();\n const { t } = useTranslationRef(qetaTranslationRef);\n\n // Route Refs\n const questionsPath = useRouteRef(questionsRouteRef);\n const articlesPath = useRouteRef(articlesRouteRef);\n const usersPath = useRouteRef(usersRouteRef);\n const tagsPath = useRouteRef(tagsRouteRef);\n const linksPath = useRouteRef(linksRouteRef);\n const collectionsPath = useRouteRef(collectionsRouteRef);\n const entitiesPath = useRouteRef(entitiesRouteRef);\n const favoritePath = useRouteRef(favoriteQuestionsRouteRef);\n const homePath = useRouteRef(qetaRouteRef);\n // qetaRouteRef gives the base path of the plugin, e.g. /qeta\n const rootPath = homePath();\n\n // Matchers\n const isQuestions = matchPath(\n { path: questionsPath(), end: true },\n location.pathname,\n );\n const isAsk =\n matchPath(\n { path: `${rootPath}${askRouteRef.path}`, end: true },\n location.pathname,\n ) ||\n matchPath(\n { path: `${rootPath}${editQuestionRouteRef.path}`, end: true },\n location.pathname,\n );\n\n const isArticles = matchPath(\n { path: articlesPath(), end: true },\n location.pathname,\n );\n const isUsers = matchPath(\n { path: usersPath(), end: true },\n location.pathname,\n );\n const userMatch = matchPath(\n { path: `${rootPath}${userRouteRef.path}` },\n location.pathname,\n );\n const isTags = matchPath({ path: tagsPath(), end: true }, location.pathname);\n const tagMatch = matchPath(\n { path: `${rootPath}${tagRouteRef.path}` },\n location.pathname,\n );\n const isCollections = matchPath(\n { path: collectionsPath(), end: true },\n location.pathname,\n );\n const isEntities = matchPath(\n { path: entitiesPath(), end: true },\n location.pathname,\n );\n const entityMatch = matchPath(\n { path: `${rootPath}${entityRouteRef.path}` },\n location.pathname,\n );\n const isLinks = matchPath(\n { path: linksPath(), end: true },\n location.pathname,\n );\n const isFavorite = matchPath(\n { path: favoritePath(), end: true },\n location.pathname,\n );\n // Home is tricky because it's root, checking others first might be safer or check exact root\n const isHome =\n matchPath({ path: homePath(), end: true }, location.pathname) ||\n location.pathname === homePath();\n\n const [entityRef, setEntityRef] = useState<string | undefined>(undefined);\n const [tags, setTags] = useState<string[] | undefined>(undefined);\n const [userRef, setUserRef] = useState<string | undefined>(undefined);\n\n useEffect(() => {\n if (isQuestions || isArticles || isLinks) {\n setEntityRef(searchParams.get('entity') ?? undefined);\n setTags(filterTags(searchParams.get('tags')));\n setUserRef(undefined);\n } else if (tagMatch) {\n if (tagMatch.params.tag) {\n setTags([tagMatch.params.tag]);\n }\n setEntityRef(undefined);\n setUserRef(undefined);\n } else if (userMatch) {\n if (userMatch.params['*']) {\n setUserRef(userMatch.params['*']);\n }\n setTags(undefined);\n setEntityRef(undefined);\n } else if (entityMatch) {\n if (entityMatch.params.entityRef) {\n setEntityRef(entityMatch.params.entityRef);\n }\n setTags(undefined);\n setUserRef(undefined);\n } else {\n setTags(undefined);\n setEntityRef(undefined);\n setUserRef(undefined);\n }\n }, [\n searchParams,\n isQuestions,\n isArticles,\n isLinks,\n tagMatch,\n userMatch,\n entityMatch,\n location.pathname,\n ]);\n\n let content = null;\n\n if (isHome) {\n content = <HomeRightContent />;\n } else if (isAsk) {\n content = <AskRightContent />;\n } else if (isQuestions) {\n content = <QuestionsRightContent tags={tags} entityRef={entityRef} />;\n } else if (isArticles) {\n content = <ArticlesRightContent tags={tags} entityRef={entityRef} />;\n } else if (isLinks) {\n content = <LinksRightContent tags={tags} entityRef={entityRef} />;\n } else if (isFavorite) {\n content = <FavoriteRightContent />;\n } else if (isUsers) {\n content = <UsersRightContent />;\n } else if (tagMatch) {\n content = <TagRightContent tags={tags} />;\n } else if (userMatch && userRef) {\n content = null;\n } else if (isTags) {\n content = <TagsRightContent />;\n } else if (isEntities) {\n content = <EntitiesRightContent />;\n } else if (entityMatch && entityRef) {\n content = <EntityRightContent entityRef={entityRef} />;\n } else if (isCollections) {\n content = <CollectionsRightContent />;\n }\n\n if (!content) {\n content = <DefaultRightContent />;\n }\n\n return (\n <Box className={classes.container}>\n <Box display=\"flex\" justifyContent={compact ? 'center' : 'flex-start'}>\n <Tooltip\n title={compact ? t('rightMenu.expand') : t('rightMenu.collapse')}\n placement=\"left\"\n >\n <IconButton\n onClick={onToggle}\n size=\"small\"\n className={compact ? '' : classes.toggleButton}\n >\n {compact ? (\n <ChevronLeftIcon />\n ) : (\n <MenuOpenIcon style={{ transform: 'scaleX(-1)' }} />\n )}\n </IconButton>\n </Tooltip>\n </Box>\n <Box className={classes.content}>{content}</Box>\n </Box>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RightContent.esm.js","sources":["../../../src/components/RightContent/RightContent.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport { AskRightContent } from './AskRightContent';\nimport {\n articlesRouteRef,\n articleRouteRef,\n askRouteRef,\n collectionsRouteRef,\n editQuestionRouteRef,\n entitiesRouteRef,\n entityRouteRef,\n favoriteQuestionsRouteRef,\n linksRouteRef,\n linkRouteRef,\n qetaRouteRef,\n questionsRouteRef,\n questionRouteRef,\n tagRouteRef,\n tagsRouteRef,\n userRouteRef,\n usersRouteRef,\n qetaTranslationRef,\n} from '@drodil/backstage-plugin-qeta-react';\nimport { Box, IconButton, makeStyles, Tooltip } from '@material-ui/core';\nimport { matchPath, useLocation, useSearchParams } from 'react-router-dom';\nimport { filterTags } from '@drodil/backstage-plugin-qeta-common';\nimport { HomeRightContent } from './HomeRightContent';\nimport { QuestionsRightContent } from './QuestionsRightContent';\nimport { ArticlesRightContent } from './ArticlesRightContent';\nimport { LinksRightContent } from './LinksRightContent';\nimport { FavoriteRightContent } from './FavoriteRightContent';\nimport { UsersRightContent } from './UsersRightContent';\nimport { TagRightContent } from './TagRightContent';\nimport { TagsRightContent } from './TagsRightContent';\nimport { EntitiesRightContent } from './EntitiesRightContent';\nimport { EntityRightContent } from './EntityRightContent';\nimport { CollectionsRightContent } from './CollectionsRightContent';\nimport MenuOpenIcon from '@material-ui/icons/MenuOpen';\nimport ChevronLeftIcon from '@material-ui/icons/ChevronLeft';\n\nconst useStyles = makeStyles(theme => ({\n container: {\n width: (props: { compact: boolean }) => (props.compact ? '72px' : '300px'),\n padding: (props: { compact: boolean }) =>\n props.compact ? theme.spacing(1) : theme.spacing(0, 0, 0, 2),\n transition: 'width 0.2s ease-in-out',\n display: 'flex',\n flexDirection: 'column',\n overflowX: 'hidden',\n },\n toggleButton: {\n marginRight: 'auto',\n marginBottom: theme.spacing(1),\n },\n content: {\n display: (props: { compact: boolean }) =>\n props.compact ? 'none' : 'block',\n opacity: (props: { compact: boolean }) => (props.compact ? 0 : 1),\n transition: 'opacity 0.2s ease-in-out',\n },\n}));\n\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { DefaultRightContent } from './DefaultRightContent';\nimport { PostRightContent } from './PostRightContent';\n\nexport const RightContent = (props: {\n compact?: boolean;\n onToggle?: () => void;\n}) => {\n const { compact = false, onToggle } = props;\n const classes = useStyles({ compact });\n const location = useLocation();\n const [searchParams] = useSearchParams();\n const { t } = useTranslationRef(qetaTranslationRef);\n\n // Route Refs\n const questionsPath = useRouteRef(questionsRouteRef);\n const articlesPath = useRouteRef(articlesRouteRef);\n const usersPath = useRouteRef(usersRouteRef);\n const tagsPath = useRouteRef(tagsRouteRef);\n const linksPath = useRouteRef(linksRouteRef);\n const collectionsPath = useRouteRef(collectionsRouteRef);\n const entitiesPath = useRouteRef(entitiesRouteRef);\n const favoritePath = useRouteRef(favoriteQuestionsRouteRef);\n const homePath = useRouteRef(qetaRouteRef);\n // qetaRouteRef gives the base path of the plugin, e.g. /qeta\n const rootPath = homePath();\n\n // Matchers\n const isQuestions = matchPath(\n { path: questionsPath(), end: true },\n location.pathname,\n );\n const isAsk =\n matchPath(\n { path: `${rootPath}${askRouteRef.path}`, end: true },\n location.pathname,\n ) ||\n matchPath(\n { path: `${rootPath}${editQuestionRouteRef.path}`, end: true },\n location.pathname,\n );\n\n const isArticles = matchPath(\n { path: articlesPath(), end: true },\n location.pathname,\n );\n const isUsers = matchPath(\n { path: usersPath(), end: true },\n location.pathname,\n );\n const userMatch = matchPath(\n { path: `${rootPath}${userRouteRef.path}` },\n location.pathname,\n );\n const isTags = matchPath({ path: tagsPath(), end: true }, location.pathname);\n const tagMatch = matchPath(\n { path: `${rootPath}${tagRouteRef.path}` },\n location.pathname,\n );\n const isCollections = matchPath(\n { path: collectionsPath(), end: true },\n location.pathname,\n );\n const isEntities = matchPath(\n { path: entitiesPath(), end: true },\n location.pathname,\n );\n const entityMatch = matchPath(\n { path: `${rootPath}${entityRouteRef.path}` },\n location.pathname,\n );\n const isLinks = matchPath(\n { path: linksPath(), end: true },\n location.pathname,\n );\n const isFavorite = matchPath(\n { path: favoritePath(), end: true },\n location.pathname,\n );\n const questionMatch = matchPath(\n { path: `${rootPath}${questionRouteRef.path}` },\n location.pathname,\n );\n const articleMatch = matchPath(\n { path: `${rootPath}${articleRouteRef.path}` },\n location.pathname,\n );\n const linkMatch = matchPath(\n { path: `${rootPath}${linkRouteRef.path}` },\n location.pathname,\n );\n const isPostPage = !!(questionMatch || articleMatch || linkMatch);\n const isHome =\n matchPath({ path: homePath(), end: true }, location.pathname) ||\n location.pathname === homePath();\n\n const [entityRef, setEntityRef] = useState<string | undefined>(undefined);\n const [tags, setTags] = useState<string[] | undefined>(undefined);\n const [userRef, setUserRef] = useState<string | undefined>(undefined);\n\n useEffect(() => {\n if (isQuestions || isArticles || isLinks) {\n setEntityRef(searchParams.get('entity') ?? undefined);\n setTags(filterTags(searchParams.get('tags')));\n setUserRef(undefined);\n } else if (tagMatch) {\n if (tagMatch.params.tag) {\n setTags([tagMatch.params.tag]);\n }\n setEntityRef(undefined);\n setUserRef(undefined);\n } else if (userMatch) {\n if (userMatch.params['*']) {\n setUserRef(userMatch.params['*']);\n }\n setTags(undefined);\n setEntityRef(undefined);\n } else if (entityMatch) {\n if (entityMatch.params.entityRef) {\n setEntityRef(entityMatch.params.entityRef);\n }\n setTags(undefined);\n setUserRef(undefined);\n } else {\n setTags(undefined);\n setEntityRef(undefined);\n setUserRef(undefined);\n }\n }, [\n searchParams,\n isQuestions,\n isArticles,\n isLinks,\n tagMatch,\n userMatch,\n entityMatch,\n location.pathname,\n ]);\n\n let content = null;\n\n if (isHome) {\n content = <HomeRightContent />;\n } else if (isAsk) {\n content = <AskRightContent />;\n } else if (isPostPage) {\n const id =\n questionMatch?.params.id ||\n articleMatch?.params.id ||\n linkMatch?.params.id;\n content = <PostRightContent id={id} />;\n } else if (isQuestions) {\n content = <QuestionsRightContent tags={tags} entityRef={entityRef} />;\n } else if (isArticles) {\n content = <ArticlesRightContent tags={tags} entityRef={entityRef} />;\n } else if (isLinks) {\n content = <LinksRightContent tags={tags} entityRef={entityRef} />;\n } else if (isFavorite) {\n content = <FavoriteRightContent />;\n } else if (isUsers) {\n content = <UsersRightContent />;\n } else if (tagMatch) {\n content = <TagRightContent tags={tags} />;\n } else if (userMatch && userRef) {\n content = null;\n } else if (isTags) {\n content = <TagsRightContent />;\n } else if (isEntities) {\n content = <EntitiesRightContent />;\n } else if (entityMatch && entityRef) {\n content = <EntityRightContent entityRef={entityRef} />;\n } else if (isCollections) {\n content = <CollectionsRightContent />;\n }\n\n if (!content) {\n content = <DefaultRightContent />;\n }\n\n return (\n <Box className={classes.container}>\n <Box display=\"flex\" justifyContent={compact ? 'center' : 'flex-start'}>\n <Tooltip\n title={compact ? t('rightMenu.expand') : t('rightMenu.collapse')}\n placement=\"left\"\n >\n <IconButton\n onClick={onToggle}\n size=\"small\"\n className={compact ? '' : classes.toggleButton}\n >\n {compact ? (\n <ChevronLeftIcon />\n ) : (\n <MenuOpenIcon style={{ transform: 'scaleX(-1)' }} />\n )}\n </IconButton>\n </Tooltip>\n </Box>\n <Box className={classes.content}>{content}</Box>\n </Box>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { qetaTranslationRef, useQetaApi, PostHighlightListContent } from '@drodil/backstage-plugin-qeta-react';
3
+ import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
4
+
5
+ const SimilarPosts = (props) => {
6
+ const { post } = props;
7
+ const { t } = useTranslationRef(qetaTranslationRef);
8
+ const { value: similarPosts, loading } = useQetaApi(
9
+ (api) => {
10
+ if (!post.title || post.title.length === 0) {
11
+ return Promise.resolve({ posts: [], total: 0 });
12
+ }
13
+ return api.suggest({
14
+ title: post.title,
15
+ content: post.content,
16
+ tags: post.tags,
17
+ entities: post.entities
18
+ });
19
+ },
20
+ [post.id, post.title, post.content, post.tags, post.entities]
21
+ );
22
+ const filteredPosts = (similarPosts?.posts ?? []).filter(
23
+ (p) => p.id !== post.id
24
+ );
25
+ if (filteredPosts.length === 0) {
26
+ return null;
27
+ }
28
+ return /* @__PURE__ */ jsx(
29
+ PostHighlightListContent,
30
+ {
31
+ title: t("rightMenu.similarPosts", {}),
32
+ posts: filteredPosts,
33
+ loading,
34
+ disableLoading: true
35
+ }
36
+ );
37
+ };
38
+
39
+ export { SimilarPosts };
40
+ //# sourceMappingURL=SimilarPosts.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SimilarPosts.esm.js","sources":["../../../src/components/RightContent/SimilarPosts.tsx"],"sourcesContent":["import {\n PostHighlightListContent,\n qetaTranslationRef,\n useQetaApi,\n} from '@drodil/backstage-plugin-qeta-react';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { Post } from '@drodil/backstage-plugin-qeta-common';\n\nexport const SimilarPosts = (props: { post: Post }) => {\n const { post } = props;\n const { t } = useTranslationRef(qetaTranslationRef);\n\n const { value: similarPosts, loading } = useQetaApi(\n api => {\n if (!post.title || post.title.length === 0) {\n return Promise.resolve({ posts: [], total: 0 });\n }\n return api.suggest({\n title: post.title,\n content: post.content,\n tags: post.tags,\n entities: post.entities,\n });\n },\n [post.id, post.title, post.content, post.tags, post.entities],\n );\n\n const filteredPosts = (similarPosts?.posts ?? []).filter(\n p => p.id !== post.id,\n );\n\n if (filteredPosts.length === 0) {\n return null;\n }\n\n return (\n <PostHighlightListContent\n title={t('rightMenu.similarPosts', {})}\n posts={filteredPosts}\n loading={loading}\n disableLoading\n />\n );\n};\n"],"names":[],"mappings":";;;;AAQa,MAAA,YAAA,GAAe,CAAC,KAA0B,KAAA;AACrD,EAAM,MAAA,EAAE,MAAS,GAAA,KAAA;AACjB,EAAA,MAAM,EAAE,CAAA,EAAM,GAAA,iBAAA,CAAkB,kBAAkB,CAAA;AAElD,EAAA,MAAM,EAAE,KAAA,EAAO,YAAc,EAAA,OAAA,EAAY,GAAA,UAAA;AAAA,IACvC,CAAO,GAAA,KAAA;AACL,MAAA,IAAI,CAAC,IAAK,CAAA,KAAA,IAAS,IAAK,CAAA,KAAA,CAAM,WAAW,CAAG,EAAA;AAC1C,QAAO,OAAA,OAAA,CAAQ,QAAQ,EAAE,KAAA,EAAO,EAAI,EAAA,KAAA,EAAO,GAAG,CAAA;AAAA;AAEhD,MAAA,OAAO,IAAI,OAAQ,CAAA;AAAA,QACjB,OAAO,IAAK,CAAA,KAAA;AAAA,QACZ,SAAS,IAAK,CAAA,OAAA;AAAA,QACd,MAAM,IAAK,CAAA,IAAA;AAAA,QACX,UAAU,IAAK,CAAA;AAAA,OAChB,CAAA;AAAA,KACH;AAAA,IACA,CAAC,IAAK,CAAA,EAAA,EAAI,IAAK,CAAA,KAAA,EAAO,KAAK,OAAS,EAAA,IAAA,CAAK,IAAM,EAAA,IAAA,CAAK,QAAQ;AAAA,GAC9D;AAEA,EAAA,MAAM,aAAiB,GAAA,CAAA,YAAA,EAAc,KAAS,IAAA,EAAI,EAAA,MAAA;AAAA,IAChD,CAAA,CAAA,KAAK,CAAE,CAAA,EAAA,KAAO,IAAK,CAAA;AAAA,GACrB;AAEA,EAAI,IAAA,aAAA,CAAc,WAAW,CAAG,EAAA;AAC9B,IAAO,OAAA,IAAA;AAAA;AAGT,EACE,uBAAA,GAAA;AAAA,IAAC,wBAAA;AAAA,IAAA;AAAA,MACC,KAAO,EAAA,CAAA,CAAE,wBAA0B,EAAA,EAAE,CAAA;AAAA,MACrC,KAAO,EAAA,aAAA;AAAA,MACP,OAAA;AAAA,MACA,cAAc,EAAA;AAAA;AAAA,GAChB;AAEJ;;;;"}
@@ -1,13 +1,13 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
- import React from 'react';
3
2
  import { useQetaContext, qetaTranslationRef, useQetaApi, PostHighlightListContent } from '@drodil/backstage-plugin-qeta-react';
4
3
  import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
4
+ import { useState, useEffect } from 'react';
5
5
 
6
6
  const SimilarQuestions = () => {
7
7
  const { draftQuestion } = useQetaContext();
8
8
  const { t } = useTranslationRef(qetaTranslationRef);
9
- const [debouncedDraftQuestion, setDebouncedDraftQuestion] = React.useState(draftQuestion);
10
- React.useEffect(() => {
9
+ const [debouncedDraftQuestion, setDebouncedDraftQuestion] = useState(draftQuestion);
10
+ useEffect(() => {
11
11
  const handler = setTimeout(() => {
12
12
  setDebouncedDraftQuestion(draftQuestion);
13
13
  }, 1500);
@@ -29,13 +29,13 @@ const SimilarQuestions = () => {
29
29
  },
30
30
  [debouncedDraftQuestion]
31
31
  );
32
- const [displayQuestions, setDisplayQuestions] = React.useState([]);
33
- React.useEffect(() => {
32
+ const [displayQuestions, setDisplayQuestions] = useState([]);
33
+ useEffect(() => {
34
34
  if (questions) {
35
35
  setDisplayQuestions(questions.posts);
36
36
  }
37
37
  }, [questions]);
38
- React.useEffect(() => {
38
+ useEffect(() => {
39
39
  if ((!draftQuestion || draftQuestion.title.length === 0) && displayQuestions.length > 0) {
40
40
  setDisplayQuestions([]);
41
41
  }
@@ -1 +1 @@
1
- {"version":3,"file":"SimilarQuestions.esm.js","sources":["../../../src/components/RightContent/SimilarQuestions.tsx"],"sourcesContent":["import React from 'react';\n\nimport {\n PostHighlightListContent,\n qetaTranslationRef,\n useQetaApi,\n useQetaContext,\n} from '@drodil/backstage-plugin-qeta-react';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { Post } from '@drodil/backstage-plugin-qeta-common';\n\nexport const SimilarQuestions = () => {\n const { draftQuestion } = useQetaContext();\n const { t } = useTranslationRef(qetaTranslationRef);\n const [debouncedDraftQuestion, setDebouncedDraftQuestion] =\n React.useState(draftQuestion);\n\n React.useEffect(() => {\n const handler = setTimeout(() => {\n setDebouncedDraftQuestion(draftQuestion);\n }, 1500);\n\n return () => {\n clearTimeout(handler);\n };\n }, [draftQuestion]);\n\n const { value: questions, loading } = useQetaApi(\n api => {\n if (\n !debouncedDraftQuestion ||\n debouncedDraftQuestion.title.length === 0\n ) {\n return Promise.resolve({ posts: [], total: 0 });\n }\n return api.suggest({\n title: debouncedDraftQuestion.title,\n content: debouncedDraftQuestion.content,\n tags: debouncedDraftQuestion.tags,\n entities: debouncedDraftQuestion.entities,\n });\n },\n [debouncedDraftQuestion],\n );\n\n const [displayQuestions, setDisplayQuestions] = React.useState<Post[]>([]);\n\n React.useEffect(() => {\n if (questions) {\n setDisplayQuestions(questions.posts);\n }\n }, [questions]);\n\n React.useEffect(() => {\n if (\n (!draftQuestion || draftQuestion.title.length === 0) &&\n displayQuestions.length > 0\n ) {\n setDisplayQuestions([]);\n }\n }, [draftQuestion, displayQuestions]);\n\n if (displayQuestions.length === 0) {\n return null;\n }\n\n return (\n <PostHighlightListContent\n title={t('rightMenu.similarQuestions')}\n posts={displayQuestions}\n loading={loading}\n disableLoading\n />\n );\n};\n"],"names":[],"mappings":";;;;;AAWO,MAAM,mBAAmB,MAAM;AACpC,EAAM,MAAA,EAAE,aAAc,EAAA,GAAI,cAAe,EAAA;AACzC,EAAA,MAAM,EAAE,CAAA,EAAM,GAAA,iBAAA,CAAkB,kBAAkB,CAAA;AAClD,EAAA,MAAM,CAAC,sBAAwB,EAAA,yBAAyB,CACtD,GAAA,KAAA,CAAM,SAAS,aAAa,CAAA;AAE9B,EAAA,KAAA,CAAM,UAAU,MAAM;AACpB,IAAM,MAAA,OAAA,GAAU,WAAW,MAAM;AAC/B,MAAA,yBAAA,CAA0B,aAAa,CAAA;AAAA,OACtC,IAAI,CAAA;AAEP,IAAA,OAAO,MAAM;AACX,MAAA,YAAA,CAAa,OAAO,CAAA;AAAA,KACtB;AAAA,GACF,EAAG,CAAC,aAAa,CAAC,CAAA;AAElB,EAAA,MAAM,EAAE,KAAA,EAAO,SAAW,EAAA,OAAA,EAAY,GAAA,UAAA;AAAA,IACpC,CAAO,GAAA,KAAA;AACL,MAAA,IACE,CAAC,sBAAA,IACD,sBAAuB,CAAA,KAAA,CAAM,WAAW,CACxC,EAAA;AACA,QAAO,OAAA,OAAA,CAAQ,QAAQ,EAAE,KAAA,EAAO,EAAI,EAAA,KAAA,EAAO,GAAG,CAAA;AAAA;AAEhD,MAAA,OAAO,IAAI,OAAQ,CAAA;AAAA,QACjB,OAAO,sBAAuB,CAAA,KAAA;AAAA,QAC9B,SAAS,sBAAuB,CAAA,OAAA;AAAA,QAChC,MAAM,sBAAuB,CAAA,IAAA;AAAA,QAC7B,UAAU,sBAAuB,CAAA;AAAA,OAClC,CAAA;AAAA,KACH;AAAA,IACA,CAAC,sBAAsB;AAAA,GACzB;AAEA,EAAA,MAAM,CAAC,gBAAkB,EAAA,mBAAmB,IAAI,KAAM,CAAA,QAAA,CAAiB,EAAE,CAAA;AAEzE,EAAA,KAAA,CAAM,UAAU,MAAM;AACpB,IAAA,IAAI,SAAW,EAAA;AACb,MAAA,mBAAA,CAAoB,UAAU,KAAK,CAAA;AAAA;AACrC,GACF,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,KAAA,CAAM,UAAU,MAAM;AACpB,IACG,IAAA,CAAA,CAAC,iBAAiB,aAAc,CAAA,KAAA,CAAM,WAAW,CAClD,KAAA,gBAAA,CAAiB,SAAS,CAC1B,EAAA;AACA,MAAA,mBAAA,CAAoB,EAAE,CAAA;AAAA;AACxB,GACC,EAAA,CAAC,aAAe,EAAA,gBAAgB,CAAC,CAAA;AAEpC,EAAI,IAAA,gBAAA,CAAiB,WAAW,CAAG,EAAA;AACjC,IAAO,OAAA,IAAA;AAAA;AAGT,EACE,uBAAA,GAAA;AAAA,IAAC,wBAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,EAAE,4BAA4B,CAAA;AAAA,MACrC,KAAO,EAAA,gBAAA;AAAA,MACP,OAAA;AAAA,MACA,cAAc,EAAA;AAAA;AAAA,GAChB;AAEJ;;;;"}
1
+ {"version":3,"file":"SimilarQuestions.esm.js","sources":["../../../src/components/RightContent/SimilarQuestions.tsx"],"sourcesContent":["import {\n PostHighlightListContent,\n qetaTranslationRef,\n useQetaApi,\n useQetaContext,\n} from '@drodil/backstage-plugin-qeta-react';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { Post } from '@drodil/backstage-plugin-qeta-common';\nimport { useState, useEffect } from 'react';\n\nexport const SimilarQuestions = () => {\n const { draftQuestion } = useQetaContext();\n const { t } = useTranslationRef(qetaTranslationRef);\n const [debouncedDraftQuestion, setDebouncedDraftQuestion] =\n useState(draftQuestion);\n\n useEffect(() => {\n const handler = setTimeout(() => {\n setDebouncedDraftQuestion(draftQuestion);\n }, 1500);\n\n return () => {\n clearTimeout(handler);\n };\n }, [draftQuestion]);\n\n const { value: questions, loading } = useQetaApi(\n api => {\n if (\n !debouncedDraftQuestion ||\n debouncedDraftQuestion.title.length === 0\n ) {\n return Promise.resolve({ posts: [], total: 0 });\n }\n return api.suggest({\n title: debouncedDraftQuestion.title,\n content: debouncedDraftQuestion.content,\n tags: debouncedDraftQuestion.tags,\n entities: debouncedDraftQuestion.entities,\n });\n },\n [debouncedDraftQuestion],\n );\n\n const [displayQuestions, setDisplayQuestions] = useState<Post[]>([]);\n\n useEffect(() => {\n if (questions) {\n setDisplayQuestions(questions.posts);\n }\n }, [questions]);\n\n useEffect(() => {\n if (\n (!draftQuestion || draftQuestion.title.length === 0) &&\n displayQuestions.length > 0\n ) {\n setDisplayQuestions([]);\n }\n }, [draftQuestion, displayQuestions]);\n\n if (displayQuestions.length === 0) {\n return null;\n }\n\n return (\n <PostHighlightListContent\n title={t('rightMenu.similarQuestions')}\n posts={displayQuestions}\n loading={loading}\n disableLoading\n />\n );\n};\n"],"names":[],"mappings":";;;;;AAUO,MAAM,mBAAmB,MAAM;AACpC,EAAM,MAAA,EAAE,aAAc,EAAA,GAAI,cAAe,EAAA;AACzC,EAAA,MAAM,EAAE,CAAA,EAAM,GAAA,iBAAA,CAAkB,kBAAkB,CAAA;AAClD,EAAA,MAAM,CAAC,sBAAA,EAAwB,yBAAyB,CAAA,GACtD,SAAS,aAAa,CAAA;AAExB,EAAA,SAAA,CAAU,MAAM;AACd,IAAM,MAAA,OAAA,GAAU,WAAW,MAAM;AAC/B,MAAA,yBAAA,CAA0B,aAAa,CAAA;AAAA,OACtC,IAAI,CAAA;AAEP,IAAA,OAAO,MAAM;AACX,MAAA,YAAA,CAAa,OAAO,CAAA;AAAA,KACtB;AAAA,GACF,EAAG,CAAC,aAAa,CAAC,CAAA;AAElB,EAAA,MAAM,EAAE,KAAA,EAAO,SAAW,EAAA,OAAA,EAAY,GAAA,UAAA;AAAA,IACpC,CAAO,GAAA,KAAA;AACL,MAAA,IACE,CAAC,sBAAA,IACD,sBAAuB,CAAA,KAAA,CAAM,WAAW,CACxC,EAAA;AACA,QAAO,OAAA,OAAA,CAAQ,QAAQ,EAAE,KAAA,EAAO,EAAI,EAAA,KAAA,EAAO,GAAG,CAAA;AAAA;AAEhD,MAAA,OAAO,IAAI,OAAQ,CAAA;AAAA,QACjB,OAAO,sBAAuB,CAAA,KAAA;AAAA,QAC9B,SAAS,sBAAuB,CAAA,OAAA;AAAA,QAChC,MAAM,sBAAuB,CAAA,IAAA;AAAA,QAC7B,UAAU,sBAAuB,CAAA;AAAA,OAClC,CAAA;AAAA,KACH;AAAA,IACA,CAAC,sBAAsB;AAAA,GACzB;AAEA,EAAA,MAAM,CAAC,gBAAkB,EAAA,mBAAmB,CAAI,GAAA,QAAA,CAAiB,EAAE,CAAA;AAEnE,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,SAAW,EAAA;AACb,MAAA,mBAAA,CAAoB,UAAU,KAAK,CAAA;AAAA;AACrC,GACF,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,SAAA,CAAU,MAAM;AACd,IACG,IAAA,CAAA,CAAC,iBAAiB,aAAc,CAAA,KAAA,CAAM,WAAW,CAClD,KAAA,gBAAA,CAAiB,SAAS,CAC1B,EAAA;AACA,MAAA,mBAAA,CAAoB,EAAE,CAAA;AAAA;AACxB,GACC,EAAA,CAAC,aAAe,EAAA,gBAAgB,CAAC,CAAA;AAEpC,EAAI,IAAA,gBAAA,CAAiB,WAAW,CAAG,EAAA;AACjC,IAAO,OAAA,IAAA;AAAA;AAGT,EACE,uBAAA,GAAA;AAAA,IAAC,wBAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,EAAE,4BAA4B,CAAA;AAAA,MACrC,KAAO,EAAA,gBAAA;AAAA,MACP,OAAA;AAAA,MACA,cAAc,EAAA;AAAA;AAAA,GAChB;AAEJ;;;;"}
package/dist/index.d.ts CHANGED
@@ -30,6 +30,7 @@ declare const QetaPage: (props?: {
30
30
  remarkPlugins?: unified.PluggableList;
31
31
  rehypePlugins?: unified.PluggableList;
32
32
  }) => react_jsx_runtime.JSX.Element;
33
+ declare const QetaReviewPage: () => react_jsx_runtime.JSX.Element;
33
34
  declare const PostsTableCard: (props: _backstage_plugin_home_react.CardExtensionProps<{
34
35
  postType?: PostType;
35
36
  rowsPerPage?: number;
@@ -72,4 +73,4 @@ declare const StatisticsPage: () => react_jsx_runtime.JSX.Element;
72
73
 
73
74
  declare const TechDocsAskQuestionAddon: () => react_jsx_runtime.JSX.Element;
74
75
 
75
- export { Content, EntityPostsContainerCard, EntityPostsContent, EntityPostsGridCard, PostsTableCard, QetaPage, QetaSearchResultListItem, type QetaSearchResultListItemProps, QuestionsTableCard, StatisticsPage, TechDocsAskQuestionAddon, qetaPlugin };
76
+ export { Content, EntityPostsContainerCard, EntityPostsContent, EntityPostsGridCard, PostsTableCard, QetaPage, QetaReviewPage, QetaSearchResultListItem, type QetaSearchResultListItemProps, QuestionsTableCard, StatisticsPage, TechDocsAskQuestionAddon, qetaPlugin };
package/dist/index.esm.js CHANGED
@@ -1,4 +1,4 @@
1
- export { PostsTableCard, QetaPage, QetaSearchResultListItem, QuestionsTableCard, qetaPlugin } from './plugin.esm.js';
1
+ export { PostsTableCard, QetaPage, QetaReviewPage, QetaSearchResultListItem, QuestionsTableCard, qetaPlugin } from './plugin.esm.js';
2
2
  export { Content } from './components/PostsTableCard/Content.esm.js';
3
3
  export { EntityPostsContainerCard } from './components/EntityCards/EntityPostsContainerCard.esm.js';
4
4
  export { EntityPostsGridCard } from './components/EntityCards/EntityPostsGridCard.esm.js';
@@ -6,7 +6,7 @@ var keywords = [
6
6
  "frontend",
7
7
  "backstage.io"
8
8
  ];
9
- var version = "3.50.0";
9
+ var version = "3.51.0";
10
10
  var main = "src/index.ts";
11
11
  var types = "src/index.ts";
12
12
  var prepublishOnly = "yarn tsc && yarn build";
@@ -67,6 +67,7 @@ var dependencies = {
67
67
  "@backstage/frontend-plugin-api": "backstage:^",
68
68
  "@backstage/plugin-catalog-react": "backstage:^",
69
69
  "@backstage/plugin-home-react": "backstage:^",
70
+ "@backstage/plugin-permission-react": "backstage:^",
70
71
  "@backstage/plugin-search-common": "backstage:^",
71
72
  "@backstage/plugin-search-react": "backstage:^",
72
73
  "@backstage/plugin-signals-react": "backstage:^",
@@ -1 +1 @@
1
- {"version":3,"file":"package.json.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"package.json.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -24,6 +24,13 @@ const QetaPage = qetaPlugin.provide(
24
24
  mountPoint: qetaRouteRef
25
25
  })
26
26
  );
27
+ const QetaReviewPage = qetaPlugin.provide(
28
+ createRoutableExtension({
29
+ name: "QetaReviewPage",
30
+ component: () => import('./components/ReviewPage/index.esm.js').then((m) => m.ReviewPage),
31
+ mountPoint: qetaRouteRef
32
+ })
33
+ );
27
34
  const PostsTableCard = qetaPlugin.provide(
28
35
  createCardExtension({
29
36
  name: "PostsTableCard",
@@ -73,5 +80,5 @@ const QetaSearchResultListItem = qetaPlugin.provide(
73
80
  })
74
81
  );
75
82
 
76
- export { PostsTableCard, QetaPage, QetaSearchResultListItem, QuestionsTableCard, qetaPlugin };
83
+ export { PostsTableCard, QetaPage, QetaReviewPage, QetaSearchResultListItem, QuestionsTableCard, qetaPlugin };
77
84
  //# 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 { createSearchResultListItemExtension } from '@backstage/plugin-search-react';\nimport { qetaApiRef, qetaRouteRef } from '@drodil/backstage-plugin-qeta-react';\nimport { PostType, QetaClient } from '@drodil/backstage-plugin-qeta-common';\nimport type { QetaSearchResultListItemProps } from './components/QetaSearchResultListItem';\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', 'link'],\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\n/**\n * React extension used to render results on Search page or modal\n *\n * @public\n */\nexport const QetaSearchResultListItem: (\n props: QetaSearchResultListItemProps,\n) => JSX.Element | null = qetaPlugin.provide(\n createSearchResultListItemExtension({\n name: 'QetaSearchResultListItem',\n component: () =>\n import('./components/QetaSearchResultListItem').then(\n m => m.QetaSearchResultListItem,\n ),\n predicate: result => result.type === 'qeta',\n }),\n);\n"],"names":[],"mappings":";;;;;;AAaO,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,IAAM,EAAA,CAAC,UAAY,EAAA,SAAA,EAAW,MAAM,CAAA;AAAA,YACpC,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;AAO3B,MAAM,2BAEa,UAAW,CAAA,OAAA;AAAA,EACnC,mCAAoC,CAAA;AAAA,IAClC,IAAM,EAAA,0BAAA;AAAA,IACN,SAAW,EAAA,MACT,OAAO,oDAAuC,CAAE,CAAA,IAAA;AAAA,MAC9C,OAAK,CAAE,CAAA;AAAA,KACT;AAAA,IACF,SAAA,EAAW,CAAU,MAAA,KAAA,MAAA,CAAO,IAAS,KAAA;AAAA,GACtC;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 { createSearchResultListItemExtension } from '@backstage/plugin-search-react';\nimport { qetaApiRef, qetaRouteRef } from '@drodil/backstage-plugin-qeta-react';\nimport { PostType, QetaClient } from '@drodil/backstage-plugin-qeta-common';\nimport type { QetaSearchResultListItemProps } from './components/QetaSearchResultListItem';\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 QetaReviewPage = qetaPlugin.provide(\n createRoutableExtension({\n name: 'QetaReviewPage',\n component: () => import('./components/ReviewPage').then(m => m.ReviewPage),\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', 'link'],\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\n/**\n * React extension used to render results on Search page or modal\n *\n * @public\n */\nexport const QetaSearchResultListItem: (\n props: QetaSearchResultListItemProps,\n) => JSX.Element | null = qetaPlugin.provide(\n createSearchResultListItemExtension({\n name: 'QetaSearchResultListItem',\n component: () =>\n import('./components/QetaSearchResultListItem').then(\n m => m.QetaSearchResultListItem,\n ),\n predicate: result => result.type === 'qeta',\n }),\n);\n"],"names":[],"mappings":";;;;;;AAaO,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,uBAAwB,CAAA;AAAA,IACtB,IAAM,EAAA,gBAAA;AAAA,IACN,SAAA,EAAW,MAAM,OAAO,sCAAyB,EAAE,IAAK,CAAA,CAAA,CAAA,KAAK,EAAE,UAAU,CAAA;AAAA,IACzE,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,IAAM,EAAA,CAAC,UAAY,EAAA,SAAA,EAAW,MAAM,CAAA;AAAA,YACpC,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;AAO3B,MAAM,2BAEa,UAAW,CAAA,OAAA;AAAA,EACnC,mCAAoC,CAAA;AAAA,IAClC,IAAM,EAAA,0BAAA;AAAA,IACN,SAAW,EAAA,MACT,OAAO,oDAAuC,CAAE,CAAA,IAAA;AAAA,MAC9C,OAAK,CAAE,CAAA;AAAA,KACT;AAAA,IACF,SAAA,EAAW,CAAU,MAAA,KAAA,MAAA,CAAO,IAAS,KAAA;AAAA,GACtC;AACH;;;;"}
package/package.json CHANGED
@@ -7,7 +7,7 @@
7
7
  "frontend",
8
8
  "backstage.io"
9
9
  ],
10
- "version": "3.50.0",
10
+ "version": "3.51.0",
11
11
  "main": "./dist/index.esm.js",
12
12
  "types": "./dist/index.d.ts",
13
13
  "prepublishOnly": "yarn tsc && yarn build",
@@ -80,12 +80,13 @@
80
80
  "@backstage/frontend-plugin-api": "^0.13.2",
81
81
  "@backstage/plugin-catalog-react": "^1.21.4",
82
82
  "@backstage/plugin-home-react": "^0.1.33",
83
+ "@backstage/plugin-permission-react": "^0.4.39",
83
84
  "@backstage/plugin-search-common": "^1.2.21",
84
85
  "@backstage/plugin-search-react": "^1.10.1",
85
86
  "@backstage/plugin-signals-react": "^0.0.18",
86
87
  "@backstage/plugin-techdocs-react": "^1.3.6",
87
- "@drodil/backstage-plugin-qeta-common": "^3.50.0",
88
- "@drodil/backstage-plugin-qeta-react": "^3.50.0",
88
+ "@drodil/backstage-plugin-qeta-common": "^3.51.0",
89
+ "@drodil/backstage-plugin-qeta-react": "^3.51.0",
89
90
  "@material-ui/core": "^4.12.2",
90
91
  "@material-ui/icons": "^4.11.3",
91
92
  "@material-ui/lab": "4.0.0-alpha.61",