@drodil/backstage-plugin-qeta-react 3.52.6 → 3.53.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (170) hide show
  1. package/dist/components/AIAnswerCard/AIAnswerCard.esm.js +11 -11
  2. package/dist/components/AIAnswerCard/AIAnswerCard.esm.js.map +1 -1
  3. package/dist/components/AnswerForm/AnswerForm.esm.js +5 -0
  4. package/dist/components/AnswerForm/AnswerForm.esm.js.map +1 -1
  5. package/dist/components/AnswersContainer/AnswerListItem.esm.js +4 -2
  6. package/dist/components/AnswersContainer/AnswerListItem.esm.js.map +1 -1
  7. package/dist/components/AnswersContainer/AnswersContainer.esm.js +59 -231
  8. package/dist/components/AnswersContainer/AnswersContainer.esm.js.map +1 -1
  9. package/dist/components/AnswersContainer/AnswersGridItem.esm.js +167 -0
  10. package/dist/components/AnswersContainer/AnswersGridItem.esm.js.map +1 -0
  11. package/dist/components/ArticleContent/ArticleButtons.esm.js +14 -1
  12. package/dist/components/ArticleContent/ArticleButtons.esm.js.map +1 -1
  13. package/dist/components/Badges/UserBadges.esm.js +7 -2
  14. package/dist/components/Badges/UserBadges.esm.js.map +1 -1
  15. package/dist/components/Buttons/AddToCollectionButton.esm.js +7 -2
  16. package/dist/components/Buttons/AddToCollectionButton.esm.js.map +1 -1
  17. package/dist/components/Buttons/EntityFollowButton.esm.js +7 -2
  18. package/dist/components/Buttons/EntityFollowButton.esm.js.map +1 -1
  19. package/dist/components/Buttons/RankingButtons.esm.js +94 -0
  20. package/dist/components/Buttons/RankingButtons.esm.js.map +1 -0
  21. package/dist/components/Buttons/TagFollowButton.esm.js +8 -3
  22. package/dist/components/Buttons/TagFollowButton.esm.js.map +1 -1
  23. package/dist/components/Buttons/UserFollowButton.esm.js +7 -2
  24. package/dist/components/Buttons/UserFollowButton.esm.js.map +1 -1
  25. package/dist/components/Buttons/VoteButtons.esm.js +12 -1
  26. package/dist/components/Buttons/VoteButtons.esm.js.map +1 -1
  27. package/dist/components/CollectionsContainer/CollectionListItem.esm.js +143 -0
  28. package/dist/components/CollectionsContainer/CollectionListItem.esm.js.map +1 -0
  29. package/dist/components/CollectionsContainer/CollectionsContainer.esm.js +45 -0
  30. package/dist/components/CollectionsContainer/CollectionsContainer.esm.js.map +1 -0
  31. package/dist/components/CollectionsContainer/CollectionsGridItem.esm.js.map +1 -0
  32. package/dist/components/ContentHeader/ContentHeader.esm.js +6 -0
  33. package/dist/components/ContentHeader/ContentHeader.esm.js.map +1 -1
  34. package/dist/components/EntitiesContainer/EntitiesContainer.esm.js +44 -0
  35. package/dist/components/EntitiesContainer/EntitiesContainer.esm.js.map +1 -0
  36. package/dist/components/{EntitiesGrid → EntitiesContainer}/EntitiesGridItem.esm.js +18 -26
  37. package/dist/components/EntitiesContainer/EntitiesGridItem.esm.js.map +1 -0
  38. package/dist/components/EntitiesContainer/EntityListItem.esm.js +102 -0
  39. package/dist/components/EntitiesContainer/EntityListItem.esm.js.map +1 -0
  40. package/dist/components/FilterPanel/FilterPanel.esm.js +2 -2
  41. package/dist/components/FilterPanel/FilterPanel.esm.js.map +1 -1
  42. package/dist/components/FollowedLists/FollowedEntitiesList.esm.js +7 -3
  43. package/dist/components/FollowedLists/FollowedEntitiesList.esm.js.map +1 -1
  44. package/dist/components/FollowedLists/FollowedTagsList.esm.js +8 -4
  45. package/dist/components/FollowedLists/FollowedTagsList.esm.js.map +1 -1
  46. package/dist/components/FollowedLists/FollowedUsersList.esm.js +7 -3
  47. package/dist/components/FollowedLists/FollowedUsersList.esm.js.map +1 -1
  48. package/dist/components/HomePageCards/ImpactCard.esm.js +7 -2
  49. package/dist/components/HomePageCards/ImpactCard.esm.js.map +1 -1
  50. package/dist/components/HomePageCards/PostsCard.esm.js +23 -15
  51. package/dist/components/HomePageCards/PostsCard.esm.js.map +1 -1
  52. package/dist/components/LeftMenu/LeftMenu.esm.js +15 -16
  53. package/dist/components/LeftMenu/LeftMenu.esm.js.map +1 -1
  54. package/dist/components/LinkCard/LinkCard.esm.js +4 -0
  55. package/dist/components/LinkCard/LinkCard.esm.js.map +1 -1
  56. package/dist/components/Links/Links.esm.js +11 -1
  57. package/dist/components/Links/Links.esm.js.map +1 -1
  58. package/dist/components/PostForm/EntitiesInput.esm.js +229 -226
  59. package/dist/components/PostForm/EntitiesInput.esm.js.map +1 -1
  60. package/dist/components/PostForm/PostForm.esm.js +13 -10
  61. package/dist/components/PostForm/PostForm.esm.js.map +1 -1
  62. package/dist/components/PostForm/TagInput.esm.js +4 -3
  63. package/dist/components/PostForm/TagInput.esm.js.map +1 -1
  64. package/dist/components/PostHighlightList/PostHighlightList.esm.js +6 -2
  65. package/dist/components/PostHighlightList/PostHighlightList.esm.js.map +1 -1
  66. package/dist/components/PostsContainer/PostListItem.esm.js +58 -19
  67. package/dist/components/PostsContainer/PostListItem.esm.js.map +1 -1
  68. package/dist/components/PostsContainer/PostsContainer.esm.js +137 -128
  69. package/dist/components/PostsContainer/PostsContainer.esm.js.map +1 -1
  70. package/dist/components/{PostsGrid → PostsContainer}/PostsGridItem.esm.js +29 -53
  71. package/dist/components/PostsContainer/PostsGridItem.esm.js.map +1 -0
  72. package/dist/components/PostsTable/PostsTable.esm.js +7 -2
  73. package/dist/components/PostsTable/PostsTable.esm.js.map +1 -1
  74. package/dist/components/QetaEntityContainer/QetaEntityContainer.esm.js +178 -0
  75. package/dist/components/QetaEntityContainer/QetaEntityContainer.esm.js.map +1 -0
  76. package/dist/components/QuestionCard/QuestionCard.esm.js +100 -88
  77. package/dist/components/QuestionCard/QuestionCard.esm.js.map +1 -1
  78. package/dist/components/SuggestionsCard/SuggestionsCard.esm.js +7 -3
  79. package/dist/components/SuggestionsCard/SuggestionsCard.esm.js.map +1 -1
  80. package/dist/components/TagsAndEntities/EntityChip.esm.js +6 -2
  81. package/dist/components/TagsAndEntities/EntityChip.esm.js.map +1 -1
  82. package/dist/components/TagsAndEntities/TagChip.esm.js +6 -2
  83. package/dist/components/TagsAndEntities/TagChip.esm.js.map +1 -1
  84. package/dist/components/TagsAndEntities/UserChip.esm.js +7 -3
  85. package/dist/components/TagsAndEntities/UserChip.esm.js.map +1 -1
  86. package/dist/components/TagsContainer/CreateTagModal.esm.js.map +1 -0
  87. package/dist/components/TagsContainer/EditTagModal.esm.js.map +1 -0
  88. package/dist/components/{TagsGrid → TagsContainer}/TagGridItem.esm.js +3 -3
  89. package/dist/components/TagsContainer/TagGridItem.esm.js.map +1 -0
  90. package/dist/components/TagsContainer/TagListItem.esm.js +243 -0
  91. package/dist/components/TagsContainer/TagListItem.esm.js.map +1 -0
  92. package/dist/components/TagsContainer/TagsContainer.esm.js +86 -0
  93. package/dist/components/TagsContainer/TagsContainer.esm.js.map +1 -0
  94. package/dist/components/TemplateList/TemplateForm.esm.js +7 -2
  95. package/dist/components/TemplateList/TemplateForm.esm.js.map +1 -1
  96. package/dist/components/TemplateList/TemplateList.esm.js +7 -3
  97. package/dist/components/TemplateList/TemplateList.esm.js.map +1 -1
  98. package/dist/components/Timeline/TimelineItem.esm.js +4 -0
  99. package/dist/components/Timeline/TimelineItem.esm.js.map +1 -1
  100. package/dist/components/TopRankingUsersCard/TopRankingUsersCard.esm.js +7 -2
  101. package/dist/components/TopRankingUsersCard/TopRankingUsersCard.esm.js.map +1 -1
  102. package/dist/components/UsersContainer/UserListItem.esm.js +133 -0
  103. package/dist/components/UsersContainer/UserListItem.esm.js.map +1 -0
  104. package/dist/components/UsersContainer/UsersContainer.esm.js +44 -0
  105. package/dist/components/UsersContainer/UsersContainer.esm.js.map +1 -0
  106. package/dist/components/{UsersGrid → UsersContainer}/UsersGridItem.esm.js +35 -38
  107. package/dist/components/UsersContainer/UsersGridItem.esm.js.map +1 -0
  108. package/dist/components/Utility/QetaGridHeader.esm.js +15 -11
  109. package/dist/components/Utility/QetaGridHeader.esm.js.map +1 -1
  110. package/dist/components/Utility/QetaPagination.esm.js +69 -0
  111. package/dist/components/Utility/QetaPagination.esm.js.map +1 -0
  112. package/dist/hooks/useEntityAuthor.esm.js +3 -1
  113. package/dist/hooks/useEntityAuthor.esm.js.map +1 -1
  114. package/dist/hooks/useListItemStyles.esm.js +22 -0
  115. package/dist/hooks/useListItemStyles.esm.js.map +1 -0
  116. package/dist/hooks/{usePaginatedPosts.esm.js → useQetaEntities.esm.js} +59 -86
  117. package/dist/hooks/useQetaEntities.esm.js.map +1 -0
  118. package/dist/hooks/useUserSettings.esm.js +83 -0
  119. package/dist/hooks/useUserSettings.esm.js.map +1 -0
  120. package/dist/index.d.ts +211 -58
  121. package/dist/index.esm.js +21 -8
  122. package/dist/index.esm.js.map +1 -1
  123. package/dist/routes.esm.js +6 -1
  124. package/dist/routes.esm.js.map +1 -1
  125. package/dist/translation.esm.js +49 -0
  126. package/dist/translation.esm.js.map +1 -1
  127. package/package.json +2 -2
  128. package/dist/components/AnswersContainer/AnswerList.esm.js +0 -54
  129. package/dist/components/AnswersContainer/AnswerList.esm.js.map +0 -1
  130. package/dist/components/CollectionsGrid/CollectionsGrid.esm.js +0 -204
  131. package/dist/components/CollectionsGrid/CollectionsGrid.esm.js.map +0 -1
  132. package/dist/components/CollectionsGrid/CollectionsGridContent.esm.js +0 -55
  133. package/dist/components/CollectionsGrid/CollectionsGridContent.esm.js.map +0 -1
  134. package/dist/components/CollectionsGrid/CollectionsGridItem.esm.js.map +0 -1
  135. package/dist/components/CollectionsGrid/NoCollectionsCard.esm.js +0 -21
  136. package/dist/components/CollectionsGrid/NoCollectionsCard.esm.js.map +0 -1
  137. package/dist/components/EntitiesGrid/EntitiesGrid.esm.js +0 -136
  138. package/dist/components/EntitiesGrid/EntitiesGrid.esm.js.map +0 -1
  139. package/dist/components/EntitiesGrid/EntitiesGridContent.esm.js +0 -46
  140. package/dist/components/EntitiesGrid/EntitiesGridContent.esm.js.map +0 -1
  141. package/dist/components/EntitiesGrid/EntitiesGridItem.esm.js.map +0 -1
  142. package/dist/components/EntitiesGrid/NoEntitiesCard.esm.js +0 -21
  143. package/dist/components/EntitiesGrid/NoEntitiesCard.esm.js.map +0 -1
  144. package/dist/components/PostsContainer/PostList.esm.js +0 -83
  145. package/dist/components/PostsContainer/PostList.esm.js.map +0 -1
  146. package/dist/components/PostsGrid/PostsGrid.esm.js +0 -197
  147. package/dist/components/PostsGrid/PostsGrid.esm.js.map +0 -1
  148. package/dist/components/PostsGrid/PostsGridContent.esm.js +0 -90
  149. package/dist/components/PostsGrid/PostsGridContent.esm.js.map +0 -1
  150. package/dist/components/PostsGrid/PostsGridItem.esm.js.map +0 -1
  151. package/dist/components/TagsGrid/CreateTagModal.esm.js.map +0 -1
  152. package/dist/components/TagsGrid/EditTagModal.esm.js.map +0 -1
  153. package/dist/components/TagsGrid/NoTagsCard.esm.js +0 -21
  154. package/dist/components/TagsGrid/NoTagsCard.esm.js.map +0 -1
  155. package/dist/components/TagsGrid/TagGridItem.esm.js.map +0 -1
  156. package/dist/components/TagsGrid/TagsGrid.esm.js +0 -190
  157. package/dist/components/TagsGrid/TagsGrid.esm.js.map +0 -1
  158. package/dist/components/TagsGrid/TagsGridContent.esm.js +0 -62
  159. package/dist/components/TagsGrid/TagsGridContent.esm.js.map +0 -1
  160. package/dist/components/UsersGrid/NoUsersCard.esm.js +0 -21
  161. package/dist/components/UsersGrid/NoUsersCard.esm.js.map +0 -1
  162. package/dist/components/UsersGrid/UsersGrid.esm.js +0 -137
  163. package/dist/components/UsersGrid/UsersGrid.esm.js.map +0 -1
  164. package/dist/components/UsersGrid/UsersGridContent.esm.js +0 -46
  165. package/dist/components/UsersGrid/UsersGridContent.esm.js.map +0 -1
  166. package/dist/components/UsersGrid/UsersGridItem.esm.js.map +0 -1
  167. package/dist/hooks/usePaginatedPosts.esm.js.map +0 -1
  168. /package/dist/components/{CollectionsGrid → CollectionsContainer}/CollectionsGridItem.esm.js +0 -0
  169. /package/dist/components/{TagsGrid → TagsContainer}/CreateTagModal.esm.js +0 -0
  170. /package/dist/components/{TagsGrid → TagsContainer}/EditTagModal.esm.js +0 -0
