@drodil/backstage-plugin-qeta 3.60.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/README.md +6 -11
  2. package/dist/components/ArticlePage/ArticlePage.esm.js +57 -15
  3. package/dist/components/ArticlePage/ArticlePage.esm.js.map +1 -1
  4. package/dist/components/ArticlesPage/ArticlesPage.esm.js +5 -22
  5. package/dist/components/ArticlesPage/ArticlesPage.esm.js.map +1 -1
  6. package/dist/components/AskPage/AskPage.esm.js +6 -7
  7. package/dist/components/AskPage/AskPage.esm.js.map +1 -1
  8. package/dist/components/CollectionCreatePage/CollectionCreatePage.esm.js +3 -4
  9. package/dist/components/CollectionCreatePage/CollectionCreatePage.esm.js.map +1 -1
  10. package/dist/components/CollectionPage/CollectionPage.esm.js +43 -87
  11. package/dist/components/CollectionPage/CollectionPage.esm.js.map +1 -1
  12. package/dist/components/CollectionsPage/CollectionsPage.esm.js +4 -5
  13. package/dist/components/CollectionsPage/CollectionsPage.esm.js.map +1 -1
  14. package/dist/components/ContentHealthCard/ContentHealthCard.esm.js +61 -89
  15. package/dist/components/ContentHealthCard/ContentHealthCard.esm.js.map +1 -1
  16. package/dist/components/ContentHealthCard/ContentHealthCard.module.css.esm.js +8 -0
  17. package/dist/components/ContentHealthCard/ContentHealthCard.module.css.esm.js.map +1 -0
  18. package/dist/components/ContentHealthCard/ReviewList.esm.js +27 -60
  19. package/dist/components/ContentHealthCard/ReviewList.esm.js.map +1 -1
  20. package/dist/components/ContentHealthCard/ReviewList.module.css.esm.js +8 -0
  21. package/dist/components/ContentHealthCard/ReviewList.module.css.esm.js.map +1 -0
  22. package/dist/components/CreateLinkPage/CreateLinkPage.esm.js +5 -6
  23. package/dist/components/CreateLinkPage/CreateLinkPage.esm.js.map +1 -1
  24. package/dist/components/EntityPage/EntityPage.esm.js +40 -58
  25. package/dist/components/EntityPage/EntityPage.esm.js.map +1 -1
  26. package/dist/components/EntityPostsContent/EntityPostsContent.esm.js +2 -3
  27. package/dist/components/EntityPostsContent/EntityPostsContent.esm.js.map +1 -1
  28. package/dist/components/FavoritePage/FavoritePage.esm.js +3 -14
  29. package/dist/components/FavoritePage/FavoritePage.esm.js.map +1 -1
  30. package/dist/components/HomePage/HomePage.esm.js +14 -60
  31. package/dist/components/HomePage/HomePage.esm.js.map +1 -1
  32. package/dist/components/HomePage/HomePage.module.css.esm.js +8 -0
  33. package/dist/components/HomePage/HomePage.module.css.esm.js.map +1 -0
  34. package/dist/components/LinkPage/LinkPage.esm.js +56 -61
  35. package/dist/components/LinkPage/LinkPage.esm.js.map +1 -1
  36. package/dist/components/LinksPage/LinksPage.esm.js +5 -16
  37. package/dist/components/LinksPage/LinksPage.esm.js.map +1 -1
  38. package/dist/components/ModeratorPage/ModeratorPage.esm.js +19 -29
  39. package/dist/components/ModeratorPage/ModeratorPage.esm.js.map +1 -1
  40. package/dist/components/ModeratorPage/ModeratorPage.module.css.esm.js +8 -0
  41. package/dist/components/ModeratorPage/ModeratorPage.module.css.esm.js.map +1 -0
  42. package/dist/components/QetaPage/QetaPage.esm.js +185 -268
  43. package/dist/components/QetaPage/QetaPage.esm.js.map +1 -1
  44. package/dist/components/QetaPage/QetaPage.module.css.esm.js +8 -0
  45. package/dist/components/QetaPage/QetaPage.module.css.esm.js.map +1 -0
  46. package/dist/components/QetaSearchResultListItem/QetaSearchResultListItem.esm.js +67 -78
  47. package/dist/components/QetaSearchResultListItem/QetaSearchResultListItem.esm.js.map +1 -1
  48. package/dist/components/QetaSearchResultListItem/QetaSearchResultListItem.module.css.esm.js +8 -0
  49. package/dist/components/QetaSearchResultListItem/QetaSearchResultListItem.module.css.esm.js.map +1 -0
  50. package/dist/components/QuestionPage/QuestionPage.esm.js +118 -97
  51. package/dist/components/QuestionPage/QuestionPage.esm.js.map +1 -1
  52. package/dist/components/QuestionsPage/QuestionsPage.esm.js +4 -5
  53. package/dist/components/QuestionsPage/QuestionsPage.esm.js.map +1 -1
  54. package/dist/components/ReviewPage/ReviewPage.esm.js +53 -18
  55. package/dist/components/ReviewPage/ReviewPage.esm.js.map +1 -1
  56. package/dist/components/RightContent/ArticlesRightContent.esm.js +2 -2
  57. package/dist/components/RightContent/ArticlesRightContent.esm.js.map +1 -1
  58. package/dist/components/RightContent/DefaultRightContent.esm.js +2 -2
  59. package/dist/components/RightContent/DefaultRightContent.esm.js.map +1 -1
  60. package/dist/components/RightContent/EntityRightContent.esm.js +2 -2
  61. package/dist/components/RightContent/EntityRightContent.esm.js.map +1 -1
  62. package/dist/components/RightContent/LinkedPosts.esm.js +5 -19
  63. package/dist/components/RightContent/LinkedPosts.esm.js.map +1 -1
  64. package/dist/components/RightContent/LinkedPosts.module.css.esm.js +8 -0
  65. package/dist/components/RightContent/LinkedPosts.module.css.esm.js.map +1 -0
  66. package/dist/components/RightContent/LinksRightContent.esm.js +2 -2
  67. package/dist/components/RightContent/LinksRightContent.esm.js.map +1 -1
  68. package/dist/components/RightContent/PostRightContent.esm.js +4 -4
  69. package/dist/components/RightContent/PostRightContent.esm.js.map +1 -1
  70. package/dist/components/RightContent/QuestionsRightContent.esm.js +2 -2
  71. package/dist/components/RightContent/QuestionsRightContent.esm.js.map +1 -1
  72. package/dist/components/RightContent/RightContent.esm.js +36 -52
  73. package/dist/components/RightContent/RightContent.esm.js.map +1 -1
  74. package/dist/components/RightContent/RightContent.module.css.esm.js +8 -0
  75. package/dist/components/RightContent/RightContent.module.css.esm.js.map +1 -0
  76. package/dist/components/RightContent/SimilarQuestions.esm.js +3 -16
  77. package/dist/components/RightContent/SimilarQuestions.esm.js.map +1 -1
  78. package/dist/components/RightContent/SimilarQuestions.module.css.esm.js +8 -0
  79. package/dist/components/RightContent/SimilarQuestions.module.css.esm.js.map +1 -0
  80. package/dist/components/RightContent/TagRightContent.esm.js +2 -2
  81. package/dist/components/RightContent/TagRightContent.esm.js.map +1 -1
  82. package/dist/components/SettingsPage/SettingsPage.esm.js +198 -200
  83. package/dist/components/SettingsPage/SettingsPage.esm.js.map +1 -1
  84. package/dist/components/SettingsPage/SettingsPage.module.css.esm.js +8 -0
  85. package/dist/components/SettingsPage/SettingsPage.module.css.esm.js.map +1 -0
  86. package/dist/components/Statistics/GlobalStatsContent.esm.js +5 -5
  87. package/dist/components/Statistics/GlobalStatsContent.esm.js.map +1 -1
  88. package/dist/components/Statistics/StatisticsPage.esm.js +14 -19
  89. package/dist/components/Statistics/StatisticsPage.esm.js.map +1 -1
  90. package/dist/components/Statistics/StatisticsPage.module.css.esm.js +8 -0
  91. package/dist/components/Statistics/StatisticsPage.module.css.esm.js.map +1 -0
  92. package/dist/components/TagPage/TagPage.esm.js +54 -87
  93. package/dist/components/TagPage/TagPage.esm.js.map +1 -1
  94. package/dist/components/TechDocsAskQuestionAddon/TechDocsAskQuestionAddon.esm.js +23 -32
  95. package/dist/components/TechDocsAskQuestionAddon/TechDocsAskQuestionAddon.esm.js.map +1 -1
  96. package/dist/components/TechDocsAskQuestionAddon/TechDocsAskQuestionAddon.module.css.esm.js +8 -0
  97. package/dist/components/TechDocsAskQuestionAddon/TechDocsAskQuestionAddon.module.css.esm.js.map +1 -0
  98. package/dist/components/UserPage/UserPage.esm.js +137 -236
  99. package/dist/components/UserPage/UserPage.esm.js.map +1 -1
  100. package/dist/components/UserPage/UserPage.module.css.esm.js +8 -0
  101. package/dist/components/UserPage/UserPage.module.css.esm.js.map +1 -0
  102. package/dist/components/UserPage/UserStatsContent.esm.js +5 -5
  103. package/dist/components/UserPage/UserStatsContent.esm.js.map +1 -1
  104. package/dist/components/UsersPage/UsersPage.esm.js +3 -9
  105. package/dist/components/UsersPage/UsersPage.esm.js.map +1 -1
  106. package/dist/components/WritePage/WritePage.esm.js +5 -6
  107. package/dist/components/WritePage/WritePage.esm.js.map +1 -1
  108. package/dist/index.d.ts +283 -77
  109. package/dist/index.esm.js +262 -7
  110. package/dist/index.esm.js.map +1 -1
  111. package/dist/node_modules_dist/style-inject/dist/style-inject.es.esm.js +29 -0
  112. package/dist/node_modules_dist/style-inject/dist/style-inject.es.esm.js.map +1 -0
  113. package/dist/{package.json.esm.js → plugins/qeta/package.json.esm.js} +8 -13
  114. package/dist/{package.json.esm.js.map → plugins/qeta/package.json.esm.js.map} +1 -1
  115. package/package.json +9 -18
  116. package/dist/alpha.d.ts +0 -255
  117. package/dist/alpha.esm.js +0 -238
  118. package/dist/alpha.esm.js.map +0 -1
  119. package/dist/components/EntityCards/EntityPostsContainerCard.esm.js +0 -13
  120. package/dist/components/EntityCards/EntityPostsContainerCard.esm.js.map +0 -1
  121. package/dist/components/EntityCards/EntityPostsGridCard.esm.js +0 -20
  122. package/dist/components/EntityCards/EntityPostsGridCard.esm.js.map +0 -1
  123. package/dist/components/ReviewPage/index.esm.js +0 -6
  124. package/dist/components/ReviewPage/index.esm.js.map +0 -1
  125. package/dist/plugin.esm.js +0 -84
  126. package/dist/plugin.esm.js.map +0 -1
