@drodil/backstage-plugin-qeta 3.30.2 → 3.31.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.
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
2
2
|
import { useState } from 'react';
|
|
3
|
-
import { useIsModerator, qetaTranslationRef, TemplateList } from '@drodil/backstage-plugin-qeta-react';
|
|
3
|
+
import { useIsModerator, qetaTranslationRef, TemplateList, PostsContainer } from '@drodil/backstage-plugin-qeta-react';
|
|
4
4
|
import { Box, Tab } from '@material-ui/core';
|
|
5
5
|
import { ContentHeader } from '@backstage/core-components';
|
|
6
6
|
import { TabContext, TabList, TabPanel, Alert } from '@material-ui/lab';
|
|
@@ -19,18 +19,29 @@ const ModeratorPage = () => {
|
|
|
19
19
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
20
20
|
/* @__PURE__ */ jsx(ContentHeader, { title: t("moderatorPage.title") }),
|
|
21
21
|
/* @__PURE__ */ jsxs(TabContext, { value: tab, children: [
|
|
22
|
-
/* @__PURE__ */ jsx(Box, { sx: { borderBottom: 1, borderColor: "divider" }, children: /* @__PURE__ */
|
|
22
|
+
/* @__PURE__ */ jsx(Box, { sx: { borderBottom: 1, borderColor: "divider" }, children: /* @__PURE__ */ jsxs(
|
|
23
23
|
TabList,
|
|
24
24
|
{
|
|
25
25
|
onChange: handleChange,
|
|
26
26
|
"aria-label": t("moderatorPage.tools"),
|
|
27
|
-
children:
|
|
27
|
+
children: [
|
|
28
|
+
/* @__PURE__ */ jsx(Tab, { label: t("moderatorPage.templates"), value: "templates" }),
|
|
29
|
+
/* @__PURE__ */ jsx(Tab, { label: t("moderatorPage.deletedPosts"), value: "deletedPosts" })
|
|
30
|
+
]
|
|
28
31
|
}
|
|
29
32
|
) }),
|
|
30
33
|
/* @__PURE__ */ jsxs(TabPanel, { value: "templates", children: [
|
|
31
|
-
/* @__PURE__ */ jsx(Alert, { severity: "info", children: t("moderatorPage.templatesInfo") }),
|
|
34
|
+
/* @__PURE__ */ jsx(Alert, { severity: "info", style: { marginBottom: "1em" }, children: t("moderatorPage.templatesInfo") }),
|
|
32
35
|
/* @__PURE__ */ jsx(TemplateList, {})
|
|
33
|
-
] })
|
|
36
|
+
] }),
|
|
37
|
+
/* @__PURE__ */ jsx(TabPanel, { value: "deletedPosts", children: /* @__PURE__ */ jsx(
|
|
38
|
+
PostsContainer,
|
|
39
|
+
{
|
|
40
|
+
status: "deleted",
|
|
41
|
+
showNoQuestionsBtn: false,
|
|
42
|
+
showTypeLabel: true
|
|
43
|
+
}
|
|
44
|
+
) })
|
|
34
45
|
] })
|
|
35
46
|
] });
|
|
36
47
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ModeratorPage.esm.js","sources":["../../../src/components/ModeratorPage/ModeratorPage.tsx"],"sourcesContent":["import { ChangeEvent, useState } from 'react';\nimport {\n qetaTranslationRef,\n TemplateList,\n useIsModerator,\n} from '@drodil/backstage-plugin-qeta-react';\nimport { Box, Tab } from '@material-ui/core';\nimport { ContentHeader } from '@backstage/core-components';\nimport { Alert, TabContext, TabList, TabPanel } from '@material-ui/lab';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\n\nexport const ModeratorPage = () => {\n const { isModerator } = useIsModerator();\n const [tab, setTab] = useState('templates');\n const { t } = useTranslationRef(qetaTranslationRef);\n\n if (!isModerator) {\n return null;\n }\n\n const handleChange = (_event: ChangeEvent<{}>, newValue: string) => {\n setTab(newValue);\n };\n\n return (\n <>\n <ContentHeader title={t('moderatorPage.title')} />\n <TabContext value={tab}>\n <Box sx={{ borderBottom: 1, borderColor: 'divider' }}>\n <TabList\n onChange={handleChange}\n aria-label={t('moderatorPage.tools')}\n >\n <Tab label={t('moderatorPage.templates')} value=\"templates\" />\n </TabList>\n </Box>\n <TabPanel value=\"templates\">\n <Alert severity=\"info\"
|
|
1
|
+
{"version":3,"file":"ModeratorPage.esm.js","sources":["../../../src/components/ModeratorPage/ModeratorPage.tsx"],"sourcesContent":["import { ChangeEvent, useState } from 'react';\nimport {\n PostsContainer,\n qetaTranslationRef,\n TemplateList,\n useIsModerator,\n} from '@drodil/backstage-plugin-qeta-react';\nimport { Box, Tab } from '@material-ui/core';\nimport { ContentHeader } from '@backstage/core-components';\nimport { Alert, TabContext, TabList, TabPanel } from '@material-ui/lab';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\n\nexport const ModeratorPage = () => {\n const { isModerator } = useIsModerator();\n const [tab, setTab] = useState('templates');\n const { t } = useTranslationRef(qetaTranslationRef);\n\n if (!isModerator) {\n return null;\n }\n\n const handleChange = (_event: ChangeEvent<{}>, newValue: string) => {\n setTab(newValue);\n };\n\n return (\n <>\n <ContentHeader title={t('moderatorPage.title')} />\n <TabContext value={tab}>\n <Box sx={{ borderBottom: 1, borderColor: 'divider' }}>\n <TabList\n onChange={handleChange}\n aria-label={t('moderatorPage.tools')}\n >\n <Tab label={t('moderatorPage.templates')} value=\"templates\" />\n <Tab label={t('moderatorPage.deletedPosts')} value=\"deletedPosts\" />\n </TabList>\n </Box>\n <TabPanel value=\"templates\">\n <Alert severity=\"info\" style={{ marginBottom: '1em' }}>\n {t('moderatorPage.templatesInfo')}\n </Alert>\n <TemplateList />\n </TabPanel>\n <TabPanel value=\"deletedPosts\">\n <PostsContainer\n status=\"deleted\"\n showNoQuestionsBtn={false}\n showTypeLabel\n />\n </TabPanel>\n </TabContext>\n </>\n );\n};\n"],"names":[],"mappings":";;;;;;;;AAYO,MAAM,gBAAgB,MAAM;AACjC,EAAM,MAAA,EAAE,WAAY,EAAA,GAAI,cAAe,EAAA;AACvC,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAI,SAAS,WAAW,CAAA;AAC1C,EAAA,MAAM,EAAE,CAAA,EAAM,GAAA,iBAAA,CAAkB,kBAAkB,CAAA;AAElD,EAAA,IAAI,CAAC,WAAa,EAAA;AAChB,IAAO,OAAA,IAAA;AAAA;AAGT,EAAM,MAAA,YAAA,GAAe,CAAC,MAAA,EAAyB,QAAqB,KAAA;AAClE,IAAA,MAAA,CAAO,QAAQ,CAAA;AAAA,GACjB;AAEA,EAAA,uBAEI,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,aAAc,EAAA,EAAA,KAAA,EAAO,CAAE,CAAA,qBAAqB,CAAG,EAAA,CAAA;AAAA,oBAChD,IAAA,CAAC,UAAW,EAAA,EAAA,KAAA,EAAO,GACjB,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,OAAI,EAAI,EAAA,EAAE,cAAc,CAAG,EAAA,WAAA,EAAa,WACvC,EAAA,QAAA,kBAAA,IAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,QAAU,EAAA,YAAA;AAAA,UACV,YAAA,EAAY,EAAE,qBAAqB,CAAA;AAAA,UAEnC,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,OAAI,KAAO,EAAA,CAAA,CAAE,yBAAyB,CAAA,EAAG,OAAM,WAAY,EAAA,CAAA;AAAA,gCAC3D,GAAI,EAAA,EAAA,KAAA,EAAO,EAAE,4BAA4B,CAAA,EAAG,OAAM,cAAe,EAAA;AAAA;AAAA;AAAA,OAEtE,EAAA,CAAA;AAAA,sBACA,IAAA,CAAC,QAAS,EAAA,EAAA,KAAA,EAAM,WACd,EAAA,QAAA,EAAA;AAAA,wBAAC,GAAA,CAAA,KAAA,EAAA,EAAM,QAAS,EAAA,MAAA,EAAO,KAAO,EAAA,EAAE,cAAc,KAAM,EAAA,EACjD,QAAE,EAAA,CAAA,CAAA,6BAA6B,CAClC,EAAA,CAAA;AAAA,4BACC,YAAa,EAAA,EAAA;AAAA,OAChB,EAAA,CAAA;AAAA,sBACA,GAAA,CAAC,QAAS,EAAA,EAAA,KAAA,EAAM,cACd,EAAA,QAAA,kBAAA,GAAA;AAAA,QAAC,cAAA;AAAA,QAAA;AAAA,UACC,MAAO,EAAA,SAAA;AAAA,UACP,kBAAoB,EAAA,KAAA;AAAA,UACpB,aAAa,EAAA;AAAA;AAAA,OAEjB,EAAA;AAAA,KACF,EAAA;AAAA,GACF,EAAA,CAAA;AAEJ;;;;"}
|
|
@@ -3,7 +3,7 @@ import * as React from 'react';
|
|
|
3
3
|
import { useState, useEffect, useCallback, useMemo } from 'react';
|
|
4
4
|
import { WarningPanel, ContentHeader } from '@backstage/core-components';
|
|
5
5
|
import { useParams } from 'react-router-dom';
|
|
6
|
-
import { qetaTranslationRef, useQetaApi, ButtonContainer, AskQuestionButton, AddToCollectionButton, QuestionCard, AIAnswerCard, AnswerCard, AnswerForm, RelativeTimeWithTooltip, UpdatedByLink } from '@drodil/backstage-plugin-qeta-react';
|
|
6
|
+
import { qetaTranslationRef, useQetaApi, ButtonContainer, AskQuestionButton, AddToCollectionButton, DraftBanner, DeletedBanner, QuestionCard, AIAnswerCard, AnswerCard, AnswerForm, RelativeTimeWithTooltip, UpdatedByLink } from '@drodil/backstage-plugin-qeta-react';
|
|
7
7
|
import { useSignal } from '@backstage/plugin-signals-react';
|
|
8
8
|
import { makeStyles, Box, Grid, Typography, FormControl, TextField, MenuItem, Divider } from '@material-ui/core';
|
|
9
9
|
import { Skeleton } from '@material-ui/lab';
|
|
@@ -145,54 +145,58 @@ const QuestionPage = () => {
|
|
|
145
145
|
] })
|
|
146
146
|
}
|
|
147
147
|
),
|
|
148
|
+
question.status === "draft" && /* @__PURE__ */ jsx(DraftBanner, {}),
|
|
149
|
+
question.status === "deleted" && /* @__PURE__ */ jsx(DeletedBanner, {}),
|
|
148
150
|
/* @__PURE__ */ jsx(QuestionCard, { question }),
|
|
149
151
|
/* @__PURE__ */ jsx(AIAnswerCard, { question, debounceMs: 0 }),
|
|
150
|
-
|
|
151
|
-
/* @__PURE__ */ jsx(
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
152
|
+
question.status === "active" && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
153
|
+
/* @__PURE__ */ jsx(Box, { sx: { mt: 3, mb: 2 }, children: /* @__PURE__ */ jsxs(Grid, { container: true, justifyContent: "space-between", alignItems: "center", children: [
|
|
154
|
+
/* @__PURE__ */ jsx(Grid, { item: true, children: /* @__PURE__ */ jsx(Typography, { variant: "h6", children: t("common.answersCount", {
|
|
155
|
+
count: answersCount
|
|
156
|
+
}) }) }),
|
|
157
|
+
allAnswers.length > 1 && /* @__PURE__ */ jsx(Grid, { item: true, children: /* @__PURE__ */ jsx(FormControl, { children: /* @__PURE__ */ jsxs(
|
|
158
|
+
TextField,
|
|
159
|
+
{
|
|
160
|
+
select: true,
|
|
161
|
+
size: "small",
|
|
162
|
+
label: t("questionPage.sortAnswers.label"),
|
|
163
|
+
value: answerSort,
|
|
164
|
+
onChange: (val) => setAnswerSort(val.target.value),
|
|
165
|
+
inputProps: {
|
|
166
|
+
name: "sortAnswers",
|
|
167
|
+
id: "sort-answers",
|
|
168
|
+
"aria-label": t("questionPage.sortAnswers.label"),
|
|
169
|
+
"aria-describedby": "sort-answers-helper"
|
|
170
|
+
},
|
|
171
|
+
variant: "outlined",
|
|
172
|
+
SelectProps: {
|
|
173
|
+
MenuProps: {
|
|
174
|
+
"aria-label": t("questionPage.sortAnswers.menuLabel")
|
|
175
|
+
}
|
|
176
|
+
},
|
|
177
|
+
children: [
|
|
178
|
+
/* @__PURE__ */ jsx(MenuItem, { value: "default", children: t("questionPage.sortAnswers.default") }),
|
|
179
|
+
/* @__PURE__ */ jsx(MenuItem, { value: "created_desc", children: t("questionPage.sortAnswers.createdDesc") }),
|
|
180
|
+
/* @__PURE__ */ jsx(MenuItem, { value: "created_asc", children: t("questionPage.sortAnswers.createdAsc") }),
|
|
181
|
+
/* @__PURE__ */ jsx(MenuItem, { value: "score_desc", children: t("questionPage.sortAnswers.scoreDesc") }),
|
|
182
|
+
/* @__PURE__ */ jsx(MenuItem, { value: "score_asc", children: t("questionPage.sortAnswers.scoreAsc") }),
|
|
183
|
+
/* @__PURE__ */ jsx(MenuItem, { value: "comments_desc", children: t("questionPage.sortAnswers.commentsDesc") }),
|
|
184
|
+
/* @__PURE__ */ jsx(MenuItem, { value: "comments_asc", children: t("questionPage.sortAnswers.commentsAsc") }),
|
|
185
|
+
/* @__PURE__ */ jsx(MenuItem, { value: "author_desc", children: t("questionPage.sortAnswers.authorDesc") }),
|
|
186
|
+
/* @__PURE__ */ jsx(MenuItem, { value: "author_asc", children: t("questionPage.sortAnswers.authorAsc") }),
|
|
187
|
+
/* @__PURE__ */ jsx(MenuItem, { value: "updated_desc", children: t("questionPage.sortAnswers.updatedDesc") }),
|
|
188
|
+
/* @__PURE__ */ jsx(MenuItem, { value: "updated_asc", children: t("questionPage.sortAnswers.updatedAsc") })
|
|
189
|
+
]
|
|
190
|
+
}
|
|
191
|
+
) }) })
|
|
192
|
+
] }) }),
|
|
193
|
+
/* @__PURE__ */ jsx(Divider, {}),
|
|
194
|
+
sortedAnswers.map((a) => {
|
|
195
|
+
return /* @__PURE__ */ jsx(React.Fragment, { children: /* @__PURE__ */ jsx(Box, { sx: { mb: 1 }, children: /* @__PURE__ */ jsx(AnswerCard, { answer: a, question }) }, a.id) }, a.id);
|
|
196
|
+
}),
|
|
197
|
+
/* @__PURE__ */ jsx(Divider, {}),
|
|
198
|
+
/* @__PURE__ */ jsx(AnswerForm, { post: question, onPost: onAnswerPost })
|
|
199
|
+
] })
|
|
196
200
|
] });
|
|
197
201
|
};
|
|
198
202
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QuestionPage.esm.js","sources":["../../../src/components/QuestionPage/QuestionPage.tsx"],"sourcesContent":["import * as React from 'react';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { ContentHeader, WarningPanel } from '@backstage/core-components';\nimport { useParams } from 'react-router-dom';\nimport {\n AddToCollectionButton,\n AIAnswerCard,\n AnswerCard,\n AnswerForm,\n AskQuestionButton,\n ButtonContainer,\n qetaTranslationRef,\n QuestionCard,\n RelativeTimeWithTooltip,\n UpdatedByLink,\n useQetaApi,\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 Box,\n Divider,\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';\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 [newAnswers, setNewAnswers] = React.useState<AnswerResponse[]>([]);\n const [answerSort, setAnswerSort] = React.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 } = useQetaApi(api => api.getPost(id), [id]);\n\n useEffect(() => {\n if (question) {\n setAnswersCount(question.answersCount);\n setViews(question.views);\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 allAnswers = (question?.answers ?? []).concat(newAnswers);\n const sortedAnswers = useMemo(\n () => allAnswers.sort(sortAnswers),\n [allAnswers, sortAnswers],\n );\n\n const onAnswerPost = (answer: AnswerResponse) => {\n setNewAnswers(newAnswers.concat([answer]));\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 <React.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 </React.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 // @ts-ignore\n description={getDescription(question)}\n >\n <ButtonContainer>\n <AskQuestionButton />\n <AddToCollectionButton post={question} />\n </ButtonContainer>\n </ContentHeader>\n <QuestionCard question={question} />\n <AIAnswerCard question={question} debounceMs={0} />\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 {allAnswers.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 => setAnswerSort(val.target.value as string)}\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 <Divider />\n {sortedAnswers.map(a => {\n return (\n <React.Fragment key={a.id}>\n <Box key={a.id} sx={{ mb: 1 }}>\n <AnswerCard answer={a} question={question} />\n </Box>\n </React.Fragment>\n );\n })}\n <Divider />\n <AnswerForm post={question} onPost={onAnswerPost} />\n </>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"QuestionPage.esm.js","sources":["../../../src/components/QuestionPage/QuestionPage.tsx"],"sourcesContent":["import * as React from 'react';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { ContentHeader, WarningPanel } from '@backstage/core-components';\nimport { useParams } from 'react-router-dom';\nimport {\n AddToCollectionButton,\n AIAnswerCard,\n AnswerCard,\n AnswerForm,\n AskQuestionButton,\n ButtonContainer,\n DeletedBanner,\n DraftBanner,\n qetaTranslationRef,\n QuestionCard,\n RelativeTimeWithTooltip,\n UpdatedByLink,\n useQetaApi,\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 Box,\n Divider,\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';\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 [newAnswers, setNewAnswers] = React.useState<AnswerResponse[]>([]);\n const [answerSort, setAnswerSort] = React.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 } = useQetaApi(api => api.getPost(id), [id]);\n\n useEffect(() => {\n if (question) {\n setAnswersCount(question.answersCount);\n setViews(question.views);\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 allAnswers = (question?.answers ?? []).concat(newAnswers);\n const sortedAnswers = useMemo(\n () => allAnswers.sort(sortAnswers),\n [allAnswers, sortAnswers],\n );\n\n const onAnswerPost = (answer: AnswerResponse) => {\n setNewAnswers(newAnswers.concat([answer]));\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 <React.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 </React.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 // @ts-ignore\n description={getDescription(question)}\n >\n <ButtonContainer>\n <AskQuestionButton />\n <AddToCollectionButton post={question} />\n </ButtonContainer>\n </ContentHeader>\n {question.status === 'draft' && <DraftBanner />}\n {question.status === 'deleted' && <DeletedBanner />}\n <QuestionCard question={question} />\n <AIAnswerCard question={question} debounceMs={0} />\n {question.status === 'active' && (\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 {allAnswers.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 <Divider />\n {sortedAnswers.map(a => {\n return (\n <React.Fragment key={a.id}>\n <Box key={a.id} sx={{ mb: 1 }}>\n <AnswerCard answer={a} question={question} />\n </Box>\n </React.Fragment>\n );\n })}\n <Divider />\n <AnswerForm post={question} onPost={onAnswerPost} />\n </>\n )}\n </>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;AAuCA,MAAM,oBAAuB,GAAA,UAAA;AAAA,EAC3B,OAAO;AAAA,IACL,MAAM,EAAC;AAAA,IACP,GAAK,EAAA;AAAA,MACH,OAAS,EAAA;AAAA;AACX,GACF,CAAA;AAAA,EACA,EAAE,MAAM,iBAAkB;AAC5B,CAAA;AAEO,MAAM,eAAe,MAAM;AAChC,EAAM,MAAA,EAAE,EAAG,EAAA,GAAI,SAAU,EAAA;AACzB,EAAA,MAAM,EAAE,CAAA,EAAM,GAAA,iBAAA,CAAkB,kBAAkB,CAAA;AAClD,EAAA,MAAM,CAAC,UAAY,EAAA,aAAa,IAAI,KAAM,CAAA,QAAA,CAA2B,EAAE,CAAA;AACvE,EAAA,MAAM,CAAC,UAAY,EAAA,aAAa,CAAI,GAAA,KAAA,CAAM,SAAiB,SAAS,CAAA;AACpE,EAAA,MAAM,UAAU,oBAAqB,EAAA;AAErC,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAS,CAAC,CAAA;AAClD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAS,CAAC,CAAA;AAEpC,EAAA,MAAM,EAAE,UAAW,EAAA,GAAI,SAAsB,CAAA,CAAA,UAAA,EAAa,EAAE,CAAE,CAAA,CAAA;AAE9D,EAAM,MAAA;AAAA,IACJ,KAAO,EAAA,QAAA;AAAA,IACP,OAAA;AAAA,IACA;AAAA,GACF,GAAI,WAAW,CAAO,GAAA,KAAA,GAAA,CAAI,QAAQ,EAAE,CAAA,EAAG,CAAC,EAAE,CAAC,CAAA;AAE3C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,QAAU,EAAA;AACZ,MAAA,eAAA,CAAgB,SAAS,YAAY,CAAA;AACrC,MAAA,QAAA,CAAS,SAAS,KAAK,CAAA;AAAA;AACzB,GACF,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,SAAA,CAAU,MAAM;AACd,IAAI,IAAA,UAAA,EAAY,SAAS,YAAc,EAAA;AACrC,MAAA,eAAA,CAAgB,WAAW,YAAY,CAAA;AACvC,MAAA,QAAA,CAAS,WAAW,KAAK,CAAA;AAAA;AAC3B,GACF,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,MAAM,WAAc,GAAA,WAAA;AAAA,IAClB,CAAC,GAAW,CAAc,KAAA;AACxB,MAAA,IAAI,eAAe,SAAW,EAAA;AAC5B,QAAO,OAAA,CAAA;AAAA;AAGT,MAAM,MAAA,KAAA,GAAQ,UAAW,CAAA,KAAA,CAAM,GAAG,CAAA;AAClC,MAAM,MAAA,KAAA,GAAQ,MAAM,CAAC,CAAA;AACrB,MAAM,MAAA,KAAA,GAAQ,MAAM,CAAC,CAAA;AAErB,MAAA,IAAI,GAAM,GAAA,CAAA,CAAA;AACV,MAAA,QAAQ,KAAO;AAAA,QACb,KAAK,SAAA;AACH,UAAA,GAAA,GAAM,CAAE,CAAA,OAAA,GAAU,CAAE,CAAA,OAAA,GAAU,CAAK,CAAA,GAAA,CAAA;AACnC,UAAA;AAAA,QACF,KAAK,OAAA;AACH,UAAA,GAAA,GAAM,CAAE,CAAA,KAAA,GAAQ,CAAE,CAAA,KAAA,GAAQ,CAAK,CAAA,GAAA,CAAA;AAC/B,UAAA;AAAA,QACF,KAAK,QAAA;AACH,UAAA,GAAA,GAAM,CAAE,CAAA,MAAA,GAAS,CAAE,CAAA,MAAA,GAAS,CAAK,CAAA,GAAA,CAAA;AACjC,UAAA;AAAA,QACF,KAAK,UAAA;AACH,UAAO,GAAA,GAAA,CAAA,CAAA,CAAE,UAAU,MAAU,IAAA,CAAA,KAAM,EAAE,QAAU,EAAA,MAAA,IAAU,KAAK,CAAK,CAAA,GAAA,CAAA;AACnE,UAAA;AAAA,QACF,KAAK,SAAA;AACH,UAAO,GAAA,GAAA,CAAA,CAAA,CAAE,WAAW,CAAE,CAAA,OAAA,KAAY,EAAE,OAAW,IAAA,CAAA,CAAE,WAAW,CAAK,CAAA,GAAA,CAAA;AACjE,UAAA;AAAA,QACF;AACE,UAAO,OAAA,CAAA;AAAA;AAGX,MAAA,IAAI,UAAU,MAAQ,EAAA;AACpB,QAAO,GAAA,IAAA,CAAA,CAAA;AAAA;AAET,MAAO,OAAA,GAAA;AAAA,KACT;AAAA,IACA,CAAC,UAAU;AAAA,GACb;AAEA,EAAA,MAAM,cAAc,QAAU,EAAA,OAAA,IAAW,EAAC,EAAG,OAAO,UAAU,CAAA;AAC9D,EAAA,MAAM,aAAgB,GAAA,OAAA;AAAA,IACpB,MAAM,UAAW,CAAA,IAAA,CAAK,WAAW,CAAA;AAAA,IACjC,CAAC,YAAY,WAAW;AAAA,GAC1B;AAEA,EAAM,MAAA,YAAA,GAAe,CAAC,MAA2B,KAAA;AAC/C,IAAA,aAAA,CAAc,UAAW,CAAA,MAAA,CAAO,CAAC,MAAM,CAAC,CAAC,CAAA;AACzC,IAAgB,eAAA,CAAA,CAAA,IAAA,KAAQ,OAAO,CAAC,CAAA;AAAA,GAClC;AAEA,EAAM,MAAA,cAAA,GAAiB,CAAC,CAAoB,KAAA;AAC1C,IAAA,uBACG,IAAA,CAAA,MAAA,EAAA,EAAK,SAAW,EAAA,OAAA,CAAQ,IACvB,EAAA,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,GAAI,EAAA,EAAA,UAAA,EAAW,kBAAmB,EAAA,SAAA,EAAW,QAAQ,GACnD,EAAA,QAAA,EAAA;AAAA,QAAA,CAAA,CAAE,wBAAwB,CAAA;AAAA,QAAG,GAAA;AAAA,wBAC7B,GAAA,CAAA,uBAAA,EAAA,EAAwB,KAAO,EAAA,CAAA,CAAE,OAAS,EAAA,CAAA;AAAA,QAC1C;AAAA,OACH,EAAA,CAAA;AAAA,MACC,CAAE,CAAA,OAAA,oBACA,GAAA,CAAA,KAAA,CAAM,QAAN,EAAA,EACC,QAAC,kBAAA,IAAA,CAAA,GAAA,EAAA,EAAI,UAAW,EAAA,kBAAA,EAAmB,SAAW,EAAA,OAAA,CAAQ,GACnD,EAAA,QAAA,EAAA;AAAA,QAAA,CAAA,CAAE,yBAAyB,CAAA;AAAA,QAAG,GAAA;AAAA,wBAC9B,GAAA,CAAA,uBAAA,EAAA,EAAwB,KAAO,EAAA,CAAA,CAAE,OAAS,EAAA,CAAA;AAAA,QAAG,GAAA;AAAA,QAC7C,EAAE,qBAAqB,CAAA;AAAA,QAAE,GAAA;AAAA,wBAAC,GAAA,CAAC,aAAc,EAAA,EAAA,MAAA,EAAQ,CAAG,EAAA,CAAA;AAAA,QACpD;AAAA,OAAA,EACH,CACF,EAAA,CAAA;AAAA,sBAED,GAAA,CAAA,GAAA,EAAA,EAAI,UAAW,EAAA,kBAAA,EAAmB,SAAW,EAAA,OAAA,CAAQ,GACnD,EAAA,QAAA,EAAA,CAAA,CAAE,mBAAqB,EAAA,EAAE,KAAO,EAAA,KAAA,EAAO,CAC1C,EAAA;AAAA,KACF,EAAA,CAAA;AAAA,GAEJ;AAEA,EAAA,IAAI,OAAS,EAAA;AACX,IAAA,4BACG,GAAI,EAAA,EAAA,IAAA,EAAK,UAAS,YAAY,EAAA,CAAA,CAAE,gBAAgB,CAC/C,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,YAAS,OAAQ,EAAA,MAAA,EAAO,MAAQ,EAAA,GAAA,EAAK,WAAU,MAAO,EAAA,CAAA;AAAA,sBACvD,IAAA,CAAC,GAAI,EAAA,EAAA,EAAA,EAAI,CACP,EAAA,QAAA,EAAA;AAAA,wBAAC,GAAA,CAAA,QAAA,EAAA,EAAS,SAAQ,MAAO,EAAA,MAAA,EAAQ,IAAI,KAAM,EAAA,KAAA,EAAM,WAAU,MAAO,EAAA,CAAA;AAAA,wBAClE,GAAA,CAAC,YAAS,OAAQ,EAAA,MAAA,EAAO,QAAQ,EAAI,EAAA,KAAA,EAAM,KAAM,EAAA,SAAA,EAAU,MAAO,EAAA,CAAA;AAAA,wBAClE,GAAA,CAAC,YAAS,OAAQ,EAAA,MAAA,EAAO,QAAQ,EAAI,EAAA,KAAA,EAAM,KAAM,EAAA,SAAA,EAAU,MAAO,EAAA;AAAA,OACpE,EAAA;AAAA,KACF,EAAA,CAAA;AAAA;AAIJ,EAAI,IAAA,KAAA,IAAS,aAAa,KAAW,CAAA,EAAA;AACnC,IACE,uBAAA,GAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,QAAS,EAAA,OAAA;AAAA,QACT,KAAA,EAAO,EAAE,2BAA2B,CAAA;AAAA,QACpC,WAAU,EAAA,WAAA;AAAA,QAET,QAAO,EAAA,KAAA,EAAA;AAAA;AAAA,KACV;AAAA;AAIJ,EAAI,IAAA,QAAA,CAAS,SAAS,UAAY,EAAA;AAChC,IAAA,2BACG,YAAa,EAAA,EAAA,KAAA,EAAM,aAAY,OAAS,EAAA,CAAA,CAAE,uBAAuB,CAAG,EAAA,CAAA;AAAA;AAIzE,EAAA,uBAEI,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QACC,OAAO,QAAS,CAAA,KAAA;AAAA,QAEhB,WAAA,EAAa,eAAe,QAAQ,CAAA;AAAA,QAEpC,+BAAC,eACC,EAAA,EAAA,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,iBAAkB,EAAA,EAAA,CAAA;AAAA,0BACnB,GAAA,CAAC,qBAAsB,EAAA,EAAA,IAAA,EAAM,QAAU,EAAA;AAAA,SACzC,EAAA;AAAA;AAAA,KACF;AAAA,IACC,QAAS,CAAA,MAAA,KAAW,OAAW,oBAAA,GAAA,CAAC,WAAY,EAAA,EAAA,CAAA;AAAA,IAC5C,QAAS,CAAA,MAAA,KAAW,SAAa,oBAAA,GAAA,CAAC,aAAc,EAAA,EAAA,CAAA;AAAA,oBACjD,GAAA,CAAC,gBAAa,QAAoB,EAAA,CAAA;AAAA,oBACjC,GAAA,CAAA,YAAA,EAAA,EAAa,QAAoB,EAAA,UAAA,EAAY,CAAG,EAAA,CAAA;AAAA,IAChD,QAAA,CAAS,MAAW,KAAA,QAAA,oBAEjB,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,GAAI,EAAA,EAAA,EAAA,EAAI,EAAE,EAAA,EAAI,GAAG,EAAI,EAAA,CAAA,EACpB,EAAA,QAAA,kBAAA,IAAA,CAAC,QAAK,SAAS,EAAA,IAAA,EAAC,cAAe,EAAA,eAAA,EAAgB,YAAW,QACxD,EAAA,QAAA,EAAA;AAAA,wBAAC,GAAA,CAAA,IAAA,EAAA,EAAK,MAAI,IACR,EAAA,QAAA,kBAAA,GAAA,CAAC,cAAW,OAAQ,EAAA,IAAA,EACjB,YAAE,qBAAuB,EAAA;AAAA,UACxB,KAAO,EAAA;AAAA,SACR,GACH,CACF,EAAA,CAAA;AAAA,QACC,UAAA,CAAW,SAAS,CACnB,oBAAA,GAAA,CAAC,QAAK,IAAI,EAAA,IAAA,EACR,8BAAC,WACC,EAAA,EAAA,QAAA,kBAAA,IAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YACC,MAAM,EAAA,IAAA;AAAA,YACN,IAAK,EAAA,OAAA;AAAA,YACL,KAAA,EAAO,EAAE,gCAAgC,CAAA;AAAA,YACzC,KAAO,EAAA,UAAA;AAAA,YACP,QAAU,EAAA,CAAA,GAAA,KACR,aAAc,CAAA,GAAA,CAAI,OAAO,KAAe,CAAA;AAAA,YAE1C,UAAY,EAAA;AAAA,cACV,IAAM,EAAA,aAAA;AAAA,cACN,EAAI,EAAA,cAAA;AAAA,cACJ,YAAA,EAAc,EAAE,gCAAgC,CAAA;AAAA,cAChD,kBAAoB,EAAA;AAAA,aACtB;AAAA,YACA,OAAQ,EAAA,UAAA;AAAA,YACR,WAAa,EAAA;AAAA,cACX,SAAW,EAAA;AAAA,gBACT,YAAA,EAAc,EAAE,oCAAoC;AAAA;AACtD,aACF;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,QAAS,EAAA,EAAA,KAAA,EAAM,SACb,EAAA,QAAA,EAAA,CAAA,CAAE,kCAAkC,CACvC,EAAA,CAAA;AAAA,kCACC,QAAS,EAAA,EAAA,KAAA,EAAM,cACb,EAAA,QAAA,EAAA,CAAA,CAAE,sCAAsC,CAC3C,EAAA,CAAA;AAAA,kCACC,QAAS,EAAA,EAAA,KAAA,EAAM,aACb,EAAA,QAAA,EAAA,CAAA,CAAE,qCAAqC,CAC1C,EAAA,CAAA;AAAA,kCACC,QAAS,EAAA,EAAA,KAAA,EAAM,YACb,EAAA,QAAA,EAAA,CAAA,CAAE,oCAAoC,CACzC,EAAA,CAAA;AAAA,kCACC,QAAS,EAAA,EAAA,KAAA,EAAM,WACb,EAAA,QAAA,EAAA,CAAA,CAAE,mCAAmC,CACxC,EAAA,CAAA;AAAA,kCACC,QAAS,EAAA,EAAA,KAAA,EAAM,eACb,EAAA,QAAA,EAAA,CAAA,CAAE,uCAAuC,CAC5C,EAAA,CAAA;AAAA,kCACC,QAAS,EAAA,EAAA,KAAA,EAAM,cACb,EAAA,QAAA,EAAA,CAAA,CAAE,sCAAsC,CAC3C,EAAA,CAAA;AAAA,kCACC,QAAS,EAAA,EAAA,KAAA,EAAM,aACb,EAAA,QAAA,EAAA,CAAA,CAAE,qCAAqC,CAC1C,EAAA,CAAA;AAAA,kCACC,QAAS,EAAA,EAAA,KAAA,EAAM,YACb,EAAA,QAAA,EAAA,CAAA,CAAE,oCAAoC,CACzC,EAAA,CAAA;AAAA,kCACC,QAAS,EAAA,EAAA,KAAA,EAAM,cACb,EAAA,QAAA,EAAA,CAAA,CAAE,sCAAsC,CAC3C,EAAA,CAAA;AAAA,kCACC,QAAS,EAAA,EAAA,KAAA,EAAM,aACb,EAAA,QAAA,EAAA,CAAA,CAAE,qCAAqC,CAC1C,EAAA;AAAA;AAAA;AAAA,WAEJ,CACF,EAAA;AAAA,OAAA,EAEJ,CACF,EAAA,CAAA;AAAA,0BACC,OAAQ,EAAA,EAAA,CAAA;AAAA,MACR,aAAA,CAAc,IAAI,CAAK,CAAA,KAAA;AACtB,QACE,uBAAA,GAAA,CAAC,MAAM,QAAN,EAAA,EACC,8BAAC,GAAe,EAAA,EAAA,EAAA,EAAI,EAAE,EAAI,EAAA,CAAA,IACxB,QAAC,kBAAA,GAAA,CAAA,UAAA,EAAA,EAAW,QAAQ,CAAG,EAAA,QAAA,EAAoB,KADnC,CAAE,CAAA,EAEZ,CAHmB,EAAA,EAAA,CAAA,CAAE,EAIvB,CAAA;AAAA,OAEH,CAAA;AAAA,0BACA,OAAQ,EAAA,EAAA,CAAA;AAAA,sBACR,GAAA,CAAA,UAAA,EAAA,EAAW,IAAM,EAAA,QAAA,EAAU,QAAQ,YAAc,EAAA;AAAA,KACpD,EAAA;AAAA,GAEJ,EAAA,CAAA;AAEJ;;;;"}
|
package/package.json
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"frontend",
|
|
8
8
|
"backstage.io"
|
|
9
9
|
],
|
|
10
|
-
"version": "3.
|
|
10
|
+
"version": "3.31.1",
|
|
11
11
|
"main": "dist/index.esm.js",
|
|
12
12
|
"types": "dist/index.d.ts",
|
|
13
13
|
"prepublishOnly": "yarn tsc && yarn build",
|
|
@@ -56,8 +56,8 @@
|
|
|
56
56
|
"@backstage/plugin-search-common": "^1.2.18",
|
|
57
57
|
"@backstage/plugin-search-react": "^1.9.0",
|
|
58
58
|
"@backstage/plugin-signals-react": "^0.0.13",
|
|
59
|
-
"@drodil/backstage-plugin-qeta-common": "^3.
|
|
60
|
-
"@drodil/backstage-plugin-qeta-react": "^3.
|
|
59
|
+
"@drodil/backstage-plugin-qeta-common": "^3.31.1",
|
|
60
|
+
"@drodil/backstage-plugin-qeta-react": "^3.31.1",
|
|
61
61
|
"@material-ui/core": "^4.12.2",
|
|
62
62
|
"@material-ui/icons": "^4.11.3",
|
|
63
63
|
"@material-ui/lab": "4.0.0-alpha.61",
|