@drodil/backstage-plugin-qeta-react 3.15.3 → 3.16.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. package/dist/components/ArticleContent/ArticleButtons.esm.js +11 -2
  2. package/dist/components/ArticleContent/ArticleButtons.esm.js.map +1 -1
  3. package/dist/components/ArticleContent/ArticleContent.esm.js +2 -1
  4. package/dist/components/ArticleContent/ArticleContent.esm.js.map +1 -1
  5. package/dist/components/Buttons/LinkButton.esm.js +9 -3
  6. package/dist/components/Buttons/LinkButton.esm.js.map +1 -1
  7. package/dist/components/MarkdownEditor/MarkdownEditor.esm.js +42 -6
  8. package/dist/components/MarkdownEditor/MarkdownEditor.esm.js.map +1 -1
  9. package/dist/components/MarkdownRenderer/MarkdownRenderer.esm.js +160 -18
  10. package/dist/components/MarkdownRenderer/MarkdownRenderer.esm.js.map +1 -1
  11. package/dist/components/PostForm/PostForm.esm.js +20 -6
  12. package/dist/components/PostForm/PostForm.esm.js.map +1 -1
  13. package/dist/components/PostForm/TagInput.esm.js +3 -2
  14. package/dist/components/PostForm/TagInput.esm.js.map +1 -1
  15. package/dist/components/TagsAndEntities/TagChip.esm.js +15 -4
  16. package/dist/components/TagsAndEntities/TagChip.esm.js.map +1 -1
  17. package/dist/components/TemplateList/TemplateForm.esm.js +8 -1
  18. package/dist/components/TemplateList/TemplateForm.esm.js.map +1 -1
  19. package/dist/hooks/useEntityAuthor.esm.js +1 -1
  20. package/dist/hooks/useEntityAuthor.esm.js.map +1 -1
  21. package/dist/hooks/useVoting.esm.js +11 -8
  22. package/dist/hooks/useVoting.esm.js.map +1 -1
  23. package/dist/index.d.ts +22 -17
  24. package/dist/translation.esm.js +12 -5
  25. package/dist/translation.esm.js.map +1 -1
  26. package/package.json +7 -3