@@ -1,51 +1,20 @@
1
- import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
1
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
2
  import { useState, useMemo, useEffect } from 'react';
3
3
  import { useParams, useSearchParams } from 'react-router-dom';
4
- import { useUserInfo, qetaTranslationRef, useQetaConfig, useIdentityApi, useQetaApi, RelativeTimeWithTooltip, ContentHeader, UserFollowButton, AskQuestionButton, WriteArticleButton, CreateLinkButton, PostsContainer, CollectionsContainer, AnswersContainer } from '@drodil/backstage-plugin-qeta-react';
4
+ import { useUserInfo, qetaTranslationRef, useQetaConfig, useIdentityApi, useQetaApi, UserFollowButton, RelativeTimeWithTooltip, PostsContainer, CollectionsContainer, AnswersContainer } from '@drodil/backstage-plugin-qeta-react';
5
5
  import { UserStatsContent } from './UserStatsContent.esm.js';
6
- import { TabContext, TabList, TabPanel } from '@material-ui/lab';
7
- import { Box, Avatar, Typography, Tab, makeStyles } from '@material-ui/core';
6
+ import { Tab, Header, Tabs, TabList, TabPanel, Flex } from '@backstage/ui';
8
7
  import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
9
- import AssessmentIcon from '@material-ui/icons/Assessment';
10
- import HelpOutline from '@material-ui/icons/HelpOutline';
11
- import CollectionsBookmarkIcon from '@material-ui/icons/CollectionsBookmark';
12
- import CollectionsIcon from '@material-ui/icons/Collections';
13
- import QuestionAnswerIcon from '@material-ui/icons/QuestionAnswer';
14
- import LinkIcon from '@material-ui/icons/Link';
8
+ import { RiBarChartLine, RiQuestionLine, RiBookmarkLine, RiLink, RiStackLine, RiQuestionAnswerLine } from '@remixicon/react';
9
+ import styles from './UserPage.module.css.esm.js';
10
+ import { EntityRefLink } from '@backstage/plugin-catalog-react';
15
11
 