@@ -0,0 +1,243 @@
1
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
2
+ import { useState } from 'react';
3
+ import { truncate, removeMarkdownFormatting } from '@drodil/backstage-plugin-qeta-common';
4
+ import { TagFollowButton } from '../Buttons/TagFollowButton.esm.js';
5
+ import { makeStyles, Box, Typography, Tooltip, IconButton, Menu, MenuItem, ListItemIcon, ListItemText } from '@material-ui/core';
6
+ import { useRouteRef } from '@backstage/core-plugin-api';
7
+ import { tagRouteRef } from '../../routes.esm.js';
8
+ import { EditTagModal } from './EditTagModal.esm.js';
9
+ import DOMPurify from 'dompurify';
10
+ import { DeleteModal } from '../Modals/DeleteModal.esm.js';
11
+ import '@material-ui/lab';
12
+ import '@material-ui/icons/Block';
13
+ import '../../api.esm.js';
14
+ import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
15
+ import { qetaTranslationRef } from '../../translation.esm.js';
16
+ import '../Utility/ModalContent.esm.js';
17
+ import '@material-ui/icons/Check';
18
+ import DeleteIcon from '@material-ui/icons/Delete';
19
+ import EditIcon from '@material-ui/icons/Edit';
20
+ import MoreVertIcon from '@material-ui/icons/MoreVert';
21
+ import LocalOfferIcon from '@material-ui/icons/LocalOffer';
22
+ import QuestionAnswerIcon from '@material-ui/icons/QuestionAnswer';
23
+ import PeopleIcon from '@material-ui/icons/People';
24
+ import LinkIcon from '@material-ui/icons/Link';
25
+ import DescriptionIcon from '@material-ui/icons/Description';
26
+ import { Link } from 'react-router-dom';
27
+ import 'react-use';
28
+ import '@backstage/plugin-signals-react';
29
+ import { useListItemStyles } from '../../hooks/useListItemStyles.esm.js';
30
+ import '@backstage/catalog-model';
31
+ import 'dataloader';
32
+ import '@backstage/plugin-catalog-react';
33
+ import 'react-use/lib/useAsync';
34
+ import '@backstage/plugin-permission-react';
35
+ import '@backstage/plugin-permission-common';
36
+ import 'react-use/lib/useDebounce';
37
+ import '../FilterPanel/FilterPanel.esm.js';
38
+
39
+ const useStyles = makeStyles((theme) => ({
40
+ icon: {
41
+ marginRight: theme.spacing(2),
42
+ color: theme.palette.text.secondary
43
+ },
44
+ content: {
45
+ flex: 1,
46
+ display: "flex",
47
+ flexDirection: "column",
48
+ minWidth: 0
49
+ },
50
+ header: {
51
+ display: "flex",
52
+ alignItems: "center",
53
+ gap: theme.spacing(1)
54
+ },
55
+ tagName: {
56
+ fontWeight: 600,
57
+ fontSize: "1rem"
58
+ },
59
+ description: {
60
+ color: theme.palette.text.secondary,
61
+ fontSize: "0.875rem",
62
+ marginTop: theme.spacing(0.5),
63
+ overflow: "hidden",
64
+ textOverflow: "ellipsis",
65
+ whiteSpace: "nowrap"
66
+ },
67
+ statsWrapper: {
68
+ display: "flex",
69
+ gap: theme.spacing(3),
70
+ marginLeft: theme.spacing(2),
71
+ alignItems: "center",
72
+ [theme.breakpoints.down("sm")]: {
73
+ display: "none"
74
+ }
75
+ },
76
+ statItem: {
77
+ display: "flex",
78
+ alignItems: "center",
79
+ gap: theme.spacing(0.5),
80
+ color: theme.palette.text.secondary
81
+ },
82
+ actions: {
83
+ display: "flex",
84
+ alignItems: "center",
85
+ marginLeft: theme.spacing(2),
86
+ gap: theme.spacing(1)
87
+ }
88
+ }));
89
+ const TagListItem = (props) => {
90
+ const { tag, onTagEdit, isModerator } = props;
91
+ const tagRoute = useRouteRef(tagRouteRef);
92
+ const { t } = useTranslationRef(qetaTranslationRef);
93
+ const classes = useStyles();
94
+ const listItemClasses = useListItemStyles();
95
+ const [anchorEl, setAnchorEl] = useState(null);
96
+ const handleMenuClick = (event) => {
97
+ event.preventDefault();
98
+ event.stopPropagation();
99
+ setAnchorEl(event.currentTarget);
100
+ };
101
+ const handleMenuClose = (_event, _reason) => {
102
+ setAnchorEl(null);
103
+ };
104
+ const [editModalOpen, setEditModalOpen] = useState(false);
105
+ const handleEditModalOpen = (event) => {
106
+ handleMenuClose();
107
+ setEditModalOpen(true);
108
+ };
109
+ const handleEditModalClose = () => {
110
+ setEditModalOpen(false);
111
+ onTagEdit();
112
+ };
113
+ const [deleteModalOpen, setDeleteModalOpen] = useState(false);
114
+ const handleDeleteModalOpen = (event) => {
115
+ handleMenuClose();
116
+ setDeleteModalOpen(true);
117
+ };
118
+ const handleDeleteModalClose = () => {
119
+ setDeleteModalOpen(false);
120
+ onTagEdit();
121
+ };
122
+ const href = tagRoute({ tag: tag.tag });
123
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
124
+ /* @__PURE__ */ jsxs(Link, { to: href, className: listItemClasses.root, children: [
125
+ /* @__PURE__ */ jsx(LocalOfferIcon, { className: classes.icon }),
126
+ /* @__PURE__ */ jsxs(Box, { className: classes.content, children: [
127
+ /* @__PURE__ */ jsx(Box, { className: classes.header, children: /* @__PURE__ */ jsx(Typography, { className: classes.tagName, children: tag.tag }) }),
128
+ tag.description && /* @__PURE__ */ jsx(Typography, { className: classes.description, children: DOMPurify.sanitize(
129
+ truncate(removeMarkdownFormatting(tag.description), 100)
130
+ ) })
131
+ ] }),
132
+ /* @__PURE__ */ jsxs(Box, { className: classes.statsWrapper, children: [
133
+ /* @__PURE__ */ jsx(Tooltip, { title: t("common.questions"), arrow: true, children: /* @__PURE__ */ jsxs("div", { className: classes.statItem, children: [
134
+ /* @__PURE__ */ jsx(QuestionAnswerIcon, { fontSize: "small" }),
135
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", children: tag.questionsCount })
136
+ ] }) }),
137
+ /* @__PURE__ */ jsx(Tooltip, { title: t("common.articles"), arrow: true, children: /* @__PURE__ */ jsxs("div", { className: classes.statItem, children: [
138
+ /* @__PURE__ */ jsx(DescriptionIcon, { fontSize: "small" }),
139
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", children: tag.articlesCount })
140
+ ] }) }),
141
+ /* @__PURE__ */ jsx(Tooltip, { title: t("common.links"), arrow: true, children: /* @__PURE__ */ jsxs("div", { className: classes.statItem, children: [
142
+ /* @__PURE__ */ jsx(LinkIcon, { fontSize: "small" }),
143
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", children: tag.linksCount })
144
+ ] }) }),
145
+ /* @__PURE__ */ jsx(Tooltip, { title: t("common.followersPlain"), arrow: true, children: /* @__PURE__ */ jsxs("div", { className: classes.statItem, children: [
146
+ /* @__PURE__ */ jsx(PeopleIcon, { fontSize: "small" }),
147
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", children: tag.followerCount })
148
+ ] }) })
149
+ ] }),
150
+ /* @__PURE__ */ jsxs(
151
+ Box,
152
+ {
153
+ className: classes.actions,
154
+ onClick: (e) => {
155
+ e.preventDefault();
156
+ e.stopPropagation();
157
+ },
158
+ children: [
159
+ /* @__PURE__ */ jsx(TagFollowButton, { tag: tag.tag }),
160
+ tag.canEdit || tag.canDelete ? /* @__PURE__ */ jsxs(Fragment, { children: [
161
+ /* @__PURE__ */ jsx(
162
+ IconButton,
163
+ {
164
+ "aria-label": "settings",
165
+ onClick: handleMenuClick,
166
+ size: "small",
167
+ children: /* @__PURE__ */ jsx(MoreVertIcon, {})
168
+ }
169
+ ),
170
+ /* @__PURE__ */ jsxs(
171
+ Menu,
172
+ {
173
+ id: "tag-menu",
174
+ anchorEl,
175
+ keepMounted: true,
176
+ open: Boolean(anchorEl),
177
+ onClose: handleMenuClose,
178
+ getContentAnchorEl: null,
179
+ anchorOrigin: {
180
+ vertical: "bottom",
181
+ horizontal: "right"
182
+ },
183
+ transformOrigin: {
184
+ vertical: "top",
185
+ horizontal: "right"
186
+ },
187
+ children: [
188
+ tag.canEdit && /* @__PURE__ */ jsxs(
189
+ MenuItem,
190
+ {
191
+ onClick: (e) => {
192
+ e.stopPropagation();
193
+ handleEditModalOpen();
194
+ },
195
+ children: [
196
+ /* @__PURE__ */ jsx(ListItemIcon, { style: { minWidth: "32px" }, children: /* @__PURE__ */ jsx(EditIcon, { fontSize: "small" }) }),
197
+ /* @__PURE__ */ jsx(ListItemText, { primary: t("tagButton.edit") })
198
+ ]
199
+ }
200
+ ),
201
+ tag.canDelete && /* @__PURE__ */ jsxs(
202
+ MenuItem,
203
+ {
204
+ onClick: (e) => {
205
+ e.stopPropagation();
206
+ handleDeleteModalOpen();
207
+ },
208
+ children: [
209
+ /* @__PURE__ */ jsx(ListItemIcon, { style: { minWidth: "32px" }, children: /* @__PURE__ */ jsx(DeleteIcon, { fontSize: "small" }) }),
210
+ /* @__PURE__ */ jsx(ListItemText, { primary: t("tagButton.delete") })
211
+ ]
212
+ }
213
+ )
214
+ ]
215
+ }
216
+ )
217
+ ] }) : null
218
+ ]
219
+ }
220
+ )
221
+ ] }),
222
+ /* @__PURE__ */ jsx(
223
+ EditTagModal,
224
+ {
225
+ tag,
226
+ open: editModalOpen,
227
+ onClose: handleEditModalClose,
228
+ isModerator
229
+ }
230
+ ),
231
+ /* @__PURE__ */ jsx(
232
+ DeleteModal,
233
+ {
234
+ open: deleteModalOpen,
235
+ onClose: handleDeleteModalClose,
236
+ entity: tag
237
+ }
238
+ )
239
+ ] });
240
+ };
241
+
242
+ export { TagListItem };
243
+ //# sourceMappingURL=TagListItem.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TagListItem.esm.js","sources":["../../../src/components/TagsContainer/TagListItem.tsx"],"sourcesContent":["import { useState } from 'react';\nimport {\n removeMarkdownFormatting,\n TagResponse,\n truncate,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { TagFollowButton } from '../Buttons/TagFollowButton';\nimport {\n Box,\n IconButton,\n ListItemIcon,\n ListItemText,\n makeStyles,\n Menu,\n MenuItem,\n Tooltip,\n Typography,\n} from '@material-ui/core';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport { tagRouteRef } from '../../routes';\nimport { EditTagModal } from './EditTagModal';\nimport DOMPurify from 'dompurify';\nimport { DeleteModal } from '../Modals';\nimport DeleteIcon from '@material-ui/icons/Delete';\nimport EditIcon from '@material-ui/icons/Edit';\nimport MoreVertIcon from '@material-ui/icons/MoreVert';\nimport LocalOfferIcon from '@material-ui/icons/LocalOffer';\nimport QuestionAnswerIcon from '@material-ui/icons/QuestionAnswer';\nimport PeopleIcon from '@material-ui/icons/People';\nimport LinkIcon from '@material-ui/icons/Link';\nimport DescriptionIcon from '@material-ui/icons/Description';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../../translation';\nimport { Link } from 'react-router-dom';\n\nimport { useListItemStyles } from '../../hooks';\n\nconst useStyles = makeStyles(theme => ({\n icon: {\n marginRight: theme.spacing(2),\n color: theme.palette.text.secondary,\n },\n content: {\n flex: 1,\n display: 'flex',\n flexDirection: 'column',\n minWidth: 0,\n },\n header: {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1),\n },\n tagName: {\n fontWeight: 600,\n fontSize: '1rem',\n },\n description: {\n color: theme.palette.text.secondary,\n fontSize: '0.875rem',\n marginTop: theme.spacing(0.5),\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n },\n statsWrapper: {\n display: 'flex',\n gap: theme.spacing(3),\n marginLeft: theme.spacing(2),\n alignItems: 'center',\n [theme.breakpoints.down('sm')]: {\n display: 'none',\n },\n },\n statItem: {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(0.5),\n color: theme.palette.text.secondary,\n },\n actions: {\n display: 'flex',\n alignItems: 'center',\n marginLeft: theme.spacing(2),\n gap: theme.spacing(1),\n },\n}));\n\nexport const TagListItem = (props: {\n tag: TagResponse;\n onTagEdit: () => void;\n isModerator?: boolean;\n}) => {\n const { tag, onTagEdit, isModerator } = props;\n const tagRoute = useRouteRef(tagRouteRef);\n const { t } = useTranslationRef(qetaTranslationRef);\n const classes = useStyles();\n const listItemClasses = useListItemStyles();\n\n const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);\n const handleMenuClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n setAnchorEl(event.currentTarget);\n };\n const handleMenuClose = (\n _event: {},\n _reason: 'backdropClick' | 'escapeKeyDown',\n ) => {\n setAnchorEl(null);\n };\n\n const [editModalOpen, setEditModalOpen] = useState(false);\n const handleEditModalOpen = (event: React.MouseEvent<HTMLElement>) => {\n handleMenuClose(event as any, 'backdropClick');\n setEditModalOpen(true);\n };\n const handleEditModalClose = () => {\n setEditModalOpen(false);\n onTagEdit();\n };\n\n const [deleteModalOpen, setDeleteModalOpen] = useState(false);\n const handleDeleteModalOpen = (event: React.MouseEvent<HTMLElement>) => {\n handleMenuClose(event as any, 'backdropClick');\n setDeleteModalOpen(true);\n };\n const handleDeleteModalClose = () => {\n setDeleteModalOpen(false);\n onTagEdit();\n };\n\n const href = tagRoute({ tag: tag.tag });\n\n return (\n <>\n <Link to={href} className={listItemClasses.root}>\n <LocalOfferIcon className={classes.icon} />\n <Box className={classes.content}>\n <Box className={classes.header}>\n <Typography className={classes.tagName}>{tag.tag}</Typography>\n </Box>\n {tag.description && (\n <Typography className={classes.description}>\n {DOMPurify.sanitize(\n truncate(removeMarkdownFormatting(tag.description), 100),\n )}\n </Typography>\n )}\n </Box>\n\n <Box className={classes.statsWrapper}>\n <Tooltip title={t('common.questions')} arrow>\n <div className={classes.statItem}>\n <QuestionAnswerIcon fontSize=\"small\" />\n <Typography variant=\"body2\">{tag.questionsCount}</Typography>\n </div>\n </Tooltip>\n <Tooltip title={t('common.articles')} arrow>\n <div className={classes.statItem}>\n <DescriptionIcon fontSize=\"small\" />\n <Typography variant=\"body2\">{tag.articlesCount}</Typography>\n </div>\n </Tooltip>\n <Tooltip title={t('common.links')} arrow>\n <div className={classes.statItem}>\n <LinkIcon fontSize=\"small\" />\n <Typography variant=\"body2\">{tag.linksCount}</Typography>\n </div>\n </Tooltip>\n <Tooltip title={t('common.followersPlain')} arrow>\n <div className={classes.statItem}>\n <PeopleIcon fontSize=\"small\" />\n <Typography variant=\"body2\">{tag.followerCount}</Typography>\n </div>\n </Tooltip>\n </Box>\n\n <Box\n className={classes.actions}\n onClick={e => {\n e.preventDefault();\n e.stopPropagation();\n }}\n >\n <TagFollowButton tag={tag.tag} />\n {tag.canEdit || tag.canDelete ? (\n <>\n <IconButton\n aria-label=\"settings\"\n onClick={handleMenuClick}\n size=\"small\"\n >\n <MoreVertIcon />\n </IconButton>\n <Menu\n id=\"tag-menu\"\n anchorEl={anchorEl}\n keepMounted\n open={Boolean(anchorEl)}\n onClose={handleMenuClose}\n getContentAnchorEl={null}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'right',\n }}\n transformOrigin={{\n vertical: 'top',\n horizontal: 'right',\n }}\n >\n {tag.canEdit && (\n <MenuItem\n onClick={e => {\n e.stopPropagation();\n handleEditModalOpen(e);\n }}\n >\n <ListItemIcon style={{ minWidth: '32px' }}>\n <EditIcon fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText primary={t('tagButton.edit')} />\n </MenuItem>\n )}\n {tag.canDelete && (\n <MenuItem\n onClick={e => {\n e.stopPropagation();\n handleDeleteModalOpen(e);\n }}\n >\n <ListItemIcon style={{ minWidth: '32px' }}>\n <DeleteIcon fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText primary={t('tagButton.delete')} />\n </MenuItem>\n )}\n </Menu>\n </>\n ) : null}\n </Box>\n </Link>\n <EditTagModal\n tag={tag}\n open={editModalOpen}\n onClose={handleEditModalClose}\n isModerator={isModerator}\n />\n <DeleteModal\n open={deleteModalOpen}\n onClose={handleDeleteModalClose}\n entity={tag}\n />\n </>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,86 @@
1
+ import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
2
+ import { useState } from 'react';
3
+ import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
4
+ import { qetaTranslationRef } from '../../translation.esm.js';
5
+ import { Button } from '@material-ui/core';
6
+ import Add from '@material-ui/icons/Add';
7
+ import { useIsModerator } from '../../hooks/useIsModerator.esm.js';
8
+ import { TagGridItem } from './TagGridItem.esm.js';
9
+ import { TagListItem } from './TagListItem.esm.js';
10
+ import { qetaCreateTagPermission } from '@drodil/backstage-plugin-qeta-common';
11
+ import { OptionalRequirePermission } from '../Utility/OptionalRequirePermission.esm.js';
12
+ import { CreateTagModal } from './CreateTagModal.esm.js';
13
+ import { QetaEntityContainer } from '../QetaEntityContainer/QetaEntityContainer.esm.js';
14
+
15
+ const TagsContainer = (props) => {
16
+ const { filterPanelProps, defaultView } = props;
17
+ const { t } = useTranslationRef(qetaTranslationRef);
18
+ const { isModerator } = useIsModerator();
19
+ const [createModalOpen, setCreateModalOpen] = useState(false);
20
+ const handleCreateModalOpen = () => setCreateModalOpen(true);
21
+ const handleCreateModalCloseWithRetry = (retry) => {
22
+ setCreateModalOpen(false);
23
+ retry();
24
+ };
25
+ return /* @__PURE__ */ jsx(
26
+ QetaEntityContainer,
27
+ {
28
+ prefix: "tags",
29
+ defaultPageSize: 24,
30
+ defaultView,
31
+ initialFilters: {
32
+ order: "desc",
33
+ orderBy: "postsCount",
34
+ searchQuery: ""
35
+ },
36
+ fetch: (api, limit, offset, filters) => {
37
+ return api.getTags({
38
+ limit,
39
+ offset,
40
+ searchQuery: filters.searchQuery
41
+ }).then((res) => ({ items: res.tags, total: res.total }));
42
+ },
43
+ filterPanelProps: {
44
+ ...filterPanelProps,
45
+ mode: "tags"
46
+ },
47
+ renderListItem: (tag, { retry }) => /* @__PURE__ */ jsx(TagListItem, { tag, onTagEdit: retry, isModerator }),
48
+ renderGridItem: (tag, { retry }) => /* @__PURE__ */ jsx(TagGridItem, { tag, onTagEdit: retry, isModerator }),
49
+ title: (total) => t("tagPage.tags", { count: total }),
50
+ searchPlaceholder: t("tagPage.search.label"),
51
+ emptyMessage: t("tagPage.tags", { count: 0 }),
52
+ getKey: (tag) => tag.tag,
53
+ headerButtons: ({ retry }) => /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsxs(
54
+ OptionalRequirePermission,
55
+ {
56
+ permission: qetaCreateTagPermission,
57
+ errorPage: /* @__PURE__ */ jsx(Fragment, {}),
58
+ children: [
59
+ /* @__PURE__ */ jsx(
60
+ Button,
61
+ {
62
+ variant: "outlined",
63
+ color: "primary",
64
+ startIcon: /* @__PURE__ */ jsx(Add, {}),
65
+ size: "small",
66
+ onClick: handleCreateModalOpen,
67
+ children: t("tagPage.createTag")
68
+ }
69
+ ),
70
+ /* @__PURE__ */ jsx(
71
+ CreateTagModal,
72
+ {
73
+ open: createModalOpen,
74
+ onClose: () => handleCreateModalCloseWithRetry(retry),
75
+ isModerator
76
+ }
77
+ )
78
+ ]
79
+ }
80
+ ) })
81
+ }
82
+ );
83
+ };
84
+
85
+ export { TagsContainer };
86
+ //# sourceMappingURL=TagsContainer.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TagsContainer.esm.js","sources":["../../../src/components/TagsContainer/TagsContainer.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../../translation';\nimport { Button } from '@material-ui/core';\nimport Add from '@material-ui/icons/Add';\nimport { useIsModerator } from '../../hooks/useIsModerator';\nimport { TagFilters, CommonFilterPanelProps } from '../FilterPanel/FilterPanel';\nimport { TagGridItem } from './TagGridItem';\nimport { TagListItem } from './TagListItem';\nimport {\n qetaCreateTagPermission,\n TagResponse,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { OptionalRequirePermission } from '../Utility/OptionalRequirePermission';\nimport { CreateTagModal } from './CreateTagModal';\nimport { QetaEntityContainer } from '../QetaEntityContainer/QetaEntityContainer';\nimport { ViewType } from '../ViewToggle/ViewToggle';\n\nexport const TagsContainer = (props: {\n filterPanelProps?: CommonFilterPanelProps;\n defaultView?: ViewType;\n}) => {\n const { filterPanelProps, defaultView } = props;\n const { t } = useTranslationRef(qetaTranslationRef);\n const { isModerator } = useIsModerator();\n const [createModalOpen, setCreateModalOpen] = useState(false);\n const handleCreateModalOpen = () => setCreateModalOpen(true);\n\n const handleCreateModalCloseWithRetry = (retry: () => void) => {\n setCreateModalOpen(false);\n retry();\n };\n\n return (\n <QetaEntityContainer<TagResponse, TagFilters>\n prefix=\"tags\"\n defaultPageSize={24}\n defaultView={defaultView}\n initialFilters={{\n order: 'desc',\n orderBy: 'postsCount',\n searchQuery: '',\n }}\n fetch={(api, limit, offset, filters) => {\n return api\n .getTags({\n limit,\n offset,\n searchQuery: filters.searchQuery,\n })\n .then(res => ({ items: res.tags, total: res.total }));\n }}\n filterPanelProps={{\n ...filterPanelProps,\n mode: 'tags',\n }}\n renderListItem={(tag, { retry }) => (\n <TagListItem tag={tag} onTagEdit={retry} isModerator={isModerator} />\n )}\n renderGridItem={(tag, { retry }) => (\n <TagGridItem tag={tag} onTagEdit={retry} isModerator={isModerator} />\n )}\n title={total => t('tagPage.tags', { count: total })}\n searchPlaceholder={t('tagPage.search.label')}\n emptyMessage={t('tagPage.tags', { count: 0 })}\n getKey={tag => tag.tag}\n headerButtons={({ retry }) => (\n <>\n <OptionalRequirePermission\n permission={qetaCreateTagPermission}\n errorPage={<></>}\n >\n <Button\n variant=\"outlined\"\n color=\"primary\"\n startIcon={<Add />}\n size=\"small\"\n onClick={handleCreateModalOpen}\n >\n {t('tagPage.createTag')}\n </Button>\n <CreateTagModal\n open={createModalOpen}\n onClose={() => handleCreateModalCloseWithRetry(retry)}\n isModerator={isModerator}\n />\n </OptionalRequirePermission>\n </>\n )}\n />\n );\n};\n"],"names":[],"mappings":"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"}
@@ -3,17 +3,22 @@ import { useState, useEffect } from 'react';
3
3
  import { useApi, alertApiRef } from '@backstage/core-plugin-api';
