@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.
Files changed (126) hide show
  1. package/README.md +6 -11
  2. package/dist/components/ArticlePage/ArticlePage.esm.js +57 -15
  3. package/dist/components/ArticlePage/ArticlePage.esm.js.map +1 -1
  4. package/dist/components/ArticlesPage/ArticlesPage.esm.js +5 -22
  5. package/dist/components/ArticlesPage/ArticlesPage.esm.js.map +1 -1
  6. package/dist/components/AskPage/AskPage.esm.js +6 -7
  7. package/dist/components/AskPage/AskPage.esm.js.map +1 -1
  8. package/dist/components/CollectionCreatePage/CollectionCreatePage.esm.js +3 -4
  9. package/dist/components/CollectionCreatePage/CollectionCreatePage.esm.js.map +1 -1
  10. package/dist/components/CollectionPage/CollectionPage.esm.js +43 -87
  11. package/dist/components/CollectionPage/CollectionPage.esm.js.map +1 -1
  12. package/dist/components/CollectionsPage/CollectionsPage.esm.js +4 -5
  13. package/dist/components/CollectionsPage/CollectionsPage.esm.js.map +1 -1
  14. package/dist/components/ContentHealthCard/ContentHealthCard.esm.js +61 -89
  15. package/dist/components/ContentHealthCard/ContentHealthCard.esm.js.map +1 -1
  16. package/dist/components/ContentHealthCard/ContentHealthCard.module.css.esm.js +8 -0
  17. package/dist/components/ContentHealthCard/ContentHealthCard.module.css.esm.js.map +1 -0
  18. package/dist/components/ContentHealthCard/ReviewList.esm.js +27 -60
  19. package/dist/components/ContentHealthCard/ReviewList.esm.js.map +1 -1
  20. package/dist/components/ContentHealthCard/ReviewList.module.css.esm.js +8 -0
  21. package/dist/components/ContentHealthCard/ReviewList.module.css.esm.js.map +1 -0
  22. package/dist/components/CreateLinkPage/CreateLinkPage.esm.js +5 -6
  23. package/dist/components/CreateLinkPage/CreateLinkPage.esm.js.map +1 -1
  24. package/dist/components/EntityPage/EntityPage.esm.js +40 -58
  25. package/dist/components/EntityPage/EntityPage.esm.js.map +1 -1
  26. package/dist/components/EntityPostsContent/EntityPostsContent.esm.js +2 -3
  27. package/dist/components/EntityPostsContent/EntityPostsContent.esm.js.map +1 -1
  28. package/dist/components/FavoritePage/FavoritePage.esm.js +3 -14
  29. package/dist/components/FavoritePage/FavoritePage.esm.js.map +1 -1
  30. package/dist/components/HomePage/HomePage.esm.js +14 -60
  31. package/dist/components/HomePage/HomePage.esm.js.map +1 -1
  32. package/dist/components/HomePage/HomePage.module.css.esm.js +8 -0
  33. package/dist/components/HomePage/HomePage.module.css.esm.js.map +1 -0
  34. package/dist/components/LinkPage/LinkPage.esm.js +56 -61
  35. package/dist/components/LinkPage/LinkPage.esm.js.map +1 -1
  36. package/dist/components/LinksPage/LinksPage.esm.js +5 -16
  37. package/dist/components/LinksPage/LinksPage.esm.js.map +1 -1
  38. package/dist/components/ModeratorPage/ModeratorPage.esm.js +19 -29
  39. package/dist/components/ModeratorPage/ModeratorPage.esm.js.map +1 -1
  40. package/dist/components/ModeratorPage/ModeratorPage.module.css.esm.js +8 -0
  41. package/dist/components/ModeratorPage/ModeratorPage.module.css.esm.js.map +1 -0
  42. package/dist/components/QetaPage/QetaPage.esm.js +185 -268
  43. package/dist/components/QetaPage/QetaPage.esm.js.map +1 -1
  44. package/dist/components/QetaPage/QetaPage.module.css.esm.js +8 -0
  45. package/dist/components/QetaPage/QetaPage.module.css.esm.js.map +1 -0
  46. package/dist/components/QetaSearchResultListItem/QetaSearchResultListItem.esm.js +67 -78
  47. package/dist/components/QetaSearchResultListItem/QetaSearchResultListItem.esm.js.map +1 -1
  48. package/dist/components/QetaSearchResultListItem/QetaSearchResultListItem.module.css.esm.js +8 -0
  49. package/dist/components/QetaSearchResultListItem/QetaSearchResultListItem.module.css.esm.js.map +1 -0
  50. package/dist/components/QuestionPage/QuestionPage.esm.js +118 -97
  51. package/dist/components/QuestionPage/QuestionPage.esm.js.map +1 -1
  52. package/dist/components/QuestionsPage/QuestionsPage.esm.js +4 -5
  53. package/dist/components/QuestionsPage/QuestionsPage.esm.js.map +1 -1
  54. package/dist/components/ReviewPage/ReviewPage.esm.js +53 -18
  55. package/dist/components/ReviewPage/ReviewPage.esm.js.map +1 -1
  56. package/dist/components/RightContent/ArticlesRightContent.esm.js +2 -2
  57. package/dist/components/RightContent/ArticlesRightContent.esm.js.map +1 -1
  58. package/dist/components/RightContent/DefaultRightContent.esm.js +2 -2
  59. package/dist/components/RightContent/DefaultRightContent.esm.js.map +1 -1
  60. package/dist/components/RightContent/EntityRightContent.esm.js +2 -2
  61. package/dist/components/RightContent/EntityRightContent.esm.js.map +1 -1
  62. package/dist/components/RightContent/LinkedPosts.esm.js +5 -19
  63. package/dist/components/RightContent/LinkedPosts.esm.js.map +1 -1
  64. package/dist/components/RightContent/LinkedPosts.module.css.esm.js +8 -0
  65. package/dist/components/RightContent/LinkedPosts.module.css.esm.js.map +1 -0
  66. package/dist/components/RightContent/LinksRightContent.esm.js +2 -2
  67. package/dist/components/RightContent/LinksRightContent.esm.js.map +1 -1
  68. package/dist/components/RightContent/PostRightContent.esm.js +4 -4
  69. package/dist/components/RightContent/PostRightContent.esm.js.map +1 -1
  70. package/dist/components/RightContent/QuestionsRightContent.esm.js +2 -2
  71. package/dist/components/RightContent/QuestionsRightContent.esm.js.map +1 -1
  72. package/dist/components/RightContent/RightContent.esm.js +36 -52
  73. package/dist/components/RightContent/RightContent.esm.js.map +1 -1
  74. package/dist/components/RightContent/RightContent.module.css.esm.js +8 -0
  75. package/dist/components/RightContent/RightContent.module.css.esm.js.map +1 -0
  76. package/dist/components/RightContent/SimilarQuestions.esm.js +3 -16
  77. package/dist/components/RightContent/SimilarQuestions.esm.js.map +1 -1
  78. package/dist/components/RightContent/SimilarQuestions.module.css.esm.js +8 -0
  79. package/dist/components/RightContent/SimilarQuestions.module.css.esm.js.map +1 -0
  80. package/dist/components/RightContent/TagRightContent.esm.js +2 -2
  81. package/dist/components/RightContent/TagRightContent.esm.js.map +1 -1
  82. package/dist/components/SettingsPage/SettingsPage.esm.js +198 -200
  83. package/dist/components/SettingsPage/SettingsPage.esm.js.map +1 -1
  84. package/dist/components/SettingsPage/SettingsPage.module.css.esm.js +8 -0
  85. package/dist/components/SettingsPage/SettingsPage.module.css.esm.js.map +1 -0
  86. package/dist/components/Statistics/GlobalStatsContent.esm.js +5 -5
  87. package/dist/components/Statistics/GlobalStatsContent.esm.js.map +1 -1
  88. package/dist/components/Statistics/StatisticsPage.esm.js +14 -19
  89. package/dist/components/Statistics/StatisticsPage.esm.js.map +1 -1
  90. package/dist/components/Statistics/StatisticsPage.module.css.esm.js +8 -0
  91. package/dist/components/Statistics/StatisticsPage.module.css.esm.js.map +1 -0
  92. package/dist/components/TagPage/TagPage.esm.js +54 -87
  93. package/dist/components/TagPage/TagPage.esm.js.map +1 -1
  94. package/dist/components/TechDocsAskQuestionAddon/TechDocsAskQuestionAddon.esm.js +23 -32
  95. package/dist/components/TechDocsAskQuestionAddon/TechDocsAskQuestionAddon.esm.js.map +1 -1
  96. package/dist/components/TechDocsAskQuestionAddon/TechDocsAskQuestionAddon.module.css.esm.js +8 -0
  97. package/dist/components/TechDocsAskQuestionAddon/TechDocsAskQuestionAddon.module.css.esm.js.map +1 -0
  98. package/dist/components/UserPage/UserPage.esm.js +137 -236
  99. package/dist/components/UserPage/UserPage.esm.js.map +1 -1
  100. package/dist/components/UserPage/UserPage.module.css.esm.js +8 -0
  101. package/dist/components/UserPage/UserPage.module.css.esm.js.map +1 -0
  102. package/dist/components/UserPage/UserStatsContent.esm.js +5 -5
  103. package/dist/components/UserPage/UserStatsContent.esm.js.map +1 -1
  104. package/dist/components/UsersPage/UsersPage.esm.js +3 -9
  105. package/dist/components/UsersPage/UsersPage.esm.js.map +1 -1
  106. package/dist/components/WritePage/WritePage.esm.js +5 -6
  107. package/dist/components/WritePage/WritePage.esm.js.map +1 -1
  108. package/dist/index.d.ts +283 -77
  109. package/dist/index.esm.js +262 -7
  110. package/dist/index.esm.js.map +1 -1
  111. package/dist/node_modules_dist/style-inject/dist/style-inject.es.esm.js +29 -0
  112. package/dist/node_modules_dist/style-inject/dist/style-inject.es.esm.js.map +1 -0
  113. package/dist/{package.json.esm.js → plugins/qeta/package.json.esm.js} +8 -13
  114. package/dist/{package.json.esm.js.map → plugins/qeta/package.json.esm.js.map} +1 -1
  115. package/package.json +9 -18
  116. package/dist/alpha.d.ts +0 -255
  117. package/dist/alpha.esm.js +0 -238
  118. package/dist/alpha.esm.js.map +0 -1
  119. package/dist/components/EntityCards/EntityPostsContainerCard.esm.js +0 -13
  120. package/dist/components/EntityCards/EntityPostsContainerCard.esm.js.map +0 -1
  121. package/dist/components/EntityCards/EntityPostsGridCard.esm.js +0 -20
  122. package/dist/components/EntityCards/EntityPostsGridCard.esm.js.map +0 -1
  123. package/dist/components/ReviewPage/index.esm.js +0 -6
  124. package/dist/components/ReviewPage/index.esm.js.map +0 -1
  125. package/dist/plugin.esm.js +0 -84
  126. package/dist/plugin.esm.js.map +0 -1
