@drodil/backstage-plugin-qeta-react 3.30.1 → 3.31.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/AnswerCard/AnswerCard.esm.js +1 -1
- package/dist/components/AnswerCard/AnswerCard.esm.js.map +1 -1
- package/dist/components/ArticleContent/ArticleButtons.esm.js +45 -6
- package/dist/components/ArticleContent/ArticleButtons.esm.js.map +1 -1
- package/dist/components/ArticleContent/ArticleContent.esm.js +15 -9
- package/dist/components/ArticleContent/ArticleContent.esm.js.map +1 -1
- package/dist/components/Buttons/AddToCollectionButton.esm.js +3 -0
- package/dist/components/Buttons/AddToCollectionButton.esm.js.map +1 -1
- package/dist/components/Buttons/FavoriteButton.esm.js +2 -0
- package/dist/components/Buttons/FavoriteButton.esm.js.map +1 -1
- package/dist/components/Buttons/VoteButtons.esm.js +30 -5
- package/dist/components/Buttons/VoteButtons.esm.js.map +1 -1
- package/dist/components/CollectionForm/CollectionForm.esm.js +2 -0
- package/dist/components/CollectionForm/CollectionForm.esm.js.map +1 -1
- package/dist/components/CommentSection/CommentSection.esm.js +3 -0
- package/dist/components/CommentSection/CommentSection.esm.js.map +1 -1
- package/dist/components/FilterPanel/FilterPanel.esm.js +25 -1
- package/dist/components/FilterPanel/FilterPanel.esm.js.map +1 -1
- package/dist/components/GridItemStyles/useGridItemStyles.esm.js +7 -3
- package/dist/components/GridItemStyles/useGridItemStyles.esm.js.map +1 -1
- package/dist/components/MarkdownEditor/MarkdownEditor.esm.js +2 -0
- package/dist/components/MarkdownEditor/MarkdownEditor.esm.js.map +1 -1
- package/dist/components/PostForm/EntitiesInput.esm.js +2 -0
- package/dist/components/PostForm/EntitiesInput.esm.js.map +1 -1
- package/dist/components/PostForm/PostForm.esm.js +194 -61
- package/dist/components/PostForm/PostForm.esm.js.map +1 -1
- package/dist/components/PostForm/TagInput.esm.js +2 -0
- package/dist/components/PostForm/TagInput.esm.js.map +1 -1
- package/dist/components/PostsContainer/PostListItem.esm.js +9 -2
- package/dist/components/PostsContainer/PostListItem.esm.js.map +1 -1
- package/dist/components/PostsGrid/PostsGridItem.esm.js +20 -8
- package/dist/components/PostsGrid/PostsGridItem.esm.js.map +1 -1
- package/dist/components/QuestionCard/QuestionCard.esm.js +60 -32
- package/dist/components/QuestionCard/QuestionCard.esm.js.map +1 -1
- package/dist/components/SearchBar/SearchBar.esm.js +1 -0
- package/dist/components/SearchBar/SearchBar.esm.js.map +1 -1
- package/dist/components/SuggestionsCard/SuggestionsCard.esm.js +20 -1
- package/dist/components/SuggestionsCard/SuggestionsCard.esm.js.map +1 -1
- package/dist/components/TagsGrid/TagGridItem.esm.js +17 -4
- package/dist/components/TagsGrid/TagGridItem.esm.js.map +1 -1
- package/dist/components/TemplateList/TemplateList.esm.js +1 -0
- package/dist/components/TemplateList/TemplateList.esm.js.map +1 -1
- package/dist/components/Utility/DeletedBanner.esm.js +31 -0
- package/dist/components/Utility/DeletedBanner.esm.js.map +1 -0
- package/dist/components/Utility/DraftBanner.esm.js +31 -0
- package/dist/components/Utility/DraftBanner.esm.js.map +1 -0
- package/dist/components/Utility/StatusChip.esm.js +53 -0
- package/dist/components/Utility/StatusChip.esm.js.map +1 -0
- package/dist/hooks/usePaginatedPosts.esm.js +12 -1
- package/dist/hooks/usePaginatedPosts.esm.js.map +1 -1
- package/dist/index.d.ts +33 -4
- package/dist/index.esm.js +3 -0
- package/dist/index.esm.js.map +1 -1
- package/dist/translation.esm.js +22 -5
- package/dist/translation.esm.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnswerCard.esm.js","sources":["../../../src/components/AnswerCard/AnswerCard.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { VoteButtons } from '../Buttons/VoteButtons';\nimport { AnswerForm } from '../AnswerForm';\nimport { AuthorBox } from '../AuthorBox/AuthorBox';\nimport { CommentSection } from '../CommentSection/CommentSection';\nimport { LinkButton } from '../Buttons/LinkButton';\nimport DeleteIcon from '@material-ui/icons/Delete';\nimport EditIcon from '@material-ui/icons/Edit';\nimport {\n AnswerResponse,\n PostResponse,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { MarkdownRenderer } from '../MarkdownRenderer';\nimport { DeleteModal } from '../DeleteModal';\nimport { VoteButtonContainer } from '../Utility/VoteButtonContainer';\nimport {\n Box,\n Button,\n Card,\n CardContent,\n Grid,\n makeStyles,\n} from '@material-ui/core';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../../translation.ts';\n\nexport type AnswerCardClassKeys =\n | 'root'\n | 'highlight'\n | 'buttons'\n | 'metadata'\n | 'markdownContainer'\n | 'contentContainer';\n\nconst useStyles = makeStyles(\n theme => ({\n root: {\n marginTop: '1em',\n },\n contentContainer: {\n marginLeft: '0.5em',\n display: 'inline-block',\n width: 'calc(100% - 70px)',\n },\n markdownContainer: {\n minHeight: '6em',\n paddingBottom: '0.5em',\n },\n metadata: {\n marginTop: '1em',\n },\n highlight: {\n animation: 'highlight 5s',\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 buttons: {\n marginTop: '1em',\n '& *:not(:last-child)': {\n marginRight: '0.3em',\n },\n },\n }),\n { name: 'QetaAnswerCard' },\n);\n\nexport const AnswerCard = (props: {\n answer: AnswerResponse;\n question: PostResponse;\n}) => {\n const { answer, question } = props;\n\n const [editMode, setEditMode] = useState(false);\n const [answerEntity, setAnswerEntity] = useState(answer);\n const { t } = useTranslationRef(qetaTranslationRef);\n const styles = useStyles();\n\n const [deleteModalOpen, setDeleteModalOpen] = useState(false);\n const handleDeleteModalOpen = () => setDeleteModalOpen(true);\n const handleDeleteModalClose = () => setDeleteModalOpen(false);\n const highlightedAnswer =\n window.location.hash.slice(1) === `answer_${answer.id}`;\n\n const onAnswerEdit = (a: AnswerResponse) => {\n setEditMode(false);\n setAnswerEntity(a);\n };\n\n const onCommentAction = (_: PostResponse, a?: AnswerResponse) => {\n if (a) {\n setAnswerEntity(a);\n }\n };\n\n return (\n <>\n <Card\n id={`answer_${answer.id}`}\n className={`qetaAnswerCard ${styles.root} ${\n highlightedAnswer ? styles.highlight : ''\n }`}\n >\n <CardContent>\n <Grid\n container\n spacing={2}\n justifyContent=\"flex-start\"\n style={{ flexWrap: 'nowrap' }}\n >\n <Grid item>\n <VoteButtonContainer>\n <VoteButtons entity={answerEntity} post={question} />\n <LinkButton entity={answerEntity} />\n </VoteButtonContainer>\n </Grid>\n <Grid item className={styles.contentContainer}>\n {editMode ? (\n <AnswerForm\n post={question}\n onPost={onAnswerEdit}\n id={answerEntity.id}\n />\n ) : (\n <>\n <Grid item className={styles.markdownContainer}>\n <MarkdownRenderer content={answerEntity.content} />\n </Grid>\n <Box\n display=\"flex\"\n alignItems=\"flex-end\"\n justifyContent=\"space-between\"\n className={styles.metadata}\n style={{ width: '100%' }}\n >\n <Box flex=\"1 1 0%\" minWidth={0}>\n {(answerEntity.canDelete || answerEntity.canEdit) && (\n <Box\n className={styles.buttons}\n style={{ alignSelf: 'flex-end' }}\n >\n {answerEntity.canEdit && (\n <Button\n variant=\"outlined\"\n size=\"small\"\n startIcon={<EditIcon />}\n onClick={() => setEditMode(true)}\n className=\"qetaAnswerCardEditBtn\"\n >\n {t('questionPage.editButton')}\n </Button>\n )}\n {!answerEntity.correct && answerEntity.canDelete && (\n <>\n <Button\n variant=\"outlined\"\n size=\"small\"\n color=\"secondary\"\n onClick={handleDeleteModalOpen}\n startIcon={<DeleteIcon />}\n >\n {t('deleteModal.deleteButton')}\n </Button>\n <DeleteModal\n open={deleteModalOpen}\n onClose={handleDeleteModalClose}\n entity={answerEntity}\n question={question}\n />\n </>\n )}\n </Box>\n )}\n </Box>\n <Box\n display=\"flex\"\n minWidth={220}\n style={{ gap: '8px' }}\n ml={1}\n >\n {answerEntity.updated && answerEntity.updatedBy && (\n <AuthorBox\n userEntityRef={answerEntity.updatedBy}\n time={answerEntity.updated}\n label={t('authorBox.updatedAtTime')}\n expert={answerEntity.expert}\n anonymous={answerEntity.anonymous}\n />\n )}\n <AuthorBox\n userEntityRef={answerEntity.author}\n time={answerEntity.created}\n label={t('authorBox.answeredAtTime')}\n expert={answerEntity.expert}\n anonymous={answerEntity.anonymous}\n />\n </Box>\n </Box>\n </>\n )}\n </Grid>\n </Grid>\n </CardContent>\n </Card>\n <CommentSection\n post={question}\n answer={answerEntity}\n onCommentAction={onCommentAction}\n />\n </>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AnswerCard.esm.js","sources":["../../../src/components/AnswerCard/AnswerCard.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { VoteButtons } from '../Buttons/VoteButtons';\nimport { AnswerForm } from '../AnswerForm';\nimport { AuthorBox } from '../AuthorBox/AuthorBox';\nimport { CommentSection } from '../CommentSection/CommentSection';\nimport { LinkButton } from '../Buttons/LinkButton';\nimport DeleteIcon from '@material-ui/icons/Delete';\nimport EditIcon from '@material-ui/icons/Edit';\nimport {\n AnswerResponse,\n PostResponse,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { MarkdownRenderer } from '../MarkdownRenderer';\nimport { DeleteModal } from '../DeleteModal';\nimport { VoteButtonContainer } from '../Utility/VoteButtonContainer';\nimport {\n Box,\n Button,\n Card,\n CardContent,\n Grid,\n makeStyles,\n} from '@material-ui/core';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../../translation.ts';\n\nexport type AnswerCardClassKeys =\n | 'root'\n | 'highlight'\n | 'buttons'\n | 'metadata'\n | 'markdownContainer'\n | 'contentContainer';\n\nconst useStyles = makeStyles(\n theme => ({\n root: {\n marginTop: '1em',\n },\n contentContainer: {\n marginLeft: '0.5em',\n display: 'inline-block',\n width: 'calc(100% - 70px)',\n },\n markdownContainer: {\n minHeight: '6em',\n paddingBottom: '0.5em',\n },\n metadata: {\n marginTop: '1em',\n },\n highlight: {\n animation: 'highlight 5s',\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 buttons: {\n marginTop: '1em',\n '& *:not(:last-child)': {\n marginRight: '0.3em',\n },\n },\n }),\n { name: 'QetaAnswerCard' },\n);\n\nexport const AnswerCard = (props: {\n answer: AnswerResponse;\n question: PostResponse;\n}) => {\n const { answer, question } = props;\n\n const [editMode, setEditMode] = useState(false);\n const [answerEntity, setAnswerEntity] = useState(answer);\n const { t } = useTranslationRef(qetaTranslationRef);\n const styles = useStyles();\n\n const [deleteModalOpen, setDeleteModalOpen] = useState(false);\n const handleDeleteModalOpen = () => setDeleteModalOpen(true);\n const handleDeleteModalClose = () => setDeleteModalOpen(false);\n const highlightedAnswer =\n window.location.hash.slice(1) === `answer_${answer.id}`;\n\n const onAnswerEdit = (a: AnswerResponse) => {\n setEditMode(false);\n setAnswerEntity(a);\n };\n\n const onCommentAction = (_: PostResponse, a?: AnswerResponse) => {\n if (a) {\n setAnswerEntity(a);\n }\n };\n\n return (\n <>\n <Card\n id={`answer_${answer.id}`}\n className={`qetaAnswerCard ${styles.root} ${\n highlightedAnswer ? styles.highlight : ''\n }`}\n >\n <CardContent>\n <Grid\n container\n spacing={2}\n justifyContent=\"flex-start\"\n style={{ flexWrap: 'nowrap' }}\n >\n <Grid item>\n <VoteButtonContainer>\n <VoteButtons entity={answerEntity} post={question} />\n <LinkButton entity={answerEntity} />\n </VoteButtonContainer>\n </Grid>\n <Grid item className={styles.contentContainer}>\n {editMode ? (\n <AnswerForm\n post={question}\n onPost={onAnswerEdit}\n id={answerEntity.id}\n />\n ) : (\n <>\n <Grid item className={styles.markdownContainer}>\n <MarkdownRenderer content={answerEntity.content} />\n </Grid>\n <Box\n display=\"flex\"\n alignItems=\"flex-end\"\n justifyContent=\"space-between\"\n className={styles.metadata}\n style={{ width: '100%' }}\n >\n <Box flex=\"1 1 0%\" minWidth={0}>\n {(answerEntity.canDelete || answerEntity.canEdit) && (\n <Box\n className={styles.buttons}\n style={{ alignSelf: 'flex-end' }}\n >\n {answerEntity.canEdit && (\n <Button\n variant=\"outlined\"\n size=\"small\"\n startIcon={<EditIcon />}\n onClick={() => setEditMode(true)}\n className=\"qetaAnswerCardEditBtn\"\n >\n {t('questionPage.editButton')}\n </Button>\n )}\n {!answerEntity.correct && answerEntity.canDelete && (\n <>\n <Button\n variant=\"outlined\"\n size=\"small\"\n color=\"secondary\"\n onClick={handleDeleteModalOpen}\n startIcon={<DeleteIcon />}\n >\n {t('deleteModal.deleteButton')}\n </Button>\n <DeleteModal\n open={deleteModalOpen}\n onClose={handleDeleteModalClose}\n entity={answerEntity}\n question={question}\n />\n </>\n )}\n </Box>\n )}\n </Box>\n <Box\n display=\"flex\"\n minWidth={220}\n style={{ gap: '8px' }}\n ml={1}\n >\n {answerEntity.updated && answerEntity.updatedBy && (\n <AuthorBox\n userEntityRef={answerEntity.updatedBy}\n time={answerEntity.updated}\n label={t('authorBox.updatedAtTime')}\n expert={false}\n anonymous={answerEntity.anonymous}\n />\n )}\n <AuthorBox\n userEntityRef={answerEntity.author}\n time={answerEntity.created}\n label={t('authorBox.answeredAtTime')}\n expert={answerEntity.expert}\n anonymous={answerEntity.anonymous}\n />\n </Box>\n </Box>\n </>\n )}\n </Grid>\n </Grid>\n </CardContent>\n </Card>\n <CommentSection\n post={question}\n answer={answerEntity}\n onCommentAction={onCommentAction}\n />\n </>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -5,15 +5,23 @@ import { makeStyles, Grid, Tooltip, IconButton, Typography } from '@material-ui/
|
|
|
5
5
|
import ArrowDownward from '@material-ui/icons/ArrowDownward';
|
|
6
6
|
import { FavoriteButton } from '../Buttons/FavoriteButton.esm.js';
|
|
7
7
|
import { LinkButton } from '../Buttons/LinkButton.esm.js';
|
|
8
|
-
import { useRouteRef } from '@backstage/core-plugin-api';
|
|
8
|
+
import { useRouteRef, useApi } from '@backstage/core-plugin-api';
|
|
9
9
|
import { editArticleRouteRef } from '../../routes.esm.js';
|
|
10
10
|
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
|
+
import RestoreIcon from '@material-ui/icons/Restore';
|
|
13
14
|
import { useVoting } from '../../hooks/useVoting.esm.js';
|
|
14
15
|
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
|
|
15
16
|
import { qetaTranslationRef } from '../../translation.esm.js';
|
|
16
17
|
import { useNavigate } from 'react-router-dom';
|
|
18
|
+
import { qetaApiRef } from '../../api.esm.js';
|
|
19
|
+
import 'react-use';
|
|
20
|
+
import '@backstage/catalog-model';
|
|
21
|
+
import 'dataloader';
|
|
22
|
+
import '@backstage/plugin-catalog-react';
|
|
23
|
+
import 'react-use/lib/useAsync';
|
|
24
|
+
import { useIsModerator } from '../../hooks/useIsModerator.esm.js';
|
|
17
25
|
|
|
18
26
|
const useLocalStyles = makeStyles(
|
|
19
27
|
(theme) => {
|
|
@@ -40,31 +48,53 @@ const ArticleButtons = (props) => {
|
|
|
40
48
|
const { t } = useTranslationRef(qetaTranslationRef);
|
|
41
49
|
const navigate = useNavigate();
|
|
42
50
|
const editArticleRoute = useRouteRef(editArticleRouteRef);
|
|
51
|
+
const { isModerator } = useIsModerator();
|
|
52
|
+
const qetaApi = useApi(qetaApiRef);
|
|
43
53
|
const [deleteModalOpen, setDeleteModalOpen] = useState(false);
|
|
44
54
|
const handleDeleteModalOpen = () => setDeleteModalOpen(true);
|
|
45
55
|
const handleDeleteModalClose = () => setDeleteModalOpen(false);
|
|
46
56
|
const own = props.post.own ?? false;
|
|
57
|
+
const isDisabled = () => {
|
|
58
|
+
return own || post.status !== "active";
|
|
59
|
+
};
|
|
60
|
+
const getVoteUpTooltip = () => {
|
|
61
|
+
if (isDisabled()) {
|
|
62
|
+
return "";
|
|
63
|
+
}
|
|
64
|
+
return voteUpTooltip;
|
|
65
|
+
};
|
|
66
|
+
const getVoteDownTooltip = () => {
|
|
67
|
+
if (isDisabled()) {
|
|
68
|
+
return "";
|
|
69
|
+
}
|
|
70
|
+
return voteDownTooltip;
|
|
71
|
+
};
|
|
72
|
+
const restoreArticle = async () => {
|
|
73
|
+
qetaApi.restorePost(post.id).then(() => {
|
|
74
|
+
window.location.reload();
|
|
75
|
+
});
|
|
76
|
+
};
|
|
47
77
|
return /* @__PURE__ */ jsx("div", { className: styles.container, children: /* @__PURE__ */ jsxs(Grid, { container: true, justifyContent: "space-between", children: [
|
|
48
78
|
/* @__PURE__ */ jsxs(Grid, { item: true, children: [
|
|
49
|
-
/* @__PURE__ */ jsx(Tooltip, { title:
|
|
79
|
+
/* @__PURE__ */ jsx(Tooltip, { title: getVoteUpTooltip(), children: /* @__PURE__ */ jsx("span", { children: /* @__PURE__ */ jsx(
|
|
50
80
|
IconButton,
|
|
51
81
|
{
|
|
52
82
|
"aria-label": "vote up",
|
|
53
83
|
color: ownVote > 0 ? "primary" : "default",
|
|
54
84
|
className: ownVote > 0 ? "qetaVoteUpSelected" : "qetaVoteUp",
|
|
55
|
-
disabled:
|
|
85
|
+
disabled: isDisabled(),
|
|
56
86
|
size: "small",
|
|
57
87
|
onClick: voteUp,
|
|
58
88
|
children: /* @__PURE__ */ jsx(ArrowUpward, {})
|
|
59
89
|
}
|
|
60
90
|
) }) }),
|
|
61
|
-
/* @__PURE__ */ jsx(Tooltip, { title:
|
|
91
|
+
/* @__PURE__ */ jsx(Tooltip, { title: getVoteDownTooltip(), children: /* @__PURE__ */ jsx("span", { children: /* @__PURE__ */ jsx(
|
|
62
92
|
IconButton,
|
|
63
93
|
{
|
|
64
94
|
"aria-label": "vote down",
|
|
65
95
|
color: ownVote < 0 ? "primary" : "default",
|
|
66
96
|
className: ownVote < 0 ? "qetaVoteDownSelected" : "qetaVoteDown",
|
|
67
|
-
disabled:
|
|
97
|
+
disabled: isDisabled(),
|
|
68
98
|
size: "small",
|
|
69
99
|
onClick: voteDown,
|
|
70
100
|
children: /* @__PURE__ */ jsx(ArrowDownward, {})
|
|
@@ -107,7 +137,16 @@ const ArticleButtons = (props) => {
|
|
|
107
137
|
entity: post
|
|
108
138
|
}
|
|
109
139
|
)
|
|
110
|
-
] })
|
|
140
|
+
] }),
|
|
141
|
+
isModerator && post.status === "deleted" && /* @__PURE__ */ jsx(Tooltip, { title: t("articlePage.restoreButton"), children: /* @__PURE__ */ jsx(
|
|
142
|
+
IconButton,
|
|
143
|
+
{
|
|
144
|
+
size: "small",
|
|
145
|
+
onClick: () => restoreArticle(),
|
|
146
|
+
color: "primary",
|
|
147
|
+
children: /* @__PURE__ */ jsx(RestoreIcon, {})
|
|
148
|
+
}
|
|
149
|
+
) })
|
|
111
150
|
] })
|
|
112
151
|
] })
|
|
113
152
|
] }) });
|
|
@@ -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 { useState } 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';\nimport { useVoting } from '../../hooks/useVoting';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../../translation.ts';\nimport { useNavigate } from 'react-router-dom';\n\nexport type QetaArticleButtonsClassKey = 'container' | 'scoreText';\n\nexport const useLocalStyles = makeStyles(\n 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 { name: 'QetaArticleButtons' },\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 { t } = useTranslationRef(qetaTranslationRef);\n const navigate = useNavigate();\n const editArticleRoute = useRouteRef(editArticleRouteRef);\n const [deleteModalOpen, setDeleteModalOpen] = 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} />\n {(post.canEdit || post.canDelete) && (\n <>\n {post.canEdit && (\n <Tooltip title={t('articlePage.editButton')}>\n <IconButton\n size=\"small\"\n onClick={() =>\n navigate(\n editArticleRoute({\n id: post.id.toString(10),\n }),\n )\n }\n color=\"primary\"\n >\n <EditIcon />\n </IconButton>\n </Tooltip>\n )}\n {post.canDelete && (\n <>\n <Tooltip title={t('articlePage.deleteButton')}>\n <IconButton\n size=\"small\"\n onClick={handleDeleteModalOpen}\n color=\"secondary\"\n >\n <DeleteIcon />\n </IconButton>\n </Tooltip>\n <DeleteModal\n open={deleteModalOpen}\n onClose={handleDeleteModalClose}\n entity={post}\n />\n </>\n )}\n </>\n )}\n </Grid>\n </Grid>\n </div>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ArticleButtons.esm.js","sources":["../../../src/components/ArticleContent/ArticleButtons.tsx"],"sourcesContent":["import { PostResponse } from '@drodil/backstage-plugin-qeta-common';\nimport { useState } 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 { useApi, 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';\nimport RestoreIcon from '@material-ui/icons/Restore';\nimport { useVoting } from '../../hooks/useVoting';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../../translation.ts';\nimport { useNavigate } from 'react-router-dom';\nimport { useIsModerator } from '../../hooks';\nimport { qetaApiRef } from '../../api.ts';\n\nexport type QetaArticleButtonsClassKey = 'container' | 'scoreText';\n\nexport const useLocalStyles = makeStyles(\n 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 { name: 'QetaArticleButtons' },\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 { t } = useTranslationRef(qetaTranslationRef);\n const navigate = useNavigate();\n const editArticleRoute = useRouteRef(editArticleRouteRef);\n const { isModerator } = useIsModerator();\n const qetaApi = useApi(qetaApiRef);\n const [deleteModalOpen, setDeleteModalOpen] = useState(false);\n const handleDeleteModalOpen = () => setDeleteModalOpen(true);\n const handleDeleteModalClose = () => setDeleteModalOpen(false);\n\n const own = props.post.own ?? false;\n\n const isDisabled = () => {\n return own || post.status !== 'active';\n };\n\n const getVoteUpTooltip = () => {\n if (isDisabled()) {\n return '';\n }\n return voteUpTooltip;\n };\n\n const getVoteDownTooltip = () => {\n if (isDisabled()) {\n return '';\n }\n return voteDownTooltip;\n };\n\n const restoreArticle = async () => {\n qetaApi.restorePost(post.id).then(() => {\n window.location.reload();\n });\n };\n\n return (\n <div className={styles.container}>\n <Grid container justifyContent=\"space-between\">\n <Grid item>\n <Tooltip title={getVoteUpTooltip()}>\n <span>\n <IconButton\n aria-label=\"vote up\"\n color={ownVote > 0 ? 'primary' : 'default'}\n className={ownVote > 0 ? 'qetaVoteUpSelected' : 'qetaVoteUp'}\n disabled={isDisabled()}\n size=\"small\"\n onClick={voteUp}\n >\n <ArrowUpward />\n </IconButton>\n </span>\n </Tooltip>\n <Tooltip title={getVoteDownTooltip()}>\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={isDisabled()}\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} />\n {(post.canEdit || post.canDelete) && (\n <>\n {post.canEdit && (\n <Tooltip title={t('articlePage.editButton')}>\n <IconButton\n size=\"small\"\n onClick={() =>\n navigate(\n editArticleRoute({\n id: post.id.toString(10),\n }),\n )\n }\n color=\"primary\"\n >\n <EditIcon />\n </IconButton>\n </Tooltip>\n )}\n {post.canDelete && (\n <>\n <Tooltip title={t('articlePage.deleteButton')}>\n <IconButton\n size=\"small\"\n onClick={handleDeleteModalOpen}\n color=\"secondary\"\n >\n <DeleteIcon />\n </IconButton>\n </Tooltip>\n <DeleteModal\n open={deleteModalOpen}\n onClose={handleDeleteModalClose}\n entity={post}\n />\n </>\n )}\n {isModerator && post.status === 'deleted' && (\n <Tooltip title={t('articlePage.restoreButton')}>\n <IconButton\n size=\"small\"\n onClick={() => restoreArticle()}\n color=\"primary\"\n >\n <RestoreIcon />\n </IconButton>\n </Tooltip>\n )}\n </>\n )}\n </Grid>\n </Grid>\n </div>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,8 @@ import { WarningPanel } from '@backstage/core-components';
|
|
|
10
10
|
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
|
|
11
11
|
import { qetaTranslationRef } from '../../translation.esm.js';
|
|
12
12
|
import { useEntityAuthor } from '../../hooks/useEntityAuthor.esm.js';
|
|
13
|
+
import { DraftBanner } from '../Utility/DraftBanner.esm.js';
|
|
14
|
+
import { DeletedBanner } from '../Utility/DeletedBanner.esm.js';
|
|
13
15
|
|
|
14
16
|
const useStyles = makeStyles(
|
|
15
17
|
(theme) => {
|
|
@@ -53,6 +55,8 @@ const ArticleContent = (props) => {
|
|
|
53
55
|
}
|
|
54
56
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
55
57
|
/* @__PURE__ */ jsx(Typography, { variant: "h2", children: postEntity.title }),
|
|
58
|
+
postEntity.status === "draft" && /* @__PURE__ */ jsx(DraftBanner, {}),
|
|
59
|
+
postEntity.status === "deleted" && /* @__PURE__ */ jsx(DeletedBanner, {}),
|
|
56
60
|
/* @__PURE__ */ jsxs(Grid, { container: true, alignItems: "center", children: [
|
|
57
61
|
/* @__PURE__ */ jsx(Grid, { item: true, children: /* @__PURE__ */ jsx(
|
|
58
62
|
Avatar,
|
|
@@ -93,15 +97,17 @@ const ArticleContent = (props) => {
|
|
|
93
97
|
showToc: true
|
|
94
98
|
}
|
|
95
99
|
),
|
|
96
|
-
/* @__PURE__ */
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
100
|
+
post.status === "active" && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
101
|
+
/* @__PURE__ */ jsx(Typography, { variant: "h6", children: t("common.comments") }),
|
|
102
|
+
/* @__PURE__ */ jsx(
|
|
103
|
+
CommentSection,
|
|
104
|
+
{
|
|
105
|
+
className: styles.commentSection,
|
|
106
|
+
post: postEntity,
|
|
107
|
+
onCommentAction
|
|
108
|
+
}
|
|
109
|
+
)
|
|
110
|
+
] }),
|
|
105
111
|
/* @__PURE__ */ jsx(Grid, { container: true, children: /* @__PURE__ */ jsx(Grid, { item: true, xs: 12, children: /* @__PURE__ */ jsx(TagsAndEntities, { entity: postEntity }) }) })
|
|
106
112
|
] });
|
|
107
113
|
};
|
|
@@ -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 { useState } from 'react';\nimport { RelativeTimeWithTooltip } from '../RelativeTimeWithTooltip';\nimport { ArticleButtons } from './ArticleButtons';\nimport { TagsAndEntities } from '../TagsAndEntities/TagsAndEntities';\nimport { CommentSection } from '../CommentSection/CommentSection';\nimport { WarningPanel } from '@backstage/core-components';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../../translation.ts';\nimport { useEntityAuthor } from '../../hooks/useEntityAuthor';\n\nexport type QetaArticleContentClassKey =\n | 'content'\n | 'headerImage'\n | 'commentSection';\n\nexport const useStyles = makeStyles(\n theme => {\n return {\n content: {\n paddingTop: theme.spacing(2),\n paddingBottom: theme.spacing(2),\n marginBottom: theme.spacing(2),\n borderBottom: `1px solid ${theme.palette.background.paper}`,\n },\n headerImage: {\n marginBottom: theme.spacing(2),\n marginTop: theme.spacing(2),\n height: '300px',\n objectFit: 'cover',\n width: '100%',\n border: `1px solid ${theme.palette.background.paper}`,\n boxShadow: theme.shadows[1],\n },\n commentSection: {\n borderBottom: `1px solid ${theme.palette.background.paper}`,\n paddingBottom: theme.spacing(2),\n marginBottom: theme.spacing(2),\n marginLeft: 0,\n },\n };\n },\n { name: 'QetaArticle' },\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 } = useTranslationRef(qetaTranslationRef);\n const { name, initials, user } = useEntityAuthor(post);\n const [postEntity, setPostEntity] = useState(post);\n const onCommentAction = (q: PostResponse, _?: AnswerResponse) => {\n setPostEntity(q);\n };\n\n if (post.type !== 'article') {\n return (\n <WarningPanel title=\"Not found\" message=\"Could not find the article\" />\n );\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.viewsCount', { 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 showToc\n />\n <Typography variant=\"h6\">{t('common.comments')}</Typography>\n
|
|
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 { useState } from 'react';\nimport { RelativeTimeWithTooltip } from '../RelativeTimeWithTooltip';\nimport { ArticleButtons } from './ArticleButtons';\nimport { TagsAndEntities } from '../TagsAndEntities/TagsAndEntities';\nimport { CommentSection } from '../CommentSection/CommentSection';\nimport { WarningPanel } from '@backstage/core-components';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../../translation.ts';\nimport { useEntityAuthor } from '../../hooks/useEntityAuthor';\nimport { DraftBanner } from '../Utility/DraftBanner';\nimport { DeletedBanner } from '../Utility/DeletedBanner.tsx';\n\nexport type QetaArticleContentClassKey =\n | 'content'\n | 'headerImage'\n | 'commentSection';\n\nexport const useStyles = makeStyles(\n theme => {\n return {\n content: {\n paddingTop: theme.spacing(2),\n paddingBottom: theme.spacing(2),\n marginBottom: theme.spacing(2),\n borderBottom: `1px solid ${theme.palette.background.paper}`,\n },\n headerImage: {\n marginBottom: theme.spacing(2),\n marginTop: theme.spacing(2),\n height: '300px',\n objectFit: 'cover',\n width: '100%',\n border: `1px solid ${theme.palette.background.paper}`,\n boxShadow: theme.shadows[1],\n },\n commentSection: {\n borderBottom: `1px solid ${theme.palette.background.paper}`,\n paddingBottom: theme.spacing(2),\n marginBottom: theme.spacing(2),\n marginLeft: 0,\n },\n };\n },\n { name: 'QetaArticle' },\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 } = useTranslationRef(qetaTranslationRef);\n const { name, initials, user } = useEntityAuthor(post);\n const [postEntity, setPostEntity] = useState(post);\n const onCommentAction = (q: PostResponse, _?: AnswerResponse) => {\n setPostEntity(q);\n };\n\n if (post.type !== 'article') {\n return (\n <WarningPanel title=\"Not found\" message=\"Could not find the article\" />\n );\n }\n\n return (\n <>\n <Typography variant=\"h2\">{postEntity.title}</Typography>\n {postEntity.status === 'draft' && <DraftBanner />}\n {postEntity.status === 'deleted' && <DeletedBanner />}\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.viewsCount', { 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 showToc\n />\n {post.status === 'active' && (\n <>\n <Typography variant=\"h6\">{t('common.comments')}</Typography>\n <CommentSection\n className={styles.commentSection}\n post={postEntity}\n onCommentAction={onCommentAction}\n />\n </>\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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AddToCollectionButton.esm.js","sources":["../../../src/components/Buttons/AddToCollectionButton.tsx"],"sourcesContent":["import { Collection, PostResponse } from '@drodil/backstage-plugin-qeta-common';\nimport { useState } from 'react';\nimport {\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n Grid,\n} from '@material-ui/core';\nimport AddCircle from '@material-ui/icons/AddCircle';\nimport RemoveCircle from '@material-ui/icons/RemoveCircle';\nimport PlayListAddIcon from '@material-ui/icons/PlaylistAdd';\nimport { alertApiRef, useApi } from '@backstage/core-plugin-api';\nimport { qetaApiRef } from '../../api';\nimport { useQetaApi } from '../../hooks';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../../translation.ts';\n\nexport const AddToCollectionButton = (props: { post: PostResponse }) => {\n const { post } = props;\n const { t } = useTranslationRef(qetaTranslationRef);\n const alertApi = useApi(alertApiRef);\n const { value: response, retry } = useQetaApi(api => {\n return api.getCollections({\n checkAccess: true,\n includeExperts: false,\n includePosts: true,\n });\n }, []);\n const [open, setOpen] = useState(false);\n const qetaApi = useApi(qetaApiRef);\n\n const handleClickOpen = () => {\n setOpen(true);\n };\n\n const handleClose = () => {\n setOpen(false);\n };\n\n const handleClick = (collection: Collection) => {\n if (collection.posts?.find(p => p.id === post.id)) {\n qetaApi.removePostFromCollection(collection.id, post.id).then(() => {\n alertApi.post({\n message: t('addToCollectionButton.removed', {\n collection: collection.title,\n }),\n severity: 'success',\n display: 'transient',\n });\n retry();\n });\n } else {\n qetaApi.addPostToCollection(collection.id, post.id).then(() => {\n alertApi.post({\n message: t('addToCollectionButton.added', {\n collection: collection.title,\n }),\n severity: 'success',\n display: 'transient',\n });\n retry();\n });\n }\n };\n\n const collections = (response?.collections ?? []).filter(c => c.canEdit);\n if (!collections.length) {\n return null;\n }\n\n return (\n <>\n <Button\n variant=\"contained\"\n size=\"small\"\n onClick={handleClickOpen}\n startIcon={<PlayListAddIcon />}\n >\n {t('addToCollectionButton.title')}\n </Button>\n <Dialog open={open} onClose={handleClose} fullWidth>\n <DialogTitle>{t('addToCollectionButton.manage')}</DialogTitle>\n <DialogContent>\n <Grid container>\n {collections.map(collection => {\n const isInCollection = collection.posts?.find(\n p => p.id === post.id,\n );\n\n return (\n <Grid item key={collection.id}>\n <Button\n variant=\"outlined\"\n startIcon={\n isInCollection ? <RemoveCircle /> : <AddCircle />\n }\n color={isInCollection ? 'secondary' : 'primary'}\n onClick={() => handleClick(collection)}\n >\n {collection.title}\n </Button>\n </Grid>\n );\n })}\n </Grid>\n </DialogContent>\n <DialogActions>\n <Button onClick={handleClose} color=\"primary\">\n {t('addToCollectionButton.close')}\n </Button>\n </DialogActions>\n </Dialog>\n </>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AddToCollectionButton.esm.js","sources":["../../../src/components/Buttons/AddToCollectionButton.tsx"],"sourcesContent":["import { Collection, PostResponse } from '@drodil/backstage-plugin-qeta-common';\nimport { useState } from 'react';\nimport {\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n Grid,\n} from '@material-ui/core';\nimport AddCircle from '@material-ui/icons/AddCircle';\nimport RemoveCircle from '@material-ui/icons/RemoveCircle';\nimport PlayListAddIcon from '@material-ui/icons/PlaylistAdd';\nimport { alertApiRef, useApi } from '@backstage/core-plugin-api';\nimport { qetaApiRef } from '../../api';\nimport { useQetaApi } from '../../hooks';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../../translation.ts';\n\nexport const AddToCollectionButton = (props: { post: PostResponse }) => {\n const { post } = props;\n const { t } = useTranslationRef(qetaTranslationRef);\n const alertApi = useApi(alertApiRef);\n const { value: response, retry } = useQetaApi(api => {\n return api.getCollections({\n checkAccess: true,\n includeExperts: false,\n includePosts: true,\n });\n }, []);\n const [open, setOpen] = useState(false);\n const qetaApi = useApi(qetaApiRef);\n\n const handleClickOpen = () => {\n setOpen(true);\n };\n\n const handleClose = () => {\n setOpen(false);\n };\n\n const handleClick = (collection: Collection) => {\n if (collection.posts?.find(p => p.id === post.id)) {\n qetaApi.removePostFromCollection(collection.id, post.id).then(() => {\n alertApi.post({\n message: t('addToCollectionButton.removed', {\n collection: collection.title,\n }),\n severity: 'success',\n display: 'transient',\n });\n retry();\n });\n } else {\n qetaApi.addPostToCollection(collection.id, post.id).then(() => {\n alertApi.post({\n message: t('addToCollectionButton.added', {\n collection: collection.title,\n }),\n severity: 'success',\n display: 'transient',\n });\n retry();\n });\n }\n };\n\n if (post.status !== 'active') {\n return null;\n }\n\n const collections = (response?.collections ?? []).filter(c => c.canEdit);\n if (!collections.length) {\n return null;\n }\n\n return (\n <>\n <Button\n variant=\"contained\"\n size=\"small\"\n onClick={handleClickOpen}\n startIcon={<PlayListAddIcon />}\n >\n {t('addToCollectionButton.title')}\n </Button>\n <Dialog open={open} onClose={handleClose} fullWidth>\n <DialogTitle>{t('addToCollectionButton.manage')}</DialogTitle>\n <DialogContent>\n <Grid container>\n {collections.map(collection => {\n const isInCollection = collection.posts?.find(\n p => p.id === post.id,\n );\n\n return (\n <Grid item key={collection.id}>\n <Button\n variant=\"outlined\"\n startIcon={\n isInCollection ? <RemoveCircle /> : <AddCircle />\n }\n color={isInCollection ? 'secondary' : 'primary'}\n onClick={() => handleClick(collection)}\n >\n {collection.title}\n </Button>\n </Grid>\n );\n })}\n </Grid>\n </DialogContent>\n <DialogActions>\n <Button onClick={handleClose} color=\"primary\">\n {t('addToCollectionButton.close')}\n </Button>\n </DialogActions>\n </Dialog>\n </>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -27,6 +27,7 @@ const FavoriteButton = (props) => {
|
|
|
27
27
|
{
|
|
28
28
|
"aria-label": "unfavorite",
|
|
29
29
|
size: "small",
|
|
30
|
+
disabled: entity.status !== "active",
|
|
30
31
|
onClick: unfavoriteQuestion,
|
|
31
32
|
className: "qetaUnfavoriteBtn",
|
|
32
33
|
children: /* @__PURE__ */ jsx(StarIcon, {})
|
|
@@ -36,6 +37,7 @@ const FavoriteButton = (props) => {
|
|
|
36
37
|
{
|
|
37
38
|
"aria-label": "favorite",
|
|
38
39
|
size: "small",
|
|
40
|
+
disabled: entity.status !== "active",
|
|
39
41
|
onClick: favoriteQuestion,
|
|
40
42
|
className: "qetaFavoriteBtn",
|
|
41
43
|
children: /* @__PURE__ */ jsx(StarOutlineIcon, {})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FavoriteButton.esm.js","sources":["../../../src/components/Buttons/FavoriteButton.tsx"],"sourcesContent":["import { PostResponse } from '@drodil/backstage-plugin-qeta-common';\nimport { IconButton, Tooltip } from '@material-ui/core';\nimport { useState, Fragment } from 'react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport StarIcon from '@material-ui/icons/Star';\nimport StarOutlineIcon from '@material-ui/icons/StarOutline';\nimport { qetaApiRef } from '../../api';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../../translation.ts';\n\nexport const FavoriteButton = (props: { entity: PostResponse }) => {\n const [entity, setEntity] = useState<PostResponse>(props.entity);\n const qetaApi = useApi(qetaApiRef);\n const { t } = useTranslationRef(qetaTranslationRef);\n\n const favoriteQuestion = () => {\n qetaApi.favoritePost(entity.id).then(response => {\n setEntity(response);\n });\n };\n\n const unfavoriteQuestion = () => {\n qetaApi.unfavoritePost(entity.id).then(response => {\n setEntity(response);\n });\n };\n\n return (\n <Fragment>\n {entity.favorite ? (\n <Tooltip title={t('favorite.remove')}>\n <IconButton\n aria-label=\"unfavorite\"\n size=\"small\"\n onClick={unfavoriteQuestion}\n className=\"qetaUnfavoriteBtn\"\n >\n <StarIcon />\n </IconButton>\n </Tooltip>\n ) : (\n <Tooltip title={t('favorite.add')}>\n <IconButton\n aria-label=\"favorite\"\n size=\"small\"\n onClick={favoriteQuestion}\n className=\"qetaFavoriteBtn\"\n >\n <StarOutlineIcon />\n </IconButton>\n </Tooltip>\n )}\n </Fragment>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;AAUa,MAAA,cAAA,GAAiB,CAAC,KAAoC,KAAA;AACjE,EAAA,MAAM,CAAC,MAAQ,EAAA,SAAS,CAAI,GAAA,QAAA,CAAuB,MAAM,MAAM,CAAA;AAC/D,EAAM,MAAA,OAAA,GAAU,OAAO,UAAU,CAAA;AACjC,EAAA,MAAM,EAAE,CAAA,EAAM,GAAA,iBAAA,CAAkB,kBAAkB,CAAA;AAElD,EAAA,MAAM,mBAAmB,MAAM;AAC7B,IAAA,OAAA,CAAQ,YAAa,CAAA,MAAA,CAAO,EAAE,CAAA,CAAE,KAAK,CAAY,QAAA,KAAA;AAC/C,MAAA,SAAA,CAAU,QAAQ,CAAA;AAAA,KACnB,CAAA;AAAA,GACH;AAEA,EAAA,MAAM,qBAAqB,MAAM;AAC/B,IAAA,OAAA,CAAQ,cAAe,CAAA,MAAA,CAAO,EAAE,CAAA,CAAE,KAAK,CAAY,QAAA,KAAA;AACjD,MAAA,SAAA,CAAU,QAAQ,CAAA;AAAA,KACnB,CAAA;AAAA,GACH;AAEA,EACE,uBAAA,GAAA,CAAC,YACE,QAAO,EAAA,MAAA,CAAA,QAAA,uBACL,OAAQ,EAAA,EAAA,KAAA,EAAO,CAAE,CAAA,iBAAiB,CACjC,EAAA,QAAA,kBAAA,GAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,YAAW,EAAA,YAAA;AAAA,MACX,IAAK,EAAA,OAAA;AAAA,MACL,OAAS,EAAA,kBAAA;AAAA,MACT,SAAU,EAAA,mBAAA;AAAA,MAEV,8BAAC,QAAS,EAAA,EAAA;AAAA;AAAA,KAEd,CAEA,mBAAA,GAAA,CAAC,WAAQ,KAAO,EAAA,CAAA,CAAE,cAAc,CAC9B,EAAA,QAAA,kBAAA,GAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,YAAW,EAAA,UAAA;AAAA,MACX,IAAK,EAAA,OAAA;AAAA,MACL,OAAS,EAAA,gBAAA;AAAA,MACT,SAAU,EAAA,iBAAA;AAAA,MAEV,8BAAC,eAAgB,EAAA,EAAA;AAAA;AAAA,KAErB,CAEJ,EAAA,CAAA;AAEJ;;;;"}
|
|
1
|
+
{"version":3,"file":"FavoriteButton.esm.js","sources":["../../../src/components/Buttons/FavoriteButton.tsx"],"sourcesContent":["import { PostResponse } from '@drodil/backstage-plugin-qeta-common';\nimport { IconButton, Tooltip } from '@material-ui/core';\nimport { useState, Fragment } from 'react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport StarIcon from '@material-ui/icons/Star';\nimport StarOutlineIcon from '@material-ui/icons/StarOutline';\nimport { qetaApiRef } from '../../api';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../../translation.ts';\n\nexport const FavoriteButton = (props: { entity: PostResponse }) => {\n const [entity, setEntity] = useState<PostResponse>(props.entity);\n const qetaApi = useApi(qetaApiRef);\n const { t } = useTranslationRef(qetaTranslationRef);\n\n const favoriteQuestion = () => {\n qetaApi.favoritePost(entity.id).then(response => {\n setEntity(response);\n });\n };\n\n const unfavoriteQuestion = () => {\n qetaApi.unfavoritePost(entity.id).then(response => {\n setEntity(response);\n });\n };\n\n return (\n <Fragment>\n {entity.favorite ? (\n <Tooltip title={t('favorite.remove')}>\n <IconButton\n aria-label=\"unfavorite\"\n size=\"small\"\n disabled={entity.status !== 'active'}\n onClick={unfavoriteQuestion}\n className=\"qetaUnfavoriteBtn\"\n >\n <StarIcon />\n </IconButton>\n </Tooltip>\n ) : (\n <Tooltip title={t('favorite.add')}>\n <IconButton\n aria-label=\"favorite\"\n size=\"small\"\n disabled={entity.status !== 'active'}\n onClick={favoriteQuestion}\n className=\"qetaFavoriteBtn\"\n >\n <StarOutlineIcon />\n </IconButton>\n </Tooltip>\n )}\n </Fragment>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;AAUa,MAAA,cAAA,GAAiB,CAAC,KAAoC,KAAA;AACjE,EAAA,MAAM,CAAC,MAAQ,EAAA,SAAS,CAAI,GAAA,QAAA,CAAuB,MAAM,MAAM,CAAA;AAC/D,EAAM,MAAA,OAAA,GAAU,OAAO,UAAU,CAAA;AACjC,EAAA,MAAM,EAAE,CAAA,EAAM,GAAA,iBAAA,CAAkB,kBAAkB,CAAA;AAElD,EAAA,MAAM,mBAAmB,MAAM;AAC7B,IAAA,OAAA,CAAQ,YAAa,CAAA,MAAA,CAAO,EAAE,CAAA,CAAE,KAAK,CAAY,QAAA,KAAA;AAC/C,MAAA,SAAA,CAAU,QAAQ,CAAA;AAAA,KACnB,CAAA;AAAA,GACH;AAEA,EAAA,MAAM,qBAAqB,MAAM;AAC/B,IAAA,OAAA,CAAQ,cAAe,CAAA,MAAA,CAAO,EAAE,CAAA,CAAE,KAAK,CAAY,QAAA,KAAA;AACjD,MAAA,SAAA,CAAU,QAAQ,CAAA;AAAA,KACnB,CAAA;AAAA,GACH;AAEA,EACE,uBAAA,GAAA,CAAC,YACE,QAAO,EAAA,MAAA,CAAA,QAAA,uBACL,OAAQ,EAAA,EAAA,KAAA,EAAO,CAAE,CAAA,iBAAiB,CACjC,EAAA,QAAA,kBAAA,GAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,YAAW,EAAA,YAAA;AAAA,MACX,IAAK,EAAA,OAAA;AAAA,MACL,QAAA,EAAU,OAAO,MAAW,KAAA,QAAA;AAAA,MAC5B,OAAS,EAAA,kBAAA;AAAA,MACT,SAAU,EAAA,mBAAA;AAAA,MAEV,8BAAC,QAAS,EAAA,EAAA;AAAA;AAAA,KAEd,CAEA,mBAAA,GAAA,CAAC,WAAQ,KAAO,EAAA,CAAA,CAAE,cAAc,CAC9B,EAAA,QAAA,kBAAA,GAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,YAAW,EAAA,UAAA;AAAA,MACX,IAAK,EAAA,OAAA;AAAA,MACL,QAAA,EAAU,OAAO,MAAW,KAAA,QAAA;AAAA,MAC5B,OAAS,EAAA,gBAAA;AAAA,MACT,SAAU,EAAA,iBAAA;AAAA,MAEV,8BAAC,eAAgB,EAAA,EAAA;AAAA;AAAA,KAErB,CAEJ,EAAA,CAAA;AAEJ;;;;"}
|
|
@@ -35,37 +35,62 @@ const VoteButtons = (props) => {
|
|
|
35
35
|
} = useVoting(props.entity);
|
|
36
36
|
const own = props.entity.own ?? false;
|
|
37
37
|
const classes = useStyles();
|
|
38
|
+
const isDisabled = (isCorrectButton = false) => {
|
|
39
|
+
if (isCorrectButton) {
|
|
40
|
+
return "status" in props.entity && props.entity.status !== "active";
|
|
41
|
+
}
|
|
42
|
+
return own || "status" in props.entity && props.entity.status !== "active";
|
|
43
|
+
};
|
|
44
|
+
const getVoteUpTooltip = () => {
|
|
45
|
+
if (isDisabled()) {
|
|
46
|
+
return "";
|
|
47
|
+
}
|
|
48
|
+
return voteUpTooltip;
|
|
49
|
+
};
|
|
50
|
+
const getVoteDownTooltip = () => {
|
|
51
|
+
if (isDisabled()) {
|
|
52
|
+
return "";
|
|
53
|
+
}
|
|
54
|
+
return voteDownTooltip;
|
|
55
|
+
};
|
|
56
|
+
const getCorrectTooltip = () => {
|
|
57
|
+
if (isDisabled(true)) {
|
|
58
|
+
return "";
|
|
59
|
+
}
|
|
60
|
+
return correctTooltip;
|
|
61
|
+
};
|
|
38
62
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
39
|
-
/* @__PURE__ */ jsx(Tooltip, { title:
|
|
63
|
+
/* @__PURE__ */ jsx(Tooltip, { title: getVoteUpTooltip(), children: /* @__PURE__ */ jsx("span", { children: /* @__PURE__ */ jsx(
|
|
40
64
|
IconButton,
|
|
41
65
|
{
|
|
42
66
|
"aria-label": "vote up",
|
|
43
67
|
color: ownVote > 0 ? "primary" : "default",
|
|
44
68
|
className: ownVote > 0 ? "qetaVoteUpSelected" : "qetaVoteUp",
|
|
45
|
-
disabled:
|
|
69
|
+
disabled: isDisabled(),
|
|
46
70
|
size: "small",
|
|
47
71
|
onClick: voteUp,
|
|
48
72
|
children: /* @__PURE__ */ jsx(ArrowUpward, {})
|
|
49
73
|
}
|
|
50
74
|
) }) }),
|
|
51
75
|
/* @__PURE__ */ jsx(Typography, { variant: "h6", style: { userSelect: "none" }, children: score }),
|
|
52
|
-
/* @__PURE__ */ jsx(Tooltip, { title:
|
|
76
|
+
/* @__PURE__ */ jsx(Tooltip, { title: getVoteDownTooltip(), children: /* @__PURE__ */ jsx("span", { children: /* @__PURE__ */ jsx(
|
|
53
77
|
IconButton,
|
|
54
78
|
{
|
|
55
79
|
"aria-label": "vote down",
|
|
56
80
|
color: ownVote < 0 ? "primary" : "default",
|
|
57
81
|
className: ownVote < 0 ? "qetaVoteDownSelected" : "qetaVoteDown",
|
|
58
|
-
disabled:
|
|
82
|
+
disabled: isDisabled(),
|
|
59
83
|
size: "small",
|
|
60
84
|
onClick: voteDown,
|
|
61
85
|
children: /* @__PURE__ */ jsx(ArrowDownward, {})
|
|
62
86
|
}
|
|
63
87
|
) }) }),
|
|
64
|
-
"correct" in props.entity && (props.post?.own || props.post?.canEdit || correctAnswer) && /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsx(Tooltip, { title:
|
|
88
|
+
"correct" in props.entity && (props.post?.own || props.post?.canEdit || correctAnswer) && /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsx(Tooltip, { title: getCorrectTooltip(), children: /* @__PURE__ */ jsx("span", { children: /* @__PURE__ */ jsx(
|
|
65
89
|
IconButton,
|
|
66
90
|
{
|
|
67
91
|
"aria-label": "mark correct",
|
|
68
92
|
size: "small",
|
|
93
|
+
disabled: isDisabled(true),
|
|
69
94
|
onClick: props.post?.own || props.post?.canEdit ? toggleCorrectAnswer : void 0,
|
|
70
95
|
children: /* @__PURE__ */ jsx(
|
|
71
96
|
Check,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VoteButtons.esm.js","sources":["../../../src/components/Buttons/VoteButtons.tsx"],"sourcesContent":["import {\n AnswerResponse,\n PostResponse,\n} from '@drodil/backstage-plugin-qeta-common';\nimport ArrowDownward from '@material-ui/icons/ArrowDownward';\nimport ArrowUpward from '@material-ui/icons/ArrowUpward';\nimport Check from '@material-ui/icons/Check';\nimport { Fragment } from 'react';\nimport { useVoting } from '../../hooks/useVoting';\nimport {\n Box,\n createStyles,\n IconButton,\n makeStyles,\n Theme,\n Tooltip,\n Typography,\n} from '@material-ui/core';\n\nexport type QetaVoteButtonsClassKey =\n | 'qetaCorrectAnswerSelected'\n | 'qetaCorrectAnswer'\n | 'voteButtonContainer';\n\nconst useStyles = makeStyles(\n (theme: Theme) =>\n createStyles({\n qetaCorrectAnswerSelected: {\n color: theme.palette.success.main,\n },\n qetaCorrectAnswer: {\n color: theme.palette.grey[500],\n },\n voteButtonContainer: {\n borderWidth: '1px',\n borderColor: 'white',\n },\n }),\n { name: 'QetaVoteButtons' },\n);\n\nexport const VoteButtons = (props: {\n entity: PostResponse | AnswerResponse;\n post?: PostResponse;\n}) => {\n const {\n voteUpTooltip,\n ownVote,\n voteUp,\n score,\n voteDownTooltip,\n voteDown,\n correctAnswer,\n correctTooltip,\n toggleCorrectAnswer,\n } = useVoting(props.entity);\n const own = props.entity.own ?? false;\n const classes = useStyles();\n\n return (\n <Fragment>\n <Tooltip title={
|
|
1
|
+
{"version":3,"file":"VoteButtons.esm.js","sources":["../../../src/components/Buttons/VoteButtons.tsx"],"sourcesContent":["import {\n AnswerResponse,\n PostResponse,\n} from '@drodil/backstage-plugin-qeta-common';\nimport ArrowDownward from '@material-ui/icons/ArrowDownward';\nimport ArrowUpward from '@material-ui/icons/ArrowUpward';\nimport Check from '@material-ui/icons/Check';\nimport { Fragment } from 'react';\nimport { useVoting } from '../../hooks/useVoting';\nimport {\n Box,\n createStyles,\n IconButton,\n makeStyles,\n Theme,\n Tooltip,\n Typography,\n} from '@material-ui/core';\n\nexport type QetaVoteButtonsClassKey =\n | 'qetaCorrectAnswerSelected'\n | 'qetaCorrectAnswer'\n | 'voteButtonContainer';\n\nconst useStyles = makeStyles(\n (theme: Theme) =>\n createStyles({\n qetaCorrectAnswerSelected: {\n color: theme.palette.success.main,\n },\n qetaCorrectAnswer: {\n color: theme.palette.grey[500],\n },\n voteButtonContainer: {\n borderWidth: '1px',\n borderColor: 'white',\n },\n }),\n { name: 'QetaVoteButtons' },\n);\n\nexport const VoteButtons = (props: {\n entity: PostResponse | AnswerResponse;\n post?: PostResponse;\n}) => {\n const {\n voteUpTooltip,\n ownVote,\n voteUp,\n score,\n voteDownTooltip,\n voteDown,\n correctAnswer,\n correctTooltip,\n toggleCorrectAnswer,\n } = useVoting(props.entity);\n const own = props.entity.own ?? false;\n const classes = useStyles();\n\n const isDisabled = (isCorrectButton = false) => {\n if (isCorrectButton) {\n return 'status' in props.entity && props.entity.status !== 'active';\n }\n return (\n own || ('status' in props.entity && props.entity.status !== 'active')\n );\n };\n\n const getVoteUpTooltip = () => {\n if (isDisabled()) {\n return '';\n }\n return voteUpTooltip;\n };\n\n const getVoteDownTooltip = () => {\n if (isDisabled()) {\n return '';\n }\n return voteDownTooltip;\n };\n\n const getCorrectTooltip = () => {\n if (isDisabled(true)) {\n return '';\n }\n return correctTooltip;\n };\n\n return (\n <Fragment>\n <Tooltip title={getVoteUpTooltip()}>\n <span>\n <IconButton\n aria-label=\"vote up\"\n color={ownVote > 0 ? 'primary' : 'default'}\n className={ownVote > 0 ? 'qetaVoteUpSelected' : 'qetaVoteUp'}\n disabled={isDisabled()}\n size=\"small\"\n onClick={voteUp}\n >\n <ArrowUpward />\n </IconButton>\n </span>\n </Tooltip>\n <Typography variant=\"h6\" style={{ userSelect: 'none' }}>\n {score}\n </Typography>\n <Tooltip title={getVoteDownTooltip()}>\n <span>\n <IconButton\n aria-label=\"vote down\"\n color={ownVote < 0 ? 'primary' : 'default'}\n className={ownVote < 0 ? 'qetaVoteDownSelected' : 'qetaVoteDown'}\n disabled={isDisabled()}\n size=\"small\"\n onClick={voteDown}\n >\n <ArrowDownward />\n </IconButton>\n </span>\n </Tooltip>\n {'correct' in props.entity &&\n (props.post?.own || props.post?.canEdit || correctAnswer) && (\n <Box>\n <Tooltip title={getCorrectTooltip()}>\n <span>\n <IconButton\n aria-label=\"mark correct\"\n size=\"small\"\n disabled={isDisabled(true)}\n onClick={\n props.post?.own || props.post?.canEdit\n ? toggleCorrectAnswer\n : undefined\n }\n >\n <Check\n className={\n correctAnswer\n ? classes.qetaCorrectAnswerSelected\n : classes.qetaCorrectAnswer\n }\n />\n </IconButton>\n </span>\n </Tooltip>\n </Box>\n )}\n </Fragment>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -159,6 +159,7 @@ const CollectionForm = (props) => {
|
|
|
159
159
|
fullWidth: true,
|
|
160
160
|
error: "title" in errors,
|
|
161
161
|
margin: "normal",
|
|
162
|
+
name: "title",
|
|
162
163
|
variant: "outlined",
|
|
163
164
|
helperText: /* @__PURE__ */ jsxs("span", { children: [
|
|
164
165
|
t("collectionForm.titleInput.helperText"),
|
|
@@ -228,6 +229,7 @@ const CollectionForm = (props) => {
|
|
|
228
229
|
value: value ?? "",
|
|
229
230
|
onChange,
|
|
230
231
|
height: 400,
|
|
232
|
+
name: "description",
|
|
231
233
|
error: "description" in errors,
|
|
232
234
|
placeholder: t("collectionForm.descriptionInput.placeholder"),
|
|
233
235
|
onImageUpload,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CollectionForm.esm.js","sources":["../../../src/components/CollectionForm/CollectionForm.tsx"],"sourcesContent":["import { useAnalytics, useApi, useRouteRef } from '@backstage/core-plugin-api';\nimport {\n Box,\n Button,\n Collapse,\n IconButton,\n TextField,\n Tooltip,\n Typography,\n} from '@material-ui/core';\nimport { Alert } from '@material-ui/lab';\nimport { useCallback, useEffect, useState } 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 { MarkdownEditor } from '../MarkdownEditor/MarkdownEditor';\nimport { collectionRouteRef } from '../../routes';\nimport { useConfirmNavigationIfEdited } from '../../utils/utils';\nimport { qetaApiRef } from '../../api';\nimport { CollectionFormData } from './types';\nimport { HeaderImageInput } from '../HeaderImageInput/HeaderImageInput';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../../translation.ts';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport ExpandLessIcon from '@material-ui/icons/ExpandLess';\nimport HelpIcon from '@material-ui/icons/Help';\n\nconst formToRequest = (\n form: CollectionFormData,\n images: number[],\n): CollectionRequest => {\n return {\n ...form,\n images,\n };\n};\n\nexport type CollectionFormProps = {\n id?: string;\n onPost?: (collection: CollectionResponse) => void;\n};\n\nconst getDefaultValues = (): CollectionFormData => {\n return {\n title: '',\n images: [],\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 headerImage: collection.headerImage,\n images: collection.images,\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] = useState(false);\n const [values, setValues] = useState(getDefaultValues());\n const [error, setError] = useState(false);\n const [edited, setEdited] = useState(false);\n const [images, setImages] = useState<number[]>([]);\n const [showTips, setShowTips] = useState(false);\n const [titleCharCount, setTitleCharCount] = useState(values.title.length);\n const { t } = useTranslationRef(qetaTranslationRef);\n\n const qetaApi = useApi(qetaApiRef);\n const {\n handleSubmit,\n control,\n reset,\n setValue,\n formState: { errors, isSubmitting },\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))\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))\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 setImages(data.form.images);\n });\n }\n }, [qetaApi, id]);\n\n useEffect(() => {\n reset(values);\n }, [values, reset]);\n\n useConfirmNavigationIfEdited(edited && !posting);\n\n const onImageUpload = useCallback(\n (imageId: number) => {\n setImages(prevImages => [...prevImages, imageId]);\n },\n [setImages],\n );\n\n const handleTitleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setTitleCharCount(e.target.value.length);\n setValue('title', e.target.value, { shouldValidate: true });\n };\n\n return (\n <form\n onSubmit={handleSubmit(postQuestion)}\n onChange={() => {\n setEdited(true);\n }}\n >\n {error && (\n <Alert severity=\"error\">{t('collectionForm.errorPosting')}</Alert>\n )}\n <Controller\n control={control}\n render={({ field: { onChange, value } }) => (\n <HeaderImageInput\n onChange={onChange}\n onImageUpload={onImageUpload}\n url={value}\n collectionId={id ? Number(id) : undefined}\n />\n )}\n name=\"headerImage\"\n />\n <Box mb={2}>\n <TextField\n label={t('collectionForm.titleInput.label')}\n className=\"qetaCollectionFormTitle\"\n required\n fullWidth\n error={'title' in errors}\n margin=\"normal\"\n variant=\"outlined\"\n helperText={\n <span>\n {t('collectionForm.titleInput.helperText')}{' '}\n <span style={{ float: 'right' }}>{titleCharCount}/255</span>\n </span>\n }\n FormHelperTextProps={{\n style: { marginLeft: '0.2em' },\n }}\n value={control._formValues.title}\n onChange={handleTitleChange}\n inputProps={{ maxLength: 255 }}\n />\n </Box>\n <Box\n mb={1}\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n >\n <Typography variant=\"subtitle1\" style={{ fontWeight: 500 }}>\n {t('collectionForm.descriptionInput.label')}\n <Tooltip title=\"Tips for a good collection\">\n <IconButton size=\"small\" onClick={() => setShowTips(v => !v)}>\n {showTips ? <ExpandLessIcon /> : <ExpandMoreIcon />}\n </IconButton>\n </Tooltip>\n </Typography>\n <Box>\n <a\n href=\"https://www.markdownguide.org/cheat-sheet/\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{ fontSize: 12 }}\n >\n {t('collectionForm.descriptionInput.markdownHelp')}\n </a>\n <HelpIcon\n fontSize=\"small\"\n style={{ marginLeft: 4, verticalAlign: 'middle' }}\n />\n </Box>\n </Box>\n <Collapse in={showTips}>\n <Box mb={2} p={2}>\n <Typography variant=\"body2\">\n <ul style={{ margin: 0, paddingLeft: 20 }}>\n <li>{t('collectionForm.tips_1')}</li>\n <li>{t('collectionForm.tips_2')}</li>\n <li>{t('collectionForm.tips_3')}</li>\n </ul>\n </Typography>\n </Box>\n </Collapse>\n <Controller\n control={control}\n rules={{\n required: true,\n }}\n render={({ field: { onChange, value } }) => (\n <MarkdownEditor\n value={value ?? ''}\n onChange={onChange}\n height={400}\n error={'description' in errors}\n placeholder={t('collectionForm.descriptionInput.placeholder')}\n onImageUpload={onImageUpload}\n collectionId={id ? Number(id) : undefined}\n />\n )}\n name=\"description\"\n />\n <Box mt={3}>\n <Button\n color=\"primary\"\n type=\"submit\"\n variant=\"contained\"\n disabled={posting || isSubmitting}\n size=\"large\"\n >\n {posting ? (\n <span>\n {t('collectionForm.submitting')}{' '}\n <span className=\"spinner-border spinner-border-sm\" />\n </span>\n ) : (\n t(\n id\n ? 'collectionForm.submit.existingCollection'\n : 'collectionForm.submit.newCollection',\n )\n )}\n </Button>\n </Box>\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 { useAnalytics, useApi, useRouteRef } from '@backstage/core-plugin-api';\nimport {\n Box,\n Button,\n Collapse,\n IconButton,\n TextField,\n Tooltip,\n Typography,\n} from '@material-ui/core';\nimport { Alert } from '@material-ui/lab';\nimport { useCallback, useEffect, useState } 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 { MarkdownEditor } from '../MarkdownEditor/MarkdownEditor';\nimport { collectionRouteRef } from '../../routes';\nimport { useConfirmNavigationIfEdited } from '../../utils/utils';\nimport { qetaApiRef } from '../../api';\nimport { CollectionFormData } from './types';\nimport { HeaderImageInput } from '../HeaderImageInput/HeaderImageInput';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../../translation.ts';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport ExpandLessIcon from '@material-ui/icons/ExpandLess';\nimport HelpIcon from '@material-ui/icons/Help';\n\nconst formToRequest = (\n form: CollectionFormData,\n images: number[],\n): CollectionRequest => {\n return {\n ...form,\n images,\n };\n};\n\nexport type CollectionFormProps = {\n id?: string;\n onPost?: (collection: CollectionResponse) => void;\n};\n\nconst getDefaultValues = (): CollectionFormData => {\n return {\n title: '',\n images: [],\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 headerImage: collection.headerImage,\n images: collection.images,\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] = useState(false);\n const [values, setValues] = useState(getDefaultValues());\n const [error, setError] = useState(false);\n const [edited, setEdited] = useState(false);\n const [images, setImages] = useState<number[]>([]);\n const [showTips, setShowTips] = useState(false);\n const [titleCharCount, setTitleCharCount] = useState(values.title.length);\n const { t } = useTranslationRef(qetaTranslationRef);\n\n const qetaApi = useApi(qetaApiRef);\n const {\n handleSubmit,\n control,\n reset,\n setValue,\n formState: { errors, isSubmitting },\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))\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))\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 setImages(data.form.images);\n });\n }\n }, [qetaApi, id]);\n\n useEffect(() => {\n reset(values);\n }, [values, reset]);\n\n useConfirmNavigationIfEdited(edited && !posting);\n\n const onImageUpload = useCallback(\n (imageId: number) => {\n setImages(prevImages => [...prevImages, imageId]);\n },\n [setImages],\n );\n\n const handleTitleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setTitleCharCount(e.target.value.length);\n setValue('title', e.target.value, { shouldValidate: true });\n };\n\n return (\n <form\n onSubmit={handleSubmit(postQuestion)}\n onChange={() => {\n setEdited(true);\n }}\n >\n {error && (\n <Alert severity=\"error\">{t('collectionForm.errorPosting')}</Alert>\n )}\n <Controller\n control={control}\n render={({ field: { onChange, value } }) => (\n <HeaderImageInput\n onChange={onChange}\n onImageUpload={onImageUpload}\n url={value}\n collectionId={id ? Number(id) : undefined}\n />\n )}\n name=\"headerImage\"\n />\n <Box mb={2}>\n <TextField\n label={t('collectionForm.titleInput.label')}\n className=\"qetaCollectionFormTitle\"\n required\n fullWidth\n error={'title' in errors}\n margin=\"normal\"\n name=\"title\"\n variant=\"outlined\"\n helperText={\n <span>\n {t('collectionForm.titleInput.helperText')}{' '}\n <span style={{ float: 'right' }}>{titleCharCount}/255</span>\n </span>\n }\n FormHelperTextProps={{\n style: { marginLeft: '0.2em' },\n }}\n value={control._formValues.title}\n onChange={handleTitleChange}\n inputProps={{ maxLength: 255 }}\n />\n </Box>\n <Box\n mb={1}\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n >\n <Typography variant=\"subtitle1\" style={{ fontWeight: 500 }}>\n {t('collectionForm.descriptionInput.label')}\n <Tooltip title=\"Tips for a good collection\">\n <IconButton size=\"small\" onClick={() => setShowTips(v => !v)}>\n {showTips ? <ExpandLessIcon /> : <ExpandMoreIcon />}\n </IconButton>\n </Tooltip>\n </Typography>\n <Box>\n <a\n href=\"https://www.markdownguide.org/cheat-sheet/\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{ fontSize: 12 }}\n >\n {t('collectionForm.descriptionInput.markdownHelp')}\n </a>\n <HelpIcon\n fontSize=\"small\"\n style={{ marginLeft: 4, verticalAlign: 'middle' }}\n />\n </Box>\n </Box>\n <Collapse in={showTips}>\n <Box mb={2} p={2}>\n <Typography variant=\"body2\">\n <ul style={{ margin: 0, paddingLeft: 20 }}>\n <li>{t('collectionForm.tips_1')}</li>\n <li>{t('collectionForm.tips_2')}</li>\n <li>{t('collectionForm.tips_3')}</li>\n </ul>\n </Typography>\n </Box>\n </Collapse>\n <Controller\n control={control}\n rules={{\n required: true,\n }}\n render={({ field: { onChange, value } }) => (\n <MarkdownEditor\n value={value ?? ''}\n onChange={onChange}\n height={400}\n name=\"description\"\n error={'description' in errors}\n placeholder={t('collectionForm.descriptionInput.placeholder')}\n onImageUpload={onImageUpload}\n collectionId={id ? Number(id) : undefined}\n />\n )}\n name=\"description\"\n />\n <Box mt={3}>\n <Button\n color=\"primary\"\n type=\"submit\"\n variant=\"contained\"\n disabled={posting || isSubmitting}\n size=\"large\"\n >\n {posting ? (\n <span>\n {t('collectionForm.submitting')}{' '}\n <span className=\"spinner-border spinner-border-sm\" />\n </span>\n ) : (\n t(\n id\n ? 'collectionForm.submit.existingCollection'\n : 'collectionForm.submit.newCollection',\n )\n )}\n </Button>\n </Box>\n </form>\n );\n};\n"],"names":[],"mappings":"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"}
|