4
4
  import { qetaApiRef } from '../../api.esm.js';
5
5
  import 'react-use';
6
+ import '@backstage/plugin-signals-react';
7
+ import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
8
+ import { qetaTranslationRef } from '../../translation.esm.js';
9
+ import '../../hooks/useListItemStyles.esm.js';
6
10
  import { stringifyEntityRef } from '@backstage/catalog-model';
7
11
  import 'dataloader';
8
12
  import { catalogApiRef } from '@backstage/plugin-catalog-react';
9
- import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
10
- import { qetaTranslationRef } from '../../translation.esm.js';
11
13
  import 'react-use/lib/useAsync';
12
14
  import { useIsModerator } from '../../hooks/useIsModerator.esm.js';
13
15
  import '@backstage/plugin-permission-react';
14
16
  import '@drodil/backstage-plugin-qeta-common';
15
17
  import '@backstage/plugin-permission-common';
16
18
  import { TextField, Button } from '@material-ui/core';
19
+ import 'react-router-dom';
20
+ import 'react-use/lib/useDebounce';
21
+ import '../FilterPanel/FilterPanel.esm.js';
17
22
  import { useForm, Controller } from 'react-hook-form';
18
23
  import { compact } from 'lodash';
19
24
  import { MarkdownEditor } from '../MarkdownEditor/MarkdownEditor.esm.js';
