@drodil/backstage-plugin-qeta 2.15.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/dist/components/ArticlePage/ArticlePage.esm.js +45 -0
  2. package/dist/components/ArticlePage/ArticlePage.esm.js.map +1 -0
  3. package/dist/components/ArticlesPage/ArticlesPage.esm.js +34 -0
  4. package/dist/components/ArticlesPage/ArticlesPage.esm.js.map +1 -0
  5. package/dist/components/AskPage/AskPage.esm.js +4 -4
  6. package/dist/components/AskPage/AskPage.esm.js.map +1 -1
  7. package/dist/components/CollectionCreatePage/CollectionCreatePage.esm.js +20 -0
  8. package/dist/components/CollectionCreatePage/CollectionCreatePage.esm.js.map +1 -0
  9. package/dist/components/CollectionPage/CollectionPage.esm.js +34 -0
  10. package/dist/components/CollectionPage/CollectionPage.esm.js.map +1 -0
  11. package/dist/components/CollectionsPage/CollectionsPage.esm.js +11 -0
  12. package/dist/components/CollectionsPage/CollectionsPage.esm.js.map +1 -0
  13. package/dist/components/EntityPage/EntityPage.esm.js +75 -0
  14. package/dist/components/EntityPage/EntityPage.esm.js.map +1 -0
  15. package/dist/components/FavoritePage/FavoritePage.esm.js +14 -22
  16. package/dist/components/FavoritePage/FavoritePage.esm.js.map +1 -1
  17. package/dist/components/HomePage/HomePage.esm.js +7 -10
  18. package/dist/components/HomePage/HomePage.esm.js.map +1 -1
  19. package/dist/components/LeftMenu/LeftMenu.esm.js +47 -16
  20. package/dist/components/LeftMenu/LeftMenu.esm.js.map +1 -1
  21. package/dist/components/LeftMenu/LeftMenuButton.esm.js +75 -0
  22. package/dist/components/LeftMenu/LeftMenuButton.esm.js.map +1 -0
  23. package/dist/components/QetaPage/QetaPage.esm.js +51 -9
  24. package/dist/components/QetaPage/QetaPage.esm.js.map +1 -1
  25. package/dist/components/QuestionPage/QuestionPage.esm.js +7 -13
  26. package/dist/components/QuestionPage/QuestionPage.esm.js.map +1 -1
  27. package/dist/components/QuestionTableCard/Content.esm.js +1 -1
  28. package/dist/components/QuestionTableCard/Content.esm.js.map +1 -1
  29. package/dist/components/QuestionTableCard/index.esm.js +0 -1
  30. package/dist/components/QuestionTableCard/index.esm.js.map +1 -1
  31. package/dist/components/QuestionsPage/QuestionsPage.esm.js +13 -15
  32. package/dist/components/QuestionsPage/QuestionsPage.esm.js.map +1 -1
  33. package/dist/components/Statistics/GlobalStatsContent.esm.js +1 -3
  34. package/dist/components/Statistics/GlobalStatsContent.esm.js.map +1 -1
  35. package/dist/components/Statistics/StatisticsPage.esm.js +2 -3
  36. package/dist/components/Statistics/StatisticsPage.esm.js.map +1 -1
  37. package/dist/components/TagPage/TagPage.esm.js +32 -25
  38. package/dist/components/TagPage/TagPage.esm.js.map +1 -1
  39. package/dist/components/UserPage/UserPage.esm.js +7 -16
  40. package/dist/components/UserPage/UserPage.esm.js.map +1 -1
  41. package/dist/components/UserPage/UserStatsContent.esm.js +1 -3
  42. package/dist/components/UserPage/UserStatsContent.esm.js.map +1 -1
  43. package/dist/components/UsersPage/UsersPage.esm.js +11 -0
  44. package/dist/components/UsersPage/UsersPage.esm.js.map +1 -0
  45. package/dist/components/WritePage/WritePage.esm.js +40 -0
  46. package/dist/components/WritePage/WritePage.esm.js.map +1 -0
  47. package/dist/index.d.ts +8 -422
  48. package/dist/index.esm.js +0 -10
  49. package/dist/index.esm.js.map +1 -1
  50. package/dist/plugin.esm.js +2 -2
  51. package/dist/plugin.esm.js.map +1 -1
  52. package/package.json +4 -24
  53. package/dist/api/QetaClient.esm.js +0 -513
  54. package/dist/api/QetaClient.esm.js.map +0 -1
  55. package/dist/components/AnswersContainer/AnswerList.esm.js +0 -100
  56. package/dist/components/AnswersContainer/AnswerList.esm.js.map +0 -1
  57. package/dist/components/AnswersContainer/AnswerListItem.esm.js +0 -90
  58. package/dist/components/AnswersContainer/AnswerListItem.esm.js.map +0 -1
  59. package/dist/components/AnswersContainer/AnswersContainer.esm.js +0 -210
  60. package/dist/components/AnswersContainer/AnswersContainer.esm.js.map +0 -1
  61. package/dist/components/AskAnonymouslyCheckbox/AskAnonymouslyCheckbox.esm.js +0 -34
  62. package/dist/components/AskAnonymouslyCheckbox/AskAnonymouslyCheckbox.esm.js.map +0 -1
  63. package/dist/components/AskForm/AskForm.esm.js +0 -245
  64. package/dist/components/AskForm/AskForm.esm.js.map +0 -1
  65. package/dist/components/AskForm/EntitiesInput.esm.js +0 -100
  66. package/dist/components/AskForm/EntitiesInput.esm.js.map +0 -1
  67. package/dist/components/AskForm/TagInput.esm.js +0 -81
  68. package/dist/components/AskForm/TagInput.esm.js.map +0 -1
  69. package/dist/components/Buttons/AskQuestionButton.esm.js +0 -45
  70. package/dist/components/Buttons/AskQuestionButton.esm.js.map +0 -1
  71. package/dist/components/Buttons/BackToQuestionsButton.esm.js +0 -39
  72. package/dist/components/Buttons/BackToQuestionsButton.esm.js.map +0 -1
  73. package/dist/components/Buttons/EntityFollowButton.esm.js +0 -34
  74. package/dist/components/Buttons/EntityFollowButton.esm.js.map +0 -1
  75. package/dist/components/Buttons/TagFollowButton.esm.js +0 -33
  76. package/dist/components/Buttons/TagFollowButton.esm.js.map +0 -1
  77. package/dist/components/CommentSection/CommentList.esm.js +0 -47
  78. package/dist/components/CommentSection/CommentList.esm.js.map +0 -1
  79. package/dist/components/CommentSection/CommentSection.esm.js +0 -126
  80. package/dist/components/CommentSection/CommentSection.esm.js.map +0 -1
  81. package/dist/components/DeleteModal/DeleteModal.esm.js +0 -78
  82. package/dist/components/DeleteModal/DeleteModal.esm.js.map +0 -1
  83. package/dist/components/HomePageCards/ImpactCard.esm.js +0 -22
  84. package/dist/components/HomePageCards/ImpactCard.esm.js.map +0 -1
  85. package/dist/components/HomePageCards/QuestionsCard.esm.js +0 -21
  86. package/dist/components/HomePageCards/QuestionsCard.esm.js.map +0 -1
  87. package/dist/components/Links/Links.esm.js +0 -33
  88. package/dist/components/Links/Links.esm.js.map +0 -1
  89. package/dist/components/MarkdownEditor/MarkdownEditor.esm.js +0 -78
  90. package/dist/components/MarkdownEditor/MarkdownEditor.esm.js.map +0 -1
  91. package/dist/components/MarkdownRenderer/MarkdownRenderer.esm.js +0 -37
  92. package/dist/components/MarkdownRenderer/MarkdownRenderer.esm.js.map +0 -1
  93. package/dist/components/QetaPage/FollowedEntitiesList.esm.js +0 -43
  94. package/dist/components/QetaPage/FollowedEntitiesList.esm.js.map +0 -1
  95. package/dist/components/QetaPage/FollowedTagsList.esm.js +0 -56
  96. package/dist/components/QetaPage/FollowedTagsList.esm.js.map +0 -1
  97. package/dist/components/QuestionHighlightList/QuestionHighlightList.esm.js +0 -64
  98. package/dist/components/QuestionHighlightList/QuestionHighlightList.esm.js.map +0 -1
  99. package/dist/components/QuestionPage/AnswerCard.esm.js +0 -113
  100. package/dist/components/QuestionPage/AnswerCard.esm.js.map +0 -1
  101. package/dist/components/QuestionPage/AnswerForm.esm.js +0 -153
  102. package/dist/components/QuestionPage/AnswerForm.esm.js.map +0 -1
  103. package/dist/components/QuestionPage/AuthorBox.esm.js +0 -25
  104. package/dist/components/QuestionPage/AuthorBox.esm.js.map +0 -1
  105. package/dist/components/QuestionPage/EntityChip.esm.js +0 -27
  106. package/dist/components/QuestionPage/EntityChip.esm.js.map +0 -1
  107. package/dist/components/QuestionPage/FavoriteButton.esm.js +0 -45
  108. package/dist/components/QuestionPage/FavoriteButton.esm.js.map +0 -1
  109. package/dist/components/QuestionPage/LinkButton.esm.js +0 -28
  110. package/dist/components/QuestionPage/LinkButton.esm.js.map +0 -1
  111. package/dist/components/QuestionPage/QuestionCard.esm.js +0 -107
  112. package/dist/components/QuestionPage/QuestionCard.esm.js.map +0 -1
  113. package/dist/components/QuestionPage/TagsAndEntities.esm.js +0 -44
  114. package/dist/components/QuestionPage/TagsAndEntities.esm.js.map +0 -1
  115. package/dist/components/QuestionPage/VoteButtons.esm.js +0 -153
  116. package/dist/components/QuestionPage/VoteButtons.esm.js.map +0 -1
  117. package/dist/components/QuestionTableCard/QuestionTableRow.esm.js +0 -21
  118. package/dist/components/QuestionTableCard/QuestionTableRow.esm.js.map +0 -1
  119. package/dist/components/QuestionTableCard/QuestionsTable.esm.js +0 -130
  120. package/dist/components/QuestionTableCard/QuestionsTable.esm.js.map +0 -1
  121. package/dist/components/QuestionsContainer/DateRangeFilter.esm.js +0 -110
  122. package/dist/components/QuestionsContainer/DateRangeFilter.esm.js.map +0 -1
  123. package/dist/components/QuestionsContainer/FilterPanel.esm.js +0 -237
  124. package/dist/components/QuestionsContainer/FilterPanel.esm.js.map +0 -1
  125. package/dist/components/QuestionsContainer/NoQuestionsCard.esm.js +0 -47
  126. package/dist/components/QuestionsContainer/NoQuestionsCard.esm.js.map +0 -1
  127. package/dist/components/QuestionsContainer/QuestionList.esm.js +0 -103
  128. package/dist/components/QuestionsContainer/QuestionList.esm.js.map +0 -1
  129. package/dist/components/QuestionsContainer/QuestionListItem.esm.js +0 -123
  130. package/dist/components/QuestionsContainer/QuestionListItem.esm.js.map +0 -1
  131. package/dist/components/QuestionsContainer/QuestionsContainer.esm.js +0 -243
  132. package/dist/components/QuestionsContainer/QuestionsContainer.esm.js.map +0 -1
  133. package/dist/components/RelativeTimeWithTooltip/RelativeTimeWithTooltip.esm.js +0 -22
  134. package/dist/components/RelativeTimeWithTooltip/RelativeTimeWithTooltip.esm.js.map +0 -1
  135. package/dist/components/Statistics/StatsChart.esm.js +0 -238
  136. package/dist/components/Statistics/StatsChart.esm.js.map +0 -1
  137. package/dist/components/Statistics/SummaryStatsGrid.esm.js +0 -47
  138. package/dist/components/Statistics/SummaryStatsGrid.esm.js.map +0 -1
  139. package/dist/components/Statistics/TopRankingUsersCard.esm.js +0 -161
  140. package/dist/components/Statistics/TopRankingUsersCard.esm.js.map +0 -1
  141. package/dist/components/Statistics/TrophyIcon.esm.js +0 -19
  142. package/dist/components/Statistics/TrophyIcon.esm.js.map +0 -1
  143. package/dist/components/Statistics/styles.esm.js +0 -23
  144. package/dist/components/Statistics/styles.esm.js.map +0 -1
  145. package/dist/components/TagPage/TagsContainer.esm.js +0 -57
  146. package/dist/components/TagPage/TagsContainer.esm.js.map +0 -1
  147. package/dist/locale/fi.esm.js +0 -195
  148. package/dist/locale/fi.esm.js.map +0 -1
  149. package/dist/translation.esm.js +0 -359
  150. package/dist/translation.esm.js.map +0 -1
  151. package/dist/utils/hooks.esm.js +0 -430
  152. package/dist/utils/hooks.esm.js.map +0 -1
  153. package/dist/utils/utils.esm.js +0 -72
  154. package/dist/utils/utils.esm.js.map +0 -1
