@drodil/backstage-plugin-qeta-react 3.30.2 → 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.
Files changed (42) hide show
  1. package/dist/components/AnswerCard/AnswerCard.esm.js +1 -1
  2. package/dist/components/AnswerCard/AnswerCard.esm.js.map +1 -1
  3. package/dist/components/ArticleContent/ArticleButtons.esm.js +45 -6
  4. package/dist/components/ArticleContent/ArticleButtons.esm.js.map +1 -1
  5. package/dist/components/ArticleContent/ArticleContent.esm.js +15 -9
  6. package/dist/components/ArticleContent/ArticleContent.esm.js.map +1 -1
  7. package/dist/components/Buttons/AddToCollectionButton.esm.js +3 -0
  8. package/dist/components/Buttons/AddToCollectionButton.esm.js.map +1 -1
  9. package/dist/components/Buttons/FavoriteButton.esm.js +2 -0
  10. package/dist/components/Buttons/FavoriteButton.esm.js.map +1 -1
  11. package/dist/components/Buttons/VoteButtons.esm.js +30 -5
  12. package/dist/components/Buttons/VoteButtons.esm.js.map +1 -1
  13. package/dist/components/CommentSection/CommentSection.esm.js +3 -0
  14. package/dist/components/CommentSection/CommentSection.esm.js.map +1 -1
  15. package/dist/components/FilterPanel/FilterPanel.esm.js +25 -1
  16. package/dist/components/FilterPanel/FilterPanel.esm.js.map +1 -1
  17. package/dist/components/PostForm/PostForm.esm.js +193 -61
  18. package/dist/components/PostForm/PostForm.esm.js.map +1 -1
  19. package/dist/components/PostsContainer/PostListItem.esm.js +6 -1
  20. package/dist/components/PostsContainer/PostListItem.esm.js.map +1 -1
  21. package/dist/components/PostsGrid/PostsGridItem.esm.js +20 -8
  22. package/dist/components/PostsGrid/PostsGridItem.esm.js.map +1 -1
  23. package/dist/components/QuestionCard/QuestionCard.esm.js +60 -32
  24. package/dist/components/QuestionCard/QuestionCard.esm.js.map +1 -1
  25. package/dist/components/SuggestionsCard/SuggestionsCard.esm.js +20 -1
  26. package/dist/components/SuggestionsCard/SuggestionsCard.esm.js.map +1 -1
  27. package/dist/components/TemplateList/TemplateList.esm.js +1 -0
  28. package/dist/components/TemplateList/TemplateList.esm.js.map +1 -1
  29. package/dist/components/Utility/DeletedBanner.esm.js +31 -0
  30. package/dist/components/Utility/DeletedBanner.esm.js.map +1 -0
  31. package/dist/components/Utility/DraftBanner.esm.js +31 -0
  32. package/dist/components/Utility/DraftBanner.esm.js.map +1 -0
  33. package/dist/components/Utility/StatusChip.esm.js +53 -0
  34. package/dist/components/Utility/StatusChip.esm.js.map +1 -0
  35. package/dist/hooks/usePaginatedPosts.esm.js +12 -1
  36. package/dist/hooks/usePaginatedPosts.esm.js.map +1 -1
  37. package/dist/index.d.ts +33 -4
  38. package/dist/index.esm.js +3 -0
  39. package/dist/index.esm.js.map +1 -1
  40. package/dist/translation.esm.js +22 -5
  41. package/dist/translation.esm.js.map +1 -1
  42. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"QuestionCard.esm.js","sources":["../../../src/components/QuestionCard/QuestionCard.tsx"],"sourcesContent":["import {\n AnswerResponse,\n PostResponse,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { useEffect, useState } from 'react';\nimport { VoteButtons } from '../Buttons/VoteButtons';\nimport { DeleteModal } from '../DeleteModal/DeleteModal';\nimport DeleteIcon from '@material-ui/icons/Delete';\nimport EditIcon from '@material-ui/icons/Edit';\nimport { FavoriteButton } from '../Buttons/FavoriteButton';\nimport { AuthorBox } from '../AuthorBox/AuthorBox';\nimport { TagsAndEntities } from '../TagsAndEntities/TagsAndEntities';\nimport { CommentSection } from '../CommentSection/CommentSection';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport { LinkButton } from '../Buttons/LinkButton';\nimport { MarkdownRenderer } from '../MarkdownRenderer/MarkdownRenderer';\nimport { editQuestionRouteRef } from '../../routes';\nimport { useNavigate } from 'react-router-dom';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../../translation.ts';\nimport { VoteButtonContainer } from '../Utility/VoteButtonContainer';\nimport {\n Box,\n Button,\n Card,\n CardContent,\n Grid,\n makeStyles,\n} from '@material-ui/core';\n\nexport type QuestionCardClassKeys =\n | 'root'\n | 'contentContainer'\n | 'markdownContainer'\n | 'buttons'\n | 'metadata';\n\nconst useStyles = makeStyles(\n theme => ({\n root: {},\n contentContainer: {\n marginLeft: '0.5em',\n width: 'calc(100% - 70px)',\n },\n markdownContainer: {\n minHeight: '6em',\n paddingBottom: '0.5em',\n },\n buttons: {\n marginTop: '1em',\n '& *:not(:last-child)': {\n marginRight: '0.3em',\n },\n },\n metadata: {\n marginTop: theme.spacing(3),\n },\n }),\n { name: 'QetaQuestionCard' },\n);\n\nexport const QuestionCard = (props: { question: PostResponse }) => {\n const { question } = props;\n const navigate = useNavigate();\n const editQuestionRoute = useRouteRef(editQuestionRouteRef);\n const [deleteModalOpen, setDeleteModalOpen] = useState(false);\n const [questionEntity, setQuestionEntity] = useState(question);\n const handleDeleteModalOpen = () => setDeleteModalOpen(true);\n const handleDeleteModalClose = () => setDeleteModalOpen(false);\n const { t } = useTranslationRef(qetaTranslationRef);\n const onCommentAction = (q: PostResponse, _?: AnswerResponse) => {\n setQuestionEntity(q);\n };\n const styles = useStyles();\n\n const highlightedAnswer = window.location.hash.slice(1) ?? undefined;\n useEffect(() => {\n if (highlightedAnswer) {\n try {\n const element = document.querySelector(`#${highlightedAnswer}`);\n if (element) {\n element.scrollIntoView();\n }\n } catch (e) {\n // NOOP\n }\n }\n }, [highlightedAnswer]);\n\n return (\n <>\n <Card variant=\"outlined\" className={styles.root}>\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={questionEntity} />\n <FavoriteButton entity={questionEntity} />\n <LinkButton entity={questionEntity} />\n </VoteButtonContainer>\n </Grid>\n <Grid\n item\n className={styles.contentContainer}\n style={{ flexGrow: '1' }}\n >\n <Grid item className={styles.markdownContainer}>\n <MarkdownRenderer content={questionEntity.content} />\n </Grid>\n <Box\n display=\"flex\"\n alignItems=\"flex-start\"\n justifyContent=\"space-between\"\n className={styles.metadata}\n style={{ width: '100%' }}\n >\n <Box flex=\"1 1 0%\" minWidth={0}>\n <TagsAndEntities entity={questionEntity} />\n {(question.canEdit || question.canDelete) && (\n <Box className={styles.buttons}>\n {question.canEdit && (\n <Button\n variant=\"outlined\"\n size=\"small\"\n startIcon={<EditIcon />}\n onClick={() =>\n navigate(\n editQuestionRoute({\n id: question.id.toString(10),\n }),\n )\n }\n className=\"qetaQuestionCardEditBtn\"\n >\n {t('questionPage.editButton')}\n </Button>\n )}\n {question.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={questionEntity}\n />\n </>\n )}\n </Box>\n )}\n </Box>\n <Box\n display=\"flex\"\n minWidth={230}\n style={{ gap: '8px' }}\n ml={1}\n >\n {questionEntity.updated && questionEntity.updatedBy && (\n <AuthorBox\n userEntityRef={questionEntity.updatedBy}\n time={questionEntity.updated}\n label={t('authorBox.updatedAtTime')}\n anonymous={questionEntity.anonymous}\n />\n )}\n <AuthorBox\n userEntityRef={questionEntity.author}\n time={questionEntity.created}\n label={t('authorBox.postedAtTime')}\n anonymous={questionEntity.anonymous}\n />\n </Box>\n </Box>\n </Grid>\n </Grid>\n </CardContent>\n </Card>\n <CommentSection post={questionEntity} onCommentAction={onCommentAction} />\n </>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"QuestionCard.esm.js","sources":["../../../src/components/QuestionCard/QuestionCard.tsx"],"sourcesContent":["import {\n AnswerResponse,\n PostResponse,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { useEffect, useState } from 'react';\nimport { VoteButtons } from '../Buttons/VoteButtons';\nimport { DeleteModal } from '../DeleteModal/DeleteModal';\nimport DeleteIcon from '@material-ui/icons/Delete';\nimport EditIcon from '@material-ui/icons/Edit';\nimport RestoreIcon from '@material-ui/icons/Restore';\nimport { FavoriteButton } from '../Buttons/FavoriteButton';\nimport { AuthorBox } from '../AuthorBox/AuthorBox';\nimport { TagsAndEntities } from '../TagsAndEntities/TagsAndEntities';\nimport { CommentSection } from '../CommentSection/CommentSection';\nimport { useApi, useRouteRef } from '@backstage/core-plugin-api';\nimport { LinkButton } from '../Buttons/LinkButton';\nimport { MarkdownRenderer } from '../MarkdownRenderer/MarkdownRenderer';\nimport { editQuestionRouteRef } from '../../routes';\nimport { useNavigate } from 'react-router-dom';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../../translation.ts';\nimport { VoteButtonContainer } from '../Utility/VoteButtonContainer';\nimport {\n Box,\n Button,\n Card,\n CardContent,\n Grid,\n makeStyles,\n} from '@material-ui/core';\nimport { useIsModerator } from '../../hooks';\nimport { qetaApiRef } from '../../api.ts';\n\nexport type QuestionCardClassKeys =\n | 'root'\n | 'contentContainer'\n | 'markdownContainer'\n | 'buttons'\n | 'metadata';\n\nconst useStyles = makeStyles(\n theme => ({\n root: {},\n contentContainer: {\n marginLeft: '0.5em',\n width: 'calc(100% - 70px)',\n },\n markdownContainer: {\n minHeight: '6em',\n paddingBottom: '0.5em',\n },\n buttons: {\n marginTop: '1em',\n '& *:not(:last-child)': {\n marginRight: '0.3em',\n },\n },\n metadata: {\n marginTop: theme.spacing(3),\n },\n }),\n { name: 'QetaQuestionCard' },\n);\n\nexport const QuestionCard = (props: { question: PostResponse }) => {\n const { question } = props;\n const navigate = useNavigate();\n const editQuestionRoute = useRouteRef(editQuestionRouteRef);\n const [deleteModalOpen, setDeleteModalOpen] = useState(false);\n const [questionEntity, setQuestionEntity] = useState(question);\n const qetaApi = useApi(qetaApiRef);\n const { isModerator } = useIsModerator();\n const handleDeleteModalOpen = () => setDeleteModalOpen(true);\n const handleDeleteModalClose = () => setDeleteModalOpen(false);\n const { t } = useTranslationRef(qetaTranslationRef);\n const onCommentAction = (q: PostResponse, _?: AnswerResponse) => {\n setQuestionEntity(q);\n };\n const styles = useStyles();\n\n const highlightedAnswer = window.location.hash.slice(1) ?? undefined;\n useEffect(() => {\n if (highlightedAnswer) {\n try {\n const element = document.querySelector(`#${highlightedAnswer}`);\n if (element) {\n element.scrollIntoView();\n }\n } catch (e) {\n // NOOP\n }\n }\n }, [highlightedAnswer]);\n\n const restoreQuestion = async () => {\n qetaApi.restorePost(question.id).then(q => {\n setQuestionEntity(q);\n });\n };\n\n return (\n <>\n <Card variant=\"outlined\" className={styles.root}>\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={questionEntity} />\n <FavoriteButton entity={questionEntity} />\n <LinkButton entity={questionEntity} />\n </VoteButtonContainer>\n </Grid>\n <Grid\n item\n className={styles.contentContainer}\n style={{ flexGrow: '1' }}\n >\n <Grid item className={styles.markdownContainer}>\n <MarkdownRenderer content={questionEntity.content} />\n </Grid>\n <Box\n display=\"flex\"\n alignItems=\"flex-start\"\n justifyContent=\"space-between\"\n className={styles.metadata}\n style={{ width: '100%' }}\n >\n <Box flex=\"1 1 0%\" minWidth={0}>\n <TagsAndEntities entity={questionEntity} />\n <Box className={styles.buttons}>\n {(question.canEdit || question.canDelete) && (\n <>\n {question.canEdit && (\n <Button\n variant=\"outlined\"\n size=\"small\"\n startIcon={<EditIcon />}\n onClick={() =>\n navigate(\n editQuestionRoute({\n id: question.id.toString(10),\n }),\n )\n }\n className=\"qetaQuestionCardEditBtn\"\n >\n {t('questionPage.editButton')}\n </Button>\n )}\n {question.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={questionEntity}\n />\n </>\n )}\n </>\n )}\n {isModerator && questionEntity.status === 'deleted' && (\n <Button\n variant=\"contained\"\n size=\"small\"\n startIcon={<RestoreIcon />}\n onClick={() => restoreQuestion()}\n className=\"qetaQuestionCardRestoreBtn\"\n >\n {t('questionPage.restoreButton')}\n </Button>\n )}\n </Box>\n </Box>\n <Box\n display=\"flex\"\n minWidth={230}\n style={{ gap: '8px' }}\n ml={1}\n >\n {questionEntity.updated && questionEntity.updatedBy && (\n <AuthorBox\n userEntityRef={questionEntity.updatedBy}\n time={questionEntity.updated}\n label={t('authorBox.updatedAtTime')}\n anonymous={questionEntity.anonymous}\n />\n )}\n <AuthorBox\n userEntityRef={questionEntity.author}\n time={questionEntity.created}\n label={t('authorBox.postedAtTime')}\n anonymous={questionEntity.anonymous}\n />\n </Box>\n </Box>\n </Grid>\n </Grid>\n </CardContent>\n </Card>\n <CommentSection post={questionEntity} onCommentAction={onCommentAction} />\n </>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -114,6 +114,24 @@ const NewQuestionSuggestionItem = (props) => {
114
114
  }
115
115
  );
