@drodil/backstage-plugin-qeta-react 3.52.5 → 3.53.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 (166) 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 +3 -0
  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/CollectionsContainer/CollectionListItem.esm.js +143 -0
  26. package/dist/components/CollectionsContainer/CollectionListItem.esm.js.map +1 -0
  27. package/dist/components/CollectionsContainer/CollectionsContainer.esm.js +45 -0
  28. package/dist/components/CollectionsContainer/CollectionsContainer.esm.js.map +1 -0
  29. package/dist/components/CollectionsContainer/CollectionsGridItem.esm.js.map +1 -0
  30. package/dist/components/ContentHeader/ContentHeader.esm.js +6 -0
  31. package/dist/components/ContentHeader/ContentHeader.esm.js.map +1 -1
  32. package/dist/components/EntitiesContainer/EntitiesContainer.esm.js +44 -0
  33. package/dist/components/EntitiesContainer/EntitiesContainer.esm.js.map +1 -0
  34. package/dist/components/{EntitiesGrid → EntitiesContainer}/EntitiesGridItem.esm.js +18 -26
  35. package/dist/components/EntitiesContainer/EntitiesGridItem.esm.js.map +1 -0
  36. package/dist/components/EntitiesContainer/EntityListItem.esm.js +102 -0
  37. package/dist/components/EntitiesContainer/EntityListItem.esm.js.map +1 -0
  38. package/dist/components/FilterPanel/FilterPanel.esm.js +2 -2
  39. package/dist/components/FilterPanel/FilterPanel.esm.js.map +1 -1
  40. package/dist/components/FollowedLists/FollowedEntitiesList.esm.js +7 -3
  41. package/dist/components/FollowedLists/FollowedEntitiesList.esm.js.map +1 -1
  42. package/dist/components/FollowedLists/FollowedTagsList.esm.js +8 -4
  43. package/dist/components/FollowedLists/FollowedTagsList.esm.js.map +1 -1
  44. package/dist/components/FollowedLists/FollowedUsersList.esm.js +7 -3
  45. package/dist/components/FollowedLists/FollowedUsersList.esm.js.map +1 -1
  46. package/dist/components/HomePageCards/ImpactCard.esm.js +7 -2
  47. package/dist/components/HomePageCards/ImpactCard.esm.js.map +1 -1
  48. package/dist/components/HomePageCards/PostsCard.esm.js +23 -15
  49. package/dist/components/HomePageCards/PostsCard.esm.js.map +1 -1
  50. package/dist/components/LeftMenu/LeftMenu.esm.js +15 -16
  51. package/dist/components/LeftMenu/LeftMenu.esm.js.map +1 -1
  52. package/dist/components/LinkCard/LinkCard.esm.js +4 -0
  53. package/dist/components/LinkCard/LinkCard.esm.js.map +1 -1
  54. package/dist/components/Links/Links.esm.js +7 -0
  55. package/dist/components/Links/Links.esm.js.map +1 -1
  56. package/dist/components/PostForm/EntitiesInput.esm.js +229 -226
  57. package/dist/components/PostForm/EntitiesInput.esm.js.map +1 -1
  58. package/dist/components/PostForm/PostForm.esm.js +13 -10
  59. package/dist/components/PostForm/PostForm.esm.js.map +1 -1
  60. package/dist/components/PostForm/TagInput.esm.js +4 -3
  61. package/dist/components/PostForm/TagInput.esm.js.map +1 -1
  62. package/dist/components/PostHighlightList/PostHighlightList.esm.js +6 -2
  63. package/dist/components/PostHighlightList/PostHighlightList.esm.js.map +1 -1
  64. package/dist/components/PostsContainer/PostListItem.esm.js +57 -18
  65. package/dist/components/PostsContainer/PostListItem.esm.js.map +1 -1
  66. package/dist/components/PostsContainer/PostsContainer.esm.js +137 -128
  67. package/dist/components/PostsContainer/PostsContainer.esm.js.map +1 -1
  68. package/dist/components/{PostsGrid → PostsContainer}/PostsGridItem.esm.js +29 -53
  69. package/dist/components/PostsContainer/PostsGridItem.esm.js.map +1 -0
  70. package/dist/components/PostsTable/PostsTable.esm.js +7 -2
  71. package/dist/components/PostsTable/PostsTable.esm.js.map +1 -1
  72. package/dist/components/QetaEntityContainer/QetaEntityContainer.esm.js +178 -0
  73. package/dist/components/QetaEntityContainer/QetaEntityContainer.esm.js.map +1 -0
  74. package/dist/components/QuestionCard/QuestionCard.esm.js +4 -0
  75. package/dist/components/QuestionCard/QuestionCard.esm.js.map +1 -1
  76. package/dist/components/SuggestionsCard/SuggestionsCard.esm.js +7 -3
  77. package/dist/components/SuggestionsCard/SuggestionsCard.esm.js.map +1 -1
  78. package/dist/components/TagsAndEntities/EntityChip.esm.js +6 -2
  79. package/dist/components/TagsAndEntities/EntityChip.esm.js.map +1 -1
  80. package/dist/components/TagsAndEntities/TagChip.esm.js +6 -2
  81. package/dist/components/TagsAndEntities/TagChip.esm.js.map +1 -1
  82. package/dist/components/TagsAndEntities/UserChip.esm.js +7 -3
  83. package/dist/components/TagsAndEntities/UserChip.esm.js.map +1 -1
  84. package/dist/components/TagsContainer/CreateTagModal.esm.js.map +1 -0
  85. package/dist/components/TagsContainer/EditTagModal.esm.js.map +1 -0
  86. package/dist/components/{TagsGrid → TagsContainer}/TagGridItem.esm.js +3 -3
  87. package/dist/components/TagsContainer/TagGridItem.esm.js.map +1 -0
  88. package/dist/components/TagsContainer/TagListItem.esm.js +243 -0
  89. package/dist/components/TagsContainer/TagListItem.esm.js.map +1 -0
  90. package/dist/components/TagsContainer/TagsContainer.esm.js +86 -0
  91. package/dist/components/TagsContainer/TagsContainer.esm.js.map +1 -0
  92. package/dist/components/TemplateList/TemplateForm.esm.js +7 -2
  93. package/dist/components/TemplateList/TemplateForm.esm.js.map +1 -1
  94. package/dist/components/TemplateList/TemplateList.esm.js +7 -3
  95. package/dist/components/TemplateList/TemplateList.esm.js.map +1 -1
  96. package/dist/components/Timeline/TimelineItem.esm.js +4 -0
  97. package/dist/components/Timeline/TimelineItem.esm.js.map +1 -1
  98. package/dist/components/TopRankingUsersCard/TopRankingUsersCard.esm.js +7 -2
  99. package/dist/components/TopRankingUsersCard/TopRankingUsersCard.esm.js.map +1 -1
  100. package/dist/components/UsersContainer/UserListItem.esm.js +133 -0
  101. package/dist/components/UsersContainer/UserListItem.esm.js.map +1 -0
  102. package/dist/components/UsersContainer/UsersContainer.esm.js +44 -0
  103. package/dist/components/UsersContainer/UsersContainer.esm.js.map +1 -0
  104. package/dist/components/{UsersGrid → UsersContainer}/UsersGridItem.esm.js +35 -38
  105. package/dist/components/UsersContainer/UsersGridItem.esm.js.map +1 -0
  106. package/dist/components/Utility/QetaGridHeader.esm.js +15 -11
  107. package/dist/components/Utility/QetaGridHeader.esm.js.map +1 -1
  108. package/dist/components/Utility/QetaPagination.esm.js +69 -0
  109. package/dist/components/Utility/QetaPagination.esm.js.map +1 -0
  110. package/dist/hooks/useListItemStyles.esm.js +22 -0
  111. package/dist/hooks/useListItemStyles.esm.js.map +1 -0
  112. package/dist/hooks/{usePaginatedPosts.esm.js → useQetaEntities.esm.js} +59 -84
  113. package/dist/hooks/useQetaEntities.esm.js.map +1 -0
  114. package/dist/hooks/useUserSettings.esm.js +83 -0
  115. package/dist/hooks/useUserSettings.esm.js.map +1 -0
  116. package/dist/index.d.ts +209 -58
  117. package/dist/index.esm.js +21 -8
  118. package/dist/index.esm.js.map +1 -1
  119. package/dist/routes.esm.js +6 -1
  120. package/dist/routes.esm.js.map +1 -1
  121. package/dist/translation.esm.js +49 -0
  122. package/dist/translation.esm.js.map +1 -1
  123. package/package.json +2 -2
  124. package/dist/components/AnswersContainer/AnswerList.esm.js +0 -54
  125. package/dist/components/AnswersContainer/AnswerList.esm.js.map +0 -1
  126. package/dist/components/CollectionsGrid/CollectionsGrid.esm.js +0 -204
  127. package/dist/components/CollectionsGrid/CollectionsGrid.esm.js.map +0 -1
  128. package/dist/components/CollectionsGrid/CollectionsGridContent.esm.js +0 -55
  129. package/dist/components/CollectionsGrid/CollectionsGridContent.esm.js.map +0 -1
  130. package/dist/components/CollectionsGrid/CollectionsGridItem.esm.js.map +0 -1
  131. package/dist/components/CollectionsGrid/NoCollectionsCard.esm.js +0 -21
  132. package/dist/components/CollectionsGrid/NoCollectionsCard.esm.js.map +0 -1
  133. package/dist/components/EntitiesGrid/EntitiesGrid.esm.js +0 -136
  134. package/dist/components/EntitiesGrid/EntitiesGrid.esm.js.map +0 -1
  135. package/dist/components/EntitiesGrid/EntitiesGridContent.esm.js +0 -46
  136. package/dist/components/EntitiesGrid/EntitiesGridContent.esm.js.map +0 -1
  137. package/dist/components/EntitiesGrid/EntitiesGridItem.esm.js.map +0 -1
  138. package/dist/components/EntitiesGrid/NoEntitiesCard.esm.js +0 -21
  139. package/dist/components/EntitiesGrid/NoEntitiesCard.esm.js.map +0 -1
  140. package/dist/components/PostsContainer/PostList.esm.js +0 -83
  141. package/dist/components/PostsContainer/PostList.esm.js.map +0 -1
  142. package/dist/components/PostsGrid/PostsGrid.esm.js +0 -197
  143. package/dist/components/PostsGrid/PostsGrid.esm.js.map +0 -1
  144. package/dist/components/PostsGrid/PostsGridContent.esm.js +0 -90
  145. package/dist/components/PostsGrid/PostsGridContent.esm.js.map +0 -1
  146. package/dist/components/PostsGrid/PostsGridItem.esm.js.map +0 -1
  147. package/dist/components/TagsGrid/CreateTagModal.esm.js.map +0 -1
  148. package/dist/components/TagsGrid/EditTagModal.esm.js.map +0 -1
  149. package/dist/components/TagsGrid/NoTagsCard.esm.js +0 -21
  150. package/dist/components/TagsGrid/NoTagsCard.esm.js.map +0 -1
  151. package/dist/components/TagsGrid/TagGridItem.esm.js.map +0 -1
  152. package/dist/components/TagsGrid/TagsGrid.esm.js +0 -190
  153. package/dist/components/TagsGrid/TagsGrid.esm.js.map +0 -1
  154. package/dist/components/TagsGrid/TagsGridContent.esm.js +0 -62
  155. package/dist/components/TagsGrid/TagsGridContent.esm.js.map +0 -1
  156. package/dist/components/UsersGrid/NoUsersCard.esm.js +0 -21
  157. package/dist/components/UsersGrid/NoUsersCard.esm.js.map +0 -1
  158. package/dist/components/UsersGrid/UsersGrid.esm.js +0 -137
  159. package/dist/components/UsersGrid/UsersGrid.esm.js.map +0 -1
  160. package/dist/components/UsersGrid/UsersGridContent.esm.js +0 -46
  161. package/dist/components/UsersGrid/UsersGridContent.esm.js.map +0 -1
  162. package/dist/components/UsersGrid/UsersGridItem.esm.js.map +0 -1
  163. package/dist/hooks/usePaginatedPosts.esm.js.map +0 -1
  164. /package/dist/components/{CollectionsGrid → CollectionsContainer}/CollectionsGridItem.esm.js +0 -0
  165. /package/dist/components/{TagsGrid → TagsContainer}/CreateTagModal.esm.js +0 -0
  166. /package/dist/components/{TagsGrid → TagsContainer}/EditTagModal.esm.js +0 -0
