@drodil/backstage-plugin-qeta-react 3.4.0 → 3.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/Buttons/VoteButtons.esm.js +1 -1
- package/dist/components/Buttons/VoteButtons.esm.js.map +1 -1
- package/dist/components/CollectionsGrid/CollectionsGrid.esm.js +4 -0
- package/dist/components/CollectionsGrid/CollectionsGrid.esm.js.map +1 -1
- package/dist/components/CollectionsGrid/NoCollectionsCard.esm.js +25 -0
- package/dist/components/CollectionsGrid/NoCollectionsCard.esm.js.map +1 -0
- package/dist/components/EntitiesGrid/EntitiesGrid.esm.js +4 -0
- package/dist/components/EntitiesGrid/EntitiesGrid.esm.js.map +1 -1
- package/dist/components/EntitiesGrid/NoEntitiesCard.esm.js +25 -0
- package/dist/components/EntitiesGrid/NoEntitiesCard.esm.js.map +1 -0
- package/dist/components/TagsGrid/NoTagsCard.esm.js +25 -0
- package/dist/components/TagsGrid/NoTagsCard.esm.js.map +1 -0
- package/dist/components/TagsGrid/TagsGrid.esm.js +4 -0
- package/dist/components/TagsGrid/TagsGrid.esm.js.map +1 -1
- package/dist/components/UsersGrid/NoUsersCard.esm.js +25 -0
- package/dist/components/UsersGrid/NoUsersCard.esm.js.map +1 -0
- package/dist/components/UsersGrid/UsersGrid.esm.js +4 -0
- package/dist/components/UsersGrid/UsersGrid.esm.js.map +1 -1
- package/dist/hooks/useVoting.esm.js +30 -0
- package/dist/hooks/useVoting.esm.js.map +1 -1
- package/package.json +2 -2
|
@@ -45,7 +45,7 @@ const VoteButtons = (props) => {
|
|
|
45
45
|
onClick: voteUp
|
|
46
46
|
},
|
|
47
47
|
/* @__PURE__ */ React.createElement(ArrowUpward, null)
|
|
48
|
-
))), /* @__PURE__ */ React.createElement(Typography, { variant: "h6" }, score), /* @__PURE__ */ React.createElement(Tooltip, { title: voteDownTooltip }, /* @__PURE__ */ React.createElement("span", null, /* @__PURE__ */ React.createElement(
|
|
48
|
+
))), /* @__PURE__ */ React.createElement(Typography, { variant: "h6", style: { userSelect: "none" } }, score), /* @__PURE__ */ React.createElement(Tooltip, { title: voteDownTooltip }, /* @__PURE__ */ React.createElement("span", null, /* @__PURE__ */ React.createElement(
|
|
49
49
|
IconButton,
|
|
50
50
|
{
|
|
51
51
|
"aria-label": "vote down",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VoteButtons.esm.js","sources":["../../../src/components/Buttons/VoteButtons.tsx"],"sourcesContent":["import {\n AnswerResponse,\n PostResponse,\n} from '@drodil/backstage-plugin-qeta-common';\nimport {\n Box,\n createStyles,\n IconButton,\n makeStyles,\n Theme,\n Tooltip,\n Typography,\n} from '@material-ui/core';\nimport ArrowDownward from '@material-ui/icons/ArrowDownward';\nimport ArrowUpward from '@material-ui/icons/ArrowUpward';\nimport Check from '@material-ui/icons/Check';\nimport React from 'react';\nimport { useVoting } from '../../hooks/useVoting';\n\nexport type QetaVoteButtonsClassKey =\n | 'qetaCorrectAnswerSelected'\n | 'qetaCorrectAnswer'\n | 'voteButtonContainer';\n\nconst useStyles = makeStyles(\n (theme: Theme) =>\n createStyles({\n qetaCorrectAnswerSelected: {\n color: theme.palette.success.main,\n },\n qetaCorrectAnswer: {\n color: theme.palette.grey[500],\n },\n voteButtonContainer: {\n borderWidth: '1px',\n borderColor: 'white',\n },\n }),\n { name: 'QetaVoteButtons' },\n);\n\nexport const VoteButtons = (props: {\n entity: PostResponse | AnswerResponse;\n post?: PostResponse;\n}) => {\n const {\n voteUpTooltip,\n ownVote,\n voteUp,\n score,\n voteDownTooltip,\n voteDown,\n correctAnswer,\n correctTooltip,\n toggleCorrectAnswer,\n } = useVoting(props.entity);\n const own = props.entity.own ?? false;\n const classes = useStyles();\n\n return (\n <React.Fragment>\n <Tooltip title={voteUpTooltip}>\n <span className={classes.voteButtonContainer}>\n <IconButton\n aria-label=\"vote up\"\n color={ownVote > 0 ? 'primary' : 'default'}\n className={ownVote > 0 ? 'qetaVoteUpSelected' : 'qetaVoteUp'}\n disabled={own}\n size=\"small\"\n onClick={voteUp}\n >\n <ArrowUpward />\n </IconButton>\n </span>\n </Tooltip>\n <Typography variant=\"h6\"
|
|
1
|
+
{"version":3,"file":"VoteButtons.esm.js","sources":["../../../src/components/Buttons/VoteButtons.tsx"],"sourcesContent":["import {\n AnswerResponse,\n PostResponse,\n} from '@drodil/backstage-plugin-qeta-common';\nimport {\n Box,\n createStyles,\n IconButton,\n makeStyles,\n Theme,\n Tooltip,\n Typography,\n} from '@material-ui/core';\nimport ArrowDownward from '@material-ui/icons/ArrowDownward';\nimport ArrowUpward from '@material-ui/icons/ArrowUpward';\nimport Check from '@material-ui/icons/Check';\nimport React from 'react';\nimport { useVoting } from '../../hooks/useVoting';\n\nexport type QetaVoteButtonsClassKey =\n | 'qetaCorrectAnswerSelected'\n | 'qetaCorrectAnswer'\n | 'voteButtonContainer';\n\nconst useStyles = makeStyles(\n (theme: Theme) =>\n createStyles({\n qetaCorrectAnswerSelected: {\n color: theme.palette.success.main,\n },\n qetaCorrectAnswer: {\n color: theme.palette.grey[500],\n },\n voteButtonContainer: {\n borderWidth: '1px',\n borderColor: 'white',\n },\n }),\n { name: 'QetaVoteButtons' },\n);\n\nexport const VoteButtons = (props: {\n entity: PostResponse | AnswerResponse;\n post?: PostResponse;\n}) => {\n const {\n voteUpTooltip,\n ownVote,\n voteUp,\n score,\n voteDownTooltip,\n voteDown,\n correctAnswer,\n correctTooltip,\n toggleCorrectAnswer,\n } = useVoting(props.entity);\n const own = props.entity.own ?? false;\n const classes = useStyles();\n\n return (\n <React.Fragment>\n <Tooltip title={voteUpTooltip}>\n <span className={classes.voteButtonContainer}>\n <IconButton\n aria-label=\"vote up\"\n color={ownVote > 0 ? 'primary' : 'default'}\n className={ownVote > 0 ? 'qetaVoteUpSelected' : 'qetaVoteUp'}\n disabled={own}\n size=\"small\"\n onClick={voteUp}\n >\n <ArrowUpward />\n </IconButton>\n </span>\n </Tooltip>\n <Typography variant=\"h6\" style={{ userSelect: 'none' }}>\n {score}\n </Typography>\n <Tooltip title={voteDownTooltip}>\n <span>\n <IconButton\n aria-label=\"vote down\"\n color={ownVote < 0 ? 'primary' : 'default'}\n className={ownVote < 0 ? 'qetaVoteDownSelected' : 'qetaVoteDown'}\n disabled={own}\n size=\"small\"\n onClick={voteDown}\n >\n <ArrowDownward />\n </IconButton>\n </span>\n </Tooltip>\n {'correct' in props.entity &&\n (props.post?.own || props.post?.canEdit || correctAnswer) && (\n <Box>\n <Tooltip title={correctTooltip}>\n <span>\n <IconButton\n aria-label=\"mark correct\"\n size=\"small\"\n onClick={\n props.post?.own || props.post?.canEdit\n ? toggleCorrectAnswer\n : undefined\n }\n >\n <Check\n className={\n correctAnswer\n ? classes.qetaCorrectAnswerSelected\n : classes.qetaCorrectAnswer\n }\n />\n </IconButton>\n </span>\n </Tooltip>\n </Box>\n )}\n </React.Fragment>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,7 @@ import '../../hooks/useStyles.esm.js';
|
|
|
9
9
|
import 'react-use/lib/useAsync';
|
|
10
10
|
import useDebounce from 'react-use/lib/useDebounce';
|
|
11
11
|
import { QetaPagination } from '../QetaPagination/QetaPagination.esm.js';
|
|
12
|
+
import { NoCollectionsCard } from './NoCollectionsCard.esm.js';
|
|
12
13
|
|
|
13
14
|
const CollectionsGrid = (props) => {
|
|
14
15
|
const { t } = useTranslation();
|
|
@@ -49,6 +50,9 @@ const CollectionsGrid = (props) => {
|
|
|
49
50
|
setPageCount(Math.ceil(response.total / collectionsPerPage));
|
|
50
51
|
}
|
|
51
52
|
}, [response, collectionsPerPage]);
|
|
53
|
+
if (!response?.collections || response.collections.length === 0) {
|
|
54
|
+
return /* @__PURE__ */ React.createElement(NoCollectionsCard, null);
|
|
55
|
+
}
|
|
52
56
|
return /* @__PURE__ */ React.createElement(Grid, { container: true }, /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React.createElement(
|
|
53
57
|
TextField,
|
|
54
58
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CollectionsGrid.esm.js","sources":["../../../src/components/CollectionsGrid/CollectionsGrid.tsx"],"sourcesContent":["import React, { useEffect } from 'react';\nimport { Grid, IconButton, TextField } from '@material-ui/core';\nimport { CollectionsGridContent } from './CollectionsGridContent';\nimport { useQetaApi, useTranslation } from '../../hooks';\nimport useDebounce from 'react-use/lib/useDebounce';\nimport { QetaPagination } from '../QetaPagination/QetaPagination';\n\nexport type CollectionsGridProps = {\n owner?: string;\n};\n\ntype CollectionFilters = {\n order: 'asc' | 'desc';\n orderBy?: 'created' | 'owner';\n searchQuery: string;\n owner?: string;\n};\n\nexport const CollectionsGrid = (props: CollectionsGridProps) => {\n const { t } = useTranslation();\n const [page, setPage] = React.useState(1);\n const [pageCount, setPageCount] = React.useState(1);\n const [searchQuery, setSearchQuery] = React.useState('');\n const [collectionsPerPage, setCollectionsPerPage] = React.useState(25);\n const [filters, setFilters] = React.useState<CollectionFilters>({\n order: 'desc',\n searchQuery: '',\n owner: props.owner,\n });\n\n const {\n value: response,\n loading,\n error,\n } = useQetaApi(\n api => {\n return api.getCollections({\n limit: collectionsPerPage,\n offset: (page - 1) * collectionsPerPage,\n ...filters,\n });\n },\n [collectionsPerPage, page, filters],\n );\n\n useDebounce(\n () => {\n if (filters.searchQuery !== searchQuery) {\n setFilters({ ...filters, searchQuery: searchQuery });\n }\n },\n 400,\n [searchQuery],\n );\n\n useEffect(() => {\n if (response) {\n setPageCount(Math.ceil(response.total / collectionsPerPage));\n }\n }, [response, collectionsPerPage]);\n\n return (\n <Grid container>\n <Grid item xs={12}>\n <TextField\n id=\"search-bar\"\n className=\"text qetaUsersContainerSearchInput\"\n onChange={(\n event: React.ChangeEvent<HTMLTextAreaElement | HTMLInputElement>,\n ) => setSearchQuery(event.target.value)}\n label={t('collectionsPage.search.label')}\n variant=\"outlined\"\n placeholder={t('collectionsPage.search.placeholder')}\n size=\"small\"\n />\n <IconButton type=\"submit\" aria-label=\"search\" />\n </Grid>\n\n <CollectionsGridContent\n loading={loading}\n error={error}\n response={response}\n />\n <QetaPagination\n pageSize={collectionsPerPage}\n handlePageChange={(_e, p) => setPage(p)}\n handlePageSizeChange={e =>\n setCollectionsPerPage(Number(e.target.value))\n }\n page={page}\n pageCount={pageCount}\n />\n </Grid>\n );\n};\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"CollectionsGrid.esm.js","sources":["../../../src/components/CollectionsGrid/CollectionsGrid.tsx"],"sourcesContent":["import React, { useEffect } from 'react';\nimport { Grid, IconButton, TextField } from '@material-ui/core';\nimport { CollectionsGridContent } from './CollectionsGridContent';\nimport { useQetaApi, useTranslation } from '../../hooks';\nimport useDebounce from 'react-use/lib/useDebounce';\nimport { QetaPagination } from '../QetaPagination/QetaPagination';\nimport { NoCollectionsCard } from './NoCollectionsCard';\n\nexport type CollectionsGridProps = {\n owner?: string;\n};\n\ntype CollectionFilters = {\n order: 'asc' | 'desc';\n orderBy?: 'created' | 'owner';\n searchQuery: string;\n owner?: string;\n};\n\nexport const CollectionsGrid = (props: CollectionsGridProps) => {\n const { t } = useTranslation();\n const [page, setPage] = React.useState(1);\n const [pageCount, setPageCount] = React.useState(1);\n const [searchQuery, setSearchQuery] = React.useState('');\n const [collectionsPerPage, setCollectionsPerPage] = React.useState(25);\n const [filters, setFilters] = React.useState<CollectionFilters>({\n order: 'desc',\n searchQuery: '',\n owner: props.owner,\n });\n\n const {\n value: response,\n loading,\n error,\n } = useQetaApi(\n api => {\n return api.getCollections({\n limit: collectionsPerPage,\n offset: (page - 1) * collectionsPerPage,\n ...filters,\n });\n },\n [collectionsPerPage, page, filters],\n );\n\n useDebounce(\n () => {\n if (filters.searchQuery !== searchQuery) {\n setFilters({ ...filters, searchQuery: searchQuery });\n }\n },\n 400,\n [searchQuery],\n );\n\n useEffect(() => {\n if (response) {\n setPageCount(Math.ceil(response.total / collectionsPerPage));\n }\n }, [response, collectionsPerPage]);\n\n if (!response?.collections || response.collections.length === 0) {\n return <NoCollectionsCard />;\n }\n\n return (\n <Grid container>\n <Grid item xs={12}>\n <TextField\n id=\"search-bar\"\n className=\"text qetaUsersContainerSearchInput\"\n onChange={(\n event: React.ChangeEvent<HTMLTextAreaElement | HTMLInputElement>,\n ) => setSearchQuery(event.target.value)}\n label={t('collectionsPage.search.label')}\n variant=\"outlined\"\n placeholder={t('collectionsPage.search.placeholder')}\n size=\"small\"\n />\n <IconButton type=\"submit\" aria-label=\"search\" />\n </Grid>\n\n <CollectionsGridContent\n loading={loading}\n error={error}\n response={response}\n />\n <QetaPagination\n pageSize={collectionsPerPage}\n handlePageChange={(_e, p) => setPage(p)}\n handlePageSizeChange={e =>\n setCollectionsPerPage(Number(e.target.value))\n }\n page={page}\n pageCount={pageCount}\n />\n </Grid>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Card, CardContent, Grid, Typography } from '@material-ui/core';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import '@backstage/core-plugin-api';
|
|
4
|
+
import '../../api.esm.js';
|
|
5
|
+
import 'react-use';
|
|
6
|
+
import { useTranslation } from '../../hooks/useTranslation.esm.js';
|
|
7
|
+
import '../../hooks/useStyles.esm.js';
|
|
8
|
+
import 'react-use/lib/useAsync';
|
|
9
|
+
|
|
10
|
+
const NoCollectionsCard = () => {
|
|
11
|
+
const { t } = useTranslation();
|
|
12
|
+
return /* @__PURE__ */ React.createElement(Card, { style: { marginTop: "2rem" } }, /* @__PURE__ */ React.createElement(CardContent, null, /* @__PURE__ */ React.createElement(
|
|
13
|
+
Grid,
|
|
14
|
+
{
|
|
15
|
+
container: true,
|
|
16
|
+
justifyContent: "center",
|
|
17
|
+
alignItems: "center",
|
|
18
|
+
direction: "column"
|
|
19
|
+
},
|
|
20
|
+
/* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(Typography, { variant: "h6" }, t(`common.collections`, { count: 0 })))
|
|
21
|
+
)));
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export { NoCollectionsCard };
|
|
25
|
+
//# sourceMappingURL=NoCollectionsCard.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NoCollectionsCard.esm.js","sources":["../../../src/components/CollectionsGrid/NoCollectionsCard.tsx"],"sourcesContent":["import { Card, CardContent, Grid, Typography } from '@material-ui/core';\nimport React from 'react';\nimport { useTranslation } from '../../hooks';\n\nexport const NoCollectionsCard = () => {\n const { t } = useTranslation();\n\n return (\n <Card style={{ marginTop: '2rem' }}>\n <CardContent>\n <Grid\n container\n justifyContent=\"center\"\n alignItems=\"center\"\n direction=\"column\"\n >\n <Grid item>\n <Typography variant=\"h6\">\n {t(`common.collections`, { count: 0 })}\n </Typography>\n </Grid>\n </Grid>\n </CardContent>\n </Card>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;AAIO,MAAM,oBAAoB,MAAM;AACrC,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,cAAe,EAAA,CAAA;AAE7B,EACE,uBAAA,KAAA,CAAA,aAAA,CAAC,QAAK,KAAO,EAAA,EAAE,WAAW,MAAO,EAAA,EAAA,sCAC9B,WACC,EAAA,IAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,SAAS,EAAA,IAAA;AAAA,MACT,cAAe,EAAA,QAAA;AAAA,MACf,UAAW,EAAA,QAAA;AAAA,MACX,SAAU,EAAA,QAAA;AAAA,KAAA;AAAA,oBAET,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAA,sCACP,UAAW,EAAA,EAAA,OAAA,EAAQ,IACjB,EAAA,EAAA,CAAA,CAAE,sBAAsB,EAAE,KAAA,EAAO,CAAE,EAAC,CACvC,CACF,CAAA;AAAA,GAEJ,CACF,CAAA,CAAA;AAEJ;;;;"}
|
|
@@ -9,6 +9,7 @@ import 'react-use/lib/useAsync';
|
|
|
9
9
|
import useDebounce from 'react-use/lib/useDebounce';
|
|
10
10
|
import { QetaPagination } from '../QetaPagination/QetaPagination.esm.js';
|
|
11
11
|
import { EntitiesGridContent } from './EntitiesGridContent.esm.js';
|
|
12
|
+
import { NoEntitiesCard } from './NoEntitiesCard.esm.js';
|
|
12
13
|
|
|
13
14
|
const EntitiesGrid = () => {
|
|
14
15
|
const [page, setPage] = React.useState(1);
|
|
@@ -50,6 +51,9 @@ const EntitiesGrid = () => {
|
|
|
50
51
|
setPageCount(Math.ceil(response.total / entitiesPerPage));
|
|
51
52
|
}
|
|
52
53
|
}, [response, entitiesPerPage]);
|
|
54
|
+
if (!response?.entities || response.entities.length === 0) {
|
|
55
|
+
return /* @__PURE__ */ React.createElement(NoEntitiesCard, null);
|
|
56
|
+
}
|
|
53
57
|
return /* @__PURE__ */ React.createElement(Grid, { container: true, className: "qetaEntitiesContainer" }, /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React.createElement(
|
|
54
58
|
TextField,
|
|
55
59
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EntitiesGrid.esm.js","sources":["../../../src/components/EntitiesGrid/EntitiesGrid.tsx"],"sourcesContent":["import { Grid, IconButton, TextField } from '@material-ui/core';\nimport React, { useEffect } from 'react';\nimport { useQetaApi, useTranslation } from '../../hooks';\nimport useDebounce from 'react-use/lib/useDebounce';\nimport { QetaPagination } from '../QetaPagination/QetaPagination';\nimport { EntitiesGridContent } from './EntitiesGridContent';\n\ntype EntityFilters = {\n order: 'asc' | 'desc';\n orderBy?: 'entityRef';\n searchQuery: string;\n};\n\nexport const EntitiesGrid = () => {\n const [page, setPage] = React.useState(1);\n const [pageCount, setPageCount] = React.useState(1);\n const [entitiesPerPage, setEntitiesPerPage] = React.useState(25);\n const [searchQuery, setSearchQuery] = React.useState('');\n const [filters, setFilters] = React.useState<EntityFilters>({\n order: 'desc',\n searchQuery: '',\n });\n const { t } = useTranslation();\n\n const {\n value: response,\n loading,\n error,\n } = useQetaApi(\n api =>\n api.getEntities({\n limit: entitiesPerPage,\n offset: (page - 1) * entitiesPerPage,\n ...filters,\n }),\n [entitiesPerPage, page, filters],\n );\n\n const onSearchQueryChange = (val: string) => {\n setPage(1);\n setSearchQuery(val);\n };\n\n useDebounce(\n () => {\n if (filters.searchQuery !== searchQuery) {\n setFilters({ ...filters, searchQuery: searchQuery });\n }\n },\n 400,\n [searchQuery],\n );\n\n useEffect(() => {\n if (response) {\n setPageCount(Math.ceil(response.total / entitiesPerPage));\n }\n }, [response, entitiesPerPage]);\n\n return (\n <Grid container className=\"qetaEntitiesContainer\">\n <Grid item xs={12}>\n <TextField\n id=\"search-bar\"\n className=\"text qetaEntitiesContainerSearchInput\"\n onChange={(\n event: React.ChangeEvent<HTMLTextAreaElement | HTMLInputElement>,\n ) => onSearchQueryChange(event.target.value)}\n label={t('entitiesPage.search.label')}\n variant=\"outlined\"\n placeholder={t('entitiesPage.search.placeholder')}\n size=\"small\"\n />\n <IconButton type=\"submit\" aria-label=\"search\" />\n </Grid>\n <EntitiesGridContent\n response={response}\n loading={loading}\n error={error}\n />\n <QetaPagination\n pageSize={entitiesPerPage}\n handlePageChange={(_e, p) => setPage(p)}\n handlePageSizeChange={e => setEntitiesPerPage(Number(e.target.value))}\n page={page}\n pageCount={pageCount}\n />\n </Grid>\n );\n};\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"EntitiesGrid.esm.js","sources":["../../../src/components/EntitiesGrid/EntitiesGrid.tsx"],"sourcesContent":["import { Grid, IconButton, TextField } from '@material-ui/core';\nimport React, { useEffect } from 'react';\nimport { useQetaApi, useTranslation } from '../../hooks';\nimport useDebounce from 'react-use/lib/useDebounce';\nimport { QetaPagination } from '../QetaPagination/QetaPagination';\nimport { EntitiesGridContent } from './EntitiesGridContent';\nimport { NoEntitiesCard } from './NoEntitiesCard';\n\ntype EntityFilters = {\n order: 'asc' | 'desc';\n orderBy?: 'entityRef';\n searchQuery: string;\n};\n\nexport const EntitiesGrid = () => {\n const [page, setPage] = React.useState(1);\n const [pageCount, setPageCount] = React.useState(1);\n const [entitiesPerPage, setEntitiesPerPage] = React.useState(25);\n const [searchQuery, setSearchQuery] = React.useState('');\n const [filters, setFilters] = React.useState<EntityFilters>({\n order: 'desc',\n searchQuery: '',\n });\n const { t } = useTranslation();\n\n const {\n value: response,\n loading,\n error,\n } = useQetaApi(\n api =>\n api.getEntities({\n limit: entitiesPerPage,\n offset: (page - 1) * entitiesPerPage,\n ...filters,\n }),\n [entitiesPerPage, page, filters],\n );\n\n const onSearchQueryChange = (val: string) => {\n setPage(1);\n setSearchQuery(val);\n };\n\n useDebounce(\n () => {\n if (filters.searchQuery !== searchQuery) {\n setFilters({ ...filters, searchQuery: searchQuery });\n }\n },\n 400,\n [searchQuery],\n );\n\n useEffect(() => {\n if (response) {\n setPageCount(Math.ceil(response.total / entitiesPerPage));\n }\n }, [response, entitiesPerPage]);\n\n if (!response?.entities || response.entities.length === 0) {\n return <NoEntitiesCard />;\n }\n\n return (\n <Grid container className=\"qetaEntitiesContainer\">\n <Grid item xs={12}>\n <TextField\n id=\"search-bar\"\n className=\"text qetaEntitiesContainerSearchInput\"\n onChange={(\n event: React.ChangeEvent<HTMLTextAreaElement | HTMLInputElement>,\n ) => onSearchQueryChange(event.target.value)}\n label={t('entitiesPage.search.label')}\n variant=\"outlined\"\n placeholder={t('entitiesPage.search.placeholder')}\n size=\"small\"\n />\n <IconButton type=\"submit\" aria-label=\"search\" />\n </Grid>\n <EntitiesGridContent\n response={response}\n loading={loading}\n error={error}\n />\n <QetaPagination\n pageSize={entitiesPerPage}\n handlePageChange={(_e, p) => setPage(p)}\n handlePageSizeChange={e => setEntitiesPerPage(Number(e.target.value))}\n page={page}\n pageCount={pageCount}\n />\n </Grid>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Card, CardContent, Grid, Typography } from '@material-ui/core';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import '@backstage/core-plugin-api';
|
|
4
|
+
import '../../api.esm.js';
|
|
5
|
+
import 'react-use';
|
|
6
|
+
import { useTranslation } from '../../hooks/useTranslation.esm.js';
|
|
7
|
+
import '../../hooks/useStyles.esm.js';
|
|
8
|
+
import 'react-use/lib/useAsync';
|
|
9
|
+
|
|
10
|
+
const NoEntitiesCard = () => {
|
|
11
|
+
const { t } = useTranslation();
|
|
12
|
+
return /* @__PURE__ */ React.createElement(Card, { style: { marginTop: "2rem" } }, /* @__PURE__ */ React.createElement(CardContent, null, /* @__PURE__ */ React.createElement(
|
|
13
|
+
Grid,
|
|
14
|
+
{
|
|
15
|
+
container: true,
|
|
16
|
+
justifyContent: "center",
|
|
17
|
+
alignItems: "center",
|
|
18
|
+
direction: "column"
|
|
19
|
+
},
|
|
20
|
+
/* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(Typography, { variant: "h6" }, t(`entitiesPage.entities`, { count: 0 })))
|
|
21
|
+
)));
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export { NoEntitiesCard };
|
|
25
|
+
//# sourceMappingURL=NoEntitiesCard.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NoEntitiesCard.esm.js","sources":["../../../src/components/EntitiesGrid/NoEntitiesCard.tsx"],"sourcesContent":["import { Card, CardContent, Grid, Typography } from '@material-ui/core';\nimport React from 'react';\nimport { useTranslation } from '../../hooks';\n\nexport const NoEntitiesCard = () => {\n const { t } = useTranslation();\n\n return (\n <Card style={{ marginTop: '2rem' }}>\n <CardContent>\n <Grid\n container\n justifyContent=\"center\"\n alignItems=\"center\"\n direction=\"column\"\n >\n <Grid item>\n <Typography variant=\"h6\">\n {t(`entitiesPage.entities`, { count: 0 })}\n </Typography>\n </Grid>\n </Grid>\n </CardContent>\n </Card>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;AAIO,MAAM,iBAAiB,MAAM;AAClC,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,cAAe,EAAA,CAAA;AAE7B,EACE,uBAAA,KAAA,CAAA,aAAA,CAAC,QAAK,KAAO,EAAA,EAAE,WAAW,MAAO,EAAA,EAAA,sCAC9B,WACC,EAAA,IAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,SAAS,EAAA,IAAA;AAAA,MACT,cAAe,EAAA,QAAA;AAAA,MACf,UAAW,EAAA,QAAA;AAAA,MACX,SAAU,EAAA,QAAA;AAAA,KAAA;AAAA,oBAET,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAA,sCACP,UAAW,EAAA,EAAA,OAAA,EAAQ,IACjB,EAAA,EAAA,CAAA,CAAE,yBAAyB,EAAE,KAAA,EAAO,CAAE,EAAC,CAC1C,CACF,CAAA;AAAA,GAEJ,CACF,CAAA,CAAA;AAEJ;;;;"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Card, CardContent, Grid, Typography } from '@material-ui/core';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import '@backstage/core-plugin-api';
|
|
4
|
+
import '../../api.esm.js';
|
|
5
|
+
import 'react-use';
|
|
6
|
+
import { useTranslation } from '../../hooks/useTranslation.esm.js';
|
|
7
|
+
import '../../hooks/useStyles.esm.js';
|
|
8
|
+
import 'react-use/lib/useAsync';
|
|
9
|
+
|
|
10
|
+
const NoTagsCard = () => {
|
|
11
|
+
const { t } = useTranslation();
|
|
12
|
+
return /* @__PURE__ */ React.createElement(Card, { style: { marginTop: "2rem" } }, /* @__PURE__ */ React.createElement(CardContent, null, /* @__PURE__ */ React.createElement(
|
|
13
|
+
Grid,
|
|
14
|
+
{
|
|
15
|
+
container: true,
|
|
16
|
+
justifyContent: "center",
|
|
17
|
+
alignItems: "center",
|
|
18
|
+
direction: "column"
|
|
19
|
+
},
|
|
20
|
+
/* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(Typography, { variant: "h6" }, t(`tagPage.tags`, { count: 0 })))
|
|
21
|
+
)));
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export { NoTagsCard };
|
|
25
|
+
//# sourceMappingURL=NoTagsCard.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NoTagsCard.esm.js","sources":["../../../src/components/TagsGrid/NoTagsCard.tsx"],"sourcesContent":["import { Card, CardContent, Grid, Typography } from '@material-ui/core';\nimport React from 'react';\nimport { useTranslation } from '../../hooks';\n\nexport const NoTagsCard = () => {\n const { t } = useTranslation();\n\n return (\n <Card style={{ marginTop: '2rem' }}>\n <CardContent>\n <Grid\n container\n justifyContent=\"center\"\n alignItems=\"center\"\n direction=\"column\"\n >\n <Grid item>\n <Typography variant=\"h6\">\n {t(`tagPage.tags`, { count: 0 })}\n </Typography>\n </Grid>\n </Grid>\n </CardContent>\n </Card>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;AAIO,MAAM,aAAa,MAAM;AAC9B,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,cAAe,EAAA,CAAA;AAE7B,EACE,uBAAA,KAAA,CAAA,aAAA,CAAC,QAAK,KAAO,EAAA,EAAE,WAAW,MAAO,EAAA,EAAA,sCAC9B,WACC,EAAA,IAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,SAAS,EAAA,IAAA;AAAA,MACT,cAAe,EAAA,QAAA;AAAA,MACf,UAAW,EAAA,QAAA;AAAA,MACX,SAAU,EAAA,QAAA;AAAA,KAAA;AAAA,oBAET,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAA,sCACP,UAAW,EAAA,EAAA,OAAA,EAAQ,IACjB,EAAA,EAAA,CAAA,CAAE,gBAAgB,EAAE,KAAA,EAAO,CAAE,EAAC,CACjC,CACF,CAAA;AAAA,GAEJ,CACF,CAAA,CAAA;AAEJ;;;;"}
|
|
@@ -9,6 +9,7 @@ import 'react-use/lib/useAsync';
|
|
|
9
9
|
import { QetaPagination } from '../QetaPagination/QetaPagination.esm.js';
|
|
10
10
|
import useDebounce from 'react-use/lib/useDebounce';
|
|
11
11
|
import { TagsGridContent } from './TagsGridContent.esm.js';
|
|
12
|
+
import { NoTagsCard } from './NoTagsCard.esm.js';
|
|
12
13
|
|
|
13
14
|
const TagsGrid = () => {
|
|
14
15
|
const [page, setPage] = React.useState(1);
|
|
@@ -55,6 +56,9 @@ const TagsGrid = () => {
|
|
|
55
56
|
const onTagEdit = () => {
|
|
56
57
|
retry();
|
|
57
58
|
};
|
|
59
|
+
if (!response?.tags || response.tags.length === 0) {
|
|
60
|
+
return /* @__PURE__ */ React.createElement(NoTagsCard, null);
|
|
61
|
+
}
|
|
58
62
|
return /* @__PURE__ */ React.createElement(Grid, { container: true, className: "qetaTagsContainer" }, /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React.createElement(
|
|
59
63
|
TextField,
|
|
60
64
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TagsGrid.esm.js","sources":["../../../src/components/TagsGrid/TagsGrid.tsx"],"sourcesContent":["import { Grid, IconButton, TextField } from '@material-ui/core';\nimport React, { useEffect } from 'react';\nimport { useQetaApi, useTranslation } from '../../hooks';\nimport { QetaPagination } from '../QetaPagination/QetaPagination';\nimport useDebounce from 'react-use/lib/useDebounce';\nimport { TagsGridContent } from './TagsGridContent';\n\ntype TagFilters = {\n order: 'asc' | 'desc';\n orderBy: 'tag' | 'followersCount' | 'postsCount';\n searchQuery: string;\n};\n\nexport const TagsGrid = () => {\n const [page, setPage] = React.useState(1);\n const [pageCount, setPageCount] = React.useState(1);\n const [tagsPerPage, setTagsPerPage] = React.useState(25);\n const [searchQuery, setSearchQuery] = React.useState('');\n const { t } = useTranslation();\n const [filters, setFilters] = React.useState<TagFilters>({\n order: 'desc',\n orderBy: 'tag',\n searchQuery: '',\n });\n\n const onSearchQueryChange = (val: string) => {\n setPage(1);\n setSearchQuery(val);\n };\n\n const {\n value: response,\n loading,\n error,\n retry,\n } = useQetaApi(\n api =>\n api.getTags({\n limit: tagsPerPage,\n offset: (page - 1) * tagsPerPage,\n ...filters,\n }),\n [page, tagsPerPage, filters],\n );\n\n useDebounce(\n () => {\n if (filters.searchQuery !== searchQuery) {\n setFilters({ ...filters, searchQuery: searchQuery });\n }\n },\n 400,\n [searchQuery],\n );\n\n useEffect(() => {\n if (response) {\n setPageCount(Math.ceil(response.total / tagsPerPage));\n }\n }, [response, tagsPerPage]);\n\n const onTagEdit = () => {\n retry();\n };\n\n return (\n <Grid container className=\"qetaTagsContainer\">\n <Grid item xs={12}>\n <TextField\n id=\"search-bar\"\n className=\"text qetaTagsContainerSearchInput\"\n onChange={(\n event: React.ChangeEvent<HTMLTextAreaElement | HTMLInputElement>,\n ) => onSearchQueryChange(event.target.value)}\n value={searchQuery}\n label={t('tagPage.search.label')}\n variant=\"outlined\"\n placeholder={t('tagPage.search.placeholder')}\n size=\"small\"\n />\n <IconButton type=\"submit\" aria-label=\"search\" />\n </Grid>\n\n <TagsGridContent\n response={response}\n onTagEdit={onTagEdit}\n loading={loading}\n error={error}\n />\n <QetaPagination\n pageSize={tagsPerPage}\n handlePageChange={(_e, p) => setPage(p)}\n handlePageSizeChange={e => setTagsPerPage(Number(e.target.value))}\n page={page}\n pageCount={pageCount}\n />\n </Grid>\n );\n};\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"TagsGrid.esm.js","sources":["../../../src/components/TagsGrid/TagsGrid.tsx"],"sourcesContent":["import { Grid, IconButton, TextField } from '@material-ui/core';\nimport React, { useEffect } from 'react';\nimport { useQetaApi, useTranslation } from '../../hooks';\nimport { QetaPagination } from '../QetaPagination/QetaPagination';\nimport useDebounce from 'react-use/lib/useDebounce';\nimport { TagsGridContent } from './TagsGridContent';\nimport { NoTagsCard } from './NoTagsCard';\n\ntype TagFilters = {\n order: 'asc' | 'desc';\n orderBy: 'tag' | 'followersCount' | 'postsCount';\n searchQuery: string;\n};\n\nexport const TagsGrid = () => {\n const [page, setPage] = React.useState(1);\n const [pageCount, setPageCount] = React.useState(1);\n const [tagsPerPage, setTagsPerPage] = React.useState(25);\n const [searchQuery, setSearchQuery] = React.useState('');\n const { t } = useTranslation();\n const [filters, setFilters] = React.useState<TagFilters>({\n order: 'desc',\n orderBy: 'tag',\n searchQuery: '',\n });\n\n const onSearchQueryChange = (val: string) => {\n setPage(1);\n setSearchQuery(val);\n };\n\n const {\n value: response,\n loading,\n error,\n retry,\n } = useQetaApi(\n api =>\n api.getTags({\n limit: tagsPerPage,\n offset: (page - 1) * tagsPerPage,\n ...filters,\n }),\n [page, tagsPerPage, filters],\n );\n\n useDebounce(\n () => {\n if (filters.searchQuery !== searchQuery) {\n setFilters({ ...filters, searchQuery: searchQuery });\n }\n },\n 400,\n [searchQuery],\n );\n\n useEffect(() => {\n if (response) {\n setPageCount(Math.ceil(response.total / tagsPerPage));\n }\n }, [response, tagsPerPage]);\n\n const onTagEdit = () => {\n retry();\n };\n\n if (!response?.tags || response.tags.length === 0) {\n return <NoTagsCard />;\n }\n\n return (\n <Grid container className=\"qetaTagsContainer\">\n <Grid item xs={12}>\n <TextField\n id=\"search-bar\"\n className=\"text qetaTagsContainerSearchInput\"\n onChange={(\n event: React.ChangeEvent<HTMLTextAreaElement | HTMLInputElement>,\n ) => onSearchQueryChange(event.target.value)}\n value={searchQuery}\n label={t('tagPage.search.label')}\n variant=\"outlined\"\n placeholder={t('tagPage.search.placeholder')}\n size=\"small\"\n />\n <IconButton type=\"submit\" aria-label=\"search\" />\n </Grid>\n\n <TagsGridContent\n response={response}\n onTagEdit={onTagEdit}\n loading={loading}\n error={error}\n />\n <QetaPagination\n pageSize={tagsPerPage}\n handlePageChange={(_e, p) => setPage(p)}\n handlePageSizeChange={e => setTagsPerPage(Number(e.target.value))}\n page={page}\n pageCount={pageCount}\n />\n </Grid>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Card, CardContent, Grid, Typography } from '@material-ui/core';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import '@backstage/core-plugin-api';
|
|
4
|
+
import '../../api.esm.js';
|
|
5
|
+
import 'react-use';
|
|
6
|
+
import { useTranslation } from '../../hooks/useTranslation.esm.js';
|
|
7
|
+
import '../../hooks/useStyles.esm.js';
|
|
8
|
+
import 'react-use/lib/useAsync';
|
|
9
|
+
|
|
10
|
+
const NoUsersCard = () => {
|
|
11
|
+
const { t } = useTranslation();
|
|
12
|
+
return /* @__PURE__ */ React.createElement(Card, { style: { marginTop: "2rem" } }, /* @__PURE__ */ React.createElement(CardContent, null, /* @__PURE__ */ React.createElement(
|
|
13
|
+
Grid,
|
|
14
|
+
{
|
|
15
|
+
container: true,
|
|
16
|
+
justifyContent: "center",
|
|
17
|
+
alignItems: "center",
|
|
18
|
+
direction: "column"
|
|
19
|
+
},
|
|
20
|
+
/* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(Typography, { variant: "h6" }, t(`usersPage.users`, { count: 0 })))
|
|
21
|
+
)));
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export { NoUsersCard };
|
|
25
|
+
//# sourceMappingURL=NoUsersCard.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NoUsersCard.esm.js","sources":["../../../src/components/UsersGrid/NoUsersCard.tsx"],"sourcesContent":["import { Card, CardContent, Grid, Typography } from '@material-ui/core';\nimport React from 'react';\nimport { useTranslation } from '../../hooks';\n\nexport const NoUsersCard = () => {\n const { t } = useTranslation();\n\n return (\n <Card style={{ marginTop: '2rem' }}>\n <CardContent>\n <Grid\n container\n justifyContent=\"center\"\n alignItems=\"center\"\n direction=\"column\"\n >\n <Grid item>\n <Typography variant=\"h6\">\n {t(`usersPage.users`, { count: 0 })}\n </Typography>\n </Grid>\n </Grid>\n </CardContent>\n </Card>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;AAIO,MAAM,cAAc,MAAM;AAC/B,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,cAAe,EAAA,CAAA;AAE7B,EACE,uBAAA,KAAA,CAAA,aAAA,CAAC,QAAK,KAAO,EAAA,EAAE,WAAW,MAAO,EAAA,EAAA,sCAC9B,WACC,EAAA,IAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,SAAS,EAAA,IAAA;AAAA,MACT,cAAe,EAAA,QAAA;AAAA,MACf,UAAW,EAAA,QAAA;AAAA,MACX,SAAU,EAAA,QAAA;AAAA,KAAA;AAAA,oBAET,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAA,sCACP,UAAW,EAAA,EAAA,OAAA,EAAQ,IACjB,EAAA,EAAA,CAAA,CAAE,mBAAmB,EAAE,KAAA,EAAO,CAAE,EAAC,CACpC,CACF,CAAA;AAAA,GAEJ,CACF,CAAA,CAAA;AAEJ;;;;"}
|
|
@@ -9,6 +9,7 @@ import 'react-use/lib/useAsync';
|
|
|
9
9
|
import { QetaPagination } from '../QetaPagination/QetaPagination.esm.js';
|
|
10
10
|
import { UsersGridContent } from './UsersGridContent.esm.js';
|
|
11
11
|
import useDebounce from 'react-use/lib/useDebounce';
|
|
12
|
+
import { NoUsersCard } from './NoUsersCard.esm.js';
|
|
12
13
|
|
|
13
14
|
const UsersGrid = () => {
|
|
14
15
|
const [page, setPage] = React.useState(1);
|
|
@@ -46,6 +47,9 @@ const UsersGrid = () => {
|
|
|
46
47
|
setPageCount(Math.ceil(response.total / entitiesPerPage));
|
|
47
48
|
}
|
|
48
49
|
}, [response, entitiesPerPage]);
|
|
50
|
+
if (!response?.users || response.users.length === 0) {
|
|
51
|
+
return /* @__PURE__ */ React.createElement(NoUsersCard, null);
|
|
52
|
+
}
|
|
49
53
|
return /* @__PURE__ */ React.createElement(Grid, { container: true, className: "qetaUsersContainer" }, /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React.createElement(
|
|
50
54
|
TextField,
|
|
51
55
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UsersGrid.esm.js","sources":["../../../src/components/UsersGrid/UsersGrid.tsx"],"sourcesContent":["import { Grid, IconButton, TextField } from '@material-ui/core';\nimport React, { useEffect } from 'react';\nimport { useQetaApi, useTranslation } from '../../hooks';\nimport { QetaPagination } from '../QetaPagination/QetaPagination';\nimport { UsersGridContent } from './UsersGridContent';\nimport useDebounce from 'react-use/lib/useDebounce';\n\ntype EntityFilters = {\n order: 'asc' | 'desc';\n orderBy?: 'userRef';\n searchQuery: string;\n};\n\nexport const UsersGrid = () => {\n const [page, setPage] = React.useState(1);\n const [pageCount, setPageCount] = React.useState(1);\n const [entitiesPerPage, setEntitiesPerPage] = React.useState(25);\n const [searchQuery, setSearchQuery] = React.useState('');\n const [filters, setFilters] = React.useState<EntityFilters>({\n order: 'desc',\n searchQuery: '',\n });\n const { t } = useTranslation();\n\n const {\n value: response,\n loading,\n error,\n } = useQetaApi(\n api =>\n api.getUsers({\n limit: entitiesPerPage,\n offset: (page - 1) * entitiesPerPage,\n ...filters,\n }),\n [entitiesPerPage, page, filters],\n );\n\n useDebounce(\n () => {\n if (filters.searchQuery !== searchQuery) {\n setFilters({ ...filters, searchQuery: searchQuery });\n }\n },\n 400,\n [searchQuery],\n );\n\n useEffect(() => {\n if (response) {\n setPageCount(Math.ceil(response.total / entitiesPerPage));\n }\n }, [response, entitiesPerPage]);\n\n return (\n <Grid container className=\"qetaUsersContainer\">\n <Grid item xs={12}>\n <TextField\n id=\"search-bar\"\n className=\"text qetaUsersContainerSearchInput\"\n onChange={(\n event: React.ChangeEvent<HTMLTextAreaElement | HTMLInputElement>,\n ) => setSearchQuery(event.target.value)}\n label={t('usersPage.search.label')}\n variant=\"outlined\"\n placeholder={t('usersPage.search.placeholder')}\n size=\"small\"\n />\n <IconButton type=\"submit\" aria-label=\"search\" />\n </Grid>\n <UsersGridContent response={response} loading={loading} error={error} />\n <QetaPagination\n pageSize={entitiesPerPage}\n handlePageChange={(_e, p) => setPage(p)}\n handlePageSizeChange={e => setEntitiesPerPage(Number(e.target.value))}\n page={page}\n pageCount={pageCount}\n />\n </Grid>\n );\n};\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"UsersGrid.esm.js","sources":["../../../src/components/UsersGrid/UsersGrid.tsx"],"sourcesContent":["import { Grid, IconButton, TextField } from '@material-ui/core';\nimport React, { useEffect } from 'react';\nimport { useQetaApi, useTranslation } from '../../hooks';\nimport { QetaPagination } from '../QetaPagination/QetaPagination';\nimport { UsersGridContent } from './UsersGridContent';\nimport useDebounce from 'react-use/lib/useDebounce';\nimport { NoUsersCard } from './NoUsersCard';\n\ntype EntityFilters = {\n order: 'asc' | 'desc';\n orderBy?: 'userRef';\n searchQuery: string;\n};\n\nexport const UsersGrid = () => {\n const [page, setPage] = React.useState(1);\n const [pageCount, setPageCount] = React.useState(1);\n const [entitiesPerPage, setEntitiesPerPage] = React.useState(25);\n const [searchQuery, setSearchQuery] = React.useState('');\n const [filters, setFilters] = React.useState<EntityFilters>({\n order: 'desc',\n searchQuery: '',\n });\n const { t } = useTranslation();\n\n const {\n value: response,\n loading,\n error,\n } = useQetaApi(\n api =>\n api.getUsers({\n limit: entitiesPerPage,\n offset: (page - 1) * entitiesPerPage,\n ...filters,\n }),\n [entitiesPerPage, page, filters],\n );\n\n useDebounce(\n () => {\n if (filters.searchQuery !== searchQuery) {\n setFilters({ ...filters, searchQuery: searchQuery });\n }\n },\n 400,\n [searchQuery],\n );\n\n useEffect(() => {\n if (response) {\n setPageCount(Math.ceil(response.total / entitiesPerPage));\n }\n }, [response, entitiesPerPage]);\n\n if (!response?.users || response.users.length === 0) {\n return <NoUsersCard />;\n }\n\n return (\n <Grid container className=\"qetaUsersContainer\">\n <Grid item xs={12}>\n <TextField\n id=\"search-bar\"\n className=\"text qetaUsersContainerSearchInput\"\n onChange={(\n event: React.ChangeEvent<HTMLTextAreaElement | HTMLInputElement>,\n ) => setSearchQuery(event.target.value)}\n label={t('usersPage.search.label')}\n variant=\"outlined\"\n placeholder={t('usersPage.search.placeholder')}\n size=\"small\"\n />\n <IconButton type=\"submit\" aria-label=\"search\" />\n </Grid>\n <UsersGridContent response={response} loading={loading} error={error} />\n <QetaPagination\n pageSize={entitiesPerPage}\n handlePageChange={(_e, p) => setPage(p)}\n handlePageSizeChange={e => setEntitiesPerPage(Number(e.target.value))}\n page={page}\n pageCount={pageCount}\n />\n </Grid>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -32,14 +32,36 @@ function useVoting(resp) {
|
|
|
32
32
|
setScore(lastSignal.score);
|
|
33
33
|
}
|
|
34
34
|
}, [lastSignal]);
|
|
35
|
+
const deletePostVote = (id) => {
|
|
36
|
+
qetaApi.deletePostVote(id).then((response) => {
|
|
37
|
+
setOwnVote(0);
|
|
38
|
+
analytics.captureEvent("vote", "question", { value: 0 });
|
|
39
|
+
setEntity(response);
|
|
40
|
+
});
|
|
41
|
+
};
|
|
42
|
+
const deleteAnswerVote = (postId, id) => {
|
|
43
|
+
qetaApi.deleteAnswerVote(postId, id).then((response) => {
|
|
44
|
+
setOwnVote(0);
|
|
45
|
+
analytics.captureEvent("vote", "answer", { value: 0 });
|
|
46
|
+
setEntity(response);
|
|
47
|
+
});
|
|
48
|
+
};
|
|
35
49
|
const voteUp = () => {
|
|
36
50
|
if (isQuestion) {
|
|
51
|
+
if (ownVote > 0) {
|
|
52
|
+
deletePostVote(entity.id);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
37
55
|
qetaApi.votePostUp(entity.id).then((response) => {
|
|
38
56
|
setOwnVote(1);
|
|
39
57
|
analytics.captureEvent("vote", "question", { value: 1 });
|
|
40
58
|
setEntity(response);
|
|
41
59
|
});
|
|
42
60
|
} else if ("postId" in entity) {
|
|
61
|
+
if (ownVote > 0) {
|
|
62
|
+
deleteAnswerVote(entity.postId, entity.id);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
43
65
|
qetaApi.voteAnswerUp(entity.postId, entity.id).then((response) => {
|
|
44
66
|
setOwnVote(1);
|
|
45
67
|
analytics.captureEvent("vote", "answer", { value: 1 });
|
|
@@ -49,12 +71,20 @@ function useVoting(resp) {
|
|
|
49
71
|
};
|
|
50
72
|
const voteDown = () => {
|
|
51
73
|
if (isQuestion) {
|
|
74
|
+
if (ownVote < 0) {
|
|
75
|
+
deletePostVote(entity.id);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
52
78
|
qetaApi.votePostDown(entity.id).then((response) => {
|
|
53
79
|
setOwnVote(-1);
|
|
54
80
|
analytics.captureEvent("vote", "question", { value: -1 });
|
|
55
81
|
setEntity(response);
|
|
56
82
|
});
|
|
57
83
|
} else if ("postId" in entity) {
|
|
84
|
+
if (ownVote < 0) {
|
|
85
|
+
deleteAnswerVote(entity.postId, entity.id);
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
58
88
|
qetaApi.voteAnswerDown(entity.postId, entity.id).then((response) => {
|
|
59
89
|
setOwnVote(-1);
|
|
60
90
|
analytics.captureEvent("vote", "answer", { value: -1 });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useVoting.esm.js","sources":["../../src/hooks/useVoting.ts"],"sourcesContent":["import React, { useEffect, useState } from 'react';\nimport { useAnalytics, useApi } from '@backstage/core-plugin-api';\nimport { qetaApiRef } from '../api';\nimport { useTranslation } from './useTranslation';\nimport { useSignal } from '@backstage/plugin-signals-react';\nimport {\n AnswerResponse,\n PostResponse,\n QetaSignal,\n} from '@drodil/backstage-plugin-qeta-common';\n\nexport function useVoting(resp: PostResponse | AnswerResponse) {\n const [entity, setEntity] = React.useState<PostResponse | AnswerResponse>(\n resp,\n );\n const [ownVote, setOwnVote] = React.useState(entity.ownVote ?? 0);\n const [correctAnswer, setCorrectAnswer] = useState(\n 'postId' in entity ? entity.correct : false,\n );\n const [score, setScore] = useState(entity.score);\n const analytics = useAnalytics();\n const qetaApi = useApi(qetaApiRef);\n const { t } = useTranslation();\n\n const isQuestion = 'title' in entity;\n const own = entity.own ?? false;\n\n const { lastSignal } = useSignal<QetaSignal>(\n isQuestion ? `qeta:question_${entity.id}` : `qeta:answer_${entity.id}`,\n );\n\n useEffect(() => {\n if (entity) {\n setScore(entity.score);\n }\n }, [entity]);\n\n useEffect(() => {\n if (\n lastSignal?.type === 'post_stats' ||\n lastSignal?.type === 'answer_stats'\n ) {\n setCorrectAnswer(lastSignal.correctAnswer);\n setScore(lastSignal.score);\n }\n }, [lastSignal]);\n\n const voteUp = () => {\n if (isQuestion) {\n qetaApi.votePostUp(entity.id).then(response => {\n setOwnVote(1);\n analytics.captureEvent('vote', 'question', { value: 1 });\n setEntity(response);\n });\n } else if ('postId' in entity) {\n qetaApi.voteAnswerUp(entity.postId, entity.id).then(response => {\n setOwnVote(1);\n analytics.captureEvent('vote', 'answer', { value: 1 });\n setEntity(response);\n });\n }\n };\n\n const voteDown = () => {\n if (isQuestion) {\n qetaApi.votePostDown(entity.id).then(response => {\n setOwnVote(-1);\n analytics.captureEvent('vote', 'question', { value: -1 });\n setEntity(response);\n });\n } else if ('postId' in entity) {\n qetaApi.voteAnswerDown(entity.postId, entity.id).then(response => {\n setOwnVote(-1);\n analytics.captureEvent('vote', 'answer', { value: -1 });\n setEntity(response);\n });\n }\n };\n\n let correctTooltip: string = correctAnswer\n ? t('voteButtons.answer.markIncorrect')\n : t('voteButtons.answer.markCorrect');\n if (!entity?.own) {\n correctTooltip = correctAnswer ? t('voteButtons.answer.marked') : '';\n }\n\n let voteUpTooltip: string = isQuestion\n ? t('voteButtons.question.good')\n : t('voteButtons.answer.good');\n if (own) {\n voteUpTooltip = isQuestion\n ? t('voteButtons.question.own')\n : t('voteButtons.answer.own');\n }\n\n let voteDownTooltip: string = isQuestion\n ? t('voteButtons.question.bad')\n : t('voteButtons.answer.bad');\n if (own) {\n voteDownTooltip = voteUpTooltip;\n }\n\n const toggleCorrectAnswer = () => {\n if (!('postId' in entity)) {\n return;\n }\n if (correctAnswer) {\n qetaApi.markAnswerIncorrect(entity.postId, entity.id).then(response => {\n if (response) {\n setCorrectAnswer(false);\n }\n });\n } else {\n qetaApi.markAnswerCorrect(entity.postId, entity.id).then(response => {\n if (response) {\n setCorrectAnswer(true);\n }\n });\n }\n };\n\n return {\n entity,\n ownVote,\n correctAnswer,\n score,\n voteUp,\n voteDown,\n toggleCorrectAnswer,\n voteUpTooltip,\n voteDownTooltip,\n correctTooltip,\n };\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useVoting.esm.js","sources":["../../src/hooks/useVoting.ts"],"sourcesContent":["import React, { useEffect, useState } from 'react';\nimport { useAnalytics, useApi } from '@backstage/core-plugin-api';\nimport { qetaApiRef } from '../api';\nimport { useTranslation } from './useTranslation';\nimport { useSignal } from '@backstage/plugin-signals-react';\nimport {\n AnswerResponse,\n PostResponse,\n QetaSignal,\n} from '@drodil/backstage-plugin-qeta-common';\n\nexport function useVoting(resp: PostResponse | AnswerResponse) {\n const [entity, setEntity] = React.useState<PostResponse | AnswerResponse>(\n resp,\n );\n const [ownVote, setOwnVote] = React.useState(entity.ownVote ?? 0);\n const [correctAnswer, setCorrectAnswer] = useState(\n 'postId' in entity ? entity.correct : false,\n );\n const [score, setScore] = useState(entity.score);\n const analytics = useAnalytics();\n const qetaApi = useApi(qetaApiRef);\n const { t } = useTranslation();\n\n const isQuestion = 'title' in entity;\n const own = entity.own ?? false;\n\n const { lastSignal } = useSignal<QetaSignal>(\n isQuestion ? `qeta:question_${entity.id}` : `qeta:answer_${entity.id}`,\n );\n\n useEffect(() => {\n if (entity) {\n setScore(entity.score);\n }\n }, [entity]);\n\n useEffect(() => {\n if (\n lastSignal?.type === 'post_stats' ||\n lastSignal?.type === 'answer_stats'\n ) {\n setCorrectAnswer(lastSignal.correctAnswer);\n setScore(lastSignal.score);\n }\n }, [lastSignal]);\n\n const deletePostVote = (id: number) => {\n qetaApi.deletePostVote(id).then(response => {\n setOwnVote(0);\n analytics.captureEvent('vote', 'question', { value: 0 });\n setEntity(response);\n });\n };\n\n const deleteAnswerVote = (postId: number, id: number) => {\n qetaApi.deleteAnswerVote(postId, id).then(response => {\n setOwnVote(0);\n analytics.captureEvent('vote', 'answer', { value: 0 });\n setEntity(response);\n });\n };\n\n const voteUp = () => {\n if (isQuestion) {\n if (ownVote > 0) {\n deletePostVote(entity.id);\n return;\n }\n qetaApi.votePostUp(entity.id).then(response => {\n setOwnVote(1);\n analytics.captureEvent('vote', 'question', { value: 1 });\n setEntity(response);\n });\n } else if ('postId' in entity) {\n if (ownVote > 0) {\n deleteAnswerVote(entity.postId, entity.id);\n return;\n }\n qetaApi.voteAnswerUp(entity.postId, entity.id).then(response => {\n setOwnVote(1);\n analytics.captureEvent('vote', 'answer', { value: 1 });\n setEntity(response);\n });\n }\n };\n\n const voteDown = () => {\n if (isQuestion) {\n if (ownVote < 0) {\n deletePostVote(entity.id);\n return;\n }\n qetaApi.votePostDown(entity.id).then(response => {\n setOwnVote(-1);\n analytics.captureEvent('vote', 'question', { value: -1 });\n setEntity(response);\n });\n } else if ('postId' in entity) {\n if (ownVote < 0) {\n deleteAnswerVote(entity.postId, entity.id);\n return;\n }\n qetaApi.voteAnswerDown(entity.postId, entity.id).then(response => {\n setOwnVote(-1);\n analytics.captureEvent('vote', 'answer', { value: -1 });\n setEntity(response);\n });\n }\n };\n\n let correctTooltip: string = correctAnswer\n ? t('voteButtons.answer.markIncorrect')\n : t('voteButtons.answer.markCorrect');\n if (!entity?.own) {\n correctTooltip = correctAnswer ? t('voteButtons.answer.marked') : '';\n }\n\n let voteUpTooltip: string = isQuestion\n ? t('voteButtons.question.good')\n : t('voteButtons.answer.good');\n if (own) {\n voteUpTooltip = isQuestion\n ? t('voteButtons.question.own')\n : t('voteButtons.answer.own');\n }\n\n let voteDownTooltip: string = isQuestion\n ? t('voteButtons.question.bad')\n : t('voteButtons.answer.bad');\n if (own) {\n voteDownTooltip = voteUpTooltip;\n }\n\n const toggleCorrectAnswer = () => {\n if (!('postId' in entity)) {\n return;\n }\n if (correctAnswer) {\n qetaApi.markAnswerIncorrect(entity.postId, entity.id).then(response => {\n if (response) {\n setCorrectAnswer(false);\n }\n });\n } else {\n qetaApi.markAnswerCorrect(entity.postId, entity.id).then(response => {\n if (response) {\n setCorrectAnswer(true);\n }\n });\n }\n };\n\n return {\n entity,\n ownVote,\n correctAnswer,\n score,\n voteUp,\n voteDown,\n toggleCorrectAnswer,\n voteUpTooltip,\n voteDownTooltip,\n correctTooltip,\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.4.
|
|
10
|
+
"version": "3.4.1",
|
|
11
11
|
"main": "dist/index.esm.js",
|
|
12
12
|
"types": "dist/index.d.ts",
|
|
13
13
|
"prepublishOnly": "yarn tsc && yarn build",
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
"@backstage/plugin-catalog-react": "^1.14.0",
|
|
56
56
|
"@backstage/plugin-permission-react": "^0.4.27",
|
|
57
57
|
"@backstage/plugin-signals-react": "^0.0.6",
|
|
58
|
-
"@drodil/backstage-plugin-qeta-common": "^3.4.
|
|
58
|
+
"@drodil/backstage-plugin-qeta-common": "^3.4.1",
|
|
59
59
|
"@material-ui/core": "^4.12.2",
|
|
60
60
|
"@material-ui/icons": "^4.11.3",
|
|
61
61
|
"@material-ui/lab": "4.0.0-alpha.61",
|