@drodil/backstage-plugin-qeta-react 3.28.0 → 3.28.2

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.
@@ -25,8 +25,7 @@ const useStyles = makeStyles(() => ({
25
25
  author: {
26
26
  alignItems: "center",
27
27
  display: "flex",
28
- height: "24px",
29
- marginBottom: "8px"
28
+ height: "24px"
30
29
  },
31
30
  timestamp: {
32
31
  marginLeft: "0.3em"
@@ -63,7 +62,7 @@ const PostListItem = (props) => {
63
62
  justifyContent: "flex-start",
64
63
  style: { padding: "0.7em", paddingBottom: "1.0em" },
65
64
  children: [
66
- /* @__PURE__ */ jsx(Grid, { item: true, style: { paddingTop: "0px" }, children: /* @__PURE__ */ jsxs(VoteButtonContainer, { children: [
65
+ /* @__PURE__ */ jsx(Grid, { item: true, style: { paddingTop: "0em", marginTop: "-0.5em" }, children: /* @__PURE__ */ jsxs(VoteButtonContainer, { children: [
67
66
  /* @__PURE__ */ jsx(VoteButtons, { entity: post }),
68
67
  /* @__PURE__ */ jsx(FavoriteButton, { entity: post })
69
68
  ] }) }),
@@ -83,17 +82,18 @@ const PostListItem = (props) => {
83
82
  justifyContent: "space-between",
84
83
  xs: 12,
85
84
  style: {
86
- paddingTop: "0.3em",
87
- paddingBottom: "0.0em",
85
+ paddingTop: "0",
86
+ paddingBottom: "0.5em",
88
87
  marginLeft: "-0.2em"
89
88
  },
90
89
  children: [
91
- /* @__PURE__ */ jsxs(Grid, { item: true, children: [
90
+ /* @__PURE__ */ jsxs(Grid, { item: true, style: { display: "flex", alignItems: "center" }, children: [
92
91
  type === void 0 && /* @__PURE__ */ jsx(
93
92
  Chip,
94
93
  {
95
94
  color: "secondary",
96
95
  size: "small",
96
+ style: { marginBottom: 0 },
97
97
  label: `${capitalize(post.type)}`,
98
98
  icon: post.type === "question" ? /* @__PURE__ */ jsx(HelpOutlined, {}) : /* @__PURE__ */ jsx(CollectionsBookmarkIcon, {})
99
99
  }
@@ -104,6 +104,7 @@ const PostListItem = (props) => {
104
104
  variant: "outlined",
105
105
  size: "small",
106
106
  style: {
107
+ marginBottom: 0,
107
108
  userSelect: "none",
108
109
  // eslint-disable-next-line no-nested-ternary
109
110
  borderColor: correctAnswer ? theme.palette.success.main : answersCount === 0 ? theme.palette.warning.main : void 0
@@ -118,6 +119,7 @@ const PostListItem = (props) => {
118
119
  {
119
120
  variant: "outlined",
120
121
  size: "small",
122
+ style: { marginBottom: 0 },
121
123
  label: t("common.viewsShort", {
122
124
  count: views
123
125
  })
@@ -1 +1 @@
1
- {"version":3,"file":"PostListItem.esm.js","sources":["../../../src/components/PostsContainer/PostListItem.tsx"],"sourcesContent":["import { Link } from '@backstage/core-components';\nimport { useEffect, useState } from 'react';\nimport DOMPurify from 'dompurify';\nimport {\n PostResponse,\n PostType,\n QetaSignal,\n removeMarkdownFormatting,\n truncate,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { TagsAndEntities } from '../TagsAndEntities/TagsAndEntities';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport { articleRouteRef, questionRouteRef } from '../../routes';\nimport { RelativeTimeWithTooltip } from '../RelativeTimeWithTooltip';\nimport { useSignal } from '@backstage/plugin-signals-react';\nimport { VoteButtons } from '../Buttons/VoteButtons';\nimport { FavoriteButton } from '../Buttons/FavoriteButton';\nimport { capitalize } from 'lodash';\nimport CollectionsBookmarkIcon from '@material-ui/icons/CollectionsBookmark';\nimport HelpOutlined from '@material-ui/icons/HelpOutlined';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../../translation.ts';\nimport { useEntityAuthor } from '../../hooks/useEntityAuthor';\nimport { VoteButtonContainer } from '../Utility/VoteButtonContainer';\nimport { UserLink } from '../Links';\nimport {\n Chip,\n Grid,\n makeStyles,\n Typography,\n useTheme,\n} from '@material-ui/core';\nimport { SmallAvatar } from '../Utility/SmallAvatar';\n\nexport interface PostListItemProps {\n post: PostResponse;\n entity?: string;\n type?: PostType;\n}\n\nconst useStyles = makeStyles(() => ({\n author: {\n alignItems: 'center',\n display: 'flex',\n height: '24px',\n marginBottom: '8px',\n },\n timestamp: {\n marginLeft: '0.3em',\n },\n}));\n\nexport const PostListItem = (props: PostListItemProps) => {\n const { post, entity, type } = props;\n\n const [correctAnswer, setCorrectAnswer] = useState(post.correctAnswer);\n const [answersCount, setAnswersCount] = useState(post.answersCount);\n const [views, setViews] = useState(post.views);\n const { t } = useTranslationRef(qetaTranslationRef);\n const styles = useStyles();\n\n const { lastSignal } = useSignal<QetaSignal>(`qeta:post_${post.id}`);\n\n useEffect(() => {\n if (lastSignal?.type === 'post_stats') {\n setCorrectAnswer(lastSignal.correctAnswer);\n setAnswersCount(lastSignal.answersCount);\n setViews(lastSignal.views);\n }\n }, [lastSignal]);\n\n const questionRoute = useRouteRef(questionRouteRef);\n const articleRoute = useRouteRef(articleRouteRef);\n const { name, initials, user } = useEntityAuthor(post);\n const theme = useTheme();\n\n const route = post.type === 'question' ? questionRoute : articleRoute;\n const href = entity\n ? `${route({\n id: post.id.toString(10),\n })}?entity=${entity}`\n : route({ id: post.id.toString(10) });\n\n return (\n <Grid\n container\n spacing={2}\n justifyContent=\"flex-start\"\n style={{ padding: '0.7em', paddingBottom: '1.0em' }}\n >\n <Grid item style={{ paddingTop: '0px' }}>\n <VoteButtonContainer>\n <VoteButtons entity={post} />\n <FavoriteButton entity={post} />\n </VoteButtonContainer>\n </Grid>\n <Grid\n item\n style={{ display: 'inline-block', width: 'calc(100% - 53px)' }}\n >\n <Grid container>\n <Grid\n item\n container\n alignItems=\"center\"\n spacing={0}\n justifyContent=\"space-between\"\n xs={12}\n style={{\n paddingTop: '0.3em',\n paddingBottom: '0.0em',\n marginLeft: '-0.2em',\n }}\n >\n <Grid item>\n {type === undefined && (\n <Chip\n color=\"secondary\"\n size=\"small\"\n label={`${capitalize(post.type)}`}\n icon={\n post.type === 'question' ? (\n <HelpOutlined />\n ) : (\n <CollectionsBookmarkIcon />\n )\n }\n />\n )}\n {post.type === 'question' && (\n <Chip\n variant=\"outlined\"\n size=\"small\"\n style={{\n userSelect: 'none',\n // eslint-disable-next-line no-nested-ternary\n borderColor: correctAnswer\n ? theme.palette.success.main\n : answersCount === 0\n ? theme.palette.warning.main\n : undefined,\n }}\n label={t('common.answers', {\n count: answersCount,\n })}\n />\n )}\n <Chip\n variant=\"outlined\"\n size=\"small\"\n label={t('common.viewsShort', {\n count: views,\n })}\n />\n </Grid>\n <Grid item>\n <Typography\n variant=\"caption\"\n display=\"inline\"\n className={styles.author}\n >\n <SmallAvatar\n src={user?.spec?.profile?.picture}\n alt={name}\n variant=\"rounded\"\n >\n {initials}\n </SmallAvatar>\n <UserLink entityRef={post.author} anonymous={post.anonymous} />{' '}\n <Link to={href} className={styles.timestamp}>\n <RelativeTimeWithTooltip value={post.created} />\n </Link>\n </Typography>\n </Grid>\n </Grid>\n <Grid item xs={12} style={{ paddingTop: '0px' }}>\n <Typography variant=\"h5\" component=\"div\">\n <Link to={href} className=\"qetaPostListItemQuestionBtn\">\n {post.title}\n </Link>\n </Typography>\n <Typography\n variant=\"body2\"\n noWrap\n component=\"div\"\n className=\"qetaPostListItemContent\"\n style={{ marginTop: '0.6em' }}\n >\n {DOMPurify.sanitize(\n truncate(removeMarkdownFormatting(post.content), 150),\n )}\n </Typography>\n </Grid>\n <Grid item xs={12}>\n <TagsAndEntities entity={post} />\n </Grid>\n </Grid>\n </Grid>\n </Grid>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PostListItem.esm.js","sources":["../../../src/components/PostsContainer/PostListItem.tsx"],"sourcesContent":["import { Link } from '@backstage/core-components';\nimport { useEffect, useState } from 'react';\nimport DOMPurify from 'dompurify';\nimport {\n PostResponse,\n PostType,\n QetaSignal,\n removeMarkdownFormatting,\n truncate,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { TagsAndEntities } from '../TagsAndEntities/TagsAndEntities';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport { articleRouteRef, questionRouteRef } from '../../routes';\nimport { RelativeTimeWithTooltip } from '../RelativeTimeWithTooltip';\nimport { useSignal } from '@backstage/plugin-signals-react';\nimport { VoteButtons } from '../Buttons/VoteButtons';\nimport { FavoriteButton } from '../Buttons/FavoriteButton';\nimport { capitalize } from 'lodash';\nimport CollectionsBookmarkIcon from '@material-ui/icons/CollectionsBookmark';\nimport HelpOutlined from '@material-ui/icons/HelpOutlined';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../../translation.ts';\nimport { useEntityAuthor } from '../../hooks/useEntityAuthor';\nimport { VoteButtonContainer } from '../Utility/VoteButtonContainer';\nimport { UserLink } from '../Links';\nimport {\n Chip,\n Grid,\n makeStyles,\n Typography,\n useTheme,\n} from '@material-ui/core';\nimport { SmallAvatar } from '../Utility/SmallAvatar';\n\nexport interface PostListItemProps {\n post: PostResponse;\n entity?: string;\n type?: PostType;\n}\n\nconst useStyles = makeStyles(() => ({\n author: {\n alignItems: 'center',\n display: 'flex',\n height: '24px',\n },\n timestamp: {\n marginLeft: '0.3em',\n },\n}));\n\nexport const PostListItem = (props: PostListItemProps) => {\n const { post, entity, type } = props;\n\n const [correctAnswer, setCorrectAnswer] = useState(post.correctAnswer);\n const [answersCount, setAnswersCount] = useState(post.answersCount);\n const [views, setViews] = useState(post.views);\n const { t } = useTranslationRef(qetaTranslationRef);\n const styles = useStyles();\n\n const { lastSignal } = useSignal<QetaSignal>(`qeta:post_${post.id}`);\n\n useEffect(() => {\n if (lastSignal?.type === 'post_stats') {\n setCorrectAnswer(lastSignal.correctAnswer);\n setAnswersCount(lastSignal.answersCount);\n setViews(lastSignal.views);\n }\n }, [lastSignal]);\n\n const questionRoute = useRouteRef(questionRouteRef);\n const articleRoute = useRouteRef(articleRouteRef);\n const { name, initials, user } = useEntityAuthor(post);\n const theme = useTheme();\n\n const route = post.type === 'question' ? questionRoute : articleRoute;\n const href = entity\n ? `${route({\n id: post.id.toString(10),\n })}?entity=${entity}`\n : route({ id: post.id.toString(10) });\n\n return (\n <Grid\n container\n spacing={2}\n justifyContent=\"flex-start\"\n style={{ padding: '0.7em', paddingBottom: '1.0em' }}\n >\n <Grid item style={{ paddingTop: '0em', marginTop: '-0.5em' }}>\n <VoteButtonContainer>\n <VoteButtons entity={post} />\n <FavoriteButton entity={post} />\n </VoteButtonContainer>\n </Grid>\n <Grid\n item\n style={{ display: 'inline-block', width: 'calc(100% - 53px)' }}\n >\n <Grid container>\n <Grid\n item\n container\n alignItems=\"center\"\n spacing={0}\n justifyContent=\"space-between\"\n xs={12}\n style={{\n paddingTop: '0',\n paddingBottom: '0.5em',\n marginLeft: '-0.2em',\n }}\n >\n <Grid item style={{ display: 'flex', alignItems: 'center' }}>\n {type === undefined && (\n <Chip\n color=\"secondary\"\n size=\"small\"\n style={{ marginBottom: 0 }}\n label={`${capitalize(post.type)}`}\n icon={\n post.type === 'question' ? (\n <HelpOutlined />\n ) : (\n <CollectionsBookmarkIcon />\n )\n }\n />\n )}\n {post.type === 'question' && (\n <Chip\n variant=\"outlined\"\n size=\"small\"\n style={{\n marginBottom: 0,\n userSelect: 'none',\n // eslint-disable-next-line no-nested-ternary\n borderColor: correctAnswer\n ? theme.palette.success.main\n : answersCount === 0\n ? theme.palette.warning.main\n : undefined,\n }}\n label={t('common.answers', {\n count: answersCount,\n })}\n />\n )}\n <Chip\n variant=\"outlined\"\n size=\"small\"\n style={{ marginBottom: 0 }}\n label={t('common.viewsShort', {\n count: views,\n })}\n />\n </Grid>\n <Grid item>\n <Typography\n variant=\"caption\"\n display=\"inline\"\n className={styles.author}\n >\n <SmallAvatar\n src={user?.spec?.profile?.picture}\n alt={name}\n variant=\"rounded\"\n >\n {initials}\n </SmallAvatar>\n <UserLink entityRef={post.author} anonymous={post.anonymous} />{' '}\n <Link to={href} className={styles.timestamp}>\n <RelativeTimeWithTooltip value={post.created} />\n </Link>\n </Typography>\n </Grid>\n </Grid>\n <Grid item xs={12} style={{ paddingTop: '0px' }}>\n <Typography variant=\"h5\" component=\"div\">\n <Link to={href} className=\"qetaPostListItemQuestionBtn\">\n {post.title}\n </Link>\n </Typography>\n <Typography\n variant=\"body2\"\n noWrap\n component=\"div\"\n className=\"qetaPostListItemContent\"\n style={{ marginTop: '0.6em' }}\n >\n {DOMPurify.sanitize(\n truncate(removeMarkdownFormatting(post.content), 150),\n )}\n </Typography>\n </Grid>\n <Grid item xs={12}>\n <TagsAndEntities entity={post} />\n </Grid>\n </Grid>\n </Grid>\n </Grid>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -103,10 +103,14 @@ const useConfirmNavigationIfEdited = (edited) => {
103
103
  }
104
104
  };
105
105
  window.addEventListener("beforeunload", handleBeforeUnload);
106
- window.navigation.addEventListener("navigate", handleLocationChange);
106
+ if ("navigation" in window && window.navigation) {
107
+ window.navigation.addEventListener("navigate", handleLocationChange);
108
+ }
107
109
  return () => {
108
110
  window.removeEventListener("beforeunload", handleBeforeUnload);
109
- window.navigation.removeEventListener("navigate", handleLocationChange);
111
+ if ("navigation" in window && window.navigation) {
112
+ window.navigation.removeEventListener("navigate", handleLocationChange);
113
+ }
110
114
  };
111
115
  }, [edited, msg]);
112
116
  };
@@ -1 +1 @@
1
- {"version":3,"file":"utils.esm.js","sources":["../../src/utils/utils.ts"],"sourcesContent":["import { Entity, stringifyEntityRef } from '@backstage/catalog-model';\nimport { Filters } from '../components/FilterPanel/FilterPanel';\nimport FileType from 'file-type';\nimport { ErrorApi } from '@backstage/core-plugin-api';\nimport { QetaApi } from '@drodil/backstage-plugin-qeta-common';\nimport { useEffect } from 'react';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../translation.ts';\n\nexport const imageUpload = (opts: {\n qetaApi: QetaApi;\n errorApi: ErrorApi;\n onImageUpload?: (id: number) => void;\n postId?: number;\n answerId?: number;\n collectionId?: number;\n}) => {\n const { qetaApi, errorApi, onImageUpload, postId, answerId, collectionId } =\n opts;\n // eslint-disable-next-line func-names\n return async function* (data: ArrayBuffer) {\n const fileType = await FileType.fromBuffer(data);\n\n const mimeType = fileType ? fileType.mime : 'text/plain';\n const attachment = await qetaApi.postAttachment(\n new Blob([data], { type: mimeType }),\n { postId, answerId, collectionId },\n );\n if ('errors' in attachment) {\n errorApi.post({\n name: 'Upload failed',\n message: attachment.errors?.map(e => e.message).join(', ') ?? '',\n });\n return false;\n }\n onImageUpload?.(attachment.id);\n yield attachment.locationUri;\n return true;\n };\n};\n\nexport const formatEntityName = (username?: string) => {\n if (!username) {\n return '';\n }\n const plainName = username.split(/[/:]+/).pop();\n return plainName\n ?.split(/[_.-]+/)\n .map(a => a.charAt(0).toUpperCase() + a.slice(1))\n .join(' ');\n};\n\nexport const getEntityTitle = (\n entity: Entity,\n opts?: { withType: boolean },\n): string => {\n const { withType } = opts || { withType: true };\n const stringified = stringifyEntityRef(entity);\n return `${\n entity.metadata.title ?? formatEntityName(stringified) ?? stringified\n }${withType && entity.spec?.type ? ` (${entity.spec.type})` : ''}`;\n};\n\nexport const formatDate = (localDate: Date) => {\n let date: any = localDate.getDate();\n let month: any = localDate.getMonth() + 1;\n if (date < 10) {\n date = `0${date}`;\n }\n\n if (month < 10) {\n month = `0${month}`;\n }\n return `${localDate.getFullYear()}-${month}-${date}`;\n};\n\nexport type FiltersWithDateRange = Filters & {\n fromDate: string;\n toDate: string;\n};\n\nexport const getFiltersWithDateRange = (filters: Filters) => {\n let filtersWithDateRange: FiltersWithDateRange;\n const to = new Date();\n const from = new Date(to);\n if (filters.dateRange) {\n let fromDate = '';\n let toDate = '';\n\n switch (filters.dateRange) {\n case '7-days':\n toDate = formatDate(to);\n from.setDate(to.getDate() - 6);\n fromDate = formatDate(from);\n break;\n\n case '30-days':\n toDate = formatDate(to);\n from.setDate(to.getDate() - 29);\n fromDate = formatDate(from);\n break;\n default:\n if (filters.dateRange.indexOf('--') > 0) {\n fromDate = filters.dateRange.split('--')[0];\n toDate = filters.dateRange.split('--')[1];\n }\n break;\n }\n if (fromDate && toDate) {\n filtersWithDateRange = { ...filters, fromDate, toDate };\n delete filtersWithDateRange.dateRange;\n return filtersWithDateRange;\n }\n }\n\n if ('dateRange' in filters) {\n delete filters.dateRange;\n }\n\n return filters;\n};\n\nexport const useConfirmNavigationIfEdited = (edited: boolean) => {\n const { t } = useTranslationRef(qetaTranslationRef);\n const msg = t('common.unsaved_changes');\n useEffect(() => {\n const handleBeforeUnload = (event: BeforeUnloadEvent) => {\n if (edited) {\n event.preventDefault();\n event.returnValue = msg; // Included for legacy support, e.g. Chrome/Edge < 119\n }\n };\n\n const handleLocationChange = (event: any) => {\n if (edited) {\n // eslint-disable-next-line no-alert\n const response = window.confirm(msg);\n if (!response) {\n event.preventDefault();\n }\n }\n };\n\n window.addEventListener('beforeunload', handleBeforeUnload);\n // @ts-ignore\n window.navigation.addEventListener('navigate', handleLocationChange);\n\n return () => {\n window.removeEventListener('beforeunload', handleBeforeUnload);\n // @ts-ignore\n window.navigation.removeEventListener('navigate', handleLocationChange);\n };\n }, [edited, msg]);\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.esm.js","sources":["../../src/utils/utils.ts"],"sourcesContent":["import { Entity, stringifyEntityRef } from '@backstage/catalog-model';\nimport { Filters } from '../components/FilterPanel/FilterPanel';\nimport FileType from 'file-type';\nimport { ErrorApi } from '@backstage/core-plugin-api';\nimport { QetaApi } from '@drodil/backstage-plugin-qeta-common';\nimport { useEffect } from 'react';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../translation.ts';\n\nexport const imageUpload = (opts: {\n qetaApi: QetaApi;\n errorApi: ErrorApi;\n onImageUpload?: (id: number) => void;\n postId?: number;\n answerId?: number;\n collectionId?: number;\n}) => {\n const { qetaApi, errorApi, onImageUpload, postId, answerId, collectionId } =\n opts;\n // eslint-disable-next-line func-names\n return async function* (data: ArrayBuffer) {\n const fileType = await FileType.fromBuffer(data);\n\n const mimeType = fileType ? fileType.mime : 'text/plain';\n const attachment = await qetaApi.postAttachment(\n new Blob([data], { type: mimeType }),\n { postId, answerId, collectionId },\n );\n if ('errors' in attachment) {\n errorApi.post({\n name: 'Upload failed',\n message: attachment.errors?.map(e => e.message).join(', ') ?? '',\n });\n return false;\n }\n onImageUpload?.(attachment.id);\n yield attachment.locationUri;\n return true;\n };\n};\n\nexport const formatEntityName = (username?: string) => {\n if (!username) {\n return '';\n }\n const plainName = username.split(/[/:]+/).pop();\n return plainName\n ?.split(/[_.-]+/)\n .map(a => a.charAt(0).toUpperCase() + a.slice(1))\n .join(' ');\n};\n\nexport const getEntityTitle = (\n entity: Entity,\n opts?: { withType: boolean },\n): string => {\n const { withType } = opts || { withType: true };\n const stringified = stringifyEntityRef(entity);\n return `${\n entity.metadata.title ?? formatEntityName(stringified) ?? stringified\n }${withType && entity.spec?.type ? ` (${entity.spec.type})` : ''}`;\n};\n\nexport const formatDate = (localDate: Date) => {\n let date: any = localDate.getDate();\n let month: any = localDate.getMonth() + 1;\n if (date < 10) {\n date = `0${date}`;\n }\n\n if (month < 10) {\n month = `0${month}`;\n }\n return `${localDate.getFullYear()}-${month}-${date}`;\n};\n\nexport type FiltersWithDateRange = Filters & {\n fromDate: string;\n toDate: string;\n};\n\nexport const getFiltersWithDateRange = (filters: Filters) => {\n let filtersWithDateRange: FiltersWithDateRange;\n const to = new Date();\n const from = new Date(to);\n if (filters.dateRange) {\n let fromDate = '';\n let toDate = '';\n\n switch (filters.dateRange) {\n case '7-days':\n toDate = formatDate(to);\n from.setDate(to.getDate() - 6);\n fromDate = formatDate(from);\n break;\n\n case '30-days':\n toDate = formatDate(to);\n from.setDate(to.getDate() - 29);\n fromDate = formatDate(from);\n break;\n default:\n if (filters.dateRange.indexOf('--') > 0) {\n fromDate = filters.dateRange.split('--')[0];\n toDate = filters.dateRange.split('--')[1];\n }\n break;\n }\n if (fromDate && toDate) {\n filtersWithDateRange = { ...filters, fromDate, toDate };\n delete filtersWithDateRange.dateRange;\n return filtersWithDateRange;\n }\n }\n\n if ('dateRange' in filters) {\n delete filters.dateRange;\n }\n\n return filters;\n};\n\nexport const useConfirmNavigationIfEdited = (edited: boolean) => {\n const { t } = useTranslationRef(qetaTranslationRef);\n const msg = t('common.unsaved_changes');\n useEffect(() => {\n const handleBeforeUnload = (event: BeforeUnloadEvent) => {\n if (edited) {\n event.preventDefault();\n event.returnValue = msg; // Included for legacy support, e.g. Chrome/Edge < 119\n }\n };\n\n const handleLocationChange = (event: any) => {\n if (edited) {\n // eslint-disable-next-line no-alert\n const response = window.confirm(msg);\n if (!response) {\n event.preventDefault();\n }\n }\n };\n\n window.addEventListener('beforeunload', handleBeforeUnload);\n if ('navigation' in window && window.navigation) {\n // @ts-ignore\n window.navigation.addEventListener('navigate', handleLocationChange);\n }\n\n return () => {\n window.removeEventListener('beforeunload', handleBeforeUnload);\n if ('navigation' in window && window.navigation) {\n // @ts-ignore\n window.navigation.removeEventListener('navigate', handleLocationChange);\n }\n };\n }, [edited, msg]);\n};\n"],"names":[],"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.28.0",
10
+ "version": "3.28.2",
11
11
  "main": "dist/index.esm.js",
12
12
  "types": "dist/index.d.ts",
13
13
  "prepublishOnly": "yarn tsc && yarn build",
@@ -57,7 +57,7 @@
57
57
  "@backstage/plugin-permission-common": "^0.9.0",
58
58
  "@backstage/plugin-permission-react": "^0.4.34",
59
59
  "@backstage/plugin-signals-react": "^0.0.13",
60
- "@drodil/backstage-plugin-qeta-common": "^3.28.0",
60
+ "@drodil/backstage-plugin-qeta-common": "^3.28.2",
61
61
  "@jsdevtools/rehype-toc": "^3.0.2",
62
62
  "@material-ui/core": "^4.12.2",
63
63
  "@material-ui/icons": "^4.11.3",