@drodil/backstage-plugin-qeta-react 3.10.1 → 3.10.3

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.
@@ -10,7 +10,6 @@ import { RequirePermission } from '@backstage/plugin-permission-react';
10
10
  import { PostAnonymouslyCheckbox } from '../PostAnonymouslyCheckbox/PostAnonymouslyCheckbox.esm.js';
11
11
  import { confirmNavigationIfEdited } from '../../utils/utils.esm.js';
12
12
  import { qetaApiRef } from '../../api.esm.js';
13
- import { useFormStyles } from '../../hooks/useFormStyles.esm.js';
14
13
  import 'react-use';
15
14
  import { useTranslation } from '../../hooks/useTranslation.esm.js';
16
15
  import 'react-use/lib/useAsync';
@@ -28,7 +27,6 @@ const AnswerForm = (props) => {
28
27
  const [images, setImages] = React__default.useState([]);
29
28
  const [edited, setEdited] = React__default.useState(false);
30
29
  const qetaApi = useApi(qetaApiRef);
31
- const styles = useFormStyles();
32
30
  const configApi = useApi(configApiRef);
33
31
  const allowAnonymouns = configApi.getOptionalBoolean("qeta.allowAnonymous");
34
32
  const { t } = useTranslation();
@@ -111,8 +109,7 @@ const AnswerForm = (props) => {
111
109
  onSubmit: handleSubmit(postAnswer),
112
110
  onChange: () => {
113
111
  setEdited(true);
114
- },
115
- className: `${styles.form} qetaAnswerForm`
112
+ }
116
113
  },
117
114
  /* @__PURE__ */ React__default.createElement(Typography, { variant: "h6" }, "Your answer"),
118
115
  error && /* @__PURE__ */ React__default.createElement(WarningPanel, { severity: "error", title: t("answerForm.errorPosting") }),
@@ -153,7 +150,7 @@ const AnswerForm = (props) => {
153
150
  variant: "outlined",
154
151
  type: "submit",
155
152
  color: "primary",
156
- className: `qetaAnswerFormPostBtn ${styles.postButton}`
153
+ sx: { marginBottom: 2, marginTop: 2 }
157
154
  },
158
155
  id ? t("answerForm.submit.existingAnswer") : t("answerForm.submit.newAnswer")
159
156
  )
@@ -1 +1 @@
1
- {"version":3,"file":"AnswerForm.esm.js","sources":["../../../src/components/AnswerForm/AnswerForm.tsx"],"sourcesContent":["import { WarningPanel } from '@backstage/core-components';\nimport Button from '@mui/material/Button';\nimport Typography from '@mui/material/Typography';\nimport React, { useCallback, useEffect } from 'react';\nimport { configApiRef, useAnalytics, useApi } from '@backstage/core-plugin-api';\nimport {\n AnswerRequest,\n AnswerResponse,\n PostResponse,\n qetaCreateAnswerPermission,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { Controller, useForm } from 'react-hook-form';\nimport { MarkdownEditor } from '../MarkdownEditor/MarkdownEditor';\nimport { RequirePermission } from '@backstage/plugin-permission-react';\nimport { PostAnonymouslyCheckbox } from '../PostAnonymouslyCheckbox/PostAnonymouslyCheckbox';\nimport { confirmNavigationIfEdited } from '../../utils/utils';\nimport { qetaApiRef } from '../../api';\nimport { useFormStyles } from '../../hooks/useFormStyles';\nimport { useTranslation } from '../../hooks';\n\ntype AnswerFormData = {\n postId: number;\n answer: string;\n images: number[];\n};\n\nconst getDefaultValues = (postId: number): AnswerFormData => {\n return { postId, answer: '', images: [] };\n};\n\nexport const AnswerForm = (props: {\n post: PostResponse;\n onPost: (answer: AnswerResponse) => void;\n id?: number;\n}) => {\n const { post, onPost, id } = props;\n const [values, setValues] = React.useState<AnswerFormData>(\n getDefaultValues(post.id),\n );\n const analytics = useAnalytics();\n const [error, setError] = React.useState(false);\n const [images, setImages] = React.useState<number[]>([]);\n const [edited, setEdited] = React.useState(false);\n const qetaApi = useApi(qetaApiRef);\n const styles = useFormStyles();\n const configApi = useApi(configApiRef);\n const allowAnonymouns = configApi.getOptionalBoolean('qeta.allowAnonymous');\n const { t } = useTranslation();\n\n const {\n handleSubmit,\n control,\n formState: { errors },\n reset,\n } = useForm<AnswerRequest>({\n values,\n defaultValues: getDefaultValues(post.id),\n });\n\n const postAnswer = (data: AnswerRequest) => {\n if (id) {\n qetaApi\n .updateAnswer(id, {\n postId: post.id,\n answer: data.answer,\n images,\n })\n .then(a => {\n if (!a || !('id' in a)) {\n setError(true);\n return;\n }\n setEdited(false);\n analytics.captureEvent('edit', 'answer');\n reset();\n onPost(a);\n })\n .catch(_e => setError(true));\n return;\n }\n // http://localhost:7007/api/qeta/attachments/36e551b1-3be7-479a-8942-b7018434e710\n qetaApi\n .postAnswer({\n postId: post.id,\n answer: data.answer,\n images,\n anonymous: data.anonymous,\n })\n .then(a => {\n if (!a || !('id' in a)) {\n setError(true);\n return;\n }\n setEdited(false);\n analytics.captureEvent('post', 'answer');\n reset();\n onPost(a);\n })\n .catch(_e => setError(true));\n };\n\n useEffect(() => {\n if (id) {\n qetaApi.getAnswer(post.id, id).then(a => {\n if ('content' in a) {\n setValues({ postId: post.id, answer: a.content, images: a.images });\n setImages(a.images);\n } else {\n setError(true);\n }\n });\n }\n }, [id, post, qetaApi]);\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 <RequirePermission\n permission={qetaCreateAnswerPermission}\n errorPage={<></>}\n >\n <form\n onSubmit={handleSubmit(postAnswer)}\n onChange={() => {\n setEdited(true);\n }}\n className={`${styles.form} qetaAnswerForm`}\n >\n <Typography variant=\"h6\">Your answer</Typography>\n {error && (\n <WarningPanel severity=\"error\" title={t('answerForm.errorPosting')} />\n )}\n <Controller\n control={control}\n defaultValue=\"\"\n rules={{\n required: true,\n }}\n render={({ field: { onChange, value } }) => (\n <MarkdownEditor\n value={value}\n onChange={onChange}\n height={200}\n error={'answer' in errors}\n config={configApi}\n placeholder={t('answerForm.contentInput.placeholder')}\n onImageUpload={onImageUpload}\n answerId={id ? Number(id) : undefined}\n />\n )}\n name=\"answer\"\n />\n {allowAnonymouns && !id && (\n <PostAnonymouslyCheckbox\n control={control}\n label={t('anonymousCheckbox.answerAnonymously')}\n />\n )}\n <Button\n variant=\"outlined\"\n type=\"submit\"\n color=\"primary\"\n className={`qetaAnswerFormPostBtn ${styles.postButton}`}\n >\n {id\n ? t('answerForm.submit.existingAnswer')\n : t('answerForm.submit.newAnswer')}\n </Button>\n </form>\n </RequirePermission>\n );\n};\n"],"names":["React"],"mappings":"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"}
1
+ {"version":3,"file":"AnswerForm.esm.js","sources":["../../../src/components/AnswerForm/AnswerForm.tsx"],"sourcesContent":["import { WarningPanel } from '@backstage/core-components';\nimport Button from '@mui/material/Button';\nimport Typography from '@mui/material/Typography';\nimport React, { useCallback, useEffect } from 'react';\nimport { configApiRef, useAnalytics, useApi } from '@backstage/core-plugin-api';\nimport {\n AnswerRequest,\n AnswerResponse,\n PostResponse,\n qetaCreateAnswerPermission,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { Controller, useForm } from 'react-hook-form';\nimport { MarkdownEditor } from '../MarkdownEditor/MarkdownEditor';\nimport { RequirePermission } from '@backstage/plugin-permission-react';\nimport { PostAnonymouslyCheckbox } from '../PostAnonymouslyCheckbox/PostAnonymouslyCheckbox';\nimport { confirmNavigationIfEdited } from '../../utils/utils';\nimport { qetaApiRef } from '../../api';\nimport { useTranslation } from '../../hooks';\n\ntype AnswerFormData = {\n postId: number;\n answer: string;\n images: number[];\n};\n\nconst getDefaultValues = (postId: number): AnswerFormData => {\n return { postId, answer: '', images: [] };\n};\n\nexport const AnswerForm = (props: {\n post: PostResponse;\n onPost: (answer: AnswerResponse) => void;\n id?: number;\n}) => {\n const { post, onPost, id } = props;\n const [values, setValues] = React.useState<AnswerFormData>(\n getDefaultValues(post.id),\n );\n const analytics = useAnalytics();\n const [error, setError] = React.useState(false);\n const [images, setImages] = React.useState<number[]>([]);\n const [edited, setEdited] = React.useState(false);\n const qetaApi = useApi(qetaApiRef);\n const configApi = useApi(configApiRef);\n const allowAnonymouns = configApi.getOptionalBoolean('qeta.allowAnonymous');\n const { t } = useTranslation();\n\n const {\n handleSubmit,\n control,\n formState: { errors },\n reset,\n } = useForm<AnswerRequest>({\n values,\n defaultValues: getDefaultValues(post.id),\n });\n\n const postAnswer = (data: AnswerRequest) => {\n if (id) {\n qetaApi\n .updateAnswer(id, {\n postId: post.id,\n answer: data.answer,\n images,\n })\n .then(a => {\n if (!a || !('id' in a)) {\n setError(true);\n return;\n }\n setEdited(false);\n analytics.captureEvent('edit', 'answer');\n reset();\n onPost(a);\n })\n .catch(_e => setError(true));\n return;\n }\n // http://localhost:7007/api/qeta/attachments/36e551b1-3be7-479a-8942-b7018434e710\n qetaApi\n .postAnswer({\n postId: post.id,\n answer: data.answer,\n images,\n anonymous: data.anonymous,\n })\n .then(a => {\n if (!a || !('id' in a)) {\n setError(true);\n return;\n }\n setEdited(false);\n analytics.captureEvent('post', 'answer');\n reset();\n onPost(a);\n })\n .catch(_e => setError(true));\n };\n\n useEffect(() => {\n if (id) {\n qetaApi.getAnswer(post.id, id).then(a => {\n if ('content' in a) {\n setValues({ postId: post.id, answer: a.content, images: a.images });\n setImages(a.images);\n } else {\n setError(true);\n }\n });\n }\n }, [id, post, qetaApi]);\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 <RequirePermission\n permission={qetaCreateAnswerPermission}\n errorPage={<></>}\n >\n <form\n onSubmit={handleSubmit(postAnswer)}\n onChange={() => {\n setEdited(true);\n }}\n >\n <Typography variant=\"h6\">Your answer</Typography>\n {error && (\n <WarningPanel severity=\"error\" title={t('answerForm.errorPosting')} />\n )}\n <Controller\n control={control}\n defaultValue=\"\"\n rules={{\n required: true,\n }}\n render={({ field: { onChange, value } }) => (\n <MarkdownEditor\n value={value}\n onChange={onChange}\n height={200}\n error={'answer' in errors}\n config={configApi}\n placeholder={t('answerForm.contentInput.placeholder')}\n onImageUpload={onImageUpload}\n answerId={id ? Number(id) : undefined}\n />\n )}\n name=\"answer\"\n />\n {allowAnonymouns && !id && (\n <PostAnonymouslyCheckbox\n control={control}\n label={t('anonymousCheckbox.answerAnonymously')}\n />\n )}\n <Button\n variant=\"outlined\"\n type=\"submit\"\n color=\"primary\"\n sx={{ marginBottom: 2, marginTop: 2 }}\n >\n {id\n ? t('answerForm.submit.existingAnswer')\n : t('answerForm.submit.newAnswer')}\n </Button>\n </form>\n </RequirePermission>\n );\n};\n"],"names":["React"],"mappings":"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"}
@@ -18,7 +18,6 @@ import { HeaderImageInput } from '../HeaderImageInput/HeaderImageInput.esm.js';
18
18
  import 'react-use';
