@drodil/backstage-plugin-qeta-react 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 (150) hide show
  1. package/dist/api.esm.js +8 -0
  2. package/dist/api.esm.js.map +1 -0
  3. package/dist/components/AnswerCard/AnswerCard.esm.js +113 -0
  4. package/dist/components/AnswerCard/AnswerCard.esm.js.map +1 -0
  5. package/dist/components/AnswerForm/AnswerForm.esm.js +153 -0
  6. package/dist/components/AnswerForm/AnswerForm.esm.js.map +1 -0
  7. package/dist/components/AnswersContainer/AnswerList.esm.js +100 -0
  8. package/dist/components/AnswersContainer/AnswerList.esm.js.map +1 -0
  9. package/dist/components/AnswersContainer/AnswerListItem.esm.js +90 -0
  10. package/dist/components/AnswersContainer/AnswerListItem.esm.js.map +1 -0
  11. package/dist/components/AnswersContainer/AnswersContainer.esm.js +210 -0
  12. package/dist/components/AnswersContainer/AnswersContainer.esm.js.map +1 -0
  13. package/dist/components/ArticleContent/ArticleButtons.esm.js +90 -0
  14. package/dist/components/ArticleContent/ArticleButtons.esm.js.map +1 -0
  15. package/dist/components/ArticleContent/ArticleContent.esm.js +78 -0
  16. package/dist/components/ArticleContent/ArticleContent.esm.js.map +1 -0
  17. package/dist/components/AuthorBox/AuthorBox.esm.js +25 -0
  18. package/dist/components/AuthorBox/AuthorBox.esm.js.map +1 -0
  19. package/dist/components/Buttons/AddToCollectionButton.esm.js +68 -0
  20. package/dist/components/Buttons/AddToCollectionButton.esm.js.map +1 -0
  21. package/dist/components/Buttons/AskQuestionButton.esm.js +40 -0
  22. package/dist/components/Buttons/AskQuestionButton.esm.js.map +1 -0
  23. package/dist/components/Buttons/BackToArticlesButton.esm.js +40 -0
  24. package/dist/components/Buttons/BackToArticlesButton.esm.js.map +1 -0
  25. package/dist/components/Buttons/BackToCollectionsButton.esm.js +25 -0
  26. package/dist/components/Buttons/BackToCollectionsButton.esm.js.map +1 -0
  27. package/dist/components/Buttons/BackToQuestionsButton.esm.js +40 -0
  28. package/dist/components/Buttons/BackToQuestionsButton.esm.js.map +1 -0
  29. package/dist/components/Buttons/CreateCollectionButton.esm.js +29 -0
  30. package/dist/components/Buttons/CreateCollectionButton.esm.js.map +1 -0
  31. package/dist/components/Buttons/EntityFollowButton.esm.js +34 -0
  32. package/dist/components/Buttons/EntityFollowButton.esm.js.map +1 -0
  33. package/dist/components/Buttons/FavoriteButton.esm.js +45 -0
  34. package/dist/components/Buttons/FavoriteButton.esm.js.map +1 -0
  35. package/dist/components/Buttons/LinkButton.esm.js +28 -0
  36. package/dist/components/Buttons/LinkButton.esm.js.map +1 -0
  37. package/dist/components/Buttons/TagFollowButton.esm.js +34 -0
  38. package/dist/components/Buttons/TagFollowButton.esm.js.map +1 -0
  39. package/dist/components/Buttons/VoteButtons.esm.js +75 -0
  40. package/dist/components/Buttons/VoteButtons.esm.js.map +1 -0
  41. package/dist/components/Buttons/WriteArticleButton.esm.js +40 -0
  42. package/dist/components/Buttons/WriteArticleButton.esm.js.map +1 -0
  43. package/dist/components/CollectionCard/CollectionCard.esm.js +63 -0
  44. package/dist/components/CollectionCard/CollectionCard.esm.js.map +1 -0
  45. package/dist/components/CollectionForm/CollectionForm.esm.js +251 -0
  46. package/dist/components/CollectionForm/CollectionForm.esm.js.map +1 -0
  47. package/dist/components/CollectionsGrid/CollectionsGrid.esm.js +40 -0
  48. package/dist/components/CollectionsGrid/CollectionsGrid.esm.js.map +1 -0
  49. package/dist/components/CollectionsGrid/CollectionsGridContent.esm.js +67 -0
  50. package/dist/components/CollectionsGrid/CollectionsGridContent.esm.js.map +1 -0
  51. package/dist/components/CollectionsGrid/CollectionsGridItem.esm.js +48 -0
  52. package/dist/components/CollectionsGrid/CollectionsGridItem.esm.js.map +1 -0
  53. package/dist/components/CommentSection/CommentList.esm.js +47 -0
  54. package/dist/components/CommentSection/CommentList.esm.js.map +1 -0
  55. package/dist/components/CommentSection/CommentSection.esm.js +126 -0
  56. package/dist/components/CommentSection/CommentSection.esm.js.map +1 -0
  57. package/dist/components/DeleteModal/DeleteModal.esm.js +88 -0
  58. package/dist/components/DeleteModal/DeleteModal.esm.js.map +1 -0
  59. package/dist/components/EntitiesGrid/EntitiesGrid.esm.js +45 -0
  60. package/dist/components/EntitiesGrid/EntitiesGrid.esm.js.map +1 -0
  61. package/dist/components/EntitiesGrid/EntitiesGridItem.esm.js +61 -0
  62. package/dist/components/EntitiesGrid/EntitiesGridItem.esm.js.map +1 -0
  63. package/dist/components/FilterPanel/DateRangeFilter.esm.js +110 -0
  64. package/dist/components/FilterPanel/DateRangeFilter.esm.js.map +1 -0
  65. package/dist/components/FilterPanel/FilterPanel.esm.js +238 -0
  66. package/dist/components/FilterPanel/FilterPanel.esm.js.map +1 -0
  67. package/dist/components/FollowedLists/FollowedEntitiesList.esm.js +43 -0
  68. package/dist/components/FollowedLists/FollowedEntitiesList.esm.js.map +1 -0
  69. package/dist/components/FollowedLists/FollowedTagsList.esm.js +43 -0
  70. package/dist/components/FollowedLists/FollowedTagsList.esm.js.map +1 -0
  71. package/dist/components/HomePageCards/ImpactCard.esm.js +22 -0
  72. package/dist/components/HomePageCards/ImpactCard.esm.js.map +1 -0
  73. package/dist/components/HomePageCards/PostsCard.esm.js +42 -0
  74. package/dist/components/HomePageCards/PostsCard.esm.js.map +1 -0
  75. package/dist/components/Links/Links.esm.js +33 -0
  76. package/dist/components/Links/Links.esm.js.map +1 -0
  77. package/dist/components/MarkdownEditor/MarkdownEditor.esm.js +63 -0
  78. package/dist/components/MarkdownEditor/MarkdownEditor.esm.js.map +1 -0
  79. package/dist/components/MarkdownRenderer/MarkdownRenderer.esm.js +97 -0
  80. package/dist/components/MarkdownRenderer/MarkdownRenderer.esm.js.map +1 -0
  81. package/dist/components/PostAnonymouslyCheckbox/PostAnonymouslyCheckbox.esm.js +34 -0
  82. package/dist/components/PostAnonymouslyCheckbox/PostAnonymouslyCheckbox.esm.js.map +1 -0
  83. package/dist/components/PostForm/EntitiesInput.esm.js +100 -0
  84. package/dist/components/PostForm/EntitiesInput.esm.js.map +1 -0
  85. package/dist/components/PostForm/PostForm.esm.js +283 -0
  86. package/dist/components/PostForm/PostForm.esm.js.map +1 -0
  87. package/dist/components/PostForm/TagInput.esm.js +81 -0
  88. package/dist/components/PostForm/TagInput.esm.js.map +1 -0
  89. package/dist/components/PostHighlightList/PostHighlightList.esm.js +72 -0
  90. package/dist/components/PostHighlightList/PostHighlightList.esm.js.map +1 -0
  91. package/dist/components/PostsContainer/NoPostsCard.esm.js +50 -0
  92. package/dist/components/PostsContainer/NoPostsCard.esm.js.map +1 -0
  93. package/dist/components/PostsContainer/PostList.esm.js +113 -0
  94. package/dist/components/PostsContainer/PostList.esm.js.map +1 -0
  95. package/dist/components/PostsContainer/PostListItem.esm.js +138 -0
  96. package/dist/components/PostsContainer/PostListItem.esm.js.map +1 -0
  97. package/dist/components/PostsContainer/PostsContainer.esm.js +152 -0
  98. package/dist/components/PostsContainer/PostsContainer.esm.js.map +1 -0
  99. package/dist/components/PostsGrid/PostsGrid.esm.js +146 -0
  100. package/dist/components/PostsGrid/PostsGrid.esm.js.map +1 -0
  101. package/dist/components/PostsGrid/PostsGridContent.esm.js +90 -0
  102. package/dist/components/PostsGrid/PostsGridContent.esm.js.map +1 -0
  103. package/dist/components/PostsGrid/PostsGridItem.esm.js +57 -0
  104. package/dist/components/PostsGrid/PostsGridItem.esm.js.map +1 -0
  105. package/dist/components/QuestionCard/QuestionCard.esm.js +107 -0
  106. package/dist/components/QuestionCard/QuestionCard.esm.js.map +1 -0
  107. package/dist/components/QuestionsTable/QuestionTableRow.esm.js +21 -0
  108. package/dist/components/QuestionsTable/QuestionTableRow.esm.js.map +1 -0
  109. package/dist/components/QuestionsTable/QuestionsTable.esm.js +131 -0
  110. package/dist/components/QuestionsTable/QuestionsTable.esm.js.map +1 -0
  111. package/dist/components/RelativeTimeWithTooltip/RelativeTimeWithTooltip.esm.js +22 -0
  112. package/dist/components/RelativeTimeWithTooltip/RelativeTimeWithTooltip.esm.js.map +1 -0
  113. package/dist/components/StatsChart/StatsChart.esm.js +245 -0
  114. package/dist/components/StatsChart/StatsChart.esm.js.map +1 -0
  115. package/dist/components/SummaryStatsGrid/SummaryStatsGrid.esm.js +53 -0
  116. package/dist/components/SummaryStatsGrid/SummaryStatsGrid.esm.js.map +1 -0
  117. package/dist/components/TagsAndEntities/EntityChip.esm.js +80 -0
  118. package/dist/components/TagsAndEntities/EntityChip.esm.js.map +1 -0
  119. package/dist/components/TagsAndEntities/TagChip.esm.js +78 -0
  120. package/dist/components/TagsAndEntities/TagChip.esm.js.map +1 -0
  121. package/dist/components/TagsAndEntities/TagsAndEntities.esm.js +32 -0
  122. package/dist/components/TagsAndEntities/TagsAndEntities.esm.js.map +1 -0
  123. package/dist/components/TagsGrid/EditTagModal.esm.js +73 -0
  124. package/dist/components/TagsGrid/EditTagModal.esm.js.map +1 -0
  125. package/dist/components/TagsGrid/TagGridItem.esm.js +56 -0
  126. package/dist/components/TagsGrid/TagGridItem.esm.js.map +1 -0
  127. package/dist/components/TagsGrid/TagsGrid.esm.js +45 -0
  128. package/dist/components/TagsGrid/TagsGrid.esm.js.map +1 -0
  129. package/dist/components/TopRankingUsersCard/TopRankingUsersCard.esm.js +161 -0
  130. package/dist/components/TopRankingUsersCard/TopRankingUsersCard.esm.js.map +1 -0
  131. package/dist/components/TopRankingUsersCard/TrophyIcon.esm.js +19 -0
  132. package/dist/components/TopRankingUsersCard/TrophyIcon.esm.js.map +1 -0
  133. package/dist/components/TopRankingUsersCard/styles.esm.js +23 -0
  134. package/dist/components/TopRankingUsersCard/styles.esm.js.map +1 -0
  135. package/dist/components/UsersGrid/UsersGrid.esm.js +43 -0
  136. package/dist/components/UsersGrid/UsersGrid.esm.js.map +1 -0
  137. package/dist/components/UsersGrid/UsersGridItem.esm.js +66 -0
  138. package/dist/components/UsersGrid/UsersGridItem.esm.js.map +1 -0
  139. package/dist/index.d.ts +568 -1
  140. package/dist/index.esm.js +45 -1
  141. package/dist/index.esm.js.map +1 -1
  142. package/dist/routes.esm.js +56 -1
  143. package/dist/routes.esm.js.map +1 -1
  144. package/dist/translation.esm.js +470 -0
  145. package/dist/translation.esm.js.map +1 -0
  146. package/dist/utils/hooks.esm.js +734 -0
  147. package/dist/utils/hooks.esm.js.map +1 -0
  148. package/dist/utils/utils.esm.js +93 -0
  149. package/dist/utils/utils.esm.js.map +1 -0
  150. package/package.json +32 -5
