@drodil/backstage-plugin-qeta 3.59.10 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -11
- package/config.schema.json +58 -0
- package/dist/components/ArticlePage/ArticlePage.esm.js +61 -15
- package/dist/components/ArticlePage/ArticlePage.esm.js.map +1 -1
- package/dist/components/ArticlesPage/ArticlesPage.esm.js +9 -22
- package/dist/components/ArticlesPage/ArticlesPage.esm.js.map +1 -1
- package/dist/components/AskPage/AskPage.esm.js +10 -7
- package/dist/components/AskPage/AskPage.esm.js.map +1 -1
- package/dist/components/CollectionCreatePage/CollectionCreatePage.esm.js +8 -5
- package/dist/components/CollectionCreatePage/CollectionCreatePage.esm.js.map +1 -1
- package/dist/components/CollectionPage/CollectionPage.esm.js +47 -87
- package/dist/components/CollectionPage/CollectionPage.esm.js.map +1 -1
- package/dist/components/CollectionsPage/CollectionsPage.esm.js +8 -5
- package/dist/components/CollectionsPage/CollectionsPage.esm.js.map +1 -1
- package/dist/components/ContentHealthCard/ContentHealthCard.esm.js +61 -89
- package/dist/components/ContentHealthCard/ContentHealthCard.esm.js.map +1 -1
- package/dist/components/ContentHealthCard/ContentHealthCard.module.css.esm.js +8 -0
- package/dist/components/ContentHealthCard/ContentHealthCard.module.css.esm.js.map +1 -0
- package/dist/components/ContentHealthCard/ReviewList.esm.js +27 -60
- package/dist/components/ContentHealthCard/ReviewList.esm.js.map +1 -1
- package/dist/components/ContentHealthCard/ReviewList.module.css.esm.js +8 -0
- package/dist/components/ContentHealthCard/ReviewList.module.css.esm.js.map +1 -0
- package/dist/components/CreateLinkPage/CreateLinkPage.esm.js +9 -6
- package/dist/components/CreateLinkPage/CreateLinkPage.esm.js.map +1 -1
- package/dist/components/EntityPage/EntityPage.esm.js +48 -58
- package/dist/components/EntityPage/EntityPage.esm.js.map +1 -1
- package/dist/components/EntityPostsContent/EntityPostsContent.esm.js +2 -3
- package/dist/components/EntityPostsContent/EntityPostsContent.esm.js.map +1 -1
- package/dist/components/FavoritePage/FavoritePage.esm.js +3 -14
- package/dist/components/FavoritePage/FavoritePage.esm.js.map +1 -1
- package/dist/components/HomePage/HomePage.esm.js +17 -60
- package/dist/components/HomePage/HomePage.esm.js.map +1 -1
- package/dist/components/HomePage/HomePage.module.css.esm.js +8 -0
- package/dist/components/HomePage/HomePage.module.css.esm.js.map +1 -0
- package/dist/components/LinkPage/LinkPage.esm.js +60 -61
- package/dist/components/LinkPage/LinkPage.esm.js.map +1 -1
- package/dist/components/LinksPage/LinksPage.esm.js +9 -16
- package/dist/components/LinksPage/LinksPage.esm.js.map +1 -1
- package/dist/components/ModeratorPage/ModeratorPage.esm.js +19 -29
- package/dist/components/ModeratorPage/ModeratorPage.esm.js.map +1 -1
- package/dist/components/ModeratorPage/ModeratorPage.module.css.esm.js +8 -0
- package/dist/components/ModeratorPage/ModeratorPage.module.css.esm.js.map +1 -0
- package/dist/components/QetaPage/QetaPage.esm.js +187 -239
- package/dist/components/QetaPage/QetaPage.esm.js.map +1 -1
- package/dist/components/QetaPage/QetaPage.module.css.esm.js +8 -0
- package/dist/components/QetaPage/QetaPage.module.css.esm.js.map +1 -0
- package/dist/components/QetaSearchResultListItem/QetaSearchResultListItem.esm.js +67 -78
- package/dist/components/QetaSearchResultListItem/QetaSearchResultListItem.esm.js.map +1 -1
- package/dist/components/QetaSearchResultListItem/QetaSearchResultListItem.module.css.esm.js +8 -0
- package/dist/components/QetaSearchResultListItem/QetaSearchResultListItem.module.css.esm.js.map +1 -0
- package/dist/components/QuestionPage/QuestionPage.esm.js +122 -97
- package/dist/components/QuestionPage/QuestionPage.esm.js.map +1 -1
- package/dist/components/QuestionsPage/QuestionsPage.esm.js +8 -5
- package/dist/components/QuestionsPage/QuestionsPage.esm.js.map +1 -1
- package/dist/components/ReviewPage/ReviewPage.esm.js +53 -18
- package/dist/components/ReviewPage/ReviewPage.esm.js.map +1 -1
- package/dist/components/RightContent/ArticlesRightContent.esm.js +2 -2
- package/dist/components/RightContent/ArticlesRightContent.esm.js.map +1 -1
- package/dist/components/RightContent/DefaultRightContent.esm.js +2 -2
- package/dist/components/RightContent/DefaultRightContent.esm.js.map +1 -1
- package/dist/components/RightContent/EntityRightContent.esm.js +2 -2
- package/dist/components/RightContent/EntityRightContent.esm.js.map +1 -1
- package/dist/components/RightContent/LinkedPosts.esm.js +5 -19
- package/dist/components/RightContent/LinkedPosts.esm.js.map +1 -1
- package/dist/components/RightContent/LinkedPosts.module.css.esm.js +8 -0
- package/dist/components/RightContent/LinkedPosts.module.css.esm.js.map +1 -0
- package/dist/components/RightContent/LinksRightContent.esm.js +2 -2
- package/dist/components/RightContent/LinksRightContent.esm.js.map +1 -1
- package/dist/components/RightContent/PostRightContent.esm.js +4 -4
- package/dist/components/RightContent/PostRightContent.esm.js.map +1 -1
- package/dist/components/RightContent/QuestionsRightContent.esm.js +2 -2
- package/dist/components/RightContent/QuestionsRightContent.esm.js.map +1 -1
- package/dist/components/RightContent/RightContent.esm.js +46 -61
- package/dist/components/RightContent/RightContent.esm.js.map +1 -1
- package/dist/components/RightContent/RightContent.module.css.esm.js +8 -0
- package/dist/components/RightContent/RightContent.module.css.esm.js.map +1 -0
- package/dist/components/RightContent/SimilarQuestions.esm.js +3 -16
- package/dist/components/RightContent/SimilarQuestions.esm.js.map +1 -1
- package/dist/components/RightContent/SimilarQuestions.module.css.esm.js +8 -0
- package/dist/components/RightContent/SimilarQuestions.module.css.esm.js.map +1 -0
- package/dist/components/RightContent/TagRightContent.esm.js +2 -2
- package/dist/components/RightContent/TagRightContent.esm.js.map +1 -1
- package/dist/components/SettingsPage/SettingsPage.esm.js +198 -200
- package/dist/components/SettingsPage/SettingsPage.esm.js.map +1 -1
- package/dist/components/SettingsPage/SettingsPage.module.css.esm.js +8 -0
- package/dist/components/SettingsPage/SettingsPage.module.css.esm.js.map +1 -0
- package/dist/components/Statistics/GlobalStatsContent.esm.js +5 -5
- package/dist/components/Statistics/GlobalStatsContent.esm.js.map +1 -1
- package/dist/components/Statistics/StatisticsPage.esm.js +21 -20
- package/dist/components/Statistics/StatisticsPage.esm.js.map +1 -1
- package/dist/components/Statistics/StatisticsPage.module.css.esm.js +8 -0
- package/dist/components/Statistics/StatisticsPage.module.css.esm.js.map +1 -0
- package/dist/components/TagPage/TagPage.esm.js +58 -87
- package/dist/components/TagPage/TagPage.esm.js.map +1 -1
- package/dist/components/TechDocsAskQuestionAddon/TechDocsAskQuestionAddon.esm.js +23 -32
- package/dist/components/TechDocsAskQuestionAddon/TechDocsAskQuestionAddon.esm.js.map +1 -1
- package/dist/components/TechDocsAskQuestionAddon/TechDocsAskQuestionAddon.module.css.esm.js +8 -0
- package/dist/components/TechDocsAskQuestionAddon/TechDocsAskQuestionAddon.module.css.esm.js.map +1 -0
- package/dist/components/UserPage/UserPage.esm.js +158 -234
- package/dist/components/UserPage/UserPage.esm.js.map +1 -1
- package/dist/components/UserPage/UserPage.module.css.esm.js +8 -0
- package/dist/components/UserPage/UserPage.module.css.esm.js.map +1 -0
- package/dist/components/UserPage/UserStatsContent.esm.js +5 -5
- package/dist/components/UserPage/UserStatsContent.esm.js.map +1 -1
- package/dist/components/UsersPage/UsersPage.esm.js +3 -9
- package/dist/components/UsersPage/UsersPage.esm.js.map +1 -1
- package/dist/components/WritePage/WritePage.esm.js +9 -6
- package/dist/components/WritePage/WritePage.esm.js.map +1 -1
- package/dist/index.d.ts +283 -77
- package/dist/index.esm.js +262 -7
- package/dist/index.esm.js.map +1 -1
- package/dist/node_modules_dist/style-inject/dist/style-inject.es.esm.js +29 -0
- package/dist/node_modules_dist/style-inject/dist/style-inject.es.esm.js.map +1 -0
- package/dist/{package.json.esm.js → plugins/qeta/package.json.esm.js} +8 -13
- package/dist/{package.json.esm.js.map → plugins/qeta/package.json.esm.js.map} +1 -1
- package/package.json +9 -18
- package/dist/alpha.d.ts +0 -255
- package/dist/alpha.esm.js +0 -238
- package/dist/alpha.esm.js.map +0 -1
- package/dist/components/EntityCards/EntityPostsContainerCard.esm.js +0 -13
- package/dist/components/EntityCards/EntityPostsContainerCard.esm.js.map +0 -1
- package/dist/components/EntityCards/EntityPostsGridCard.esm.js +0 -20
- package/dist/components/EntityCards/EntityPostsGridCard.esm.js.map +0 -1
- package/dist/components/ReviewPage/index.esm.js +0 -6
- package/dist/components/ReviewPage/index.esm.js.map +0 -1
- package/dist/plugin.esm.js +0 -84
- package/dist/plugin.esm.js.map +0 -1
|
@@ -1,31 +1,19 @@
|
|
|
1
1
|
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
2
|
-
import { useState, useEffect, useCallback, useMemo
|
|
3
|
-
import { WarningPanel } from '@backstage/core-components';
|
|
2
|
+
import { useState, useEffect, useCallback, useMemo } from 'react';
|
|
4
3
|
import { useParams } from 'react-router-dom';
|
|
5
|
-
import { qetaTranslationRef, useQetaApi,
|
|
6
|
-
import Comment from '@material-ui/icons/Comment';
|
|
4
|
+
import { qetaTranslationRef, useQetaConfig, useQetaApi, EditButton, DeleteButton, RestoreButton, PostHistoryButton, FollowPostButton, ContentHeaderButton, AddToCollectionButton, DraftBanner, DeletedBanner, ObsoleteBanner, QuestionCard, AIAnswerCard, AnswerCard, AnswerForm, RelativeTimeWithTooltip, AuthorHeaderItem } from '@drodil/backstage-plugin-qeta-react';
|
|
7
5
|
import { useSignal } from '@backstage/plugin-signals-react';
|
|
8
|
-
import { Box,
|
|
9
|
-
import { Skeleton } from '@material-ui/lab';
|
|
6
|
+
import { Box, Skeleton, Flex, Alert, Header, Text, Select } from '@backstage/ui';
|
|
10
7
|
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
|
|
11
|
-
import
|
|
8
|
+
import { RiChat3Line } from '@remixicon/react';
|
|
12
9
|
|
|
13
|
-
const useDescriptionStyles = makeStyles(
|
|
14
|
-
() => ({
|
|
15
|
-
root: {},
|
|
16
|
-
box: {
|
|
17
|
-
display: "inline"
|
|
18
|
-
}
|
|
19
|
-
}),
|
|
20
|
-
{ name: "QetaDescription" }
|
|
21
|
-
);
|
|
22
10
|
const QuestionPage = () => {
|
|
23
11
|
const { id } = useParams();
|
|
24
12
|
const { t } = useTranslationRef(qetaTranslationRef);
|
|
13
|
+
const { disabled } = useQetaConfig();
|
|
25
14
|
const [answers, setAnswers] = useState([]);
|
|
26
15
|
const [newAnswers, setNewAnswers] = useState([]);
|
|
27
16
|
const [answerSort, setAnswerSort] = useState("default");
|
|
28
|
-
const dStyles = useDescriptionStyles();
|
|
29
17
|
const [answersCount, setAnswersCount] = useState(0);
|
|
30
18
|
const [views, setViews] = useState(0);
|
|
31
19
|
const { lastSignal } = useSignal(`qeta:post_${id}`);
|
|
@@ -96,62 +84,81 @@ const QuestionPage = () => {
|
|
|
96
84
|
setAnswers(answers.filter((a) => a.id !== answer.id));
|
|
97
85
|
setAnswersCount((prev) => prev - 1);
|
|
98
86
|
};
|
|
99
|
-
const
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
t("
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
t("
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
87
|
+
const getMetadata = (q) => {
|
|
88
|
+
const metadata = [
|
|
89
|
+
{
|
|
90
|
+
label: t("postHeader.postedAtTime"),
|
|
91
|
+
value: /* @__PURE__ */ jsx(RelativeTimeWithTooltip, { value: q.created })
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
label: t("postHeader.author"),
|
|
95
|
+
value: /* @__PURE__ */ jsx(AuthorHeaderItem, { userEntityRef: q.author })
|
|
96
|
+
}
|
|
97
|
+
];
|
|
98
|
+
if (q.updated) {
|
|
99
|
+
metadata.push({
|
|
100
|
+
label: t("postHeader.updatedAtTime"),
|
|
101
|
+
value: /* @__PURE__ */ jsx(RelativeTimeWithTooltip, { value: q.updated })
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
if (q.updatedBy) {
|
|
105
|
+
metadata.push({
|
|
106
|
+
label: t("postHeader.updatedBy"),
|
|
107
|
+
value: /* @__PURE__ */ jsx(AuthorHeaderItem, { userEntityRef: q.updatedBy })
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
metadata.push({
|
|
111
|
+
label: t("postHeader.views"),
|
|
112
|
+
value: views
|
|
113
|
+
});
|
|
114
|
+
return metadata;
|
|
119
115
|
};
|
|
116
|
+
if (disabled.questions) {
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
120
119
|
if (loading) {
|
|
121
120
|
return /* @__PURE__ */ jsxs(Box, { role: "status", "aria-label": t("common.loading"), children: [
|
|
122
|
-
/* @__PURE__ */ jsx(Skeleton, {
|
|
123
|
-
/* @__PURE__ */ jsxs(
|
|
124
|
-
/* @__PURE__ */ jsx(Skeleton, {
|
|
125
|
-
/* @__PURE__ */ jsx(Skeleton, {
|
|
126
|
-
/* @__PURE__ */ jsx(Skeleton, {
|
|
121
|
+
/* @__PURE__ */ jsx(Skeleton, { height: 200 }),
|
|
122
|
+
/* @__PURE__ */ jsxs(Flex, { direction: "column", gap: "2", mt: "4", children: [
|
|
123
|
+
/* @__PURE__ */ jsx(Skeleton, { height: 40, width: "60%" }),
|
|
124
|
+
/* @__PURE__ */ jsx(Skeleton, { height: 20, width: "40%" }),
|
|
125
|
+
/* @__PURE__ */ jsx(Skeleton, { height: 20, width: "80%" })
|
|
127
126
|
] })
|
|
128
127
|
] });
|
|
129
128
|
}
|
|
130
129
|
if (error || question === void 0) {
|
|
131
130
|
return /* @__PURE__ */ jsx(
|
|
132
|
-
|
|
131
|
+
Alert,
|
|
133
132
|
{
|
|
134
|
-
|
|
133
|
+
status: "danger",
|
|
135
134
|
title: t("questionPage.errorLoading"),
|
|
136
|
-
|
|
137
|
-
|
|
135
|
+
description: error?.message,
|
|
136
|
+
"aria-live": "assertive"
|
|
138
137
|
}
|
|
139
138
|
);
|
|
140
139
|
}
|
|
141
140
|
if (question.type !== "question") {
|
|
142
|
-
return /* @__PURE__ */ jsx(
|
|
141
|
+
return /* @__PURE__ */ jsx(
|
|
142
|
+
Alert,
|
|
143
|
+
{
|
|
144
|
+
status: "warning",
|
|
145
|
+
title: "Not found",
|
|
146
|
+
description: t("questionPage.notFound")
|
|
147
|
+
}
|
|
148
|
+
);
|
|
143
149
|
}
|
|
144
150
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
145
|
-
/* @__PURE__ */
|
|
146
|
-
|
|
151
|
+
/* @__PURE__ */ jsx(
|
|
152
|
+
Header,
|
|
147
153
|
{
|
|
148
154
|
title: question.title,
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
155
|
+
metadata: getMetadata(question),
|
|
156
|
+
customActions: /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
157
|
+
/* @__PURE__ */ jsx(EditButton, { entity: question, compact: true }),
|
|
158
|
+
/* @__PURE__ */ jsx(DeleteButton, { entity: question, compact: true }),
|
|
159
|
+
/* @__PURE__ */ jsx(RestoreButton, { entity: question, compact: true }),
|
|
152
160
|
/* @__PURE__ */ jsx(PostHistoryButton, { post: question, onRestore: retry }),
|
|
153
161
|
/* @__PURE__ */ jsx(FollowPostButton, { post: question }),
|
|
154
|
-
/* @__PURE__ */ jsx(AskQuestionButton, {}),
|
|
155
162
|
/* @__PURE__ */ jsx(
|
|
156
163
|
ContentHeaderButton,
|
|
157
164
|
{
|
|
@@ -165,13 +172,13 @@ const QuestionPage = () => {
|
|
|
165
172
|
}
|
|
166
173
|
}
|
|
167
174
|
},
|
|
168
|
-
icon: /* @__PURE__ */ jsx(
|
|
175
|
+
icon: /* @__PURE__ */ jsx(RiChat3Line, {}),
|
|
169
176
|
disabled: question.status === "obsolete",
|
|
170
177
|
children: t("questionPage.answerButton")
|
|
171
178
|
}
|
|
172
179
|
),
|
|
173
180
|
/* @__PURE__ */ jsx(AddToCollectionButton, { post: question })
|
|
174
|
-
]
|
|
181
|
+
] })
|
|
175
182
|
}
|
|
176
183
|
),
|
|
177
184
|
question.status === "draft" && /* @__PURE__ */ jsx(DraftBanner, {}),
|
|
@@ -180,56 +187,74 @@ const QuestionPage = () => {
|
|
|
180
187
|
/* @__PURE__ */ jsx(QuestionCard, { question }),
|
|
181
188
|
/* @__PURE__ */ jsx(AIAnswerCard, { question, debounceMs: 0 }),
|
|
182
189
|
(question.status === "active" || question.status === "obsolete") && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
183
|
-
/* @__PURE__ */
|
|
184
|
-
/* @__PURE__ */ jsx(
|
|
190
|
+
/* @__PURE__ */ jsxs(Flex, { justify: "between", align: "center", mt: "6", mb: "4", children: [
|
|
191
|
+
/* @__PURE__ */ jsx(Text, { variant: "title-x-small", children: t("common.answersCount", {
|
|
185
192
|
count: answersCount
|
|
186
|
-
}) })
|
|
187
|
-
sortedAnswers.length > 1 && /* @__PURE__ */ jsx(
|
|
188
|
-
|
|
193
|
+
}) }),
|
|
194
|
+
sortedAnswers.length > 1 && /* @__PURE__ */ jsx(
|
|
195
|
+
Select,
|
|
189
196
|
{
|
|
190
|
-
select: true,
|
|
191
197
|
size: "small",
|
|
192
198
|
label: t("questionPage.sortAnswers.label"),
|
|
193
199
|
value: answerSort,
|
|
194
|
-
onChange: (
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
200
|
+
onChange: (key) => setAnswerSort(String(key)),
|
|
201
|
+
options: [
|
|
202
|
+
{
|
|
203
|
+
id: "default",
|
|
204
|
+
label: t("questionPage.sortAnswers.default")
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
id: "created_desc",
|
|
208
|
+
label: t("questionPage.sortAnswers.createdDesc")
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
id: "created_asc",
|
|
212
|
+
label: t("questionPage.sortAnswers.createdAsc")
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
id: "score_desc",
|
|
216
|
+
label: t("questionPage.sortAnswers.scoreDesc")
|
|
217
|
+
},
|
|
218
|
+
{
|
|
219
|
+
id: "score_asc",
|
|
220
|
+
label: t("questionPage.sortAnswers.scoreAsc")
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
id: "comments_desc",
|
|
224
|
+
label: t("questionPage.sortAnswers.commentsDesc")
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
id: "comments_asc",
|
|
228
|
+
label: t("questionPage.sortAnswers.commentsAsc")
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
id: "author_desc",
|
|
232
|
+
label: t("questionPage.sortAnswers.authorDesc")
|
|
233
|
+
},
|
|
234
|
+
{
|
|
235
|
+
id: "author_asc",
|
|
236
|
+
label: t("questionPage.sortAnswers.authorAsc")
|
|
237
|
+
},
|
|
238
|
+
{
|
|
239
|
+
id: "updated_desc",
|
|
240
|
+
label: t("questionPage.sortAnswers.updatedDesc")
|
|
241
|
+
},
|
|
242
|
+
{
|
|
243
|
+
id: "updated_asc",
|
|
244
|
+
label: t("questionPage.sortAnswers.updatedAsc")
|
|
205
245
|
}
|
|
206
|
-
},
|
|
207
|
-
children: [
|
|
208
|
-
/* @__PURE__ */ jsx(MenuItem, { value: "default", children: t("questionPage.sortAnswers.default") }),
|
|
209
|
-
/* @__PURE__ */ jsx(MenuItem, { value: "created_desc", children: t("questionPage.sortAnswers.createdDesc") }),
|
|
210
|
-
/* @__PURE__ */ jsx(MenuItem, { value: "created_asc", children: t("questionPage.sortAnswers.createdAsc") }),
|
|
211
|
-
/* @__PURE__ */ jsx(MenuItem, { value: "score_desc", children: t("questionPage.sortAnswers.scoreDesc") }),
|
|
212
|
-
/* @__PURE__ */ jsx(MenuItem, { value: "score_asc", children: t("questionPage.sortAnswers.scoreAsc") }),
|
|
213
|
-
/* @__PURE__ */ jsx(MenuItem, { value: "comments_desc", children: t("questionPage.sortAnswers.commentsDesc") }),
|
|
214
|
-
/* @__PURE__ */ jsx(MenuItem, { value: "comments_asc", children: t("questionPage.sortAnswers.commentsAsc") }),
|
|
215
|
-
/* @__PURE__ */ jsx(MenuItem, { value: "author_desc", children: t("questionPage.sortAnswers.authorDesc") }),
|
|
216
|
-
/* @__PURE__ */ jsx(MenuItem, { value: "author_asc", children: t("questionPage.sortAnswers.authorAsc") }),
|
|
217
|
-
/* @__PURE__ */ jsx(MenuItem, { value: "updated_desc", children: t("questionPage.sortAnswers.updatedDesc") }),
|
|
218
|
-
/* @__PURE__ */ jsx(MenuItem, { value: "updated_asc", children: t("questionPage.sortAnswers.updatedAsc") })
|
|
219
246
|
]
|
|
220
247
|
}
|
|
221
|
-
)
|
|
222
|
-
] })
|
|
223
|
-
sortedAnswers.map((a) => {
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
) }, a.id) }, a.id);
|
|
232
|
-
}),
|
|
248
|
+
)
|
|
249
|
+
] }),
|
|
250
|
+
sortedAnswers.map((a) => /* @__PURE__ */ jsx(Box, { mb: "2", children: /* @__PURE__ */ jsx(
|
|
251
|
+
AnswerCard,
|
|
252
|
+
{
|
|
253
|
+
answer: a,
|
|
254
|
+
question,
|
|
255
|
+
onAnswerDelete
|
|
256
|
+
}
|
|
257
|
+
) }, a.id)),
|
|
233
258
|
question.status === "active" && /* @__PURE__ */ jsx("div", { id: "qeta-answer-form", children: /* @__PURE__ */ jsx(AnswerForm, { post: question, onPost: onAnswerPost }) })
|
|
234
259
|
] })
|
|
235
260
|
] });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QuestionPage.esm.js","sources":["../../../src/components/QuestionPage/QuestionPage.tsx"],"sourcesContent":["import { Fragment, useCallback, useEffect, useMemo, useState } from 'react';\nimport { WarningPanel } from '@backstage/core-components';\nimport { useParams } from 'react-router-dom';\nimport {\n AddToCollectionButton,\n AIAnswerCard,\n AnswerCard,\n AnswerForm,\n AskQuestionButton,\n ContentHeader,\n ContentHeaderButton,\n DeletedBanner,\n DraftBanner,\n ObsoleteBanner,\n PostHistoryButton,\n qetaTranslationRef,\n QuestionCard,\n RelativeTimeWithTooltip,\n UpdatedByLink,\n useQetaApi,\n FollowPostButton,\n} from '@drodil/backstage-plugin-qeta-react';\nimport Comment from '@material-ui/icons/Comment';\nimport {\n Answer,\n AnswerResponse,\n PostResponse,\n QetaSignal,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { useSignal } from '@backstage/plugin-signals-react';\nimport {\n Box,\n FormControl,\n Grid,\n makeStyles,\n MenuItem,\n TextField,\n Typography,\n} from '@material-ui/core';\nimport { Skeleton } from '@material-ui/lab';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport HelpOutline from '@material-ui/icons/HelpOutline';\n\nconst useDescriptionStyles = makeStyles(\n () => ({\n root: {},\n box: {\n display: 'inline',\n },\n }),\n { name: 'QetaDescription' },\n);\n\nexport const QuestionPage = () => {\n const { id } = useParams();\n const { t } = useTranslationRef(qetaTranslationRef);\n const [answers, setAnswers] = useState<AnswerResponse[]>([]);\n const [newAnswers, setNewAnswers] = useState<AnswerResponse[]>([]);\n const [answerSort, setAnswerSort] = useState<string>('default');\n const dStyles = useDescriptionStyles();\n\n const [answersCount, setAnswersCount] = useState(0);\n const [views, setViews] = useState(0);\n\n const { lastSignal } = useSignal<QetaSignal>(`qeta:post_${id}`);\n\n const {\n value: question,\n loading,\n error,\n retry,\n } = useQetaApi(api => api.getPost(id), [id]);\n\n useEffect(() => {\n if (question) {\n setAnswersCount(question.answersCount);\n setViews(question.views);\n setAnswers(question.answers ?? []);\n }\n }, [question]);\n\n useEffect(() => {\n if (lastSignal?.type === 'post_stats') {\n setAnswersCount(lastSignal.answersCount);\n setViews(lastSignal.views);\n }\n }, [lastSignal]);\n\n const sortAnswers = useCallback(\n (a: Answer, b: Answer) => {\n if (answerSort === 'default') {\n return 1;\n }\n\n const parts = answerSort.split('_');\n const field = parts[0];\n const order = parts[1];\n\n let ret = -1;\n switch (field) {\n case 'created':\n ret = a.created > b.created ? -1 : 1;\n break;\n case 'score':\n ret = a.score > b.score ? -1 : 1;\n break;\n case 'author':\n ret = a.author > b.author ? -1 : 1;\n break;\n case 'comments':\n ret = (a.comments?.length ?? 0) > (b.comments?.length ?? 0) ? -1 : 1;\n break;\n case 'updated':\n ret = (a.updated ?? a.created) > (b.updated ?? b.created) ? -1 : 1;\n break;\n default:\n return 1;\n }\n\n if (order === 'desc') {\n ret *= -1;\n }\n return ret;\n },\n [answerSort],\n );\n\n const sortedAnswers = useMemo(() => {\n const allAnswers = [...answers, ...newAnswers];\n return allAnswers.sort(sortAnswers);\n }, [answers, newAnswers, sortAnswers]);\n\n const onAnswerPost = (answer: AnswerResponse) => {\n setNewAnswers(newAnswers.concat([answer]));\n setAnswersCount(prev => prev + 1);\n };\n\n const onAnswerDelete = (answer: AnswerResponse) => {\n setNewAnswers(newAnswers.filter(a => a.id !== answer.id));\n setAnswers(answers.filter(a => a.id !== answer.id));\n setAnswersCount(prev => prev - 1);\n };\n\n const getDescription = (q: PostResponse) => {\n return (\n <span className={dStyles.root}>\n <Box fontWeight=\"fontWeightMedium\" className={dStyles.box}>\n {t('authorBox.postedAtTime')}{' '}\n <RelativeTimeWithTooltip value={q.created} />\n {' · '}\n </Box>\n {q.updated && (\n <Fragment>\n <Box fontWeight=\"fontWeightMedium\" className={dStyles.box}>\n {t('authorBox.updatedAtTime')}{' '}\n <RelativeTimeWithTooltip value={q.updated} />{' '}\n {t('authorBox.updatedBy')} <UpdatedByLink entity={q} />\n {' · '}\n </Box>\n </Fragment>\n )}\n <Box fontWeight=\"fontWeightMedium\" className={dStyles.box}>\n {t('common.viewsCount', { count: views })}\n </Box>\n </span>\n );\n };\n\n if (loading) {\n return (\n <Box role=\"status\" aria-label={t('common.loading')}>\n <Skeleton variant=\"rect\" height={200} animation=\"wave\" />\n <Box mt={2}>\n <Skeleton variant=\"text\" height={40} width=\"60%\" animation=\"wave\" />\n <Skeleton variant=\"text\" height={20} width=\"40%\" animation=\"wave\" />\n <Skeleton variant=\"text\" height={20} width=\"80%\" animation=\"wave\" />\n </Box>\n </Box>\n );\n }\n\n if (error || question === undefined) {\n return (\n <WarningPanel\n severity=\"error\"\n title={t('questionPage.errorLoading')}\n aria-live=\"assertive\"\n >\n {error?.message}\n </WarningPanel>\n );\n }\n\n if (question.type !== 'question') {\n return (\n <WarningPanel title=\"Not found\" message={t('questionPage.notFound')} />\n );\n }\n\n return (\n <>\n <ContentHeader\n title={question.title}\n description={getDescription(question)}\n titleIcon={<HelpOutline fontSize=\"large\" />}\n >\n <PostHistoryButton post={question} onRestore={retry} />\n <FollowPostButton post={question} />\n <AskQuestionButton />\n <ContentHeaderButton\n onClick={() => {\n const element = document.getElementById('qeta-answer-form');\n if (element) {\n element.scrollIntoView({ behavior: 'smooth' });\n const input = element.querySelector('textarea');\n if (input) {\n input.focus();\n }\n }\n }}\n icon={<Comment />}\n disabled={question.status === 'obsolete'}\n >\n {t('questionPage.answerButton')}\n </ContentHeaderButton>\n <AddToCollectionButton post={question} />\n </ContentHeader>\n {question.status === 'draft' && <DraftBanner />}\n {question.status === 'deleted' && <DeletedBanner />}\n {question.status === 'obsolete' && <ObsoleteBanner />}\n <QuestionCard question={question} />\n <AIAnswerCard question={question} debounceMs={0} />\n {(question.status === 'active' || question.status === 'obsolete') && (\n <>\n <Box sx={{ mt: 3, mb: 2 }}>\n <Grid container justifyContent=\"space-between\" alignItems=\"center\">\n <Grid item>\n <Typography variant=\"h6\">\n {t('common.answersCount', {\n count: answersCount,\n })}\n </Typography>\n </Grid>\n {sortedAnswers.length > 1 && (\n <Grid item>\n <FormControl>\n <TextField\n select\n size=\"small\"\n label={t('questionPage.sortAnswers.label')}\n value={answerSort}\n onChange={val =>\n setAnswerSort(val.target.value as string)\n }\n inputProps={{\n name: 'sortAnswers',\n id: 'sort-answers',\n 'aria-label': t('questionPage.sortAnswers.label'),\n 'aria-describedby': 'sort-answers-helper',\n }}\n variant=\"outlined\"\n SelectProps={{\n MenuProps: {\n 'aria-label': t('questionPage.sortAnswers.menuLabel'),\n },\n }}\n >\n <MenuItem value=\"default\">\n {t('questionPage.sortAnswers.default')}\n </MenuItem>\n <MenuItem value=\"created_desc\">\n {t('questionPage.sortAnswers.createdDesc')}\n </MenuItem>\n <MenuItem value=\"created_asc\">\n {t('questionPage.sortAnswers.createdAsc')}\n </MenuItem>\n <MenuItem value=\"score_desc\">\n {t('questionPage.sortAnswers.scoreDesc')}\n </MenuItem>\n <MenuItem value=\"score_asc\">\n {t('questionPage.sortAnswers.scoreAsc')}\n </MenuItem>\n <MenuItem value=\"comments_desc\">\n {t('questionPage.sortAnswers.commentsDesc')}\n </MenuItem>\n <MenuItem value=\"comments_asc\">\n {t('questionPage.sortAnswers.commentsAsc')}\n </MenuItem>\n <MenuItem value=\"author_desc\">\n {t('questionPage.sortAnswers.authorDesc')}\n </MenuItem>\n <MenuItem value=\"author_asc\">\n {t('questionPage.sortAnswers.authorAsc')}\n </MenuItem>\n <MenuItem value=\"updated_desc\">\n {t('questionPage.sortAnswers.updatedDesc')}\n </MenuItem>\n <MenuItem value=\"updated_asc\">\n {t('questionPage.sortAnswers.updatedAsc')}\n </MenuItem>\n </TextField>\n </FormControl>\n </Grid>\n )}\n </Grid>\n </Box>\n {sortedAnswers.map(a => {\n return (\n <Fragment key={a.id}>\n <Box key={a.id} sx={{ mb: 1 }}>\n <AnswerCard\n answer={a}\n question={question}\n onAnswerDelete={onAnswerDelete}\n />\n </Box>\n </Fragment>\n );\n })}\n\n {question.status === 'active' && (\n <div id=\"qeta-answer-form\">\n <AnswerForm post={question} onPost={onAnswerPost} />\n </div>\n )}\n </>\n )}\n </>\n );\n};\n"],"names":["Fragment"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"QuestionPage.esm.js","sources":["../../../src/components/QuestionPage/QuestionPage.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport {\n AddToCollectionButton,\n AIAnswerCard,\n AnswerCard,\n AnswerForm,\n AuthorHeaderItem,\n ContentHeaderButton,\n DeleteButton,\n DeletedBanner,\n DraftBanner,\n EditButton,\n FollowPostButton,\n ObsoleteBanner,\n PostHistoryButton,\n qetaTranslationRef,\n QuestionCard,\n RelativeTimeWithTooltip,\n RestoreButton,\n useQetaApi,\n useQetaConfig,\n} from '@drodil/backstage-plugin-qeta-react';\nimport {\n Answer,\n AnswerResponse,\n PostResponse,\n QetaSignal,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { useSignal } from '@backstage/plugin-signals-react';\nimport {\n Alert,\n Box,\n Flex,\n Header,\n HeaderMetadataItem,\n Select,\n Skeleton,\n Text,\n} from '@backstage/ui';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { RiChat3Line } from '@remixicon/react';\n\nexport const QuestionPage = () => {\n const { id } = useParams();\n const { t } = useTranslationRef(qetaTranslationRef);\n const { disabled } = useQetaConfig();\n const [answers, setAnswers] = useState<AnswerResponse[]>([]);\n const [newAnswers, setNewAnswers] = useState<AnswerResponse[]>([]);\n const [answerSort, setAnswerSort] = useState<string>('default');\n\n const [answersCount, setAnswersCount] = useState(0);\n const [views, setViews] = useState(0);\n\n const { lastSignal } = useSignal<QetaSignal>(`qeta:post_${id}`);\n\n const {\n value: question,\n loading,\n error,\n retry,\n } = useQetaApi(api => api.getPost(id), [id]);\n\n useEffect(() => {\n if (question) {\n setAnswersCount(question.answersCount);\n setViews(question.views);\n setAnswers(question.answers ?? []);\n }\n }, [question]);\n\n useEffect(() => {\n if (lastSignal?.type === 'post_stats') {\n setAnswersCount(lastSignal.answersCount);\n setViews(lastSignal.views);\n }\n }, [lastSignal]);\n\n const sortAnswers = useCallback(\n (a: Answer, b: Answer) => {\n if (answerSort === 'default') {\n return 1;\n }\n\n const parts = answerSort.split('_');\n const field = parts[0];\n const order = parts[1];\n\n let ret = -1;\n switch (field) {\n case 'created':\n ret = a.created > b.created ? -1 : 1;\n break;\n case 'score':\n ret = a.score > b.score ? -1 : 1;\n break;\n case 'author':\n ret = a.author > b.author ? -1 : 1;\n break;\n case 'comments':\n ret = (a.comments?.length ?? 0) > (b.comments?.length ?? 0) ? -1 : 1;\n break;\n case 'updated':\n ret = (a.updated ?? a.created) > (b.updated ?? b.created) ? -1 : 1;\n break;\n default:\n return 1;\n }\n\n if (order === 'desc') {\n ret *= -1;\n }\n return ret;\n },\n [answerSort],\n );\n\n const sortedAnswers = useMemo(() => {\n const allAnswers = [...answers, ...newAnswers];\n return allAnswers.sort(sortAnswers);\n }, [answers, newAnswers, sortAnswers]);\n\n const onAnswerPost = (answer: AnswerResponse) => {\n setNewAnswers(newAnswers.concat([answer]));\n setAnswersCount(prev => prev + 1);\n };\n\n const onAnswerDelete = (answer: AnswerResponse) => {\n setNewAnswers(newAnswers.filter(a => a.id !== answer.id));\n setAnswers(answers.filter(a => a.id !== answer.id));\n setAnswersCount(prev => prev - 1);\n };\n\n const getMetadata = (q: PostResponse): HeaderMetadataItem[] => {\n const metadata: HeaderMetadataItem[] = [\n {\n label: t('postHeader.postedAtTime'),\n value: <RelativeTimeWithTooltip value={q.created} />,\n },\n {\n label: t('postHeader.author'),\n value: <AuthorHeaderItem userEntityRef={q.author} />,\n },\n ];\n\n if (q.updated) {\n metadata.push({\n label: t('postHeader.updatedAtTime'),\n value: <RelativeTimeWithTooltip value={q.updated} />,\n });\n }\n if (q.updatedBy) {\n metadata.push({\n label: t('postHeader.updatedBy'),\n value: <AuthorHeaderItem userEntityRef={q.updatedBy} />,\n });\n }\n metadata.push({\n label: t('postHeader.views'),\n value: views,\n });\n\n return metadata;\n };\n\n if (disabled.questions) {\n return null;\n }\n\n if (loading) {\n return (\n <Box role=\"status\" aria-label={t('common.loading')}>\n <Skeleton height={200} />\n <Flex direction=\"column\" gap=\"2\" mt=\"4\">\n <Skeleton height={40} width=\"60%\" />\n <Skeleton height={20} width=\"40%\" />\n <Skeleton height={20} width=\"80%\" />\n </Flex>\n </Box>\n );\n }\n\n if (error || question === undefined) {\n return (\n <Alert\n status=\"danger\"\n title={t('questionPage.errorLoading')}\n description={error?.message}\n aria-live=\"assertive\"\n />\n );\n }\n\n if (question.type !== 'question') {\n return (\n <Alert\n status=\"warning\"\n title=\"Not found\"\n description={t('questionPage.notFound')}\n />\n );\n }\n\n return (\n <>\n <Header\n title={question.title}\n metadata={getMetadata(question)}\n customActions={\n <>\n <EditButton entity={question} compact />\n <DeleteButton entity={question} compact />\n <RestoreButton entity={question} compact />\n <PostHistoryButton post={question} onRestore={retry} />\n <FollowPostButton post={question} />\n <ContentHeaderButton\n onClick={() => {\n const element = document.getElementById('qeta-answer-form');\n if (element) {\n element.scrollIntoView({ behavior: 'smooth' });\n const input = element.querySelector('textarea');\n if (input) {\n input.focus();\n }\n }\n }}\n icon={<RiChat3Line />}\n disabled={question.status === 'obsolete'}\n >\n {t('questionPage.answerButton')}\n </ContentHeaderButton>\n <AddToCollectionButton post={question} />\n </>\n }\n />\n {question.status === 'draft' && <DraftBanner />}\n {question.status === 'deleted' && <DeletedBanner />}\n {question.status === 'obsolete' && <ObsoleteBanner />}\n <QuestionCard question={question} />\n <AIAnswerCard question={question} debounceMs={0} />\n {(question.status === 'active' || question.status === 'obsolete') && (\n <>\n <Flex justify=\"between\" align=\"center\" mt=\"6\" mb=\"4\">\n <Text variant=\"title-x-small\">\n {t('common.answersCount', {\n count: answersCount,\n })}\n </Text>\n {sortedAnswers.length > 1 && (\n <Select\n size=\"small\"\n label={t('questionPage.sortAnswers.label')}\n value={answerSort}\n onChange={key => setAnswerSort(String(key))}\n options={[\n {\n id: 'default',\n label: t('questionPage.sortAnswers.default'),\n },\n {\n id: 'created_desc',\n label: t('questionPage.sortAnswers.createdDesc'),\n },\n {\n id: 'created_asc',\n label: t('questionPage.sortAnswers.createdAsc'),\n },\n {\n id: 'score_desc',\n label: t('questionPage.sortAnswers.scoreDesc'),\n },\n {\n id: 'score_asc',\n label: t('questionPage.sortAnswers.scoreAsc'),\n },\n {\n id: 'comments_desc',\n label: t('questionPage.sortAnswers.commentsDesc'),\n },\n {\n id: 'comments_asc',\n label: t('questionPage.sortAnswers.commentsAsc'),\n },\n {\n id: 'author_desc',\n label: t('questionPage.sortAnswers.authorDesc'),\n },\n {\n id: 'author_asc',\n label: t('questionPage.sortAnswers.authorAsc'),\n },\n {\n id: 'updated_desc',\n label: t('questionPage.sortAnswers.updatedDesc'),\n },\n {\n id: 'updated_asc',\n label: t('questionPage.sortAnswers.updatedAsc'),\n },\n ]}\n />\n )}\n </Flex>\n {sortedAnswers.map(a => (\n <Box key={a.id} mb=\"2\">\n <AnswerCard\n answer={a}\n question={question}\n onAnswerDelete={onAnswerDelete}\n />\n </Box>\n ))}\n\n {question.status === 'active' && (\n <div id=\"qeta-answer-form\">\n <AnswerForm post={question} onPost={onAnswerPost} />\n </div>\n )}\n </>\n )}\n </>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
2
2
|
import { useSearchParams } from 'react-router-dom';
|
|
3
3
|
import { useState, useEffect } from 'react';
|
|
4
|
-
import { qetaTranslationRef,
|
|
4
|
+
import { qetaTranslationRef, useQetaConfig, AskQuestionButton, PostsContainer } from '@drodil/backstage-plugin-qeta-react';
|
|
5
5
|
import { filterTags } from '@drodil/backstage-plugin-qeta-common';
|
|
6
|
-
import
|
|
6
|
+
import { Header } from '@backstage/ui';
|
|
7
7
|
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
|
|
8
8
|
|
|
9
9
|
const QuestionsPage = () => {
|
|
@@ -11,17 +11,20 @@ const QuestionsPage = () => {
|
|
|
11
11
|
const [entityRef, setEntityRef] = useState(void 0);
|
|
12
12
|
const [tags, setTags] = useState(void 0);
|
|
13
13
|
const { t } = useTranslationRef(qetaTranslationRef);
|
|
14
|
+
const { disabled } = useQetaConfig();
|
|
14
15
|
useEffect(() => {
|
|
15
16
|
setEntityRef(searchParams.get("entity") ?? void 0);
|
|
16
17
|
setTags(filterTags(searchParams.get("tags")));
|
|
17
18
|
}, [searchParams, setEntityRef]);
|
|
19
|
+
if (disabled.questions) {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
18
22
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
19
23
|
/* @__PURE__ */ jsx(
|
|
20
|
-
|
|
24
|
+
Header,
|
|
21
25
|
{
|
|
22
26
|
title: t("questionsPage.title"),
|
|
23
|
-
|
|
24
|
-
children: /* @__PURE__ */ jsx(AskQuestionButton, { entity: entityRef, tags })
|
|
27
|
+
customActions: /* @__PURE__ */ jsx(AskQuestionButton, { entity: entityRef, tags })
|
|
25
28
|
}
|
|
26
29
|
),
|
|
27
30
|
/* @__PURE__ */ jsx(PostsContainer, { type: "question", defaultView: "list" })
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QuestionsPage.esm.js","sources":["../../../src/components/QuestionsPage/QuestionsPage.tsx"],"sourcesContent":["import { useSearchParams } from 'react-router-dom';\nimport { useEffect, useState } from 'react';\nimport {\n AskQuestionButton,\n
|
|
1
|
+
{"version":3,"file":"QuestionsPage.esm.js","sources":["../../../src/components/QuestionsPage/QuestionsPage.tsx"],"sourcesContent":["import { useSearchParams } from 'react-router-dom';\nimport { useEffect, useState } from 'react';\nimport {\n AskQuestionButton,\n PostsContainer,\n qetaTranslationRef,\n useQetaConfig,\n} from '@drodil/backstage-plugin-qeta-react';\n\nimport { filterTags } from '@drodil/backstage-plugin-qeta-common';\nimport { Header } from '@backstage/ui';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\n\nexport const QuestionsPage = () => {\n const [searchParams] = useSearchParams();\n\n const [entityRef, setEntityRef] = useState<string | undefined>(undefined);\n const [tags, setTags] = useState<string[] | undefined>(undefined);\n const { t } = useTranslationRef(qetaTranslationRef);\n const { disabled } = useQetaConfig();\n\n useEffect(() => {\n setEntityRef(searchParams.get('entity') ?? undefined);\n setTags(filterTags(searchParams.get('tags')));\n }, [searchParams, setEntityRef]);\n\n if (disabled.questions) {\n return null;\n }\n\n return (\n <>\n <Header\n title={t('questionsPage.title')}\n customActions={<AskQuestionButton entity={entityRef} tags={tags} />}\n />\n <PostsContainer type=\"question\" defaultView=\"list\" />\n </>\n );\n};\n"],"names":[],"mappings":";;;;;;;;AAaO,MAAM,gBAAgB,MAAM;AACjC,EAAA,MAAM,CAAC,YAAY,CAAA,GAAI,eAAA,EAAgB;AAEvC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAA6B,MAAS,CAAA;AACxE,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAA+B,MAAS,CAAA;AAChE,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,kBAAkB,CAAA;AAClD,EAAA,MAAM,EAAE,QAAA,EAAS,GAAI,aAAA,EAAc;AAEnC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,YAAA,CAAa,YAAA,CAAa,GAAA,CAAI,QAAQ,CAAA,IAAK,MAAS,CAAA;AACpD,IAAA,OAAA,CAAQ,UAAA,CAAW,YAAA,CAAa,GAAA,CAAI,MAAM,CAAC,CAAC,CAAA;AAAA,EAC9C,CAAA,EAAG,CAAC,YAAA,EAAc,YAAY,CAAC,CAAA;AAE/B,EAAA,IAAI,SAAS,SAAA,EAAW;AACtB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,qBAAqB,CAAA;AAAA,QAC9B,aAAA,kBAAe,GAAA,CAAC,iBAAA,EAAA,EAAkB,MAAA,EAAQ,WAAW,IAAA,EAAY;AAAA;AAAA,KACnE;AAAA,oBACA,GAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,UAAA,EAAW,aAAY,MAAA,EAAO;AAAA,GAAA,EACrD,CAAA;AAEJ;;;;"}
|
|
@@ -3,11 +3,10 @@ import { useState } from 'react';
|
|
|
3
3
|
import { qetaTranslationRef, useQetaApi, questionRouteRef, articleRouteRef, linkRouteRef, useCanReview, UserLink, RelativeTimeWithTooltip, ObsoleteModal, ValidReviewModal, DeleteModal } from '@drodil/backstage-plugin-qeta-react';
|
|
4
4
|
import { useRouteRef } from '@backstage/core-plugin-api';
|
|
5
5
|
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import
|
|
9
|
-
import
|
|
10
|
-
import DeleteIcon from '@material-ui/icons/Delete';
|
|
6
|
+
import { Table } from '@backstage/core-components';
|
|
7
|
+
import { Link } from 'react-router-dom';
|
|
8
|
+
import { Flex, TooltipTrigger, ButtonIcon, Tooltip, Alert, Box, Text } from '@backstage/ui';
|
|
9
|
+
import { RiCheckLine, RiForbidLine, RiDeleteBinLine } from '@remixicon/react';
|
|
11
10
|
|
|
12
11
|
const ReviewPage = () => {
|
|
13
12
|
const { t } = useTranslationRef(qetaTranslationRef);
|
|
@@ -88,17 +87,46 @@ const ReviewPage = () => {
|
|
|
88
87
|
{
|
|
89
88
|
title: t("reviewPage.table.actions"),
|
|
90
89
|
field: "actions",
|
|
91
|
-
render: (row) => /* @__PURE__ */ jsxs(
|
|
92
|
-
/* @__PURE__ */
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
90
|
+
render: (row) => /* @__PURE__ */ jsxs(Flex, { gap: "2", children: [
|
|
91
|
+
/* @__PURE__ */ jsxs(TooltipTrigger, { children: [
|
|
92
|
+
/* @__PURE__ */ jsx(
|
|
93
|
+
ButtonIcon,
|
|
94
|
+
{
|
|
95
|
+
"aria-label": t("contentHealth.markValid"),
|
|
96
|
+
size: "small",
|
|
97
|
+
variant: "tertiary",
|
|
98
|
+
onPress: () => openMarkValid(row),
|
|
99
|
+
icon: /* @__PURE__ */ jsx(RiCheckLine, { size: 16 })
|
|
100
|
+
}
|
|
101
|
+
),
|
|
102
|
+
/* @__PURE__ */ jsx(Tooltip, { children: t("contentHealth.markValid") })
|
|
103
|
+
] }),
|
|
104
|
+
/* @__PURE__ */ jsxs(TooltipTrigger, { children: [
|
|
105
|
+
/* @__PURE__ */ jsx(
|
|
106
|
+
ButtonIcon,
|
|
107
|
+
{
|
|
108
|
+
"aria-label": t("contentHealth.markObsolete"),
|
|
109
|
+
size: "small",
|
|
110
|
+
variant: "tertiary",
|
|
111
|
+
onPress: () => openMarkObsolete(row),
|
|
112
|
+
icon: /* @__PURE__ */ jsx(RiForbidLine, { size: 16 })
|
|
113
|
+
}
|
|
114
|
+
),
|
|
115
|
+
/* @__PURE__ */ jsx(Tooltip, { children: t("contentHealth.markObsolete") })
|
|
116
|
+
] }),
|
|
117
|
+
row.canDelete && /* @__PURE__ */ jsxs(TooltipTrigger, { children: [
|
|
118
|
+
/* @__PURE__ */ jsx(
|
|
119
|
+
ButtonIcon,
|
|
120
|
+
{
|
|
121
|
+
"aria-label": t("deleteModal.deleteButton"),
|
|
122
|
+
size: "small",
|
|
123
|
+
variant: "tertiary",
|
|
124
|
+
onPress: () => openDelete(row),
|
|
125
|
+
icon: /* @__PURE__ */ jsx(RiDeleteBinLine, { size: 16 })
|
|
126
|
+
}
|
|
127
|
+
),
|
|
128
|
+
/* @__PURE__ */ jsx(Tooltip, { children: t("deleteModal.deleteButton") })
|
|
129
|
+
] })
|
|
102
130
|
] })
|
|
103
131
|
}
|
|
104
132
|
];
|
|
@@ -106,10 +134,17 @@ const ReviewPage = () => {
|
|
|
106
134
|
return null;
|
|
107
135
|
}
|
|
108
136
|
if (error) {
|
|
109
|
-
return /* @__PURE__ */ jsx(
|
|
137
|
+
return /* @__PURE__ */ jsx(
|
|
138
|
+
Alert,
|
|
139
|
+
{
|
|
140
|
+
status: "danger",
|
|
141
|
+
title: t("reviewPage.errorLoading"),
|
|
142
|
+
description: error.message
|
|
143
|
+
}
|
|
144
|
+
);
|
|
110
145
|
}
|
|
111
146
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
112
|
-
/* @__PURE__ */ jsx(Box, { mb:
|
|
147
|
+
/* @__PURE__ */ jsx(Box, { mb: "4", children: /* @__PURE__ */ jsx(Text, { variant: "body-medium", children: t("reviewPage.description") }) }),
|
|
113
148
|
/* @__PURE__ */ jsx(
|
|
114
149
|
Table,
|
|
115
150
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReviewPage.esm.js","sources":["../../../src/components/ReviewPage/ReviewPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport {\n articleRouteRef,\n DeleteModal,\n linkRouteRef,\n ObsoleteModal,\n qetaTranslationRef,\n questionRouteRef,\n RelativeTimeWithTooltip,\n useCanReview,\n useQetaApi,\n UserLink,\n ValidReviewModal,\n} from '@drodil/backstage-plugin-qeta-react';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport {\n Link,\n Table,\n TableColumn,\n WarningPanel,\n} from '@backstage/core-components';\nimport { Box, Grid, IconButton, Tooltip, Typography } from '@material-ui/core';\nimport CheckIcon from '@material-ui/icons/Check';\nimport BlockIcon from '@material-ui/icons/Block';\nimport DeleteIcon from '@material-ui/icons/Delete';\nimport { Post } from '@drodil/backstage-plugin-qeta-common';\n\nexport const ReviewPage = () => {\n const { t } = useTranslationRef(qetaTranslationRef);\n const {\n value: response,\n loading,\n error,\n retry,\n } = useQetaApi(api =>\n api.getPosts({\n reviewNeeded: true,\n includeHealth: true,\n includeVotes: false,\n includeAttachments: false,\n includeExperts: false,\n includeTags: false,\n order: 'asc',\n orderBy: 'created',\n includeEntities: false,\n includeAnswers: false,\n checkAccess: true,\n }),\n );\n\n const questionRoute = useRouteRef(questionRouteRef);\n const articleRoute = useRouteRef(articleRouteRef);\n const linkRoute = useRouteRef(linkRouteRef);\n const { canReview } = useCanReview();\n\n const getPostLink = (post: Post) => {\n if (post.type === 'article') {\n return articleRoute({ id: post.id.toString() });\n }\n if (post.type === 'question') {\n return questionRoute({ id: post.id.toString() });\n }\n if (post.type === 'link') {\n return linkRoute({ id: post.id.toString() });\n }\n return '#';\n };\n\n const [openObsoleteModal, setOpenObsoleteModal] = useState(false);\n const [openValidModal, setOpenValidModal] = useState(false);\n const [selectedPost, setSelectedPost] = useState<Post | null>(null);\n const [openDeleteModal, setOpenDeleteModal] = useState(false);\n const [postToDelete, setPostToDelete] = useState<Post | null>(null);\n\n const openMarkObsolete = (post: Post) => {\n setSelectedPost(post);\n setOpenObsoleteModal(true);\n };\n\n const openMarkValid = (post: Post) => {\n setSelectedPost(post);\n setOpenValidModal(true);\n };\n\n const openDelete = (post: Post) => {\n setPostToDelete(post);\n setOpenDeleteModal(true);\n };\n\n const columns: TableColumn<Post>[] = [\n {\n title: t('reviewPage.table.title'),\n field: 'title',\n render: row => <Link to={getPostLink(row)}>{row.title}</Link>,\n },\n {\n title: t('reviewPage.table.author'),\n field: 'author',\n render: row => <UserLink entityRef={row.author} />,\n },\n {\n title: t('reviewPage.table.created'),\n field: 'created',\n render: row => <RelativeTimeWithTooltip value={row.created} />,\n },\n {\n title: t('reviewPage.table.healthScore'),\n field: 'healthScore',\n render: row => `${row.healthScore ?? 0}%`,\n },\n {\n title: t('reviewPage.table.actions'),\n field: 'actions',\n render: row => (\n <Grid container spacing={1}>\n <Grid item>\n <Tooltip title={t('contentHealth.markValid')}>\n <IconButton color=\"primary\" onClick={() => openMarkValid(row)}>\n <CheckIcon />\n </IconButton>\n </Tooltip>\n </Grid>\n <Grid item>\n <Tooltip title={t('contentHealth.markObsolete')}>\n <IconButton\n color=\"secondary\"\n onClick={() => openMarkObsolete(row)}\n >\n <BlockIcon />\n </IconButton>\n </Tooltip>\n </Grid>\n {row.canDelete && (\n <Grid item>\n <Tooltip title={t('deleteModal.deleteButton')}>\n <IconButton color=\"secondary\" onClick={() => openDelete(row)}>\n <DeleteIcon />\n </IconButton>\n </Tooltip>\n </Grid>\n )}\n </Grid>\n ),\n },\n ];\n\n if (!canReview) {\n return null;\n }\n\n if (error) {\n return (\n <WarningPanel severity=\"error\" title={t('reviewPage.errorLoading')}>\n {error.message}\n </WarningPanel>\n );\n }\n\n return (\n <>\n <Box mb={2}>\n <Typography variant=\"body1\">{t('reviewPage.description')}</Typography>\n </Box>\n <Table\n options={{ paging: true, pageSize: 10, search: true }}\n data={response?.posts || []}\n columns={columns}\n title={t('reviewPage.title')}\n isLoading={loading}\n />\n\n {selectedPost && (\n <>\n <ObsoleteModal\n open={openObsoleteModal}\n onClose={() => {\n setOpenObsoleteModal(false);\n setSelectedPost(null);\n }}\n post={selectedPost}\n onConfirm={retry}\n />\n <ValidReviewModal\n open={openValidModal}\n onClose={() => {\n setOpenValidModal(false);\n setSelectedPost(null);\n }}\n post={selectedPost}\n onConfirm={retry}\n />\n </>\n )}\n\n {postToDelete && (\n <DeleteModal\n open={openDeleteModal}\n onClose={() => {\n setOpenDeleteModal(false);\n setPostToDelete(null);\n }}\n entity={postToDelete}\n onDelete={retry}\n />\n )}\n </>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ReviewPage.esm.js","sources":["../../../src/components/ReviewPage/ReviewPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport {\n articleRouteRef,\n DeleteModal,\n linkRouteRef,\n ObsoleteModal,\n qetaTranslationRef,\n questionRouteRef,\n RelativeTimeWithTooltip,\n useCanReview,\n useQetaApi,\n UserLink,\n ValidReviewModal,\n} from '@drodil/backstage-plugin-qeta-react';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { Table, TableColumn } from '@backstage/core-components';\nimport { Link } from 'react-router-dom';\nimport {\n Alert,\n Box,\n ButtonIcon,\n Flex,\n Text,\n Tooltip,\n TooltipTrigger,\n} from '@backstage/ui';\nimport { RiCheckLine, RiForbidLine, RiDeleteBinLine } from '@remixicon/react';\nimport { Post } from '@drodil/backstage-plugin-qeta-common';\n\nexport const ReviewPage = () => {\n const { t } = useTranslationRef(qetaTranslationRef);\n const {\n value: response,\n loading,\n error,\n retry,\n } = useQetaApi(api =>\n api.getPosts({\n reviewNeeded: true,\n includeHealth: true,\n includeVotes: false,\n includeAttachments: false,\n includeExperts: false,\n includeTags: false,\n order: 'asc',\n orderBy: 'created',\n includeEntities: false,\n includeAnswers: false,\n checkAccess: true,\n }),\n );\n\n const questionRoute = useRouteRef(questionRouteRef);\n const articleRoute = useRouteRef(articleRouteRef);\n const linkRoute = useRouteRef(linkRouteRef);\n const { canReview } = useCanReview();\n\n const getPostLink = (post: Post) => {\n if (post.type === 'article') {\n return articleRoute({ id: post.id.toString() });\n }\n if (post.type === 'question') {\n return questionRoute({ id: post.id.toString() });\n }\n if (post.type === 'link') {\n return linkRoute({ id: post.id.toString() });\n }\n return '#';\n };\n\n const [openObsoleteModal, setOpenObsoleteModal] = useState(false);\n const [openValidModal, setOpenValidModal] = useState(false);\n const [selectedPost, setSelectedPost] = useState<Post | null>(null);\n const [openDeleteModal, setOpenDeleteModal] = useState(false);\n const [postToDelete, setPostToDelete] = useState<Post | null>(null);\n\n const openMarkObsolete = (post: Post) => {\n setSelectedPost(post);\n setOpenObsoleteModal(true);\n };\n\n const openMarkValid = (post: Post) => {\n setSelectedPost(post);\n setOpenValidModal(true);\n };\n\n const openDelete = (post: Post) => {\n setPostToDelete(post);\n setOpenDeleteModal(true);\n };\n\n const columns: TableColumn<Post>[] = [\n {\n title: t('reviewPage.table.title'),\n field: 'title',\n render: row => <Link to={getPostLink(row)}>{row.title}</Link>,\n },\n {\n title: t('reviewPage.table.author'),\n field: 'author',\n render: row => <UserLink entityRef={row.author} />,\n },\n {\n title: t('reviewPage.table.created'),\n field: 'created',\n render: row => <RelativeTimeWithTooltip value={row.created} />,\n },\n {\n title: t('reviewPage.table.healthScore'),\n field: 'healthScore',\n render: row => `${row.healthScore ?? 0}%`,\n },\n {\n title: t('reviewPage.table.actions'),\n field: 'actions',\n render: row => (\n <Flex gap=\"2\">\n <TooltipTrigger>\n <ButtonIcon\n aria-label={t('contentHealth.markValid')}\n size=\"small\"\n variant=\"tertiary\"\n onPress={() => openMarkValid(row)}\n icon={<RiCheckLine size={16} />}\n />\n <Tooltip>{t('contentHealth.markValid')}</Tooltip>\n </TooltipTrigger>\n <TooltipTrigger>\n <ButtonIcon\n aria-label={t('contentHealth.markObsolete')}\n size=\"small\"\n variant=\"tertiary\"\n onPress={() => openMarkObsolete(row)}\n icon={<RiForbidLine size={16} />}\n />\n <Tooltip>{t('contentHealth.markObsolete')}</Tooltip>\n </TooltipTrigger>\n {row.canDelete && (\n <TooltipTrigger>\n <ButtonIcon\n aria-label={t('deleteModal.deleteButton')}\n size=\"small\"\n variant=\"tertiary\"\n onPress={() => openDelete(row)}\n icon={<RiDeleteBinLine size={16} />}\n />\n <Tooltip>{t('deleteModal.deleteButton')}</Tooltip>\n </TooltipTrigger>\n )}\n </Flex>\n ),\n },\n ];\n\n if (!canReview) {\n return null;\n }\n\n if (error) {\n return (\n <Alert\n status=\"danger\"\n title={t('reviewPage.errorLoading')}\n description={error.message}\n />\n );\n }\n\n return (\n <>\n <Box mb=\"4\">\n <Text variant=\"body-medium\">{t('reviewPage.description')}</Text>\n </Box>\n <Table\n options={{ paging: true, pageSize: 10, search: true }}\n data={response?.posts || []}\n columns={columns}\n title={t('reviewPage.title')}\n isLoading={loading}\n />\n\n {selectedPost && (\n <>\n <ObsoleteModal\n open={openObsoleteModal}\n onClose={() => {\n setOpenObsoleteModal(false);\n setSelectedPost(null);\n }}\n post={selectedPost}\n onConfirm={retry}\n />\n <ValidReviewModal\n open={openValidModal}\n onClose={() => {\n setOpenValidModal(false);\n setSelectedPost(null);\n }}\n post={selectedPost}\n onConfirm={retry}\n />\n </>\n )}\n\n {postToDelete && (\n <DeleteModal\n open={openDeleteModal}\n onClose={() => {\n setOpenDeleteModal(false);\n setPostToDelete(null);\n }}\n entity={postToDelete}\n onDelete={retry}\n />\n )}\n </>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
2
2
|
import { qetaTranslationRef, PostHighlightList, FollowedTagsList, FollowedEntitiesList } from '@drodil/backstage-plugin-qeta-react';
|
|
3
3
|
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
|
|
4
|
-
import
|
|
4
|
+
import { RiFireLine } from '@remixicon/react';
|
|
5
5
|
|
|
6
6
|
const ArticlesRightContent = (props) => {
|
|
7
7
|
const { t } = useTranslationRef(qetaTranslationRef);
|
|
@@ -14,7 +14,7 @@ const ArticlesRightContent = (props) => {
|
|
|
14
14
|
type: "hot",
|
|
15
15
|
title: t("highlights.hotArticles.title"),
|
|
16
16
|
noQuestionsLabel: t("highlights.hotArticles.noArticlesLabel"),
|
|
17
|
-
icon: /* @__PURE__ */ jsx(
|
|
17
|
+
icon: /* @__PURE__ */ jsx(RiFireLine, { size: 16 }),
|
|
18
18
|
postType: "article",
|
|
19
19
|
options: {
|
|
20
20
|
tags,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ArticlesRightContent.esm.js","sources":["../../../src/components/RightContent/ArticlesRightContent.tsx"],"sourcesContent":["import {\n FollowedEntitiesList,\n FollowedTagsList,\n PostHighlightList,\n qetaTranslationRef,\n} from '@drodil/backstage-plugin-qeta-react';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport
|
|
1
|
+
{"version":3,"file":"ArticlesRightContent.esm.js","sources":["../../../src/components/RightContent/ArticlesRightContent.tsx"],"sourcesContent":["import {\n FollowedEntitiesList,\n FollowedTagsList,\n PostHighlightList,\n qetaTranslationRef,\n} from '@drodil/backstage-plugin-qeta-react';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { RiFireLine } from '@remixicon/react';\n\nexport const ArticlesRightContent = (props: {\n tags?: string[];\n entityRef?: string;\n}) => {\n const { t } = useTranslationRef(qetaTranslationRef);\n const { tags, entityRef } = props;\n const entities = entityRef ? [entityRef] : undefined;\n\n return (\n <>\n <PostHighlightList\n type=\"hot\"\n title={t('highlights.hotArticles.title')}\n noQuestionsLabel={t('highlights.hotArticles.noArticlesLabel')}\n icon={<RiFireLine size={16} />}\n postType=\"article\"\n options={{\n tags: tags,\n entities: entities,\n }}\n />\n <FollowedTagsList />\n <FollowedEntitiesList />\n </>\n );\n};\n"],"names":[],"mappings":";;;;;AASO,MAAM,oBAAA,GAAuB,CAAC,KAAA,KAG/B;AACJ,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,kBAAkB,CAAA;AAClD,EAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAU,GAAI,KAAA;AAC5B,EAAA,MAAM,QAAA,GAAW,SAAA,GAAY,CAAC,SAAS,CAAA,GAAI,MAAA;AAE3C,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,KAAA;AAAA,QACL,KAAA,EAAO,EAAE,8BAA8B,CAAA;AAAA,QACvC,gBAAA,EAAkB,EAAE,wCAAwC,CAAA;AAAA,QAC5D,IAAA,kBAAM,GAAA,CAAC,UAAA,EAAA,EAAW,IAAA,EAAM,EAAA,EAAI,CAAA;AAAA,QAC5B,QAAA,EAAS,SAAA;AAAA,QACT,OAAA,EAAS;AAAA,UACP,IAAA;AAAA,UACA;AAAA;AACF;AAAA,KACF;AAAA,wBACC,gBAAA,EAAA,EAAiB,CAAA;AAAA,wBACjB,oBAAA,EAAA,EAAqB;AAAA,GAAA,EACxB,CAAA;AAEJ;;;;"}
|