19
19
  import { useTranslation } from '../../hooks/useTranslation.esm.js';
20
20
  import 'react-use/lib/useAsync';
21
- import { useFormStyles } from '../../hooks/useFormStyles.esm.js';
22
21
 
23
22
  const formToRequest = (form, images) => {
24
23
  return {
@@ -65,7 +64,6 @@ const CollectionForm = (props) => {
65
64
  const { t } = useTranslation();
66
65
  const qetaApi = useApi(qetaApiRef);
67
66
  const configApi = useApi(configApiRef);
68
- const styles = useFormStyles();
69
67
  const {
70
68
  register,
71
69
  handleSubmit,
@@ -139,8 +137,7 @@ const CollectionForm = (props) => {
139
137
  onSubmit: handleSubmit(postQuestion),
140
138
  onChange: () => {
141
139
  setEdited(true);
142
- },
143
- className: `${styles.form} qetaCollectionForm`
140
+ }
144
141
  },
145
142
  error && /* @__PURE__ */ React__default.createElement(Alert, { severity: "error" }, t("collectionForm.errorPosting")),
146
143
  /* @__PURE__ */ React__default.createElement(
@@ -214,7 +211,7 @@ const CollectionForm = (props) => {
214
211
  type: "submit",
215
212
  variant: "contained",
216
213
  disabled: posting,
217
- className: `qetaCollectionFormSubmitBtn ${styles.postButton}`
214
+ sx: { marginTop: 2, marginBottom: 2 }
218
215
  },
219
216
  id ? t("collectionForm.submit.existingCollection") : t("collectionForm.submit.newCollection")
220
217
  )
@@ -1 +1 @@
1
- {"version":3,"file":"CollectionForm.esm.js","sources":["../../../src/components/CollectionForm/CollectionForm.tsx"],"sourcesContent":["import {\n configApiRef,\n useAnalytics,\n useApi,\n useRouteRef,\n} from '@backstage/core-plugin-api';\nimport Grid from '@mui/material/Grid';\nimport Button from '@mui/material/Button';\nimport TextField from '@mui/material/TextField';\nimport Alert from '@mui/material/Alert';\nimport FormControl from '@mui/material/FormControl';\nimport FormHelperText from '@mui/material/FormHelperText';\nimport Select from '@mui/material/Select';\nimport MenuItem from '@mui/material/MenuItem';\nimport React, { useCallback, useEffect } from 'react';\nimport { Controller, useForm } from 'react-hook-form';\nimport { useNavigate } from 'react-router-dom';\nimport {\n CollectionRequest,\n CollectionResponse,\n QetaApi,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { MarkdownEditor } from '../MarkdownEditor/MarkdownEditor';\nimport { collectionRouteRef } from '../../routes';\nimport { confirmNavigationIfEdited } from '../../utils/utils';\nimport { qetaApiRef } from '../../api';\nimport { CollectionFormData } from './types';\nimport { HeaderImageInput } from '../HeaderImageInput/HeaderImageInput';\nimport { useTranslation } from '../../hooks';\nimport { useFormStyles } from '../../hooks/useFormStyles';\n\nconst formToRequest = (\n form: CollectionFormData,\n images: number[],\n): CollectionRequest => {\n return {\n ...form,\n images,\n };\n};\n\nexport type CollectionFormProps = {\n id?: string;\n onPost?: (collection: CollectionResponse) => void;\n};\n\nconst getDefaultValues = (): CollectionFormData => {\n return {\n title: '',\n readAccess: 'private',\n editAccess: 'private',\n images: [],\n };\n};\n\nconst getValues = async (\n api: QetaApi,\n id?: string,\n): Promise<{ form: CollectionFormData; collection?: CollectionResponse }> => {\n if (!id) {\n return { form: getDefaultValues() };\n }\n\n const collection = await api.getCollection(id);\n return {\n form: {\n title: collection.title,\n description: collection.description,\n editAccess: collection.editAccess,\n readAccess: collection.readAccess,\n headerImage: collection.headerImage,\n images: collection.images,\n },\n collection,\n };\n};\n\nexport const CollectionForm = (props: CollectionFormProps) => {\n const { id, onPost } = props;\n const collectionRoute = useRouteRef(collectionRouteRef);\n const navigate = useNavigate();\n const analytics = useAnalytics();\n const [posting, setPosting] = React.useState(false);\n const [values, setValues] = React.useState(getDefaultValues());\n const [error, setError] = React.useState(false);\n const [edited, setEdited] = React.useState(false);\n const [canModifyAccess, setCanModifyAccess] = React.useState(true);\n\n const [images, setImages] = React.useState<number[]>([]);\n const { t } = useTranslation();\n\n const qetaApi = useApi(qetaApiRef);\n const configApi = useApi(configApiRef);\n const styles = useFormStyles();\n const {\n register,\n handleSubmit,\n control,\n reset,\n formState: { errors },\n } = useForm<CollectionFormData>({\n values,\n defaultValues: getDefaultValues(),\n });\n\n const postQuestion = (data: CollectionFormData) => {\n setPosting(true);\n\n if (id) {\n qetaApi\n .updateCollection(Number(id), formToRequest(data, images))\n .then(q => {\n if (!q || !q.id) {\n setError(true);\n return;\n }\n setEdited(false);\n reset();\n analytics.captureEvent('edit', 'collection');\n if (onPost) {\n onPost(q);\n } else {\n navigate(collectionRoute({ id: q.id.toString(10) }));\n }\n })\n .catch(_e => {\n setError(true);\n setPosting(false);\n });\n return;\n }\n qetaApi\n .createCollection(formToRequest(data, images))\n .then(q => {\n if (!q || !q.id) {\n setError(true);\n return;\n }\n setEdited(false);\n analytics.captureEvent('post', 'collection');\n reset();\n navigate(collectionRoute({ id: q.id.toString(10) }));\n })\n .catch(_e => {\n setError(true);\n setPosting(false);\n });\n };\n\n useEffect(() => {\n if (id) {\n getValues(qetaApi, id).then(data => {\n setValues(data.form);\n setCanModifyAccess(data.collection?.canDelete ?? false);\n setImages(data.form.images);\n });\n }\n }, [qetaApi, id]);\n\n useEffect(() => {\n reset(values);\n }, [values, reset]);\n\n useEffect(() => {\n return confirmNavigationIfEdited(edited);\n }, [edited]);\n\n const onImageUpload = useCallback(\n (imageId: number) => {\n setImages(prevImages => [...prevImages, imageId]);\n },\n [setImages],\n );\n\n return (\n <form\n onSubmit={handleSubmit(postQuestion)}\n onChange={() => {\n setEdited(true);\n }}\n className={`${styles.form} qetaCollectionForm`}\n >\n {error && (\n <Alert severity=\"error\">{t('collectionForm.errorPosting')}</Alert>\n )}\n <HeaderImageInput\n url={values.headerImage}\n onChange={(url?: string) =>\n setValues(v => ({ ...v, headerImage: url }))\n }\n onImageUpload={onImageUpload}\n collectionId={id ? Number(id) : undefined}\n />\n <TextField\n label={t('collectionForm.titleInput.label')}\n className=\"qetaCollectionFormTitle\"\n required\n fullWidth\n error={'title' in errors}\n margin=\"normal\"\n variant=\"outlined\"\n helperText={t('collectionForm.titleInput.helperText')}\n {\n // @ts-ignore\n ...register('title', { required: true, maxLength: 255 })\n }\n />\n\n <Controller\n control={control}\n rules={{\n required: false,\n }}\n render={({ field: { onChange, value } }) => (\n <MarkdownEditor\n value={value ?? ''}\n onChange={onChange}\n height={400}\n error={'content' in errors}\n placeholder={t('collectionForm.descriptionInput.placeholder')}\n config={configApi}\n onImageUpload={onImageUpload}\n collectionId={id ? Number(id) : undefined}\n />\n )}\n name=\"description\"\n />\n {canModifyAccess && (\n <Grid container style={{ marginTop: '1rem', marginBottom: '1rem' }}>\n <Grid item>\n <Controller\n control={control}\n rules={{ required: true }}\n render={({ field: { onChange, value } }) => (\n <FormControl>\n <FormHelperText>Read access</FormHelperText>\n <Select variant=\"outlined\" onChange={onChange} value={value}>\n <MenuItem value=\"private\">Only you</MenuItem>\n <MenuItem value=\"public\">Anyone</MenuItem>\n </Select>\n </FormControl>\n )}\n name=\"readAccess\"\n />\n </Grid>\n <Grid item>\n <Controller\n control={control}\n rules={{ required: true }}\n render={({ field: { onChange, value } }) => (\n <FormControl>\n <FormHelperText>Edit access</FormHelperText>\n <Select variant=\"outlined\" onChange={onChange} value={value}>\n <MenuItem value=\"private\">Only you</MenuItem>\n <MenuItem value=\"public\">Anyone</MenuItem>\n </Select>\n </FormControl>\n )}\n name=\"editAccess\"\n />\n </Grid>\n </Grid>\n )}\n <Button\n color=\"primary\"\n type=\"submit\"\n variant=\"contained\"\n disabled={posting}\n className={`qetaCollectionFormSubmitBtn ${styles.postButton}`}\n >\n {id\n ? t('collectionForm.submit.existingCollection')\n : t('collectionForm.submit.newCollection')}\n </Button>\n </form>\n );\n};\n"],"names":["React"],"mappings":"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"}
1
+ {"version":3,"file":"CollectionForm.esm.js","sources":["../../../src/components/CollectionForm/CollectionForm.tsx"],"sourcesContent":["import {\n configApiRef,\n useAnalytics,\n useApi,\n useRouteRef,\n} from '@backstage/core-plugin-api';\nimport Grid from '@mui/material/Grid';\nimport Button from '@mui/material/Button';\nimport TextField from '@mui/material/TextField';\nimport Alert from '@mui/material/Alert';\nimport FormControl from '@mui/material/FormControl';\nimport FormHelperText from '@mui/material/FormHelperText';\nimport Select from '@mui/material/Select';\nimport MenuItem from '@mui/material/MenuItem';\nimport React, { useCallback, useEffect } from 'react';\nimport { Controller, useForm } from 'react-hook-form';\nimport { useNavigate } from 'react-router-dom';\nimport {\n CollectionRequest,\n CollectionResponse,\n QetaApi,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { MarkdownEditor } from '../MarkdownEditor/MarkdownEditor';\nimport { collectionRouteRef } from '../../routes';\nimport { confirmNavigationIfEdited } from '../../utils/utils';\nimport { qetaApiRef } from '../../api';\nimport { CollectionFormData } from './types';\nimport { HeaderImageInput } from '../HeaderImageInput/HeaderImageInput';\nimport { useTranslation } from '../../hooks';\n\nconst formToRequest = (\n form: CollectionFormData,\n images: number[],\n): CollectionRequest => {\n return {\n ...form,\n images,\n };\n};\n\nexport type CollectionFormProps = {\n id?: string;\n onPost?: (collection: CollectionResponse) => void;\n};\n\nconst getDefaultValues = (): CollectionFormData => {\n return {\n title: '',\n readAccess: 'private',\n editAccess: 'private',\n images: [],\n };\n};\n\nconst getValues = async (\n api: QetaApi,\n id?: string,\n): Promise<{ form: CollectionFormData; collection?: CollectionResponse }> => {\n if (!id) {\n return { form: getDefaultValues() };\n }\n\n const collection = await api.getCollection(id);\n return {\n form: {\n title: collection.title,\n description: collection.description,\n editAccess: collection.editAccess,\n readAccess: collection.readAccess,\n headerImage: collection.headerImage,\n images: collection.images,\n },\n collection,\n };\n};\n\nexport const CollectionForm = (props: CollectionFormProps) => {\n const { id, onPost } = props;\n const collectionRoute = useRouteRef(collectionRouteRef);\n const navigate = useNavigate();\n const analytics = useAnalytics();\n const [posting, setPosting] = React.useState(false);\n const [values, setValues] = React.useState(getDefaultValues());\n const [error, setError] = React.useState(false);\n const [edited, setEdited] = React.useState(false);\n const [canModifyAccess, setCanModifyAccess] = React.useState(true);\n\n const [images, setImages] = React.useState<number[]>([]);\n const { t } = useTranslation();\n\n const qetaApi = useApi(qetaApiRef);\n const configApi = useApi(configApiRef);\n const {\n register,\n handleSubmit,\n control,\n reset,\n formState: { errors },\n } = useForm<CollectionFormData>({\n values,\n defaultValues: getDefaultValues(),\n });\n\n const postQuestion = (data: CollectionFormData) => {\n setPosting(true);\n\n if (id) {\n qetaApi\n .updateCollection(Number(id), formToRequest(data, images))\n .then(q => {\n if (!q || !q.id) {\n setError(true);\n return;\n }\n setEdited(false);\n reset();\n analytics.captureEvent('edit', 'collection');\n if (onPost) {\n onPost(q);\n } else {\n navigate(collectionRoute({ id: q.id.toString(10) }));\n }\n })\n .catch(_e => {\n setError(true);\n setPosting(false);\n });\n return;\n }\n qetaApi\n .createCollection(formToRequest(data, images))\n .then(q => {\n if (!q || !q.id) {\n setError(true);\n return;\n }\n setEdited(false);\n analytics.captureEvent('post', 'collection');\n reset();\n navigate(collectionRoute({ id: q.id.toString(10) }));\n })\n .catch(_e => {\n setError(true);\n setPosting(false);\n });\n };\n\n useEffect(() => {\n if (id) {\n getValues(qetaApi, id).then(data => {\n setValues(data.form);\n setCanModifyAccess(data.collection?.canDelete ?? false);\n setImages(data.form.images);\n });\n }\n }, [qetaApi, id]);\n\n useEffect(() => {\n reset(values);\n }, [values, reset]);\n\n useEffect(() => {\n return confirmNavigationIfEdited(edited);\n }, [edited]);\n\n const onImageUpload = useCallback(\n (imageId: number) => {\n setImages(prevImages => [...prevImages, imageId]);\n },\n [setImages],\n );\n\n return (\n <form\n onSubmit={handleSubmit(postQuestion)}\n onChange={() => {\n setEdited(true);\n }}\n >\n {error && (\n <Alert severity=\"error\">{t('collectionForm.errorPosting')}</Alert>\n )}\n <HeaderImageInput\n url={values.headerImage}\n onChange={(url?: string) =>\n setValues(v => ({ ...v, headerImage: url }))\n }\n onImageUpload={onImageUpload}\n collectionId={id ? Number(id) : undefined}\n />\n <TextField\n label={t('collectionForm.titleInput.label')}\n className=\"qetaCollectionFormTitle\"\n required\n fullWidth\n error={'title' in errors}\n margin=\"normal\"\n variant=\"outlined\"\n helperText={t('collectionForm.titleInput.helperText')}\n {\n // @ts-ignore\n ...register('title', { required: true, maxLength: 255 })\n }\n />\n\n <Controller\n control={control}\n rules={{\n required: false,\n }}\n render={({ field: { onChange, value } }) => (\n <MarkdownEditor\n value={value ?? ''}\n onChange={onChange}\n height={400}\n error={'content' in errors}\n placeholder={t('collectionForm.descriptionInput.placeholder')}\n config={configApi}\n onImageUpload={onImageUpload}\n collectionId={id ? Number(id) : undefined}\n />\n )}\n name=\"description\"\n />\n {canModifyAccess && (\n <Grid container style={{ marginTop: '1rem', marginBottom: '1rem' }}>\n <Grid item>\n <Controller\n control={control}\n rules={{ required: true }}\n render={({ field: { onChange, value } }) => (\n <FormControl>\n <FormHelperText>Read access</FormHelperText>\n <Select variant=\"outlined\" onChange={onChange} value={value}>\n <MenuItem value=\"private\">Only you</MenuItem>\n <MenuItem value=\"public\">Anyone</MenuItem>\n </Select>\n </FormControl>\n )}\n name=\"readAccess\"\n />\n </Grid>\n <Grid item>\n <Controller\n control={control}\n rules={{ required: true }}\n render={({ field: { onChange, value } }) => (\n <FormControl>\n <FormHelperText>Edit access</FormHelperText>\n <Select variant=\"outlined\" onChange={onChange} value={value}>\n <MenuItem value=\"private\">Only you</MenuItem>\n <MenuItem value=\"public\">Anyone</MenuItem>\n </Select>\n </FormControl>\n )}\n name=\"editAccess\"\n />\n </Grid>\n </Grid>\n )}\n <Button\n color=\"primary\"\n type=\"submit\"\n variant=\"contained\"\n disabled={posting}\n sx={{ marginTop: 2, marginBottom: 2 }}\n >\n {id\n ? t('collectionForm.submit.existingCollection')\n : t('collectionForm.submit.newCollection')}\n </Button>\n </form>\n );\n};\n"],"names":["React"],"mappings":"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"}
@@ -9,15 +9,22 @@ import { qetaApiRef } from '../../api.esm.js';
9
9
  import 'react-use';
10
10
  import { useTranslation } from '../../hooks/useTranslation.esm.js';
11
11
  import 'react-use/lib/useAsync';
12
- import { useFormStyles } from '../../hooks/useFormStyles.esm.js';
12
+ import { styled } from '@mui/system';
13
13
 
14
+ const HeaderImage = styled("img")(({ theme }) => ({
15
+ marginBottom: "1rem",
16
+ marginTop: "1rem",
17
+ height: "250px",
18
+ objectFit: "cover",
19
+ width: "100%",
20
+ border: `1px solid ${theme.palette.background.paper}`
21
+ }));
14
22
  const HeaderImageInput = (props) => {
15
23
  const { url, onChange, onImageUpload, postId, collectionId } = props;
16
24
  const configApi = useApi(configApiRef);
17
25
  const qetaApi = useApi(qetaApiRef);
18
26
  const errorApi = useApi(errorApiRef);
19
27
  const { t } = useTranslation();
20
- const styles = useFormStyles();
21
28
  const isUploadDisabled = configApi.getOptionalBoolean("qeta.storage.disabled") || false;
22
29
  return /* @__PURE__ */ React__default.createElement(Grid, { container: true, alignItems: "center" }, /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: isUploadDisabled ? 12 : 10 }, /* @__PURE__ */ React__default.createElement(
23
30
  TextField,
@@ -55,7 +62,7 @@ const HeaderImageInput = (props) => {
55
62
  }
56
63
  }
57
64
  }
58
- ), /* @__PURE__ */ React__default.createElement("label", { htmlFor: "headerImage" }, /* @__PURE__ */ React__default.createElement(Button, { variant: "contained", color: "primary", component: "span" }, t("fileInput.uploadHeaderImage")))), url && /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React__default.createElement(Typography, { variant: "subtitle1" }, t("fileInput.preview")), /* @__PURE__ */ React__default.createElement("img", { className: styles.headerImage, src: url, alt: "header" })));
65
+ ), /* @__PURE__ */ React__default.createElement("label", { htmlFor: "headerImage" }, /* @__PURE__ */ React__default.createElement(Button, { variant: "contained", color: "primary", component: "span" }, t("fileInput.uploadHeaderImage")))), url && /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React__default.createElement(Typography, { variant: "subtitle1" }, t("fileInput.preview")), /* @__PURE__ */ React__default.createElement(HeaderImage, { src: url, alt: "header" })));
59
66
  };
