@drodil/backstage-plugin-qeta-react 3.0.0 → 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/ArticleContent/ArticleButtons.esm.js +9 -8
- package/dist/components/ArticleContent/ArticleButtons.esm.js.map +1 -1
- package/dist/components/ArticleContent/ArticleContent.esm.js +5 -1
- package/dist/components/ArticleContent/ArticleContent.esm.js.map +1 -1
- package/dist/components/Buttons/EntityFollowButton.esm.js +2 -2
- package/dist/components/Buttons/EntityFollowButton.esm.js.map +1 -1
- package/dist/components/Buttons/LinkButton.esm.js +2 -1
- package/dist/components/Buttons/LinkButton.esm.js.map +1 -1
- package/dist/components/CollectionCard/CollectionCard.esm.js +4 -4
- package/dist/components/CollectionCard/CollectionCard.esm.js.map +1 -1
- package/dist/components/CollectionForm/CollectionForm.esm.js +3 -23
- package/dist/components/CollectionForm/CollectionForm.esm.js.map +1 -1
- package/dist/components/EntitiesGrid/EntitiesGridItem.esm.js +2 -2
- package/dist/components/EntitiesGrid/EntitiesGridItem.esm.js.map +1 -1
- package/dist/components/TagsGrid/TagGridItem.esm.js +16 -5
- package/dist/components/TagsGrid/TagGridItem.esm.js.map +1 -1
- package/dist/components/TagsGrid/TagsGrid.esm.js +6 -2
- package/dist/components/TagsGrid/TagsGrid.esm.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/utils/hooks.esm.js +2 -1
- package/dist/utils/hooks.esm.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useVoting, useTranslation } from '../../utils/hooks.esm.js';
|
|
1
|
+
import { useVoting, useStyles, useTranslation } from '../../utils/hooks.esm.js';
|
|
2
2
|
import React from 'react';
|
|
3
3
|
import ArrowUpward from '@material-ui/icons/ArrowUpward';
|
|
4
4
|
import { makeStyles, Grid, Tooltip, IconButton, Typography } from '@material-ui/core';
|
|
@@ -11,7 +11,7 @@ import DeleteIcon from '@material-ui/icons/Delete';
|
|
|
11
11
|
import { DeleteModal } from '../DeleteModal/DeleteModal.esm.js';
|
|
12
12
|
import EditIcon from '@material-ui/icons/Edit';
|
|
13
13
|
|
|
14
|
-
const
|
|
14
|
+
const useLocalStyles = makeStyles((theme) => {
|
|
15
15
|
return {
|
|
16
16
|
container: {
|
|
17
17
|
width: "100%",
|
|
@@ -29,7 +29,8 @@ const useStyles = makeStyles((theme) => {
|
|
|
29
29
|
const ArticleButtons = (props) => {
|
|
30
30
|
const { post } = props;
|
|
31
31
|
const { voteUpTooltip, ownVote, voteUp, score, voteDownTooltip, voteDown } = useVoting(post);
|
|
32
|
-
const styles =
|
|
32
|
+
const styles = useLocalStyles();
|
|
33
|
+
const classes = useStyles();
|
|
33
34
|
const { t } = useTranslation();
|
|
34
35
|
const editArticleRoute = useRouteRef(editArticleRouteRef);
|
|
35
36
|
const [deleteModalOpen, setDeleteModalOpen] = React.useState(false);
|
|
@@ -58,12 +59,12 @@ const ArticleButtons = (props) => {
|
|
|
58
59
|
onClick: voteDown
|
|
59
60
|
},
|
|
60
61
|
/* @__PURE__ */ React.createElement(ArrowDownward, null)
|
|
61
|
-
))), /* @__PURE__ */ React.createElement(Tooltip, { title: t("common.score", { score: score.toString(10) }) }, /* @__PURE__ */ React.createElement(Typography, { className: styles.scoreText, display: "inline" }, score))), /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(FavoriteButton, { entity: post }), /* @__PURE__ */ React.createElement(LinkButton, { entity: post }), (post.canEdit || post.canDelete) && /* @__PURE__ */ React.createElement(React.Fragment, null, post.canDelete && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Tooltip, { title: t("articlePage.deleteButton") }, /* @__PURE__ */ React.createElement(
|
|
62
|
+
))), /* @__PURE__ */ React.createElement(Tooltip, { title: t("common.score", { score: score.toString(10) }) }, /* @__PURE__ */ React.createElement(Typography, { className: styles.scoreText, display: "inline" }, score))), /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(FavoriteButton, { entity: post }), /* @__PURE__ */ React.createElement(LinkButton, { entity: post, className: classes.marginLeft }), (post.canEdit || post.canDelete) && /* @__PURE__ */ React.createElement(React.Fragment, null, post.canDelete && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Tooltip, { title: t("articlePage.deleteButton") }, /* @__PURE__ */ React.createElement(
|
|
62
63
|
IconButton,
|
|
63
64
|
{
|
|
64
65
|
size: "small",
|
|
65
|
-
|
|
66
|
-
|
|
66
|
+
onClick: handleDeleteModalOpen,
|
|
67
|
+
className: classes.marginLeft
|
|
67
68
|
},
|
|
68
69
|
/* @__PURE__ */ React.createElement(DeleteIcon, null)
|
|
69
70
|
)), /* @__PURE__ */ React.createElement(
|
|
@@ -77,7 +78,7 @@ const ArticleButtons = (props) => {
|
|
|
77
78
|
IconButton,
|
|
78
79
|
{
|
|
79
80
|
size: "small",
|
|
80
|
-
|
|
81
|
+
className: classes.marginLeft,
|
|
81
82
|
href: editArticleRoute({
|
|
82
83
|
id: post.id.toString(10)
|
|
83
84
|
})
|
|
@@ -86,5 +87,5 @@ const ArticleButtons = (props) => {
|
|
|
86
87
|
))))));
|
|
87
88
|
};
|
|
88
89
|
|
|
89
|
-
export { ArticleButtons,
|
|
90
|
+
export { ArticleButtons, useLocalStyles };
|
|
90
91
|
//# sourceMappingURL=ArticleButtons.esm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ArticleButtons.esm.js","sources":["../../../src/components/ArticleContent/ArticleButtons.tsx"],"sourcesContent":["import { PostResponse } from '@drodil/backstage-plugin-qeta-common';\nimport { useTranslation, useVoting } from '../../utils/hooks';\nimport React from 'react';\nimport ArrowUpward from '@material-ui/icons/ArrowUpward';\nimport {\n Grid,\n IconButton,\n makeStyles,\n Tooltip,\n Typography,\n} from '@material-ui/core';\nimport ArrowDownward from '@material-ui/icons/ArrowDownward';\nimport { FavoriteButton } from '../Buttons/FavoriteButton';\nimport { LinkButton } from '../Buttons/LinkButton';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport { editArticleRouteRef } from '../../routes';\nimport DeleteIcon from '@material-ui/icons/Delete';\nimport { DeleteModal } from '../DeleteModal';\nimport EditIcon from '@material-ui/icons/Edit';\n\nexport const
|
|
1
|
+
{"version":3,"file":"ArticleButtons.esm.js","sources":["../../../src/components/ArticleContent/ArticleButtons.tsx"],"sourcesContent":["import { PostResponse } from '@drodil/backstage-plugin-qeta-common';\nimport { useStyles, useTranslation, useVoting } from '../../utils/hooks';\nimport React from 'react';\nimport ArrowUpward from '@material-ui/icons/ArrowUpward';\nimport {\n Grid,\n IconButton,\n makeStyles,\n Tooltip,\n Typography,\n} from '@material-ui/core';\nimport ArrowDownward from '@material-ui/icons/ArrowDownward';\nimport { FavoriteButton } from '../Buttons/FavoriteButton';\nimport { LinkButton } from '../Buttons/LinkButton';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport { editArticleRouteRef } from '../../routes';\nimport DeleteIcon from '@material-ui/icons/Delete';\nimport { DeleteModal } from '../DeleteModal';\nimport EditIcon from '@material-ui/icons/Edit';\n\nexport const useLocalStyles = makeStyles(theme => {\n return {\n container: {\n width: '100%',\n paddingTop: '0.5rem',\n paddingBottom: '0.5rem',\n borderTop: `1px solid ${theme.palette.background.paper}`,\n borderBottom: `1px solid ${theme.palette.background.paper}`,\n },\n scoreText: {\n marginLeft: '0.5rem',\n userSelect: 'none',\n },\n };\n});\n\nexport const ArticleButtons = (props: { post: PostResponse }) => {\n const { post } = props;\n const { voteUpTooltip, ownVote, voteUp, score, voteDownTooltip, voteDown } =\n useVoting(post);\n const styles = useLocalStyles();\n const classes = useStyles();\n const { t } = useTranslation();\n const editArticleRoute = useRouteRef(editArticleRouteRef);\n const [deleteModalOpen, setDeleteModalOpen] = React.useState(false);\n const handleDeleteModalOpen = () => setDeleteModalOpen(true);\n const handleDeleteModalClose = () => setDeleteModalOpen(false);\n\n const own = props.post.own ?? false;\n\n return (\n <div className={styles.container}>\n <Grid container justifyContent=\"space-between\">\n <Grid item>\n <Tooltip title={voteUpTooltip}>\n <span>\n <IconButton\n aria-label=\"vote up\"\n color={ownVote > 0 ? 'primary' : 'default'}\n className={ownVote > 0 ? 'qetaVoteUpSelected' : 'qetaVoteUp'}\n disabled={own}\n size=\"small\"\n onClick={voteUp}\n >\n <ArrowUpward />\n </IconButton>\n </span>\n </Tooltip>\n <Tooltip title={voteDownTooltip}>\n <span>\n <IconButton\n aria-label=\"vote down\"\n color={ownVote < 0 ? 'primary' : 'default'}\n className={\n ownVote < 0 ? 'qetaVoteDownSelected' : 'qetaVoteDown'\n }\n disabled={own}\n size=\"small\"\n onClick={voteDown}\n >\n <ArrowDownward />\n </IconButton>\n </span>\n </Tooltip>\n <Tooltip title={t('common.score', { score: score.toString(10) })}>\n <Typography className={styles.scoreText} display=\"inline\">\n {score}\n </Typography>\n </Tooltip>\n </Grid>\n <Grid item>\n <FavoriteButton entity={post} />\n <LinkButton entity={post} className={classes.marginLeft} />\n {(post.canEdit || post.canDelete) && (\n <>\n {post.canDelete && (\n <>\n <Tooltip title={t('articlePage.deleteButton')}>\n <IconButton\n size=\"small\"\n onClick={handleDeleteModalOpen}\n className={classes.marginLeft}\n >\n <DeleteIcon />\n </IconButton>\n </Tooltip>\n <DeleteModal\n open={deleteModalOpen}\n onClose={handleDeleteModalClose}\n entity={post}\n />\n </>\n )}\n {post.canEdit && (\n <Tooltip title={t('articlePage.editButton')}>\n <IconButton\n size=\"small\"\n className={classes.marginLeft}\n href={editArticleRoute({\n id: post.id.toString(10),\n })}\n >\n <EditIcon />\n </IconButton>\n </Tooltip>\n )}\n </>\n )}\n </Grid>\n </Grid>\n </div>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -15,7 +15,8 @@ const useStyles = makeStyles((theme) => {
|
|
|
15
15
|
paddingTop: "1rem",
|
|
16
16
|
paddingBottom: "1rem",
|
|
17
17
|
marginBottom: "1rem",
|
|
18
|
-
borderBottom: `1px solid ${theme.palette.background.paper}
|
|
18
|
+
borderBottom: `1px solid ${theme.palette.background.paper}`,
|
|
19
|
+
...theme.overrides?.BackstageMarkdownContent
|
|
19
20
|
},
|
|
20
21
|
headerImage: {
|
|
21
22
|
objectFit: "cover",
|
|
@@ -41,6 +42,9 @@ const ArticleContent = (props) => {
|
|
|
41
42
|
const onCommentAction = (q, _) => {
|
|
42
43
|
setPostEntity(q);
|
|
43
44
|
};
|
|
45
|
+
if (post.type !== "article") {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
44
48
|
return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Typography, { variant: "h2" }, postEntity.title), /* @__PURE__ */ React.createElement(Grid, { container: true, alignItems: "center" }, /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(
|
|
45
49
|
Avatar,
|
|
46
50
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ArticleContent.esm.js","sources":["../../../src/components/ArticleContent/ArticleContent.tsx"],"sourcesContent":["import {\n AnswerResponse,\n PostResponse,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { Avatar, Grid, makeStyles, Typography } from '@material-ui/core';\nimport { MarkdownRenderer } from '../MarkdownRenderer';\nimport React from 'react';\nimport { useEntityAuthor, useTranslation } from '../../utils/hooks';\nimport { RelativeTimeWithTooltip } from '../RelativeTimeWithTooltip';\nimport { ArticleButtons } from './ArticleButtons';\nimport { TagsAndEntities } from '../TagsAndEntities/TagsAndEntities';\nimport { CommentSection } from '../CommentSection/CommentSection';\n\nexport const useStyles = makeStyles(theme => {\n return {\n content: {\n fontSize: '1.1rem',\n lineHeight: '1.5rem',\n paddingTop: '1rem',\n paddingBottom: '1rem',\n marginBottom: '1rem',\n borderBottom: `1px solid ${theme.palette.background.paper}`,\n },\n headerImage: {\n objectFit: 'cover',\n width: '100%',\n height: '200px',\n marginBottom: '1rem',\n marginTop: '1rem',\n },\n commentSection: {\n borderBottom: `1px solid ${theme.palette.background.paper}`,\n paddingBottom: '1rem',\n marginBottom: '1rem',\n marginLeft: 0,\n },\n };\n});\n\nexport const ArticleContent = (props: {\n post: PostResponse;\n views: number;\n}) => {\n const { post, views } = props;\n const styles = useStyles();\n const { t } = useTranslation();\n const { name, initials, user } = useEntityAuthor(post);\n const [postEntity, setPostEntity] = React.useState(post);\n const onCommentAction = (q: PostResponse, _?: AnswerResponse) => {\n setPostEntity(q);\n };\n\n return (\n <>\n <Typography variant=\"h2\">{postEntity.title}</Typography>\n <Grid container alignItems=\"center\">\n <Grid item>\n <Avatar\n src={user?.spec?.profile?.picture}\n className=\"qetaAvatar avatar\"\n alt={name}\n variant=\"rounded\"\n >\n {initials}\n </Avatar>\n </Grid>\n <Grid item>\n <Typography variant=\"subtitle1\">{name}</Typography>\n <Typography variant=\"caption\">\n {t('common.views', { count: views })} {' · '}\n {t('authorBox.postedAtTime')}{' '}\n <RelativeTimeWithTooltip value={postEntity.created} />\n </Typography>\n </Grid>\n </Grid>\n <Grid container>\n <Grid item xs={12}>\n <ArticleButtons post={postEntity} />\n </Grid>\n </Grid>\n {postEntity.headerImage && (\n <img\n src={post.headerImage}\n alt={post.title}\n className={styles.headerImage}\n />\n )}\n <MarkdownRenderer\n content={postEntity.content}\n className={styles.content}\n />\n <Typography variant=\"h6\">{t('common.comments')}</Typography>\n <CommentSection\n className={styles.commentSection}\n post={postEntity}\n onCommentDelete={onCommentAction}\n onCommentPost={onCommentAction}\n />\n <Grid container>\n <Grid item xs={12}>\n <TagsAndEntities entity={postEntity} />\n </Grid>\n </Grid>\n </>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;
|
|
1
|
+
{"version":3,"file":"ArticleContent.esm.js","sources":["../../../src/components/ArticleContent/ArticleContent.tsx"],"sourcesContent":["import {\n AnswerResponse,\n PostResponse,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { Avatar, Grid, makeStyles, Typography } from '@material-ui/core';\nimport { MarkdownRenderer } from '../MarkdownRenderer';\nimport React from 'react';\nimport { useEntityAuthor, useTranslation } from '../../utils/hooks';\nimport { RelativeTimeWithTooltip } from '../RelativeTimeWithTooltip';\nimport { ArticleButtons } from './ArticleButtons';\nimport { TagsAndEntities } from '../TagsAndEntities/TagsAndEntities';\nimport { CommentSection } from '../CommentSection/CommentSection';\nimport { BackstageOverrides } from '@backstage/core-components';\n\nexport const useStyles = makeStyles(theme => {\n return {\n content: {\n fontSize: '1.1rem',\n lineHeight: '1.5rem',\n paddingTop: '1rem',\n paddingBottom: '1rem',\n marginBottom: '1rem',\n borderBottom: `1px solid ${theme.palette.background.paper}`,\n ...(theme.overrides as BackstageOverrides)?.BackstageMarkdownContent,\n },\n headerImage: {\n objectFit: 'cover',\n width: '100%',\n height: '200px',\n marginBottom: '1rem',\n marginTop: '1rem',\n },\n commentSection: {\n borderBottom: `1px solid ${theme.palette.background.paper}`,\n paddingBottom: '1rem',\n marginBottom: '1rem',\n marginLeft: 0,\n },\n };\n});\n\nexport const ArticleContent = (props: {\n post: PostResponse;\n views: number;\n}) => {\n const { post, views } = props;\n const styles = useStyles();\n const { t } = useTranslation();\n const { name, initials, user } = useEntityAuthor(post);\n const [postEntity, setPostEntity] = React.useState(post);\n const onCommentAction = (q: PostResponse, _?: AnswerResponse) => {\n setPostEntity(q);\n };\n\n if (post.type !== 'article') {\n return null;\n }\n\n return (\n <>\n <Typography variant=\"h2\">{postEntity.title}</Typography>\n <Grid container alignItems=\"center\">\n <Grid item>\n <Avatar\n src={user?.spec?.profile?.picture}\n className=\"qetaAvatar avatar\"\n alt={name}\n variant=\"rounded\"\n >\n {initials}\n </Avatar>\n </Grid>\n <Grid item>\n <Typography variant=\"subtitle1\">{name}</Typography>\n <Typography variant=\"caption\">\n {t('common.views', { count: views })} {' · '}\n {t('authorBox.postedAtTime')}{' '}\n <RelativeTimeWithTooltip value={postEntity.created} />\n </Typography>\n </Grid>\n </Grid>\n <Grid container>\n <Grid item xs={12}>\n <ArticleButtons post={postEntity} />\n </Grid>\n </Grid>\n {postEntity.headerImage && (\n <img\n src={post.headerImage}\n alt={post.title}\n className={styles.headerImage}\n />\n )}\n <MarkdownRenderer\n content={postEntity.content}\n className={styles.content}\n />\n <Typography variant=\"h6\">{t('common.comments')}</Typography>\n <CommentSection\n className={styles.commentSection}\n post={postEntity}\n onCommentDelete={onCommentAction}\n onCommentPost={onCommentAction}\n />\n <Grid container>\n <Grid item xs={12}>\n <TagsAndEntities entity={postEntity} />\n </Grid>\n </Grid>\n </>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { useStyles, useTranslation, useEntityFollow } from '../../utils/hooks.esm.js';
|
|
3
|
-
import { Tooltip,
|
|
3
|
+
import { Tooltip, IconButton } from '@material-ui/core';
|
|
4
4
|
import Visibility from '@material-ui/icons/Visibility';
|
|
5
5
|
import VisibilityOff from '@material-ui/icons/VisibilityOff';
|
|
6
6
|
|
|
@@ -13,7 +13,7 @@ const EntityFollowButton = (props) => {
|
|
|
13
13
|
return null;
|
|
14
14
|
}
|
|
15
15
|
return /* @__PURE__ */ React.createElement(Tooltip, { title: t("entityButton.tooltip") }, /* @__PURE__ */ React.createElement(
|
|
16
|
-
|
|
16
|
+
IconButton,
|
|
17
17
|
{
|
|
18
18
|
size: "small",
|
|
19
19
|
className: `${styles.marginLeft} qetaFollowEntityBtn`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EntityFollowButton.esm.js","sources":["../../../src/components/Buttons/EntityFollowButton.tsx"],"sourcesContent":["import React from 'react';\nimport { useEntityFollow, useStyles, useTranslation } from '../../utils/hooks';\nimport {
|
|
1
|
+
{"version":3,"file":"EntityFollowButton.esm.js","sources":["../../../src/components/Buttons/EntityFollowButton.tsx"],"sourcesContent":["import React from 'react';\nimport { useEntityFollow, useStyles, useTranslation } from '../../utils/hooks';\nimport { IconButton, Tooltip } from '@material-ui/core';\nimport Visibility from '@material-ui/icons/Visibility';\nimport VisibilityOff from '@material-ui/icons/VisibilityOff';\n\nexport const EntityFollowButton = (props: { entityRef: string }) => {\n const { entityRef } = props;\n const styles = useStyles();\n const { t } = useTranslation();\n const entities = useEntityFollow();\n if (entities.loading) {\n return null;\n }\n\n return (\n <Tooltip title={t('entityButton.tooltip')}>\n <IconButton\n size=\"small\"\n className={`${styles.marginLeft} qetaFollowEntityBtn`}\n color={entities.isFollowingEntity(entityRef) ? 'secondary' : 'primary'}\n onClick={() => {\n if (entities.isFollowingEntity(entityRef)) {\n entities.unfollowEntity(entityRef);\n } else {\n entities.followEntity(entityRef);\n }\n }}\n >\n {entities.isFollowingEntity(entityRef) ? (\n <VisibilityOff />\n ) : (\n <Visibility />\n )}\n </IconButton>\n </Tooltip>\n );\n};\n"],"names":[],"mappings":";;;;;;AAMa,MAAA,kBAAA,GAAqB,CAAC,KAAiC,KAAA;AAClE,EAAM,MAAA,EAAE,WAAc,GAAA,KAAA,CAAA;AACtB,EAAA,MAAM,SAAS,SAAU,EAAA,CAAA;AACzB,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,cAAe,EAAA,CAAA;AAC7B,EAAA,MAAM,WAAW,eAAgB,EAAA,CAAA;AACjC,EAAA,IAAI,SAAS,OAAS,EAAA;AACpB,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAEA,EAAA,uBACG,KAAA,CAAA,aAAA,CAAA,OAAA,EAAA,EAAQ,KAAO,EAAA,CAAA,CAAE,sBAAsB,CACtC,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,IAAK,EAAA,OAAA;AAAA,MACL,SAAA,EAAW,CAAG,EAAA,MAAA,CAAO,UAAU,CAAA,oBAAA,CAAA;AAAA,MAC/B,KAAO,EAAA,QAAA,CAAS,iBAAkB,CAAA,SAAS,IAAI,WAAc,GAAA,SAAA;AAAA,MAC7D,SAAS,MAAM;AACb,QAAI,IAAA,QAAA,CAAS,iBAAkB,CAAA,SAAS,CAAG,EAAA;AACzC,UAAA,QAAA,CAAS,eAAe,SAAS,CAAA,CAAA;AAAA,SAC5B,MAAA;AACL,UAAA,QAAA,CAAS,aAAa,SAAS,CAAA,CAAA;AAAA,SACjC;AAAA,OACF;AAAA,KAAA;AAAA,IAEC,QAAA,CAAS,kBAAkB,SAAS,CAAA,uCAClC,aAAc,EAAA,IAAA,CAAA,uCAEd,UAAW,EAAA,IAAA,CAAA;AAAA,GAGlB,CAAA,CAAA;AAEJ;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LinkButton.esm.js","sources":["../../../src/components/Buttons/LinkButton.tsx"],"sourcesContent":["import { IconButton, Tooltip } from '@material-ui/core';\nimport Link from '@material-ui/icons/Link';\nimport React from 'react';\nimport {\n AnswerResponse,\n PostResponse,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { useTranslation } from '../../utils';\n\nexport const LinkButton = (props: {\n entity: PostResponse | AnswerResponse;\n}) => {\n const isQuestion = 'title' in props.entity;\n const { t } = useTranslation();\n const copyToClipboard = () => {\n const url = new URL(window.location.href);\n if (!isQuestion) {\n url.hash = `#answer_${props.entity.id}`;\n }\n window.navigator.clipboard.writeText(url.toString());\n };\n\n return (\n <Tooltip title={isQuestion ? t('link.post') : t('link.answer')}>\n <IconButton\n aria-label={t('link.aria')}\n size=\"small\"\n onClick={copyToClipboard}\n >\n <Link />\n </IconButton>\n </Tooltip>\n );\n};\n"],"names":[],"mappings":";;;;;AASa,MAAA,UAAA,GAAa,CAAC,
|
|
1
|
+
{"version":3,"file":"LinkButton.esm.js","sources":["../../../src/components/Buttons/LinkButton.tsx"],"sourcesContent":["import { IconButton, Tooltip } from '@material-ui/core';\nimport Link from '@material-ui/icons/Link';\nimport React from 'react';\nimport {\n AnswerResponse,\n PostResponse,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { useTranslation } from '../../utils';\n\nexport const LinkButton = (props: {\n entity: PostResponse | AnswerResponse;\n className?: string;\n}) => {\n const isQuestion = 'title' in props.entity;\n const { t } = useTranslation();\n const copyToClipboard = () => {\n const url = new URL(window.location.href);\n if (!isQuestion) {\n url.hash = `#answer_${props.entity.id}`;\n }\n window.navigator.clipboard.writeText(url.toString());\n };\n\n return (\n <Tooltip title={isQuestion ? t('link.post') : t('link.answer')}>\n <IconButton\n aria-label={t('link.aria')}\n size=\"small\"\n onClick={copyToClipboard}\n className={props.className}\n >\n <Link />\n </IconButton>\n </Tooltip>\n );\n};\n"],"names":[],"mappings":";;;;;AASa,MAAA,UAAA,GAAa,CAAC,KAGrB,KAAA;AACJ,EAAM,MAAA,UAAA,GAAa,WAAW,KAAM,CAAA,MAAA,CAAA;AACpC,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,cAAe,EAAA,CAAA;AAC7B,EAAA,MAAM,kBAAkB,MAAM;AAC5B,IAAA,MAAM,GAAM,GAAA,IAAI,GAAI,CAAA,MAAA,CAAO,SAAS,IAAI,CAAA,CAAA;AACxC,IAAA,IAAI,CAAC,UAAY,EAAA;AACf,MAAA,GAAA,CAAI,IAAO,GAAA,CAAA,QAAA,EAAW,KAAM,CAAA,MAAA,CAAO,EAAE,CAAA,CAAA,CAAA;AAAA,KACvC;AACA,IAAA,MAAA,CAAO,SAAU,CAAA,SAAA,CAAU,SAAU,CAAA,GAAA,CAAI,UAAU,CAAA,CAAA;AAAA,GACrD,CAAA;AAEA,EACE,uBAAA,KAAA,CAAA,aAAA,CAAC,WAAQ,KAAO,EAAA,UAAA,GAAa,EAAE,WAAW,CAAA,GAAI,CAAE,CAAA,aAAa,CAC3D,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,YAAA,EAAY,EAAE,WAAW,CAAA;AAAA,MACzB,IAAK,EAAA,OAAA;AAAA,MACL,OAAS,EAAA,eAAA;AAAA,MACT,WAAW,KAAM,CAAA,SAAA;AAAA,KAAA;AAAA,wCAEhB,IAAK,EAAA,IAAA,CAAA;AAAA,GAEV,CAAA,CAAA;AAEJ;;;;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { InfoCard } from '@backstage/core-components';
|
|
2
|
-
import { CardMedia, CardContent, Grid, Typography,
|
|
2
|
+
import { CardMedia, CardContent, Grid, Typography, Button } from '@material-ui/core';
|
|
3
3
|
import { MarkdownRenderer } from '../MarkdownRenderer/MarkdownRenderer.esm.js';
|
|
4
4
|
import React from 'react';
|
|
5
5
|
import { useStyles, useTranslation } from '../../utils/hooks.esm.js';
|
|
@@ -26,7 +26,7 @@ const CollectionCard = (props) => {
|
|
|
26
26
|
src: collection.headerImage,
|
|
27
27
|
alt: collection.title
|
|
28
28
|
}
|
|
29
|
-
), /* @__PURE__ */ React.createElement(CardContent, null, /* @__PURE__ */ React.createElement(Grid, { container: true }, /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 12 }, collection.description && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Typography, { variant: "h5" }, t("collectionPage.description")), /* @__PURE__ */ React.createElement(MarkdownRenderer, { content: collection.description }))), /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React.createElement(TagsAndEntities, { entity: collection })), /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 12 }, collection.canDelete && /* @__PURE__ */ React.createElement(
|
|
29
|
+
), /* @__PURE__ */ React.createElement(CardContent, null, /* @__PURE__ */ React.createElement(Grid, { container: true }, /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 12 }, collection.description && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Typography, { variant: "h5" }, t("collectionPage.description")), /* @__PURE__ */ React.createElement(MarkdownRenderer, { content: collection.description }))), /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React.createElement(TagsAndEntities, { entity: collection })), /* @__PURE__ */ React.createElement(Grid, { container: true, item: true, xs: 12 }, collection.canDelete && /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(
|
|
30
30
|
Button,
|
|
31
31
|
{
|
|
32
32
|
variant: "outlined",
|
|
@@ -44,7 +44,7 @@ const CollectionCard = (props) => {
|
|
|
44
44
|
onClose: handleDeleteModalClose,
|
|
45
45
|
entity: collection
|
|
46
46
|
}
|
|
47
|
-
)), collection.canEdit && /* @__PURE__ */ React.createElement(
|
|
47
|
+
)), collection.canEdit && /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(
|
|
48
48
|
Button,
|
|
49
49
|
{
|
|
50
50
|
variant: "outlined",
|
|
@@ -56,7 +56,7 @@ const CollectionCard = (props) => {
|
|
|
56
56
|
className: "qetaCollectionCardEditBtn"
|
|
57
57
|
},
|
|
58
58
|
t("questionPage.editButton")
|
|
59
|
-
)))));
|
|
59
|
+
))))));
|
|
60
60
|
};
|
|
61
61
|
|
|
62
62
|
export { CollectionCard };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CollectionCard.esm.js","sources":["../../../src/components/CollectionCard/CollectionCard.tsx"],"sourcesContent":["import { Collection } from '@drodil/backstage-plugin-qeta-common';\nimport { InfoCard } from '@backstage/core-components';\nimport {\n
|
|
1
|
+
{"version":3,"file":"CollectionCard.esm.js","sources":["../../../src/components/CollectionCard/CollectionCard.tsx"],"sourcesContent":["import { Collection } from '@drodil/backstage-plugin-qeta-common';\nimport { InfoCard } from '@backstage/core-components';\nimport {\n Button,\n CardContent,\n CardMedia,\n Grid,\n Typography,\n} from '@material-ui/core';\nimport { MarkdownRenderer } from '../MarkdownRenderer';\nimport React from 'react';\nimport { useStyles, useTranslation } from '../../utils';\nimport { TagsAndEntities } from '../TagsAndEntities/TagsAndEntities';\nimport DeleteIcon from '@material-ui/icons/Delete';\nimport { DeleteModal } from '../DeleteModal';\nimport EditIcon from '@material-ui/icons/Edit';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport { collectionEditRouteRef } from '../../routes';\n\nexport const CollectionCard = (props: { collection: Collection }) => {\n const { collection } = props;\n const styles = useStyles();\n const editCollectionRoute = useRouteRef(collectionEditRouteRef);\n const [deleteModalOpen, setDeleteModalOpen] = React.useState(false);\n const handleDeleteModalOpen = () => setDeleteModalOpen(true);\n const handleDeleteModalClose = () => setDeleteModalOpen(false);\n const { t } = useTranslation();\n return (\n <InfoCard>\n {collection.headerImage && (\n <CardMedia\n component=\"img\"\n height=\"200\"\n src={collection.headerImage}\n alt={collection.title}\n />\n )}\n <CardContent>\n <Grid container>\n <Grid item xs={12}>\n {collection.description && (\n <>\n <Typography variant=\"h5\">\n {t('collectionPage.description')}\n </Typography>\n <MarkdownRenderer content={collection.description} />\n </>\n )}\n </Grid>\n <Grid item xs={12}>\n <TagsAndEntities entity={collection} />\n </Grid>\n <Grid container item xs={12}>\n {collection.canDelete && (\n <Grid item>\n <Button\n variant=\"outlined\"\n size=\"small\"\n color=\"secondary\"\n onClick={handleDeleteModalOpen}\n className={`${styles.marginRight} qetaCollectionCardDeleteBtn`}\n startIcon={<DeleteIcon />}\n >\n {t('deleteModal.deleteButton')}\n </Button>\n <DeleteModal\n open={deleteModalOpen}\n onClose={handleDeleteModalClose}\n entity={collection}\n />\n </Grid>\n )}\n {collection.canEdit && (\n <Grid item>\n <Button\n variant=\"outlined\"\n size=\"small\"\n startIcon={<EditIcon />}\n href={editCollectionRoute({\n id: collection.id.toString(10),\n })}\n className=\"qetaCollectionCardEditBtn\"\n >\n {t('questionPage.editButton')}\n </Button>\n </Grid>\n )}\n </Grid>\n </Grid>\n </CardContent>\n </InfoCard>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -196,22 +196,12 @@ const CollectionForm = (props) => {
|
|
|
196
196
|
name: "description"
|
|
197
197
|
}
|
|
198
198
|
),
|
|
199
|
-
/* @__PURE__ */ React.createElement(Grid, { container: true, style: { marginTop: "1rem", marginBottom: "1rem" } }, /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(
|
|
199
|
+
canModifyAccess && /* @__PURE__ */ React.createElement(Grid, { container: true, style: { marginTop: "1rem", marginBottom: "1rem" } }, /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(
|
|
200
200
|
Controller,
|
|
201
201
|
{
|
|
202
202
|
control,
|
|
203
203
|
rules: { required: true },
|
|
204
|
-
render: ({ field: { onChange, value } }) => /* @__PURE__ */ React.createElement(FormControl, null, /* @__PURE__ */ React.createElement(FormHelperText, null, "Read access"), /* @__PURE__ */ React.createElement(
|
|
205
|
-
Select,
|
|
206
|
-
{
|
|
207
|
-
variant: "outlined",
|
|
208
|
-
onChange,
|
|
209
|
-
value,
|
|
210
|
-
disabled: !canModifyAccess
|
|
211
|
-
},
|
|
212
|
-
/* @__PURE__ */ React.createElement(MenuItem, { value: "private" }, "Only you"),
|
|
213
|
-
/* @__PURE__ */ React.createElement(MenuItem, { value: "public" }, "Anyone")
|
|
214
|
-
)),
|
|
204
|
+
render: ({ field: { onChange, value } }) => /* @__PURE__ */ React.createElement(FormControl, null, /* @__PURE__ */ React.createElement(FormHelperText, null, "Read access"), /* @__PURE__ */ React.createElement(Select, { variant: "outlined", onChange, value }, /* @__PURE__ */ React.createElement(MenuItem, { value: "private" }, "Only you"), /* @__PURE__ */ React.createElement(MenuItem, { value: "public" }, "Anyone"))),
|
|
215
205
|
name: "readAccess"
|
|
216
206
|
}
|
|
217
207
|
)), /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(
|
|
@@ -219,17 +209,7 @@ const CollectionForm = (props) => {
|
|
|
219
209
|
{
|
|
220
210
|
control,
|
|
221
211
|
rules: { required: true },
|
|
222
|
-
render: ({ field: { onChange, value } }) => /* @__PURE__ */ React.createElement(FormControl, null, /* @__PURE__ */ React.createElement(FormHelperText, null, "Edit access"), /* @__PURE__ */ React.createElement(
|
|
223
|
-
Select,
|
|
224
|
-
{
|
|
225
|
-
variant: "outlined",
|
|
226
|
-
onChange,
|
|
227
|
-
value,
|
|
228
|
-
disabled: !canModifyAccess
|
|
229
|
-
},
|
|
230
|
-
/* @__PURE__ */ React.createElement(MenuItem, { value: "private" }, "Only you"),
|
|
231
|
-
/* @__PURE__ */ React.createElement(MenuItem, { value: "public" }, "Anyone")
|
|
232
|
-
)),
|
|
212
|
+
render: ({ field: { onChange, value } }) => /* @__PURE__ */ React.createElement(FormControl, null, /* @__PURE__ */ React.createElement(FormHelperText, null, "Edit access"), /* @__PURE__ */ React.createElement(Select, { variant: "outlined", onChange, value }, /* @__PURE__ */ React.createElement(MenuItem, { value: "private" }, "Only you"), /* @__PURE__ */ React.createElement(MenuItem, { value: "public" }, "Anyone"))),
|
|
233
213
|
name: "editAccess"
|
|
234
214
|
}
|
|
235
215
|
))),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CollectionForm.esm.js","sources":["../../../src/components/CollectionForm/CollectionForm.tsx"],"sourcesContent":["import {\n configApiRef,\n errorApiRef,\n useAnalytics,\n useApi,\n useRouteRef,\n} from '@backstage/core-plugin-api';\nimport {\n Button,\n FormControl,\n FormHelperText,\n Grid,\n MenuItem,\n Select,\n TextField,\n} from '@material-ui/core';\nimport { Alert } from '@material-ui/lab';\nimport React, { useCallback, useEffect } from 'react';\nimport { Controller, useForm } from 'react-hook-form';\nimport { useNavigate } from 'react-router-dom';\nimport {\n CollectionRequest,\n CollectionResponse,\n QetaApi,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { useStyles, useTranslation } from '../../utils';\nimport { MarkdownEditor } from '../MarkdownEditor/MarkdownEditor';\nimport { collectionRouteRef } from '../../routes';\nimport { confirmNavigationIfEdited, imageUpload } from '../../utils/utils';\nimport { qetaApiRef } from '../../api';\nimport { CollectionFormData } from './types';\n\nconst formToRequest = (\n form: CollectionFormData,\n images: number[],\n headerImage?: string,\n): CollectionRequest => {\n return {\n ...form,\n images,\n headerImage,\n };\n};\n\nexport type CollectionFormProps = {\n id?: string;\n onPost?: (collection: CollectionResponse) => void;\n};\n\nconst getDefaultValues = (): CollectionFormData => {\n return {\n title: '',\n readAccess: 'private',\n editAccess: 'private',\n };\n};\n\nconst getValues = async (\n api: QetaApi,\n id?: string,\n): Promise<{ form: CollectionFormData; collection?: CollectionResponse }> => {\n if (!id) {\n return { form: getDefaultValues() };\n }\n\n const collection = await api.getCollection(id);\n return {\n form: {\n title: collection.title,\n description: collection.description,\n editAccess: collection.editAccess,\n readAccess: collection.readAccess,\n headerImage: collection.headerImage,\n },\n collection,\n };\n};\n\nexport const CollectionForm = (props: CollectionFormProps) => {\n const { id, onPost } = props;\n const collectionRoute = useRouteRef(collectionRouteRef);\n const navigate = useNavigate();\n const analytics = useAnalytics();\n const [posting, setPosting] = React.useState(false);\n const [values, setValues] = React.useState(getDefaultValues());\n const [error, setError] = React.useState(false);\n const [edited, setEdited] = React.useState(false);\n const [headerImage, setHeaderImage] = React.useState<string | undefined>();\n const [canModifyAccess, setCanModifyAccess] = React.useState(true);\n\n const [images, setImages] = React.useState<number[]>([]);\n const { t } = useTranslation();\n\n const qetaApi = useApi(qetaApiRef);\n const configApi = useApi(configApiRef);\n const errorApi = useApi(errorApiRef);\n const styles = useStyles();\n const isUploadDisabled =\n configApi.getOptionalBoolean('qeta.storage.disabled') || false;\n const {\n register,\n handleSubmit,\n control,\n reset,\n formState: { errors },\n } = useForm<CollectionFormData>({\n values,\n defaultValues: getDefaultValues(),\n });\n\n const postQuestion = (data: CollectionFormData) => {\n setPosting(true);\n\n if (id) {\n qetaApi\n .updateCollection(Number(id), formToRequest(data, images, headerImage))\n .then(q => {\n if (!q || !q.id) {\n setError(true);\n return;\n }\n setEdited(false);\n reset();\n analytics.captureEvent('edit', 'collection');\n if (onPost) {\n onPost(q);\n } else {\n navigate(collectionRoute({ id: q.id.toString(10) }));\n }\n })\n .catch(_e => {\n setError(true);\n setPosting(false);\n });\n return;\n }\n qetaApi\n .createCollection(formToRequest(data, images, headerImage))\n .then(q => {\n if (!q || !q.id) {\n setError(true);\n return;\n }\n setEdited(false);\n analytics.captureEvent('post', 'collection');\n reset();\n navigate(collectionRoute({ id: q.id.toString(10) }));\n })\n .catch(_e => {\n setError(true);\n setPosting(false);\n });\n };\n\n useEffect(() => {\n if (id) {\n getValues(qetaApi, id).then(data => {\n setValues(data.form);\n setHeaderImage(data.form.headerImage);\n setCanModifyAccess(data.collection?.canDelete ?? false);\n });\n }\n }, [qetaApi, id]);\n\n useEffect(() => {\n reset(values);\n }, [values, reset]);\n\n useEffect(() => {\n return confirmNavigationIfEdited(edited);\n }, [edited]);\n\n const onImageUpload = useCallback(\n (imageId: number) => {\n setImages(prevImages => [...prevImages, imageId]);\n },\n [setImages],\n );\n\n return (\n <form\n onSubmit={handleSubmit(postQuestion)}\n onChange={() => {\n setEdited(true);\n }}\n className=\"qetaAskForm\"\n >\n {error && (\n <Alert severity=\"error\">{t('collectionForm.errorPosting')}</Alert>\n )}\n {!isUploadDisabled && (\n <>\n <input\n accept=\"image/*\"\n style={{ display: 'none' }}\n id=\"headerImage\"\n type=\"file\"\n onChange={async event => {\n if (!event.target.files || event.target.files.length === 0) {\n return;\n }\n const buffer = await event.target.files[0].arrayBuffer();\n\n const uri = await imageUpload({\n qetaApi,\n errorApi,\n onImageUpload,\n })(buffer).next();\n if (typeof uri.value === 'string') {\n setHeaderImage(uri.value);\n }\n }}\n />\n <label htmlFor=\"headerImage\">\n <Button variant=\"contained\" color=\"primary\" component=\"span\">\n {t('collectionForm.uploadHeaderImage')}\n </Button>\n </label>\n </>\n )}\n {headerImage && (\n <img className={styles.headerImage} src={headerImage} alt=\"header\" />\n )}\n <TextField\n label=\"Title\"\n className=\"qetaCollectionFormTitle\"\n required\n fullWidth\n error={'title' in errors}\n margin=\"normal\"\n variant=\"outlined\"\n helperText={t('collectionForm.titleInput.helperText')}\n {\n // @ts-ignore\n ...register('title', { required: true, maxLength: 255 })\n }\n />\n\n <Controller\n control={control}\n rules={{\n required: false,\n }}\n render={({ field: { onChange, value } }) => (\n <MarkdownEditor\n value={value ?? ''}\n onChange={onChange}\n height={400}\n error={'content' in errors}\n placeholder={t('collectionForm.descriptionInput.placeholder')}\n config={configApi}\n onImageUpload={onImageUpload}\n />\n )}\n name=\"description\"\n />\n <Grid container style={{ marginTop: '1rem', marginBottom: '1rem' }}>\n <Grid item>\n <Controller\n control={control}\n rules={{ required: true }}\n render={({ field: { onChange, value } }) => (\n <FormControl>\n <FormHelperText>Read access</FormHelperText>\n <Select\n variant=\"outlined\"\n onChange={onChange}\n value={value}\n disabled={!canModifyAccess}\n >\n <MenuItem value=\"private\">Only you</MenuItem>\n <MenuItem value=\"public\">Anyone</MenuItem>\n </Select>\n </FormControl>\n )}\n name=\"readAccess\"\n />\n </Grid>\n <Grid item>\n <Controller\n control={control}\n rules={{ required: true }}\n render={({ field: { onChange, value } }) => (\n <FormControl>\n <FormHelperText>Edit access</FormHelperText>\n <Select\n variant=\"outlined\"\n onChange={onChange}\n value={value}\n disabled={!canModifyAccess}\n >\n <MenuItem value=\"private\">Only you</MenuItem>\n <MenuItem value=\"public\">Anyone</MenuItem>\n </Select>\n </FormControl>\n )}\n name=\"editAccess\"\n />\n </Grid>\n </Grid>\n <Button\n color=\"primary\"\n type=\"submit\"\n variant=\"contained\"\n disabled={posting}\n className={`qetaCollectionFormSubmitBtn ${styles.postButton}`}\n >\n {id\n ? t('collectionForm.submit.existingCollection')\n : t('collectionForm.submit.newCollection')}\n </Button>\n </form>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CollectionForm.esm.js","sources":["../../../src/components/CollectionForm/CollectionForm.tsx"],"sourcesContent":["import {\n configApiRef,\n errorApiRef,\n useAnalytics,\n useApi,\n useRouteRef,\n} from '@backstage/core-plugin-api';\nimport {\n Button,\n FormControl,\n FormHelperText,\n Grid,\n MenuItem,\n Select,\n TextField,\n} from '@material-ui/core';\nimport { Alert } from '@material-ui/lab';\nimport React, { useCallback, useEffect } from 'react';\nimport { Controller, useForm } from 'react-hook-form';\nimport { useNavigate } from 'react-router-dom';\nimport {\n CollectionRequest,\n CollectionResponse,\n QetaApi,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { useStyles, useTranslation } from '../../utils';\nimport { MarkdownEditor } from '../MarkdownEditor/MarkdownEditor';\nimport { collectionRouteRef } from '../../routes';\nimport { confirmNavigationIfEdited, imageUpload } from '../../utils/utils';\nimport { qetaApiRef } from '../../api';\nimport { CollectionFormData } from './types';\n\nconst formToRequest = (\n form: CollectionFormData,\n images: number[],\n headerImage?: string,\n): CollectionRequest => {\n return {\n ...form,\n images,\n headerImage,\n };\n};\n\nexport type CollectionFormProps = {\n id?: string;\n onPost?: (collection: CollectionResponse) => void;\n};\n\nconst getDefaultValues = (): CollectionFormData => {\n return {\n title: '',\n readAccess: 'private',\n editAccess: 'private',\n };\n};\n\nconst getValues = async (\n api: QetaApi,\n id?: string,\n): Promise<{ form: CollectionFormData; collection?: CollectionResponse }> => {\n if (!id) {\n return { form: getDefaultValues() };\n }\n\n const collection = await api.getCollection(id);\n return {\n form: {\n title: collection.title,\n description: collection.description,\n editAccess: collection.editAccess,\n readAccess: collection.readAccess,\n headerImage: collection.headerImage,\n },\n collection,\n };\n};\n\nexport const CollectionForm = (props: CollectionFormProps) => {\n const { id, onPost } = props;\n const collectionRoute = useRouteRef(collectionRouteRef);\n const navigate = useNavigate();\n const analytics = useAnalytics();\n const [posting, setPosting] = React.useState(false);\n const [values, setValues] = React.useState(getDefaultValues());\n const [error, setError] = React.useState(false);\n const [edited, setEdited] = React.useState(false);\n const [headerImage, setHeaderImage] = React.useState<string | undefined>();\n const [canModifyAccess, setCanModifyAccess] = React.useState(true);\n\n const [images, setImages] = React.useState<number[]>([]);\n const { t } = useTranslation();\n\n const qetaApi = useApi(qetaApiRef);\n const configApi = useApi(configApiRef);\n const errorApi = useApi(errorApiRef);\n const styles = useStyles();\n const isUploadDisabled =\n configApi.getOptionalBoolean('qeta.storage.disabled') || false;\n const {\n register,\n handleSubmit,\n control,\n reset,\n formState: { errors },\n } = useForm<CollectionFormData>({\n values,\n defaultValues: getDefaultValues(),\n });\n\n const postQuestion = (data: CollectionFormData) => {\n setPosting(true);\n\n if (id) {\n qetaApi\n .updateCollection(Number(id), formToRequest(data, images, headerImage))\n .then(q => {\n if (!q || !q.id) {\n setError(true);\n return;\n }\n setEdited(false);\n reset();\n analytics.captureEvent('edit', 'collection');\n if (onPost) {\n onPost(q);\n } else {\n navigate(collectionRoute({ id: q.id.toString(10) }));\n }\n })\n .catch(_e => {\n setError(true);\n setPosting(false);\n });\n return;\n }\n qetaApi\n .createCollection(formToRequest(data, images, headerImage))\n .then(q => {\n if (!q || !q.id) {\n setError(true);\n return;\n }\n setEdited(false);\n analytics.captureEvent('post', 'collection');\n reset();\n navigate(collectionRoute({ id: q.id.toString(10) }));\n })\n .catch(_e => {\n setError(true);\n setPosting(false);\n });\n };\n\n useEffect(() => {\n if (id) {\n getValues(qetaApi, id).then(data => {\n setValues(data.form);\n setHeaderImage(data.form.headerImage);\n setCanModifyAccess(data.collection?.canDelete ?? false);\n });\n }\n }, [qetaApi, id]);\n\n useEffect(() => {\n reset(values);\n }, [values, reset]);\n\n useEffect(() => {\n return confirmNavigationIfEdited(edited);\n }, [edited]);\n\n const onImageUpload = useCallback(\n (imageId: number) => {\n setImages(prevImages => [...prevImages, imageId]);\n },\n [setImages],\n );\n\n return (\n <form\n onSubmit={handleSubmit(postQuestion)}\n onChange={() => {\n setEdited(true);\n }}\n className=\"qetaAskForm\"\n >\n {error && (\n <Alert severity=\"error\">{t('collectionForm.errorPosting')}</Alert>\n )}\n {!isUploadDisabled && (\n <>\n <input\n accept=\"image/*\"\n style={{ display: 'none' }}\n id=\"headerImage\"\n type=\"file\"\n onChange={async event => {\n if (!event.target.files || event.target.files.length === 0) {\n return;\n }\n const buffer = await event.target.files[0].arrayBuffer();\n\n const uri = await imageUpload({\n qetaApi,\n errorApi,\n onImageUpload,\n })(buffer).next();\n if (typeof uri.value === 'string') {\n setHeaderImage(uri.value);\n }\n }}\n />\n <label htmlFor=\"headerImage\">\n <Button variant=\"contained\" color=\"primary\" component=\"span\">\n {t('collectionForm.uploadHeaderImage')}\n </Button>\n </label>\n </>\n )}\n {headerImage && (\n <img className={styles.headerImage} src={headerImage} alt=\"header\" />\n )}\n <TextField\n label=\"Title\"\n className=\"qetaCollectionFormTitle\"\n required\n fullWidth\n error={'title' in errors}\n margin=\"normal\"\n variant=\"outlined\"\n helperText={t('collectionForm.titleInput.helperText')}\n {\n // @ts-ignore\n ...register('title', { required: true, maxLength: 255 })\n }\n />\n\n <Controller\n control={control}\n rules={{\n required: false,\n }}\n render={({ field: { onChange, value } }) => (\n <MarkdownEditor\n value={value ?? ''}\n onChange={onChange}\n height={400}\n error={'content' in errors}\n placeholder={t('collectionForm.descriptionInput.placeholder')}\n config={configApi}\n onImageUpload={onImageUpload}\n />\n )}\n name=\"description\"\n />\n {canModifyAccess && (\n <Grid container style={{ marginTop: '1rem', marginBottom: '1rem' }}>\n <Grid item>\n <Controller\n control={control}\n rules={{ required: true }}\n render={({ field: { onChange, value } }) => (\n <FormControl>\n <FormHelperText>Read access</FormHelperText>\n <Select variant=\"outlined\" onChange={onChange} value={value}>\n <MenuItem value=\"private\">Only you</MenuItem>\n <MenuItem value=\"public\">Anyone</MenuItem>\n </Select>\n </FormControl>\n )}\n name=\"readAccess\"\n />\n </Grid>\n <Grid item>\n <Controller\n control={control}\n rules={{ required: true }}\n render={({ field: { onChange, value } }) => (\n <FormControl>\n <FormHelperText>Edit access</FormHelperText>\n <Select variant=\"outlined\" onChange={onChange} value={value}>\n <MenuItem value=\"private\">Only you</MenuItem>\n <MenuItem value=\"public\">Anyone</MenuItem>\n </Select>\n </FormControl>\n )}\n name=\"editAccess\"\n />\n </Grid>\n </Grid>\n )}\n <Button\n color=\"primary\"\n type=\"submit\"\n variant=\"contained\"\n disabled={posting}\n className={`qetaCollectionFormSubmitBtn ${styles.postButton}`}\n >\n {id\n ? t('collectionForm.submit.existingCollection')\n : t('collectionForm.submit.newCollection')}\n </Button>\n </form>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -38,7 +38,7 @@ const EntitiesGridItem = (props) => {
|
|
|
38
38
|
itemType: "post"
|
|
39
39
|
}), " \xB7 ", t("common.followers", { count: entity.followerCount })))
|
|
40
40
|
),
|
|
41
|
-
/* @__PURE__ */ React.createElement(CardActions, { style: { marginTop: "auto" } }, /* @__PURE__ */ React.createElement(
|
|
41
|
+
/* @__PURE__ */ React.createElement(CardActions, { style: { marginTop: "auto" } }, /* @__PURE__ */ React.createElement(Grid, { container: true, justifyContent: "center" }, /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(
|
|
42
42
|
Button,
|
|
43
43
|
{
|
|
44
44
|
size: "small",
|
|
@@ -53,7 +53,7 @@ const EntitiesGridItem = (props) => {
|
|
|
53
53
|
}
|
|
54
54
|
},
|
|
55
55
|
entityFollow.isFollowingEntity(entity.entityRef) ? t("entityButton.unfollow") : t("entityButton.follow")
|
|
56
|
-
))
|
|
56
|
+
))))
|
|
57
57
|
));
|
|
58
58
|
};
|
|
59
59
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EntitiesGridItem.esm.js","sources":["../../../src/components/EntitiesGrid/EntitiesGridItem.tsx"],"sourcesContent":["import { EntityResponse } from '@drodil/backstage-plugin-qeta-common';\nimport {\n Avatar,\n Button,\n Card,\n CardActionArea,\n CardActions,\n CardContent,\n CardHeader,\n Grid,\n Typography,\n} from '@material-ui/core';\nimport React from 'react';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport { useNavigate } from 'react-router-dom';\nimport { useTranslation } from '../../utils';\nimport { useEntityFollow } from '../../utils/hooks';\nimport { useEntityPresentation } from '@backstage/plugin-catalog-react';\nimport { entityRouteRef } from '../../routes';\nimport { parseEntityRef } from '@backstage/catalog-model';\n\nexport const EntitiesGridItem = (props: { entity: EntityResponse }) => {\n const { entity } = props;\n const entityRoute = useRouteRef(entityRouteRef);\n const navigate = useNavigate();\n const { t } = useTranslation();\n const entityFollow = useEntityFollow();\n const compound = parseEntityRef(entity.entityRef);\n const { primaryTitle, Icon } = useEntityPresentation(compound);\n\n return (\n <Grid item xs={3}>\n <Card\n variant=\"outlined\"\n style={{ height: '100%', display: 'flex', flexDirection: 'column' }}\n >\n <CardActionArea\n onClick={() => navigate(entityRoute({ entityRef: entity.entityRef }))}\n >\n <CardHeader\n title={primaryTitle}\n avatar={\n Icon ? (\n <Avatar>\n <Icon />\n </Avatar>\n ) : null\n }\n />\n <CardContent>\n <Typography variant=\"caption\">\n {t('common.posts', {\n count: entity.postsCount,\n itemType: 'post',\n })}\n {' · '}\n {t('common.followers', { count: entity.followerCount })}\n </Typography>\n </CardContent>\n </CardActionArea>\n <CardActions style={{ marginTop: 'auto' }}>\n <Button\n
|
|
1
|
+
{"version":3,"file":"EntitiesGridItem.esm.js","sources":["../../../src/components/EntitiesGrid/EntitiesGridItem.tsx"],"sourcesContent":["import { EntityResponse } from '@drodil/backstage-plugin-qeta-common';\nimport {\n Avatar,\n Button,\n Card,\n CardActionArea,\n CardActions,\n CardContent,\n CardHeader,\n Grid,\n Typography,\n} from '@material-ui/core';\nimport React from 'react';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport { useNavigate } from 'react-router-dom';\nimport { useTranslation } from '../../utils';\nimport { useEntityFollow } from '../../utils/hooks';\nimport { useEntityPresentation } from '@backstage/plugin-catalog-react';\nimport { entityRouteRef } from '../../routes';\nimport { parseEntityRef } from '@backstage/catalog-model';\n\nexport const EntitiesGridItem = (props: { entity: EntityResponse }) => {\n const { entity } = props;\n const entityRoute = useRouteRef(entityRouteRef);\n const navigate = useNavigate();\n const { t } = useTranslation();\n const entityFollow = useEntityFollow();\n const compound = parseEntityRef(entity.entityRef);\n const { primaryTitle, Icon } = useEntityPresentation(compound);\n\n return (\n <Grid item xs={3}>\n <Card\n variant=\"outlined\"\n style={{ height: '100%', display: 'flex', flexDirection: 'column' }}\n >\n <CardActionArea\n onClick={() => navigate(entityRoute({ entityRef: entity.entityRef }))}\n >\n <CardHeader\n title={primaryTitle}\n avatar={\n Icon ? (\n <Avatar>\n <Icon />\n </Avatar>\n ) : null\n }\n />\n <CardContent>\n <Typography variant=\"caption\">\n {t('common.posts', {\n count: entity.postsCount,\n itemType: 'post',\n })}\n {' · '}\n {t('common.followers', { count: entity.followerCount })}\n </Typography>\n </CardContent>\n </CardActionArea>\n <CardActions style={{ marginTop: 'auto' }}>\n <Grid container justifyContent=\"center\">\n <Grid item>\n <Button\n size=\"small\"\n variant=\"outlined\"\n color={\n entityFollow.isFollowingEntity(entity.entityRef)\n ? 'secondary'\n : 'primary'\n }\n onClick={() => {\n if (entityFollow.isFollowingEntity(entity.entityRef)) {\n entityFollow.unfollowEntity(entity.entityRef);\n } else {\n entityFollow.followEntity(entity.entityRef);\n }\n }}\n >\n {entityFollow.isFollowingEntity(entity.entityRef)\n ? t('entityButton.unfollow')\n : t('entityButton.follow')}\n </Button>\n </Grid>\n </Grid>\n </CardActions>\n </Card>\n </Grid>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;AAqBa,MAAA,gBAAA,GAAmB,CAAC,KAAsC,KAAA;AACrE,EAAM,MAAA,EAAE,QAAW,GAAA,KAAA,CAAA;AACnB,EAAM,MAAA,WAAA,GAAc,YAAY,cAAc,CAAA,CAAA;AAC9C,EAAA,MAAM,WAAW,WAAY,EAAA,CAAA;AAC7B,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,cAAe,EAAA,CAAA;AAC7B,EAAA,MAAM,eAAe,eAAgB,EAAA,CAAA;AACrC,EAAM,MAAA,QAAA,GAAW,cAAe,CAAA,MAAA,CAAO,SAAS,CAAA,CAAA;AAChD,EAAA,MAAM,EAAE,YAAA,EAAc,IAAK,EAAA,GAAI,sBAAsB,QAAQ,CAAA,CAAA;AAE7D,EAAA,uBACG,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAC,IAAI,CACb,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,OAAQ,EAAA,UAAA;AAAA,MACR,OAAO,EAAE,MAAA,EAAQ,QAAQ,OAAS,EAAA,MAAA,EAAQ,eAAe,QAAS,EAAA;AAAA,KAAA;AAAA,oBAElE,KAAA,CAAA,aAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,MAAM,QAAS,CAAA,WAAA,CAAY,EAAE,SAAW,EAAA,MAAA,CAAO,SAAU,EAAC,CAAC,CAAA;AAAA,OAAA;AAAA,sBAEpE,KAAA,CAAA,aAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,KAAO,EAAA,YAAA;AAAA,UACP,QACE,IACE,mBAAA,KAAA,CAAA,aAAA,CAAC,8BACE,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAK,CACR,CACE,GAAA,IAAA;AAAA,SAAA;AAAA,OAER;AAAA,0CACC,WACC,EAAA,IAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,cAAW,OAAQ,EAAA,SAAA,EAAA,EACjB,EAAE,cAAgB,EAAA;AAAA,QACjB,OAAO,MAAO,CAAA,UAAA;AAAA,QACd,QAAU,EAAA,MAAA;AAAA,OACX,CACA,EAAA,QAAA,EACA,CAAE,CAAA,kBAAA,EAAoB,EAAE,KAAA,EAAO,MAAO,CAAA,aAAA,EAAe,CACxD,CACF,CAAA;AAAA,KACF;AAAA,wCACC,WAAY,EAAA,EAAA,KAAA,EAAO,EAAE,SAAA,EAAW,QAC/B,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,SAAA,EAAS,MAAC,cAAe,EAAA,QAAA,EAAA,kBAC5B,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,MAAI,IACR,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,IAAK,EAAA,OAAA;AAAA,QACL,OAAQ,EAAA,UAAA;AAAA,QACR,OACE,YAAa,CAAA,iBAAA,CAAkB,MAAO,CAAA,SAAS,IAC3C,WACA,GAAA,SAAA;AAAA,QAEN,SAAS,MAAM;AACb,UAAA,IAAI,YAAa,CAAA,iBAAA,CAAkB,MAAO,CAAA,SAAS,CAAG,EAAA;AACpD,YAAa,YAAA,CAAA,cAAA,CAAe,OAAO,SAAS,CAAA,CAAA;AAAA,WACvC,MAAA;AACL,YAAa,YAAA,CAAA,YAAA,CAAa,OAAO,SAAS,CAAA,CAAA;AAAA,WAC5C;AAAA,SACF;AAAA,OAAA;AAAA,MAEC,YAAA,CAAa,kBAAkB,MAAO,CAAA,SAAS,IAC5C,CAAE,CAAA,uBAAuB,CACzB,GAAA,CAAA,CAAE,qBAAqB,CAAA;AAAA,KAE/B,CACF,CACF,CAAA;AAAA,GAEJ,CAAA,CAAA;AAEJ;;;;"}
|
|
@@ -9,15 +9,18 @@ import { EditTagModal } from './EditTagModal.esm.js';
|
|
|
9
9
|
import DOMPurify from 'dompurify';
|
|
10
10
|
|
|
11
11
|
const TagGridItem = (props) => {
|
|
12
|
-
const { tag } = props;
|
|
12
|
+
const { tag, onTagEdit } = props;
|
|
13
13
|
const tagRoute = useRouteRef(tagRouteRef);
|
|
14
14
|
const navigate = useNavigate();
|
|
15
15
|
const { t } = useTranslation();
|
|
16
16
|
const tags = useTagsFollow();
|
|
17
17
|
const [editModalOpen, setEditModalOpen] = React.useState(false);
|
|
18
18
|
const handleEditModalOpen = () => setEditModalOpen(true);
|
|
19
|
-
const handleEditModalClose = () =>
|
|
20
|
-
|
|
19
|
+
const handleEditModalClose = () => {
|
|
20
|
+
setEditModalOpen(false);
|
|
21
|
+
onTagEdit();
|
|
22
|
+
};
|
|
23
|
+
return /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 4 }, /* @__PURE__ */ React.createElement(
|
|
21
24
|
Card,
|
|
22
25
|
{
|
|
23
26
|
variant: "outlined",
|
|
@@ -26,7 +29,7 @@ const TagGridItem = (props) => {
|
|
|
26
29
|
/* @__PURE__ */ React.createElement(CardActionArea, { onClick: () => navigate(tagRoute({ tag: tag.tag })) }, /* @__PURE__ */ React.createElement(CardHeader, { title: tag.tag }), /* @__PURE__ */ React.createElement(CardContent, null, /* @__PURE__ */ React.createElement(Typography, { variant: "caption" }, t("common.posts", { count: tag.postsCount, itemType: "post" }), " \xB7 ", t("common.followers", { count: tag.followerCount })), /* @__PURE__ */ React.createElement(Typography, { variant: "body2" }, " ", DOMPurify.sanitize(
|
|
27
30
|
truncate(removeMarkdownFormatting(tag.description ?? ""), 150)
|
|
28
31
|
)))),
|
|
29
|
-
/* @__PURE__ */ React.createElement(CardActions, { style: { marginTop: "auto" } }, /* @__PURE__ */ React.createElement(
|
|
32
|
+
/* @__PURE__ */ React.createElement(CardActions, { style: { marginTop: "auto" } }, /* @__PURE__ */ React.createElement(Grid, { container: true, justifyContent: "center" }, /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(
|
|
30
33
|
Button,
|
|
31
34
|
{
|
|
32
35
|
size: "small",
|
|
@@ -41,7 +44,15 @@ const TagGridItem = (props) => {
|
|
|
41
44
|
}
|
|
42
45
|
},
|
|
43
46
|
tags.isFollowingTag(tag.tag) ? t("tagButton.unfollow") : t("tagButton.follow")
|
|
44
|
-
), /* @__PURE__ */ React.createElement(
|
|
47
|
+
)), /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(
|
|
48
|
+
Button,
|
|
49
|
+
{
|
|
50
|
+
size: "small",
|
|
51
|
+
onClick: handleEditModalOpen,
|
|
52
|
+
variant: "outlined"
|
|
53
|
+
},
|
|
54
|
+
t("tagButton.edit")
|
|
55
|
+
))))
|
|
45
56
|
), /* @__PURE__ */ React.createElement(
|
|
46
57
|
EditTagModal,
|
|
47
58
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TagGridItem.esm.js","sources":["../../../src/components/TagsGrid/TagGridItem.tsx"],"sourcesContent":["import {\n removeMarkdownFormatting,\n TagResponse,\n truncate,\n} from '@drodil/backstage-plugin-qeta-common';\nimport {\n Button,\n Card,\n CardActionArea,\n CardActions,\n CardContent,\n CardHeader,\n Grid,\n Typography,\n} from '@material-ui/core';\nimport React from 'react';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport { tagRouteRef } from '../../routes';\nimport { useNavigate } from 'react-router-dom';\nimport { useTranslation } from '../../utils';\nimport { useTagsFollow } from '../../utils/hooks';\nimport { EditTagModal } from './EditTagModal';\nimport DOMPurify from 'dompurify';\n\nexport const TagGridItem = (props: {
|
|
1
|
+
{"version":3,"file":"TagGridItem.esm.js","sources":["../../../src/components/TagsGrid/TagGridItem.tsx"],"sourcesContent":["import {\n removeMarkdownFormatting,\n TagResponse,\n truncate,\n} from '@drodil/backstage-plugin-qeta-common';\nimport {\n Button,\n Card,\n CardActionArea,\n CardActions,\n CardContent,\n CardHeader,\n Grid,\n Typography,\n} from '@material-ui/core';\nimport React from 'react';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport { tagRouteRef } from '../../routes';\nimport { useNavigate } from 'react-router-dom';\nimport { useTranslation } from '../../utils';\nimport { useTagsFollow } from '../../utils/hooks';\nimport { EditTagModal } from './EditTagModal';\nimport DOMPurify from 'dompurify';\n\nexport const TagGridItem = (props: {\n tag: TagResponse;\n onTagEdit: () => void;\n}) => {\n const { tag, onTagEdit } = props;\n const tagRoute = useRouteRef(tagRouteRef);\n const navigate = useNavigate();\n const { t } = useTranslation();\n const tags = useTagsFollow();\n\n const [editModalOpen, setEditModalOpen] = React.useState(false);\n const handleEditModalOpen = () => setEditModalOpen(true);\n const handleEditModalClose = () => {\n setEditModalOpen(false);\n onTagEdit();\n };\n\n return (\n <Grid item xs={4}>\n <Card\n variant=\"outlined\"\n style={{ height: '100%', display: 'flex', flexDirection: 'column' }}\n >\n <CardActionArea onClick={() => navigate(tagRoute({ tag: tag.tag }))}>\n <CardHeader title={tag.tag} />\n <CardContent>\n <Typography variant=\"caption\">\n {t('common.posts', { count: tag.postsCount, itemType: 'post' })}\n {' · '}\n {t('common.followers', { count: tag.followerCount })}\n </Typography>\n <Typography variant=\"body2\">\n {' '}\n {DOMPurify.sanitize(\n truncate(removeMarkdownFormatting(tag.description ?? ''), 150),\n )}\n </Typography>\n </CardContent>\n </CardActionArea>\n <CardActions style={{ marginTop: 'auto' }}>\n <Grid container justifyContent=\"center\">\n <Grid item>\n <Button\n size=\"small\"\n variant=\"outlined\"\n color={tags.isFollowingTag(tag.tag) ? 'secondary' : 'primary'}\n onClick={() => {\n if (tags.isFollowingTag(tag.tag)) {\n tags.unfollowTag(tag.tag);\n } else {\n tags.followTag(tag.tag);\n }\n }}\n >\n {tags.isFollowingTag(tag.tag)\n ? t('tagButton.unfollow')\n : t('tagButton.follow')}\n </Button>\n </Grid>\n <Grid item>\n <Button\n size=\"small\"\n onClick={handleEditModalOpen}\n variant=\"outlined\"\n >\n {t('tagButton.edit')}\n </Button>\n </Grid>\n </Grid>\n </CardActions>\n </Card>\n <EditTagModal\n tag={tag}\n open={editModalOpen}\n onClose={handleEditModalClose}\n />\n </Grid>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -10,7 +10,8 @@ const TagsGrid = () => {
|
|
|
10
10
|
const {
|
|
11
11
|
value: response,
|
|
12
12
|
loading,
|
|
13
|
-
error
|
|
13
|
+
error,
|
|
14
|
+
retry
|
|
14
15
|
} = useQetaApi((api) => api.getTags(), []);
|
|
15
16
|
if (loading) {
|
|
16
17
|
return /* @__PURE__ */ React.createElement(Progress, null);
|
|
@@ -26,6 +27,9 @@ const TagsGrid = () => {
|
|
|
26
27
|
(tag) => tag.tag.toLowerCase().includes(query) || tag.description?.toLowerCase().includes(query)
|
|
27
28
|
);
|
|
28
29
|
};
|
|
30
|
+
const onTagEdit = () => {
|
|
31
|
+
retry();
|
|
32
|
+
};
|
|
29
33
|
const tags = filterData(searchQuery, response);
|
|
30
34
|
return /* @__PURE__ */ React.createElement(Grid, { container: true, className: "qetaTagsContainer" }, /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React.createElement(
|
|
31
35
|
TextField,
|
|
@@ -38,7 +42,7 @@ const TagsGrid = () => {
|
|
|
38
42
|
placeholder: t("tagPage.search.placeholder"),
|
|
39
43
|
size: "small"
|
|
40
44
|
}
|
|
41
|
-
), /* @__PURE__ */ React.createElement(IconButton, { type: "submit", "aria-label": "search" })), /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React.createElement(Typography, { variant: "h6", className: "qetaTagsContainerTitle" }, t("tagPage.tags", { count: tags.length }))), /* @__PURE__ */ React.createElement(Grid, { container: true, item: true, xs: 12, alignItems: "stretch" }, tags.map((tag) => /* @__PURE__ */ React.createElement(TagGridItem, { tag, key: tag.tag }))));
|
|
45
|
+
), /* @__PURE__ */ React.createElement(IconButton, { type: "submit", "aria-label": "search" })), /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React.createElement(Typography, { variant: "h6", className: "qetaTagsContainerTitle" }, t("tagPage.tags", { count: tags.length }))), /* @__PURE__ */ React.createElement(Grid, { container: true, item: true, xs: 12, alignItems: "stretch" }, tags.map((tag) => /* @__PURE__ */ React.createElement(TagGridItem, { tag, key: tag.tag, onTagEdit }))));
|
|
42
46
|
};
|
|
43
47
|
|
|
44
48
|
export { TagsGrid };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TagsGrid.esm.js","sources":["../../../src/components/TagsGrid/TagsGrid.tsx"],"sourcesContent":["import { Grid, IconButton, TextField, Typography } from '@material-ui/core';\nimport React from 'react';\nimport { useQetaApi, useTranslation } from '../../utils/hooks';\nimport { Progress, WarningPanel } from '@backstage/core-components';\nimport { TagResponse } from '@drodil/backstage-plugin-qeta-common';\nimport { TagGridItem } from './TagGridItem';\n\nexport const TagsGrid = () => {\n const [searchQuery, setSearchQuery] = React.useState('');\n const { t } = useTranslation();\n\n const {\n value: response,\n loading,\n error,\n } = useQetaApi(api => api.getTags(), []);\n\n if (loading) {\n return <Progress />;\n }\n\n if (error || response === undefined) {\n return (\n <WarningPanel severity=\"error\" title={t('tagPage.errorLoading')}>\n {error?.message}\n </WarningPanel>\n );\n }\n\n const filterData = (query: string, data: TagResponse[]) => {\n if (!query) {\n return data;\n }\n return data.filter(\n tag =>\n tag.tag.toLowerCase().includes(query) ||\n tag.description?.toLowerCase().includes(query),\n );\n };\n\n const tags = filterData(searchQuery, response);\n\n return (\n <Grid container className=\"qetaTagsContainer\">\n <Grid item xs={12}>\n <TextField\n id=\"search-bar\"\n className=\"text qetaTagsContainerSearchInput\"\n onChange={(\n event: React.ChangeEvent<HTMLTextAreaElement | HTMLInputElement>,\n ) => setSearchQuery(event.target.value)}\n label={t('tagPage.search.label')}\n variant=\"outlined\"\n placeholder={t('tagPage.search.placeholder')}\n size=\"small\"\n />\n <IconButton type=\"submit\" aria-label=\"search\" />\n </Grid>\n <Grid item xs={12}>\n <Typography variant=\"h6\" className=\"qetaTagsContainerTitle\">\n {t('tagPage.tags', { count: tags.length })}\n </Typography>\n </Grid>\n <Grid container item xs={12} alignItems=\"stretch\">\n {tags.map(tag => (\n <TagGridItem tag={tag} key={tag.tag} />\n ))}\n </Grid>\n </Grid>\n );\n};\n"],"names":[],"mappings":";;;;;;AAOO,MAAM,WAAW,MAAM;AAC5B,EAAA,MAAM,CAAC,WAAa,EAAA,cAAc,CAAI,GAAA,KAAA,CAAM,SAAS,EAAE,CAAA,CAAA;AACvD,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,cAAe,EAAA,CAAA;AAE7B,EAAM,MAAA;AAAA,IACJ,KAAO,EAAA,QAAA;AAAA,IACP,OAAA;AAAA,IACA,KAAA;AAAA,MACE,UAAW,CAAA,CAAA,GAAA,KAAO,IAAI,OAAQ,EAAA,EAAG,EAAE,CAAA,CAAA;AAEvC,EAAA,IAAI,OAAS,EAAA;AACX,IAAA,2CAAQ,QAAS,EAAA,IAAA,CAAA,CAAA;AAAA,GACnB;AAEA,EAAI,IAAA,KAAA,IAAS,aAAa,KAAW,CAAA,EAAA;AACnC,IACE,uBAAA,KAAA,CAAA,aAAA,CAAC,gBAAa,QAAS,EAAA,OAAA,EAAQ,OAAO,CAAE,CAAA,sBAAsB,CAC3D,EAAA,EAAA,KAAA,EAAO,OACV,CAAA,CAAA;AAAA,GAEJ;AAEA,EAAM,MAAA,UAAA,GAAa,CAAC,KAAA,EAAe,IAAwB,KAAA;AACzD,IAAA,IAAI,CAAC,KAAO,EAAA;AACV,MAAO,OAAA,IAAA,CAAA;AAAA,KACT;AACA,IAAA,OAAO,IAAK,CAAA,MAAA;AAAA,MACV,CACE,GAAA,KAAA,GAAA,CAAI,GAAI,CAAA,WAAA,EAAc,CAAA,QAAA,CAAS,KAAK,CAAA,IACpC,GAAI,CAAA,WAAA,EAAa,WAAY,EAAA,CAAE,SAAS,KAAK,CAAA;AAAA,KACjD,CAAA;AAAA,GACF,CAAA;AAEA,EAAM,MAAA,IAAA,GAAO,UAAW,CAAA,WAAA,EAAa,QAAQ,CAAA,CAAA;AAE7C,EACE,uBAAA,KAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,SAAA,EAAS,IAAC,EAAA,SAAA,EAAU,mBACxB,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,EACb,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,EAAG,EAAA,YAAA;AAAA,MACH,SAAU,EAAA,mCAAA;AAAA,MACV,UAAU,CACR,KAAA,KACG,cAAe,CAAA,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,MACtC,KAAA,EAAO,EAAE,sBAAsB,CAAA;AAAA,MAC/B,OAAQ,EAAA,UAAA;AAAA,MACR,WAAA,EAAa,EAAE,4BAA4B,CAAA;AAAA,MAC3C,IAAK,EAAA,OAAA;AAAA,KAAA;AAAA,GACP,kBACC,KAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,IAAK,EAAA,QAAA,EAAS,cAAW,QAAS,EAAA,CAChD,CACA,kBAAA,KAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,MAAC,EAAI,EAAA,EAAA,EAAA,kBACZ,KAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,OAAQ,EAAA,IAAA,EAAK,WAAU,wBAChC,EAAA,EAAA,CAAA,CAAE,cAAgB,EAAA,EAAE,KAAO,EAAA,IAAA,CAAK,QAAQ,CAC3C,CACF,CAAA,kBACC,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,WAAS,IAAC,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,EAAI,EAAA,UAAA,EAAW,aACrC,IAAK,CAAA,GAAA,CAAI,CACR,GAAA,qBAAA,KAAA,CAAA,aAAA,CAAC,WAAY,EAAA,EAAA,GAAA,EAAU,
|
|
1
|
+
{"version":3,"file":"TagsGrid.esm.js","sources":["../../../src/components/TagsGrid/TagsGrid.tsx"],"sourcesContent":["import { Grid, IconButton, TextField, Typography } from '@material-ui/core';\nimport React from 'react';\nimport { useQetaApi, useTranslation } from '../../utils/hooks';\nimport { Progress, WarningPanel } from '@backstage/core-components';\nimport { TagResponse } from '@drodil/backstage-plugin-qeta-common';\nimport { TagGridItem } from './TagGridItem';\n\nexport const TagsGrid = () => {\n const [searchQuery, setSearchQuery] = React.useState('');\n const { t } = useTranslation();\n\n const {\n value: response,\n loading,\n error,\n retry,\n } = useQetaApi(api => api.getTags(), []);\n\n if (loading) {\n return <Progress />;\n }\n\n if (error || response === undefined) {\n return (\n <WarningPanel severity=\"error\" title={t('tagPage.errorLoading')}>\n {error?.message}\n </WarningPanel>\n );\n }\n\n const filterData = (query: string, data: TagResponse[]) => {\n if (!query) {\n return data;\n }\n return data.filter(\n tag =>\n tag.tag.toLowerCase().includes(query) ||\n tag.description?.toLowerCase().includes(query),\n );\n };\n\n const onTagEdit = () => {\n retry();\n };\n\n const tags = filterData(searchQuery, response);\n\n return (\n <Grid container className=\"qetaTagsContainer\">\n <Grid item xs={12}>\n <TextField\n id=\"search-bar\"\n className=\"text qetaTagsContainerSearchInput\"\n onChange={(\n event: React.ChangeEvent<HTMLTextAreaElement | HTMLInputElement>,\n ) => setSearchQuery(event.target.value)}\n label={t('tagPage.search.label')}\n variant=\"outlined\"\n placeholder={t('tagPage.search.placeholder')}\n size=\"small\"\n />\n <IconButton type=\"submit\" aria-label=\"search\" />\n </Grid>\n <Grid item xs={12}>\n <Typography variant=\"h6\" className=\"qetaTagsContainerTitle\">\n {t('tagPage.tags', { count: tags.length })}\n </Typography>\n </Grid>\n <Grid container item xs={12} alignItems=\"stretch\">\n {tags.map(tag => (\n <TagGridItem tag={tag} key={tag.tag} onTagEdit={onTagEdit} />\n ))}\n </Grid>\n </Grid>\n );\n};\n"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -564,7 +564,7 @@ declare const PostsGrid: (props: PaginatedPostsProps) => React.JSX.Element;
|
|
|
564
564
|
declare const ArticleContent: (props: {
|
|
565
565
|
post: PostResponse;
|
|
566
566
|
views: number;
|
|
567
|
-
}) => React.JSX.Element;
|
|
567
|
+
}) => React.JSX.Element | null;
|
|
568
568
|
|
|
569
569
|
type CollectionFormProps = {
|
|
570
570
|
id?: string;
|
package/dist/utils/hooks.esm.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.esm.js","sources":["../../src/utils/hooks.ts"],"sourcesContent":["import useAsync from 'react-use/lib/useAsync';\nimport {\n appThemeApiRef,\n configApiRef,\n IdentityApi,\n identityApiRef,\n useAnalytics,\n useApi,\n} from '@backstage/core-plugin-api';\nimport { makeStyles } from '@material-ui/core';\nimport { CatalogApi } from '@backstage/catalog-client';\nimport {\n catalogApiRef,\n useEntityPresentation,\n} from '@backstage/plugin-catalog-react';\nimport { trimEnd } from 'lodash';\nimport { useSearchParams } from 'react-router-dom';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { UserEntity } from '@backstage/catalog-model';\nimport {\n AnswerResponse,\n CollectionResponse,\n filterTags,\n PostResponse,\n PostType,\n QetaApi,\n QetaSignal,\n UserResponse,\n} from '@drodil/backstage-plugin-qeta-common';\nimport DataLoader from 'dataloader';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../translation';\nimport { qetaApiRef } from '../api';\nimport {\n FilterKey,\n filterKeys,\n Filters,\n} from '../components/FilterPanel/FilterPanel';\nimport useDebounce from 'react-use/lib/useDebounce';\nimport { getFiltersWithDateRange } from './utils';\nimport { useSignal } from '@backstage/plugin-signals-react';\nimport { useAsyncRetry } from 'react-use';\n\nexport const useTranslation = () => {\n return useTranslationRef(qetaTranslationRef);\n};\n\nexport type PaginatedPostsProps = {\n type?: PostType;\n tags?: string[];\n author?: string;\n entity?: string;\n showFilters?: boolean;\n showTitle?: boolean;\n title?: string;\n favorite?: boolean;\n showAskButton?: boolean;\n showWriteButton?: boolean;\n showNoQuestionsBtn?: boolean;\n initialPageSize?: number;\n collectionId?: number;\n};\n\nexport function usePaginatedPosts(props: PaginatedPostsProps) {\n const { type, tags, author, entity, favorite, initialPageSize } = props;\n const analytics = useAnalytics();\n const [page, setPage] = React.useState(1);\n const [pageCount, setPageCount] = React.useState(1);\n const [postsPerPage, setPostsPerPage] = React.useState(initialPageSize ?? 10);\n const [showFilterPanel, setShowFilterPanel] = React.useState(false);\n const [searchParams, setSearchParams] = useSearchParams();\n const [searchQuery, setSearchQuery] = React.useState('');\n const [filters, setFilters] = React.useState<Filters>({\n order: 'desc',\n orderBy: 'created',\n noAnswers: 'false',\n noCorrectAnswer: 'false',\n noVotes: 'false',\n searchQuery: '',\n entity: entity ?? '',\n tags: tags ?? [],\n dateRange: '',\n collectionId: props.collectionId,\n });\n\n const onPageChange = (value: number) => {\n setPage(value);\n setSearchParams(prev => {\n const newValue = prev;\n newValue.set('page', String(value));\n return newValue;\n });\n };\n\n const loadNextPage = () => {\n setPage(prev => prev + 1);\n };\n\n const onFilterChange = (key: FilterKey, value: string | string[]) => {\n if (filters[key] === value) {\n return;\n }\n\n setPage(1);\n setFilters({ ...filters, ...{ [key]: value } });\n setSearchParams(prev => {\n const newValue = prev;\n if (!value || value === 'false') {\n newValue.delete(key);\n } else if (Array.isArray(value)) {\n if (value.length === 0) {\n newValue.delete(key);\n } else {\n newValue.set(key, value.join(','));\n }\n } else if (value.length > 0) {\n newValue.set(key, value);\n } else {\n newValue.delete(key);\n }\n return newValue;\n });\n };\n\n const onSearchQueryChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n onPageChange(1);\n if (event.target.value) {\n analytics.captureEvent('qeta_search', event.target.value);\n }\n setSearchQuery(event.target.value);\n };\n\n useDebounce(\n () => {\n if (filters.searchQuery !== searchQuery) {\n setFilters({ ...filters, searchQuery: searchQuery });\n }\n },\n 400,\n [searchQuery],\n );\n\n useEffect(() => {\n let filtersApplied = false;\n searchParams.forEach((value, key) => {\n try {\n if (key === 'page') {\n const pv = Number.parseInt(value, 10);\n if (pv > 0) {\n setPage(pv);\n } else {\n setPage(1);\n }\n } else if (key === 'postsPerPage') {\n const qpp = Number.parseInt(value, 10);\n if (qpp > 0) setPostsPerPage(qpp);\n } else if (filterKeys.includes(key as FilterKey)) {\n filtersApplied = true;\n if (key === 'tags') {\n filters.tags = filterTags(value) ?? [];\n } else {\n (filters as any)[key] = value;\n }\n }\n } catch (_e) {\n // NOOP\n }\n });\n setFilters(filters);\n if (filtersApplied) {\n setShowFilterPanel(true);\n }\n }, [searchParams, filters]);\n\n const {\n value: response,\n loading,\n error,\n } = useQetaApi(\n api => {\n return api.getPosts({\n type,\n limit: postsPerPage,\n offset: (page - 1) * postsPerPage,\n includeEntities: true,\n author,\n favorite,\n ...(getFiltersWithDateRange(filters) as any),\n });\n },\n [type, page, filters, postsPerPage],\n );\n\n useEffect(() => {\n if (response) {\n setPageCount(Math.ceil(response.total / postsPerPage));\n }\n }, [response, postsPerPage]);\n\n const onPageSizeChange = (value: number) => {\n if (response) {\n let newPage = page;\n while (newPage * value > response.total) {\n newPage -= 1;\n }\n onPageChange(Math.max(1, newPage));\n }\n setPostsPerPage(value);\n setSearchParams(prev => {\n const newValue = prev;\n newValue.set('postsPerPage', String(value));\n return newValue;\n });\n };\n\n return {\n page,\n setPage,\n postsPerPage,\n setPostsPerPage,\n showFilterPanel,\n setShowFilterPanel,\n searchParams,\n setSearchParams,\n searchQuery,\n setSearchQuery,\n filters,\n setFilters,\n onPageChange,\n onPageSizeChange,\n onFilterChange,\n onSearchQueryChange,\n response,\n loading,\n error,\n loadNextPage,\n pageCount,\n };\n}\n\nexport function useVoting(resp: PostResponse | AnswerResponse) {\n const [entity, setEntity] = React.useState<PostResponse | AnswerResponse>(\n resp,\n );\n const [ownVote, setOwnVote] = React.useState(entity.ownVote ?? 0);\n const [correctAnswer, setCorrectAnswer] = useState(\n 'postId' in entity ? entity.correct : false,\n );\n const [score, setScore] = useState(entity.score);\n const analytics = useAnalytics();\n const qetaApi = useApi(qetaApiRef);\n const { t } = useTranslation();\n\n const isQuestion = 'title' in entity;\n const own = entity.own ?? false;\n\n const { lastSignal } = useSignal<QetaSignal>(\n isQuestion ? `qeta:question_${entity.id}` : `qeta:answer_${entity.id}`,\n );\n\n useEffect(() => {\n if (entity) {\n setScore(entity.score);\n }\n }, [entity]);\n\n useEffect(() => {\n if (\n lastSignal?.type === 'post_stats' ||\n lastSignal?.type === 'answer_stats'\n ) {\n setCorrectAnswer(lastSignal.correctAnswer);\n setScore(lastSignal.score);\n }\n }, [lastSignal]);\n\n const voteUp = () => {\n if (isQuestion) {\n qetaApi.votePostUp(entity.id).then(response => {\n setOwnVote(1);\n analytics.captureEvent('vote', 'question', { value: 1 });\n setEntity(response);\n });\n } else if ('questionId' in entity) {\n qetaApi.voteAnswerUp(entity.postId, entity.id).then(response => {\n setOwnVote(1);\n analytics.captureEvent('vote', 'answer', { value: 1 });\n setEntity(response);\n });\n }\n };\n\n const voteDown = () => {\n if (isQuestion) {\n qetaApi.votePostDown(entity.id).then(response => {\n setOwnVote(-1);\n analytics.captureEvent('vote', 'question', { value: -1 });\n setEntity(response);\n });\n } else if ('questionId' in entity) {\n qetaApi.voteAnswerDown(entity.postId, entity.id).then(response => {\n setOwnVote(-1);\n analytics.captureEvent('vote', 'answer', { value: -1 });\n setEntity(response);\n });\n }\n };\n\n let correctTooltip: string = correctAnswer\n ? t('voteButtons.answer.markIncorrect')\n : t('voteButtons.answer.markCorrect');\n if (!entity?.own) {\n correctTooltip = correctAnswer ? t('voteButtons.answer.marked') : '';\n }\n\n let voteUpTooltip: string = isQuestion\n ? t('voteButtons.question.good')\n : t('voteButtons.answer.good');\n if (own) {\n voteUpTooltip = isQuestion\n ? t('voteButtons.question.own')\n : t('voteButtons.answer.own');\n }\n\n let voteDownTooltip: string = isQuestion\n ? t('voteButtons.question.bad')\n : t('voteButtons.answer.bad');\n if (own) {\n voteDownTooltip = voteUpTooltip;\n }\n\n const toggleCorrectAnswer = () => {\n if (!('postId' in entity)) {\n return;\n }\n if (correctAnswer) {\n qetaApi.markAnswerIncorrect(entity.postId, entity.id).then(response => {\n if (response) {\n setCorrectAnswer(false);\n }\n });\n } else {\n qetaApi.markAnswerCorrect(entity.postId, entity.id).then(response => {\n if (response) {\n setCorrectAnswer(true);\n }\n });\n }\n };\n\n return {\n entity,\n ownVote,\n correctAnswer,\n score,\n voteUp,\n voteDown,\n toggleCorrectAnswer,\n voteUpTooltip,\n voteDownTooltip,\n correctTooltip,\n };\n}\n\nexport function useQetaApi<T>(\n f: (api: QetaApi) => Promise<T>,\n deps: any[] = [],\n) {\n const qetaApi = useApi(qetaApiRef);\n\n return useAsyncRetry(async () => {\n return await f(qetaApi);\n }, deps);\n}\n\nexport function useCatalogApi<T>(\n f: (api: CatalogApi) => Promise<T>,\n deps: any[] = [],\n) {\n const catalogApi = useApi(catalogApiRef);\n\n return useAsync(async () => {\n return await f(catalogApi);\n }, deps);\n}\n\nexport function useIdentityApi<T>(\n f: (api: IdentityApi) => Promise<T>,\n deps: any[] = [],\n) {\n const identityApi = useApi(identityApiRef);\n\n return useAsync(async () => {\n return await f(identityApi);\n }, deps);\n}\n\nexport function useEntityQueryParameter(entity?: string) {\n const [searchParams] = useSearchParams();\n const [entityRef, setEntityRef] = React.useState<string | undefined>(entity);\n\n useEffect(() => {\n setEntityRef(searchParams.get('entity') ?? undefined);\n }, [searchParams, setEntityRef]);\n\n return entityRef;\n}\n\nexport function useIsDarkTheme() {\n const appThemeApi = useApi(appThemeApiRef);\n const themes = appThemeApi.getInstalledThemes();\n const theme = useMemo(() => appThemeApi.getActiveThemeId(), [appThemeApi]);\n return Boolean(themes.find(t => t.id === theme)?.variant === 'dark');\n}\n\nexport const useStyles = makeStyles(theme => {\n return {\n leftMenu: {\n top: '0',\n width: '165px',\n },\n selectedMenuItem: {\n color: theme.palette.primary.contrastText,\n backgroundColor: theme.palette.primary.light,\n borderRadius: theme.shape.borderRadius,\n '&:hover': {\n backgroundColor: theme.palette.primary.dark,\n },\n '& svg': {\n color: theme.palette.primary.contrastText,\n },\n },\n nonSelectedMenuItem: {\n backgroundColor: 'initial',\n },\n headerImage: {\n width: '100%',\n height: '250px',\n objectFit: 'cover',\n },\n markdownEditor: {\n backgroundColor: 'initial',\n color: theme.palette.text.primary,\n border: `1px solid ${theme.palette.action.disabled}`,\n borderRadius: theme.shape.borderRadius,\n '&:hover': {\n borderColor: theme.palette.action.active,\n },\n '&:focus-within': {\n borderColor: theme.palette.primary.main,\n },\n '& .mde-header': {\n backgroundColor: 'initial',\n color: theme.palette.text.primary,\n borderBottom: `1px solid ${theme.palette.action.selected}`,\n '& .mde-tabs button, .mde-header-item > button': {\n color: `${theme.palette.text.primary} !important`,\n },\n },\n '& .mde-preview-content': {\n padding: '10px',\n },\n '& .mde-text, .mde-preview': {\n fontSize: theme.typography.body1.fontSize,\n fontFamily: theme.typography.body1.fontFamily,\n lineHeight: theme.typography.body1.lineHeight,\n },\n '& .mde-text': {\n backgroundColor: 'initial',\n color: theme.palette.text.primary,\n outline: 'none',\n },\n '& .image-tip': {\n color: theme.palette.text.primary,\n backgroundColor: 'initial',\n },\n },\n markdownEditorError: {\n border: `1px solid ${theme.palette.error.main} !important`,\n },\n markdownContent: {\n '& *': {\n wordBreak: 'break-word',\n },\n '&.inline': {\n display: 'inline-block',\n },\n '& > :first-child': {\n marginTop: '0px !important',\n },\n '& > :last-child': {\n marginBottom: '0px !important',\n },\n },\n successColor: {\n color: theme.palette.success.main,\n },\n questionDivider: {\n marginTop: theme.spacing(2),\n marginBottom: theme.spacing(2),\n },\n questionCard: {\n marginBottom: theme.spacing(1),\n position: 'relative',\n },\n questionCardVote: {\n textAlign: 'center',\n width: '32px',\n marginRight: '20px',\n marginLeft: '5px',\n display: 'inline-block',\n verticalAlign: 'top',\n },\n questionCardContent: {\n minHeight: '160px',\n },\n questionListItem: {\n padding: '0.7rem',\n paddingBottom: '1.4rem',\n },\n questionListItemStats: {\n width: '70px',\n textAlign: 'right',\n marginRight: '5px',\n display: 'inline-block',\n verticalAlign: 'top',\n },\n questionListItemContent: {\n display: 'inline-block',\n width: 'calc(100% - 80px)',\n },\n questionListItemAuthor: {\n display: 'inline',\n float: 'right',\n },\n questionListItemAvatar: {\n display: 'inline-flex !important',\n marginRight: '0.25rem',\n fontSize: '1rem',\n maxWidth: '1rem',\n maxHeight: '1rem',\n },\n answerCardContent: {\n display: 'inline-block',\n width: 'calc(100% - 70px)',\n },\n questionCardAuthor: {\n padding: theme.spacing(1),\n float: 'right',\n maxWidth: '200px',\n border: `1px solid ${theme.palette.action.selected}`,\n '& .avatar': {\n width: theme.spacing(3),\n height: theme.spacing(3),\n fontSize: '1rem',\n },\n },\n questionListPagination: {\n marginTop: theme.spacing(2),\n },\n postButton: {\n marginTop: theme.spacing(1),\n marginBottom: theme.spacing(1),\n },\n questionsPerPageInput: {\n paddingTop: '10px',\n },\n questionsPerPage: {\n marginRight: theme.spacing(3),\n },\n postHighlightListContainer: {\n width: '100%',\n backgroundColor: theme.palette.background.paper,\n border: `1px solid ${theme.palette.action.selected}`,\n borderRadius: theme.shape.borderRadius,\n '&:not(:first-child)': {\n marginTop: theme.spacing(2),\n },\n },\n postHighlightList: {\n paddingBottom: '0px',\n '& p': {\n marginTop: '0',\n marginBottom: '0',\n },\n },\n filterPanel: {\n border: `1px solid ${theme.palette.action.selected}`,\n borderRadius: theme.shape.borderRadius,\n padding: theme.spacing(3),\n },\n questionCardMetadata: {\n marginTop: theme.spacing(3),\n },\n marginRight: {\n marginRight: theme.spacing(1),\n },\n marginLeft: {\n marginLeft: theme.spacing(1),\n },\n questionCardActions: {\n marginTop: theme.spacing(2),\n '& a': {\n marginRight: theme.spacing(1),\n },\n },\n noPadding: {\n padding: `0 !important`,\n },\n menuIcon: {\n minWidth: '26px',\n },\n deleteModal: {\n position: 'absolute',\n top: '20%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n width: 400,\n backgroundColor: theme.palette.background.default,\n border: `1px solid ${theme.palette.action.selected}`,\n borderRadius: theme.shape.borderRadius,\n padding: theme.spacing(2),\n '& button': {\n marginTop: theme.spacing(2),\n float: 'right',\n },\n },\n authorLink: {\n textOverflow: 'ellipsis',\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n },\n highlight: {\n animation: '$highlight 2s',\n },\n '@keyframes highlight': {\n '0%': {\n boxShadow: `0px 0px 0px 3px ${theme.palette.secondary.light}`,\n },\n '100%': {\n boxShadow: 'none',\n },\n },\n dateFilter: {\n minWidth: '200px',\n marginTop: theme.spacing(2),\n marginBottom: theme.spacing(2),\n },\n };\n});\n\n// Url resolving logic from https://github.com/backstage/backstage/blob/master/packages/core-components/src/components/Link/Link.tsx\n\n/**\n * Returns the app base url that could be empty if the Config API is not properly implemented.\n * The only cases there would be no Config API are in tests and in storybook stories, and in those cases, it's unlikely that callers would rely on this subpath behavior.\n */\nexport const useBaseUrl = () => {\n try {\n const config = useApi(configApiRef);\n return config.getOptionalString('app.baseUrl');\n } catch {\n return undefined;\n }\n};\n\nexport const useBasePath = () => {\n // baseUrl can be specified as just a path\n const base = 'http://sample.dev';\n const url = useBaseUrl() ?? '/';\n const { pathname } = new URL(url, base);\n return trimEnd(pathname, '/');\n};\n\nconst userCache: Map<string, UserEntity> = new Map();\nconst dataLoaderFactory = (catalogApi: CatalogApi) =>\n new DataLoader(\n async (entityRefs: readonly string[]) => {\n const { items } = await catalogApi.getEntitiesByRefs({\n fields: [\n 'kind',\n 'metadata.name',\n 'metadata.namespace',\n 'spec.profile.displayName',\n 'spec.profile.picture',\n ],\n entityRefs: entityRefs as string[],\n });\n\n entityRefs.forEach((entityRef, index) => {\n userCache.set(entityRef, items[index] as UserEntity);\n });\n return items;\n },\n {\n name: 'EntityAuthorLoader',\n cacheMap: new Map(),\n maxBatchSize: 100,\n batchScheduleFn: callback => {\n setTimeout(callback, 50);\n },\n },\n );\n\nexport const useEntityAuthor = (\n entity: PostResponse | AnswerResponse | CollectionResponse | UserResponse,\n) => {\n const catalogApi = useApi(catalogApiRef);\n const identityApi = useApi(identityApiRef);\n const [name, setName] = React.useState<string | undefined>(undefined);\n const [user, setUser] = React.useState<UserEntity | null>(null);\n const [initials, setInitials] = React.useState<string | null>(null);\n const [currentUser, setCurrentUser] = React.useState<string | null>(null);\n const anonymous = 'anonymous' in entity ? entity.anonymous ?? false : false;\n let author =\n // eslint-disable-next-line no-nested-ternary\n 'author' in entity\n ? entity.author\n : 'userRef' in entity\n ? entity.userRef\n : entity.owner;\n if (!author.startsWith('user:')) {\n author = `user:${author}`;\n }\n\n const { primaryTitle: userName } = useEntityPresentation(author);\n\n useEffect(() => {\n if (anonymous) {\n return;\n }\n\n if (userCache.get(author)) {\n setUser(userCache.get(author) as UserEntity);\n return;\n }\n\n dataLoaderFactory(catalogApi)\n .load(author)\n .then(data => {\n if (data) {\n setUser(data as UserEntity);\n } else {\n setUser(null);\n }\n })\n .catch(() => {\n setUser(null);\n });\n }, [catalogApi, author, anonymous]);\n\n useEffect(() => {\n identityApi.getBackstageIdentity().then(res => {\n setCurrentUser(res.userEntityRef ?? 'user:default/guest');\n });\n }, [identityApi]);\n\n useEffect(() => {\n let displayName = userName;\n if (author === currentUser) {\n displayName = 'You';\n if (anonymous) {\n displayName += ' (anonymous)';\n }\n }\n setName(displayName);\n }, [author, anonymous, currentUser, userName]);\n\n useEffect(() => {\n const init = (name ?? '')\n .split(' ')\n .map(p => p[0])\n .join('')\n .substring(0, 2)\n .toUpperCase();\n setInitials(init);\n }, [name]);\n\n return { name, initials, user };\n};\n\nlet followedTags: string[] | undefined = undefined;\n\nexport const useTagsFollow = () => {\n const [tags, setTags] = React.useState<string[]>(followedTags ?? []);\n const [loading, setLoading] = React.useState(followedTags === undefined);\n const qetaApi = useApi(qetaApiRef);\n\n useEffect(() => {\n if (followedTags === undefined) {\n qetaApi.getFollowedTags().then(res => {\n followedTags = res.tags;\n setTags(res.tags);\n setLoading(false);\n });\n } else {\n setTags(followedTags);\n }\n }, [qetaApi]);\n\n const followTag = useCallback(\n (tag: string) => {\n qetaApi.followTag(tag).then(() => {\n setTags(prev => [...prev, tag]);\n followedTags?.push(tag);\n });\n },\n [qetaApi],\n );\n\n const unfollowTag = useCallback(\n (tag: string) => {\n qetaApi.unfollowTag(tag).then(() => {\n setTags(prev => prev.filter(t => t !== tag));\n followedTags = followedTags?.filter(t => t !== tag);\n });\n },\n [qetaApi],\n );\n\n const isFollowingTag = useCallback(\n (tag: string) => tags.includes(tag),\n [tags],\n );\n return {\n tags,\n followTag,\n unfollowTag,\n isFollowingTag,\n loading,\n };\n};\n\nlet followedEntities: string[] | undefined = undefined;\n\nexport const useEntityFollow = () => {\n const [entities, setEntities] = React.useState<string[]>(\n followedEntities ?? [],\n );\n const [loading, setLoading] = React.useState(followedEntities === undefined);\n const qetaApi = useApi(qetaApiRef);\n\n useEffect(() => {\n if (followedEntities === undefined) {\n qetaApi.getFollowedEntities().then(res => {\n followedEntities = res.entityRefs;\n setEntities(res.entityRefs);\n setLoading(false);\n });\n } else {\n setEntities(followedEntities);\n }\n }, [qetaApi]);\n\n const followEntity = useCallback(\n (entityRef: string) => {\n qetaApi.followEntity(entityRef).then(() => {\n setEntities(prev => [...prev, entityRef]);\n followedEntities?.push(entityRef);\n });\n },\n [qetaApi],\n );\n\n const unfollowEntity = useCallback(\n (entityRef: string) => {\n qetaApi.unfollowEntity(entityRef).then(() => {\n setEntities(prev => prev.filter(t => t !== entityRef));\n followedEntities = followedEntities?.filter(t => t !== entityRef);\n });\n },\n [qetaApi],\n );\n\n const isFollowingEntity = useCallback(\n (entityRef: string) => entities.includes(entityRef),\n [entities],\n );\n return { entities, followEntity, unfollowEntity, isFollowingEntity, loading };\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hooks.esm.js","sources":["../../src/utils/hooks.ts"],"sourcesContent":["import useAsync from 'react-use/lib/useAsync';\nimport {\n appThemeApiRef,\n configApiRef,\n IdentityApi,\n identityApiRef,\n useAnalytics,\n useApi,\n} from '@backstage/core-plugin-api';\nimport { makeStyles } from '@material-ui/core';\nimport { CatalogApi } from '@backstage/catalog-client';\nimport {\n catalogApiRef,\n useEntityPresentation,\n} from '@backstage/plugin-catalog-react';\nimport { trimEnd } from 'lodash';\nimport { useSearchParams } from 'react-router-dom';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { UserEntity } from '@backstage/catalog-model';\nimport {\n AnswerResponse,\n CollectionResponse,\n filterTags,\n PostResponse,\n PostType,\n QetaApi,\n QetaSignal,\n UserResponse,\n} from '@drodil/backstage-plugin-qeta-common';\nimport DataLoader from 'dataloader';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../translation';\nimport { qetaApiRef } from '../api';\nimport {\n FilterKey,\n filterKeys,\n Filters,\n} from '../components/FilterPanel/FilterPanel';\nimport useDebounce from 'react-use/lib/useDebounce';\nimport { getFiltersWithDateRange } from './utils';\nimport { useSignal } from '@backstage/plugin-signals-react';\nimport { useAsyncRetry } from 'react-use';\nimport { BackstageOverrides } from '@backstage/core-components';\n\nexport const useTranslation = () => {\n return useTranslationRef(qetaTranslationRef);\n};\n\nexport type PaginatedPostsProps = {\n type?: PostType;\n tags?: string[];\n author?: string;\n entity?: string;\n showFilters?: boolean;\n showTitle?: boolean;\n title?: string;\n favorite?: boolean;\n showAskButton?: boolean;\n showWriteButton?: boolean;\n showNoQuestionsBtn?: boolean;\n initialPageSize?: number;\n collectionId?: number;\n};\n\nexport function usePaginatedPosts(props: PaginatedPostsProps) {\n const { type, tags, author, entity, favorite, initialPageSize } = props;\n const analytics = useAnalytics();\n const [page, setPage] = React.useState(1);\n const [pageCount, setPageCount] = React.useState(1);\n const [postsPerPage, setPostsPerPage] = React.useState(initialPageSize ?? 10);\n const [showFilterPanel, setShowFilterPanel] = React.useState(false);\n const [searchParams, setSearchParams] = useSearchParams();\n const [searchQuery, setSearchQuery] = React.useState('');\n const [filters, setFilters] = React.useState<Filters>({\n order: 'desc',\n orderBy: 'created',\n noAnswers: 'false',\n noCorrectAnswer: 'false',\n noVotes: 'false',\n searchQuery: '',\n entity: entity ?? '',\n tags: tags ?? [],\n dateRange: '',\n collectionId: props.collectionId,\n });\n\n const onPageChange = (value: number) => {\n setPage(value);\n setSearchParams(prev => {\n const newValue = prev;\n newValue.set('page', String(value));\n return newValue;\n });\n };\n\n const loadNextPage = () => {\n setPage(prev => prev + 1);\n };\n\n const onFilterChange = (key: FilterKey, value: string | string[]) => {\n if (filters[key] === value) {\n return;\n }\n\n setPage(1);\n setFilters({ ...filters, ...{ [key]: value } });\n setSearchParams(prev => {\n const newValue = prev;\n if (!value || value === 'false') {\n newValue.delete(key);\n } else if (Array.isArray(value)) {\n if (value.length === 0) {\n newValue.delete(key);\n } else {\n newValue.set(key, value.join(','));\n }\n } else if (value.length > 0) {\n newValue.set(key, value);\n } else {\n newValue.delete(key);\n }\n return newValue;\n });\n };\n\n const onSearchQueryChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n onPageChange(1);\n if (event.target.value) {\n analytics.captureEvent('qeta_search', event.target.value);\n }\n setSearchQuery(event.target.value);\n };\n\n useDebounce(\n () => {\n if (filters.searchQuery !== searchQuery) {\n setFilters({ ...filters, searchQuery: searchQuery });\n }\n },\n 400,\n [searchQuery],\n );\n\n useEffect(() => {\n let filtersApplied = false;\n searchParams.forEach((value, key) => {\n try {\n if (key === 'page') {\n const pv = Number.parseInt(value, 10);\n if (pv > 0) {\n setPage(pv);\n } else {\n setPage(1);\n }\n } else if (key === 'postsPerPage') {\n const qpp = Number.parseInt(value, 10);\n if (qpp > 0) setPostsPerPage(qpp);\n } else if (filterKeys.includes(key as FilterKey)) {\n filtersApplied = true;\n if (key === 'tags') {\n filters.tags = filterTags(value) ?? [];\n } else {\n (filters as any)[key] = value;\n }\n }\n } catch (_e) {\n // NOOP\n }\n });\n setFilters(filters);\n if (filtersApplied) {\n setShowFilterPanel(true);\n }\n }, [searchParams, filters]);\n\n const {\n value: response,\n loading,\n error,\n } = useQetaApi(\n api => {\n return api.getPosts({\n type,\n limit: postsPerPage,\n offset: (page - 1) * postsPerPage,\n includeEntities: true,\n author,\n favorite,\n ...(getFiltersWithDateRange(filters) as any),\n });\n },\n [type, page, filters, postsPerPage],\n );\n\n useEffect(() => {\n if (response) {\n setPageCount(Math.ceil(response.total / postsPerPage));\n }\n }, [response, postsPerPage]);\n\n const onPageSizeChange = (value: number) => {\n if (response) {\n let newPage = page;\n while (newPage * value > response.total) {\n newPage -= 1;\n }\n onPageChange(Math.max(1, newPage));\n }\n setPostsPerPage(value);\n setSearchParams(prev => {\n const newValue = prev;\n newValue.set('postsPerPage', String(value));\n return newValue;\n });\n };\n\n return {\n page,\n setPage,\n postsPerPage,\n setPostsPerPage,\n showFilterPanel,\n setShowFilterPanel,\n searchParams,\n setSearchParams,\n searchQuery,\n setSearchQuery,\n filters,\n setFilters,\n onPageChange,\n onPageSizeChange,\n onFilterChange,\n onSearchQueryChange,\n response,\n loading,\n error,\n loadNextPage,\n pageCount,\n };\n}\n\nexport function useVoting(resp: PostResponse | AnswerResponse) {\n const [entity, setEntity] = React.useState<PostResponse | AnswerResponse>(\n resp,\n );\n const [ownVote, setOwnVote] = React.useState(entity.ownVote ?? 0);\n const [correctAnswer, setCorrectAnswer] = useState(\n 'postId' in entity ? entity.correct : false,\n );\n const [score, setScore] = useState(entity.score);\n const analytics = useAnalytics();\n const qetaApi = useApi(qetaApiRef);\n const { t } = useTranslation();\n\n const isQuestion = 'title' in entity;\n const own = entity.own ?? false;\n\n const { lastSignal } = useSignal<QetaSignal>(\n isQuestion ? `qeta:question_${entity.id}` : `qeta:answer_${entity.id}`,\n );\n\n useEffect(() => {\n if (entity) {\n setScore(entity.score);\n }\n }, [entity]);\n\n useEffect(() => {\n if (\n lastSignal?.type === 'post_stats' ||\n lastSignal?.type === 'answer_stats'\n ) {\n setCorrectAnswer(lastSignal.correctAnswer);\n setScore(lastSignal.score);\n }\n }, [lastSignal]);\n\n const voteUp = () => {\n if (isQuestion) {\n qetaApi.votePostUp(entity.id).then(response => {\n setOwnVote(1);\n analytics.captureEvent('vote', 'question', { value: 1 });\n setEntity(response);\n });\n } else if ('questionId' in entity) {\n qetaApi.voteAnswerUp(entity.postId, entity.id).then(response => {\n setOwnVote(1);\n analytics.captureEvent('vote', 'answer', { value: 1 });\n setEntity(response);\n });\n }\n };\n\n const voteDown = () => {\n if (isQuestion) {\n qetaApi.votePostDown(entity.id).then(response => {\n setOwnVote(-1);\n analytics.captureEvent('vote', 'question', { value: -1 });\n setEntity(response);\n });\n } else if ('questionId' in entity) {\n qetaApi.voteAnswerDown(entity.postId, entity.id).then(response => {\n setOwnVote(-1);\n analytics.captureEvent('vote', 'answer', { value: -1 });\n setEntity(response);\n });\n }\n };\n\n let correctTooltip: string = correctAnswer\n ? t('voteButtons.answer.markIncorrect')\n : t('voteButtons.answer.markCorrect');\n if (!entity?.own) {\n correctTooltip = correctAnswer ? t('voteButtons.answer.marked') : '';\n }\n\n let voteUpTooltip: string = isQuestion\n ? t('voteButtons.question.good')\n : t('voteButtons.answer.good');\n if (own) {\n voteUpTooltip = isQuestion\n ? t('voteButtons.question.own')\n : t('voteButtons.answer.own');\n }\n\n let voteDownTooltip: string = isQuestion\n ? t('voteButtons.question.bad')\n : t('voteButtons.answer.bad');\n if (own) {\n voteDownTooltip = voteUpTooltip;\n }\n\n const toggleCorrectAnswer = () => {\n if (!('postId' in entity)) {\n return;\n }\n if (correctAnswer) {\n qetaApi.markAnswerIncorrect(entity.postId, entity.id).then(response => {\n if (response) {\n setCorrectAnswer(false);\n }\n });\n } else {\n qetaApi.markAnswerCorrect(entity.postId, entity.id).then(response => {\n if (response) {\n setCorrectAnswer(true);\n }\n });\n }\n };\n\n return {\n entity,\n ownVote,\n correctAnswer,\n score,\n voteUp,\n voteDown,\n toggleCorrectAnswer,\n voteUpTooltip,\n voteDownTooltip,\n correctTooltip,\n };\n}\n\nexport function useQetaApi<T>(\n f: (api: QetaApi) => Promise<T>,\n deps: any[] = [],\n) {\n const qetaApi = useApi(qetaApiRef);\n\n return useAsyncRetry(async () => {\n return await f(qetaApi);\n }, deps);\n}\n\nexport function useCatalogApi<T>(\n f: (api: CatalogApi) => Promise<T>,\n deps: any[] = [],\n) {\n const catalogApi = useApi(catalogApiRef);\n\n return useAsync(async () => {\n return await f(catalogApi);\n }, deps);\n}\n\nexport function useIdentityApi<T>(\n f: (api: IdentityApi) => Promise<T>,\n deps: any[] = [],\n) {\n const identityApi = useApi(identityApiRef);\n\n return useAsync(async () => {\n return await f(identityApi);\n }, deps);\n}\n\nexport function useEntityQueryParameter(entity?: string) {\n const [searchParams] = useSearchParams();\n const [entityRef, setEntityRef] = React.useState<string | undefined>(entity);\n\n useEffect(() => {\n setEntityRef(searchParams.get('entity') ?? undefined);\n }, [searchParams, setEntityRef]);\n\n return entityRef;\n}\n\nexport function useIsDarkTheme() {\n const appThemeApi = useApi(appThemeApiRef);\n const themes = appThemeApi.getInstalledThemes();\n const theme = useMemo(() => appThemeApi.getActiveThemeId(), [appThemeApi]);\n return Boolean(themes.find(t => t.id === theme)?.variant === 'dark');\n}\n\nexport const useStyles = makeStyles(theme => {\n return {\n leftMenu: {\n top: '0',\n width: '165px',\n },\n selectedMenuItem: {\n color: theme.palette.primary.contrastText,\n backgroundColor: theme.palette.primary.light,\n borderRadius: theme.shape.borderRadius,\n '&:hover': {\n backgroundColor: theme.palette.primary.dark,\n },\n '& svg': {\n color: theme.palette.primary.contrastText,\n },\n },\n nonSelectedMenuItem: {\n backgroundColor: 'initial',\n },\n headerImage: {\n width: '100%',\n height: '250px',\n objectFit: 'cover',\n },\n markdownEditor: {\n backgroundColor: 'initial',\n color: theme.palette.text.primary,\n border: `1px solid ${theme.palette.action.disabled}`,\n borderRadius: theme.shape.borderRadius,\n '&:hover': {\n borderColor: theme.palette.action.active,\n },\n '&:focus-within': {\n borderColor: theme.palette.primary.main,\n },\n '& .mde-header': {\n backgroundColor: 'initial',\n color: theme.palette.text.primary,\n borderBottom: `1px solid ${theme.palette.action.selected}`,\n '& .mde-tabs button, .mde-header-item > button': {\n color: `${theme.palette.text.primary} !important`,\n },\n },\n '& .mde-preview-content': {\n padding: '10px',\n },\n '& .mde-text, .mde-preview': {\n fontSize: theme.typography.body1.fontSize,\n fontFamily: theme.typography.body1.fontFamily,\n lineHeight: theme.typography.body1.lineHeight,\n },\n '& .mde-text': {\n backgroundColor: 'initial',\n color: theme.palette.text.primary,\n outline: 'none',\n },\n '& .image-tip': {\n color: theme.palette.text.primary,\n backgroundColor: 'initial',\n },\n },\n markdownEditorError: {\n border: `1px solid ${theme.palette.error.main} !important`,\n },\n markdownContent: {\n '& *': {\n wordBreak: 'break-word',\n },\n '&.inline': {\n display: 'inline-block',\n },\n '& > :first-child': {\n marginTop: '0px !important',\n },\n '& > :last-child': {\n marginBottom: '0px !important',\n },\n ...(theme.overrides as BackstageOverrides)?.BackstageMarkdownContent,\n },\n successColor: {\n color: theme.palette.success.main,\n },\n questionDivider: {\n marginTop: theme.spacing(2),\n marginBottom: theme.spacing(2),\n },\n questionCard: {\n marginBottom: theme.spacing(1),\n position: 'relative',\n },\n questionCardVote: {\n textAlign: 'center',\n width: '32px',\n marginRight: '20px',\n marginLeft: '5px',\n display: 'inline-block',\n verticalAlign: 'top',\n },\n questionCardContent: {\n minHeight: '160px',\n },\n questionListItem: {\n padding: '0.7rem',\n paddingBottom: '1.4rem',\n },\n questionListItemStats: {\n width: '70px',\n textAlign: 'right',\n marginRight: '5px',\n display: 'inline-block',\n verticalAlign: 'top',\n },\n questionListItemContent: {\n display: 'inline-block',\n width: 'calc(100% - 80px)',\n },\n questionListItemAuthor: {\n display: 'inline',\n float: 'right',\n },\n questionListItemAvatar: {\n display: 'inline-flex !important',\n marginRight: '0.25rem',\n fontSize: '1rem',\n maxWidth: '1rem',\n maxHeight: '1rem',\n },\n answerCardContent: {\n display: 'inline-block',\n width: 'calc(100% - 70px)',\n },\n questionCardAuthor: {\n padding: theme.spacing(1),\n float: 'right',\n maxWidth: '200px',\n border: `1px solid ${theme.palette.action.selected}`,\n '& .avatar': {\n width: theme.spacing(3),\n height: theme.spacing(3),\n fontSize: '1rem',\n },\n },\n questionListPagination: {\n marginTop: theme.spacing(2),\n },\n postButton: {\n marginTop: theme.spacing(1),\n marginBottom: theme.spacing(1),\n },\n questionsPerPageInput: {\n paddingTop: '10px',\n },\n questionsPerPage: {\n marginRight: theme.spacing(3),\n },\n postHighlightListContainer: {\n width: '100%',\n backgroundColor: theme.palette.background.paper,\n border: `1px solid ${theme.palette.action.selected}`,\n borderRadius: theme.shape.borderRadius,\n '&:not(:first-child)': {\n marginTop: theme.spacing(2),\n },\n },\n postHighlightList: {\n paddingBottom: '0px',\n '& p': {\n marginTop: '0',\n marginBottom: '0',\n },\n },\n filterPanel: {\n border: `1px solid ${theme.palette.action.selected}`,\n borderRadius: theme.shape.borderRadius,\n padding: theme.spacing(3),\n },\n questionCardMetadata: {\n marginTop: theme.spacing(3),\n },\n marginRight: {\n marginRight: theme.spacing(1),\n },\n marginLeft: {\n marginLeft: theme.spacing(1),\n },\n questionCardActions: {\n marginTop: theme.spacing(2),\n '& a': {\n marginRight: theme.spacing(1),\n },\n },\n noPadding: {\n padding: `0 !important`,\n },\n menuIcon: {\n minWidth: '26px',\n },\n deleteModal: {\n position: 'absolute',\n top: '20%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n width: 400,\n backgroundColor: theme.palette.background.default,\n border: `1px solid ${theme.palette.action.selected}`,\n borderRadius: theme.shape.borderRadius,\n padding: theme.spacing(2),\n '& button': {\n marginTop: theme.spacing(2),\n float: 'right',\n },\n },\n authorLink: {\n textOverflow: 'ellipsis',\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n },\n highlight: {\n animation: '$highlight 2s',\n },\n '@keyframes highlight': {\n '0%': {\n boxShadow: `0px 0px 0px 3px ${theme.palette.secondary.light}`,\n },\n '100%': {\n boxShadow: 'none',\n },\n },\n dateFilter: {\n minWidth: '200px',\n marginTop: theme.spacing(2),\n marginBottom: theme.spacing(2),\n },\n };\n});\n\n// Url resolving logic from https://github.com/backstage/backstage/blob/master/packages/core-components/src/components/Link/Link.tsx\n\n/**\n * Returns the app base url that could be empty if the Config API is not properly implemented.\n * The only cases there would be no Config API are in tests and in storybook stories, and in those cases, it's unlikely that callers would rely on this subpath behavior.\n */\nexport const useBaseUrl = () => {\n try {\n const config = useApi(configApiRef);\n return config.getOptionalString('app.baseUrl');\n } catch {\n return undefined;\n }\n};\n\nexport const useBasePath = () => {\n // baseUrl can be specified as just a path\n const base = 'http://sample.dev';\n const url = useBaseUrl() ?? '/';\n const { pathname } = new URL(url, base);\n return trimEnd(pathname, '/');\n};\n\nconst userCache: Map<string, UserEntity> = new Map();\nconst dataLoaderFactory = (catalogApi: CatalogApi) =>\n new DataLoader(\n async (entityRefs: readonly string[]) => {\n const { items } = await catalogApi.getEntitiesByRefs({\n fields: [\n 'kind',\n 'metadata.name',\n 'metadata.namespace',\n 'spec.profile.displayName',\n 'spec.profile.picture',\n ],\n entityRefs: entityRefs as string[],\n });\n\n entityRefs.forEach((entityRef, index) => {\n userCache.set(entityRef, items[index] as UserEntity);\n });\n return items;\n },\n {\n name: 'EntityAuthorLoader',\n cacheMap: new Map(),\n maxBatchSize: 100,\n batchScheduleFn: callback => {\n setTimeout(callback, 50);\n },\n },\n );\n\nexport const useEntityAuthor = (\n entity: PostResponse | AnswerResponse | CollectionResponse | UserResponse,\n) => {\n const catalogApi = useApi(catalogApiRef);\n const identityApi = useApi(identityApiRef);\n const [name, setName] = React.useState<string | undefined>(undefined);\n const [user, setUser] = React.useState<UserEntity | null>(null);\n const [initials, setInitials] = React.useState<string | null>(null);\n const [currentUser, setCurrentUser] = React.useState<string | null>(null);\n const anonymous = 'anonymous' in entity ? entity.anonymous ?? false : false;\n let author =\n // eslint-disable-next-line no-nested-ternary\n 'author' in entity\n ? entity.author\n : 'userRef' in entity\n ? entity.userRef\n : entity.owner;\n if (!author.startsWith('user:')) {\n author = `user:${author}`;\n }\n\n const { primaryTitle: userName } = useEntityPresentation(author);\n\n useEffect(() => {\n if (anonymous) {\n return;\n }\n\n if (userCache.get(author)) {\n setUser(userCache.get(author) as UserEntity);\n return;\n }\n\n dataLoaderFactory(catalogApi)\n .load(author)\n .then(data => {\n if (data) {\n setUser(data as UserEntity);\n } else {\n setUser(null);\n }\n })\n .catch(() => {\n setUser(null);\n });\n }, [catalogApi, author, anonymous]);\n\n useEffect(() => {\n identityApi.getBackstageIdentity().then(res => {\n setCurrentUser(res.userEntityRef ?? 'user:default/guest');\n });\n }, [identityApi]);\n\n useEffect(() => {\n let displayName = userName;\n if (author === currentUser) {\n displayName = 'You';\n if (anonymous) {\n displayName += ' (anonymous)';\n }\n }\n setName(displayName);\n }, [author, anonymous, currentUser, userName]);\n\n useEffect(() => {\n const init = (name ?? '')\n .split(' ')\n .map(p => p[0])\n .join('')\n .substring(0, 2)\n .toUpperCase();\n setInitials(init);\n }, [name]);\n\n return { name, initials, user };\n};\n\nlet followedTags: string[] | undefined = undefined;\n\nexport const useTagsFollow = () => {\n const [tags, setTags] = React.useState<string[]>(followedTags ?? []);\n const [loading, setLoading] = React.useState(followedTags === undefined);\n const qetaApi = useApi(qetaApiRef);\n\n useEffect(() => {\n if (followedTags === undefined) {\n qetaApi.getFollowedTags().then(res => {\n followedTags = res.tags;\n setTags(res.tags);\n setLoading(false);\n });\n } else {\n setTags(followedTags);\n }\n }, [qetaApi]);\n\n const followTag = useCallback(\n (tag: string) => {\n qetaApi.followTag(tag).then(() => {\n setTags(prev => [...prev, tag]);\n followedTags?.push(tag);\n });\n },\n [qetaApi],\n );\n\n const unfollowTag = useCallback(\n (tag: string) => {\n qetaApi.unfollowTag(tag).then(() => {\n setTags(prev => prev.filter(t => t !== tag));\n followedTags = followedTags?.filter(t => t !== tag);\n });\n },\n [qetaApi],\n );\n\n const isFollowingTag = useCallback(\n (tag: string) => tags.includes(tag),\n [tags],\n );\n return {\n tags,\n followTag,\n unfollowTag,\n isFollowingTag,\n loading,\n };\n};\n\nlet followedEntities: string[] | undefined = undefined;\n\nexport const useEntityFollow = () => {\n const [entities, setEntities] = React.useState<string[]>(\n followedEntities ?? [],\n );\n const [loading, setLoading] = React.useState(followedEntities === undefined);\n const qetaApi = useApi(qetaApiRef);\n\n useEffect(() => {\n if (followedEntities === undefined) {\n qetaApi.getFollowedEntities().then(res => {\n followedEntities = res.entityRefs;\n setEntities(res.entityRefs);\n setLoading(false);\n });\n } else {\n setEntities(followedEntities);\n }\n }, [qetaApi]);\n\n const followEntity = useCallback(\n (entityRef: string) => {\n qetaApi.followEntity(entityRef).then(() => {\n setEntities(prev => [...prev, entityRef]);\n followedEntities?.push(entityRef);\n });\n },\n [qetaApi],\n );\n\n const unfollowEntity = useCallback(\n (entityRef: string) => {\n qetaApi.unfollowEntity(entityRef).then(() => {\n setEntities(prev => prev.filter(t => t !== entityRef));\n followedEntities = followedEntities?.filter(t => t !== entityRef);\n });\n },\n [qetaApi],\n );\n\n const isFollowingEntity = useCallback(\n (entityRef: string) => entities.includes(entityRef),\n [entities],\n );\n return { entities, followEntity, unfollowEntity, isFollowingEntity, loading };\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AA4CO,MAAM,iBAAiB,MAAM;AAClC,EAAA,OAAO,kBAAkB,kBAAkB,CAAA,CAAA;AAC7C,EAAA;AAkBO,SAAS,kBAAkB,KAA4B,EAAA;AAC5D,EAAA,MAAM,EAAE,IAAM,EAAA,IAAA,EAAM,QAAQ,MAAQ,EAAA,QAAA,EAAU,iBAAoB,GAAA,KAAA,CAAA;AAClE,EAAA,MAAM,YAAY,YAAa,EAAA,CAAA;AAC/B,EAAA,MAAM,CAAC,IAAM,EAAA,OAAO,CAAI,GAAA,KAAA,CAAM,SAAS,CAAC,CAAA,CAAA;AACxC,EAAA,MAAM,CAAC,SAAW,EAAA,YAAY,CAAI,GAAA,KAAA,CAAM,SAAS,CAAC,CAAA,CAAA;AAClD,EAAA,MAAM,CAAC,YAAc,EAAA,eAAe,IAAI,KAAM,CAAA,QAAA,CAAS,mBAAmB,EAAE,CAAA,CAAA;AAC5E,EAAA,MAAM,CAAC,eAAiB,EAAA,kBAAkB,CAAI,GAAA,KAAA,CAAM,SAAS,KAAK,CAAA,CAAA;AAClE,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,eAAgB,EAAA,CAAA;AACxD,EAAA,MAAM,CAAC,WAAa,EAAA,cAAc,CAAI,GAAA,KAAA,CAAM,SAAS,EAAE,CAAA,CAAA;AACvD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,MAAM,QAAkB,CAAA;AAAA,IACpD,KAAO,EAAA,MAAA;AAAA,IACP,OAAS,EAAA,SAAA;AAAA,IACT,SAAW,EAAA,OAAA;AAAA,IACX,eAAiB,EAAA,OAAA;AAAA,IACjB,OAAS,EAAA,OAAA;AAAA,IACT,WAAa,EAAA,EAAA;AAAA,IACb,QAAQ,MAAU,IAAA,EAAA;AAAA,IAClB,IAAA,EAAM,QAAQ,EAAC;AAAA,IACf,SAAW,EAAA,EAAA;AAAA,IACX,cAAc,KAAM,CAAA,YAAA;AAAA,GACrB,CAAA,CAAA;AAED,EAAM,MAAA,YAAA,GAAe,CAAC,KAAkB,KAAA;AACtC,IAAA,OAAA,CAAQ,KAAK,CAAA,CAAA;AACb,IAAA,eAAA,CAAgB,CAAQ,IAAA,KAAA;AACtB,MAAA,MAAM,QAAW,GAAA,IAAA,CAAA;AACjB,MAAA,QAAA,CAAS,GAAI,CAAA,MAAA,EAAQ,MAAO,CAAA,KAAK,CAAC,CAAA,CAAA;AAClC,MAAO,OAAA,QAAA,CAAA;AAAA,KACR,CAAA,CAAA;AAAA,GACH,CAAA;AAEA,EAAA,MAAM,eAAe,MAAM;AACzB,IAAQ,OAAA,CAAA,CAAA,IAAA,KAAQ,OAAO,CAAC,CAAA,CAAA;AAAA,GAC1B,CAAA;AAEA,EAAM,MAAA,cAAA,GAAiB,CAAC,GAAA,EAAgB,KAA6B,KAAA;AACnE,IAAI,IAAA,OAAA,CAAQ,GAAG,CAAA,KAAM,KAAO,EAAA;AAC1B,MAAA,OAAA;AAAA,KACF;AAEA,IAAA,OAAA,CAAQ,CAAC,CAAA,CAAA;AACT,IAAW,UAAA,CAAA,EAAE,GAAG,OAAA,EAAS,GAAG,EAAE,CAAC,GAAG,GAAG,KAAM,EAAA,EAAG,CAAA,CAAA;AAC9C,IAAA,eAAA,CAAgB,CAAQ,IAAA,KAAA;AACtB,MAAA,MAAM,QAAW,GAAA,IAAA,CAAA;AACjB,MAAI,IAAA,CAAC,KAAS,IAAA,KAAA,KAAU,OAAS,EAAA;AAC/B,QAAA,QAAA,CAAS,OAAO,GAAG,CAAA,CAAA;AAAA,OACV,MAAA,IAAA,KAAA,CAAM,OAAQ,CAAA,KAAK,CAAG,EAAA;AAC/B,QAAI,IAAA,KAAA,CAAM,WAAW,CAAG,EAAA;AACtB,UAAA,QAAA,CAAS,OAAO,GAAG,CAAA,CAAA;AAAA,SACd,MAAA;AACL,UAAA,QAAA,CAAS,GAAI,CAAA,GAAA,EAAK,KAAM,CAAA,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AAAA,SACnC;AAAA,OACF,MAAA,IAAW,KAAM,CAAA,MAAA,GAAS,CAAG,EAAA;AAC3B,QAAS,QAAA,CAAA,GAAA,CAAI,KAAK,KAAK,CAAA,CAAA;AAAA,OAClB,MAAA;AACL,QAAA,QAAA,CAAS,OAAO,GAAG,CAAA,CAAA;AAAA,OACrB;AACA,MAAO,OAAA,QAAA,CAAA;AAAA,KACR,CAAA,CAAA;AAAA,GACH,CAAA;AAEA,EAAM,MAAA,mBAAA,GAAsB,CAAC,KAA+C,KAAA;AAC1E,IAAA,YAAA,CAAa,CAAC,CAAA,CAAA;AACd,IAAI,IAAA,KAAA,CAAM,OAAO,KAAO,EAAA;AACtB,MAAA,SAAA,CAAU,YAAa,CAAA,aAAA,EAAe,KAAM,CAAA,MAAA,CAAO,KAAK,CAAA,CAAA;AAAA,KAC1D;AACA,IAAe,cAAA,CAAA,KAAA,CAAM,OAAO,KAAK,CAAA,CAAA;AAAA,GACnC,CAAA;AAEA,EAAA,WAAA;AAAA,IACE,MAAM;AACJ,MAAI,IAAA,OAAA,CAAQ,gBAAgB,WAAa,EAAA;AACvC,QAAA,UAAA,CAAW,EAAE,GAAG,OAAS,EAAA,WAAA,EAA0B,CAAA,CAAA;AAAA,OACrD;AAAA,KACF;AAAA,IACA,GAAA;AAAA,IACA,CAAC,WAAW,CAAA;AAAA,GACd,CAAA;AAEA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,cAAiB,GAAA,KAAA,CAAA;AACrB,IAAa,YAAA,CAAA,OAAA,CAAQ,CAAC,KAAA,EAAO,GAAQ,KAAA;AACnC,MAAI,IAAA;AACF,QAAA,IAAI,QAAQ,MAAQ,EAAA;AAClB,UAAA,MAAM,EAAK,GAAA,MAAA,CAAO,QAAS,CAAA,KAAA,EAAO,EAAE,CAAA,CAAA;AACpC,UAAA,IAAI,KAAK,CAAG,EAAA;AACV,YAAA,OAAA,CAAQ,EAAE,CAAA,CAAA;AAAA,WACL,MAAA;AACL,YAAA,OAAA,CAAQ,CAAC,CAAA,CAAA;AAAA,WACX;AAAA,SACF,MAAA,IAAW,QAAQ,cAAgB,EAAA;AACjC,UAAA,MAAM,GAAM,GAAA,MAAA,CAAO,QAAS,CAAA,KAAA,EAAO,EAAE,CAAA,CAAA;AACrC,UAAI,IAAA,GAAA,GAAM,CAAG,EAAA,eAAA,CAAgB,GAAG,CAAA,CAAA;AAAA,SACvB,MAAA,IAAA,UAAA,CAAW,QAAS,CAAA,GAAgB,CAAG,EAAA;AAChD,UAAiB,cAAA,GAAA,IAAA,CAAA;AACjB,UAAA,IAAI,QAAQ,MAAQ,EAAA;AAClB,YAAA,OAAA,CAAQ,IAAO,GAAA,UAAA,CAAW,KAAK,CAAA,IAAK,EAAC,CAAA;AAAA,WAChC,MAAA;AACL,YAAC,OAAA,CAAgB,GAAG,CAAI,GAAA,KAAA,CAAA;AAAA,WAC1B;AAAA,SACF;AAAA,eACO,EAAI,EAAA;AAAA,OAEb;AAAA,KACD,CAAA,CAAA;AACD,IAAA,UAAA,CAAW,OAAO,CAAA,CAAA;AAClB,IAAA,IAAI,cAAgB,EAAA;AAClB,MAAA,kBAAA,CAAmB,IAAI,CAAA,CAAA;AAAA,KACzB;AAAA,GACC,EAAA,CAAC,YAAc,EAAA,OAAO,CAAC,CAAA,CAAA;AAE1B,EAAM,MAAA;AAAA,IACJ,KAAO,EAAA,QAAA;AAAA,IACP,OAAA;AAAA,IACA,KAAA;AAAA,GACE,GAAA,UAAA;AAAA,IACF,CAAO,GAAA,KAAA;AACL,MAAA,OAAO,IAAI,QAAS,CAAA;AAAA,QAClB,IAAA;AAAA,QACA,KAAO,EAAA,YAAA;AAAA,QACP,MAAA,EAAA,CAAS,OAAO,CAAK,IAAA,YAAA;AAAA,QACrB,eAAiB,EAAA,IAAA;AAAA,QACjB,MAAA;AAAA,QACA,QAAA;AAAA,QACA,GAAI,wBAAwB,OAAO,CAAA;AAAA,OACpC,CAAA,CAAA;AAAA,KACH;AAAA,IACA,CAAC,IAAA,EAAM,IAAM,EAAA,OAAA,EAAS,YAAY,CAAA;AAAA,GACpC,CAAA;AAEA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,QAAU,EAAA;AACZ,MAAA,YAAA,CAAa,IAAK,CAAA,IAAA,CAAK,QAAS,CAAA,KAAA,GAAQ,YAAY,CAAC,CAAA,CAAA;AAAA,KACvD;AAAA,GACC,EAAA,CAAC,QAAU,EAAA,YAAY,CAAC,CAAA,CAAA;AAE3B,EAAM,MAAA,gBAAA,GAAmB,CAAC,KAAkB,KAAA;AAC1C,IAAA,IAAI,QAAU,EAAA;AACZ,MAAA,IAAI,OAAU,GAAA,IAAA,CAAA;AACd,MAAO,OAAA,OAAA,GAAU,KAAQ,GAAA,QAAA,CAAS,KAAO,EAAA;AACvC,QAAW,OAAA,IAAA,CAAA,CAAA;AAAA,OACb;AACA,MAAA,YAAA,CAAa,IAAK,CAAA,GAAA,CAAI,CAAG,EAAA,OAAO,CAAC,CAAA,CAAA;AAAA,KACnC;AACA,IAAA,eAAA,CAAgB,KAAK,CAAA,CAAA;AACrB,IAAA,eAAA,CAAgB,CAAQ,IAAA,KAAA;AACtB,MAAA,MAAM,QAAW,GAAA,IAAA,CAAA;AACjB,MAAA,QAAA,CAAS,GAAI,CAAA,cAAA,EAAgB,MAAO,CAAA,KAAK,CAAC,CAAA,CAAA;AAC1C,MAAO,OAAA,QAAA,CAAA;AAAA,KACR,CAAA,CAAA;AAAA,GACH,CAAA;AAEA,EAAO,OAAA;AAAA,IACL,IAAA;AAAA,IACA,OAAA;AAAA,IACA,YAAA;AAAA,IACA,eAAA;AAAA,IACA,eAAA;AAAA,IACA,kBAAA;AAAA,IACA,YAAA;AAAA,IACA,eAAA;AAAA,IACA,WAAA;AAAA,IACA,cAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA;AAAA,IACA,YAAA;AAAA,IACA,gBAAA;AAAA,IACA,cAAA;AAAA,IACA,mBAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,YAAA;AAAA,IACA,SAAA;AAAA,GACF,CAAA;AACF,CAAA;AAEO,SAAS,UAAU,IAAqC,EAAA;AAC7D,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,KAAM,CAAA,QAAA;AAAA,IAChC,IAAA;AAAA,GACF,CAAA;AACA,EAAM,MAAA,CAAC,SAAS,UAAU,CAAA,GAAI,MAAM,QAAS,CAAA,MAAA,CAAO,WAAW,CAAC,CAAA,CAAA;AAChE,EAAM,MAAA,CAAC,aAAe,EAAA,gBAAgB,CAAI,GAAA,QAAA;AAAA,IACxC,QAAA,IAAY,MAAS,GAAA,MAAA,CAAO,OAAU,GAAA,KAAA;AAAA,GACxC,CAAA;AACA,EAAA,MAAM,CAAC,KAAO,EAAA,QAAQ,CAAI,GAAA,QAAA,CAAS,OAAO,KAAK,CAAA,CAAA;AAC/C,EAAA,MAAM,YAAY,YAAa,EAAA,CAAA;AAC/B,EAAM,MAAA,OAAA,GAAU,OAAO,UAAU,CAAA,CAAA;AACjC,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,cAAe,EAAA,CAAA;AAE7B,EAAA,MAAM,aAAa,OAAW,IAAA,MAAA,CAAA;AAC9B,EAAM,MAAA,GAAA,GAAM,OAAO,GAAO,IAAA,KAAA,CAAA;AAE1B,EAAM,MAAA,EAAE,YAAe,GAAA,SAAA;AAAA,IACrB,aAAa,CAAiB,cAAA,EAAA,MAAA,CAAO,EAAE,CAAK,CAAA,GAAA,CAAA,YAAA,EAAe,OAAO,EAAE,CAAA,CAAA;AAAA,GACtE,CAAA;AAEA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,MAAQ,EAAA;AACV,MAAA,QAAA,CAAS,OAAO,KAAK,CAAA,CAAA;AAAA,KACvB;AAAA,GACF,EAAG,CAAC,MAAM,CAAC,CAAA,CAAA;AAEX,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IACE,UAAY,EAAA,IAAA,KAAS,YACrB,IAAA,UAAA,EAAY,SAAS,cACrB,EAAA;AACA,MAAA,gBAAA,CAAiB,WAAW,aAAa,CAAA,CAAA;AACzC,MAAA,QAAA,CAAS,WAAW,KAAK,CAAA,CAAA;AAAA,KAC3B;AAAA,GACF,EAAG,CAAC,UAAU,CAAC,CAAA,CAAA;AAEf,EAAA,MAAM,SAAS,MAAM;AACnB,IAAA,IAAI,UAAY,EAAA;AACd,MAAA,OAAA,CAAQ,UAAW,CAAA,MAAA,CAAO,EAAE,CAAA,CAAE,KAAK,CAAY,QAAA,KAAA;AAC7C,QAAA,UAAA,CAAW,CAAC,CAAA,CAAA;AACZ,QAAA,SAAA,CAAU,aAAa,MAAQ,EAAA,UAAA,EAAY,EAAE,KAAA,EAAO,GAAG,CAAA,CAAA;AACvD,QAAA,SAAA,CAAU,QAAQ,CAAA,CAAA;AAAA,OACnB,CAAA,CAAA;AAAA,KACH,MAAA,IAAW,gBAAgB,MAAQ,EAAA;AACjC,MAAA,OAAA,CAAQ,aAAa,MAAO,CAAA,MAAA,EAAQ,OAAO,EAAE,CAAA,CAAE,KAAK,CAAY,QAAA,KAAA;AAC9D,QAAA,UAAA,CAAW,CAAC,CAAA,CAAA;AACZ,QAAA,SAAA,CAAU,aAAa,MAAQ,EAAA,QAAA,EAAU,EAAE,KAAA,EAAO,GAAG,CAAA,CAAA;AACrD,QAAA,SAAA,CAAU,QAAQ,CAAA,CAAA;AAAA,OACnB,CAAA,CAAA;AAAA,KACH;AAAA,GACF,CAAA;AAEA,EAAA,MAAM,WAAW,MAAM;AACrB,IAAA,IAAI,UAAY,EAAA;AACd,MAAA,OAAA,CAAQ,YAAa,CAAA,MAAA,CAAO,EAAE,CAAA,CAAE,KAAK,CAAY,QAAA,KAAA;AAC/C,QAAA,UAAA,CAAW,CAAE,CAAA,CAAA,CAAA;AACb,QAAA,SAAA,CAAU,aAAa,MAAQ,EAAA,UAAA,EAAY,EAAE,KAAA,EAAO,IAAI,CAAA,CAAA;AACxD,QAAA,SAAA,CAAU,QAAQ,CAAA,CAAA;AAAA,OACnB,CAAA,CAAA;AAAA,KACH,MAAA,IAAW,gBAAgB,MAAQ,EAAA;AACjC,MAAA,OAAA,CAAQ,eAAe,MAAO,CAAA,MAAA,EAAQ,OAAO,EAAE,CAAA,CAAE,KAAK,CAAY,QAAA,KAAA;AAChE,QAAA,UAAA,CAAW,CAAE,CAAA,CAAA,CAAA;AACb,QAAA,SAAA,CAAU,aAAa,MAAQ,EAAA,QAAA,EAAU,EAAE,KAAA,EAAO,IAAI,CAAA,CAAA;AACtD,QAAA,SAAA,CAAU,QAAQ,CAAA,CAAA;AAAA,OACnB,CAAA,CAAA;AAAA,KACH;AAAA,GACF,CAAA;AAEA,EAAA,IAAI,iBAAyB,aACzB,GAAA,CAAA,CAAE,kCAAkC,CAAA,GACpC,EAAE,gCAAgC,CAAA,CAAA;AACtC,EAAI,IAAA,CAAC,QAAQ,GAAK,EAAA;AAChB,IAAiB,cAAA,GAAA,aAAA,GAAgB,CAAE,CAAA,2BAA2B,CAAI,GAAA,EAAA,CAAA;AAAA,GACpE;AAEA,EAAA,IAAI,gBAAwB,UACxB,GAAA,CAAA,CAAE,2BAA2B,CAAA,GAC7B,EAAE,yBAAyB,CAAA,CAAA;AAC/B,EAAA,IAAI,GAAK,EAAA;AACP,IAAA,aAAA,GAAgB,UACZ,GAAA,CAAA,CAAE,0BAA0B,CAAA,GAC5B,EAAE,wBAAwB,CAAA,CAAA;AAAA,GAChC;AAEA,EAAA,IAAI,kBAA0B,UAC1B,GAAA,CAAA,CAAE,0BAA0B,CAAA,GAC5B,EAAE,wBAAwB,CAAA,CAAA;AAC9B,EAAA,IAAI,GAAK,EAAA;AACP,IAAkB,eAAA,GAAA,aAAA,CAAA;AAAA,GACpB;AAEA,EAAA,MAAM,sBAAsB,MAAM;AAChC,IAAI,IAAA,EAAE,YAAY,MAAS,CAAA,EAAA;AACzB,MAAA,OAAA;AAAA,KACF;AACA,IAAA,IAAI,aAAe,EAAA;AACjB,MAAA,OAAA,CAAQ,oBAAoB,MAAO,CAAA,MAAA,EAAQ,OAAO,EAAE,CAAA,CAAE,KAAK,CAAY,QAAA,KAAA;AACrE,QAAA,IAAI,QAAU,EAAA;AACZ,UAAA,gBAAA,CAAiB,KAAK,CAAA,CAAA;AAAA,SACxB;AAAA,OACD,CAAA,CAAA;AAAA,KACI,MAAA;AACL,MAAA,OAAA,CAAQ,kBAAkB,MAAO,CAAA,MAAA,EAAQ,OAAO,EAAE,CAAA,CAAE,KAAK,CAAY,QAAA,KAAA;AACnE,QAAA,IAAI,QAAU,EAAA;AACZ,UAAA,gBAAA,CAAiB,IAAI,CAAA,CAAA;AAAA,SACvB;AAAA,OACD,CAAA,CAAA;AAAA,KACH;AAAA,GACF,CAAA;AAEA,EAAO,OAAA;AAAA,IACL,MAAA;AAAA,IACA,OAAA;AAAA,IACA,aAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAA;AAAA,IACA,QAAA;AAAA,IACA,mBAAA;AAAA,IACA,aAAA;AAAA,IACA,eAAA;AAAA,IACA,cAAA;AAAA,GACF,CAAA;AACF,CAAA;AAEO,SAAS,UACd,CAAA,CAAA,EACA,IAAc,GAAA,EACd,EAAA;AACA,EAAM,MAAA,OAAA,GAAU,OAAO,UAAU,CAAA,CAAA;AAEjC,EAAA,OAAO,cAAc,YAAY;AAC/B,IAAO,OAAA,MAAM,EAAE,OAAO,CAAA,CAAA;AAAA,KACrB,IAAI,CAAA,CAAA;AACT,CAAA;AAaO,SAAS,cACd,CAAA,CAAA,EACA,IAAc,GAAA,EACd,EAAA;AACA,EAAM,MAAA,WAAA,GAAc,OAAO,cAAc,CAAA,CAAA;AAEzC,EAAA,OAAO,SAAS,YAAY;AAC1B,IAAO,OAAA,MAAM,EAAE,WAAW,CAAA,CAAA;AAAA,KACzB,IAAI,CAAA,CAAA;AACT,CAAA;AAEO,SAAS,wBAAwB,MAAiB,EAAA;AACvD,EAAM,MAAA,CAAC,YAAY,CAAA,GAAI,eAAgB,EAAA,CAAA;AACvC,EAAA,MAAM,CAAC,SAAW,EAAA,YAAY,CAAI,GAAA,KAAA,CAAM,SAA6B,MAAM,CAAA,CAAA;AAE3E,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,YAAA,CAAa,YAAa,CAAA,GAAA,CAAI,QAAQ,CAAA,IAAK,KAAS,CAAA,CAAA,CAAA;AAAA,GACnD,EAAA,CAAC,YAAc,EAAA,YAAY,CAAC,CAAA,CAAA;AAE/B,EAAO,OAAA,SAAA,CAAA;AACT,CAAA;AAEO,SAAS,cAAiB,GAAA;AAC/B,EAAM,MAAA,WAAA,GAAc,OAAO,cAAc,CAAA,CAAA;AACzC,EAAM,MAAA,MAAA,GAAS,YAAY,kBAAmB,EAAA,CAAA;AAC9C,EAAM,MAAA,KAAA,GAAQ,QAAQ,MAAM,WAAA,CAAY,kBAAoB,EAAA,CAAC,WAAW,CAAC,CAAA,CAAA;AACzE,EAAO,OAAA,OAAA,CAAQ,OAAO,IAAK,CAAA,CAAA,CAAA,KAAK,EAAE,EAAO,KAAA,KAAK,CAAG,EAAA,OAAA,KAAY,MAAM,CAAA,CAAA;AACrE,CAAA;AAEa,MAAA,SAAA,GAAY,WAAW,CAAS,KAAA,KAAA;AAC3C,EAAO,OAAA;AAAA,IACL,QAAU,EAAA;AAAA,MACR,GAAK,EAAA,GAAA;AAAA,MACL,KAAO,EAAA,OAAA;AAAA,KACT;AAAA,IACA,gBAAkB,EAAA;AAAA,MAChB,KAAA,EAAO,KAAM,CAAA,OAAA,CAAQ,OAAQ,CAAA,YAAA;AAAA,MAC7B,eAAA,EAAiB,KAAM,CAAA,OAAA,CAAQ,OAAQ,CAAA,KAAA;AAAA,MACvC,YAAA,EAAc,MAAM,KAAM,CAAA,YAAA;AAAA,MAC1B,SAAW,EAAA;AAAA,QACT,eAAA,EAAiB,KAAM,CAAA,OAAA,CAAQ,OAAQ,CAAA,IAAA;AAAA,OACzC;AAAA,MACA,OAAS,EAAA;AAAA,QACP,KAAA,EAAO,KAAM,CAAA,OAAA,CAAQ,OAAQ,CAAA,YAAA;AAAA,OAC/B;AAAA,KACF;AAAA,IACA,mBAAqB,EAAA;AAAA,MACnB,eAAiB,EAAA,SAAA;AAAA,KACnB;AAAA,IACA,WAAa,EAAA;AAAA,MACX,KAAO,EAAA,MAAA;AAAA,MACP,MAAQ,EAAA,OAAA;AAAA,MACR,SAAW,EAAA,OAAA;AAAA,KACb;AAAA,IACA,cAAgB,EAAA;AAAA,MACd,eAAiB,EAAA,SAAA;AAAA,MACjB,KAAA,EAAO,KAAM,CAAA,OAAA,CAAQ,IAAK,CAAA,OAAA;AAAA,MAC1B,MAAQ,EAAA,CAAA,UAAA,EAAa,KAAM,CAAA,OAAA,CAAQ,OAAO,QAAQ,CAAA,CAAA;AAAA,MAClD,YAAA,EAAc,MAAM,KAAM,CAAA,YAAA;AAAA,MAC1B,SAAW,EAAA;AAAA,QACT,WAAA,EAAa,KAAM,CAAA,OAAA,CAAQ,MAAO,CAAA,MAAA;AAAA,OACpC;AAAA,MACA,gBAAkB,EAAA;AAAA,QAChB,WAAA,EAAa,KAAM,CAAA,OAAA,CAAQ,OAAQ,CAAA,IAAA;AAAA,OACrC;AAAA,MACA,eAAiB,EAAA;AAAA,QACf,eAAiB,EAAA,SAAA;AAAA,QACjB,KAAA,EAAO,KAAM,CAAA,OAAA,CAAQ,IAAK,CAAA,OAAA;AAAA,QAC1B,YAAc,EAAA,CAAA,UAAA,EAAa,KAAM,CAAA,OAAA,CAAQ,OAAO,QAAQ,CAAA,CAAA;AAAA,QACxD,+CAAiD,EAAA;AAAA,UAC/C,KAAO,EAAA,CAAA,EAAG,KAAM,CAAA,OAAA,CAAQ,KAAK,OAAO,CAAA,WAAA,CAAA;AAAA,SACtC;AAAA,OACF;AAAA,MACA,wBAA0B,EAAA;AAAA,QACxB,OAAS,EAAA,MAAA;AAAA,OACX;AAAA,MACA,2BAA6B,EAAA;AAAA,QAC3B,QAAA,EAAU,KAAM,CAAA,UAAA,CAAW,KAAM,CAAA,QAAA;AAAA,QACjC,UAAA,EAAY,KAAM,CAAA,UAAA,CAAW,KAAM,CAAA,UAAA;AAAA,QACnC,UAAA,EAAY,KAAM,CAAA,UAAA,CAAW,KAAM,CAAA,UAAA;AAAA,OACrC;AAAA,MACA,aAAe,EAAA;AAAA,QACb,eAAiB,EAAA,SAAA;AAAA,QACjB,KAAA,EAAO,KAAM,CAAA,OAAA,CAAQ,IAAK,CAAA,OAAA;AAAA,QAC1B,OAAS,EAAA,MAAA;AAAA,OACX;AAAA,MACA,cAAgB,EAAA;AAAA,QACd,KAAA,EAAO,KAAM,CAAA,OAAA,CAAQ,IAAK,CAAA,OAAA;AAAA,QAC1B,eAAiB,EAAA,SAAA;AAAA,OACnB;AAAA,KACF;AAAA,IACA,mBAAqB,EAAA;AAAA,MACnB,MAAQ,EAAA,CAAA,UAAA,EAAa,KAAM,CAAA,OAAA,CAAQ,MAAM,IAAI,CAAA,WAAA,CAAA;AAAA,KAC/C;AAAA,IACA,eAAiB,EAAA;AAAA,MACf,KAAO,EAAA;AAAA,QACL,SAAW,EAAA,YAAA;AAAA,OACb;AAAA,MACA,UAAY,EAAA;AAAA,QACV,OAAS,EAAA,cAAA;AAAA,OACX;AAAA,MACA,kBAAoB,EAAA;AAAA,QAClB,SAAW,EAAA,gBAAA;AAAA,OACb;AAAA,MACA,iBAAmB,EAAA;AAAA,QACjB,YAAc,EAAA,gBAAA;AAAA,OAChB;AAAA,MACA,GAAI,MAAM,SAAkC,EAAA,wBAAA;AAAA,KAC9C;AAAA,IACA,YAAc,EAAA;AAAA,MACZ,KAAA,EAAO,KAAM,CAAA,OAAA,CAAQ,OAAQ,CAAA,IAAA;AAAA,KAC/B;AAAA,IACA,eAAiB,EAAA;AAAA,MACf,SAAA,EAAW,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,MAC1B,YAAA,EAAc,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,KAC/B;AAAA,IACA,YAAc,EAAA;AAAA,MACZ,YAAA,EAAc,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,MAC7B,QAAU,EAAA,UAAA;AAAA,KACZ;AAAA,IACA,gBAAkB,EAAA;AAAA,MAChB,SAAW,EAAA,QAAA;AAAA,MACX,KAAO,EAAA,MAAA;AAAA,MACP,WAAa,EAAA,MAAA;AAAA,MACb,UAAY,EAAA,KAAA;AAAA,MACZ,OAAS,EAAA,cAAA;AAAA,MACT,aAAe,EAAA,KAAA;AAAA,KACjB;AAAA,IACA,mBAAqB,EAAA;AAAA,MACnB,SAAW,EAAA,OAAA;AAAA,KACb;AAAA,IACA,gBAAkB,EAAA;AAAA,MAChB,OAAS,EAAA,QAAA;AAAA,MACT,aAAe,EAAA,QAAA;AAAA,KACjB;AAAA,IACA,qBAAuB,EAAA;AAAA,MACrB,KAAO,EAAA,MAAA;AAAA,MACP,SAAW,EAAA,OAAA;AAAA,MACX,WAAa,EAAA,KAAA;AAAA,MACb,OAAS,EAAA,cAAA;AAAA,MACT,aAAe,EAAA,KAAA;AAAA,KACjB;AAAA,IACA,uBAAyB,EAAA;AAAA,MACvB,OAAS,EAAA,cAAA;AAAA,MACT,KAAO,EAAA,mBAAA;AAAA,KACT;AAAA,IACA,sBAAwB,EAAA;AAAA,MACtB,OAAS,EAAA,QAAA;AAAA,MACT,KAAO,EAAA,OAAA;AAAA,KACT;AAAA,IACA,sBAAwB,EAAA;AAAA,MACtB,OAAS,EAAA,wBAAA;AAAA,MACT,WAAa,EAAA,SAAA;AAAA,MACb,QAAU,EAAA,MAAA;AAAA,MACV,QAAU,EAAA,MAAA;AAAA,MACV,SAAW,EAAA,MAAA;AAAA,KACb;AAAA,IACA,iBAAmB,EAAA;AAAA,MACjB,OAAS,EAAA,cAAA;AAAA,MACT,KAAO,EAAA,mBAAA;AAAA,KACT;AAAA,IACA,kBAAoB,EAAA;AAAA,MAClB,OAAA,EAAS,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,MACxB,KAAO,EAAA,OAAA;AAAA,MACP,QAAU,EAAA,OAAA;AAAA,MACV,MAAQ,EAAA,CAAA,UAAA,EAAa,KAAM,CAAA,OAAA,CAAQ,OAAO,QAAQ,CAAA,CAAA;AAAA,MAClD,WAAa,EAAA;AAAA,QACX,KAAA,EAAO,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,QACtB,MAAA,EAAQ,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,QACvB,QAAU,EAAA,MAAA;AAAA,OACZ;AAAA,KACF;AAAA,IACA,sBAAwB,EAAA;AAAA,MACtB,SAAA,EAAW,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,KAC5B;AAAA,IACA,UAAY,EAAA;AAAA,MACV,SAAA,EAAW,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,MAC1B,YAAA,EAAc,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,KAC/B;AAAA,IACA,qBAAuB,EAAA;AAAA,MACrB,UAAY,EAAA,MAAA;AAAA,KACd;AAAA,IACA,gBAAkB,EAAA;AAAA,MAChB,WAAA,EAAa,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,KAC9B;AAAA,IACA,0BAA4B,EAAA;AAAA,MAC1B,KAAO,EAAA,MAAA;AAAA,MACP,eAAA,EAAiB,KAAM,CAAA,OAAA,CAAQ,UAAW,CAAA,KAAA;AAAA,MAC1C,MAAQ,EAAA,CAAA,UAAA,EAAa,KAAM,CAAA,OAAA,CAAQ,OAAO,QAAQ,CAAA,CAAA;AAAA,MAClD,YAAA,EAAc,MAAM,KAAM,CAAA,YAAA;AAAA,MAC1B,qBAAuB,EAAA;AAAA,QACrB,SAAA,EAAW,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,OAC5B;AAAA,KACF;AAAA,IACA,iBAAmB,EAAA;AAAA,MACjB,aAAe,EAAA,KAAA;AAAA,MACf,KAAO,EAAA;AAAA,QACL,SAAW,EAAA,GAAA;AAAA,QACX,YAAc,EAAA,GAAA;AAAA,OAChB;AAAA,KACF;AAAA,IACA,WAAa,EAAA;AAAA,MACX,MAAQ,EAAA,CAAA,UAAA,EAAa,KAAM,CAAA,OAAA,CAAQ,OAAO,QAAQ,CAAA,CAAA;AAAA,MAClD,YAAA,EAAc,MAAM,KAAM,CAAA,YAAA;AAAA,MAC1B,OAAA,EAAS,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,KAC1B;AAAA,IACA,oBAAsB,EAAA;AAAA,MACpB,SAAA,EAAW,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,KAC5B;AAAA,IACA,WAAa,EAAA;AAAA,MACX,WAAA,EAAa,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,KAC9B;AAAA,IACA,UAAY,EAAA;AAAA,MACV,UAAA,EAAY,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,KAC7B;AAAA,IACA,mBAAqB,EAAA;AAAA,MACnB,SAAA,EAAW,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,MAC1B,KAAO,EAAA;AAAA,QACL,WAAA,EAAa,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,OAC9B;AAAA,KACF;AAAA,IACA,SAAW,EAAA;AAAA,MACT,OAAS,EAAA,CAAA,YAAA,CAAA;AAAA,KACX;AAAA,IACA,QAAU,EAAA;AAAA,MACR,QAAU,EAAA,MAAA;AAAA,KACZ;AAAA,IACA,WAAa,EAAA;AAAA,MACX,QAAU,EAAA,UAAA;AAAA,MACV,GAAK,EAAA,KAAA;AAAA,MACL,IAAM,EAAA,KAAA;AAAA,MACN,SAAW,EAAA,uBAAA;AAAA,MACX,KAAO,EAAA,GAAA;AAAA,MACP,eAAA,EAAiB,KAAM,CAAA,OAAA,CAAQ,UAAW,CAAA,OAAA;AAAA,MAC1C,MAAQ,EAAA,CAAA,UAAA,EAAa,KAAM,CAAA,OAAA,CAAQ,OAAO,QAAQ,CAAA,CAAA;AAAA,MAClD,YAAA,EAAc,MAAM,KAAM,CAAA,YAAA;AAAA,MAC1B,OAAA,EAAS,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,MACxB,UAAY,EAAA;AAAA,QACV,SAAA,EAAW,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,QAC1B,KAAO,EAAA,OAAA;AAAA,OACT;AAAA,KACF;AAAA,IACA,UAAY,EAAA;AAAA,MACV,YAAc,EAAA,UAAA;AAAA,MACd,QAAU,EAAA,QAAA;AAAA,MACV,UAAY,EAAA,QAAA;AAAA,KACd;AAAA,IACA,SAAW,EAAA;AAAA,MACT,SAAW,EAAA,eAAA;AAAA,KACb;AAAA,IACA,sBAAwB,EAAA;AAAA,MACtB,IAAM,EAAA;AAAA,QACJ,SAAW,EAAA,CAAA,gBAAA,EAAmB,KAAM,CAAA,OAAA,CAAQ,UAAU,KAAK,CAAA,CAAA;AAAA,OAC7D;AAAA,MACA,MAAQ,EAAA;AAAA,QACN,SAAW,EAAA,MAAA;AAAA,OACb;AAAA,KACF;AAAA,IACA,UAAY,EAAA;AAAA,MACV,QAAU,EAAA,OAAA;AAAA,MACV,SAAA,EAAW,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,MAC1B,YAAA,EAAc,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,KAC/B;AAAA,GACF,CAAA;AACF,CAAC,EAAA;AAQM,MAAM,aAAa,MAAM;AAC9B,EAAI,IAAA;AACF,IAAM,MAAA,MAAA,GAAS,OAAO,YAAY,CAAA,CAAA;AAClC,IAAO,OAAA,MAAA,CAAO,kBAAkB,aAAa,CAAA,CAAA;AAAA,GACvC,CAAA,MAAA;AACN,IAAO,OAAA,KAAA,CAAA,CAAA;AAAA,GACT;AACF,EAAA;AAEO,MAAM,cAAc,MAAM;AAE/B,EAAA,MAAM,IAAO,GAAA,mBAAA,CAAA;AACb,EAAM,MAAA,GAAA,GAAM,YAAgB,IAAA,GAAA,CAAA;AAC5B,EAAA,MAAM,EAAE,QAAS,EAAA,GAAI,IAAI,GAAA,CAAI,KAAK,IAAI,CAAA,CAAA;AACtC,EAAO,OAAA,OAAA,CAAQ,UAAU,GAAG,CAAA,CAAA;AAC9B,EAAA;AAEA,MAAM,SAAA,uBAAyC,GAAI,EAAA,CAAA;AACnD,MAAM,iBAAA,GAAoB,CAAC,UAAA,KACzB,IAAI,UAAA;AAAA,EACF,OAAO,UAAkC,KAAA;AACvC,IAAA,MAAM,EAAE,KAAA,EAAU,GAAA,MAAM,WAAW,iBAAkB,CAAA;AAAA,MACnD,MAAQ,EAAA;AAAA,QACN,MAAA;AAAA,QACA,eAAA;AAAA,QACA,oBAAA;AAAA,QACA,0BAAA;AAAA,QACA,sBAAA;AAAA,OACF;AAAA,MACA,UAAA;AAAA,KACD,CAAA,CAAA;AAED,IAAW,UAAA,CAAA,OAAA,CAAQ,CAAC,SAAA,EAAW,KAAU,KAAA;AACvC,MAAA,SAAA,CAAU,GAAI,CAAA,SAAA,EAAW,KAAM,CAAA,KAAK,CAAe,CAAA,CAAA;AAAA,KACpD,CAAA,CAAA;AACD,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AAAA,EACA;AAAA,IACE,IAAM,EAAA,oBAAA;AAAA,IACN,QAAA,sBAAc,GAAI,EAAA;AAAA,IAClB,YAAc,EAAA,GAAA;AAAA,IACd,iBAAiB,CAAY,QAAA,KAAA;AAC3B,MAAA,UAAA,CAAW,UAAU,EAAE,CAAA,CAAA;AAAA,KACzB;AAAA,GACF;AACF,CAAA,CAAA;AAEW,MAAA,eAAA,GAAkB,CAC7B,MACG,KAAA;AACH,EAAM,MAAA,UAAA,GAAa,OAAO,aAAa,CAAA,CAAA;AACvC,EAAM,MAAA,WAAA,GAAc,OAAO,cAAc,CAAA,CAAA;AACzC,EAAA,MAAM,CAAC,IAAM,EAAA,OAAO,CAAI,GAAA,KAAA,CAAM,SAA6B,KAAS,CAAA,CAAA,CAAA;AACpE,EAAA,MAAM,CAAC,IAAM,EAAA,OAAO,CAAI,GAAA,KAAA,CAAM,SAA4B,IAAI,CAAA,CAAA;AAC9D,EAAA,MAAM,CAAC,QAAU,EAAA,WAAW,CAAI,GAAA,KAAA,CAAM,SAAwB,IAAI,CAAA,CAAA;AAClE,EAAA,MAAM,CAAC,WAAa,EAAA,cAAc,CAAI,GAAA,KAAA,CAAM,SAAwB,IAAI,CAAA,CAAA;AACxE,EAAA,MAAM,SAAY,GAAA,WAAA,IAAe,MAAS,GAAA,MAAA,CAAO,aAAa,KAAQ,GAAA,KAAA,CAAA;AACtE,EAAI,IAAA,MAAA;AAAA;AAAA,IAEF,QAAA,IAAY,SACR,MAAO,CAAA,MAAA,GACP,aAAa,MACb,GAAA,MAAA,CAAO,UACP,MAAO,CAAA,KAAA;AAAA,GAAA,CAAA;AACb,EAAA,IAAI,CAAC,MAAA,CAAO,UAAW,CAAA,OAAO,CAAG,EAAA;AAC/B,IAAA,MAAA,GAAS,QAAQ,MAAM,CAAA,CAAA,CAAA;AAAA,GACzB;AAEA,EAAA,MAAM,EAAE,YAAA,EAAc,QAAS,EAAA,GAAI,sBAAsB,MAAM,CAAA,CAAA;AAE/D,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,SAAW,EAAA;AACb,MAAA,OAAA;AAAA,KACF;AAEA,IAAI,IAAA,SAAA,CAAU,GAAI,CAAA,MAAM,CAAG,EAAA;AACzB,MAAQ,OAAA,CAAA,SAAA,CAAU,GAAI,CAAA,MAAM,CAAe,CAAA,CAAA;AAC3C,MAAA,OAAA;AAAA,KACF;AAEA,IAAA,iBAAA,CAAkB,UAAU,CACzB,CAAA,IAAA,CAAK,MAAM,CAAA,CACX,KAAK,CAAQ,IAAA,KAAA;AACZ,MAAA,IAAI,IAAM,EAAA;AACR,QAAA,OAAA,CAAQ,IAAkB,CAAA,CAAA;AAAA,OACrB,MAAA;AACL,QAAA,OAAA,CAAQ,IAAI,CAAA,CAAA;AAAA,OACd;AAAA,KACD,CACA,CAAA,KAAA,CAAM,MAAM;AACX,MAAA,OAAA,CAAQ,IAAI,CAAA,CAAA;AAAA,KACb,CAAA,CAAA;AAAA,GACF,EAAA,CAAC,UAAY,EAAA,MAAA,EAAQ,SAAS,CAAC,CAAA,CAAA;AAElC,EAAA,SAAA,CAAU,MAAM;AACd,IAAY,WAAA,CAAA,oBAAA,EAAuB,CAAA,IAAA,CAAK,CAAO,GAAA,KAAA;AAC7C,MAAe,cAAA,CAAA,GAAA,CAAI,iBAAiB,oBAAoB,CAAA,CAAA;AAAA,KACzD,CAAA,CAAA;AAAA,GACH,EAAG,CAAC,WAAW,CAAC,CAAA,CAAA;AAEhB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,WAAc,GAAA,QAAA,CAAA;AAClB,IAAA,IAAI,WAAW,WAAa,EAAA;AAC1B,MAAc,WAAA,GAAA,KAAA,CAAA;AACd,MAAA,IAAI,SAAW,EAAA;AACb,QAAe,WAAA,IAAA,cAAA,CAAA;AAAA,OACjB;AAAA,KACF;AACA,IAAA,OAAA,CAAQ,WAAW,CAAA,CAAA;AAAA,KAClB,CAAC,MAAA,EAAQ,SAAW,EAAA,WAAA,EAAa,QAAQ,CAAC,CAAA,CAAA;AAE7C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,QAAQ,IAAQ,IAAA,EAAA,EACnB,MAAM,GAAG,CAAA,CACT,IAAI,CAAK,CAAA,KAAA,CAAA,CAAE,CAAC,CAAC,CAAA,CACb,KAAK,EAAE,CAAA,CACP,UAAU,CAAG,EAAA,CAAC,EACd,WAAY,EAAA,CAAA;AACf,IAAA,WAAA,CAAY,IAAI,CAAA,CAAA;AAAA,GAClB,EAAG,CAAC,IAAI,CAAC,CAAA,CAAA;AAET,EAAO,OAAA,EAAE,IAAM,EAAA,QAAA,EAAU,IAAK,EAAA,CAAA;AAChC,EAAA;AAEA,IAAI,YAAqC,GAAA,KAAA,CAAA,CAAA;AAElC,MAAM,gBAAgB,MAAM;AACjC,EAAM,MAAA,CAAC,MAAM,OAAO,CAAA,GAAI,MAAM,QAAmB,CAAA,YAAA,IAAgB,EAAE,CAAA,CAAA;AACnE,EAAA,MAAM,CAAC,OAAS,EAAA,UAAU,IAAI,KAAM,CAAA,QAAA,CAAS,iBAAiB,KAAS,CAAA,CAAA,CAAA;AACvE,EAAM,MAAA,OAAA,GAAU,OAAO,UAAU,CAAA,CAAA;AAEjC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,iBAAiB,KAAW,CAAA,EAAA;AAC9B,MAAQ,OAAA,CAAA,eAAA,EAAkB,CAAA,IAAA,CAAK,CAAO,GAAA,KAAA;AACpC,QAAA,YAAA,GAAe,GAAI,CAAA,IAAA,CAAA;AACnB,QAAA,OAAA,CAAQ,IAAI,IAAI,CAAA,CAAA;AAChB,QAAA,UAAA,CAAW,KAAK,CAAA,CAAA;AAAA,OACjB,CAAA,CAAA;AAAA,KACI,MAAA;AACL,MAAA,OAAA,CAAQ,YAAY,CAAA,CAAA;AAAA,KACtB;AAAA,GACF,EAAG,CAAC,OAAO,CAAC,CAAA,CAAA;AAEZ,EAAA,MAAM,SAAY,GAAA,WAAA;AAAA,IAChB,CAAC,GAAgB,KAAA;AACf,MAAA,OAAA,CAAQ,SAAU,CAAA,GAAG,CAAE,CAAA,IAAA,CAAK,MAAM;AAChC,QAAA,OAAA,CAAQ,CAAQ,IAAA,KAAA,CAAC,GAAG,IAAA,EAAM,GAAG,CAAC,CAAA,CAAA;AAC9B,QAAA,YAAA,EAAc,KAAK,GAAG,CAAA,CAAA;AAAA,OACvB,CAAA,CAAA;AAAA,KACH;AAAA,IACA,CAAC,OAAO,CAAA;AAAA,GACV,CAAA;AAEA,EAAA,MAAM,WAAc,GAAA,WAAA;AAAA,IAClB,CAAC,GAAgB,KAAA;AACf,MAAA,OAAA,CAAQ,WAAY,CAAA,GAAG,CAAE,CAAA,IAAA,CAAK,MAAM;AAClC,QAAA,OAAA,CAAQ,UAAQ,IAAK,CAAA,MAAA,CAAO,CAAK,CAAA,KAAA,CAAA,KAAM,GAAG,CAAC,CAAA,CAAA;AAC3C,QAAA,YAAA,GAAe,YAAc,EAAA,MAAA,CAAO,CAAK,CAAA,KAAA,CAAA,KAAM,GAAG,CAAA,CAAA;AAAA,OACnD,CAAA,CAAA;AAAA,KACH;AAAA,IACA,CAAC,OAAO,CAAA;AAAA,GACV,CAAA;AAEA,EAAA,MAAM,cAAiB,GAAA,WAAA;AAAA,IACrB,CAAC,GAAA,KAAgB,IAAK,CAAA,QAAA,CAAS,GAAG,CAAA;AAAA,IAClC,CAAC,IAAI,CAAA;AAAA,GACP,CAAA;AACA,EAAO,OAAA;AAAA,IACL,IAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,IACA,cAAA;AAAA,IACA,OAAA;AAAA,GACF,CAAA;AACF,EAAA;AAEA,IAAI,gBAAyC,GAAA,KAAA,CAAA,CAAA;AAEtC,MAAM,kBAAkB,MAAM;AACnC,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,KAAM,CAAA,QAAA;AAAA,IACpC,oBAAoB,EAAC;AAAA,GACvB,CAAA;AACA,EAAA,MAAM,CAAC,OAAS,EAAA,UAAU,IAAI,KAAM,CAAA,QAAA,CAAS,qBAAqB,KAAS,CAAA,CAAA,CAAA;AAC3E,EAAM,MAAA,OAAA,GAAU,OAAO,UAAU,CAAA,CAAA;AAEjC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,qBAAqB,KAAW,CAAA,EAAA;AAClC,MAAQ,OAAA,CAAA,mBAAA,EAAsB,CAAA,IAAA,CAAK,CAAO,GAAA,KAAA;AACxC,QAAA,gBAAA,GAAmB,GAAI,CAAA,UAAA,CAAA;AACvB,QAAA,WAAA,CAAY,IAAI,UAAU,CAAA,CAAA;AAC1B,QAAA,UAAA,CAAW,KAAK,CAAA,CAAA;AAAA,OACjB,CAAA,CAAA;AAAA,KACI,MAAA;AACL,MAAA,WAAA,CAAY,gBAAgB,CAAA,CAAA;AAAA,KAC9B;AAAA,GACF,EAAG,CAAC,OAAO,CAAC,CAAA,CAAA;AAEZ,EAAA,MAAM,YAAe,GAAA,WAAA;AAAA,IACnB,CAAC,SAAsB,KAAA;AACrB,MAAA,OAAA,CAAQ,YAAa,CAAA,SAAS,CAAE,CAAA,IAAA,CAAK,MAAM;AACzC,QAAA,WAAA,CAAY,CAAQ,IAAA,KAAA,CAAC,GAAG,IAAA,EAAM,SAAS,CAAC,CAAA,CAAA;AACxC,QAAA,gBAAA,EAAkB,KAAK,SAAS,CAAA,CAAA;AAAA,OACjC,CAAA,CAAA;AAAA,KACH;AAAA,IACA,CAAC,OAAO,CAAA;AAAA,GACV,CAAA;AAEA,EAAA,MAAM,cAAiB,GAAA,WAAA;AAAA,IACrB,CAAC,SAAsB,KAAA;AACrB,MAAA,OAAA,CAAQ,cAAe,CAAA,SAAS,CAAE,CAAA,IAAA,CAAK,MAAM;AAC3C,QAAA,WAAA,CAAY,UAAQ,IAAK,CAAA,MAAA,CAAO,CAAK,CAAA,KAAA,CAAA,KAAM,SAAS,CAAC,CAAA,CAAA;AACrD,QAAA,gBAAA,GAAmB,gBAAkB,EAAA,MAAA,CAAO,CAAK,CAAA,KAAA,CAAA,KAAM,SAAS,CAAA,CAAA;AAAA,OACjE,CAAA,CAAA;AAAA,KACH;AAAA,IACA,CAAC,OAAO,CAAA;AAAA,GACV,CAAA;AAEA,EAAA,MAAM,iBAAoB,GAAA,WAAA;AAAA,IACxB,CAAC,SAAA,KAAsB,QAAS,CAAA,QAAA,CAAS,SAAS,CAAA;AAAA,IAClD,CAAC,QAAQ,CAAA;AAAA,GACX,CAAA;AACA,EAAA,OAAO,EAAE,QAAA,EAAU,YAAc,EAAA,cAAA,EAAgB,mBAAmB,OAAQ,EAAA,CAAA;AAC9E;;;;"}
|
package/package.json
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"frontend",
|
|
8
8
|
"backstage.io"
|
|
9
9
|
],
|
|
10
|
-
"version": "3.0.
|
|
10
|
+
"version": "3.0.1",
|
|
11
11
|
"main": "dist/index.esm.js",
|
|
12
12
|
"types": "dist/index.d.ts",
|
|
13
13
|
"prepublishOnly": "yarn tsc && yarn build",
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
"@backstage/plugin-catalog-react": "^1.14.0",
|
|
56
56
|
"@backstage/plugin-permission-react": "^0.4.27",
|
|
57
57
|
"@backstage/plugin-signals-react": "^0.0.6",
|
|
58
|
-
"@drodil/backstage-plugin-qeta-common": "^3.0.
|
|
58
|
+
"@drodil/backstage-plugin-qeta-common": "^3.0.1",
|
|
59
59
|
"@material-ui/core": "^4.12.2",
|
|
60
60
|
"@material-ui/icons": "^4.11.3",
|
|
61
61
|
"@material-ui/lab": "4.0.0-alpha.61",
|