@@ -1 +1 @@
1
- {"version":3,"file":"TemplateForm.esm.js","sources":["../../../src/components/TemplateList/TemplateForm.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport { useIsModerator } from '../../hooks';\nimport { QetaApi, TemplateRequest } from '@drodil/backstage-plugin-qeta-common';\nimport { alertApiRef, useApi } from '@backstage/core-plugin-api';\nimport { qetaApiRef } from '../../api';\nimport { Controller, useForm } from 'react-hook-form';\nimport { stringifyEntityRef } from '@backstage/catalog-model';\nimport { CatalogApi } from '@backstage/catalog-client';\nimport { compact } from 'lodash';\nimport { catalogApiRef } from '@backstage/plugin-catalog-react';\nimport { MarkdownEditor } from '../MarkdownEditor/MarkdownEditor';\nimport { TagInput } from '../PostForm/TagInput';\nimport { EntitiesInput } from '../PostForm/EntitiesInput';\nimport { TemplateFormValues } from '../PostForm/types';\nimport { Button, TextField } from '@material-ui/core';\nimport { Alert } from '@material-ui/lab';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../../translation.ts';\n\nconst formToRequest = (form: TemplateFormValues): TemplateRequest => {\n return {\n ...form,\n entities: form.entities?.map(stringifyEntityRef),\n };\n};\n\nconst getDefaultValues = (): TemplateFormValues => {\n return {\n title: '',\n description: '',\n tags: [],\n entities: [],\n };\n};\n\nconst getValues = async (\n api: QetaApi,\n catalogApi: CatalogApi,\n id?: string,\n): Promise<TemplateFormValues> => {\n if (!id) {\n return getDefaultValues();\n }\n\n const template = await api.getTemplate(id);\n const entities =\n template.entities && template.entities.length > 0\n ? await catalogApi.getEntitiesByRefs({\n entityRefs: template.entities,\n fields: [\n 'kind',\n 'metadata.name',\n 'metadata.namespace',\n 'metadata.title',\n ],\n })\n : [];\n return {\n title: template.title,\n description: template.description,\n questionTitle: template.questionTitle,\n questionContent: template.questionContent,\n tags: template.tags ?? [],\n entities: 'items' in entities ? compact(entities.items) : [],\n };\n};\n\nexport const TemplateForm = (props: { id?: number; onPost: () => void }) => {\n const { id, onPost } = props;\n const [posting, setPosting] = useState(false);\n const catalogApi = useApi(catalogApiRef);\n const qetaApi = useApi(qetaApiRef);\n const alertApi = useApi(alertApiRef);\n const [error, setError] = useState(false);\n const [values, setValues] = useState(getDefaultValues());\n const { isModerator } = useIsModerator();\n const { t } = useTranslationRef(qetaTranslationRef);\n const {\n register,\n handleSubmit,\n control,\n getValues: getFormValues,\n setValue,\n reset,\n formState: { errors },\n } = useForm<TemplateFormValues>({\n values,\n defaultValues: getDefaultValues(),\n });\n\n useEffect(() => {\n if (id) {\n getValues(qetaApi, catalogApi, id.toString(10))\n .catch(e =>\n alertApi.post({\n message: e.message,\n severity: 'error',\n display: 'transient',\n }),\n )\n .then(data => {\n if (data) {\n setValues(data);\n }\n });\n }\n }, [qetaApi, catalogApi, id, alertApi]);\n\n const postTemplate = (data: TemplateFormValues) => {\n setPosting(true);\n\n if (id) {\n qetaApi\n .updateTemplate(id, formToRequest(data))\n .then(_q => {\n reset();\n onPost();\n })\n .catch(e => {\n setError(true);\n alertApi.post({\n message: e.message,\n severity: 'error',\n display: 'transient',\n });\n })\n .finally(() => setPosting(false));\n return;\n }\n qetaApi\n .createTemplate(formToRequest(data))\n .then(q => {\n if (!q || !q.id) {\n setError(true);\n return;\n }\n reset();\n onPost();\n })\n .catch(e => {\n setError(true);\n alertApi.post({\n message: e.message,\n severity: 'error',\n display: 'transient',\n });\n })\n .finally(() => setPosting(false));\n };\n\n if (!isModerator) {\n return null;\n }\n\n return (\n <form onSubmit={handleSubmit(postTemplate)}>\n {error && (\n <Alert severity=\"error\">{t('templateList.errorPosting')}</Alert>\n )}\n <TextField\n label={t('templateList.titleInput.label')}\n className=\"qetaTemplateFormTitle\"\n required\n fullWidth\n error={'title' in errors}\n margin=\"normal\"\n variant=\"outlined\"\n helperText={t('templateList.titleInput.helperText')}\n FormHelperTextProps={{\n style: { marginLeft: '0.2em' },\n }}\n {\n // @ts-ignore\n ...register('title', { required: true, maxLength: 255 })\n }\n />\n\n <TextField\n label={t('templateList.descriptionInput.label')}\n className=\"qetaTemplateFormDescription\"\n required\n fullWidth\n error={'description' in errors}\n margin=\"normal\"\n variant=\"outlined\"\n helperText={t('templateList.descriptionInput.helperText')}\n FormHelperTextProps={{\n style: { marginLeft: '0.2em' },\n }}\n {\n // @ts-ignore\n ...register('description', { required: true, maxLength: 255 })\n }\n />\n\n <TextField\n label={t('templateList.questionTitleInput.label')}\n className=\"qetaTemplateFormQuestionTitle\"\n fullWidth\n error={'questionTitle' in errors}\n margin=\"normal\"\n variant=\"outlined\"\n FormHelperTextProps={{\n style: { marginLeft: '0.2em' },\n }}\n helperText={t('templateList.questionTitleInput.helperText')}\n {\n // @ts-ignore\n ...register('questionTitle', { maxLength: 255 })\n }\n />\n\n <Controller\n control={control}\n rules={{}}\n render={({ field: { onChange, value } }) => (\n <MarkdownEditor\n value={value ?? ''}\n disableAttachments\n onChange={onChange}\n height={400}\n error={'questionContent' in errors}\n placeholder={t('templateList.questionContentInput.placeholder')}\n onTagsChange={tags => {\n const existing = getFormValues('tags') ?? [];\n const newTags = [...new Set([...existing, ...tags])];\n setValue('tags', newTags, { shouldValidate: true });\n }}\n />\n )}\n name=\"questionContent\"\n />\n <Controller\n control={control}\n render={({\n field: { onChange, value },\n fieldState: { error: tagError },\n }) => <TagInput value={value} onChange={onChange} error={tagError} />}\n name=\"tags\"\n />\n <Controller\n control={control}\n render={({ field: { onChange, value } }) => (\n <EntitiesInput value={value} onChange={onChange} />\n )}\n name=\"entities\"\n />\n <Button\n color=\"primary\"\n type=\"submit\"\n variant=\"contained\"\n disabled={posting}\n >\n {id\n ? t('templateList.submit.existingTemplate')\n : t('templateList.submit.newTemplate')}\n </Button>\n </form>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TemplateForm.esm.js","sources":["../../../src/components/TemplateList/TemplateForm.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport { useIsModerator } from '../../hooks';\nimport { QetaApi, TemplateRequest } from '@drodil/backstage-plugin-qeta-common';\nimport { alertApiRef, useApi } from '@backstage/core-plugin-api';\nimport { qetaApiRef } from '../../api';\nimport { Controller, useForm } from 'react-hook-form';\nimport { stringifyEntityRef } from '@backstage/catalog-model';\nimport { CatalogApi } from '@backstage/catalog-client';\nimport { compact } from 'lodash';\nimport { catalogApiRef } from '@backstage/plugin-catalog-react';\nimport { MarkdownEditor } from '../MarkdownEditor/MarkdownEditor';\nimport { TagInput } from '../PostForm/TagInput';\nimport { EntitiesInput } from '../PostForm/EntitiesInput';\nimport { TemplateFormValues } from '../PostForm/types';\nimport { Button, TextField } from '@material-ui/core';\nimport { Alert } from '@material-ui/lab';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../../translation.ts';\n\nconst formToRequest = (form: TemplateFormValues): TemplateRequest => {\n return {\n ...form,\n entities: form.entities?.map(stringifyEntityRef),\n };\n};\n\nconst getDefaultValues = (): TemplateFormValues => {\n return {\n title: '',\n description: '',\n tags: [],\n entities: [],\n };\n};\n\nconst getValues = async (\n api: QetaApi,\n catalogApi: CatalogApi,\n id?: string,\n): Promise<TemplateFormValues> => {\n if (!id) {\n return getDefaultValues();\n }\n\n const template = await api.getTemplate(id);\n const entities =\n template.entities && template.entities.length > 0\n ? await catalogApi.getEntitiesByRefs({\n entityRefs: template.entities,\n fields: [\n 'kind',\n 'metadata.name',\n 'metadata.namespace',\n 'metadata.title',\n ],\n })\n : [];\n return {\n title: template.title,\n description: template.description,\n questionTitle: template.questionTitle,\n questionContent: template.questionContent,\n tags: template.tags ?? [],\n entities: 'items' in entities ? compact(entities.items) : [],\n };\n};\n\nexport const TemplateForm = (props: { id?: number; onPost: () => void }) => {\n const { id, onPost } = props;\n const [posting, setPosting] = useState(false);\n const catalogApi = useApi(catalogApiRef);\n const qetaApi = useApi(qetaApiRef);\n const alertApi = useApi(alertApiRef);\n const [error, setError] = useState(false);\n const [values, setValues] = useState(getDefaultValues());\n const { isModerator } = useIsModerator();\n const { t } = useTranslationRef(qetaTranslationRef);\n const {\n register,\n handleSubmit,\n control,\n getValues: getFormValues,\n setValue,\n reset,\n formState: { errors },\n } = useForm<TemplateFormValues>({\n values,\n defaultValues: getDefaultValues(),\n });\n\n useEffect(() => {\n if (id) {\n getValues(qetaApi, catalogApi, id.toString(10))\n .catch(e =>\n alertApi.post({\n message: e.message,\n severity: 'error',\n display: 'transient',\n }),\n )\n .then(data => {\n if (data) {\n setValues(data);\n }\n });\n }\n }, [qetaApi, catalogApi, id, alertApi]);\n\n const postTemplate = (data: TemplateFormValues) => {\n setPosting(true);\n\n if (id) {\n qetaApi\n .updateTemplate(id, formToRequest(data))\n .then(_q => {\n reset();\n onPost();\n })\n .catch(e => {\n setError(true);\n alertApi.post({\n message: e.message,\n severity: 'error',\n display: 'transient',\n });\n })\n .finally(() => setPosting(false));\n return;\n }\n qetaApi\n .createTemplate(formToRequest(data))\n .then(q => {\n if (!q || !q.id) {\n setError(true);\n return;\n }\n reset();\n onPost();\n })\n .catch(e => {\n setError(true);\n alertApi.post({\n message: e.message,\n severity: 'error',\n display: 'transient',\n });\n })\n .finally(() => setPosting(false));\n };\n\n if (!isModerator) {\n return null;\n }\n\n return (\n <form onSubmit={handleSubmit(postTemplate)}>\n {error && (\n <Alert severity=\"error\">{t('templateList.errorPosting')}</Alert>\n )}\n <TextField\n label={t('templateList.titleInput.label')}\n className=\"qetaTemplateFormTitle\"\n required\n fullWidth\n error={'title' in errors}\n margin=\"normal\"\n variant=\"outlined\"\n helperText={t('templateList.titleInput.helperText')}\n FormHelperTextProps={{\n style: { marginLeft: '0.2em' },\n }}\n {\n // @ts-ignore\n ...register('title', { required: true, maxLength: 255 })\n }\n />\n\n <TextField\n label={t('templateList.descriptionInput.label')}\n className=\"qetaTemplateFormDescription\"\n required\n fullWidth\n error={'description' in errors}\n margin=\"normal\"\n variant=\"outlined\"\n helperText={t('templateList.descriptionInput.helperText')}\n FormHelperTextProps={{\n style: { marginLeft: '0.2em' },\n }}\n {\n // @ts-ignore\n ...register('description', { required: true, maxLength: 255 })\n }\n />\n\n <TextField\n label={t('templateList.questionTitleInput.label')}\n className=\"qetaTemplateFormQuestionTitle\"\n fullWidth\n error={'questionTitle' in errors}\n margin=\"normal\"\n variant=\"outlined\"\n FormHelperTextProps={{\n style: { marginLeft: '0.2em' },\n }}\n helperText={t('templateList.questionTitleInput.helperText')}\n {\n // @ts-ignore\n ...register('questionTitle', { maxLength: 255 })\n }\n />\n\n <Controller\n control={control}\n rules={{}}\n render={({ field: { onChange, value } }) => (\n <MarkdownEditor\n value={value ?? ''}\n disableAttachments\n onChange={onChange}\n height={400}\n error={'questionContent' in errors}\n placeholder={t('templateList.questionContentInput.placeholder')}\n onTagsChange={tags => {\n const existing = getFormValues('tags') ?? [];\n const newTags = [...new Set([...existing, ...tags])];\n setValue('tags', newTags, { shouldValidate: true });\n }}\n />\n )}\n name=\"questionContent\"\n />\n <Controller\n control={control}\n render={({\n field: { onChange, value },\n fieldState: { error: tagError },\n }) => <TagInput value={value} onChange={onChange} error={tagError} />}\n name=\"tags\"\n />\n <Controller\n control={control}\n render={({ field: { onChange, value } }) => (\n <EntitiesInput value={value} onChange={onChange} />\n )}\n name=\"entities\"\n />\n <Button\n color=\"primary\"\n type=\"submit\"\n variant=\"contained\"\n disabled={posting}\n >\n {id\n ? t('templateList.submit.existingTemplate')\n : t('templateList.submit.newTemplate')}\n </Button>\n </form>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -3,22 +3,26 @@ import { useQetaApi } from '../../hooks/useQetaApi.esm.js';
3
3
  import { useState, useEffect } from 'react';
4
4
  import { useApi } from '@backstage/core-plugin-api';
5
5
  import { qetaApiRef } from '../../api.esm.js';
6
+ import '@backstage/plugin-signals-react';
7
+ import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
8
+ import { qetaTranslationRef } from '../../translation.esm.js';
9
+ import '../../hooks/useListItemStyles.esm.js';
6
10
  import '@backstage/catalog-model';
7
11
  import 'dataloader';
8
12
  import '@backstage/plugin-catalog-react';
9
- import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
10
- import { qetaTranslationRef } from '../../translation.esm.js';
11
13
  import 'react-use/lib/useAsync';
12
14
  import { useIsModerator } from '../../hooks/useIsModerator.esm.js';
13
15
  import '@backstage/plugin-permission-react';
14
16
  import '@drodil/backstage-plugin-qeta-common';
15
17
  import '@backstage/plugin-permission-common';
16
18
  import { Button, Box, List, ListItem, ListItemText, ListItemSecondaryAction, IconButton } from '@material-ui/core';
19
+ import { useNavigate } from 'react-router-dom';
20
+ import 'react-use/lib/useDebounce';
21
+ import '../FilterPanel/FilterPanel.esm.js';
17
22
  import { Progress, WarningPanel } from '@backstage/core-components';
18
23
  import EditIcon from '@material-ui/icons/Edit';
19
24
  import DeleteIcon from '@material-ui/icons/Delete';
20
25
  import { TemplateForm } from './TemplateForm.esm.js';
21
- import { useNavigate } from 'react-router-dom';
22
26
  import { useLocation } from 'react-use';
23
27
 
24
28
  const TemplateList = () => {
@@ -1 +1 @@
1
- {"version":3,"file":"TemplateList.esm.js","sources":["../../../src/components/TemplateList/TemplateList.tsx"],"sourcesContent":["import { useIsModerator, useQetaApi } from '../../hooks';\nimport { Progress, WarningPanel } from '@backstage/core-components';\nimport { useEffect, useState } from 'react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport EditIcon from '@material-ui/icons/Edit';\nimport { qetaApiRef } from '../../api';\nimport DeleteIcon from '@material-ui/icons/Delete';\nimport { TemplateForm } from './TemplateForm';\nimport { useNavigate } from 'react-router-dom';\nimport { useLocation } from 'react-use';\nimport {\n Box,\n Button,\n IconButton,\n List,\n ListItem,\n ListItemSecondaryAction,\n ListItemText,\n} from '@material-ui/core';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../../translation.ts';\n\nexport const TemplateList = () => {\n const { isModerator } = useIsModerator();\n\n const [mode, setMode] = useState<'list' | 'create' | 'edit'>('list');\n const [id, setId] = useState<number | undefined>(undefined);\n const qetaApi = useApi(qetaApiRef);\n const navigate = useNavigate();\n const { hash } = useLocation();\n const { value, loading, error, retry } = useQetaApi(api =>\n api.getTemplates(),\n );\n const { t } = useTranslationRef(qetaTranslationRef);\n\n useEffect(() => {\n const [, hashMode] = (hash ?? '').split(':');\n if (hashMode === 'new') {\n setMode('create');\n } else {\n const hashId = parseInt(hashMode, 10);\n if (!isNaN(hashId)) {\n setId(hashId);\n setMode('edit');\n } else {\n setMode('list');\n }\n }\n }, [hash]);\n\n if (!isModerator) {\n return null;\n }\n\n const onDelete = (templateId: number) => {\n qetaApi.deleteTemplate(templateId).then(() => retry());\n };\n\n if (loading) {\n return <Progress />;\n }\n\n if (error || value === undefined) {\n return (\n <WarningPanel severity=\"error\" title={t('templateList.errorLoading')}>\n {error?.message}\n </WarningPanel>\n );\n }\n\n if (mode === 'create' || mode === 'edit') {\n return (\n <TemplateForm\n onPost={() => {\n retry();\n navigate('#template:list');\n }}\n id={id}\n />\n );\n }\n\n return (\n <>\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={() => {\n navigate('#template:new');\n }}\n >\n Create New Template\n </Button>\n <Box\n sx={{ width: '100%', bgcolor: 'background.paper', marginTop: '1em' }}\n >\n <List style={{ width: '100%' }}>\n {value.total === 0 && (\n <ListItem>\n <ListItemText\n primary={t('templateList.noTemplates')}\n secondary={t('templateList.noTemplatesDescription')}\n />\n </ListItem>\n )}\n {value.templates.map((template, index) => (\n <ListItem key={index}>\n <ListItemText\n primary={template.title}\n secondary={template.description}\n />\n <ListItemSecondaryAction>\n <IconButton\n onClick={() => {\n navigate(`#template:${template.id}`);\n }}\n >\n <EditIcon />\n </IconButton>\n <IconButton onClick={() => onDelete(template.id)}>\n <DeleteIcon />\n </IconButton>\n </ListItemSecondaryAction>\n </ListItem>\n ))}\n </List>\n </Box>\n </>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAsBO,MAAM,eAAe,MAAM;AAChC,EAAM,MAAA,EAAE,WAAY,EAAA,GAAI,cAAe,EAAA;AAEvC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAqC,MAAM,CAAA;AACnE,EAAA,MAAM,CAAC,EAAA,EAAI,KAAK,CAAA,GAAI,SAA6B,KAAS,CAAA,CAAA;AAC1D,EAAM,MAAA,OAAA,GAAU,OAAO,UAAU,CAAA;AACjC,EAAA,MAAM,WAAW,WAAY,EAAA;AAC7B,EAAM,MAAA,EAAE,IAAK,EAAA,GAAI,WAAY,EAAA;AAC7B,EAAA,MAAM,EAAE,KAAA,EAAO,OAAS,EAAA,KAAA,EAAO,OAAU,GAAA,UAAA;AAAA,IAAW,CAAA,GAAA,KAClD,IAAI,YAAa;AAAA,GACnB;AACA,EAAA,MAAM,EAAE,CAAA,EAAM,GAAA,iBAAA,CAAkB,kBAAkB,CAAA;AAElD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,GAAG,QAAQ,KAAK,IAAQ,IAAA,EAAA,EAAI,MAAM,GAAG,CAAA;AAC3C,IAAA,IAAI,aAAa,KAAO,EAAA;AACtB,MAAA,OAAA,CAAQ,QAAQ,CAAA;AAAA,KACX,MAAA;AACL,MAAM,MAAA,MAAA,GAAS,QAAS,CAAA,QAAA,EAAU,EAAE,CAAA;AACpC,MAAI,IAAA,CAAC,KAAM,CAAA,MAAM,CAAG,EAAA;AAClB,QAAA,KAAA,CAAM,MAAM,CAAA;AACZ,QAAA,OAAA,CAAQ,MAAM,CAAA;AAAA,OACT,MAAA;AACL,QAAA,OAAA,CAAQ,MAAM,CAAA;AAAA;AAChB;AACF,GACF,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,IAAI,CAAC,WAAa,EAAA;AAChB,IAAO,OAAA,IAAA;AAAA;AAGT,EAAM,MAAA,QAAA,GAAW,CAAC,UAAuB,KAAA;AACvC,IAAA,OAAA,CAAQ,eAAe,UAAU,CAAA,CAAE,IAAK,CAAA,MAAM,OAAO,CAAA;AAAA,GACvD;AAEA,EAAA,IAAI,OAAS,EAAA;AACX,IAAA,2BAAQ,QAAS,EAAA,EAAA,CAAA;AAAA;AAGnB,EAAI,IAAA,KAAA,IAAS,UAAU,KAAW,CAAA,EAAA;AAChC,IACE,uBAAA,GAAA,CAAC,gBAAa,QAAS,EAAA,OAAA,EAAQ,OAAO,CAAE,CAAA,2BAA2B,CAChE,EAAA,QAAA,EAAA,KAAA,EAAO,OACV,EAAA,CAAA;AAAA;AAIJ,EAAI,IAAA,IAAA,KAAS,QAAY,IAAA,IAAA,KAAS,MAAQ,EAAA;AACxC,IACE,uBAAA,GAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,QAAQ,MAAM;AACZ,UAAM,KAAA,EAAA;AACN,UAAA,QAAA,CAAS,gBAAgB,CAAA;AAAA,SAC3B;AAAA,QACA;AAAA;AAAA,KACF;AAAA;AAIJ,EAAA,uBAEI,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,OAAQ,EAAA,WAAA;AAAA,QACR,KAAM,EAAA,SAAA;AAAA,QACN,SAAS,MAAM;AACb,UAAA,QAAA,CAAS,eAAe,CAAA;AAAA,SAC1B;AAAA,QACD,QAAA,EAAA;AAAA;AAAA,KAED;AAAA,oBACA,GAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACC,IAAI,EAAE,KAAA,EAAO,QAAQ,OAAS,EAAA,kBAAA,EAAoB,WAAW,KAAM,EAAA;AAAA,QAEnE,+BAAC,IAAK,EAAA,EAAA,KAAA,EAAO,EAAE,KAAA,EAAO,QACnB,EAAA,QAAA,EAAA;AAAA,UAAM,KAAA,CAAA,KAAA,KAAU,CACf,oBAAA,GAAA,CAAC,QACC,EAAA,EAAA,QAAA,kBAAA,GAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,EAAE,0BAA0B,CAAA;AAAA,cACrC,SAAA,EAAW,EAAE,qCAAqC;AAAA;AAAA,WAEtD,EAAA,CAAA;AAAA,UAED,MAAM,SAAU,CAAA,GAAA,CAAI,CAAC,QAAU,EAAA,KAAA,0BAC7B,QACC,EAAA,EAAA,QAAA,EAAA;AAAA,4BAAA,GAAA;AAAA,cAAC,YAAA;AAAA,cAAA;AAAA,gBACC,SAAS,QAAS,CAAA,KAAA;AAAA,gBAClB,WAAW,QAAS,CAAA;AAAA;AAAA,aACtB;AAAA,iCACC,uBACC,EAAA,EAAA,QAAA,EAAA;AAAA,8BAAA,GAAA;AAAA,gBAAC,UAAA;AAAA,gBAAA;AAAA,kBACC,SAAS,MAAM;AACb,oBAAS,QAAA,CAAA,CAAA,UAAA,EAAa,QAAS,CAAA,EAAE,CAAE,CAAA,CAAA;AAAA,mBACrC;AAAA,kBAEA,8BAAC,QAAS,EAAA,EAAA;AAAA;AAAA,eACZ;AAAA,8BACA,GAAA,CAAC,UAAW,EAAA,EAAA,OAAA,EAAS,MAAM,QAAA,CAAS,SAAS,EAAE,CAAA,EAC7C,QAAC,kBAAA,GAAA,CAAA,UAAA,EAAA,EAAW,CACd,EAAA;AAAA,aACF,EAAA;AAAA,WAAA,EAAA,EAhBa,KAiBf,CACD;AAAA,SACH,EAAA;AAAA;AAAA;AACF,GACF,EAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"TemplateList.esm.js","sources":["../../../src/components/TemplateList/TemplateList.tsx"],"sourcesContent":["import { useIsModerator, useQetaApi } from '../../hooks';\nimport { Progress, WarningPanel } from '@backstage/core-components';\nimport { useEffect, useState } from 'react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport EditIcon from '@material-ui/icons/Edit';\nimport { qetaApiRef } from '../../api';\nimport DeleteIcon from '@material-ui/icons/Delete';\nimport { TemplateForm } from './TemplateForm';\nimport { useNavigate } from 'react-router-dom';\nimport { useLocation } from 'react-use';\nimport {\n Box,\n Button,\n IconButton,\n List,\n ListItem,\n ListItemSecondaryAction,\n ListItemText,\n} from '@material-ui/core';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../../translation.ts';\n\nexport const TemplateList = () => {\n const { isModerator } = useIsModerator();\n\n const [mode, setMode] = useState<'list' | 'create' | 'edit'>('list');\n const [id, setId] = useState<number | undefined>(undefined);\n const qetaApi = useApi(qetaApiRef);\n const navigate = useNavigate();\n const { hash } = useLocation();\n const { value, loading, error, retry } = useQetaApi(api =>\n api.getTemplates(),\n );\n const { t } = useTranslationRef(qetaTranslationRef);\n\n useEffect(() => {\n const [, hashMode] = (hash ?? '').split(':');\n if (hashMode === 'new') {\n setMode('create');\n } else {\n const hashId = parseInt(hashMode, 10);\n if (!isNaN(hashId)) {\n setId(hashId);\n setMode('edit');\n } else {\n setMode('list');\n }\n }\n }, [hash]);\n\n if (!isModerator) {\n return null;\n }\n\n const onDelete = (templateId: number) => {\n qetaApi.deleteTemplate(templateId).then(() => retry());\n };\n\n if (loading) {\n return <Progress />;\n }\n\n if (error || value === undefined) {\n return (\n <WarningPanel severity=\"error\" title={t('templateList.errorLoading')}>\n {error?.message}\n </WarningPanel>\n );\n }\n\n if (mode === 'create' || mode === 'edit') {\n return (\n <TemplateForm\n onPost={() => {\n retry();\n navigate('#template:list');\n }}\n id={id}\n />\n );\n }\n\n return (\n <>\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={() => {\n navigate('#template:new');\n }}\n >\n Create New Template\n </Button>\n <Box\n sx={{ width: '100%', bgcolor: 'background.paper', marginTop: '1em' }}\n >\n <List style={{ width: '100%' }}>\n {value.total === 0 && (\n <ListItem>\n <ListItemText\n primary={t('templateList.noTemplates')}\n secondary={t('templateList.noTemplatesDescription')}\n />\n </ListItem>\n )}\n {value.templates.map((template, index) => (\n <ListItem key={index}>\n <ListItemText\n primary={template.title}\n secondary={template.description}\n />\n <ListItemSecondaryAction>\n <IconButton\n onClick={() => {\n navigate(`#template:${template.id}`);\n }}\n >\n <EditIcon />\n </IconButton>\n <IconButton onClick={() => onDelete(template.id)}>\n <DeleteIcon />\n </IconButton>\n </ListItemSecondaryAction>\n </ListItem>\n ))}\n </List>\n </Box>\n </>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -10,11 +10,15 @@ import { UserLink } from '../Links/Links.esm.js';
10
10
  import '../../api.esm.js';
11
11
  import 'react-use';
12
12
  import 'react';
13
+ import '@backstage/plugin-signals-react';
14
+ import '../../hooks/useListItemStyles.esm.js';
13
15
  import { useUserInfo } from '../../hooks/useEntityAuthor.esm.js';
14
16
  import 'react-use/lib/useAsync';
15
17
  import '@backstage/plugin-permission-react';
16
18
  import '@drodil/backstage-plugin-qeta-common';
17
19
  import '@backstage/plugin-permission-common';
20
+ import 'react-use/lib/useDebounce';
21
+ import '../FilterPanel/FilterPanel.esm.js';
18
22
 
19
23
  const useStyles = makeStyles((theme) => ({
20
24
  root: {
@@ -1 +1 @@
1
- {"version":3,"file":"TimelineItem.esm.js","sources":["../../../src/components/Timeline/TimelineItem.tsx"],"sourcesContent":["import { TimelineItem } from '@drodil/backstage-plugin-qeta-common';\nimport {\n ListItem,\n ListItemAvatar,\n ListItemText,\n Avatar,\n makeStyles,\n} from '@material-ui/core';\nimport { Link as RouterLink } from 'react-router-dom';\n\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport {\n questionRouteRef,\n articleRouteRef,\n linkRouteRef,\n collectionRouteRef,\n} from '../../routes';\nimport { RelativeTimeWithTooltip } from '../RelativeTimeWithTooltip';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../../translation';\nimport { UserLink } from '../Links';\n\nimport { useUserInfo } from '../../hooks';\n\nconst useStyles = makeStyles(theme => ({\n root: {\n width: '100%',\n padding: theme.spacing(1, 1.5),\n marginBottom: 0,\n borderBottom: `1px solid ${theme.palette.divider}`,\n borderRadius: theme.shape.borderRadius,\n transition: 'background-color 0.15s ease-in-out',\n position: 'relative',\n cursor: 'pointer',\n '&:hover': {\n backgroundColor: theme.palette.action.hover,\n },\n '&:last-child': {\n borderBottom: 'none',\n },\n },\n overlayLink: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 0,\n },\n contentWrapper: {\n pointerEvents: 'none',\n },\n contentClickable: {\n position: 'relative',\n zIndex: 1,\n pointerEvents: 'auto',\n },\n inline: {\n display: 'inline',\n },\n avatar: {\n minWidth: '36px',\n },\n text: {\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n },\n link: {\n fontWeight: 'bold',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n maxWidth: '450px',\n display: 'inline-block',\n verticalAlign: 'bottom',\n },\n action: {\n opacity: 0.8,\n },\n time: {\n opacity: 0.6,\n fontSize: '0.8em',\n marginLeft: 'auto',\n },\n}));\n\nexport const TimelineItemCard = ({ item }: { item: TimelineItem }) => {\n const classes = useStyles();\n const { t } = useTranslationRef(qetaTranslationRef);\n const questionRoute = useRouteRef(questionRouteRef);\n const articleRoute = useRouteRef(articleRouteRef);\n const linkRoute = useRouteRef(linkRouteRef);\n const collectionRoute = useRouteRef(collectionRouteRef);\n const { user } = useUserInfo(item.author);\n\n let title = item.title;\n let link: string = '';\n let action: string = '';\n\n if (item.type === 'post') {\n const postType = item.postType || 'question';\n const isUpdated = item.action === 'updated';\n if (postType === 'article') {\n link = articleRoute({ id: item.id.toString() });\n action = isUpdated\n ? t('timeline.updatedArticle')\n : t('timeline.postedArticle');\n } else if (postType === 'link') {\n link = linkRoute({ id: item.id.toString() });\n action = isUpdated ? t('timeline.updatedLink') : t('timeline.postedLink');\n } else {\n link = questionRoute({ id: item.id.toString() });\n action = isUpdated\n ? t('timeline.updatedQuestion')\n : t('timeline.postedQuestion');\n }\n } else if (item.type === 'answer') {\n link = `${questionRoute({ id: item.postId.toString() })}#answer_${item.id}`;\n title = item.postTitle;\n action = t('timeline.answered');\n } else if (item.type === 'comment') {\n title = item.postTitle;\n const postType = item.postType || 'question';\n if (postType === 'article') {\n link = articleRoute({ id: item.postId.toString() });\n action = t('timeline.commentedOnArticle');\n } else if (postType === 'link') {\n link = linkRoute({ id: item.postId.toString() });\n action = t('timeline.commentedOnLink');\n } else {\n link = questionRoute({ id: item.postId.toString() });\n action = t('timeline.commentedOnQuestion');\n }\n } else if (item.type === 'collection') {\n link = collectionRoute({ id: item.id.toString() });\n action = t('timeline.createdCollection');\n }\n\n return (\n <ListItem alignItems=\"center\" className={classes.root} dense>\n <RouterLink\n to={link}\n className={classes.overlayLink}\n aria-label={title}\n />\n <ListItemAvatar className={`${classes.avatar} ${classes.contentWrapper}`}>\n <Avatar\n alt={item.author}\n src={item.headerImage || user?.spec?.profile?.picture}\n style={{ width: '26px', height: '26px', fontSize: '14px' }}\n />\n </ListItemAvatar>\n <ListItemText\n className={classes.contentWrapper}\n primary={\n <div className={classes.text}>\n <span className={classes.contentClickable}>\n <UserLink entityRef={item.author} />\n </span>\n <span className={classes.action}>{action}</span>\n <span className={classes.link}>{title}</span>\n <span className={classes.time}>\n <RelativeTimeWithTooltip value={item.date} />\n </span>\n </div>\n }\n />\n </ListItem>\n );\n};\n"],"names":["RouterLink"],"mappings":"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"}
1
+ {"version":3,"file":"TimelineItem.esm.js","sources":["../../../src/components/Timeline/TimelineItem.tsx"],"sourcesContent":["import { TimelineItem } from '@drodil/backstage-plugin-qeta-common';\nimport {\n ListItem,\n ListItemAvatar,\n ListItemText,\n Avatar,\n makeStyles,\n} from '@material-ui/core';\nimport { Link as RouterLink } from 'react-router-dom';\n\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport {\n questionRouteRef,\n articleRouteRef,\n linkRouteRef,\n collectionRouteRef,\n} from '../../routes';\nimport { RelativeTimeWithTooltip } from '../RelativeTimeWithTooltip';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../../translation';\nimport { UserLink } from '../Links';\n\nimport { useUserInfo } from '../../hooks';\n\nconst useStyles = makeStyles(theme => ({\n root: {\n width: '100%',\n padding: theme.spacing(1, 1.5),\n marginBottom: 0,\n borderBottom: `1px solid ${theme.palette.divider}`,\n borderRadius: theme.shape.borderRadius,\n transition: 'background-color 0.15s ease-in-out',\n position: 'relative',\n cursor: 'pointer',\n '&:hover': {\n backgroundColor: theme.palette.action.hover,\n },\n '&:last-child': {\n borderBottom: 'none',\n },\n },\n overlayLink: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 0,\n },\n contentWrapper: {\n pointerEvents: 'none',\n },\n contentClickable: {\n position: 'relative',\n zIndex: 1,\n pointerEvents: 'auto',\n },\n inline: {\n display: 'inline',\n },\n avatar: {\n minWidth: '36px',\n },\n text: {\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n },\n link: {\n fontWeight: 'bold',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n maxWidth: '450px',\n display: 'inline-block',\n verticalAlign: 'bottom',\n },\n action: {\n opacity: 0.8,\n },\n time: {\n opacity: 0.6,\n fontSize: '0.8em',\n marginLeft: 'auto',\n },\n}));\n\nexport const TimelineItemCard = ({ item }: { item: TimelineItem }) => {\n const classes = useStyles();\n const { t } = useTranslationRef(qetaTranslationRef);\n const questionRoute = useRouteRef(questionRouteRef);\n const articleRoute = useRouteRef(articleRouteRef);\n const linkRoute = useRouteRef(linkRouteRef);\n const collectionRoute = useRouteRef(collectionRouteRef);\n const { user } = useUserInfo(item.author);\n\n let title = item.title;\n let link: string = '';\n let action: string = '';\n\n if (item.type === 'post') {\n const postType = item.postType || 'question';\n const isUpdated = item.action === 'updated';\n if (postType === 'article') {\n link = articleRoute({ id: item.id.toString() });\n action = isUpdated\n ? t('timeline.updatedArticle')\n : t('timeline.postedArticle');\n } else if (postType === 'link') {\n link = linkRoute({ id: item.id.toString() });\n action = isUpdated ? t('timeline.updatedLink') : t('timeline.postedLink');\n } else {\n link = questionRoute({ id: item.id.toString() });\n action = isUpdated\n ? t('timeline.updatedQuestion')\n : t('timeline.postedQuestion');\n }\n } else if (item.type === 'answer') {\n link = `${questionRoute({ id: item.postId.toString() })}#answer_${item.id}`;\n title = item.postTitle;\n action = t('timeline.answered');\n } else if (item.type === 'comment') {\n title = item.postTitle;\n const postType = item.postType || 'question';\n if (postType === 'article') {\n link = articleRoute({ id: item.postId.toString() });\n action = t('timeline.commentedOnArticle');\n } else if (postType === 'link') {\n link = linkRoute({ id: item.postId.toString() });\n action = t('timeline.commentedOnLink');\n } else {\n link = questionRoute({ id: item.postId.toString() });\n action = t('timeline.commentedOnQuestion');\n }\n } else if (item.type === 'collection') {\n link = collectionRoute({ id: item.id.toString() });\n action = t('timeline.createdCollection');\n }\n\n return (\n <ListItem alignItems=\"center\" className={classes.root} dense>\n <RouterLink\n to={link}\n className={classes.overlayLink}\n aria-label={title}\n />\n <ListItemAvatar className={`${classes.avatar} ${classes.contentWrapper}`}>\n <Avatar\n alt={item.author}\n src={item.headerImage || user?.spec?.profile?.picture}\n style={{ width: '26px', height: '26px', fontSize: '14px' }}\n />\n </ListItemAvatar>\n <ListItemText\n className={classes.contentWrapper}\n primary={\n <div className={classes.text}>\n <span className={classes.contentClickable}>\n <UserLink entityRef={item.author} />\n </span>\n <span className={classes.action}>{action}</span>\n <span className={classes.link}>{title}</span>\n <span className={classes.time}>\n <RelativeTimeWithTooltip value={item.date} />\n </span>\n </div>\n }\n />\n </ListItem>\n );\n};\n"],"names":["RouterLink"],"mappings":"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"}