60
67
 
61
68
  export { HeaderImageInput };
@@ -1 +1 @@
1
- {"version":3,"file":"HeaderImageInput.esm.js","sources":["../../../src/components/HeaderImageInput/HeaderImageInput.tsx"],"sourcesContent":["import Typography from '@mui/material/Typography';\nimport Grid from '@mui/material/Grid';\nimport Button from '@mui/material/Button';\nimport TextField from '@mui/material/TextField';\nimport { imageUpload } from '../../utils/utils';\nimport React from 'react';\nimport { configApiRef, errorApiRef, useApi } from '@backstage/core-plugin-api';\nimport { qetaApiRef } from '../../api';\nimport { useTranslation } from '../../hooks';\nimport { useFormStyles } from '../../hooks/useFormStyles';\n\nexport const HeaderImageInput = (props: {\n url?: string;\n onChange: (url?: string) => void;\n onImageUpload: (imageId: number) => void;\n postId?: number;\n collectionId?: number;\n}) => {\n const { url, onChange, onImageUpload, postId, collectionId } = props;\n const configApi = useApi(configApiRef);\n const qetaApi = useApi(qetaApiRef);\n const errorApi = useApi(errorApiRef);\n const { t } = useTranslation();\n const styles = useFormStyles();\n\n const isUploadDisabled =\n configApi.getOptionalBoolean('qeta.storage.disabled') || false;\n\n return (\n <Grid container alignItems=\"center\">\n <Grid item xs={isUploadDisabled ? 12 : 10}>\n <TextField\n value={url ?? ''}\n fullWidth\n label={t('fileInput.label')}\n placeholder=\"https://\"\n margin=\"normal\"\n variant=\"outlined\"\n onChange={e => onChange(e.target.value)}\n helperText={t('fileInput.helperText')}\n />\n </Grid>\n {!isUploadDisabled && (\n <Grid item xs={2}>\n <input\n accept=\"image/*\"\n style={{ display: 'none' }}\n id=\"headerImage\"\n type=\"file\"\n onChange={async event => {\n if (!event.target.files || event.target.files.length === 0) {\n return;\n }\n const buffer = await event.target.files[0].arrayBuffer();\n\n const uri = await imageUpload({\n qetaApi,\n errorApi,\n onImageUpload,\n postId,\n collectionId,\n })(buffer).next();\n if (typeof uri.value === 'string') {\n onChange(uri.value);\n }\n }}\n />\n <label htmlFor=\"headerImage\">\n <Button variant=\"contained\" color=\"primary\" component=\"span\">\n {t('fileInput.uploadHeaderImage')}\n </Button>\n </label>\n </Grid>\n )}\n {url && (\n <Grid item xs={12}>\n <Typography variant=\"subtitle1\">{t('fileInput.preview')}</Typography>\n <img className={styles.headerImage} src={url} alt=\"header\" />\n </Grid>\n )}\n </Grid>\n );\n};\n"],"names":["React"],"mappings":"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"}
1
+ {"version":3,"file":"HeaderImageInput.esm.js","sources":["../../../src/components/HeaderImageInput/HeaderImageInput.tsx"],"sourcesContent":["import Typography from '@mui/material/Typography';\nimport Grid from '@mui/material/Grid';\nimport Button from '@mui/material/Button';\nimport TextField from '@mui/material/TextField';\nimport { imageUpload } from '../../utils/utils';\nimport React from 'react';\nimport { configApiRef, errorApiRef, useApi } from '@backstage/core-plugin-api';\nimport { qetaApiRef } from '../../api';\nimport { useTranslation } from '../../hooks';\nimport { styled } from '@mui/system';\n\nconst HeaderImage = styled('img')(({ theme }) => ({\n marginBottom: '1rem',\n marginTop: '1rem',\n height: '250px',\n objectFit: 'cover',\n width: '100%',\n border: `1px solid ${theme.palette.background.paper}`,\n}));\n\nexport const HeaderImageInput = (props: {\n url?: string;\n onChange: (url?: string) => void;\n onImageUpload: (imageId: number) => void;\n postId?: number;\n collectionId?: number;\n}) => {\n const { url, onChange, onImageUpload, postId, collectionId } = props;\n const configApi = useApi(configApiRef);\n const qetaApi = useApi(qetaApiRef);\n const errorApi = useApi(errorApiRef);\n const { t } = useTranslation();\n\n const isUploadDisabled =\n configApi.getOptionalBoolean('qeta.storage.disabled') || false;\n\n return (\n <Grid container alignItems=\"center\">\n <Grid item xs={isUploadDisabled ? 12 : 10}>\n <TextField\n value={url ?? ''}\n fullWidth\n label={t('fileInput.label')}\n placeholder=\"https://\"\n margin=\"normal\"\n variant=\"outlined\"\n onChange={e => onChange(e.target.value)}\n helperText={t('fileInput.helperText')}\n />\n </Grid>\n {!isUploadDisabled && (\n <Grid item xs={2}>\n <input\n accept=\"image/*\"\n style={{ display: 'none' }}\n id=\"headerImage\"\n type=\"file\"\n onChange={async event => {\n if (!event.target.files || event.target.files.length === 0) {\n return;\n }\n const buffer = await event.target.files[0].arrayBuffer();\n\n const uri = await imageUpload({\n qetaApi,\n errorApi,\n onImageUpload,\n postId,\n collectionId,\n })(buffer).next();\n if (typeof uri.value === 'string') {\n onChange(uri.value);\n }\n }}\n />\n <label htmlFor=\"headerImage\">\n <Button variant=\"contained\" color=\"primary\" component=\"span\">\n {t('fileInput.uploadHeaderImage')}\n </Button>\n </label>\n </Grid>\n )}\n {url && (\n <Grid item xs={12}>\n <Typography variant=\"subtitle1\">{t('fileInput.preview')}</Typography>\n <HeaderImage src={url} alt=\"header\" />\n </Grid>\n )}\n </Grid>\n );\n};\n"],"names":["React"],"mappings":"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"}
@@ -9,17 +9,10 @@ import { MarkdownRenderer } from '../MarkdownRenderer/MarkdownRenderer.esm.js';
9
9
  import { imageUpload } from '../../utils/utils.esm.js';