@@ -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":"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"}
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":";;;;;;;;;;;;;;;;;;AAwBA,MAAM,SAAA,GAAY,WAAW,CAAU,KAAA,MAAA;AAAA,EACrC,IAAM,EAAA;AAAA,IACJ,KAAO,EAAA,MAAA;AAAA,IACP,OAAS,EAAA,KAAA,CAAM,OAAQ,CAAA,CAAA,EAAG,GAAG,CAAA;AAAA,IAC7B,YAAc,EAAA,CAAA;AAAA,IACd,YAAc,EAAA,CAAA,UAAA,EAAa,KAAM,CAAA,OAAA,CAAQ,OAAO,CAAA,CAAA;AAAA,IAChD,YAAA,EAAc,MAAM,KAAM,CAAA,YAAA;AAAA,IAC1B,UAAY,EAAA,oCAAA;AAAA,IACZ,QAAU,EAAA,UAAA;AAAA,IACV,MAAQ,EAAA,SAAA;AAAA,IACR,SAAW,EAAA;AAAA,MACT,eAAA,EAAiB,KAAM,CAAA,OAAA,CAAQ,MAAO,CAAA;AAAA,KACxC;AAAA,IACA,cAAgB,EAAA;AAAA,MACd,YAAc,EAAA;AAAA;AAChB,GACF;AAAA,EACA,WAAa,EAAA;AAAA,IACX,QAAU,EAAA,UAAA;AAAA,IACV,GAAK,EAAA,CAAA;AAAA,IACL,IAAM,EAAA,CAAA;AAAA,IACN,KAAO,EAAA,CAAA;AAAA,IACP,MAAQ,EAAA,CAAA;AAAA,IACR,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,cAAgB,EAAA;AAAA,IACd,aAAe,EAAA;AAAA,GACjB;AAAA,EACA,gBAAkB,EAAA;AAAA,IAChB,QAAU,EAAA,UAAA;AAAA,IACV,MAAQ,EAAA,CAAA;AAAA,IACR,aAAe,EAAA;AAAA,GACjB;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,OAAS,EAAA;AAAA,GACX;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,QAAU,EAAA;AAAA,GACZ;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,UAAY,EAAA,QAAA;AAAA,IACZ,QAAU,EAAA,QAAA;AAAA,IACV,YAAc,EAAA,UAAA;AAAA,IACd,OAAS,EAAA,MAAA;AAAA,IACT,UAAY,EAAA,QAAA;AAAA,IACZ,GAAK,EAAA;AAAA,GACP;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,UAAY,EAAA,MAAA;AAAA,IACZ,QAAU,EAAA,QAAA;AAAA,IACV,YAAc,EAAA,UAAA;AAAA,IACd,UAAY,EAAA,QAAA;AAAA,IACZ,QAAU,EAAA,OAAA;AAAA,IACV,OAAS,EAAA,cAAA;AAAA,IACT,aAAe,EAAA;AAAA,GACjB;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,OAAS,EAAA;AAAA,GACX;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,OAAS,EAAA,GAAA;AAAA,IACT,QAAU,EAAA,OAAA;AAAA,IACV,UAAY,EAAA;AAAA;AAEhB,CAAE,CAAA,CAAA;AAEK,MAAM,gBAAmB,GAAA,CAAC,EAAE,IAAA,EAAmC,KAAA;AACpE,EAAA,MAAM,UAAU,SAAU,EAAA;AAC1B,EAAA,MAAM,EAAE,CAAA,EAAM,GAAA,iBAAA,CAAkB,kBAAkB,CAAA;AAClD,EAAM,MAAA,aAAA,GAAgB,YAAY,gBAAgB,CAAA;AAClD,EAAM,MAAA,YAAA,GAAe,YAAY,eAAe,CAAA;AAChD,EAAM,MAAA,SAAA,GAAY,YAAY,YAAY,CAAA;AAC1C,EAAM,MAAA,eAAA,GAAkB,YAAY,kBAAkB,CAAA;AACtD,EAAA,MAAM,EAAE,IAAA,EAAS,GAAA,WAAA,CAAY,KAAK,MAAM,CAAA;AAExC,EAAA,IAAI,QAAQ,IAAK,CAAA,KAAA;AACjB,EAAA,IAAI,IAAe,GAAA,EAAA;AACnB,EAAA,IAAI,MAAiB,GAAA,EAAA;AAErB,EAAI,IAAA,IAAA,CAAK,SAAS,MAAQ,EAAA;AACxB,IAAM,MAAA,QAAA,GAAW,KAAK,QAAY,IAAA,UAAA;AAClC,IAAM,MAAA,SAAA,GAAY,KAAK,MAAW,KAAA,SAAA;AAClC,IAAA,IAAI,aAAa,SAAW,EAAA;AAC1B,MAAA,IAAA,GAAO,aAAa,EAAE,EAAA,EAAI,KAAK,EAAG,CAAA,QAAA,IAAY,CAAA;AAC9C,MAAA,MAAA,GAAS,SACL,GAAA,CAAA,CAAE,yBAAyB,CAAA,GAC3B,EAAE,wBAAwB,CAAA;AAAA,KAChC,MAAA,IAAW,aAAa,MAAQ,EAAA;AAC9B,MAAA,IAAA,GAAO,UAAU,EAAE,EAAA,EAAI,KAAK,EAAG,CAAA,QAAA,IAAY,CAAA;AAC3C,MAAA,MAAA,GAAS,SAAY,GAAA,CAAA,CAAE,sBAAsB,CAAA,GAAI,EAAE,qBAAqB,CAAA;AAAA,KACnE,MAAA;AACL,MAAA,IAAA,GAAO,cAAc,EAAE,EAAA,EAAI,KAAK,EAAG,CAAA,QAAA,IAAY,CAAA;AAC/C,MAAA,MAAA,GAAS,SACL,GAAA,CAAA,CAAE,0BAA0B,CAAA,GAC5B,EAAE,yBAAyB,CAAA;AAAA;AACjC,GACF,MAAA,IAAW,IAAK,CAAA,IAAA,KAAS,QAAU,EAAA;AACjC,IAAA,IAAA,GAAO,CAAG,EAAA,aAAA,CAAc,EAAE,EAAA,EAAI,IAAK,CAAA,MAAA,CAAO,QAAS,EAAA,EAAG,CAAC,CAAW,QAAA,EAAA,IAAA,CAAK,EAAE,CAAA,CAAA;AACzE,IAAA,KAAA,GAAQ,IAAK,CAAA,SAAA;AACb,IAAA,MAAA,GAAS,EAAE,mBAAmB,CAAA;AAAA,GAChC,MAAA,IAAW,IAAK,CAAA,IAAA,KAAS,SAAW,EAAA;AAClC,IAAA,KAAA,GAAQ,IAAK,CAAA,SAAA;AACb,IAAM,MAAA,QAAA,GAAW,KAAK,QAAY,IAAA,UAAA;AAClC,IAAA,IAAI,aAAa,SAAW,EAAA;AAC1B,MAAA,IAAA,GAAO,aAAa,EAAE,EAAA,EAAI,KAAK,MAAO,CAAA,QAAA,IAAY,CAAA;AAClD,MAAA,MAAA,GAAS,EAAE,6BAA6B,CAAA;AAAA,KAC1C,MAAA,IAAW,aAAa,MAAQ,EAAA;AAC9B,MAAA,IAAA,GAAO,UAAU,EAAE,EAAA,EAAI,KAAK,MAAO,CAAA,QAAA,IAAY,CAAA;AAC/C,MAAA,MAAA,GAAS,EAAE,0BAA0B,CAAA;AAAA,KAChC,MAAA;AACL,MAAA,IAAA,GAAO,cAAc,EAAE,EAAA,EAAI,KAAK,MAAO,CAAA,QAAA,IAAY,CAAA;AACnD,MAAA,MAAA,GAAS,EAAE,8BAA8B,CAAA;AAAA;AAC3C,GACF,MAAA,IAAW,IAAK,CAAA,IAAA,KAAS,YAAc,EAAA;AACrC,IAAA,IAAA,GAAO,gBAAgB,EAAE,EAAA,EAAI,KAAK,EAAG,CAAA,QAAA,IAAY,CAAA;AACjD,IAAA,MAAA,GAAS,EAAE,4BAA4B,CAAA;AAAA;AAGzC,EACE,uBAAA,IAAA,CAAC,YAAS,UAAW,EAAA,QAAA,EAAS,WAAW,OAAQ,CAAA,IAAA,EAAM,OAAK,IAC1D,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAACA,IAAA;AAAA,MAAA;AAAA,QACC,EAAI,EAAA,IAAA;AAAA,QACJ,WAAW,OAAQ,CAAA,WAAA;AAAA,QACnB,YAAY,EAAA;AAAA;AAAA,KACd;AAAA,oBACA,GAAA,CAAC,kBAAe,SAAW,EAAA,CAAA,EAAG,QAAQ,MAAM,CAAA,CAAA,EAAI,OAAQ,CAAA,cAAc,CACpE,CAAA,EAAA,QAAA,kBAAA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,KAAK,IAAK,CAAA,MAAA;AAAA,QACV,GAAK,EAAA,IAAA,CAAK,WAAe,IAAA,IAAA,EAAM,MAAM,OAAS,EAAA,OAAA;AAAA,QAC9C,OAAO,EAAE,KAAA,EAAO,QAAQ,MAAQ,EAAA,MAAA,EAAQ,UAAU,MAAO;AAAA;AAAA,KAE7D,EAAA,CAAA;AAAA,oBACA,GAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,WAAW,OAAQ,CAAA,cAAA;AAAA,QACnB,OACE,kBAAA,IAAA,CAAC,KAAI,EAAA,EAAA,SAAA,EAAW,QAAQ,IACtB,EAAA,QAAA,EAAA;AAAA,0BAAC,GAAA,CAAA,MAAA,EAAA,EAAK,WAAW,OAAQ,CAAA,gBAAA,EACvB,8BAAC,QAAS,EAAA,EAAA,SAAA,EAAW,IAAK,CAAA,MAAA,EAAQ,CACpC,EAAA,CAAA;AAAA,0BACC,GAAA,CAAA,MAAA,EAAA,EAAK,SAAW,EAAA,OAAA,CAAQ,QAAS,QAAO,EAAA,MAAA,EAAA,CAAA;AAAA,0BACxC,GAAA,CAAA,MAAA,EAAA,EAAK,SAAW,EAAA,OAAA,CAAQ,MAAO,QAAM,EAAA,KAAA,EAAA,CAAA;AAAA,0BACtC,GAAA,CAAC,MAAK,EAAA,EAAA,SAAA,EAAW,OAAQ,CAAA,IAAA,EACvB,8BAAC,uBAAwB,EAAA,EAAA,KAAA,EAAO,IAAK,CAAA,IAAA,EAAM,CAC7C,EAAA;AAAA,SACF,EAAA;AAAA;AAAA;AAEJ,GACF,EAAA,CAAA;AAEJ;;;;"}
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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"}
@@ -7,15 +7,20 @@ import { useQetaApi } from '../../hooks/useQetaApi.esm.js';
7
7
  import 'react';
