@drodil/backstage-plugin-qeta-react 3.33.2 → 3.33.4

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.
@@ -33,7 +33,7 @@ const AuthorBoxes = (props) => {
33
33
  {
34
34
  userEntityRef: entity.author,
35
35
  time: entity.created,
36
- label: t("authorBox.answeredAtTime"),
36
+ label: isAnswer(entity) ? t("authorBox.answeredAtTime") : t("authorBox.postedAtTime"),
37
37
  expert: isAnswer(entity) ? entity.expert : false,
38
38
  anonymous: entity.anonymous
39
39
  }
@@ -1 +1 @@
1
- {"version":3,"file":"AuthorBoxes.esm.js","sources":["../../../src/components/AuthorBox/AuthorBoxes.tsx"],"sourcesContent":["import {\n Answer,\n PostAnswerEntity,\n QetaIdEntity,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { Box } from '@material-ui/core';\nimport { AuthorBox } from './AuthorBox.tsx';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../../translation.ts';\n\nfunction isAnswer(entity: QetaIdEntity): entity is Answer {\n return 'postId' in entity && 'correct' in entity;\n}\n\nexport const AuthorBoxes = (props: { entity: PostAnswerEntity }) => {\n const entity = props.entity;\n const { t } = useTranslationRef(qetaTranslationRef);\n\n return (\n <Box\n display=\"flex\"\n minWidth={220}\n style={{ gap: '8px', justifyContent: 'flex-end' }}\n ml={1}\n >\n {entity.updated && entity.updatedBy && (\n <AuthorBox\n userEntityRef={entity.updatedBy}\n time={entity.updated}\n label={t('authorBox.updatedAtTime')}\n expert={false}\n anonymous={entity.anonymous}\n />\n )}\n <AuthorBox\n userEntityRef={entity.author}\n time={entity.created}\n label={t('authorBox.answeredAtTime')}\n expert={isAnswer(entity) ? entity.expert : false}\n anonymous={entity.anonymous}\n />\n </Box>\n );\n};\n"],"names":[],"mappings":";;;;;;AAUA,SAAS,SAAS,MAAwC,EAAA;AACxD,EAAO,OAAA,QAAA,IAAY,UAAU,SAAa,IAAA,MAAA;AAC5C;AAEa,MAAA,WAAA,GAAc,CAAC,KAAwC,KAAA;AAClE,EAAA,MAAM,SAAS,KAAM,CAAA,MAAA;AACrB,EAAA,MAAM,EAAE,CAAA,EAAM,GAAA,iBAAA,CAAkB,kBAAkB,CAAA;AAElD,EACE,uBAAA,IAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,OAAQ,EAAA,MAAA;AAAA,MACR,QAAU,EAAA,GAAA;AAAA,MACV,KAAO,EAAA,EAAE,GAAK,EAAA,KAAA,EAAO,gBAAgB,UAAW,EAAA;AAAA,MAChD,EAAI,EAAA,CAAA;AAAA,MAEH,QAAA,EAAA;AAAA,QAAO,MAAA,CAAA,OAAA,IAAW,OAAO,SACxB,oBAAA,GAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YACC,eAAe,MAAO,CAAA,SAAA;AAAA,YACtB,MAAM,MAAO,CAAA,OAAA;AAAA,YACb,KAAA,EAAO,EAAE,yBAAyB,CAAA;AAAA,YAClC,MAAQ,EAAA,KAAA;AAAA,YACR,WAAW,MAAO,CAAA;AAAA;AAAA,SACpB;AAAA,wBAEF,GAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YACC,eAAe,MAAO,CAAA,MAAA;AAAA,YACtB,MAAM,MAAO,CAAA,OAAA;AAAA,YACb,KAAA,EAAO,EAAE,0BAA0B,CAAA;AAAA,YACnC,MAAQ,EAAA,QAAA,CAAS,MAAM,CAAA,GAAI,OAAO,MAAS,GAAA,KAAA;AAAA,YAC3C,WAAW,MAAO,CAAA;AAAA;AAAA;AACpB;AAAA;AAAA,GACF;AAEJ;;;;"}
1
+ {"version":3,"file":"AuthorBoxes.esm.js","sources":["../../../src/components/AuthorBox/AuthorBoxes.tsx"],"sourcesContent":["import {\n Answer,\n PostAnswerEntity,\n QetaIdEntity,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { Box } from '@material-ui/core';\nimport { AuthorBox } from './AuthorBox.tsx';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../../translation.ts';\n\nfunction isAnswer(entity: QetaIdEntity): entity is Answer {\n return 'postId' in entity && 'correct' in entity;\n}\n\nexport const AuthorBoxes = (props: { entity: PostAnswerEntity }) => {\n const entity = props.entity;\n const { t } = useTranslationRef(qetaTranslationRef);\n\n return (\n <Box\n display=\"flex\"\n minWidth={220}\n style={{ gap: '8px', justifyContent: 'flex-end' }}\n ml={1}\n >\n {entity.updated && entity.updatedBy && (\n <AuthorBox\n userEntityRef={entity.updatedBy}\n time={entity.updated}\n label={t('authorBox.updatedAtTime')}\n expert={false}\n anonymous={entity.anonymous}\n />\n )}\n <AuthorBox\n userEntityRef={entity.author}\n time={entity.created}\n label={\n isAnswer(entity)\n ? t('authorBox.answeredAtTime')\n : t('authorBox.postedAtTime')\n }\n expert={isAnswer(entity) ? entity.expert : false}\n anonymous={entity.anonymous}\n />\n </Box>\n );\n};\n"],"names":[],"mappings":";;;;;;AAUA,SAAS,SAAS,MAAwC,EAAA;AACxD,EAAO,OAAA,QAAA,IAAY,UAAU,SAAa,IAAA,MAAA;AAC5C;AAEa,MAAA,WAAA,GAAc,CAAC,KAAwC,KAAA;AAClE,EAAA,MAAM,SAAS,KAAM,CAAA,MAAA;AACrB,EAAA,MAAM,EAAE,CAAA,EAAM,GAAA,iBAAA,CAAkB,kBAAkB,CAAA;AAElD,EACE,uBAAA,IAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,OAAQ,EAAA,MAAA;AAAA,MACR,QAAU,EAAA,GAAA;AAAA,MACV,KAAO,EAAA,EAAE,GAAK,EAAA,KAAA,EAAO,gBAAgB,UAAW,EAAA;AAAA,MAChD,EAAI,EAAA,CAAA;AAAA,MAEH,QAAA,EAAA;AAAA,QAAO,MAAA,CAAA,OAAA,IAAW,OAAO,SACxB,oBAAA,GAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YACC,eAAe,MAAO,CAAA,SAAA;AAAA,YACtB,MAAM,MAAO,CAAA,OAAA;AAAA,YACb,KAAA,EAAO,EAAE,yBAAyB,CAAA;AAAA,YAClC,MAAQ,EAAA,KAAA;AAAA,YACR,WAAW,MAAO,CAAA;AAAA;AAAA,SACpB;AAAA,wBAEF,GAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YACC,eAAe,MAAO,CAAA,MAAA;AAAA,YACtB,MAAM,MAAO,CAAA,OAAA;AAAA,YACb,KAAA,EACE,SAAS,MAAM,CAAA,GACX,EAAE,0BAA0B,CAAA,GAC5B,EAAE,wBAAwB,CAAA;AAAA,YAEhC,MAAQ,EAAA,QAAA,CAAS,MAAM,CAAA,GAAI,OAAO,MAAS,GAAA,KAAA;AAAA,YAC3C,WAAW,MAAO,CAAA;AAAA;AAAA;AACpB;AAAA;AAAA,GACF;AAEJ;;;;"}
@@ -14,7 +14,7 @@ import '@drodil/backstage-plugin-qeta-common';
14
14
  import '@backstage/plugin-permission-common';
15
15
  import { useNavigate } from 'react-router-dom';
16
16
  import { RightListContainer, RightList } from '../Utility/RightList.esm.js';
17
- import { makeStyles, ListItem, ListItemText, Box } from '@material-ui/core';
17
+ import { makeStyles, ListItem, ListItemText, Box, Tooltip } from '@material-ui/core';
18
18
  import { Skeleton } from '@material-ui/lab';
19
19
  import { questionRouteRef, articleRouteRef } from '../../routes.esm.js';
20
20
  import numeral from 'numeral';
@@ -130,13 +130,13 @@ const PostHighlightList = (props) => {
130
130
  "aria-label": q.title,
131
131
  children: [
132
132
  /* @__PURE__ */ jsx(Box, { className: voteBoxClass, children: vote }),
133
- /* @__PURE__ */ jsx(
133
+ /* @__PURE__ */ jsx(Tooltip, { title: q.title, arrow: true, children: /* @__PURE__ */ jsx(
134
134
  ListItemText,
135
135
  {
136
136
  primary: q.title,
137
137
  classes: { primary: classes.listItemText }
138
138
  }
139
- )
139
+ ) })
140
140
  ]
141
141
  }
142
142
  ) }, q.id);