116
116
  };
117
+ const DraftPostSuggestionItem = (props) => {
118
+ const { suggestion } = props;
119
+ const { t } = useTranslationRef(qetaTranslationRef);
120
+ const questionRoute = useRouteRef(questionRouteRef);
121
+ const articleRoute = useRouteRef(articleRouteRef);
122
+ const route = suggestion.post.type === "question" ? questionRoute : articleRoute;
123
+ return /* @__PURE__ */ jsx(
124
+ SuggestionListItem,
125
+ {
126
+ href: route({ id: suggestion.post.id.toString(10) }),
127
+ icon: /* @__PURE__ */ jsx(HelpOutlined, {}),
128
+ timestamp: /* @__PURE__ */ jsx(RelativeTimeWithTooltip, { value: suggestion.post.created }),
129
+ children: t("suggestionsCard.draftPost", {
130
+ title: suggestion.post.title
131
+ })
132
+ }
133
+ );
134
+ };
117
135
  const NewArticleSuggestionItem = (props) => {
118
136
  const { suggestion } = props;
119
137
  const { t } = useTranslationRef(qetaTranslationRef);
@@ -133,7 +151,8 @@ const NewArticleSuggestionItem = (props) => {
133
151
  const suggestionTypeMap = {
134
152
  noCorrectAnswer: NoCorrectAnswerSuggestionItem,
135
153
  newQuestion: NewQuestionSuggestionItem,
136
- newArticle: NewArticleSuggestionItem
154
+ newArticle: NewArticleSuggestionItem,
155
+ draftPost: DraftPostSuggestionItem
137
156
  };
138
157
  const SuggestionsCard = () => {
139
158
  const { t } = useTranslationRef(qetaTranslationRef);
@@ -1 +1 @@
1
- {"version":3,"file":"SuggestionsCard.esm.js","sources":["../../../src/components/SuggestionsCard/SuggestionsCard.tsx"],"sourcesContent":["import { useQetaApi } from '../../hooks';\nimport { ReactNode } from 'react';\nimport {\n NewArticleSuggestion,\n NewQuestionSuggestion,\n NoCorrectAnswerSuggestion,\n SuggestionsResponse,\n SuggestionType,\n} from '@drodil/backstage-plugin-qeta-common';\nimport AssistantIcon from '@material-ui/icons/Assistant';\nimport HelpOutlinedIcon from '@material-ui/icons/HelpOutlined';\nimport CheckIcon from '@material-ui/icons/Check';\nimport CollectionsBookmarkIcon from '@material-ui/icons/CollectionsBookmark';\nimport RefreshIcon from '@material-ui/icons/Refresh';\nimport { useNavigate } from 'react-router-dom';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport { articleRouteRef, questionRouteRef } from '../../routes';\nimport {\n Card,\n CardHeader,\n CircularProgress,\n Divider,\n IconButton,\n List,\n ListItem,\n ListItemIcon,\n ListItemText,\n makeStyles,\n Typography,\n} from '@material-ui/core';\nimport { qetaTranslationRef } from '../../translation.ts';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { RelativeTimeWithTooltip } from '../RelativeTimeWithTooltip';\n\nconst useStyles = makeStyles(theme => ({\n card: {\n height: '100%',\n },\n header: {\n paddingBottom: theme.spacing(1),\n },\n listItem: {\n '&:hover': {\n backgroundColor: theme.palette.action.hover,\n },\n transition: 'background-color 0.2s ease',\n paddingLeft: theme.spacing(2),\n paddingRight: theme.spacing(2),\n },\n listItemText: {\n marginTop: theme.spacing(0.5),\n paddingLeft: theme.spacing(2),\n },\n listItemIcon: {\n minWidth: theme.spacing(5),\n paddingLeft: theme.spacing(1),\n },\n timestamp: {\n color: theme.palette.text.secondary,\n },\n emptyState: {\n padding: theme.spacing(3),\n textAlign: 'center',\n color: theme.palette.text.secondary,\n },\n loadingContainer: {\n display: 'flex',\n justifyContent: 'center',\n padding: theme.spacing(3),\n },\n}));\n\nconst SuggestionListItem = (props: {\n children: ReactNode;\n href: string;\n icon?: ReactNode;\n timestamp?: ReactNode;\n}) => {\n const navigate = useNavigate();\n const classes = useStyles();\n return (\n <ListItem\n button\n onClick={() => navigate(props.href)}\n className={classes.listItem}\n >\n {props.icon && (\n <ListItemIcon className={classes.listItemIcon}>\n {props.icon}\n </ListItemIcon>\n )}\n <ListItemText\n primary={props.children}\n secondary={props.timestamp}\n className={classes.listItemText}\n />\n </ListItem>\n );\n};\n\nconst NoCorrectAnswerSuggestionItem = (props: {\n suggestion: NoCorrectAnswerSuggestion;\n}) => {\n const { suggestion } = props;\n const { t } = useTranslationRef(qetaTranslationRef);\n const questionRoute = useRouteRef(questionRouteRef);\n return (\n <SuggestionListItem\n href={questionRoute({ id: suggestion.question.id.toString(10) })}\n icon={<CheckIcon />}\n timestamp={\n <RelativeTimeWithTooltip value={suggestion.question.created} />\n }\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 } = useTranslationRef(qetaTranslationRef);\n const questionRoute = useRouteRef(questionRouteRef);\n return (\n <SuggestionListItem\n href={questionRoute({ id: suggestion.question.id.toString(10) })}\n icon={<HelpOutlinedIcon />}\n timestamp={\n <RelativeTimeWithTooltip value={suggestion.question.created} />\n }\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 } = useTranslationRef(qetaTranslationRef);\n const articleRoute = useRouteRef(articleRouteRef);\n return (\n <SuggestionListItem\n href={articleRoute({ id: suggestion.article.id.toString(10) })}\n icon={<CollectionsBookmarkIcon />}\n timestamp={<RelativeTimeWithTooltip value={suggestion.article.created} />}\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 } = useTranslationRef(qetaTranslationRef);\n const classes = useStyles();\n const {\n value: response,\n loading,\n retry,\n } = useQetaApi<SuggestionsResponse>(api => api.getSuggestions(), []);\n\n const suggestions = response?.suggestions ?? [];\n\n const handleRefresh = () => {\n retry();\n };\n\n const renderContent = () => {\n if (loading) {\n return (\n <div className={classes.loadingContainer}>\n <CircularProgress size={24} />\n </div>\n );\n }\n\n if (suggestions.length === 0) {\n return (\n <div className={classes.emptyState}>\n <Typography variant=\"body1\">\n {t('suggestionsCard.noSuggestions')}\n </Typography>\n </div>\n );\n }\n\n return (\n <List>\n {suggestions.map((suggestion, index) => {\n const SuggestionComponent = suggestionTypeMap[suggestion.type];\n return (\n <div key={suggestion.id}>\n <SuggestionComponent suggestion={suggestion} />\n {index < suggestions.length - 1 && <Divider />}\n </div>\n );\n })}\n </List>\n );\n };\n\n return (\n <Card className={classes.card}>\n <CardHeader\n className={classes.header}\n title={t('suggestionsCard.title')}\n avatar={<AssistantIcon />}\n titleTypographyProps={{ variant: 'h5' }}\n action={\n <IconButton onClick={handleRefresh} disabled={loading}>\n <RefreshIcon />\n </IconButton>\n }\n />\n <Divider />\n {renderContent()}\n </Card>\n );\n};\n"],"names":["CheckIcon","HelpOutlinedIcon"],"mappings":"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"}
1
+ {"version":3,"file":"SuggestionsCard.esm.js","sources":["../../../src/components/SuggestionsCard/SuggestionsCard.tsx"],"sourcesContent":["import { useQetaApi } from '../../hooks';\nimport { ReactNode } from 'react';\nimport {\n DraftPostSuggestion,\n NewArticleSuggestion,\n NewQuestionSuggestion,\n NoCorrectAnswerSuggestion,\n SuggestionsResponse,\n SuggestionType,\n} from '@drodil/backstage-plugin-qeta-common';\nimport AssistantIcon from '@material-ui/icons/Assistant';\nimport HelpOutlinedIcon from '@material-ui/icons/HelpOutlined';\nimport CheckIcon from '@material-ui/icons/Check';\nimport CollectionsBookmarkIcon from '@material-ui/icons/CollectionsBookmark';\nimport RefreshIcon from '@material-ui/icons/Refresh';\nimport { useNavigate } from 'react-router-dom';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport { articleRouteRef, questionRouteRef } from '../../routes';\nimport {\n Card,\n CardHeader,\n CircularProgress,\n Divider,\n IconButton,\n List,\n ListItem,\n ListItemIcon,\n ListItemText,\n makeStyles,\n Typography,\n} from '@material-ui/core';\nimport { qetaTranslationRef } from '../../translation.ts';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { RelativeTimeWithTooltip } from '../RelativeTimeWithTooltip';\n\nconst useStyles = makeStyles(theme => ({\n card: {\n height: '100%',\n },\n header: {\n paddingBottom: theme.spacing(1),\n },\n listItem: {\n '&:hover': {\n backgroundColor: theme.palette.action.hover,\n },\n transition: 'background-color 0.2s ease',\n paddingLeft: theme.spacing(2),\n paddingRight: theme.spacing(2),\n },\n listItemText: {\n marginTop: theme.spacing(0.5),\n paddingLeft: theme.spacing(2),\n },\n listItemIcon: {\n minWidth: theme.spacing(5),\n paddingLeft: theme.spacing(1),\n },\n timestamp: {\n color: theme.palette.text.secondary,\n },\n emptyState: {\n padding: theme.spacing(3),\n textAlign: 'center',\n color: theme.palette.text.secondary,\n },\n loadingContainer: {\n display: 'flex',\n justifyContent: 'center',\n padding: theme.spacing(3),\n },\n}));\n\nconst SuggestionListItem = (props: {\n children: ReactNode;\n href: string;\n icon?: ReactNode;\n timestamp?: ReactNode;\n}) => {\n const navigate = useNavigate();\n const classes = useStyles();\n return (\n <ListItem\n button\n onClick={() => navigate(props.href)}\n className={classes.listItem}\n >\n {props.icon && (\n <ListItemIcon className={classes.listItemIcon}>\n {props.icon}\n </ListItemIcon>\n )}\n <ListItemText\n primary={props.children}\n secondary={props.timestamp}\n className={classes.listItemText}\n />\n </ListItem>\n );\n};\n\nconst NoCorrectAnswerSuggestionItem = (props: {\n suggestion: NoCorrectAnswerSuggestion;\n}) => {\n const { suggestion } = props;\n const { t } = useTranslationRef(qetaTranslationRef);\n const questionRoute = useRouteRef(questionRouteRef);\n return (\n <SuggestionListItem\n href={questionRoute({ id: suggestion.question.id.toString(10) })}\n icon={<CheckIcon />}\n timestamp={\n <RelativeTimeWithTooltip value={suggestion.question.created} />\n }\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 } = useTranslationRef(qetaTranslationRef);\n const questionRoute = useRouteRef(questionRouteRef);\n return (\n <SuggestionListItem\n href={questionRoute({ id: suggestion.question.id.toString(10) })}\n icon={<HelpOutlinedIcon />}\n timestamp={\n <RelativeTimeWithTooltip value={suggestion.question.created} />\n }\n >\n {t('suggestionsCard.newQuestion', {\n title: suggestion.question.title,\n })}\n </SuggestionListItem>\n );\n};\n\nconst DraftPostSuggestionItem = (props: {\n suggestion: DraftPostSuggestion;\n}) => {\n const { suggestion } = props;\n const { t } = useTranslationRef(qetaTranslationRef);\n const questionRoute = useRouteRef(questionRouteRef);\n const articleRoute = useRouteRef(articleRouteRef);\n const route =\n suggestion.post.type === 'question' ? questionRoute : articleRoute;\n return (\n <SuggestionListItem\n href={route({ id: suggestion.post.id.toString(10) })}\n icon={<HelpOutlinedIcon />}\n timestamp={<RelativeTimeWithTooltip value={suggestion.post.created} />}\n >\n {t('suggestionsCard.draftPost', {\n title: suggestion.post.title,\n })}\n </SuggestionListItem>\n );\n};\n\nconst NewArticleSuggestionItem = (props: {\n suggestion: NewArticleSuggestion;\n}) => {\n const { suggestion } = props;\n const { t } = useTranslationRef(qetaTranslationRef);\n const articleRoute = useRouteRef(articleRouteRef);\n return (\n <SuggestionListItem\n href={articleRoute({ id: suggestion.article.id.toString(10) })}\n icon={<CollectionsBookmarkIcon />}\n timestamp={<RelativeTimeWithTooltip value={suggestion.article.created} />}\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 draftPost: DraftPostSuggestionItem,\n};\n\nexport const SuggestionsCard = () => {\n const { t } = useTranslationRef(qetaTranslationRef);\n const classes = useStyles();\n const {\n value: response,\n loading,\n retry,\n } = useQetaApi<SuggestionsResponse>(api => api.getSuggestions(), []);\n\n const suggestions = response?.suggestions ?? [];\n\n const handleRefresh = () => {\n retry();\n };\n\n const renderContent = () => {\n if (loading) {\n return (\n <div className={classes.loadingContainer}>\n <CircularProgress size={24} />\n </div>\n );\n }\n\n if (suggestions.length === 0) {\n return (\n <div className={classes.emptyState}>\n <Typography variant=\"body1\">\n {t('suggestionsCard.noSuggestions')}\n </Typography>\n </div>\n );\n }\n\n return (\n <List>\n {suggestions.map((suggestion, index) => {\n const SuggestionComponent = suggestionTypeMap[suggestion.type];\n return (\n <div key={suggestion.id}>\n <SuggestionComponent suggestion={suggestion} />\n {index < suggestions.length - 1 && <Divider />}\n </div>\n );\n })}\n </List>\n );\n };\n\n return (\n <Card className={classes.card}>\n <CardHeader\n className={classes.header}\n title={t('suggestionsCard.title')}\n avatar={<AssistantIcon />}\n titleTypographyProps={{ variant: 'h5' }}\n action={\n <IconButton onClick={handleRefresh} disabled={loading}>\n <RefreshIcon />\n </IconButton>\n }\n />\n <Divider />\n {renderContent()}\n </Card>\n );\n};\n"],"names":["CheckIcon","HelpOutlinedIcon"],"mappings":"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"}
@@ -60,6 +60,7 @@ const TemplateList = () => {
60
60
  TemplateForm,
61
61
  {
62
62
  onPost: () => {
63
+ retry();
63
64
  navigate("#template:list");
64
65
  },
65
66
  id
@@ -1 +1 @@
1
- {"version":3,"file":"TemplateList.esm.js","sources":["../../../src/components/TemplateList/TemplateList.tsx"],"sourcesContent":["import { useIsModerator, useQetaApi } from '../../hooks';\nimport { Progress, WarningPanel } from '@backstage/core-components';\nimport { useEffect, useState } from 'react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport EditIcon from '@material-ui/icons/Edit';\nimport { qetaApiRef } from '../../api';\nimport DeleteIcon from '@material-ui/icons/Delete';\nimport { TemplateForm } from './TemplateForm';\nimport { useNavigate } from 'react-router-dom';\nimport { useLocation } from 'react-use';\nimport {\n Box,\n Button,\n IconButton,\n List,\n ListItem,\n ListItemSecondaryAction,\n ListItemText,\n} from '@material-ui/core';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../../translation.ts';\n\nexport const TemplateList = () => {\n const { isModerator } = useIsModerator();\n\n const [mode, setMode] = useState<'list' | 'create' | 'edit'>('list');\n const [id, setId] = useState<number | undefined>(undefined);\n const qetaApi = useApi(qetaApiRef);\n const navigate = useNavigate();\n const { hash } = useLocation();\n const { value, loading, error, retry } = useQetaApi(api =>\n api.getTemplates(),\n );\n const { t } = useTranslationRef(qetaTranslationRef);\n\n useEffect(() => {\n const [, hashMode] = (hash ?? '').split(':');\n if (hashMode === 'new') {\n setMode('create');\n } else {\n const hashId = parseInt(hashMode, 10);\n if (!isNaN(hashId)) {\n setId(hashId);\n setMode('edit');\n } else {\n setMode('list');\n }\n }\n }, [hash]);\n\n if (!isModerator) {\n return null;\n }\n\n const onDelete = (templateId: number) => {\n qetaApi.deleteTemplate(templateId).then(() => retry());\n };\n\n if (loading) {\n return <Progress />;\n }\n\n if (error || value === undefined) {\n return (\n <WarningPanel severity=\"error\" title={t('templateList.errorLoading')}>\n {error?.message}\n </WarningPanel>\n );\n }\n\n if (mode === 'create' || mode === 'edit') {\n return (\n <TemplateForm\n onPost={() => {\n navigate('#template:list');\n }}\n id={id}\n />\n );\n }\n\n return (\n <>\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={() => {\n navigate('#template:new');\n }}\n >\n {t('templateList.createButton')}\n </Button>\n <Box\n sx={{ width: '100%', bgcolor: 'background.paper', marginTop: '1em' }}\n >\n <List style={{ width: '100%' }}>\n {value.total === 0 && (\n <ListItem>\n <ListItemText\n primary={t('templateList.noTemplates')}\n secondary={t('templateList.noTemplatesDescription')}\n />\n </ListItem>\n )}\n {value.templates.map((template, index) => (\n <ListItem key={index}>\n <ListItemText\n primary={template.title}\n secondary={template.description}\n />\n <ListItemSecondaryAction>\n <IconButton\n onClick={() => {\n navigate(`#template:${template.id}`);\n }}\n >\n <EditIcon />\n </IconButton>\n <IconButton onClick={() => onDelete(template.id)}>\n <DeleteIcon />\n </IconButton>\n </ListItemSecondaryAction>\n </ListItem>\n ))}\n </List>\n </Box>\n </>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TemplateList.esm.js","sources":["../../../src/components/TemplateList/TemplateList.tsx"],"sourcesContent":["import { useIsModerator, useQetaApi } from '../../hooks';\nimport { Progress, WarningPanel } from '@backstage/core-components';\nimport { useEffect, useState } from 'react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport EditIcon from '@material-ui/icons/Edit';\nimport { qetaApiRef } from '../../api';\nimport DeleteIcon from '@material-ui/icons/Delete';\nimport { TemplateForm } from './TemplateForm';\nimport { useNavigate } from 'react-router-dom';\nimport { useLocation } from 'react-use';\nimport {\n Box,\n Button,\n IconButton,\n List,\n ListItem,\n ListItemSecondaryAction,\n ListItemText,\n} from '@material-ui/core';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../../translation.ts';\n\nexport const TemplateList = () => {\n const { isModerator } = useIsModerator();\n\n const [mode, setMode] = useState<'list' | 'create' | 'edit'>('list');\n const [id, setId] = useState<number | undefined>(undefined);\n const qetaApi = useApi(qetaApiRef);\n const navigate = useNavigate();\n const { hash } = useLocation();\n const { value, loading, error, retry } = useQetaApi(api =>\n api.getTemplates(),\n );\n const { t } = useTranslationRef(qetaTranslationRef);\n\n useEffect(() => {\n const [, hashMode] = (hash ?? '').split(':');\n if (hashMode === 'new') {\n setMode('create');\n } else {\n const hashId = parseInt(hashMode, 10);\n if (!isNaN(hashId)) {\n setId(hashId);\n setMode('edit');\n } else {\n setMode('list');\n }\n }\n }, [hash]);\n\n if (!isModerator) {\n return null;\n }\n\n const onDelete = (templateId: number) => {\n qetaApi.deleteTemplate(templateId).then(() => retry());\n };\n\n if (loading) {\n return <Progress />;\n }\n\n if (error || value === undefined) {\n return (\n <WarningPanel severity=\"error\" title={t('templateList.errorLoading')}>\n {error?.message}\n </WarningPanel>\n );\n }\n\n if (mode === 'create' || mode === 'edit') {\n return (\n <TemplateForm\n onPost={() => {\n retry();\n navigate('#template:list');\n }}\n id={id}\n />\n );\n }\n\n return (\n <>\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={() => {\n navigate('#template:new');\n }}\n >\n {t('templateList.createButton')}\n </Button>\n <Box\n sx={{ width: '100%', bgcolor: 'background.paper', marginTop: '1em' }}\n >\n <List style={{ width: '100%' }}>\n {value.total === 0 && (\n <ListItem>\n <ListItemText\n primary={t('templateList.noTemplates')}\n secondary={t('templateList.noTemplatesDescription')}\n />\n </ListItem>\n )}\n {value.templates.map((template, index) => (\n <ListItem key={index}>\n <ListItemText\n primary={template.title}\n secondary={template.description}\n />\n <ListItemSecondaryAction>\n <IconButton\n onClick={() => {\n navigate(`#template:${template.id}`);\n }}\n >\n <EditIcon />\n </IconButton>\n <IconButton onClick={() => onDelete(template.id)}>\n <DeleteIcon />\n </IconButton>\n </ListItemSecondaryAction>\n </ListItem>\n ))}\n </List>\n </Box>\n </>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { makeStyles, Paper, Typography } from '@material-ui/core';
3
+ import DraftsIcon from '@material-ui/icons/Drafts';
4
+ import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
5
+ import { qetaTranslationRef } from '../../translation.esm.js';
6
+
7
+ const useStyles = makeStyles(
8
+ (theme) => ({
9
+ draftBanner: {
10
+ backgroundColor: theme.palette.error.light,
11
+ color: theme.palette.error.contrastText,
12
+ padding: "8px 16px",
13
+ marginBottom: "16px",
14
+ display: "flex",
15
+ alignItems: "center",
16
+ gap: "8px"
17
+ }
18
+ }),
19
+ { name: "QetaDraftBanner" }
20
+ );
21
+ const DeletedBanner = () => {
22
+ const styles = useStyles();
23
+ const { t } = useTranslationRef(qetaTranslationRef);
24
+ return /* @__PURE__ */ jsxs(Paper, { className: styles.draftBanner, elevation: 0, children: [
25
+ /* @__PURE__ */ jsx(DraftsIcon, { fontSize: "small" }),
26
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", children: t("questionPage.deletedStatus") })
27
+ ] });
28
+ };
29
+
30
+ export { DeletedBanner };
31
+ //# sourceMappingURL=DeletedBanner.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeletedBanner.esm.js","sources":["../../../src/components/Utility/DeletedBanner.tsx"],"sourcesContent":["import { makeStyles, Paper, Typography } from '@material-ui/core';\nimport DraftsIcon from '@material-ui/icons/Drafts';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../../translation.ts';\n\nconst useStyles = makeStyles(\n theme => ({\n draftBanner: {\n backgroundColor: theme.palette.error.light,\n color: theme.palette.error.contrastText,\n padding: '8px 16px',\n marginBottom: '16px',\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n },\n }),\n { name: 'QetaDraftBanner' },\n);\n\nexport const DeletedBanner = () => {\n const styles = useStyles();\n const { t } = useTranslationRef(qetaTranslationRef);\n\n return (\n <Paper className={styles.draftBanner} elevation={0}>\n <DraftsIcon fontSize=\"small\" />\n <Typography variant=\"body2\">{t('questionPage.deletedStatus')}</Typography>\n </Paper>\n );\n};\n"],"names":[],"mappings":";;;;;;AAKA,MAAM,SAAY,GAAA,UAAA;AAAA,EAChB,CAAU,KAAA,MAAA;AAAA,IACR,WAAa,EAAA;AAAA,MACX,eAAA,EAAiB,KAAM,CAAA,OAAA,CAAQ,KAAM,CAAA,KAAA;AAAA,MACrC,KAAA,EAAO,KAAM,CAAA,OAAA,CAAQ,KAAM,CAAA,YAAA;AAAA,MAC3B,OAAS,EAAA,UAAA;AAAA,MACT,YAAc,EAAA,MAAA;AAAA,MACd,OAAS,EAAA,MAAA;AAAA,MACT,UAAY,EAAA,QAAA;AAAA,MACZ,GAAK,EAAA;AAAA;AACP,GACF,CAAA;AAAA,EACA,EAAE,MAAM,iBAAkB;AAC5B,CAAA;AAEO,MAAM,gBAAgB,MAAM;AACjC,EAAA,MAAM,SAAS,SAAU,EAAA;AACzB,EAAA,MAAM,EAAE,CAAA,EAAM,GAAA,iBAAA,CAAkB,kBAAkB,CAAA;AAElD,EAAA,4BACG,KAAM,EAAA,EAAA,SAAA,EAAW,MAAO,CAAA,WAAA,EAAa,WAAW,CAC/C,EAAA,QAAA,EAAA;AAAA,oBAAC,GAAA,CAAA,UAAA,EAAA,EAAW,UAAS,OAAQ,EAAA,CAAA;AAAA,wBAC5B,UAAW,EAAA,EAAA,OAAA,EAAQ,OAAS,EAAA,QAAA,EAAA,CAAA,CAAE,4BAA4B,CAAE,EAAA;AAAA,GAC/D,EAAA,CAAA;AAEJ;;;;"}
@@ -0,0 +1,31 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { makeStyles, Paper, Typography } from '@material-ui/core';
3
+ import DraftsIcon from '@material-ui/icons/Drafts';
4
+ import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
5
+ import { qetaTranslationRef } from '../../translation.esm.js';
6
+
7
+ const useStyles = makeStyles(
8
+ (theme) => ({
9
+ draftBanner: {
10
+ backgroundColor: theme.palette.warning.light,
11
+ color: theme.palette.warning.contrastText,
12
+ padding: "8px 16px",
13
+ marginBottom: "16px",
14
+ display: "flex",
15
+ alignItems: "center",
16
+ gap: "8px"
17
+ }
18
+ }),
19
+ { name: "QetaDraftBanner" }
20
+ );
21
+ const DraftBanner = () => {
22
+ const styles = useStyles();
23
+ const { t } = useTranslationRef(qetaTranslationRef);
24
+ return /* @__PURE__ */ jsxs(Paper, { className: styles.draftBanner, elevation: 0, children: [
25
+ /* @__PURE__ */ jsx(DraftsIcon, { fontSize: "small" }),
26
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", children: t("questionPage.draftStatus") })
27
+ ] });
28
+ };
29
+
30
+ export { DraftBanner };
31
+ //# sourceMappingURL=DraftBanner.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DraftBanner.esm.js","sources":["../../../src/components/Utility/DraftBanner.tsx"],"sourcesContent":["import { makeStyles, Paper, Typography } from '@material-ui/core';\nimport DraftsIcon from '@material-ui/icons/Drafts';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../../translation.ts';\n\nconst useStyles = makeStyles(\n theme => ({\n draftBanner: {\n backgroundColor: theme.palette.warning.light,\n color: theme.palette.warning.contrastText,\n padding: '8px 16px',\n marginBottom: '16px',\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n },\n }),\n { name: 'QetaDraftBanner' },\n);\n\nexport const DraftBanner = () => {\n const styles = useStyles();\n const { t } = useTranslationRef(qetaTranslationRef);\n\n return (\n <Paper className={styles.draftBanner} elevation={0}>\n <DraftsIcon fontSize=\"small\" />\n <Typography variant=\"body2\">{t('questionPage.draftStatus')}</Typography>\n </Paper>\n );\n};\n"],"names":[],"mappings":";;;;;;AAKA,MAAM,SAAY,GAAA,UAAA;AAAA,EAChB,CAAU,KAAA,MAAA;AAAA,IACR,WAAa,EAAA;AAAA,MACX,eAAA,EAAiB,KAAM,CAAA,OAAA,CAAQ,OAAQ,CAAA,KAAA;AAAA,MACvC,KAAA,EAAO,KAAM,CAAA,OAAA,CAAQ,OAAQ,CAAA,YAAA;AAAA,MAC7B,OAAS,EAAA,UAAA;AAAA,MACT,YAAc,EAAA,MAAA;AAAA,MACd,OAAS,EAAA,MAAA;AAAA,MACT,UAAY,EAAA,QAAA;AAAA,MACZ,GAAK,EAAA;AAAA;AACP,GACF,CAAA;AAAA,EACA,EAAE,MAAM,iBAAkB;AAC5B,CAAA;AAEO,MAAM,cAAc,MAAM;AAC/B,EAAA,MAAM,SAAS,SAAU,EAAA;AACzB,EAAA,MAAM,EAAE,CAAA,EAAM,GAAA,iBAAA,CAAkB,kBAAkB,CAAA;AAElD,EAAA,4BACG,KAAM,EAAA,EAAA,SAAA,EAAW,MAAO,CAAA,WAAA,EAAa,WAAW,CAC/C,EAAA,QAAA,EAAA;AAAA,oBAAC,GAAA,CAAA,UAAA,EAAA,EAAW,UAAS,OAAQ,EAAA,CAAA;AAAA,wBAC5B,UAAW,EAAA,EAAA,OAAA,EAAQ,OAAS,EAAA,QAAA,EAAA,CAAA,CAAE,0BAA0B,CAAE,EAAA;AAAA,GAC7D,EAAA,CAAA;AAEJ;;;;"}
@@ -0,0 +1,53 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { makeStyles, Chip } from '@material-ui/core';
3
+ import DraftsIcon from '@material-ui/icons/Drafts';
4
+ import DeleteIcon from '@material-ui/icons/Delete';
5
+ import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
6
+ import { qetaTranslationRef } from '../../translation.esm.js';
7
+
8
+ const useStyles = makeStyles((theme) => ({
9
+ icon: {
10
+ color: theme.palette.warning.contrastText
11
+ },
12
+ statusChip: {
13
+ marginLeft: theme.spacing(1),
14
+ padding: "0.5rem 0.5rem",
15
+ flexShrink: 0,
16
+ backgroundColor: theme.palette.warning.light,
17
+ color: theme.palette.warning.contrastText,
18
+ "&.deleted": {
19
+ backgroundColor: theme.palette.error.light,
20
+ color: theme.palette.error.contrastText
21
+ }
22
+ }
23
+ }));
24
+ const StatusChip = ({ status, className }) => {
25
+ const styles = useStyles();
26
+ const { t } = useTranslationRef(qetaTranslationRef);
27
+ if (status === "draft") {
28
+ return /* @__PURE__ */ jsx(
29
+ Chip,
30
+ {
31
+ size: "small",
32
+ icon: /* @__PURE__ */ jsx(DraftsIcon, { className: styles.icon }),
33
+ label: t("common.draft"),
34
+ className: `${styles.statusChip} ${className || ""}`
35
+ }
36
+ );
37
+ }
38
+ if (status === "deleted") {
39
+ return /* @__PURE__ */ jsx(
40
+ Chip,
41
+ {
42
+ size: "small",
43
+ icon: /* @__PURE__ */ jsx(DeleteIcon, { className: styles.icon }),
44
+ label: t("common.deleted"),
45
+ className: `${styles.statusChip} deleted ${className || ""}`
46
+ }
47
+ );
48
+ }
49
+ return null;
50
+ };
51
+
52
+ export { StatusChip };
53
+ //# sourceMappingURL=StatusChip.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatusChip.esm.js","sources":["../../../src/components/Utility/StatusChip.tsx"],"sourcesContent":["import { Chip, makeStyles } from '@material-ui/core';\nimport DraftsIcon from '@material-ui/icons/Drafts';\nimport DeleteIcon from '@material-ui/icons/Delete';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../../translation.ts';\n\nconst useStyles = makeStyles(theme => ({\n icon: {\n color: theme.palette.warning.contrastText,\n },\n statusChip: {\n marginLeft: theme.spacing(1),\n padding: '0.5rem 0.5rem',\n flexShrink: 0,\n backgroundColor: theme.palette.warning.light,\n color: theme.palette.warning.contrastText,\n '&.deleted': {\n backgroundColor: theme.palette.error.light,\n color: theme.palette.error.contrastText,\n },\n },\n}));\n\ninterface StatusChipProps {\n status?: string;\n className?: string;\n}\n\nexport const StatusChip = ({ status, className }: StatusChipProps) => {\n const styles = useStyles();\n const { t } = useTranslationRef(qetaTranslationRef);\n\n if (status === 'draft') {\n return (\n <Chip\n size=\"small\"\n icon={<DraftsIcon className={styles.icon} />}\n label={t('common.draft')}\n className={`${styles.statusChip} ${className || ''}`}\n />\n );\n }\n if (status === 'deleted') {\n return (\n <Chip\n size=\"small\"\n icon={<DeleteIcon className={styles.icon} />}\n label={t('common.deleted')}\n className={`${styles.statusChip} deleted ${className || ''}`}\n />\n );\n }\n return null;\n};\n"],"names":[],"mappings":";;;;;;;AAMA,MAAM,SAAA,GAAY,WAAW,CAAU,KAAA,MAAA;AAAA,EACrC,IAAM,EAAA;AAAA,IACJ,KAAA,EAAO,KAAM,CAAA,OAAA,CAAQ,OAAQ,CAAA;AAAA,GAC/B;AAAA,EACA,UAAY,EAAA;AAAA,IACV,UAAA,EAAY,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,IAC3B,OAAS,EAAA,eAAA;AAAA,IACT,UAAY,EAAA,CAAA;AAAA,IACZ,eAAA,EAAiB,KAAM,CAAA,OAAA,CAAQ,OAAQ,CAAA,KAAA;AAAA,IACvC,KAAA,EAAO,KAAM,CAAA,OAAA,CAAQ,OAAQ,CAAA,YAAA;AAAA,IAC7B,WAAa,EAAA;AAAA,MACX,eAAA,EAAiB,KAAM,CAAA,OAAA,CAAQ,KAAM,CAAA,KAAA;AAAA,MACrC,KAAA,EAAO,KAAM,CAAA,OAAA,CAAQ,KAAM,CAAA;AAAA;AAC7B;AAEJ,CAAE,CAAA,CAAA;AAOK,MAAM,UAAa,GAAA,CAAC,EAAE,MAAA,EAAQ,WAAiC,KAAA;AACpE,EAAA,MAAM,SAAS,SAAU,EAAA;AACzB,EAAA,MAAM,EAAE,CAAA,EAAM,GAAA,iBAAA,CAAkB,kBAAkB,CAAA;AAElD,EAAA,IAAI,WAAW,OAAS,EAAA;AACtB,IACE,uBAAA,GAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,IAAK,EAAA,OAAA;AAAA,QACL,IAAM,kBAAA,GAAA,CAAC,UAAW,EAAA,EAAA,SAAA,EAAW,OAAO,IAAM,EAAA,CAAA;AAAA,QAC1C,KAAA,EAAO,EAAE,cAAc,CAAA;AAAA,QACvB,WAAW,CAAG,EAAA,MAAA,CAAO,UAAU,CAAA,CAAA,EAAI,aAAa,EAAE,CAAA;AAAA;AAAA,KACpD;AAAA;AAGJ,EAAA,IAAI,WAAW,SAAW,EAAA;AACxB,IACE,uBAAA,GAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,IAAK,EAAA,OAAA;AAAA,QACL,IAAM,kBAAA,GAAA,CAAC,UAAW,EAAA,EAAA,SAAA,EAAW,OAAO,IAAM,EAAA,CAAA;AAAA,QAC1C,KAAA,EAAO,EAAE,gBAAgB,CAAA;AAAA,QACzB,WAAW,CAAG,EAAA,MAAA,CAAO,UAAU,CAAA,SAAA,EAAY,aAAa,EAAE,CAAA;AAAA;AAAA,KAC5D;AAAA;AAGJ,EAAO,OAAA,IAAA;AACT;;;;"}
@@ -9,7 +9,16 @@ import { useQetaApi } from './useQetaApi.esm.js';
9
9
 
10
10
  const EXPANDED_LOCAL_STORAGE_KEY = "qeta-post-filters-expanded";
11
11
  function usePaginatedPosts(props) {
12
- const { type, tags, author, entities, entity, favorite, initialPageSize } = props;
12
+ const {
13
+ type,
14
+ tags,
15
+ author,
16
+ entities,
17
+ entity,
18
+ favorite,
19
+ initialPageSize,
20
+ status
21
+ } = props;
13
22
  const analytics = useAnalytics();
14
23
  const [page, setPage] = useState(1);
15
24
  const [pageCount, setPageCount] = useState(1);
@@ -30,6 +39,7 @@ function usePaginatedPosts(props) {
30
39
  tags,
31
40
  dateRange: "",
32
41
  collectionId: props.collectionId,
42
+ status,
33
43
  type
34
44
  });
35
45
  useEffect(() => {
@@ -150,6 +160,7 @@ function usePaginatedPosts(props) {
150
160
  includeExperts: false,
151
161
  author,
152
162
  favorite,
163
+ status,
153
164
  ...getFiltersWithDateRange(filters)
154
165
  });
155
166
  },
@@ -1 +1 @@
1
- {"version":3,"file":"usePaginatedPosts.esm.js","sources":["../../src/hooks/usePaginatedPosts.ts"],"sourcesContent":["import { useAnalytics } from '@backstage/core-plugin-api';\nimport { useEffect, useState } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport {\n FilterKey,\n filterKeys,\n PostFilters,\n} from '../components/FilterPanel/FilterPanel';\nimport useDebounce from 'react-use/lib/useDebounce';\nimport { getFiltersWithDateRange } from '../utils';\nimport { filterTags } from '@drodil/backstage-plugin-qeta-common';\nimport { useQetaApi } from './useQetaApi';\n\nexport type PaginatedPostsProps = PostFilters & {\n author?: string;\n showFilters?: boolean;\n showTitle?: boolean;\n title?: string;\n favorite?: boolean;\n showAskButton?: boolean;\n showWriteButton?: boolean;\n showNoQuestionsBtn?: boolean;\n initialPageSize?: number;\n collectionId?: number;\n};\n\nexport type PostFilterChange = {\n key: keyof PostFilters;\n value?: PostFilters[keyof PostFilters];\n};\n\nconst EXPANDED_LOCAL_STORAGE_KEY = 'qeta-post-filters-expanded';\n\nexport function usePaginatedPosts(props: PaginatedPostsProps) {\n const { type, tags, author, entities, entity, favorite, initialPageSize } =\n props;\n const analytics = useAnalytics();\n const [page, setPage] = useState(1);\n const [pageCount, setPageCount] = useState(1);\n const [postsPerPage, setPostsPerPage] = useState(initialPageSize ?? 10);\n const [showFilterPanel, setShowFilterPanel] = useState(\n localStorage.getItem(EXPANDED_LOCAL_STORAGE_KEY) === 'true',\n );\n const [searchParams, setSearchParams] = useSearchParams();\n const [searchQuery, setSearchQuery] = useState('');\n const [filters, setFilters] = useState<PostFilters>({\n order: props.order ?? 'desc',\n orderBy: props.orderBy ?? 'created',\n noAnswers: props.noAnswers ?? 'false',\n noCorrectAnswer: props.noCorrectAnswer ?? 'false',\n noVotes: props.noVotes ?? 'false',\n searchQuery: props.searchQuery ?? '',\n entities: entities ?? (entity ? [entity] : undefined),\n tags: tags,\n dateRange: '',\n collectionId: props.collectionId,\n type,\n });\n\n useEffect(() => {\n localStorage.setItem(\n EXPANDED_LOCAL_STORAGE_KEY,\n showFilterPanel ? 'true' : 'false',\n );\n }, [showFilterPanel]);\n\n const onPageChange = (value: number) => {\n setPage(value);\n setSearchParams(prev => {\n const newValue = prev;\n newValue.set('page', String(value));\n return newValue;\n });\n };\n\n const loadNextPage = () => {\n setPage(prev => prev + 1);\n };\n\n const onFilterChange = (changes: PostFilterChange | PostFilterChange[]) => {\n const changesArray = Array.isArray(changes) ? changes : [changes];\n setPage(1);\n setFilters(prev => {\n const newValue = { ...prev };\n for (const { key, value } of changesArray) {\n (newValue as any)[key] = value;\n }\n return newValue;\n });\n setSearchParams(prev => {\n const newValue = prev;\n for (const { key, value } of changesArray) {\n if (!filterKeys.includes(key as FilterKey)) {\n continue;\n }\n if (!value || value === 'false') {\n newValue.delete(key);\n } else if (Array.isArray(value)) {\n if (value.length === 0) {\n newValue.delete(key);\n } else {\n newValue.set(key, value.join(','));\n }\n } else if (typeof value === 'number') {\n newValue.set(key, String(value));\n } else if (value.length > 0) {\n newValue.set(key, value);\n } else {\n newValue.delete(key);\n }\n }\n return newValue;\n });\n };\n\n const onSearchQueryChange = (query: string) => {\n onPageChange(1);\n if (query) {\n analytics.captureEvent('qeta_search', query);\n }\n setSearchQuery(query);\n };\n\n useDebounce(\n () => {\n if (filters.searchQuery !== searchQuery) {\n setFilters({ ...filters, searchQuery: searchQuery });\n }\n },\n 400,\n [searchQuery],\n );\n\n useEffect(() => {\n let filtersApplied = false;\n searchParams.forEach((value, key) => {\n try {\n if (key === 'page') {\n const pv = Number.parseInt(value, 10);\n if (pv > 0) {\n setPage(pv);\n } else {\n setPage(1);\n }\n } else if (key === 'postsPerPage') {\n const qpp = Number.parseInt(value, 10);\n if (qpp > 0) setPostsPerPage(qpp);\n } else if (filterKeys.includes(key as FilterKey)) {\n filtersApplied = true;\n if (key === 'tags') {\n filters.tags = filterTags(value.split(',')) ?? [];\n } else if (key === 'entities') {\n filters.entities = value.split(',');\n } else {\n (filters as any)[key] = value;\n }\n }\n } catch (_e) {\n // NOOP\n }\n });\n setFilters(filters);\n if (filtersApplied) {\n setShowFilterPanel(true);\n }\n }, [searchParams, filters]);\n\n const {\n value: response,\n loading,\n error,\n retry,\n } = useQetaApi(\n api => {\n return api.getPosts({\n type,\n limit: postsPerPage,\n offset: (page - 1) * postsPerPage,\n includeEntities: true,\n includeAnswers: false,\n includeComments: false,\n includeAttachments: false,\n includeExperts: false,\n author,\n favorite,\n ...(getFiltersWithDateRange(filters) as any),\n });\n },\n [type, page, filters, postsPerPage],\n );\n\n useEffect(() => {\n if (response) {\n setPageCount(Math.ceil(response.total / postsPerPage));\n }\n }, [response, postsPerPage]);\n\n const onPageSizeChange = (value: number) => {\n if (response) {\n let newPage = page;\n while (newPage * value > response.total) {\n newPage -= 1;\n }\n onPageChange(Math.max(1, newPage));\n }\n setPostsPerPage(value);\n setSearchParams(prev => {\n const newValue = prev;\n newValue.set('postsPerPage', String(value));\n return newValue;\n });\n };\n\n return {\n page,\n setPage,\n postsPerPage,\n setPostsPerPage,\n showFilterPanel,\n setShowFilterPanel,\n searchParams,\n setSearchParams,\n searchQuery,\n setSearchQuery,\n filters,\n setFilters,\n onPageChange,\n onPageSizeChange,\n onFilterChange,\n onSearchQueryChange,\n response,\n loading,\n error,\n loadNextPage,\n pageCount,\n retry,\n };\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"usePaginatedPosts.esm.js","sources":["../../src/hooks/usePaginatedPosts.ts"],"sourcesContent":["import { useAnalytics } from '@backstage/core-plugin-api';\nimport { useEffect, useState } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport {\n FilterKey,\n filterKeys,\n PostFilters,\n} from '../components/FilterPanel/FilterPanel';\nimport useDebounce from 'react-use/lib/useDebounce';\nimport { getFiltersWithDateRange } from '../utils';\nimport { filterTags, PostStatus } from '@drodil/backstage-plugin-qeta-common';\nimport { useQetaApi } from './useQetaApi';\n\nexport type PaginatedPostsProps = PostFilters & {\n author?: string;\n showFilters?: boolean;\n showTitle?: boolean;\n title?: string;\n favorite?: boolean;\n showAskButton?: boolean;\n showWriteButton?: boolean;\n showNoQuestionsBtn?: boolean;\n initialPageSize?: number;\n collectionId?: number;\n status?: PostStatus;\n};\n\nexport type PostFilterChange = {\n key: keyof PostFilters;\n value?: PostFilters[keyof PostFilters];\n};\n\nconst EXPANDED_LOCAL_STORAGE_KEY = 'qeta-post-filters-expanded';\n\nexport function usePaginatedPosts(props: PaginatedPostsProps) {\n const {\n type,\n tags,\n author,\n entities,\n entity,\n favorite,\n initialPageSize,\n status,\n } = props;\n const analytics = useAnalytics();\n const [page, setPage] = useState(1);\n const [pageCount, setPageCount] = useState(1);\n const [postsPerPage, setPostsPerPage] = useState(initialPageSize ?? 10);\n const [showFilterPanel, setShowFilterPanel] = useState(\n localStorage.getItem(EXPANDED_LOCAL_STORAGE_KEY) === 'true',\n );\n const [searchParams, setSearchParams] = useSearchParams();\n const [searchQuery, setSearchQuery] = useState('');\n const [filters, setFilters] = useState<PostFilters>({\n order: props.order ?? 'desc',\n orderBy: props.orderBy ?? 'created',\n noAnswers: props.noAnswers ?? 'false',\n noCorrectAnswer: props.noCorrectAnswer ?? 'false',\n noVotes: props.noVotes ?? 'false',\n searchQuery: props.searchQuery ?? '',\n entities: entities ?? (entity ? [entity] : undefined),\n tags: tags,\n dateRange: '',\n collectionId: props.collectionId,\n status,\n type,\n });\n\n useEffect(() => {\n localStorage.setItem(\n EXPANDED_LOCAL_STORAGE_KEY,\n showFilterPanel ? 'true' : 'false',\n );\n }, [showFilterPanel]);\n\n const onPageChange = (value: number) => {\n setPage(value);\n setSearchParams(prev => {\n const newValue = prev;\n newValue.set('page', String(value));\n return newValue;\n });\n };\n\n const loadNextPage = () => {\n setPage(prev => prev + 1);\n };\n\n const onFilterChange = (changes: PostFilterChange | PostFilterChange[]) => {\n const changesArray = Array.isArray(changes) ? changes : [changes];\n setPage(1);\n setFilters(prev => {\n const newValue = { ...prev };\n for (const { key, value } of changesArray) {\n (newValue as any)[key] = value;\n }\n return newValue;\n });\n setSearchParams(prev => {\n const newValue = prev;\n for (const { key, value } of changesArray) {\n if (!filterKeys.includes(key as FilterKey)) {\n continue;\n }\n if (!value || value === 'false') {\n newValue.delete(key);\n } else if (Array.isArray(value)) {\n if (value.length === 0) {\n newValue.delete(key);\n } else {\n newValue.set(key, value.join(','));\n }\n } else if (typeof value === 'number') {\n newValue.set(key, String(value));\n } else if (value.length > 0) {\n newValue.set(key, value);\n } else {\n newValue.delete(key);\n }\n }\n return newValue;\n });\n };\n\n const onSearchQueryChange = (query: string) => {\n onPageChange(1);\n if (query) {\n analytics.captureEvent('qeta_search', query);\n }\n setSearchQuery(query);\n };\n\n useDebounce(\n () => {\n if (filters.searchQuery !== searchQuery) {\n setFilters({ ...filters, searchQuery: searchQuery });\n }\n },\n 400,\n [searchQuery],\n );\n\n useEffect(() => {\n let filtersApplied = false;\n searchParams.forEach((value, key) => {\n try {\n if (key === 'page') {\n const pv = Number.parseInt(value, 10);\n if (pv > 0) {\n setPage(pv);\n } else {\n setPage(1);\n }\n } else if (key === 'postsPerPage') {\n const qpp = Number.parseInt(value, 10);\n if (qpp > 0) setPostsPerPage(qpp);\n } else if (filterKeys.includes(key as FilterKey)) {\n filtersApplied = true;\n if (key === 'tags') {\n filters.tags = filterTags(value.split(',')) ?? [];\n } else if (key === 'entities') {\n filters.entities = value.split(',');\n } else {\n (filters as any)[key] = value;\n }\n }\n } catch (_e) {\n // NOOP\n }\n });\n setFilters(filters);\n if (filtersApplied) {\n setShowFilterPanel(true);\n }\n }, [searchParams, filters]);\n\n const {\n value: response,\n loading,\n error,\n retry,\n } = useQetaApi(\n api => {\n return api.getPosts({\n type,\n limit: postsPerPage,\n offset: (page - 1) * postsPerPage,\n includeEntities: true,\n includeAnswers: false,\n includeComments: false,\n includeAttachments: false,\n includeExperts: false,\n author,\n favorite,\n status,\n ...(getFiltersWithDateRange(filters) as any),\n });\n },\n [type, page, filters, postsPerPage],\n );\n\n useEffect(() => {\n if (response) {\n setPageCount(Math.ceil(response.total / postsPerPage));\n }\n }, [response, postsPerPage]);\n\n const onPageSizeChange = (value: number) => {\n if (response) {\n let newPage = page;\n while (newPage * value > response.total) {\n newPage -= 1;\n }\n onPageChange(Math.max(1, newPage));\n }\n setPostsPerPage(value);\n setSearchParams(prev => {\n const newValue = prev;\n newValue.set('postsPerPage', String(value));\n return newValue;\n });\n };\n\n return {\n page,\n setPage,\n postsPerPage,\n setPostsPerPage,\n showFilterPanel,\n setShowFilterPanel,\n searchParams,\n setSearchParams,\n searchQuery,\n setSearchQuery,\n filters,\n setFilters,\n onPageChange,\n onPageSizeChange,\n onFilterChange,\n onSearchQueryChange,\n response,\n loading,\n error,\n loadNextPage,\n pageCount,\n retry,\n };\n}\n"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as _backstage_core_plugin_api from '@backstage/core-plugin-api';
2
2
  import { IdentityApi } from '@backstage/core-plugin-api';
3
3
  import * as _drodil_backstage_plugin_qeta_common from '@drodil/backstage-plugin-qeta-common';
4
- import { QetaApi, PostType, PostResponse, Template, PostsResponse, AnswersResponse, AnswerResponse, Collection, PostsQuery, CollectionResponse, TagResponse, Post, Answer, Comment, Stat, StatisticsResponse, UserStat, GlobalStat, TemplatesResponse, Article, UserResponse, AIQuery } from '@drodil/backstage-plugin-qeta-common';
4
+ import { QetaApi, PostType, PostStatus, PostResponse, Template, PostsResponse, AnswersResponse, AnswerResponse, Collection, PostsQuery, CollectionResponse, TagResponse, Post, Answer, Comment, Stat, StatisticsResponse, UserStat, GlobalStat, TemplatesResponse, Article, UserResponse, AIQuery } from '@drodil/backstage-plugin-qeta-common';
5
5
  import * as react_jsx_runtime from 'react/jsx-runtime';
6
6
  import { Entity, UserEntity } from '@backstage/catalog-model';
7
7
  import { CSSProperties, ReactNode, KeyboardEvent, MouseEvent } from 'react';
@@ -48,6 +48,7 @@ interface QuestionFormValues extends TagAndEntitiesFormValues {
48
48
  type: PostType;
49
49
  images: number[];
50
50
  headerImage?: string;
51
+ status?: PostStatus;
51
52
  }
52
53
 
53
54
  type PostFormProps = {
@@ -72,6 +73,7 @@ type Filters = {
72
73
  tags?: string[];
73
74
  tagsRelation?: 'and' | 'or';
74
75
  dateRange?: string;
76
+ status?: PostStatus;
75
77
  };
76
78
  type PostFilters = Filters & {
77
79
  orderBy?: 'rank' | 'created' | 'title' | 'views' | 'score' | 'trend' | 'answersCount' | 'updated';
@@ -84,10 +86,11 @@ type PostFilters = Filters & {
84
86
  tags?: string[];
85
87
  tagsRelation?: 'and' | 'or';
86
88
  entitiesRelation?: 'and' | 'or';
89
+ status?: PostStatus;
87
90
  };
88
91
  type Change<T extends Filters> = {
89
92
  key: keyof T;
90
- value: string | string[];
93
+ value?: string | string[];
91
94
  };
92
95
  interface CommonFilterPanelProps {
93
96
  showEntityFilter?: boolean;
@@ -119,6 +122,7 @@ type PaginatedPostsProps = PostFilters & {
119
122
  showNoQuestionsBtn?: boolean;
120
123
  initialPageSize?: number;
121
124
  collectionId?: number;
125
+ status?: PostStatus;
122
126
  };
123
127
 
124
128
  declare const PostsContainer: (props: PaginatedPostsProps & {
@@ -401,6 +405,16 @@ declare const AIAnswerCard: (props: AIAnswerCardProps) => react_jsx_runtime.JSX.
401
405
 
402
406
  declare const SuggestionsCard: () => react_jsx_runtime.JSX.Element;
403
407
 
408
+ declare const DeletedBanner: () => react_jsx_runtime.JSX.Element;
409
+
410
+ declare const DraftBanner: () => react_jsx_runtime.JSX.Element;
411
+
412
+ interface StatusChipProps {
413
+ status?: string;
414
+ className?: string;
415
+ }
416
+ declare const StatusChip: ({ status, className }: StatusChipProps) => react_jsx_runtime.JSX.Element | null;
417
+
404
418
  declare function useQetaApi<T>(f: (api: QetaApi) => Promise<T>, deps?: any[]): {
405
419
  retry: () => void;
406
420
  loading: boolean;
@@ -527,6 +541,8 @@ declare const qetaTranslationRef: _backstage_core_plugin_api_alpha.TranslationRe
527
541
  readonly "common.post": "post";
528
542
  readonly "common.collection": "collection";
529
543
  readonly "common.question": "question";
544
+ readonly "common.draft": "Draft";
545
+ readonly "common.deleted": "Deleted";
530
546
  readonly "common.score": "{{score}} score";
531
547
  readonly "common.answers": "answers";
532
548
  readonly "common.experts": "Experts";
@@ -602,8 +618,11 @@ declare const qetaTranslationRef: _backstage_core_plugin_api_alpha.TranslationRe
602
618
  readonly "postForm.titleInput.placeholder": "e.g. How do I deploy a Backstage plugin?";
603
619
  readonly "postForm.titleInput.helperText": "Write good title for your {{type}} that people can understand";
604
620
  readonly "postForm.submit.existingPost": "Save";
605
- readonly "postForm.submit.newPost": "Post";
621
+ readonly "postForm.submit.publish": "Publish";
606
622
  readonly "postForm.successPosting": "Your {{type}} was posted successfully!";
623
+ readonly "postForm.savingDraft": "Saving draft...";
624
+ readonly "postForm.saveDraft": "Save as draft";
625
+ readonly "postForm.updateDraft": "Save draft";
607
626
  readonly "postForm.tips_question_1": "Describe your problem in detail.";
608
627
  readonly "postForm.tips_question_2": "Include what you have tried and what you expected to happen.";
609
628
  readonly "postForm.tips_question_3": "Share error messages, logs, or screenshots if possible.";
@@ -612,6 +631,9 @@ declare const qetaTranslationRef: _backstage_core_plugin_api_alpha.TranslationRe
612
631
  readonly "postForm.tips_article_2": "Organize your content with headings and lists.";
613
632
  readonly "postForm.tips_article_3": "Add images or diagrams to illustrate your points.";
614
633
  readonly "postForm.tips_article_4": "Cite sources or link to relevant documentation.";
634
+ readonly "postForm.autoSaveDraft": "Auto-save";
635
+ readonly "postForm.autoSaveDraftTooltip": "Automatically save your post every 3 seconds when changes are made";
636
+ readonly "postForm.autoSaveSuccess": "Saved automatically";
615
637
  readonly "postForm.contentInput.label": "Your {{type}}";
616
638
  readonly "postForm.contentInput.markdownHelp": "Markdown help";
617
639
  readonly "postForm.contentInput.placeholder_question": "Describe your problem in detail. What have you tried? What did you expect to happen?";
@@ -697,10 +719,12 @@ declare const qetaTranslationRef: _backstage_core_plugin_api_alpha.TranslationRe
697
719
  readonly "moderatorPage.templates": "Templates";
698
720
  readonly "moderatorPage.tools": "Tools";
699
721
  readonly "moderatorPage.templatesInfo": "Templates can be used to prefill question content for the user";
722
+ readonly "moderatorPage.deletedPosts": "Deleted posts";
700
723
  readonly "suggestionsCard.title": "Suggestions";
701
724
  readonly "suggestionsCard.noCorrectAnswer": "Your question \"{{title}}\" does not have a correct answer";
702
725
  readonly "suggestionsCard.newQuestion": "Do you have an answer for \"{{title}}\"?";
703
726
  readonly "suggestionsCard.newArticle": "You might like to read \"{{title}}\"";
727
+ readonly "suggestionsCard.draftPost": "Ready to finalize draft post \"{{title}}\"?";
704
728
  readonly "suggestionsCard.noSuggestions": "No suggestions";
705
729
  readonly "homePage.title": "Home";
706
730
  readonly "impactCard.title": "Your impact";
@@ -730,6 +754,7 @@ declare const qetaTranslationRef: _backstage_core_plugin_api_alpha.TranslationRe
730
754
  readonly "articlePage.deleteButton": "Delete this article";
731
755
  readonly "articlePage.notFound": "Could not find the article";
732
756
  readonly "articlePage.editButton": "Edit this article";
757
+ readonly "articlePage.restoreButton": "Restore this article";
733
758
  readonly "templateList.errorLoading": "Could not load templates";
734
759
  readonly "templateList.errorPosting": "Could not post template";
735
760
  readonly "templateList.titleInput.label": "Title";
@@ -760,6 +785,9 @@ declare const qetaTranslationRef: _backstage_core_plugin_api_alpha.TranslationRe
760
785
  readonly "questionPage.errorLoading": "Could not load question";
761
786
  readonly "questionPage.notFound": "Could not find the question";
762
787
  readonly "questionPage.editButton": "Edit";
788
+ readonly "questionPage.restoreButton": "Restore";
789
+ readonly "questionPage.draftStatus": "This is a draft post. Please edit and publish it to make it visible to others.";
790
+ readonly "questionPage.deletedStatus": "This post has been deleted. You can delete it permanently or restore it.";
763
791
  readonly "questionPage.sortAnswers.label": "Sort answers";
764
792
  readonly "questionPage.sortAnswers.default": "Default";
765
793
  readonly "questionPage.sortAnswers.menuLabel": "Sort answers menu";
@@ -798,6 +826,7 @@ declare const qetaTranslationRef: _backstage_core_plugin_api_alpha.TranslationRe
798
826
  readonly "filterPanel.noAnswers.label": "No answers";
799
827
  readonly "filterPanel.noVotes.label": "No votes";
800
828
  readonly "filterPanel.filterButton": "Filter";
829
+ readonly "filterPanel.drafts.label": "My drafts";
801
830
  readonly "filterPanel.noCorrectAnswers.label": "No correct answers";
802
831
  readonly "filterPanel.quickFilters.label": "Quick filters";
803
832
  readonly "filterPanel.starredEntities.label": "Starred entities";
@@ -956,4 +985,4 @@ type QetaOverrides = Overrides & {
956
985
  [Name in keyof QetaComponentsNameToClassKey]?: Partial<StyleRules<QetaComponentsNameToClassKey[Name]>>;
957
986
  };
958
987
 
959
- export { AIAnswerCard, AddToCollectionButton, AnswerCard, AnswerForm, AnswerList, AnswerListItem, AnswersContainer, ArticleContent, AskQuestionButton, AuthorLink, ButtonContainer, CollectionCard, CollectionFollowButton, CollectionForm, CollectionsGrid, CreateCollectionButton, DeleteModal, EntitiesGrid, EntityFollowButton, FilterPanel, FollowedCollectionsList, FollowedEntitiesList, FollowedTagsList, FollowedUsersList, ImpactCard, LeftMenu, LeftMenuButton, MarkdownRenderer, PostForm, PostHighlightList, PostList, PostListItem, PostsCard, PostsContainer, PostsGrid, PostsTable, type QetaOverrides, QuestionCard, QuestionsTable, RelativeTimeWithTooltip, SelectTemplateList, StatsChart, SuggestionsCard, SummaryStatsGrid, TagFollowButton, TagsGrid, TemplateList, TopRankingUsers, TrophyIcon, UpdatedByLink, UserFollowButton, UserLink, UsersGrid, ViewToggle, type ViewType, WriteArticleButton, articleRouteRef, articlesRouteRef, askRouteRef, collectionCreateRouteRef, collectionEditRouteRef, collectionRouteRef, collectionsRouteRef, editArticleRouteRef, editQuestionRouteRef, entitiesRouteRef, entityRouteRef, favoriteQuestionsRouteRef, moderatorRouteRef, qetaApiRef, qetaRouteRef, qetaTranslationRef, qetaTranslations, questionRouteRef, questionsRouteRef, statisticsRouteRef, tagRouteRef, tagsRouteRef, useAI, useCollectionsFollow, useEntityAuthor, useEntityFollow, useIdentityApi, useIsModerator, useQetaApi, useTagsFollow, useUserFollow, useUserInfo, userRouteRef, usersRouteRef, writeRouteRef };
988
+ export { AIAnswerCard, AddToCollectionButton, AnswerCard, AnswerForm, AnswerList, AnswerListItem, AnswersContainer, ArticleContent, AskQuestionButton, AuthorLink, ButtonContainer, CollectionCard, CollectionFollowButton, CollectionForm, CollectionsGrid, CreateCollectionButton, DeleteModal, DeletedBanner, DraftBanner, EntitiesGrid, EntityFollowButton, FilterPanel, FollowedCollectionsList, FollowedEntitiesList, FollowedTagsList, FollowedUsersList, ImpactCard, LeftMenu, LeftMenuButton, MarkdownRenderer, PostForm, PostHighlightList, PostList, PostListItem, PostsCard, PostsContainer, PostsGrid, PostsTable, type QetaOverrides, QuestionCard, QuestionsTable, RelativeTimeWithTooltip, SelectTemplateList, StatsChart, StatusChip, SuggestionsCard, SummaryStatsGrid, TagFollowButton, TagsGrid, TemplateList, TopRankingUsers, TrophyIcon, UpdatedByLink, UserFollowButton, UserLink, UsersGrid, ViewToggle, type ViewType, WriteArticleButton, articleRouteRef, articlesRouteRef, askRouteRef, collectionCreateRouteRef, collectionEditRouteRef, collectionRouteRef, collectionsRouteRef, editArticleRouteRef, editQuestionRouteRef, entitiesRouteRef, entityRouteRef, favoriteQuestionsRouteRef, moderatorRouteRef, qetaApiRef, qetaRouteRef, qetaTranslationRef, qetaTranslations, questionRouteRef, questionsRouteRef, statisticsRouteRef, tagRouteRef, tagsRouteRef, useAI, useCollectionsFollow, useEntityAuthor, useEntityFollow, useIdentityApi, useIsModerator, useQetaApi, useTagsFollow, useUserFollow, useUserInfo, userRouteRef, usersRouteRef, writeRouteRef };
package/dist/index.esm.js CHANGED
@@ -50,6 +50,9 @@ export { TemplateList } from './components/TemplateList/TemplateList.esm.js';
50
50
  export { SelectTemplateList } from './components/SelectTemplateList/SelectTemplateList.esm.js';
51
51
  export { AIAnswerCard } from './components/AIAnswerCard/AIAnswerCard.esm.js';
52
52
  export { SuggestionsCard } from './components/SuggestionsCard/SuggestionsCard.esm.js';
53
+ export { DeletedBanner } from './components/Utility/DeletedBanner.esm.js';
54
+ export { DraftBanner } from './components/Utility/DraftBanner.esm.js';
55
+ export { StatusChip } from './components/Utility/StatusChip.esm.js';
53
56
  export { ViewToggle } from './components/ViewToggle/ViewToggle.esm.js';
54
57
  export { useQetaApi } from './hooks/useQetaApi.esm.js';
55
58
  export { useTagsFollow } from './hooks/useTagsFollow.esm.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}