16
- const useStyles = makeStyles((theme) => ({
17
- tabIcon: {
18
- marginRight: theme.spacing(1)
19
- },
20
- tabPanel: {
21
- padding: theme.spacing(3, 0)
22
- },
23
- avatar: {
24
- width: theme.spacing(12),
25
- height: theme.spacing(12),
26
- marginRight: theme.spacing(3),
27
- boxShadow: theme.shadows[2]
28
- },
29
- headerContent: {
30
- display: "flex",
31
- alignItems: "center",
32
- padding: theme.spacing(3, 0)
33
- },
34
- tabList: {},
35
- tabLabel: {
36
- display: "flex",
37
- alignItems: "center",
38
- justifyContent: "flex-start",
39
- minWidth: 0
40
- }
41
- }));
42
12
  const UserPage = () => {
43
13
  const identity = useParams()["*"] ?? "unknown";
44
- const { name, initials, user, secondaryTitle } = useUserInfo(identity);
14
+ const { name, user, secondaryTitle } = useUserInfo(identity);
45
15
  const [tab, setTab] = useState("statistics");
46
16
  const { t } = useTranslationRef(qetaTranslationRef);
47
17
  const [_searchParams, setSearchParams] = useSearchParams();
48
- const classes = useStyles();
49
18
  const { disabled } = useQetaConfig();
50
19
  const {
51
20
  value: currentUser,
@@ -56,7 +25,7 @@ const UserPage = () => {
56
25
  (api) => api.getUserStats(identity),
57
26
  [identity]
58
27
  );
59
- const handleChange = (_event, newValue) => {
28
+ const handleChange = (newValue) => {
60
29
  setSearchParams({});
61
30
  setTab(newValue);
62
31
  };
@@ -75,215 +44,147 @@ const UserPage = () => {
75
44
  setTab(availableTabs[0]);
76
45
  }
77
46
  }, [availableTabs, tab]);
78
- const TabLabel = ({
79
- icon,
80
- label
81
- }) => /* @__PURE__ */ jsxs("div", { className: classes.tabLabel, children: [
47
+ const TabLabel = ({ icon, label }) => /* @__PURE__ */ jsxs(Flex, { align: "center", gap: "2", className: styles.tabLabel, children: [
82
48
  icon,
83
49
  /* @__PURE__ */ jsx("span", { children: label })
84
50
  ] });
85
- const title = /* @__PURE__ */ jsxs(
86
- Box,
87
- {
88
- className: classes.headerContent,
89
- role: "banner",
90
- "aria-label": t("userPage.profileHeader", {}),
91
- children: [
92
- /* @__PURE__ */ jsx(
93
- Avatar,
94
- {
95
- src: user?.spec?.profile?.picture,
96
- alt: name,
97
- variant: "rounded",
98
- className: classes.avatar,
99
- "aria-label": t("userPage.profilePicture", { name }),
100
- children: initials
101
- }
102
- ),
103
- /* @__PURE__ */ jsxs(Box, { display: "flex", flexDirection: "column", justifyContent: "center", children: [
104
- /* @__PURE__ */ jsx(Box, { display: "flex", alignItems: "center", children: /* @__PURE__ */ jsx(
105
- Typography,
106
- {
107
- variant: "h4",
108
- component: "h2",
109
- id: "user-name",
110
- style: { fontWeight: 700 },
111
- children: name
112
- }
113
- ) }),
114
- (secondaryTitle || user?.spec?.profile?.email) && /* @__PURE__ */ jsx(Typography, { variant: "h6", color: "textSecondary", children: secondaryTitle || user?.spec?.profile?.email }),
115
- userStats?.summary?.lastSeen && /* @__PURE__ */ jsxs(Typography, { variant: "body2", color: "textSecondary", children: [
116
- t("stats.lastSeen"),
117
- ":",
118
- " ",
119
- /* @__PURE__ */ jsx(RelativeTimeWithTooltip, { value: userStats.summary.lastSeen })
120
- ] })
121
- ] })
122
- ]
123
- }
124
- );
125
51
  const tabItems = [
126
- /* @__PURE__ */ jsx(
127
- Tab,
52
+ /* @__PURE__ */ jsx(Tab, { id: "statistics", children: /* @__PURE__ */ jsx(
53
+ TabLabel,
128
54
  {
129
- value: "statistics",
130
- label: /* @__PURE__ */ jsx(
131
- TabLabel,
132
- {
133
- icon: /* @__PURE__ */ jsx(AssessmentIcon, { className: classes.tabIcon }),
134
- label: t("userPage.statistics", {})
135
- }
136
- )
137
- },
138
- "statistics"
139
- ),
140
- !disabled.questions ? /* @__PURE__ */ jsx(
141
- Tab,
55
+ icon: /* @__PURE__ */ jsx(RiBarChartLine, { size: 16 }),
56
+ label: t("userPage.statistics", {})
57
+ }
58
+ ) }, "statistics"),
59
+ !disabled.questions ? /* @__PURE__ */ jsx(Tab, { id: "questions", children: /* @__PURE__ */ jsx(
60
+ TabLabel,
142
61
  {
143
- value: "questions",
144
- label: /* @__PURE__ */ jsx(
145
- TabLabel,
146
- {
147
- icon: /* @__PURE__ */ jsx(HelpOutline, { className: classes.tabIcon }),
148
- label: t("userPage.questions", {})
149
- }
150
- )
151
- },
152
- "questions"
153
- ) : null,
154
- !disabled.articles ? /* @__PURE__ */ jsx(
155
- Tab,
62
+ icon: /* @__PURE__ */ jsx(RiQuestionLine, { size: 16 }),
63
+ label: t("userPage.questions", {})
64
+ }
65
+ ) }, "questions") : null,
66
+ !disabled.articles ? /* @__PURE__ */ jsx(Tab, { id: "articles", children: /* @__PURE__ */ jsx(
67
+ TabLabel,
156
68
  {
157
- value: "articles",
158
- label: /* @__PURE__ */ jsx(
159
- TabLabel,
160
- {
161
- icon: /* @__PURE__ */ jsx(CollectionsBookmarkIcon, { className: classes.tabIcon }),
162
- label: t("userPage.articles", {})
163
- }
164
- )
165
- },
166
- "articles"
167
- ) : null,
168
- !disabled.links ? /* @__PURE__ */ jsx(
169
- Tab,
69
+ icon: /* @__PURE__ */ jsx(RiBookmarkLine, { size: 16 }),
70
+ label: t("userPage.articles", {})
71
+ }
72
+ ) }, "articles") : null,
73
+ !disabled.links ? /* @__PURE__ */ jsx(Tab, { id: "links", children: /* @__PURE__ */ jsx(TabLabel, { icon: /* @__PURE__ */ jsx(RiLink, { size: 16 }), label: t("userPage.links", {}) }) }, "links") : null,
74
+ !disabled.collections ? /* @__PURE__ */ jsx(Tab, { id: "collections", children: /* @__PURE__ */ jsx(
75
+ TabLabel,
170
76
  {
171
- value: "links",
172
- label: /* @__PURE__ */ jsx(
173
- TabLabel,
174
- {
175
- icon: /* @__PURE__ */ jsx(LinkIcon, { className: classes.tabIcon }),
176
- label: t("userPage.links", {})
177
- }
178
- )
179
- },
180
- "links"
181
- ) : null,
182
- !disabled.collections ? /* @__PURE__ */ jsx(
183
- Tab,
77
+ icon: /* @__PURE__ */ jsx(RiStackLine, { size: 16 }),
78
+ label: t("userPage.collections", {})
79
+ }
80
+ ) }, "collections") : null,
81
+ !disabled.questions ? /* @__PURE__ */ jsx(Tab, { id: "answers", children: /* @__PURE__ */ jsx(
82
+ TabLabel,
184
83
  {
185
- value: "collections",
186
- label: /* @__PURE__ */ jsx(
187
- TabLabel,
188
- {
189
- icon: /* @__PURE__ */ jsx(CollectionsIcon, { className: classes.tabIcon }),
190
- label: t("userPage.collections", {})
191
- }
192
- )
193
- },
194
- "collections"
195
- ) : null,
196
- !disabled.questions ? /* @__PURE__ */ jsx(
197
- Tab,
84
+ icon: /* @__PURE__ */ jsx(RiQuestionAnswerLine, { size: 16 }),
85
+ label: t("userPage.answers", {})
86
+ }
87
+ ) }, "answers") : null
88
+ ].filter((item) => item !== null);
89
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
90
+ /* @__PURE__ */ jsx(
91
+ Header,
198
92
  {
199
- value: "answers",
200
- label: /* @__PURE__ */ jsx(
201
- TabLabel,
93
+ title: name,
94
+ metadata: [
95
+ ...secondaryTitle || user?.spec?.profile?.email ? [
96
+ {
97
+ label: t("userPage.profileHeader", {}),
98
+ value: /* @__PURE__ */ jsx(EntityRefLink, { entityRef: identity, children: secondaryTitle || user?.spec?.profile?.email })
99
+ }
100
+ ] : [],
101
+ ...userStats?.summary?.lastSeen ? [
102
+ {
103
+ label: t("stats.lastSeen"),
104
+ value: /* @__PURE__ */ jsx(
105
+ RelativeTimeWithTooltip,
106
+ {
107
+ value: userStats.summary.lastSeen
108
+ }
109
+ )
110
+ }
111
+ ] : [],
112
+ ...userStats?.summary?.totalFollowers ? [
113
+ {
114
+ label: t("metadata.followers"),
115
+ value: userStats.summary.totalFollowers
116
+ }
117
+ ] : []
118
+ ],
119
+ customActions: /* @__PURE__ */ jsx(Fragment, { children: !loadingUser && !userError && currentUser?.userEntityRef !== identity && /* @__PURE__ */ jsx(
120
+ UserFollowButton,
202
121
  {
203
- icon: /* @__PURE__ */ jsx(QuestionAnswerIcon, { className: classes.tabIcon }),
204
- label: t("userPage.answers", {})
122
+ userRef: identity,
123
+ "aria-label": t("userPage.followUser", { name })
205
124
  }
206
- )
207
- },
208
- "answers"
209
- ) : null
210
- ].filter((item) => item !== null);
211
- return /* @__PURE__ */ jsxs(Fragment, { children: [
212
- /* @__PURE__ */ jsxs(ContentHeader, { titleComponent: title, children: [
213
- !loadingUser && !userError && currentUser?.userEntityRef !== identity && /* @__PURE__ */ jsx(
214
- UserFollowButton,
215
- {
216
- userRef: identity,
217
- "aria-label": t("userPage.followUser", { name })
218
- }
219
- ),
220
- /* @__PURE__ */ jsx(AskQuestionButton, {}),
221
- /* @__PURE__ */ jsx(WriteArticleButton, {}),
222
- /* @__PURE__ */ jsx(CreateLinkButton, {})
223
- ] }),
224
- /* @__PURE__ */ jsxs(TabContext, { value: tab, children: [
225
- /* @__PURE__ */ jsx(Box, { className: classes.tabList, children: /* @__PURE__ */ jsx(
226
- TabList,
227
- {
228
- onChange: handleChange,
229
- "aria-label": t("userPage.profileTab", {}),
230
- "aria-labelledby": "user-name",
231
- variant: "scrollable",
232
- scrollButtons: "auto",
233
- children: tabItems
234
- }
235
- ) }),
236
- /* @__PURE__ */ jsx(TabPanel, { value: "statistics", className: classes.tabPanel, children: /* @__PURE__ */ jsx(
237
- UserStatsContent,
238
- {
239
- userRef: identity ?? "",
240
- stats: userStats,
241
- loading: loadingUserStats
242
- }
243
- ) }),
244
- !disabled.questions && /* @__PURE__ */ jsx(TabPanel, { value: "questions", className: classes.tabPanel, children: /* @__PURE__ */ jsx(
245
- PostsContainer,
246
- {
247
- author: identity ?? "",
248
- showNoQuestionsBtn: false,
249
- type: "question",
250
- prefix: "user-questions"
251
- }
252
- ) }),
253
- !disabled.articles && /* @__PURE__ */ jsx(TabPanel, { value: "articles", className: classes.tabPanel, children: /* @__PURE__ */ jsx(
254
- PostsContainer,
255
- {
256
- author: identity ?? "",
257
- type: "article",
258
- showNoQuestionsBtn: false,
259
- prefix: "user-articles"
260
- }
261
- ) }),
262
- !disabled.links && /* @__PURE__ */ jsx(TabPanel, { value: "links", className: classes.tabPanel, children: /* @__PURE__ */ jsx(
263
- PostsContainer,
264
- {
265
- author: identity ?? "",
266
- type: "link",
267
- showNoQuestionsBtn: false,
268
- prefix: "user-links"
269
- }
270
- ) }),
271
- !disabled.collections && /* @__PURE__ */ jsx(TabPanel, { value: "collections", className: classes.tabPanel, children: /* @__PURE__ */ jsx(
272
- CollectionsContainer,
273
- {
274
- owner: identity ?? "",
275
- prefix: "user-collections"
276
- }
277
- ) }),
278
- !disabled.questions && /* @__PURE__ */ jsx(TabPanel, { value: "answers", className: classes.tabPanel, children: /* @__PURE__ */ jsx(
279
- AnswersContainer,
280
- {
281
- author: identity ?? "",
282
- title: t("userPage.answers", {}),
283
- prefix: "user-answers"
284
- }
285
- ) })
286
- ] })
125
+ ) })
126
+ }
127
+ ),
128
+ /* @__PURE__ */ jsxs(
129
+ Tabs,
130
+ {
131
+ selectedKey: tab,
132
+ onSelectionChange: (key) => handleChange(key),
133
+ children: [
134
+ /* @__PURE__ */ jsx(TabList, { "aria-label": t("userPage.profileTab", {}), children: tabItems }),
135
+ /* @__PURE__ */ jsx(TabPanel, { id: "statistics", className: styles.tabPanel, children: /* @__PURE__ */ jsx(
136
+ UserStatsContent,
137
+ {
138
+ userRef: identity ?? "",
139
+ stats: userStats,
140
+ loading: loadingUserStats
141
+ }
142
+ ) }),
143
+ !disabled.questions && /* @__PURE__ */ jsx(TabPanel, { id: "questions", className: styles.tabPanel, children: /* @__PURE__ */ jsx(
144
+ PostsContainer,
145
+ {
146
+ author: identity ?? "",
147
+ showNoQuestionsBtn: false,
148
+ type: "question",
149
+ prefix: "user-questions"
150
+ }
151
+ ) }),
152
+ !disabled.articles && /* @__PURE__ */ jsx(TabPanel, { id: "articles", className: styles.tabPanel, children: /* @__PURE__ */ jsx(
153
+ PostsContainer,
154
+ {
155
+ author: identity ?? "",
156
+ type: "article",
157
+ showNoQuestionsBtn: false,
158
+ prefix: "user-articles"
159
+ }
160
+ ) }),
161
+ !disabled.links && /* @__PURE__ */ jsx(TabPanel, { id: "links", className: styles.tabPanel, children: /* @__PURE__ */ jsx(
162
+ PostsContainer,
163
+ {
164
+ author: identity ?? "",
165
+ type: "link",
166
+ showNoQuestionsBtn: false,
167
+ prefix: "user-links"
168
+ }
169
+ ) }),
170
+ !disabled.collections && /* @__PURE__ */ jsx(TabPanel, { id: "collections", className: styles.tabPanel, children: /* @__PURE__ */ jsx(
171
+ CollectionsContainer,
172
+ {
173
+ owner: identity ?? "",
174
+ prefix: "user-collections"
175
+ }
176
+ ) }),
177
+ !disabled.questions && /* @__PURE__ */ jsx(TabPanel, { id: "answers", className: styles.tabPanel, children: /* @__PURE__ */ jsx(
178
+ AnswersContainer,
179
+ {
180
+ author: identity ?? "",
181
+ title: t("userPage.answers", {}),
182
+ prefix: "user-answers"
183
+ }
184
+ ) })
185
+ ]
186
+ }
187
+ )
287
188
  ] });
