@drodil/backstage-plugin-qeta 3.60.0 → 4.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -11
- package/dist/components/ArticlePage/ArticlePage.esm.js +57 -15
- package/dist/components/ArticlePage/ArticlePage.esm.js.map +1 -1
- package/dist/components/ArticlesPage/ArticlesPage.esm.js +5 -22
- package/dist/components/ArticlesPage/ArticlesPage.esm.js.map +1 -1
- package/dist/components/AskPage/AskPage.esm.js +6 -7
- package/dist/components/AskPage/AskPage.esm.js.map +1 -1
- package/dist/components/CollectionCreatePage/CollectionCreatePage.esm.js +3 -4
- package/dist/components/CollectionCreatePage/CollectionCreatePage.esm.js.map +1 -1
- package/dist/components/CollectionPage/CollectionPage.esm.js +43 -87
- package/dist/components/CollectionPage/CollectionPage.esm.js.map +1 -1
- package/dist/components/CollectionsPage/CollectionsPage.esm.js +4 -5
- package/dist/components/CollectionsPage/CollectionsPage.esm.js.map +1 -1
- package/dist/components/ContentHealthCard/ContentHealthCard.esm.js +61 -89
- package/dist/components/ContentHealthCard/ContentHealthCard.esm.js.map +1 -1
- package/dist/components/ContentHealthCard/ContentHealthCard.module.css.esm.js +8 -0
- package/dist/components/ContentHealthCard/ContentHealthCard.module.css.esm.js.map +1 -0
- package/dist/components/ContentHealthCard/ReviewList.esm.js +27 -60
- package/dist/components/ContentHealthCard/ReviewList.esm.js.map +1 -1
- package/dist/components/ContentHealthCard/ReviewList.module.css.esm.js +8 -0
- package/dist/components/ContentHealthCard/ReviewList.module.css.esm.js.map +1 -0
- package/dist/components/CreateLinkPage/CreateLinkPage.esm.js +5 -6
- package/dist/components/CreateLinkPage/CreateLinkPage.esm.js.map +1 -1
- package/dist/components/EntityPage/EntityPage.esm.js +40 -58
- package/dist/components/EntityPage/EntityPage.esm.js.map +1 -1
- package/dist/components/EntityPostsContent/EntityPostsContent.esm.js +2 -3
- package/dist/components/EntityPostsContent/EntityPostsContent.esm.js.map +1 -1
- package/dist/components/FavoritePage/FavoritePage.esm.js +3 -14
- package/dist/components/FavoritePage/FavoritePage.esm.js.map +1 -1
- package/dist/components/HomePage/HomePage.esm.js +14 -60
- package/dist/components/HomePage/HomePage.esm.js.map +1 -1
- package/dist/components/HomePage/HomePage.module.css.esm.js +8 -0
- package/dist/components/HomePage/HomePage.module.css.esm.js.map +1 -0
- package/dist/components/LinkPage/LinkPage.esm.js +56 -61
- package/dist/components/LinkPage/LinkPage.esm.js.map +1 -1
- package/dist/components/LinksPage/LinksPage.esm.js +5 -16
- package/dist/components/LinksPage/LinksPage.esm.js.map +1 -1
- package/dist/components/ModeratorPage/ModeratorPage.esm.js +19 -29
- package/dist/components/ModeratorPage/ModeratorPage.esm.js.map +1 -1
- package/dist/components/ModeratorPage/ModeratorPage.module.css.esm.js +8 -0
- package/dist/components/ModeratorPage/ModeratorPage.module.css.esm.js.map +1 -0
- package/dist/components/QetaPage/QetaPage.esm.js +185 -268
- package/dist/components/QetaPage/QetaPage.esm.js.map +1 -1
- package/dist/components/QetaPage/QetaPage.module.css.esm.js +8 -0
- package/dist/components/QetaPage/QetaPage.module.css.esm.js.map +1 -0
- package/dist/components/QetaSearchResultListItem/QetaSearchResultListItem.esm.js +67 -78
- package/dist/components/QetaSearchResultListItem/QetaSearchResultListItem.esm.js.map +1 -1
- package/dist/components/QetaSearchResultListItem/QetaSearchResultListItem.module.css.esm.js +8 -0
- package/dist/components/QetaSearchResultListItem/QetaSearchResultListItem.module.css.esm.js.map +1 -0
- package/dist/components/QuestionPage/QuestionPage.esm.js +118 -97
- package/dist/components/QuestionPage/QuestionPage.esm.js.map +1 -1
- package/dist/components/QuestionsPage/QuestionsPage.esm.js +4 -5
- package/dist/components/QuestionsPage/QuestionsPage.esm.js.map +1 -1
- package/dist/components/ReviewPage/ReviewPage.esm.js +53 -18
- package/dist/components/ReviewPage/ReviewPage.esm.js.map +1 -1
- package/dist/components/RightContent/ArticlesRightContent.esm.js +2 -2
- package/dist/components/RightContent/ArticlesRightContent.esm.js.map +1 -1
- package/dist/components/RightContent/DefaultRightContent.esm.js +2 -2
- package/dist/components/RightContent/DefaultRightContent.esm.js.map +1 -1
- package/dist/components/RightContent/EntityRightContent.esm.js +2 -2
- package/dist/components/RightContent/EntityRightContent.esm.js.map +1 -1
- package/dist/components/RightContent/LinkedPosts.esm.js +5 -19
- package/dist/components/RightContent/LinkedPosts.esm.js.map +1 -1
- package/dist/components/RightContent/LinkedPosts.module.css.esm.js +8 -0
- package/dist/components/RightContent/LinkedPosts.module.css.esm.js.map +1 -0
- package/dist/components/RightContent/LinksRightContent.esm.js +2 -2
- package/dist/components/RightContent/LinksRightContent.esm.js.map +1 -1
- package/dist/components/RightContent/PostRightContent.esm.js +4 -4
- package/dist/components/RightContent/PostRightContent.esm.js.map +1 -1
- package/dist/components/RightContent/QuestionsRightContent.esm.js +2 -2
- package/dist/components/RightContent/QuestionsRightContent.esm.js.map +1 -1
- package/dist/components/RightContent/RightContent.esm.js +36 -52
- package/dist/components/RightContent/RightContent.esm.js.map +1 -1
- package/dist/components/RightContent/RightContent.module.css.esm.js +8 -0
- package/dist/components/RightContent/RightContent.module.css.esm.js.map +1 -0
- package/dist/components/RightContent/SimilarQuestions.esm.js +3 -16
- package/dist/components/RightContent/SimilarQuestions.esm.js.map +1 -1
- package/dist/components/RightContent/SimilarQuestions.module.css.esm.js +8 -0
- package/dist/components/RightContent/SimilarQuestions.module.css.esm.js.map +1 -0
- package/dist/components/RightContent/TagRightContent.esm.js +2 -2
- package/dist/components/RightContent/TagRightContent.esm.js.map +1 -1
- package/dist/components/SettingsPage/SettingsPage.esm.js +198 -200
- package/dist/components/SettingsPage/SettingsPage.esm.js.map +1 -1
- package/dist/components/SettingsPage/SettingsPage.module.css.esm.js +8 -0
- package/dist/components/SettingsPage/SettingsPage.module.css.esm.js.map +1 -0
- package/dist/components/Statistics/GlobalStatsContent.esm.js +5 -5
- package/dist/components/Statistics/GlobalStatsContent.esm.js.map +1 -1
- package/dist/components/Statistics/StatisticsPage.esm.js +14 -19
- package/dist/components/Statistics/StatisticsPage.esm.js.map +1 -1
- package/dist/components/Statistics/StatisticsPage.module.css.esm.js +8 -0
- package/dist/components/Statistics/StatisticsPage.module.css.esm.js.map +1 -0
- package/dist/components/TagPage/TagPage.esm.js +54 -87
- package/dist/components/TagPage/TagPage.esm.js.map +1 -1
- package/dist/components/TechDocsAskQuestionAddon/TechDocsAskQuestionAddon.esm.js +23 -32
- package/dist/components/TechDocsAskQuestionAddon/TechDocsAskQuestionAddon.esm.js.map +1 -1
- package/dist/components/TechDocsAskQuestionAddon/TechDocsAskQuestionAddon.module.css.esm.js +8 -0
- package/dist/components/TechDocsAskQuestionAddon/TechDocsAskQuestionAddon.module.css.esm.js.map +1 -0
- package/dist/components/UserPage/UserPage.esm.js +137 -236
- package/dist/components/UserPage/UserPage.esm.js.map +1 -1
- package/dist/components/UserPage/UserPage.module.css.esm.js +8 -0
- package/dist/components/UserPage/UserPage.module.css.esm.js.map +1 -0
- package/dist/components/UserPage/UserStatsContent.esm.js +5 -5
- package/dist/components/UserPage/UserStatsContent.esm.js.map +1 -1
- package/dist/components/UsersPage/UsersPage.esm.js +3 -9
- package/dist/components/UsersPage/UsersPage.esm.js.map +1 -1
- package/dist/components/WritePage/WritePage.esm.js +5 -6
- package/dist/components/WritePage/WritePage.esm.js.map +1 -1
- package/dist/index.d.ts +283 -77
- package/dist/index.esm.js +262 -7
- package/dist/index.esm.js.map +1 -1
- package/dist/node_modules_dist/style-inject/dist/style-inject.es.esm.js +29 -0
- package/dist/node_modules_dist/style-inject/dist/style-inject.es.esm.js.map +1 -0
- package/dist/{package.json.esm.js → plugins/qeta/package.json.esm.js} +8 -13
- package/dist/{package.json.esm.js.map → plugins/qeta/package.json.esm.js.map} +1 -1
- package/package.json +9 -18
- package/dist/alpha.d.ts +0 -255
- package/dist/alpha.esm.js +0 -238
- package/dist/alpha.esm.js.map +0 -1
- package/dist/components/EntityCards/EntityPostsContainerCard.esm.js +0 -13
- package/dist/components/EntityCards/EntityPostsContainerCard.esm.js.map +0 -1
- package/dist/components/EntityCards/EntityPostsGridCard.esm.js +0 -20
- package/dist/components/EntityCards/EntityPostsGridCard.esm.js.map +0 -1
- package/dist/components/ReviewPage/index.esm.js +0 -6
- package/dist/components/ReviewPage/index.esm.js.map +0 -1
- package/dist/plugin.esm.js +0 -84
- package/dist/plugin.esm.js.map +0 -1
|
@@ -1,51 +1,20 @@
|
|
|
1
|
-
import {
|
|
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,
|
|
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 {
|
|
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
|
|
10
|
-
import
|
|
11
|
-
import
|
|
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,
|
|
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 = (
|
|
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
|
-
|
|
52
|
+
/* @__PURE__ */ jsx(Tab, { id: "statistics", children: /* @__PURE__ */ jsx(
|
|
53
|
+
TabLabel,
|
|
128
54
|
{
|
|
129
|
-
|
|
130
|
-
label:
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
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
|
-
|
|
144
|
-
label:
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
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
|
-
|
|
158
|
-
label:
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
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
|
-
|
|
172
|
-
label:
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
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
|
-
|
|
186
|
-
label:
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
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
|
-
|
|
200
|
-
|
|
201
|
-
|
|
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
|
-
|
|
204
|
-
label: t("userPage.
|
|
122
|
+
userRef: identity,
|
|
123
|
+
"aria-label": t("userPage.followUser", { name })
|
|
205
124
|
}
|
|
206
|
-
)
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
children:
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
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,
|
|
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, {
|
|
25
|
-
/* @__PURE__ */ jsx(Grid, {
|
|
26
|
-
/* @__PURE__ */ jsx(Grid, {
|
|
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(
|
|
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,
|
|
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,
|
|
3
|
-
import
|
|
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
|
|
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,
|
|
4
|
+
import { qetaTranslationRef, useQetaConfig, PostForm } from '@drodil/backstage-plugin-qeta-react';
|
|
5
5
|
import { useEntityPresentation } from '@backstage/plugin-catalog-react';
|
|
6
|
-
import {
|
|
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(
|
|
34
|
-
/* @__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
|
|