@@ -1 +1 @@
1
- {"version":3,"file":"MarkdownRenderer.esm.js","sources":["../../../src/components/MarkdownRenderer/MarkdownRenderer.tsx"],"sourcesContent":["import React, { PropsWithChildren } from 'react';\nimport SyntaxHighlighter from 'react-syntax-highlighter';\nimport ReactMarkdown from 'react-markdown';\nimport {\n a11yDark,\n a11yLight,\n} from 'react-syntax-highlighter/dist/esm/styles/hljs';\nimport { makeStyles } from '@material-ui/core';\nimport { findUserMentions } from '@drodil/backstage-plugin-qeta-common';\nimport gfm from 'remark-gfm';\nimport { EntityRefLink } from '@backstage/plugin-catalog-react';\nimport { useIsDarkTheme } from '../../hooks/useIsDarkTheme';\nimport { BackstageOverrides } from '@backstage/core-components';\n\nexport type QetaMarkdownContentClassKey = 'markdown';\n\nconst useStyles = makeStyles(\n theme => {\n const overrides = theme.overrides as BackstageOverrides;\n return {\n markdown: {\n '& p': {\n ...theme.typography?.body1,\n },\n '& h1': {\n ...theme.typography?.h1,\n marginBottom: 2,\n },\n '& h2': {\n ...theme.typography?.h2,\n marginBottom: 2,\n },\n '& h3': {\n ...theme.typography?.h3,\n marginBottom: 2,\n },\n '& h4': {\n ...theme.typography?.h4,\n marginBottom: 2,\n },\n '& h5': {\n ...theme.typography?.h5,\n marginBottom: 2,\n },\n '& h6': {\n ...theme.typography?.h6,\n marginBottom: 2,\n },\n '& table': {\n borderCollapse: 'collapse',\n border: `1px solid ${theme.palette.border}`,\n },\n '& th, & td': {\n border: `1px solid ${theme.palette.border}`,\n padding: theme.spacing(1),\n },\n '& td': {\n wordBreak: 'break-word',\n overflow: 'hidden',\n verticalAlign: 'middle',\n lineHeight: '1',\n margin: 0,\n padding: theme.spacing(3, 2, 3, 2.5),\n borderBottom: 0,\n },\n '& th': {\n backgroundColor: theme.palette.background.paper,\n },\n '& tr': {\n backgroundColor: theme.palette.background.paper,\n },\n '& tr:nth-child(odd)': {\n backgroundColor: theme.palette.background.default,\n },\n '& a': {\n color: theme.palette.link,\n },\n '& img': {\n maxWidth: '100%',\n },\n '& code': {\n fontFamily: 'Courier New,Courier,monospace',\n fontStyle: 'normal',\n },\n '& em': {\n fontStyle: 'italic !important',\n },\n '& ol': {\n listStyle: 'decimal',\n },\n '& ul': {\n listStyle: 'disc',\n },\n '& blockquote': {\n backgroundColor: theme.palette.background.paper,\n border: `1px solid ${theme.palette.divider}`,\n padding: '1em',\n },\n '& ol, ul': {\n marginLeft: '1em',\n marginTop: '1em',\n marginBottom: '1em',\n },\n '& li': {\n marginTop: '0.5em',\n },\n '& *:first-child': {\n marginTop: 0,\n },\n '& *:last-child': {\n marginBottom: 0,\n },\n ...(overrides?.BackstageMarkdownContent\n ? overrides.BackstageMarkdownContent\n : {}),\n },\n };\n },\n { name: 'QetaMarkdownContent' },\n);\n\nconst flatten = (text: string, child: any): string => {\n if (!child) return text;\n\n return typeof child === 'string'\n ? text + child\n : React.Children.toArray(child.props.children).reduce(flatten, text);\n};\n\nconst headingRenderer = (\n props: PropsWithChildren<{ node: { tagName: string } }>,\n) => {\n const { node, children } = props;\n const childrenArray = React.Children.toArray(children);\n const text = childrenArray.reduce(flatten, '');\n const slug = text.toLocaleLowerCase('en-US').replace(/\\W/g, '-');\n return React.createElement(`${node.tagName}`, { id: slug }, children);\n};\n\nexport const MarkdownRenderer = (props: {\n content: string;\n className?: string;\n}) => {\n const { content, className: mainClassName } = props;\n const darkTheme = useIsDarkTheme();\n const classes = useStyles();\n return (\n <ReactMarkdown\n remarkPlugins={[gfm]}\n className={`${classes.markdown} ${mainClassName ?? ''}`.trim()}\n components={{\n h1: (p: any) => headingRenderer(p),\n h2: (p: any) => headingRenderer(p),\n h3: (p: any) => headingRenderer(p),\n h4: (p: any) => headingRenderer(p),\n h5: (p: any) => headingRenderer(p),\n h6: (p: any) => headingRenderer(p),\n p: (p: any) => {\n const { children } = p;\n const arr = React.Children.toArray(children);\n const formatted = arr.map((child: any) => {\n if (typeof child !== 'string') {\n return child;\n }\n const mentions = findUserMentions(child);\n if (mentions.length === 0) {\n return child;\n }\n\n return child.split(' ').map((word: string) => {\n const mention = mentions.find(m => word.includes(m));\n if (mention) {\n return (\n <>\n <EntityRefLink entityRef={mention.slice(1)} hideIcon />{' '}\n </>\n );\n }\n return <>{word} </>;\n });\n });\n\n return <p>{formatted}</p>;\n },\n code(p: any) {\n const { children, className, node, ...rest } = p;\n const match = /language-(\\w+)/.exec(className || '');\n return match ? (\n <SyntaxHighlighter\n {...rest}\n PreTag=\"div\"\n language={match[1]}\n style={darkTheme ? a11yDark : a11yLight}\n showLineNumbers\n >\n {String(children).replace(/\\n$/, '')}\n </SyntaxHighlighter>\n ) : (\n <code {...rest} className={className}>\n {children}\n </code>\n );\n },\n }}\n >\n {content}\n </ReactMarkdown>\n );\n};\n"],"names":["React"],"mappings":"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"}
1
+ {"version":3,"file":"MarkdownRenderer.esm.js","sources":["../../../src/components/MarkdownRenderer/MarkdownRenderer.tsx"],"sourcesContent":["import React, { PropsWithChildren, useEffect } from 'react';\nimport SyntaxHighlighter from 'react-syntax-highlighter';\nimport ReactMarkdown from 'react-markdown';\nimport {\n a11yDark,\n a11yLight,\n} from 'react-syntax-highlighter/dist/esm/styles/hljs';\nimport { IconButton, makeStyles, Tooltip, Typography } from '@material-ui/core';\nimport {\n findTagMentions,\n findUserMentions,\n} from '@drodil/backstage-plugin-qeta-common';\nimport gfm from 'remark-gfm';\nimport rehypeSlug from 'rehype-slug';\nimport rehypeToc, { HeadingNode, TextNode } from '@jsdevtools/rehype-toc';\nimport { EntityRefLink } from '@backstage/plugin-catalog-react';\nimport { useIsDarkTheme } from '../../hooks/useIsDarkTheme';\nimport { BackstageOverrides } from '@backstage/core-components';\nimport LinkIcon from '@material-ui/icons/Link';\nimport { alertApiRef, useApi } from '@backstage/core-plugin-api';\nimport { useTranslation } from '../../hooks';\nimport { Variant } from '@material-ui/core/styles/createTypography';\nimport GithubSlugger from 'github-slugger';\nimport { HtmlElementNode } from '@jsdevtools/rehype-toc/lib/types';\nimport { find } from 'unist-util-find';\nimport { TagChip } from '../TagsAndEntities/TagChip';\n\nconst slugger = new GithubSlugger();\n\nexport type QetaMarkdownContentClassKey =\n | 'markdown'\n | 'header'\n | 'tocHeader'\n | 'toc'\n | 'tocList'\n | 'tocListItem'\n | 'tocLink';\n\nconst useStyles = makeStyles(\n theme => {\n const overrides = theme.overrides as BackstageOverrides;\n return {\n markdown: {\n '& p': {\n ...theme.typography?.body1,\n },\n '& h1': {\n ...theme.typography?.h1,\n marginBottom: 2,\n },\n '& h2': {\n ...theme.typography?.h2,\n marginBottom: 2,\n },\n '& h3': {\n ...theme.typography?.h3,\n marginBottom: 2,\n },\n '& h4': {\n ...theme.typography?.h4,\n marginBottom: 2,\n },\n '& h5': {\n ...theme.typography?.h5,\n marginBottom: 2,\n },\n '& h6': {\n ...theme.typography?.h6,\n marginBottom: 2,\n },\n '& table': {\n borderCollapse: 'collapse',\n border: `1px solid ${theme.palette.border}`,\n },\n '& th, & td': {\n border: `1px solid ${theme.palette.border}`,\n padding: theme.spacing(1),\n },\n '& td': {\n wordBreak: 'break-word',\n overflow: 'hidden',\n verticalAlign: 'middle',\n lineHeight: '1',\n margin: 0,\n padding: theme.spacing(3, 2, 3, 2.5),\n borderBottom: 0,\n },\n '& th': {\n backgroundColor: theme.palette.background.paper,\n },\n '& tr': {\n backgroundColor: theme.palette.background.paper,\n },\n '& tr:nth-child(odd)': {\n backgroundColor: theme.palette.background.default,\n },\n '& a': {\n color: theme.palette.link,\n },\n '& img': {\n maxWidth: '100%',\n },\n '& code': {\n fontFamily: 'Courier New,Courier,monospace',\n fontStyle: 'normal',\n },\n '& em': {\n fontStyle: 'italic !important',\n },\n '& ol': {\n listStyle: 'decimal',\n },\n '& ul': {\n listStyle: 'disc',\n },\n '& blockquote': {\n backgroundColor: theme.palette.background.paper,\n border: `1px solid ${theme.palette.divider}`,\n padding: '1em',\n },\n '& ol, ul': {\n marginLeft: '1em',\n marginTop: '1em',\n marginBottom: '1em',\n },\n '& li': {\n marginTop: '0.5em',\n },\n '& *:first-child': {\n marginTop: 0,\n },\n '& *:last-child': {\n marginBottom: 0,\n },\n ...(overrides?.BackstageMarkdownContent\n ? overrides.BackstageMarkdownContent\n : {}),\n },\n header: {\n '& .anchor-link': {\n display: 'none',\n marginLeft: '0.5em',\n },\n '&:hover .anchor-link': {\n display: 'inline-block',\n },\n },\n tocHeader: {\n marginTop: '0.5em',\n marginBottom: 0,\n },\n toc: {\n marginTop: '0.5em',\n marginLeft: '0.2em',\n paddingBottom: '1em',\n borderBottom: `1px solid ${theme.palette.divider}`,\n },\n tocList: {\n marginLeft: '0 !important',\n marginTop: '0.5em !important',\n paddingInlineStart: '1em',\n counterReset: 'item',\n },\n tocListItem: {\n display: 'block',\n '&:before': {\n content: 'counters(item, \".\") \" \"',\n counterIncrement: 'item',\n },\n },\n tocLink: {\n color: theme.palette.link,\n },\n };\n },\n { name: 'QetaMarkdownContent' },\n);\n\nconst flatten = (text: string, child: any): string => {\n if (!child) return text;\n\n return typeof child === 'string'\n ? text + child\n : React.Children.toArray(child.props.children).reduce(flatten, text);\n};\n\nexport const MarkdownRenderer = (props: {\n content: string;\n className?: string;\n showToc?: boolean;\n useBlankLinks?: boolean;\n}) => {\n const { content, className: mainClassName, showToc, useBlankLinks } = props;\n const darkTheme = useIsDarkTheme();\n const { t } = useTranslation();\n const classes = useStyles();\n const alertApi = useApi(alertApiRef);\n slugger.reset();\n\n const copyToClipboard = (slug: string) => {\n const url = new URL(window.location.href);\n url.hash = `#${slug}`;\n window.navigator.clipboard.writeText(url.toString());\n alertApi.post({\n message: t('link.copied'),\n severity: 'info',\n display: 'transient',\n });\n };\n\n const headingRenderer = (\n hProps: PropsWithChildren<{ node: { tagName: string } }>,\n ) => {\n const { node, children } = hProps;\n const childrenArray = React.Children.toArray(children);\n const text = childrenArray.reduce(flatten, '');\n const slug = slugger.slug(text);\n const link = (\n <Tooltip title={t('link.aria')}>\n <IconButton\n aria-label={t('link.aria')}\n onClick={() => copyToClipboard(slug)}\n size=\"small\"\n className=\"anchor-link\"\n >\n <LinkIcon />\n </IconButton>\n </Tooltip>\n );\n return (\n <>\n {React.createElement(\n Typography,\n {\n variant: node.tagName as Variant,\n id: slug,\n className: classes.header,\n },\n [children, link],\n )}\n </>\n );\n };\n\n useEffect(() => {\n if (!window.location.hash) {\n return;\n }\n\n const id = window.location.hash.slice(1);\n const element = document.getElementById(id);\n if (element) {\n element.scrollIntoView({ behavior: 'auto', block: 'start' });\n }\n }, []);\n\n const rehypePlugins: import('unified').PluggableList = [[rehypeSlug]];\n if (showToc) {\n rehypePlugins.push([\n rehypeToc,\n {\n cssClasses: {\n toc: classes.toc,\n list: classes.tocList,\n listItem: classes.tocListItem,\n link: classes.tocLink,\n },\n customizeTOC: (toc: HtmlElementNode) => {\n const listItems = find(toc, { tagName: 'li' });\n if (!toc.children || !listItems) {\n return false;\n }\n const tocHeader: TextNode = {\n type: 'text',\n value: t('markdown.toc'),\n };\n const heading: HeadingNode = {\n type: 'element',\n tagName: 'h3',\n properties: {},\n children: [tocHeader],\n };\n\n toc.children.unshift(heading);\n return toc;\n },\n },\n ]);\n }\n\n return (\n <>\n <ReactMarkdown\n remarkPlugins={[gfm]}\n rehypePlugins={rehypePlugins}\n className={`${classes.markdown} ${mainClassName ?? ''}`.trim()}\n components={{\n h1: (p: any) => headingRenderer(p),\n h2: (p: any) => headingRenderer(p),\n h3: (p: any) => headingRenderer(p),\n h4: (p: any) => headingRenderer(p),\n h5: (p: any) => headingRenderer(p),\n h6: (p: any) => headingRenderer(p),\n p: (p: any) => {\n const { children } = p;\n const arr = React.Children.toArray(children);\n const formatted = arr.map((child: any) => {\n if (typeof child !== 'string') {\n return child;\n }\n const userMentions = findUserMentions(child);\n const tagMentions = findTagMentions(child);\n if (userMentions.length === 0 && tagMentions.length === 0) {\n return child;\n }\n\n return child.split(' ').map((word: string) => {\n const userMention = userMentions.find(m => word === m);\n if (userMention) {\n return (\n <>\n <EntityRefLink\n entityRef={userMention.slice(1)}\n hideIcon\n target={useBlankLinks ? '_blank' : undefined}\n />{' '}\n </>\n );\n }\n\n const tagMention = tagMentions.find(m => word === m);\n if (tagMention) {\n return (\n <>\n <TagChip\n tag={tagMention.slice(1)}\n style={{ marginBottom: 0 }}\n useHref={useBlankLinks}\n />\n </>\n );\n }\n\n return <>{word} </>;\n });\n });\n\n return <p>{formatted}</p>;\n },\n code(p: any) {\n const { children, className, node, ...rest } = p;\n const match = /language-(\\w+)/.exec(className || '');\n return match ? (\n <SyntaxHighlighter\n {...rest}\n PreTag=\"div\"\n language={match[1]}\n style={darkTheme ? a11yDark : a11yLight}\n showLineNumbers\n >\n {String(children).replace(/\\n$/, '')}\n </SyntaxHighlighter>\n ) : (\n <code {...rest} className={className}>\n {children}\n </code>\n );\n },\n }}\n >\n {content}\n </ReactMarkdown>\n </>\n );\n};\n"],"names":["React"],"mappings":"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"}
@@ -94,6 +94,8 @@ const PostForm = (props) => {
94
94
  handleSubmit,
95
95
  control,
96
96
  reset,
97
+ getValues: getFormValues,
98
+ setValue,
97
99
  formState: { errors }
98
100
  } = useForm({
99
101
  values,
@@ -219,12 +221,19 @@ const PostForm = (props) => {
219
221
  },
220
222
  error && /* @__PURE__ */ React__default.createElement(Alert, { severity: "error" }, t("postForm.errorPosting", { type })),
221
223
  type === "article" && /* @__PURE__ */ React__default.createElement(
222
- HeaderImageInput,
224
+ Controller,
223
225
  {
224
- onChange: (url) => setValues((v) => ({ ...v, headerImage: url })),
225
- onImageUpload,
226
- url: values.headerImage,
227
- postId: id ? Number(id) : void 0
226
+ control,
227
+ render: ({ field: { onChange, value } }) => /* @__PURE__ */ React__default.createElement(
228
+ HeaderImageInput,
229
+ {
230
+ onChange,
231
+ onImageUpload,
232
+ url: value,
233
+ postId: id ? Number(id) : void 0
234
+ }
235
+ ),
236
+ name: "headerImage"
228
237
  }
229
238
  ),
230
239
  /* @__PURE__ */ React__default.createElement(
@@ -259,7 +268,12 @@ const PostForm = (props) => {
259
268
  placeholder: t("postForm.contentInput.placeholder", { type }),
260
269
  config: configApi,
261
270
  onImageUpload,
262
- postId: id ? Number(id) : void 0
271
+ postId: id ? Number(id) : void 0,
272
+ onTagsChange: (tags) => {
273
+ const existing = getFormValues("tags") ?? [];
274
+ const newTags = [.../* @__PURE__ */ new Set([...existing, ...tags])];
275
+ setValue("tags", newTags, { shouldValidate: true });
276
+ }
263
277
  }
264
278
  ),
265
279
  name: "content"
@@ -1 +1 @@
1
- {"version":3,"file":"PostForm.esm.js","sources":["../../../src/components/PostForm/PostForm.tsx"],"sourcesContent":["import {\n configApiRef,\n useAnalytics,\n useApi,\n useRouteRef,\n} from '@backstage/core-plugin-api';\nimport { Button, TextField } from '@material-ui/core';\nimport { Alert } from '@material-ui/lab';\nimport React, { useCallback, useEffect } from 'react';\nimport { Controller, useForm } from 'react-hook-form';\nimport { useNavigate, useSearchParams } from 'react-router-dom';\nimport {\n PostRequest,\n PostResponse,\n PostType,\n QetaApi,\n Template,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { MarkdownEditor } from '../MarkdownEditor/MarkdownEditor';\nimport { catalogApiRef } from '@backstage/plugin-catalog-react';\nimport { stringifyEntityRef } from '@backstage/catalog-model';\nimport { CatalogApi } from '@backstage/catalog-client';\nimport { compact } from 'lodash';\nimport { TagInput } from './TagInput';\nimport { QuestionFormValues } from './types';\nimport { EntitiesInput } from './EntitiesInput';\nimport { articleRouteRef, questionRouteRef } from '../../routes';\nimport { PostAnonymouslyCheckbox } from '../PostAnonymouslyCheckbox/PostAnonymouslyCheckbox';\nimport { confirmNavigationIfEdited } from '../../utils/utils';\nimport { qetaApiRef } from '../../api';\nimport { HeaderImageInput } from '../HeaderImageInput/HeaderImageInput';\nimport { useTranslation } from '../../hooks';\n\nconst formToRequest = (\n form: QuestionFormValues,\n images: number[],\n): PostRequest => {\n return {\n ...form,\n entities: form.entities?.map(stringifyEntityRef),\n images: images,\n };\n};\n\nexport type PostFormProps = {\n type: PostType;\n id?: string;\n entity?: string;\n tags?: string[];\n onPost?: (question: PostResponse) => void;\n entityPage?: boolean;\n template?: Template | null;\n onFormChange?: (data: QuestionFormValues) => void;\n};\n\nconst getDefaultValues = (props: PostFormProps): QuestionFormValues => {\n if (props.template) {\n return {\n title: props.template.questionTitle ?? '',\n content: props.template.questionContent ?? '',\n tags: props.template.tags ?? [],\n entities: [],\n type: props.type,\n images: [],\n };\n }\n\n return {\n title: '',\n content: '',\n tags: props.tags ?? [],\n entities: [],\n type: props.type,\n images: [],\n };\n};\n\nconst getValues = async (\n api: QetaApi,\n catalogApi: CatalogApi,\n type: PostType,\n id?: string,\n): Promise<QuestionFormValues> => {\n if (!id) {\n return getDefaultValues({ type });\n }\n\n const post = await api.getPost(id);\n const entities =\n post.entities && post.entities.length > 0\n ? await catalogApi.getEntitiesByRefs({\n entityRefs: post.entities,\n fields: [\n 'kind',\n 'metadata.name',\n 'metadata.namespace',\n 'metadata.title',\n ],\n })\n : [];\n return {\n title: post.title,\n content: post.content,\n tags: post.tags ?? [],\n entities: 'items' in entities ? compact(entities.items) : [],\n type,\n headerImage: post.headerImage,\n images: post.images,\n };\n};\n\nexport const PostForm = (props: PostFormProps) => {\n const { id, entity, onPost, entityPage, type, template, onFormChange } =\n props;\n const questionRoute = useRouteRef(questionRouteRef);\n const articleRoute = useRouteRef(articleRouteRef);\n const navigate = useNavigate();\n const analytics = useAnalytics();\n const [entityRef, setEntityRef] = React.useState(entity);\n const [posting, setPosting] = React.useState(false);\n const [values, setValues] = React.useState(getDefaultValues(props));\n const [error, setError] = React.useState(false);\n const [edited, setEdited] = React.useState(false);\n\n const [images, setImages] = React.useState<number[]>([]);\n const [searchParams, _setSearchParams] = useSearchParams();\n const { t } = useTranslation();\n\n const qetaApi = useApi(qetaApiRef);\n const catalogApi = useApi(catalogApiRef);\n const configApi = useApi(configApiRef);\n const allowAnonymouns = configApi.getOptionalBoolean('qeta.allowAnonymous');\n const {\n register,\n handleSubmit,\n control,\n reset,\n formState: { errors },\n } = useForm<QuestionFormValues>({\n values,\n defaultValues: getDefaultValues(props),\n });\n\n const postQuestion = (data: QuestionFormValues) => {\n setPosting(true);\n const route = type === 'question' ? questionRoute : articleRoute;\n\n const queryParams = new URLSearchParams();\n if (entity) {\n queryParams.set('entity', entity);\n }\n if (entityPage) {\n queryParams.set('entityPage', 'true');\n }\n\n if (id) {\n qetaApi\n .updatePost(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', type);\n if (onPost) {\n onPost(q);\n } else if (entity) {\n navigate(\n `${route({\n id: q.id.toString(10),\n })}?${queryParams.toString()}`,\n );\n } else {\n navigate(route({ id: q.id.toString(10) }));\n }\n })\n .catch(_e => {\n setError(true);\n setPosting(false);\n });\n return;\n }\n qetaApi\n .createPost(formToRequest(data, images))\n .then(q => {\n if (!q || !q.id) {\n setError(true);\n return;\n }\n setEdited(false);\n analytics.captureEvent('post', type);\n reset();\n if (entity) {\n navigate(\n `${route({\n id: q.id.toString(10),\n })}?${queryParams.toString()}`,\n );\n } else {\n navigate(route({ id: q.id.toString(10) }));\n }\n })\n .catch(_e => {\n setError(true);\n setPosting(false);\n });\n };\n\n useEffect(() => {\n if (!entityRef) {\n const e = searchParams.get('entity');\n if (e) {\n setEntityRef(e);\n }\n }\n }, [entityRef, searchParams]);\n\n useEffect(() => {\n if (id) {\n getValues(qetaApi, catalogApi, type, id).then(data => {\n setValues(data);\n setImages(data.images);\n });\n }\n }, [qetaApi, catalogApi, type, id]);\n\n useEffect(() => {\n if (entityRef) {\n catalogApi.getEntityByRef(entityRef).then(data => {\n if (data) {\n setValues(v => {\n return { ...v, entities: [...(v.entities ?? []), data] };\n });\n }\n });\n }\n }, [catalogApi, entityRef]);\n\n useEffect(() => {\n if (template && template.entities && template.entities.length > 0) {\n catalogApi\n .getEntitiesByRefs({ entityRefs: template.entities })\n .then(data => {\n setValues(v => {\n return {\n ...v,\n entities: compact([...(v.entities ?? []), ...data.items]),\n };\n });\n });\n }\n }, [catalogApi, template]);\n\n useEffect(() => {\n reset(values);\n }, [values, reset]);\n\n useEffect(() => {\n return confirmNavigationIfEdited(edited);\n }, [edited]);\n\n const onImageUpload = useCallback(\n (imageId: number) => {\n setImages(prevImages => [...prevImages, imageId]);\n },\n [setImages],\n );\n\n return (\n <form\n onSubmit={handleSubmit(postQuestion)}\n onChange={() => {\n setEdited(true);\n onFormChange?.(control._formValues as QuestionFormValues);\n }}\n >\n {error && (\n <Alert severity=\"error\">{t('postForm.errorPosting', { type })}</Alert>\n )}\n {type === 'article' && (\n <HeaderImageInput\n onChange={(url?: string) =>\n setValues(v => ({ ...v, headerImage: url }))\n }\n onImageUpload={onImageUpload}\n url={values.headerImage}\n postId={id ? Number(id) : undefined}\n />\n )}\n <TextField\n label=\"Title\"\n className=\"qetaAskFormTitle\"\n required\n fullWidth\n error={'title' in errors}\n margin=\"normal\"\n variant=\"outlined\"\n helperText={t('postForm.titleInput.helperText', { type })}\n {\n // @ts-ignore\n ...register('title', { required: true, maxLength: 255 })\n }\n />\n\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={'content' in errors}\n placeholder={t('postForm.contentInput.placeholder', { type })}\n config={configApi}\n onImageUpload={onImageUpload}\n postId={id ? Number(id) : undefined}\n />\n )}\n name=\"content\"\n />\n <Controller\n control={control}\n render={({\n field: { onChange, value },\n fieldState: { error: tagError },\n }) => <TagInput value={value} onChange={onChange} error={tagError} />}\n name=\"tags\"\n />\n <Controller\n control={control}\n render={({ field: { onChange, value } }) => (\n <EntitiesInput\n value={value}\n onChange={onChange}\n singleValue={entityRef}\n />\n )}\n name=\"entities\"\n />\n {allowAnonymouns && !id && (\n <PostAnonymouslyCheckbox\n control={control}\n label={t('anonymousCheckbox.postAnonymously')}\n />\n )}\n <Button\n color=\"primary\"\n type=\"submit\"\n variant=\"contained\"\n disabled={posting}\n >\n {id ? t('postForm.submit.existingPost') : t('postForm.submit.newPost')}\n </Button>\n </form>\n );\n};\n"],"names":["React"],"mappings":"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"}
1
+ {"version":3,"file":"PostForm.esm.js","sources":["../../../src/components/PostForm/PostForm.tsx"],"sourcesContent":["import {\n configApiRef,\n useAnalytics,\n useApi,\n useRouteRef,\n} from '@backstage/core-plugin-api';\nimport { Button, TextField } from '@material-ui/core';\nimport { Alert } from '@material-ui/lab';\nimport React, { useCallback, useEffect } from 'react';\nimport { Controller, useForm } from 'react-hook-form';\nimport { useNavigate, useSearchParams } from 'react-router-dom';\nimport {\n PostRequest,\n PostResponse,\n PostType,\n QetaApi,\n Template,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { MarkdownEditor } from '../MarkdownEditor/MarkdownEditor';\nimport { catalogApiRef } from '@backstage/plugin-catalog-react';\nimport { stringifyEntityRef } from '@backstage/catalog-model';\nimport { CatalogApi } from '@backstage/catalog-client';\nimport { compact } from 'lodash';\nimport { TagInput } from './TagInput';\nimport { QuestionFormValues } from './types';\nimport { EntitiesInput } from './EntitiesInput';\nimport { articleRouteRef, questionRouteRef } from '../../routes';\nimport { PostAnonymouslyCheckbox } from '../PostAnonymouslyCheckbox/PostAnonymouslyCheckbox';\nimport { confirmNavigationIfEdited } from '../../utils/utils';\nimport { qetaApiRef } from '../../api';\nimport { HeaderImageInput } from '../HeaderImageInput/HeaderImageInput';\nimport { useTranslation } from '../../hooks';\n\nconst formToRequest = (\n form: QuestionFormValues,\n images: number[],\n): PostRequest => {\n return {\n ...form,\n entities: form.entities?.map(stringifyEntityRef),\n images: images,\n };\n};\n\nexport type PostFormProps = {\n type: PostType;\n id?: string;\n entity?: string;\n tags?: string[];\n onPost?: (question: PostResponse) => void;\n entityPage?: boolean;\n template?: Template | null;\n onFormChange?: (data: QuestionFormValues) => void;\n};\n\nconst getDefaultValues = (props: PostFormProps): QuestionFormValues => {\n if (props.template) {\n return {\n title: props.template.questionTitle ?? '',\n content: props.template.questionContent ?? '',\n tags: props.template.tags ?? [],\n entities: [],\n type: props.type,\n images: [],\n };\n }\n\n return {\n title: '',\n content: '',\n tags: props.tags ?? [],\n entities: [],\n type: props.type,\n images: [],\n };\n};\n\nconst getValues = async (\n api: QetaApi,\n catalogApi: CatalogApi,\n type: PostType,\n id?: string,\n): Promise<QuestionFormValues> => {\n if (!id) {\n return getDefaultValues({ type });\n }\n\n const post = await api.getPost(id);\n const entities =\n post.entities && post.entities.length > 0\n ? await catalogApi.getEntitiesByRefs({\n entityRefs: post.entities,\n fields: [\n 'kind',\n 'metadata.name',\n 'metadata.namespace',\n 'metadata.title',\n ],\n })\n : [];\n return {\n title: post.title,\n content: post.content,\n tags: post.tags ?? [],\n entities: 'items' in entities ? compact(entities.items) : [],\n type,\n headerImage: post.headerImage,\n images: post.images,\n };\n};\n\nexport const PostForm = (props: PostFormProps) => {\n const { id, entity, onPost, entityPage, type, template, onFormChange } =\n props;\n const questionRoute = useRouteRef(questionRouteRef);\n const articleRoute = useRouteRef(articleRouteRef);\n const navigate = useNavigate();\n const analytics = useAnalytics();\n const [entityRef, setEntityRef] = React.useState(entity);\n const [posting, setPosting] = React.useState(false);\n const [values, setValues] = React.useState(getDefaultValues(props));\n const [error, setError] = React.useState(false);\n const [edited, setEdited] = React.useState(false);\n\n const [images, setImages] = React.useState<number[]>([]);\n const [searchParams, _setSearchParams] = useSearchParams();\n const { t } = useTranslation();\n\n const qetaApi = useApi(qetaApiRef);\n const catalogApi = useApi(catalogApiRef);\n const configApi = useApi(configApiRef);\n const allowAnonymouns = configApi.getOptionalBoolean('qeta.allowAnonymous');\n const {\n register,\n handleSubmit,\n control,\n reset,\n getValues: getFormValues,\n setValue,\n formState: { errors },\n } = useForm<QuestionFormValues>({\n values,\n defaultValues: getDefaultValues(props),\n });\n\n const postQuestion = (data: QuestionFormValues) => {\n setPosting(true);\n const route = type === 'question' ? questionRoute : articleRoute;\n\n const queryParams = new URLSearchParams();\n if (entity) {\n queryParams.set('entity', entity);\n }\n if (entityPage) {\n queryParams.set('entityPage', 'true');\n }\n\n if (id) {\n qetaApi\n .updatePost(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', type);\n if (onPost) {\n onPost(q);\n } else if (entity) {\n navigate(\n `${route({\n id: q.id.toString(10),\n })}?${queryParams.toString()}`,\n );\n } else {\n navigate(route({ id: q.id.toString(10) }));\n }\n })\n .catch(_e => {\n setError(true);\n setPosting(false);\n });\n return;\n }\n qetaApi\n .createPost(formToRequest(data, images))\n .then(q => {\n if (!q || !q.id) {\n setError(true);\n return;\n }\n setEdited(false);\n analytics.captureEvent('post', type);\n reset();\n if (entity) {\n navigate(\n `${route({\n id: q.id.toString(10),\n })}?${queryParams.toString()}`,\n );\n } else {\n navigate(route({ id: q.id.toString(10) }));\n }\n })\n .catch(_e => {\n setError(true);\n setPosting(false);\n });\n };\n\n useEffect(() => {\n if (!entityRef) {\n const e = searchParams.get('entity');\n if (e) {\n setEntityRef(e);\n }\n }\n }, [entityRef, searchParams]);\n\n useEffect(() => {\n if (id) {\n getValues(qetaApi, catalogApi, type, id).then(data => {\n setValues(data);\n setImages(data.images);\n });\n }\n }, [qetaApi, catalogApi, type, id]);\n\n useEffect(() => {\n if (entityRef) {\n catalogApi.getEntityByRef(entityRef).then(data => {\n if (data) {\n setValues(v => {\n return { ...v, entities: [...(v.entities ?? []), data] };\n });\n }\n });\n }\n }, [catalogApi, entityRef]);\n\n useEffect(() => {\n if (template && template.entities && template.entities.length > 0) {\n catalogApi\n .getEntitiesByRefs({ entityRefs: template.entities })\n .then(data => {\n setValues(v => {\n return {\n ...v,\n entities: compact([...(v.entities ?? []), ...data.items]),\n };\n });\n });\n }\n }, [catalogApi, template]);\n\n useEffect(() => {\n reset(values);\n }, [values, reset]);\n\n useEffect(() => {\n return confirmNavigationIfEdited(edited);\n }, [edited]);\n\n const onImageUpload = useCallback(\n (imageId: number) => {\n setImages(prevImages => [...prevImages, imageId]);\n },\n [setImages],\n );\n\n return (\n <form\n onSubmit={handleSubmit(postQuestion)}\n onChange={() => {\n setEdited(true);\n onFormChange?.(control._formValues as QuestionFormValues);\n }}\n >\n {error && (\n <Alert severity=\"error\">{t('postForm.errorPosting', { type })}</Alert>\n )}\n {type === 'article' && (\n <Controller\n control={control}\n render={({ field: { onChange, value } }) => (\n <HeaderImageInput\n onChange={onChange}\n onImageUpload={onImageUpload}\n url={value}\n postId={id ? Number(id) : undefined}\n />\n )}\n name=\"headerImage\"\n />\n )}\n <TextField\n label=\"Title\"\n className=\"qetaAskFormTitle\"\n required\n fullWidth\n error={'title' in errors}\n margin=\"normal\"\n variant=\"outlined\"\n helperText={t('postForm.titleInput.helperText', { type })}\n {\n // @ts-ignore\n ...register('title', { required: true, maxLength: 255 })\n }\n />\n\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={'content' in errors}\n placeholder={t('postForm.contentInput.placeholder', { type })}\n config={configApi}\n onImageUpload={onImageUpload}\n postId={id ? Number(id) : undefined}\n onTagsChange={tags => {\n const existing = getFormValues('tags') ?? [];\n const newTags = [...new Set([...existing, ...tags])];\n setValue('tags', newTags, { shouldValidate: true });\n }}\n />\n )}\n name=\"content\"\n />\n <Controller\n control={control}\n render={({\n field: { onChange, value },\n fieldState: { error: tagError },\n }) => <TagInput value={value} onChange={onChange} error={tagError} />}\n name=\"tags\"\n />\n <Controller\n control={control}\n render={({ field: { onChange, value } }) => (\n <EntitiesInput\n value={value}\n onChange={onChange}\n singleValue={entityRef}\n />\n )}\n name=\"entities\"\n />\n {allowAnonymouns && !id && (\n <PostAnonymouslyCheckbox\n control={control}\n label={t('anonymousCheckbox.postAnonymously')}\n />\n )}\n <Button\n color=\"primary\"\n type=\"submit\"\n variant=\"contained\"\n disabled={posting}\n >\n {id ? t('postForm.submit.existingPost') : t('postForm.submit.newPost')}\n </Button>\n </form>\n );\n};\n"],"names":["React"],"mappings":"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"}
@@ -3,7 +3,7 @@ import { Tooltip, Typography, TextField } from '@material-ui/core';
3
3
  import React__default, { useMemo, useEffect } from 'react';
4
4
  import { qetaApiRef } from '../../api.esm.js';
5
5
  import { useApi, configApiRef } from '@backstage/core-plugin-api';
6
- import { filterTags } from '@drodil/backstage-plugin-qeta-common';
6
+ import { isValidTag, filterTags } from '@drodil/backstage-plugin-qeta-common';
7
7
  import 'react-use';
8
8
  import { useTranslation } from '../../hooks/useTranslation.esm.js';
9
9
  import '@backstage/catalog-model';
@@ -61,13 +61,14 @@ const TagInput = (props) => {
61
61
  if (!allowCreation && availableTags.length === 0) {
62
62
  return null;
63
63
  }
64
+ const val = [...new Set(value ?? [])].filter(isValidTag).slice(0, maximumTags);
64
65
  return /* @__PURE__ */ React__default.createElement(
65
66
  Autocomplete,
66
67
  {
67
68
  multiple: true,
68
69
  id: "tags-select",
69
70
  className: "qetaTagInput",
70
- value,
71
+ value: val,
71
72
  options: availableTags ?? [],
72
73
  freeSolo: allowCreation,
73
74
  ListboxComponent: AutocompleteListboxComponent,
@@ -1 +1 @@
1
- {"version":3,"file":"TagInput.esm.js","sources":["../../../src/components/PostForm/TagInput.tsx"],"sourcesContent":["import { Autocomplete } from '@material-ui/lab';\nimport { TextField, Tooltip, Typography } from '@material-ui/core';\nimport React, { useEffect, useMemo } from 'react';\nimport { qetaApiRef } from '../../api';\nimport { configApiRef, useApi } from '@backstage/core-plugin-api';\nimport { filterTags } from '@drodil/backstage-plugin-qeta-common';\nimport { useTranslation } from '../../hooks';\nimport { FieldError } from 'react-hook-form';\nimport { AutocompleteListboxComponent } from './AutocompleteListComponent';\n\nexport const TagInput = (props: {\n value?: string[];\n onChange: (value: string[]) => void;\n error?: FieldError;\n allowCreate?: boolean;\n hideHelpText?: boolean;\n style?: React.CSSProperties;\n}) => {\n const {\n value,\n onChange,\n error,\n allowCreate,\n hideHelpText = false,\n style,\n } = props;\n const qetaApi = useApi(qetaApiRef);\n const config = useApi(configApiRef);\n const { t } = useTranslation();\n const allowCreation = useMemo(\n () =>\n allowCreate ??\n config.getOptionalBoolean('qeta.tags.allowCreation') ??\n true,\n [config, allowCreate],\n );\n const allowedTags = useMemo(\n () => config.getOptionalStringArray('qeta.tags.allowedTags') ?? [],\n [config],\n );\n const maximumTags = useMemo(\n () => config.getOptionalNumber('qeta.tags.max') ?? 5,\n [config],\n );\n const [availableTags, setAvailableTags] = React.useState<string[]>([]);\n const [tagDescriptions, setTagDescriptions] = React.useState<\n Record<string, string>\n >({});\n useEffect(() => {\n qetaApi\n .getTags()\n .catch(_ => setAvailableTags([]))\n .then(data => {\n if (!data) {\n return;\n }\n\n const uniqueTags = [\n ...new Set([...allowedTags, ...data.tags.map(tag => tag.tag)]),\n ];\n setAvailableTags(uniqueTags);\n setTagDescriptions(\n data.tags.reduce((acc, tag) => {\n if (!tag.description) {\n return acc;\n }\n acc[tag.tag] = tag.description;\n return acc;\n }, {} as Record<string, string>),\n );\n });\n }, [qetaApi, allowCreation, allowedTags]);\n\n if (!allowCreation && availableTags.length === 0) {\n return null;\n }\n\n return (\n <Autocomplete\n multiple\n id=\"tags-select\"\n className=\"qetaTagInput\"\n value={value}\n options={availableTags ?? []}\n freeSolo={allowCreation}\n ListboxComponent={\n AutocompleteListboxComponent as React.ComponentType<\n React.HTMLAttributes<HTMLElement>\n >\n }\n disableListWrap\n style={style}\n renderOption={option => {\n if (tagDescriptions[option]) {\n return (\n <>\n <Tooltip\n arrow\n placement=\"right\"\n title={<Typography>{tagDescriptions[option]}</Typography>}\n >\n <span>{option}</span>\n </Tooltip>\n </>\n );\n }\n return option;\n }}\n onChange={(_e, newValue) => {\n const tags = filterTags(newValue);\n if (\n tags &&\n tags.length <= maximumTags &&\n tags.length === newValue.length\n ) {\n onChange(newValue);\n }\n }}\n renderInput={params => (\n <TextField\n {...params}\n variant=\"outlined\"\n margin=\"normal\"\n label={t('tagsInput.label')}\n placeholder={t('tagsInput.placeholder')}\n helperText={\n hideHelpText\n ? ''\n : t('tagsInput.helperText', {\n max: maximumTags.toString(10),\n })\n }\n error={error !== undefined}\n />\n )}\n />\n );\n};\n"],"names":["React"],"mappings":"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"}
1
+ {"version":3,"file":"TagInput.esm.js","sources":["../../../src/components/PostForm/TagInput.tsx"],"sourcesContent":["import { Autocomplete } from '@material-ui/lab';\nimport { TextField, Tooltip, Typography } from '@material-ui/core';\nimport React, { useEffect, useMemo } from 'react';\nimport { qetaApiRef } from '../../api';\nimport { configApiRef, useApi } from '@backstage/core-plugin-api';\nimport { filterTags, isValidTag } from '@drodil/backstage-plugin-qeta-common';\nimport { useTranslation } from '../../hooks';\nimport { FieldError } from 'react-hook-form';\nimport { AutocompleteListboxComponent } from './AutocompleteListComponent';\n\nexport const TagInput = (props: {\n value?: string[];\n onChange: (value: string[]) => void;\n error?: FieldError;\n allowCreate?: boolean;\n hideHelpText?: boolean;\n style?: React.CSSProperties;\n}) => {\n const {\n value,\n onChange,\n error,\n allowCreate,\n hideHelpText = false,\n style,\n } = props;\n const qetaApi = useApi(qetaApiRef);\n const config = useApi(configApiRef);\n const { t } = useTranslation();\n const allowCreation = useMemo(\n () =>\n allowCreate ??\n config.getOptionalBoolean('qeta.tags.allowCreation') ??\n true,\n [config, allowCreate],\n );\n const allowedTags = useMemo(\n () => config.getOptionalStringArray('qeta.tags.allowedTags') ?? [],\n [config],\n );\n const maximumTags = useMemo(\n () => config.getOptionalNumber('qeta.tags.max') ?? 5,\n [config],\n );\n const [availableTags, setAvailableTags] = React.useState<string[]>([]);\n const [tagDescriptions, setTagDescriptions] = React.useState<\n Record<string, string>\n >({});\n useEffect(() => {\n qetaApi\n .getTags()\n .catch(_ => setAvailableTags([]))\n .then(data => {\n if (!data) {\n return;\n }\n\n const uniqueTags = [\n ...new Set([...allowedTags, ...data.tags.map(tag => tag.tag)]),\n ];\n setAvailableTags(uniqueTags);\n setTagDescriptions(\n data.tags.reduce((acc, tag) => {\n if (!tag.description) {\n return acc;\n }\n acc[tag.tag] = tag.description;\n return acc;\n }, {} as Record<string, string>),\n );\n });\n }, [qetaApi, allowCreation, allowedTags]);\n\n if (!allowCreation && availableTags.length === 0) {\n return null;\n }\n\n const val = [...new Set(value ?? [])]\n .filter(isValidTag)\n .slice(0, maximumTags);\n\n return (\n <Autocomplete\n multiple\n id=\"tags-select\"\n className=\"qetaTagInput\"\n value={val}\n options={availableTags ?? []}\n freeSolo={allowCreation}\n ListboxComponent={\n AutocompleteListboxComponent as React.ComponentType<\n React.HTMLAttributes<HTMLElement>\n >\n }\n disableListWrap\n style={style}\n renderOption={option => {\n if (tagDescriptions[option]) {\n return (\n <>\n <Tooltip\n arrow\n placement=\"right\"\n title={<Typography>{tagDescriptions[option]}</Typography>}\n >\n <span>{option}</span>\n </Tooltip>\n </>\n );\n }\n return option;\n }}\n onChange={(_e, newValue) => {\n const tags = filterTags(newValue);\n if (\n tags &&\n tags.length <= maximumTags &&\n tags.length === newValue.length\n ) {\n onChange(newValue);\n }\n }}\n renderInput={params => (\n <TextField\n {...params}\n variant=\"outlined\"\n margin=\"normal\"\n label={t('tagsInput.label')}\n placeholder={t('tagsInput.placeholder')}\n helperText={\n hideHelpText\n ? ''\n : t('tagsInput.helperText', {\n max: maximumTags.toString(10),\n })\n }\n error={error !== undefined}\n />\n )}\n />\n );\n};\n"],"names":["React"],"mappings":"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"}
@@ -31,13 +31,21 @@ const TagTooltip = (props) => {
31
31
  if (res) {
32
32
  cache.set(tag, res);
33
33
  setResp(res);
34
+ } else {
35
+ setResp({
36
+ id: 0,
37
+ tag,
38
+ postsCount: 0,
39
+ followerCount: 0,
40
+ description: t("tagChip.nonExistingTag")
41
+ });
34
42
  }
35
43
  });
36
- }, [qetaApi, tag]);
44
+ }, [qetaApi, tag, t]);
37
45
  if (!resp) {
38
46
  return null;
39
47
  }