@@ -1,43 +1,11 @@
1
- import { jsx, jsxs } from 'react/jsx-runtime';
2
- import { useTheme, CardContent, Typography, FormControlLabel, Switch, Box, ButtonGroup, Button, makeStyles } from '@material-ui/core';
3
- import { InfoCard } from '@backstage/core-components';
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
4
2
  import { useUserSettings, qetaTranslationRef, useAI } from '@drodil/backstage-plugin-qeta-react';
5
3
  import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
6
4
  import { useApi, configApiRef } from '@backstage/core-plugin-api';
5
+ import { Card, CardHeader, Text, CardBody, Box, Switch, ToggleButtonGroup, ToggleButton, Flex, Button } from '@backstage/ui';
6
+ import styles from './SettingsPage.module.css.esm.js';
7
7
 
8
- const useStyles = makeStyles((theme) => ({
9
- content: {
10
- maxWidth: "800px",
11
- margin: "0 auto"
12
- },
13
- section: {
14
- marginBottom: theme.spacing(3)
15
- },
16
- sectionTitle: {
17
- marginBottom: theme.spacing(2),
18
- fontWeight: 600
19
- },
20
- settingItem: {
21
- marginBottom: theme.spacing(2)
22
- },
23
- description: {
24
- color: theme.palette.text.secondary,
25
- fontSize: "0.875rem",
26
- marginTop: theme.spacing(0.5)
27
- },
28
- viewTypeItem: {
29
- marginBottom: theme.spacing(2),
30
- display: "flex",
31
- alignItems: "center",
32
- justifyContent: "space-between"
33
- },
34
- viewTypeLabel: {
35
- minWidth: "200px"
36
- }
37
- }));
38
8
  const SettingsPage = () => {
39
- const classes = useStyles();
40
- const theme = useTheme();
41
9
  const {
42
10
  settings,
43
11
  setSetting,
@@ -129,186 +97,216 @@ const SettingsPage = () => {
129
97
  if (!isLoaded) {
130
98
  return null;
131
99
  }
132
- return /* @__PURE__ */ jsx(InfoCard, { title: t("settingsPage.title", {}), "data-testid": "settings-page", children: /* @__PURE__ */ jsxs(CardContent, { children: [
133
- /* @__PURE__ */ jsxs("div", { className: classes.section, children: [
134
- /* @__PURE__ */ jsx(Typography, { variant: "h6", className: classes.sectionTitle, children: t("settingsPage.editorPreferences", {}) }),
135
- /* @__PURE__ */ jsxs("div", { className: classes.settingItem, "data-testid": "auto-save-setting", children: [
136
- /* @__PURE__ */ jsx(
137
- FormControlLabel,
100
+ return /* @__PURE__ */ jsxs(Card, { "data-testid": "settings-page", children: [
101
+ /* @__PURE__ */ jsx(CardHeader, { children: /* @__PURE__ */ jsx(Text, { as: "h1", variant: "title-small", children: t("settingsPage.title", {}) }) }),
102
+ /* @__PURE__ */ jsx(CardBody, { children: /* @__PURE__ */ jsxs(Box, { className: styles.content, children: [
103
+ /* @__PURE__ */ jsxs(Box, { className: styles.section, children: [
104
+ /* @__PURE__ */ jsx(Text, { as: "h2", variant: "title-small", className: styles.sectionTitle, children: t("settingsPage.editorPreferences", {}) }),
105
+ /* @__PURE__ */ jsxs("div", { className: styles.settingItem, "data-testid": "auto-save-setting", children: [
106
+ /* @__PURE__ */ jsx(
107
+ Switch,
108
+ {
109
+ isSelected: settings.autoSaveEnabled,
110
+ onChange: (value) => setSetting("autoSaveEnabled", value),
111
+ label: t("settingsPage.autoSave.label", {}),
112
+ "data-testid": "auto-save-switch"
113
+ }
114
+ ),
115
+ /* @__PURE__ */ jsx(
116
+ Text,
117
+ {
118
+ as: "div",
119
+ variant: "body-small",
120
+ color: "secondary",
121
+ className: styles.description,
122
+ children: t("settingsPage.autoSave.description", {})
123
+ }
124
+ )
125
+ ] }),
126
+ allowAnonymous && /* @__PURE__ */ jsxs(
127
+ "div",
138
128
  {
139
- control: /* @__PURE__ */ jsx(
140
- Switch,
141
- {
142
- checked: settings.autoSaveEnabled,
143
- onChange: (e) => setSetting("autoSaveEnabled", e.target.checked),
144
- color: "primary",
145
- "data-testid": "auto-save-switch"
146
- }
147
- ),
148
- label: t("settingsPage.autoSave.label", {})
129
+ className: styles.settingItem,
130
+ "data-testid": "anonymous-posting-setting",
131
+ children: [
132
+ /* @__PURE__ */ jsx(
133
+ Switch,
134
+ {
135
+ isSelected: settings.anonymousPosting,
136
+ onChange: (value) => setSetting("anonymousPosting", value),
137
+ label: t("settingsPage.anonymousPosting.label", {}),
138
+ "data-testid": "anonymous-posting-switch"
139
+ }
140
+ ),
141
+ /* @__PURE__ */ jsx(
142
+ Text,
143
+ {
144
+ as: "div",
145
+ variant: "body-small",
146
+ color: "secondary",
147
+ className: styles.description,
148
+ children: t("settingsPage.anonymousPosting.description", {})
149
+ }
150
+ )
151
+ ]
149
152
  }
150
- ),
151
- /* @__PURE__ */ jsx(Typography, { className: classes.description, children: t("settingsPage.autoSave.description", {}) })
153
+ )
152
154
  ] }),
153
- allowAnonymous && /* @__PURE__ */ jsxs(
154
- "div",
155
- {
156
- className: classes.settingItem,
157
- "data-testid": "anonymous-posting-setting",
158
- children: [
159
- /* @__PURE__ */ jsx(
160
- FormControlLabel,
161
- {
162
- control: /* @__PURE__ */ jsx(
163
- Switch,
164
- {
165
- checked: settings.anonymousPosting,
166
- onChange: (e) => setSetting("anonymousPosting", e.target.checked),
167
- color: "primary",
168
- "data-testid": "anonymous-posting-switch"
169
- }
170
- ),
171
- label: t("settingsPage.anonymousPosting.label", {})
172
- }
173
- ),
174
- /* @__PURE__ */ jsx(Typography, { className: classes.description, children: t("settingsPage.anonymousPosting.description", {}) })
175
- ]
176
- }
177
- )
178
- ] }),
179
- /* @__PURE__ */ jsxs("div", { className: classes.section, children: [
180
- /* @__PURE__ */ jsx(Typography, { variant: "h6", className: classes.sectionTitle, children: t("settingsPage.displayPreferences", {}) }),
181
- isAIEnabled && /* @__PURE__ */ jsxs(
182
- "div",
183
- {
184
- className: classes.settingItem,
185
- "data-testid": "ai-answer-setting",
186
- children: [
187
- /* @__PURE__ */ jsx(
188
- FormControlLabel,
189
- {
190
- control: /* @__PURE__ */ jsx(
191
- Switch,
192
- {
193
- checked: settings.aiAnswerExpanded,
194
- onChange: (e) => setSetting("aiAnswerExpanded", e.target.checked),
195
- color: "primary",
196
- "data-testid": "ai-answer-switch"
197
- }
198
- ),
199
- label: t("settingsPage.aiAnswerExpanded.label", {})
200
- }
201
- ),
202
- /* @__PURE__ */ jsx(Typography, { className: classes.description, children: t("settingsPage.aiAnswerExpanded.description", {}) })
203
- ]
204
- }
205
- ),
206
- /* @__PURE__ */ jsxs("div", { className: classes.settingItem, "data-testid": "pagination-setting", children: [
207
- /* @__PURE__ */ jsx(
208
- FormControlLabel,
155
+ /* @__PURE__ */ jsxs(Box, { className: styles.section, children: [
156
+ /* @__PURE__ */ jsx(Text, { as: "h2", variant: "title-small", className: styles.sectionTitle, children: t("settingsPage.displayPreferences", {}) }),
157
+ isAIEnabled && /* @__PURE__ */ jsxs(
158
+ "div",
209
159
  {
210
- control: /* @__PURE__ */ jsx(
211
- Switch,
212
- {
213
- checked: settings.usePagination,
214
- onChange: (e) => setSetting("usePagination", e.target.checked),
215
- color: "primary",
216
- "data-testid": "pagination-switch"
217
- }
218
- ),
219
- label: t("settingsPage.usePagination.label", {})
160
+ className: styles.settingItem,
161
+ "data-testid": "ai-answer-setting",
162
+ children: [
163
+ /* @__PURE__ */ jsx(
164
+ Switch,
165
+ {
166
+ isSelected: settings.aiAnswerExpanded,
167
+ onChange: (value) => setSetting("aiAnswerExpanded", value),
168
+ label: t("settingsPage.aiAnswerExpanded.label", {}),
169
+ "data-testid": "ai-answer-switch"
170
+ }
171
+ ),
172
+ /* @__PURE__ */ jsx(
173
+ Text,
174
+ {
175
+ as: "div",
176
+ variant: "body-small",
177
+ color: "secondary",
178
+ className: styles.description,
179
+ children: t("settingsPage.aiAnswerExpanded.description", {})
180
+ }
181
+ )
182
+ ]
220
183
  }
221
184
  ),
222
- /* @__PURE__ */ jsx(Typography, { className: classes.description, children: t("settingsPage.usePagination.description", {}) })
223
- ] }),
224
- /* @__PURE__ */ jsxs(Box, { mt: 3, children: [
225
- /* @__PURE__ */ jsx(
226
- Typography,
185
+ /* @__PURE__ */ jsxs(
186
+ "div",
227
187
  {
228
- variant: "subtitle1",
229
- style: { fontWeight: 500, marginBottom: 16 },
230
- children: t("settingsPage.viewTypePreferences.title", {})
188
+ className: styles.settingItem,
189
+ "data-testid": "pagination-setting",
190
+ children: [
191
+ /* @__PURE__ */ jsx(
192
+ Switch,
193
+ {
194
+ isSelected: settings.usePagination,
195
+ onChange: (value) => setSetting("usePagination", value),
196
+ label: t("settingsPage.usePagination.label", {}),
197
+ "data-testid": "pagination-switch"
198
+ }
199
+ ),
200
+ /* @__PURE__ */ jsx(
201
+ Text,
202
+ {
203
+ as: "div",
204
+ variant: "body-small",
205
+ color: "secondary",
206
+ className: styles.description,
207
+ children: t("settingsPage.usePagination.description", {})
208
+ }
209
+ )
210
+ ]
231
211
  }
232
212
  ),
233
- /* @__PURE__ */ jsx(
234
- Typography,
235
- {
236
- className: classes.description,
237
- style: { marginBottom: 16 },
238
- children: t("settingsPage.viewTypePreferences.description", {})
239
- }
240
- ),
241
- viewTypes.map(({ key, label }) => {
242
- const currentView = getViewType(key);
243
- return /* @__PURE__ */ jsxs(
244
- "div",
213
+ /* @__PURE__ */ jsxs(Box, { className: styles.viewTypeSection, children: [
214
+ /* @__PURE__ */ jsx(Text, { as: "h3", variant: "title-x-small", children: t("settingsPage.viewTypePreferences.title", {}) }),
215
+ /* @__PURE__ */ jsx(
216
+ Text,
245
217
  {
246
- className: classes.viewTypeItem,
247
- "data-testid": `view-type-${key}`,
248
- children: [
249
- /* @__PURE__ */ jsx(Typography, { className: classes.viewTypeLabel, children: label }),
250
- /* @__PURE__ */ jsxs(ButtonGroup, { size: "small", color: "primary", children: [
251
- /* @__PURE__ */ jsx(
252
- Button,
253
- {
254
- variant: currentView === "grid" ? "contained" : "outlined",
255
- onClick: () => handleViewTypeChange(key, "grid"),
256
- "data-testid": `view-type-${key}-grid`,
257
- "data-selected": currentView === "grid",
258
- children: t("settingsPage.viewTypePreferences.grid", {})
259
- }
260
- ),
261
- /* @__PURE__ */ jsx(
262
- Button,
263
- {
264
- variant: currentView === "list" ? "contained" : "outlined",
265
- onClick: () => handleViewTypeChange(key, "list"),
266
- "data-testid": `view-type-${key}-list`,
267
- "data-selected": currentView === "list",
268
- children: t("settingsPage.viewTypePreferences.list", {})
269
- }
270
- ),
271
- /* @__PURE__ */ jsx(
272
- Button,
218
+ as: "div",
219
+ variant: "body-small",
220
+ color: "secondary",
221
+ className: styles.description,
222
+ children: t("settingsPage.viewTypePreferences.description", {})
223
+ }
224
+ ),
225
+ viewTypes.map(({ key, label }) => {
226
+ const currentView = getViewType(key) ?? "default";
227
+ return /* @__PURE__ */ jsxs(
228
+ "div",
229
+ {
230
+ className: styles.viewTypeItem,
231
+ "data-testid": `view-type-${key}`,
232
+ children: [
233
+ /* @__PURE__ */ jsx(Text, { className: styles.viewTypeLabel, children: label }),
234
+ /* @__PURE__ */ jsxs(
235
+ ToggleButtonGroup,
273
236
  {
274
- variant: currentView === null ? "contained" : "outlined",
275
- onClick: () => handleViewTypeChange(key, null),
276
- "data-testid": `view-type-${key}-default`,
277
- "data-selected": currentView === null,
278
- children: t("settingsPage.viewTypePreferences.default", {})
237
+ selectionMode: "single",
238
+ disallowEmptySelection: true,
239
+ selectedKeys: [currentView],
240
+ onSelectionChange: (keys) => {
241
+ const selected = Array.from(keys)[0];
242
+ handleViewTypeChange(
243
+ key,
244
+ selected === "default" ? null : selected
245
+ );
246
+ },
247
+ children: [
248
+ /* @__PURE__ */ jsx(
249
+ ToggleButton,
250
+ {
251
+ id: "grid",
252
+ size: "small",
253
+ "data-testid": `view-type-${key}-grid`,
254
+ children: t("settingsPage.viewTypePreferences.grid", {})
255
+ }
256
+ ),
257
+ /* @__PURE__ */ jsx(
258
+ ToggleButton,
259
+ {
260
+ id: "list",
261
+ size: "small",
262
+ "data-testid": `view-type-${key}-list`,
263
+ children: t("settingsPage.viewTypePreferences.list", {})
264
+ }
265
+ ),
266
+ /* @__PURE__ */ jsx(
267
+ ToggleButton,
268
+ {
269
+ id: "default",
270
+ size: "small",
271
+ "data-testid": `view-type-${key}-default`,
272
+ children: t("settingsPage.viewTypePreferences.default", {})
273
+ }
274
+ )
275
+ ]
279
276
  }
280
277
  )
281
- ] })
282
- ]
278
+ ]
279
+ },
280
+ key
281
+ );
282
+ })
283
+ ] })
284
+ ] }),
285
+ /* @__PURE__ */ jsxs(Flex, { direction: "column", className: styles.footer, children: [
286
+ /* @__PURE__ */ jsx(
287
+ Button,
288
+ {
289
+ variant: "secondary",
290
+ onClick: () => {
291
+ resetSettings();
283
292
  },
284
- key
285
- );
286
- })
293
+ "data-testid": "reset-all-settings-button",
294
+ children: t("settingsPage.resetAllSettings", {})
295
+ }
296
+ ),
297
+ /* @__PURE__ */ jsx(
298
+ Text,
299
+ {
300
+ as: "div",
301
+ variant: "body-small",
302
+ color: "secondary",
303
+ className: styles.description,
304
+ children: t("settingsPage.resetAllSettingsDescription", {})
305
+ }
306
+ )
287
307
  ] })
288
- ] }),
289
- /* @__PURE__ */ jsxs(Box, { mt: 4, pt: 3, borderTop: `1px solid ${theme.palette.divider}`, children: [
290
- /* @__PURE__ */ jsx(
291
- Button,
292
- {
293
- variant: "outlined",
294
- color: "secondary",
295
- onClick: () => {
296
- resetSettings();
297
- },
298
- "data-testid": "reset-all-settings-button",
299
- children: t("settingsPage.resetAllSettings", {})
300
- }
301
- ),
302
- /* @__PURE__ */ jsx(
303
- Typography,
304
- {
305
- className: classes.description,
306
- style: { marginTop: theme.spacing(1) },
307
- children: t("settingsPage.resetAllSettingsDescription", {})
308
- }
309
- )
310
- ] })
311
- ] }) });
308
+ ] }) })
309
+ ] });
312
310
  };
313
311
 
314
312
  export { SettingsPage };
@@ -1 +1 @@
1
- {"version":3,"file":"SettingsPage.esm.js","sources":["../../../src/components/SettingsPage/SettingsPage.tsx"],"sourcesContent":["import {\n Box,\n Button,\n ButtonGroup,\n CardContent,\n FormControlLabel,\n makeStyles,\n Switch,\n Typography,\n useTheme,\n} from '@material-ui/core';\nimport { InfoCard } from '@backstage/core-components';\nimport {\n qetaTranslationRef,\n useAI,\n useUserSettings,\n ViewType,\n} from '@drodil/backstage-plugin-qeta-react';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { configApiRef, useApi } from '@backstage/core-plugin-api';\n\nconst useStyles = makeStyles(theme => ({\n content: {\n maxWidth: '800px',\n margin: '0 auto',\n },\n section: {\n marginBottom: theme.spacing(3),\n },\n sectionTitle: {\n marginBottom: theme.spacing(2),\n fontWeight: 600,\n },\n settingItem: {\n marginBottom: theme.spacing(2),\n },\n description: {\n color: theme.palette.text.secondary,\n fontSize: '0.875rem',\n marginTop: theme.spacing(0.5),\n },\n viewTypeItem: {\n marginBottom: theme.spacing(2),\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n },\n viewTypeLabel: {\n minWidth: '200px',\n },\n}));\n\nexport const SettingsPage = () => {\n const classes = useStyles();\n const theme = useTheme();\n const {\n settings,\n setSetting,\n getSetting,\n resetSettings,\n isLoaded,\n updateSettings,\n } = useUserSettings();\n const { t } = useTranslationRef(qetaTranslationRef);\n const { isAIEnabled } = useAI();\n const configApi = useApi(configApiRef);\n const allowAnonymous = configApi.getOptionalBoolean('qeta.allowAnonymous');\n\n const viewTypes = [\n {\n key: 'posts-question',\n label: t('settingsPage.viewTypePreferences.labels.questions', {}),\n },\n {\n key: 'posts-article',\n label: t('settingsPage.viewTypePreferences.labels.articles', {}),\n },\n {\n key: 'posts-link',\n label: t('settingsPage.viewTypePreferences.labels.links', {}),\n },\n {\n key: 'favorites',\n label: t('settingsPage.viewTypePreferences.labels.favorites', {}),\n },\n {\n key: 'collections',\n label: t('settingsPage.viewTypePreferences.labels.collections', {}),\n },\n {\n key: 'tags',\n label: t('settingsPage.viewTypePreferences.labels.tags', {}),\n },\n {\n key: 'users',\n label: t('settingsPage.viewTypePreferences.labels.users', {}),\n },\n {\n key: 'entities',\n label: t('settingsPage.viewTypePreferences.labels.entities', {}),\n },\n {\n key: 'tag-posts',\n label: t('settingsPage.viewTypePreferences.labels.tagPosts', {}),\n },\n {\n key: 'collection-posts',\n label: t('settingsPage.viewTypePreferences.labels.collectionPosts', {}),\n },\n {\n key: 'user-questions',\n label: t('settingsPage.viewTypePreferences.labels.userQuestions', {}),\n },\n {\n key: 'user-articles',\n label: t('settingsPage.viewTypePreferences.labels.userArticles', {}),\n },\n {\n key: 'user-links',\n label: t('settingsPage.viewTypePreferences.labels.userLinks', {}),\n },\n {\n key: 'user-collections',\n label: t('settingsPage.viewTypePreferences.labels.userCollections', {}),\n },\n {\n key: 'user-answers',\n label: t('settingsPage.viewTypePreferences.labels.userAnswers', {}),\n },\n ];\n\n const handleViewTypeChange = (key: string, value: ViewType | null) => {\n if (value === null) {\n updateSettings({\n viewType: { ...getSetting('viewType'), [key]: undefined as any },\n });\n } else {\n updateSettings({\n viewType: { ...getSetting('viewType'), [key]: value },\n });\n }\n };\n\n const getViewType = (key: string): ViewType | null => {\n return settings.viewType[key] || null;\n };\n\n if (!isLoaded) {\n return null;\n }\n\n return (\n <InfoCard title={t('settingsPage.title', {})} data-testid=\"settings-page\">\n <CardContent>\n <div className={classes.section}>\n <Typography variant=\"h6\" className={classes.sectionTitle}>\n {t('settingsPage.editorPreferences', {})}\n </Typography>\n\n <div className={classes.settingItem} data-testid=\"auto-save-setting\">\n <FormControlLabel\n control={\n <Switch\n checked={settings.autoSaveEnabled}\n onChange={e =>\n setSetting('autoSaveEnabled', e.target.checked)\n }\n color=\"primary\"\n data-testid=\"auto-save-switch\"\n />\n }\n label={t('settingsPage.autoSave.label', {})}\n />\n <Typography className={classes.description}>\n {t('settingsPage.autoSave.description', {})}\n </Typography>\n </div>\n\n {allowAnonymous && (\n <div\n className={classes.settingItem}\n data-testid=\"anonymous-posting-setting\"\n >\n <FormControlLabel\n control={\n <Switch\n checked={settings.anonymousPosting}\n onChange={e =>\n setSetting('anonymousPosting', e.target.checked)\n }\n color=\"primary\"\n data-testid=\"anonymous-posting-switch\"\n />\n }\n label={t('settingsPage.anonymousPosting.label', {})}\n />\n <Typography className={classes.description}>\n {t('settingsPage.anonymousPosting.description', {})}\n </Typography>\n </div>\n )}\n </div>\n\n <div className={classes.section}>\n <Typography variant=\"h6\" className={classes.sectionTitle}>\n {t('settingsPage.displayPreferences', {})}\n </Typography>\n\n {isAIEnabled && (\n <div\n className={classes.settingItem}\n data-testid=\"ai-answer-setting\"\n >\n <FormControlLabel\n control={\n <Switch\n checked={settings.aiAnswerExpanded}\n onChange={e =>\n setSetting('aiAnswerExpanded', e.target.checked)\n }\n color=\"primary\"\n data-testid=\"ai-answer-switch\"\n />\n }\n label={t('settingsPage.aiAnswerExpanded.label', {})}\n />\n <Typography className={classes.description}>\n {t('settingsPage.aiAnswerExpanded.description', {})}\n </Typography>\n </div>\n )}\n\n <div className={classes.settingItem} data-testid=\"pagination-setting\">\n <FormControlLabel\n control={\n <Switch\n checked={settings.usePagination}\n onChange={e => setSetting('usePagination', e.target.checked)}\n color=\"primary\"\n data-testid=\"pagination-switch\"\n />\n }\n label={t('settingsPage.usePagination.label', {})}\n />\n <Typography className={classes.description}>\n {t('settingsPage.usePagination.description', {})}\n </Typography>\n </div>\n\n <Box mt={3}>\n <Typography\n variant=\"subtitle1\"\n style={{ fontWeight: 500, marginBottom: 16 }}\n >\n {t('settingsPage.viewTypePreferences.title', {})}\n </Typography>\n <Typography\n className={classes.description}\n style={{ marginBottom: 16 }}\n >\n {t('settingsPage.viewTypePreferences.description', {})}\n </Typography>\n\n {viewTypes.map(({ key, label }) => {\n const currentView = getViewType(key);\n return (\n <div\n key={key}\n className={classes.viewTypeItem}\n data-testid={`view-type-${key}`}\n >\n <Typography className={classes.viewTypeLabel}>\n {label}\n </Typography>\n <ButtonGroup size=\"small\" color=\"primary\">\n <Button\n variant={\n currentView === 'grid' ? 'contained' : 'outlined'\n }\n onClick={() => handleViewTypeChange(key, 'grid')}\n data-testid={`view-type-${key}-grid`}\n data-selected={currentView === 'grid'}\n >\n {t('settingsPage.viewTypePreferences.grid', {})}\n </Button>\n <Button\n variant={\n currentView === 'list' ? 'contained' : 'outlined'\n }\n onClick={() => handleViewTypeChange(key, 'list')}\n data-testid={`view-type-${key}-list`}\n data-selected={currentView === 'list'}\n >\n {t('settingsPage.viewTypePreferences.list', {})}\n </Button>\n <Button\n variant={currentView === null ? 'contained' : 'outlined'}\n onClick={() => handleViewTypeChange(key, null)}\n data-testid={`view-type-${key}-default`}\n data-selected={currentView === null}\n >\n {t('settingsPage.viewTypePreferences.default', {})}\n </Button>\n </ButtonGroup>\n </div>\n );\n })}\n </Box>\n </div>\n\n <Box mt={4} pt={3} borderTop={`1px solid ${theme.palette.divider}`}>\n <Button\n variant=\"outlined\"\n color=\"secondary\"\n onClick={() => {\n resetSettings();\n }}\n data-testid=\"reset-all-settings-button\"\n >\n {t('settingsPage.resetAllSettings', {})}\n </Button>\n <Typography\n className={classes.description}\n style={{ marginTop: theme.spacing(1) }}\n >\n {t('settingsPage.resetAllSettingsDescription', {})}\n </Typography>\n </Box>\n </CardContent>\n </InfoCard>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SettingsPage.esm.js","sources":["../../../src/components/SettingsPage/SettingsPage.tsx"],"sourcesContent":["import {\n qetaTranslationRef,\n useAI,\n useUserSettings,\n ViewType,\n} from '@drodil/backstage-plugin-qeta-react';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { configApiRef, useApi } from '@backstage/core-plugin-api';\nimport {\n Box,\n Button,\n Card,\n CardBody,\n CardHeader,\n Flex,\n Switch,\n Text,\n ToggleButton,\n ToggleButtonGroup,\n} from '@backstage/ui';\nimport styles from './SettingsPage.module.css';\n\nexport const SettingsPage = () => {\n const {\n settings,\n setSetting,\n getSetting,\n resetSettings,\n isLoaded,\n updateSettings,\n } = useUserSettings();\n const { t } = useTranslationRef(qetaTranslationRef);\n const { isAIEnabled } = useAI();\n const configApi = useApi(configApiRef);\n const allowAnonymous = configApi.getOptionalBoolean('qeta.allowAnonymous');\n\n const viewTypes = [\n {\n key: 'posts-question',\n label: t('settingsPage.viewTypePreferences.labels.questions', {}),\n },\n {\n key: 'posts-article',\n label: t('settingsPage.viewTypePreferences.labels.articles', {}),\n },\n {\n key: 'posts-link',\n label: t('settingsPage.viewTypePreferences.labels.links', {}),\n },\n {\n key: 'favorites',\n label: t('settingsPage.viewTypePreferences.labels.favorites', {}),\n },\n {\n key: 'collections',\n label: t('settingsPage.viewTypePreferences.labels.collections', {}),\n },\n {\n key: 'tags',\n label: t('settingsPage.viewTypePreferences.labels.tags', {}),\n },\n {\n key: 'users',\n label: t('settingsPage.viewTypePreferences.labels.users', {}),\n },\n {\n key: 'entities',\n label: t('settingsPage.viewTypePreferences.labels.entities', {}),\n },\n {\n key: 'tag-posts',\n label: t('settingsPage.viewTypePreferences.labels.tagPosts', {}),\n },\n {\n key: 'collection-posts',\n label: t('settingsPage.viewTypePreferences.labels.collectionPosts', {}),\n },\n {\n key: 'user-questions',\n label: t('settingsPage.viewTypePreferences.labels.userQuestions', {}),\n },\n {\n key: 'user-articles',\n label: t('settingsPage.viewTypePreferences.labels.userArticles', {}),\n },\n {\n key: 'user-links',\n label: t('settingsPage.viewTypePreferences.labels.userLinks', {}),\n },\n {\n key: 'user-collections',\n label: t('settingsPage.viewTypePreferences.labels.userCollections', {}),\n },\n {\n key: 'user-answers',\n label: t('settingsPage.viewTypePreferences.labels.userAnswers', {}),\n },\n ];\n\n const handleViewTypeChange = (key: string, value: ViewType | null) => {\n if (value === null) {\n updateSettings({\n viewType: { ...getSetting('viewType'), [key]: undefined as any },\n });\n } else {\n updateSettings({\n viewType: { ...getSetting('viewType'), [key]: value },\n });\n }\n };\n\n const getViewType = (key: string): ViewType | null => {\n return settings.viewType[key] || null;\n };\n\n if (!isLoaded) {\n return null;\n }\n\n return (\n <Card data-testid=\"settings-page\">\n <CardHeader>\n <Text as=\"h1\" variant=\"title-small\">\n {t('settingsPage.title', {})}\n </Text>\n </CardHeader>\n <CardBody>\n <Box className={styles.content}>\n <Box className={styles.section}>\n <Text as=\"h2\" variant=\"title-small\" className={styles.sectionTitle}>\n {t('settingsPage.editorPreferences', {})}\n </Text>\n\n <div className={styles.settingItem} data-testid=\"auto-save-setting\">\n <Switch\n isSelected={settings.autoSaveEnabled}\n onChange={value => setSetting('autoSaveEnabled', value)}\n label={t('settingsPage.autoSave.label', {})}\n data-testid=\"auto-save-switch\"\n />\n <Text\n as=\"div\"\n variant=\"body-small\"\n color=\"secondary\"\n className={styles.description}\n >\n {t('settingsPage.autoSave.description', {})}\n </Text>\n </div>\n\n {allowAnonymous && (\n <div\n className={styles.settingItem}\n data-testid=\"anonymous-posting-setting\"\n >\n <Switch\n isSelected={settings.anonymousPosting}\n onChange={value => setSetting('anonymousPosting', value)}\n label={t('settingsPage.anonymousPosting.label', {})}\n data-testid=\"anonymous-posting-switch\"\n />\n <Text\n as=\"div\"\n variant=\"body-small\"\n color=\"secondary\"\n className={styles.description}\n >\n {t('settingsPage.anonymousPosting.description', {})}\n </Text>\n </div>\n )}\n </Box>\n\n <Box className={styles.section}>\n <Text as=\"h2\" variant=\"title-small\" className={styles.sectionTitle}>\n {t('settingsPage.displayPreferences', {})}\n </Text>\n\n {isAIEnabled && (\n <div\n className={styles.settingItem}\n data-testid=\"ai-answer-setting\"\n >\n <Switch\n isSelected={settings.aiAnswerExpanded}\n onChange={value => setSetting('aiAnswerExpanded', value)}\n label={t('settingsPage.aiAnswerExpanded.label', {})}\n data-testid=\"ai-answer-switch\"\n />\n <Text\n as=\"div\"\n variant=\"body-small\"\n color=\"secondary\"\n className={styles.description}\n >\n {t('settingsPage.aiAnswerExpanded.description', {})}\n </Text>\n </div>\n )}\n\n <div\n className={styles.settingItem}\n data-testid=\"pagination-setting\"\n >\n <Switch\n isSelected={settings.usePagination}\n onChange={value => setSetting('usePagination', value)}\n label={t('settingsPage.usePagination.label', {})}\n data-testid=\"pagination-switch\"\n />\n <Text\n as=\"div\"\n variant=\"body-small\"\n color=\"secondary\"\n className={styles.description}\n >\n {t('settingsPage.usePagination.description', {})}\n </Text>\n </div>\n\n <Box className={styles.viewTypeSection}>\n <Text as=\"h3\" variant=\"title-x-small\">\n {t('settingsPage.viewTypePreferences.title', {})}\n </Text>\n <Text\n as=\"div\"\n variant=\"body-small\"\n color=\"secondary\"\n className={styles.description}\n >\n {t('settingsPage.viewTypePreferences.description', {})}\n </Text>\n\n {viewTypes.map(({ key, label }) => {\n const currentView = getViewType(key) ?? 'default';\n return (\n <div\n key={key}\n className={styles.viewTypeItem}\n data-testid={`view-type-${key}`}\n >\n <Text className={styles.viewTypeLabel}>{label}</Text>\n <ToggleButtonGroup\n selectionMode=\"single\"\n disallowEmptySelection\n selectedKeys={[currentView]}\n onSelectionChange={keys => {\n const selected = Array.from(keys)[0];\n handleViewTypeChange(\n key,\n selected === 'default'\n ? null\n : (selected as ViewType),\n );\n }}\n >\n <ToggleButton\n id=\"grid\"\n size=\"small\"\n data-testid={`view-type-${key}-grid`}\n >\n {t('settingsPage.viewTypePreferences.grid', {})}\n </ToggleButton>\n <ToggleButton\n id=\"list\"\n size=\"small\"\n data-testid={`view-type-${key}-list`}\n >\n {t('settingsPage.viewTypePreferences.list', {})}\n </ToggleButton>\n <ToggleButton\n id=\"default\"\n size=\"small\"\n data-testid={`view-type-${key}-default`}\n >\n {t('settingsPage.viewTypePreferences.default', {})}\n </ToggleButton>\n </ToggleButtonGroup>\n </div>\n );\n })}\n </Box>\n </Box>\n\n <Flex direction=\"column\" className={styles.footer}>\n <Button\n variant=\"secondary\"\n onClick={() => {\n resetSettings();\n }}\n data-testid=\"reset-all-settings-button\"\n >\n {t('settingsPage.resetAllSettings', {})}\n </Button>\n <Text\n as=\"div\"\n variant=\"body-small\"\n color=\"secondary\"\n className={styles.description}\n >\n {t('settingsPage.resetAllSettingsDescription', {})}\n </Text>\n </Flex>\n </Box>\n </CardBody>\n </Card>\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 .SettingsPage_content__2ebcd1e39b {\n max-width: 800px;\n margin: 0 auto;\n }\n\n .SettingsPage_section__2ebcd1e39b {\n margin-bottom: var(--bui-space-6);\n }\n\n .SettingsPage_sectionTitle__2ebcd1e39b {\n margin-bottom: var(--bui-space-4);\n }\n\n .SettingsPage_settingItem__2ebcd1e39b {\n margin-bottom: var(--bui-space-4);\n }\n\n .SettingsPage_description__2ebcd1e39b {\n margin-top: var(--bui-space-1);\n }\n\n .SettingsPage_viewTypeSection__2ebcd1e39b {\n margin-top: var(--bui-space-6);\n }\n\n .SettingsPage_viewTypeItem__2ebcd1e39b {\n margin-bottom: var(--bui-space-4);\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--bui-space-2);\n }\n\n .SettingsPage_viewTypeLabel__2ebcd1e39b {\n min-width: 200px;\n }\n\n .SettingsPage_footer__2ebcd1e39b {\n margin-top: var(--bui-space-8);\n padding-top: var(--bui-space-6);\n border-top: 1px solid var(--bui-border-1);\n }\n}\n";
4
+ var styles = {"content":"SettingsPage_content__2ebcd1e39b","section":"SettingsPage_section__2ebcd1e39b","sectionTitle":"SettingsPage_sectionTitle__2ebcd1e39b","settingItem":"SettingsPage_settingItem__2ebcd1e39b","description":"SettingsPage_description__2ebcd1e39b","viewTypeSection":"SettingsPage_viewTypeSection__2ebcd1e39b","viewTypeItem":"SettingsPage_viewTypeItem__2ebcd1e39b","viewTypeLabel":"SettingsPage_viewTypeLabel__2ebcd1e39b","footer":"SettingsPage_footer__2ebcd1e39b"};
5
+ styleInject(css_248z);
6
+
7
+ export { styles as default };
8
+ //# sourceMappingURL=SettingsPage.module.css.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SettingsPage.module.css.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
@@ -1,6 +1,6 @@
1
1
  import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import { useQetaApi, StatsChart } from '@drodil/backstage-plugin-qeta-react';
3
- import { Grid, Card, CardHeader, CardContent, CircularProgress } from '@material-ui/core';
3
+ import { Grid, Card, CardHeader, CardBody, Skeleton } from '@backstage/ui';
4
4
 
5
5
  const GlobalStatsContent = () => {
6
6
  const {
@@ -11,9 +11,9 @@ const GlobalStatsContent = () => {
11
11
  if (error) {
12
12
  return null;
13
13
  }
14
- return /* @__PURE__ */ jsx(Grid, { container: true, spacing: 3, children: /* @__PURE__ */ jsx(Grid, { item: true, xs: 12, children: /* @__PURE__ */ jsxs(Card, { children: [
15
- /* @__PURE__ */ jsx(CardHeader, { title: "Activity Trends" }),
16
- /* @__PURE__ */ jsxs(CardContent, { children: [
14
+ return /* @__PURE__ */ jsx(Grid.Root, { columns: { sm: "12" }, gap: "6", children: /* @__PURE__ */ jsx(Grid.Item, { colSpan: { sm: "12" }, children: /* @__PURE__ */ jsxs(Card, { children: [
15
+ /* @__PURE__ */ jsx(CardHeader, { children: "Activity Trends" }),
16
+ /* @__PURE__ */ jsxs(CardBody, { children: [
17
17
  !loading && response && /* @__PURE__ */ jsx(
18
18
  StatsChart,
19
19
  {
@@ -21,7 +21,7 @@ const GlobalStatsContent = () => {
21
21
  summary: response.summary
22
22
  }
23
23
  ),
24
- loading && /* @__PURE__ */ jsx(CircularProgress, {})
24
+ loading && /* @__PURE__ */ jsx(Skeleton, { width: "100%", height: 300 })
25
25
  ] })
26
26
  ] }) }) });
27
27
  };
@@ -1 +1 @@
1
- {"version":3,"file":"GlobalStatsContent.esm.js","sources":["../../../src/components/Statistics/GlobalStatsContent.tsx"],"sourcesContent":["import { StatsChart, useQetaApi } from '@drodil/backstage-plugin-qeta-react';\nimport {\n Card,\n CardContent,\n CardHeader,\n CircularProgress,\n Grid,\n} from '@material-ui/core';\n\nexport const GlobalStatsContent = () => {\n const {\n value: response,\n loading,\n error,\n } = useQetaApi(api => api.getGlobalStats(), []);\n if (error) {\n return null;\n }\n return (\n <Grid container spacing={3}>\n <Grid item xs={12}>\n <Card>\n <CardHeader title=\"Activity Trends\" />\n <CardContent>\n {!loading && response && (\n <StatsChart\n data={response.statistics}\n summary={response.summary as unknown as Record<string, number>}\n />\n )}\n {loading && <CircularProgress />}\n </CardContent>\n </Card>\n </Grid>\n </Grid>\n );\n};\n"],"names":[],"mappings":";;;;AASO,MAAM,qBAAqB,MAAM;AACtC,EAAA,MAAM;AAAA,IACJ,KAAA,EAAO,QAAA;AAAA,IACP,OAAA;AAAA,IACA;AAAA,MACE,UAAA,CAAW,CAAA,GAAA,KAAO,IAAI,cAAA,EAAe,EAAG,EAAE,CAAA;AAC9C,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,uBACE,GAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAS,IAAA,EAAC,OAAA,EAAS,CAAA,EACvB,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAI,IAAA,EAAC,EAAA,EAAI,EAAA,EACb,+BAAC,IAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAM,iBAAA,EAAkB,CAAA;AAAA,yBACnC,WAAA,EAAA,EACE,QAAA,EAAA;AAAA,MAAA,CAAC,WAAW,QAAA,oBACX,GAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,MAAM,QAAA,CAAS,UAAA;AAAA,UACf,SAAS,QAAA,CAAS;AAAA;AAAA,OACpB;AAAA,MAED,OAAA,wBAAY,gBAAA,EAAA,EAAiB;AAAA,KAAA,EAChC;AAAA,GAAA,EACF,GACF,CAAA,EACF,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"GlobalStatsContent.esm.js","sources":["../../../src/components/Statistics/GlobalStatsContent.tsx"],"sourcesContent":["import { StatsChart, useQetaApi } from '@drodil/backstage-plugin-qeta-react';\nimport { Card, CardBody, CardHeader, Grid, Skeleton } from '@backstage/ui';\n\nexport const GlobalStatsContent = () => {\n const {\n value: response,\n loading,\n error,\n } = useQetaApi(api => api.getGlobalStats(), []);\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 <CardHeader>Activity Trends</CardHeader>\n <CardBody>\n {!loading && response && (\n <StatsChart\n data={response.statistics}\n summary={response.summary as unknown as Record<string, number>}\n />\n )}\n {loading && <Skeleton width=\"100%\" height={300} />}\n </CardBody>\n </Card>\n </Grid.Item>\n </Grid.Root>\n );\n};\n"],"names":[],"mappings":";;;;AAGO,MAAM,qBAAqB,MAAM;AACtC,EAAA,MAAM;AAAA,IACJ,KAAA,EAAO,QAAA;AAAA,IACP,OAAA;AAAA,IACA;AAAA,MACE,UAAA,CAAW,CAAA,GAAA,KAAO,IAAI,cAAA,EAAe,EAAG,EAAE,CAAA;AAC9C,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,uBACE,GAAA,CAAC,KAAK,IAAA,EAAL,EAAU,SAAS,EAAE,EAAA,EAAI,MAAK,EAAG,GAAA,EAAI,KACpC,QAAA,kBAAA,GAAA,CAAC,IAAA,CAAK,MAAL,EAAU,OAAA,EAAS,EAAE,EAAA,EAAI,IAAA,EAAK,EAC7B,QAAA,kBAAA,IAAA,CAAC,IAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,cAAW,QAAA,EAAA,iBAAA,EAAe,CAAA;AAAA,yBAC1B,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,MAAA,CAAC,WAAW,QAAA,oBACX,GAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,MAAM,QAAA,CAAS,UAAA;AAAA,UACf,SAAS,QAAA,CAAS;AAAA;AAAA,OACpB;AAAA,MAED,2BAAW,GAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EAAM,MAAA,EAAO,QAAQ,GAAA,EAAK;AAAA,KAAA,EAClD;AAAA,GAAA,EACF,GACF,CAAA,EACF,CAAA;AAEJ;;;;"}
@@ -1,10 +1,9 @@
1
1
  import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
2
- import { useQetaConfig, ContentHeader, AskQuestionButton, WriteArticleButton, CreateLinkButton, TopRankingUsers } from '@drodil/backstage-plugin-qeta-react';
2
+ import { useQetaConfig, AskQuestionButton, WriteArticleButton, CreateLinkButton, TopRankingUsers } from '@drodil/backstage-plugin-qeta-react';
3
3
  import { GlobalStatsContent } from './GlobalStatsContent.esm.js';
4
- import { Box, Tab } from '@material-ui/core';
5
- import EmojiEventsOutlined from '@material-ui/icons/EmojiEventsOutlined';
6
- import { TabContext, TabList, TabPanel } from '@material-ui/lab';
4
+ import { Header, Tabs, TabList, Tab, TabPanel } from '@backstage/ui';
7
5
  import { useState, useEffect } from 'react';
6
+ import styles from './StatisticsPage.module.css.esm.js';
8
7
 
9
8
  const StatisticsPage = () => {
10
9
  const [tab, setTab] = useState("global");
@@ -14,29 +13,25 @@ const StatisticsPage = () => {
14
13
  setTab("global");
15
14
  }
16
15
  }, [disabled.questions, tab]);
17
- const handleChange = (_event, newValue) => {
18
- setTab(newValue);
19
- };
20
16
  return /* @__PURE__ */ jsxs(Fragment, { children: [
21
- /* @__PURE__ */ jsxs(
22
- ContentHeader,
17
+ /* @__PURE__ */ jsx(
18
+ Header,
23
19
  {
24
20
  title: "Statistics",
25
- titleIcon: /* @__PURE__ */ jsx(EmojiEventsOutlined, { fontSize: "large" }),
26
- children: [
21
+ customActions: /* @__PURE__ */ jsxs(Fragment, { children: [
27
22
  /* @__PURE__ */ jsx(AskQuestionButton, {}),
28
23
  /* @__PURE__ */ jsx(WriteArticleButton, {}),
29
24
  /* @__PURE__ */ jsx(CreateLinkButton, {})
30
- ]
25
+ ] })
31
26
  }
32
27
  ),
33
- /* @__PURE__ */ jsxs(TabContext, { value: tab, children: [
34
- /* @__PURE__ */ jsx(Box, { sx: { borderBottom: 1, borderColor: "divider" }, children: /* @__PURE__ */ jsxs(TabList, { onChange: handleChange, style: { padding: 0 }, children: [
35
- /* @__PURE__ */ jsx(Tab, { label: "Global Stats", value: "global" }),
36
- !disabled.questions && /* @__PURE__ */ jsx(Tab, { label: "Leaderboard", value: "leaderboard" })
37
- ] }) }),
38
- /* @__PURE__ */ jsx(TabPanel, { value: "global", style: { padding: "24px 0" }, children: /* @__PURE__ */ jsx(GlobalStatsContent, {}) }),
39
- !disabled.questions && /* @__PURE__ */ jsx(TabPanel, { value: "leaderboard", style: { padding: "24px 0" }, children: /* @__PURE__ */ jsx(TopRankingUsers, { limit: 10 }) })
28
+ /* @__PURE__ */ jsxs(Tabs, { selectedKey: tab, onSelectionChange: (key) => setTab(key), children: [
29
+ /* @__PURE__ */ jsxs(TabList, { children: [
30
+ /* @__PURE__ */ jsx(Tab, { id: "global", children: "Global Stats" }),
31
+ !disabled.questions && /* @__PURE__ */ jsx(Tab, { id: "leaderboard", children: "Leaderboard" })
32
+ ] }),
33
+ /* @__PURE__ */ jsx(TabPanel, { id: "global", className: styles.tabPanel, children: /* @__PURE__ */ jsx(GlobalStatsContent, {}) }),
34
+ !disabled.questions && /* @__PURE__ */ jsx(TabPanel, { id: "leaderboard", className: styles.tabPanel, children: /* @__PURE__ */ jsx(TopRankingUsers, { limit: 10 }) })
40
35
  ] })
41
36
  ] });
42
37
  };