@drodil/backstage-plugin-qeta 2.15.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/ArticlePage/ArticlePage.esm.js +45 -0
- package/dist/components/ArticlePage/ArticlePage.esm.js.map +1 -0
- package/dist/components/ArticlesPage/ArticlesPage.esm.js +34 -0
- package/dist/components/ArticlesPage/ArticlesPage.esm.js.map +1 -0
- package/dist/components/AskPage/AskPage.esm.js +4 -4
- package/dist/components/AskPage/AskPage.esm.js.map +1 -1
- package/dist/components/CollectionCreatePage/CollectionCreatePage.esm.js +20 -0
- package/dist/components/CollectionCreatePage/CollectionCreatePage.esm.js.map +1 -0
- package/dist/components/CollectionPage/CollectionPage.esm.js +34 -0
- package/dist/components/CollectionPage/CollectionPage.esm.js.map +1 -0
- package/dist/components/CollectionsPage/CollectionsPage.esm.js +11 -0
- package/dist/components/CollectionsPage/CollectionsPage.esm.js.map +1 -0
- package/dist/components/EntityPage/EntityPage.esm.js +75 -0
- package/dist/components/EntityPage/EntityPage.esm.js.map +1 -0
- package/dist/components/FavoritePage/FavoritePage.esm.js +14 -22
- package/dist/components/FavoritePage/FavoritePage.esm.js.map +1 -1
- package/dist/components/HomePage/HomePage.esm.js +7 -10
- package/dist/components/HomePage/HomePage.esm.js.map +1 -1
- package/dist/components/LeftMenu/LeftMenu.esm.js +47 -16
- package/dist/components/LeftMenu/LeftMenu.esm.js.map +1 -1
- package/dist/components/LeftMenu/LeftMenuButton.esm.js +75 -0
- package/dist/components/LeftMenu/LeftMenuButton.esm.js.map +1 -0
- package/dist/components/QetaPage/QetaPage.esm.js +51 -9
- package/dist/components/QetaPage/QetaPage.esm.js.map +1 -1
- package/dist/components/QuestionPage/QuestionPage.esm.js +7 -13
- package/dist/components/QuestionPage/QuestionPage.esm.js.map +1 -1
- package/dist/components/QuestionTableCard/Content.esm.js +1 -1
- package/dist/components/QuestionTableCard/Content.esm.js.map +1 -1
- package/dist/components/QuestionTableCard/index.esm.js +0 -1
- package/dist/components/QuestionTableCard/index.esm.js.map +1 -1
- package/dist/components/QuestionsPage/QuestionsPage.esm.js +13 -15
- package/dist/components/QuestionsPage/QuestionsPage.esm.js.map +1 -1
- package/dist/components/Statistics/GlobalStatsContent.esm.js +1 -3
- package/dist/components/Statistics/GlobalStatsContent.esm.js.map +1 -1
- package/dist/components/Statistics/StatisticsPage.esm.js +2 -3
- package/dist/components/Statistics/StatisticsPage.esm.js.map +1 -1
- package/dist/components/TagPage/TagPage.esm.js +32 -25
- package/dist/components/TagPage/TagPage.esm.js.map +1 -1
- package/dist/components/UserPage/UserPage.esm.js +7 -16
- package/dist/components/UserPage/UserPage.esm.js.map +1 -1
- package/dist/components/UserPage/UserStatsContent.esm.js +1 -3
- package/dist/components/UserPage/UserStatsContent.esm.js.map +1 -1
- package/dist/components/UsersPage/UsersPage.esm.js +11 -0
- package/dist/components/UsersPage/UsersPage.esm.js.map +1 -0
- package/dist/components/WritePage/WritePage.esm.js +40 -0
- package/dist/components/WritePage/WritePage.esm.js.map +1 -0
- package/dist/index.d.ts +8 -422
- package/dist/index.esm.js +0 -10
- package/dist/index.esm.js.map +1 -1
- package/dist/plugin.esm.js +2 -2
- package/dist/plugin.esm.js.map +1 -1
- package/package.json +4 -24
- package/dist/api/QetaClient.esm.js +0 -513
- package/dist/api/QetaClient.esm.js.map +0 -1
- package/dist/components/AnswersContainer/AnswerList.esm.js +0 -100
- package/dist/components/AnswersContainer/AnswerList.esm.js.map +0 -1
- package/dist/components/AnswersContainer/AnswerListItem.esm.js +0 -90
- package/dist/components/AnswersContainer/AnswerListItem.esm.js.map +0 -1
- package/dist/components/AnswersContainer/AnswersContainer.esm.js +0 -210
- package/dist/components/AnswersContainer/AnswersContainer.esm.js.map +0 -1
- package/dist/components/AskAnonymouslyCheckbox/AskAnonymouslyCheckbox.esm.js +0 -34
- package/dist/components/AskAnonymouslyCheckbox/AskAnonymouslyCheckbox.esm.js.map +0 -1
- package/dist/components/AskForm/AskForm.esm.js +0 -245
- package/dist/components/AskForm/AskForm.esm.js.map +0 -1
- package/dist/components/AskForm/EntitiesInput.esm.js +0 -100
- package/dist/components/AskForm/EntitiesInput.esm.js.map +0 -1
- package/dist/components/AskForm/TagInput.esm.js +0 -81
- package/dist/components/AskForm/TagInput.esm.js.map +0 -1
- package/dist/components/Buttons/AskQuestionButton.esm.js +0 -45
- package/dist/components/Buttons/AskQuestionButton.esm.js.map +0 -1
- package/dist/components/Buttons/BackToQuestionsButton.esm.js +0 -39
- package/dist/components/Buttons/BackToQuestionsButton.esm.js.map +0 -1
- package/dist/components/Buttons/EntityFollowButton.esm.js +0 -34
- package/dist/components/Buttons/EntityFollowButton.esm.js.map +0 -1
- package/dist/components/Buttons/TagFollowButton.esm.js +0 -33
- package/dist/components/Buttons/TagFollowButton.esm.js.map +0 -1
- package/dist/components/CommentSection/CommentList.esm.js +0 -47
- package/dist/components/CommentSection/CommentList.esm.js.map +0 -1
- package/dist/components/CommentSection/CommentSection.esm.js +0 -126
- package/dist/components/CommentSection/CommentSection.esm.js.map +0 -1
- package/dist/components/DeleteModal/DeleteModal.esm.js +0 -78
- package/dist/components/DeleteModal/DeleteModal.esm.js.map +0 -1
- package/dist/components/HomePageCards/ImpactCard.esm.js +0 -22
- package/dist/components/HomePageCards/ImpactCard.esm.js.map +0 -1
- package/dist/components/HomePageCards/QuestionsCard.esm.js +0 -21
- package/dist/components/HomePageCards/QuestionsCard.esm.js.map +0 -1
- package/dist/components/Links/Links.esm.js +0 -33
- package/dist/components/Links/Links.esm.js.map +0 -1
- package/dist/components/MarkdownEditor/MarkdownEditor.esm.js +0 -78
- package/dist/components/MarkdownEditor/MarkdownEditor.esm.js.map +0 -1
- package/dist/components/MarkdownRenderer/MarkdownRenderer.esm.js +0 -37
- package/dist/components/MarkdownRenderer/MarkdownRenderer.esm.js.map +0 -1
- package/dist/components/QetaPage/FollowedEntitiesList.esm.js +0 -43
- package/dist/components/QetaPage/FollowedEntitiesList.esm.js.map +0 -1
- package/dist/components/QetaPage/FollowedTagsList.esm.js +0 -56
- package/dist/components/QetaPage/FollowedTagsList.esm.js.map +0 -1
- package/dist/components/QuestionHighlightList/QuestionHighlightList.esm.js +0 -64
- package/dist/components/QuestionHighlightList/QuestionHighlightList.esm.js.map +0 -1
- package/dist/components/QuestionPage/AnswerCard.esm.js +0 -113
- package/dist/components/QuestionPage/AnswerCard.esm.js.map +0 -1
- package/dist/components/QuestionPage/AnswerForm.esm.js +0 -153
- package/dist/components/QuestionPage/AnswerForm.esm.js.map +0 -1
- package/dist/components/QuestionPage/AuthorBox.esm.js +0 -25
- package/dist/components/QuestionPage/AuthorBox.esm.js.map +0 -1
- package/dist/components/QuestionPage/EntityChip.esm.js +0 -27
- package/dist/components/QuestionPage/EntityChip.esm.js.map +0 -1
- package/dist/components/QuestionPage/FavoriteButton.esm.js +0 -45
- package/dist/components/QuestionPage/FavoriteButton.esm.js.map +0 -1
- package/dist/components/QuestionPage/LinkButton.esm.js +0 -28
- package/dist/components/QuestionPage/LinkButton.esm.js.map +0 -1
- package/dist/components/QuestionPage/QuestionCard.esm.js +0 -107
- package/dist/components/QuestionPage/QuestionCard.esm.js.map +0 -1
- package/dist/components/QuestionPage/TagsAndEntities.esm.js +0 -44
- package/dist/components/QuestionPage/TagsAndEntities.esm.js.map +0 -1
- package/dist/components/QuestionPage/VoteButtons.esm.js +0 -153
- package/dist/components/QuestionPage/VoteButtons.esm.js.map +0 -1
- package/dist/components/QuestionTableCard/QuestionTableRow.esm.js +0 -21
- package/dist/components/QuestionTableCard/QuestionTableRow.esm.js.map +0 -1
- package/dist/components/QuestionTableCard/QuestionsTable.esm.js +0 -130
- package/dist/components/QuestionTableCard/QuestionsTable.esm.js.map +0 -1
- package/dist/components/QuestionsContainer/DateRangeFilter.esm.js +0 -110
- package/dist/components/QuestionsContainer/DateRangeFilter.esm.js.map +0 -1
- package/dist/components/QuestionsContainer/FilterPanel.esm.js +0 -237
- package/dist/components/QuestionsContainer/FilterPanel.esm.js.map +0 -1
- package/dist/components/QuestionsContainer/NoQuestionsCard.esm.js +0 -47
- package/dist/components/QuestionsContainer/NoQuestionsCard.esm.js.map +0 -1
- package/dist/components/QuestionsContainer/QuestionList.esm.js +0 -103
- package/dist/components/QuestionsContainer/QuestionList.esm.js.map +0 -1
- package/dist/components/QuestionsContainer/QuestionListItem.esm.js +0 -123
- package/dist/components/QuestionsContainer/QuestionListItem.esm.js.map +0 -1
- package/dist/components/QuestionsContainer/QuestionsContainer.esm.js +0 -243
- package/dist/components/QuestionsContainer/QuestionsContainer.esm.js.map +0 -1
- package/dist/components/RelativeTimeWithTooltip/RelativeTimeWithTooltip.esm.js +0 -22
- package/dist/components/RelativeTimeWithTooltip/RelativeTimeWithTooltip.esm.js.map +0 -1
- package/dist/components/Statistics/StatsChart.esm.js +0 -238
- package/dist/components/Statistics/StatsChart.esm.js.map +0 -1
- package/dist/components/Statistics/SummaryStatsGrid.esm.js +0 -47
- package/dist/components/Statistics/SummaryStatsGrid.esm.js.map +0 -1
- package/dist/components/Statistics/TopRankingUsersCard.esm.js +0 -161
- package/dist/components/Statistics/TopRankingUsersCard.esm.js.map +0 -1
- package/dist/components/Statistics/TrophyIcon.esm.js +0 -19
- package/dist/components/Statistics/TrophyIcon.esm.js.map +0 -1
- package/dist/components/Statistics/styles.esm.js +0 -23
- package/dist/components/Statistics/styles.esm.js.map +0 -1
- package/dist/components/TagPage/TagsContainer.esm.js +0 -57
- package/dist/components/TagPage/TagsContainer.esm.js.map +0 -1
- package/dist/locale/fi.esm.js +0 -195
- package/dist/locale/fi.esm.js.map +0 -1
- package/dist/translation.esm.js +0 -359
- package/dist/translation.esm.js.map +0 -1
- package/dist/utils/hooks.esm.js +0 -430
- package/dist/utils/hooks.esm.js.map +0 -1
- package/dist/utils/utils.esm.js +0 -72
- package/dist/utils/utils.esm.js.map +0 -1
|
@@ -1,238 +0,0 @@
|
|
|
1
|
-
import React, { useCallback } from 'react';
|
|
2
|
-
import { ResponsiveContainer, BarChart, Tooltip, Bar, CartesianGrid, XAxis, YAxis, Legend, LineChart, Line } from 'recharts';
|
|
3
|
-
import { makeStyles, createStyles, Typography, ButtonGroup, IconButton } from '@material-ui/core';
|
|
4
|
-
import { useTranslation, useIsDarkTheme } from '../../utils/hooks.esm.js';
|
|
5
|
-
import ShowChartIcon from '@material-ui/icons/ShowChart';
|
|
6
|
-
import BarChartIcon from '@material-ui/icons/BarChart';
|
|
7
|
-
|
|
8
|
-
const useStyles = makeStyles(
|
|
9
|
-
(theme) => createStyles({
|
|
10
|
-
tooltipLabel: {
|
|
11
|
-
color: theme.palette.text.primary
|
|
12
|
-
},
|
|
13
|
-
tooltipWrapper: {
|
|
14
|
-
backgroundColor: `${theme.palette.background.default} !important`,
|
|
15
|
-
border: "none !important"
|
|
16
|
-
},
|
|
17
|
-
xAxis: {
|
|
18
|
-
color: `${theme.palette.text.primary} !important`
|
|
19
|
-
}
|
|
20
|
-
})
|
|
21
|
-
);
|
|
22
|
-
const isGlobalStat = (stat) => {
|
|
23
|
-
return stat.totalUsers !== void 0;
|
|
24
|
-
};
|
|
25
|
-
const DEFAULT_STATS = [
|
|
26
|
-
{
|
|
27
|
-
dataKey: "totalViews",
|
|
28
|
-
name: "Total views",
|
|
29
|
-
color: "#8884d8",
|
|
30
|
-
enabled: false,
|
|
31
|
-
globalStat: false
|
|
32
|
-
},
|
|
33
|
-
{
|
|
34
|
-
dataKey: "totalQuestions",
|
|
35
|
-
name: "Total questions",
|
|
36
|
-
color: "#82ca9d",
|
|
37
|
-
enabled: true,
|
|
38
|
-
globalStat: false
|
|
39
|
-
},
|
|
40
|
-
{
|
|
41
|
-
dataKey: "totalAnswers",
|
|
42
|
-
name: "Total answers",
|
|
43
|
-
color: "#ff7300",
|
|
44
|
-
enabled: true,
|
|
45
|
-
globalStat: false
|
|
46
|
-
},
|
|
47
|
-
{
|
|
48
|
-
dataKey: "totalComments",
|
|
49
|
-
name: "Total comments",
|
|
50
|
-
color: "#739973",
|
|
51
|
-
enabled: true,
|
|
52
|
-
globalStat: false
|
|
53
|
-
},
|
|
54
|
-
{
|
|
55
|
-
dataKey: "totalVotes",
|
|
56
|
-
name: "Total votes",
|
|
57
|
-
color: "#d88884",
|
|
58
|
-
enabled: true,
|
|
59
|
-
globalStat: false
|
|
60
|
-
},
|
|
61
|
-
{
|
|
62
|
-
dataKey: "totalUsers",
|
|
63
|
-
name: "Total users",
|
|
64
|
-
color: "#ff0000",
|
|
65
|
-
enabled: true,
|
|
66
|
-
globalStat: true
|
|
67
|
-
},
|
|
68
|
-
{
|
|
69
|
-
dataKey: "totalTags",
|
|
70
|
-
name: "Total tags",
|
|
71
|
-
color: "#ff00ff",
|
|
72
|
-
enabled: true,
|
|
73
|
-
globalStat: true
|
|
74
|
-
}
|
|
75
|
-
];
|
|
76
|
-
const useChartState = (data) => {
|
|
77
|
-
const styles = useStyles();
|
|
78
|
-
const isDark = useIsDarkTheme();
|
|
79
|
-
const globalStats = isGlobalStat(data[0]);
|
|
80
|
-
const [stats, setStats] = React.useState(
|
|
81
|
-
DEFAULT_STATS.filter((stat) => {
|
|
82
|
-
return globalStats || !stat.globalStat;
|
|
83
|
-
})
|
|
84
|
-
);
|
|
85
|
-
const toggleStat = useCallback(
|
|
86
|
-
(name) => {
|
|
87
|
-
setStats(
|
|
88
|
-
(prev) => prev.map(
|
|
89
|
-
(stat) => stat.name === name ? { ...stat, enabled: !stat.enabled } : stat
|
|
90
|
-
)
|
|
91
|
-
);
|
|
92
|
-
},
|
|
93
|
-
[setStats]
|
|
94
|
-
);
|
|
95
|
-
const isDisabled = useCallback(
|
|
96
|
-
(name) => {
|
|
97
|
-
return stats.find((stat) => stat.name === name)?.enabled === false;
|
|
98
|
-
},
|
|
99
|
-
[stats]
|
|
100
|
-
);
|
|
101
|
-
return { styles, isDark, toggleStat, stats, isDisabled };
|
|
102
|
-
};
|
|
103
|
-
const StatsBarChart = (props) => {
|
|
104
|
-
const { styles, isDark, stats, toggleStat, isDisabled } = useChartState(
|
|
105
|
-
props.data
|
|
106
|
-
);
|
|
107
|
-
return /* @__PURE__ */ React.createElement(ResponsiveContainer, { height: 400, width: "100%" }, /* @__PURE__ */ React.createElement(BarChart, { data: props.data, width: 900, height: 300 }, /* @__PURE__ */ React.createElement(
|
|
108
|
-
Tooltip,
|
|
109
|
-
{
|
|
110
|
-
labelClassName: styles.tooltipLabel,
|
|
111
|
-
wrapperClassName: styles.tooltipWrapper,
|
|
112
|
-
cursor: { fill: isDark ? "#4f4f4f" : "#f5f5f5" }
|
|
113
|
-
}
|
|
114
|
-
), stats.map((stat) => /* @__PURE__ */ React.createElement(
|
|
115
|
-
Bar,
|
|
116
|
-
{
|
|
117
|
-
key: stat.dataKey,
|
|
118
|
-
dataKey: stat.enabled ? stat.dataKey : "hidden",
|
|
119
|
-
name: stat.name,
|
|
120
|
-
fill: stat.color
|
|
121
|
-
}
|
|
122
|
-
)), /* @__PURE__ */ React.createElement(CartesianGrid, { stroke: "#ccc" }), /* @__PURE__ */ React.createElement(
|
|
123
|
-
XAxis,
|
|
124
|
-
{
|
|
125
|
-
dataKey: "date",
|
|
126
|
-
tickFormatter: (tick) => new Date(tick).toDateString(),
|
|
127
|
-
axisLine: { stroke: isDark ? "white" : "black" },
|
|
128
|
-
tickLine: { stroke: isDark ? "white" : "black" },
|
|
129
|
-
tick: { fill: isDark ? "white" : "black" }
|
|
130
|
-
}
|
|
131
|
-
), /* @__PURE__ */ React.createElement(
|
|
132
|
-
YAxis,
|
|
133
|
-
{
|
|
134
|
-
allowDecimals: false,
|
|
135
|
-
axisLine: { stroke: isDark ? "white" : "black" },
|
|
136
|
-
tickLine: { stroke: isDark ? "white" : "black" },
|
|
137
|
-
tick: { fill: isDark ? "white" : "black" }
|
|
138
|
-
}
|
|
139
|
-
), /* @__PURE__ */ React.createElement(
|
|
140
|
-
Legend,
|
|
141
|
-
{
|
|
142
|
-
verticalAlign: "top",
|
|
143
|
-
height: 36,
|
|
144
|
-
wrapperStyle: { cursor: "pointer" },
|
|
145
|
-
formatter: (data) => {
|
|
146
|
-
return isDisabled(data) ? `[ ] ${data}` : `[x] ${data}`;
|
|
147
|
-
},
|
|
148
|
-
onClick: (data) => {
|
|
149
|
-
if (data.value) {
|
|
150
|
-
toggleStat(data.value);
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
)));
|
|
155
|
-
};
|
|
156
|
-
const StatsLineChart = (props) => {
|
|
157
|
-
const { styles, isDark, stats, toggleStat, isDisabled } = useChartState(
|
|
158
|
-
props.data
|
|
159
|
-
);
|
|
160
|
-
return /* @__PURE__ */ React.createElement(ResponsiveContainer, { height: 400, width: "100%" }, /* @__PURE__ */ React.createElement(LineChart, { data: props.data, width: 900, height: 300 }, /* @__PURE__ */ React.createElement(
|
|
161
|
-
Tooltip,
|
|
162
|
-
{
|
|
163
|
-
labelClassName: styles.tooltipLabel,
|
|
164
|
-
wrapperClassName: styles.tooltipWrapper,
|
|
165
|
-
cursor: { fill: isDark ? "#4f4f4f" : "#f5f5f5" }
|
|
166
|
-
}
|
|
167
|
-
), stats.map((stat) => /* @__PURE__ */ React.createElement(
|
|
168
|
-
Line,
|
|
169
|
-
{
|
|
170
|
-
key: stat.dataKey,
|
|
171
|
-
dataKey: stat.enabled ? stat.dataKey : "hidden",
|
|
172
|
-
name: stat.name,
|
|
173
|
-
stroke: stat.color
|
|
174
|
-
}
|
|
175
|
-
)), /* @__PURE__ */ React.createElement(CartesianGrid, { stroke: "#ccc" }), /* @__PURE__ */ React.createElement(
|
|
176
|
-
XAxis,
|
|
177
|
-
{
|
|
178
|
-
dataKey: "date",
|
|
179
|
-
tickFormatter: (tick) => new Date(tick).toDateString(),
|
|
180
|
-
axisLine: { stroke: isDark ? "white" : "black" },
|
|
181
|
-
tickLine: { stroke: isDark ? "white" : "black" },
|
|
182
|
-
tick: { fill: isDark ? "white" : "black" }
|
|
183
|
-
}
|
|
184
|
-
), /* @__PURE__ */ React.createElement(
|
|
185
|
-
YAxis,
|
|
186
|
-
{
|
|
187
|
-
allowDecimals: false,
|
|
188
|
-
axisLine: { stroke: isDark ? "white" : "black" },
|
|
189
|
-
tickLine: { stroke: isDark ? "white" : "black" },
|
|
190
|
-
tick: { fill: isDark ? "white" : "black" }
|
|
191
|
-
}
|
|
192
|
-
), /* @__PURE__ */ React.createElement(
|
|
193
|
-
Legend,
|
|
194
|
-
{
|
|
195
|
-
verticalAlign: "top",
|
|
196
|
-
height: 36,
|
|
197
|
-
wrapperStyle: { cursor: "pointer" },
|
|
198
|
-
formatter: (data) => {
|
|
199
|
-
return isDisabled(data) ? `[ ] ${data}` : `[x] ${data}`;
|
|
200
|
-
},
|
|
201
|
-
onClick: (data) => {
|
|
202
|
-
if (data.value) {
|
|
203
|
-
toggleStat(data.value);
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
)));
|
|
208
|
-
};
|
|
209
|
-
const StatsChart = (props) => {
|
|
210
|
-
const { t } = useTranslation();
|
|
211
|
-
const [chart, setChart] = React.useState("line");
|
|
212
|
-
if (props.data.length === 0) {
|
|
213
|
-
return /* @__PURE__ */ React.createElement(Typography, { variant: "subtitle1" }, t("stats.noStats"));
|
|
214
|
-
}
|
|
215
|
-
const data = props.data.reverse().map((d) => ({ ...d, hidden: 0 }));
|
|
216
|
-
return /* @__PURE__ */ React.createElement(React.Fragment, null, chart === "line" ? /* @__PURE__ */ React.createElement(StatsLineChart, { data }) : /* @__PURE__ */ React.createElement(StatsBarChart, { data }), /* @__PURE__ */ React.createElement(ButtonGroup, { "aria-label": "Chart type", style: { float: "right" } }, /* @__PURE__ */ React.createElement(
|
|
217
|
-
IconButton,
|
|
218
|
-
{
|
|
219
|
-
"aria-label": "Line chart",
|
|
220
|
-
onClick: () => {
|
|
221
|
-
setChart("line");
|
|
222
|
-
}
|
|
223
|
-
},
|
|
224
|
-
/* @__PURE__ */ React.createElement(ShowChartIcon, null)
|
|
225
|
-
), /* @__PURE__ */ React.createElement(
|
|
226
|
-
IconButton,
|
|
227
|
-
{
|
|
228
|
-
"aria-label": "Bar chart",
|
|
229
|
-
onClick: () => {
|
|
230
|
-
setChart("bar");
|
|
231
|
-
}
|
|
232
|
-
},
|
|
233
|
-
/* @__PURE__ */ React.createElement(BarChartIcon, null)
|
|
234
|
-
)));
|
|
235
|
-
};
|
|
236
|
-
|
|
237
|
-
export { StatsChart };
|
|
238
|
-
//# sourceMappingURL=StatsChart.esm.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"StatsChart.esm.js","sources":["../../../src/components/Statistics/StatsChart.tsx"],"sourcesContent":["import React, { useCallback } from 'react';\nimport {\n GlobalStat,\n Stat,\n UserStat,\n} from '@drodil/backstage-plugin-qeta-common';\nimport {\n Bar,\n BarChart,\n CartesianGrid,\n Legend,\n Line,\n LineChart,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport {\n ButtonGroup,\n createStyles,\n IconButton,\n makeStyles,\n Theme,\n Typography,\n} from '@material-ui/core';\nimport { useIsDarkTheme, useTranslation } from '../../utils/hooks';\nimport ShowChartIcon from '@material-ui/icons/ShowChart';\nimport BarChartIcon from '@material-ui/icons/BarChart';\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n tooltipLabel: {\n color: theme.palette.text.primary,\n },\n tooltipWrapper: {\n backgroundColor: `${theme.palette.background.default} !important`,\n border: 'none !important',\n },\n xAxis: {\n color: `${theme.palette.text.primary} !important`,\n },\n }),\n);\n\nconst isGlobalStat = (stat: Stat): stat is GlobalStat => {\n return (stat as GlobalStat).totalUsers !== undefined;\n};\n\ntype StatType = {\n dataKey:\n | 'totalViews'\n | 'totalQuestions'\n | 'totalAnswers'\n | 'totalComments'\n | 'totalVotes'\n | 'totalUsers'\n | 'totalTags';\n name: string;\n color: string;\n enabled: boolean;\n globalStat: boolean;\n};\n\nconst DEFAULT_STATS: StatType[] = [\n {\n dataKey: 'totalViews',\n name: 'Total views',\n color: '#8884d8',\n enabled: false,\n globalStat: false,\n },\n {\n dataKey: 'totalQuestions',\n name: 'Total questions',\n color: '#82ca9d',\n enabled: true,\n globalStat: false,\n },\n {\n dataKey: 'totalAnswers',\n name: 'Total answers',\n color: '#ff7300',\n enabled: true,\n globalStat: false,\n },\n {\n dataKey: 'totalComments',\n name: 'Total comments',\n color: '#739973',\n enabled: true,\n globalStat: false,\n },\n {\n dataKey: 'totalVotes',\n name: 'Total votes',\n color: '#d88884',\n enabled: true,\n globalStat: false,\n },\n {\n dataKey: 'totalUsers',\n name: 'Total users',\n color: '#ff0000',\n enabled: true,\n globalStat: true,\n },\n {\n dataKey: 'totalTags',\n name: 'Total tags',\n color: '#ff00ff',\n enabled: true,\n globalStat: true,\n },\n];\n\nconst useChartState = (data: GlobalStat[] | UserStat[]) => {\n const styles = useStyles();\n const isDark = useIsDarkTheme();\n const globalStats = isGlobalStat(data[0]);\n const [stats, setStats] = React.useState<StatType[]>(\n DEFAULT_STATS.filter(stat => {\n return globalStats || !stat.globalStat;\n }),\n );\n const toggleStat = useCallback(\n (name: string) => {\n setStats(prev =>\n prev.map(stat =>\n stat.name === name ? { ...stat, enabled: !stat.enabled } : stat,\n ),\n );\n },\n [setStats],\n );\n const isDisabled = useCallback(\n (name: string) => {\n return stats.find(stat => stat.name === name)?.enabled === false;\n },\n [stats],\n );\n\n return { styles, isDark, toggleStat, stats, isDisabled };\n};\n\nconst StatsBarChart = (props: { data: GlobalStat[] | UserStat[] }) => {\n const { styles, isDark, stats, toggleStat, isDisabled } = useChartState(\n props.data,\n );\n return (\n <ResponsiveContainer height={400} width=\"100%\">\n <BarChart data={props.data} width={900} height={300}>\n <Tooltip\n labelClassName={styles.tooltipLabel}\n wrapperClassName={styles.tooltipWrapper}\n cursor={{ fill: isDark ? '#4f4f4f' : '#f5f5f5' }}\n />\n {stats.map(stat => (\n <Bar\n key={stat.dataKey}\n dataKey={stat.enabled ? stat.dataKey : 'hidden'}\n name={stat.name}\n fill={stat.color}\n />\n ))}\n <CartesianGrid stroke=\"#ccc\" />\n <XAxis\n dataKey=\"date\"\n tickFormatter={(tick: string) => new Date(tick).toDateString()}\n axisLine={{ stroke: isDark ? 'white' : 'black' }}\n tickLine={{ stroke: isDark ? 'white' : 'black' }}\n tick={{ fill: isDark ? 'white' : 'black' }}\n />\n <YAxis\n allowDecimals={false}\n axisLine={{ stroke: isDark ? 'white' : 'black' }}\n tickLine={{ stroke: isDark ? 'white' : 'black' }}\n tick={{ fill: isDark ? 'white' : 'black' }}\n />\n <Legend\n verticalAlign=\"top\"\n height={36}\n wrapperStyle={{ cursor: 'pointer' }}\n formatter={data => {\n return isDisabled(data) ? `[ ] ${data}` : `[x] ${data}`;\n }}\n onClick={data => {\n if (data.value) {\n toggleStat(data.value as string);\n }\n }}\n />\n </BarChart>\n </ResponsiveContainer>\n );\n};\n\nconst StatsLineChart = (props: { data: GlobalStat[] | UserStat[] }) => {\n const { styles, isDark, stats, toggleStat, isDisabled } = useChartState(\n props.data,\n );\n return (\n <ResponsiveContainer height={400} width=\"100%\">\n <LineChart data={props.data} width={900} height={300}>\n <Tooltip\n labelClassName={styles.tooltipLabel}\n wrapperClassName={styles.tooltipWrapper}\n cursor={{ fill: isDark ? '#4f4f4f' : '#f5f5f5' }}\n />\n {stats.map(stat => (\n <Line\n key={stat.dataKey}\n dataKey={stat.enabled ? stat.dataKey : 'hidden'}\n name={stat.name}\n stroke={stat.color}\n />\n ))}\n <CartesianGrid stroke=\"#ccc\" />\n <XAxis\n dataKey=\"date\"\n tickFormatter={(tick: string) => new Date(tick).toDateString()}\n axisLine={{ stroke: isDark ? 'white' : 'black' }}\n tickLine={{ stroke: isDark ? 'white' : 'black' }}\n tick={{ fill: isDark ? 'white' : 'black' }}\n />\n <YAxis\n allowDecimals={false}\n axisLine={{ stroke: isDark ? 'white' : 'black' }}\n tickLine={{ stroke: isDark ? 'white' : 'black' }}\n tick={{ fill: isDark ? 'white' : 'black' }}\n />\n <Legend\n verticalAlign=\"top\"\n height={36}\n wrapperStyle={{ cursor: 'pointer' }}\n formatter={data => {\n return isDisabled(data) ? `[ ] ${data}` : `[x] ${data}`;\n }}\n onClick={data => {\n if (data.value) {\n toggleStat(data.value as string);\n }\n }}\n />\n </LineChart>\n </ResponsiveContainer>\n );\n};\n\nexport const StatsChart = (props: { data: GlobalStat[] | UserStat[] }) => {\n const { t } = useTranslation();\n const [chart, setChart] = React.useState<'line' | 'bar'>('line');\n\n if (props.data.length === 0) {\n return <Typography variant=\"subtitle1\">{t('stats.noStats')}</Typography>;\n }\n const data = props.data.reverse().map(d => ({ ...d, hidden: 0 }));\n\n return (\n <>\n {chart === 'line' ? (\n <StatsLineChart data={data} />\n ) : (\n <StatsBarChart data={data} />\n )}\n <ButtonGroup aria-label=\"Chart type\" style={{ float: 'right' }}>\n <IconButton\n aria-label=\"Line chart\"\n onClick={() => {\n setChart('line');\n }}\n >\n <ShowChartIcon />\n </IconButton>\n <IconButton\n aria-label=\"Bar chart\"\n onClick={() => {\n setChart('bar');\n }}\n >\n <BarChartIcon />\n </IconButton>\n </ButtonGroup>\n </>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import { Grid, Card, CardContent, Typography } from '@material-ui/core';
|
|
2
|
-
import React from 'react';
|
|
3
|
-
import numeral from 'numeral';
|
|
4
|
-
import { useTranslation } from '../../utils/hooks.esm.js';
|
|
5
|
-
|
|
6
|
-
const SummaryCard = (props) => {
|
|
7
|
-
const { title, value } = props;
|
|
8
|
-
return /* @__PURE__ */ React.createElement(Card, null, /* @__PURE__ */ React.createElement(CardContent, null, /* @__PURE__ */ React.createElement(Typography, { variant: "h5" }, value >= 1e3 ? numeral(value).format("0.0 a") : value, /* @__PURE__ */ React.createElement(Typography, { variant: "caption", style: { marginLeft: "1rem" } }, title))));
|
|
9
|
-
};
|
|
10
|
-
const SummaryStatsGrid = (props) => {
|
|
11
|
-
const { stats } = props;
|
|
12
|
-
const { t } = useTranslation();
|
|
13
|
-
return /* @__PURE__ */ React.createElement(Grid, { container: true }, /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 4 }, /* @__PURE__ */ React.createElement(
|
|
14
|
-
SummaryCard,
|
|
15
|
-
{
|
|
16
|
-
title: t("stats.questions"),
|
|
17
|
-
value: stats.summary.totalQuestions
|
|
18
|
-
}
|
|
19
|
-
)), /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 4 }, /* @__PURE__ */ React.createElement(
|
|
20
|
-
SummaryCard,
|
|
21
|
-
{
|
|
22
|
-
title: t("stats.answers"),
|
|
23
|
-
value: stats.summary.totalAnswers
|
|
24
|
-
}
|
|
25
|
-
)), /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 4 }, /* @__PURE__ */ React.createElement(
|
|
26
|
-
SummaryCard,
|
|
27
|
-
{
|
|
28
|
-
title: t("stats.comments"),
|
|
29
|
-
value: stats.summary.totalComments
|
|
30
|
-
}
|
|
31
|
-
)), /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 4 }, /* @__PURE__ */ React.createElement(
|
|
32
|
-
SummaryCard,
|
|
33
|
-
{
|
|
34
|
-
title: t("stats.views"),
|
|
35
|
-
value: stats.summary.totalViews
|
|
36
|
-
}
|
|
37
|
-
)), /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 4 }, /* @__PURE__ */ React.createElement(
|
|
38
|
-
SummaryCard,
|
|
39
|
-
{
|
|
40
|
-
title: t("stats.votes"),
|
|
41
|
-
value: stats.summary.totalVotes
|
|
42
|
-
}
|
|
43
|
-
)));
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
export { SummaryStatsGrid };
|
|
47
|
-
//# sourceMappingURL=SummaryStatsGrid.esm.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SummaryStatsGrid.esm.js","sources":["../../../src/components/Statistics/SummaryStatsGrid.tsx"],"sourcesContent":["import { Card, CardContent, Grid, Typography } from '@material-ui/core';\nimport { StatisticsResponse } from '@drodil/backstage-plugin-qeta-common';\nimport React from 'react';\nimport numeral from 'numeral';\nimport { useTranslation } from '../../utils/hooks';\n\nconst SummaryCard = (props: { title: string; value: number }) => {\n const { title, value } = props;\n return (\n <Card>\n <CardContent>\n <Typography variant=\"h5\">\n {value >= 1000 ? numeral(value).format('0.0 a') : value}\n <Typography variant=\"caption\" style={{ marginLeft: '1rem' }}>\n {title}\n </Typography>\n </Typography>\n </CardContent>\n </Card>\n );\n};\n\nexport const SummaryStatsGrid = (props: { stats: StatisticsResponse }) => {\n const { stats } = props;\n const { t } = useTranslation();\n return (\n <Grid container>\n <Grid item xs={4}>\n <SummaryCard\n title={t('stats.questions')}\n value={stats.summary.totalQuestions}\n />\n </Grid>\n <Grid item xs={4}>\n <SummaryCard\n title={t('stats.answers')}\n value={stats.summary.totalAnswers}\n />\n </Grid>\n <Grid item xs={4}>\n <SummaryCard\n title={t('stats.comments')}\n value={stats.summary.totalComments}\n />\n </Grid>\n <Grid item xs={4}>\n <SummaryCard\n title={t('stats.views')}\n value={stats.summary.totalViews}\n />\n </Grid>\n <Grid item xs={4}>\n <SummaryCard\n title={t('stats.votes')}\n value={stats.summary.totalVotes}\n />\n </Grid>\n </Grid>\n );\n};\n"],"names":[],"mappings":";;;;;AAMA,MAAM,WAAA,GAAc,CAAC,KAA4C,KAAA;AAC/D,EAAM,MAAA,EAAE,KAAO,EAAA,KAAA,EAAU,GAAA,KAAA,CAAA;AACzB,EAAA,uBACG,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA,kBACE,KAAA,CAAA,aAAA,CAAA,WAAA,EAAA,IAAA,kBACE,KAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,OAAQ,EAAA,IAAA,EAAA,EACjB,KAAS,IAAA,GAAA,GAAO,OAAQ,CAAA,KAAK,CAAE,CAAA,MAAA,CAAO,OAAO,CAAA,GAAI,KAClD,kBAAA,KAAA,CAAA,aAAA,CAAC,UAAW,EAAA,EAAA,OAAA,EAAQ,SAAU,EAAA,KAAA,EAAO,EAAE,UAAA,EAAY,MAAO,EAAA,EAAA,EACvD,KACH,CACF,CACF,CACF,CAAA,CAAA;AAEJ,CAAA,CAAA;AAEa,MAAA,gBAAA,GAAmB,CAAC,KAAyC,KAAA;AACxE,EAAM,MAAA,EAAE,OAAU,GAAA,KAAA,CAAA;AAClB,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,cAAe,EAAA,CAAA;AAC7B,EACE,uBAAA,KAAA,CAAA,aAAA,CAAC,QAAK,SAAS,EAAA,IAAA,EAAA,sCACZ,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,CACb,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,EAAE,iBAAiB,CAAA;AAAA,MAC1B,KAAA,EAAO,MAAM,OAAQ,CAAA,cAAA;AAAA,KAAA;AAAA,GAEzB,CACA,kBAAA,KAAA,CAAA,aAAA,CAAC,QAAK,IAAI,EAAA,IAAA,EAAC,IAAI,CACb,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,EAAE,eAAe,CAAA;AAAA,MACxB,KAAA,EAAO,MAAM,OAAQ,CAAA,YAAA;AAAA,KAAA;AAAA,GAEzB,CACA,kBAAA,KAAA,CAAA,aAAA,CAAC,QAAK,IAAI,EAAA,IAAA,EAAC,IAAI,CACb,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,EAAE,gBAAgB,CAAA;AAAA,MACzB,KAAA,EAAO,MAAM,OAAQ,CAAA,aAAA;AAAA,KAAA;AAAA,GAEzB,CACA,kBAAA,KAAA,CAAA,aAAA,CAAC,QAAK,IAAI,EAAA,IAAA,EAAC,IAAI,CACb,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,EAAE,aAAa,CAAA;AAAA,MACtB,KAAA,EAAO,MAAM,OAAQ,CAAA,UAAA;AAAA,KAAA;AAAA,GAEzB,CACA,kBAAA,KAAA,CAAA,aAAA,CAAC,QAAK,IAAI,EAAA,IAAA,EAAC,IAAI,CACb,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,EAAE,aAAa,CAAA;AAAA,MACtB,KAAA,EAAO,MAAM,OAAQ,CAAA,UAAA;AAAA,KAAA;AAAA,GAEzB,CACF,CAAA,CAAA;AAEJ;;;;"}
|
|
@@ -1,161 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { WarningPanel, CardTab, TabbedCard, Progress } from '@backstage/core-components';
|
|
3
|
-
import { ListItem, ListItemAvatar, Avatar, ListItemText, Typography, List } from '@material-ui/core';
|
|
4
|
-
import { useTranslation, useQetaApi } from '../../utils/hooks.esm.js';
|
|
5
|
-
import { TrophyIcon } from './TrophyIcon.esm.js';
|
|
6
|
-
import { useStyles } from './styles.esm.js';
|
|
7
|
-
import { UserLink } from '../Links/Links.esm.js';
|
|
8
|
-
|
|
9
|
-
const DefaultRankingIcons = /* @__PURE__ */ new Map([
|
|
10
|
-
[
|
|
11
|
-
1,
|
|
12
|
-
/* @__PURE__ */ React.createElement(
|
|
13
|
-
TrophyIcon,
|
|
14
|
-
{
|
|
15
|
-
style: { color: "#DAA520", height: "2.2rem", width: "2.2rem" }
|
|
16
|
-
}
|
|
17
|
-
)
|
|
18
|
-
],
|
|
19
|
-
[
|
|
20
|
-
2,
|
|
21
|
-
/* @__PURE__ */ React.createElement(
|
|
22
|
-
TrophyIcon,
|
|
23
|
-
{
|
|
24
|
-
style: { color: "#C0C0C0", height: "2.1rem", width: "2.1rem" }
|
|
25
|
-
}
|
|
26
|
-
)
|
|
27
|
-
],
|
|
28
|
-
[
|
|
29
|
-
3,
|
|
30
|
-
/* @__PURE__ */ React.createElement(TrophyIcon, { style: { color: "#B87333", height: "2rem", width: "2rem" } })
|
|
31
|
-
]
|
|
32
|
-
]);
|
|
33
|
-
const DefaultUserIcon = /* @__PURE__ */ React.createElement(TrophyIcon, { style: { height: "2rem", width: "2rem" } });
|
|
34
|
-
const getOrdinal = (n) => {
|
|
35
|
-
if (n % 10 === 1 && n % 100 !== 11) {
|
|
36
|
-
return `${n}st`;
|
|
37
|
-
} else if (n % 10 === 2 && n % 100 !== 12) {
|
|
38
|
-
return `${n}nd`;
|
|
39
|
-
} else if (n % 10 === 3 && n % 100 !== 13) {
|
|
40
|
-
return `${n}rd`;
|
|
41
|
-
}
|
|
42
|
-
return `${n}th`;
|
|
43
|
-
};
|
|
44
|
-
const RankingRow = (props) => {
|
|
45
|
-
const classes = useStyles();
|
|
46
|
-
const userRef = props.userRef;
|
|
47
|
-
const ordinalPosition = props?.position ? getOrdinal(props?.position) : "";
|
|
48
|
-
const userIcon = props.rankingIcon?.userRankingIcon ? props.rankingIcon?.userRankingIcon : DefaultUserIcon;
|
|
49
|
-
const topRankingIcon = props.rankingIcon ? props.rankingIcon.iconsByRanking.get(Number(props?.position)) : DefaultRankingIcons.get(Number(props?.position)) || DefaultUserIcon;
|
|
50
|
-
const rankingIcon = props?.position > 3 ? userIcon : topRankingIcon;
|
|
51
|
-
return /* @__PURE__ */ React.createElement(ListItem, { className: "qetaRankingCardRow" }, /* @__PURE__ */ React.createElement(ListItemAvatar, null, /* @__PURE__ */ React.createElement(Avatar, { className: classes.trophyIcon }, rankingIcon)), /* @__PURE__ */ React.createElement(
|
|
52
|
-
ListItemText,
|
|
53
|
-
{
|
|
54
|
-
disableTypography: true,
|
|
55
|
-
style: {
|
|
56
|
-
display: "flex",
|
|
57
|
-
justifyContent: "center"
|
|
58
|
-
},
|
|
59
|
-
primary: /* @__PURE__ */ React.createElement("div", { style: { display: "flex" } }, /* @__PURE__ */ React.createElement(
|
|
60
|
-
Typography,
|
|
61
|
-
{
|
|
62
|
-
style: { marginRight: "10px", fontWeight: 400 },
|
|
63
|
-
variant: "subtitle1"
|
|
64
|
-
},
|
|
65
|
-
`${ordinalPosition}`,
|
|
66
|
-
" ",
|
|
67
|
-
/* @__PURE__ */ React.createElement(UserLink, { entityRef: userRef ?? "" })
|
|
68
|
-
))
|
|
69
|
-
}
|
|
70
|
-
), /* @__PURE__ */ React.createElement("div", { className: classes.votesText }, /* @__PURE__ */ React.createElement(Typography, { variant: "subtitle1" }, props?.total, " ", props.unit)));
|
|
71
|
-
};
|
|
72
|
-
const RankingCard = (props) => {
|
|
73
|
-
const rankingStats = props.limit ? props.statistic?.ranking.slice(0, props.limit) : props.statistic?.ranking;
|
|
74
|
-
return /* @__PURE__ */ React.createElement("div", { style: { display: "block" }, className: "qetaRankingCard" }, /* @__PURE__ */ React.createElement("span", { className: "qetaRankingCardDescription" }, props.description), /* @__PURE__ */ React.createElement(List, { className: "qetaRankingCardList" }, rankingStats?.map((authorStats) => {
|
|
75
|
-
return /* @__PURE__ */ React.createElement(
|
|
76
|
-
RankingRow,
|
|
77
|
-
{
|
|
78
|
-
total: authorStats.total || 0,
|
|
79
|
-
position: authorStats.position || 0,
|
|
80
|
-
userRef: authorStats.author,
|
|
81
|
-
unit: props.unit
|
|
82
|
-
}
|
|
83
|
-
);
|
|
84
|
-
}), !rankingStats?.some(
|
|
85
|
-
(authorStats) => authorStats.author === props.statistic?.loggedUser?.author
|
|
86
|
-
) && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement("hr", null), /* @__PURE__ */ React.createElement(
|
|
87
|
-
RankingRow,
|
|
88
|
-
{
|
|
89
|
-
total: props.statistic?.loggedUser?.total || 0,
|
|
90
|
-
position: props.statistic?.loggedUser?.position || 0,
|
|
91
|
-
userRef: props.statistic?.loggedUser?.author,
|
|
92
|
-
unit: props.unit
|
|
93
|
-
}
|
|
94
|
-
))));
|
|
95
|
-
};
|
|
96
|
-
const TopRankingUsers = (props) => {
|
|
97
|
-
const { t } = useTranslation();
|
|
98
|
-
const {
|
|
99
|
-
value: topStatistics,
|
|
100
|
-
loading,
|
|
101
|
-
error
|
|
102
|
-
} = useQetaApi(
|
|
103
|
-
(api) => api.getTopStatisticsHomepage({
|
|
104
|
-
options: { limit: 50 }
|
|
105
|
-
})
|
|
106
|
-
);
|
|
107
|
-
const tabData = [
|
|
108
|
-
{
|
|
109
|
-
title: t("statistics.mostQuestions.title"),
|
|
110
|
-
description: t("statistics.mostQuestions.description"),
|
|
111
|
-
unit: "questions"
|
|
112
|
-
},
|
|
113
|
-
{
|
|
114
|
-
title: t("statistics.mostAnswers.title"),
|
|
115
|
-
description: t("statistics.mostAnswers.description"),
|
|
116
|
-
unit: "answers"
|
|
117
|
-
},
|
|
118
|
-
{
|
|
119
|
-
title: t("statistics.topVotedQuestions.title"),
|
|
120
|
-
description: t("statistics.topVotedQuestions.description"),
|
|
121
|
-
unit: "votes"
|
|
122
|
-
},
|
|
123
|
-
{
|
|
124
|
-
title: t("statistics.topVotedAnswers.title"),
|
|
125
|
-
description: t("statistics.topVotedAnswers.description"),
|
|
126
|
-
unit: "votes"
|
|
127
|
-
},
|
|
128
|
-
{
|
|
129
|
-
title: t("statistics.topVotedCorrectAnswers.title"),
|
|
130
|
-
description: t("statistics.topVotedCorrectAnswers.description"),
|
|
131
|
-
unit: "votes"
|
|
132
|
-
}
|
|
133
|
-
];
|
|
134
|
-
if ((error || topStatistics === void 0) && !loading) {
|
|
135
|
-
return /* @__PURE__ */ React.createElement(WarningPanel, { severity: "error", title: t("statistics.errorLoading") }, error?.message);
|
|
136
|
-
}
|
|
137
|
-
let content;
|
|
138
|
-
if (loading) {
|
|
139
|
-
content = [
|
|
140
|
-
/* @__PURE__ */ React.createElement(CardTab, null, /* @__PURE__ */ React.createElement(Progress, null))
|
|
141
|
-
];
|
|
142
|
-
} else if (topStatistics && topStatistics.length > 0) {
|
|
143
|
-
content = topStatistics?.map((stats, index) => {
|
|
144
|
-
return /* @__PURE__ */ React.createElement(CardTab, { label: tabData[index].title }, /* @__PURE__ */ React.createElement(
|
|
145
|
-
RankingCard,
|
|
146
|
-
{
|
|
147
|
-
description: tabData[index].description,
|
|
148
|
-
limit: props.limit,
|
|
149
|
-
statistic: stats,
|
|
150
|
-
unit: tabData[index].unit
|
|
151
|
-
}
|
|
152
|
-
));
|
|
153
|
-
});
|
|
154
|
-
} else {
|
|
155
|
-
content = [/* @__PURE__ */ React.createElement(CardTab, null, t("statistics.notAvailable"))];
|
|
156
|
-
}
|
|
157
|
-
return /* @__PURE__ */ React.createElement(TabbedCard, { title: props.title || t("statistics.ranking") }, content);
|
|
158
|
-
};
|
|
159
|
-
|
|
160
|
-
export { RankingCard, RankingRow, TopRankingUsers };
|
|
161
|
-
//# sourceMappingURL=TopRankingUsersCard.esm.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TopRankingUsersCard.esm.js","sources":["../../../src/components/Statistics/TopRankingUsersCard.tsx"],"sourcesContent":["import React, { ReactElement, ReactNode } from 'react';\nimport {\n CardTab,\n Progress,\n TabbedCard,\n WarningPanel,\n} from '@backstage/core-components';\nimport {\n Avatar,\n List,\n ListItem,\n ListItemAvatar,\n ListItemText,\n Typography,\n} from '@material-ui/core';\nimport { StatisticResponse } from '@drodil/backstage-plugin-qeta-common';\nimport { useQetaApi, useTranslation } from '../../utils/hooks';\nimport { TrophyIcon } from './TrophyIcon';\nimport { useStyles } from './styles';\nimport { UserLink } from '../Links/Links';\n\ntype RankingIcon = {\n iconsByRanking: Map<number, ReactNode>;\n userRankingIcon: ReactNode;\n};\n\nconst DefaultRankingIcons = new Map<number, ReactNode>([\n [\n 1,\n <TrophyIcon\n style={{ color: '#DAA520', height: '2.2rem', width: '2.2rem' }}\n />,\n ],\n [\n 2,\n <TrophyIcon\n style={{ color: '#C0C0C0', height: '2.1rem', width: '2.1rem' }}\n />,\n ],\n [\n 3,\n <TrophyIcon style={{ color: '#B87333', height: '2rem', width: '2rem' }} />,\n ],\n]);\n\nconst DefaultUserIcon = (\n <TrophyIcon style={{ height: '2rem', width: '2rem' }} />\n);\n\nconst getOrdinal = (n: number) => {\n if (n % 10 === 1 && n % 100 !== 11) {\n return `${n}st`;\n } else if (n % 10 === 2 && n % 100 !== 12) {\n return `${n}nd`;\n } else if (n % 10 === 3 && n % 100 !== 13) {\n return `${n}rd`;\n }\n\n return `${n}th`;\n};\n\nexport const RankingRow = (props: {\n userRef?: string;\n total: number;\n position: number;\n rankingIcon?: RankingIcon;\n unit: string;\n}) => {\n const classes = useStyles();\n const userRef = props.userRef;\n\n const ordinalPosition = props?.position ? getOrdinal(props?.position) : '';\n\n const userIcon = props.rankingIcon?.userRankingIcon\n ? props.rankingIcon?.userRankingIcon\n : DefaultUserIcon;\n\n const topRankingIcon = props.rankingIcon\n ? props.rankingIcon.iconsByRanking.get(Number(props?.position))\n : DefaultRankingIcons.get(Number(props?.position)) || DefaultUserIcon;\n\n const rankingIcon = props?.position > 3 ? userIcon : topRankingIcon;\n\n return (\n <ListItem className=\"qetaRankingCardRow\">\n <ListItemAvatar>\n <Avatar className={classes.trophyIcon}>{rankingIcon}</Avatar>\n </ListItemAvatar>\n\n <ListItemText\n disableTypography\n style={{\n display: 'flex',\n justifyContent: 'center',\n }}\n primary={\n <div style={{ display: 'flex' }}>\n <Typography\n style={{ marginRight: '10px', fontWeight: 400 }}\n variant=\"subtitle1\"\n >\n {`${ordinalPosition}`} <UserLink entityRef={userRef ?? ''} />\n </Typography>\n </div>\n }\n />\n\n <div className={classes.votesText}>\n <Typography variant=\"subtitle1\">\n {props?.total} {props.unit}\n </Typography>\n </div>\n </ListItem>\n );\n};\n\nexport const RankingCard = (props: {\n limit?: number;\n description: string;\n statistic?: StatisticResponse;\n unit: string;\n}) => {\n const rankingStats = props.limit\n ? props.statistic?.ranking.slice(0, props.limit)\n : props.statistic?.ranking;\n\n return (\n <div style={{ display: 'block' }} className=\"qetaRankingCard\">\n <span className=\"qetaRankingCardDescription\">{props.description}</span>\n <List className=\"qetaRankingCardList\">\n {rankingStats?.map(authorStats => {\n return (\n <RankingRow\n total={authorStats.total || 0}\n position={authorStats.position || 0}\n userRef={authorStats.author}\n unit={props.unit}\n />\n );\n })}\n {!rankingStats?.some(\n authorStats =>\n authorStats.author === props.statistic?.loggedUser?.author,\n ) && (\n <>\n <hr />\n <RankingRow\n total={props.statistic?.loggedUser?.total || 0}\n position={props.statistic?.loggedUser?.position || 0}\n userRef={props.statistic?.loggedUser?.author}\n unit={props.unit}\n />\n </>\n )}\n </List>\n </div>\n );\n};\n\nexport const TopRankingUsers = (props: {\n title?: string;\n hideTitle?: boolean;\n limit?: number;\n}) => {\n const { t } = useTranslation();\n const {\n value: topStatistics,\n loading,\n error,\n } = useQetaApi(api =>\n api.getTopStatisticsHomepage({\n options: { limit: 50 },\n }),\n );\n\n const tabData = [\n {\n title: t('statistics.mostQuestions.title'),\n description: t('statistics.mostQuestions.description'),\n unit: 'questions',\n },\n {\n title: t('statistics.mostAnswers.title'),\n description: t('statistics.mostAnswers.description'),\n unit: 'answers',\n },\n {\n title: t('statistics.topVotedQuestions.title'),\n description: t('statistics.topVotedQuestions.description'),\n unit: 'votes',\n },\n {\n title: t('statistics.topVotedAnswers.title'),\n description: t('statistics.topVotedAnswers.description'),\n unit: 'votes',\n },\n {\n title: t('statistics.topVotedCorrectAnswers.title'),\n description: t('statistics.topVotedCorrectAnswers.description'),\n unit: 'votes',\n },\n ];\n\n if ((error || topStatistics === undefined) && !loading) {\n return (\n <WarningPanel severity=\"error\" title={t('statistics.errorLoading')}>\n {error?.message}\n </WarningPanel>\n );\n }\n\n let content: ReactElement[];\n\n if (loading) {\n content = [\n <CardTab>\n <Progress />\n </CardTab>,\n ];\n } else if (topStatistics && topStatistics.length > 0) {\n content = topStatistics?.map((stats, index) => {\n return (\n <CardTab label={tabData[index].title}>\n <RankingCard\n description={tabData[index].description}\n limit={props.limit}\n statistic={stats}\n unit={tabData[index].unit}\n />\n </CardTab>\n );\n });\n } else {\n content = [<CardTab>{t('statistics.notAvailable')}</CardTab>];\n }\n\n return (\n <TabbedCard title={props.title || t('statistics.ranking')}>\n {content}\n </TabbedCard>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { SvgIcon } from '@material-ui/core';
|
|
2
|
-
import React from 'react';
|
|
3
|
-
|
|
4
|
-
const TrophyIcon = (props) => /* @__PURE__ */ React.createElement(SvgIcon, { ...props, viewBox: "0 0 24 24" }, /* @__PURE__ */ React.createElement(
|
|
5
|
-
"path",
|
|
6
|
-
{
|
|
7
|
-
id: "secondary",
|
|
8
|
-
d: "M17,12a1,1,0,0,1,0-2,3,3,0,0,0,3-3V6H17.17a1,1,0,0,1,0-2H20a2,2,0,0,1,2,2V7A5,5,0,0,1,17,12ZM8,11a1,1,0,0,0-1-1A3,3,0,0,1,4,7V6H6.74a1,1,0,0,0,0-2H4A2,2,0,0,0,2,6V7a5,5,0,0,0,5,5A1,1,0,0,0,8,11Zm5,10V16.18a1,1,0,0,0-2,0V21a1,1,0,0,0,2,0Z"
|
|
9
|
-
}
|
|
10
|
-
), /* @__PURE__ */ React.createElement(
|
|
11
|
-
"path",
|
|
12
|
-
{
|
|
13
|
-
id: "primary",
|
|
14
|
-
d: "M16,22H8a1,1,0,0,1,0-2h8a1,1,0,0,1,0,2ZM17,2H7A1,1,0,0,0,6,3V9.57a7.75,7.75,0,0,0,4.89,7.22A3,3,0,0,0,12,17a3.13,3.13,0,0,0,1.12-.21A7.76,7.76,0,0,0,18,9.57V3A1,1,0,0,0,17,2Z"
|
|
15
|
-
}
|
|
16
|
-
));
|
|
17
|
-
|
|
18
|
-
export { TrophyIcon };
|
|
19
|
-
//# sourceMappingURL=TrophyIcon.esm.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TrophyIcon.esm.js","sources":["../../../src/components/Statistics/TrophyIcon.tsx"],"sourcesContent":["import { SvgIcon, SvgIconProps } from '@material-ui/core';\n\nimport React from 'react';\n\nexport const TrophyIcon = (props: SvgIconProps) => (\n <SvgIcon {...props} viewBox=\"0 0 24 24\">\n <path\n id=\"secondary\"\n d=\"M17,12a1,1,0,0,1,0-2,3,3,0,0,0,3-3V6H17.17a1,1,0,0,1,0-2H20a2,2,0,0,1,2,2V7A5,5,0,0,1,17,12ZM8,11a1,1,0,0,0-1-1A3,3,0,0,1,4,7V6H6.74a1,1,0,0,0,0-2H4A2,2,0,0,0,2,6V7a5,5,0,0,0,5,5A1,1,0,0,0,8,11Zm5,10V16.18a1,1,0,0,0-2,0V21a1,1,0,0,0,2,0Z\"\n />\n <path\n id=\"primary\"\n d=\"M16,22H8a1,1,0,0,1,0-2h8a1,1,0,0,1,0,2ZM17,2H7A1,1,0,0,0,6,3V9.57a7.75,7.75,0,0,0,4.89,7.22A3,3,0,0,0,12,17a3.13,3.13,0,0,0,1.12-.21A7.76,7.76,0,0,0,18,9.57V3A1,1,0,0,0,17,2Z\"\n />\n </SvgIcon>\n);\n"],"names":[],"mappings":";;;AAIa,MAAA,UAAA,GAAa,CAAC,KACzB,qBAAA,KAAA,CAAA,aAAA,CAAC,WAAS,GAAG,KAAA,EAAO,SAAQ,WAC1B,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,EAAC,MAAA;AAAA,EAAA;AAAA,IACC,EAAG,EAAA,WAAA;AAAA,IACH,CAAE,EAAA,+OAAA;AAAA,GAAA;AACJ,CACA,kBAAA,KAAA,CAAA,aAAA;AAAA,EAAC,MAAA;AAAA,EAAA;AAAA,IACC,EAAG,EAAA,SAAA;AAAA,IACH,CAAE,EAAA,gLAAA;AAAA,GAAA;AACJ,CACF;;;;"}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { makeStyles } from '@material-ui/core';
|
|
2
|
-
|
|
3
|
-
const useStyles = makeStyles((theme) => {
|
|
4
|
-
return {
|
|
5
|
-
trophyIcon: {
|
|
6
|
-
backgroundColor: "initial",
|
|
7
|
-
color: theme.palette.text.primary,
|
|
8
|
-
borderRadius: "50%",
|
|
9
|
-
boxSizing: "border-box",
|
|
10
|
-
padding: "0.5rem",
|
|
11
|
-
height: 50,
|
|
12
|
-
width: 50
|
|
13
|
-
},
|
|
14
|
-
votesText: {
|
|
15
|
-
display: "grid",
|
|
16
|
-
placeItems: "center",
|
|
17
|
-
marginLeft: "16px"
|
|
18
|
-
}
|
|
19
|
-
};
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
export { useStyles };
|
|
23
|
-
//# sourceMappingURL=styles.esm.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"styles.esm.js","sources":["../../../src/components/Statistics/styles.ts"],"sourcesContent":["import { makeStyles } from '@material-ui/core';\n\nexport const useStyles = makeStyles(theme => {\n return {\n trophyIcon: {\n backgroundColor: 'initial',\n color: theme.palette.text.primary,\n borderRadius: '50%',\n boxSizing: 'border-box',\n padding: '0.5rem',\n height: 50,\n width: 50,\n },\n votesText: {\n display: 'grid',\n placeItems: 'center',\n marginLeft: '16px',\n },\n };\n});\n"],"names":[],"mappings":";;AAEa,MAAA,SAAA,GAAY,WAAW,CAAS,KAAA,KAAA;AAC3C,EAAO,OAAA;AAAA,IACL,UAAY,EAAA;AAAA,MACV,eAAiB,EAAA,SAAA;AAAA,MACjB,KAAA,EAAO,KAAM,CAAA,OAAA,CAAQ,IAAK,CAAA,OAAA;AAAA,MAC1B,YAAc,EAAA,KAAA;AAAA,MACd,SAAW,EAAA,YAAA;AAAA,MACX,OAAS,EAAA,QAAA;AAAA,MACT,MAAQ,EAAA,EAAA;AAAA,MACR,KAAO,EAAA,EAAA;AAAA,KACT;AAAA,IACA,SAAW,EAAA;AAAA,MACT,OAAS,EAAA,MAAA;AAAA,MACT,UAAY,EAAA,QAAA;AAAA,MACZ,UAAY,EAAA,MAAA;AAAA,KACd;AAAA,GACF,CAAA;AACF,CAAC;;;;"}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import { Grid, TextField, IconButton, Typography, Chip, Avatar } from '@material-ui/core';
|
|
2
|
-
import React from 'react';
|
|
3
|
-
import { useTranslation, useQetaApi } from '../../utils/hooks.esm.js';
|
|
4
|
-
import { Progress, WarningPanel } from '@backstage/core-components';
|
|
5
|
-
import { useRouteRef } from '@backstage/core-plugin-api';
|
|
6
|
-
import { tagRouteRef } from '@drodil/backstage-plugin-qeta-react';
|
|
7
|
-
|
|
8
|
-
const TagsContainer = () => {
|
|
9
|
-
const [searchQuery, setSearchQuery] = React.useState("");
|
|
10
|
-
const tagRoute = useRouteRef(tagRouteRef);
|
|
11
|
-
const { t } = useTranslation();
|
|
12
|
-
const {
|
|
13
|
-
value: response,
|
|
14
|
-
loading,
|
|
15
|
-
error
|
|
16
|
-
} = useQetaApi((api) => api.getTags(), []);
|
|
17
|
-
if (loading) {
|
|
18
|
-
return /* @__PURE__ */ React.createElement(Progress, null);
|
|
19
|
-
}
|
|
20
|
-
if (error || response === void 0) {
|
|
21
|
-
return /* @__PURE__ */ React.createElement(WarningPanel, { severity: "error", title: t("tagPage.errorLoading") }, error?.message);
|
|
22
|
-
}
|
|
23
|
-
const filterData = (query, data) => {
|
|
24
|
-
if (!query) {
|
|
25
|
-
return data;
|
|
26
|
-
}
|
|
27
|
-
return data.filter((tag) => tag.tag.toLowerCase().includes(query));
|
|
28
|
-
};
|
|
29
|
-
const tags = filterData(searchQuery, response);
|
|
30
|
-
return /* @__PURE__ */ React.createElement(Grid, { container: true, className: "qetaTagsContainer" }, /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React.createElement(
|
|
31
|
-
TextField,
|
|
32
|
-
{
|
|
33
|
-
id: "search-bar",
|
|
34
|
-
className: "text qetaTagsContainerSearchInput",
|
|
35
|
-
onChange: (event) => setSearchQuery(event.target.value),
|
|
36
|
-
label: t("tagPage.search.label"),
|
|
37
|
-
variant: "outlined",
|
|
38
|
-
placeholder: t("tagPage.search.placeholder"),
|
|
39
|
-
size: "small"
|
|
40
|
-
}
|
|
41
|
-
), /* @__PURE__ */ React.createElement(IconButton, { type: "submit", "aria-label": "search" })), /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React.createElement(Typography, { variant: "h6", className: "qetaTagsContainerTitle" }, t("tagPage.tags", { count: tags.length }))), /* @__PURE__ */ React.createElement(Grid, { item: true }, tags.map((tag) => /* @__PURE__ */ React.createElement(
|
|
42
|
-
Chip,
|
|
43
|
-
{
|
|
44
|
-
key: tag.tag,
|
|
45
|
-
variant: "outlined",
|
|
46
|
-
avatar: /* @__PURE__ */ React.createElement(Avatar, null, tag.questionsCount),
|
|
47
|
-
label: tag.tag,
|
|
48
|
-
className: "qetaTagsContainerChip",
|
|
49
|
-
component: "a",
|
|
50
|
-
clickable: true,
|
|
51
|
-
href: tagRoute({ tag: tag.tag })
|
|
52
|
-
}
|
|
53
|
-
))));
|
|
54
|
-
};
|
|
55
|
-
|
|
56
|
-
export { TagsContainer };
|
|
57
|
-
//# sourceMappingURL=TagsContainer.esm.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TagsContainer.esm.js","sources":["../../../src/components/TagPage/TagsContainer.tsx"],"sourcesContent":["import {\n Avatar,\n Chip,\n Grid,\n IconButton,\n TextField,\n Typography,\n} from '@material-ui/core';\nimport React from 'react';\nimport { useQetaApi, useTranslation } from '../../utils/hooks';\nimport { Progress, WarningPanel } from '@backstage/core-components';\nimport { TagResponse } from '@drodil/backstage-plugin-qeta-common';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport { tagRouteRef } from '@drodil/backstage-plugin-qeta-react';\n\nexport const TagsContainer = () => {\n const [searchQuery, setSearchQuery] = React.useState('');\n const tagRoute = useRouteRef(tagRouteRef);\n const { t } = useTranslation();\n const {\n value: response,\n loading,\n error,\n } = useQetaApi(api => api.getTags(), []);\n\n if (loading) {\n return <Progress />;\n }\n\n if (error || response === undefined) {\n return (\n <WarningPanel severity=\"error\" title={t('tagPage.errorLoading')}>\n {error?.message}\n </WarningPanel>\n );\n }\n\n const filterData = (query: string, data: TagResponse[]) => {\n if (!query) {\n return data;\n }\n return data.filter(tag => tag.tag.toLowerCase().includes(query));\n };\n\n const tags = filterData(searchQuery, response);\n\n return (\n <Grid container className=\"qetaTagsContainer\">\n <Grid item xs={12}>\n <TextField\n id=\"search-bar\"\n className=\"text qetaTagsContainerSearchInput\"\n onChange={(\n event: React.ChangeEvent<HTMLTextAreaElement | HTMLInputElement>,\n ) => setSearchQuery(event.target.value)}\n label={t('tagPage.search.label')}\n variant=\"outlined\"\n placeholder={t('tagPage.search.placeholder')}\n size=\"small\"\n />\n <IconButton type=\"submit\" aria-label=\"search\" />\n </Grid>\n <Grid item xs={12}>\n <Typography variant=\"h6\" className=\"qetaTagsContainerTitle\">\n {t('tagPage.tags', { count: tags.length })}\n </Typography>\n </Grid>\n <Grid item>\n {tags.map(tag => (\n <Chip\n key={tag.tag}\n variant=\"outlined\"\n avatar={<Avatar>{tag.questionsCount}</Avatar>}\n label={tag.tag}\n className=\"qetaTagsContainerChip\"\n component=\"a\"\n clickable\n href={tagRoute({ tag: tag.tag })}\n />\n ))}\n </Grid>\n </Grid>\n );\n};\n"],"names":[],"mappings":"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"}
|