@@ -1,107 +0,0 @@
1
- import { Card, CardContent, Grid, Typography, Box, Button } from '@material-ui/core';
2
- import React, { useEffect } from 'react';
3
- import { VoteButtons } from './VoteButtons.esm.js';
4
- import { useStyles, useTranslation } from '../../utils/hooks.esm.js';
5
- import { DeleteModal } from '../DeleteModal/DeleteModal.esm.js';
6
- import DeleteIcon from '@material-ui/icons/Delete';
7
- import EditIcon from '@material-ui/icons/Edit';
8
- import { FavoriteButton } from './FavoriteButton.esm.js';
9
- import { AuthorBox } from './AuthorBox.esm.js';
10
- import { TagsAndEntities } from './TagsAndEntities.esm.js';
11
- import { CommentSection } from '../CommentSection/CommentSection.esm.js';
12
- import { useRouteRef } from '@backstage/core-plugin-api';
13
- import { editQuestionRouteRef } from '@drodil/backstage-plugin-qeta-react';
14
- import { LinkButton } from './LinkButton.esm.js';
15
- import { MarkdownRenderer } from '../MarkdownRenderer/MarkdownRenderer.esm.js';
16
-
17
- const QuestionCard = (props) => {
18
- const { question } = props;
19
- const styles = useStyles();
20
- const editQuestionRoute = useRouteRef(editQuestionRouteRef);
21
- const [deleteModalOpen, setDeleteModalOpen] = React.useState(false);
22
- const [questionEntity, setQuestionEntity] = React.useState(question);
23
- const handleDeleteModalOpen = () => setDeleteModalOpen(true);
24
- const handleDeleteModalClose = () => setDeleteModalOpen(false);
25
- const { t } = useTranslation();
26
- const onCommentAction = (q, _) => {
27
- setQuestionEntity(q);
28
- };
29
- const highlightedAnswer = window.location.hash.slice(1) ?? void 0;
30
- useEffect(() => {
31
- if (highlightedAnswer) {
32
- try {
33
- const element = document.querySelector(`#${highlightedAnswer}`);
34
- if (element) {
35
- element.scrollIntoView();
36
- }
37
- } catch (e) {
38
- }
39
- }
40
- }, [highlightedAnswer]);
41
- return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(
42
- Card,
43
- {
44
- variant: "outlined",
45
- className: `qetaQuestionCard ${styles.questionCard}`
46
- },
47
- /* @__PURE__ */ React.createElement(CardContent, null, /* @__PURE__ */ React.createElement(Grid, { container: true, spacing: 0, justifyContent: "flex-start" }, /* @__PURE__ */ React.createElement(Grid, { container: true, item: true, xs: 1, justifyContent: "center" }, /* @__PURE__ */ React.createElement("div", { className: styles.questionCardVote }, /* @__PURE__ */ React.createElement(VoteButtons, { entity: questionEntity }), /* @__PURE__ */ React.createElement(FavoriteButton, { entity: questionEntity }), /* @__PURE__ */ React.createElement(LinkButton, { entity: questionEntity }))), /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 11, className: styles.questionCardContent }, /* @__PURE__ */ React.createElement(Typography, { variant: "body1", gutterBottom: true }, /* @__PURE__ */ React.createElement(
48
- MarkdownRenderer,
49
- {
50
- content: questionEntity.content,
51
- className: styles.markdownContent
52
- }
53
- )), /* @__PURE__ */ React.createElement(
54
- Grid,
55
- {
56
- container: true,
57
- item: true,
58
- spacing: 1,
59
- justifyContent: "space-between",
60
- alignItems: "flex-end",
61
- className: styles.questionCardMetadata
62
- },
63
- /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 9, style: { alignSelf: "flex-end" } }, /* @__PURE__ */ React.createElement(TagsAndEntities, { question: questionEntity }), (question.canEdit || question.canDelete) && /* @__PURE__ */ React.createElement(Box, { className: styles.questionCardActions }, question.canDelete && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(
64
- Button,
65
- {
66
- variant: "outlined",
67
- size: "small",
68
- color: "secondary",
69
- onClick: handleDeleteModalOpen,
70
- className: `${styles.marginRight} qetaQuestionCardDeleteBtn`,
71
- startIcon: /* @__PURE__ */ React.createElement(DeleteIcon, null)
72
- },
73
- t("deleteModal.deleteButton")
74
- ), /* @__PURE__ */ React.createElement(
75
- DeleteModal,
76
- {
77
- open: deleteModalOpen,
78
- onClose: handleDeleteModalClose,
79
- entity: questionEntity
80
- }
81
- )), question.canEdit && /* @__PURE__ */ React.createElement(
82
- Button,
83
- {
84
- variant: "outlined",
85
- size: "small",
86
- startIcon: /* @__PURE__ */ React.createElement(EditIcon, null),
87
- href: editQuestionRoute({
88
- id: question.id.toString(10)
89
- }),
90
- className: "qetaQuestionCardEditBtn"
91
- },
92
- t("questionPage.editButton")
93
- ))),
94
- /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 3, className: styles.noPadding }, /* @__PURE__ */ React.createElement(AuthorBox, { entity: questionEntity }))
95
- ))))
96
- ), /* @__PURE__ */ React.createElement(
97
- CommentSection,
98
- {
99
- question: questionEntity,
100
- onCommentDelete: onCommentAction,
101
- onCommentPost: onCommentAction
102
- }
103
- ));
104
- };
105
-
106
- export { QuestionCard };
107
- //# sourceMappingURL=QuestionCard.esm.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"QuestionCard.esm.js","sources":["../../../src/components/QuestionPage/QuestionCard.tsx"],"sourcesContent":["import {\n AnswerResponse,\n QuestionResponse,\n} from '@drodil/backstage-plugin-qeta-common';\nimport {\n Box,\n Button,\n Card,\n CardContent,\n Grid,\n Typography,\n} from '@material-ui/core';\nimport React, { useEffect } from 'react';\nimport { VoteButtons } from './VoteButtons';\nimport { useStyles, useTranslation } from '../../utils/hooks';\nimport { DeleteModal } from '../DeleteModal/DeleteModal';\nimport DeleteIcon from '@material-ui/icons/Delete';\nimport EditIcon from '@material-ui/icons/Edit';\nimport { FavoriteButton } from './FavoriteButton';\nimport { AuthorBox } from './AuthorBox';\nimport { TagsAndEntities } from './TagsAndEntities';\nimport { CommentSection } from '../CommentSection/CommentSection';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport { editQuestionRouteRef } from '@drodil/backstage-plugin-qeta-react';\nimport { LinkButton } from './LinkButton';\nimport { MarkdownRenderer } from '../MarkdownRenderer/MarkdownRenderer';\n\nexport const QuestionCard = (props: { question: QuestionResponse }) => {\n const { question } = props;\n const styles = useStyles();\n const editQuestionRoute = useRouteRef(editQuestionRouteRef);\n const [deleteModalOpen, setDeleteModalOpen] = React.useState(false);\n const [questionEntity, setQuestionEntity] = React.useState(question);\n const handleDeleteModalOpen = () => setDeleteModalOpen(true);\n const handleDeleteModalClose = () => setDeleteModalOpen(false);\n const { t } = useTranslation();\n const onCommentAction = (q: QuestionResponse, _?: AnswerResponse) => {\n setQuestionEntity(q);\n };\n\n const highlightedAnswer = window.location.hash.slice(1) ?? undefined;\n useEffect(() => {\n if (highlightedAnswer) {\n try {\n const element = document.querySelector(`#${highlightedAnswer}`);\n if (element) {\n element.scrollIntoView();\n }\n } catch (e) {\n // NOOP\n }\n }\n }, [highlightedAnswer]);\n\n return (\n <>\n <Card\n variant=\"outlined\"\n className={`qetaQuestionCard ${styles.questionCard}`}\n >\n <CardContent>\n <Grid container spacing={0} justifyContent=\"flex-start\">\n <Grid container item xs={1} justifyContent=\"center\">\n <div className={styles.questionCardVote}>\n <VoteButtons entity={questionEntity} />\n <FavoriteButton entity={questionEntity} />\n <LinkButton entity={questionEntity} />\n </div>\n </Grid>\n <Grid item xs={11} className={styles.questionCardContent}>\n <Typography variant=\"body1\" gutterBottom>\n <MarkdownRenderer\n content={questionEntity.content}\n className={styles.markdownContent}\n />\n </Typography>\n <Grid\n container\n item\n spacing={1}\n justifyContent=\"space-between\"\n alignItems=\"flex-end\"\n className={styles.questionCardMetadata}\n >\n <Grid item xs={9} style={{ alignSelf: 'flex-end' }}>\n <TagsAndEntities question={questionEntity} />\n {(question.canEdit || question.canDelete) && (\n <Box className={styles.questionCardActions}>\n {question.canDelete && (\n <>\n <Button\n variant=\"outlined\"\n size=\"small\"\n color=\"secondary\"\n onClick={handleDeleteModalOpen}\n className={`${styles.marginRight} qetaQuestionCardDeleteBtn`}\n startIcon={<DeleteIcon />}\n >\n {t('deleteModal.deleteButton')}\n </Button>\n <DeleteModal\n open={deleteModalOpen}\n onClose={handleDeleteModalClose}\n entity={questionEntity}\n />\n </>\n )}\n {question.canEdit && (\n <Button\n variant=\"outlined\"\n size=\"small\"\n startIcon={<EditIcon />}\n href={editQuestionRoute({\n id: question.id.toString(10),\n })}\n className=\"qetaQuestionCardEditBtn\"\n >\n {t('questionPage.editButton')}\n </Button>\n )}\n </Box>\n )}\n </Grid>\n <Grid item xs={3} className={styles.noPadding}>\n <AuthorBox entity={questionEntity} />\n </Grid>\n </Grid>\n </Grid>\n </Grid>\n </CardContent>\n </Card>\n <CommentSection\n question={questionEntity}\n onCommentDelete={onCommentAction}\n onCommentPost={onCommentAction}\n />\n </>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -1,44 +0,0 @@
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
@@ -1 +0,0 @@
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;;;;"}
@@ -1,153 +0,0 @@
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
- import { useTranslation } from '../../utils/hooks.esm.js';
10
-
11
- const useStyles = makeStyles(
12
- (theme) => createStyles({
13
- qetaCorrectAnswerSelected: {
14
- color: theme.palette.success.main
15
- },
16
- qetaCorrectAnswer: {
17
- color: theme.palette.grey[500]
18
- },
19
- voteButtonContainer: {
20
- borderWidth: "1px",
21
- borderColor: "white"
22
- }
23
- })
24
- );
25
- const VoteButtons = (props) => {
26
- const [entity, setEntity] = React.useState(
27
- props.entity
28
- );
29
- const [ownVote, setOwnVote] = React.useState(props.entity.ownVote ?? 0);
30
- const [correctAnswer, setCorrectAnswer] = useState(
31
- "questionId" in props.entity ? props.entity.correct : false
32
- );
33
- const [score, setScore] = useState(entity.score);
34
- const analytics = useAnalytics();
35
- const qetaApi = useApi(qetaApiRef);
36
- const { t } = useTranslation();
37
- const isQuestion = "title" in entity;
38
- const own = props.entity.own ?? false;
39
- const classes = useStyles();
40
- const { lastSignal } = useSignal(
41
- isQuestion ? `qeta:question_${entity.id}` : `qeta:answer_${entity.id}`
42
- );
43
- useEffect(() => {
44
- if (entity) {
45
- setScore(entity.score);
46
- }
47
- }, [entity]);
48
- useEffect(() => {
49
- if (lastSignal?.type === "question_stats" || lastSignal?.type === "answer_stats") {
50
- setCorrectAnswer(lastSignal.correctAnswer);
51
- setScore(lastSignal.score);
52
- }
53
- }, [lastSignal]);
54
- const voteUp = () => {
55
- if (isQuestion) {
56
- qetaApi.voteQuestionUp(entity.id).then((response) => {
57
- setOwnVote(1);
58
- analytics.captureEvent("vote", "question", { value: 1 });
59
- setEntity(response);
60
- });
61
- } else if ("questionId" in entity) {
62
- qetaApi.voteAnswerUp(entity.questionId, entity.id).then((response) => {
63
- setOwnVote(1);
64
- analytics.captureEvent("vote", "answer", { value: 1 });
65
- setEntity(response);
66
- });
67
- }
68
- };
69
- const voteDown = () => {
70
- if (isQuestion) {
71
- qetaApi.voteQuestionDown(entity.id).then((response) => {
72
- setOwnVote(-1);
73
- analytics.captureEvent("vote", "question", { value: -1 });
74
- setEntity(response);
75
- });
76
- } else if ("questionId" in entity) {
77
- qetaApi.voteAnswerDown(entity.questionId, entity.id).then((response) => {
78
- setOwnVote(-1);
79
- analytics.captureEvent("vote", "answer", { value: -1 });
80
- setEntity(response);
81
- });
82
- }
83
- };
84
- let correctTooltip = correctAnswer ? t("voteButtons.answer.markIncorrect") : t("voteButtons.answer.markCorrect");
85
- if (!props.question?.own) {
86
- correctTooltip = correctAnswer ? t("voteButtons.answer.marked") : "";
87
- }
88
- let voteUpTooltip = isQuestion ? t("voteButtons.question.good") : t("voteButtons.answer.good");
89
- if (own) {
90
- voteUpTooltip = isQuestion ? t("voteButtons.question.own") : t("voteButtons.answer.own");
91
- }
92
- let voteDownTooltip = isQuestion ? t("voteButtons.question.bad") : t("voteButtons.answer.bad");
93
- if (own) {
94
- voteDownTooltip = voteUpTooltip;
95
- }
96
- const toggleCorrectAnswer = () => {
97
- if (!("questionId" in entity)) {
98
- return;
99
- }
100
- if (correctAnswer) {
101
- qetaApi.markAnswerIncorrect(entity.questionId, entity.id).then((response) => {
102
- if (response) {
103
- setCorrectAnswer(false);
104
- }
105
- });
106
- } else {
107
- qetaApi.markAnswerCorrect(entity.questionId, entity.id).then((response) => {
108
- if (response) {
109
- setCorrectAnswer(true);
110
- }
111
- });
112
- }
113
- };
114
- return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Tooltip, { title: voteUpTooltip }, /* @__PURE__ */ React.createElement("span", { className: classes.voteButtonContainer }, /* @__PURE__ */ React.createElement(
115
- IconButton,
116
- {
117
- "aria-label": "vote up",
118
- color: ownVote > 0 ? "primary" : "default",
119
- className: ownVote > 0 ? "qetaVoteUpSelected" : "qetaVoteUp",
120
- disabled: own,
121
- size: "small",
122
- onClick: voteUp
123
- },
124
- /* @__PURE__ */ React.createElement(ArrowUpward, null)
125
- ))), /* @__PURE__ */ React.createElement(Typography, { variant: "h6" }, score), /* @__PURE__ */ React.createElement(Tooltip, { title: voteDownTooltip }, /* @__PURE__ */ React.createElement("span", null, /* @__PURE__ */ React.createElement(
126
- IconButton,
127
- {
128
- "aria-label": "vote down",
129
- color: ownVote < 0 ? "primary" : "default",
130
- className: ownVote < 0 ? "qetaVoteDownSelected" : "qetaVoteDown",
131
- disabled: own,
132
- size: "small",
133
- onClick: voteDown
134
- },
135
- /* @__PURE__ */ React.createElement(ArrowDownward, null)
136
- ))), "correct" in props.entity && (props.question?.own || props.question?.canEdit || correctAnswer) && /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Tooltip, { title: correctTooltip }, /* @__PURE__ */ React.createElement("span", null, /* @__PURE__ */ React.createElement(
137
- IconButton,
138
- {
139
- "aria-label": "mark correct",
140
- size: "small",
141
- onClick: props.question?.own || props.question?.canEdit ? toggleCorrectAnswer : void 0
142
- },
143
- /* @__PURE__ */ React.createElement(
144
- Check,
145
- {
146
- className: correctAnswer ? classes.qetaCorrectAnswerSelected : classes.qetaCorrectAnswer
147
- }
148
- )
149
- )))));
150
- };
151
-
152
- export { VoteButtons };
153
- //# sourceMappingURL=VoteButtons.esm.js.map
@@ -1 +0,0 @@
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';\nimport { useTranslation } from '../../utils/hooks';\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 voteButtonContainer: {\n borderWidth: '1px',\n borderColor: 'white',\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 const { t } = useTranslation();\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: string = correctAnswer\n ? t('voteButtons.answer.markIncorrect')\n : t('voteButtons.answer.markCorrect');\n if (!props.question?.own) {\n correctTooltip = correctAnswer ? t('voteButtons.answer.marked') : '';\n }\n\n let voteUpTooltip: string = isQuestion\n ? t('voteButtons.question.good')\n : t('voteButtons.answer.good');\n if (own) {\n voteUpTooltip = isQuestion\n ? t('voteButtons.question.own')\n : t('voteButtons.answer.own');\n }\n\n let voteDownTooltip: string = isQuestion\n ? t('voteButtons.question.bad')\n : t('voteButtons.answer.bad');\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 if (response) {\n setCorrectAnswer(true);\n }\n });\n }\n };\n\n return (\n <React.Fragment>\n <Tooltip title={voteUpTooltip}>\n <span className={classes.voteButtonContainer}>\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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"}
@@ -1,21 +0,0 @@
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
@@ -1 +0,0 @@
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;;;;"}
@@ -1,130 +0,0 @@
1
- import React from 'react';
2
- import { useTranslation, 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
- const [page, setPage] = React.useState(1);
10
- const [questionsPerPage, setQuestionsPerPage] = React.useState(
11
- props.rowsPerPage ?? 10
12
- );
13
- const [quickFilter, setQuickFilter] = React.useState(
14
- props.quickFilter ?? "latest"
15
- );
16
- const [refresh, setRefresh] = React.useState(0);
17
- const { t } = useTranslation();
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: t("questionsTable.errorLoading") }, 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" }, t("pluginName"))),
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
- t("questionsTable.latest")
92
- ), /* @__PURE__ */ React.createElement(
93
- Button,
94
- {
95
- color: quickFilter === "favorites" ? "primary" : void 0,
96
- onClick: () => handleQuickFilterChange("favorites")
97
- },
98
- t("questionsTable.favorites")
99
- ), /* @__PURE__ */ React.createElement(
100
- Button,
101
- {
102
- color: quickFilter === "most_viewed" ? "primary" : void 0,
103
- onClick: () => handleQuickFilterChange("most_viewed")
104
- },
105
- t("questionsTable.mostViewed")
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, t("questionsTable.cells.title")), /* @__PURE__ */ React.createElement(TableCell, null, t("questionsTable.cells.author")), /* @__PURE__ */ React.createElement(TableCell, null, t("questionsTable.cells.asked")), /* @__PURE__ */ React.createElement(TableCell, null, t("questionsTable.cells.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
@@ -1 +0,0 @@
1
- {"version":3,"file":"QuestionsTable.esm.js","sources":["../../../src/components/QuestionTableCard/QuestionsTable.tsx"],"sourcesContent":["import React from 'react';\nimport { useQetaApi, useTranslation } 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 { t } = useTranslation();\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={t('questionsTable.errorLoading')}>\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\">{t('pluginName')}</Typography>\n )}\n </Grid>\n <Grid item>\n <ButtonGroup>\n <Button\n color={quickFilter === 'latest' ? 'primary' : undefined}\n onClick={() => handleQuickFilterChange('latest')}\n >\n {t('questionsTable.latest')}\n </Button>\n <Button\n color={quickFilter === 'favorites' ? 'primary' : undefined}\n onClick={() => handleQuickFilterChange('favorites')}\n >\n {t('questionsTable.favorites')}\n </Button>\n <Button\n color={quickFilter === 'most_viewed' ? 'primary' : undefined}\n onClick={() => handleQuickFilterChange('most_viewed')}\n >\n {t('questionsTable.mostViewed')}\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>{t('questionsTable.cells.title')}</TableCell>\n <TableCell>{t('questionsTable.cells.author')}</TableCell>\n <TableCell>{t('questionsTable.cells.asked')}</TableCell>\n <TableCell>{t('questionsTable.cells.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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"}