@drodil/backstage-plugin-qeta 2.3.0 → 2.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/QetaClient.esm.js +434 -0
- package/dist/api/QetaClient.esm.js.map +1 -0
- package/dist/components/AskAnonymouslyCheckbox/AskAnonymouslyCheckbox.esm.js +32 -0
- package/dist/components/AskAnonymouslyCheckbox/AskAnonymouslyCheckbox.esm.js.map +1 -0
- package/dist/components/AskForm/AskForm.esm.js +218 -0
- package/dist/components/AskForm/AskForm.esm.js.map +1 -0
- package/dist/components/AskForm/EntitiesInput.esm.js +98 -0
- package/dist/components/AskForm/EntitiesInput.esm.js.map +1 -0
- package/dist/components/AskForm/TagInput.esm.js +86 -0
- package/dist/components/AskForm/TagInput.esm.js.map +1 -0
- package/dist/components/AskPage/AskPage.esm.js +38 -0
- package/dist/components/AskPage/AskPage.esm.js.map +1 -0
- package/dist/components/Buttons/AskQuestionButton.esm.js +43 -0
- package/dist/components/Buttons/AskQuestionButton.esm.js.map +1 -0
- package/dist/components/Buttons/BackToQuestionsButton.esm.js +38 -0
- package/dist/components/Buttons/BackToQuestionsButton.esm.js.map +1 -0
- package/dist/components/CommentSection/CommentList.esm.js +47 -0
- package/dist/components/CommentSection/CommentList.esm.js.map +1 -0
- package/dist/components/CommentSection/CommentSection.esm.js +97 -0
- package/dist/components/CommentSection/CommentSection.esm.js.map +1 -0
- package/dist/components/DeleteModal/DeleteModal.esm.js +77 -0
- package/dist/components/DeleteModal/DeleteModal.esm.js.map +1 -0
- package/dist/components/FavoritePage/FavoritePage.esm.js +13 -0
- package/dist/components/FavoritePage/FavoritePage.esm.js.map +1 -0
- package/dist/components/HomePage/HomePage.esm.js +144 -0
- package/dist/components/HomePage/HomePage.esm.js.map +1 -0
- package/dist/components/HomePage/index.esm.js +2 -0
- package/dist/components/HomePage/index.esm.js.map +1 -0
- package/dist/components/Links/Links.esm.js +31 -0
- package/dist/components/Links/Links.esm.js.map +1 -0
- package/dist/components/MarkdownEditor/MarkdownEditor.esm.js +80 -0
- package/dist/components/MarkdownEditor/MarkdownEditor.esm.js.map +1 -0
- package/dist/components/QuestionHighlightList/QuestionHighlightList.esm.js +61 -0
- package/dist/components/QuestionHighlightList/QuestionHighlightList.esm.js.map +1 -0
- package/dist/components/QuestionPage/AnswerCard.esm.js +101 -0
- package/dist/components/QuestionPage/AnswerCard.esm.js.map +1 -0
- package/dist/components/QuestionPage/AnswerForm.esm.js +130 -0
- package/dist/components/QuestionPage/AnswerForm.esm.js.map +1 -0
- package/dist/components/QuestionPage/AuthorBox.esm.js +25 -0
- package/dist/components/QuestionPage/AuthorBox.esm.js.map +1 -0
- package/dist/components/QuestionPage/EntityChip.esm.js +26 -0
- package/dist/components/QuestionPage/EntityChip.esm.js.map +1 -0
- package/dist/components/QuestionPage/FavoriteButton.esm.js +43 -0
- package/dist/components/QuestionPage/FavoriteButton.esm.js.map +1 -0
- package/dist/components/QuestionPage/LinkButton.esm.js +32 -0
- package/dist/components/QuestionPage/LinkButton.esm.js.map +1 -0
- package/dist/components/QuestionPage/QuestionCard.esm.js +103 -0
- package/dist/components/QuestionPage/QuestionCard.esm.js.map +1 -0
- package/dist/components/QuestionPage/QuestionPage.esm.js +131 -0
- package/dist/components/QuestionPage/QuestionPage.esm.js.map +1 -0
- package/dist/components/QuestionPage/TagsAndEntities.esm.js +44 -0
- package/dist/components/QuestionPage/TagsAndEntities.esm.js.map +1 -0
- package/dist/components/QuestionPage/VoteButtons.esm.js +146 -0
- package/dist/components/QuestionPage/VoteButtons.esm.js.map +1 -0
- package/dist/components/QuestionTableCard/Content.esm.js +9 -0
- package/dist/components/QuestionTableCard/Content.esm.js.map +1 -0
- package/dist/components/QuestionTableCard/QuestionTableRow.esm.js +21 -0
- package/dist/components/QuestionTableCard/QuestionTableRow.esm.js.map +1 -0
- package/dist/components/QuestionTableCard/QuestionsTable.esm.js +130 -0
- package/dist/components/QuestionTableCard/QuestionsTable.esm.js.map +1 -0
- package/dist/components/QuestionTableCard/index.esm.js +3 -0
- package/dist/components/QuestionTableCard/index.esm.js.map +1 -0
- package/dist/components/QuestionsContainer/FilterPanel.esm.js +230 -0
- package/dist/components/QuestionsContainer/FilterPanel.esm.js.map +1 -0
- package/dist/components/QuestionsContainer/NoQuestionsCard.esm.js +46 -0
- package/dist/components/QuestionsContainer/NoQuestionsCard.esm.js.map +1 -0
- package/dist/components/QuestionsContainer/QuestionList.esm.js +102 -0
- package/dist/components/QuestionsContainer/QuestionList.esm.js.map +1 -0
- package/dist/components/QuestionsContainer/QuestionListItem.esm.js +119 -0
- package/dist/components/QuestionsContainer/QuestionListItem.esm.js.map +1 -0
- package/dist/components/QuestionsContainer/QuestionsContainer.esm.js +231 -0
- package/dist/components/QuestionsContainer/QuestionsContainer.esm.js.map +1 -0
- package/dist/components/RelativeTimeWithTooltip/RelativeTimeWithTooltip.esm.js +22 -0
- package/dist/components/RelativeTimeWithTooltip/RelativeTimeWithTooltip.esm.js.map +1 -0
- package/dist/components/Statistics/StatisticsPage.esm.js +13 -0
- package/dist/components/Statistics/StatisticsPage.esm.js.map +1 -0
- package/dist/components/Statistics/TopRankingUsersCard.esm.js +163 -0
- package/dist/components/Statistics/TopRankingUsersCard.esm.js.map +1 -0
- package/dist/components/Statistics/TrophyIcon.esm.js +19 -0
- package/dist/components/Statistics/TrophyIcon.esm.js.map +1 -0
- package/dist/components/Statistics/styles.esm.js +23 -0
- package/dist/components/Statistics/styles.esm.js.map +1 -0
- package/dist/components/TagPage/TagPage.esm.js +16 -0
- package/dist/components/TagPage/TagPage.esm.js.map +1 -0
- package/dist/components/TagPage/TagsContainer.esm.js +63 -0
- package/dist/components/TagPage/TagsContainer.esm.js.map +1 -0
- package/dist/components/UserPage/UserPage.esm.js +24 -0
- package/dist/components/UserPage/UserPage.esm.js.map +1 -0
- package/dist/index.esm.js +9 -32
- package/dist/index.esm.js.map +1 -1
- package/dist/plugin.esm.js +60 -0
- package/dist/plugin.esm.js.map +1 -0
- package/dist/utils/hooks.esm.js +283 -0
- package/dist/utils/hooks.esm.js.map +1 -0
- package/dist/utils/utils.esm.js +31 -0
- package/dist/utils/utils.esm.js.map +1 -0
- package/package.json +15 -15
- package/dist/esm/index-C7A2tOkT.esm.js +0 -33
- package/dist/esm/index-C7A2tOkT.esm.js.map +0 -1
- package/dist/esm/index-CFNWBJNR.esm.js +0 -2412
- package/dist/esm/index-CFNWBJNR.esm.js.map +0 -1
- package/dist/esm/index-rSPV8dxK.esm.js +0 -1120
- package/dist/esm/index-rSPV8dxK.esm.js.map +0 -1
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import React, { useState, useEffect } from 'react';
|
|
2
|
+
import { Container, Box, Grid, Typography, FormControl, Select, Divider } from '@material-ui/core';
|
|
3
|
+
import { WarningPanel, Content, ContentHeader } from '@backstage/core-components';
|
|
4
|
+
import { useParams, useSearchParams } from 'react-router-dom';
|
|
5
|
+
import { useStyles, useQetaApi } from '../../utils/hooks.esm.js';
|
|
6
|
+
import { QuestionCard } from './QuestionCard.esm.js';
|
|
7
|
+
import { AnswerForm } from './AnswerForm.esm.js';
|
|
8
|
+
import { AnswerCard } from './AnswerCard.esm.js';
|
|
9
|
+
import { Skeleton } from '@material-ui/lab';
|
|
10
|
+
import { AskQuestionButton } from '../Buttons/AskQuestionButton.esm.js';
|
|
11
|
+
import { BackToQuestionsButton } from '../Buttons/BackToQuestionsButton.esm.js';
|
|
12
|
+
import { RelativeTimeWithTooltip } from '../RelativeTimeWithTooltip/RelativeTimeWithTooltip.esm.js';
|
|
13
|
+
import { UpdatedByLink } from '../Links/Links.esm.js';
|
|
14
|
+
import { useSignal } from '@backstage/plugin-signals-react';
|
|
15
|
+
|
|
16
|
+
const QuestionPage = () => {
|
|
17
|
+
var _a;
|
|
18
|
+
const { id } = useParams();
|
|
19
|
+
const styles = useStyles();
|
|
20
|
+
const [newAnswers, setNewAnswers] = React.useState([]);
|
|
21
|
+
const [answerSort, setAnswerSort] = React.useState("default");
|
|
22
|
+
const [searchParams] = useSearchParams();
|
|
23
|
+
const [answersCount, setAnswersCount] = useState(0);
|
|
24
|
+
const [views, setViews] = useState(0);
|
|
25
|
+
const { lastSignal } = useSignal(`qeta:question_${id}`);
|
|
26
|
+
const {
|
|
27
|
+
value: question,
|
|
28
|
+
loading,
|
|
29
|
+
error
|
|
30
|
+
} = useQetaApi((api) => api.getQuestion(id), [id]);
|
|
31
|
+
useEffect(() => {
|
|
32
|
+
if (question) {
|
|
33
|
+
setAnswersCount(question.answersCount);
|
|
34
|
+
setViews(question.views);
|
|
35
|
+
}
|
|
36
|
+
}, [question]);
|
|
37
|
+
useEffect(() => {
|
|
38
|
+
if ((lastSignal == null ? void 0 : lastSignal.type) === "question_stats") {
|
|
39
|
+
setAnswersCount(lastSignal.answersCount);
|
|
40
|
+
setViews(lastSignal.views);
|
|
41
|
+
}
|
|
42
|
+
}, [lastSignal]);
|
|
43
|
+
const onAnswerPost = (answer) => {
|
|
44
|
+
setNewAnswers(newAnswers.concat([answer]));
|
|
45
|
+
};
|
|
46
|
+
const getDescription = (q) => {
|
|
47
|
+
return /* @__PURE__ */ React.createElement("span", null, "Asked", " ", /* @__PURE__ */ React.createElement(Box, { fontWeight: "fontWeightMedium", display: "inline", sx: { mr: 2 } }, /* @__PURE__ */ React.createElement(RelativeTimeWithTooltip, { value: q.created })), q.updated && /* @__PURE__ */ React.createElement(React.Fragment, null, "Updated", " ", /* @__PURE__ */ React.createElement(Box, { fontWeight: "fontWeightMedium", display: "inline", sx: { mr: 2 } }, /* @__PURE__ */ React.createElement(RelativeTimeWithTooltip, { value: q.updated }), " by", " ", /* @__PURE__ */ React.createElement(UpdatedByLink, { entity: q }))), "Viewed", " ", /* @__PURE__ */ React.createElement(Box, { fontWeight: "fontWeightMedium", display: "inline" }, views, " times"));
|
|
48
|
+
};
|
|
49
|
+
if (loading) {
|
|
50
|
+
return /* @__PURE__ */ React.createElement(Skeleton, { variant: "rect", height: 200 });
|
|
51
|
+
}
|
|
52
|
+
if (error || question === void 0) {
|
|
53
|
+
return /* @__PURE__ */ React.createElement(WarningPanel, { severity: "error", title: "Could not load question." }, error == null ? void 0 : error.message);
|
|
54
|
+
}
|
|
55
|
+
const sortAnswers = (a, b) => {
|
|
56
|
+
var _a2, _b, _c, _d, _e, _f;
|
|
57
|
+
if (answerSort === "default") {
|
|
58
|
+
return 1;
|
|
59
|
+
}
|
|
60
|
+
const parts = answerSort.split("_");
|
|
61
|
+
const field = parts[0];
|
|
62
|
+
const order = parts[1];
|
|
63
|
+
let ret = -1;
|
|
64
|
+
switch (field) {
|
|
65
|
+
case "created":
|
|
66
|
+
ret = a.created > b.created ? -1 : 1;
|
|
67
|
+
break;
|
|
68
|
+
case "score":
|
|
69
|
+
ret = a.score > b.score ? -1 : 1;
|
|
70
|
+
break;
|
|
71
|
+
case "author":
|
|
72
|
+
ret = a.author > b.author ? -1 : 1;
|
|
73
|
+
break;
|
|
74
|
+
case "comments":
|
|
75
|
+
ret = ((_b = (_a2 = a.comments) == null ? void 0 : _a2.length) != null ? _b : 0) > ((_d = (_c = b.comments) == null ? void 0 : _c.length) != null ? _d : 0) ? -1 : 1;
|
|
76
|
+
break;
|
|
77
|
+
case "updated":
|
|
78
|
+
ret = ((_e = a.updated) != null ? _e : a.created) > ((_f = b.updated) != null ? _f : b.created) ? -1 : 1;
|
|
79
|
+
break;
|
|
80
|
+
default:
|
|
81
|
+
return 1;
|
|
82
|
+
}
|
|
83
|
+
if (order === "desc") {
|
|
84
|
+
ret *= -1;
|
|
85
|
+
}
|
|
86
|
+
return ret;
|
|
87
|
+
};
|
|
88
|
+
const allAnswers = ((_a = question.answers) != null ? _a : []).concat(newAnswers);
|
|
89
|
+
return /* @__PURE__ */ React.createElement(Content, null, /* @__PURE__ */ React.createElement(Container, { maxWidth: "lg" }, /* @__PURE__ */ React.createElement(
|
|
90
|
+
ContentHeader,
|
|
91
|
+
{
|
|
92
|
+
title: question.title,
|
|
93
|
+
description: getDescription(question)
|
|
94
|
+
},
|
|
95
|
+
/* @__PURE__ */ React.createElement(
|
|
96
|
+
BackToQuestionsButton,
|
|
97
|
+
{
|
|
98
|
+
entityPage: searchParams.get("entityPage") === "true"
|
|
99
|
+
}
|
|
100
|
+
),
|
|
101
|
+
/* @__PURE__ */ React.createElement(AskQuestionButton, null)
|
|
102
|
+
), /* @__PURE__ */ React.createElement(QuestionCard, { question }), /* @__PURE__ */ React.createElement(Box, { sx: { mt: 3, mb: 2 } }, /* @__PURE__ */ React.createElement(Grid, { container: true, justifyContent: "space-between", alignItems: "center" }, /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(Typography, { variant: "h6" }, answersCount + newAnswers.length, " answers")), allAnswers.length > 1 && /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(FormControl, null, /* @__PURE__ */ React.createElement(
|
|
103
|
+
Select,
|
|
104
|
+
{
|
|
105
|
+
native: true,
|
|
106
|
+
label: "Sort answers",
|
|
107
|
+
value: answerSort,
|
|
108
|
+
onChange: (val) => setAnswerSort(val.target.value),
|
|
109
|
+
inputProps: {
|
|
110
|
+
name: "sortAnswers",
|
|
111
|
+
id: "sort-answers"
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
/* @__PURE__ */ React.createElement("option", { value: "default" }, "Default"),
|
|
115
|
+
/* @__PURE__ */ React.createElement("option", { value: "created_desc" }, "Created (desc)"),
|
|
116
|
+
/* @__PURE__ */ React.createElement("option", { value: "created_asc" }, "Created (asc)"),
|
|
117
|
+
/* @__PURE__ */ React.createElement("option", { value: "score_desc" }, "Score (desc)"),
|
|
118
|
+
/* @__PURE__ */ React.createElement("option", { value: "score_asc" }, "Score (asc)"),
|
|
119
|
+
/* @__PURE__ */ React.createElement("option", { value: "comments_desc" }, "Comments (desc)"),
|
|
120
|
+
/* @__PURE__ */ React.createElement("option", { value: "comments_asc" }, "Comments (asc)"),
|
|
121
|
+
/* @__PURE__ */ React.createElement("option", { value: "author_desc" }, "Author (desc)"),
|
|
122
|
+
/* @__PURE__ */ React.createElement("option", { value: "author_asc" }, "Author (asc)"),
|
|
123
|
+
/* @__PURE__ */ React.createElement("option", { value: "updated_desc" }, "Updated (desc)"),
|
|
124
|
+
/* @__PURE__ */ React.createElement("option", { value: "updated_asc" }, "Updated (asc)")
|
|
125
|
+
))))), allAnswers.sort(sortAnswers).map((a) => {
|
|
126
|
+
return /* @__PURE__ */ React.createElement(React.Fragment, { key: a.id }, /* @__PURE__ */ React.createElement(Divider, { className: styles.questionDivider }), /* @__PURE__ */ React.createElement(Box, { key: a.id, sx: { mb: 1 } }, /* @__PURE__ */ React.createElement(AnswerCard, { answer: a, question })));
|
|
127
|
+
}), /* @__PURE__ */ React.createElement(Divider, { className: styles.questionDivider }), /* @__PURE__ */ React.createElement(AnswerForm, { question, onPost: onAnswerPost })));
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
export { QuestionPage };
|
|
131
|
+
//# sourceMappingURL=QuestionPage.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QuestionPage.esm.js","sources":["../../../src/components/QuestionPage/QuestionPage.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react';\nimport {\n Box,\n Container,\n Divider,\n FormControl,\n Grid,\n Select,\n Typography,\n} from '@material-ui/core';\nimport {\n Content,\n ContentHeader,\n WarningPanel,\n} from '@backstage/core-components';\nimport { useParams, useSearchParams } from 'react-router-dom';\nimport { useQetaApi, useStyles } from '../../utils/hooks';\nimport { QuestionCard } from './QuestionCard';\nimport {\n Answer,\n AnswerResponse,\n QetaSignal,\n QuestionResponse,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { AnswerForm } from './AnswerForm';\nimport { AnswerCard } from './AnswerCard';\nimport { Skeleton } from '@material-ui/lab';\nimport { AskQuestionButton } from '../Buttons/AskQuestionButton';\nimport { BackToQuestionsButton } from '../Buttons/BackToQuestionsButton';\nimport { RelativeTimeWithTooltip } from '../RelativeTimeWithTooltip/RelativeTimeWithTooltip';\nimport { UpdatedByLink } from '../Links/Links';\nimport { useSignal } from '@backstage/plugin-signals-react';\n\nexport const QuestionPage = () => {\n const { id } = useParams();\n const styles = useStyles();\n const [newAnswers, setNewAnswers] = React.useState<AnswerResponse[]>([]);\n const [answerSort, setAnswerSort] = React.useState<string>('default');\n const [searchParams] = useSearchParams();\n\n const [answersCount, setAnswersCount] = useState(0);\n const [views, setViews] = useState(0);\n\n const { lastSignal } = useSignal<QetaSignal>(`qeta:question_${id}`);\n\n const {\n value: question,\n loading,\n error,\n } = useQetaApi(api => api.getQuestion(id), [id]);\n\n useEffect(() => {\n if (question) {\n setAnswersCount(question.answersCount);\n setViews(question.views);\n }\n }, [question]);\n\n useEffect(() => {\n if (lastSignal?.type === 'question_stats') {\n setAnswersCount(lastSignal.answersCount);\n setViews(lastSignal.views);\n }\n }, [lastSignal]);\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 <RelativeTimeWithTooltip value={q.created} />\n </Box>\n {q.updated && (\n <React.Fragment>\n Updated{' '}\n <Box fontWeight=\"fontWeightMedium\" display=\"inline\" sx={{ mr: 2 }}>\n <RelativeTimeWithTooltip value={q.updated} /> by{' '}\n <UpdatedByLink entity={q} />\n </Box>\n </React.Fragment>\n )}\n Viewed{' '}\n <Box fontWeight=\"fontWeightMedium\" display=\"inline\">\n {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 const sortAnswers = (a: Answer, b: Answer) => {\n if (answerSort === 'default') {\n return 1;\n }\n\n const parts = answerSort.split('_');\n const field = parts[0];\n const order = parts[1];\n\n let ret = -1;\n switch (field) {\n case 'created':\n ret = a.created > b.created ? -1 : 1;\n break;\n case 'score':\n ret = a.score > b.score ? -1 : 1;\n break;\n case 'author':\n ret = a.author > b.author ? -1 : 1;\n break;\n case 'comments':\n ret = (a.comments?.length ?? 0) > (b.comments?.length ?? 0) ? -1 : 1;\n break;\n case 'updated':\n ret = (a.updated ?? a.created) > (b.updated ?? b.created) ? -1 : 1;\n break;\n default:\n return 1;\n }\n\n if (order === 'desc') {\n ret *= -1;\n }\n return ret;\n };\n\n const allAnswers = (question.answers ?? []).concat(newAnswers);\n return (\n <Content>\n <Container maxWidth=\"lg\">\n <ContentHeader\n title={question.title}\n // @ts-ignore\n description={getDescription(question)}\n >\n <BackToQuestionsButton\n entityPage={searchParams.get('entityPage') === 'true'}\n />\n <AskQuestionButton />\n </ContentHeader>\n <QuestionCard question={question} />\n <Box sx={{ mt: 3, mb: 2 }}>\n <Grid container justifyContent=\"space-between\" alignItems=\"center\">\n <Grid item>\n <Typography variant=\"h6\">\n {answersCount + newAnswers.length} answers\n </Typography>\n </Grid>\n {allAnswers.length > 1 && (\n <Grid item>\n <FormControl>\n <Select\n native\n label=\"Sort answers\"\n value={answerSort}\n onChange={val => setAnswerSort(val.target.value as string)}\n inputProps={{\n name: 'sortAnswers',\n id: 'sort-answers',\n }}\n >\n <option value=\"default\">Default</option>\n <option value=\"created_desc\">Created (desc)</option>\n <option value=\"created_asc\">Created (asc)</option>\n <option value=\"score_desc\">Score (desc)</option>\n <option value=\"score_asc\">Score (asc)</option>\n <option value=\"comments_desc\">Comments (desc)</option>\n <option value=\"comments_asc\">Comments (asc)</option>\n <option value=\"author_desc\">Author (desc)</option>\n <option value=\"author_asc\">Author (asc)</option>\n <option value=\"updated_desc\">Updated (desc)</option>\n <option value=\"updated_asc\">Updated (asc)</option>\n </Select>\n </FormControl>\n </Grid>\n )}\n </Grid>\n </Box>\n {allAnswers.sort(sortAnswers).map(a => {\n return (\n <React.Fragment key={a.id}>\n <Divider className={styles.questionDivider} />\n <Box key={a.id} sx={{ mb: 1 }}>\n <AnswerCard answer={a} question={question} />\n </Box>\n </React.Fragment>\n );\n })}\n <Divider className={styles.questionDivider} />\n <AnswerForm question={question} onPost={onAnswerPost} />\n </Container>\n </Content>\n );\n};\n"],"names":["_a"],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { useApi, useRouteRef } from '@backstage/core-plugin-api';
|
|
2
|
+
import { catalogApiRef } from '@backstage/plugin-catalog-react';
|
|
3
|
+
import React, { useEffect } from 'react';
|
|
4
|
+
import { compact } from 'lodash';
|
|
5
|
+
import { Chip } from '@material-ui/core';
|
|
6
|
+
import { tagRouteRef } from '@drodil/backstage-plugin-qeta-react';
|
|
7
|
+
import { EntityChip } from './EntityChip.esm.js';
|
|
8
|
+
|
|
9
|
+
const TagsAndEntities = (props) => {
|
|
10
|
+
const { question } = props;
|
|
11
|
+
const catalogApi = useApi(catalogApiRef);
|
|
12
|
+
const tagRoute = useRouteRef(tagRouteRef);
|
|
13
|
+
const [entities, setEntities] = React.useState([]);
|
|
14
|
+
useEffect(() => {
|
|
15
|
+
if (question.entities && question.entities.length > 0) {
|
|
16
|
+
catalogApi.getEntitiesByRefs({
|
|
17
|
+
entityRefs: question.entities,
|
|
18
|
+
fields: [
|
|
19
|
+
"kind",
|
|
20
|
+
"metadata.name",
|
|
21
|
+
"metadata.namespace",
|
|
22
|
+
"metadata.title"
|
|
23
|
+
]
|
|
24
|
+
}).catch((_) => setEntities([])).then(
|
|
25
|
+
(data) => data ? setEntities(compact(data.items)) : setEntities([])
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
}, [catalogApi, question]);
|
|
29
|
+
return /* @__PURE__ */ React.createElement(React.Fragment, null, question.tags && question.tags.map((tag) => /* @__PURE__ */ React.createElement(
|
|
30
|
+
Chip,
|
|
31
|
+
{
|
|
32
|
+
key: tag,
|
|
33
|
+
label: tag,
|
|
34
|
+
size: "small",
|
|
35
|
+
className: "qetaTagChip",
|
|
36
|
+
component: "a",
|
|
37
|
+
href: tagRoute({ tag }),
|
|
38
|
+
clickable: true
|
|
39
|
+
}
|
|
40
|
+
)), entities && entities.map((component, i) => /* @__PURE__ */ React.createElement(EntityChip, { entity: component, key: i })));
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
export { TagsAndEntities };
|
|
44
|
+
//# sourceMappingURL=TagsAndEntities.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TagsAndEntities.esm.js","sources":["../../../src/components/QuestionPage/TagsAndEntities.tsx"],"sourcesContent":["import { QuestionResponse } from '@drodil/backstage-plugin-qeta-common';\nimport { useApi, useRouteRef } from '@backstage/core-plugin-api';\nimport { catalogApiRef } from '@backstage/plugin-catalog-react';\nimport React, { useEffect } from 'react';\nimport { Entity } from '@backstage/catalog-model';\nimport { compact } from 'lodash';\nimport { Chip } from '@material-ui/core';\nimport { tagRouteRef } from '@drodil/backstage-plugin-qeta-react';\nimport { EntityChip } from './EntityChip';\n\nexport const TagsAndEntities = (props: { question: QuestionResponse }) => {\n const { question } = props;\n const catalogApi = useApi(catalogApiRef);\n const tagRoute = useRouteRef(tagRouteRef);\n const [entities, setEntities] = React.useState<Entity[]>([]);\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 <>\n {question.tags &&\n question.tags.map(tag => (\n <Chip\n key={tag}\n label={tag}\n size=\"small\"\n className=\"qetaTagChip\"\n component=\"a\"\n href={tagRoute({ tag: tag })}\n clickable\n />\n ))}\n {entities &&\n entities.map((component, i) => (\n <EntityChip entity={component} key={i} />\n ))}\n </>\n );\n};\n"],"names":[],"mappings":";;;;;;;;AAUa,MAAA,eAAA,GAAkB,CAAC,KAA0C,KAAA;AACxE,EAAM,MAAA,EAAE,UAAa,GAAA,KAAA,CAAA;AACrB,EAAM,MAAA,UAAA,GAAa,OAAO,aAAa,CAAA,CAAA;AACvC,EAAM,MAAA,QAAA,GAAW,YAAY,WAAW,CAAA,CAAA;AACxC,EAAA,MAAM,CAAC,QAAU,EAAA,WAAW,IAAI,KAAM,CAAA,QAAA,CAAmB,EAAE,CAAA,CAAA;AAC3D,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,QAAS,CAAA,QAAA,IAAY,QAAS,CAAA,QAAA,CAAS,SAAS,CAAG,EAAA;AACrD,MAAA,UAAA,CACG,iBAAkB,CAAA;AAAA,QACjB,YAAY,QAAS,CAAA,QAAA;AAAA,QACrB,MAAQ,EAAA;AAAA,UACN,MAAA;AAAA,UACA,eAAA;AAAA,UACA,oBAAA;AAAA,UACA,gBAAA;AAAA,SACF;AAAA,OACD,EACA,KAAM,CAAA,CAAA,CAAA,KAAK,YAAY,EAAE,CAAC,CAC1B,CAAA,IAAA;AAAA,QAAK,CAAA,IAAA,KACJ,IAAO,GAAA,WAAA,CAAY,OAAQ,CAAA,IAAA,CAAK,KAAK,CAAC,CAAA,GAAI,WAAY,CAAA,EAAE,CAAA;AAAA,OAC1D,CAAA;AAAA,KACJ;AAAA,GACC,EAAA,CAAC,UAAY,EAAA,QAAQ,CAAC,CAAA,CAAA;AAEzB,EAAA,iEAEK,QAAS,CAAA,IAAA,IACR,QAAS,CAAA,IAAA,CAAK,IAAI,CAChB,GAAA,qBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,GAAK,EAAA,GAAA;AAAA,MACL,KAAO,EAAA,GAAA;AAAA,MACP,IAAK,EAAA,OAAA;AAAA,MACL,SAAU,EAAA,aAAA;AAAA,MACV,SAAU,EAAA,GAAA;AAAA,MACV,IAAM,EAAA,QAAA,CAAS,EAAE,GAAA,EAAU,CAAA;AAAA,MAC3B,SAAS,EAAA,IAAA;AAAA,KAAA;AAAA,GAEZ,CAAA,EACF,QACC,IAAA,QAAA,CAAS,IAAI,CAAC,SAAA,EAAW,CACvB,qBAAA,KAAA,CAAA,aAAA,CAAC,cAAW,MAAQ,EAAA,SAAA,EAAW,GAAK,EAAA,CAAA,EAAG,CACxC,CACL,CAAA,CAAA;AAEJ;;;;"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { makeStyles, createStyles, Tooltip, IconButton, Typography, Box } from '@material-ui/core';
|
|
2
|
+
import ArrowDownward from '@material-ui/icons/ArrowDownward';
|
|
3
|
+
import ArrowUpward from '@material-ui/icons/ArrowUpward';
|
|
4
|
+
import Check from '@material-ui/icons/Check';
|
|
5
|
+
import React, { useState, useEffect } from 'react';
|
|
6
|
+
import { useAnalytics, useApi } from '@backstage/core-plugin-api';
|
|
7
|
+
import { qetaApiRef } from '../../api/QetaClient.esm.js';
|
|
8
|
+
import { useSignal } from '@backstage/plugin-signals-react';
|
|
9
|
+
|
|
10
|
+
const useStyles = makeStyles(
|
|
11
|
+
(theme) => createStyles({
|
|
12
|
+
qetaCorrectAnswerSelected: {
|
|
13
|
+
color: theme.palette.success.main
|
|
14
|
+
},
|
|
15
|
+
qetaCorrectAnswer: {
|
|
16
|
+
color: theme.palette.grey[500]
|
|
17
|
+
}
|
|
18
|
+
})
|
|
19
|
+
);
|
|
20
|
+
const VoteButtons = (props) => {
|
|
21
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
22
|
+
const [entity, setEntity] = React.useState(
|
|
23
|
+
props.entity
|
|
24
|
+
);
|
|
25
|
+
const [ownVote, setOwnVote] = React.useState((_a = props.entity.ownVote) != null ? _a : 0);
|
|
26
|
+
const [correctAnswer, setCorrectAnswer] = useState(
|
|
27
|
+
"questionId" in props.entity ? props.entity.correct : false
|
|
28
|
+
);
|
|
29
|
+
const [score, setScore] = useState(entity.score);
|
|
30
|
+
const analytics = useAnalytics();
|
|
31
|
+
const qetaApi = useApi(qetaApiRef);
|
|
32
|
+
const isQuestion = "title" in entity;
|
|
33
|
+
const own = (_b = props.entity.own) != null ? _b : false;
|
|
34
|
+
const classes = useStyles();
|
|
35
|
+
const { lastSignal } = useSignal(
|
|
36
|
+
isQuestion ? `qeta:question_${entity.id}` : `qeta:answer_${entity.id}`
|
|
37
|
+
);
|
|
38
|
+
useEffect(() => {
|
|
39
|
+
if (entity) {
|
|
40
|
+
setScore(entity.score);
|
|
41
|
+
}
|
|
42
|
+
}, [entity]);
|
|
43
|
+
useEffect(() => {
|
|
44
|
+
if ((lastSignal == null ? void 0 : lastSignal.type) === "question_stats" || (lastSignal == null ? void 0 : lastSignal.type) === "answer_stats") {
|
|
45
|
+
setCorrectAnswer(lastSignal.correctAnswer);
|
|
46
|
+
setScore(lastSignal.score);
|
|
47
|
+
}
|
|
48
|
+
}, [lastSignal]);
|
|
49
|
+
const voteUp = () => {
|
|
50
|
+
if (isQuestion) {
|
|
51
|
+
qetaApi.voteQuestionUp(entity.id).then((response) => {
|
|
52
|
+
setOwnVote(1);
|
|
53
|
+
analytics.captureEvent("vote", "question", { value: 1 });
|
|
54
|
+
setEntity(response);
|
|
55
|
+
});
|
|
56
|
+
} else if ("questionId" in entity) {
|
|
57
|
+
qetaApi.voteAnswerUp(entity.questionId, entity.id).then((response) => {
|
|
58
|
+
setOwnVote(1);
|
|
59
|
+
analytics.captureEvent("vote", "answer", { value: 1 });
|
|
60
|
+
setEntity(response);
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
const voteDown = () => {
|
|
65
|
+
if (isQuestion) {
|
|
66
|
+
qetaApi.voteQuestionDown(entity.id).then((response) => {
|
|
67
|
+
setOwnVote(-1);
|
|
68
|
+
analytics.captureEvent("vote", "question", { value: -1 });
|
|
69
|
+
setEntity(response);
|
|
70
|
+
});
|
|
71
|
+
} else if ("questionId" in entity) {
|
|
72
|
+
qetaApi.voteAnswerDown(entity.questionId, entity.id).then((response) => {
|
|
73
|
+
setOwnVote(-1);
|
|
74
|
+
analytics.captureEvent("vote", "answer", { value: -1 });
|
|
75
|
+
setEntity(response);
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
let correctTooltip = correctAnswer ? "Mark answer as incorrect" : "Mark answer as correct";
|
|
80
|
+
if (!((_c = props.question) == null ? void 0 : _c.own)) {
|
|
81
|
+
correctTooltip = correctAnswer ? "This answer has been marked as correct" : "";
|
|
82
|
+
}
|
|
83
|
+
let voteUpTooltip = isQuestion ? "This question is good" : "This answer is good";
|
|
84
|
+
if (own) {
|
|
85
|
+
voteUpTooltip = isQuestion ? "You cannot vote your own question" : "You cannot vote your own answer";
|
|
86
|
+
}
|
|
87
|
+
let voteDownTooltip = isQuestion ? "This question is not good" : "This answer is not good";
|
|
88
|
+
if (own) {
|
|
89
|
+
voteDownTooltip = voteUpTooltip;
|
|
90
|
+
}
|
|
91
|
+
const toggleCorrectAnswer = () => {
|
|
92
|
+
if (!("questionId" in entity)) {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
if (correctAnswer) {
|
|
96
|
+
qetaApi.markAnswerIncorrect(entity.questionId, entity.id).then((response) => {
|
|
97
|
+
if (response) {
|
|
98
|
+
setCorrectAnswer(false);
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
} else {
|
|
102
|
+
qetaApi.markAnswerCorrect(entity.questionId, entity.id).then((response) => {
|
|
103
|
+
setCorrectAnswer(response);
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Tooltip, { title: voteUpTooltip }, /* @__PURE__ */ React.createElement("span", null, /* @__PURE__ */ React.createElement(
|
|
108
|
+
IconButton,
|
|
109
|
+
{
|
|
110
|
+
"aria-label": "vote up",
|
|
111
|
+
color: ownVote > 0 ? "primary" : "default",
|
|
112
|
+
className: ownVote > 0 ? "qetaVoteUpSelected" : "qetaVoteUp",
|
|
113
|
+
disabled: own,
|
|
114
|
+
size: "small",
|
|
115
|
+
onClick: voteUp
|
|
116
|
+
},
|
|
117
|
+
/* @__PURE__ */ React.createElement(ArrowUpward, null)
|
|
118
|
+
))), /* @__PURE__ */ React.createElement(Typography, { variant: "h6" }, score), /* @__PURE__ */ React.createElement(Tooltip, { title: voteDownTooltip }, /* @__PURE__ */ React.createElement("span", null, /* @__PURE__ */ React.createElement(
|
|
119
|
+
IconButton,
|
|
120
|
+
{
|
|
121
|
+
"aria-label": "vote down",
|
|
122
|
+
color: ownVote < 0 ? "primary" : "default",
|
|
123
|
+
className: ownVote < 0 ? "qetaVoteDownSelected" : "qetaVoteDown",
|
|
124
|
+
disabled: own,
|
|
125
|
+
size: "small",
|
|
126
|
+
onClick: voteDown
|
|
127
|
+
},
|
|
128
|
+
/* @__PURE__ */ React.createElement(ArrowDownward, null)
|
|
129
|
+
))), "correct" in props.entity && (((_d = props.question) == null ? void 0 : _d.own) || ((_e = props.question) == null ? void 0 : _e.canEdit) || correctAnswer) && /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Tooltip, { title: correctTooltip }, /* @__PURE__ */ React.createElement("span", null, /* @__PURE__ */ React.createElement(
|
|
130
|
+
IconButton,
|
|
131
|
+
{
|
|
132
|
+
"aria-label": "mark correct",
|
|
133
|
+
size: "small",
|
|
134
|
+
onClick: ((_f = props.question) == null ? void 0 : _f.own) || ((_g = props.question) == null ? void 0 : _g.canEdit) ? toggleCorrectAnswer : void 0
|
|
135
|
+
},
|
|
136
|
+
/* @__PURE__ */ React.createElement(
|
|
137
|
+
Check,
|
|
138
|
+
{
|
|
139
|
+
className: correctAnswer ? classes.qetaCorrectAnswerSelected : classes.qetaCorrectAnswer
|
|
140
|
+
}
|
|
141
|
+
)
|
|
142
|
+
)))));
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
export { VoteButtons };
|
|
146
|
+
//# sourceMappingURL=VoteButtons.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VoteButtons.esm.js","sources":["../../../src/components/QuestionPage/VoteButtons.tsx"],"sourcesContent":["import {\n AnswerResponse,\n QetaSignal,\n QuestionResponse,\n} from '@drodil/backstage-plugin-qeta-common';\nimport {\n Box,\n createStyles,\n IconButton,\n makeStyles,\n Theme,\n Tooltip,\n Typography,\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, { useEffect, useState } from 'react';\nimport { useAnalytics, useApi } from '@backstage/core-plugin-api';\nimport { qetaApiRef } from '../../api';\nimport { useSignal } from '@backstage/plugin-signals-react';\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n qetaCorrectAnswerSelected: {\n color: theme.palette.success.main,\n },\n qetaCorrectAnswer: {\n color: theme.palette.grey[500],\n },\n }),\n);\n\nexport const VoteButtons = (props: {\n entity: QuestionResponse | AnswerResponse;\n question?: QuestionResponse;\n}) => {\n const [entity, setEntity] = React.useState<QuestionResponse | AnswerResponse>(\n props.entity,\n );\n const [ownVote, setOwnVote] = React.useState(props.entity.ownVote ?? 0);\n const [correctAnswer, setCorrectAnswer] = useState(\n 'questionId' in props.entity ? props.entity.correct : false,\n );\n const [score, setScore] = useState(entity.score);\n const analytics = useAnalytics();\n const qetaApi = useApi(qetaApiRef);\n\n const isQuestion = 'title' in entity;\n const own = props.entity.own ?? false;\n const classes = useStyles();\n\n const { lastSignal } = useSignal<QetaSignal>(\n isQuestion ? `qeta:question_${entity.id}` : `qeta:answer_${entity.id}`,\n );\n\n useEffect(() => {\n if (entity) {\n setScore(entity.score);\n }\n }, [entity]);\n\n useEffect(() => {\n if (\n lastSignal?.type === 'question_stats' ||\n lastSignal?.type === 'answer_stats'\n ) {\n setCorrectAnswer(lastSignal.correctAnswer);\n setScore(lastSignal.score);\n }\n }, [lastSignal]);\n\n const voteUp = () => {\n if (isQuestion) {\n qetaApi.voteQuestionUp(entity.id).then(response => {\n setOwnVote(1);\n analytics.captureEvent('vote', 'question', { value: 1 });\n setEntity(response);\n });\n } else if ('questionId' in entity) {\n qetaApi.voteAnswerUp(entity.questionId, entity.id).then(response => {\n setOwnVote(1);\n analytics.captureEvent('vote', 'answer', { value: 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 analytics.captureEvent('vote', 'question', { value: -1 });\n setEntity(response);\n });\n } else if ('questionId' in entity) {\n qetaApi.voteAnswerDown(entity.questionId, entity.id).then(response => {\n setOwnVote(-1);\n analytics.captureEvent('vote', 'answer', { value: -1 });\n setEntity(response);\n });\n }\n };\n\n let correctTooltip = correctAnswer\n ? 'Mark answer as incorrect'\n : 'Mark answer as correct';\n if (!props.question?.own) {\n correctTooltip = correctAnswer\n ? 'This answer has been marked as correct'\n : '';\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 (correctAnswer) {\n qetaApi\n .markAnswerIncorrect(entity.questionId, entity.id)\n .then(response => {\n if (response) {\n setCorrectAnswer(false);\n }\n });\n } else {\n qetaApi.markAnswerCorrect(entity.questionId, entity.id).then(response => {\n setCorrectAnswer(response);\n });\n }\n };\n\n return (\n <React.Fragment>\n <Tooltip title={voteUpTooltip}>\n <span>\n <IconButton\n aria-label=\"vote up\"\n color={ownVote > 0 ? 'primary' : 'default'}\n className={ownVote > 0 ? 'qetaVoteUpSelected' : 'qetaVoteUp'}\n disabled={own}\n size=\"small\"\n onClick={voteUp}\n >\n <ArrowUpward />\n </IconButton>\n </span>\n </Tooltip>\n <Typography variant=\"h6\">{score}</Typography>\n <Tooltip title={voteDownTooltip}>\n <span>\n <IconButton\n aria-label=\"vote down\"\n color={ownVote < 0 ? 'primary' : 'default'}\n className={ownVote < 0 ? 'qetaVoteDownSelected' : 'qetaVoteDown'}\n disabled={own}\n size=\"small\"\n onClick={voteDown}\n >\n <ArrowDownward />\n </IconButton>\n </span>\n </Tooltip>\n {'correct' in props.entity &&\n (props.question?.own || props.question?.canEdit || correctAnswer) && (\n <Box>\n <Tooltip title={correctTooltip}>\n <span>\n <IconButton\n aria-label=\"mark correct\"\n size=\"small\"\n onClick={\n props.question?.own || props.question?.canEdit\n ? toggleCorrectAnswer\n : undefined\n }\n >\n <Check\n className={\n correctAnswer\n ? classes.qetaCorrectAnswerSelected\n : classes.qetaCorrectAnswer\n }\n />\n </IconButton>\n </span>\n </Tooltip>\n </Box>\n )}\n </React.Fragment>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { QuestionsTable } from './QuestionsTable.esm.js';
|
|
3
|
+
|
|
4
|
+
const Content = (props) => {
|
|
5
|
+
return /* @__PURE__ */ React.createElement(QuestionsTable, { hideTitle: true, ...props });
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
export { Content };
|
|
9
|
+
//# sourceMappingURL=Content.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Content.esm.js","sources":["../../../src/components/QuestionTableCard/Content.tsx"],"sourcesContent":["import React from 'react';\nimport { QuestionsTable } from './QuestionsTable';\n\nexport const Content = (props: {\n rowsPerPage?: number;\n quickFilter?: 'latest' | 'favorites' | 'most_viewed';\n}) => {\n return <QuestionsTable hideTitle {...props} />;\n};\n"],"names":[],"mappings":";;;AAGa,MAAA,OAAA,GAAU,CAAC,KAGlB,KAAA;AACJ,EAAA,uBAAQ,KAAA,CAAA,aAAA,CAAA,cAAA,EAAA,EAAe,SAAS,EAAA,IAAA,EAAE,GAAG,KAAO,EAAA,CAAA,CAAA;AAC9C;;;;"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { TableRow, TableCell } from '@material-ui/core';
|
|
2
|
+
import { Link } from '@backstage/core-components';
|
|
3
|
+
import { RelativeTimeWithTooltip } from '../RelativeTimeWithTooltip/RelativeTimeWithTooltip.esm.js';
|
|
4
|
+
import React from 'react';
|
|
5
|
+
import { useRouteRef } from '@backstage/core-plugin-api';
|
|
6
|
+
import { questionRouteRef } from '@drodil/backstage-plugin-qeta-react';
|
|
7
|
+
import { AuthorLink } from '../Links/Links.esm.js';
|
|
8
|
+
|
|
9
|
+
const QuestionTableRow = (props) => {
|
|
10
|
+
const { question } = props;
|
|
11
|
+
const questionRoute = useRouteRef(questionRouteRef);
|
|
12
|
+
return /* @__PURE__ */ React.createElement(TableRow, { key: question.id }, /* @__PURE__ */ React.createElement(TableCell, null, /* @__PURE__ */ React.createElement(Link, { to: questionRoute({ id: question.id.toString(10) }) }, question.title)), /* @__PURE__ */ React.createElement(TableCell, null, /* @__PURE__ */ React.createElement(AuthorLink, { entity: question })), /* @__PURE__ */ React.createElement(TableCell, null, /* @__PURE__ */ React.createElement(RelativeTimeWithTooltip, { value: question.created })), /* @__PURE__ */ React.createElement(TableCell, null, /* @__PURE__ */ React.createElement(
|
|
13
|
+
RelativeTimeWithTooltip,
|
|
14
|
+
{
|
|
15
|
+
value: question.updated ? question.updated : question.created
|
|
16
|
+
}
|
|
17
|
+
)));
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export { QuestionTableRow };
|
|
21
|
+
//# sourceMappingURL=QuestionTableRow.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QuestionTableRow.esm.js","sources":["../../../src/components/QuestionTableCard/QuestionTableRow.tsx"],"sourcesContent":["import { Question } from '@drodil/backstage-plugin-qeta-common';\nimport { TableCell, TableRow } from '@material-ui/core';\nimport { Link } from '@backstage/core-components';\nimport { RelativeTimeWithTooltip } from '../RelativeTimeWithTooltip/RelativeTimeWithTooltip';\nimport React from 'react';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport { questionRouteRef } from '@drodil/backstage-plugin-qeta-react';\nimport { AuthorLink } from '../Links/Links';\n\nexport const QuestionTableRow = (props: { question: Question }) => {\n const { question } = props;\n const questionRoute = useRouteRef(questionRouteRef);\n\n return (\n <TableRow key={question.id}>\n <TableCell>\n <Link to={questionRoute({ id: question.id.toString(10) })}>\n {question.title}\n </Link>\n </TableCell>\n <TableCell>\n <AuthorLink entity={question} />\n </TableCell>\n <TableCell>\n <RelativeTimeWithTooltip value={question.created} />\n </TableCell>\n <TableCell>\n <RelativeTimeWithTooltip\n value={question.updated ? question.updated : question.created}\n />\n </TableCell>\n </TableRow>\n );\n};\n"],"names":[],"mappings":";;;;;;;;AASa,MAAA,gBAAA,GAAmB,CAAC,KAAkC,KAAA;AACjE,EAAM,MAAA,EAAE,UAAa,GAAA,KAAA,CAAA;AACrB,EAAM,MAAA,aAAA,GAAgB,YAAY,gBAAgB,CAAA,CAAA;AAElD,EAAA,2CACG,QAAS,EAAA,EAAA,GAAA,EAAK,SAAS,EACtB,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,iCACE,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,IAAI,aAAc,CAAA,EAAE,IAAI,QAAS,CAAA,EAAA,CAAG,SAAS,EAAE,CAAA,EAAG,CACrD,EAAA,EAAA,QAAA,CAAS,KACZ,CACF,mBACC,KAAA,CAAA,aAAA,CAAA,SAAA,EAAA,IAAA,sCACE,UAAW,EAAA,EAAA,MAAA,EAAQ,UAAU,CAChC,CAAA,sCACC,SACC,EAAA,IAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,2BAAwB,KAAO,EAAA,QAAA,CAAS,SAAS,CACpD,CAAA,sCACC,SACC,EAAA,IAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,uBAAA;AAAA,IAAA;AAAA,MACC,KAAO,EAAA,QAAA,CAAS,OAAU,GAAA,QAAA,CAAS,UAAU,QAAS,CAAA,OAAA;AAAA,KAAA;AAAA,GAE1D,CACF,CAAA,CAAA;AAEJ;;;;"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { useQetaApi } from '../../utils/hooks.esm.js';
|
|
3
|
+
import { WarningPanel, LinkButton, Progress } from '@backstage/core-components';
|
|
4
|
+
import { Grid, Typography, ButtonGroup, Button, TableContainer, Table, TableHead, TableRow, TableCell, TableBody, TablePagination } from '@material-ui/core';
|
|
5
|
+
import RefreshIcon from '@material-ui/icons/Refresh';
|
|
6
|
+
import { QuestionTableRow } from './QuestionTableRow.esm.js';
|
|
7
|
+
|
|
8
|
+
const QuestionsTable = (props) => {
|
|
9
|
+
var _a, _b;
|
|
10
|
+
const [page, setPage] = React.useState(1);
|
|
11
|
+
const [questionsPerPage, setQuestionsPerPage] = React.useState(
|
|
12
|
+
(_a = props.rowsPerPage) != null ? _a : 10
|
|
13
|
+
);
|
|
14
|
+
const [quickFilter, setQuickFilter] = React.useState(
|
|
15
|
+
(_b = props.quickFilter) != null ? _b : "latest"
|
|
16
|
+
);
|
|
17
|
+
const [refresh, setRefresh] = React.useState(0);
|
|
18
|
+
const [filters, setFilters] = React.useState({
|
|
19
|
+
order: "desc",
|
|
20
|
+
orderBy: "created",
|
|
21
|
+
noAnswers: "false",
|
|
22
|
+
noCorrectAnswer: "false",
|
|
23
|
+
noVotes: "false",
|
|
24
|
+
searchQuery: "",
|
|
25
|
+
favorite: false
|
|
26
|
+
});
|
|
27
|
+
const {
|
|
28
|
+
value: response,
|
|
29
|
+
loading,
|
|
30
|
+
error
|
|
31
|
+
} = useQetaApi(
|
|
32
|
+
(api) => api.getQuestions({
|
|
33
|
+
limit: questionsPerPage,
|
|
34
|
+
offset: (page - 1) * questionsPerPage,
|
|
35
|
+
includeEntities: true,
|
|
36
|
+
...filters
|
|
37
|
+
}),
|
|
38
|
+
[page, filters, questionsPerPage, refresh]
|
|
39
|
+
);
|
|
40
|
+
const handleQuickFilterChange = (filter) => {
|
|
41
|
+
setQuickFilter(filter);
|
|
42
|
+
if (filter === "latest") {
|
|
43
|
+
setFilters({
|
|
44
|
+
...filters,
|
|
45
|
+
order: "desc",
|
|
46
|
+
orderBy: "created",
|
|
47
|
+
favorite: false
|
|
48
|
+
});
|
|
49
|
+
} else if (filter === "favorites") {
|
|
50
|
+
setFilters({
|
|
51
|
+
...filters,
|
|
52
|
+
order: "desc",
|
|
53
|
+
orderBy: "created",
|
|
54
|
+
favorite: true
|
|
55
|
+
});
|
|
56
|
+
} else if (filter === "most_viewed") {
|
|
57
|
+
setFilters({
|
|
58
|
+
...filters,
|
|
59
|
+
order: "desc",
|
|
60
|
+
orderBy: "views",
|
|
61
|
+
favorite: false
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
const handleChangePage = (_, newPage) => {
|
|
66
|
+
setPage(newPage + 1);
|
|
67
|
+
};
|
|
68
|
+
const handleChangeRowsPerPage = (event) => {
|
|
69
|
+
setQuestionsPerPage(parseInt(event.target.value, 10));
|
|
70
|
+
setPage(1);
|
|
71
|
+
};
|
|
72
|
+
if (error || response === void 0) {
|
|
73
|
+
return /* @__PURE__ */ React.createElement(WarningPanel, { severity: "error", title: "Could not load questions." }, error == null ? void 0 : error.message);
|
|
74
|
+
}
|
|
75
|
+
return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(
|
|
76
|
+
Grid,
|
|
77
|
+
{
|
|
78
|
+
container: true,
|
|
79
|
+
justifyContent: "space-between",
|
|
80
|
+
alignItems: "center",
|
|
81
|
+
style: { marginBottom: "1em" },
|
|
82
|
+
className: "qetaQuestionsTableGrid"
|
|
83
|
+
},
|
|
84
|
+
/* @__PURE__ */ React.createElement(Grid, { item: true }, props.hideTitle === true ? null : /* @__PURE__ */ React.createElement(Typography, { variant: "h5" }, "Q&A")),
|
|
85
|
+
/* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(ButtonGroup, null, /* @__PURE__ */ React.createElement(
|
|
86
|
+
Button,
|
|
87
|
+
{
|
|
88
|
+
color: quickFilter === "latest" ? "primary" : void 0,
|
|
89
|
+
onClick: () => handleQuickFilterChange("latest")
|
|
90
|
+
},
|
|
91
|
+
"Latest"
|
|
92
|
+
), /* @__PURE__ */ React.createElement(
|
|
93
|
+
Button,
|
|
94
|
+
{
|
|
95
|
+
color: quickFilter === "favorites" ? "primary" : void 0,
|
|
96
|
+
onClick: () => handleQuickFilterChange("favorites")
|
|
97
|
+
},
|
|
98
|
+
"Favorites"
|
|
99
|
+
), /* @__PURE__ */ React.createElement(
|
|
100
|
+
Button,
|
|
101
|
+
{
|
|
102
|
+
color: quickFilter === "most_viewed" ? "primary" : void 0,
|
|
103
|
+
onClick: () => handleQuickFilterChange("most_viewed")
|
|
104
|
+
},
|
|
105
|
+
"Most viewed"
|
|
106
|
+
)), /* @__PURE__ */ React.createElement(
|
|
107
|
+
LinkButton,
|
|
108
|
+
{
|
|
109
|
+
to: "#",
|
|
110
|
+
variant: "text",
|
|
111
|
+
onClick: () => setRefresh(refresh + 1)
|
|
112
|
+
},
|
|
113
|
+
/* @__PURE__ */ React.createElement(RefreshIcon, null)
|
|
114
|
+
))
|
|
115
|
+
), /* @__PURE__ */ React.createElement(TableContainer, null, /* @__PURE__ */ React.createElement(Table, { className: "qetaQuestionsTable" }, /* @__PURE__ */ React.createElement(TableHead, null, /* @__PURE__ */ React.createElement(TableRow, null, /* @__PURE__ */ React.createElement(TableCell, null, "Title"), /* @__PURE__ */ React.createElement(TableCell, null, "Author"), /* @__PURE__ */ React.createElement(TableCell, null, "Asked"), /* @__PURE__ */ React.createElement(TableCell, null, "Last updated"))), /* @__PURE__ */ React.createElement(TableBody, null, loading ? /* @__PURE__ */ React.createElement(Progress, null) : null, response.questions.map((q) => /* @__PURE__ */ React.createElement(QuestionTableRow, { question: q })))), /* @__PURE__ */ React.createElement(
|
|
116
|
+
TablePagination,
|
|
117
|
+
{
|
|
118
|
+
rowsPerPageOptions: [5, 10, 20, 30, 40, 50],
|
|
119
|
+
component: "div",
|
|
120
|
+
count: response.total,
|
|
121
|
+
rowsPerPage: questionsPerPage,
|
|
122
|
+
page: page - 1,
|
|
123
|
+
onPageChange: handleChangePage,
|
|
124
|
+
onRowsPerPageChange: handleChangeRowsPerPage
|
|
125
|
+
}
|
|
126
|
+
)));
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
export { QuestionsTable };
|
|
130
|
+
//# sourceMappingURL=QuestionsTable.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QuestionsTable.esm.js","sources":["../../../src/components/QuestionTableCard/QuestionsTable.tsx"],"sourcesContent":["import React from 'react';\nimport { useQetaApi } from '../../utils/hooks';\nimport { LinkButton, Progress, WarningPanel } from '@backstage/core-components';\nimport {\n Button,\n ButtonGroup,\n Grid,\n Table,\n TableBody,\n TableCell,\n TableContainer,\n TableHead,\n TablePagination,\n TableRow,\n Typography,\n} from '@material-ui/core';\nimport RefreshIcon from '@material-ui/icons/Refresh';\nimport { QuestionTableRow } from './QuestionTableRow';\n\ntype QuickFilterType = 'latest' | 'favorites' | 'most_viewed';\n\nexport const QuestionsTable = (props: {\n hideTitle?: boolean;\n rowsPerPage?: number;\n quickFilter?: QuickFilterType;\n}) => {\n const [page, setPage] = React.useState(1);\n const [questionsPerPage, setQuestionsPerPage] = React.useState(\n props.rowsPerPage ?? 10,\n );\n const [quickFilter, setQuickFilter] = React.useState(\n props.quickFilter ?? 'latest',\n );\n const [refresh, setRefresh] = React.useState(0);\n const [filters, setFilters] = React.useState({\n order: 'desc',\n orderBy: 'created',\n noAnswers: 'false',\n noCorrectAnswer: 'false',\n noVotes: 'false',\n searchQuery: '',\n favorite: false,\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 includeEntities: true,\n ...filters,\n }),\n [page, filters, questionsPerPage, refresh],\n );\n\n const handleQuickFilterChange = (filter: QuickFilterType) => {\n setQuickFilter(filter);\n if (filter === 'latest') {\n setFilters({\n ...filters,\n order: 'desc',\n orderBy: 'created',\n favorite: false,\n });\n } else if (filter === 'favorites') {\n setFilters({\n ...filters,\n order: 'desc',\n orderBy: 'created',\n favorite: true,\n });\n } else if (filter === 'most_viewed') {\n setFilters({\n ...filters,\n order: 'desc',\n orderBy: 'views',\n favorite: false,\n });\n }\n };\n\n const handleChangePage = (_: unknown, newPage: number) => {\n setPage(newPage + 1);\n };\n\n const handleChangeRowsPerPage = (\n event: React.ChangeEvent<HTMLInputElement>,\n ) => {\n setQuestionsPerPage(parseInt(event.target.value, 10));\n setPage(1);\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 return (\n <>\n <Grid\n container\n justifyContent=\"space-between\"\n alignItems=\"center\"\n style={{ marginBottom: '1em' }}\n className=\"qetaQuestionsTableGrid\"\n >\n <Grid item>\n {props.hideTitle === true ? null : (\n <Typography variant=\"h5\">Q&A</Typography>\n )}\n </Grid>\n <Grid item>\n <ButtonGroup>\n <Button\n color={quickFilter === 'latest' ? 'primary' : undefined}\n onClick={() => handleQuickFilterChange('latest')}\n >\n Latest\n </Button>\n <Button\n color={quickFilter === 'favorites' ? 'primary' : undefined}\n onClick={() => handleQuickFilterChange('favorites')}\n >\n Favorites\n </Button>\n <Button\n color={quickFilter === 'most_viewed' ? 'primary' : undefined}\n onClick={() => handleQuickFilterChange('most_viewed')}\n >\n Most viewed\n </Button>\n </ButtonGroup>\n <LinkButton\n to=\"#\"\n variant=\"text\"\n onClick={() => setRefresh(refresh + 1)}\n >\n <RefreshIcon />\n </LinkButton>\n </Grid>\n </Grid>\n <TableContainer>\n <Table className=\"qetaQuestionsTable\">\n <TableHead>\n <TableRow>\n <TableCell>Title</TableCell>\n <TableCell>Author</TableCell>\n <TableCell>Asked</TableCell>\n <TableCell>Last updated</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {loading ? <Progress /> : null}\n {response.questions.map(q => (\n <QuestionTableRow question={q} />\n ))}\n </TableBody>\n </Table>\n <TablePagination\n rowsPerPageOptions={[5, 10, 20, 30, 40, 50]}\n component=\"div\"\n count={response.total}\n rowsPerPage={questionsPerPage}\n page={page - 1}\n onPageChange={handleChangePage}\n onRowsPerPageChange={handleChangeRowsPerPage}\n />\n </TableContainer>\n </>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|