8
8
  import '@backstage/core-plugin-api';
9
9
  import '../../api.esm.js';
10
+ import '@backstage/plugin-signals-react';
11
+ import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
12
+ import { qetaTranslationRef } from '../../translation.esm.js';
13
+ import '../../hooks/useListItemStyles.esm.js';
10
14
  import '@backstage/catalog-model';
11
15
  import 'dataloader';
12
16
  import '@backstage/plugin-catalog-react';
13
- import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
14
- import { qetaTranslationRef } from '../../translation.esm.js';
15
17
  import 'react-use/lib/useAsync';
16
18
  import '@backstage/plugin-permission-react';
17
19
  import '@drodil/backstage-plugin-qeta-common';
18
20
  import '@backstage/plugin-permission-common';
21
+ import 'react-router-dom';
22
+ import 'react-use/lib/useDebounce';
23
+ import '../FilterPanel/FilterPanel.esm.js';
19
24
 
20
25
  const useStyles = makeStyles((theme) => {
21
26
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"TopRankingUsersCard.esm.js","sources":["../../../src/components/TopRankingUsersCard/TopRankingUsersCard.tsx"],"sourcesContent":["import { ReactElement, ReactNode } from 'react';\nimport {\n CardTab,\n Progress,\n TabbedCard,\n WarningPanel,\n} from '@backstage/core-components';\nimport {\n Avatar,\n Box,\n List,\n ListItem,\n ListItemAvatar,\n ListItemText,\n makeStyles,\n Paper,\n Typography,\n} from '@material-ui/core';\nimport { StatisticResponse } from '@drodil/backstage-plugin-qeta-common';\nimport { TrophyIcon } from './TrophyIcon';\nimport { UserLink } from '../Links';\nimport { useQetaApi } from '../../hooks';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../../translation.ts';\n\nconst useStyles = makeStyles(theme => {\n return {\n root: {\n '& .MuiTabbedCard-root': {\n borderRadius: '12px',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.1)',\n },\n '& .MuiCardHeader-root': {\n padding: theme.spacing(2, 3),\n borderBottom: `1px solid ${theme.palette.divider}`,\n },\n '& .MuiTabs-root': {\n backgroundColor: theme.palette.background.paper,\n borderBottom: `1px solid ${theme.palette.divider}`,\n },\n },\n trophyIcon: {\n backgroundColor: theme.palette.background.paper,\n color: theme.palette.text.primary,\n borderRadius: '50%',\n boxSizing: 'border-box',\n padding: '0.5rem',\n height: 48,\n width: 48,\n boxShadow: '0 2px 8px rgba(0, 0, 0, 0.1)',\n transition: 'transform 0.2s ease-in-out',\n '&:hover': {\n transform: 'scale(1.05)',\n },\n },\n votesText: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n marginLeft: '16px',\n backgroundColor: theme.palette.background.paper,\n padding: theme.spacing(0.5, 2),\n borderRadius: '20px',\n boxShadow: '0 2px 4px rgba(0, 0, 0, 0.05)',\n },\n rankingCard: {\n padding: theme.spacing(2),\n },\n rankingCardDescription: {\n color: theme.palette.text.secondary,\n marginBottom: theme.spacing(2),\n },\n rankingCardList: {\n '& .MuiListItem-root': {\n marginBottom: theme.spacing(1),\n borderRadius: '8px',\n transition: 'background-color 0.2s ease-in-out',\n '&:hover': {\n backgroundColor: theme.palette.action.hover,\n },\n },\n },\n rankingRow: {\n display: 'flex',\n alignItems: 'center',\n padding: theme.spacing(1.5, 2),\n },\n userInfo: {\n display: 'flex',\n alignItems: 'center',\n flex: 1,\n },\n position: {\n fontWeight: 800,\n marginRight: theme.spacing(2),\n color: theme.palette.text.secondary,\n minWidth: '30px',\n textAlign: 'right',\n },\n topPosition: {\n color: theme.palette.primary.main,\n fontSize: '1.1rem',\n },\n divider: {\n margin: theme.spacing(2, 0),\n opacity: 0.5,\n border: 0,\n borderBottom: `1px solid ${theme.palette.divider}`,\n },\n };\n});\n\ntype RankingIcon = {\n iconsByRanking: Map<number, ReactNode>;\n userRankingIcon: ReactNode;\n};\n\nconst DefaultRankingIcons = new Map<number, ReactNode>([\n [\n 1,\n <TrophyIcon\n style={{ color: '#DAA520', height: '2.2rem', width: '2.2rem' }}\n />,\n ],\n [\n 2,\n <TrophyIcon\n style={{ color: '#C0C0C0', height: '2.1rem', width: '2.1rem' }}\n />,\n ],\n [\n 3,\n <TrophyIcon style={{ color: '#B87333', height: '2rem', width: '2rem' }} />,\n ],\n]);\n\nconst DefaultUserIcon = (\n <TrophyIcon style={{ height: '2rem', width: '2rem' }} />\n);\n\nconst getOrdinal = (n: number) => {\n if (n % 10 === 1 && n % 100 !== 11) {\n return `${n}st`;\n } else if (n % 10 === 2 && n % 100 !== 12) {\n return `${n}nd`;\n } else if (n % 10 === 3 && n % 100 !== 13) {\n return `${n}rd`;\n }\n\n return `${n}th`;\n};\n\nexport const RankingRow = (props: {\n userRef?: string;\n total: number;\n position: number;\n rankingIcon?: RankingIcon;\n unit: string;\n}) => {\n const classes = useStyles();\n const userRef = props.userRef;\n\n const ordinalPosition = props?.position ? getOrdinal(props?.position) : '';\n\n const userIcon = props.rankingIcon?.userRankingIcon\n ? props.rankingIcon?.userRankingIcon\n : DefaultUserIcon;\n\n const topRankingIcon = props.rankingIcon\n ? props.rankingIcon.iconsByRanking.get(Number(props?.position))\n : DefaultRankingIcons.get(Number(props?.position)) || DefaultUserIcon;\n\n const rankingIcon = props?.position > 3 ? userIcon : topRankingIcon;\n\n return (\n <ListItem className={classes.rankingRow}>\n <ListItemAvatar>\n <Avatar className={classes.trophyIcon}>{rankingIcon}</Avatar>\n </ListItemAvatar>\n\n <ListItemText\n disableTypography\n className={classes.userInfo}\n primary={\n <Box display=\"flex\" alignItems=\"center\">\n <Typography\n className={`${classes.position} ${\n props.position <= 3 ? classes.topPosition : ''\n }`}\n variant=\"subtitle1\"\n >\n {ordinalPosition}\n </Typography>\n <UserLink entityRef={userRef ?? ''} />\n </Box>\n }\n />\n\n <div className={classes.votesText}>\n <Typography variant=\"subtitle1\" style={{ fontWeight: 500 }}>\n {props?.total} {props.unit}\n </Typography>\n </div>\n </ListItem>\n );\n};\n\nexport const RankingCard = (props: {\n limit?: number;\n description: string;\n statistic?: StatisticResponse;\n unit: string;\n}) => {\n const classes = useStyles();\n const rankingStats = props.limit\n ? props.statistic?.ranking.slice(0, props.limit)\n : props.statistic?.ranking;\n\n return (\n <Paper elevation={0} className={classes.rankingCard}>\n <Typography className={classes.rankingCardDescription}>\n {props.description}\n </Typography>\n <List className={classes.rankingCardList}>\n {rankingStats?.map(authorStats => (\n <RankingRow\n total={authorStats.total || 0}\n position={authorStats.position || 0}\n userRef={authorStats.author}\n unit={props.unit}\n key={authorStats.author}\n />\n ))}\n {!rankingStats?.some(\n authorStats =>\n authorStats.author === props.statistic?.loggedUser?.author,\n ) && (\n <>\n <hr className={classes.divider} />\n <RankingRow\n total={props.statistic?.loggedUser?.total || 0}\n position={props.statistic?.loggedUser?.position || 0}\n userRef={props.statistic?.loggedUser?.author}\n unit={props.unit}\n />\n </>\n )}\n </List>\n </Paper>\n );\n};\n\nexport const TopRankingUsers = (props: {\n title?: string;\n hideTitle?: boolean;\n limit?: number;\n}) => {\n const classes = useStyles();\n const { t } = useTranslationRef(qetaTranslationRef);\n const {\n value: topStatistics,\n loading,\n error,\n } = useQetaApi(api =>\n api.getTopStatisticsHomepage({\n options: { limit: 50 },\n }),\n );\n\n const tabData = [\n {\n title: t('statistics.mostQuestions.title'),\n description: t('statistics.mostQuestions.description'),\n unit: 'questions',\n },\n {\n title: t('statistics.mostAnswers.title'),\n description: t('statistics.mostAnswers.description'),\n unit: 'answers',\n },\n {\n title: t('statistics.topVotedQuestions.title'),\n description: t('statistics.topVotedQuestions.description'),\n unit: 'votes',\n },\n {\n title: t('statistics.topVotedAnswers.title'),\n description: t('statistics.topVotedAnswers.description'),\n unit: 'votes',\n },\n {\n title: t('statistics.topVotedCorrectAnswers.title'),\n description: t('statistics.topVotedCorrectAnswers.description'),\n unit: 'votes',\n },\n ];\n\n if ((error || topStatistics === undefined) && !loading) {\n return (\n <WarningPanel severity=\"error\" title={t('statistics.errorLoading')}>\n {error?.message}\n </WarningPanel>\n );\n }\n\n let content: ReactElement[];\n\n if (loading) {\n content = [\n <CardTab>\n <Box display=\"flex\" justifyContent=\"center\" p={3}>\n <Progress />\n </Box>\n </CardTab>,\n ];\n } else if (topStatistics && topStatistics.length > 0) {\n content = topStatistics?.map((stats, index) => {\n return (\n <CardTab label={tabData[index].title} key={tabData[index].title}>\n <RankingCard\n description={tabData[index].description}\n limit={props.limit}\n statistic={stats}\n unit={tabData[index].unit}\n />\n </CardTab>\n );\n });\n } else {\n content = [\n <CardTab>\n <Box display=\"flex\" justifyContent=\"center\" p={3}>\n {t('statistics.notAvailable')}\n </Box>\n </CardTab>,\n ];\n }\n\n return (\n <div className={classes.root}>\n <TabbedCard title={props.title || t('statistics.ranking')}>\n {content}\n </TabbedCard>\n </div>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TopRankingUsersCard.esm.js","sources":["../../../src/components/TopRankingUsersCard/TopRankingUsersCard.tsx"],"sourcesContent":["import { ReactElement, ReactNode } from 'react';\nimport {\n CardTab,\n Progress,\n TabbedCard,\n WarningPanel,\n} from '@backstage/core-components';\nimport {\n Avatar,\n Box,\n List,\n ListItem,\n ListItemAvatar,\n ListItemText,\n makeStyles,\n Paper,\n Typography,\n} from '@material-ui/core';\nimport { StatisticResponse } from '@drodil/backstage-plugin-qeta-common';\nimport { TrophyIcon } from './TrophyIcon';\nimport { UserLink } from '../Links';\nimport { useQetaApi } from '../../hooks';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../../translation.ts';\n\nconst useStyles = makeStyles(theme => {\n return {\n root: {\n '& .MuiTabbedCard-root': {\n borderRadius: '12px',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.1)',\n },\n '& .MuiCardHeader-root': {\n padding: theme.spacing(2, 3),\n borderBottom: `1px solid ${theme.palette.divider}`,\n },\n '& .MuiTabs-root': {\n backgroundColor: theme.palette.background.paper,\n borderBottom: `1px solid ${theme.palette.divider}`,\n },\n },\n trophyIcon: {\n backgroundColor: theme.palette.background.paper,\n color: theme.palette.text.primary,\n borderRadius: '50%',\n boxSizing: 'border-box',\n padding: '0.5rem',\n height: 48,\n width: 48,\n boxShadow: '0 2px 8px rgba(0, 0, 0, 0.1)',\n transition: 'transform 0.2s ease-in-out',\n '&:hover': {\n transform: 'scale(1.05)',\n },\n },\n votesText: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n marginLeft: '16px',\n backgroundColor: theme.palette.background.paper,\n padding: theme.spacing(0.5, 2),\n borderRadius: '20px',\n boxShadow: '0 2px 4px rgba(0, 0, 0, 0.05)',\n },\n rankingCard: {\n padding: theme.spacing(2),\n },\n rankingCardDescription: {\n color: theme.palette.text.secondary,\n marginBottom: theme.spacing(2),\n },\n rankingCardList: {\n '& .MuiListItem-root': {\n marginBottom: theme.spacing(1),\n borderRadius: '8px',\n transition: 'background-color 0.2s ease-in-out',\n '&:hover': {\n backgroundColor: theme.palette.action.hover,\n },\n },\n },\n rankingRow: {\n display: 'flex',\n alignItems: 'center',\n padding: theme.spacing(1.5, 2),\n },\n userInfo: {\n display: 'flex',\n alignItems: 'center',\n flex: 1,\n },\n position: {\n fontWeight: 800,\n marginRight: theme.spacing(2),\n color: theme.palette.text.secondary,\n minWidth: '30px',\n textAlign: 'right',\n },\n topPosition: {\n color: theme.palette.primary.main,\n fontSize: '1.1rem',\n },\n divider: {\n margin: theme.spacing(2, 0),\n opacity: 0.5,\n border: 0,\n borderBottom: `1px solid ${theme.palette.divider}`,\n },\n };\n});\n\ntype RankingIcon = {\n iconsByRanking: Map<number, ReactNode>;\n userRankingIcon: ReactNode;\n};\n\nconst DefaultRankingIcons = new Map<number, ReactNode>([\n [\n 1,\n <TrophyIcon\n style={{ color: '#DAA520', height: '2.2rem', width: '2.2rem' }}\n />,\n ],\n [\n 2,\n <TrophyIcon\n style={{ color: '#C0C0C0', height: '2.1rem', width: '2.1rem' }}\n />,\n ],\n [\n 3,\n <TrophyIcon style={{ color: '#B87333', height: '2rem', width: '2rem' }} />,\n ],\n]);\n\nconst DefaultUserIcon = (\n <TrophyIcon style={{ height: '2rem', width: '2rem' }} />\n);\n\nconst getOrdinal = (n: number) => {\n if (n % 10 === 1 && n % 100 !== 11) {\n return `${n}st`;\n } else if (n % 10 === 2 && n % 100 !== 12) {\n return `${n}nd`;\n } else if (n % 10 === 3 && n % 100 !== 13) {\n return `${n}rd`;\n }\n\n return `${n}th`;\n};\n\nexport const RankingRow = (props: {\n userRef?: string;\n total: number;\n position: number;\n rankingIcon?: RankingIcon;\n unit: string;\n}) => {\n const classes = useStyles();\n const userRef = props.userRef;\n\n const ordinalPosition = props?.position ? getOrdinal(props?.position) : '';\n\n const userIcon = props.rankingIcon?.userRankingIcon\n ? props.rankingIcon?.userRankingIcon\n : DefaultUserIcon;\n\n const topRankingIcon = props.rankingIcon\n ? props.rankingIcon.iconsByRanking.get(Number(props?.position))\n : DefaultRankingIcons.get(Number(props?.position)) || DefaultUserIcon;\n\n const rankingIcon = props?.position > 3 ? userIcon : topRankingIcon;\n\n return (\n <ListItem className={classes.rankingRow}>\n <ListItemAvatar>\n <Avatar className={classes.trophyIcon}>{rankingIcon}</Avatar>\n </ListItemAvatar>\n\n <ListItemText\n disableTypography\n className={classes.userInfo}\n primary={\n <Box display=\"flex\" alignItems=\"center\">\n <Typography\n className={`${classes.position} ${\n props.position <= 3 ? classes.topPosition : ''\n }`}\n variant=\"subtitle1\"\n >\n {ordinalPosition}\n </Typography>\n <UserLink entityRef={userRef ?? ''} />\n </Box>\n }\n />\n\n <div className={classes.votesText}>\n <Typography variant=\"subtitle1\" style={{ fontWeight: 500 }}>\n {props?.total} {props.unit}\n </Typography>\n </div>\n </ListItem>\n );\n};\n\nexport const RankingCard = (props: {\n limit?: number;\n description: string;\n statistic?: StatisticResponse;\n unit: string;\n}) => {\n const classes = useStyles();\n const rankingStats = props.limit\n ? props.statistic?.ranking.slice(0, props.limit)\n : props.statistic?.ranking;\n\n return (\n <Paper elevation={0} className={classes.rankingCard}>\n <Typography className={classes.rankingCardDescription}>\n {props.description}\n </Typography>\n <List className={classes.rankingCardList}>\n {rankingStats?.map(authorStats => (\n <RankingRow\n total={authorStats.total || 0}\n position={authorStats.position || 0}\n userRef={authorStats.author}\n unit={props.unit}\n key={authorStats.author}\n />\n ))}\n {!rankingStats?.some(\n authorStats =>\n authorStats.author === props.statistic?.loggedUser?.author,\n ) && (\n <>\n <hr className={classes.divider} />\n <RankingRow\n total={props.statistic?.loggedUser?.total || 0}\n position={props.statistic?.loggedUser?.position || 0}\n userRef={props.statistic?.loggedUser?.author}\n unit={props.unit}\n />\n </>\n )}\n </List>\n </Paper>\n );\n};\n\nexport const TopRankingUsers = (props: {\n title?: string;\n hideTitle?: boolean;\n limit?: number;\n}) => {\n const classes = useStyles();\n const { t } = useTranslationRef(qetaTranslationRef);\n const {\n value: topStatistics,\n loading,\n error,\n } = useQetaApi(api =>\n api.getTopStatisticsHomepage({\n options: { limit: 50 },\n }),\n );\n\n const tabData = [\n {\n title: t('statistics.mostQuestions.title'),\n description: t('statistics.mostQuestions.description'),\n unit: 'questions',\n },\n {\n title: t('statistics.mostAnswers.title'),\n description: t('statistics.mostAnswers.description'),\n unit: 'answers',\n },\n {\n title: t('statistics.topVotedQuestions.title'),\n description: t('statistics.topVotedQuestions.description'),\n unit: 'votes',\n },\n {\n title: t('statistics.topVotedAnswers.title'),\n description: t('statistics.topVotedAnswers.description'),\n unit: 'votes',\n },\n {\n title: t('statistics.topVotedCorrectAnswers.title'),\n description: t('statistics.topVotedCorrectAnswers.description'),\n unit: 'votes',\n },\n ];\n\n if ((error || topStatistics === undefined) && !loading) {\n return (\n <WarningPanel severity=\"error\" title={t('statistics.errorLoading')}>\n {error?.message}\n </WarningPanel>\n );\n }\n\n let content: ReactElement[];\n\n if (loading) {\n content = [\n <CardTab>\n <Box display=\"flex\" justifyContent=\"center\" p={3}>\n <Progress />\n </Box>\n </CardTab>,\n ];\n } else if (topStatistics && topStatistics.length > 0) {\n content = topStatistics?.map((stats, index) => {\n return (\n <CardTab label={tabData[index].title} key={tabData[index].title}>\n <RankingCard\n description={tabData[index].description}\n limit={props.limit}\n statistic={stats}\n unit={tabData[index].unit}\n />\n </CardTab>\n );\n });\n } else {\n content = [\n <CardTab>\n <Box display=\"flex\" justifyContent=\"center\" p={3}>\n {t('statistics.notAvailable')}\n </Box>\n </CardTab>,\n ];\n }\n\n return (\n <div className={classes.root}>\n <TabbedCard title={props.title || t('statistics.ranking')}>\n {content}\n </TabbedCard>\n </div>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,133 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { useRouteRef } from '@backstage/core-plugin-api';
3
+ import { userRouteRef } from '../../routes.esm.js';
4
+ import '../../api.esm.js';
5
+ import 'react-use';
6
+ import 'react';
7
+ import '@backstage/plugin-signals-react';
8
+ import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
9
+ import { qetaTranslationRef } from '../../translation.esm.js';
10
+ import { useListItemStyles } from '../../hooks/useListItemStyles.esm.js';
11
+ import { useEntityAuthor } from '../../hooks/useEntityAuthor.esm.js';
12
+ import { useIdentityApi } from '../../hooks/useIdentityApi.esm.js';
13
+ import '@backstage/plugin-permission-react';
14
+ import '@drodil/backstage-plugin-qeta-common';
15
+ import '@backstage/plugin-permission-common';
16
+ import { makeStyles, Avatar, Box, Tooltip, Typography } from '@material-ui/core';
17
+ import { Link } from 'react-router-dom';
18
+ import 'react-use/lib/useDebounce';
19
+ import '../FilterPanel/FilterPanel.esm.js';
20
+ import { UserFollowButton } from '../Buttons/UserFollowButton.esm.js';
21
+ import Visibility from '@material-ui/icons/Visibility';
22
+ import QuestionAnswerIcon from '@material-ui/icons/QuestionAnswer';
23
+ import ThumbUp from '@material-ui/icons/ThumbUp';
24
+ import CheckCircle from '@material-ui/icons/CheckCircle';
25
+ import DescriptionIcon from '@material-ui/icons/Description';
26
+ import LinkIcon from '@material-ui/icons/Link';
27
+ import EmojiEvents from '@material-ui/icons/EmojiEvents';
28
+
29
+ const useStyles = makeStyles((theme) => ({
30
+ content: {
31
+ flex: 1,
32
+ minWidth: 0,
33
+ display: "flex",
34
+ flexDirection: "column",
35
+ marginLeft: theme.spacing(2)
36
+ },
37
+ title: {
38
+ fontWeight: 600
39
+ },
40
+ statsWrapper: {
41
+ display: "flex",
42
+ gap: theme.spacing(3),
43
+ marginLeft: theme.spacing(2),
44
+ alignItems: "center",
45
+ [theme.breakpoints.down("sm")]: {
46
+ display: "none"
47
+ }
48
+ },
49
+ statItem: {
50
+ display: "flex",
51
+ alignItems: "center",
52
+ gap: theme.spacing(0.5),
53
+ color: theme.palette.text.secondary
54
+ },
55
+ actions: {
56
+ marginLeft: theme.spacing(2)
57
+ }
58
+ }));
59
+ const UserListItem = (props) => {
60
+ const { user } = props;
61
+ const classes = useStyles();
62
+ const listItemClasses = useListItemStyles();
63
+ const userRoute = useRouteRef(userRouteRef);
64
+ const { t } = useTranslationRef(qetaTranslationRef);
65
+ const {
66
+ name,
67
+ initials,
68
+ user: userEntity,
69
+ secondaryTitle
70
+ } = useEntityAuthor(user);
71
+ const {
72
+ value: currentUser,
73
+ loading: loadingUser,
74
+ error: userError
75
+ } = useIdentityApi((api) => api.getBackstageIdentity(), []);
76
+ const href = `${userRoute()}/${user.userRef}`;
77
+ return /* @__PURE__ */ jsxs(Link, { to: href, className: listItemClasses.root, children: [
78
+ /* @__PURE__ */ jsx(
79
+ Avatar,
80
+ {
81
+ src: userEntity?.spec?.profile?.picture,
82
+ alt: name,
83
+ variant: "rounded",
84
+ children: initials
85
+ }
86
+ ),
87
+ /* @__PURE__ */ jsx(Box, { className: classes.content, children: /* @__PURE__ */ jsx(Tooltip, { title: secondaryTitle ?? "", arrow: true, placement: "top-start", children: /* @__PURE__ */ jsx(Typography, { className: classes.title, noWrap: true, children: name }) }) }),
88
+ /* @__PURE__ */ jsxs(Box, { className: classes.statsWrapper, children: [
89
+ /* @__PURE__ */ jsx(Tooltip, { title: t("impactCard.reputation"), arrow: true, children: /* @__PURE__ */ jsxs("div", { className: classes.statItem, children: [
90
+ /* @__PURE__ */ jsx(EmojiEvents, { fontSize: "small" }),
91
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", children: user.reputation })
92
+ ] }) }),
93
+ /* @__PURE__ */ jsx(Tooltip, { title: t("common.questions"), arrow: true, children: /* @__PURE__ */ jsxs("div", { className: classes.statItem, children: [
94
+ /* @__PURE__ */ jsx(QuestionAnswerIcon, { fontSize: "small" }),
95
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", children: user.totalQuestions })
96
+ ] }) }),
97
+ /* @__PURE__ */ jsx(Tooltip, { title: t("common.answers"), arrow: true, children: /* @__PURE__ */ jsxs("div", { className: classes.statItem, children: [
98
+ /* @__PURE__ */ jsx(CheckCircle, { fontSize: "small" }),
99
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", children: user.totalAnswers })
100
+ ] }) }),
101
+ /* @__PURE__ */ jsx(Tooltip, { title: t("common.articles"), arrow: true, children: /* @__PURE__ */ jsxs("div", { className: classes.statItem, children: [
102
+ /* @__PURE__ */ jsx(DescriptionIcon, { fontSize: "small" }),
103
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", children: user.totalArticles })
104
+ ] }) }),
105
+ /* @__PURE__ */ jsx(Tooltip, { title: t("common.links"), arrow: true, children: /* @__PURE__ */ jsxs("div", { className: classes.statItem, children: [
106
+ /* @__PURE__ */ jsx(LinkIcon, { fontSize: "small" }),
107
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", children: user.totalLinks })
108
+ ] }) }),
109
+ /* @__PURE__ */ jsx(Tooltip, { title: t("common.votes"), arrow: true, children: /* @__PURE__ */ jsxs("div", { className: classes.statItem, children: [
110
+ /* @__PURE__ */ jsx(ThumbUp, { fontSize: "small" }),
111
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", children: user.totalVotes })
112
+ ] }) }),
113
+ /* @__PURE__ */ jsx(Tooltip, { title: t("common.views"), arrow: true, children: /* @__PURE__ */ jsxs("div", { className: classes.statItem, children: [
114
+ /* @__PURE__ */ jsx(Visibility, { fontSize: "small" }),
115
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", children: user.totalViews })
116
+ ] }) })
117
+ ] }),
118
+ !loadingUser && !userError && currentUser?.userEntityRef !== user.userRef ? /* @__PURE__ */ jsx(
119
+ Box,
120
+ {
121
+ className: classes.actions,
122
+ onClick: (e) => {
123
+ e.preventDefault();
124
+ e.stopPropagation();
125
+ },
126
+ children: /* @__PURE__ */ jsx(UserFollowButton, { userRef: user.userRef })
127
+ }
128
+ ) : null
129
+ ] });
130
+ };
131
+
132
+ export { UserListItem };
133
+ //# sourceMappingURL=UserListItem.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UserListItem.esm.js","sources":["../../../src/components/UsersContainer/UserListItem.tsx"],"sourcesContent":["import { UserResponse } from '@drodil/backstage-plugin-qeta-common';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport { userRouteRef } from '../../routes';\nimport { useIdentityApi } from '../../hooks';\nimport { useEntityAuthor } from '../../hooks/useEntityAuthor';\nimport {\n Avatar,\n Box,\n makeStyles,\n Tooltip,\n Typography,\n} from '@material-ui/core';\nimport { UserFollowButton } from '../Buttons/UserFollowButton';\nimport Visibility from '@material-ui/icons/Visibility';\nimport QuestionAnswerIcon from '@material-ui/icons/QuestionAnswer';\nimport ThumbUpIcon from '@material-ui/icons/ThumbUp';\nimport CheckCircleIcon from '@material-ui/icons/CheckCircle';\nimport DescriptionIcon from '@material-ui/icons/Description';\nimport LinkIcon from '@material-ui/icons/Link';\nimport EmojiEvents from '@material-ui/icons/EmojiEvents';\nimport { qetaTranslationRef } from '../../translation';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { Link } from 'react-router-dom';\n\nimport { useListItemStyles } from '../../hooks';\n\nconst useStyles = makeStyles(theme => ({\n content: {\n flex: 1,\n minWidth: 0,\n display: 'flex',\n flexDirection: 'column',\n marginLeft: theme.spacing(2),\n },\n title: {\n fontWeight: 600,\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 marginLeft: theme.spacing(2),\n },\n}));\n\nexport const UserListItem = (props: { user: UserResponse }) => {\n const { user } = props;\n const classes = useStyles();\n const listItemClasses = useListItemStyles();\n const userRoute = useRouteRef(userRouteRef);\n const { t } = useTranslationRef(qetaTranslationRef);\n const {\n name,\n initials,\n user: userEntity,\n secondaryTitle,\n } = useEntityAuthor(user);\n const {\n value: currentUser,\n loading: loadingUser,\n error: userError,\n } = useIdentityApi(api => api.getBackstageIdentity(), []);\n\n const href = `${userRoute()}/${user.userRef}`;\n\n return (\n <Link to={href} className={listItemClasses.root}>\n <Avatar\n src={userEntity?.spec?.profile?.picture}\n alt={name}\n variant=\"rounded\"\n >\n {initials}\n </Avatar>\n <Box className={classes.content}>\n <Tooltip title={secondaryTitle ?? ''} arrow placement=\"top-start\">\n <Typography className={classes.title} noWrap>\n {name}\n </Typography>\n </Tooltip>\n </Box>\n\n <Box className={classes.statsWrapper}>\n <Tooltip title={t('impactCard.reputation')} arrow>\n <div className={classes.statItem}>\n <EmojiEvents fontSize=\"small\" />\n <Typography variant=\"body2\">{user.reputation}</Typography>\n </div>\n </Tooltip>\n <Tooltip title={t('common.questions')} arrow>\n <div className={classes.statItem}>\n <QuestionAnswerIcon fontSize=\"small\" />\n <Typography variant=\"body2\">{user.totalQuestions}</Typography>\n </div>\n </Tooltip>\n <Tooltip title={t('common.answers')} arrow>\n <div className={classes.statItem}>\n <CheckCircleIcon fontSize=\"small\" />\n <Typography variant=\"body2\">{user.totalAnswers}</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\">{user.totalArticles}</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\">{user.totalLinks}</Typography>\n </div>\n </Tooltip>\n <Tooltip title={t('common.votes')} arrow>\n <div className={classes.statItem}>\n <ThumbUpIcon fontSize=\"small\" />\n <Typography variant=\"body2\">{user.totalVotes}</Typography>\n </div>\n </Tooltip>\n <Tooltip title={t('common.views')} arrow>\n <div className={classes.statItem}>\n <Visibility fontSize=\"small\" />\n <Typography variant=\"body2\">{user.totalViews}</Typography>\n </div>\n </Tooltip>\n </Box>\n\n {!loadingUser &&\n !userError &&\n currentUser?.userEntityRef !== user.userRef ? (\n <Box\n className={classes.actions}\n onClick={e => {\n e.preventDefault();\n e.stopPropagation();\n }}\n >\n <UserFollowButton userRef={user.userRef} />\n </Box>\n ) : null}\n </Link>\n );\n};\n"],"names":["CheckCircleIcon","ThumbUpIcon"],"mappings":"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"}