40
- return /* @__PURE__ */ React__default.createElement(Grid, { container: true, style: { padding: "0.5em" }, spacing: 1 }, /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React__default.createElement(Typography, { variant: "h6" }, tag)), /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React__default.createElement(Typography, { variant: "subtitle2" }, t("common.posts", { count: resp.postsCount, itemType: "post" }), " \xB7 ", t("common.followers", { count: resp.followerCount }))), resp.description && /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React__default.createElement(MarkdownRenderer, { content: resp.description })), !tags.loading && /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React__default.createElement(
48
+ return /* @__PURE__ */ React__default.createElement(Grid, { container: true, style: { padding: "0.5em" }, spacing: 1 }, /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React__default.createElement(Typography, { variant: "h6" }, tag)), resp.id > 0 && /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React__default.createElement(Typography, { variant: "subtitle2" }, t("common.posts", { count: resp.postsCount, itemType: "post" }), " \xB7 ", t("common.followers", { count: resp.followerCount }))), resp.description && /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React__default.createElement(MarkdownRenderer, { content: resp.description })), !tags.loading && resp.id !== 0 && /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React__default.createElement(
41
49
  Button,
42
50
  {
43
51
  size: "small",
@@ -74,9 +82,12 @@ const TagChip = (props) => {
74
82
  size: "small",
75
83
  className: "qetaTagChip",
76
84
  component: "a",
77
- onClick: () => {
85
+ style: props.style,
86
+ href: props.useHref ? tagRoute({ tag }) : void 0,
87
+ target: props.useHref ? "_blank" : void 0,
88
+ onClick: !props.useHref ? () => {
78
89
  navigate(tagRoute({ tag }));
79
- },
90
+ } : void 0,
80
91
  clickable: true
81
92
  }
82
93
  )
@@ -1 +1 @@
1
- {"version":3,"file":"TagChip.esm.js","sources":["../../../src/components/TagsAndEntities/TagChip.tsx"],"sourcesContent":["import React, { useEffect } from 'react';\nimport { useApi, useRouteRef } from '@backstage/core-plugin-api';\nimport { tagRouteRef } from '../../routes';\nimport { qetaApiRef } from '../../api';\nimport { TagResponse } from '@drodil/backstage-plugin-qeta-common';\nimport { useNavigate } from 'react-router-dom';\nimport { MarkdownRenderer } from '../MarkdownRenderer';\nimport { useTagsFollow, useTranslation } from '../../hooks';\nimport { Button, Chip, Grid, Tooltip, Typography } from '@material-ui/core';\nimport VisibilityOff from '@material-ui/icons/VisibilityOff';\nimport Visibility from '@material-ui/icons/Visibility';\n\nconst cache: Map<string, TagResponse> = new Map();\n\nconst TagTooltip = (props: { tag: string }) => {\n const { tag } = props;\n const qetaApi = useApi(qetaApiRef);\n const { t } = useTranslation();\n const tags = useTagsFollow();\n const [resp, setResp] = React.useState<undefined | TagResponse>();\n\n useEffect(() => {\n if (cache.has(tag)) {\n setResp(cache.get(tag));\n return;\n }\n\n qetaApi.getTag(tag).then(res => {\n if (res) {\n cache.set(tag, res);\n setResp(res);\n }\n });\n }, [qetaApi, tag]);\n\n if (!resp) {\n return null;\n }\n\n return (\n <Grid container style={{ padding: '0.5em' }} spacing={1}>\n <Grid item xs={12}>\n <Typography variant=\"h6\">{tag}</Typography>\n </Grid>\n <Grid item xs={12}>\n <Typography variant=\"subtitle2\">\n {t('common.posts', { count: resp.postsCount, itemType: 'post' })}\n {' · '}\n {t('common.followers', { count: resp.followerCount })}\n </Typography>\n </Grid>\n {resp.description && (\n <Grid item xs={12}>\n <MarkdownRenderer content={resp.description} />\n </Grid>\n )}\n {!tags.loading && (\n <Grid item xs={12}>\n <Button\n size=\"small\"\n variant=\"outlined\"\n color={tags.isFollowingTag(tag) ? 'secondary' : 'primary'}\n onClick={() => {\n if (tags.isFollowingTag(tag)) {\n tags.unfollowTag(tag);\n } else {\n tags.followTag(tag);\n }\n }}\n startIcon={\n tags.isFollowingTag(tag) ? <VisibilityOff /> : <Visibility />\n }\n >\n {tags.isFollowingTag(tag)\n ? t('tagButton.unfollow')\n : t('tagButton.follow')}\n </Button>\n </Grid>\n )}\n </Grid>\n );\n};\n\nexport const TagChip = (props: { tag: string }) => {\n const tagRoute = useRouteRef(tagRouteRef);\n const navigate = useNavigate();\n const { tag } = props;\n return (\n <Tooltip\n arrow\n title={<TagTooltip tag={tag} />}\n enterDelay={400}\n interactive\n >\n <Chip\n label={tag}\n size=\"small\"\n className=\"qetaTagChip\"\n component=\"a\"\n onClick={() => {\n navigate(tagRoute({ tag }));\n }}\n clickable\n />\n </Tooltip>\n );\n};\n"],"names":["React"],"mappings":"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"}
1
+ {"version":3,"file":"TagChip.esm.js","sources":["../../../src/components/TagsAndEntities/TagChip.tsx"],"sourcesContent":["import React, { CSSProperties, useEffect } from 'react';\nimport { useApi, useRouteRef } from '@backstage/core-plugin-api';\nimport { tagRouteRef } from '../../routes';\nimport { qetaApiRef } from '../../api';\nimport { TagResponse } from '@drodil/backstage-plugin-qeta-common';\nimport { useNavigate } from 'react-router-dom';\nimport { MarkdownRenderer } from '../MarkdownRenderer';\nimport { useTagsFollow, useTranslation } from '../../hooks';\nimport { Button, Chip, Grid, Tooltip, Typography } from '@material-ui/core';\nimport VisibilityOff from '@material-ui/icons/VisibilityOff';\nimport Visibility from '@material-ui/icons/Visibility';\n\nconst cache: Map<string, TagResponse> = new Map();\n\nconst TagTooltip = (props: { tag: string }) => {\n const { tag } = props;\n const qetaApi = useApi(qetaApiRef);\n const { t } = useTranslation();\n const tags = useTagsFollow();\n const [resp, setResp] = React.useState<undefined | TagResponse>();\n\n useEffect(() => {\n if (cache.has(tag)) {\n setResp(cache.get(tag));\n return;\n }\n\n qetaApi.getTag(tag).then(res => {\n if (res) {\n cache.set(tag, res);\n setResp(res);\n } else {\n setResp({\n id: 0,\n tag,\n postsCount: 0,\n followerCount: 0,\n description: t('tagChip.nonExistingTag'),\n });\n }\n });\n }, [qetaApi, tag, t]);\n\n if (!resp) {\n return null;\n }\n\n return (\n <Grid container style={{ padding: '0.5em' }} spacing={1}>\n <Grid item xs={12}>\n <Typography variant=\"h6\">{tag}</Typography>\n </Grid>\n {resp.id > 0 && (\n <Grid item xs={12}>\n <Typography variant=\"subtitle2\">\n {t('common.posts', { count: resp.postsCount, itemType: 'post' })}\n {' · '}\n {t('common.followers', { count: resp.followerCount })}\n </Typography>\n </Grid>\n )}\n {resp.description && (\n <Grid item xs={12}>\n <MarkdownRenderer content={resp.description} />\n </Grid>\n )}\n {!tags.loading && resp.id !== 0 && (\n <Grid item xs={12}>\n <Button\n size=\"small\"\n variant=\"outlined\"\n color={tags.isFollowingTag(tag) ? 'secondary' : 'primary'}\n onClick={() => {\n if (tags.isFollowingTag(tag)) {\n tags.unfollowTag(tag);\n } else {\n tags.followTag(tag);\n }\n }}\n startIcon={\n tags.isFollowingTag(tag) ? <VisibilityOff /> : <Visibility />\n }\n >\n {tags.isFollowingTag(tag)\n ? t('tagButton.unfollow')\n : t('tagButton.follow')}\n </Button>\n </Grid>\n )}\n </Grid>\n );\n};\n\nexport const TagChip = (props: {\n tag: string;\n style?: CSSProperties;\n useHref?: boolean;\n}) => {\n const tagRoute = useRouteRef(tagRouteRef);\n const navigate = useNavigate();\n const { tag } = props;\n return (\n <Tooltip\n arrow\n title={<TagTooltip tag={tag} />}\n enterDelay={400}\n interactive\n >\n <Chip\n label={tag}\n size=\"small\"\n className=\"qetaTagChip\"\n component=\"a\"\n style={props.style}\n href={props.useHref ? tagRoute({ tag }) : undefined}\n target={props.useHref ? '_blank' : undefined}\n onClick={\n !props.useHref\n ? () => {\n navigate(tagRoute({ tag }));\n }\n : undefined\n }\n clickable\n />\n </Tooltip>\n );\n};\n"],"names":["React"],"mappings":"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"}
@@ -66,6 +66,8 @@ const TemplateForm = (props) => {
66
66
  register,
67
67
  handleSubmit,
68
68
  control,
69
+ getValues: getFormValues,
70
+ setValue,
69
71
  reset,
70
72
  formState: { errors }
71
73
  } = useForm({
@@ -159,7 +161,12 @@ const TemplateForm = (props) => {
159
161
  onChange,
160
162
  height: 400,
161
163
  error: "questionContent" in errors,
162
- placeholder: t("templateList.questionContentInput.placeholder")
164
+ placeholder: t("templateList.questionContentInput.placeholder"),
165
+ onTagsChange: (tags) => {
166
+ const existing = getFormValues("tags") ?? [];
167
+ const newTags = [.../* @__PURE__ */ new Set([...existing, ...tags])];
168
+ setValue("tags", newTags, { shouldValidate: true });
169
+ }
163
170
  }
164
171
  ),
165
172
  name: "questionContent"
@@ -1 +1 @@
1
- {"version":3,"file":"TemplateForm.esm.js","sources":["../../../src/components/TemplateList/TemplateForm.tsx"],"sourcesContent":["import React, { useEffect } from 'react';\nimport { useIsModerator, useTranslation } from '../../hooks';\nimport { QetaApi, TemplateRequest } from '@drodil/backstage-plugin-qeta-common';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { qetaApiRef } from '../../api';\nimport { Controller, useForm } from 'react-hook-form';\nimport { stringifyEntityRef } from '@backstage/catalog-model';\nimport { CatalogApi } from '@backstage/catalog-client';\nimport { compact } from 'lodash';\nimport { catalogApiRef } from '@backstage/plugin-catalog-react';\nimport { MarkdownEditor } from '../MarkdownEditor/MarkdownEditor';\nimport { TagInput } from '../PostForm/TagInput';\nimport { EntitiesInput } from '../PostForm/EntitiesInput';\nimport { TemplateFormValues } from '../PostForm/types';\nimport { Button, TextField } from '@material-ui/core';\nimport { Alert } from '@material-ui/lab';\n\nconst formToRequest = (form: TemplateFormValues): TemplateRequest => {\n return {\n ...form,\n entities: form.entities?.map(stringifyEntityRef),\n };\n};\n\nconst getDefaultValues = (): TemplateFormValues => {\n return {\n title: '',\n description: '',\n tags: [],\n entities: [],\n };\n};\n\nconst getValues = async (\n api: QetaApi,\n catalogApi: CatalogApi,\n id?: string,\n): Promise<TemplateFormValues> => {\n if (!id) {\n return getDefaultValues();\n }\n\n const template = await api.getTemplate(id);\n const entities =\n template.entities && template.entities.length > 0\n ? await catalogApi.getEntitiesByRefs({\n entityRefs: template.entities,\n fields: [\n 'kind',\n 'metadata.name',\n 'metadata.namespace',\n 'metadata.title',\n ],\n })\n : [];\n return {\n title: template.title,\n description: template.description,\n questionTitle: template.questionTitle,\n questionContent: template.questionContent,\n tags: template.tags ?? [],\n entities: 'items' in entities ? compact(entities.items) : [],\n };\n};\n\nexport const TemplateForm = (props: { id?: number; onPost: () => void }) => {\n const { id, onPost } = props;\n const [posting, setPosting] = React.useState(false);\n const catalogApi = useApi(catalogApiRef);\n const qetaApi = useApi(qetaApiRef);\n const [error, setError] = React.useState(false);\n const [values, setValues] = React.useState(getDefaultValues());\n const { isModerator } = useIsModerator();\n const { t } = useTranslation();\n const {\n register,\n handleSubmit,\n control,\n reset,\n formState: { errors },\n } = useForm<TemplateFormValues>({\n values,\n defaultValues: getDefaultValues(),\n });\n\n useEffect(() => {\n if (id) {\n getValues(qetaApi, catalogApi, id.toString(10)).then(data => {\n setValues(data);\n });\n }\n }, [qetaApi, catalogApi, id]);\n\n const postTemplate = (data: TemplateFormValues) => {\n setPosting(true);\n\n if (id) {\n qetaApi\n .updateTemplate(id, formToRequest(data))\n .then(_q => {\n reset();\n onPost();\n })\n .catch(_e => {\n setPosting(false);\n });\n return;\n }\n qetaApi\n .createTemplate(formToRequest(data))\n .then(q => {\n if (!q || !q.id) {\n setError(true);\n return;\n }\n reset();\n onPost();\n })\n .catch(_e => {\n setError(true);\n setPosting(false);\n });\n };\n\n if (!isModerator) {\n return null;\n }\n\n return (\n <form onSubmit={handleSubmit(postTemplate)}>\n {error && (\n <Alert severity=\"error\">{t('templateList.errorPosting')}</Alert>\n )}\n <TextField\n label={t('templateList.titleInput.label')}\n className=\"qetaTemplateFormTitle\"\n required\n fullWidth\n error={'title' in errors}\n margin=\"normal\"\n variant=\"outlined\"\n helperText={t('templateList.titleInput.helperText')}\n {\n // @ts-ignore\n ...register('title', { required: true, maxLength: 255 })\n }\n />\n\n <TextField\n label={t('templateList.descriptionInput.label')}\n className=\"qetaTemplateFormDescription\"\n required\n fullWidth\n error={'description' in errors}\n margin=\"normal\"\n variant=\"outlined\"\n helperText={t('templateList.descriptionInput.helperText')}\n {\n // @ts-ignore\n ...register('description', { required: true, maxLength: 255 })\n }\n />\n\n <TextField\n label={t('templateList.questionTitleInput.label')}\n className=\"qetaTemplateFormQuestionTitle\"\n fullWidth\n error={'questionTitle' in errors}\n margin=\"normal\"\n variant=\"outlined\"\n helperText={t('templateList.questionTitleInput.helperText')}\n {\n // @ts-ignore\n ...register('questionTitle', { maxLength: 255 })\n }\n />\n\n <Controller\n control={control}\n rules={{}}\n render={({ field: { onChange, value } }) => (\n <MarkdownEditor\n value={value ?? ''}\n disableAttachments\n onChange={onChange}\n height={400}\n error={'questionContent' in errors}\n placeholder={t('templateList.questionContentInput.placeholder')}\n />\n )}\n name=\"questionContent\"\n />\n <Controller\n control={control}\n render={({\n field: { onChange, value },\n fieldState: { error: tagError },\n }) => <TagInput value={value} onChange={onChange} error={tagError} />}\n name=\"tags\"\n />\n <Controller\n control={control}\n render={({ field: { onChange, value } }) => (\n <EntitiesInput value={value} onChange={onChange} />\n )}\n name=\"entities\"\n />\n <Button\n color=\"primary\"\n type=\"submit\"\n variant=\"contained\"\n disabled={posting}\n >\n {id\n ? t('templateList.submit.existingTemplate')\n : t('templateList.submit.newTemplate')}\n </Button>\n </form>\n );\n};\n"],"names":["React"],"mappings":"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"}
1
+ {"version":3,"file":"TemplateForm.esm.js","sources":["../../../src/components/TemplateList/TemplateForm.tsx"],"sourcesContent":["import React, { useEffect } from 'react';\nimport { useIsModerator, useTranslation } from '../../hooks';\nimport { QetaApi, TemplateRequest } from '@drodil/backstage-plugin-qeta-common';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { qetaApiRef } from '../../api';\nimport { Controller, useForm } from 'react-hook-form';\nimport { stringifyEntityRef } from '@backstage/catalog-model';\nimport { CatalogApi } from '@backstage/catalog-client';\nimport { compact } from 'lodash';\nimport { catalogApiRef } from '@backstage/plugin-catalog-react';\nimport { MarkdownEditor } from '../MarkdownEditor/MarkdownEditor';\nimport { TagInput } from '../PostForm/TagInput';\nimport { EntitiesInput } from '../PostForm/EntitiesInput';\nimport { TemplateFormValues } from '../PostForm/types';\nimport { Button, TextField } from '@material-ui/core';\nimport { Alert } from '@material-ui/lab';\n\nconst formToRequest = (form: TemplateFormValues): TemplateRequest => {\n return {\n ...form,\n entities: form.entities?.map(stringifyEntityRef),\n };\n};\n\nconst getDefaultValues = (): TemplateFormValues => {\n return {\n title: '',\n description: '',\n tags: [],\n entities: [],\n };\n};\n\nconst getValues = async (\n api: QetaApi,\n catalogApi: CatalogApi,\n id?: string,\n): Promise<TemplateFormValues> => {\n if (!id) {\n return getDefaultValues();\n }\n\n const template = await api.getTemplate(id);\n const entities =\n template.entities && template.entities.length > 0\n ? await catalogApi.getEntitiesByRefs({\n entityRefs: template.entities,\n fields: [\n 'kind',\n 'metadata.name',\n 'metadata.namespace',\n 'metadata.title',\n ],\n })\n : [];\n return {\n title: template.title,\n description: template.description,\n questionTitle: template.questionTitle,\n questionContent: template.questionContent,\n tags: template.tags ?? [],\n entities: 'items' in entities ? compact(entities.items) : [],\n };\n};\n\nexport const TemplateForm = (props: { id?: number; onPost: () => void }) => {\n const { id, onPost } = props;\n const [posting, setPosting] = React.useState(false);\n const catalogApi = useApi(catalogApiRef);\n const qetaApi = useApi(qetaApiRef);\n const [error, setError] = React.useState(false);\n const [values, setValues] = React.useState(getDefaultValues());\n const { isModerator } = useIsModerator();\n const { t } = useTranslation();\n const {\n register,\n handleSubmit,\n control,\n getValues: getFormValues,\n setValue,\n reset,\n formState: { errors },\n } = useForm<TemplateFormValues>({\n values,\n defaultValues: getDefaultValues(),\n });\n\n useEffect(() => {\n if (id) {\n getValues(qetaApi, catalogApi, id.toString(10)).then(data => {\n setValues(data);\n });\n }\n }, [qetaApi, catalogApi, id]);\n\n const postTemplate = (data: TemplateFormValues) => {\n setPosting(true);\n\n if (id) {\n qetaApi\n .updateTemplate(id, formToRequest(data))\n .then(_q => {\n reset();\n onPost();\n })\n .catch(_e => {\n setPosting(false);\n });\n return;\n }\n qetaApi\n .createTemplate(formToRequest(data))\n .then(q => {\n if (!q || !q.id) {\n setError(true);\n return;\n }\n reset();\n onPost();\n })\n .catch(_e => {\n setError(true);\n setPosting(false);\n });\n };\n\n if (!isModerator) {\n return null;\n }\n\n return (\n <form onSubmit={handleSubmit(postTemplate)}>\n {error && (\n <Alert severity=\"error\">{t('templateList.errorPosting')}</Alert>\n )}\n <TextField\n label={t('templateList.titleInput.label')}\n className=\"qetaTemplateFormTitle\"\n required\n fullWidth\n error={'title' in errors}\n margin=\"normal\"\n variant=\"outlined\"\n helperText={t('templateList.titleInput.helperText')}\n {\n // @ts-ignore\n ...register('title', { required: true, maxLength: 255 })\n }\n />\n\n <TextField\n label={t('templateList.descriptionInput.label')}\n className=\"qetaTemplateFormDescription\"\n required\n fullWidth\n error={'description' in errors}\n margin=\"normal\"\n variant=\"outlined\"\n helperText={t('templateList.descriptionInput.helperText')}\n {\n // @ts-ignore\n ...register('description', { required: true, maxLength: 255 })\n }\n />\n\n <TextField\n label={t('templateList.questionTitleInput.label')}\n className=\"qetaTemplateFormQuestionTitle\"\n fullWidth\n error={'questionTitle' in errors}\n margin=\"normal\"\n variant=\"outlined\"\n helperText={t('templateList.questionTitleInput.helperText')}\n {\n // @ts-ignore\n ...register('questionTitle', { maxLength: 255 })\n }\n />\n\n <Controller\n control={control}\n rules={{}}\n render={({ field: { onChange, value } }) => (\n <MarkdownEditor\n value={value ?? ''}\n disableAttachments\n onChange={onChange}\n height={400}\n error={'questionContent' in errors}\n placeholder={t('templateList.questionContentInput.placeholder')}\n onTagsChange={tags => {\n const existing = getFormValues('tags') ?? [];\n const newTags = [...new Set([...existing, ...tags])];\n setValue('tags', newTags, { shouldValidate: true });\n }}\n />\n )}\n name=\"questionContent\"\n />\n <Controller\n control={control}\n render={({\n field: { onChange, value },\n fieldState: { error: tagError },\n }) => <TagInput value={value} onChange={onChange} error={tagError} />}\n name=\"tags\"\n />\n <Controller\n control={control}\n render={({ field: { onChange, value } }) => (\n <EntitiesInput value={value} onChange={onChange} />\n )}\n name=\"entities\"\n />\n <Button\n color=\"primary\"\n type=\"submit\"\n variant=\"contained\"\n disabled={posting}\n >\n {id\n ? t('templateList.submit.existingTemplate')\n : t('templateList.submit.newTemplate')}\n </Button>\n </form>\n );\n};\n"],"names":["React"],"mappings":"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"}
@@ -36,7 +36,7 @@ const useUserInfo = (entityRef, anonymous) => {
36
36
  const catalogApi = useApi(catalogApiRef);
37
37
  const identityApi = useApi(identityApiRef);
38
38
  const { t } = useTranslation();
39
- const [name, setName] = React__default.useState(void 0);
39
+ const [name, setName] = React__default.useState("");
40
40
  const [user, setUser] = React__default.useState(null);
41
41
  const [initials, setInitials] = React__default.useState(null);
42
42
  const [currentUser, setCurrentUser] = React__default.useState(null);
@@ -1 +1 @@
1
- {"version":3,"file":"useEntityAuthor.esm.js","sources":["../../src/hooks/useEntityAuthor.ts"],"sourcesContent":["import { parseEntityRef, UserEntity } from '@backstage/catalog-model';\nimport { CatalogApi } from '@backstage/catalog-client';\nimport DataLoader from 'dataloader';\nimport { identityApiRef, useApi } from '@backstage/core-plugin-api';\nimport {\n catalogApiRef,\n useEntityPresentation,\n} from '@backstage/plugin-catalog-react';\nimport React, { useEffect } from 'react';\nimport {\n AnswerResponse,\n CollectionResponse,\n PostResponse,\n UserResponse,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { useTranslation } from './useTranslation';\n\nconst userCache: Map<string, UserEntity> = new Map();\nconst dataLoaderFactory = (catalogApi: CatalogApi) =>\n new DataLoader(\n async (entityRefs: readonly string[]) => {\n const { items } = await catalogApi.getEntitiesByRefs({\n fields: [\n 'kind',\n 'metadata.name',\n 'metadata.namespace',\n 'spec.profile.displayName',\n 'spec.profile.picture',\n ],\n entityRefs: entityRefs as string[],\n });\n\n entityRefs.forEach((entityRef, index) => {\n userCache.set(entityRef, items[index] as UserEntity);\n });\n return items;\n },\n {\n name: 'EntityAuthorLoader',\n cacheMap: new Map(),\n maxBatchSize: 100,\n batchScheduleFn: callback => {\n setTimeout(callback, 50);\n },\n },\n );\n\nexport const useUserInfo = (entityRef: string, anonymous?: boolean) => {\n const catalogApi = useApi(catalogApiRef);\n const identityApi = useApi(identityApiRef);\n const { t } = useTranslation();\n const [name, setName] = React.useState<string | undefined>(undefined);\n const [user, setUser] = React.useState<UserEntity | null>(null);\n const [initials, setInitials] = React.useState<string | null>(null);\n const [currentUser, setCurrentUser] = React.useState<string | null>(null);\n const ref = entityRef.startsWith('user:') ? entityRef : `user:${entityRef}`;\n\n const {\n primaryTitle: userName,\n secondaryTitle,\n Icon,\n } = useEntityPresentation(ref);\n\n useEffect(() => {\n if (anonymous) {\n return;\n }\n\n if (userCache.get(ref)) {\n setUser(userCache.get(ref) as UserEntity);\n return;\n }\n\n dataLoaderFactory(catalogApi)\n .load(ref)\n .then(data => {\n if (data) {\n setUser(data as UserEntity);\n } else {\n setUser(null);\n }\n })\n .catch(() => {\n setUser(null);\n });\n }, [catalogApi, ref, anonymous]);\n\n useEffect(() => {\n identityApi.getBackstageIdentity().then(res => {\n setCurrentUser(res.userEntityRef ?? 'user:default/guest');\n });\n }, [identityApi]);\n\n useEffect(() => {\n let displayName = userName;\n if (currentUser) {\n const currentUserRef = parseEntityRef(currentUser);\n const userRef = parseEntityRef(ref);\n if (\n currentUserRef.name === userRef.name &&\n currentUserRef.namespace === userRef.namespace\n ) {\n displayName = `${t('userLink.you')}${\n anonymous\n ? ` (${t('userLink.anonymous').toLocaleLowerCase('en-US')})`\n : ''\n }`;\n } else if (anonymous) {\n displayName = t('userLink.anonymous');\n }\n } else if (anonymous) {\n displayName = t('userLink.anonymous');\n }\n setName(displayName);\n }, [ref, anonymous, currentUser, userName, t]);\n\n useEffect(() => {\n const init = (name ?? '')\n .replace(/[^a-zA-Z]/g, '')\n .split(' ')\n .map(p => p[0])\n .join('')\n .substring(0, 2)\n .toUpperCase();\n setInitials(init);\n }, [name]);\n\n return { name, initials, user, secondaryTitle, Icon };\n};\n\nexport const useEntityAuthor = (\n entity: PostResponse | AnswerResponse | CollectionResponse | UserResponse,\n) => {\n const anonymous = 'anonymous' in entity ? entity.anonymous ?? false : false;\n const author =\n // eslint-disable-next-line no-nested-ternary\n 'author' in entity\n ? entity.author\n : 'userRef' in entity\n ? entity.userRef\n : entity.owner;\n return useUserInfo(author, anonymous);\n};\n"],"names":["React"],"mappings":";;;;;;;AAiBA,MAAM,SAAA,uBAAyC,GAAI,EAAA;AACnD,MAAM,iBAAA,GAAoB,CAAC,UAAA,KACzB,IAAI,UAAA;AAAA,EACF,OAAO,UAAkC,KAAA;AACvC,IAAA,MAAM,EAAE,KAAA,EAAU,GAAA,MAAM,WAAW,iBAAkB,CAAA;AAAA,MACnD,MAAQ,EAAA;AAAA,QACN,MAAA;AAAA,QACA,eAAA;AAAA,QACA,oBAAA;AAAA,QACA,0BAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAW,UAAA,CAAA,OAAA,CAAQ,CAAC,SAAA,EAAW,KAAU,KAAA;AACvC,MAAA,SAAA,CAAU,GAAI,CAAA,SAAA,EAAW,KAAM,CAAA,KAAK,CAAe,CAAA;AAAA,KACpD,CAAA;AACD,IAAO,OAAA,KAAA;AAAA,GACT;AAAA,EACA;AAAA,IACE,IAAM,EAAA,oBAAA;AAAA,IACN,QAAA,sBAAc,GAAI,EAAA;AAAA,IAClB,YAAc,EAAA,GAAA;AAAA,IACd,iBAAiB,CAAY,QAAA,KAAA;AAC3B,MAAA,UAAA,CAAW,UAAU,EAAE,CAAA;AAAA;AACzB;AAEJ,CAAA;AAEW,MAAA,WAAA,GAAc,CAAC,SAAA,EAAmB,SAAwB,KAAA;AACrE,EAAM,MAAA,UAAA,GAAa,OAAO,aAAa,CAAA;AACvC,EAAM,MAAA,WAAA,GAAc,OAAO,cAAc,CAAA;AACzC,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,cAAe,EAAA;AAC7B,EAAA,MAAM,CAAC,IAAM,EAAA,OAAO,CAAI,GAAAA,cAAA,CAAM,SAA6B,KAAS,CAAA,CAAA;AACpE,EAAA,MAAM,CAAC,IAAM,EAAA,OAAO,CAAI,GAAAA,cAAA,CAAM,SAA4B,IAAI,CAAA;AAC9D,EAAA,MAAM,CAAC,QAAU,EAAA,WAAW,CAAI,GAAAA,cAAA,CAAM,SAAwB,IAAI,CAAA;AAClE,EAAA,MAAM,CAAC,WAAa,EAAA,cAAc,CAAI,GAAAA,cAAA,CAAM,SAAwB,IAAI,CAAA;AACxE,EAAA,MAAM,MAAM,SAAU,CAAA,UAAA,CAAW,OAAO,CAAI,GAAA,SAAA,GAAY,QAAQ,SAAS,CAAA,CAAA;AAEzE,EAAM,MAAA;AAAA,IACJ,YAAc,EAAA,QAAA;AAAA,IACd,cAAA;AAAA,IACA;AAAA,GACF,GAAI,sBAAsB,GAAG,CAAA;AAE7B,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,SAAW,EAAA;AACb,MAAA;AAAA;AAGF,IAAI,IAAA,SAAA,CAAU,GAAI,CAAA,GAAG,CAAG,EAAA;AACtB,MAAQ,OAAA,CAAA,SAAA,CAAU,GAAI,CAAA,GAAG,CAAe,CAAA;AACxC,MAAA;AAAA;AAGF,IAAA,iBAAA,CAAkB,UAAU,CACzB,CAAA,IAAA,CAAK,GAAG,CAAA,CACR,KAAK,CAAQ,IAAA,KAAA;AACZ,MAAA,IAAI,IAAM,EAAA;AACR,QAAA,OAAA,CAAQ,IAAkB,CAAA;AAAA,OACrB,MAAA;AACL,QAAA,OAAA,CAAQ,IAAI,CAAA;AAAA;AACd,KACD,CACA,CAAA,KAAA,CAAM,MAAM;AACX,MAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,KACb,CAAA;AAAA,GACF,EAAA,CAAC,UAAY,EAAA,GAAA,EAAK,SAAS,CAAC,CAAA;AAE/B,EAAA,SAAA,CAAU,MAAM;AACd,IAAY,WAAA,CAAA,oBAAA,EAAuB,CAAA,IAAA,CAAK,CAAO,GAAA,KAAA;AAC7C,MAAe,cAAA,CAAA,GAAA,CAAI,iBAAiB,oBAAoB,CAAA;AAAA,KACzD,CAAA;AAAA,GACH,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,WAAc,GAAA,QAAA;AAClB,IAAA,IAAI,WAAa,EAAA;AACf,MAAM,MAAA,cAAA,GAAiB,eAAe,WAAW,CAAA;AACjD,MAAM,MAAA,OAAA,GAAU,eAAe,GAAG,CAAA;AAClC,MAAA,IACE,eAAe,IAAS,KAAA,OAAA,CAAQ,QAChC,cAAe,CAAA,SAAA,KAAc,QAAQ,SACrC,EAAA;AACA,QAAA,WAAA,GAAc,CAAG,EAAA,CAAA,CAAE,cAAc,CAAC,GAChC,SACI,GAAA,CAAA,EAAA,EAAK,CAAE,CAAA,oBAAoB,CAAE,CAAA,iBAAA,CAAkB,OAAO,CAAC,MACvD,EACN,CAAA,CAAA;AAAA,iBACS,SAAW,EAAA;AACpB,QAAA,WAAA,GAAc,EAAE,oBAAoB,CAAA;AAAA;AACtC,eACS,SAAW,EAAA;AACpB,MAAA,WAAA,GAAc,EAAE,oBAAoB,CAAA;AAAA;AAEtC,IAAA,OAAA,CAAQ,WAAW,CAAA;AAAA,KAClB,CAAC,GAAA,EAAK,WAAW,WAAa,EAAA,QAAA,EAAU,CAAC,CAAC,CAAA;AAE7C,EAAA,SAAA,CAAU,MAAM;AACd,IAAM,MAAA,IAAA,GAAA,CAAQ,QAAQ,EACnB,EAAA,OAAA,CAAQ,cAAc,EAAE,CAAA,CACxB,KAAM,CAAA,GAAG,CACT,CAAA,GAAA,CAAI,OAAK,CAAE,CAAA,CAAC,CAAC,CAAA,CACb,IAAK,CAAA,EAAE,EACP,SAAU,CAAA,CAAA,EAAG,CAAC,CAAA,CACd,WAAY,EAAA;AACf,IAAA,WAAA,CAAY,IAAI,CAAA;AAAA,GAClB,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,OAAO,EAAE,IAAA,EAAM,QAAU,EAAA,IAAA,EAAM,gBAAgB,IAAK,EAAA;AACtD;AAEa,MAAA,eAAA,GAAkB,CAC7B,MACG,KAAA;AACH,EAAA,MAAM,SAAY,GAAA,WAAA,IAAe,MAAS,GAAA,MAAA,CAAO,aAAa,KAAQ,GAAA,KAAA;AACtE,EAAM,MAAA,MAAA;AAAA;AAAA,IAEJ,QAAA,IAAY,SACR,MAAO,CAAA,MAAA,GACP,aAAa,MACb,GAAA,MAAA,CAAO,UACP,MAAO,CAAA;AAAA,GAAA;AACb,EAAO,OAAA,WAAA,CAAY,QAAQ,SAAS,CAAA;AACtC;;;;"}
1
+ {"version":3,"file":"useEntityAuthor.esm.js","sources":["../../src/hooks/useEntityAuthor.ts"],"sourcesContent":["import { parseEntityRef, UserEntity } from '@backstage/catalog-model';\nimport { CatalogApi } from '@backstage/catalog-client';\nimport DataLoader from 'dataloader';\nimport { identityApiRef, useApi } from '@backstage/core-plugin-api';\nimport {\n catalogApiRef,\n useEntityPresentation,\n} from '@backstage/plugin-catalog-react';\nimport React, { useEffect } from 'react';\nimport {\n AnswerResponse,\n CollectionResponse,\n PostResponse,\n UserResponse,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { useTranslation } from './useTranslation';\n\nconst userCache: Map<string, UserEntity> = new Map();\nconst dataLoaderFactory = (catalogApi: CatalogApi) =>\n new DataLoader(\n async (entityRefs: readonly string[]) => {\n const { items } = await catalogApi.getEntitiesByRefs({\n fields: [\n 'kind',\n 'metadata.name',\n 'metadata.namespace',\n 'spec.profile.displayName',\n 'spec.profile.picture',\n ],\n entityRefs: entityRefs as string[],\n });\n\n entityRefs.forEach((entityRef, index) => {\n userCache.set(entityRef, items[index] as UserEntity);\n });\n return items;\n },\n {\n name: 'EntityAuthorLoader',\n cacheMap: new Map(),\n maxBatchSize: 100,\n batchScheduleFn: callback => {\n setTimeout(callback, 50);\n },\n },\n );\n\nexport const useUserInfo = (entityRef: string, anonymous?: boolean) => {\n const catalogApi = useApi(catalogApiRef);\n const identityApi = useApi(identityApiRef);\n const { t } = useTranslation();\n const [name, setName] = React.useState<string>('');\n const [user, setUser] = React.useState<UserEntity | null>(null);\n const [initials, setInitials] = React.useState<string | null>(null);\n const [currentUser, setCurrentUser] = React.useState<string | null>(null);\n const ref = entityRef.startsWith('user:') ? entityRef : `user:${entityRef}`;\n\n const {\n primaryTitle: userName,\n secondaryTitle,\n Icon,\n } = useEntityPresentation(ref);\n\n useEffect(() => {\n if (anonymous) {\n return;\n }\n\n if (userCache.get(ref)) {\n setUser(userCache.get(ref) as UserEntity);\n return;\n }\n\n dataLoaderFactory(catalogApi)\n .load(ref)\n .then(data => {\n if (data) {\n setUser(data as UserEntity);\n } else {\n setUser(null);\n }\n })\n .catch(() => {\n setUser(null);\n });\n }, [catalogApi, ref, anonymous]);\n\n useEffect(() => {\n identityApi.getBackstageIdentity().then(res => {\n setCurrentUser(res.userEntityRef ?? 'user:default/guest');\n });\n }, [identityApi]);\n\n useEffect(() => {\n let displayName = userName;\n if (currentUser) {\n const currentUserRef = parseEntityRef(currentUser);\n const userRef = parseEntityRef(ref);\n if (\n currentUserRef.name === userRef.name &&\n currentUserRef.namespace === userRef.namespace\n ) {\n displayName = `${t('userLink.you')}${\n anonymous\n ? ` (${t('userLink.anonymous').toLocaleLowerCase('en-US')})`\n : ''\n }`;\n } else if (anonymous) {\n displayName = t('userLink.anonymous');\n }\n } else if (anonymous) {\n displayName = t('userLink.anonymous');\n }\n setName(displayName);\n }, [ref, anonymous, currentUser, userName, t]);\n\n useEffect(() => {\n const init = (name ?? '')\n .replace(/[^a-zA-Z]/g, '')\n .split(' ')\n .map(p => p[0])\n .join('')\n .substring(0, 2)\n .toUpperCase();\n setInitials(init);\n }, [name]);\n\n return { name, initials, user, secondaryTitle, Icon };\n};\n\nexport const useEntityAuthor = (\n entity: PostResponse | AnswerResponse | CollectionResponse | UserResponse,\n) => {\n const anonymous = 'anonymous' in entity ? entity.anonymous ?? false : false;\n const author =\n // eslint-disable-next-line no-nested-ternary\n 'author' in entity\n ? entity.author\n : 'userRef' in entity\n ? entity.userRef\n : entity.owner;\n return useUserInfo(author, anonymous);\n};\n"],"names":["React"],"mappings":"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"}
@@ -4,6 +4,9 @@ import { qetaApiRef } from '../api.esm.js';
4
4
  import { useTranslation } from './useTranslation.esm.js';
5
5
  import { useSignal } from '@backstage/plugin-signals-react';
6
6
 
7
+ function isPostResponse(resp) {
8
+ return "title" in resp;
9
+ }
7
10
  function useVoting(resp) {
8
11
  const [entity, setEntity] = React__default.useState(
9
12
  resp
@@ -16,10 +19,10 @@ function useVoting(resp) {
16
19
  const analytics = useAnalytics();
17
20
  const qetaApi = useApi(qetaApiRef);
18
21
  const { t } = useTranslation();
19
- const isQuestion = "title" in entity;
22
+ const isPost = isPostResponse(resp);
20
23
  const own = entity.own ?? false;
21
24
  const { lastSignal } = useSignal(
22
- isQuestion ? `qeta:question_${entity.id}` : `qeta:answer_${entity.id}`
25
+ isPost ? `qeta:post_${entity.id}` : `qeta:answer_${entity.id}`
23
26
  );
24
27
  useEffect(() => {
25
28
  if (entity) {
@@ -47,7 +50,7 @@ function useVoting(resp) {
47
50
  });
48
51
  };
49
52
  const voteUp = () => {
50
- if (isQuestion) {
53
+ if (isPost) {
51
54
  if (ownVote > 0) {
52
55
  deletePostVote(entity.id);
53
56
  return;
@@ -70,7 +73,7 @@ function useVoting(resp) {
70
73
  }
71
74
  };
72
75
  const voteDown = () => {
73
- if (isQuestion) {
76
+ if (isPost) {
74
77
  if (ownVote < 0) {
75
78
  deletePostVote(entity.id);
76
79
  return;
@@ -93,14 +96,14 @@ function useVoting(resp) {
93
96
  }
94
97
  };
95
98
  let correctTooltip = correctAnswer ? t("voteButtons.answer.markIncorrect") : t("voteButtons.answer.markCorrect");
96
- if (!entity?.own) {
99
+ if (own) {
97
100
  correctTooltip = correctAnswer ? t("voteButtons.answer.marked") : "";
98
101
  }
99
- let voteUpTooltip = isQuestion ? t("voteButtons.question.good") : t("voteButtons.answer.good");
102
+ let voteUpTooltip = isPost ? t("voteButtons.post.good", { type: resp.type }) : t("voteButtons.answer.good");
100
103
  if (own) {
101
- voteUpTooltip = isQuestion ? t("voteButtons.question.own") : t("voteButtons.answer.own");
104
+ voteUpTooltip = isPost ? t("voteButtons.post.own", { type: resp.type }) : t("voteButtons.answer.own");
102
105
  }
103
- let voteDownTooltip = isQuestion ? t("voteButtons.question.bad") : t("voteButtons.answer.bad");
106
+ let voteDownTooltip = isPost ? t("voteButtons.post.bad", { type: resp.type }) : t("voteButtons.answer.bad");
104
107
  if (own) {
105
108
  voteDownTooltip = voteUpTooltip;
106
109
  }