@drodil/backstage-plugin-qeta 1.2.2 → 1.3.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.
@@ -1,9 +1,9 @@
1
1
  import React, { useEffect } from 'react';
2
- import { Button, Grid, useTheme, Tooltip, IconButton, Typography, Box, Modal, Backdrop, Card, CardContent, Chip, Link, Divider, TextField, Avatar, List, ListSubheader, ListItem, ListItemText } from '@material-ui/core';
2
+ import { Button, Grid, useTheme, Tooltip, IconButton, Typography, Box, Modal, Backdrop, Card, CardContent, Chip, Link, Divider, TextField, Avatar, List, ListSubheader, ListItem, ListItemText, Menu, MenuItem, ListItemIcon } from '@material-ui/core';
3
3
  import { Content, ContentHeader, InfoCard, MarkdownContent, WarningPanel, Page, Header } from '@backstage/core-components';
4
4
  import { useParams, useNavigate, Routes, Route } from 'react-router-dom';
5
5
  import 'react-mde/lib/styles/css/react-mde-all.css';
6
- import { A as AskForm, q as qetaApiRef, u as useStyles, g as getEntityTitle, a as getEntityUrl, f as formatEntityName, M as MarkdownEditor, b as useQetaApi, Q as QuestionsContainer } from './index-074b9dc0.esm.js';
6
+ import { A as AskForm, q as qetaApiRef, u as useStyles, g as getEntityTitle, a as getEntityUrl, f as formatEntityName, M as MarkdownEditor, b as useQetaApi, Q as QuestionsContainer, c as useIdentityApi } from './index-deb705e9.esm.js';
7
7
  import HomeOutlined from '@material-ui/icons/HomeOutlined';
8
8
  import ArrowDownward from '@material-ui/icons/ArrowDownward';
9
9
  import ArrowUpward from '@material-ui/icons/ArrowUpward';
@@ -15,10 +15,14 @@ import { compact } from 'lodash';
15
15
  import RelativeTime from 'react-relative-time';
16
16
  import { Alert, Skeleton } from '@material-ui/lab';
17
17
  import Delete from '@material-ui/icons/Delete';
18
+ import StarIcon from '@material-ui/icons/Star';
19
+ import StarOutlineIcon from '@material-ui/icons/StarOutline';
18
20
  import { useForm, Controller } from 'react-hook-form';
19
21
  import HelpOutline from '@material-ui/icons/HelpOutline';
20
22
  import LoyaltyOutlined from '@material-ui/icons/LoyaltyOutlined';
21
23
  import Whatshot from '@material-ui/icons/Whatshot';
24
+ import MoreVertIcon from '@material-ui/icons/MoreVert';
25
+ import AccountBox from '@material-ui/icons/AccountBox';
22
26
  import '@backstage/errors';
23
27
  import 'lodash/omitBy';
24
28
  import 'lodash/isEmpty';
@@ -177,6 +181,38 @@ const DeleteModal = (props) => {
177
181
  );
178
182
  };
179
183
 
184
+ const FavoriteButton = (props) => {
185
+ const [entity, setEntity] = React.useState(props.entity);
186
+ const qetaApi = useApi(qetaApiRef);
187
+ const favoriteQuestion = () => {
188
+ qetaApi.favoriteQuestion(entity.id).then((response) => {
189
+ setEntity(response);
190
+ });
191
+ };
192
+ const unfavoriteQuestion = () => {
193
+ qetaApi.unfavoriteQuestion(entity.id).then((response) => {
194
+ setEntity(response);
195
+ });
196
+ };
197
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, entity.favorite ? /* @__PURE__ */ React.createElement(Tooltip, { title: "Remove this question from favorites" }, /* @__PURE__ */ React.createElement(
198
+ IconButton,
199
+ {
200
+ "aria-label": "unfavorite",
201
+ size: "small",
202
+ onClick: unfavoriteQuestion
203
+ },
204
+ /* @__PURE__ */ React.createElement(StarIcon, null)
205
+ )) : /* @__PURE__ */ React.createElement(Tooltip, { title: "Mark this question as favorite" }, /* @__PURE__ */ React.createElement(
206
+ IconButton,
207
+ {
208
+ "aria-label": "favorite",
209
+ size: "small",
210
+ onClick: favoriteQuestion
211
+ },
212
+ /* @__PURE__ */ React.createElement(StarOutlineIcon, null)
213
+ )));
214
+ };
215
+
180
216
  const QuestionCard = (props) => {
181
217
  const { question } = props;
182
218
  const styles = useStyles();
@@ -200,7 +236,7 @@ const QuestionCard = (props) => {
200
236
  );
201
237
  }
202
238
  }, [catalogApi, question]);