288
189
  };
289
190
 
@@ -1 +1 @@
1
- {"version":3,"file":"UserPage.esm.js","sources":["../../../src/components/UserPage/UserPage.tsx"],"sourcesContent":["import React, { ChangeEvent, useEffect, useMemo, useState } from 'react';\nimport { useParams, useSearchParams } from 'react-router-dom';\nimport {\n AnswersContainer,\n AskQuestionButton,\n CollectionsContainer,\n ContentHeader,\n CreateLinkButton,\n PostsContainer,\n qetaTranslationRef,\n useIdentityApi,\n UserFollowButton,\n useUserInfo,\n WriteArticleButton,\n useQetaApi,\n RelativeTimeWithTooltip,\n useQetaConfig,\n} from '@drodil/backstage-plugin-qeta-react';\nimport { UserStatsContent } from './UserStatsContent';\nimport { TabContext, TabList, TabPanel } from '@material-ui/lab';\nimport { Avatar, Box, makeStyles, Tab, Typography } from '@material-ui/core';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport AssessmentIcon from '@material-ui/icons/Assessment';\nimport HelpOutlineIcon from '@material-ui/icons/HelpOutline';\nimport CollectionsBookmarkIcon from '@material-ui/icons/CollectionsBookmark';\nimport CollectionsIcon from '@material-ui/icons/Collections';\nimport QuestionAnswerIcon from '@material-ui/icons/QuestionAnswer';\nimport LinkIcon from '@material-ui/icons/Link';\n\nconst useStyles = makeStyles(theme => ({\n tabIcon: {\n marginRight: theme.spacing(1),\n },\n tabPanel: {\n padding: theme.spacing(3, 0),\n },\n avatar: {\n width: theme.spacing(12),\n height: theme.spacing(12),\n marginRight: theme.spacing(3),\n boxShadow: theme.shadows[2],\n },\n headerContent: {\n display: 'flex',\n alignItems: 'center',\n padding: theme.spacing(3, 0),\n },\n tabList: {},\n tabLabel: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-start',\n minWidth: 0,\n },\n}));\n\nexport const UserPage = () => {\n const identity = useParams()['*'] ?? 'unknown';\n const { name, initials, user, secondaryTitle } = useUserInfo(identity);\n const [tab, setTab] = useState('statistics');\n const { t } = useTranslationRef(qetaTranslationRef);\n const [_searchParams, setSearchParams] = useSearchParams();\n const classes = useStyles();\n const { disabled } = useQetaConfig();\n const {\n value: currentUser,\n loading: loadingUser,\n error: userError,\n } = useIdentityApi(api => api.getBackstageIdentity(), []);\n const { value: userStats, loading: loadingUserStats } = useQetaApi(\n api => api.getUserStats(identity),\n [identity],\n );\n\n const handleChange = (_event: ChangeEvent<{}>, newValue: string) => {\n setSearchParams({});\n setTab(newValue);\n };\n\n const availableTabs = useMemo(() => {\n return [\n 'statistics',\n !disabled.questions ? 'questions' : null,\n !disabled.articles ? 'articles' : null,\n !disabled.links ? 'links' : null,\n !disabled.collections ? 'collections' : null,\n !disabled.questions ? 'answers' : null,\n ].filter((v): v is string => Boolean(v));\n }, [disabled]);\n\n useEffect(() => {\n if (!availableTabs.includes(tab)) {\n setTab(availableTabs[0]);\n }\n }, [availableTabs, tab]);\n\n const TabLabel = ({\n icon,\n label,\n }: {\n icon: React.ReactNode;\n label: string;\n }) => (\n <div className={classes.tabLabel}>\n {icon}\n <span>{label}</span>\n </div>\n );\n\n const title = (\n <Box\n className={classes.headerContent}\n role=\"banner\"\n aria-label={t('userPage.profileHeader', {})}\n >\n <Avatar\n src={user?.spec?.profile?.picture}\n alt={name}\n variant=\"rounded\"\n className={classes.avatar}\n aria-label={t('userPage.profilePicture', { name })}\n >\n {initials}\n </Avatar>\n <Box display=\"flex\" flexDirection=\"column\" justifyContent=\"center\">\n <Box display=\"flex\" alignItems=\"center\">\n <Typography\n variant=\"h4\"\n component=\"h2\"\n id=\"user-name\"\n style={{ fontWeight: 700 }}\n >\n {name}\n </Typography>\n </Box>\n {(secondaryTitle || user?.spec?.profile?.email) && (\n <Typography variant=\"h6\" color=\"textSecondary\">\n {secondaryTitle || user?.spec?.profile?.email}\n </Typography>\n )}\n {userStats?.summary?.lastSeen && (\n <Typography variant=\"body2\" color=\"textSecondary\">\n {t('stats.lastSeen')}:{' '}\n <RelativeTimeWithTooltip value={userStats.summary.lastSeen} />\n </Typography>\n )}\n </Box>\n </Box>\n );\n\n const tabItems = [\n <Tab\n key=\"statistics\"\n value=\"statistics\"\n label={\n <TabLabel\n icon={<AssessmentIcon className={classes.tabIcon} />}\n label={t('userPage.statistics', {})}\n />\n }\n />,\n !disabled.questions ? (\n <Tab\n key=\"questions\"\n value=\"questions\"\n label={\n <TabLabel\n icon={<HelpOutlineIcon className={classes.tabIcon} />}\n label={t('userPage.questions', {})}\n />\n }\n />\n ) : null,\n !disabled.articles ? (\n <Tab\n key=\"articles\"\n value=\"articles\"\n label={\n <TabLabel\n icon={<CollectionsBookmarkIcon className={classes.tabIcon} />}\n label={t('userPage.articles', {})}\n />\n }\n />\n ) : null,\n !disabled.links ? (\n <Tab\n key=\"links\"\n value=\"links\"\n label={\n <TabLabel\n icon={<LinkIcon className={classes.tabIcon} />}\n label={t('userPage.links', {})}\n />\n }\n />\n ) : null,\n !disabled.collections ? (\n <Tab\n key=\"collections\"\n value=\"collections\"\n label={\n <TabLabel\n icon={<CollectionsIcon className={classes.tabIcon} />}\n label={t('userPage.collections', {})}\n />\n }\n />\n ) : null,\n !disabled.questions ? (\n <Tab\n key=\"answers\"\n value=\"answers\"\n label={\n <TabLabel\n icon={<QuestionAnswerIcon className={classes.tabIcon} />}\n label={t('userPage.answers', {})}\n />\n }\n />\n ) : null,\n ].filter((item): item is React.ReactElement => item !== null);\n\n return (\n <>\n <ContentHeader titleComponent={title}>\n {!loadingUser &&\n !userError &&\n currentUser?.userEntityRef !== identity && (\n <UserFollowButton\n userRef={identity}\n aria-label={t('userPage.followUser', { name })}\n />\n )}\n <AskQuestionButton />\n <WriteArticleButton />\n <CreateLinkButton />\n </ContentHeader>\n <TabContext value={tab}>\n <Box className={classes.tabList}>\n <TabList\n onChange={handleChange}\n aria-label={t('userPage.profileTab', {})}\n aria-labelledby=\"user-name\"\n variant=\"scrollable\"\n scrollButtons=\"auto\"\n >\n {tabItems}\n </TabList>\n </Box>\n <TabPanel value=\"statistics\" className={classes.tabPanel}>\n <UserStatsContent\n userRef={identity ?? ''}\n stats={userStats}\n loading={loadingUserStats}\n />\n </TabPanel>\n {!disabled.questions && (\n <TabPanel value=\"questions\" className={classes.tabPanel}>\n <PostsContainer\n author={identity ?? ''}\n showNoQuestionsBtn={false}\n type=\"question\"\n prefix=\"user-questions\"\n />\n </TabPanel>\n )}\n {!disabled.articles && (\n <TabPanel value=\"articles\" className={classes.tabPanel}>\n <PostsContainer\n author={identity ?? ''}\n type=\"article\"\n showNoQuestionsBtn={false}\n prefix=\"user-articles\"\n />\n </TabPanel>\n )}\n {!disabled.links && (\n <TabPanel value=\"links\" className={classes.tabPanel}>\n <PostsContainer\n author={identity ?? ''}\n type=\"link\"\n showNoQuestionsBtn={false}\n prefix=\"user-links\"\n />\n </TabPanel>\n )}\n {!disabled.collections && (\n <TabPanel value=\"collections\" className={classes.tabPanel}>\n <CollectionsContainer\n owner={identity ?? ''}\n prefix=\"user-collections\"\n />\n </TabPanel>\n )}\n {!disabled.questions && (\n <TabPanel value=\"answers\" className={classes.tabPanel}>\n <AnswersContainer\n author={identity ?? ''}\n title={t('userPage.answers', {})}\n prefix=\"user-answers\"\n />\n </TabPanel>\n )}\n </TabContext>\n </>\n );\n};\n"],"names":["HelpOutlineIcon"],"mappings":"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"}
1
+ {"version":3,"file":"UserPage.esm.js","sources":["../../../src/components/UserPage/UserPage.tsx"],"sourcesContent":["import { ReactElement, ReactNode, useEffect, useMemo, useState } from 'react';\nimport { useParams, useSearchParams } from 'react-router-dom';\nimport {\n AnswersContainer,\n CollectionsContainer,\n PostsContainer,\n qetaTranslationRef,\n RelativeTimeWithTooltip,\n useIdentityApi,\n useQetaApi,\n useQetaConfig,\n UserFollowButton,\n useUserInfo,\n} from '@drodil/backstage-plugin-qeta-react';\nimport { UserStatsContent } from './UserStatsContent';\nimport { Flex, Header, Tab, TabList, TabPanel, Tabs } from '@backstage/ui';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport {\n RiBarChartLine,\n RiBookmarkLine,\n RiLink,\n RiQuestionAnswerLine,\n RiQuestionLine,\n RiStackLine,\n} from '@remixicon/react';\nimport styles from './UserPage.module.css';\nimport { EntityRefLink } from '@backstage/plugin-catalog-react';\n\nexport const UserPage = () => {\n const identity = useParams()['*'] ?? 'unknown';\n const { name, user, secondaryTitle } = useUserInfo(identity);\n const [tab, setTab] = useState('statistics');\n const { t } = useTranslationRef(qetaTranslationRef);\n const [_searchParams, setSearchParams] = useSearchParams();\n const { disabled } = useQetaConfig();\n const {\n value: currentUser,\n loading: loadingUser,\n error: userError,\n } = useIdentityApi(api => api.getBackstageIdentity(), []);\n const { value: userStats, loading: loadingUserStats } = useQetaApi(\n api => api.getUserStats(identity),\n [identity],\n );\n\n const handleChange = (newValue: string) => {\n setSearchParams({});\n setTab(newValue);\n };\n\n const availableTabs = useMemo(() => {\n return [\n 'statistics',\n !disabled.questions ? 'questions' : null,\n !disabled.articles ? 'articles' : null,\n !disabled.links ? 'links' : null,\n !disabled.collections ? 'collections' : null,\n !disabled.questions ? 'answers' : null,\n ].filter((v): v is string => Boolean(v));\n }, [disabled]);\n\n useEffect(() => {\n if (!availableTabs.includes(tab)) {\n setTab(availableTabs[0]);\n }\n }, [availableTabs, tab]);\n\n const TabLabel = ({ icon, label }: { icon: ReactNode; label: string }) => (\n <Flex align=\"center\" gap=\"2\" className={styles.tabLabel}>\n {icon}\n <span>{label}</span>\n </Flex>\n );\n\n const tabItems = [\n <Tab key=\"statistics\" id=\"statistics\">\n <TabLabel\n icon={<RiBarChartLine size={16} />}\n label={t('userPage.statistics', {})}\n />\n </Tab>,\n !disabled.questions ? (\n <Tab key=\"questions\" id=\"questions\">\n <TabLabel\n icon={<RiQuestionLine size={16} />}\n label={t('userPage.questions', {})}\n />\n </Tab>\n ) : null,\n !disabled.articles ? (\n <Tab key=\"articles\" id=\"articles\">\n <TabLabel\n icon={<RiBookmarkLine size={16} />}\n label={t('userPage.articles', {})}\n />\n </Tab>\n ) : null,\n !disabled.links ? (\n <Tab key=\"links\" id=\"links\">\n <TabLabel icon={<RiLink size={16} />} label={t('userPage.links', {})} />\n </Tab>\n ) : null,\n !disabled.collections ? (\n <Tab key=\"collections\" id=\"collections\">\n <TabLabel\n icon={<RiStackLine size={16} />}\n label={t('userPage.collections', {})}\n />\n </Tab>\n ) : null,\n !disabled.questions ? (\n <Tab key=\"answers\" id=\"answers\">\n <TabLabel\n icon={<RiQuestionAnswerLine size={16} />}\n label={t('userPage.answers', {})}\n />\n </Tab>\n ) : null,\n ].filter((item): item is ReactElement => item !== null);\n\n return (\n <>\n <Header\n title={name}\n metadata={[\n ...(secondaryTitle || user?.spec?.profile?.email\n ? [\n {\n label: t('userPage.profileHeader', {}),\n value: (\n <EntityRefLink entityRef={identity}>\n {secondaryTitle || user?.spec?.profile?.email}\n </EntityRefLink>\n ),\n },\n ]\n : []),\n ...(userStats?.summary?.lastSeen\n ? [\n {\n label: t('stats.lastSeen'),\n value: (\n <RelativeTimeWithTooltip\n value={userStats.summary.lastSeen}\n />\n ),\n },\n ]\n : []),\n ...(userStats?.summary?.totalFollowers\n ? [\n {\n label: t('metadata.followers'),\n value: userStats.summary.totalFollowers,\n },\n ]\n : []),\n ]}\n customActions={\n <>\n {!loadingUser &&\n !userError &&\n currentUser?.userEntityRef !== identity && (\n <UserFollowButton\n userRef={identity}\n aria-label={t('userPage.followUser', { name })}\n />\n )}\n </>\n }\n />\n <Tabs\n selectedKey={tab}\n onSelectionChange={key => handleChange(key as string)}\n >\n <TabList aria-label={t('userPage.profileTab', {})}>{tabItems}</TabList>\n <TabPanel id=\"statistics\" className={styles.tabPanel}>\n <UserStatsContent\n userRef={identity ?? ''}\n stats={userStats}\n loading={loadingUserStats}\n />\n </TabPanel>\n {!disabled.questions && (\n <TabPanel id=\"questions\" className={styles.tabPanel}>\n <PostsContainer\n author={identity ?? ''}\n showNoQuestionsBtn={false}\n type=\"question\"\n prefix=\"user-questions\"\n />\n </TabPanel>\n )}\n {!disabled.articles && (\n <TabPanel id=\"articles\" className={styles.tabPanel}>\n <PostsContainer\n author={identity ?? ''}\n type=\"article\"\n showNoQuestionsBtn={false}\n prefix=\"user-articles\"\n />\n </TabPanel>\n )}\n {!disabled.links && (\n <TabPanel id=\"links\" className={styles.tabPanel}>\n <PostsContainer\n author={identity ?? ''}\n type=\"link\"\n showNoQuestionsBtn={false}\n prefix=\"user-links\"\n />\n </TabPanel>\n )}\n {!disabled.collections && (\n <TabPanel id=\"collections\" className={styles.tabPanel}>\n <CollectionsContainer\n owner={identity ?? ''}\n prefix=\"user-collections\"\n />\n </TabPanel>\n )}\n {!disabled.questions && (\n <TabPanel id=\"answers\" className={styles.tabPanel}>\n <AnswersContainer\n author={identity ?? ''}\n title={t('userPage.answers', {})}\n prefix=\"user-answers\"\n />\n </TabPanel>\n )}\n </Tabs>\n </>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import styleInject from '../../node_modules_dist/style-inject/dist/style-inject.es.esm.js';
2
+
3
+ var css_248z = "@layer components {\n .UserPage_tabPanel__16da0feece {\n padding: var(--bui-space-6) 0;\n }\n\n .UserPage_tabLabel__16da0feece {\n justify-content: flex-start;\n }\n}\n";
4
+ var styles = {"tabPanel":"UserPage_tabPanel__16da0feece","tabLabel":"UserPage_tabLabel__16da0feece"};
5
+ styleInject(css_248z);
6
+
7
+ export { styles as default };
8
+ //# sourceMappingURL=UserPage.module.css.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UserPage.module.css.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
@@ -1,6 +1,6 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import { useQetaApi, UserBadges, StatsChart } from '@drodil/backstage-plugin-qeta-react';
3
- import { Grid, Card, CardContent, CircularProgress } from '@material-ui/core';
3
+ import { Grid, Card, CardBody, Skeleton } from '@backstage/ui';
4
4
 
5
5
  const UserStatsContent = (props) => {
6
6
  const {
@@ -21,9 +21,9 @@ const UserStatsContent = (props) => {
21
21
  if (error) {
22
22
  return null;
23
23
  }
24
- return /* @__PURE__ */ jsxs(Grid, { container: true, spacing: 3, children: [
25
- /* @__PURE__ */ jsx(Grid, { item: true, xs: 12, children: /* @__PURE__ */ jsx(Card, { children: /* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsx(UserBadges, { entityRef: props.userRef }) }) }) }),
26
- /* @__PURE__ */ jsx(Grid, { item: true, xs: 12, children: /* @__PURE__ */ jsx(Card, { children: /* @__PURE__ */ jsxs(CardContent, { children: [
24
+ return /* @__PURE__ */ jsxs(Grid.Root, { columns: { sm: "12" }, gap: "6", children: [
25
+ /* @__PURE__ */ jsx(Grid.Item, { colSpan: { sm: "12" }, children: /* @__PURE__ */ jsx(Card, { children: /* @__PURE__ */ jsx(CardBody, { children: /* @__PURE__ */ jsx(UserBadges, { entityRef: props.userRef }) }) }) }),
26
+ /* @__PURE__ */ jsx(Grid.Item, { colSpan: { sm: "12" }, children: /* @__PURE__ */ jsx(Card, { children: /* @__PURE__ */ jsxs(CardBody, { children: [
27
27
  !isLoading && stats && /* @__PURE__ */ jsx(
28
28
  StatsChart,
29
29
  {
@@ -31,7 +31,7 @@ const UserStatsContent = (props) => {
31
31
  summary: stats.summary
32
32
  }
33
33
  ),
34
- isLoading && !props.stats && /* @__PURE__ */ jsx(CircularProgress, {})
34
+ isLoading && !props.stats && /* @__PURE__ */ jsx(Skeleton, { width: "100%", height: 300 })
35
35
  ] }) }) })
36
36
  ] });
37
37
  };
@@ -1 +1 @@
1
- {"version":3,"file":"UserStatsContent.esm.js","sources":["../../../src/components/UserPage/UserStatsContent.tsx"],"sourcesContent":["import {\n StatsChart,\n useQetaApi,\n UserBadges,\n} from '@drodil/backstage-plugin-qeta-react';\nimport {\n StatisticsResponse,\n UserStat,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { Card, CardContent, CircularProgress, Grid } from '@material-ui/core';\n\nexport const UserStatsContent = (props: {\n userRef: string;\n stats?: StatisticsResponse<UserStat>;\n loading?: boolean;\n}) => {\n const {\n value: response,\n loading,\n error,\n } = useQetaApi(\n api => {\n if (props.stats) {\n return Promise.resolve(props.stats);\n }\n return api.getUserStats(props.userRef);\n },\n [props.userRef, props.stats],\n );\n\n const stats = props.stats || response;\n const isLoading = props.loading || loading;\n\n if (error) {\n return null;\n }\n return (\n <Grid container spacing={3}>\n <Grid item xs={12}>\n <Card>\n <CardContent>\n <UserBadges entityRef={props.userRef} />\n </CardContent>\n </Card>\n </Grid>\n <Grid item xs={12}>\n <Card>\n <CardContent>\n {!isLoading && stats && (\n <StatsChart\n data={stats.statistics}\n summary={stats.summary as unknown as Record<string, number>}\n />\n )}\n {isLoading && !props.stats && <CircularProgress />}\n </CardContent>\n </Card>\n </Grid>\n </Grid>\n );\n};\n"],"names":[],"mappings":";;;;AAWO,MAAM,gBAAA,GAAmB,CAAC,KAAA,KAI3B;AACJ,EAAA,MAAM;AAAA,IACJ,KAAA,EAAO,QAAA;AAAA,IACP,OAAA;AAAA,IACA;AAAA,GACF,GAAI,UAAA;AAAA,IACF,CAAA,GAAA,KAAO;AACL,MAAA,IAAI,MAAM,KAAA,EAAO;AACf,QAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,KAAA,CAAM,KAAK,CAAA;AAAA,MACpC;AACA,MAAA,OAAO,GAAA,CAAI,YAAA,CAAa,KAAA,CAAM,OAAO,CAAA;AAAA,IACvC,CAAA;AAAA,IACA,CAAC,KAAA,CAAM,OAAA,EAAS,KAAA,CAAM,KAAK;AAAA,GAC7B;AAEA,EAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,IAAS,QAAA;AAC7B,EAAA,MAAM,SAAA,GAAY,MAAM,OAAA,IAAW,OAAA;AAEnC,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,uBACE,IAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAS,IAAA,EAAC,SAAS,CAAA,EACvB,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,QAAK,IAAA,EAAI,IAAA,EAAC,EAAA,EAAI,EAAA,EACb,8BAAC,IAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,WAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,cAAW,SAAA,EAAW,KAAA,CAAM,OAAA,EAAS,CAAA,EACxC,GACF,CAAA,EACF,CAAA;AAAA,oBACA,GAAA,CAAC,QAAK,IAAA,EAAI,IAAA,EAAC,IAAI,EAAA,EACb,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EACC,QAAA,kBAAA,IAAA,CAAC,WAAA,EAAA,EACE,QAAA,EAAA;AAAA,MAAA,CAAC,aAAa,KAAA,oBACb,GAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,MAAM,KAAA,CAAM,UAAA;AAAA,UACZ,SAAS,KAAA,CAAM;AAAA;AAAA,OACjB;AAAA,MAED,SAAA,IAAa,CAAC,KAAA,CAAM,KAAA,wBAAU,gBAAA,EAAA,EAAiB;AAAA,KAAA,EAClD,GACF,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"UserStatsContent.esm.js","sources":["../../../src/components/UserPage/UserStatsContent.tsx"],"sourcesContent":["import {\n StatsChart,\n useQetaApi,\n UserBadges,\n} from '@drodil/backstage-plugin-qeta-react';\nimport {\n StatisticsResponse,\n UserStat,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { Card, CardBody, Grid, Skeleton } from '@backstage/ui';\n\nexport const UserStatsContent = (props: {\n userRef: string;\n stats?: StatisticsResponse<UserStat>;\n loading?: boolean;\n}) => {\n const {\n value: response,\n loading,\n error,\n } = useQetaApi(\n api => {\n if (props.stats) {\n return Promise.resolve(props.stats);\n }\n return api.getUserStats(props.userRef);\n },\n [props.userRef, props.stats],\n );\n\n const stats = props.stats || response;\n const isLoading = props.loading || loading;\n\n if (error) {\n return null;\n }\n return (\n <Grid.Root columns={{ sm: '12' }} gap=\"6\">\n <Grid.Item colSpan={{ sm: '12' }}>\n <Card>\n <CardBody>\n <UserBadges entityRef={props.userRef} />\n </CardBody>\n </Card>\n </Grid.Item>\n <Grid.Item colSpan={{ sm: '12' }}>\n <Card>\n <CardBody>\n {!isLoading && stats && (\n <StatsChart\n data={stats.statistics}\n summary={stats.summary as unknown as Record<string, number>}\n />\n )}\n {isLoading && !props.stats && (\n <Skeleton width=\"100%\" height={300} />\n )}\n </CardBody>\n </Card>\n </Grid.Item>\n </Grid.Root>\n );\n};\n"],"names":[],"mappings":";;;;AAWO,MAAM,gBAAA,GAAmB,CAAC,KAAA,KAI3B;AACJ,EAAA,MAAM;AAAA,IACJ,KAAA,EAAO,QAAA;AAAA,IACP,OAAA;AAAA,IACA;AAAA,GACF,GAAI,UAAA;AAAA,IACF,CAAA,GAAA,KAAO;AACL,MAAA,IAAI,MAAM,KAAA,EAAO;AACf,QAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,KAAA,CAAM,KAAK,CAAA;AAAA,MACpC;AACA,MAAA,OAAO,GAAA,CAAI,YAAA,CAAa,KAAA,CAAM,OAAO,CAAA;AAAA,IACvC,CAAA;AAAA,IACA,CAAC,KAAA,CAAM,OAAA,EAAS,KAAA,CAAM,KAAK;AAAA,GAC7B;AAEA,EAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,IAAS,QAAA;AAC7B,EAAA,MAAM,SAAA,GAAY,MAAM,OAAA,IAAW,OAAA;AAEnC,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,uBACE,IAAA,CAAC,IAAA,CAAK,IAAA,EAAL,EAAU,OAAA,EAAS,EAAE,EAAA,EAAI,IAAA,EAAK,EAAG,GAAA,EAAI,GAAA,EACpC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,KAAK,IAAA,EAAL,EAAU,SAAS,EAAE,EAAA,EAAI,MAAK,EAC7B,QAAA,kBAAA,GAAA,CAAC,QACC,QAAA,kBAAA,GAAA,CAAC,QAAA,EAAA,EACC,8BAAC,UAAA,EAAA,EAAW,SAAA,EAAW,MAAM,OAAA,EAAS,CAAA,EACxC,GACF,CAAA,EACF,CAAA;AAAA,oBACA,GAAA,CAAC,IAAA,CAAK,IAAA,EAAL,EAAU,OAAA,EAAS,EAAE,EAAA,EAAI,IAAA,EAAK,EAC7B,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EACC,QAAA,kBAAA,IAAA,CAAC,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,MAAA,CAAC,aAAa,KAAA,oBACb,GAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,MAAM,KAAA,CAAM,UAAA;AAAA,UACZ,SAAS,KAAA,CAAM;AAAA;AAAA,OACjB;AAAA,MAED,SAAA,IAAa,CAAC,KAAA,CAAM,KAAA,wBAClB,QAAA,EAAA,EAAS,KAAA,EAAM,MAAA,EAAO,MAAA,EAAQ,GAAA,EAAK;AAAA,KAAA,EAExC,GACF,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
@@ -1,18 +1,12 @@
1
1
  import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
2
- import { qetaTranslationRef, ContentHeader, UsersContainer } from '@drodil/backstage-plugin-qeta-react';
3
- import PeopleOutline from '@material-ui/icons/PeopleOutline';
2
+ import { qetaTranslationRef, UsersContainer } from '@drodil/backstage-plugin-qeta-react';
3
+ import { Header } from '@backstage/ui';
4
4
  import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
5
5
 
6
6
  const UsersPage = () => {
7
7
  const { t } = useTranslationRef(qetaTranslationRef);
8
8
  return /* @__PURE__ */ jsxs(Fragment, { children: [
9
- /* @__PURE__ */ jsx(
10
- ContentHeader,
11
- {
12
- title: t("usersPage.title"),
13
- titleIcon: /* @__PURE__ */ jsx(PeopleOutline, { fontSize: "large" })
14
- }
15
- ),
9
+ /* @__PURE__ */ jsx(Header, { title: t("usersPage.title") }),
16
10
  /* @__PURE__ */ jsx(UsersContainer, {})
17
11
  ] });
18
12
  };
@@ -1 +1 @@
1
- {"version":3,"file":"UsersPage.esm.js","sources":["../../../src/components/UsersPage/UsersPage.tsx"],"sourcesContent":["import {\n ContentHeader,\n qetaTranslationRef,\n UsersContainer,\n} from '@drodil/backstage-plugin-qeta-react';\nimport PeopleOutline from '@material-ui/icons/PeopleOutline';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\n\nexport const UsersPage = () => {\n const { t } = useTranslationRef(qetaTranslationRef);\n\n return (\n <>\n <ContentHeader\n title={t('usersPage.title')}\n titleIcon={<PeopleOutline fontSize=\"large\" />}\n />\n <UsersContainer />\n </>\n );\n};\n"],"names":[],"mappings":";;;;;AAQO,MAAM,YAAY,MAAM;AAC7B,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,kBAAkB,CAAA;AAElD,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,iBAAiB,CAAA;AAAA,QAC1B,SAAA,kBAAW,GAAA,CAAC,aAAA,EAAA,EAAc,QAAA,EAAS,OAAA,EAAQ;AAAA;AAAA,KAC7C;AAAA,wBACC,cAAA,EAAA,EAAe;AAAA,GAAA,EAClB,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"UsersPage.esm.js","sources":["../../../src/components/UsersPage/UsersPage.tsx"],"sourcesContent":["import {\n qetaTranslationRef,\n UsersContainer,\n} from '@drodil/backstage-plugin-qeta-react';\nimport { Header } from '@backstage/ui';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\n\nexport const UsersPage = () => {\n const { t } = useTranslationRef(qetaTranslationRef);\n\n return (\n <>\n <Header title={t('usersPage.title')} />\n <UsersContainer />\n </>\n );\n};\n"],"names":[],"mappings":";;;;;AAOO,MAAM,YAAY,MAAM;AAC7B,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,kBAAkB,CAAA;AAElD,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,MAAA,EAAA,EAAO,KAAA,EAAO,CAAA,CAAE,iBAAiB,CAAA,EAAG,CAAA;AAAA,wBACpC,cAAA,EAAA,EAAe;AAAA,GAAA,EAClB,CAAA;AAEJ;;;;"}
@@ -1,10 +1,9 @@
1
1
  import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
2
2
  import { useParams, useSearchParams } from 'react-router-dom';
3
3
  import { filterTags } from '@drodil/backstage-plugin-qeta-common';
4
- import { qetaTranslationRef, useQetaConfig, ContentHeader, PostForm } from '@drodil/backstage-plugin-qeta-react';
4
+ import { qetaTranslationRef, useQetaConfig, PostForm } from '@drodil/backstage-plugin-qeta-react';
5
5
  import { useEntityPresentation } from '@backstage/plugin-catalog-react';
6
- import { InfoCard } from '@backstage/core-components';
7
- import { Grid } from '@material-ui/core';
6
+ import { Header, Box } from '@backstage/ui';
8
7
  import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
9
8
 
10
9
  const WritePage = () => {
@@ -30,8 +29,8 @@ const WritePage = () => {
30
29
  title = t("writePage.title.newArticle");
31
30
  }
32
31
  return /* @__PURE__ */ jsxs(Fragment, { children: [
33
- /* @__PURE__ */ jsx(ContentHeader, { title }),
34
- /* @__PURE__ */ jsx(Grid, { container: true, spacing: 3, direction: "column", children: /* @__PURE__ */ jsx(Grid, { item: true, children: /* @__PURE__ */ jsx(InfoCard, { children: /* @__PURE__ */ jsx(
32
+ /* @__PURE__ */ jsx(Header, { title }),
33
+ /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsx(
35
34
  PostForm,
36
35
  {
37
36
  id,
@@ -40,7 +39,7 @@ const WritePage = () => {
40
39
  tags,
41
40
  type: "article"
42
41
  }
43
- ) }) }) })
42
+ ) })
44
43
  ] });
45
44
  };
46
45