@@ -0,0 +1,210 @@
1
+ import { useTranslation, useQetaApi } from '../../utils/hooks.esm.js';
2
+ import { Box, Typography, Grid, TextField, Button, Collapse } from '@material-ui/core';
3
+ import React, { useEffect } from 'react';
4
+ import useDebounce from 'react-use/lib/useDebounce';
5
+ import FilterList from '@material-ui/icons/FilterList';
6
+ import { useSearchParams } from 'react-router-dom';
7
+ import { EntityRefLink } from '@backstage/plugin-catalog-react';
8
+ import { useAnalytics } from '@backstage/core-plugin-api';
9
+ import { filterTags } from '@drodil/backstage-plugin-qeta-common';
10
+ import { getFiltersWithDateRange } from '../../utils/utils.esm.js';
11
+ import { filterKeys, FilterPanel } from '../FilterPanel/FilterPanel.esm.js';
12
+ import { AnswerList } from './AnswerList.esm.js';
13
+
14
+ const AnswersContainer = (props) => {
15
+ const { tags, author, entity, showFilters, showTitle, title } = props;
16
+ const analytics = useAnalytics();
17
+ const [page, setPage] = React.useState(1);
18
+ const [answersPerPage, setAnswersPerPage] = React.useState(10);
19
+ const [showFilterPanel, setShowFilterPanel] = React.useState(false);
20
+ const [searchParams, setSearchParams] = useSearchParams();
21
+ const [searchQuery, setSearchQuery] = React.useState("");
22
+ const [filters, setFilters] = React.useState({
23
+ order: "desc",
24
+ orderBy: "created",
25
+ searchQuery: "",
26
+ dateRange: "",
27
+ noCorrectAnswer: "false",
28
+ entity: entity ?? "",
29
+ tags: tags ?? [],
30
+ noVotes: "false"
31
+ });
32
+ const { t } = useTranslation();
33
+ const onPageChange = (value) => {
34
+ setPage(value);
35
+ setSearchParams((prev) => {
36
+ const newValue = prev;
37
+ newValue.set("page", String(value));
38
+ return newValue;
39
+ });
40
+ };
41
+ const onFilterChange = (key, value) => {
42
+ if (filters[key] === value) {
43
+ return;
44
+ }
45
+ setPage(1);
46
+ setFilters({ ...filters, ...{ [key]: value } });
47
+ setSearchParams((prev) => {
48
+ const newValue = prev;
49
+ if (!value || value === "false") {
50
+ newValue.delete(key);
51
+ } else if (Array.isArray(value)) {
52
+ if (value.length === 0) {
53
+ newValue.delete(key);
54
+ } else {
55
+ newValue.set(key, value.join(","));
56
+ }
57
+ } else if (value.length > 0) {
58
+ newValue.set(key, value);
59
+ } else {
60
+ newValue.delete(key);
61
+ }
62
+ return newValue;
63
+ });
64
+ };
65
+ const onSearchQueryChange = (event) => {
66
+ onPageChange(1);
67
+ if (event.target.value) {
68
+ analytics.captureEvent("qeta_search", event.target.value);
69
+ }
70
+ setSearchQuery(event.target.value);
71
+ };
72
+ useDebounce(
73
+ () => {
74
+ if (filters.searchQuery !== searchQuery) {
75
+ setFilters({ ...filters, searchQuery });
76
+ }
77
+ },
78
+ 400,
79
+ [searchQuery]
80
+ );
81
+ useEffect(() => {
82
+ let filtersApplied = false;
83
+ searchParams.forEach((value, key) => {
84
+ try {
85
+ if (key === "page") {
86
+ const pv = Number.parseInt(value, 10);
87
+ if (pv > 0) {
88
+ setPage(pv);
89
+ } else {
90
+ setPage(1);
91
+ }
92
+ } else if (key === "answersPerPage") {
93
+ const qpp = Number.parseInt(value, 10);
94
+ if (qpp > 0) setAnswersPerPage(qpp);
95
+ } else if (filterKeys.includes(key)) {
96
+ filtersApplied = true;
97
+ if (key === "tags") {
98
+ filters.tags = filterTags(value) ?? [];
99
+ } else {
100
+ filters[key] = value;
101
+ }
102
+ }
103
+ } catch (_e) {
104
+ }
105
+ });
106
+ setFilters(filters);
107
+ if (filtersApplied) {
108
+ setShowFilterPanel(true);
109
+ }
110
+ }, [searchParams, filters]);
111
+ const {
112
+ value: response,
113
+ loading,
114
+ error
115
+ } = useQetaApi(
116
+ (api) => {
117
+ return api.getAnswers({
118
+ limit: answersPerPage,
119
+ offset: (page - 1) * answersPerPage,
120
+ author,
121
+ ...getFiltersWithDateRange(filters)
122
+ });
123
+ },
124
+ [page, filters, answersPerPage]
125
+ );
126
+ const onPageSizeChange = (value) => {
127
+ if (response) {
128
+ let newPage = page;
129
+ while (newPage * value > response.total) {
130
+ newPage -= 1;
131
+ }
132
+ onPageChange(Math.max(1, newPage));
133
+ }
134
+ setAnswersPerPage(value);
135
+ setSearchParams((prev) => {
136
+ const newValue = prev;
137
+ newValue.set("answersPerPage", String(value));
138
+ return newValue;
139
+ });
140
+ };
141
+ let shownTitle = title;
142
+ let link = void 0;
143
+ if (author) {
144
+ shownTitle = `${t("answerContainer.title.answersBy")} `;
145
+ link = /* @__PURE__ */ React.createElement(EntityRefLink, { entityRef: author, hideIcon: true, defaultKind: "user" });
146
+ } else if (entity) {
147
+ shownTitle = `${t("answerContainer.title.answersAbout")} `;
148
+ link = /* @__PURE__ */ React.createElement(EntityRefLink, { entityRef: entity });
149
+ } else if (tags) {
150
+ shownTitle = t("answerContainer.title.answersTagged", {
151
+ tags: tags.join(", ")
152
+ });
153
+ }
154
+ return /* @__PURE__ */ React.createElement(Box, { className: "qetaAnswersContainer" }, showTitle && /* @__PURE__ */ React.createElement(
155
+ Typography,
156
+ {
157
+ variant: "h5",
158
+ className: "qetaAnswersContainerTitle",
159
+ style: { marginBottom: "1.5rem" }
160
+ },
161
+ shownTitle,
162
+ " ",
163
+ link
164
+ ), /* @__PURE__ */ React.createElement(Grid, { container: true, justifyContent: "space-between" }, /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 12, md: 4 }, /* @__PURE__ */ React.createElement(
165
+ TextField,
166
+ {
167
+ id: "search-bar",
168
+ fullWidth: true,
169
+ onChange: onSearchQueryChange,
170
+ label: t("answerContainer.search.label"),
171
+ className: "qetaAnswersContainerSearchInput",
172
+ variant: "outlined",
173
+ placeholder: t("answerContainer.search.placeholder"),
174
+ size: "small",
175
+ style: { marginBottom: "5px" }
176
+ }
177
+ ))), /* @__PURE__ */ React.createElement(Grid, { container: true, justifyContent: "space-between" }, /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(Typography, { variant: "h6", className: "qetaAnswersContainerAnswerCount" }, t("common.answers", { count: response?.total ?? 0 }))), (showFilters ?? true) && /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(
178
+ Button,
179
+ {
180
+ onClick: () => setShowFilterPanel(!showFilterPanel),
181
+ className: "qetaAnswerContainerFilterPanelBtn",
182
+ startIcon: /* @__PURE__ */ React.createElement(FilterList, null)
183
+ },
184
+ t("filterPanel.filterButton")
185
+ ))), (showFilters ?? true) && /* @__PURE__ */ React.createElement(Collapse, { in: showFilterPanel }, /* @__PURE__ */ React.createElement(
186
+ FilterPanel,
187
+ {
188
+ onChange: onFilterChange,
189
+ filters,
190
+ answerFilters: true
191
+ }
192
+ )), /* @__PURE__ */ React.createElement(
193
+ AnswerList,
194
+ {
195
+ loading,
196
+ error,
197
+ response,
198
+ onPageChange,
199
+ onPageSizeChange,
200
+ entity,
201
+ page,
202
+ pageSize: answersPerPage,
203
+ entityPage: entity !== void 0,
204
+ tags
205
+ }
206
+ ));
207
+ };
208
+
209
+ export { AnswersContainer };
210
+ //# sourceMappingURL=AnswersContainer.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnswersContainer.esm.js","sources":["../../../src/components/AnswersContainer/AnswersContainer.tsx"],"sourcesContent":["import { useQetaApi, useTranslation } from '../../utils';\nimport {\n Box,\n Button,\n Collapse,\n Grid,\n TextField,\n Typography,\n} from '@material-ui/core';\nimport React, { useEffect } from 'react';\nimport useDebounce from 'react-use/lib/useDebounce';\nimport FilterList from '@material-ui/icons/FilterList';\nimport { useSearchParams } from 'react-router-dom';\nimport { EntityRefLink } from '@backstage/plugin-catalog-react';\nimport { useAnalytics } from '@backstage/core-plugin-api';\nimport { filterTags } from '@drodil/backstage-plugin-qeta-common';\nimport { getFiltersWithDateRange } from '../../utils/utils';\nimport {\n FilterKey,\n filterKeys,\n FilterPanel,\n Filters,\n} from '../FilterPanel/FilterPanel';\nimport { AnswerList } from './AnswerList';\n\nexport interface AnswersContainerProps {\n tags?: string[];\n author?: string;\n entity?: string;\n showFilters?: boolean;\n showTitle?: boolean;\n title?: string;\n}\n\nexport const AnswersContainer = (props: AnswersContainerProps) => {\n const { tags, author, entity, showFilters, showTitle, title } = props;\n const analytics = useAnalytics();\n const [page, setPage] = React.useState(1);\n const [answersPerPage, setAnswersPerPage] = React.useState(10);\n const [showFilterPanel, setShowFilterPanel] = React.useState(false);\n const [searchParams, setSearchParams] = useSearchParams();\n const [searchQuery, setSearchQuery] = React.useState('');\n const [filters, setFilters] = React.useState<Filters>({\n order: 'desc',\n orderBy: 'created',\n searchQuery: '',\n dateRange: '',\n noCorrectAnswer: 'false',\n entity: entity ?? '',\n tags: tags ?? [],\n noVotes: 'false',\n });\n const { t } = useTranslation();\n\n const onPageChange = (value: number) => {\n setPage(value);\n setSearchParams(prev => {\n const newValue = prev;\n newValue.set('page', String(value));\n return newValue;\n });\n };\n\n const onFilterChange = (key: FilterKey, value: string | string[]) => {\n if (filters[key] === value) {\n return;\n }\n\n setPage(1);\n setFilters({ ...filters, ...{ [key]: value } });\n setSearchParams(prev => {\n const newValue = prev;\n if (!value || value === 'false') {\n newValue.delete(key);\n } else if (Array.isArray(value)) {\n if (value.length === 0) {\n newValue.delete(key);\n } else {\n newValue.set(key, value.join(','));\n }\n } else if (value.length > 0) {\n newValue.set(key, value);\n } else {\n newValue.delete(key);\n }\n return newValue;\n });\n };\n\n const onSearchQueryChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n onPageChange(1);\n if (event.target.value) {\n analytics.captureEvent('qeta_search', event.target.value);\n }\n setSearchQuery(event.target.value);\n };\n\n useDebounce(\n () => {\n if (filters.searchQuery !== searchQuery) {\n setFilters({ ...filters, searchQuery: searchQuery });\n }\n },\n 400,\n [searchQuery],\n );\n\n useEffect(() => {\n let filtersApplied = false;\n searchParams.forEach((value, key) => {\n try {\n if (key === 'page') {\n const pv = Number.parseInt(value, 10);\n if (pv > 0) {\n setPage(pv);\n } else {\n setPage(1);\n }\n } else if (key === 'answersPerPage') {\n const qpp = Number.parseInt(value, 10);\n if (qpp > 0) setAnswersPerPage(qpp);\n } else if (filterKeys.includes(key as FilterKey)) {\n filtersApplied = true;\n if (key === 'tags') {\n filters.tags = filterTags(value) ?? [];\n } else {\n (filters as any)[key] = value;\n }\n }\n } catch (_e) {\n // NOOP\n }\n });\n setFilters(filters);\n if (filtersApplied) {\n setShowFilterPanel(true);\n }\n }, [searchParams, filters]);\n\n const {\n value: response,\n loading,\n error,\n } = useQetaApi(\n api => {\n return api.getAnswers({\n limit: answersPerPage,\n offset: (page - 1) * answersPerPage,\n author,\n ...(getFiltersWithDateRange(filters) as any),\n });\n },\n [page, filters, answersPerPage],\n );\n\n const onPageSizeChange = (value: number) => {\n if (response) {\n let newPage = page;\n while (newPage * value > response.total) {\n newPage -= 1;\n }\n onPageChange(Math.max(1, newPage));\n }\n setAnswersPerPage(value);\n setSearchParams(prev => {\n const newValue = prev;\n newValue.set('answersPerPage', String(value));\n return newValue;\n });\n };\n\n let shownTitle = title;\n let link = undefined;\n if (author) {\n shownTitle = `${t('answerContainer.title.answersBy')} `;\n link = <EntityRefLink entityRef={author} hideIcon defaultKind=\"user\" />;\n } else if (entity) {\n shownTitle = `${t('answerContainer.title.answersAbout')} `;\n link = <EntityRefLink entityRef={entity} />;\n } else if (tags) {\n shownTitle = t('answerContainer.title.answersTagged', {\n tags: tags.join(', '),\n });\n }\n\n return (\n <Box className=\"qetaAnswersContainer\">\n {showTitle && (\n <Typography\n variant=\"h5\"\n className=\"qetaAnswersContainerTitle\"\n style={{ marginBottom: '1.5rem' }}\n >\n {shownTitle} {link}\n </Typography>\n )}\n <Grid container justifyContent=\"space-between\">\n <Grid item xs={12} md={4}>\n <TextField\n id=\"search-bar\"\n fullWidth\n onChange={onSearchQueryChange}\n label={t('answerContainer.search.label')}\n className=\"qetaAnswersContainerSearchInput\"\n variant=\"outlined\"\n placeholder={t('answerContainer.search.placeholder')}\n size=\"small\"\n style={{ marginBottom: '5px' }}\n />\n </Grid>\n </Grid>\n <Grid container justifyContent=\"space-between\">\n <Grid item>\n <Typography variant=\"h6\" className=\"qetaAnswersContainerAnswerCount\">\n {t('common.answers', { count: response?.total ?? 0 })}\n </Typography>\n </Grid>\n {(showFilters ?? true) && (\n <Grid item>\n <Button\n onClick={() => setShowFilterPanel(!showFilterPanel)}\n className=\"qetaAnswerContainerFilterPanelBtn\"\n startIcon={<FilterList />}\n >\n {t('filterPanel.filterButton')}\n </Button>\n </Grid>\n )}\n </Grid>\n {(showFilters ?? true) && (\n <Collapse in={showFilterPanel}>\n <FilterPanel\n onChange={onFilterChange}\n filters={filters}\n answerFilters\n />\n </Collapse>\n )}\n\n <AnswerList\n loading={loading}\n error={error}\n response={response}\n onPageChange={onPageChange}\n onPageSizeChange={onPageSizeChange}\n entity={entity}\n page={page}\n pageSize={answersPerPage}\n entityPage={entity !== undefined}\n tags={tags}\n />\n </Box>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ import { useVoting, useTranslation } from '../../utils/hooks.esm.js';
2
+ import React from 'react';
3
+ import ArrowUpward from '@material-ui/icons/ArrowUpward';
4
+ import { makeStyles, Grid, Tooltip, IconButton, Typography } from '@material-ui/core';
5
+ import ArrowDownward from '@material-ui/icons/ArrowDownward';
6
+ import { FavoriteButton } from '../Buttons/FavoriteButton.esm.js';
7
+ import { LinkButton } from '../Buttons/LinkButton.esm.js';
8
+ import { useRouteRef } from '@backstage/core-plugin-api';
9
+ import { editArticleRouteRef } from '../../routes.esm.js';
10
+ import DeleteIcon from '@material-ui/icons/Delete';
11
+ import { DeleteModal } from '../DeleteModal/DeleteModal.esm.js';
12
+ import EditIcon from '@material-ui/icons/Edit';
13
+
14
+ const useStyles = makeStyles((theme) => {
15
+ return {
16
+ container: {
17
+ width: "100%",
18
+ paddingTop: "0.5rem",
19
+ paddingBottom: "0.5rem",
20
+ borderTop: `1px solid ${theme.palette.background.paper}`,
21
+ borderBottom: `1px solid ${theme.palette.background.paper}`
22
+ },
23
+ scoreText: {
24
+ marginLeft: "0.5rem",
25
+ userSelect: "none"
26
+ }
27
+ };
28
+ });
29
+ const ArticleButtons = (props) => {
30
+ const { post } = props;
31
+ const { voteUpTooltip, ownVote, voteUp, score, voteDownTooltip, voteDown } = useVoting(post);
32
+ const styles = useStyles();
33
+ const { t } = useTranslation();
34
+ const editArticleRoute = useRouteRef(editArticleRouteRef);
35
+ const [deleteModalOpen, setDeleteModalOpen] = React.useState(false);
36
+ const handleDeleteModalOpen = () => setDeleteModalOpen(true);
37
+ const handleDeleteModalClose = () => setDeleteModalOpen(false);
38
+ const own = props.post.own ?? false;
39
+ return /* @__PURE__ */ React.createElement("div", { className: styles.container }, /* @__PURE__ */ React.createElement(Grid, { container: true, justifyContent: "space-between" }, /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(Tooltip, { title: voteUpTooltip }, /* @__PURE__ */ React.createElement("span", null, /* @__PURE__ */ React.createElement(
40
+ IconButton,
41
+ {
42
+ "aria-label": "vote up",
43
+ color: ownVote > 0 ? "primary" : "default",
44
+ className: ownVote > 0 ? "qetaVoteUpSelected" : "qetaVoteUp",
45
+ disabled: own,
46
+ size: "small",
47
+ onClick: voteUp
48
+ },
49
+ /* @__PURE__ */ React.createElement(ArrowUpward, null)
50
+ ))), /* @__PURE__ */ React.createElement(Tooltip, { title: voteDownTooltip }, /* @__PURE__ */ React.createElement("span", null, /* @__PURE__ */ React.createElement(
51
+ IconButton,
52
+ {
53
+ "aria-label": "vote down",
54
+ color: ownVote < 0 ? "primary" : "default",
55
+ className: ownVote < 0 ? "qetaVoteDownSelected" : "qetaVoteDown",
56
+ disabled: own,
57
+ size: "small",
58
+ onClick: voteDown
59
+ },
60
+ /* @__PURE__ */ React.createElement(ArrowDownward, null)
61
+ ))), /* @__PURE__ */ React.createElement(Tooltip, { title: t("common.score", { score: score.toString(10) }) }, /* @__PURE__ */ React.createElement(Typography, { className: styles.scoreText, display: "inline" }, score))), /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(FavoriteButton, { entity: post }), /* @__PURE__ */ React.createElement(LinkButton, { entity: post }), (post.canEdit || post.canDelete) && /* @__PURE__ */ React.createElement(React.Fragment, null, post.canDelete && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Tooltip, { title: t("articlePage.deleteButton") }, /* @__PURE__ */ React.createElement(
62
+ IconButton,
63
+ {
64
+ size: "small",
65
+ color: "secondary",
66
+ onClick: handleDeleteModalOpen
67
+ },
68
+ /* @__PURE__ */ React.createElement(DeleteIcon, null)
69
+ )), /* @__PURE__ */ React.createElement(
70
+ DeleteModal,
71
+ {
72
+ open: deleteModalOpen,
73
+ onClose: handleDeleteModalClose,
74
+ entity: post
75
+ }
76
+ )), post.canEdit && /* @__PURE__ */ React.createElement(Tooltip, { title: t("articlePage.editButton") }, /* @__PURE__ */ React.createElement(
77
+ IconButton,
78
+ {
79
+ size: "small",
80
+ color: "primary",
81
+ href: editArticleRoute({
82
+ id: post.id.toString(10)
83
+ })
84
+ },
85
+ /* @__PURE__ */ React.createElement(EditIcon, null)
86
+ ))))));
87
+ };
88
+
89
+ export { ArticleButtons, useStyles };
90
+ //# sourceMappingURL=ArticleButtons.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ArticleButtons.esm.js","sources":["../../../src/components/ArticleContent/ArticleButtons.tsx"],"sourcesContent":["import { PostResponse } from '@drodil/backstage-plugin-qeta-common';\nimport { useTranslation, useVoting } from '../../utils/hooks';\nimport React from 'react';\nimport ArrowUpward from '@material-ui/icons/ArrowUpward';\nimport {\n Grid,\n IconButton,\n makeStyles,\n Tooltip,\n Typography,\n} from '@material-ui/core';\nimport ArrowDownward from '@material-ui/icons/ArrowDownward';\nimport { FavoriteButton } from '../Buttons/FavoriteButton';\nimport { LinkButton } from '../Buttons/LinkButton';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport { editArticleRouteRef } from '../../routes';\nimport DeleteIcon from '@material-ui/icons/Delete';\nimport { DeleteModal } from '../DeleteModal';\nimport EditIcon from '@material-ui/icons/Edit';\n\nexport const useStyles = makeStyles(theme => {\n return {\n container: {\n width: '100%',\n paddingTop: '0.5rem',\n paddingBottom: '0.5rem',\n borderTop: `1px solid ${theme.palette.background.paper}`,\n borderBottom: `1px solid ${theme.palette.background.paper}`,\n },\n scoreText: {\n marginLeft: '0.5rem',\n userSelect: 'none',\n },\n };\n});\n\nexport const ArticleButtons = (props: { post: PostResponse }) => {\n const { post } = props;\n const { voteUpTooltip, ownVote, voteUp, score, voteDownTooltip, voteDown } =\n useVoting(post);\n const styles = useStyles();\n const { t } = useTranslation();\n const editArticleRoute = useRouteRef(editArticleRouteRef);\n const [deleteModalOpen, setDeleteModalOpen] = React.useState(false);\n const handleDeleteModalOpen = () => setDeleteModalOpen(true);\n const handleDeleteModalClose = () => setDeleteModalOpen(false);\n\n const own = props.post.own ?? false;\n\n return (\n <div className={styles.container}>\n <Grid container justifyContent=\"space-between\">\n <Grid item>\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 <Tooltip title={voteDownTooltip}>\n <span>\n <IconButton\n aria-label=\"vote down\"\n color={ownVote < 0 ? 'primary' : 'default'}\n className={\n ownVote < 0 ? 'qetaVoteDownSelected' : 'qetaVoteDown'\n }\n disabled={own}\n size=\"small\"\n onClick={voteDown}\n >\n <ArrowDownward />\n </IconButton>\n </span>\n </Tooltip>\n <Tooltip title={t('common.score', { score: score.toString(10) })}>\n <Typography className={styles.scoreText} display=\"inline\">\n {score}\n </Typography>\n </Tooltip>\n </Grid>\n <Grid item>\n <FavoriteButton entity={post} />\n <LinkButton entity={post} />\n {(post.canEdit || post.canDelete) && (\n <>\n {post.canDelete && (\n <>\n <Tooltip title={t('articlePage.deleteButton')}>\n <IconButton\n size=\"small\"\n color=\"secondary\"\n onClick={handleDeleteModalOpen}\n >\n <DeleteIcon />\n </IconButton>\n </Tooltip>\n <DeleteModal\n open={deleteModalOpen}\n onClose={handleDeleteModalClose}\n entity={post}\n />\n </>\n )}\n {post.canEdit && (\n <Tooltip title={t('articlePage.editButton')}>\n <IconButton\n size=\"small\"\n color=\"primary\"\n href={editArticleRoute({\n id: post.id.toString(10),\n })}\n >\n <EditIcon />\n </IconButton>\n </Tooltip>\n )}\n </>\n )}\n </Grid>\n </Grid>\n </div>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ import { makeStyles, Typography, Grid, Avatar } from '@material-ui/core';
2
+ import { MarkdownRenderer } from '../MarkdownRenderer/MarkdownRenderer.esm.js';
3
+ import React from 'react';
4
+ import { useTranslation, useEntityAuthor } from '../../utils/hooks.esm.js';
5
+ import { RelativeTimeWithTooltip } from '../RelativeTimeWithTooltip/RelativeTimeWithTooltip.esm.js';
6
+ import { ArticleButtons } from './ArticleButtons.esm.js';
7
+ import { TagsAndEntities } from '../TagsAndEntities/TagsAndEntities.esm.js';
8
+ import { CommentSection } from '../CommentSection/CommentSection.esm.js';
9
+
10
+ const useStyles = makeStyles((theme) => {
11
+ return {
12
+ content: {
13
+ fontSize: "1.1rem",
14
+ lineHeight: "1.5rem",
15
+ paddingTop: "1rem",
16
+ paddingBottom: "1rem",
17
+ marginBottom: "1rem",
18
+ borderBottom: `1px solid ${theme.palette.background.paper}`
19
+ },
20
+ headerImage: {
21
+ objectFit: "cover",
22
+ width: "100%",
23
+ height: "200px",
24
+ marginBottom: "1rem",
25
+ marginTop: "1rem"
26
+ },
27
+ commentSection: {
28
+ borderBottom: `1px solid ${theme.palette.background.paper}`,
29
+ paddingBottom: "1rem",
30
+ marginBottom: "1rem",
31
+ marginLeft: 0
32
+ }
33
+ };
34
+ });
35
+ const ArticleContent = (props) => {
36
+ const { post, views } = props;
37
+ const styles = useStyles();
38
+ const { t } = useTranslation();
39
+ const { name, initials, user } = useEntityAuthor(post);
40
+ const [postEntity, setPostEntity] = React.useState(post);
41
+ const onCommentAction = (q, _) => {
42
+ setPostEntity(q);
43
+ };
44
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Typography, { variant: "h2" }, postEntity.title), /* @__PURE__ */ React.createElement(Grid, { container: true, alignItems: "center" }, /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(
45
+ Avatar,
46
+ {
47
+ src: user?.spec?.profile?.picture,
48
+ className: "qetaAvatar avatar",
49
+ alt: name,
50
+ variant: "rounded"
51
+ },
52
+ initials
53
+ )), /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(Typography, { variant: "subtitle1" }, name), /* @__PURE__ */ React.createElement(Typography, { variant: "caption" }, t("common.views", { count: views }), " ", " \xB7 ", t("authorBox.postedAtTime"), " ", /* @__PURE__ */ React.createElement(RelativeTimeWithTooltip, { value: postEntity.created })))), /* @__PURE__ */ React.createElement(Grid, { container: true }, /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React.createElement(ArticleButtons, { post: postEntity }))), postEntity.headerImage && /* @__PURE__ */ React.createElement(
54
+ "img",
55
+ {
56
+ src: post.headerImage,
57
+ alt: post.title,
58
+ className: styles.headerImage
59
+ }
60
+ ), /* @__PURE__ */ React.createElement(
61
+ MarkdownRenderer,
62
+ {
63
+ content: postEntity.content,
64
+ className: styles.content
65
+ }
66
+ ), /* @__PURE__ */ React.createElement(Typography, { variant: "h6" }, t("common.comments")), /* @__PURE__ */ React.createElement(
67
+ CommentSection,
68
+ {
69
+ className: styles.commentSection,
70
+ post: postEntity,
71
+ onCommentDelete: onCommentAction,
72
+ onCommentPost: onCommentAction
73
+ }
74
+ ), /* @__PURE__ */ React.createElement(Grid, { container: true }, /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React.createElement(TagsAndEntities, { entity: postEntity }))));
75
+ };
76
+
77
+ export { ArticleContent, useStyles };
78
+ //# sourceMappingURL=ArticleContent.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ArticleContent.esm.js","sources":["../../../src/components/ArticleContent/ArticleContent.tsx"],"sourcesContent":["import {\n AnswerResponse,\n PostResponse,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { Avatar, Grid, makeStyles, Typography } from '@material-ui/core';\nimport { MarkdownRenderer } from '../MarkdownRenderer';\nimport React from 'react';\nimport { useEntityAuthor, useTranslation } from '../../utils/hooks';\nimport { RelativeTimeWithTooltip } from '../RelativeTimeWithTooltip';\nimport { ArticleButtons } from './ArticleButtons';\nimport { TagsAndEntities } from '../TagsAndEntities/TagsAndEntities';\nimport { CommentSection } from '../CommentSection/CommentSection';\n\nexport const useStyles = makeStyles(theme => {\n return {\n content: {\n fontSize: '1.1rem',\n lineHeight: '1.5rem',\n paddingTop: '1rem',\n paddingBottom: '1rem',\n marginBottom: '1rem',\n borderBottom: `1px solid ${theme.palette.background.paper}`,\n },\n headerImage: {\n objectFit: 'cover',\n width: '100%',\n height: '200px',\n marginBottom: '1rem',\n marginTop: '1rem',\n },\n commentSection: {\n borderBottom: `1px solid ${theme.palette.background.paper}`,\n paddingBottom: '1rem',\n marginBottom: '1rem',\n marginLeft: 0,\n },\n };\n});\n\nexport const ArticleContent = (props: {\n post: PostResponse;\n views: number;\n}) => {\n const { post, views } = props;\n const styles = useStyles();\n const { t } = useTranslation();\n const { name, initials, user } = useEntityAuthor(post);\n const [postEntity, setPostEntity] = React.useState(post);\n const onCommentAction = (q: PostResponse, _?: AnswerResponse) => {\n setPostEntity(q);\n };\n\n return (\n <>\n <Typography variant=\"h2\">{postEntity.title}</Typography>\n <Grid container alignItems=\"center\">\n <Grid item>\n <Avatar\n src={user?.spec?.profile?.picture}\n className=\"qetaAvatar avatar\"\n alt={name}\n variant=\"rounded\"\n >\n {initials}\n </Avatar>\n </Grid>\n <Grid item>\n <Typography variant=\"subtitle1\">{name}</Typography>\n <Typography variant=\"caption\">\n {t('common.views', { count: views })} {' · '}\n {t('authorBox.postedAtTime')}{' '}\n <RelativeTimeWithTooltip value={postEntity.created} />\n </Typography>\n </Grid>\n </Grid>\n <Grid container>\n <Grid item xs={12}>\n <ArticleButtons post={postEntity} />\n </Grid>\n </Grid>\n {postEntity.headerImage && (\n <img\n src={post.headerImage}\n alt={post.title}\n className={styles.headerImage}\n />\n )}\n <MarkdownRenderer\n content={postEntity.content}\n className={styles.content}\n />\n <Typography variant=\"h6\">{t('common.comments')}</Typography>\n <CommentSection\n className={styles.commentSection}\n post={postEntity}\n onCommentDelete={onCommentAction}\n onCommentPost={onCommentAction}\n />\n <Grid container>\n <Grid item xs={12}>\n <TagsAndEntities entity={postEntity} />\n </Grid>\n </Grid>\n </>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { Box, Grid, Typography, Avatar } from '@material-ui/core';
2
+ import React from 'react';
3
+ import { useStyles, useTranslation, useEntityAuthor } from '../../utils/hooks.esm.js';
4
+ import { RelativeTimeWithTooltip } from '../RelativeTimeWithTooltip/RelativeTimeWithTooltip.esm.js';
5
+ import { UpdatedByLink, AuthorLink } from '../Links/Links.esm.js';
6
+
7
+ const AuthorBox = (props) => {
8
+ const { entity } = props;
9
+ const styles = useStyles();
10
+ const { t } = useTranslation();
11
+ const { name, initials, user } = useEntityAuthor(entity);
12
+ return /* @__PURE__ */ React.createElement(Box, { className: `qetaAuthorBox ${styles.questionCardAuthor}` }, /* @__PURE__ */ React.createElement(Grid, { container: true, alignItems: "center" }, /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 12, style: { paddingBottom: 0 } }, /* @__PURE__ */ React.createElement(Typography, { className: "qetaAuthorBoxCreated", variant: "caption" }, t("authorBox.postedAtTime"), " ", /* @__PURE__ */ React.createElement(RelativeTimeWithTooltip, { value: entity.created }))), entity.updated && entity.updatedBy && /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 12, style: { paddingBottom: 0, paddingTop: 0 } }, /* @__PURE__ */ React.createElement(Typography, { className: "qetaAuthorBoxUpdated", variant: "caption" }, t("authorBox.updatedAtTime"), " ", /* @__PURE__ */ React.createElement(RelativeTimeWithTooltip, { value: entity.updated }), " ", t("authorBox.updatedBy"), " ", /* @__PURE__ */ React.createElement(UpdatedByLink, { entity }))), /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 2 }, /* @__PURE__ */ React.createElement(
13
+ Avatar,
14
+ {
15
+ src: user?.spec?.profile?.picture,
16
+ className: "qetaAuthorBoxAvatar avatar",
17
+ alt: name,
18
+ variant: "rounded"
19
+ },
20
+ initials
21
+ )), /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 10, className: styles.authorLink }, /* @__PURE__ */ React.createElement(Box, { style: { paddingLeft: "5px" } }, /* @__PURE__ */ React.createElement(AuthorLink, { entity })))));
22
+ };
23
+
24
+ export { AuthorBox };
25
+ //# sourceMappingURL=AuthorBox.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthorBox.esm.js","sources":["../../../src/components/AuthorBox/AuthorBox.tsx"],"sourcesContent":["import { Avatar, Box, Grid, Typography } from '@material-ui/core';\nimport React from 'react';\nimport { useEntityAuthor, useStyles, useTranslation } from '../../utils/hooks';\nimport {\n AnswerResponse,\n PostResponse,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { RelativeTimeWithTooltip } from '../RelativeTimeWithTooltip';\nimport { AuthorLink, UpdatedByLink } from '../Links';\n\nexport const AuthorBox = (props: { entity: PostResponse | AnswerResponse }) => {\n const { entity } = props;\n const styles = useStyles();\n const { t } = useTranslation();\n const { name, initials, user } = useEntityAuthor(entity);\n\n return (\n <Box className={`qetaAuthorBox ${styles.questionCardAuthor}`}>\n <Grid container alignItems=\"center\">\n <Grid item xs={12} style={{ paddingBottom: 0 }}>\n <Typography className=\"qetaAuthorBoxCreated\" variant=\"caption\">\n {t('authorBox.postedAtTime')}{' '}\n <RelativeTimeWithTooltip value={entity.created} />\n </Typography>\n </Grid>\n {entity.updated && entity.updatedBy && (\n <Grid item xs={12} style={{ paddingBottom: 0, paddingTop: 0 }}>\n <Typography className=\"qetaAuthorBoxUpdated\" variant=\"caption\">\n {t('authorBox.updatedAtTime')}{' '}\n <RelativeTimeWithTooltip value={entity.updated} />{' '}\n {t('authorBox.updatedBy')} <UpdatedByLink entity={entity} />\n </Typography>\n </Grid>\n )}\n <Grid item xs={2}>\n <Avatar\n src={user?.spec?.profile?.picture}\n className=\"qetaAuthorBoxAvatar avatar\"\n alt={name}\n variant=\"rounded\"\n >\n {initials}\n </Avatar>\n </Grid>\n <Grid item xs={10} className={styles.authorLink}>\n <Box style={{ paddingLeft: '5px' }}>\n <AuthorLink entity={entity} />\n </Box>\n </Grid>\n </Grid>\n </Box>\n );\n};\n"],"names":[],"mappings":";;;;;;AAUa,MAAA,SAAA,GAAY,CAAC,KAAqD,KAAA;AAC7E,EAAM,MAAA,EAAE,QAAW,GAAA,KAAA,CAAA;AACnB,EAAA,MAAM,SAAS,SAAU,EAAA,CAAA;AACzB,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,cAAe,EAAA,CAAA;AAC7B,EAAA,MAAM,EAAE,IAAM,EAAA,QAAA,EAAU,IAAK,EAAA,GAAI,gBAAgB,MAAM,CAAA,CAAA;AAEvD,EAAA,2CACG,GAAI,EAAA,EAAA,SAAA,EAAW,iBAAiB,MAAO,CAAA,kBAAkB,sBACvD,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,WAAS,IAAC,EAAA,UAAA,EAAW,4BACxB,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,MAAI,IAAC,EAAA,EAAA,EAAI,IAAI,KAAO,EAAA,EAAE,eAAe,CAAE,EAAA,EAAA,sCAC1C,UAAW,EAAA,EAAA,SAAA,EAAU,wBAAuB,OAAQ,EAAA,SAAA,EAAA,EAClD,EAAE,wBAAwB,CAAA,EAAG,qBAC7B,KAAA,CAAA,aAAA,CAAA,uBAAA,EAAA,EAAwB,OAAO,MAAO,CAAA,OAAA,EAAS,CAClD,CACF,CAAA,EACC,OAAO,OAAW,IAAA,MAAA,CAAO,6BACvB,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,MAAI,IAAC,EAAA,EAAA,EAAI,IAAI,KAAO,EAAA,EAAE,eAAe,CAAG,EAAA,UAAA,EAAY,GACxD,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,cAAW,SAAU,EAAA,sBAAA,EAAuB,SAAQ,SAClD,EAAA,EAAA,CAAA,CAAE,yBAAyB,CAAG,EAAA,GAAA,sCAC9B,uBAAwB,EAAA,EAAA,KAAA,EAAO,OAAO,OAAS,EAAA,CAAA,EAAG,KAClD,CAAE,CAAA,qBAAqB,GAAE,GAAC,kBAAA,KAAA,CAAA,aAAA,CAAC,iBAAc,MAAgB,EAAA,CAC5D,CACF,CAEF,kBAAA,KAAA,CAAA,aAAA,CAAC,QAAK,IAAI,EAAA,IAAA,EAAC,IAAI,CACb,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,IAAM,EAAA,IAAA,EAAM,OAAS,EAAA,OAAA;AAAA,MAC1B,SAAU,EAAA,4BAAA;AAAA,MACV,GAAK,EAAA,IAAA;AAAA,MACL,OAAQ,EAAA,SAAA;AAAA,KAAA;AAAA,IAEP,QAAA;AAAA,GAEL,CACA,kBAAA,KAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,MAAC,EAAI,EAAA,EAAA,EAAI,SAAW,EAAA,MAAA,CAAO,UACnC,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,OAAI,KAAO,EAAA,EAAE,WAAa,EAAA,KAAA,EACzB,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,cAAW,MAAgB,EAAA,CAC9B,CACF,CACF,CACF,CAAA,CAAA;AAEJ;;;;"}
@@ -0,0 +1,68 @@
1
+ import { useTranslation, useStyles, useQetaApi } from '../../utils/hooks.esm.js';
2
+ import React from 'react';
3
+ import { Button, Dialog, DialogTitle, DialogContent, Grid, DialogActions } from '@material-ui/core';
4
+ import AddCircle from '@material-ui/icons/AddCircle';
5
+ import RemoveCircle from '@material-ui/icons/RemoveCircle';
6
+ import PlayListAddIcon from '@material-ui/icons/PlaylistAdd';
7
+ import { useApi } from '@backstage/core-plugin-api';
8
+ import { qetaApiRef } from '../../api.esm.js';
9
+
10
+ const AddToCollectionButton = (props) => {
11
+ const { post } = props;
12
+ const { t } = useTranslation();
13
+ const styles = useStyles();
14
+ const { value: response, retry } = useQetaApi((api) => {
15
+ return api.getCollections();
16
+ }, []);
17
+ const [open, setOpen] = React.useState(false);
18
+ const qetaApi = useApi(qetaApiRef);
19
+ const handleClickOpen = () => {
20
+ setOpen(true);
21
+ };
22
+ const handleClose = () => {
23
+ setOpen(false);
24
+ };
25
+ const handleClick = (collection) => {
26
+ if (collection.posts?.find((p) => p.id === post.id)) {
27
+ qetaApi.removePostFromCollection(collection.id, post.id).then(() => {
28
+ retry();
29
+ });
30
+ } else {
31
+ qetaApi.addPostToCollection(collection.id, post.id).then(() => {
32
+ retry();
33
+ });
34
+ }
35
+ };
36
+ const collections = (response?.collections ?? []).filter((c) => c.canEdit);
37
+ if (!collections.length) {
38
+ return null;
39
+ }
40
+ return /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement(
41
+ Button,
42
+ {
43
+ variant: "contained",
44
+ size: "small",
45
+ onClick: handleClickOpen,
46
+ className: `${styles.marginLeft} qetaAddToCollectionBtn`,
47
+ startIcon: /* @__PURE__ */ React.createElement(PlayListAddIcon, null)
48
+ },
49
+ t("addToCollectionButton.title")
50
+ ), /* @__PURE__ */ React.createElement(Dialog, { open, onClose: handleClose, fullWidth: true }, /* @__PURE__ */ React.createElement(DialogTitle, null, t("addToCollectionButton.manage")), /* @__PURE__ */ React.createElement(DialogContent, null, /* @__PURE__ */ React.createElement(Grid, { container: true }, collections.map((collection) => {
51
+ const isInCollection = collection.posts?.find(
52
+ (p) => p.id === post.id
53
+ );
54
+ return /* @__PURE__ */ React.createElement(Grid, { item: true, key: collection.id }, /* @__PURE__ */ React.createElement(
55
+ Button,
56
+ {
57
+ variant: "outlined",
58
+ startIcon: isInCollection ? /* @__PURE__ */ React.createElement(RemoveCircle, null) : /* @__PURE__ */ React.createElement(AddCircle, null),
59
+ color: isInCollection ? "secondary" : "primary",
60
+ onClick: () => handleClick(collection)
61
+ },
62
+ collection.title
63
+ ));
64
+ }))), /* @__PURE__ */ React.createElement(DialogActions, null, /* @__PURE__ */ React.createElement(Button, { onClick: handleClose, color: "primary" }, t("addToCollectionButton.close")))));
65
+ };
66
+
67
+ export { AddToCollectionButton };
68
+ //# sourceMappingURL=AddToCollectionButton.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AddToCollectionButton.esm.js","sources":["../../../src/components/Buttons/AddToCollectionButton.tsx"],"sourcesContent":["import { Collection, PostResponse } from '@drodil/backstage-plugin-qeta-common';\nimport { useQetaApi, useStyles, useTranslation } from '../../utils';\nimport React from 'react';\nimport {\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n Grid,\n} from '@material-ui/core';\nimport AddCircle from '@material-ui/icons/AddCircle';\nimport RemoveCircle from '@material-ui/icons/RemoveCircle';\nimport PlayListAddIcon from '@material-ui/icons/PlaylistAdd';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { qetaApiRef } from '../../api';\n\nexport const AddToCollectionButton = (props: { post: PostResponse }) => {\n const { post } = props;\n const { t } = useTranslation();\n const styles = useStyles();\n const { value: response, retry } = useQetaApi(api => {\n return api.getCollections();\n }, []);\n const [open, setOpen] = React.useState(false);\n const qetaApi = useApi(qetaApiRef);\n\n const handleClickOpen = () => {\n setOpen(true);\n };\n\n const handleClose = () => {\n setOpen(false);\n };\n\n const handleClick = (collection: Collection) => {\n if (collection.posts?.find(p => p.id === post.id)) {\n qetaApi.removePostFromCollection(collection.id, post.id).then(() => {\n retry();\n });\n } else {\n qetaApi.addPostToCollection(collection.id, post.id).then(() => {\n retry();\n });\n }\n };\n\n const collections = (response?.collections ?? []).filter(c => c.canEdit);\n if (!collections.length) {\n return null;\n }\n\n return (\n <div>\n <Button\n variant=\"contained\"\n size=\"small\"\n onClick={handleClickOpen}\n className={`${styles.marginLeft} qetaAddToCollectionBtn`}\n startIcon={<PlayListAddIcon />}\n >\n {t('addToCollectionButton.title')}\n </Button>\n <Dialog open={open} onClose={handleClose} fullWidth>\n <DialogTitle>{t('addToCollectionButton.manage')}</DialogTitle>\n <DialogContent>\n <Grid container>\n {collections.map(collection => {\n const isInCollection = collection.posts?.find(\n p => p.id === post.id,\n );\n\n return (\n <Grid item key={collection.id}>\n <Button\n variant=\"outlined\"\n startIcon={\n isInCollection ? <RemoveCircle /> : <AddCircle />\n }\n color={isInCollection ? 'secondary' : 'primary'}\n onClick={() => handleClick(collection)}\n >\n {collection.title}\n </Button>\n </Grid>\n );\n })}\n </Grid>\n </DialogContent>\n <DialogActions>\n <Button onClick={handleClose} color=\"primary\">\n {t('addToCollectionButton.close')}\n </Button>\n </DialogActions>\n </Dialog>\n </div>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import HelpOutline from '@material-ui/icons/HelpOutline';
2
+ import React from 'react';
3
+ import { RequirePermission } from '@backstage/plugin-permission-react';
4
+ import { qetaCreatePostPermission } from '@drodil/backstage-plugin-qeta-common';
5
+ import { LinkButton } from '@backstage/core-components';
6
+ import { useRouteRef } from '@backstage/core-plugin-api';
7
+ import { askRouteRef } from '../../routes.esm.js';
8
+ import { useTranslation, useStyles } from '../../utils/hooks.esm.js';
9
+
10
+ const AskQuestionButton = (props) => {
11
+ const { entity, entityPage, tags } = props;
12
+ const askRoute = useRouteRef(askRouteRef);
13
+ const { t } = useTranslation();
14
+ const styles = useStyles();
15
+ const params = new URLSearchParams();
16
+ if (entity) {
17
+ params.set("entity", entity);
18
+ }
19
+ if (entityPage) {
20
+ params.set("entityPage", "true");
21
+ }
22
+ if (tags && tags.length > 0) {
23
+ params.set("tags", tags.join(","));
24
+ }
25
+ return /* @__PURE__ */ React.createElement(RequirePermission, { permission: qetaCreatePostPermission, errorPage: /* @__PURE__ */ React.createElement(React.Fragment, null) }, /* @__PURE__ */ React.createElement(
26
+ LinkButton,
27
+ {
28
+ variant: "contained",
29
+ size: "small",
30
+ to: entity || tags ? `${askRoute()}?${params.toString()}` : askRoute(),
31
+ color: "primary",
32
+ className: `${styles.marginLeft} qetaAskQuestionBtn`,
33
+ startIcon: /* @__PURE__ */ React.createElement(HelpOutline, null)
34
+ },
35
+ t("askQuestionButton.title")
36
+ ));
37
+ };
38
+
39
+ export { AskQuestionButton };
40
+ //# sourceMappingURL=AskQuestionButton.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AskQuestionButton.esm.js","sources":["../../../src/components/Buttons/AskQuestionButton.tsx"],"sourcesContent":["import HelpOutline from '@material-ui/icons/HelpOutline';\nimport React from 'react';\nimport { RequirePermission } from '@backstage/plugin-permission-react';\nimport { qetaCreatePostPermission } from '@drodil/backstage-plugin-qeta-common';\nimport { LinkButton } from '@backstage/core-components';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport { askRouteRef } from '../../routes';\nimport { useStyles, useTranslation } from '../../utils/hooks';\n\nexport const AskQuestionButton = (props: {\n entity?: string;\n tags?: string[];\n entityPage?: boolean;\n}) => {\n const { entity, entityPage, tags } = props;\n const askRoute = useRouteRef(askRouteRef);\n const { t } = useTranslation();\n const styles = useStyles();\n\n const params = new URLSearchParams();\n if (entity) {\n params.set('entity', entity);\n }\n if (entityPage) {\n params.set('entityPage', 'true');\n }\n if (tags && tags.length > 0) {\n params.set('tags', tags.join(','));\n }\n\n return (\n <RequirePermission permission={qetaCreatePostPermission} errorPage={<></>}>\n <LinkButton\n variant=\"contained\"\n size=\"small\"\n to={entity || tags ? `${askRoute()}?${params.toString()}` : askRoute()}\n color=\"primary\"\n className={`${styles.marginLeft} qetaAskQuestionBtn`}\n startIcon={<HelpOutline />}\n >\n {t('askQuestionButton.title')}\n </LinkButton>\n </RequirePermission>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;AASa,MAAA,iBAAA,GAAoB,CAAC,KAI5B,KAAA;AACJ,EAAA,MAAM,EAAE,MAAA,EAAQ,UAAY,EAAA,IAAA,EAAS,GAAA,KAAA,CAAA;AACrC,EAAM,MAAA,QAAA,GAAW,YAAY,WAAW,CAAA,CAAA;AACxC,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,cAAe,EAAA,CAAA;AAC7B,EAAA,MAAM,SAAS,SAAU,EAAA,CAAA;AAEzB,EAAM,MAAA,MAAA,GAAS,IAAI,eAAgB,EAAA,CAAA;AACnC,EAAA,IAAI,MAAQ,EAAA;AACV,IAAO,MAAA,CAAA,GAAA,CAAI,UAAU,MAAM,CAAA,CAAA;AAAA,GAC7B;AACA,EAAA,IAAI,UAAY,EAAA;AACd,IAAO,MAAA,CAAA,GAAA,CAAI,cAAc,MAAM,CAAA,CAAA;AAAA,GACjC;AACA,EAAI,IAAA,IAAA,IAAQ,IAAK,CAAA,MAAA,GAAS,CAAG,EAAA;AAC3B,IAAA,MAAA,CAAO,GAAI,CAAA,MAAA,EAAQ,IAAK,CAAA,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AAAA,GACnC;AAEA,EAAA,2CACG,iBAAkB,EAAA,EAAA,UAAA,EAAY,wBAA0B,EAAA,SAAA,0DAAa,CACpE,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,OAAQ,EAAA,WAAA;AAAA,MACR,IAAK,EAAA,OAAA;AAAA,MACL,EAAA,EAAI,MAAU,IAAA,IAAA,GAAO,CAAG,EAAA,QAAA,EAAU,CAAA,CAAA,EAAI,MAAO,CAAA,QAAA,EAAU,CAAA,CAAA,GAAK,QAAS,EAAA;AAAA,MACrE,KAAM,EAAA,SAAA;AAAA,MACN,SAAA,EAAW,CAAG,EAAA,MAAA,CAAO,UAAU,CAAA,mBAAA,CAAA;AAAA,MAC/B,SAAA,sCAAY,WAAY,EAAA,IAAA,CAAA;AAAA,KAAA;AAAA,IAEvB,EAAE,yBAAyB,CAAA;AAAA,GAEhC,CAAA,CAAA;AAEJ;;;;"}