203
- return /* @__PURE__ */ React.createElement(Card, { variant: "outlined" }, /* @__PURE__ */ React.createElement(CardContent, null, /* @__PURE__ */ React.createElement("div", { className: styles.questionCardVote }, /* @__PURE__ */ React.createElement(VoteButtons, { entity: question })), /* @__PURE__ */ React.createElement("div", { className: styles.questionCardContent }, /* @__PURE__ */ React.createElement(Typography, { variant: "body1", gutterBottom: true }, /* @__PURE__ */ React.createElement(MarkdownContent, { content: question.content, dialect: "gfm" })), /* @__PURE__ */ React.createElement(Box, { className: styles.questionCardMetadata }, /* @__PURE__ */ React.createElement(Grid, { container: true, spacing: 0, justifyContent: "space-around" }, /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 8 }, question.tags && question.tags.map((tag) => /* @__PURE__ */ React.createElement(
239
+ return /* @__PURE__ */ React.createElement(Card, { variant: "outlined" }, /* @__PURE__ */ React.createElement(CardContent, null, /* @__PURE__ */ React.createElement("div", { className: styles.questionCardVote }, /* @__PURE__ */ React.createElement(VoteButtons, { entity: question }), /* @__PURE__ */ React.createElement(FavoriteButton, { entity: question })), /* @__PURE__ */ React.createElement("div", { className: styles.questionCardContent }, /* @__PURE__ */ React.createElement(Typography, { variant: "body1", gutterBottom: true }, /* @__PURE__ */ React.createElement(MarkdownContent, { content: question.content, dialect: "gfm" })), /* @__PURE__ */ React.createElement(Box, { className: styles.questionCardMetadata }, /* @__PURE__ */ React.createElement(Grid, { container: true, spacing: 0, justifyContent: "space-around" }, /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 8 }, question.tags && question.tags.map((tag) => /* @__PURE__ */ React.createElement(
204
240
  Chip,
205
241
  {
206
242
  label: tag,
@@ -546,16 +582,16 @@ const QuestionHighlightList = (props) => {
546
582
  );
547
583
  };
548
584
 
549
- const HomePageContent = () => {
585
+ const FavoritePage = () => {
550
586
  const styles = useStyles();
551
- return /* @__PURE__ */ React.createElement(Content, null, /* @__PURE__ */ React.createElement(Grid, { container: true, spacing: 3 }, /* @__PURE__ */ React.createElement(Grid, { item: true, md: 12, lg: 9, xl: 10 }, /* @__PURE__ */ React.createElement(ContentHeader, { title: "All questions" }, /* @__PURE__ */ React.createElement(
587
+ return /* @__PURE__ */ React.createElement(Content, null, /* @__PURE__ */ React.createElement(ContentHeader, { title: "Your favorite questions" }, /* @__PURE__ */ React.createElement(
552
588
  Button,
553
589
  {
554
- href: "/qeta/tags",
590
+ href: "/qeta",
555
591
  className: styles.marginRight,
556
- startIcon: /* @__PURE__ */ React.createElement(LoyaltyOutlined, null)
592
+ startIcon: /* @__PURE__ */ React.createElement(HomeOutlined, null)
557
593
  },
558
- "Tags"
594
+ "Back to questions"
559
595
  ), /* @__PURE__ */ React.createElement(
560
596
  Button,
561
597
  {
@@ -564,6 +600,65 @@ const HomePageContent = () => {
564
600
  startIcon: /* @__PURE__ */ React.createElement(HelpOutline, null)
565
601
  },
566
602
  "Ask question"
603
+ )), /* @__PURE__ */ React.createElement(QuestionsContainer, { favorite: true }));
604
+ };
605
+
606
+ const MoreMenu = () => {
607
+ const [anchorEl, setAnchorEl] = React.useState(null);
608
+ const open = Boolean(anchorEl);
609
+ const styles = useStyles();
610
+ const {
611
+ value: user,
612
+ loading: loadingUser,
613
+ error: userError
614
+ } = useIdentityApi((api) => api.getBackstageIdentity(), []);
615
+ const handleMenuOpen = (event) => {
616
+ setAnchorEl(event.currentTarget);
617
+ };
618
+ const handleMenuClose = () => {
619
+ setAnchorEl(null);
620
+ };
621
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Tooltip, { arrow: true, title: "More" }, /* @__PURE__ */ React.createElement(
622
+ IconButton,
623
+ {
624
+ "aria-label": "more",
625
+ "aria-controls": "long-menu",
626
+ "aria-haspopup": "true",
627
+ onClick: handleMenuOpen
628
+ },
629
+ /* @__PURE__ */ React.createElement(MoreVertIcon, null)
630
+ )), /* @__PURE__ */ React.createElement(
631
+ Menu,
632
+ {
633
+ id: "long-menu",
634
+ anchorEl,
635
+ keepMounted: true,
636
+ open,
637
+ getContentAnchorEl: null,
638
+ anchorOrigin: {
639
+ vertical: "bottom",
640
+ horizontal: "center"
641
+ },
642
+ transformOrigin: {
643
+ vertical: "top",
644
+ horizontal: "center"
645
+ },
646
+ onClose: handleMenuClose
647
+ },
648
+ /* @__PURE__ */ React.createElement(MenuItem, { component: "a", href: "/qeta/tags" }, /* @__PURE__ */ React.createElement(ListItemIcon, { className: styles.menuIcon }, /* @__PURE__ */ React.createElement(LoyaltyOutlined, { fontSize: "small" })), "Tags"),
649
+ user && !loadingUser && !userError && /* @__PURE__ */ React.createElement(MenuItem, { component: "a", href: `/qeta/users/${user == null ? void 0 : user.userEntityRef}` }, /* @__PURE__ */ React.createElement(ListItemIcon, { className: styles.menuIcon }, /* @__PURE__ */ React.createElement(AccountBox, { fontSize: "small" })), "My questions"),
650
+ /* @__PURE__ */ React.createElement(MenuItem, { component: "a", href: "/qeta/questions/favorite" }, /* @__PURE__ */ React.createElement(ListItemIcon, { className: styles.menuIcon }, /* @__PURE__ */ React.createElement(StarIcon, { fontSize: "small" })), "Favorite questions")
651
+ ));
652
+ };
653
+ const HomePageContent = () => {
654
+ return /* @__PURE__ */ React.createElement(Content, null, /* @__PURE__ */ React.createElement(Grid, { container: true, spacing: 3 }, /* @__PURE__ */ React.createElement(Grid, { item: true, md: 12, lg: 9, xl: 10 }, /* @__PURE__ */ React.createElement(ContentHeader, { title: "All questions" }, /* @__PURE__ */ React.createElement(MoreMenu, null), /* @__PURE__ */ React.createElement(
655
+ Button,
656
+ {
657
+ variant: "contained",
658
+ href: "/qeta/ask",
659
+ startIcon: /* @__PURE__ */ React.createElement(HelpOutline, null)
660
+ },
661
+ "Ask question"
567
662
  )), /* @__PURE__ */ React.createElement(QuestionsContainer, null)), /* @__PURE__ */ React.createElement(Grid, { item: true, lg: 3, xl: 2 }, /* @__PURE__ */ React.createElement(
568
663
  QuestionHighlightList,
569
664
  {
@@ -590,8 +685,8 @@ const HomePageContent = () => {
590
685
  };
591
686
  const HomePage = (props) => {
592
687
  var _a;
593
- return /* @__PURE__ */ React.createElement(Page, { themeId: "tool" }, /* @__PURE__ */ React.createElement(Header, { title: (_a = props.title) != null ? _a : "Q&A", subtitle: props.subtitle }, props.headerElements), /* @__PURE__ */ React.createElement(Routes, null, /* @__PURE__ */ React.createElement(Route, { path: "/", element: /* @__PURE__ */ React.createElement(HomePageContent, null) }), /* @__PURE__ */ React.createElement(Route, { path: "/ask", element: /* @__PURE__ */ React.createElement(AskPage, null) }), /* @__PURE__ */ React.createElement(Route, { path: "/questions/:id/edit", element: /* @__PURE__ */ React.createElement(AskPage, null) }), /* @__PURE__ */ React.createElement(Route, { path: "/questions/:id", element: /* @__PURE__ */ React.createElement(QuestionPage, null) }), /* @__PURE__ */ React.createElement(Route, { path: "/tags", element: /* @__PURE__ */ React.createElement(TagPage, null) }), /* @__PURE__ */ React.createElement(Route, { path: "/tags/:tag", element: /* @__PURE__ */ React.createElement(TagPage, null) }), /* @__PURE__ */ React.createElement(Route, { path: "/users/*", element: /* @__PURE__ */ React.createElement(UserPage, null) })));
688
+ return /* @__PURE__ */ React.createElement(Page, { themeId: "tool" }, /* @__PURE__ */ React.createElement(Header, { title: (_a = props.title) != null ? _a : "Q&A", subtitle: props.subtitle }, props.headerElements), /* @__PURE__ */ React.createElement(Routes, null, /* @__PURE__ */ React.createElement(Route, { path: "/", element: /* @__PURE__ */ React.createElement(HomePageContent, null) }), /* @__PURE__ */ React.createElement(Route, { path: "/ask", element: /* @__PURE__ */ React.createElement(AskPage, null) }), /* @__PURE__ */ React.createElement(Route, { path: "/questions/favorite", element: /* @__PURE__ */ React.createElement(FavoritePage, null) }), /* @__PURE__ */ React.createElement(Route, { path: "/questions/:id/edit", element: /* @__PURE__ */ React.createElement(AskPage, null) }), /* @__PURE__ */ React.createElement(Route, { path: "/questions/:id", element: /* @__PURE__ */ React.createElement(QuestionPage, null) }), /* @__PURE__ */ React.createElement(Route, { path: "/tags", element: /* @__PURE__ */ React.createElement(TagPage, null) }), /* @__PURE__ */ React.createElement(Route, { path: "/tags/:tag", element: /* @__PURE__ */ React.createElement(TagPage, null) }), /* @__PURE__ */ React.createElement(Route, { path: "/users/*", element: /* @__PURE__ */ React.createElement(UserPage, null) })));
594
689
  };
595
690
 
596
691
  export { HomePage };
597
- //# sourceMappingURL=index-9a18f5f5.esm.js.map
692
+ //# sourceMappingURL=index-b5213dd7.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-b5213dd7.esm.js","sources":["../../src/components/AskPage/AskPage.tsx","../../src/components/QuestionPage/VoteButtons.tsx","../../src/components/DeleteModal/DeleteModal.tsx","../../src/components/QuestionPage/FavoriteButton.tsx","../../src/components/QuestionPage/QuestionCard.tsx","../../src/components/QuestionPage/AnswerForm.tsx","../../src/components/QuestionPage/AnswerCard.tsx","../../src/components/QuestionPage/QuestionPage.tsx","../../src/components/TagPage/TagsContainer.tsx","../../src/components/TagPage/TagPage.tsx","../../src/components/UserPage/UserPage.tsx","../../src/components/QuestionHighlightList/QuestionHighlightList.tsx","../../src/components/FavoritePage/FavoritePage.tsx","../../src/components/HomePage/HomePage.tsx"],"sourcesContent":["import { Content, ContentHeader, InfoCard } from '@backstage/core-components';\nimport { Button, Grid } from '@material-ui/core';\nimport React from 'react';\nimport 'react-mde/lib/styles/css/react-mde-all.css';\nimport { AskForm } from '../AskForm/AskForm';\nimport HomeOutlined from '@material-ui/icons/HomeOutlined';\nimport { useParams } from 'react-router-dom';\n\nexport const AskPage = () => {\n const { id } = useParams();\n return (\n <Content>\n <ContentHeader title={id ? 'Edit question' : 'Ask question'}>\n <Button href=\"/qeta\" startIcon={<HomeOutlined />}>\n Back to questions\n </Button>\n </ContentHeader>\n <Grid container spacing={3} direction=\"column\">\n <Grid item>\n <InfoCard>\n <AskForm id={id} />\n </InfoCard>\n </Grid>\n </Grid>\n </Content>\n );\n};\n","import { AnswerResponse, qetaApiRef, QuestionResponse } from '../../api';\nimport {\n Box,\n IconButton,\n Tooltip,\n Typography,\n useTheme,\n} from '@material-ui/core';\nimport ArrowDownward from '@material-ui/icons/ArrowDownward';\nimport ArrowUpward from '@material-ui/icons/ArrowUpward';\nimport Check from '@material-ui/icons/Check';\nimport React from 'react';\nimport { useApi } from '@backstage/core-plugin-api';\n\nexport const VoteButtons = (props: {\n entity: QuestionResponse | AnswerResponse;\n question?: QuestionResponse;\n}) => {\n const [ownVote, setOwnVote] = React.useState(props.entity.ownVote ?? 0);\n const isCorrectAnswer =\n 'questionId' in props.entity ? props.entity.correct : false;\n const [correct, setCorrect] = React.useState(isCorrectAnswer);\n const [entity, setEntity] = React.useState<QuestionResponse | AnswerResponse>(\n props.entity,\n );\n const qetaApi = useApi(qetaApiRef);\n const theme = useTheme();\n const isQuestion = 'title' in entity;\n const own = props.entity.own ?? false;\n\n const voteUp = () => {\n if (isQuestion) {\n qetaApi.voteQuestionUp(entity.id).then(response => {\n setOwnVote(1);\n setEntity(response);\n });\n } else if ('questionId' in entity) {\n qetaApi.voteAnswerUp(entity.questionId, entity.id).then(response => {\n setOwnVote(1);\n setEntity(response);\n });\n }\n };\n\n const voteDown = () => {\n if (isQuestion) {\n qetaApi.voteQuestionDown(entity.id).then(response => {\n setOwnVote(-1);\n setEntity(response);\n });\n } else if ('questionId' in entity) {\n qetaApi.voteAnswerDown(entity.questionId, entity.id).then(response => {\n setOwnVote(-1);\n setEntity(response);\n });\n }\n };\n\n let correctTooltip = correct\n ? 'Mark answer as incorrect'\n : 'Mark answer as correct';\n if (!props.question?.own) {\n correctTooltip = correct ? 'This answer has been marked as correct' : '';\n }\n\n let voteUpTooltip = isQuestion\n ? 'This question is good'\n : 'This answer is good';\n if (own) {\n voteUpTooltip = isQuestion\n ? 'You cannot vote your own question'\n : 'You cannot vote your own answer';\n }\n\n let voteDownTooltip = isQuestion\n ? 'This question is not good'\n : 'This answer is not good';\n if (own) {\n voteDownTooltip = voteUpTooltip;\n }\n\n const toggleCorrectAnswer = () => {\n if (!('questionId' in entity)) {\n return;\n }\n if (correct) {\n qetaApi\n .markAnswerIncorrect(entity.questionId, entity.id)\n .then(response => {\n if (response) {\n setCorrect(false);\n }\n });\n } else {\n qetaApi.markAnswerCorrect(entity.questionId, entity.id).then(response => {\n setCorrect(response);\n });\n }\n };\n\n return (\n <React.Fragment>\n <Tooltip title={voteUpTooltip}>\n <IconButton\n aria-label=\"vote up\"\n color={ownVote > 0 ? 'primary' : 'default'}\n disabled={own}\n size=\"small\"\n onClick={voteUp}\n >\n <ArrowUpward />\n </IconButton>\n </Tooltip>\n <Typography variant=\"h6\">{entity.score}</Typography>\n <Tooltip title={voteDownTooltip}>\n <IconButton\n aria-label=\"vote down\"\n color={ownVote < 0 ? 'primary' : 'default'}\n disabled={own}\n size=\"small\"\n onClick={voteDown}\n >\n <ArrowDownward />\n </IconButton>\n </Tooltip>\n {'correct' in props.entity && (props.question?.own || correct) && (\n <Box>\n <Tooltip title={correctTooltip}>\n <IconButton\n aria-label=\"mark correct\"\n style={{\n color: correct ? theme.palette.success.main : undefined,\n }}\n size=\"small\"\n onClick={props.question?.own ? toggleCorrectAnswer : undefined}\n >\n <Check />\n </IconButton>\n </Tooltip>\n </Box>\n )}\n </React.Fragment>\n );\n};\n","import { AnswerResponse, qetaApiRef, QuestionResponse } from '../../api';\nimport { Backdrop, Box, Button, Modal, Typography } from '@material-ui/core';\nimport { Alert } from '@material-ui/lab';\nimport Delete from '@material-ui/icons/Delete';\nimport React from 'react';\nimport { useStyles } from '../../utils/hooks';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { useNavigate } from 'react-router-dom';\n\nexport const DeleteModal = (props: {\n entity: QuestionResponse | AnswerResponse;\n open: boolean;\n onClose: () => void;\n question?: QuestionResponse;\n}) => {\n const qetaApi = useApi(qetaApiRef);\n const navigate = useNavigate();\n const { entity, open, question, onClose } = props;\n const styles = useStyles();\n const [error, setError] = React.useState(false);\n const isQuestion = 'title' in entity;\n\n const title = isQuestion\n ? 'Are you sure you want to delete this question?'\n : 'Are you sure you want to delete this answer?';\n\n const handleDelete = () => {\n if (isQuestion) {\n qetaApi\n .deleteQuestion(entity.id)\n .catch(_ => setError(true))\n .then(ret => {\n if (ret) {\n onClose();\n navigate(`/qeta`);\n } else {\n setError(true);\n }\n });\n } else if (question) {\n qetaApi\n .deleteAnswer(question.id, entity.id)\n .catch(_ => setError(true))\n .then(ret => {\n if (ret) {\n onClose();\n window.location.reload();\n } else {\n setError(true);\n }\n });\n }\n };\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n aria-labelledby=\"modal-modal-title\"\n aria-describedby=\"modal-modal-description\"\n closeAfterTransition\n BackdropComponent={Backdrop}\n BackdropProps={{\n timeout: 500,\n }}\n >\n <Box className={styles.deleteModal}>\n {error && <Alert severity=\"error\">Failed to delete</Alert>}\n <Typography id=\"modal-modal-title\" variant=\"h6\" component=\"h2\">\n {title}\n </Typography>\n <Button onClick={handleDelete} startIcon={<Delete />} color=\"secondary\">\n Delete\n </Button>\n <Button onClick={onClose}>Cancel</Button>\n </Box>\n </Modal>\n );\n};\n","import { qetaApiRef, QuestionResponse } from '../../api';\nimport { IconButton, Tooltip } from '@material-ui/core';\nimport React from 'react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport StarIcon from '@material-ui/icons/Star';\nimport StarOutlineIcon from '@material-ui/icons/StarOutline';\n\nexport const FavoriteButton = (props: { entity: QuestionResponse }) => {\n const [entity, setEntity] = React.useState<QuestionResponse>(props.entity);\n const qetaApi = useApi(qetaApiRef);\n\n const favoriteQuestion = () => {\n qetaApi.favoriteQuestion(entity.id).then(response => {\n setEntity(response);\n });\n };\n\n const unfavoriteQuestion = () => {\n qetaApi.unfavoriteQuestion(entity.id).then(response => {\n setEntity(response);\n });\n };\n\n return (\n <React.Fragment>\n {entity.favorite ? (\n <Tooltip title=\"Remove this question from favorites\">\n <IconButton\n aria-label=\"unfavorite\"\n size=\"small\"\n onClick={unfavoriteQuestion}\n >\n <StarIcon />\n </IconButton>\n </Tooltip>\n ) : (\n <Tooltip title=\"Mark this question as favorite\">\n <IconButton\n aria-label=\"favorite\"\n size=\"small\"\n onClick={favoriteQuestion}\n >\n <StarOutlineIcon />\n </IconButton>\n </Tooltip>\n )}\n </React.Fragment>\n );\n};\n","import { QuestionResponse } from '../../api';\nimport {\n Box,\n Card,\n CardContent,\n Chip,\n Grid,\n Link,\n Tooltip,\n Typography,\n} from '@material-ui/core';\nimport React, { useEffect } from 'react';\nimport { MarkdownContent } from '@backstage/core-components';\nimport { VoteButtons } from './VoteButtons';\nimport { useStyles } from '../../utils/hooks';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { catalogApiRef } from '@backstage/plugin-catalog-react';\nimport { Entity, stringifyEntityRef } from '@backstage/catalog-model';\nimport {\n formatEntityName,\n getEntityTitle,\n getEntityUrl,\n} from '../../utils/utils';\nimport { compact } from 'lodash';\n// @ts-ignore\nimport RelativeTime from 'react-relative-time';\nimport { DeleteModal } from '../DeleteModal/DeleteModal';\nimport { FavoriteButton } from './FavoriteButton';\n\nexport const QuestionCard = (props: { question: QuestionResponse }) => {\n const { question } = props;\n const styles = useStyles();\n const catalogApi = useApi(catalogApiRef);\n const [entities, setEntities] = React.useState<Entity[]>([]);\n const [deleteModalOpen, setDeleteModalOpen] = React.useState(false);\n const handleDeleteModalOpen = () => setDeleteModalOpen(true);\n const handleDeleteModalClose = () => setDeleteModalOpen(false);\n\n useEffect(() => {\n if (question.entities && question.entities.length > 0) {\n catalogApi\n .getEntitiesByRefs({\n entityRefs: question.entities,\n fields: [\n 'kind',\n 'metadata.name',\n 'metadata.namespace',\n 'metadata.title',\n ],\n })\n .catch(_ => setEntities([]))\n .then(data =>\n data ? setEntities(compact(data.items)) : setEntities([]),\n );\n }\n }, [catalogApi, question]);\n\n return (\n <Card variant=\"outlined\">\n <CardContent>\n <div className={styles.questionCardVote}>\n <VoteButtons entity={question} />\n <FavoriteButton entity={question} />\n </div>\n <div className={styles.questionCardContent}>\n <Typography variant=\"body1\" gutterBottom>\n <MarkdownContent content={question.content} dialect=\"gfm\" />\n </Typography>\n <Box className={styles.questionCardMetadata}>\n <Grid container spacing={0} justifyContent=\"space-around\">\n <Grid item xs={8}>\n {question.tags &&\n question.tags.map(tag => (\n <Chip\n label={tag}\n size=\"small\"\n component=\"a\"\n href={`/qeta/tags/${tag}`}\n clickable\n />\n ))}\n {entities &&\n entities.map(component => (\n <Tooltip\n title={\n component.metadata.description?.slice(0, 50) ??\n stringifyEntityRef(component)\n }\n arrow\n >\n <Chip\n label={getEntityTitle(component)}\n size=\"small\"\n variant=\"outlined\"\n component=\"a\"\n href={getEntityUrl(component)}\n clickable\n />\n </Tooltip>\n ))}\n </Grid>\n <Grid item xs={4} className={styles.questionCardAuthor}>\n Asked <RelativeTime value={question.created} /> by{' '}\n <Link href={`/qeta/users/${question.author}`}>\n {formatEntityName(question.author)}\n </Link>\n </Grid>\n </Grid>\n {question.own && (\n <Box className={styles.questionCardActions}>\n <Link underline=\"none\" href=\"#\" onClick={handleDeleteModalOpen}>\n Delete\n </Link>\n <Link\n underline=\"none\"\n href={`/qeta/questions/${question.id}/edit`}\n >\n Edit\n </Link>\n <DeleteModal\n open={deleteModalOpen}\n onClose={handleDeleteModalClose}\n entity={question}\n />\n </Box>\n )}\n </Box>\n </div>\n </CardContent>\n </Card>\n );\n};\n","import { WarningPanel } from '@backstage/core-components';\nimport { Button, Typography } from '@material-ui/core';\nimport React, { useEffect } from 'react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport {\n AnswerRequest,\n AnswerResponse,\n qetaApiRef,\n QuestionResponse,\n} from '../../api';\nimport { useStyles } from '../../utils/hooks';\nimport { Controller, useForm } from 'react-hook-form';\nimport { MarkdownEditor } from '../MarkdownEditor/MarkdownEditor';\n\nconst getDefaultValues = (questionId: number) => {\n return { questionId, answer: '' };\n};\n\nexport const AnswerForm = (props: {\n question: QuestionResponse;\n onPost: (answer: AnswerResponse) => void;\n id?: number;\n}) => {\n const { question, onPost, id } = props;\n const [values, setValues] = React.useState(getDefaultValues(question.id));\n const [error, setError] = React.useState(false);\n const qetaApi = useApi(qetaApiRef);\n const styles = useStyles();\n\n const {\n handleSubmit,\n control,\n formState: { errors },\n reset,\n } = useForm<AnswerRequest>({\n values,\n defaultValues: getDefaultValues(question.id),\n });\n\n const postAnswer = (data: AnswerRequest) => {\n if (id) {\n qetaApi\n .updateAnswer(id, { questionId: question.id, answer: data.answer })\n .then(a => {\n if (!a || !('id' in a)) {\n setError(true);\n return;\n }\n reset();\n onPost(a);\n })\n .catch(_e => setError(true));\n return;\n }\n\n qetaApi\n .postAnswer({ questionId: question.id, answer: data.answer })\n .then(a => {\n if (!a || !('id' in a)) {\n setError(true);\n return;\n }\n reset();\n onPost(a);\n })\n .catch(_e => setError(true));\n };\n\n useEffect(() => {\n if (id) {\n qetaApi.getAnswer(question.id, id).then(a => {\n if ('content' in a) {\n setValues({ questionId: question.id, answer: a.content });\n } else {\n setError(true);\n }\n });\n }\n }, [id, question, qetaApi]);\n\n useEffect(() => {\n reset(values);\n }, [values, reset]);\n\n return (\n <form onSubmit={handleSubmit(postAnswer)}>\n <Typography variant=\"h6\">Your answer</Typography>\n {error && <WarningPanel severity=\"error\" title=\"Could not post answer\" />}\n <Controller\n control={control}\n defaultValue=\"\"\n rules={{\n required: true,\n }}\n render={({ field: { onChange, value } }) => (\n <MarkdownEditor\n value={value}\n onChange={onChange}\n height={200}\n error={'answer' in errors}\n />\n )}\n name=\"answer\"\n />\n <Button variant=\"contained\" type=\"submit\" className={styles.postButton}>\n {id ? 'Save' : 'Post'}\n </Button>\n </form>\n );\n};\n","import { AnswerResponse, QuestionResponse } from '../../api';\nimport {\n Box,\n Card,\n CardContent,\n Grid,\n Link,\n Typography,\n} from '@material-ui/core';\nimport React from 'react';\nimport { MarkdownContent } from '@backstage/core-components';\nimport { VoteButtons } from './VoteButtons';\nimport { useStyles } from '../../utils/hooks';\nimport { formatEntityName } from '../../utils/utils';\nimport { DeleteModal } from '../DeleteModal/DeleteModal';\nimport { AnswerForm } from './AnswerForm';\n// @ts-ignore\nimport RelativeTime from 'react-relative-time';\n\nexport const AnswerCard = (props: {\n answer: AnswerResponse;\n question: QuestionResponse;\n}) => {\n const { answer, question } = props;\n const styles = useStyles();\n\n const [editMode, setEditMode] = React.useState(false);\n const [answerEntity, setAnswerEntity] = React.useState(answer);\n\n const [deleteModalOpen, setDeleteModalOpen] = React.useState(false);\n const handleDeleteModalOpen = () => setDeleteModalOpen(true);\n const handleDeleteModalClose = () => setDeleteModalOpen(false);\n\n const onAnswerEdit = (a: AnswerResponse) => {\n setEditMode(false);\n setAnswerEntity(a);\n };\n\n return (\n <Card id={`a${answer.id}`}>\n <CardContent>\n <Grid container spacing={0}>\n <Grid item className={styles.questionCardVote}>\n <VoteButtons entity={answerEntity} question={question} />\n </Grid>\n <Grid item>\n {editMode ? (\n <AnswerForm\n question={question}\n onPost={onAnswerEdit}\n id={answerEntity.id}\n />\n ) : (\n <>\n <Typography variant=\"body1\" gutterBottom>\n <MarkdownContent\n content={answerEntity.content}\n dialect=\"gfm\"\n />\n </Typography>\n <Box>\n <Typography variant=\"caption\" gutterBottom>\n By{' '}\n <Link href={`/qeta/users/${answerEntity.author}`}>\n {formatEntityName(answerEntity.author)}\n </Link>{' '}\n <RelativeTime value={answerEntity.created} />\n {answerEntity.updated && (\n <>\n {' '}\n (updated <RelativeTime value={answerEntity.updated} />)\n </>\n )}\n </Typography>\n </Box>\n {answerEntity.own && (\n <Box className={styles.questionCardActions}>\n <Link\n underline=\"none\"\n href=\"#\"\n onClick={handleDeleteModalOpen}\n >\n Delete\n </Link>\n <Link\n underline=\"none\"\n href=\"#\"\n onClick={() => setEditMode(true)}\n >\n Edit\n </Link>\n <DeleteModal\n open={deleteModalOpen}\n onClose={handleDeleteModalClose}\n entity={answerEntity}\n question={question}\n />\n </Box>\n )}\n </>\n )}\n </Grid>\n </Grid>\n </CardContent>\n </Card>\n );\n};\n","import React from 'react';\nimport { Box, Button, Divider, Typography } from '@material-ui/core';\nimport { useParams } from 'react-router-dom';\nimport {\n Content,\n ContentHeader,\n WarningPanel,\n} from '@backstage/core-components';\nimport { useQetaApi, useStyles } from '../../utils/hooks';\nimport { QuestionCard } from './QuestionCard';\nimport { AnswerResponse, QuestionResponse } from '../../api';\n// @ts-ignore\nimport RelativeTime from 'react-relative-time';\nimport { AnswerForm } from './AnswerForm';\nimport { AnswerCard } from './AnswerCard';\nimport { Skeleton } from '@material-ui/lab';\nimport HelpOutline from '@material-ui/icons/HelpOutline';\nimport HomeOutlined from '@material-ui/icons/HomeOutlined';\n\nexport const QuestionPage = () => {\n const { id } = useParams();\n const styles = useStyles();\n const [newAnswers, setNewAnswers] = React.useState<AnswerResponse[]>([]);\n\n const {\n value: question,\n loading,\n error,\n } = useQetaApi(api => api.getQuestion(id), [id]);\n\n const onAnswerPost = (answer: AnswerResponse) => {\n setNewAnswers(newAnswers.concat([answer]));\n };\n\n const getDescription = (q: QuestionResponse) => {\n return (\n <span>\n Asked{' '}\n <Box fontWeight=\"fontWeightMedium\" display=\"inline\" sx={{ mr: 2 }}>\n <RelativeTime value={q.created} />\n </Box>\n {q.updated && (\n <React.Fragment>\n Updated{' '}\n <Box fontWeight=\"fontWeightMedium\" display=\"inline\" sx={{ mr: 2 }}>\n <RelativeTime value={q.updated} />\n </Box>\n </React.Fragment>\n )}\n Viewed{' '}\n <Box fontWeight=\"fontWeightMedium\" display=\"inline\">\n {q.views} times\n </Box>\n </span>\n );\n };\n\n if (loading) {\n return <Skeleton variant=\"rect\" height={200} />;\n }\n\n if (error || question === undefined) {\n return (\n <WarningPanel severity=\"error\" title=\"Could not load question.\">\n {error?.message}\n </WarningPanel>\n );\n }\n\n return (\n <Content>\n <ContentHeader\n title={question.title}\n // @ts-ignore\n description={getDescription(question)}\n >\n <Button\n className={styles.marginRight}\n href=\"/qeta\"\n startIcon={<HomeOutlined />}\n >\n Back to questions\n </Button>\n <Button\n variant=\"contained\"\n href=\"/qeta/ask\"\n startIcon={<HelpOutline />}\n >\n Ask question\n </Button>\n </ContentHeader>\n <QuestionCard question={question} />\n <Box sx={{ mt: 3, mb: 2 }}>\n <Typography variant=\"h6\">\n {question.answersCount + newAnswers.length} answers\n </Typography>\n </Box>\n {(question.answers ?? []).concat(newAnswers).map(a => {\n return (\n <>\n <Box key={a.id} sx={{ mb: 1 }}>\n <AnswerCard answer={a} question={question} />\n </Box>\n <Divider />\n </>\n );\n })}\n <Divider />\n <AnswerForm question={question} onPost={onAnswerPost} />\n </Content>\n );\n};\n","import {\n Avatar,\n Chip,\n Grid,\n IconButton,\n TextField,\n Typography,\n} from '@material-ui/core';\nimport React from 'react';\nimport { useQetaApi } from '../../utils/hooks';\nimport { Skeleton } from '@material-ui/lab';\nimport { WarningPanel } from '@backstage/core-components';\nimport { TagResponse } from '../../api';\n\nexport const TagsContainer = () => {\n const [searchQuery, setSearchQuery] = React.useState('');\n const {\n value: response,\n loading,\n error,\n } = useQetaApi(api => api.getTags(), []);\n\n if (loading) {\n return <Skeleton variant=\"rect\" height={200} />;\n }\n\n if (error || response === undefined) {\n return (\n <WarningPanel severity=\"error\" title=\"Could not load tags.\">\n {error?.message}\n </WarningPanel>\n );\n }\n\n const filterData = (query: string, data: TagResponse[]) => {\n if (!query) {\n return data;\n }\n return data.filter(t => t.tag.toLowerCase().includes(query));\n };\n\n const tags = filterData(searchQuery, response);\n\n return (\n <Grid container>\n <Grid item xs={12}>\n <TextField\n id=\"search-bar\"\n className=\"text\"\n onChange={(\n event: React.ChangeEvent<HTMLTextAreaElement | HTMLInputElement>,\n ) => setSearchQuery(event.target.value)}\n label=\"Search tag\"\n variant=\"outlined\"\n placeholder=\"Search...\"\n size=\"small\"\n />\n <IconButton type=\"submit\" aria-label=\"search\" />\n </Grid>\n <Grid item xs={12}>\n <Typography variant=\"h6\">{`Showing ${tags.length} tags`}</Typography>\n </Grid>\n <Grid item>\n {tags.map(tag => (\n <Chip\n key={tag.tag}\n variant=\"outlined\"\n avatar={<Avatar>{tag.questionsCount}</Avatar>}\n label={tag.tag}\n component=\"a\"\n clickable\n href={`/qeta/tags/${tag.tag}`}\n />\n ))}\n </Grid>\n </Grid>\n );\n};\n","import React from 'react';\nimport { Button } from '@material-ui/core';\nimport { useParams } from 'react-router-dom';\nimport { Content, ContentHeader } from '@backstage/core-components';\n// @ts-ignore\nimport RelativeTime from 'react-relative-time';\nimport { QuestionsContainer } from '../QuestionsContainer/QuestionsContainer';\nimport { TagsContainer } from './TagsContainer';\nimport HelpOutline from '@material-ui/icons/HelpOutline';\nimport HomeOutlined from '@material-ui/icons/HomeOutlined';\nimport { useStyles } from '../../utils/hooks';\n\nexport const TagPage = () => {\n const { tag } = useParams();\n const styles = useStyles();\n return (\n <Content>\n <ContentHeader title={tag ? `Questions tagged [${tag}]` : 'Tags'}>\n <Button\n href=\"/qeta\"\n className={styles.marginRight}\n startIcon={<HomeOutlined />}\n >\n Back to questions\n </Button>\n <Button\n variant=\"contained\"\n href=\"/qeta/ask\"\n startIcon={<HelpOutline />}\n >\n Ask question\n </Button>\n </ContentHeader>\n {tag ? <QuestionsContainer tags={[tag ?? '']} /> : <TagsContainer />}\n </Content>\n );\n};\n","import React from 'react';\nimport { Button } from '@material-ui/core';\nimport { useParams } from 'react-router-dom';\nimport { Content, ContentHeader } from '@backstage/core-components';\n// @ts-ignore\nimport RelativeTime from 'react-relative-time';\nimport { QuestionsContainer } from '../QuestionsContainer/QuestionsContainer';\nimport { formatEntityName } from '../../utils/utils';\nimport { useStyles } from '../../utils/hooks';\n\nexport const UserPage = () => {\n const identity = useParams()['*'] ?? 'unknown';\n const styles = useStyles();\n return (\n <Content>\n <ContentHeader title={`Questions by ${formatEntityName(identity)}`}>\n <Button href=\"/qeta\" className={styles.marginRight}>\n Back to questions\n </Button>\n <Button variant=\"contained\" href=\"/qeta/ask\">\n Ask question\n </Button>\n </ContentHeader>\n <QuestionsContainer author={identity ?? ''} />\n </Content>\n );\n};\n","import {\n Box,\n Divider,\n List,\n ListItem,\n ListItemText,\n ListSubheader,\n} from '@material-ui/core';\nimport React from 'react';\nimport { useQetaApi, useStyles } from '../../utils/hooks';\nimport { Skeleton } from '@material-ui/lab';\n\nexport const QuestionHighlightList = (props: {\n type: string;\n title: string;\n noQuestionsLabel: string;\n icon?: JSX.Element;\n}) => {\n const {\n value: response,\n loading,\n error,\n } = useQetaApi(api => api.getQuestionsList(props.type), []);\n const classes = useStyles();\n\n const questions = response?.questions ?? [];\n\n return (\n <Box\n className={classes.questionHighlightList}\n display={{ md: 'none', lg: 'block' }}\n >\n <List\n component=\"nav\"\n aria-labelledby=\"nested-list-subheader\"\n subheader={\n <ListSubheader\n component=\"div\"\n id=\"nested-list-subheader\"\n color=\"primary\"\n >\n {props.title}\n {props.icon}\n </ListSubheader>\n }\n >\n {loading && (\n <ListItem>\n <Skeleton variant=\"rect\" />\n </ListItem>\n )}\n {error && (\n <ListItem>\n <ListItemText>Failed to load questions</ListItemText>\n </ListItem>\n )}\n {!error && questions.length === 0 && (\n <ListItem>\n <ListItemText>{props.noQuestionsLabel}</ListItemText>\n </ListItem>\n )}\n {!error &&\n questions.map(q => (\n <React.Fragment key={q.id}>\n <Divider />\n <ListItem\n button\n dense\n component=\"a\"\n href={`/qeta/questions/${q.id}`}\n >\n <ListItemText>{q.title}</ListItemText>\n </ListItem>\n </React.Fragment>\n ))}\n </List>\n </Box>\n );\n};\n","import React from 'react';\nimport { Button } from '@material-ui/core';\nimport { Content, ContentHeader } from '@backstage/core-components';\n// @ts-ignore\nimport RelativeTime from 'react-relative-time';\nimport { QuestionsContainer } from '../QuestionsContainer/QuestionsContainer';\nimport HelpOutline from '@material-ui/icons/HelpOutline';\nimport HomeOutlined from '@material-ui/icons/HomeOutlined';\nimport { useStyles } from '../../utils/hooks';\n\nexport const FavoritePage = () => {\n const styles = useStyles();\n return (\n <Content>\n <ContentHeader title=\"Your favorite questions\">\n <Button\n href=\"/qeta\"\n className={styles.marginRight}\n startIcon={<HomeOutlined />}\n >\n Back to questions\n </Button>\n <Button\n variant=\"contained\"\n href=\"/qeta/ask\"\n startIcon={<HelpOutline />}\n >\n Ask question\n </Button>\n </ContentHeader>\n <QuestionsContainer favorite />\n </Content>\n );\n};\n","import React from 'react';\nimport {\n Button,\n Grid,\n IconButton,\n ListItemIcon,\n Menu,\n MenuItem,\n Tooltip,\n} from '@material-ui/core';\nimport {\n Content,\n ContentHeader,\n Header,\n Page,\n} from '@backstage/core-components';\nimport { Route, Routes } from 'react-router-dom';\nimport { AskPage } from '../AskPage';\nimport { QuestionPage } from '../QuestionPage/QuestionPage';\nimport { QuestionsContainer } from '../QuestionsContainer/QuestionsContainer';\nimport { TagPage } from '../TagPage/TagPage';\nimport { UserPage } from '../UserPage/UserPage';\nimport HelpOutline from '@material-ui/icons/HelpOutline';\nimport LoyaltyOutlined from '@material-ui/icons/LoyaltyOutlined';\nimport { QuestionHighlightList } from '../QuestionHighlightList/QuestionHighlightList';\nimport { useIdentityApi, useStyles } from '../../utils/hooks';\nimport Whatshot from '@material-ui/icons/Whatshot';\nimport MoreVertIcon from '@material-ui/icons/MoreVert';\nimport StarIcon from '@material-ui/icons/Star';\nimport AccountBox from '@material-ui/icons/AccountBox';\nimport { FavoritePage } from '../FavoritePage/FavoritePage';\n\nconst MoreMenu = () => {\n const [anchorEl, setAnchorEl] = React.useState(null);\n const open = Boolean(anchorEl);\n const styles = useStyles();\n const {\n value: user,\n loading: loadingUser,\n error: userError,\n } = useIdentityApi(api => api.getBackstageIdentity(), []);\n\n const handleMenuOpen = (event: any) => {\n setAnchorEl(event.currentTarget);\n };\n\n const handleMenuClose = () => {\n setAnchorEl(null);\n };\n\n return (\n <>\n <Tooltip arrow title=\"More\">\n <IconButton\n aria-label=\"more\"\n aria-controls=\"long-menu\"\n aria-haspopup=\"true\"\n onClick={handleMenuOpen}\n >\n <MoreVertIcon />\n </IconButton>\n </Tooltip>\n <Menu\n id=\"long-menu\"\n anchorEl={anchorEl}\n keepMounted\n open={open}\n getContentAnchorEl={null}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'center',\n }}\n transformOrigin={{\n vertical: 'top',\n horizontal: 'center',\n }}\n onClose={handleMenuClose}\n >\n <MenuItem component=\"a\" href=\"/qeta/tags\">\n <ListItemIcon className={styles.menuIcon}>\n <LoyaltyOutlined fontSize=\"small\" />\n </ListItemIcon>\n Tags\n </MenuItem>\n {user && !loadingUser && !userError && (\n <MenuItem component=\"a\" href={`/qeta/users/${user?.userEntityRef}`}>\n <ListItemIcon className={styles.menuIcon}>\n <AccountBox fontSize=\"small\" />\n </ListItemIcon>\n My questions\n </MenuItem>\n )}\n <MenuItem component=\"a\" href=\"/qeta/questions/favorite\">\n <ListItemIcon className={styles.menuIcon}>\n <StarIcon fontSize=\"small\" />\n </ListItemIcon>\n Favorite questions\n </MenuItem>\n </Menu>\n </>\n );\n};\n\nexport const HomePageContent = () => {\n return (\n <Content>\n <Grid container spacing={3}>\n <Grid item md={12} lg={9} xl={10}>\n <ContentHeader title=\"All questions\">\n <MoreMenu />\n <Button\n variant=\"contained\"\n href=\"/qeta/ask\"\n startIcon={<HelpOutline />}\n >\n Ask question\n </Button>\n </ContentHeader>\n <QuestionsContainer />\n </Grid>\n <Grid item lg={3} xl={2}>\n <QuestionHighlightList\n type=\"hot\"\n title=\"Hot questions\"\n noQuestionsLabel=\"No questions\"\n icon={<Whatshot fontSize=\"small\" />}\n />\n <QuestionHighlightList\n type=\"unanswered\"\n title=\"Unanswered questions\"\n noQuestionsLabel=\"No unanswered questions\"\n />\n <QuestionHighlightList\n type=\"incorrect\"\n title=\"Questions without correct answer\"\n noQuestionsLabel=\"No questions without correct answers\"\n />\n </Grid>\n </Grid>\n </Content>\n );\n};\n\ntype Props = {\n title?: string;\n subtitle?: string;\n headerElements?: JSX.Element[];\n};\n\nexport const HomePage = (props: Props) => (\n <Page themeId=\"tool\">\n <Header title={props.title ?? 'Q&A'} subtitle={props.subtitle}>\n {props.headerElements}\n </Header>\n <Routes>\n <Route path=\"/\" element={<HomePageContent />} />\n <Route path=\"/ask\" element={<AskPage />} />\n <Route path=\"/questions/favorite\" element={<FavoritePage />} />\n <Route path=\"/questions/:id/edit\" element={<AskPage />} />\n <Route path=\"/questions/:id\" element={<QuestionPage />} />\n <Route path=\"/tags\" element={<TagPage />} />\n <Route path=\"/tags/:tag\" element={<TagPage />} />\n <Route path=\"/users/*\" element={<UserPage />} />\n </Routes>\n </Page>\n);\n"],"names":[],"mappings":"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"}
@@ -1,9 +1,9 @@
1
- import { createRouteRef, createApiRef, createPlugin, createApiFactory, configApiRef, fetchApiRef, createRoutableExtension, useApi } from '@backstage/core-plugin-api';
1
+ import { createRouteRef, createApiRef, createPlugin, createApiFactory, configApiRef, fetchApiRef, createRoutableExtension, useApi, identityApiRef } from '@backstage/core-plugin-api';
2
2
  import { CustomErrorBase } from '@backstage/errors';
3
3
  import omitBy from 'lodash/omitBy';
4
4
  import isEmpty from 'lodash/isEmpty';
5
5
  import { useAsync } from 'react-use';
6
- import { makeStyles, Box, Grid, FormGroup, FormLabel, FormControlLabel, Checkbox, FormControl, RadioGroup, Radio, useTheme, Card, CardContent, Typography, Link, Chip, Button, Divider, Collapse, TextField } from '@material-ui/core';
6
+ import { makeStyles, Box, Grid, FormGroup, FormLabel, FormControlLabel, Checkbox, FormControl, RadioGroup, Radio, useTheme, Card, CardContent, Typography, Link, Chip, Button, Divider, Tooltip, Select, MenuItem, Collapse, TextField } from '@material-ui/core';
7
7
  import { catalogApiRef } from '@backstage/plugin-catalog-react';
8
8
  import React, { useEffect } from 'react';
9
9
  import { WarningPanel, MarkdownContent } from '@backstage/core-components';
@@ -36,17 +36,6 @@ class QetaClient {
36
36
  this.fetchApi = options.fetchApi;
37
37
  this.baseUrl = options.configApi.getString("backend.baseUrl");
38
38
  }
39
- getQueryParameters(params) {
40
- const asStrings = Object.fromEntries(
41
- Object.entries(params).map(([k, v]) => {
42
- if (!v) {
43
- return [k, ""];
44
- }
45
- return [k, `${v}`];
46
- })
47
- );
48
- return new URLSearchParams(omitBy(asStrings, isEmpty));
49
- }
50
39
  async getQuestions(options) {
51
40
  const query = this.getQueryParameters(options).toString();
52
41
  let url = `${this.baseUrl}/api/qeta/questions`;
@@ -131,6 +120,32 @@ class QetaClient {
131
120
  }
132
121
  return data;
133
122
  }
123
+ async favoriteQuestion(id) {
124
+ if (!id) {
125
+ throw new QetaError("Invalid id provided", void 0);
126
+ }
127
+ const response = await this.fetchApi.fetch(
128
+ `${this.baseUrl}/api/qeta/questions/${id}/favorite`
129
+ );
130
+ const data = await response.json();
131
+ if ("errors" in data) {
132
+ throw new QetaError("Failed to fetch", data.errors);
133
+ }
134
+ return data;
135
+ }
136
+ async unfavoriteQuestion(id) {
137
+ if (!id) {
138
+ throw new QetaError("Invalid id provided", void 0);
139
+ }
140
+ const response = await this.fetchApi.fetch(
141
+ `${this.baseUrl}/api/qeta/questions/${id}/unfavorite`
142
+ );
143
+ const data = await response.json();
144
+ if ("errors" in data) {
145
+ throw new QetaError("Failed to fetch", data.errors);
146
+ }
147
+ return data;
148
+ }
134
149
  async postAnswer(answer) {
135
150
  const response = await this.fetchApi.fetch(
136
151
  `${this.baseUrl}/api/qeta/questions/${answer.questionId}/answers`,
@@ -261,6 +276,17 @@ class QetaClient {
261
276
  }
262
277
  return data;
263
278
  }
279
+ getQueryParameters(params) {
280
+ const asStrings = Object.fromEntries(
281
+ Object.entries(params).map(([k, v]) => {
282
+ if (!v) {
283
+ return [k, ""];
284
+ }
285
+ return [k, `${v}`];
286
+ })
287
+ );
288
+ return new URLSearchParams(omitBy(asStrings, isEmpty));
289
+ }
264
290
  }
265
291
 
266
292
  const qetaPlugin = createPlugin({
@@ -279,7 +305,7 @@ const qetaPlugin = createPlugin({
279
305
  const QetaPage = qetaPlugin.provide(
280
306
  createRoutableExtension({
281
307
  name: "QetaPage",
282
- component: () => import('./index-9a18f5f5.esm.js').then((m) => m.HomePage),
308
+ component: () => import('./index-b5213dd7.esm.js').then((m) => m.HomePage),
283
309
  mountPoint: rootRouteRef
284
310
  })
285
311
  );
@@ -290,6 +316,12 @@ function useQetaApi(f, deps = []) {
290
316
  return await f(qetaApi);
291
317
  }, deps);
292
318
  }
319
+ function useIdentityApi(f, deps = []) {
320
+ const identityApi = useApi(identityApiRef);
321
+ return useAsync(async () => {
322
+ return await f(identityApi);
323
+ }, deps);
324
+ }
293
325
  const useStyles = makeStyles((theme) => {
294
326
  return {
295
327
  markdownEditor: {
@@ -344,6 +376,12 @@ const useStyles = makeStyles((theme) => {
344
376
  marginTop: theme.spacing(1),
345
377
  marginBottom: theme.spacing(1)
346
378
  },
379
+ questionsPerPageInput: {
380
+ paddingTop: "10px"
381
+ },
382
+ questionsPerPage: {
383
+ marginRight: theme.spacing(3)
384
+ },
347
385
  questionHighlightList: {
348
386
  width: "100%",
349
387
  border: `1px solid ${theme.palette.action.selected}`,
@@ -370,6 +408,9 @@ const useStyles = makeStyles((theme) => {
370
408
  marginRight: theme.spacing(1)
371
409
  }
372
410
  },
411
+ menuIcon: {
412
+ minWidth: "26px"
413
+ },
373
414
  deleteModal: {
374
415
  position: "absolute",
375
416
  top: "20%",
@@ -531,12 +572,22 @@ const QuestionListItem = (props) => {
531
572
  };
532
573
 
533
574
  const QuestionList = (props) => {
534
- const { loading, error, response, onPageChange, entity, page } = props;
535
- const pageSize = 10;
575
+ const {
576
+ loading,
577
+ error,
578
+ response,
579
+ onPageChange,
580
+ entity,
581
+ page,
582
+ onPageSizeChange
583
+ } = props;
536
584
  const styles = useStyles();
537
- const handleChange = (_event, value) => {
585
+ const handlePageChange = (_event, value) => {
538
586
  onPageChange(value);
539
587
  };
588
+ const handlePageSizeChange = (event) => {
589
+ onPageSizeChange(Number.parseInt(event.target.value, 10));
590
+ };
540
591
  if (loading) {
541
592
  return /* @__PURE__ */ React.createElement(Skeleton, { variant: "rect", height: 200 });
542
593
  }
@@ -563,7 +614,7 @@ const QuestionList = (props) => {
563
614
  ))
564
615
  );
565
616
  }
566
- const pageCount = response.total < pageSize ? 1 : Math.ceil(response.total / pageSize);
617
+ const pageCount = response.total < props.pageSize ? 1 : Math.ceil(response.total / props.pageSize);
567
618
  return /* @__PURE__ */ React.createElement(Box, { sx: { mt: 2 } }, /* @__PURE__ */ React.createElement(Grid, { container: true, spacing: 2 }, response.questions.map((question) => {
568
619
  return /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 12, key: question.id }, /* @__PURE__ */ React.createElement(QuestionListItem, { question }), /* @__PURE__ */ React.createElement(Divider, null));
569
620
  })), /* @__PURE__ */ React.createElement(
@@ -572,15 +623,28 @@ const QuestionList = (props) => {
572
623
  container: true,
573
624
  spacing: 0,
574
625
  className: styles.questionListPagination,
575
- direction: "column",
576
626
  alignItems: "center",
577
- justifyContent: "center"
627
+ justifyContent: "space-between"
578
628
  },
629
+ /* @__PURE__ */ React.createElement(Tooltip, { title: "Questions per page", arrow: true }, /* @__PURE__ */ React.createElement(FormControl, { variant: "filled" }, /* @__PURE__ */ React.createElement(
630
+ Select,
631
+ {
632
+ value: props.pageSize,
633
+ onChange: handlePageSizeChange,
634
+ className: styles.questionsPerPage,
635
+ inputProps: { className: styles.questionsPerPageInput }
636
+ },
637
+ /* @__PURE__ */ React.createElement(MenuItem, { value: 5 }, "5"),
638
+ /* @__PURE__ */ React.createElement(MenuItem, { value: 10 }, "10"),
639
+ /* @__PURE__ */ React.createElement(MenuItem, { value: 25 }, "25"),
640
+ /* @__PURE__ */ React.createElement(MenuItem, { value: 50 }, "50"),
641
+ /* @__PURE__ */ React.createElement(MenuItem, { value: 100 }, "100")
642
+ ))),
579
643
  /* @__PURE__ */ React.createElement(
580
644
  Pagination,
581
645
  {
582
646
  page,
583
- onChange: handleChange,
647
+ onChange: handlePageChange,
584
648
  count: pageCount,
585
649
  size: "large",
586
650
  variant: "outlined",
@@ -593,8 +657,9 @@ const QuestionList = (props) => {
593
657
 
594
658
  const QuestionsContainer = (props) => {
595
659
  var _a;
596
- const { tags, author, entity, showFilters, showTitle, title } = props;
660
+ const { tags, author, entity, showFilters, showTitle, title, favorite } = props;
597
661
  const [page, setPage] = React.useState(1);
662
+ const [questionsPerPage, setQuestionsPerPage] = React.useState(10);
598
663
  const [showFilterPanel, setShowFilterPanel] = React.useState(false);
599
664
  const [searchParams, setSearchParams] = useSearchParams();
600
665
  const [filters, setFilters] = React.useState({
@@ -604,8 +669,6 @@ const QuestionsContainer = (props) => {
604
669
  noCorrectAnswer: "false",
605
670
  noVotes: "false"
606
671
  });
607
- const pageSize = 10;
608
- const offset = (page - 1) * pageSize;
609
672
  const onPageChange = (value) => {
610
673
  setPage(value);
611
674
  setSearchParams((prev) => {
@@ -626,11 +689,23 @@ const QuestionsContainer = (props) => {
626
689
  useEffect(() => {
627
690
  let filtersApplied = false;
628
691
  searchParams.forEach((value, key) => {
629
- if (key === "page") {
630
- setPage(Number.parseInt(value, 10));
631
- } else if (key in filterKeys) {
632
- filtersApplied = true;
633
- filters[key] = value;
692
+ try {
693
+ if (key === "page") {
694
+ const pv = Number.parseInt(value, 10);
695
+ if (pv > 0) {
696
+ setPage(pv);
697
+ } else {
698
+ setPage(1);
699
+ }
700
+ } else if (key === "questionsPerPage") {
701
+ const qpp = Number.parseInt(value, 10);
702
+ if (qpp > 0)
703
+ setQuestionsPerPage(qpp);
704
+ } else if (key in filterKeys) {
705
+ filtersApplied = true;
706
+ filters[key] = value;
707
+ }
708
+ } catch (_e) {
634
709
  }
635
710
  });
636
711
  setFilters(filters);
@@ -644,15 +719,31 @@ const QuestionsContainer = (props) => {
644
719
  error
645
720
  } = useQetaApi(
646
721
  (api) => api.getQuestions({
647
- limit: pageSize,
648
- offset,
722
+ limit: questionsPerPage,
723
+ offset: (page - 1) * questionsPerPage,
649
724
  tags,
650
725
  entity,
651
726
  author,
727
+ favorite,
652
728
  ...filters
653
729
  }),
654
- [page, offset, filters]
730
+ [page, filters, questionsPerPage]
655
731
  );
732
+ const onPageSizeChange = (value) => {
733
+ if (response) {
734
+ let newPage = page;
735
+ while (newPage * value > response.total) {
736
+ newPage -= 1;
737
+ }
738
+ onPageChange(Math.max(1, newPage));
739
+ }
740
+ setQuestionsPerPage(value);
741
+ setSearchParams((prev) => {
742
+ const newValue = prev;
743
+ newValue.set("questionsPerPage", String(value));
744
+ return newValue;
745
+ });
746
+ };
656
747
  let shownTitle = title;
657
748
  if (author) {
658
749
  shownTitle = `Questions by ${formatEntityName(author)}`;
@@ -660,6 +751,8 @@ const QuestionsContainer = (props) => {
660
751
  shownTitle = `Questions about ${formatEntityName(entity)}`;
661
752
  } else if (tags) {
662
753
  shownTitle = `Questions tagged with [${tags.join(", ")}]`;
754
+ } else if (favorite) {
755
+ shownTitle = "Your favorite questions";
663
756
  }
664
757
  return /* @__PURE__ */ React.createElement(Box, null, showTitle && /* @__PURE__ */ React.createElement(Typography, { variant: "h5" }, shownTitle), /* @__PURE__ */ React.createElement(Grid, { container: true, justifyContent: "space-between" }, /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(Typography, { variant: "h6" }, `${(_a = response == null ? void 0 : response.total) != null ? _a : 0} questions`)), (showFilters != null ? showFilters : true) && /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(
665
758
  Button,
@@ -675,8 +768,10 @@ const QuestionsContainer = (props) => {
675
768
  error,
676
769
  response,
677
770
  onPageChange,
771
+ onPageSizeChange,
678
772
  entity,
679
- page
773
+ page,
774
+ pageSize: questionsPerPage
680
775
  }
681
776
  ));
682
777
  };
@@ -946,5 +1041,5 @@ const AskForm = (props) => {
946
1041
  ), /* @__PURE__ */ React.createElement(Button, { type: "submit", variant: "contained", className: styles.postButton }, id ? "Save" : "Post"));
947
1042
  };
948
1043
 
949
- export { AskForm as A, MarkdownEditor as M, QuestionsContainer as Q, getEntityUrl as a, useQetaApi as b, qetaPlugin as c, QetaPage as d, QetaClient as e, formatEntityName as f, getEntityTitle as g, qetaApiRef as q, useStyles as u };
950
- //# sourceMappingURL=index-074b9dc0.esm.js.map
1044
+ export { AskForm as A, MarkdownEditor as M, QuestionsContainer as Q, getEntityUrl as a, useQetaApi as b, useIdentityApi as c, qetaPlugin as d, QetaPage as e, formatEntityName as f, getEntityTitle as g, QetaClient as h, qetaApiRef as q, useStyles as u };
1045
+ //# sourceMappingURL=index-deb705e9.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-deb705e9.esm.js","sources":["../../src/routes.ts","../../src/api/QetaClient.ts","../../src/plugin.ts","../../src/utils/hooks.ts","../../src/components/QuestionsContainer/FilterPanel.tsx","../../src/utils/utils.ts","../../src/components/QuestionsContainer/QuestionListItem.tsx","../../src/components/QuestionsContainer/QuestionList.tsx","../../src/components/QuestionsContainer/QuestionsContainer.tsx","../../src/components/MarkdownEditor/MarkdownEditor.tsx","../../src/components/AskForm/AskForm.tsx"],"sourcesContent":["import { createRouteRef } from '@backstage/core-plugin-api';\n\nexport const rootRouteRef = createRouteRef({\n id: 'qeta',\n});\n","import { GetQuestionsOptions, QetaApi } from './QetaApi';\nimport { ConfigApi, createApiRef, FetchApi } from '@backstage/core-plugin-api';\nimport { CustomErrorBase } from '@backstage/errors';\nimport {\n AnswerRequest,\n AnswerResponse,\n AnswerResponseBody,\n QuestionRequest,\n QuestionResponse,\n QuestionResponseBody,\n QuestionsResponse,\n QuestionsResponseBody,\n TagResponse,\n} from './types';\nimport omitBy from 'lodash/omitBy';\nimport isEmpty from 'lodash/isEmpty';\n\nexport const qetaApiRef = createApiRef<QetaApi>({\n id: 'plugin.qeta.service',\n});\n\nexport class QetaError extends CustomErrorBase {\n public errors: null | undefined | any[];\n\n constructor(message: string, errors: null | undefined | any[]) {\n super(message);\n\n this.errors = errors;\n }\n}\n\nexport class QetaClient implements QetaApi {\n private readonly baseUrl: string;\n private readonly fetchApi: FetchApi;\n\n constructor(options: { configApi: ConfigApi; fetchApi: FetchApi }) {\n this.fetchApi = options.fetchApi;\n this.baseUrl = options.configApi.getString('backend.baseUrl');\n }\n\n async getQuestions(options: GetQuestionsOptions): Promise<QuestionsResponse> {\n const query = this.getQueryParameters(options).toString();\n\n let url = `${this.baseUrl}/api/qeta/questions`;\n if (query) {\n url += `?${query}`;\n }\n\n const response = await this.fetchApi.fetch(url);\n\n const data = (await response.json()) as QuestionsResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async getQuestionsList(type: string): Promise<QuestionsResponse> {\n const query = new URLSearchParams({ limit: '7' }).toString();\n\n let url = `${this.baseUrl}/api/qeta/questions/list/${type}`;\n if (query) {\n url += `?${query}`;\n }\n\n const response = await this.fetchApi.fetch(url);\n\n const data = (await response.json()) as QuestionsResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async postQuestion(question: QuestionRequest): Promise<QuestionResponse> {\n const response = await this.fetchApi.fetch(\n `${this.baseUrl}/api/qeta/questions`,\n {\n method: 'POST',\n body: JSON.stringify(question),\n headers: { 'Content-Type': 'application/json' },\n },\n );\n const data = (await response.json()) as QuestionResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async getQuestion(id?: string): Promise<QuestionResponse> {\n if (!id) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${this.baseUrl}/api/qeta/questions/${id}`,\n );\n const data = (await response.json()) as QuestionResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async getTags(): Promise<TagResponse[]> {\n const response = await this.fetchApi.fetch(`${this.baseUrl}/api/qeta/tags`);\n return (await response.json()) as TagResponse[];\n }\n\n async voteQuestionUp(id: number): Promise<QuestionResponse> {\n if (!id) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${this.baseUrl}/api/qeta/questions/${id}/upvote`,\n );\n const data = (await response.json()) as QuestionResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async voteQuestionDown(id: number): Promise<QuestionResponse> {\n if (!id) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${this.baseUrl}/api/qeta/questions/${id}/downvote`,\n );\n const data = (await response.json()) as QuestionResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async favoriteQuestion(id: number): Promise<QuestionResponse> {\n if (!id) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${this.baseUrl}/api/qeta/questions/${id}/favorite`,\n );\n const data = (await response.json()) as QuestionResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async unfavoriteQuestion(id: number): Promise<QuestionResponse> {\n if (!id) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${this.baseUrl}/api/qeta/questions/${id}/unfavorite`,\n );\n const data = (await response.json()) as QuestionResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async postAnswer(answer: AnswerRequest): Promise<AnswerResponseBody> {\n const response = await this.fetchApi.fetch(\n `${this.baseUrl}/api/qeta/questions/${answer.questionId}/answers`,\n {\n method: 'POST',\n body: JSON.stringify({ answer: answer.answer }),\n headers: { 'Content-Type': 'application/json' },\n },\n );\n const data = (await response.json()) as AnswerResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async voteAnswerUp(questionId: number, id: number): Promise<AnswerResponse> {\n if (!id || !questionId) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${this.baseUrl}/api/qeta/questions/${questionId}/answers/${id}/upvote`,\n );\n const data = (await response.json()) as AnswerResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async voteAnswerDown(\n questionId: number,\n id: number,\n ): Promise<AnswerResponse> {\n if (!id || !questionId) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${this.baseUrl}/api/qeta/questions/${questionId}/answers/${id}/downvote`,\n );\n const data = (await response.json()) as AnswerResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async markAnswerCorrect(questionId: number, id: number): Promise<boolean> {\n if (!id || !questionId) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${this.baseUrl}/api/qeta/questions/${questionId}/answers/${id}/correct`,\n );\n const data = await response;\n return data.ok;\n }\n\n async markAnswerIncorrect(questionId: number, id: number): Promise<boolean> {\n if (!id || !questionId) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${this.baseUrl}/api/qeta/questions/${questionId}/answers/${id}/incorrect`,\n );\n const data = await response;\n return data.ok;\n }\n\n async deleteQuestion(questionId: number): Promise<boolean> {\n if (!questionId) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${this.baseUrl}/api/qeta/questions/${questionId}`,\n {\n method: 'DELETE',\n },\n );\n const data = await response;\n return data.ok;\n }\n\n async deleteAnswer(questionId: number, id: number): Promise<boolean> {\n if (!questionId || !id) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${this.baseUrl}/api/qeta/questions/${questionId}/answers/${id}`,\n {\n method: 'DELETE',\n },\n );\n const data = await response;\n return data.ok;\n }\n\n async updateQuestion(\n id: string,\n question: QuestionRequest,\n ): Promise<QuestionResponse> {\n const response = await this.fetchApi.fetch(\n `${this.baseUrl}/api/qeta/questions/${id}`,\n {\n method: 'POST',\n body: JSON.stringify(question),\n headers: { 'Content-Type': 'application/json' },\n },\n );\n const data = (await response.json()) as QuestionResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to update', data.errors);\n }\n\n return data;\n }\n\n async updateAnswer(\n id: number,\n answer: AnswerRequest,\n ): Promise<AnswerResponseBody> {\n const response = await this.fetchApi.fetch(\n `${this.baseUrl}/api/qeta/questions/${answer.questionId}/answers/${id}`,\n {\n method: 'POST',\n body: JSON.stringify({ answer: answer.answer }),\n headers: { 'Content-Type': 'application/json' },\n },\n );\n const data = (await response.json()) as AnswerResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async getAnswer(\n questionId: string | number | undefined,\n id: string | number | undefined,\n ): Promise<AnswerResponseBody> {\n if (!questionId || !id) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${this.baseUrl}/api/qeta/questions/${questionId}/answers/${id}`,\n );\n const data = (await response.json()) as AnswerResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n private getQueryParameters(params: any): URLSearchParams {\n const asStrings = Object.fromEntries(\n Object.entries(params).map(([k, v]) => {\n if (!v) {\n return [k, ''];\n }\n return [k, `${v}`];\n }),\n );\n return new URLSearchParams(omitBy(asStrings, isEmpty));\n }\n}\n","import {\n configApiRef,\n createApiFactory,\n createPlugin,\n createRoutableExtension,\n fetchApiRef,\n} from '@backstage/core-plugin-api';\n\nimport { rootRouteRef } from './routes';\nimport { qetaApiRef, QetaClient } from './api';\n\nexport const qetaPlugin = createPlugin({\n id: 'qeta',\n routes: {\n root: rootRouteRef,\n },\n apis: [\n createApiFactory({\n api: qetaApiRef,\n deps: { configApi: configApiRef, fetchApi: fetchApiRef },\n factory: ({ configApi, fetchApi }) =>\n new QetaClient({ configApi, fetchApi }),\n }),\n ],\n});\n\nexport const QetaPage = qetaPlugin.provide(\n createRoutableExtension({\n name: 'QetaPage',\n component: () => import('./components/HomePage').then(m => m.HomePage),\n mountPoint: rootRouteRef,\n }),\n);\n","import { QetaApi, qetaApiRef } from '../api';\nimport { useAsync } from 'react-use';\nimport {\n IdentityApi,\n identityApiRef,\n useApi,\n} from '@backstage/core-plugin-api';\nimport { makeStyles } from '@material-ui/core';\nimport { CatalogApi } from '@backstage/catalog-client';\nimport { catalogApiRef } from '@backstage/plugin-catalog-react';\n\nexport function useQetaApi<T>(\n f: (api: QetaApi) => Promise<T>,\n deps: any[] = [],\n) {\n const qetaApi = useApi(qetaApiRef);\n\n return useAsync(async () => {\n return await f(qetaApi);\n }, deps);\n}\n\nexport function useCatalogApi<T>(\n f: (api: CatalogApi) => Promise<T>,\n deps: any[] = [],\n) {\n const catalogApi = useApi(catalogApiRef);\n\n return useAsync(async () => {\n return await f(catalogApi);\n }, deps);\n}\n\nexport function useIdentityApi<T>(\n f: (api: IdentityApi) => Promise<T>,\n deps: any[] = [],\n) {\n const identityApi = useApi(identityApiRef);\n\n return useAsync(async () => {\n return await f(identityApi);\n }, deps);\n}\n\nexport const useStyles = makeStyles(theme => {\n return {\n markdownEditor: {\n backgroundColor: 'initial',\n color: theme.palette.text.primary,\n border: `1px solid ${theme.palette.action.disabled}`,\n borderRadius: theme.shape.borderRadius,\n '&:hover': {\n borderColor: theme.palette.action.active,\n },\n '&:focus-within': {\n borderColor: theme.palette.primary.main,\n },\n '& .mde-header': {\n backgroundColor: 'initial',\n color: theme.palette.text.primary,\n borderBottom: `1px solid ${theme.palette.action.selected}`,\n '& .mde-tabs button, .mde-header-item > button': {\n color: `${theme.palette.text.primary} !important`,\n },\n },\n '& .mde-text': {\n backgroundColor: 'initial',\n color: theme.palette.text.primary,\n outline: 'none',\n },\n },\n markdownEditorError: {\n border: `1px solid ${theme.palette.error.main} !important`,\n },\n successColor: {\n color: theme.palette.success.main,\n },\n questionCardVote: {\n textAlign: 'center',\n width: '50px',\n marginRight: '20px',\n display: 'inline-block',\n verticalAlign: 'top',\n },\n questionCardContent: {\n display: 'inline-block',\n width: 'calc(100% - 70px)',\n },\n questionCardAuthor: {\n textAlign: 'right',\n },\n questionListPagination: {\n marginTop: theme.spacing(2),\n },\n postButton: {\n marginTop: theme.spacing(1),\n marginBottom: theme.spacing(1),\n },\n questionsPerPageInput: {\n paddingTop: '10px',\n },\n questionsPerPage: {\n marginRight: theme.spacing(3),\n },\n questionHighlightList: {\n width: '100%',\n border: `1px solid ${theme.palette.action.selected}`,\n borderRadius: theme.shape.borderRadius,\n '&:not(:first-child)': {\n marginTop: theme.spacing(2),\n },\n },\n filterPanel: {\n border: `1px solid ${theme.palette.action.selected}`,\n borderRadius: theme.shape.borderRadius,\n padding: theme.spacing(3),\n },\n questionCardMetadata: {\n width: '100%',\n marginTop: theme.spacing(3),\n },\n marginRight: {\n marginRight: theme.spacing(1),\n },\n questionCardActions: {\n marginTop: theme.spacing(2),\n '& a': {\n marginRight: theme.spacing(1),\n },\n },\n menuIcon: {\n minWidth: '26px',\n },\n deleteModal: {\n position: 'absolute',\n top: '20%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n width: 400,\n backgroundColor: theme.palette.background.default,\n border: `1px solid ${theme.palette.action.selected}`,\n borderRadius: theme.shape.borderRadius,\n padding: theme.spacing(2),\n '& button': {\n marginTop: theme.spacing(2),\n float: 'right',\n },\n },\n };\n});\n","import React from 'react';\nimport {\n Box,\n Checkbox,\n FormControl,\n FormControlLabel,\n FormGroup,\n FormLabel,\n Grid,\n Radio,\n RadioGroup,\n} from '@material-ui/core';\nimport { useStyles } from '../../utils/hooks';\n\nconst radioSelect = (value: string, label: string) => {\n return (\n <FormControlLabel\n value={value}\n control={<Radio size=\"small\" />}\n label={label}\n />\n );\n};\n\nexport const filterKeys = [\n 'orderBy',\n 'order',\n 'noAnswers',\n 'noCorrectAnswer',\n 'noVotes',\n] as const;\nexport type FilterKey = typeof filterKeys[number];\n\nexport interface FilterPanelProps {\n onChange: (key: FilterKey, value: string) => void;\n filters: Record<FilterKey, string>;\n}\n\nexport const FilterPanel = (props: FilterPanelProps) => {\n const { onChange, filters } = props;\n const styles = useStyles();\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n let value = event.target.value;\n if (event.target.type === 'checkbox') {\n value = event.target.checked ? 'true' : 'false';\n }\n onChange(event.target.name as FilterKey, value);\n };\n\n return (\n <Box className={styles.filterPanel}>\n <Grid container spacing={4}>\n <Grid item>\n <FormGroup>\n <FormLabel id=\"qeta-filter-order-by\">Filter</FormLabel>\n <FormControlLabel\n control={\n <Checkbox\n size=\"small\"\n name=\"noAnswers\"\n onChange={handleChange}\n checked={filters.noAnswers === 'true'}\n />\n }\n label=\"No answers\"\n />\n <FormControlLabel\n control={\n <Checkbox\n size=\"small\"\n name=\"noCorrectAnswer\"\n checked={filters.noCorrectAnswer === 'true'}\n onChange={handleChange}\n />\n }\n label=\"No correct answers\"\n />\n <FormControlLabel\n control={\n <Checkbox\n size=\"small\"\n name=\"noVotes\"\n checked={filters.noVotes === 'true'}\n onChange={handleChange}\n />\n }\n label=\"No votes\"\n />\n </FormGroup>\n </Grid>\n <Grid item>\n <FormControl>\n <FormLabel id=\"qeta-filter-order-by\">Order by</FormLabel>\n <RadioGroup\n aria-labelledby=\"qeta-filter-order-by\"\n name=\"orderBy\"\n value={filters.orderBy}\n onChange={handleChange}\n >\n {radioSelect('created', 'Created')}\n {radioSelect('views', 'Views')}\n {radioSelect('score', 'Score')}\n {radioSelect('answersCount', 'Answers')}\n </RadioGroup>\n </FormControl>\n </Grid>\n <Grid item>\n <FormControl>\n <FormLabel id=\"qeta-filter-order\">Order</FormLabel>\n <RadioGroup\n aria-labelledby=\"qeta-filter-order\"\n name=\"order\"\n value={filters.order}\n onChange={handleChange}\n >\n {radioSelect('desc', 'Descending')}\n {radioSelect('asc', 'Ascending')}\n </RadioGroup>\n </FormControl>\n </Grid>\n </Grid>\n </Box>\n );\n};\n","import { Entity, stringifyEntityRef } from '@backstage/catalog-model';\n\nexport const getEntityUrl = (entity: Entity) => {\n return `/catalog/${entity.metadata.namespace ?? 'default'}/${entity.kind}/${\n entity.metadata.name\n }`.toLowerCase();\n};\n\nexport const formatEntityName = (username: string) => {\n const plainName = username.split(/[\\/:]+/).pop();\n return plainName\n ?.split(/[_.-]+/)\n .map(a => a.charAt(0).toUpperCase() + a.slice(1))\n .join(' ');\n};\n\nexport const getEntityTitle = (entity: Entity): string => {\n const stringified = stringifyEntityRef(entity);\n return formatEntityName(entity.metadata.title ?? stringified) ?? stringified;\n};\n","import { QuestionResponse } from '../../api';\nimport {\n Card,\n CardContent,\n Chip,\n Link,\n Typography,\n useTheme,\n} from '@material-ui/core';\nimport React from 'react';\n// @ts-ignore\nimport RelativeTime from 'react-relative-time';\nimport { formatEntityName } from '../../utils/utils';\n\nexport const QuestionListItem = (props: { question: QuestionResponse }) => {\n const { question } = props;\n const theme = useTheme();\n return (\n <Card>\n <CardContent>\n <Typography gutterBottom variant=\"h5\" component=\"div\">\n <Link href={`/qeta/questions/${question.id}`}>{question.title}</Link>\n </Typography>\n {question.tags &&\n question.tags.map(tag => (\n <Chip\n key={tag}\n label={tag}\n size=\"small\"\n component=\"a\"\n href={`/qeta/tags/${tag}`}\n clickable\n />\n ))}\n <Typography variant=\"body2\" display=\"block\">\n By{' '}\n <Link href={`/qeta/users/${question.author}`}>\n {formatEntityName(question.author)}\n </Link>{' '}\n <RelativeTime\n value={question.created}\n titleFormat=\"YYYY/MM/DD HH:mm\"\n />\n </Typography>\n <Typography variant=\"caption\" display=\"inline\" gutterBottom>\n Score: {question.score} {' | '}\n </Typography>\n <Typography\n variant=\"caption\"\n style={{\n color: question.correctAnswer\n ? theme.palette.success.main\n : undefined,\n }}\n display=\"inline\"\n gutterBottom\n >\n Answers: {question.answersCount}\n </Typography>\n <Typography variant=\"caption\" display=\"inline\" gutterBottom>\n {' | '} Views: {question.views}\n </Typography>\n </CardContent>\n </Card>\n );\n};\n","import { useStyles } from '../../utils/hooks';\nimport { WarningPanel } from '@backstage/core-components';\nimport {\n Box,\n Button,\n Divider,\n FormControl,\n Grid,\n MenuItem,\n Select,\n Tooltip,\n Typography,\n} from '@material-ui/core';\nimport React from 'react';\nimport { QuestionListItem } from './QuestionListItem';\nimport { Pagination, Skeleton } from '@material-ui/lab';\nimport { QuestionsResponse } from '../../api';\nimport HelpOutline from '@material-ui/icons/HelpOutline';\n\nexport const QuestionList = (props: {\n loading: boolean;\n error: any;\n response?: QuestionsResponse;\n onPageChange: (page: number) => void;\n onPageSizeChange: (size: number) => void;\n page: number;\n pageSize: number;\n entity?: string;\n}) => {\n const {\n loading,\n error,\n response,\n onPageChange,\n entity,\n page,\n onPageSizeChange,\n } = props;\n const styles = useStyles();\n\n const handlePageChange = (\n _event: React.ChangeEvent<unknown>,\n value: number,\n ) => {\n onPageChange(value);\n };\n\n const handlePageSizeChange = (\n event: React.ChangeEvent<{ value: unknown }>,\n ) => {\n onPageSizeChange(Number.parseInt(event.target.value as string, 10));\n };\n\n if (loading) {\n return <Skeleton variant=\"rect\" height={200} />;\n }\n\n if (error || response === undefined) {\n return (\n <WarningPanel severity=\"error\" title=\"Could not load questions.\">\n {error?.message}\n </WarningPanel>\n );\n }\n\n if (response.questions.length === 0) {\n return (\n <Grid\n container\n justifyContent=\"center\"\n alignItems=\"center\"\n direction=\"column\"\n >\n <Grid item>\n <Typography variant=\"h6\">No questions found</Typography>\n </Grid>\n <Grid item>\n <Button\n href={entity ? `/qeta/ask?entity=${entity}` : '/qeta/ask'}\n startIcon={<HelpOutline />}\n >\n Go ahead and ask one!\n </Button>\n </Grid>\n </Grid>\n );\n }\n\n const pageCount =\n response.total < props.pageSize\n ? 1\n : Math.ceil(response.total / props.pageSize);\n\n return (\n <Box sx={{ mt: 2 }}>\n <Grid container spacing={2}>\n {response.questions.map(question => {\n return (\n <Grid item xs={12} key={question.id}>\n <QuestionListItem question={question} />\n <Divider />\n </Grid>\n );\n })}\n </Grid>\n <Grid\n container\n spacing={0}\n className={styles.questionListPagination}\n alignItems=\"center\"\n justifyContent=\"space-between\"\n >\n <Tooltip title=\"Questions per page\" arrow>\n <FormControl variant=\"filled\">\n <Select\n value={props.pageSize}\n onChange={handlePageSizeChange}\n className={styles.questionsPerPage}\n inputProps={{ className: styles.questionsPerPageInput }}\n >\n <MenuItem value={5}>5</MenuItem>\n <MenuItem value={10}>10</MenuItem>\n <MenuItem value={25}>25</MenuItem>\n <MenuItem value={50}>50</MenuItem>\n <MenuItem value={100}>100</MenuItem>\n </Select>\n </FormControl>\n </Tooltip>\n <Pagination\n page={page}\n onChange={handlePageChange}\n count={pageCount}\n size=\"large\"\n variant=\"outlined\"\n showFirstButton\n showLastButton\n />\n </Grid>\n </Box>\n );\n};\n","import { useQetaApi } from '../../utils/hooks';\nimport { Box, Button, Collapse, Grid, Typography } from '@material-ui/core';\nimport React, { useEffect } from 'react';\nimport { FilterKey, filterKeys, FilterPanel } from './FilterPanel';\nimport { QuestionList } from './QuestionList';\nimport FilterList from '@material-ui/icons/FilterList';\nimport { useSearchParams } from 'react-router-dom';\nimport { formatEntityName } from '../../utils/utils';\n\nexport interface QuestionsContainerProps {\n tags?: string[];\n author?: string;\n entity?: string;\n showFilters?: boolean;\n showTitle?: boolean;\n title?: string;\n favorite?: boolean;\n}\nexport const QuestionsContainer = (props: QuestionsContainerProps) => {\n const { tags, author, entity, showFilters, showTitle, title, favorite } =\n props;\n const [page, setPage] = React.useState(1);\n const [questionsPerPage, setQuestionsPerPage] = React.useState(10);\n const [showFilterPanel, setShowFilterPanel] = React.useState(false);\n const [searchParams, setSearchParams] = useSearchParams();\n const [filters, setFilters] = React.useState({\n order: 'desc',\n orderBy: 'created',\n noAnswers: 'false',\n noCorrectAnswer: 'false',\n noVotes: 'false',\n });\n\n const onPageChange = (value: number) => {\n setPage(value);\n setSearchParams(prev => {\n const newValue = prev;\n newValue.set('page', String(value));\n return newValue;\n });\n };\n\n const onFilterChange = (key: FilterKey, value: string) => {\n onPageChange(1);\n setFilters({ ...filters, ...{ [key]: value } });\n setSearchParams(prev => {\n const newValue = prev;\n newValue.set(key, value);\n return newValue;\n });\n };\n\n useEffect(() => {\n let filtersApplied = false;\n searchParams.forEach((value, key) => {\n try {\n if (key === 'page') {\n const pv = Number.parseInt(value, 10);\n if (pv > 0) {\n setPage(pv);\n } else {\n setPage(1);\n }\n } else if (key === 'questionsPerPage') {\n const qpp = Number.parseInt(value, 10);\n if (qpp > 0) setQuestionsPerPage(qpp);\n } else if (key in filterKeys) {\n filtersApplied = true;\n filters[key as FilterKey] = value;\n }\n } catch (_e) {\n // NOOP\n }\n });\n setFilters(filters);\n if (filtersApplied) {\n setShowFilterPanel(true);\n }\n }, [searchParams, filters]);\n\n const {\n value: response,\n loading,\n error,\n } = useQetaApi(\n api =>\n api.getQuestions({\n limit: questionsPerPage,\n offset: (page - 1) * questionsPerPage,\n tags,\n entity,\n author,\n favorite,\n ...filters,\n }),\n [page, filters, questionsPerPage],\n );\n\n const onPageSizeChange = (value: number) => {\n if (response) {\n let newPage = page;\n while (newPage * value > response.total) {\n newPage -= 1;\n }\n onPageChange(Math.max(1, newPage));\n }\n setQuestionsPerPage(value);\n setSearchParams(prev => {\n const newValue = prev;\n newValue.set('questionsPerPage', String(value));\n return newValue;\n });\n };\n\n let shownTitle = title;\n if (author) {\n shownTitle = `Questions by ${formatEntityName(author)}`;\n } else if (entity) {\n shownTitle = `Questions about ${formatEntityName(entity)}`;\n } else if (tags) {\n shownTitle = `Questions tagged with [${tags.join(', ')}]`;\n } else if (favorite) {\n shownTitle = 'Your favorite questions';\n }\n\n return (\n <Box>\n {showTitle && <Typography variant=\"h5\">{shownTitle}</Typography>}\n <Grid container justifyContent=\"space-between\">\n <Grid item>\n <Typography variant=\"h6\">{`${\n response?.total ?? 0\n } questions`}</Typography>\n </Grid>\n {(showFilters ?? true) && (\n <Grid item>\n <Button\n onClick={() => setShowFilterPanel(!showFilterPanel)}\n startIcon={<FilterList />}\n >\n Filter\n </Button>\n </Grid>\n )}\n </Grid>\n {(showFilters ?? true) && (\n <Collapse in={showFilterPanel}>\n <FilterPanel onChange={onFilterChange} filters={filters} />\n </Collapse>\n )}\n\n <QuestionList\n loading={loading}\n error={error}\n response={response}\n onPageChange={onPageChange}\n onPageSizeChange={onPageSizeChange}\n entity={entity}\n page={page}\n pageSize={questionsPerPage}\n />\n </Box>\n );\n};\n","import React from 'react';\nimport ReactMde from 'react-mde';\nimport { MarkdownContent } from '@backstage/core-components';\nimport { useStyles } from '../../utils/hooks';\n\nexport const MarkdownEditor = (props: {\n value: string;\n onChange: (value: string) => void;\n height: number;\n error?: boolean;\n placeholder?: string;\n}) => {\n const { value, onChange, height, error, placeholder } = props;\n const [selectedTab, setSelectedTab] = React.useState<'write' | 'preview'>(\n 'write',\n );\n const styles = useStyles();\n\n return (\n <ReactMde\n classes={{\n reactMde: styles.markdownEditor,\n textArea: error ? styles.markdownEditorError : undefined,\n }}\n value={value}\n onChange={onChange}\n selectedTab={selectedTab}\n onTabChange={setSelectedTab}\n minEditorHeight={height}\n minPreviewHeight={height}\n childProps={{ textArea: { required: true, placeholder } }}\n generateMarkdownPreview={content =>\n Promise.resolve(<MarkdownContent content={content} />)\n }\n />\n );\n};\n","import { configApiRef, useApi } from '@backstage/core-plugin-api';\nimport { Button, TextField } from '@material-ui/core';\nimport { Alert, Autocomplete } from '@material-ui/lab';\nimport React, { useEffect } from 'react';\nimport { Controller, useForm } from 'react-hook-form';\nimport 'react-mde/lib/styles/css/react-mde-all.css';\nimport { useNavigate, useSearchParams } from 'react-router-dom';\nimport {\n QetaApi,\n qetaApiRef,\n QuestionRequest,\n QuestionResponse,\n} from '../../api';\nimport { useStyles } from '../../utils/hooks';\nimport { MarkdownEditor } from '../MarkdownEditor/MarkdownEditor';\nimport { catalogApiRef } from '@backstage/plugin-catalog-react';\nimport { Entity, stringifyEntityRef } from '@backstage/catalog-model';\nimport { getEntityTitle } from '../../utils/utils';\nimport { CatalogApi } from '@backstage/catalog-client';\nimport { compact } from 'lodash';\n\ninterface QuestionForm {\n title: string;\n content: string;\n tags?: string[];\n entities?: Entity[];\n}\n\nconst formToRequest = (form: QuestionForm): QuestionRequest => {\n return {\n ...form,\n entities: form.entities?.map(stringifyEntityRef),\n };\n};\n\nconst getDefaultValues = (): QuestionForm => {\n return {\n title: '',\n content: '',\n tags: [],\n entities: [],\n };\n};\n\nconst getValues = async (\n api: QetaApi,\n catalogApi: CatalogApi,\n id?: string,\n): Promise<QuestionForm> => {\n if (!id) {\n return getDefaultValues();\n }\n\n const question = await api.getQuestion(id);\n const entities = question.entities\n ? await catalogApi.getEntitiesByRefs({\n entityRefs: question.entities,\n fields: [\n 'kind',\n 'metadata.name',\n 'metadata.namespace',\n 'metadata.title',\n ],\n })\n : [];\n return {\n title: question.title,\n content: question.content,\n tags: question.tags ?? [],\n entities: 'items' in entities ? compact(entities.items) : [],\n };\n};\n\nexport const AskForm = (props: {\n id?: string;\n entity?: string;\n onPost?: (question: QuestionResponse) => void;\n}) => {\n const { id, entity, onPost } = props;\n const navigate = useNavigate();\n const [entityRef, setEntityRef] = React.useState(entity);\n const [values, setValues] = React.useState(getDefaultValues());\n const [error, setError] = React.useState(false);\n const [availableTags, setAvailableTags] = React.useState<string[] | null>([]);\n const [searchParams, _setSearchParams] = useSearchParams();\n const [availableEntities, setAvailableEntities] = React.useState<\n Entity[] | null\n >([]);\n\n const qetaApi = useApi(qetaApiRef);\n const catalogApi = useApi(catalogApiRef);\n const configApi = useApi(configApiRef);\n const styles = useStyles();\n const {\n register,\n handleSubmit,\n control,\n reset,\n formState: { errors },\n } = useForm<QuestionForm>({\n values,\n defaultValues: getDefaultValues(),\n });\n\n const postQuestion = (data: QuestionForm) => {\n if (id) {\n qetaApi\n .updateQuestion(id, formToRequest(data))\n .then(q => {\n if (!q || !q.id) {\n setError(true);\n return;\n }\n reset();\n if (onPost) {\n onPost(q);\n } else {\n navigate(`/qeta/questions/${q.id}`);\n }\n })\n .catch(_e => setError(true));\n return;\n }\n qetaApi\n .postQuestion(formToRequest(data))\n .then(q => {\n if (!q || !q.id) {\n setError(true);\n return;\n }\n reset();\n navigate(`/qeta/questions/${q.id}`);\n })\n .catch(_e => setError(true));\n };\n\n useEffect(() => {\n if (!entityRef) {\n const e = searchParams.get('entity');\n if (e) {\n setEntityRef(e);\n }\n }\n }, [entityRef, searchParams]);\n\n useEffect(() => {\n if (id) {\n getValues(qetaApi, catalogApi, id).then(data => {\n setValues(data);\n });\n }\n }, [qetaApi, catalogApi, id]);\n\n useEffect(() => {\n if (entityRef) {\n catalogApi.getEntityByRef(entityRef).then(data => {\n if (data) {\n setValues(v => {\n return { ...v, entities: [data] };\n });\n setAvailableEntities([data]);\n }\n });\n }\n }, [catalogApi, entityRef]);\n\n useEffect(() => {\n reset(values);\n }, [values, reset]);\n\n useEffect(() => {\n qetaApi\n .getTags()\n .catch(_ => setAvailableTags(null))\n .then(data =>\n data\n ? setAvailableTags(data.map(tag => tag.tag))\n : setAvailableTags(null),\n );\n }, [qetaApi]);\n\n useEffect(() => {\n if (entityRef) {\n return;\n }\n let entityKinds = configApi.getOptionalStringArray('qeta.entityKinds');\n if (!entityKinds) {\n entityKinds = ['Component'];\n }\n\n catalogApi\n .getEntities({\n filter: { kind: entityKinds },\n fields: [\n 'kind',\n 'metadata.name',\n 'metadata.namespace',\n 'metadata.title',\n ],\n })\n .catch(_ => setAvailableEntities(null))\n .then(data =>\n data ? setAvailableEntities(data.items) : setAvailableEntities(null),\n );\n }, [catalogApi, entityRef, configApi]);\n\n return (\n <form onSubmit={handleSubmit(postQuestion)}>\n {error && <Alert severity=\"error\">Could not post question</Alert>}\n <TextField\n label=\"Title\"\n required\n fullWidth\n error={'title' in errors}\n margin=\"normal\"\n variant=\"outlined\"\n helperText=\"Write good title for your question that people can understand\"\n {\n // @ts-ignore\n ...register('title', { required: true, maxLength: 255 })\n }\n />\n <Controller\n control={control}\n rules={{\n required: true,\n }}\n render={({ field: { onChange, value } }) => (\n <MarkdownEditor\n value={value}\n onChange={onChange}\n height={400}\n error={'content' in errors}\n placeholder=\"Your question\"\n />\n )}\n name=\"content\"\n />\n {availableTags && (\n <Controller\n control={control}\n render={({ field: { onChange, value } }) => (\n <Autocomplete\n multiple\n id=\"tags-select\"\n value={value}\n options={availableTags}\n freeSolo\n onChange={(_e, newValue) => {\n if (!value || value.length < 5) {\n onChange(newValue);\n }\n }}\n renderInput={params => (\n <TextField\n {...params}\n variant=\"outlined\"\n margin=\"normal\"\n label=\"Tags\"\n placeholder=\"Type or select tags\"\n helperText=\"Add up to 5 tags to categorize your question\"\n />\n )}\n />\n )}\n name=\"tags\"\n />\n )}\n {availableEntities && (\n <Controller\n control={control}\n render={({ field: { onChange, value } }) => (\n <Autocomplete\n multiple\n hidden={!!entityRef}\n value={value}\n id=\"entities-select\"\n options={availableEntities}\n getOptionLabel={getEntityTitle}\n getOptionSelected={(o, v) =>\n stringifyEntityRef(o) === stringifyEntityRef(v)\n }\n onChange={(_e, newValue) => {\n if (!value || value.length < 3) {\n onChange(newValue);\n }\n }}\n renderInput={params => (\n <TextField\n {...params}\n variant=\"outlined\"\n margin=\"normal\"\n label=\"Entities\"\n placeholder=\"Type or select entities\"\n helperText=\"Add up to 3 entities this question relates to\"\n />\n )}\n />\n )}\n name=\"entities\"\n />\n )}\n <Button type=\"submit\" variant=\"contained\" className={styles.postButton}>\n {id ? 'Save' : 'Post'}\n </Button>\n </form>\n );\n};\n"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -19,6 +19,7 @@ interface QuestionsContainerProps {
19
19
  showFilters?: boolean;
20
20
  showTitle?: boolean;
21
21
  title?: string;
22
+ favorite?: boolean;
22
23
  }
23
24
  declare const QuestionsContainer: (props: QuestionsContainerProps) => JSX.Element;
24
25
 
@@ -46,6 +47,7 @@ interface QuestionResponse {
46
47
  score: number;
47
48
  answersCount: number;
48
49
  correctAnswer: boolean;
50
+ favorite: boolean;
49
51
  ownVote?: number;
50
52
  updated?: string;
51
53
  updatedBy?: string;
@@ -95,6 +97,7 @@ declare type GetQuestionsOptions = {
95
97
  tags?: string[];
96
98
  entity?: string;
97
99
  author?: string;
100
+ favorite?: boolean;
98
101
  };
99
102
  interface QetaApi {
100
103
  getQuestions(options: GetQuestionsOptions): Promise<QuestionsResponse>;
@@ -108,6 +111,8 @@ interface QetaApi {
108
111
  voteAnswerDown(questionId: number, id: number): Promise<AnswerResponse>;
109
112
  markAnswerCorrect(questionId: number, id: number): Promise<boolean>;
110
113
  markAnswerIncorrect(questionId: number, id: number): Promise<boolean>;
114
+ favoriteQuestion(id: number): Promise<QuestionResponse>;
115
+ unfavoriteQuestion(id: number): Promise<QuestionResponse>;
111
116
  postAnswer(answer: AnswerRequest): Promise<AnswerResponseBody>;
112
117
  deleteQuestion(questionId: number): Promise<boolean>;
113
118
  deleteAnswer(questionId: number, id: number): Promise<boolean>;
@@ -124,7 +129,6 @@ declare class QetaClient implements QetaApi {
124
129
  configApi: ConfigApi;
125
130
  fetchApi: FetchApi;
126
131
  });
127
- private getQueryParameters;
128
132
  getQuestions(options: GetQuestionsOptions): Promise<QuestionsResponse>;
129
133
  getQuestionsList(type: string): Promise<QuestionsResponse>;
130
134
  postQuestion(question: QuestionRequest): Promise<QuestionResponse>;
@@ -132,6 +136,8 @@ declare class QetaClient implements QetaApi {
132
136
  getTags(): Promise<TagResponse[]>;
133
137
  voteQuestionUp(id: number): Promise<QuestionResponse>;
134
138
  voteQuestionDown(id: number): Promise<QuestionResponse>;
139
+ favoriteQuestion(id: number): Promise<QuestionResponse>;
140
+ unfavoriteQuestion(id: number): Promise<QuestionResponse>;
135
141
  postAnswer(answer: AnswerRequest): Promise<AnswerResponseBody>;
136
142
  voteAnswerUp(questionId: number, id: number): Promise<AnswerResponse>;
137
143
  voteAnswerDown(questionId: number, id: number): Promise<AnswerResponse>;
@@ -142,6 +148,7 @@ declare class QetaClient implements QetaApi {
142
148
  updateQuestion(id: string, question: QuestionRequest): Promise<QuestionResponse>;
143
149
  updateAnswer(id: number, answer: AnswerRequest): Promise<AnswerResponseBody>;
144
150
  getAnswer(questionId: string | number | undefined, id: string | number | undefined): Promise<AnswerResponseBody>;
151
+ private getQueryParameters;
145
152
  }
146
153
 
147
154
  declare const AskForm: (props: {
package/dist/index.esm.js CHANGED
@@ -1,4 +1,4 @@
1
- export { A as AskForm, e as QetaClient, d as QetaPage, Q as QuestionsContainer, q as qetaApiRef, c as qetaPlugin } from './esm/index-074b9dc0.esm.js';
1
+ export { A as AskForm, h as QetaClient, e as QetaPage, Q as QuestionsContainer, q as qetaApiRef, d as qetaPlugin } from './esm/index-deb705e9.esm.js';
2
2
  import '@backstage/core-plugin-api';
3
3
  import '@backstage/errors';
4
4
  import 'lodash/omitBy';
package/package.json CHANGED
@@ -7,7 +7,7 @@
7
7
  "frontend",
8
8
  "backstage.io"
9
9
  ],
10
- "version": "1.2.2",
10
+ "version": "1.3.0",
11
11
  "main": "dist/index.esm.js",
12
12
  "types": "dist/index.d.ts",
13
13
  "prepublishOnly": "yarn tsc && yarn build",
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-074b9dc0.esm.js","sources":["../../src/routes.ts","../../src/api/QetaClient.ts","../../src/plugin.ts","../../src/utils/hooks.ts","../../src/components/QuestionsContainer/FilterPanel.tsx","../../src/utils/utils.ts","../../src/components/QuestionsContainer/QuestionListItem.tsx","../../src/components/QuestionsContainer/QuestionList.tsx","../../src/components/QuestionsContainer/QuestionsContainer.tsx","../../src/components/MarkdownEditor/MarkdownEditor.tsx","../../src/components/AskForm/AskForm.tsx"],"sourcesContent":["import { createRouteRef } from '@backstage/core-plugin-api';\n\nexport const rootRouteRef = createRouteRef({\n id: 'qeta',\n});\n","import { GetQuestionsOptions, QetaApi } from './QetaApi';\nimport { ConfigApi, createApiRef, FetchApi } from '@backstage/core-plugin-api';\nimport { CustomErrorBase } from '@backstage/errors';\nimport {\n AnswerRequest,\n AnswerResponse,\n AnswerResponseBody,\n QuestionRequest,\n QuestionResponse,\n QuestionResponseBody,\n QuestionsResponse,\n QuestionsResponseBody,\n TagResponse,\n} from './types';\nimport omitBy from 'lodash/omitBy';\nimport isEmpty from 'lodash/isEmpty';\n\nexport const qetaApiRef = createApiRef<QetaApi>({\n id: 'plugin.qeta.service',\n});\n\nexport class QetaError extends CustomErrorBase {\n public errors: null | undefined | any[];\n\n constructor(message: string, errors: null | undefined | any[]) {\n super(message);\n\n this.errors = errors;\n }\n}\n\nexport class QetaClient implements QetaApi {\n private readonly baseUrl: string;\n private readonly fetchApi: FetchApi;\n\n constructor(options: { configApi: ConfigApi; fetchApi: FetchApi }) {\n this.fetchApi = options.fetchApi;\n this.baseUrl = options.configApi.getString('backend.baseUrl');\n }\n\n private getQueryParameters(params: any): URLSearchParams {\n const asStrings = Object.fromEntries(\n Object.entries(params).map(([k, v]) => {\n if (!v) {\n return [k, ''];\n }\n return [k, `${v}`];\n }),\n );\n return new URLSearchParams(omitBy(asStrings, isEmpty));\n }\n\n async getQuestions(options: GetQuestionsOptions): Promise<QuestionsResponse> {\n const query = this.getQueryParameters(options).toString();\n\n let url = `${this.baseUrl}/api/qeta/questions`;\n if (query) {\n url += `?${query}`;\n }\n\n const response = await this.fetchApi.fetch(url);\n\n const data = (await response.json()) as QuestionsResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async getQuestionsList(type: string): Promise<QuestionsResponse> {\n const query = new URLSearchParams({ limit: '7' }).toString();\n\n let url = `${this.baseUrl}/api/qeta/questions/list/${type}`;\n if (query) {\n url += `?${query}`;\n }\n\n const response = await this.fetchApi.fetch(url);\n\n const data = (await response.json()) as QuestionsResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async postQuestion(question: QuestionRequest): Promise<QuestionResponse> {\n const response = await this.fetchApi.fetch(\n `${this.baseUrl}/api/qeta/questions`,\n {\n method: 'POST',\n body: JSON.stringify(question),\n headers: { 'Content-Type': 'application/json' },\n },\n );\n const data = (await response.json()) as QuestionResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async getQuestion(id?: string): Promise<QuestionResponse> {\n if (!id) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${this.baseUrl}/api/qeta/questions/${id}`,\n );\n const data = (await response.json()) as QuestionResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async getTags(): Promise<TagResponse[]> {\n const response = await this.fetchApi.fetch(`${this.baseUrl}/api/qeta/tags`);\n return (await response.json()) as TagResponse[];\n }\n\n async voteQuestionUp(id: number): Promise<QuestionResponse> {\n if (!id) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${this.baseUrl}/api/qeta/questions/${id}/upvote`,\n );\n const data = (await response.json()) as QuestionResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async voteQuestionDown(id: number): Promise<QuestionResponse> {\n if (!id) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${this.baseUrl}/api/qeta/questions/${id}/downvote`,\n );\n const data = (await response.json()) as QuestionResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async postAnswer(answer: AnswerRequest): Promise<AnswerResponseBody> {\n const response = await this.fetchApi.fetch(\n `${this.baseUrl}/api/qeta/questions/${answer.questionId}/answers`,\n {\n method: 'POST',\n body: JSON.stringify({ answer: answer.answer }),\n headers: { 'Content-Type': 'application/json' },\n },\n );\n const data = (await response.json()) as AnswerResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async voteAnswerUp(questionId: number, id: number): Promise<AnswerResponse> {\n if (!id || !questionId) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${this.baseUrl}/api/qeta/questions/${questionId}/answers/${id}/upvote`,\n );\n const data = (await response.json()) as AnswerResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async voteAnswerDown(\n questionId: number,\n id: number,\n ): Promise<AnswerResponse> {\n if (!id || !questionId) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${this.baseUrl}/api/qeta/questions/${questionId}/answers/${id}/downvote`,\n );\n const data = (await response.json()) as AnswerResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async markAnswerCorrect(questionId: number, id: number): Promise<boolean> {\n if (!id || !questionId) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${this.baseUrl}/api/qeta/questions/${questionId}/answers/${id}/correct`,\n );\n const data = await response;\n return data.ok;\n }\n\n async markAnswerIncorrect(questionId: number, id: number): Promise<boolean> {\n if (!id || !questionId) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${this.baseUrl}/api/qeta/questions/${questionId}/answers/${id}/incorrect`,\n );\n const data = await response;\n return data.ok;\n }\n\n async deleteQuestion(questionId: number): Promise<boolean> {\n if (!questionId) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${this.baseUrl}/api/qeta/questions/${questionId}`,\n {\n method: 'DELETE',\n },\n );\n const data = await response;\n return data.ok;\n }\n\n async deleteAnswer(questionId: number, id: number): Promise<boolean> {\n if (!questionId || !id) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${this.baseUrl}/api/qeta/questions/${questionId}/answers/${id}`,\n {\n method: 'DELETE',\n },\n );\n const data = await response;\n return data.ok;\n }\n\n async updateQuestion(\n id: string,\n question: QuestionRequest,\n ): Promise<QuestionResponse> {\n const response = await this.fetchApi.fetch(\n `${this.baseUrl}/api/qeta/questions/${id}`,\n {\n method: 'POST',\n body: JSON.stringify(question),\n headers: { 'Content-Type': 'application/json' },\n },\n );\n const data = (await response.json()) as QuestionResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to update', data.errors);\n }\n\n return data;\n }\n\n async updateAnswer(\n id: number,\n answer: AnswerRequest,\n ): Promise<AnswerResponseBody> {\n const response = await this.fetchApi.fetch(\n `${this.baseUrl}/api/qeta/questions/${answer.questionId}/answers/${id}`,\n {\n method: 'POST',\n body: JSON.stringify({ answer: answer.answer }),\n headers: { 'Content-Type': 'application/json' },\n },\n );\n const data = (await response.json()) as AnswerResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async getAnswer(\n questionId: string | number | undefined,\n id: string | number | undefined,\n ): Promise<AnswerResponseBody> {\n if (!questionId || !id) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${this.baseUrl}/api/qeta/questions/${questionId}/answers/${id}`,\n );\n const data = (await response.json()) as AnswerResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n}\n","import {\n configApiRef,\n createApiFactory,\n createPlugin,\n createRoutableExtension,\n fetchApiRef,\n} from '@backstage/core-plugin-api';\n\nimport { rootRouteRef } from './routes';\nimport { qetaApiRef, QetaClient } from './api';\n\nexport const qetaPlugin = createPlugin({\n id: 'qeta',\n routes: {\n root: rootRouteRef,\n },\n apis: [\n createApiFactory({\n api: qetaApiRef,\n deps: { configApi: configApiRef, fetchApi: fetchApiRef },\n factory: ({ configApi, fetchApi }) =>\n new QetaClient({ configApi, fetchApi }),\n }),\n ],\n});\n\nexport const QetaPage = qetaPlugin.provide(\n createRoutableExtension({\n name: 'QetaPage',\n component: () => import('./components/HomePage').then(m => m.HomePage),\n mountPoint: rootRouteRef,\n }),\n);\n","import { QetaApi, qetaApiRef } from '../api';\nimport { useAsync } from 'react-use';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { makeStyles } from '@material-ui/core';\nimport { CatalogApi } from '@backstage/catalog-client';\nimport { catalogApiRef } from '@backstage/plugin-catalog-react';\n\nexport function useQetaApi<T>(\n f: (api: QetaApi) => Promise<T>,\n deps: any[] = [],\n) {\n const qetaApi = useApi(qetaApiRef);\n\n return useAsync(async () => {\n return await f(qetaApi);\n }, deps);\n}\n\nexport function useCatalogApi<T>(\n f: (api: CatalogApi) => Promise<T>,\n deps: any[] = [],\n) {\n const catalogApi = useApi(catalogApiRef);\n\n return useAsync(async () => {\n return await f(catalogApi);\n }, deps);\n}\n\nexport const useStyles = makeStyles(theme => {\n return {\n markdownEditor: {\n backgroundColor: 'initial',\n color: theme.palette.text.primary,\n border: `1px solid ${theme.palette.action.disabled}`,\n borderRadius: theme.shape.borderRadius,\n '&:hover': {\n borderColor: theme.palette.action.active,\n },\n '&:focus-within': {\n borderColor: theme.palette.primary.main,\n },\n '& .mde-header': {\n backgroundColor: 'initial',\n color: theme.palette.text.primary,\n borderBottom: `1px solid ${theme.palette.action.selected}`,\n '& .mde-tabs button, .mde-header-item > button': {\n color: `${theme.palette.text.primary} !important`,\n },\n },\n '& .mde-text': {\n backgroundColor: 'initial',\n color: theme.palette.text.primary,\n outline: 'none',\n },\n },\n markdownEditorError: {\n border: `1px solid ${theme.palette.error.main} !important`,\n },\n successColor: {\n color: theme.palette.success.main,\n },\n questionCardVote: {\n textAlign: 'center',\n width: '50px',\n marginRight: '20px',\n display: 'inline-block',\n verticalAlign: 'top',\n },\n questionCardContent: {\n display: 'inline-block',\n width: 'calc(100% - 70px)',\n },\n questionCardAuthor: {\n textAlign: 'right',\n },\n questionListPagination: {\n marginTop: theme.spacing(2),\n },\n postButton: {\n marginTop: theme.spacing(1),\n marginBottom: theme.spacing(1),\n },\n questionHighlightList: {\n width: '100%',\n border: `1px solid ${theme.palette.action.selected}`,\n borderRadius: theme.shape.borderRadius,\n '&:not(:first-child)': {\n marginTop: theme.spacing(2),\n },\n },\n filterPanel: {\n border: `1px solid ${theme.palette.action.selected}`,\n borderRadius: theme.shape.borderRadius,\n padding: theme.spacing(3),\n },\n questionCardMetadata: {\n width: '100%',\n marginTop: theme.spacing(3),\n },\n marginRight: {\n marginRight: theme.spacing(1),\n },\n questionCardActions: {\n marginTop: theme.spacing(2),\n '& a': {\n marginRight: theme.spacing(1),\n },\n },\n deleteModal: {\n position: 'absolute',\n top: '20%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n width: 400,\n backgroundColor: theme.palette.background.default,\n border: `1px solid ${theme.palette.action.selected}`,\n borderRadius: theme.shape.borderRadius,\n padding: theme.spacing(2),\n '& button': {\n marginTop: theme.spacing(2),\n float: 'right',\n },\n },\n };\n});\n","import React from 'react';\nimport {\n Box,\n Checkbox,\n FormControl,\n FormControlLabel,\n FormGroup,\n FormLabel,\n Grid,\n Radio,\n RadioGroup,\n} from '@material-ui/core';\nimport { useStyles } from '../../utils/hooks';\n\nconst radioSelect = (value: string, label: string) => {\n return (\n <FormControlLabel\n value={value}\n control={<Radio size=\"small\" />}\n label={label}\n />\n );\n};\n\nexport const filterKeys = [\n 'orderBy',\n 'order',\n 'noAnswers',\n 'noCorrectAnswer',\n 'noVotes',\n] as const;\nexport type FilterKey = typeof filterKeys[number];\n\nexport interface FilterPanelProps {\n onChange: (key: FilterKey, value: string) => void;\n filters: Record<FilterKey, string>;\n}\n\nexport const FilterPanel = (props: FilterPanelProps) => {\n const { onChange, filters } = props;\n const styles = useStyles();\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n let value = event.target.value;\n if (event.target.type === 'checkbox') {\n value = event.target.checked ? 'true' : 'false';\n }\n onChange(event.target.name as FilterKey, value);\n };\n\n return (\n <Box className={styles.filterPanel}>\n <Grid container spacing={4}>\n <Grid item>\n <FormGroup>\n <FormLabel id=\"qeta-filter-order-by\">Filter</FormLabel>\n <FormControlLabel\n control={\n <Checkbox\n size=\"small\"\n name=\"noAnswers\"\n onChange={handleChange}\n checked={filters.noAnswers === 'true'}\n />\n }\n label=\"No answers\"\n />\n <FormControlLabel\n control={\n <Checkbox\n size=\"small\"\n name=\"noCorrectAnswer\"\n checked={filters.noCorrectAnswer === 'true'}\n onChange={handleChange}\n />\n }\n label=\"No correct answers\"\n />\n <FormControlLabel\n control={\n <Checkbox\n size=\"small\"\n name=\"noVotes\"\n checked={filters.noVotes === 'true'}\n onChange={handleChange}\n />\n }\n label=\"No votes\"\n />\n </FormGroup>\n </Grid>\n <Grid item>\n <FormControl>\n <FormLabel id=\"qeta-filter-order-by\">Order by</FormLabel>\n <RadioGroup\n aria-labelledby=\"qeta-filter-order-by\"\n name=\"orderBy\"\n value={filters.orderBy}\n onChange={handleChange}\n >\n {radioSelect('created', 'Created')}\n {radioSelect('views', 'Views')}\n {radioSelect('score', 'Score')}\n {radioSelect('answersCount', 'Answers')}\n </RadioGroup>\n </FormControl>\n </Grid>\n <Grid item>\n <FormControl>\n <FormLabel id=\"qeta-filter-order\">Order</FormLabel>\n <RadioGroup\n aria-labelledby=\"qeta-filter-order\"\n name=\"order\"\n value={filters.order}\n onChange={handleChange}\n >\n {radioSelect('desc', 'Descending')}\n {radioSelect('asc', 'Ascending')}\n </RadioGroup>\n </FormControl>\n </Grid>\n </Grid>\n </Box>\n );\n};\n","import { Entity, stringifyEntityRef } from '@backstage/catalog-model';\n\nexport const getEntityUrl = (entity: Entity) => {\n return `/catalog/${entity.metadata.namespace ?? 'default'}/${entity.kind}/${\n entity.metadata.name\n }`.toLowerCase();\n};\n\nexport const formatEntityName = (username: string) => {\n const plainName = username.split(/[\\/:]+/).pop();\n return plainName\n ?.split(/[_.-]+/)\n .map(a => a.charAt(0).toUpperCase() + a.slice(1))\n .join(' ');\n};\n\nexport const getEntityTitle = (entity: Entity): string => {\n const stringified = stringifyEntityRef(entity);\n return formatEntityName(entity.metadata.title ?? stringified) ?? stringified;\n};\n","import { QuestionResponse } from '../../api';\nimport {\n Card,\n CardContent,\n Chip,\n Link,\n Typography,\n useTheme,\n} from '@material-ui/core';\nimport React from 'react';\n// @ts-ignore\nimport RelativeTime from 'react-relative-time';\nimport { formatEntityName } from '../../utils/utils';\n\nexport const QuestionListItem = (props: { question: QuestionResponse }) => {\n const { question } = props;\n const theme = useTheme();\n return (\n <Card>\n <CardContent>\n <Typography gutterBottom variant=\"h5\" component=\"div\">\n <Link href={`/qeta/questions/${question.id}`}>{question.title}</Link>\n </Typography>\n {question.tags &&\n question.tags.map(tag => (\n <Chip\n key={tag}\n label={tag}\n size=\"small\"\n component=\"a\"\n href={`/qeta/tags/${tag}`}\n clickable\n />\n ))}\n <Typography variant=\"body2\" display=\"block\">\n By{' '}\n <Link href={`/qeta/users/${question.author}`}>\n {formatEntityName(question.author)}\n </Link>{' '}\n <RelativeTime\n value={question.created}\n titleFormat=\"YYYY/MM/DD HH:mm\"\n />\n </Typography>\n <Typography variant=\"caption\" display=\"inline\" gutterBottom>\n Score: {question.score} {' | '}\n </Typography>\n <Typography\n variant=\"caption\"\n style={{\n color: question.correctAnswer\n ? theme.palette.success.main\n : undefined,\n }}\n display=\"inline\"\n gutterBottom\n >\n Answers: {question.answersCount}\n </Typography>\n <Typography variant=\"caption\" display=\"inline\" gutterBottom>\n {' | '} Views: {question.views}\n </Typography>\n </CardContent>\n </Card>\n );\n};\n","import { useStyles } from '../../utils/hooks';\nimport { WarningPanel } from '@backstage/core-components';\nimport { Box, Button, Divider, Grid, Typography } from '@material-ui/core';\nimport React from 'react';\nimport { QuestionListItem } from './QuestionListItem';\nimport { Pagination, Skeleton } from '@material-ui/lab';\nimport { QuestionsResponse } from '../../api';\nimport HelpOutline from '@material-ui/icons/HelpOutline';\n\nexport const QuestionList = (props: {\n loading: boolean;\n error: any;\n response?: QuestionsResponse;\n onPageChange: (page: number) => void;\n page: number;\n entity?: string;\n}) => {\n const { loading, error, response, onPageChange, entity, page } = props;\n const pageSize = 10;\n const styles = useStyles();\n\n const handleChange = (_event: React.ChangeEvent<unknown>, value: number) => {\n onPageChange(value);\n };\n\n if (loading) {\n return <Skeleton variant=\"rect\" height={200} />;\n }\n\n if (error || response === undefined) {\n return (\n <WarningPanel severity=\"error\" title=\"Could not load questions.\">\n {error?.message}\n </WarningPanel>\n );\n }\n\n if (response.questions.length === 0) {\n return (\n <Grid\n container\n justifyContent=\"center\"\n alignItems=\"center\"\n direction=\"column\"\n >\n <Grid item>\n <Typography variant=\"h6\">No questions found</Typography>\n </Grid>\n <Grid item>\n <Button\n href={entity ? `/qeta/ask?entity=${entity}` : '/qeta/ask'}\n startIcon={<HelpOutline />}\n >\n Go ahead and ask one!\n </Button>\n </Grid>\n </Grid>\n );\n }\n\n const pageCount =\n response.total < pageSize ? 1 : Math.ceil(response.total / pageSize);\n\n return (\n <Box sx={{ mt: 2 }}>\n <Grid container spacing={2}>\n {response.questions.map(question => {\n return (\n <Grid item xs={12} key={question.id}>\n <QuestionListItem question={question} />\n <Divider />\n </Grid>\n );\n })}\n </Grid>\n <Grid\n container\n spacing={0}\n className={styles.questionListPagination}\n direction=\"column\"\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n <Pagination\n page={page}\n onChange={handleChange}\n count={pageCount}\n size=\"large\"\n variant=\"outlined\"\n showFirstButton\n showLastButton\n />\n </Grid>\n </Box>\n );\n};\n","import { useQetaApi } from '../../utils/hooks';\nimport { Box, Button, Collapse, Grid, Typography } from '@material-ui/core';\nimport React, { useEffect } from 'react';\nimport { FilterKey, filterKeys, FilterPanel } from './FilterPanel';\nimport { QuestionList } from './QuestionList';\nimport FilterList from '@material-ui/icons/FilterList';\nimport { useSearchParams } from 'react-router-dom';\nimport { formatEntityName } from '../../utils/utils';\n\nexport interface QuestionsContainerProps {\n tags?: string[];\n author?: string;\n entity?: string;\n showFilters?: boolean;\n showTitle?: boolean;\n title?: string;\n}\nexport const QuestionsContainer = (props: QuestionsContainerProps) => {\n const { tags, author, entity, showFilters, showTitle, title } = props;\n const [page, setPage] = React.useState(1);\n const [showFilterPanel, setShowFilterPanel] = React.useState(false);\n const [searchParams, setSearchParams] = useSearchParams();\n const [filters, setFilters] = React.useState({\n order: 'desc',\n orderBy: 'created',\n noAnswers: 'false',\n noCorrectAnswer: 'false',\n noVotes: 'false',\n });\n const pageSize = 10;\n const offset = (page - 1) * pageSize;\n\n const onPageChange = (value: number) => {\n setPage(value);\n setSearchParams(prev => {\n const newValue = prev;\n newValue.set('page', String(value));\n return newValue;\n });\n };\n\n const onFilterChange = (key: FilterKey, value: string) => {\n onPageChange(1);\n setFilters({ ...filters, ...{ [key]: value } });\n setSearchParams(prev => {\n const newValue = prev;\n newValue.set(key, value);\n return newValue;\n });\n };\n\n useEffect(() => {\n let filtersApplied = false;\n searchParams.forEach((value, key) => {\n if (key === 'page') {\n setPage(Number.parseInt(value, 10));\n } else if (key in filterKeys) {\n filtersApplied = true;\n filters[key as FilterKey] = value;\n }\n });\n setFilters(filters);\n if (filtersApplied) {\n setShowFilterPanel(true);\n }\n }, [searchParams, filters]);\n\n const {\n value: response,\n loading,\n error,\n } = useQetaApi(\n api =>\n api.getQuestions({\n limit: pageSize,\n offset,\n tags,\n entity,\n author,\n ...filters,\n }),\n [page, offset, filters],\n );\n\n let shownTitle = title;\n if (author) {\n shownTitle = `Questions by ${formatEntityName(author)}`;\n } else if (entity) {\n shownTitle = `Questions about ${formatEntityName(entity)}`;\n } else if (tags) {\n shownTitle = `Questions tagged with [${tags.join(', ')}]`;\n }\n\n return (\n <Box>\n {showTitle && <Typography variant=\"h5\">{shownTitle}</Typography>}\n <Grid container justifyContent=\"space-between\">\n <Grid item>\n <Typography variant=\"h6\">{`${\n response?.total ?? 0\n } questions`}</Typography>\n </Grid>\n {(showFilters ?? true) && (\n <Grid item>\n <Button\n onClick={() => setShowFilterPanel(!showFilterPanel)}\n startIcon={<FilterList />}\n >\n Filter\n </Button>\n </Grid>\n )}\n </Grid>\n {(showFilters ?? true) && (\n <Collapse in={showFilterPanel}>\n <FilterPanel onChange={onFilterChange} filters={filters} />\n </Collapse>\n )}\n\n <QuestionList\n loading={loading}\n error={error}\n response={response}\n onPageChange={onPageChange}\n entity={entity}\n page={page}\n />\n </Box>\n );\n};\n","import React from 'react';\nimport ReactMde from 'react-mde';\nimport { MarkdownContent } from '@backstage/core-components';\nimport { useStyles } from '../../utils/hooks';\n\nexport const MarkdownEditor = (props: {\n value: string;\n onChange: (value: string) => void;\n height: number;\n error?: boolean;\n placeholder?: string;\n}) => {\n const { value, onChange, height, error, placeholder } = props;\n const [selectedTab, setSelectedTab] = React.useState<'write' | 'preview'>(\n 'write',\n );\n const styles = useStyles();\n\n return (\n <ReactMde\n classes={{\n reactMde: styles.markdownEditor,\n textArea: error ? styles.markdownEditorError : undefined,\n }}\n value={value}\n onChange={onChange}\n selectedTab={selectedTab}\n onTabChange={setSelectedTab}\n minEditorHeight={height}\n minPreviewHeight={height}\n childProps={{ textArea: { required: true, placeholder } }}\n generateMarkdownPreview={content =>\n Promise.resolve(<MarkdownContent content={content} />)\n }\n />\n );\n};\n","import { configApiRef, useApi } from '@backstage/core-plugin-api';\nimport { Button, TextField } from '@material-ui/core';\nimport { Alert, Autocomplete } from '@material-ui/lab';\nimport React, { useEffect } from 'react';\nimport { Controller, useForm } from 'react-hook-form';\nimport 'react-mde/lib/styles/css/react-mde-all.css';\nimport { useNavigate, useSearchParams } from 'react-router-dom';\nimport {\n QetaApi,\n qetaApiRef,\n QuestionRequest,\n QuestionResponse,\n} from '../../api';\nimport { useStyles } from '../../utils/hooks';\nimport { MarkdownEditor } from '../MarkdownEditor/MarkdownEditor';\nimport { catalogApiRef } from '@backstage/plugin-catalog-react';\nimport { Entity, stringifyEntityRef } from '@backstage/catalog-model';\nimport { getEntityTitle } from '../../utils/utils';\nimport { CatalogApi } from '@backstage/catalog-client';\nimport { compact } from 'lodash';\n\ninterface QuestionForm {\n title: string;\n content: string;\n tags?: string[];\n entities?: Entity[];\n}\n\nconst formToRequest = (form: QuestionForm): QuestionRequest => {\n return {\n ...form,\n entities: form.entities?.map(stringifyEntityRef),\n };\n};\n\nconst getDefaultValues = (): QuestionForm => {\n return {\n title: '',\n content: '',\n tags: [],\n entities: [],\n };\n};\n\nconst getValues = async (\n api: QetaApi,\n catalogApi: CatalogApi,\n id?: string,\n): Promise<QuestionForm> => {\n if (!id) {\n return getDefaultValues();\n }\n\n const question = await api.getQuestion(id);\n const entities = question.entities\n ? await catalogApi.getEntitiesByRefs({\n entityRefs: question.entities,\n fields: [\n 'kind',\n 'metadata.name',\n 'metadata.namespace',\n 'metadata.title',\n ],\n })\n : [];\n return {\n title: question.title,\n content: question.content,\n tags: question.tags ?? [],\n entities: 'items' in entities ? compact(entities.items) : [],\n };\n};\n\nexport const AskForm = (props: {\n id?: string;\n entity?: string;\n onPost?: (question: QuestionResponse) => void;\n}) => {\n const { id, entity, onPost } = props;\n const navigate = useNavigate();\n const [entityRef, setEntityRef] = React.useState(entity);\n const [values, setValues] = React.useState(getDefaultValues());\n const [error, setError] = React.useState(false);\n const [availableTags, setAvailableTags] = React.useState<string[] | null>([]);\n const [searchParams, _setSearchParams] = useSearchParams();\n const [availableEntities, setAvailableEntities] = React.useState<\n Entity[] | null\n >([]);\n\n const qetaApi = useApi(qetaApiRef);\n const catalogApi = useApi(catalogApiRef);\n const configApi = useApi(configApiRef);\n const styles = useStyles();\n const {\n register,\n handleSubmit,\n control,\n reset,\n formState: { errors },\n } = useForm<QuestionForm>({\n values,\n defaultValues: getDefaultValues(),\n });\n\n const postQuestion = (data: QuestionForm) => {\n if (id) {\n qetaApi\n .updateQuestion(id, formToRequest(data))\n .then(q => {\n if (!q || !q.id) {\n setError(true);\n return;\n }\n reset();\n if (onPost) {\n onPost(q);\n } else {\n navigate(`/qeta/questions/${q.id}`);\n }\n })\n .catch(_e => setError(true));\n return;\n }\n qetaApi\n .postQuestion(formToRequest(data))\n .then(q => {\n if (!q || !q.id) {\n setError(true);\n return;\n }\n reset();\n navigate(`/qeta/questions/${q.id}`);\n })\n .catch(_e => setError(true));\n };\n\n useEffect(() => {\n if (!entityRef) {\n const e = searchParams.get('entity');\n if (e) {\n setEntityRef(e);\n }\n }\n }, [entityRef, searchParams]);\n\n useEffect(() => {\n if (id) {\n getValues(qetaApi, catalogApi, id).then(data => {\n setValues(data);\n });\n }\n }, [qetaApi, catalogApi, id]);\n\n useEffect(() => {\n if (entityRef) {\n catalogApi.getEntityByRef(entityRef).then(data => {\n if (data) {\n setValues(v => {\n return { ...v, entities: [data] };\n });\n setAvailableEntities([data]);\n }\n });\n }\n }, [catalogApi, entityRef]);\n\n useEffect(() => {\n reset(values);\n }, [values, reset]);\n\n useEffect(() => {\n qetaApi\n .getTags()\n .catch(_ => setAvailableTags(null))\n .then(data =>\n data\n ? setAvailableTags(data.map(tag => tag.tag))\n : setAvailableTags(null),\n );\n }, [qetaApi]);\n\n useEffect(() => {\n if (entityRef) {\n return;\n }\n let entityKinds = configApi.getOptionalStringArray('qeta.entityKinds');\n if (!entityKinds) {\n entityKinds = ['Component'];\n }\n\n catalogApi\n .getEntities({\n filter: { kind: entityKinds },\n fields: [\n 'kind',\n 'metadata.name',\n 'metadata.namespace',\n 'metadata.title',\n ],\n })\n .catch(_ => setAvailableEntities(null))\n .then(data =>\n data ? setAvailableEntities(data.items) : setAvailableEntities(null),\n );\n }, [catalogApi, entityRef, configApi]);\n\n return (\n <form onSubmit={handleSubmit(postQuestion)}>\n {error && <Alert severity=\"error\">Could not post question</Alert>}\n <TextField\n label=\"Title\"\n required\n fullWidth\n error={'title' in errors}\n margin=\"normal\"\n variant=\"outlined\"\n helperText=\"Write good title for your question that people can understand\"\n {\n // @ts-ignore\n ...register('title', { required: true, maxLength: 255 })\n }\n />\n <Controller\n control={control}\n rules={{\n required: true,\n }}\n render={({ field: { onChange, value } }) => (\n <MarkdownEditor\n value={value}\n onChange={onChange}\n height={400}\n error={'content' in errors}\n placeholder=\"Your question\"\n />\n )}\n name=\"content\"\n />\n {availableTags && (\n <Controller\n control={control}\n render={({ field: { onChange, value } }) => (\n <Autocomplete\n multiple\n id=\"tags-select\"\n value={value}\n options={availableTags}\n freeSolo\n onChange={(_e, newValue) => {\n if (!value || value.length < 5) {\n onChange(newValue);\n }\n }}\n renderInput={params => (\n <TextField\n {...params}\n variant=\"outlined\"\n margin=\"normal\"\n label=\"Tags\"\n placeholder=\"Type or select tags\"\n helperText=\"Add up to 5 tags to categorize your question\"\n />\n )}\n />\n )}\n name=\"tags\"\n />\n )}\n {availableEntities && (\n <Controller\n control={control}\n render={({ field: { onChange, value } }) => (\n <Autocomplete\n multiple\n hidden={!!entityRef}\n value={value}\n id=\"entities-select\"\n options={availableEntities}\n getOptionLabel={getEntityTitle}\n getOptionSelected={(o, v) =>\n stringifyEntityRef(o) === stringifyEntityRef(v)\n }\n onChange={(_e, newValue) => {\n if (!value || value.length < 3) {\n onChange(newValue);\n }\n }}\n renderInput={params => (\n <TextField\n {...params}\n variant=\"outlined\"\n margin=\"normal\"\n label=\"Entities\"\n placeholder=\"Type or select entities\"\n helperText=\"Add up to 3 entities this question relates to\"\n />\n )}\n />\n )}\n name=\"entities\"\n />\n )}\n <Button type=\"submit\" variant=\"contained\" className={styles.postButton}>\n {id ? 'Save' : 'Post'}\n </Button>\n </form>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-9a18f5f5.esm.js","sources":["../../src/components/AskPage/AskPage.tsx","../../src/components/QuestionPage/VoteButtons.tsx","../../src/components/DeleteModal/DeleteModal.tsx","../../src/components/QuestionPage/QuestionCard.tsx","../../src/components/QuestionPage/AnswerForm.tsx","../../src/components/QuestionPage/AnswerCard.tsx","../../src/components/QuestionPage/QuestionPage.tsx","../../src/components/TagPage/TagsContainer.tsx","../../src/components/TagPage/TagPage.tsx","../../src/components/UserPage/UserPage.tsx","../../src/components/QuestionHighlightList/QuestionHighlightList.tsx","../../src/components/HomePage/HomePage.tsx"],"sourcesContent":["import { Content, ContentHeader, InfoCard } from '@backstage/core-components';\nimport { Button, Grid } from '@material-ui/core';\nimport React from 'react';\nimport 'react-mde/lib/styles/css/react-mde-all.css';\nimport { AskForm } from '../AskForm/AskForm';\nimport HomeOutlined from '@material-ui/icons/HomeOutlined';\nimport { useParams } from 'react-router-dom';\n\nexport const AskPage = () => {\n const { id } = useParams();\n return (\n <Content>\n <ContentHeader title={id ? 'Edit question' : 'Ask question'}>\n <Button href=\"/qeta\" startIcon={<HomeOutlined />}>\n Back to questions\n </Button>\n </ContentHeader>\n <Grid container spacing={3} direction=\"column\">\n <Grid item>\n <InfoCard>\n <AskForm id={id} />\n </InfoCard>\n </Grid>\n </Grid>\n </Content>\n );\n};\n","import { AnswerResponse, qetaApiRef, QuestionResponse } from '../../api';\nimport {\n Box,\n IconButton,\n Tooltip,\n Typography,\n useTheme,\n} from '@material-ui/core';\nimport ArrowDownward from '@material-ui/icons/ArrowDownward';\nimport ArrowUpward from '@material-ui/icons/ArrowUpward';\nimport Check from '@material-ui/icons/Check';\nimport React from 'react';\nimport { useApi } from '@backstage/core-plugin-api';\n\nexport const VoteButtons = (props: {\n entity: QuestionResponse | AnswerResponse;\n question?: QuestionResponse;\n}) => {\n const [ownVote, setOwnVote] = React.useState(props.entity.ownVote ?? 0);\n const isCorrectAnswer =\n 'questionId' in props.entity ? props.entity.correct : false;\n const [correct, setCorrect] = React.useState(isCorrectAnswer);\n const [entity, setEntity] = React.useState<QuestionResponse | AnswerResponse>(\n props.entity,\n );\n const qetaApi = useApi(qetaApiRef);\n const theme = useTheme();\n const isQuestion = 'title' in entity;\n const own = props.entity.own ?? false;\n\n const voteUp = () => {\n if (isQuestion) {\n qetaApi.voteQuestionUp(entity.id).then(response => {\n setOwnVote(1);\n setEntity(response);\n });\n } else if ('questionId' in entity) {\n qetaApi.voteAnswerUp(entity.questionId, entity.id).then(response => {\n setOwnVote(1);\n setEntity(response);\n });\n }\n };\n\n const voteDown = () => {\n if (isQuestion) {\n qetaApi.voteQuestionDown(entity.id).then(response => {\n setOwnVote(-1);\n setEntity(response);\n });\n } else if ('questionId' in entity) {\n qetaApi.voteAnswerDown(entity.questionId, entity.id).then(response => {\n setOwnVote(-1);\n setEntity(response);\n });\n }\n };\n\n let correctTooltip = correct\n ? 'Mark answer as incorrect'\n : 'Mark answer as correct';\n if (!props.question?.own) {\n correctTooltip = correct ? 'This answer has been marked as correct' : '';\n }\n\n let voteUpTooltip = isQuestion\n ? 'This question is good'\n : 'This answer is good';\n if (own) {\n voteUpTooltip = isQuestion\n ? 'You cannot vote your own question'\n : 'You cannot vote your own answer';\n }\n\n let voteDownTooltip = isQuestion\n ? 'This question is not good'\n : 'This answer is not good';\n if (own) {\n voteDownTooltip = voteUpTooltip;\n }\n\n const toggleCorrectAnswer = () => {\n if (!('questionId' in entity)) {\n return;\n }\n if (correct) {\n qetaApi\n .markAnswerIncorrect(entity.questionId, entity.id)\n .then(response => {\n if (response) {\n setCorrect(false);\n }\n });\n } else {\n qetaApi.markAnswerCorrect(entity.questionId, entity.id).then(response => {\n setCorrect(response);\n });\n }\n };\n\n return (\n <React.Fragment>\n <Tooltip title={voteUpTooltip}>\n <IconButton\n aria-label=\"vote up\"\n color={ownVote > 0 ? 'primary' : 'default'}\n disabled={own}\n size=\"small\"\n onClick={voteUp}\n >\n <ArrowUpward />\n </IconButton>\n </Tooltip>\n <Typography variant=\"h6\">{entity.score}</Typography>\n <Tooltip title={voteDownTooltip}>\n <IconButton\n aria-label=\"vote down\"\n color={ownVote < 0 ? 'primary' : 'default'}\n disabled={own}\n size=\"small\"\n onClick={voteDown}\n >\n <ArrowDownward />\n </IconButton>\n </Tooltip>\n {'correct' in props.entity && (props.question?.own || correct) && (\n <Box>\n <Tooltip title={correctTooltip}>\n <IconButton\n aria-label=\"mark correct\"\n style={{\n color: correct ? theme.palette.success.main : undefined,\n }}\n size=\"small\"\n onClick={props.question?.own ? toggleCorrectAnswer : undefined}\n >\n <Check />\n </IconButton>\n </Tooltip>\n </Box>\n )}\n </React.Fragment>\n );\n};\n","import { AnswerResponse, qetaApiRef, QuestionResponse } from '../../api';\nimport { Backdrop, Box, Button, Modal, Typography } from '@material-ui/core';\nimport { Alert } from '@material-ui/lab';\nimport Delete from '@material-ui/icons/Delete';\nimport React from 'react';\nimport { useStyles } from '../../utils/hooks';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { useNavigate } from 'react-router-dom';\n\nexport const DeleteModal = (props: {\n entity: QuestionResponse | AnswerResponse;\n open: boolean;\n onClose: () => void;\n question?: QuestionResponse;\n}) => {\n const qetaApi = useApi(qetaApiRef);\n const navigate = useNavigate();\n const { entity, open, question, onClose } = props;\n const styles = useStyles();\n const [error, setError] = React.useState(false);\n const isQuestion = 'title' in entity;\n\n const title = isQuestion\n ? 'Are you sure you want to delete this question?'\n : 'Are you sure you want to delete this answer?';\n\n const handleDelete = () => {\n if (isQuestion) {\n qetaApi\n .deleteQuestion(entity.id)\n .catch(_ => setError(true))\n .then(ret => {\n if (ret) {\n onClose();\n navigate(`/qeta`);\n } else {\n setError(true);\n }\n });\n } else if (question) {\n qetaApi\n .deleteAnswer(question.id, entity.id)\n .catch(_ => setError(true))\n .then(ret => {\n if (ret) {\n onClose();\n window.location.reload();\n } else {\n setError(true);\n }\n });\n }\n };\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n aria-labelledby=\"modal-modal-title\"\n aria-describedby=\"modal-modal-description\"\n closeAfterTransition\n BackdropComponent={Backdrop}\n BackdropProps={{\n timeout: 500,\n }}\n >\n <Box className={styles.deleteModal}>\n {error && <Alert severity=\"error\">Failed to delete</Alert>}\n <Typography id=\"modal-modal-title\" variant=\"h6\" component=\"h2\">\n {title}\n </Typography>\n <Button onClick={handleDelete} startIcon={<Delete />} color=\"secondary\">\n Delete\n </Button>\n <Button onClick={onClose}>Cancel</Button>\n </Box>\n </Modal>\n );\n};\n","import { QuestionResponse } from '../../api';\nimport {\n Box,\n Card,\n CardContent,\n Chip,\n Grid,\n Link,\n Tooltip,\n Typography,\n} from '@material-ui/core';\nimport React, { useEffect } from 'react';\nimport { MarkdownContent } from '@backstage/core-components';\nimport { VoteButtons } from './VoteButtons';\nimport { useStyles } from '../../utils/hooks';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { catalogApiRef } from '@backstage/plugin-catalog-react';\nimport { Entity, stringifyEntityRef } from '@backstage/catalog-model';\nimport {\n formatEntityName,\n getEntityTitle,\n getEntityUrl,\n} from '../../utils/utils';\nimport { compact } from 'lodash';\n// @ts-ignore\nimport RelativeTime from 'react-relative-time';\nimport { DeleteModal } from '../DeleteModal/DeleteModal';\n\nexport const QuestionCard = (props: { question: QuestionResponse }) => {\n const { question } = props;\n const styles = useStyles();\n const catalogApi = useApi(catalogApiRef);\n const [entities, setEntities] = React.useState<Entity[]>([]);\n const [deleteModalOpen, setDeleteModalOpen] = React.useState(false);\n const handleDeleteModalOpen = () => setDeleteModalOpen(true);\n const handleDeleteModalClose = () => setDeleteModalOpen(false);\n\n useEffect(() => {\n if (question.entities && question.entities.length > 0) {\n catalogApi\n .getEntitiesByRefs({\n entityRefs: question.entities,\n fields: [\n 'kind',\n 'metadata.name',\n 'metadata.namespace',\n 'metadata.title',\n ],\n })\n .catch(_ => setEntities([]))\n .then(data =>\n data ? setEntities(compact(data.items)) : setEntities([]),\n );\n }\n }, [catalogApi, question]);\n\n return (\n <Card variant=\"outlined\">\n <CardContent>\n <div className={styles.questionCardVote}>\n <VoteButtons entity={question} />\n </div>\n <div className={styles.questionCardContent}>\n <Typography variant=\"body1\" gutterBottom>\n <MarkdownContent content={question.content} dialect=\"gfm\" />\n </Typography>\n <Box className={styles.questionCardMetadata}>\n <Grid container spacing={0} justifyContent=\"space-around\">\n <Grid item xs={8}>\n {question.tags &&\n question.tags.map(tag => (\n <Chip\n label={tag}\n size=\"small\"\n component=\"a\"\n href={`/qeta/tags/${tag}`}\n clickable\n />\n ))}\n {entities &&\n entities.map(component => (\n <Tooltip\n title={\n component.metadata.description?.slice(0, 50) ??\n stringifyEntityRef(component)\n }\n arrow\n >\n <Chip\n label={getEntityTitle(component)}\n size=\"small\"\n variant=\"outlined\"\n component=\"a\"\n href={getEntityUrl(component)}\n clickable\n />\n </Tooltip>\n ))}\n </Grid>\n <Grid item xs={4} className={styles.questionCardAuthor}>\n Asked <RelativeTime value={question.created} /> by{' '}\n <Link href={`/qeta/users/${question.author}`}>\n {formatEntityName(question.author)}\n </Link>\n </Grid>\n </Grid>\n {question.own && (\n <Box className={styles.questionCardActions}>\n <Link underline=\"none\" href=\"#\" onClick={handleDeleteModalOpen}>\n Delete\n </Link>\n <Link\n underline=\"none\"\n href={`/qeta/questions/${question.id}/edit`}\n >\n Edit\n </Link>\n <DeleteModal\n open={deleteModalOpen}\n onClose={handleDeleteModalClose}\n entity={question}\n />\n </Box>\n )}\n </Box>\n </div>\n </CardContent>\n </Card>\n );\n};\n","import { WarningPanel } from '@backstage/core-components';\nimport { Button, Typography } from '@material-ui/core';\nimport React, { useEffect } from 'react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport {\n AnswerRequest,\n AnswerResponse,\n qetaApiRef,\n QuestionResponse,\n} from '../../api';\nimport { useStyles } from '../../utils/hooks';\nimport { Controller, useForm } from 'react-hook-form';\nimport { MarkdownEditor } from '../MarkdownEditor/MarkdownEditor';\n\nconst getDefaultValues = (questionId: number) => {\n return { questionId, answer: '' };\n};\n\nexport const AnswerForm = (props: {\n question: QuestionResponse;\n onPost: (answer: AnswerResponse) => void;\n id?: number;\n}) => {\n const { question, onPost, id } = props;\n const [values, setValues] = React.useState(getDefaultValues(question.id));\n const [error, setError] = React.useState(false);\n const qetaApi = useApi(qetaApiRef);\n const styles = useStyles();\n\n const {\n handleSubmit,\n control,\n formState: { errors },\n reset,\n } = useForm<AnswerRequest>({\n values,\n defaultValues: getDefaultValues(question.id),\n });\n\n const postAnswer = (data: AnswerRequest) => {\n if (id) {\n qetaApi\n .updateAnswer(id, { questionId: question.id, answer: data.answer })\n .then(a => {\n if (!a || !('id' in a)) {\n setError(true);\n return;\n }\n reset();\n onPost(a);\n })\n .catch(_e => setError(true));\n return;\n }\n\n qetaApi\n .postAnswer({ questionId: question.id, answer: data.answer })\n .then(a => {\n if (!a || !('id' in a)) {\n setError(true);\n return;\n }\n reset();\n onPost(a);\n })\n .catch(_e => setError(true));\n };\n\n useEffect(() => {\n if (id) {\n qetaApi.getAnswer(question.id, id).then(a => {\n if ('content' in a) {\n setValues({ questionId: question.id, answer: a.content });\n } else {\n setError(true);\n }\n });\n }\n }, [id, question, qetaApi]);\n\n useEffect(() => {\n reset(values);\n }, [values, reset]);\n\n return (\n <form onSubmit={handleSubmit(postAnswer)}>\n <Typography variant=\"h6\">Your answer</Typography>\n {error && <WarningPanel severity=\"error\" title=\"Could not post answer\" />}\n <Controller\n control={control}\n defaultValue=\"\"\n rules={{\n required: true,\n }}\n render={({ field: { onChange, value } }) => (\n <MarkdownEditor\n value={value}\n onChange={onChange}\n height={200}\n error={'answer' in errors}\n />\n )}\n name=\"answer\"\n />\n <Button variant=\"contained\" type=\"submit\" className={styles.postButton}>\n {id ? 'Save' : 'Post'}\n </Button>\n </form>\n );\n};\n","import { AnswerResponse, QuestionResponse } from '../../api';\nimport {\n Box,\n Card,\n CardContent,\n Grid,\n Link,\n Typography,\n} from '@material-ui/core';\nimport React from 'react';\nimport { MarkdownContent } from '@backstage/core-components';\nimport { VoteButtons } from './VoteButtons';\nimport { useStyles } from '../../utils/hooks';\nimport { formatEntityName } from '../../utils/utils';\nimport { DeleteModal } from '../DeleteModal/DeleteModal';\nimport { AnswerForm } from './AnswerForm';\n// @ts-ignore\nimport RelativeTime from 'react-relative-time';\n\nexport const AnswerCard = (props: {\n answer: AnswerResponse;\n question: QuestionResponse;\n}) => {\n const { answer, question } = props;\n const styles = useStyles();\n\n const [editMode, setEditMode] = React.useState(false);\n const [answerEntity, setAnswerEntity] = React.useState(answer);\n\n const [deleteModalOpen, setDeleteModalOpen] = React.useState(false);\n const handleDeleteModalOpen = () => setDeleteModalOpen(true);\n const handleDeleteModalClose = () => setDeleteModalOpen(false);\n\n const onAnswerEdit = (a: AnswerResponse) => {\n setEditMode(false);\n setAnswerEntity(a);\n };\n\n return (\n <Card id={`a${answer.id}`}>\n <CardContent>\n <Grid container spacing={0}>\n <Grid item className={styles.questionCardVote}>\n <VoteButtons entity={answerEntity} question={question} />\n </Grid>\n <Grid item>\n {editMode ? (\n <AnswerForm\n question={question}\n onPost={onAnswerEdit}\n id={answerEntity.id}\n />\n ) : (\n <>\n <Typography variant=\"body1\" gutterBottom>\n <MarkdownContent\n content={answerEntity.content}\n dialect=\"gfm\"\n />\n </Typography>\n <Box>\n <Typography variant=\"caption\" gutterBottom>\n By{' '}\n <Link href={`/qeta/users/${answerEntity.author}`}>\n {formatEntityName(answerEntity.author)}\n </Link>{' '}\n <RelativeTime value={answerEntity.created} />\n {answerEntity.updated && (\n <>\n {' '}\n (updated <RelativeTime value={answerEntity.updated} />)\n </>\n )}\n </Typography>\n </Box>\n {answerEntity.own && (\n <Box className={styles.questionCardActions}>\n <Link\n underline=\"none\"\n href=\"#\"\n onClick={handleDeleteModalOpen}\n >\n Delete\n </Link>\n <Link\n underline=\"none\"\n href=\"#\"\n onClick={() => setEditMode(true)}\n >\n Edit\n </Link>\n <DeleteModal\n open={deleteModalOpen}\n onClose={handleDeleteModalClose}\n entity={answerEntity}\n question={question}\n />\n </Box>\n )}\n </>\n )}\n </Grid>\n </Grid>\n </CardContent>\n </Card>\n );\n};\n","import React from 'react';\nimport { Box, Button, Divider, Typography } from '@material-ui/core';\nimport { useParams } from 'react-router-dom';\nimport {\n Content,\n ContentHeader,\n WarningPanel,\n} from '@backstage/core-components';\nimport { useQetaApi, useStyles } from '../../utils/hooks';\nimport { QuestionCard } from './QuestionCard';\nimport { AnswerResponse, QuestionResponse } from '../../api';\n// @ts-ignore\nimport RelativeTime from 'react-relative-time';\nimport { AnswerForm } from './AnswerForm';\nimport { AnswerCard } from './AnswerCard';\nimport { Skeleton } from '@material-ui/lab';\nimport HelpOutline from '@material-ui/icons/HelpOutline';\nimport HomeOutlined from '@material-ui/icons/HomeOutlined';\n\nexport const QuestionPage = () => {\n const { id } = useParams();\n const styles = useStyles();\n const [newAnswers, setNewAnswers] = React.useState<AnswerResponse[]>([]);\n\n const {\n value: question,\n loading,\n error,\n } = useQetaApi(api => api.getQuestion(id), [id]);\n\n const onAnswerPost = (answer: AnswerResponse) => {\n setNewAnswers(newAnswers.concat([answer]));\n };\n\n const getDescription = (q: QuestionResponse) => {\n return (\n <span>\n Asked{' '}\n <Box fontWeight=\"fontWeightMedium\" display=\"inline\" sx={{ mr: 2 }}>\n <RelativeTime value={q.created} />\n </Box>\n {q.updated && (\n <React.Fragment>\n Updated{' '}\n <Box fontWeight=\"fontWeightMedium\" display=\"inline\" sx={{ mr: 2 }}>\n <RelativeTime value={q.updated} />\n </Box>\n </React.Fragment>\n )}\n Viewed{' '}\n <Box fontWeight=\"fontWeightMedium\" display=\"inline\">\n {q.views} times\n </Box>\n </span>\n );\n };\n\n if (loading) {\n return <Skeleton variant=\"rect\" height={200} />;\n }\n\n if (error || question === undefined) {\n return (\n <WarningPanel severity=\"error\" title=\"Could not load question.\">\n {error?.message}\n </WarningPanel>\n );\n }\n\n return (\n <Content>\n <ContentHeader\n title={question.title}\n // @ts-ignore\n description={getDescription(question)}\n >\n <Button\n className={styles.marginRight}\n href=\"/qeta\"\n startIcon={<HomeOutlined />}\n >\n Back to questions\n </Button>\n <Button\n variant=\"contained\"\n href=\"/qeta/ask\"\n startIcon={<HelpOutline />}\n >\n Ask question\n </Button>\n </ContentHeader>\n <QuestionCard question={question} />\n <Box sx={{ mt: 3, mb: 2 }}>\n <Typography variant=\"h6\">\n {question.answersCount + newAnswers.length} answers\n </Typography>\n </Box>\n {(question.answers ?? []).concat(newAnswers).map(a => {\n return (\n <>\n <Box key={a.id} sx={{ mb: 1 }}>\n <AnswerCard answer={a} question={question} />\n </Box>\n <Divider />\n </>\n );\n })}\n <Divider />\n <AnswerForm question={question} onPost={onAnswerPost} />\n </Content>\n );\n};\n","import {\n Avatar,\n Chip,\n Grid,\n IconButton,\n TextField,\n Typography,\n} from '@material-ui/core';\nimport React from 'react';\nimport { useQetaApi } from '../../utils/hooks';\nimport { Skeleton } from '@material-ui/lab';\nimport { WarningPanel } from '@backstage/core-components';\nimport { TagResponse } from '../../api';\n\nexport const TagsContainer = () => {\n const [searchQuery, setSearchQuery] = React.useState('');\n const {\n value: response,\n loading,\n error,\n } = useQetaApi(api => api.getTags(), []);\n\n if (loading) {\n return <Skeleton variant=\"rect\" height={200} />;\n }\n\n if (error || response === undefined) {\n return (\n <WarningPanel severity=\"error\" title=\"Could not load tags.\">\n {error?.message}\n </WarningPanel>\n );\n }\n\n const filterData = (query: string, data: TagResponse[]) => {\n if (!query) {\n return data;\n }\n return data.filter(t => t.tag.toLowerCase().includes(query));\n };\n\n const tags = filterData(searchQuery, response);\n\n return (\n <Grid container>\n <Grid item xs={12}>\n <TextField\n id=\"search-bar\"\n className=\"text\"\n onChange={(\n event: React.ChangeEvent<HTMLTextAreaElement | HTMLInputElement>,\n ) => setSearchQuery(event.target.value)}\n label=\"Search tag\"\n variant=\"outlined\"\n placeholder=\"Search...\"\n size=\"small\"\n />\n <IconButton type=\"submit\" aria-label=\"search\" />\n </Grid>\n <Grid item xs={12}>\n <Typography variant=\"h6\">{`Showing ${tags.length} tags`}</Typography>\n </Grid>\n <Grid item>\n {tags.map(tag => (\n <Chip\n key={tag.tag}\n variant=\"outlined\"\n avatar={<Avatar>{tag.questionsCount}</Avatar>}\n label={tag.tag}\n component=\"a\"\n clickable\n href={`/qeta/tags/${tag.tag}`}\n />\n ))}\n </Grid>\n </Grid>\n );\n};\n","import React from 'react';\nimport { Button } from '@material-ui/core';\nimport { useParams } from 'react-router-dom';\nimport { Content, ContentHeader } from '@backstage/core-components';\n// @ts-ignore\nimport RelativeTime from 'react-relative-time';\nimport { QuestionsContainer } from '../QuestionsContainer/QuestionsContainer';\nimport { TagsContainer } from './TagsContainer';\nimport HelpOutline from '@material-ui/icons/HelpOutline';\nimport HomeOutlined from '@material-ui/icons/HomeOutlined';\nimport { useStyles } from '../../utils/hooks';\n\nexport const TagPage = () => {\n const { tag } = useParams();\n const styles = useStyles();\n return (\n <Content>\n <ContentHeader title={tag ? `Questions tagged [${tag}]` : 'Tags'}>\n <Button\n href=\"/qeta\"\n className={styles.marginRight}\n startIcon={<HomeOutlined />}\n >\n Back to questions\n </Button>\n <Button\n variant=\"contained\"\n href=\"/qeta/ask\"\n startIcon={<HelpOutline />}\n >\n Ask question\n </Button>\n </ContentHeader>\n {tag ? <QuestionsContainer tags={[tag ?? '']} /> : <TagsContainer />}\n </Content>\n );\n};\n","import React from 'react';\nimport { Button } from '@material-ui/core';\nimport { useParams } from 'react-router-dom';\nimport { Content, ContentHeader } from '@backstage/core-components';\n// @ts-ignore\nimport RelativeTime from 'react-relative-time';\nimport { QuestionsContainer } from '../QuestionsContainer/QuestionsContainer';\nimport { formatEntityName } from '../../utils/utils';\nimport { useStyles } from '../../utils/hooks';\n\nexport const UserPage = () => {\n const identity = useParams()['*'] ?? 'unknown';\n const styles = useStyles();\n return (\n <Content>\n <ContentHeader title={`Questions by ${formatEntityName(identity)}`}>\n <Button href=\"/qeta\" className={styles.marginRight}>\n Back to questions\n </Button>\n <Button variant=\"contained\" href=\"/qeta/ask\">\n Ask question\n </Button>\n </ContentHeader>\n <QuestionsContainer author={identity ?? ''} />\n </Content>\n );\n};\n","import {\n Box,\n Divider,\n List,\n ListItem,\n ListItemText,\n ListSubheader,\n} from '@material-ui/core';\nimport React from 'react';\nimport { useQetaApi, useStyles } from '../../utils/hooks';\nimport { Skeleton } from '@material-ui/lab';\n\nexport const QuestionHighlightList = (props: {\n type: string;\n title: string;\n noQuestionsLabel: string;\n icon?: JSX.Element;\n}) => {\n const {\n value: response,\n loading,\n error,\n } = useQetaApi(api => api.getQuestionsList(props.type), []);\n const classes = useStyles();\n\n const questions = response?.questions ?? [];\n\n return (\n <Box\n className={classes.questionHighlightList}\n display={{ md: 'none', lg: 'block' }}\n >\n <List\n component=\"nav\"\n aria-labelledby=\"nested-list-subheader\"\n subheader={\n <ListSubheader\n component=\"div\"\n id=\"nested-list-subheader\"\n color=\"primary\"\n >\n {props.title}\n {props.icon}\n </ListSubheader>\n }\n >\n {loading && (\n <ListItem>\n <Skeleton variant=\"rect\" />\n </ListItem>\n )}\n {error && (\n <ListItem>\n <ListItemText>Failed to load questions</ListItemText>\n </ListItem>\n )}\n {!error && questions.length === 0 && (\n <ListItem>\n <ListItemText>{props.noQuestionsLabel}</ListItemText>\n </ListItem>\n )}\n {!error &&\n questions.map(q => (\n <React.Fragment key={q.id}>\n <Divider />\n <ListItem\n button\n dense\n component=\"a\"\n href={`/qeta/questions/${q.id}`}\n >\n <ListItemText>{q.title}</ListItemText>\n </ListItem>\n </React.Fragment>\n ))}\n </List>\n </Box>\n );\n};\n","import React from 'react';\nimport { Button, Grid } from '@material-ui/core';\nimport {\n Content,\n ContentHeader,\n Header,\n Page,\n} from '@backstage/core-components';\nimport { Route, Routes } from 'react-router-dom';\nimport { AskPage } from '../AskPage';\nimport { QuestionPage } from '../QuestionPage/QuestionPage';\nimport { QuestionsContainer } from '../QuestionsContainer/QuestionsContainer';\nimport { TagPage } from '../TagPage/TagPage';\nimport { UserPage } from '../UserPage/UserPage';\nimport HelpOutline from '@material-ui/icons/HelpOutline';\nimport LoyaltyOutlined from '@material-ui/icons/LoyaltyOutlined';\nimport { QuestionHighlightList } from '../QuestionHighlightList/QuestionHighlightList';\nimport { useStyles } from '../../utils/hooks';\nimport Whatshot from '@material-ui/icons/Whatshot';\n\nexport const HomePageContent = () => {\n const styles = useStyles();\n return (\n <Content>\n <Grid container spacing={3}>\n <Grid item md={12} lg={9} xl={10}>\n <ContentHeader title=\"All questions\">\n <Button\n href=\"/qeta/tags\"\n className={styles.marginRight}\n startIcon={<LoyaltyOutlined />}\n >\n Tags\n </Button>\n <Button\n variant=\"contained\"\n href=\"/qeta/ask\"\n startIcon={<HelpOutline />}\n >\n Ask question\n </Button>\n </ContentHeader>\n <QuestionsContainer />\n </Grid>\n <Grid item lg={3} xl={2}>\n <QuestionHighlightList\n type=\"hot\"\n title=\"Hot questions\"\n noQuestionsLabel=\"No questions\"\n icon={<Whatshot fontSize=\"small\" />}\n />\n <QuestionHighlightList\n type=\"unanswered\"\n title=\"Unanswered questions\"\n noQuestionsLabel=\"No unanswered questions\"\n />\n <QuestionHighlightList\n type=\"incorrect\"\n title=\"Questions without correct answer\"\n noQuestionsLabel=\"No questions without correct answers\"\n />\n </Grid>\n </Grid>\n </Content>\n );\n};\n\ntype Props = {\n title?: string;\n subtitle?: string;\n headerElements?: JSX.Element[];\n};\n\nexport const HomePage = (props: Props) => (\n <Page themeId=\"tool\">\n <Header title={props.title ?? 'Q&A'} subtitle={props.subtitle}>\n {props.headerElements}\n </Header>\n <Routes>\n <Route path=\"/\" element={<HomePageContent />} />\n <Route path=\"/ask\" element={<AskPage />} />\n <Route path=\"/questions/:id/edit\" element={<AskPage />} />\n <Route path=\"/questions/:id\" element={<QuestionPage />} />\n <Route path=\"/tags\" element={<TagPage />} />\n <Route path=\"/tags/:tag\" element={<TagPage />} />\n <Route path=\"/users/*\" element={<UserPage />} />\n </Routes>\n </Page>\n);\n"],"names":[],"mappings":"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"}