@@ -1 +1 @@
1
- {"version":3,"file":"PostHighlightList.esm.js","sources":["../../../src/components/PostHighlightList/PostHighlightList.tsx"],"sourcesContent":["import { Fragment, ReactNode } from 'react';\nimport { PostsQuery, PostType } from '@drodil/backstage-plugin-qeta-common';\nimport { useQetaApi } from '../../hooks';\nimport { useNavigate } from 'react-router-dom';\nimport { RightList, RightListContainer } from '../Utility/RightList';\nimport { Box, ListItem, ListItemText, makeStyles } from '@material-ui/core';\nimport { Skeleton } from '@material-ui/lab';\nimport { qetaTranslationRef } from '../../translation.ts';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { articleRouteRef, questionRouteRef } from '../../routes.ts';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport numeral from 'numeral';\n\nconst useStyles = makeStyles(theme => ({\n listItem: {\n display: 'flex',\n alignItems: 'center',\n padding: '0 4px',\n minHeight: 28,\n cursor: 'pointer',\n transition: 'background 0.2s',\n '&:hover': {\n background: theme.palette.action.hover,\n },\n },\n emptyItem: {\n padding: '0 0 0 0.6rem',\n },\n voteBox: {\n minWidth: 28,\n maxWidth: 28,\n height: 24,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: 4,\n fontWeight: 600,\n marginRight: theme.spacing(1),\n marginLeft: theme.spacing(0.5),\n background: theme.palette.background.paper,\n color: theme.palette.text.primary,\n border: `1px solid ${theme.palette.divider}`,\n },\n voteBoxPositive: {\n background: theme.palette.success.main,\n color: theme.palette.getContrastText(theme.palette.success.main),\n },\n voteBoxNegative: {\n background: theme.palette.error.main,\n color: theme.palette.getContrastText(theme.palette.error.main),\n },\n listItemText: {\n color: theme.palette.text.primary,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n flex: 1,\n },\n}));\nfunction formatShortNumber(num: number): string {\n return num >= 1000 ? numeral(num).format('0.0 a') : num.toString();\n}\n\nexport const PostHighlightList = (props: {\n type: string;\n title: string;\n noQuestionsLabel: string;\n icon?: ReactNode;\n options?: PostsQuery;\n postType?: PostType;\n}) => {\n const {\n value: response,\n loading,\n error,\n } = useQetaApi(\n api =>\n api.getPostsList(props.type, {\n limit: 5,\n type: props.postType,\n includeTags: false,\n includeAttachments: false,\n includeComments: false,\n includeAnswers: false,\n includeVotes: false,\n includeEntities: false,\n includeExperts: false,\n ...props.options,\n }),\n [],\n );\n const { t } = useTranslationRef(qetaTranslationRef);\n const navigate = useNavigate();\n const questionRoute = useRouteRef(questionRouteRef);\n const articleRoute = useRouteRef(articleRouteRef);\n\n const classes = useStyles();\n\n const posts = response?.posts ?? [];\n\n return (\n <RightListContainer>\n <RightList title={props.title} icon={props.icon}>\n {loading &&\n Array.from({ length: 5 }).map((_, i) => (\n <ListItem className={classes.emptyItem} dense key={`skeleton-${i}`}>\n <Skeleton variant=\"rect\" width=\"100%\" height={18} />\n </ListItem>\n ))}\n {error && (\n <ListItem className={classes.emptyItem} dense>\n <ListItemText\n primary={t('highlights.loadError')}\n classes={{ primary: classes.listItemText }}\n />\n </ListItem>\n )}\n {!error && !loading && posts.length === 0 && (\n <ListItem className={classes.emptyItem} dense>\n <ListItemText\n primary={props.noQuestionsLabel}\n classes={{ primary: classes.listItemText }}\n />\n </ListItem>\n )}\n {!error &&\n posts.map(q => {\n const route = q.type === 'question' ? questionRoute : articleRoute;\n const vote = formatShortNumber(q.score);\n let voteBoxClass = classes.voteBox;\n if (q.correctAnswer) {\n voteBoxClass = `${classes.voteBox} ${classes.voteBoxPositive}`;\n } else if (q.score < 0) {\n voteBoxClass = `${classes.voteBox} ${classes.voteBoxNegative}`;\n }\n return (\n <Fragment key={q.id}>\n <ListItem\n dense\n button\n className={classes.listItem}\n onClick={() => navigate(route({ id: q.id.toString(10) }))}\n aria-label={q.title}\n >\n <Box className={voteBoxClass}>{vote}</Box>\n <ListItemText\n primary={q.title}\n classes={{ primary: classes.listItemText }}\n />\n </ListItem>\n </Fragment>\n );\n })}\n </RightList>\n </RightListContainer>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PostHighlightList.esm.js","sources":["../../../src/components/PostHighlightList/PostHighlightList.tsx"],"sourcesContent":["import { Fragment, ReactNode } from 'react';\nimport { PostsQuery, PostType } from '@drodil/backstage-plugin-qeta-common';\nimport { useQetaApi } from '../../hooks';\nimport { useNavigate } from 'react-router-dom';\nimport { RightList, RightListContainer } from '../Utility/RightList';\nimport {\n Box,\n ListItem,\n ListItemText,\n makeStyles,\n Tooltip,\n} from '@material-ui/core';\nimport { Skeleton } from '@material-ui/lab';\nimport { qetaTranslationRef } from '../../translation.ts';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { articleRouteRef, questionRouteRef } from '../../routes.ts';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport numeral from 'numeral';\n\nconst useStyles = makeStyles(theme => ({\n listItem: {\n display: 'flex',\n alignItems: 'center',\n padding: '0 4px',\n minHeight: 28,\n cursor: 'pointer',\n transition: 'background 0.2s',\n '&:hover': {\n background: theme.palette.action.hover,\n },\n },\n emptyItem: {\n padding: '0 0 0 0.6rem',\n },\n voteBox: {\n minWidth: 28,\n maxWidth: 28,\n height: 24,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: 4,\n fontWeight: 600,\n marginRight: theme.spacing(1),\n marginLeft: theme.spacing(0.5),\n background: theme.palette.background.paper,\n color: theme.palette.text.primary,\n border: `1px solid ${theme.palette.divider}`,\n },\n voteBoxPositive: {\n background: theme.palette.success.main,\n color: theme.palette.getContrastText(theme.palette.success.main),\n },\n voteBoxNegative: {\n background: theme.palette.error.main,\n color: theme.palette.getContrastText(theme.palette.error.main),\n },\n listItemText: {\n color: theme.palette.text.primary,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n flex: 1,\n },\n}));\nfunction formatShortNumber(num: number): string {\n return num >= 1000 ? numeral(num).format('0.0 a') : num.toString();\n}\n\nexport const PostHighlightList = (props: {\n type: string;\n title: string;\n noQuestionsLabel: string;\n icon?: ReactNode;\n options?: PostsQuery;\n postType?: PostType;\n}) => {\n const {\n value: response,\n loading,\n error,\n } = useQetaApi(\n api =>\n api.getPostsList(props.type, {\n limit: 5,\n type: props.postType,\n includeTags: false,\n includeAttachments: false,\n includeComments: false,\n includeAnswers: false,\n includeVotes: false,\n includeEntities: false,\n includeExperts: false,\n ...props.options,\n }),\n [],\n );\n const { t } = useTranslationRef(qetaTranslationRef);\n const navigate = useNavigate();\n const questionRoute = useRouteRef(questionRouteRef);\n const articleRoute = useRouteRef(articleRouteRef);\n\n const classes = useStyles();\n\n const posts = response?.posts ?? [];\n\n return (\n <RightListContainer>\n <RightList title={props.title} icon={props.icon}>\n {loading &&\n Array.from({ length: 5 }).map((_, i) => (\n <ListItem className={classes.emptyItem} dense key={`skeleton-${i}`}>\n <Skeleton variant=\"rect\" width=\"100%\" height={18} />\n </ListItem>\n ))}\n {error && (\n <ListItem className={classes.emptyItem} dense>\n <ListItemText\n primary={t('highlights.loadError')}\n classes={{ primary: classes.listItemText }}\n />\n </ListItem>\n )}\n {!error && !loading && posts.length === 0 && (\n <ListItem className={classes.emptyItem} dense>\n <ListItemText\n primary={props.noQuestionsLabel}\n classes={{ primary: classes.listItemText }}\n />\n </ListItem>\n )}\n {!error &&\n posts.map(q => {\n const route = q.type === 'question' ? questionRoute : articleRoute;\n const vote = formatShortNumber(q.score);\n let voteBoxClass = classes.voteBox;\n if (q.correctAnswer) {\n voteBoxClass = `${classes.voteBox} ${classes.voteBoxPositive}`;\n } else if (q.score < 0) {\n voteBoxClass = `${classes.voteBox} ${classes.voteBoxNegative}`;\n }\n return (\n <Fragment key={q.id}>\n <ListItem\n dense\n button\n className={classes.listItem}\n onClick={() => navigate(route({ id: q.id.toString(10) }))}\n aria-label={q.title}\n >\n <Box className={voteBoxClass}>{vote}</Box>\n <Tooltip title={q.title} arrow>\n <ListItemText\n primary={q.title}\n classes={{ primary: classes.listItemText }}\n />\n </Tooltip>\n </ListItem>\n </Fragment>\n );\n })}\n </RightList>\n </RightListContainer>\n );\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.33.2",
10
+ "version": "3.33.4",
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.1",
58
58
  "@backstage/plugin-permission-react": "^0.4.36",
59
59
  "@backstage/plugin-signals-react": "^0.0.15",
60
- "@drodil/backstage-plugin-qeta-common": "^3.33.2",
60
+ "@drodil/backstage-plugin-qeta-common": "^3.33.4",
61
61
  "@jsdevtools/rehype-toc": "^3.0.2",
62
62
  "@material-ui/core": "^4.12.2",
63
63
  "@material-ui/icons": "^4.11.3",