10
10
  import { catalogApiRef } from '@backstage/plugin-catalog-react';
11
11
  import { stringifyEntityRef } from '@backstage/catalog-model';
12
- import { useTheme, css as css$1 } from '@mui/material/styles';
13
- import { css } from '@emotion/css';
12
+ import { useTheme } from '@mui/material/styles';
13
+ import { ClassNames } from '@emotion/react';
14
14
 
15
15
  const styles = {
16
- tooltipLabel: (theme) => ({
17
- color: theme.palette.text.primary
18
- }),
19
- tooltipWrapper: (theme) => ({
20
- backgroundColor: `${theme.palette.background.default} !important`,
21
- border: "none !important"
22
- }),
23
16
  markdownEditor: (theme) => ({
24
17
  backgroundColor: "initial",
25
18
  color: theme.palette.text.primary,
@@ -53,8 +46,8 @@ const styles = {
53
46
  outline: "none"
54
47
  },
55
48
  "& .image-tip": {
56
- color: theme.palette.text.primary,
57
- backgroundColor: "initial"
49
+ color: `${theme.palette.text.primary} !important`,
50
+ backgroundColor: "initial !important"
58
51
  }
59
52
  }),
60
53
  markdownEditorError: (theme) => ({
@@ -149,22 +142,19 @@ const MarkdownEditor = (props) => {
149
142
  };
150
143
  const isUploadDisabled = config?.getOptionalBoolean("qeta.storage.disabled") || disableAttachments || false;
151
144
  const theme = useTheme();
152
- const markdownEditorClass = css(css$1(styles.markdownEditor(theme)));
153
- const markdownEditorErrorClass = css(
154
- css$1(styles.markdownEditorError(theme))
155
- );
156
- const hideClass = css(css$1(styles.hide));
157
- const suggestionsDropdownClass = css(
158
- css$1({ position: "absolute", ...styles.suggestionsDropdown(theme) })
159
- );
160
- return /* @__PURE__ */ React__default.createElement(
145
+ return /* @__PURE__ */ React__default.createElement(ClassNames, null, ({ cx, css }) => /* @__PURE__ */ React__default.createElement(
161
146
  ReactMde,
162
147
  {
163
148
  classes: {
164
- reactMde: markdownEditorClass,
165
- textArea: error ? markdownEditorErrorClass : void 0,
166
- toolbar: disableToolbar ? hideClass : void 0,
167
- suggestionsDropdown: suggestionsDropdownClass
149
+ reactMde: cx(css(styles.markdownEditor(theme))),
150
+ textArea: error ? cx(css(styles.markdownEditorError(theme))) : void 0,
151
+ toolbar: disableToolbar ? cx(css(styles.hide)) : void 0,
152
+ suggestionsDropdown: cx(
153
+ css({
154
+ position: "absolute",
155
+ ...styles.suggestionsDropdown(theme)
156
+ })
157
+ )
168
158
  },
169
159
  disablePreview,
170
160
  value,
@@ -184,7 +174,13 @@ const MarkdownEditor = (props) => {
184
174
  loadSuggestions,
185
175
  suggestionsAutoplace: true,
186
176
  generateMarkdownPreview: (content) => Promise.resolve(
187
- /* @__PURE__ */ React__default.createElement(MarkdownRenderer, { content, sx: styles.markdownPreview })
177
+ /* @__PURE__ */ React__default.createElement(
178
+ MarkdownRenderer,
179
+ {
180
+ content,
181
+ sx: styles.markdownPreview
182
+ }
183
+ )
188
184
  ),
189
185
  paste: isUploadDisabled ? void 0 : {
190
186
  saveImage: imageUpload({
@@ -197,7 +193,7 @@ const MarkdownEditor = (props) => {
197
193
  })
198
194
  }
199
195
  }
200
- );
196
+ ));
201
197
  };
202
198
 
203
199
  export { MarkdownEditor };
@@ -1 +1 @@
1
- {"version":3,"file":"MarkdownEditor.esm.js","sources":["../../../src/components/MarkdownEditor/MarkdownEditor.tsx"],"sourcesContent":["/* eslint-disable no-console */\nimport React from 'react';\nimport ReactMde from 'react-mde';\n\nimport { Config } from '@backstage/config';\nimport 'react-mde/lib/styles/css/react-mde.css';\nimport 'react-mde/lib/styles/css/react-mde-editor.css';\nimport 'react-mde/lib/styles/css/react-mde-toolbar.css';\nimport { errorApiRef, useApi } from '@backstage/core-plugin-api';\nimport { qetaApiRef } from '../../api';\nimport { MarkdownRenderer } from '../MarkdownRenderer';\nimport { imageUpload } from '../../utils/utils';\nimport { catalogApiRef } from '@backstage/plugin-catalog-react';\nimport { stringifyEntityRef, UserEntity } from '@backstage/catalog-model';\n\nimport { css, Theme, useTheme } from '@mui/material/styles';\nimport { css as emotionCss } from '@emotion/css';\n\nconst styles = {\n tooltipLabel: (theme: Theme) => ({\n color: theme.palette.text.primary,\n }),\n tooltipWrapper: (theme: Theme) => ({\n backgroundColor: `${theme.palette.background.default} !important`,\n border: 'none !important',\n }),\n markdownEditor: (theme: Theme) => ({\n backgroundColor: 'initial',\n color: theme.palette.text.primary,\n border: `1px solid ${theme.palette.action.disabled}`,\n borderRadius: theme.shape.borderRadius,\n '&:hover': {\n borderColor: theme.palette.action.active,\n },\n '&:focus-within': {\n borderColor: theme.palette.primary.main,\n },\n '& .mde-header': {\n backgroundColor: 'initial',\n color: theme.palette.text.primary,\n borderBottom: `1px solid ${theme.palette.action.selected}`,\n '& .mde-tabs button, .mde-header-item > button': {\n color: `${theme.palette.text.primary} !important`,\n },\n },\n '& .mde-preview-content': {\n padding: '10px',\n },\n '& .mde-text, .mde-preview': {\n fontSize: theme.typography.body1.fontSize,\n fontFamily: theme.typography.body1.fontFamily,\n lineHeight: theme.typography.body1.lineHeight,\n },\n '& .mde-text': {\n backgroundColor: 'initial',\n color: theme.palette.text.primary,\n outline: 'none',\n },\n '& .image-tip': {\n color: theme.palette.text.primary,\n backgroundColor: 'initial',\n },\n }),\n markdownEditorError: (theme: Theme) => ({\n border: `1px solid ${theme.palette.error.main} !important`,\n }),\n markdownPreview: {\n '& *': {\n wordBreak: 'break-word',\n },\n '&.inline': {\n display: 'inline-block',\n },\n '& > :first-child': {\n marginTop: '0px !important',\n },\n '& > :last-child': {\n marginBottom: '0px !important',\n },\n },\n suggestionsDropdown: (theme: Theme) => ({\n minWidth: '180px',\n margin: '20px 0 0',\n listStyle: 'none',\n padding: '0',\n cursor: 'pointer',\n background: theme.palette.background.paper,\n border: `1px solid ${theme.palette.divider}`,\n borderRadius: theme.shape.borderRadius,\n '& li': {\n width: '100%',\n padding: '0.5rem',\n '&:hover': {\n backgroundColor: theme.palette.action.hover,\n },\n },\n }),\n hide: {\n display: 'none',\n },\n};\n\nexport type MarkdownEditorProps = {\n config?: Config;\n value: string;\n onChange: (value: string) => void;\n height: number;\n error?: boolean;\n placeholder?: string;\n onImageUpload?: (imageId: number) => void;\n disableToolbar?: boolean;\n disableAttachments?: boolean;\n disablePreview?: boolean;\n postId?: number;\n answerId?: number;\n collectionId?: number;\n autoFocus?: boolean;\n required?: boolean;\n};\n\nexport const MarkdownEditor = (props: MarkdownEditorProps) => {\n const {\n config,\n value,\n onChange,\n height,\n error,\n placeholder,\n disableAttachments,\n disableToolbar,\n disablePreview,\n postId,\n answerId,\n collectionId,\n autoFocus,\n required = true,\n } = props;\n const [selectedTab, setSelectedTab] = React.useState<'write' | 'preview'>(\n 'write',\n );\n const errorApi = useApi(errorApiRef);\n const qetaApi = useApi(qetaApiRef);\n const catalogApi = useApi(catalogApiRef);\n\n const loadSuggestions = async (text: string) => {\n if (!text) {\n return [{ preview: 'No suggestions', value: '' }];\n }\n const users = await catalogApi.queryEntities({\n filter: { kind: 'User' },\n limit: 5,\n fullTextFilter: {\n term: text,\n fields: [\n 'metadata.name',\n 'metadata.title',\n 'spec.profile.displayName',\n 'spec.profile.email',\n ],\n },\n });\n\n if (users.items.length === 0) {\n return [{ preview: 'No suggestions', value: '' }];\n }\n\n return users.items.map(entity => {\n const user = entity as UserEntity;\n const preview =\n user.metadata.title ??\n user.spec?.profile?.displayName ??\n user.metadata.name;\n return {\n preview,\n value: `@${stringifyEntityRef(user)}`,\n };\n });\n };\n\n const isUploadDisabled =\n config?.getOptionalBoolean('qeta.storage.disabled') ||\n disableAttachments ||\n false;\n\n const theme = useTheme();\n const markdownEditorClass = emotionCss(css(styles.markdownEditor(theme)));\n const markdownEditorErrorClass = emotionCss(\n css(styles.markdownEditorError(theme)),\n );\n const hideClass = emotionCss(css(styles.hide));\n const suggestionsDropdownClass = emotionCss(\n css({ position: 'absolute', ...styles.suggestionsDropdown(theme) }),\n );\n\n return (\n <ReactMde\n classes={{\n reactMde: markdownEditorClass,\n textArea: error ? markdownEditorErrorClass : undefined,\n toolbar: disableToolbar ? hideClass : undefined,\n suggestionsDropdown: suggestionsDropdownClass,\n }}\n disablePreview={disablePreview}\n value={value}\n onChange={onChange}\n selectedTab={selectedTab}\n onTabChange={setSelectedTab}\n minEditorHeight={height}\n minPreviewHeight={height - 10}\n childProps={{\n textArea: {\n required,\n placeholder,\n autoFocus,\n },\n }}\n suggestionTriggerCharacters={['@']}\n loadSuggestions={loadSuggestions}\n suggestionsAutoplace\n generateMarkdownPreview={content =>\n Promise.resolve(\n <MarkdownRenderer content={content} sx={styles.markdownPreview} />,\n )\n }\n paste={\n isUploadDisabled\n ? undefined\n : {\n saveImage: imageUpload({\n qetaApi,\n errorApi,\n onImageUpload: props.onImageUpload,\n postId,\n answerId,\n collectionId,\n }),\n }\n }\n />\n );\n};\n"],"names":["React","emotionCss","css"],"mappings":"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"}
1
+ {"version":3,"file":"MarkdownEditor.esm.js","sources":["../../../src/components/MarkdownEditor/MarkdownEditor.tsx"],"sourcesContent":["/* eslint-disable no-console */\nimport React from 'react';\nimport ReactMde from 'react-mde';\n\nimport { Config } from '@backstage/config';\nimport 'react-mde/lib/styles/css/react-mde.css';\nimport 'react-mde/lib/styles/css/react-mde-editor.css';\nimport 'react-mde/lib/styles/css/react-mde-toolbar.css';\nimport { errorApiRef, useApi } from '@backstage/core-plugin-api';\nimport { qetaApiRef } from '../../api';\nimport { MarkdownRenderer } from '../MarkdownRenderer';\nimport { imageUpload } from '../../utils/utils';\nimport { catalogApiRef } from '@backstage/plugin-catalog-react';\nimport { stringifyEntityRef, UserEntity } from '@backstage/catalog-model';\nimport { Theme, useTheme } from '@mui/material/styles';\nimport { ClassNames } from '@emotion/react';\n\nconst styles = {\n markdownEditor: (theme: Theme) => ({\n backgroundColor: 'initial',\n color: theme.palette.text.primary,\n border: `1px solid ${theme.palette.action.disabled}`,\n borderRadius: theme.shape.borderRadius,\n '&:hover': {\n borderColor: theme.palette.action.active,\n },\n '&:focus-within': {\n borderColor: theme.palette.primary.main,\n },\n '& .mde-header': {\n backgroundColor: 'initial',\n color: theme.palette.text.primary,\n borderBottom: `1px solid ${theme.palette.action.selected}`,\n '& .mde-tabs button, .mde-header-item > button': {\n color: `${theme.palette.text.primary} !important`,\n },\n },\n '& .mde-preview-content': {\n padding: '10px',\n },\n '& .mde-text, .mde-preview': {\n fontSize: theme.typography.body1.fontSize,\n fontFamily: theme.typography.body1.fontFamily,\n lineHeight: theme.typography.body1.lineHeight,\n },\n '& .mde-text': {\n backgroundColor: 'initial',\n color: theme.palette.text.primary,\n outline: 'none',\n },\n '& .image-tip': {\n color: `${theme.palette.text.primary} !important`,\n backgroundColor: 'initial !important',\n },\n }),\n markdownEditorError: (theme: Theme) => ({\n border: `1px solid ${theme.palette.error.main} !important`,\n }),\n markdownPreview: {\n '& *': {\n wordBreak: 'break-word',\n },\n '&.inline': {\n display: 'inline-block',\n },\n '& > :first-child': {\n marginTop: '0px !important',\n },\n '& > :last-child': {\n marginBottom: '0px !important',\n },\n },\n suggestionsDropdown: (theme: Theme) => ({\n minWidth: '180px',\n margin: '20px 0 0',\n listStyle: 'none',\n padding: '0',\n cursor: 'pointer',\n background: theme.palette.background.paper,\n border: `1px solid ${theme.palette.divider}`,\n borderRadius: theme.shape.borderRadius,\n '& li': {\n width: '100%',\n padding: '0.5rem',\n '&:hover': {\n backgroundColor: theme.palette.action.hover,\n },\n },\n }),\n hide: {\n display: 'none',\n },\n};\n\nexport type MarkdownEditorProps = {\n config?: Config;\n value: string;\n onChange: (value: string) => void;\n height: number;\n error?: boolean;\n placeholder?: string;\n onImageUpload?: (imageId: number) => void;\n disableToolbar?: boolean;\n disableAttachments?: boolean;\n disablePreview?: boolean;\n postId?: number;\n answerId?: number;\n collectionId?: number;\n autoFocus?: boolean;\n required?: boolean;\n};\n\nexport const MarkdownEditor = (props: MarkdownEditorProps) => {\n const {\n config,\n value,\n onChange,\n height,\n error,\n placeholder,\n disableAttachments,\n disableToolbar,\n disablePreview,\n postId,\n answerId,\n collectionId,\n autoFocus,\n required = true,\n } = props;\n const [selectedTab, setSelectedTab] = React.useState<'write' | 'preview'>(\n 'write',\n );\n const errorApi = useApi(errorApiRef);\n const qetaApi = useApi(qetaApiRef);\n const catalogApi = useApi(catalogApiRef);\n\n const loadSuggestions = async (text: string) => {\n if (!text) {\n return [{ preview: 'No suggestions', value: '' }];\n }\n const users = await catalogApi.queryEntities({\n filter: { kind: 'User' },\n limit: 5,\n fullTextFilter: {\n term: text,\n fields: [\n 'metadata.name',\n 'metadata.title',\n 'spec.profile.displayName',\n 'spec.profile.email',\n ],\n },\n });\n\n if (users.items.length === 0) {\n return [{ preview: 'No suggestions', value: '' }];\n }\n\n return users.items.map(entity => {\n const user = entity as UserEntity;\n const preview =\n user.metadata.title ??\n user.spec?.profile?.displayName ??\n user.metadata.name;\n return {\n preview,\n value: `@${stringifyEntityRef(user)}`,\n };\n });\n };\n\n const isUploadDisabled =\n config?.getOptionalBoolean('qeta.storage.disabled') ||\n disableAttachments ||\n false;\n\n const theme = useTheme();\n\n return (\n <ClassNames>\n {({ cx, css }) => (\n <ReactMde\n classes={{\n reactMde: cx(css(styles.markdownEditor(theme))),\n textArea: error\n ? cx(css(styles.markdownEditorError(theme)))\n : undefined,\n toolbar: disableToolbar ? cx(css(styles.hide)) : undefined,\n suggestionsDropdown: cx(\n css({\n position: 'absolute',\n ...styles.suggestionsDropdown(theme),\n }),\n ),\n }}\n disablePreview={disablePreview}\n value={value}\n onChange={onChange}\n selectedTab={selectedTab}\n onTabChange={setSelectedTab}\n minEditorHeight={height}\n minPreviewHeight={height - 10}\n childProps={{\n textArea: {\n required,\n placeholder,\n autoFocus,\n },\n }}\n suggestionTriggerCharacters={['@']}\n loadSuggestions={loadSuggestions}\n suggestionsAutoplace\n generateMarkdownPreview={content =>\n Promise.resolve(\n <MarkdownRenderer\n content={content}\n sx={styles.markdownPreview}\n />,\n )\n }\n paste={\n isUploadDisabled\n ? undefined\n : {\n saveImage: imageUpload({\n qetaApi,\n errorApi,\n onImageUpload: props.onImageUpload,\n postId,\n answerId,\n collectionId,\n }),\n }\n }\n />\n )}\n </ClassNames>\n );\n};\n"],"names":["React"],"mappings":"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"}
@@ -16,7 +16,6 @@ import { PostAnonymouslyCheckbox } from '../PostAnonymouslyCheckbox/PostAnonymou
16
16
  import { confirmNavigationIfEdited } from '../../utils/utils.esm.js';
17
17
  import { qetaApiRef } from '../../api.esm.js';
18
18
  import { HeaderImageInput } from '../HeaderImageInput/HeaderImageInput.esm.js';
19
- import { useFormStyles } from '../../hooks/useFormStyles.esm.js';
20
19
  import 'react-use';
21
20
  import { useTranslation } from '../../hooks/useTranslation.esm.js';
22
21
  import 'react-use/lib/useAsync';
@@ -90,7 +89,6 @@ const PostForm = (props) => {
90
89
  const catalogApi = useApi(catalogApiRef);
91
90
  const configApi = useApi(configApiRef);
92
91
  const allowAnonymouns = configApi.getOptionalBoolean("qeta.allowAnonymous");
93
- const styles = useFormStyles();
94
92
  const {
95
93
  register,
96
94
  handleSubmit,
@@ -217,8 +215,7 @@ const PostForm = (props) => {
217
215
  onChange: () => {
218
216
  setEdited(true);
219
217
  onFormChange?.(control._formValues);
220
- },
221
- className: `${styles.form} qetaAskForm`
218
+ }
222
219
  },
223
220
  error && /* @__PURE__ */ React__default.createElement(Alert, { severity: "error" }, t("postForm.errorPosting", { type })),
224
221
  type === "article" && /* @__PURE__ */ React__default.createElement(
@@ -308,7 +305,7 @@ const PostForm = (props) => {
308
305
  type: "submit",
309
306
  variant: "contained",
310
307
  disabled: posting,
311
- className: `qetaAskFormSubmitBtn ${styles.postButton}`
308
+ sx: { marginTop: 2, marginBottom: 2 }
312
309
  },
313
310
  id ? t("postForm.submit.existingPost") : t("postForm.submit.newPost")
314
311
  )
@@ -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 from '@mui/material/Button';\nimport TextField from '@mui/material/TextField';\nimport Alert from '@mui/material/Alert';\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 { useFormStyles } from '../../hooks/useFormStyles';\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 styles = useFormStyles();\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 className={`${styles.form} qetaAskForm`}\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 className={`qetaAskFormSubmitBtn ${styles.postButton}`}\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 from '@mui/material/Button';\nimport TextField from '@mui/material/TextField';\nimport Alert from '@mui/material/Alert';\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 sx={{ marginTop: 2, marginBottom: 2 }}\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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"}
@@ -12,18 +12,8 @@ import 'react-use';
12
12
  import { useTranslation } from '../../hooks/useTranslation.esm.js';
13
13
  import 'react-use/lib/useAsync';
14
14
  import { isGlobalStat, isUserStat } from './util.esm.js';
15
- import { useTheme, css as css$1 } from '@mui/material/styles';
16
- import { css } from '@emotion/css';
15
+ import { useTheme } from '@mui/material/styles';
17
16
 
18
- const styles = {
19
- tooltipLabel: (theme) => ({
20
- color: theme.palette.text.primary
21
- }),
22
- tooltipWrapper: (theme) => ({
23
- backgroundColor: `${theme.palette.background.default} !important`,
24
- border: "none !important"
25
- })
26
- };
27
17
  const DEFAULT_STATS = [
28
18
  {
29
19
  dataKey: "totalViews",
@@ -126,18 +116,19 @@ const useChartState = (data) => {
126
116
  },
127
117
  [stats]
128
118
  );
129
- return { styles, isDark, toggleStat, stats, isDisabled };
119
+ return { isDark, toggleStat, stats, isDisabled };
130
120
  };
131
121
  const StatsBarChart = (props) => {
132
122
  const { isDark, stats, toggleStat, isDisabled } = useChartState(props.data);
133
123
  const theme = useTheme();
134
- const labelClass = css(css$1(styles.tooltipLabel(theme)));
135
- const wrapperClass = css(css$1(styles.tooltipWrapper(theme)));
136
124
  return /* @__PURE__ */ React__default.createElement(ResponsiveContainer, { height: 400, width: "100%" }, /* @__PURE__ */ React__default.createElement(BarChart, { data: props.data, width: 900, height: 300 }, /* @__PURE__ */ React__default.createElement(
137
125
  Tooltip,
138
126
  {
139
- labelClassName: labelClass,
140
- wrapperClassName: wrapperClass,
127
+ labelStyle: { color: theme.palette.text.primary },
128
+ contentStyle: {
129
+ backgroundColor: `${theme.palette.background.paper} !important`,
130
+ border: "none !important"
131
+ },
141
132
  cursor: { fill: isDark ? "#4f4f4f" : "#f5f5f5" }
142
133
  }
143
134
  ), stats.map((stat) => /* @__PURE__ */ React__default.createElement(
@@ -185,13 +176,14 @@ const StatsBarChart = (props) => {
185
176
  const StatsLineChart = (props) => {
186
177
  const { isDark, stats, toggleStat, isDisabled } = useChartState(props.data);
187
178
  const theme = useTheme();
188
- const labelClass = css(css$1(styles.tooltipLabel(theme)));
189
- const wrapperClass = css(css$1(styles.tooltipWrapper(theme)));
190
179
  return /* @__PURE__ */ React__default.createElement(ResponsiveContainer, { height: 400, width: "100%" }, /* @__PURE__ */ React__default.createElement(LineChart, { data: props.data, width: 900, height: 300 }, /* @__PURE__ */ React__default.createElement(
191
180
  Tooltip,
192
181
  {
193
- labelClassName: labelClass,
194
- wrapperClassName: wrapperClass,
182
+ labelStyle: { color: theme.palette.text.primary },
183
+ contentStyle: {
184
+ backgroundColor: `${theme.palette.background.paper} !important`,
185
+ border: "none !important"
186
+ },
195
187
  cursor: { fill: isDark ? "#4f4f4f" : "#f5f5f5" }
196
188
  }
197
189
  ), stats.map((stat) => /* @__PURE__ */ React__default.createElement(
@@ -1 +1 @@
1
- {"version":3,"file":"StatsChart.esm.js","sources":["../../../src/components/StatsChart/StatsChart.tsx"],"sourcesContent":["import React, { useCallback } from 'react';\nimport { Stat } from '@drodil/backstage-plugin-qeta-common';\nimport {\n Bar,\n BarChart,\n CartesianGrid,\n Legend,\n Line,\n LineChart,\n ResponsiveContainer,\n Tooltip as ChartTooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport IconButton from '@mui/material/IconButton';\nimport ButtonGroup from '@mui/material/ButtonGroup';\nimport Typography from '@mui/material/Typography';\nimport ShowChartIcon from '@mui/icons-material/ShowChart';\nimport BarChartIcon from '@mui/icons-material/BarChart';\nimport { useIsDarkTheme } from '../../hooks/useIsDarkTheme';\nimport { useTranslation } from '../../hooks';\nimport { isGlobalStat, isUserStat } from './util';\nimport { css, Theme, useTheme } from '@mui/material/styles';\nimport { css as emotionCss } from '@emotion/css';\n\nconst styles = {\n tooltipLabel: (theme: Theme) => ({\n color: theme.palette.text.primary,\n }),\n tooltipWrapper: (theme: Theme) => ({\n backgroundColor: `${theme.palette.background.default} !important`,\n border: 'none !important',\n }),\n};\n\ntype StatType = {\n dataKey:\n | 'totalViews'\n | 'totalQuestions'\n | 'totalAnswers'\n | 'totalComments'\n | 'totalVotes'\n | 'totalUsers'\n | 'totalTags'\n | 'totalArticles'\n | 'totalFollowers';\n name: string;\n color: string;\n enabled: boolean;\n globalStat: boolean;\n userStat: boolean;\n};\n\nconst DEFAULT_STATS: StatType[] = [\n {\n dataKey: 'totalViews',\n name: 'Total views',\n color: '#8884d8',\n enabled: false,\n globalStat: true,\n userStat: true,\n },\n {\n dataKey: 'totalQuestions',\n name: 'Total questions',\n color: '#82ca9d',\n enabled: true,\n globalStat: true,\n userStat: true,\n },\n {\n dataKey: 'totalAnswers',\n name: 'Total answers',\n color: '#ff7300',\n enabled: true,\n globalStat: true,\n userStat: true,\n },\n {\n dataKey: 'totalComments',\n name: 'Total comments',\n color: '#739973',\n enabled: true,\n globalStat: true,\n userStat: true,\n },\n {\n dataKey: 'totalVotes',\n name: 'Total votes',\n color: '#d88884',\n enabled: true,\n globalStat: true,\n userStat: true,\n },\n {\n dataKey: 'totalUsers',\n name: 'Total users',\n color: '#ff0000',\n enabled: true,\n globalStat: true,\n userStat: false,\n },\n {\n dataKey: 'totalTags',\n name: 'Total tags',\n color: '#ff00ff',\n enabled: true,\n globalStat: true,\n userStat: false,\n },\n {\n dataKey: 'totalArticles',\n name: 'Total articles',\n color: '#00ff00',\n enabled: true,\n globalStat: true,\n userStat: true,\n },\n {\n dataKey: 'totalFollowers',\n name: 'Total followers',\n color: '#ff0000',\n enabled: true,\n globalStat: false,\n userStat: true,\n },\n];\n\nconst useChartState = (data: Stat[]) => {\n const isDark = useIsDarkTheme();\n const globalStats = isGlobalStat(data[0]);\n const isUserStats = isUserStat(data[0]);\n const [stats, setStats] = React.useState<StatType[]>(\n DEFAULT_STATS.filter(stat => {\n if (globalStats && !stat.globalStat) {\n return false;\n }\n return !(isUserStats && !stat.userStat);\n }),\n );\n\n const toggleStat = useCallback(\n (name: string) => {\n setStats(prev =>\n prev.map(stat =>\n stat.name === name ? { ...stat, enabled: !stat.enabled } : stat,\n ),\n );\n },\n [setStats],\n );\n const isDisabled = useCallback(\n (name: string) => {\n return stats.find(stat => stat.name === name)?.enabled === false;\n },\n [stats],\n );\n\n return { styles, isDark, toggleStat, stats, isDisabled };\n};\n\nconst StatsBarChart = (props: { data: Stat[] }) => {\n const { isDark, stats, toggleStat, isDisabled } = useChartState(props.data);\n const theme = useTheme();\n const labelClass = emotionCss(css(styles.tooltipLabel(theme)));\n const wrapperClass = emotionCss(css(styles.tooltipWrapper(theme)));\n return (\n <ResponsiveContainer height={400} width=\"100%\">\n <BarChart data={props.data} width={900} height={300}>\n <ChartTooltip\n labelClassName={labelClass}\n wrapperClassName={wrapperClass}\n cursor={{ fill: isDark ? '#4f4f4f' : '#f5f5f5' }}\n />\n {stats.map(stat => (\n <Bar\n key={stat.dataKey}\n dataKey={stat.enabled ? stat.dataKey : 'hidden'}\n name={stat.name}\n fill={stat.color}\n />\n ))}\n <CartesianGrid stroke=\"#ccc\" />\n <XAxis\n dataKey=\"date\"\n tickFormatter={(tick: string) => new Date(tick).toDateString()}\n axisLine={{ stroke: isDark ? 'white' : 'black' }}\n tickLine={{ stroke: isDark ? 'white' : 'black' }}\n tick={{ fill: isDark ? 'white' : 'black' }}\n />\n <YAxis\n allowDecimals={false}\n axisLine={{ stroke: isDark ? 'white' : 'black' }}\n tickLine={{ stroke: isDark ? 'white' : 'black' }}\n tick={{ fill: isDark ? 'white' : 'black' }}\n />\n <Legend\n verticalAlign=\"top\"\n height={36}\n wrapperStyle={{ cursor: 'pointer' }}\n formatter={data => {\n return isDisabled(data) ? `[ ] ${data}` : `[x] ${data}`;\n }}\n onClick={data => {\n if (data.value) {\n toggleStat(data.value as string);\n }\n }}\n />\n </BarChart>\n </ResponsiveContainer>\n );\n};\n\nconst StatsLineChart = (props: { data: Stat[] }) => {\n const { isDark, stats, toggleStat, isDisabled } = useChartState(props.data);\n const theme = useTheme();\n const labelClass = emotionCss(css(styles.tooltipLabel(theme)));\n const wrapperClass = emotionCss(css(styles.tooltipWrapper(theme)));\n return (\n <ResponsiveContainer height={400} width=\"100%\">\n <LineChart data={props.data} width={900} height={300}>\n <ChartTooltip\n labelClassName={labelClass}\n wrapperClassName={wrapperClass}\n cursor={{ fill: isDark ? '#4f4f4f' : '#f5f5f5' }}\n />\n {stats.map(stat => (\n <Line\n key={stat.dataKey}\n dataKey={stat.enabled ? stat.dataKey : 'hidden'}\n name={stat.name}\n stroke={stat.color}\n />\n ))}\n <CartesianGrid stroke=\"#ccc\" />\n <XAxis\n dataKey=\"date\"\n tickFormatter={(tick: string) => new Date(tick).toDateString()}\n axisLine={{ stroke: isDark ? 'white' : 'black' }}\n tickLine={{ stroke: isDark ? 'white' : 'black' }}\n tick={{ fill: isDark ? 'white' : 'black' }}\n />\n <YAxis\n allowDecimals={false}\n axisLine={{ stroke: isDark ? 'white' : 'black' }}\n tickLine={{ stroke: isDark ? 'white' : 'black' }}\n tick={{ fill: isDark ? 'white' : 'black' }}\n />\n <Legend\n verticalAlign=\"top\"\n height={36}\n wrapperStyle={{ cursor: 'pointer' }}\n formatter={data => {\n return isDisabled(data) ? `[ ] ${data}` : `[x] ${data}`;\n }}\n onClick={data => {\n if (data.value) {\n toggleStat(data.value as string);\n }\n }}\n />\n </LineChart>\n </ResponsiveContainer>\n );\n};\n\nexport const StatsChart = (props: { data: Stat[] }) => {\n const { t } = useTranslation();\n const [chart, setChart] = React.useState<'line' | 'bar'>('line');\n\n if (!props.data || props.data.length === 0) {\n return <Typography variant=\"subtitle1\">{t('stats.noStats')}</Typography>;\n }\n const data = props.data\n .sort((a, b) => new Date(a.date).getTime() - new Date(b.date).getTime())\n .map(d => ({ ...d, hidden: 0 }));\n\n return (\n <>\n {chart === 'line' ? (\n <StatsLineChart data={data} />\n ) : (\n <StatsBarChart data={data} />\n )}\n <ButtonGroup aria-label=\"Chart type\" style={{ float: 'right' }}>\n <IconButton\n aria-label=\"Line chart\"\n onClick={() => {\n setChart('line');\n }}\n size=\"large\"\n >\n <ShowChartIcon />\n </IconButton>\n <IconButton\n aria-label=\"Bar chart\"\n onClick={() => {\n setChart('bar');\n }}\n size=\"large\"\n >\n <BarChartIcon />\n </IconButton>\n </ButtonGroup>\n </>\n );\n};\n"],"names":["React","emotionCss","css","ChartTooltip"],"mappings":"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"}
1
+ {"version":3,"file":"StatsChart.esm.js","sources":["../../../src/components/StatsChart/StatsChart.tsx"],"sourcesContent":["import React, { useCallback } from 'react';\nimport { Stat } from '@drodil/backstage-plugin-qeta-common';\nimport {\n Bar,\n BarChart,\n CartesianGrid,\n Legend,\n Line,\n LineChart,\n ResponsiveContainer,\n Tooltip as ChartTooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport IconButton from '@mui/material/IconButton';\nimport ButtonGroup from '@mui/material/ButtonGroup';\nimport Typography from '@mui/material/Typography';\nimport ShowChartIcon from '@mui/icons-material/ShowChart';\nimport BarChartIcon from '@mui/icons-material/BarChart';\nimport { useIsDarkTheme } from '../../hooks/useIsDarkTheme';\nimport { useTranslation } from '../../hooks';\nimport { isGlobalStat, isUserStat } from './util';\nimport { useTheme } from '@mui/material/styles';\n\ntype StatType = {\n dataKey:\n | 'totalViews'\n | 'totalQuestions'\n | 'totalAnswers'\n | 'totalComments'\n | 'totalVotes'\n | 'totalUsers'\n | 'totalTags'\n | 'totalArticles'\n | 'totalFollowers';\n name: string;\n color: string;\n enabled: boolean;\n globalStat: boolean;\n userStat: boolean;\n};\n\nconst DEFAULT_STATS: StatType[] = [\n {\n dataKey: 'totalViews',\n name: 'Total views',\n color: '#8884d8',\n enabled: false,\n globalStat: true,\n userStat: true,\n },\n {\n dataKey: 'totalQuestions',\n name: 'Total questions',\n color: '#82ca9d',\n enabled: true,\n globalStat: true,\n userStat: true,\n },\n {\n dataKey: 'totalAnswers',\n name: 'Total answers',\n color: '#ff7300',\n enabled: true,\n globalStat: true,\n userStat: true,\n },\n {\n dataKey: 'totalComments',\n name: 'Total comments',\n color: '#739973',\n enabled: true,\n globalStat: true,\n userStat: true,\n },\n {\n dataKey: 'totalVotes',\n name: 'Total votes',\n color: '#d88884',\n enabled: true,\n globalStat: true,\n userStat: true,\n },\n {\n dataKey: 'totalUsers',\n name: 'Total users',\n color: '#ff0000',\n enabled: true,\n globalStat: true,\n userStat: false,\n },\n {\n dataKey: 'totalTags',\n name: 'Total tags',\n color: '#ff00ff',\n enabled: true,\n globalStat: true,\n userStat: false,\n },\n {\n dataKey: 'totalArticles',\n name: 'Total articles',\n color: '#00ff00',\n enabled: true,\n globalStat: true,\n userStat: true,\n },\n {\n dataKey: 'totalFollowers',\n name: 'Total followers',\n color: '#ff0000',\n enabled: true,\n globalStat: false,\n userStat: true,\n },\n];\n\nconst useChartState = (data: Stat[]) => {\n const isDark = useIsDarkTheme();\n const globalStats = isGlobalStat(data[0]);\n const isUserStats = isUserStat(data[0]);\n const [stats, setStats] = React.useState<StatType[]>(\n DEFAULT_STATS.filter(stat => {\n if (globalStats && !stat.globalStat) {\n return false;\n }\n return !(isUserStats && !stat.userStat);\n }),\n );\n\n const toggleStat = useCallback(\n (name: string) => {\n setStats(prev =>\n prev.map(stat =>\n stat.name === name ? { ...stat, enabled: !stat.enabled } : stat,\n ),\n );\n },\n [setStats],\n );\n const isDisabled = useCallback(\n (name: string) => {\n return stats.find(stat => stat.name === name)?.enabled === false;\n },\n [stats],\n );\n\n return { isDark, toggleStat, stats, isDisabled };\n};\n\nconst StatsBarChart = (props: { data: Stat[] }) => {\n const { isDark, stats, toggleStat, isDisabled } = useChartState(props.data);\n const theme = useTheme();\n return (\n <ResponsiveContainer height={400} width=\"100%\">\n <BarChart data={props.data} width={900} height={300}>\n <ChartTooltip\n labelStyle={{ color: theme.palette.text.primary }}\n contentStyle={{\n backgroundColor: `${theme.palette.background.paper} !important`,\n border: 'none !important',\n }}\n cursor={{ fill: isDark ? '#4f4f4f' : '#f5f5f5' }}\n />\n {stats.map(stat => (\n <Bar\n key={stat.dataKey}\n dataKey={stat.enabled ? stat.dataKey : 'hidden'}\n name={stat.name}\n fill={stat.color}\n />\n ))}\n <CartesianGrid stroke=\"#ccc\" />\n <XAxis\n dataKey=\"date\"\n tickFormatter={(tick: string) => new Date(tick).toDateString()}\n axisLine={{ stroke: isDark ? 'white' : 'black' }}\n tickLine={{ stroke: isDark ? 'white' : 'black' }}\n tick={{ fill: isDark ? 'white' : 'black' }}\n />\n <YAxis\n allowDecimals={false}\n axisLine={{ stroke: isDark ? 'white' : 'black' }}\n tickLine={{ stroke: isDark ? 'white' : 'black' }}\n tick={{ fill: isDark ? 'white' : 'black' }}\n />\n <Legend\n verticalAlign=\"top\"\n height={36}\n wrapperStyle={{ cursor: 'pointer' }}\n formatter={data => {\n return isDisabled(data) ? `[ ] ${data}` : `[x] ${data}`;\n }}\n onClick={data => {\n if (data.value) {\n toggleStat(data.value as string);\n }\n }}\n />\n </BarChart>\n </ResponsiveContainer>\n );\n};\n\nconst StatsLineChart = (props: { data: Stat[] }) => {\n const { isDark, stats, toggleStat, isDisabled } = useChartState(props.data);\n const theme = useTheme();\n return (\n <ResponsiveContainer height={400} width=\"100%\">\n <LineChart data={props.data} width={900} height={300}>\n <ChartTooltip\n labelStyle={{ color: theme.palette.text.primary }}\n contentStyle={{\n backgroundColor: `${theme.palette.background.paper} !important`,\n border: 'none !important',\n }}\n cursor={{ fill: isDark ? '#4f4f4f' : '#f5f5f5' }}\n />\n {stats.map(stat => (\n <Line\n key={stat.dataKey}\n dataKey={stat.enabled ? stat.dataKey : 'hidden'}\n name={stat.name}\n stroke={stat.color}\n />\n ))}\n <CartesianGrid stroke=\"#ccc\" />\n <XAxis\n dataKey=\"date\"\n tickFormatter={(tick: string) => new Date(tick).toDateString()}\n axisLine={{ stroke: isDark ? 'white' : 'black' }}\n tickLine={{ stroke: isDark ? 'white' : 'black' }}\n tick={{ fill: isDark ? 'white' : 'black' }}\n />\n <YAxis\n allowDecimals={false}\n axisLine={{ stroke: isDark ? 'white' : 'black' }}\n tickLine={{ stroke: isDark ? 'white' : 'black' }}\n tick={{ fill: isDark ? 'white' : 'black' }}\n />\n <Legend\n verticalAlign=\"top\"\n height={36}\n wrapperStyle={{ cursor: 'pointer' }}\n formatter={data => {\n return isDisabled(data) ? `[ ] ${data}` : `[x] ${data}`;\n }}\n onClick={data => {\n if (data.value) {\n toggleStat(data.value as string);\n }\n }}\n />\n </LineChart>\n </ResponsiveContainer>\n );\n};\n\nexport const StatsChart = (props: { data: Stat[] }) => {\n const { t } = useTranslation();\n const [chart, setChart] = React.useState<'line' | 'bar'>('line');\n\n if (!props.data || props.data.length === 0) {\n return <Typography variant=\"subtitle1\">{t('stats.noStats')}</Typography>;\n }\n const data = props.data\n .sort((a, b) => new Date(a.date).getTime() - new Date(b.date).getTime())\n .map(d => ({ ...d, hidden: 0 }));\n\n return (\n <>\n {chart === 'line' ? (\n <StatsLineChart data={data} />\n ) : (\n <StatsBarChart data={data} />\n )}\n <ButtonGroup aria-label=\"Chart type\" style={{ float: 'right' }}>\n <IconButton\n aria-label=\"Line chart\"\n onClick={() => {\n setChart('line');\n }}\n size=\"large\"\n >\n <ShowChartIcon />\n </IconButton>\n <IconButton\n aria-label=\"Bar chart\"\n onClick={() => {\n setChart('bar');\n }}\n size=\"large\"\n >\n <BarChartIcon />\n </IconButton>\n </ButtonGroup>\n </>\n );\n};\n"],"names":["React","ChartTooltip"],"mappings":"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"}
@@ -15,7 +15,6 @@ import Alert from '@mui/material/Alert';
15
15
  import { MarkdownEditor } from '../MarkdownEditor/MarkdownEditor.esm.js';
16
16
  import { TagInput } from '../PostForm/TagInput.esm.js';
17
17
  import { EntitiesInput } from '../PostForm/EntitiesInput.esm.js';
18
- import { useFormStyles } from '../../hooks/useFormStyles.esm.js';
19
18
 
20
19
  const formToRequest = (form) => {
21
20
  return {
@@ -60,7 +59,6 @@ const TemplateForm = (props) => {
60
59
  const catalogApi = useApi(catalogApiRef);
61
60
  const qetaApi = useApi(qetaApiRef);
62
61
  const [error, setError] = React__default.useState(false);
63
- const styles = useFormStyles();
64
62
  const [values, setValues] = React__default.useState(getDefaultValues());
65
63
  const { isModerator } = useIsModerator();
66
64
  const { t } = useTranslation();
@@ -107,107 +105,93 @@ const TemplateForm = (props) => {
107
105
  if (!isModerator) {
108
106
  return null;
109
107
  }
110
- return /* @__PURE__ */ React__default.createElement(
111
- "form",
108
+ return /* @__PURE__ */ React__default.createElement("form", { onSubmit: handleSubmit(postTemplate) }, error && /* @__PURE__ */ React__default.createElement(Alert, { severity: "error" }, t("templateList.errorPosting")), /* @__PURE__ */ React__default.createElement(
109
+ TextField,
112
110
  {
113
- onSubmit: handleSubmit(postTemplate),
114
- className: `${styles.form} qetaTemplateForm`
111
+ label: t("templateList.titleInput.label"),
112
+ className: "qetaTemplateFormTitle",
113
+ required: true,
114
+ fullWidth: true,
115
+ error: "title" in errors,
116
+ margin: "normal",
117
+ variant: "outlined",
118
+ helperText: t("templateList.titleInput.helperText"),
119
+ // @ts-ignore
120
+ ...register("title", { required: true, maxLength: 255 })
121
+ }
122
+ ), /* @__PURE__ */ React__default.createElement(
123
+ TextField,
124
+ {
125
+ label: t("templateList.descriptionInput.label"),
126
+ className: "qetaTemplateFormDescription",
127
+ required: true,
128
+ fullWidth: true,
129
+ error: "description" in errors,
130
+ margin: "normal",
131
+ variant: "outlined",
132
+ helperText: t("templateList.descriptionInput.helperText"),
133
+ // @ts-ignore
134
+ ...register("description", { required: true, maxLength: 255 })
135
+ }
136
+ ), /* @__PURE__ */ React__default.createElement(
137
+ TextField,
138
+ {
139
+ label: t("templateList.questionTitleInput.label"),
140
+ className: "qetaTemplateFormQuestionTitle",
141
+ fullWidth: true,
142
+ error: "questionTitle" in errors,
143
+ margin: "normal",
144
+ variant: "outlined",
145
+ helperText: t("templateList.questionTitleInput.helperText"),
146
+ // @ts-ignore
147
+ ...register("questionTitle", { maxLength: 255 })
148
+ }
149
+ ), /* @__PURE__ */ React__default.createElement(
150
+ Controller,
151
+ {
152
+ control,
153
+ rules: {},
154
+ render: ({ field: { onChange, value } }) => /* @__PURE__ */ React__default.createElement(
155
+ MarkdownEditor,
156
+ {
157
+ value: value ?? "",
158
+ disableAttachments: true,
159
+ onChange,
160
+ height: 400,
161
+ error: "questionContent" in errors,
162
+ placeholder: t("templateList.questionContentInput.placeholder")
163
+ }
164
+ ),
165
+ name: "questionContent"
166
+ }
167
+ ), /* @__PURE__ */ React__default.createElement(
168
+ Controller,
169
+ {
170
+ control,
171
+ render: ({
172
+ field: { onChange, value },
173
+ fieldState: { error: tagError }
174
+ }) => /* @__PURE__ */ React__default.createElement(TagInput, { value, onChange, error: tagError }),
175
+ name: "tags"
176
+ }
177
+ ), /* @__PURE__ */ React__default.createElement(
178
+ Controller,
179
+ {
180
+ control,
181
+ render: ({ field: { onChange, value } }) => /* @__PURE__ */ React__default.createElement(EntitiesInput, { value, onChange }),
182
+ name: "entities"
183
+ }
184
+ ), /* @__PURE__ */ React__default.createElement(
185
+ Button,
186
+ {
187
+ color: "primary",
188
+ type: "submit",
189
+ variant: "contained",
190
+ disabled: posting,
191
+ sx: { marginBottom: 2, marginTop: 2 }
115
192
  },
116
- error && /* @__PURE__ */ React__default.createElement(Alert, { severity: "error" }, t("templateList.errorPosting")),
117
- /* @__PURE__ */ React__default.createElement(
118
- TextField,
119
- {
120
- label: t("templateList.titleInput.label"),
121
- className: "qetaTemplateFormTitle",
122
- required: true,
123
- fullWidth: true,
124
- error: "title" in errors,
125
- margin: "normal",
126
- variant: "outlined",
127
- helperText: t("templateList.titleInput.helperText"),
128
- // @ts-ignore
129
- ...register("title", { required: true, maxLength: 255 })
130
- }
131
- ),
132
- /* @__PURE__ */ React__default.createElement(
133
- TextField,
134
- {
135
- label: t("templateList.descriptionInput.label"),
136
- className: "qetaTemplateFormDescription",
137
- required: true,
138
- fullWidth: true,
139
- error: "description" in errors,
140
- margin: "normal",
141
- variant: "outlined",
142
- helperText: t("templateList.descriptionInput.helperText"),
143
- // @ts-ignore
144
- ...register("description", { required: true, maxLength: 255 })
145
- }
146
- ),
147
- /* @__PURE__ */ React__default.createElement(
148
- TextField,
149
- {
150
- label: t("templateList.questionTitleInput.label"),
151
- className: "qetaTemplateFormQuestionTitle",
152
- fullWidth: true,
153
- error: "questionTitle" in errors,
154
- margin: "normal",
155
- variant: "outlined",
156
- helperText: t("templateList.questionTitleInput.helperText"),
157
- // @ts-ignore
158
- ...register("questionTitle", { maxLength: 255 })
159
- }
160
- ),
161
- /* @__PURE__ */ React__default.createElement(
162
- Controller,
163
- {
164
- control,
165
- rules: {},
166
- render: ({ field: { onChange, value } }) => /* @__PURE__ */ React__default.createElement(
167
- MarkdownEditor,
168
- {
169
- value: value ?? "",
170
- disableAttachments: true,
171
- onChange,
172
- height: 400,
173
- error: "questionContent" in errors,
174
- placeholder: t("templateList.questionContentInput.placeholder")
175
- }
176
- ),
177
- name: "questionContent"
178
- }
179
- ),
180
- /* @__PURE__ */ React__default.createElement(
181
- Controller,
182
- {
183
- control,
184
- render: ({
185
- field: { onChange, value },
186
- fieldState: { error: tagError }
187
- }) => /* @__PURE__ */ React__default.createElement(TagInput, { value, onChange, error: tagError }),
188
- name: "tags"
189
- }
190
- ),
191
- /* @__PURE__ */ React__default.createElement(
192
- Controller,
193
- {
194
- control,
195
- render: ({ field: { onChange, value } }) => /* @__PURE__ */ React__default.createElement(EntitiesInput, { value, onChange }),
196
- name: "entities"
197
- }
198
- ),
199
- /* @__PURE__ */ React__default.createElement(
200
- Button,
201
- {
202
- color: "primary",
203
- type: "submit",
204
- variant: "contained",
205
- disabled: posting,
206
- className: `qetaTemplateFormSubmitBtn ${styles.postButton}`
207
- },
208
- id ? t("templateList.submit.existingTemplate") : t("templateList.submit.newTemplate")
209
- )
210
- );
193
+ id ? t("templateList.submit.existingTemplate") : t("templateList.submit.newTemplate")
194
+ ));
211
195
  };
212
196
 
213
197
  export { TemplateForm };
@@ -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 Button from '@mui/material/Button';\nimport TextField from '@mui/material/TextField';\nimport Alert from '@mui/material/Alert';\nimport { MarkdownEditor } from '../MarkdownEditor/MarkdownEditor';\nimport { TagInput } from '../PostForm/TagInput';\nimport { EntitiesInput } from '../PostForm/EntitiesInput';\nimport { useFormStyles } from '../../hooks/useFormStyles';\nimport { TemplateFormValues } from '../PostForm/types';\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 styles = useFormStyles();\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\n onSubmit={handleSubmit(postTemplate)}\n className={`${styles.form} qetaTemplateForm`}\n >\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 className={`qetaTemplateFormSubmitBtn ${styles.postButton}`}\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 Button from '@mui/material/Button';\nimport TextField from '@mui/material/TextField';\nimport Alert from '@mui/material/Alert';\nimport { MarkdownEditor } from '../MarkdownEditor/MarkdownEditor';\nimport { TagInput } from '../PostForm/TagInput';\nimport { EntitiesInput } from '../PostForm/EntitiesInput';\nimport { TemplateFormValues } from '../PostForm/types';\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 sx={{ marginBottom: 2, marginTop: 2 }}\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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"}
package/package.json CHANGED
@@ -7,7 +7,7 @@
7
7
  "frontend",
8
8
  "backstage.io"
9
9
  ],
10
- "version": "3.10.1",
10
+ "version": "3.10.3",
11
11
  "main": "dist/index.esm.js",
12
12
  "types": "dist/index.d.ts",
13
13
  "prepublishOnly": "yarn tsc && yarn build",
@@ -56,11 +56,9 @@
56
56
  "@backstage/plugin-catalog-react": "^1.14.0",
57
57
  "@backstage/plugin-permission-react": "^0.4.27",
58
58
  "@backstage/plugin-signals-react": "^0.0.6",
59
- "@drodil/backstage-plugin-qeta-common": "^3.10.1",
60
- "@emotion/css": "^11.13.4",
59
+ "@drodil/backstage-plugin-qeta-common": "^3.10.3",
61
60
  "@emotion/react": "^11.13.3",
62
- "@emotion/styled": "^11.13.0",
63
- "@mui/icons-material": "^5.15.14",
61
+ "@mui/icons-material": "^5.16.7",
64
62
  "@mui/lab": "^5.0.0-alpha.169",
65
63
  "@mui/material": "^5.16.7",
66
64
  "@mui/styles": "^5.16.7",
@@ -1,26 +0,0 @@
1
- import makeStyles from '@mui/styles/makeStyles';
2
-
3
- const useFormStyles = makeStyles(
4
- (theme) => {
5
- return {
6
- headerImage: {
7
- marginBottom: "1rem",
8
- marginTop: "1rem",
9
- height: "250px",
10
- objectFit: "cover",
11
- width: "100%",
12
- border: `1px solid ${theme.palette.background.paper}`,
13
- boxShadow: theme.shadows[1]
14
- },
15
- postButton: {
16
- marginTop: theme.spacing(1),
17
- marginBottom: theme.spacing(1)
18
- },
19
- form: {}
20
- };
21
- },
22
- { name: "QetaForm" }
23
- );
24
-
25
- export { useFormStyles };
26
- //# sourceMappingURL=useFormStyles.esm.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useFormStyles.esm.js","sources":["../../src/hooks/useFormStyles.ts"],"sourcesContent":["import makeStyles from '@mui/styles/makeStyles';\n\nexport type QetaFormClassKey = 'headerImage' | 'postButton' | 'postForm';\n\nexport const useFormStyles = makeStyles(\n theme => {\n return {\n headerImage: {\n marginBottom: '1rem',\n marginTop: '1rem',\n height: '250px',\n objectFit: 'cover',\n width: '100%',\n border: `1px solid ${theme.palette.background.paper}`,\n boxShadow: theme.shadows[1],\n },\n postButton: {\n marginTop: theme.spacing(1),\n marginBottom: theme.spacing(1),\n },\n form: {},\n };\n },\n { name: 'QetaForm' },\n);\n"],"names":[],"mappings":";;AAIO,MAAM,aAAgB,GAAA,UAAA;AAAA,EAC3B,CAAS,KAAA,KAAA;AACP,IAAO,OAAA;AAAA,MACL,WAAa,EAAA;AAAA,QACX,YAAc,EAAA,MAAA;AAAA,QACd,SAAW,EAAA,MAAA;AAAA,QACX,MAAQ,EAAA,OAAA;AAAA,QACR,SAAW,EAAA,OAAA;AAAA,QACX,KAAO,EAAA,MAAA;AAAA,QACP,MAAQ,EAAA,CAAA,UAAA,EAAa,KAAM,CAAA,OAAA,CAAQ,WAAW,KAAK,CAAA,CAAA;AAAA,QACnD,SAAA,EAAW,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,OAC5B;AAAA,MACA,UAAY,EAAA;AAAA,QACV,SAAA,EAAW,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,QAC1B,YAAA,EAAc,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,OAC/B;AAAA,MACA,MAAM,EAAC;AAAA,KACT,CAAA;AAAA,GACF;AAAA,EACA,EAAE,MAAM,UAAW,EAAA;AACrB;;;;"}