@drodil/backstage-plugin-qeta-react 3.10.5 → 3.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/FollowedLists/FollowedCollectionsList.esm.js +2 -23
- package/dist/components/FollowedLists/FollowedCollectionsList.esm.js.map +1 -1
- package/dist/components/FollowedLists/FollowedEntitiesList.esm.js +2 -23
- package/dist/components/FollowedLists/FollowedEntitiesList.esm.js.map +1 -1
- package/dist/components/FollowedLists/FollowedTagsList.esm.js +2 -23
- package/dist/components/FollowedLists/FollowedTagsList.esm.js.map +1 -1
- package/dist/components/FollowedLists/FollowedUsersList.esm.js +22 -0
- package/dist/components/FollowedLists/FollowedUsersList.esm.js.map +1 -0
- package/dist/components/HomePageCards/ImpactCard.esm.js +13 -3
- package/dist/components/HomePageCards/ImpactCard.esm.js.map +1 -1
- package/dist/components/LeftMenu/LeftMenu.esm.js +6 -3
- package/dist/components/LeftMenu/LeftMenu.esm.js.map +1 -1
- package/dist/components/LeftMenu/LeftMenuButton.esm.js +26 -9
- package/dist/components/LeftMenu/LeftMenuButton.esm.js.map +1 -1
- package/dist/components/Links/Links.esm.js +11 -1
- package/dist/components/Links/Links.esm.js.map +1 -1
- package/dist/components/PostHighlightList/PostHighlightList.esm.js +11 -51
- package/dist/components/PostHighlightList/PostHighlightList.esm.js.map +1 -1
- package/dist/components/PostsContainer/PostListItem.esm.js +5 -4
- package/dist/components/PostsContainer/PostListItem.esm.js.map +1 -1
- package/dist/components/PostsGrid/PostsGridItem.esm.js +3 -3
- package/dist/components/PostsGrid/PostsGridItem.esm.js.map +1 -1
- package/dist/components/Styled/RightList.esm.js +49 -0
- package/dist/components/Styled/RightList.esm.js.map +1 -0
- package/dist/components/SuggestionsCard/SuggestionsCard.esm.js +96 -0
- package/dist/components/SuggestionsCard/SuggestionsCard.esm.js.map +1 -0
- package/dist/components/TagsAndEntities/EntityChip.esm.js +2 -1
- package/dist/components/TagsAndEntities/EntityChip.esm.js.map +1 -1
- package/dist/components/TagsAndEntities/UserChip.esm.js +80 -0
- package/dist/components/TagsAndEntities/UserChip.esm.js.map +1 -0
- package/dist/index.d.ts +13 -3
- package/dist/index.esm.js +2 -0
- package/dist/index.esm.js.map +1 -1
- package/dist/translation.esm.js +9 -1
- package/dist/translation.esm.js.map +1 -1
- package/package.json +19 -12
|
@@ -8,7 +8,7 @@ import DOMPurify from 'dompurify';
|
|
|
8
8
|
import { truncate, removeMarkdownFormatting } from '@drodil/backstage-plugin-qeta-common';
|
|
9
9
|
import { TagsAndEntities } from '../TagsAndEntities/TagsAndEntities.esm.js';
|
|
10
10
|
import { useRouteRef } from '@backstage/core-plugin-api';
|
|
11
|
-
import { questionRouteRef, articleRouteRef
|
|
11
|
+
import { questionRouteRef, articleRouteRef } from '../../routes.esm.js';
|
|
12
12
|
import { RelativeTimeWithTooltip } from '../RelativeTimeWithTooltip/RelativeTimeWithTooltip.esm.js';
|
|
13
13
|
import { useSignal } from '@backstage/plugin-signals-react';
|
|
14
14
|
import { VoteButtons } from '../Buttons/VoteButtons.esm.js';
|
|
@@ -22,6 +22,7 @@ import { useTranslation } from '../../hooks/useTranslation.esm.js';
|
|
|
22
22
|
import 'react-use/lib/useAsync';
|
|
23
23
|
import { useEntityAuthor } from '../../hooks/useEntityAuthor.esm.js';
|
|
24
24
|
import { VoteButtonContainer } from '../Styled/VoteButtonContainer.esm.js';
|
|
25
|
+
import { UserLink } from '../Links/Links.esm.js';
|
|
25
26
|
|
|
26
27
|
const PostListItem = (props) => {
|
|
27
28
|
const { post, entity, type } = props;
|
|
@@ -39,7 +40,6 @@ const PostListItem = (props) => {
|
|
|
39
40
|
}, [lastSignal]);
|
|
40
41
|
const questionRoute = useRouteRef(questionRouteRef);
|
|
41
42
|
const articleRoute = useRouteRef(articleRouteRef);
|
|
42
|
-
const userRoute = useRouteRef(userRouteRef);
|
|
43
43
|
const { name, initials, user } = useEntityAuthor(post);
|
|
44
44
|
const route = post.type === "question" ? questionRoute : articleRoute;
|
|
45
45
|
const href = entity ? `${route({
|
|
@@ -82,7 +82,8 @@ const PostListItem = (props) => {
|
|
|
82
82
|
size: "small",
|
|
83
83
|
sx: (theme) => ({
|
|
84
84
|
userSelect: "none",
|
|
85
|
-
|
|
85
|
+
// eslint-disable-next-line no-nested-ternary
|
|
86
|
+
borderColor: correctAnswer ? theme.palette.success.main : answersCount === 0 ? theme.palette.warning.main : void 0,
|
|
86
87
|
marginBottom: 0
|
|
87
88
|
}),
|
|
88
89
|
label: t("common.answers", {
|
|
@@ -136,7 +137,7 @@ const PostListItem = (props) => {
|
|
|
136
137
|
},
|
|
137
138
|
initials
|
|
138
139
|
),
|
|
139
|
-
|
|
140
|
+
/* @__PURE__ */ React__default.createElement(UserLink, { entityRef: post.author }),
|
|
140
141
|
" ",
|
|
141
142
|
/* @__PURE__ */ React__default.createElement(Link, { to: href, className: "qetaPostListItemQuestionBtn" }, /* @__PURE__ */ React__default.createElement(RelativeTimeWithTooltip, { value: post.created }))
|
|
142
143
|
))))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PostListItem.esm.js","sources":["../../../src/components/PostsContainer/PostListItem.tsx"],"sourcesContent":["import Typography from '@mui/material/Typography';\nimport Avatar from '@mui/material/Avatar';\nimport Grid from '@mui/material/Grid';\nimport Chip from '@mui/material/Chip';\nimport { Link } from '@backstage/core-components';\nimport React, { useEffect, useState } from 'react';\nimport DOMPurify from 'dompurify';\nimport {\n PostResponse,\n PostType,\n QetaSignal,\n removeMarkdownFormatting,\n truncate,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { TagsAndEntities } from '../TagsAndEntities/TagsAndEntities';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport { articleRouteRef, questionRouteRef, userRouteRef } from '../../routes';\nimport { RelativeTimeWithTooltip } from '../RelativeTimeWithTooltip';\nimport { useSignal } from '@backstage/plugin-signals-react';\nimport { VoteButtons } from '../Buttons/VoteButtons';\nimport { FavoriteButton } from '../Buttons/FavoriteButton';\nimport { capitalize } from 'lodash';\nimport CollectionsBookmarkIcon from '@mui/icons-material/CollectionsBookmark';\nimport HelpOutlined from '@mui/icons-material/HelpOutlined';\nimport { useTranslation } from '../../hooks';\nimport { useEntityAuthor } from '../../hooks/useEntityAuthor';\nimport { VoteButtonContainer } from '../Styled/VoteButtonContainer';\n\nexport interface PostListItemProps {\n post: PostResponse;\n entity?: string;\n type?: PostType;\n}\n\nexport const PostListItem = (props: PostListItemProps) => {\n const { post, entity, type } = props;\n\n const [correctAnswer, setCorrectAnswer] = useState(post.correctAnswer);\n const [answersCount, setAnswersCount] = useState(post.answersCount);\n const [views, setViews] = useState(post.views);\n const { t } = useTranslation();\n\n const { lastSignal } = useSignal<QetaSignal>(`qeta:post_${post.id}`);\n\n useEffect(() => {\n if (lastSignal?.type === 'post_stats') {\n setCorrectAnswer(lastSignal.correctAnswer);\n setAnswersCount(lastSignal.answersCount);\n setViews(lastSignal.views);\n }\n }, [lastSignal]);\n\n const questionRoute = useRouteRef(questionRouteRef);\n const articleRoute = useRouteRef(articleRouteRef);\n const userRoute = useRouteRef(userRouteRef);\n const { name, initials, user } = useEntityAuthor(post);\n\n const route = post.type === 'question' ? questionRoute : articleRoute;\n const href = entity\n ? `${route({\n id: post.id.toString(10),\n })}?entity=${entity}`\n : route({ id: post.id.toString(10) });\n\n return (\n <Grid\n container\n spacing={2}\n justifyContent=\"flex-start\"\n sx={{ padding: '0.7rem', paddingBottom: '1.0rem' }}\n >\n <Grid item justifyContent=\"center\" style={{ paddingTop: '0px' }}>\n <VoteButtonContainer>\n <VoteButtons entity={post} />\n <FavoriteButton entity={post} />\n </VoteButtonContainer>\n </Grid>\n <Grid item sx={{ display: 'inline-block', width: 'calc(100% - 80px)' }}>\n <Grid container>\n <Grid\n item\n xs={12}\n style={{\n paddingTop: '0.4rem',\n paddingBottom: '0.4rem',\n paddingLeft: '0.8rem',\n }}\n >\n {type === undefined && (\n <Chip\n color=\"secondary\"\n size=\"small\"\n label={`${capitalize(post.type)}`}\n sx={{ userSelect: 'none', marginBottom: 0 }}\n icon={\n post.type === 'question' ? (\n <HelpOutlined />\n ) : (\n <CollectionsBookmarkIcon />\n )\n }\n />\n )}\n {post.type === 'question' && (\n <Chip\n variant=\"outlined\"\n size=\"small\"\n sx={theme => ({\n userSelect: 'none',\n borderColor: correctAnswer\n ? theme.palette.success.main\n : undefined,\n marginBottom: 0,\n })}\n label={t('common.answers', {\n count: answersCount,\n })}\n />\n )}\n <Chip\n variant=\"outlined\"\n size=\"small\"\n sx={{ userSelect: 'none', border: 'none', marginBottom: 0 }}\n label={t('common.viewsShort', {\n count: views,\n })}\n />\n </Grid>\n <Grid item xs={12} style={{ paddingTop: '0px' }}>\n <Typography variant=\"h5\" component=\"div\">\n <Link to={href} className=\"qetaPostListItemQuestionBtn\">\n {post.title}\n </Link>\n </Typography>\n <Typography\n variant=\"caption\"\n noWrap\n component=\"div\"\n className=\"qetaPostListItemContent\"\n style={{ marginBottom: '5px' }}\n >\n {DOMPurify.sanitize(\n truncate(removeMarkdownFormatting(post.content), 150),\n )}\n </Typography>\n </Grid>\n <Grid item xs={12}>\n <TagsAndEntities entity={post} />\n <Typography\n variant=\"caption\"\n display=\"inline\"\n style={{ display: 'inline', float: 'right' }}\n >\n <Avatar\n src={user?.spec?.profile?.picture}\n alt={name}\n variant=\"rounded\"\n sx={{\n display: 'inline-flex !important',\n marginRight: '0.25rem',\n fontSize: '1rem',\n maxWidth: '1rem',\n maxHeight: '1rem',\n }}\n >\n {initials}\n </Avatar>\n {post.author === 'anonymous' ? (\n t('common.anonymousAuthor')\n ) : (\n <Link to={`${userRoute()}/${post.author}`}>{name}</Link>\n )}{' '}\n <Link to={href} className=\"qetaPostListItemQuestionBtn\">\n <RelativeTimeWithTooltip value={post.created} />\n </Link>\n </Typography>\n </Grid>\n </Grid>\n </Grid>\n </Grid>\n );\n};\n"],"names":["React"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PostListItem.esm.js","sources":["../../../src/components/PostsContainer/PostListItem.tsx"],"sourcesContent":["import Typography from '@mui/material/Typography';\nimport Avatar from '@mui/material/Avatar';\nimport Grid from '@mui/material/Grid';\nimport Chip from '@mui/material/Chip';\nimport { Link } from '@backstage/core-components';\nimport React, { useEffect, useState } from 'react';\nimport DOMPurify from 'dompurify';\nimport {\n PostResponse,\n PostType,\n QetaSignal,\n removeMarkdownFormatting,\n truncate,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { TagsAndEntities } from '../TagsAndEntities/TagsAndEntities';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport { articleRouteRef, questionRouteRef } from '../../routes';\nimport { RelativeTimeWithTooltip } from '../RelativeTimeWithTooltip';\nimport { useSignal } from '@backstage/plugin-signals-react';\nimport { VoteButtons } from '../Buttons/VoteButtons';\nimport { FavoriteButton } from '../Buttons/FavoriteButton';\nimport { capitalize } from 'lodash';\nimport CollectionsBookmarkIcon from '@mui/icons-material/CollectionsBookmark';\nimport HelpOutlined from '@mui/icons-material/HelpOutlined';\nimport { useTranslation } from '../../hooks';\nimport { useEntityAuthor } from '../../hooks/useEntityAuthor';\nimport { VoteButtonContainer } from '../Styled/VoteButtonContainer';\nimport { UserLink } from '../Links';\n\nexport interface PostListItemProps {\n post: PostResponse;\n entity?: string;\n type?: PostType;\n}\n\nexport const PostListItem = (props: PostListItemProps) => {\n const { post, entity, type } = props;\n\n const [correctAnswer, setCorrectAnswer] = useState(post.correctAnswer);\n const [answersCount, setAnswersCount] = useState(post.answersCount);\n const [views, setViews] = useState(post.views);\n const { t } = useTranslation();\n\n const { lastSignal } = useSignal<QetaSignal>(`qeta:post_${post.id}`);\n\n useEffect(() => {\n if (lastSignal?.type === 'post_stats') {\n setCorrectAnswer(lastSignal.correctAnswer);\n setAnswersCount(lastSignal.answersCount);\n setViews(lastSignal.views);\n }\n }, [lastSignal]);\n\n const questionRoute = useRouteRef(questionRouteRef);\n const articleRoute = useRouteRef(articleRouteRef);\n const { name, initials, user } = useEntityAuthor(post);\n\n const route = post.type === 'question' ? questionRoute : articleRoute;\n const href = entity\n ? `${route({\n id: post.id.toString(10),\n })}?entity=${entity}`\n : route({ id: post.id.toString(10) });\n\n return (\n <Grid\n container\n spacing={2}\n justifyContent=\"flex-start\"\n sx={{ padding: '0.7rem', paddingBottom: '1.0rem' }}\n >\n <Grid item justifyContent=\"center\" style={{ paddingTop: '0px' }}>\n <VoteButtonContainer>\n <VoteButtons entity={post} />\n <FavoriteButton entity={post} />\n </VoteButtonContainer>\n </Grid>\n <Grid item sx={{ display: 'inline-block', width: 'calc(100% - 80px)' }}>\n <Grid container>\n <Grid\n item\n xs={12}\n style={{\n paddingTop: '0.4rem',\n paddingBottom: '0.4rem',\n paddingLeft: '0.8rem',\n }}\n >\n {type === undefined && (\n <Chip\n color=\"secondary\"\n size=\"small\"\n label={`${capitalize(post.type)}`}\n sx={{ userSelect: 'none', marginBottom: 0 }}\n icon={\n post.type === 'question' ? (\n <HelpOutlined />\n ) : (\n <CollectionsBookmarkIcon />\n )\n }\n />\n )}\n {post.type === 'question' && (\n <Chip\n variant=\"outlined\"\n size=\"small\"\n sx={theme => ({\n userSelect: 'none',\n // eslint-disable-next-line no-nested-ternary\n borderColor: correctAnswer\n ? theme.palette.success.main\n : answersCount === 0\n ? theme.palette.warning.main\n : undefined,\n marginBottom: 0,\n })}\n label={t('common.answers', {\n count: answersCount,\n })}\n />\n )}\n <Chip\n variant=\"outlined\"\n size=\"small\"\n sx={{ userSelect: 'none', border: 'none', marginBottom: 0 }}\n label={t('common.viewsShort', {\n count: views,\n })}\n />\n </Grid>\n <Grid item xs={12} style={{ paddingTop: '0px' }}>\n <Typography variant=\"h5\" component=\"div\">\n <Link to={href} className=\"qetaPostListItemQuestionBtn\">\n {post.title}\n </Link>\n </Typography>\n <Typography\n variant=\"caption\"\n noWrap\n component=\"div\"\n className=\"qetaPostListItemContent\"\n style={{ marginBottom: '5px' }}\n >\n {DOMPurify.sanitize(\n truncate(removeMarkdownFormatting(post.content), 150),\n )}\n </Typography>\n </Grid>\n <Grid item xs={12}>\n <TagsAndEntities entity={post} />\n <Typography\n variant=\"caption\"\n display=\"inline\"\n style={{ display: 'inline', float: 'right' }}\n >\n <Avatar\n src={user?.spec?.profile?.picture}\n alt={name}\n variant=\"rounded\"\n sx={{\n display: 'inline-flex !important',\n marginRight: '0.25rem',\n fontSize: '1rem',\n maxWidth: '1rem',\n maxHeight: '1rem',\n }}\n >\n {initials}\n </Avatar>\n <UserLink entityRef={post.author} />{' '}\n <Link to={href} className=\"qetaPostListItemQuestionBtn\">\n <RelativeTimeWithTooltip value={post.created} />\n </Link>\n </Typography>\n </Grid>\n </Grid>\n </Grid>\n </Grid>\n );\n};\n"],"names":["React"],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import { truncate, removeMarkdownFormatting } from '@drodil/backstage-plugin-qet
|
|
|
2
2
|
import React__default, { useState, useEffect } from 'react';
|
|
3
3
|
import { useSignal } from '@backstage/plugin-signals-react';
|
|
4
4
|
import { useApi, useRouteRef } from '@backstage/core-plugin-api';
|
|
5
|
-
import { questionRouteRef, articleRouteRef
|
|
5
|
+
import { questionRouteRef, articleRouteRef } from '../../routes.esm.js';
|
|
6
6
|
import Card from '@mui/material/Card';
|
|
7
7
|
import CardContent from '@mui/material/CardContent';
|
|
8
8
|
import CardActionArea from '@mui/material/CardActionArea';
|
|
@@ -27,6 +27,7 @@ import VerticalAlignBottomIcon from '@mui/icons-material/VerticalAlignBottom';
|
|
|
27
27
|
import KeyboardArrowUpIcon from '@mui/icons-material/KeyboardArrowUp';
|
|
28
28
|
import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';
|
|
29
29
|
import Stack from '@mui/material/Stack';
|
|
30
|
+
import { UserLink } from '../Links/Links.esm.js';
|
|
30
31
|
|
|
31
32
|
const PostsGridItem = (props) => {
|
|
32
33
|
const { post, entity, allowRanking, onRankUpdate, collectionId } = props;
|
|
@@ -41,7 +42,6 @@ const PostsGridItem = (props) => {
|
|
|
41
42
|
}, [lastSignal]);
|
|
42
43
|
const questionRoute = useRouteRef(questionRouteRef);
|
|
43
44
|
const articleRoute = useRouteRef(articleRouteRef);
|
|
44
|
-
const userRoute = useRouteRef(userRouteRef);
|
|
45
45
|
const { name, initials, user } = useEntityAuthor(post);
|
|
46
46
|
const navigate = useNavigate();
|
|
47
47
|
const route = post.type === "question" ? questionRoute : articleRoute;
|
|
@@ -83,7 +83,7 @@ const PostsGridItem = (props) => {
|
|
|
83
83
|
}
|
|
84
84
|
},
|
|
85
85
|
initials
|
|
86
|
-
),
|
|
86
|
+
), /* @__PURE__ */ React__default.createElement(UserLink, { entityRef: post.author }), " ", /* @__PURE__ */ React__default.createElement(Link, { to: href, className: "qetaPostListItemQuestionBtn" }, /* @__PURE__ */ React__default.createElement(RelativeTimeWithTooltip, { value: post.created })), " \xB7 ", t("common.views", { count: views }))), allowRanking && /* @__PURE__ */ React__default.createElement(
|
|
87
87
|
Stack,
|
|
88
88
|
{
|
|
89
89
|
direction: "row",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PostsGridItem.esm.js","sources":["../../../src/components/PostsGrid/PostsGridItem.tsx"],"sourcesContent":["import {\n PostResponse,\n PostType,\n QetaSignal,\n removeMarkdownFormatting,\n truncate,\n} from '@drodil/backstage-plugin-qeta-common';\nimport React, { useEffect, useState } from 'react';\nimport { useSignal } from '@backstage/plugin-signals-react';\nimport { useApi, useRouteRef } from '@backstage/core-plugin-api';\nimport { articleRouteRef, questionRouteRef, userRouteRef } from '../../routes';\nimport Card from '@mui/material/Card';\nimport CardContent from '@mui/material/CardContent';\nimport CardActionArea from '@mui/material/CardActionArea';\nimport IconButton from '@mui/material/IconButton';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\nimport Box from '@mui/material/Box';\nimport Avatar from '@mui/material/Avatar';\nimport CardMedia from '@mui/material/CardMedia';\nimport DOMPurify from 'dompurify';\nimport { useNavigate } from 'react-router-dom';\nimport { TagsAndEntities } from '../TagsAndEntities/TagsAndEntities';\nimport { Link } from '@backstage/core-components';\nimport { RelativeTimeWithTooltip } from '../RelativeTimeWithTooltip';\nimport { useTranslation } from '../../hooks';\nimport { useEntityAuthor } from '../../hooks/useEntityAuthor';\nimport { qetaApiRef } from '../../api';\nimport VerticalAlignTopIcon from '@mui/icons-material/VerticalAlignTop';\nimport VerticalAlignBottomIcon from '@mui/icons-material/VerticalAlignBottom';\nimport KeyboardArrowUpIcon from '@mui/icons-material/KeyboardArrowUp';\nimport KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';\nimport Stack from '@mui/material/Stack';\n\nexport interface PostsGridItemProps {\n post: PostResponse;\n entity?: string;\n type?: PostType;\n allowRanking?: boolean;\n onRankUpdate?: () => void;\n collectionId?: number;\n}\n\nexport const PostsGridItem = (props: PostsGridItemProps) => {\n const { post, entity, allowRanking, onRankUpdate, collectionId } = props;\n const [views, setViews] = useState(post.views);\n const qetaApi = useApi(qetaApiRef);\n const { t } = useTranslation();\n\n const { lastSignal } = useSignal<QetaSignal>(`qeta:post_${post.id}`);\n\n useEffect(() => {\n if (lastSignal?.type === 'post_stats') {\n setViews(lastSignal.views);\n }\n }, [lastSignal]);\n\n const questionRoute = useRouteRef(questionRouteRef);\n const articleRoute = useRouteRef(articleRouteRef);\n const userRoute = useRouteRef(userRouteRef);\n const { name, initials, user } = useEntityAuthor(post);\n const navigate = useNavigate();\n\n const route = post.type === 'question' ? questionRoute : articleRoute;\n const href = entity\n ? `${route({\n id: post.id.toString(10),\n })}?entity=${entity}`\n : route({ id: post.id.toString(10) });\n\n const rank = (direction: 'top' | 'bottom' | 'up' | 'down') => {\n if (!collectionId) {\n return;\n }\n qetaApi.rankPostInCollection(collectionId, post.id, direction).then(res => {\n if (res) {\n onRankUpdate?.();\n }\n });\n };\n\n return (\n <Card style={{ height: '100%' }}>\n <CardActionArea onClick={() => navigate(href)}>\n {post.headerImage && (\n <CardMedia\n component=\"img\"\n height=\"140\"\n image={post.headerImage}\n alt={post.title}\n />\n )}\n <CardContent style={{ paddingBottom: '0.5rem' }}>\n <Typography gutterBottom variant=\"h6\" component=\"div\">\n {post.title}\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\" gutterBottom>\n {DOMPurify.sanitize(\n truncate(removeMarkdownFormatting(post.content), 400),\n )}\n </Typography>\n </CardContent>\n </CardActionArea>\n <CardContent style={{ paddingTop: '0.5rem' }}>\n <TagsAndEntities entity={post} />\n <Box style={{ paddingLeft: '0.2rem', paddingTop: '0.5rem' }}>\n <Typography variant=\"caption\">\n <Avatar\n src={user?.spec?.profile?.picture}\n alt={name}\n variant=\"rounded\"\n sx={{\n display: 'inline-flex !important',\n marginRight: '0.25rem',\n fontSize: '1rem',\n maxWidth: '1rem',\n maxHeight: '1rem',\n }}\n >\n {initials}\n </Avatar>\n {post.author === 'anonymous' ? (\n t('common.anonymousAuthor')\n ) : (\n <Link to={`${userRoute()}/${post.author}`}>{name}</Link>\n )}{' '}\n <Link to={href} className=\"qetaPostListItemQuestionBtn\">\n <RelativeTimeWithTooltip value={post.created} />\n </Link>\n {' · '}\n {t('common.views', { count: views })}\n </Typography>\n </Box>\n {allowRanking && (\n <Stack\n direction=\"row\"\n spacing={0}\n style={{\n paddingRight: '0.2rem',\n paddingTop: '0.5rem',\n float: 'right',\n }}\n >\n <Tooltip title={t('ranking.top')}>\n <IconButton size=\"small\" onClick={() => rank('top')}>\n <VerticalAlignTopIcon />\n </IconButton>\n </Tooltip>\n <Tooltip title={t('ranking.up')}>\n <IconButton size=\"small\" onClick={() => rank('up')}>\n <KeyboardArrowUpIcon />\n </IconButton>\n </Tooltip>\n <Tooltip title={t('ranking.down')}>\n <IconButton size=\"small\" onClick={() => rank('down')}>\n <KeyboardArrowDownIcon />\n </IconButton>\n </Tooltip>\n <Tooltip title={t('ranking.bottom')}>\n <IconButton size=\"small\" onClick={() => rank('bottom')}>\n <VerticalAlignBottomIcon />\n </IconButton>\n </Tooltip>\n </Stack>\n )}\n </CardContent>\n </Card>\n );\n};\n"],"names":["React"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PostsGridItem.esm.js","sources":["../../../src/components/PostsGrid/PostsGridItem.tsx"],"sourcesContent":["import {\n PostResponse,\n PostType,\n QetaSignal,\n removeMarkdownFormatting,\n truncate,\n} from '@drodil/backstage-plugin-qeta-common';\nimport React, { useEffect, useState } from 'react';\nimport { useSignal } from '@backstage/plugin-signals-react';\nimport { useApi, useRouteRef } from '@backstage/core-plugin-api';\nimport { articleRouteRef, questionRouteRef } from '../../routes';\nimport Card from '@mui/material/Card';\nimport CardContent from '@mui/material/CardContent';\nimport CardActionArea from '@mui/material/CardActionArea';\nimport IconButton from '@mui/material/IconButton';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\nimport Box from '@mui/material/Box';\nimport Avatar from '@mui/material/Avatar';\nimport CardMedia from '@mui/material/CardMedia';\nimport DOMPurify from 'dompurify';\nimport { useNavigate } from 'react-router-dom';\nimport { TagsAndEntities } from '../TagsAndEntities/TagsAndEntities';\nimport { Link } from '@backstage/core-components';\nimport { RelativeTimeWithTooltip } from '../RelativeTimeWithTooltip';\nimport { useTranslation } from '../../hooks';\nimport { useEntityAuthor } from '../../hooks/useEntityAuthor';\nimport { qetaApiRef } from '../../api';\nimport VerticalAlignTopIcon from '@mui/icons-material/VerticalAlignTop';\nimport VerticalAlignBottomIcon from '@mui/icons-material/VerticalAlignBottom';\nimport KeyboardArrowUpIcon from '@mui/icons-material/KeyboardArrowUp';\nimport KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';\nimport Stack from '@mui/material/Stack';\nimport { UserLink } from '../Links';\n\nexport interface PostsGridItemProps {\n post: PostResponse;\n entity?: string;\n type?: PostType;\n allowRanking?: boolean;\n onRankUpdate?: () => void;\n collectionId?: number;\n}\n\nexport const PostsGridItem = (props: PostsGridItemProps) => {\n const { post, entity, allowRanking, onRankUpdate, collectionId } = props;\n const [views, setViews] = useState(post.views);\n const qetaApi = useApi(qetaApiRef);\n const { t } = useTranslation();\n\n const { lastSignal } = useSignal<QetaSignal>(`qeta:post_${post.id}`);\n\n useEffect(() => {\n if (lastSignal?.type === 'post_stats') {\n setViews(lastSignal.views);\n }\n }, [lastSignal]);\n\n const questionRoute = useRouteRef(questionRouteRef);\n const articleRoute = useRouteRef(articleRouteRef);\n const { name, initials, user } = useEntityAuthor(post);\n const navigate = useNavigate();\n\n const route = post.type === 'question' ? questionRoute : articleRoute;\n const href = entity\n ? `${route({\n id: post.id.toString(10),\n })}?entity=${entity}`\n : route({ id: post.id.toString(10) });\n\n const rank = (direction: 'top' | 'bottom' | 'up' | 'down') => {\n if (!collectionId) {\n return;\n }\n qetaApi.rankPostInCollection(collectionId, post.id, direction).then(res => {\n if (res) {\n onRankUpdate?.();\n }\n });\n };\n\n return (\n <Card style={{ height: '100%' }}>\n <CardActionArea onClick={() => navigate(href)}>\n {post.headerImage && (\n <CardMedia\n component=\"img\"\n height=\"140\"\n image={post.headerImage}\n alt={post.title}\n />\n )}\n <CardContent style={{ paddingBottom: '0.5rem' }}>\n <Typography gutterBottom variant=\"h6\" component=\"div\">\n {post.title}\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\" gutterBottom>\n {DOMPurify.sanitize(\n truncate(removeMarkdownFormatting(post.content), 400),\n )}\n </Typography>\n </CardContent>\n </CardActionArea>\n <CardContent style={{ paddingTop: '0.5rem' }}>\n <TagsAndEntities entity={post} />\n <Box style={{ paddingLeft: '0.2rem', paddingTop: '0.5rem' }}>\n <Typography variant=\"caption\">\n <Avatar\n src={user?.spec?.profile?.picture}\n alt={name}\n variant=\"rounded\"\n sx={{\n display: 'inline-flex !important',\n marginRight: '0.25rem',\n fontSize: '1rem',\n maxWidth: '1rem',\n maxHeight: '1rem',\n }}\n >\n {initials}\n </Avatar>\n <UserLink entityRef={post.author} />{' '}\n <Link to={href} className=\"qetaPostListItemQuestionBtn\">\n <RelativeTimeWithTooltip value={post.created} />\n </Link>\n {' · '}\n {t('common.views', { count: views })}\n </Typography>\n </Box>\n {allowRanking && (\n <Stack\n direction=\"row\"\n spacing={0}\n style={{\n paddingRight: '0.2rem',\n paddingTop: '0.5rem',\n float: 'right',\n }}\n >\n <Tooltip title={t('ranking.top')}>\n <IconButton size=\"small\" onClick={() => rank('top')}>\n <VerticalAlignTopIcon />\n </IconButton>\n </Tooltip>\n <Tooltip title={t('ranking.up')}>\n <IconButton size=\"small\" onClick={() => rank('up')}>\n <KeyboardArrowUpIcon />\n </IconButton>\n </Tooltip>\n <Tooltip title={t('ranking.down')}>\n <IconButton size=\"small\" onClick={() => rank('down')}>\n <KeyboardArrowDownIcon />\n </IconButton>\n </Tooltip>\n <Tooltip title={t('ranking.bottom')}>\n <IconButton size=\"small\" onClick={() => rank('bottom')}>\n <VerticalAlignBottomIcon />\n </IconButton>\n </Tooltip>\n </Stack>\n )}\n </CardContent>\n </Card>\n );\n};\n"],"names":["React"],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import Box from '@mui/material/Box';
|
|
2
|
+
import React__default from 'react';
|
|
3
|
+
import ListSubheader from '@mui/material/ListSubheader';
|
|
4
|
+
import List from '@mui/material/List';
|
|
5
|
+
|
|
6
|
+
const RightListContainer = (props) => {
|
|
7
|
+
return /* @__PURE__ */ React__default.createElement(
|
|
8
|
+
Box,
|
|
9
|
+
{
|
|
10
|
+
display: { md: "none", lg: "block" },
|
|
11
|
+
sx: {
|
|
12
|
+
width: "100%",
|
|
13
|
+
bgcolor: "background.paper",
|
|
14
|
+
marginBottom: 2,
|
|
15
|
+
borderRadius: 1
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
props.children
|
|
19
|
+
);
|
|
20
|
+
};
|
|
21
|
+
const RightList = (props) => {
|
|
22
|
+
return /* @__PURE__ */ React__default.createElement(
|
|
23
|
+
List,
|
|
24
|
+
{
|
|
25
|
+
component: "nav",
|
|
26
|
+
"aria-labelledby": "nested-list-subheader",
|
|
27
|
+
subheader: /* @__PURE__ */ React__default.createElement(
|
|
28
|
+
ListSubheader,
|
|
29
|
+
{
|
|
30
|
+
disableSticky: true,
|
|
31
|
+
component: "div",
|
|
32
|
+
id: "nested-list-subheader",
|
|
33
|
+
color: "primary",
|
|
34
|
+
style: {
|
|
35
|
+
whiteSpace: "nowrap",
|
|
36
|
+
overflow: "hidden",
|
|
37
|
+
textOverflow: "ellipsis"
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
props.title,
|
|
41
|
+
props.icon
|
|
42
|
+
)
|
|
43
|
+
},
|
|
44
|
+
props.children
|
|
45
|
+
);
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
export { RightList, RightListContainer };
|
|
49
|
+
//# sourceMappingURL=RightList.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RightList.esm.js","sources":["../../../src/components/Styled/RightList.tsx"],"sourcesContent":["import Box from '@mui/material/Box';\nimport React from 'react';\nimport ListSubheader from '@mui/material/ListSubheader';\nimport List from '@mui/material/List';\n\nexport const RightListContainer = (props: { children: React.ReactNode }) => {\n return (\n <Box\n display={{ md: 'none', lg: 'block' }}\n sx={{\n width: '100%',\n bgcolor: 'background.paper',\n marginBottom: 2,\n borderRadius: 1,\n }}\n >\n {props.children}\n </Box>\n );\n};\n\nexport const RightList = (props: {\n children: React.ReactNode;\n title: string;\n icon?: React.ReactNode;\n}) => {\n return (\n <List\n component=\"nav\"\n aria-labelledby=\"nested-list-subheader\"\n subheader={\n <ListSubheader\n disableSticky\n component=\"div\"\n id=\"nested-list-subheader\"\n color=\"primary\"\n style={{\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n >\n {props.title}\n {props.icon}\n </ListSubheader>\n }\n >\n {props.children}\n </List>\n );\n};\n"],"names":["React"],"mappings":";;;;;AAKa,MAAA,kBAAA,GAAqB,CAAC,KAAyC,KAAA;AAC1E,EACE,uBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,OAAS,EAAA,EAAE,EAAI,EAAA,MAAA,EAAQ,IAAI,OAAQ,EAAA;AAAA,MACnC,EAAI,EAAA;AAAA,QACF,KAAO,EAAA,MAAA;AAAA,QACP,OAAS,EAAA,kBAAA;AAAA,QACT,YAAc,EAAA,CAAA;AAAA,QACd,YAAc,EAAA,CAAA;AAAA,OAChB;AAAA,KAAA;AAAA,IAEC,KAAM,CAAA,QAAA;AAAA,GACT,CAAA;AAEJ,EAAA;AAEa,MAAA,SAAA,GAAY,CAAC,KAIpB,KAAA;AACJ,EACE,uBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,SAAU,EAAA,KAAA;AAAA,MACV,iBAAgB,EAAA,uBAAA;AAAA,MAChB,SACE,kBAAAA,cAAA,CAAA,aAAA;AAAA,QAAC,aAAA;AAAA,QAAA;AAAA,UACC,aAAa,EAAA,IAAA;AAAA,UACb,SAAU,EAAA,KAAA;AAAA,UACV,EAAG,EAAA,uBAAA;AAAA,UACH,KAAM,EAAA,SAAA;AAAA,UACN,KAAO,EAAA;AAAA,YACL,UAAY,EAAA,QAAA;AAAA,YACZ,QAAU,EAAA,QAAA;AAAA,YACV,YAAc,EAAA,UAAA;AAAA,WAChB;AAAA,SAAA;AAAA,QAEC,KAAM,CAAA,KAAA;AAAA,QACN,KAAM,CAAA,IAAA;AAAA,OACT;AAAA,KAAA;AAAA,IAGD,KAAM,CAAA,QAAA;AAAA,GACT,CAAA;AAEJ;;;;"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { useQetaApi } from '../../hooks/useQetaApi.esm.js';
|
|
2
|
+
import React__default from 'react';
|
|
3
|
+
import { useRouteRef } from '@backstage/core-plugin-api';
|
|
4
|
+
import '../../api.esm.js';
|
|
5
|
+
import { useTranslation } from '../../hooks/useTranslation.esm.js';
|
|
6
|
+
import 'react-use/lib/useAsync';
|
|
7
|
+
import CardHeader from '@mui/material/CardHeader';
|
|
8
|
+
import Card from '@mui/material/Card';
|
|
9
|
+
import List from '@mui/material/List';
|
|
10
|
+
import ListItem from '@mui/material/ListItem';
|
|
11
|
+
import AssistantIcon from '@mui/icons-material/Assistant';
|
|
12
|
+
import HelpOutlined from '@mui/icons-material/HelpOutlined';
|
|
13
|
+
import Check from '@mui/icons-material/Check';
|
|
14
|
+
import CollectionsBookmarkIcon from '@mui/icons-material/CollectionsBookmark';
|
|
15
|
+
import { useNavigate } from 'react-router-dom';
|
|
16
|
+
import ListItemButton from '@mui/material/ListItemButton';
|
|
17
|
+
import { questionRouteRef, articleRouteRef } from '../../routes.esm.js';
|
|
18
|
+
import ListItemIcon from '@mui/material/ListItemIcon';
|
|
19
|
+
|
|
20
|
+
const SuggestionListItem = (props) => {
|
|
21
|
+
const navigate = useNavigate();
|
|
22
|
+
return /* @__PURE__ */ React__default.createElement(ListItem, { disablePadding: true, disableGutters: true }, /* @__PURE__ */ React__default.createElement(ListItemButton, { onClick: () => navigate(props.href) }, props.icon && /* @__PURE__ */ React__default.createElement(ListItemIcon, null, props.icon), props.children));
|
|
23
|
+
};
|
|
24
|
+
const NoCorrectAnswerSuggestionItem = (props) => {
|
|
25
|
+
const { suggestion } = props;
|
|
26
|
+
const { t } = useTranslation();
|
|
27
|
+
const questionRoute = useRouteRef(questionRouteRef);
|
|
28
|
+
return /* @__PURE__ */ React__default.createElement(
|
|
29
|
+
SuggestionListItem,
|
|
30
|
+
{
|
|
31
|
+
href: questionRoute({ id: suggestion.question.id.toString(10) }),
|
|
32
|
+
icon: /* @__PURE__ */ React__default.createElement(Check, null)
|
|
33
|
+
},
|
|
34
|
+
t("suggestionsCard.noCorrectAnswer", {
|
|
35
|
+
title: suggestion.question.title
|
|
36
|
+
})
|
|
37
|
+
);
|
|
38
|
+
};
|
|
39
|
+
const NewQuestionSuggestionItem = (props) => {
|
|
40
|
+
const { suggestion } = props;
|
|
41
|
+
const { t } = useTranslation();
|
|
42
|
+
const questionRoute = useRouteRef(questionRouteRef);
|
|
43
|
+
return /* @__PURE__ */ React__default.createElement(
|
|
44
|
+
SuggestionListItem,
|
|
45
|
+
{
|
|
46
|
+
href: questionRoute({ id: suggestion.question.id.toString(10) }),
|
|
47
|
+
icon: /* @__PURE__ */ React__default.createElement(HelpOutlined, null)
|
|
48
|
+
},
|
|
49
|
+
t("suggestionsCard.newQuestion", {
|
|
50
|
+
title: suggestion.question.title
|
|
51
|
+
})
|
|
52
|
+
);
|
|
53
|
+
};
|
|
54
|
+
const NewArticleSuggestionItem = (props) => {
|
|
55
|
+
const { suggestion } = props;
|
|
56
|
+
const { t } = useTranslation();
|
|
57
|
+
const articleRoute = useRouteRef(articleRouteRef);
|
|
58
|
+
return /* @__PURE__ */ React__default.createElement(
|
|
59
|
+
SuggestionListItem,
|
|
60
|
+
{
|
|
61
|
+
href: articleRoute({ id: suggestion.article.id.toString(10) }),
|
|
62
|
+
icon: /* @__PURE__ */ React__default.createElement(CollectionsBookmarkIcon, null)
|
|
63
|
+
},
|
|
64
|
+
t("suggestionsCard.newArticle", {
|
|
65
|
+
title: suggestion.article.title
|
|
66
|
+
})
|
|
67
|
+
);
|
|
68
|
+
};
|
|
69
|
+
const suggestionTypeMap = {
|
|
70
|
+
noCorrectAnswer: NoCorrectAnswerSuggestionItem,
|
|
71
|
+
newQuestion: NewQuestionSuggestionItem,
|
|
72
|
+
newArticle: NewArticleSuggestionItem
|
|
73
|
+
};
|
|
74
|
+
const SuggestionsCard = () => {
|
|
75
|
+
const { t } = useTranslation();
|
|
76
|
+
const { value: response } = useQetaApi((api) => api.getSuggestions(), []);
|
|
77
|
+
const suggestions = response?.suggestions ?? [];
|
|
78
|
+
if (suggestions.length === 0) {
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
return /* @__PURE__ */ React__default.createElement(Card, null, /* @__PURE__ */ React__default.createElement(
|
|
82
|
+
CardHeader,
|
|
83
|
+
{
|
|
84
|
+
style: { paddingBottom: "8px" },
|
|
85
|
+
title: t("suggestionsCard.title"),
|
|
86
|
+
avatar: /* @__PURE__ */ React__default.createElement(AssistantIcon, null),
|
|
87
|
+
titleTypographyProps: { variant: "h5" }
|
|
88
|
+
}
|
|
89
|
+
), /* @__PURE__ */ React__default.createElement(List, null, suggestions.map((suggestion) => {
|
|
90
|
+
const SuggestionComponent = suggestionTypeMap[suggestion.type];
|
|
91
|
+
return /* @__PURE__ */ React__default.createElement(SuggestionComponent, { suggestion });
|
|
92
|
+
})));
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
export { SuggestionsCard };
|
|
96
|
+
//# sourceMappingURL=SuggestionsCard.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SuggestionsCard.esm.js","sources":["../../../src/components/SuggestionsCard/SuggestionsCard.tsx"],"sourcesContent":["import { useQetaApi, useTranslation } from '../../hooks';\nimport CardHeader from '@mui/material/CardHeader';\nimport Card from '@mui/material/Card';\nimport React, { ReactNode } from 'react';\nimport {\n NewArticleSuggestion,\n NewQuestionSuggestion,\n NoCorrectAnswerSuggestion,\n SuggestionType,\n} from '@drodil/backstage-plugin-qeta-common';\nimport List from '@mui/material/List';\nimport ListItem from '@mui/material/ListItem';\nimport AssistantIcon from '@mui/icons-material/Assistant';\nimport HelpOutlinedIcon from '@mui/icons-material/HelpOutlined';\nimport CheckIcon from '@mui/icons-material/Check';\nimport CollectionsBookmarkIcon from '@mui/icons-material/CollectionsBookmark';\nimport { useNavigate } from 'react-router-dom';\nimport ListItemButton from '@mui/material/ListItemButton';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport { articleRouteRef, questionRouteRef } from '../../routes';\nimport ListItemIcon from '@mui/material/ListItemIcon';\n\nconst SuggestionListItem = (props: {\n children: ReactNode;\n href: string;\n icon?: ReactNode;\n}) => {\n const navigate = useNavigate();\n return (\n <ListItem disablePadding disableGutters>\n <ListItemButton onClick={() => navigate(props.href)}>\n {props.icon && <ListItemIcon>{props.icon}</ListItemIcon>}\n {props.children}\n </ListItemButton>\n </ListItem>\n );\n};\n\nconst NoCorrectAnswerSuggestionItem = (props: {\n suggestion: NoCorrectAnswerSuggestion;\n}) => {\n const { suggestion } = props;\n const { t } = useTranslation();\n const questionRoute = useRouteRef(questionRouteRef);\n return (\n <SuggestionListItem\n href={questionRoute({ id: suggestion.question.id.toString(10) })}\n icon={<CheckIcon />}\n >\n {t('suggestionsCard.noCorrectAnswer', {\n title: suggestion.question.title,\n })}\n </SuggestionListItem>\n );\n};\n\nconst NewQuestionSuggestionItem = (props: {\n suggestion: NewQuestionSuggestion;\n}) => {\n const { suggestion } = props;\n const { t } = useTranslation();\n const questionRoute = useRouteRef(questionRouteRef);\n return (\n <SuggestionListItem\n href={questionRoute({ id: suggestion.question.id.toString(10) })}\n icon={<HelpOutlinedIcon />}\n >\n {t('suggestionsCard.newQuestion', {\n title: suggestion.question.title,\n })}\n </SuggestionListItem>\n );\n};\n\nconst NewArticleSuggestionItem = (props: {\n suggestion: NewArticleSuggestion;\n}) => {\n const { suggestion } = props;\n const { t } = useTranslation();\n const articleRoute = useRouteRef(articleRouteRef);\n return (\n <SuggestionListItem\n href={articleRoute({ id: suggestion.article.id.toString(10) })}\n icon={<CollectionsBookmarkIcon />}\n >\n {t('suggestionsCard.newArticle', {\n title: suggestion.article.title,\n })}\n </SuggestionListItem>\n );\n};\n\nconst suggestionTypeMap: Record<SuggestionType, any> = {\n noCorrectAnswer: NoCorrectAnswerSuggestionItem,\n newQuestion: NewQuestionSuggestionItem,\n newArticle: NewArticleSuggestionItem,\n};\n\nexport const SuggestionsCard = () => {\n const { t } = useTranslation();\n const { value: response } = useQetaApi(api => api.getSuggestions(), []);\n\n const suggestions = response?.suggestions ?? [];\n if (suggestions.length === 0) {\n return null;\n }\n\n return (\n <Card>\n <CardHeader\n style={{ paddingBottom: '8px' }}\n title={t('suggestionsCard.title')}\n avatar={<AssistantIcon />}\n titleTypographyProps={{ variant: 'h5' }}\n />\n <List>\n {suggestions.map(suggestion => {\n const SuggestionComponent = suggestionTypeMap[suggestion.type];\n return <SuggestionComponent suggestion={suggestion} />;\n })}\n </List>\n </Card>\n );\n};\n"],"names":["React","CheckIcon","HelpOutlinedIcon"],"mappings":";;;;;;;;;;;;;;;;;;;AAsBA,MAAM,kBAAA,GAAqB,CAAC,KAItB,KAAA;AACJ,EAAA,MAAM,WAAW,WAAY,EAAA,CAAA;AAC7B,EACE,uBAAAA,cAAA,CAAA,aAAA,CAAC,YAAS,cAAc,EAAA,IAAA,EAAC,gBAAc,IACrC,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,cAAe,EAAA,EAAA,OAAA,EAAS,MAAM,QAAA,CAAS,MAAM,IAAI,CAAA,EAAA,EAC/C,KAAM,CAAA,IAAA,oBAASA,cAAA,CAAA,aAAA,CAAA,YAAA,EAAA,IAAA,EAAc,MAAM,IAAK,CAAA,EACxC,KAAM,CAAA,QACT,CACF,CAAA,CAAA;AAEJ,CAAA,CAAA;AAEA,MAAM,6BAAA,GAAgC,CAAC,KAEjC,KAAA;AACJ,EAAM,MAAA,EAAE,YAAe,GAAA,KAAA,CAAA;AACvB,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,cAAe,EAAA,CAAA;AAC7B,EAAM,MAAA,aAAA,GAAgB,YAAY,gBAAgB,CAAA,CAAA;AAClD,EACE,uBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,kBAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAM,aAAc,CAAA,EAAE,EAAI,EAAA,UAAA,CAAW,SAAS,EAAG,CAAA,QAAA,CAAS,EAAE,CAAA,EAAG,CAAA;AAAA,MAC/D,IAAA,+CAAOC,KAAU,EAAA,IAAA,CAAA;AAAA,KAAA;AAAA,IAEhB,EAAE,iCAAmC,EAAA;AAAA,MACpC,KAAA,EAAO,WAAW,QAAS,CAAA,KAAA;AAAA,KAC5B,CAAA;AAAA,GACH,CAAA;AAEJ,CAAA,CAAA;AAEA,MAAM,yBAAA,GAA4B,CAAC,KAE7B,KAAA;AACJ,EAAM,MAAA,EAAE,YAAe,GAAA,KAAA,CAAA;AACvB,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,cAAe,EAAA,CAAA;AAC7B,EAAM,MAAA,aAAA,GAAgB,YAAY,gBAAgB,CAAA,CAAA;AAClD,EACE,uBAAAD,cAAA,CAAA,aAAA;AAAA,IAAC,kBAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAM,aAAc,CAAA,EAAE,EAAI,EAAA,UAAA,CAAW,SAAS,EAAG,CAAA,QAAA,CAAS,EAAE,CAAA,EAAG,CAAA;AAAA,MAC/D,IAAA,+CAAOE,YAAiB,EAAA,IAAA,CAAA;AAAA,KAAA;AAAA,IAEvB,EAAE,6BAA+B,EAAA;AAAA,MAChC,KAAA,EAAO,WAAW,QAAS,CAAA,KAAA;AAAA,KAC5B,CAAA;AAAA,GACH,CAAA;AAEJ,CAAA,CAAA;AAEA,MAAM,wBAAA,GAA2B,CAAC,KAE5B,KAAA;AACJ,EAAM,MAAA,EAAE,YAAe,GAAA,KAAA,CAAA;AACvB,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,cAAe,EAAA,CAAA;AAC7B,EAAM,MAAA,YAAA,GAAe,YAAY,eAAe,CAAA,CAAA;AAChD,EACE,uBAAAF,cAAA,CAAA,aAAA;AAAA,IAAC,kBAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAM,YAAa,CAAA,EAAE,EAAI,EAAA,UAAA,CAAW,QAAQ,EAAG,CAAA,QAAA,CAAS,EAAE,CAAA,EAAG,CAAA;AAAA,MAC7D,IAAA,+CAAO,uBAAwB,EAAA,IAAA,CAAA;AAAA,KAAA;AAAA,IAE9B,EAAE,4BAA8B,EAAA;AAAA,MAC/B,KAAA,EAAO,WAAW,OAAQ,CAAA,KAAA;AAAA,KAC3B,CAAA;AAAA,GACH,CAAA;AAEJ,CAAA,CAAA;AAEA,MAAM,iBAAiD,GAAA;AAAA,EACrD,eAAiB,EAAA,6BAAA;AAAA,EACjB,WAAa,EAAA,yBAAA;AAAA,EACb,UAAY,EAAA,wBAAA;AACd,CAAA,CAAA;AAEO,MAAM,kBAAkB,MAAM;AACnC,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,cAAe,EAAA,CAAA;AAC7B,EAAM,MAAA,EAAE,KAAO,EAAA,QAAA,EAAa,GAAA,UAAA,CAAW,SAAO,GAAI,CAAA,cAAA,EAAkB,EAAA,EAAE,CAAA,CAAA;AAEtE,EAAM,MAAA,WAAA,GAAc,QAAU,EAAA,WAAA,IAAe,EAAC,CAAA;AAC9C,EAAI,IAAA,WAAA,CAAY,WAAW,CAAG,EAAA;AAC5B,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAEA,EAAA,oDACG,IACC,EAAA,IAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,EAAE,aAAA,EAAe,KAAM,EAAA;AAAA,MAC9B,KAAA,EAAO,EAAE,uBAAuB,CAAA;AAAA,MAChC,MAAA,+CAAS,aAAc,EAAA,IAAA,CAAA;AAAA,MACvB,oBAAA,EAAsB,EAAE,OAAA,EAAS,IAAK,EAAA;AAAA,KAAA;AAAA,GAExC,kBAAAA,cAAA,CAAA,aAAA,CAAC,IACE,EAAA,IAAA,EAAA,WAAA,CAAY,IAAI,CAAc,UAAA,KAAA;AAC7B,IAAM,MAAA,mBAAA,GAAsB,iBAAkB,CAAA,UAAA,CAAW,IAAI,CAAA,CAAA;AAC7D,IAAO,uBAAAA,cAAA,CAAA,aAAA,CAAC,uBAAoB,UAAwB,EAAA,CAAA,CAAA;AAAA,GACrD,CACH,CACF,CAAA,CAAA;AAEJ;;;;"}
|
|
@@ -58,13 +58,14 @@ const EntityTooltip = (props) => {
|
|
|
58
58
|
const EntityChip = (props) => {
|
|
59
59
|
const { entity } = props;
|
|
60
60
|
const entityRoute = useRouteRef(entityRouteRef);
|
|
61
|
-
const { primaryTitle } = useEntityPresentation(entity);
|
|
61
|
+
const { primaryTitle, Icon } = useEntityPresentation(entity);
|
|
62
62
|
const entityRef = typeof entity === "string" ? entity : stringifyEntityRef(entity);
|
|
63
63
|
return /* @__PURE__ */ React__default.createElement(Tooltip, { title: /* @__PURE__ */ React__default.createElement(EntityTooltip, { entity }), arrow: true, enterDelay: 400 }, /* @__PURE__ */ React__default.createElement(
|
|
64
64
|
Chip,
|
|
65
65
|
{
|
|
66
66
|
label: primaryTitle,
|
|
67
67
|
size: "small",
|
|
68
|
+
icon: Icon ? /* @__PURE__ */ React__default.createElement(Icon, { fontSize: "small" }) : void 0,
|
|
68
69
|
variant: "outlined",
|
|
69
70
|
className: "qetaEntityChip",
|
|
70
71
|
component: "a",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EntityChip.esm.js","sources":["../../../src/components/TagsAndEntities/EntityChip.tsx"],"sourcesContent":["import { Entity, stringifyEntityRef } from '@backstage/catalog-model';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\nimport Grid from '@mui/material/Grid';\nimport Button from '@mui/material/Button';\nimport Chip from '@mui/material/Chip';\nimport React, { useEffect } from 'react';\nimport { useApi, useRouteRef } from '@backstage/core-plugin-api';\nimport { useEntityPresentation } from '@backstage/plugin-catalog-react';\nimport { entityRouteRef } from '../../routes';\nimport { qetaApiRef } from '../../api';\nimport { EntityResponse } from '@drodil/backstage-plugin-qeta-common';\nimport { useEntityFollow, useTranslation } from '../../hooks';\n\nconst cache: Map<string, EntityResponse> = new Map();\n\nconst EntityTooltip = (props: { entity: Entity | string }) => {\n const { entity } = props;\n const entityRef =\n typeof entity === 'string' ? entity : stringifyEntityRef(entity);\n const qetaApi = useApi(qetaApiRef);\n const { primaryTitle, secondaryTitle, Icon } = useEntityPresentation(entity);\n const { t } = useTranslation();\n const entitiesFollow = useEntityFollow();\n const [resp, setResp] = React.useState<undefined | EntityResponse>();\n\n useEffect(() => {\n if (cache.has(entityRef)) {\n setResp(cache.get(entityRef));\n return;\n }\n\n qetaApi.getEntity(entityRef).then(res => {\n if (res) {\n cache.set(entityRef, res);\n setResp(res);\n }\n });\n }, [qetaApi, entityRef]);\n\n if (!resp) {\n return null;\n }\n\n return (\n <Grid container style={{ padding: '0.5rem' }} spacing={1}>\n <Grid item xs={12}>\n <Typography variant=\"h6\">\n {Icon ? <Icon fontSize=\"small\" /> : null} {primaryTitle}\n </Typography>\n <Typography variant=\"subtitle1\">{secondaryTitle}</Typography>\n </Grid>\n <Grid item xs={12}>\n <Typography variant=\"subtitle2\">\n {t('common.posts', { count: resp.postsCount, itemType: 'post' })}\n {' · '}\n {t('common.followers', { count: resp.followerCount })}\n </Typography>\n </Grid>\n {!entitiesFollow.loading && (\n <Grid item xs={12}>\n <Button\n size=\"small\"\n variant=\"outlined\"\n color={\n entitiesFollow.isFollowingEntity(entityRef)\n ? 'secondary'\n : 'primary'\n }\n onClick={() => {\n if (entitiesFollow.isFollowingEntity(entityRef)) {\n entitiesFollow.followEntity(entityRef);\n } else {\n entitiesFollow.followEntity(entityRef);\n }\n }}\n >\n {entitiesFollow.isFollowingEntity(entityRef)\n ? t('entityButton.unfollow')\n : t('entityButton.follow')}\n </Button>\n </Grid>\n )}\n </Grid>\n );\n};\n\nexport const EntityChip = (props: { entity: Entity | string }) => {\n const { entity } = props;\n const entityRoute = useRouteRef(entityRouteRef);\n const { primaryTitle } = useEntityPresentation(entity);\n const entityRef =\n typeof entity === 'string' ? entity : stringifyEntityRef(entity);\n return (\n <Tooltip title={<EntityTooltip entity={entity} />} arrow enterDelay={400}>\n <Chip\n label={primaryTitle}\n size=\"small\"\n variant=\"outlined\"\n className=\"qetaEntityChip\"\n component=\"a\"\n href={entityRoute({ entityRef })}\n clickable\n />\n </Tooltip>\n );\n};\n"],"names":["React"],"mappings":"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
|
|
1
|
+
{"version":3,"file":"EntityChip.esm.js","sources":["../../../src/components/TagsAndEntities/EntityChip.tsx"],"sourcesContent":["import { Entity, stringifyEntityRef } from '@backstage/catalog-model';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\nimport Grid from '@mui/material/Grid';\nimport Button from '@mui/material/Button';\nimport Chip from '@mui/material/Chip';\nimport React, { useEffect } from 'react';\nimport { useApi, useRouteRef } from '@backstage/core-plugin-api';\nimport { useEntityPresentation } from '@backstage/plugin-catalog-react';\nimport { entityRouteRef } from '../../routes';\nimport { qetaApiRef } from '../../api';\nimport { EntityResponse } from '@drodil/backstage-plugin-qeta-common';\nimport { useEntityFollow, useTranslation } from '../../hooks';\n\nconst cache: Map<string, EntityResponse> = new Map();\n\nconst EntityTooltip = (props: { entity: Entity | string }) => {\n const { entity } = props;\n const entityRef =\n typeof entity === 'string' ? entity : stringifyEntityRef(entity);\n const qetaApi = useApi(qetaApiRef);\n const { primaryTitle, secondaryTitle, Icon } = useEntityPresentation(entity);\n const { t } = useTranslation();\n const entitiesFollow = useEntityFollow();\n const [resp, setResp] = React.useState<undefined | EntityResponse>();\n\n useEffect(() => {\n if (cache.has(entityRef)) {\n setResp(cache.get(entityRef));\n return;\n }\n\n qetaApi.getEntity(entityRef).then(res => {\n if (res) {\n cache.set(entityRef, res);\n setResp(res);\n }\n });\n }, [qetaApi, entityRef]);\n\n if (!resp) {\n return null;\n }\n\n return (\n <Grid container style={{ padding: '0.5rem' }} spacing={1}>\n <Grid item xs={12}>\n <Typography variant=\"h6\">\n {Icon ? <Icon fontSize=\"small\" /> : null} {primaryTitle}\n </Typography>\n <Typography variant=\"subtitle1\">{secondaryTitle}</Typography>\n </Grid>\n <Grid item xs={12}>\n <Typography variant=\"subtitle2\">\n {t('common.posts', { count: resp.postsCount, itemType: 'post' })}\n {' · '}\n {t('common.followers', { count: resp.followerCount })}\n </Typography>\n </Grid>\n {!entitiesFollow.loading && (\n <Grid item xs={12}>\n <Button\n size=\"small\"\n variant=\"outlined\"\n color={\n entitiesFollow.isFollowingEntity(entityRef)\n ? 'secondary'\n : 'primary'\n }\n onClick={() => {\n if (entitiesFollow.isFollowingEntity(entityRef)) {\n entitiesFollow.followEntity(entityRef);\n } else {\n entitiesFollow.followEntity(entityRef);\n }\n }}\n >\n {entitiesFollow.isFollowingEntity(entityRef)\n ? t('entityButton.unfollow')\n : t('entityButton.follow')}\n </Button>\n </Grid>\n )}\n </Grid>\n );\n};\n\nexport const EntityChip = (props: { entity: Entity | string }) => {\n const { entity } = props;\n const entityRoute = useRouteRef(entityRouteRef);\n const { primaryTitle, Icon } = useEntityPresentation(entity);\n const entityRef =\n typeof entity === 'string' ? entity : stringifyEntityRef(entity);\n return (\n <Tooltip title={<EntityTooltip entity={entity} />} arrow enterDelay={400}>\n <Chip\n label={primaryTitle}\n size=\"small\"\n icon={Icon ? <Icon fontSize=\"small\" /> : undefined}\n variant=\"outlined\"\n className=\"qetaEntityChip\"\n component=\"a\"\n href={entityRoute({ entityRef })}\n clickable\n />\n </Tooltip>\n );\n};\n"],"names":["React"],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { useRouteRef } from '@backstage/core-plugin-api';
|
|
2
|
+
import { userRouteRef } from '../../routes.esm.js';
|
|
3
|
+
import '../../api.esm.js';
|
|
4
|
+
import 'react-use';
|
|
5
|
+
import React__default from 'react';
|
|
6
|
+
import { useTranslation } from '../../hooks/useTranslation.esm.js';
|
|
7
|
+
import { useUserFollow } from '../../hooks/useUserFollow.esm.js';
|
|
8
|
+
import 'react-use/lib/useAsync';
|
|
9
|
+
import { useEntityPresentation } from '@backstage/plugin-catalog-react';
|
|
10
|
+
import Chip from '@mui/material/Chip';
|
|
11
|
+
import { useNavigate } from 'react-router-dom';
|
|
12
|
+
import Grid from '@mui/material/Grid';
|
|
13
|
+
import Typography from '@mui/material/Typography';
|
|
14
|
+
import Button from '@mui/material/Button';
|
|
15
|
+
import Tooltip from '@mui/material/Tooltip';
|
|
16
|
+
|
|
17
|
+
const UserTooltip = (props) => {
|
|
18
|
+
const { entityRef } = props;
|
|
19
|
+
const { t } = useTranslation();
|
|
20
|
+
const {
|
|
21
|
+
primaryTitle: userName,
|
|
22
|
+
Icon,
|
|
23
|
+
secondaryTitle
|
|
24
|
+
} = useEntityPresentation(
|
|
25
|
+
entityRef.startsWith("user:") ? entityRef : `user:${entityRef}`
|
|
26
|
+
);
|
|
27
|
+
const users = useUserFollow();
|
|
28
|
+
return /* @__PURE__ */ React__default.createElement(Grid, { container: true, style: { padding: "0.5rem" }, spacing: 1 }, /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React__default.createElement(Typography, { variant: "h6" }, Icon ? /* @__PURE__ */ React__default.createElement(Icon, { fontSize: "small" }) : null, entityRef === "anonymous" ? t("userLink.anonymous") : userName)), /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React__default.createElement(Typography, { variant: "subtitle2" }, secondaryTitle)), !users.loading && /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React__default.createElement(
|
|
29
|
+
Button,
|
|
30
|
+
{
|
|
31
|
+
size: "small",
|
|
32
|
+
variant: "outlined",
|
|
33
|
+
color: users.isFollowingUser(entityRef) ? "secondary" : "primary",
|
|
34
|
+
onClick: () => {
|
|
35
|
+
if (users.isFollowingUser(entityRef)) {
|
|
36
|
+
users.unfollowUser(entityRef);
|
|
37
|
+
} else {
|
|
38
|
+
users.followUser(entityRef);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
users.isFollowingUser(entityRef) ? t("userButton.unfollow") : t("userButton.follow")
|
|
43
|
+
)));
|
|
44
|
+
};
|
|
45
|
+
const UserChip = (props) => {
|
|
46
|
+
const navigate = useNavigate();
|
|
47
|
+
const { entityRef } = props;
|
|
48
|
+
const userRoute = useRouteRef(userRouteRef);
|
|
49
|
+
const { t } = useTranslation();
|
|
50
|
+
const { primaryTitle: userName } = useEntityPresentation(
|
|
51
|
+
entityRef.startsWith("user:") ? entityRef : `user:${entityRef}`
|
|
52
|
+
);
|
|
53
|
+
if (entityRef === "anonymous") {
|
|
54
|
+
return /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, t("userLink.anonymous"));
|
|
55
|
+
}
|
|
56
|
+
return /* @__PURE__ */ React__default.createElement(
|
|
57
|
+
Tooltip,
|
|
58
|
+
{
|
|
59
|
+
arrow: true,
|
|
60
|
+
title: /* @__PURE__ */ React__default.createElement(UserTooltip, { entityRef }),
|
|
61
|
+
enterDelay: 400
|
|
62
|
+
},
|
|
63
|
+
/* @__PURE__ */ React__default.createElement(
|
|
64
|
+
Chip,
|
|
65
|
+
{
|
|
66
|
+
label: userName,
|
|
67
|
+
size: "small",
|
|
68
|
+
className: "qetaTagChip",
|
|
69
|
+
component: "a",
|
|
70
|
+
onClick: () => {
|
|
71
|
+
navigate(`${userRoute()}/${entityRef}`);
|
|
72
|
+
},
|
|
73
|
+
clickable: true
|
|
74
|
+
}
|
|
75
|
+
)
|
|
76
|
+
);
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
export { UserChip, UserTooltip };
|
|
80
|
+
//# sourceMappingURL=UserChip.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UserChip.esm.js","sources":["../../../src/components/TagsAndEntities/UserChip.tsx"],"sourcesContent":["import { useRouteRef } from '@backstage/core-plugin-api';\nimport { userRouteRef } from '../../routes';\nimport { useTranslation, useUserFollow } from '../../hooks';\nimport { useEntityPresentation } from '@backstage/plugin-catalog-react';\nimport React from 'react';\nimport Chip from '@mui/material/Chip';\nimport { useNavigate } from 'react-router-dom';\nimport Grid from '@mui/material/Grid';\nimport Typography from '@mui/material/Typography';\nimport Button from '@mui/material/Button';\nimport Tooltip from '@mui/material/Tooltip';\n\nexport const UserTooltip = (props: { entityRef: string }) => {\n const { entityRef } = props;\n const { t } = useTranslation();\n const {\n primaryTitle: userName,\n Icon,\n secondaryTitle,\n } = useEntityPresentation(\n entityRef.startsWith('user:') ? entityRef : `user:${entityRef}`,\n );\n const users = useUserFollow();\n\n return (\n <Grid container style={{ padding: '0.5rem' }} spacing={1}>\n <Grid item xs={12}>\n <Typography variant=\"h6\">\n {Icon ? <Icon fontSize=\"small\" /> : null}\n {entityRef === 'anonymous' ? t('userLink.anonymous') : userName}\n </Typography>\n </Grid>\n <Grid item xs={12}>\n <Typography variant=\"subtitle2\">{secondaryTitle}</Typography>\n </Grid>\n {!users.loading && (\n <Grid item xs={12}>\n <Button\n size=\"small\"\n variant=\"outlined\"\n color={users.isFollowingUser(entityRef) ? 'secondary' : 'primary'}\n onClick={() => {\n if (users.isFollowingUser(entityRef)) {\n users.unfollowUser(entityRef);\n } else {\n users.followUser(entityRef);\n }\n }}\n >\n {users.isFollowingUser(entityRef)\n ? t('userButton.unfollow')\n : t('userButton.follow')}\n </Button>\n </Grid>\n )}\n </Grid>\n );\n};\n\nexport const UserChip = (props: { entityRef: string }) => {\n const navigate = useNavigate();\n const { entityRef } = props;\n const userRoute = useRouteRef(userRouteRef);\n const { t } = useTranslation();\n const { primaryTitle: userName } = useEntityPresentation(\n entityRef.startsWith('user:') ? entityRef : `user:${entityRef}`,\n );\n if (entityRef === 'anonymous') {\n return <>{t('userLink.anonymous')}</>;\n }\n return (\n <Tooltip\n arrow\n title={<UserTooltip entityRef={entityRef} />}\n enterDelay={400}\n >\n <Chip\n label={userName}\n size=\"small\"\n className=\"qetaTagChip\"\n component=\"a\"\n onClick={() => {\n navigate(`${userRoute()}/${entityRef}`);\n }}\n clickable\n />\n </Tooltip>\n );\n};\n"],"names":["React"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -243,6 +243,8 @@ declare const FollowedTagsList: () => React.JSX.Element | null;
|
|
|
243
243
|
|
|
244
244
|
declare const FollowedCollectionsList: () => React.JSX.Element | null;
|
|
245
245
|
|
|
246
|
+
declare const FollowedUsersList: () => React.JSX.Element | null;
|
|
247
|
+
|
|
246
248
|
declare const AnswerForm: (props: {
|
|
247
249
|
post: PostResponse;
|
|
248
250
|
onPost: (answer: AnswerResponse) => void;
|
|
@@ -349,6 +351,8 @@ type AIAnswerCardProps = {
|
|
|
349
351
|
};
|
|
350
352
|
declare const AIAnswerCard: (props: AIAnswerCardProps) => React.JSX.Element | null;
|
|
351
353
|
|
|
354
|
+
declare const SuggestionsCard: () => React.JSX.Element | null;
|
|
355
|
+
|
|
352
356
|
declare function useQetaApi<T>(f: (api: QetaApi) => Promise<T>, deps?: any[]): {
|
|
353
357
|
retry: () => void;
|
|
354
358
|
loading: boolean;
|
|
@@ -467,12 +471,12 @@ declare const useTranslation: () => {
|
|
|
467
471
|
readonly "tagsInput.label": "Tags";
|
|
468
472
|
readonly "tagsInput.placeholder": "Type or select tags";
|
|
469
473
|
readonly "tagsInput.helperText": "Add up to {{max}} tags to categorize your question";
|
|
474
|
+
readonly "askPage.title.newQuestion": "Ask a question";
|
|
470
475
|
readonly "askPage.title.existingQuestion": "Edit question";
|
|
471
476
|
readonly "askPage.title.entityQuestion": "Ask a question about {{entity}}";
|
|
472
|
-
readonly "
|
|
477
|
+
readonly "writePage.title.newArticle": "New article";
|
|
473
478
|
readonly "writePage.title.existingArticle": "Edit article";
|
|
474
479
|
readonly "writePage.title.entityArticle": "Write an article about {{entity}}";
|
|
475
|
-
readonly "writePage.title.newArticle": "New article";
|
|
476
480
|
readonly "collectionCreatePage.title.existingCollection": "Edit collection";
|
|
477
481
|
readonly "collectionCreatePage.title.newCollection": "New collection";
|
|
478
482
|
readonly "askQuestionButton.title": "Ask a question";
|
|
@@ -507,6 +511,7 @@ declare const useTranslation: () => {
|
|
|
507
511
|
readonly "leftMenu.moderate": "Moderate";
|
|
508
512
|
readonly "leftMenu.content": "Content";
|
|
509
513
|
readonly "leftMenu.manage": "Manage";
|
|
514
|
+
readonly "leftMenu.buttonLabel": "Menu";
|
|
510
515
|
readonly "leftMenu.home": "Home";
|
|
511
516
|
readonly "leftMenu.profile": "Profile";
|
|
512
517
|
readonly "leftMenu.favoriteQuestions": "Favorites";
|
|
@@ -515,6 +520,10 @@ declare const useTranslation: () => {
|
|
|
515
520
|
readonly "moderatorPage.tools": "Tools";
|
|
516
521
|
readonly "moderatorPage.templates": "Templates";
|
|
517
522
|
readonly "moderatorPage.templatesInfo": "Templates can be used to prefill question content for the user";
|
|
523
|
+
readonly "suggestionsCard.noCorrectAnswer": "Your question \"{{title}}\" does not have a correct answer";
|
|
524
|
+
readonly "suggestionsCard.newQuestion": "Do you have an answer for \"{{title}}\"?";
|
|
525
|
+
readonly "suggestionsCard.newArticle": "You might like to read \"{{title}}\"";
|
|
526
|
+
readonly "suggestionsCard.title": "Suggestions";
|
|
518
527
|
readonly "homePage.title": "Home";
|
|
519
528
|
readonly "impactCard.title": "Your impact";
|
|
520
529
|
readonly "impactCard.views": "views";
|
|
@@ -522,6 +531,7 @@ declare const useTranslation: () => {
|
|
|
522
531
|
readonly "rightMenu.followedEntities": "Followed entities";
|
|
523
532
|
readonly "rightMenu.followedTags": "Followed tags";
|
|
524
533
|
readonly "rightMenu.followedCollections": "Followed collections";
|
|
534
|
+
readonly "rightMenu.followedUsers": "Followed users";
|
|
525
535
|
readonly "highlights.loadError": "Failed to load questions";
|
|
526
536
|
readonly "highlights.own.title": "Your latest questions";
|
|
527
537
|
readonly "highlights.own.noQuestionsLabel": "No questions";
|
|
@@ -755,4 +765,4 @@ declare const useAI: () => {
|
|
|
755
765
|
summarizeArticle: (articleId: number, options?: AIQuery) => Promise<_drodil_backstage_plugin_qeta_common.AIResponse | null>;
|
|
756
766
|
};
|
|
757
767
|
|
|
758
|
-
export { AIAnswerCard, AddToCollectionButton, AnswerCard, AnswerForm, AnswerList, AnswerListItem, AnswersContainer, ArticleContent, AskQuestionButton, AuthorLink, CollectionCard, CollectionFollowButton, CollectionForm, CollectionsGrid, CreateCollectionButton, DeleteModal, EntitiesGrid, EntityFollowButton, FilterPanel, FollowedCollectionsList, FollowedEntitiesList, FollowedTagsList, ImpactCard, LeftMenu, LeftMenuButton, MarkdownRenderer, PostForm, PostHighlightList, PostList, PostListItem, PostsCard, PostsContainer, PostsGrid, QuestionCard, QuestionsTable, RelativeTimeWithTooltip, SelectTemplateList, StatsChart, SummaryStatsGrid, TagFollowButton, TagsGrid, TemplateList, TopRankingUsers, TrophyIcon, UpdatedByLink, UserFollowButton, UserLink, UsersGrid, WriteArticleButton, articleRouteRef, articlesRouteRef, askRouteRef, collectionCreateRouteRef, collectionEditRouteRef, collectionRouteRef, collectionsRouteRef, editArticleRouteRef, editQuestionRouteRef, entitiesRouteRef, entityRouteRef, favoriteQuestionsRouteRef, moderatorRouteRef, qetaApiRef, qetaRouteRef, questionRouteRef, questionsRouteRef, statisticsRouteRef, tagRouteRef, tagsRouteRef, useAI, useCollectionsFollow, useEntityFollow, useIdentityApi, useIsModerator, useQetaApi, useTagsFollow, useTranslation, useUserFollow, userRouteRef, usersRouteRef, writeRouteRef };
|
|
768
|
+
export { AIAnswerCard, AddToCollectionButton, AnswerCard, AnswerForm, AnswerList, AnswerListItem, AnswersContainer, ArticleContent, AskQuestionButton, AuthorLink, CollectionCard, CollectionFollowButton, CollectionForm, CollectionsGrid, CreateCollectionButton, DeleteModal, EntitiesGrid, EntityFollowButton, FilterPanel, FollowedCollectionsList, FollowedEntitiesList, FollowedTagsList, FollowedUsersList, ImpactCard, LeftMenu, LeftMenuButton, MarkdownRenderer, PostForm, PostHighlightList, PostList, PostListItem, PostsCard, PostsContainer, PostsGrid, QuestionCard, QuestionsTable, RelativeTimeWithTooltip, SelectTemplateList, StatsChart, SuggestionsCard, SummaryStatsGrid, TagFollowButton, TagsGrid, TemplateList, TopRankingUsers, TrophyIcon, UpdatedByLink, UserFollowButton, UserLink, UsersGrid, WriteArticleButton, articleRouteRef, articlesRouteRef, askRouteRef, collectionCreateRouteRef, collectionEditRouteRef, collectionRouteRef, collectionsRouteRef, editArticleRouteRef, editQuestionRouteRef, entitiesRouteRef, entityRouteRef, favoriteQuestionsRouteRef, moderatorRouteRef, qetaApiRef, qetaRouteRef, questionRouteRef, questionsRouteRef, statisticsRouteRef, tagRouteRef, tagsRouteRef, useAI, useCollectionsFollow, useEntityFollow, useIdentityApi, useIsModerator, useQetaApi, useTagsFollow, useTranslation, useUserFollow, userRouteRef, usersRouteRef, writeRouteRef };
|
package/dist/index.esm.js
CHANGED
|
@@ -26,6 +26,7 @@ export { ImpactCard } from './components/HomePageCards/ImpactCard.esm.js';
|
|
|
26
26
|
export { FollowedEntitiesList } from './components/FollowedLists/FollowedEntitiesList.esm.js';
|
|
27
27
|
export { FollowedTagsList } from './components/FollowedLists/FollowedTagsList.esm.js';
|
|
28
28
|
export { FollowedCollectionsList } from './components/FollowedLists/FollowedCollectionsList.esm.js';
|
|
29
|
+
export { FollowedUsersList } from './components/FollowedLists/FollowedUsersList.esm.js';
|
|
29
30
|
export { AnswerForm } from './components/AnswerForm/AnswerForm.esm.js';
|
|
30
31
|
export { RelativeTimeWithTooltip } from './components/RelativeTimeWithTooltip/RelativeTimeWithTooltip.esm.js';
|
|
31
32
|
export { AuthorLink, UpdatedByLink, UserLink } from './components/Links/Links.esm.js';
|
|
@@ -47,6 +48,7 @@ export { LeftMenuButton } from './components/LeftMenu/LeftMenuButton.esm.js';
|
|
|
47
48
|
export { TemplateList } from './components/TemplateList/TemplateList.esm.js';
|
|
48
49
|
export { SelectTemplateList } from './components/SelectTemplateList/SelectTemplateList.esm.js';
|
|
49
50
|
export { AIAnswerCard } from './components/AIAnswerCard/AIAnswerCard.esm.js';
|
|
51
|
+
export { SuggestionsCard } from './components/SuggestionsCard/SuggestionsCard.esm.js';
|
|
50
52
|
export { useQetaApi } from './hooks/useQetaApi.esm.js';
|
|
51
53
|
export { useTagsFollow } from './hooks/useTagsFollow.esm.js';
|
|
52
54
|
export { useTranslation } from './hooks/useTranslation.esm.js';
|
package/dist/index.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|