@backstage-community/plugin-bazaar 0.3.0 → 0.5.0

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/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @backstage-community/plugin-bazaar
2
2
 
3
+ ## 0.5.0
4
+
5
+ ### Minor Changes
6
+
7
+ - fe0d104: Added a new UserSelector component that allows users to select a responsible user from the catalog, with the option to manually enter still being there"
8
+
9
+ ## 0.4.0
10
+
11
+ ### Minor Changes
12
+
13
+ - 5fbdb1d: Added next steps after joining a project
14
+
3
15
  ## 0.3.0
4
16
 
5
17
  ### Minor Changes
@@ -7,7 +7,7 @@ import makeStyles from '@material-ui/core/styles/makeStyles';
7
7
  import { parseEntityRef } from '@backstage/catalog-model';
8
8
  import { Avatar, Link } from '@backstage/core-components';
9
9
  import { useRouteRef } from '@backstage/core-plugin-api';
10
- import { entityRouteRef } from '@backstage/plugin-catalog-react';
10
+ import { entityRouteRef, EntityRefLink } from '@backstage/plugin-catalog-react';
11
11
  import { AboutField } from './AboutField.esm.js';
12
12
  import { StatusTag } from '../StatusTag/StatusTag.esm.js';
13
13
 
@@ -33,9 +33,12 @@ const CardContentFields = ({
33
33
  bazaarProject,
34
34
  members,
35
35
  descriptionSize,
36
- membersSize
36
+ membersSize,
37
+ isMember
37
38
  }) => {
38
39
  const catalogEntityRoute = useRouteRef(entityRouteRef);
40
+ const currentPage = window.location.pathname;
41
+ const isEntityPage = currentPage.includes("/catalog/");
39
42
  const classes = useStyles();
40
43
  return /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement(Card, null, /* @__PURE__ */ React.createElement(CardContent, null, /* @__PURE__ */ React.createElement(Grid, { container: true }, /* @__PURE__ */ React.createElement(Grid, { item: true, xs: descriptionSize }, /* @__PURE__ */ React.createElement(AboutField, { label: "Description" }, bazaarProject.description.split("\n").map((str, i) => /* @__PURE__ */ React.createElement(Typography, { key: i, variant: "body2", paragraph: true }, str)))), /* @__PURE__ */ React.createElement(
41
44
  Grid,
@@ -80,7 +83,14 @@ const CardContentFields = ({
80
83
  )
81
84
  );
82
85
  }) : /* @__PURE__ */ React.createElement("div", null))
83
- ), /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 2 }, /* @__PURE__ */ React.createElement(AboutField, { label: "Status" }, /* @__PURE__ */ React.createElement(StatusTag, { status: bazaarProject.status }))), /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 2 }, /* @__PURE__ */ React.createElement(AboutField, { label: "size" }, /* @__PURE__ */ React.createElement(Typography, { variant: "body2" }, bazaarProject.size))), /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 2 }, /* @__PURE__ */ React.createElement(AboutField, { label: "Start date" }, /* @__PURE__ */ React.createElement(Typography, { variant: "body2" }, bazaarProject.startDate?.substring(0, 10) || ""))), /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 2 }, /* @__PURE__ */ React.createElement(AboutField, { label: "End date" }, /* @__PURE__ */ React.createElement(Typography, { variant: "body2" }, bazaarProject.endDate?.substring(0, 10) || ""))), /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 4 }, /* @__PURE__ */ React.createElement(AboutField, { label: "Responsible" }, /* @__PURE__ */ React.createElement(Typography, { variant: "body2" }, bazaarProject.responsible || "")))))));
86
+ ), !isEntityPage && isMember && /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React.createElement(AboutField, { label: "I've joined the project, what's next?" }, /* @__PURE__ */ React.createElement(Typography, { variant: "body2", paragraph: true }, 'To learn more about this project, click the "Entity Page" link, where you can view more information about the effort and navigate to the source code itself to begin collaborating.'))), /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 2 }, /* @__PURE__ */ React.createElement(AboutField, { label: "Status" }, /* @__PURE__ */ React.createElement(StatusTag, { status: bazaarProject.status }))), /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 2 }, /* @__PURE__ */ React.createElement(AboutField, { label: "size" }, /* @__PURE__ */ React.createElement(Typography, { variant: "body2" }, bazaarProject.size))), /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 2 }, /* @__PURE__ */ React.createElement(AboutField, { label: "Start date" }, /* @__PURE__ */ React.createElement(Typography, { variant: "body2" }, bazaarProject.startDate?.substring(0, 10) || ""))), /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 2 }, /* @__PURE__ */ React.createElement(AboutField, { label: "End date" }, /* @__PURE__ */ React.createElement(Typography, { variant: "body2" }, bazaarProject.endDate?.substring(0, 10) || ""))), /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 4 }, /* @__PURE__ */ React.createElement(AboutField, { label: "Responsible" }, /* @__PURE__ */ React.createElement(Typography, { variant: "body2" }, (() => {
87
+ try {
88
+ parseEntityRef(bazaarProject.responsible);
89
+ return /* @__PURE__ */ React.createElement(EntityRefLink, { entityRef: bazaarProject.responsible });
90
+ } catch {
91
+ return bazaarProject.responsible || "";
92
+ }
93
+ })(), " ")))))));
84
94
  };
85
95
 
86
96
  export { CardContentFields };
@@ -1 +1 @@
1
- {"version":3,"file":"CardContentFields.esm.js","sources":["../../../src/components/CardContentFields/CardContentFields.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport Grid from '@material-ui/core/Grid';\nimport Card from '@material-ui/core/Card';\nimport CardContent from '@material-ui/core/CardContent';\nimport Typography from '@material-ui/core/Typography';\nimport makeStyles from '@material-ui/core/styles/makeStyles';\n\nimport { GridSize } from '@material-ui/core/Grid';\nimport { parseEntityRef } from '@backstage/catalog-model';\nimport { Avatar, Link } from '@backstage/core-components';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport { entityRouteRef } from '@backstage/plugin-catalog-react';\nimport { AboutField } from './AboutField';\nimport { StatusTag } from '../StatusTag';\nimport { Member, BazaarProject } from '../../types';\n\ntype Props = {\n bazaarProject: BazaarProject;\n members: Member[];\n descriptionSize: GridSize;\n membersSize: GridSize;\n};\n\nconst useStyles = makeStyles(\n {\n avatar: {\n width: '19px',\n height: '19px',\n float: 'left',\n marginRight: '0.3rem',\n marginTop: '0rem',\n marginBottom: '0rem',\n alignItems: 'left',\n },\n avatarText: {\n fontSize: '8px',\n textAlign: 'left',\n },\n },\n { name: 'CardContentFields' },\n);\n\nexport const CardContentFields = ({\n bazaarProject,\n members,\n descriptionSize,\n membersSize,\n}: Props) => {\n const catalogEntityRoute = useRouteRef(entityRouteRef);\n const classes = useStyles();\n return (\n <div>\n <Card>\n <CardContent>\n <Grid container>\n <Grid item xs={descriptionSize}>\n <AboutField label=\"Description\">\n {bazaarProject.description\n .split('\\n')\n .map((str: string, i: number) => (\n <Typography key={i} variant=\"body2\" paragraph>\n {str}\n </Typography>\n ))}\n </AboutField>\n </Grid>\n\n <Grid\n style={{\n display: 'flex',\n justifyContent: 'flex-end',\n }}\n item\n xs={membersSize}\n >\n <AboutField label=\"Latest members\">\n {members.length ? (\n members.slice(0, 7).map((member: Member) => {\n return (\n <div\n style={{\n textAlign: 'left',\n backgroundColor: '',\n marginBottom: '0.3rem',\n marginTop: '0.3rem',\n display: 'block',\n }}\n key={member.userId}\n >\n <Avatar\n displayName={member.userId}\n classes={classes}\n picture={member.picture}\n />\n <Link\n target=\"_blank\"\n to={\n member.userRef\n ? `${catalogEntityRoute(\n parseEntityRef(member.userRef),\n )}`\n : `http://github.com/${member.userId}`\n }\n >\n {member?.userId}\n </Link>\n </div>\n );\n })\n ) : (\n <div />\n )}\n </AboutField>\n </Grid>\n\n <Grid item xs={2}>\n <AboutField label=\"Status\">\n <StatusTag status={bazaarProject.status} />\n </AboutField>\n </Grid>\n\n <Grid item xs={2}>\n <AboutField label=\"size\">\n <Typography variant=\"body2\">{bazaarProject.size}</Typography>\n </AboutField>\n </Grid>\n\n <Grid item xs={2}>\n <AboutField label=\"Start date\">\n <Typography variant=\"body2\">\n {bazaarProject.startDate?.substring(0, 10) || ''}\n </Typography>\n </AboutField>\n </Grid>\n\n <Grid item xs={2}>\n <AboutField label=\"End date\">\n <Typography variant=\"body2\">\n {bazaarProject.endDate?.substring(0, 10) || ''}\n </Typography>\n </AboutField>\n </Grid>\n\n <Grid item xs={4}>\n <AboutField label=\"Responsible\">\n <Typography variant=\"body2\">\n {bazaarProject.responsible || ''}\n </Typography>\n </AboutField>\n </Grid>\n </Grid>\n </CardContent>\n </Card>\n </div>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CardContentFields.esm.js","sources":["../../../src/components/CardContentFields/CardContentFields.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport Grid from '@material-ui/core/Grid';\nimport Card from '@material-ui/core/Card';\nimport CardContent from '@material-ui/core/CardContent';\nimport Typography from '@material-ui/core/Typography';\nimport makeStyles from '@material-ui/core/styles/makeStyles';\n\nimport { GridSize } from '@material-ui/core/Grid';\nimport { parseEntityRef } from '@backstage/catalog-model';\nimport { Avatar, Link } from '@backstage/core-components';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport { entityRouteRef } from '@backstage/plugin-catalog-react';\nimport { AboutField } from './AboutField';\nimport { StatusTag } from '../StatusTag';\nimport { Member, BazaarProject } from '../../types';\nimport { EntityRefLink } from '@backstage/plugin-catalog-react';\n\ntype Props = {\n bazaarProject: BazaarProject;\n members: Member[];\n descriptionSize: GridSize;\n membersSize: GridSize;\n isMember: boolean;\n};\n\nconst useStyles = makeStyles(\n {\n avatar: {\n width: '19px',\n height: '19px',\n float: 'left',\n marginRight: '0.3rem',\n marginTop: '0rem',\n marginBottom: '0rem',\n alignItems: 'left',\n },\n avatarText: {\n fontSize: '8px',\n textAlign: 'left',\n },\n },\n { name: 'CardContentFields' },\n);\n\nexport const CardContentFields = ({\n bazaarProject,\n members,\n descriptionSize,\n membersSize,\n isMember,\n}: Props) => {\n const catalogEntityRoute = useRouteRef(entityRouteRef);\n const currentPage = window.location.pathname;\n const isEntityPage = currentPage.includes('/catalog/');\n const classes = useStyles();\n return (\n <div>\n <Card>\n <CardContent>\n <Grid container>\n <Grid item xs={descriptionSize}>\n <AboutField label=\"Description\">\n {bazaarProject.description\n .split('\\n')\n .map((str: string, i: number) => (\n <Typography key={i} variant=\"body2\" paragraph>\n {str}\n </Typography>\n ))}\n </AboutField>\n </Grid>\n\n <Grid\n style={{\n display: 'flex',\n justifyContent: 'flex-end',\n }}\n item\n xs={membersSize}\n >\n <AboutField label=\"Latest members\">\n {members.length ? (\n members.slice(0, 7).map((member: Member) => {\n return (\n <div\n style={{\n textAlign: 'left',\n backgroundColor: '',\n marginBottom: '0.3rem',\n marginTop: '0.3rem',\n display: 'block',\n }}\n key={member.userId}\n >\n <Avatar\n displayName={member.userId}\n classes={classes}\n picture={member.picture}\n />\n <Link\n target=\"_blank\"\n to={\n member.userRef\n ? `${catalogEntityRoute(\n parseEntityRef(member.userRef),\n )}`\n : `http://github.com/${member.userId}`\n }\n >\n {member?.userId}\n </Link>\n </div>\n );\n })\n ) : (\n <div />\n )}\n </AboutField>\n </Grid>\n\n {!isEntityPage && isMember && (\n <Grid item xs={12}>\n <AboutField label=\"I've joined the project, what's next?\">\n <Typography variant=\"body2\" paragraph>\n To learn more about this project, click the \"Entity Page\"\n link, where you can view more information about the effort\n and navigate to the source code itself to begin\n collaborating.\n </Typography>\n </AboutField>\n </Grid>\n )}\n\n <Grid item xs={2}>\n <AboutField label=\"Status\">\n <StatusTag status={bazaarProject.status} />\n </AboutField>\n </Grid>\n\n <Grid item xs={2}>\n <AboutField label=\"size\">\n <Typography variant=\"body2\">{bazaarProject.size}</Typography>\n </AboutField>\n </Grid>\n\n <Grid item xs={2}>\n <AboutField label=\"Start date\">\n <Typography variant=\"body2\">\n {bazaarProject.startDate?.substring(0, 10) || ''}\n </Typography>\n </AboutField>\n </Grid>\n\n <Grid item xs={2}>\n <AboutField label=\"End date\">\n <Typography variant=\"body2\">\n {bazaarProject.endDate?.substring(0, 10) || ''}\n </Typography>\n </AboutField>\n </Grid>\n\n <Grid item xs={4}>\n <AboutField label=\"Responsible\">\n <Typography variant=\"body2\">\n {(() => {\n try {\n parseEntityRef(bazaarProject.responsible);\n return (\n <EntityRefLink entityRef={bazaarProject.responsible} />\n );\n } catch {\n return bazaarProject.responsible || '';\n }\n })()}{' '}\n </Typography>\n </AboutField>\n </Grid>\n </Grid>\n </CardContent>\n </Card>\n </div>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -166,7 +166,8 @@ const EntityBazaarInfoContent = ({
166
166
  bazaarProject,
167
167
  members: members.value || [],
168
168
  descriptionSize: 10,
169
- membersSize: 2
169
+ membersSize: 2,
170
+ isMember
170
171
  }
171
172
  ));
172
173
  }
@@ -1 +1 @@
1
- {"version":3,"file":"EntityBazaarInfoContent.esm.js","sources":["../../../src/components/EntityBazaarInfoContent/EntityBazaarInfoContent.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { useState, useEffect } from 'react';\nimport CardHeader from '@material-ui/core/CardHeader';\nimport Divider from '@material-ui/core/Divider';\nimport IconButton from '@material-ui/core/IconButton';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Typography from '@material-ui/core/Typography';\nimport {\n HeaderIconLinkRow,\n IconLinkVerticalProps,\n} from '@backstage/core-components';\nimport EditIcon from '@material-ui/icons/Edit';\nimport ChatIcon from '@material-ui/icons/Chat';\nimport PersonAddIcon from '@material-ui/icons/PersonAdd';\nimport DashboardIcon from '@material-ui/icons/Dashboard';\nimport LinkOffIcon from '@material-ui/icons/LinkOff';\nimport Description from '@material-ui/icons/Description';\nimport { EditProjectDialog } from '../EditProjectDialog';\nimport { useApi, identityApiRef } from '@backstage/core-plugin-api';\nimport { BazaarProject, Member } from '../../types';\nimport { bazaarApiRef } from '../../api';\nimport Alert from '@material-ui/lab/Alert';\nimport useAsyncFn from 'react-use/esm/useAsyncFn';\nimport ExitToAppIcon from '@material-ui/icons/ExitToApp';\nimport { parseEntityRef } from '@backstage/catalog-model';\nimport { ConfirmationDialog } from '../ConfirmationDialog';\nimport { CardContentFields } from '../CardContentFields';\nimport { fetchProjectMembers } from '../../util/fetchMethods';\n\nconst useStyles = makeStyles({\n wordBreak: {\n wordBreak: 'break-all',\n whiteSpace: 'normal',\n margin: '-0.25rem 0',\n },\n});\n\ntype Props = {\n bazaarProject: BazaarProject | null | undefined;\n fetchBazaarProject: () => Promise<BazaarProject | null>;\n};\n\nexport const EntityBazaarInfoContent = ({\n bazaarProject,\n fetchBazaarProject,\n}: Props) => {\n const classes = useStyles();\n const bazaarApi = useApi(bazaarApiRef);\n const identity = useApi(identityApiRef);\n const [openEdit, setOpenEdit] = useState(false);\n const [isMember, setIsMember] = useState(false);\n const [openUnlink, setOpenUnlink] = useState(false);\n const [members, fetchMembers] = useAsyncFn(async () => {\n return bazaarProject\n ? await fetchProjectMembers(bazaarApi, bazaarProject)\n : [];\n });\n\n const [userId, fetchUserId] = useAsyncFn(async () => {\n return await (\n await identity.getProfileInfo()\n ).displayName;\n });\n\n useEffect(() => {\n fetchMembers();\n fetchUserId();\n }, [fetchMembers, fetchUserId]);\n\n useEffect(() => {\n if (members.value && userId.value) {\n setIsMember(\n members.value\n ?.map((member: Member) => member.userId)\n .indexOf(userId.value) >= 0,\n );\n }\n }, [bazaarProject, members, identity, userId.value]);\n\n const handleMembersClick = async () => {\n if (userId.value) {\n if (!isMember) {\n await bazaarApi.addMember(bazaarProject?.id!, userId.value);\n } else {\n await bazaarApi.deleteMember(bazaarProject!.id, userId.value);\n }\n setIsMember(!isMember);\n fetchMembers();\n }\n };\n\n const links: IconLinkVerticalProps[] = [\n {\n label: 'Entity page',\n icon: <DashboardIcon />,\n disabled: true,\n },\n {\n label: 'Unlink project',\n icon: <LinkOffIcon />,\n disabled: false,\n onClick: () => {\n setOpenUnlink(true);\n },\n },\n {\n label: isMember ? 'Leave' : 'Join',\n icon: isMember ? <ExitToAppIcon /> : <PersonAddIcon />,\n href: '',\n onClick: async () => {\n handleMembersClick();\n },\n },\n {\n label: 'Community',\n icon: <ChatIcon />,\n href: bazaarProject?.community,\n disabled: bazaarProject?.community === '' || !isMember,\n },\n {\n label: 'Docs',\n icon: <Description />,\n href: bazaarProject?.docs,\n disabled: bazaarProject?.docs === null || bazaarProject?.docs === '',\n },\n ];\n\n const handleEditClose = () => {\n setOpenEdit(false);\n };\n\n const handleUnlinkClose = () => {\n setOpenUnlink(false);\n };\n\n const handleUnlinkSubmit = async () => {\n const updateResponse = await bazaarApi.updateProject({\n ...bazaarProject,\n entityRef: null,\n });\n\n if (updateResponse.status === 'ok') {\n handleUnlinkClose();\n fetchBazaarProject();\n }\n };\n\n if (members.error) {\n return <Alert severity=\"error\">{members?.error?.message}</Alert>;\n }\n\n if (bazaarProject) {\n return (\n <div>\n <EditProjectDialog\n bazaarProject={bazaarProject!}\n openEdit={openEdit}\n handleEditClose={handleEditClose}\n fetchBazaarProject={fetchBazaarProject}\n />\n\n {openUnlink && (\n <ConfirmationDialog\n open={openUnlink}\n handleClose={handleUnlinkClose}\n message={[\n 'Are you sure you want to unlink ',\n <b className={classes.wordBreak}>\n {parseEntityRef(bazaarProject.entityRef!).name}\n </b>,\n ' from ',\n <b className={classes.wordBreak}>{bazaarProject.title}</b>,\n ' ?',\n ]}\n type=\"unlink\"\n handleSubmit={handleUnlinkSubmit}\n />\n )}\n\n <CardHeader\n title={\n <Typography paragraph className={classes.wordBreak}>\n {bazaarProject?.title!}\n </Typography>\n }\n action={\n <div>\n <IconButton\n onClick={() => {\n setOpenEdit(true);\n }}\n >\n <EditIcon />\n </IconButton>\n </div>\n }\n subheader={<HeaderIconLinkRow links={links} />}\n />\n <Divider />\n\n <CardContentFields\n bazaarProject={bazaarProject}\n members={members.value || []}\n descriptionSize={10}\n membersSize={2}\n />\n </div>\n );\n }\n return null;\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"EntityBazaarInfoContent.esm.js","sources":["../../../src/components/EntityBazaarInfoContent/EntityBazaarInfoContent.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { useState, useEffect } from 'react';\nimport CardHeader from '@material-ui/core/CardHeader';\nimport Divider from '@material-ui/core/Divider';\nimport IconButton from '@material-ui/core/IconButton';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Typography from '@material-ui/core/Typography';\nimport {\n HeaderIconLinkRow,\n IconLinkVerticalProps,\n} from '@backstage/core-components';\nimport EditIcon from '@material-ui/icons/Edit';\nimport ChatIcon from '@material-ui/icons/Chat';\nimport PersonAddIcon from '@material-ui/icons/PersonAdd';\nimport DashboardIcon from '@material-ui/icons/Dashboard';\nimport LinkOffIcon from '@material-ui/icons/LinkOff';\nimport Description from '@material-ui/icons/Description';\nimport { EditProjectDialog } from '../EditProjectDialog';\nimport { useApi, identityApiRef } from '@backstage/core-plugin-api';\nimport { BazaarProject, Member } from '../../types';\nimport { bazaarApiRef } from '../../api';\nimport Alert from '@material-ui/lab/Alert';\nimport useAsyncFn from 'react-use/esm/useAsyncFn';\nimport ExitToAppIcon from '@material-ui/icons/ExitToApp';\nimport { parseEntityRef } from '@backstage/catalog-model';\nimport { ConfirmationDialog } from '../ConfirmationDialog';\nimport { CardContentFields } from '../CardContentFields';\nimport { fetchProjectMembers } from '../../util/fetchMethods';\n\nconst useStyles = makeStyles({\n wordBreak: {\n wordBreak: 'break-all',\n whiteSpace: 'normal',\n margin: '-0.25rem 0',\n },\n});\n\ntype Props = {\n bazaarProject: BazaarProject | null | undefined;\n fetchBazaarProject: () => Promise<BazaarProject | null>;\n};\n\nexport const EntityBazaarInfoContent = ({\n bazaarProject,\n fetchBazaarProject,\n}: Props) => {\n const classes = useStyles();\n const bazaarApi = useApi(bazaarApiRef);\n const identity = useApi(identityApiRef);\n const [openEdit, setOpenEdit] = useState(false);\n const [isMember, setIsMember] = useState(false);\n const [openUnlink, setOpenUnlink] = useState(false);\n const [members, fetchMembers] = useAsyncFn(async () => {\n return bazaarProject\n ? await fetchProjectMembers(bazaarApi, bazaarProject)\n : [];\n });\n\n const [userId, fetchUserId] = useAsyncFn(async () => {\n return await (\n await identity.getProfileInfo()\n ).displayName;\n });\n\n useEffect(() => {\n fetchMembers();\n fetchUserId();\n }, [fetchMembers, fetchUserId]);\n\n useEffect(() => {\n if (members.value && userId.value) {\n setIsMember(\n members.value\n ?.map((member: Member) => member.userId)\n .indexOf(userId.value) >= 0,\n );\n }\n }, [bazaarProject, members, identity, userId.value]);\n\n const handleMembersClick = async () => {\n if (userId.value) {\n if (!isMember) {\n await bazaarApi.addMember(bazaarProject?.id!, userId.value);\n } else {\n await bazaarApi.deleteMember(bazaarProject!.id, userId.value);\n }\n setIsMember(!isMember);\n fetchMembers();\n }\n };\n\n const links: IconLinkVerticalProps[] = [\n {\n label: 'Entity page',\n icon: <DashboardIcon />,\n disabled: true,\n },\n {\n label: 'Unlink project',\n icon: <LinkOffIcon />,\n disabled: false,\n onClick: () => {\n setOpenUnlink(true);\n },\n },\n {\n label: isMember ? 'Leave' : 'Join',\n icon: isMember ? <ExitToAppIcon /> : <PersonAddIcon />,\n href: '',\n onClick: async () => {\n handleMembersClick();\n },\n },\n {\n label: 'Community',\n icon: <ChatIcon />,\n href: bazaarProject?.community,\n disabled: bazaarProject?.community === '' || !isMember,\n },\n {\n label: 'Docs',\n icon: <Description />,\n href: bazaarProject?.docs,\n disabled: bazaarProject?.docs === null || bazaarProject?.docs === '',\n },\n ];\n\n const handleEditClose = () => {\n setOpenEdit(false);\n };\n\n const handleUnlinkClose = () => {\n setOpenUnlink(false);\n };\n\n const handleUnlinkSubmit = async () => {\n const updateResponse = await bazaarApi.updateProject({\n ...bazaarProject,\n entityRef: null,\n });\n\n if (updateResponse.status === 'ok') {\n handleUnlinkClose();\n fetchBazaarProject();\n }\n };\n\n if (members.error) {\n return <Alert severity=\"error\">{members?.error?.message}</Alert>;\n }\n\n if (bazaarProject) {\n return (\n <div>\n <EditProjectDialog\n bazaarProject={bazaarProject!}\n openEdit={openEdit}\n handleEditClose={handleEditClose}\n fetchBazaarProject={fetchBazaarProject}\n />\n\n {openUnlink && (\n <ConfirmationDialog\n open={openUnlink}\n handleClose={handleUnlinkClose}\n message={[\n 'Are you sure you want to unlink ',\n <b className={classes.wordBreak}>\n {parseEntityRef(bazaarProject.entityRef!).name}\n </b>,\n ' from ',\n <b className={classes.wordBreak}>{bazaarProject.title}</b>,\n ' ?',\n ]}\n type=\"unlink\"\n handleSubmit={handleUnlinkSubmit}\n />\n )}\n\n <CardHeader\n title={\n <Typography paragraph className={classes.wordBreak}>\n {bazaarProject?.title!}\n </Typography>\n }\n action={\n <div>\n <IconButton\n onClick={() => {\n setOpenEdit(true);\n }}\n >\n <EditIcon />\n </IconButton>\n </div>\n }\n subheader={<HeaderIconLinkRow links={links} />}\n />\n <Divider />\n\n <CardContentFields\n bazaarProject={bazaarProject}\n members={members.value || []}\n descriptionSize={10}\n membersSize={2}\n isMember={isMember}\n />\n </div>\n );\n }\n return null;\n};\n"],"names":[],"mappings":"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"}
@@ -209,7 +209,8 @@ const HomePageBazaarInfoCard = ({
209
209
  bazaarProject: bazaarProject.value || initProject,
210
210
  members: members.value || [],
211
211
  descriptionSize: 9,
212
- membersSize: 3
212
+ membersSize: 3,
213
+ isMember
213
214
  }
214
215
  )));
215
216
  };
@@ -1 +1 @@
1
- {"version":3,"file":"HomePageBazaarInfoCard.esm.js","sources":["../../../src/components/HomePageBazaarInfoCard/HomePageBazaarInfoCard.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { useState, useEffect } from 'react';\nimport Card from '@material-ui/core/Card';\nimport CardHeader from '@material-ui/core/CardHeader';\nimport Divider from '@material-ui/core/Divider';\nimport IconButton from '@material-ui/core/IconButton';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Typography from '@material-ui/core/Typography';\nimport {\n HeaderIconLinkRow,\n IconLinkVerticalProps,\n} from '@backstage/core-components';\nimport EditIcon from '@material-ui/icons/Edit';\nimport ChatIcon from '@material-ui/icons/Chat';\nimport PersonAddIcon from '@material-ui/icons/PersonAdd';\nimport InsertLinkIcon from '@material-ui/icons/InsertLink';\nimport DashboardIcon from '@material-ui/icons/Dashboard';\nimport CloseIcon from '@material-ui/icons/Close';\nimport LinkOffIcon from '@material-ui/icons/LinkOff';\nimport Description from '@material-ui/icons/Description';\nimport { EditProjectDialog } from '../EditProjectDialog';\nimport ExitToAppIcon from '@material-ui/icons/ExitToApp';\nimport {\n useApi,\n identityApiRef,\n useRouteRef,\n alertApiRef,\n} from '@backstage/core-plugin-api';\nimport { Member, BazaarProject } from '../../types';\nimport { bazaarApiRef } from '../../api';\nimport Alert from '@material-ui/lab/Alert';\nimport useAsyncFn from 'react-use/esm/useAsyncFn';\nimport { catalogApiRef, entityRouteRef } from '@backstage/plugin-catalog-react';\n\nimport {\n stringifyEntityRef,\n Entity,\n parseEntityRef,\n} from '@backstage/catalog-model';\n\nimport { ConfirmationDialog } from '../ConfirmationDialog/ConfirmationDialog';\nimport { CardContentFields } from '../CardContentFields/CardContentFields';\nimport { LinkProjectDialog } from '../LinkProjectDialog';\nimport {\n fetchCatalogItems,\n fetchProjectMembers,\n} from '../../util/fetchMethods';\nimport { parseBazaarResponse } from '../../util/parseMethods';\n\nconst useStyles = makeStyles({\n wordBreak: {\n wordBreak: 'break-all',\n whiteSpace: 'normal',\n margin: '-0.25rem 0',\n },\n});\n\ntype Props = {\n initProject: BazaarProject;\n handleClose: () => void;\n initEntity: Entity;\n};\n\nexport const HomePageBazaarInfoCard = ({\n initProject,\n handleClose,\n initEntity,\n}: Props) => {\n const classes = useStyles();\n const entityLink = useRouteRef(entityRouteRef);\n const bazaarApi = useApi(bazaarApiRef);\n const identity = useApi(identityApiRef);\n const alertApi = useApi(alertApiRef);\n const catalogApi = useApi(catalogApiRef);\n const [openEdit, setOpenEdit] = useState(false);\n const [openProjectSelector, setOpenProjectSelector] = useState(false);\n const [openUnlink, setOpenUnlink] = useState(false);\n const [isMember, setIsMember] = useState(false);\n\n const [catalogEntities, fetchCatalogEntities] = useAsyncFn(async () => {\n const entities = await fetchCatalogItems(catalogApi);\n const bazaarProjects = await bazaarApi.getProjects();\n const bazaarLinkedRefs: string[] = bazaarProjects.data\n .filter((entity: any) => entity.entity_ref !== null)\n .map((entity: any) => entity.entity_ref);\n\n return entities.filter(\n (entity: Entity) =>\n !bazaarLinkedRefs.includes(stringifyEntityRef(entity)),\n );\n });\n\n const [bazaarProject, fetchBazaarProject] = useAsyncFn(async () => {\n const response = await bazaarApi.getProjectById(initProject.id);\n return await parseBazaarResponse(response);\n });\n\n const [members, fetchMembers] = useAsyncFn(async () => {\n return fetchProjectMembers(bazaarApi, bazaarProject.value ?? initProject);\n });\n\n const [userId, fetchUserId] = useAsyncFn(async () => {\n return await (\n await identity.getProfileInfo()\n ).displayName;\n });\n\n useEffect(() => {\n fetchMembers();\n fetchBazaarProject();\n fetchCatalogEntities();\n fetchUserId();\n }, [fetchMembers, fetchBazaarProject, fetchCatalogEntities, fetchUserId]);\n\n useEffect(() => {\n if (members.value && userId.value) {\n setIsMember(\n members.value\n ?.map((member: Member) => member.userId)\n .indexOf(userId.value) >= 0,\n );\n }\n }, [bazaarProject.value, members, identity, userId.value]);\n\n const handleMembersClick = async () => {\n if (userId.value) {\n if (!isMember) {\n await bazaarApi.addMember(bazaarProject.value!.id, userId.value);\n } else {\n await bazaarApi.deleteMember(bazaarProject.value!.id, userId.value);\n }\n setIsMember(!isMember);\n fetchMembers();\n }\n };\n\n const getEntityPageLink = () => {\n if (bazaarProject?.value?.entityRef) {\n const { name, kind, namespace } = parseEntityRef(\n bazaarProject.value.entityRef,\n );\n return entityLink({ kind, namespace, name });\n }\n return '';\n };\n\n const handleLink = () => {\n if (bazaarProject.value?.entityRef) {\n setOpenUnlink(true);\n } else {\n fetchCatalogEntities();\n setOpenProjectSelector(true);\n }\n };\n\n const links: IconLinkVerticalProps[] = [\n {\n label: 'Entity page',\n icon: <DashboardIcon />,\n href: bazaarProject.value?.entityRef ? getEntityPageLink() : '',\n disabled: bazaarProject.value?.entityRef === null,\n },\n {\n label: bazaarProject.value?.entityRef ? 'Unlink project' : 'Link project',\n icon: bazaarProject.value?.entityRef ? (\n <LinkOffIcon />\n ) : (\n <InsertLinkIcon />\n ),\n onClick: handleLink,\n },\n {\n label: isMember ? 'Leave' : 'Join',\n icon: isMember ? <ExitToAppIcon /> : <PersonAddIcon />,\n href: '',\n onClick: async () => {\n handleMembersClick();\n },\n },\n {\n label: 'Community',\n icon: <ChatIcon />,\n href: bazaarProject.value?.community,\n disabled: !bazaarProject.value?.community || !isMember,\n },\n {\n label: 'Docs',\n icon: <Description />,\n href: bazaarProject.value?.docs,\n disabled:\n bazaarProject.value?.docs === null || bazaarProject.value?.docs === '',\n },\n ];\n\n const handleUnlinkSubmit = async () => {\n const updateResponse = await bazaarApi.updateProject({\n ...bazaarProject.value,\n entityRef: null,\n });\n\n if (updateResponse.status === 'ok') {\n setOpenUnlink(false);\n fetchBazaarProject();\n alertApi.post({\n message: `Unlinked entity '${\n parseEntityRef(bazaarProject.value?.entityRef!).name\n }' from the project ${bazaarProject.value?.title}`,\n severity: 'success',\n display: 'transient',\n });\n }\n };\n\n if (bazaarProject.error) {\n return <Alert severity=\"error\">{bazaarProject?.error?.message}</Alert>;\n } else if (members.error) {\n return <Alert severity=\"error\">{members?.error?.message}</Alert>;\n }\n\n return (\n <div>\n <LinkProjectDialog\n openProjectSelector={openProjectSelector}\n handleProjectSelectorClose={() => setOpenProjectSelector(false)}\n catalogEntities={catalogEntities.value || []}\n bazaarProject={bazaarProject.value || initProject}\n fetchBazaarProject={fetchBazaarProject}\n initEntity={initEntity}\n />\n\n {openUnlink && (\n <ConfirmationDialog\n open={openUnlink}\n handleClose={() => setOpenUnlink(false)}\n message={[\n 'Are you sure you want to unlink ',\n <b className={classes.wordBreak}>\n {parseEntityRef(bazaarProject.value?.entityRef!).name}\n </b>,\n ' from ',\n <b className={classes.wordBreak}>{bazaarProject.value?.title}</b>,\n ' ?',\n ]}\n type=\"unlink\"\n handleSubmit={handleUnlinkSubmit}\n />\n )}\n\n <Card>\n <EditProjectDialog\n bazaarProject={bazaarProject.value || initProject}\n openEdit={openEdit}\n handleEditClose={() => setOpenEdit(false)}\n handleCardClose={handleClose}\n fetchBazaarProject={fetchBazaarProject}\n />\n\n <CardHeader\n title={\n <Typography paragraph className={classes.wordBreak}>\n {bazaarProject.value?.title || initProject.title}\n </Typography>\n }\n action={\n <div>\n <IconButton onClick={() => setOpenEdit(true)}>\n <EditIcon />\n </IconButton>\n <IconButton onClick={handleClose}>\n <CloseIcon />\n </IconButton>\n </div>\n }\n subheader={<HeaderIconLinkRow links={links} />}\n />\n <Divider />\n\n <CardContentFields\n bazaarProject={bazaarProject.value || initProject}\n members={members.value || []}\n descriptionSize={9}\n membersSize={3}\n />\n </Card>\n </div>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"HomePageBazaarInfoCard.esm.js","sources":["../../../src/components/HomePageBazaarInfoCard/HomePageBazaarInfoCard.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { useState, useEffect } from 'react';\nimport Card from '@material-ui/core/Card';\nimport CardHeader from '@material-ui/core/CardHeader';\nimport Divider from '@material-ui/core/Divider';\nimport IconButton from '@material-ui/core/IconButton';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Typography from '@material-ui/core/Typography';\nimport {\n HeaderIconLinkRow,\n IconLinkVerticalProps,\n} from '@backstage/core-components';\nimport EditIcon from '@material-ui/icons/Edit';\nimport ChatIcon from '@material-ui/icons/Chat';\nimport PersonAddIcon from '@material-ui/icons/PersonAdd';\nimport InsertLinkIcon from '@material-ui/icons/InsertLink';\nimport DashboardIcon from '@material-ui/icons/Dashboard';\nimport CloseIcon from '@material-ui/icons/Close';\nimport LinkOffIcon from '@material-ui/icons/LinkOff';\nimport Description from '@material-ui/icons/Description';\nimport { EditProjectDialog } from '../EditProjectDialog';\nimport ExitToAppIcon from '@material-ui/icons/ExitToApp';\nimport {\n useApi,\n identityApiRef,\n useRouteRef,\n alertApiRef,\n} from '@backstage/core-plugin-api';\nimport { Member, BazaarProject } from '../../types';\nimport { bazaarApiRef } from '../../api';\nimport Alert from '@material-ui/lab/Alert';\nimport useAsyncFn from 'react-use/esm/useAsyncFn';\nimport { catalogApiRef, entityRouteRef } from '@backstage/plugin-catalog-react';\n\nimport {\n stringifyEntityRef,\n Entity,\n parseEntityRef,\n} from '@backstage/catalog-model';\n\nimport { ConfirmationDialog } from '../ConfirmationDialog/ConfirmationDialog';\nimport { CardContentFields } from '../CardContentFields/CardContentFields';\nimport { LinkProjectDialog } from '../LinkProjectDialog';\nimport {\n fetchCatalogItems,\n fetchProjectMembers,\n} from '../../util/fetchMethods';\nimport { parseBazaarResponse } from '../../util/parseMethods';\n\nconst useStyles = makeStyles({\n wordBreak: {\n wordBreak: 'break-all',\n whiteSpace: 'normal',\n margin: '-0.25rem 0',\n },\n});\n\ntype Props = {\n initProject: BazaarProject;\n handleClose: () => void;\n initEntity: Entity;\n};\n\nexport const HomePageBazaarInfoCard = ({\n initProject,\n handleClose,\n initEntity,\n}: Props) => {\n const classes = useStyles();\n const entityLink = useRouteRef(entityRouteRef);\n const bazaarApi = useApi(bazaarApiRef);\n const identity = useApi(identityApiRef);\n const alertApi = useApi(alertApiRef);\n const catalogApi = useApi(catalogApiRef);\n const [openEdit, setOpenEdit] = useState(false);\n const [openProjectSelector, setOpenProjectSelector] = useState(false);\n const [openUnlink, setOpenUnlink] = useState(false);\n const [isMember, setIsMember] = useState(false);\n\n const [catalogEntities, fetchCatalogEntities] = useAsyncFn(async () => {\n const entities = await fetchCatalogItems(catalogApi);\n const bazaarProjects = await bazaarApi.getProjects();\n const bazaarLinkedRefs: string[] = bazaarProjects.data\n .filter((entity: any) => entity.entity_ref !== null)\n .map((entity: any) => entity.entity_ref);\n\n return entities.filter(\n (entity: Entity) =>\n !bazaarLinkedRefs.includes(stringifyEntityRef(entity)),\n );\n });\n\n const [bazaarProject, fetchBazaarProject] = useAsyncFn(async () => {\n const response = await bazaarApi.getProjectById(initProject.id);\n return await parseBazaarResponse(response);\n });\n\n const [members, fetchMembers] = useAsyncFn(async () => {\n return fetchProjectMembers(bazaarApi, bazaarProject.value ?? initProject);\n });\n\n const [userId, fetchUserId] = useAsyncFn(async () => {\n return await (\n await identity.getProfileInfo()\n ).displayName;\n });\n\n useEffect(() => {\n fetchMembers();\n fetchBazaarProject();\n fetchCatalogEntities();\n fetchUserId();\n }, [fetchMembers, fetchBazaarProject, fetchCatalogEntities, fetchUserId]);\n\n useEffect(() => {\n if (members.value && userId.value) {\n setIsMember(\n members.value\n ?.map((member: Member) => member.userId)\n .indexOf(userId.value) >= 0,\n );\n }\n }, [bazaarProject.value, members, identity, userId.value]);\n\n const handleMembersClick = async () => {\n if (userId.value) {\n if (!isMember) {\n await bazaarApi.addMember(bazaarProject.value!.id, userId.value);\n } else {\n await bazaarApi.deleteMember(bazaarProject.value!.id, userId.value);\n }\n setIsMember(!isMember);\n fetchMembers();\n }\n };\n\n const getEntityPageLink = () => {\n if (bazaarProject?.value?.entityRef) {\n const { name, kind, namespace } = parseEntityRef(\n bazaarProject.value.entityRef,\n );\n return entityLink({ kind, namespace, name });\n }\n return '';\n };\n\n const handleLink = () => {\n if (bazaarProject.value?.entityRef) {\n setOpenUnlink(true);\n } else {\n fetchCatalogEntities();\n setOpenProjectSelector(true);\n }\n };\n\n const links: IconLinkVerticalProps[] = [\n {\n label: 'Entity page',\n icon: <DashboardIcon />,\n href: bazaarProject.value?.entityRef ? getEntityPageLink() : '',\n disabled: bazaarProject.value?.entityRef === null,\n },\n {\n label: bazaarProject.value?.entityRef ? 'Unlink project' : 'Link project',\n icon: bazaarProject.value?.entityRef ? (\n <LinkOffIcon />\n ) : (\n <InsertLinkIcon />\n ),\n onClick: handleLink,\n },\n {\n label: isMember ? 'Leave' : 'Join',\n icon: isMember ? <ExitToAppIcon /> : <PersonAddIcon />,\n href: '',\n onClick: async () => {\n handleMembersClick();\n },\n },\n {\n label: 'Community',\n icon: <ChatIcon />,\n href: bazaarProject.value?.community,\n disabled: !bazaarProject.value?.community || !isMember,\n },\n {\n label: 'Docs',\n icon: <Description />,\n href: bazaarProject.value?.docs,\n disabled:\n bazaarProject.value?.docs === null || bazaarProject.value?.docs === '',\n },\n ];\n\n const handleUnlinkSubmit = async () => {\n const updateResponse = await bazaarApi.updateProject({\n ...bazaarProject.value,\n entityRef: null,\n });\n\n if (updateResponse.status === 'ok') {\n setOpenUnlink(false);\n fetchBazaarProject();\n alertApi.post({\n message: `Unlinked entity '${\n parseEntityRef(bazaarProject.value?.entityRef!).name\n }' from the project ${bazaarProject.value?.title}`,\n severity: 'success',\n display: 'transient',\n });\n }\n };\n\n if (bazaarProject.error) {\n return <Alert severity=\"error\">{bazaarProject?.error?.message}</Alert>;\n } else if (members.error) {\n return <Alert severity=\"error\">{members?.error?.message}</Alert>;\n }\n\n return (\n <div>\n <LinkProjectDialog\n openProjectSelector={openProjectSelector}\n handleProjectSelectorClose={() => setOpenProjectSelector(false)}\n catalogEntities={catalogEntities.value || []}\n bazaarProject={bazaarProject.value || initProject}\n fetchBazaarProject={fetchBazaarProject}\n initEntity={initEntity}\n />\n\n {openUnlink && (\n <ConfirmationDialog\n open={openUnlink}\n handleClose={() => setOpenUnlink(false)}\n message={[\n 'Are you sure you want to unlink ',\n <b className={classes.wordBreak}>\n {parseEntityRef(bazaarProject.value?.entityRef!).name}\n </b>,\n ' from ',\n <b className={classes.wordBreak}>{bazaarProject.value?.title}</b>,\n ' ?',\n ]}\n type=\"unlink\"\n handleSubmit={handleUnlinkSubmit}\n />\n )}\n\n <Card>\n <EditProjectDialog\n bazaarProject={bazaarProject.value || initProject}\n openEdit={openEdit}\n handleEditClose={() => setOpenEdit(false)}\n handleCardClose={handleClose}\n fetchBazaarProject={fetchBazaarProject}\n />\n\n <CardHeader\n title={\n <Typography paragraph className={classes.wordBreak}>\n {bazaarProject.value?.title || initProject.title}\n </Typography>\n }\n action={\n <div>\n <IconButton onClick={() => setOpenEdit(true)}>\n <EditIcon />\n </IconButton>\n <IconButton onClick={handleClose}>\n <CloseIcon />\n </IconButton>\n </div>\n }\n subheader={<HeaderIconLinkRow links={links} />}\n />\n <Divider />\n\n <CardContentFields\n bazaarProject={bazaarProject.value || initProject}\n members={members.value || []}\n descriptionSize={9}\n membersSize={3}\n isMember={isMember}\n />\n </Card>\n </div>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import React from 'react';
1
+ import React, { useState, useEffect } from 'react';
2
2
  import Button from '@material-ui/core/Button';
3
3
  import Dialog from '@material-ui/core/Dialog';
4
4
  import { useForm } from 'react-hook-form';
@@ -6,6 +6,10 @@ import { InputField } from '../InputField/InputField.esm.js';
6
6
  import { InputSelector } from '../InputSelector/InputSelector.esm.js';
7
7
  import { DoubleDateSelector } from '../DoubleDateSelector/DoubleDateSelector.esm.js';
8
8
  import { CustomDialogTitle, DialogContent, DialogActions } from '../CustomDialogTitle/CustomDialogTitle.esm.js';
9
+ import { fetchUsers } from '../../util/fetchMethods.esm.js';
10
+ import { UserSelector } from '../UserSelector/UserSelector.esm.js';
11
+ import { useApi } from '@backstage/core-plugin-api';
12
+ import { catalogApiRef } from '@backstage/plugin-catalog-react';
9
13
 
10
14
  const ProjectDialog = ({
11
15
  handleSave,
@@ -17,6 +21,8 @@ const ProjectDialog = ({
17
21
  deleteButton,
18
22
  handleClose
19
23
  }) => {
24
+ const catalogApi = useApi(catalogApiRef);
25
+ const [users, setUsers] = useState([]);
20
26
  const {
21
27
  handleSubmit,
22
28
  reset,
@@ -35,6 +41,9 @@ const ProjectDialog = ({
35
41
  handleClose();
36
42
  reset(defaultValues);
37
43
  };
44
+ useEffect(() => {
45
+ fetchUsers(catalogApi).then(setUsers);
46
+ }, [catalogApi]);
38
47
  return /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement(
39
48
  Dialog,
40
49
  {
@@ -89,16 +98,15 @@ const ProjectDialog = ({
89
98
  options: ["small", "medium", "large"]
90
99
  }
91
100
  ), /* @__PURE__ */ React.createElement(
92
- InputField,
101
+ UserSelector,
93
102
  {
94
- error: errors.responsible,
103
+ users,
104
+ disableClearable: false,
105
+ defaultValue: defaultValues.responsible,
106
+ label: "Select or enter responsible user",
107
+ name: "responsible",
95
108
  control,
96
- rules: {
97
- required: true
98
- },
99
- inputType: "responsible",
100
- helperText: "Please enter a contact person",
101
- placeholder: "Contact person of the project"
109
+ rules: { required: "Please select or enter a responsible user" }
102
110
  }
103
111
  ), isAddForm && projectSelector, /* @__PURE__ */ React.createElement(
104
112
  InputField,
@@ -1 +1 @@
1
- {"version":3,"file":"ProjectDialog.esm.js","sources":["../../../src/components/ProjectDialog/ProjectDialog.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport Button from '@material-ui/core/Button';\nimport Dialog from '@material-ui/core/Dialog';\nimport { useForm, UseFormReset, UseFormGetValues } from 'react-hook-form';\nimport { InputField } from '../InputField/InputField';\nimport { InputSelector } from '../InputSelector/InputSelector';\nimport { FormValues } from '../../types';\nimport { DoubleDateSelector } from '../DoubleDateSelector/DoubleDateSelector';\nimport {\n CustomDialogTitle,\n DialogActions,\n DialogContent,\n} from '../CustomDialogTitle';\n\ntype Props = {\n handleSave: (\n getValues: UseFormGetValues<FormValues>,\n reset: UseFormReset<FormValues>,\n ) => Promise<void>;\n isAddForm: boolean;\n title: string;\n defaultValues: FormValues;\n open: boolean;\n projectSelector?: JSX.Element;\n deleteButton?: JSX.Element;\n handleClose: () => void;\n};\n\nexport const ProjectDialog = ({\n handleSave,\n isAddForm,\n title,\n defaultValues,\n open,\n projectSelector,\n deleteButton,\n handleClose,\n}: Props) => {\n const {\n handleSubmit,\n reset,\n control,\n getValues,\n formState: { errors },\n setValue,\n } = useForm<FormValues>({\n mode: 'onChange',\n defaultValues,\n });\n\n const handleSaveForm = () => {\n handleSave(getValues, reset);\n };\n\n const handleCloseDialog = () => {\n handleClose();\n reset(defaultValues);\n };\n\n return (\n <div>\n <Dialog\n fullWidth\n maxWidth=\"xs\"\n onClose={handleCloseDialog}\n aria-labelledby=\"customized-dialog-title\"\n open={open}\n >\n <CustomDialogTitle\n id=\"customized-dialog-title\"\n onClose={handleCloseDialog}\n >\n {title}\n </CustomDialogTitle>\n <DialogContent style={{ padding: '1rem', paddingTop: '0rem' }} dividers>\n <InputField\n error={errors.title}\n control={control}\n rules={{\n required: true,\n }}\n inputType=\"title\"\n helperText=\"Please enter a title for your project\"\n />\n <InputField\n error={errors.description}\n control={control}\n rules={{\n required: true,\n }}\n inputType=\"description\"\n helperText=\"Please enter a description\"\n />\n\n <InputSelector\n control={control}\n name=\"status\"\n options={['proposed', 'ongoing', 'completed']}\n />\n\n <InputSelector\n control={control}\n name=\"size\"\n options={['small', 'medium', 'large']}\n />\n\n <InputField\n error={errors.responsible}\n control={control}\n rules={{\n required: true,\n }}\n inputType=\"responsible\"\n helperText=\"Please enter a contact person\"\n placeholder=\"Contact person of the project\"\n />\n\n {isAddForm && projectSelector}\n\n <InputField\n error={errors.community}\n control={control}\n rules={{\n required: false,\n pattern: RegExp('^(https?)://'),\n }}\n inputType=\"community\"\n helperText=\"Please enter a link starting with http/https\"\n placeholder=\"Community link to e.g. Teams or Discord\"\n />\n\n <InputField\n error={errors.docs}\n control={control}\n rules={{\n required: false,\n pattern: RegExp('^(https?)://'),\n }}\n inputType=\"docs\"\n helperText=\"Please enter a link starting with http/https\"\n placeholder=\"Project docs link\"\n />\n\n <DoubleDateSelector setValue={setValue} control={control} />\n </DialogContent>\n\n <DialogActions>\n {!isAddForm && deleteButton}\n <Button\n onClick={handleSubmit(handleSaveForm)}\n color=\"primary\"\n type=\"submit\"\n >\n Submit\n </Button>\n </DialogActions>\n </Dialog>\n </div>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ProjectDialog.esm.js","sources":["../../../src/components/ProjectDialog/ProjectDialog.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { useEffect, useState } from 'react';\nimport Button from '@material-ui/core/Button';\nimport Dialog from '@material-ui/core/Dialog';\nimport { useForm, UseFormReset, UseFormGetValues } from 'react-hook-form';\nimport { InputField } from '../InputField/InputField';\nimport { InputSelector } from '../InputSelector/InputSelector';\nimport { FormValues } from '../../types';\nimport { DoubleDateSelector } from '../DoubleDateSelector/DoubleDateSelector';\nimport {\n CustomDialogTitle,\n DialogActions,\n DialogContent,\n} from '../CustomDialogTitle';\nimport { fetchUsers } from '../../util/fetchMethods';\nimport { UserSelector } from '../UserSelector';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { catalogApiRef } from '@backstage/plugin-catalog-react';\nimport { Entity } from '@backstage/catalog-model';\n\ntype Props = {\n handleSave: (\n getValues: UseFormGetValues<FormValues>,\n reset: UseFormReset<FormValues>,\n ) => Promise<void>;\n isAddForm: boolean;\n title: string;\n defaultValues: FormValues;\n open: boolean;\n projectSelector?: JSX.Element;\n deleteButton?: JSX.Element;\n handleClose: () => void;\n};\n\nexport const ProjectDialog = ({\n handleSave,\n isAddForm,\n title,\n defaultValues,\n open,\n projectSelector,\n deleteButton,\n handleClose,\n}: Props) => {\n const catalogApi = useApi(catalogApiRef);\n const [users, setUsers] = useState<Entity[]>([]);\n\n const {\n handleSubmit,\n reset,\n control,\n getValues,\n formState: { errors },\n setValue,\n } = useForm<FormValues>({\n mode: 'onChange',\n defaultValues,\n });\n\n const handleSaveForm = () => {\n handleSave(getValues, reset);\n };\n\n const handleCloseDialog = () => {\n handleClose();\n reset(defaultValues);\n };\n\n useEffect(() => {\n fetchUsers(catalogApi).then(setUsers);\n }, [catalogApi]);\n\n return (\n <div>\n <Dialog\n fullWidth\n maxWidth=\"xs\"\n onClose={handleCloseDialog}\n aria-labelledby=\"customized-dialog-title\"\n open={open}\n >\n <CustomDialogTitle\n id=\"customized-dialog-title\"\n onClose={handleCloseDialog}\n >\n {title}\n </CustomDialogTitle>\n <DialogContent style={{ padding: '1rem', paddingTop: '0rem' }} dividers>\n <InputField\n error={errors.title}\n control={control}\n rules={{\n required: true,\n }}\n inputType=\"title\"\n helperText=\"Please enter a title for your project\"\n />\n <InputField\n error={errors.description}\n control={control}\n rules={{\n required: true,\n }}\n inputType=\"description\"\n helperText=\"Please enter a description\"\n />\n\n <InputSelector\n control={control}\n name=\"status\"\n options={['proposed', 'ongoing', 'completed']}\n />\n\n <InputSelector\n control={control}\n name=\"size\"\n options={['small', 'medium', 'large']}\n />\n\n <UserSelector\n users={users}\n disableClearable={false}\n defaultValue={defaultValues.responsible}\n label=\"Select or enter responsible user\"\n name=\"responsible\"\n control={control}\n rules={{ required: 'Please select or enter a responsible user' }}\n />\n\n {isAddForm && projectSelector}\n\n <InputField\n error={errors.community}\n control={control}\n rules={{\n required: false,\n pattern: RegExp('^(https?)://'),\n }}\n inputType=\"community\"\n helperText=\"Please enter a link starting with http/https\"\n placeholder=\"Community link to e.g. Teams or Discord\"\n />\n\n <InputField\n error={errors.docs}\n control={control}\n rules={{\n required: false,\n pattern: RegExp('^(https?)://'),\n }}\n inputType=\"docs\"\n helperText=\"Please enter a link starting with http/https\"\n placeholder=\"Project docs link\"\n />\n\n <DoubleDateSelector setValue={setValue} control={control} />\n </DialogContent>\n\n <DialogActions>\n {!isAddForm && deleteButton}\n <Button\n onClick={handleSubmit(handleSaveForm)}\n color=\"primary\"\n type=\"submit\"\n >\n Submit\n </Button>\n </DialogActions>\n </Dialog>\n </div>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,104 @@
1
+ import React, { useState, useEffect } from 'react';
2
+ import { stringifyEntityRef } from '@backstage/catalog-model';
3
+ import Autocomplete, { createFilterOptions } from '@material-ui/lab/Autocomplete';
4
+ import TextField from '@material-ui/core/TextField';
5
+ import { makeStyles } from '@material-ui/core/styles';
6
+ import { Controller } from 'react-hook-form';
7
+ import { useApi } from '@backstage/core-plugin-api';
8
+ import { entityPresentationApiRef, EntityDisplayName } from '@backstage/plugin-catalog-react';
9
+
10
+ const useStyles = makeStyles({
11
+ container: { width: "100%", minWidth: "22rem" },
12
+ autocomplete: { overflow: "hidden" }
13
+ });
14
+ const UserSelector = ({
15
+ users,
16
+ disableClearable,
17
+ defaultValue,
18
+ label,
19
+ name,
20
+ control,
21
+ rules
22
+ }) => {
23
+ const classes = useStyles();
24
+ const entityPresentationApi = useApi(entityPresentationApiRef);
25
+ const [entityPresentations, setEntityPresentations] = useState(/* @__PURE__ */ new Map());
26
+ useEffect(() => {
27
+ const fetchPresentations = async () => {
28
+ const presentations = /* @__PURE__ */ new Map();
29
+ await Promise.all(
30
+ users.map(async (user) => {
31
+ const presentation = await entityPresentationApi.forEntity(user).promise;
32
+ presentations.set(stringifyEntityRef(user), presentation);
33
+ })
34
+ );
35
+ setEntityPresentations(presentations);
36
+ };
37
+ fetchPresentations();
38
+ }, [users, entityPresentationApi]);
39
+ const getOptionLabel = (option) => {
40
+ if (typeof option === "string") return option;
41
+ const entityRef = stringifyEntityRef(option);
42
+ return entityPresentations.get(entityRef)?.primaryTitle ?? option.metadata.name;
43
+ };
44
+ const filterOptions = createFilterOptions({
45
+ stringify: (option) => {
46
+ if (typeof option === "string") return option;
47
+ const entityRef = stringifyEntityRef(option);
48
+ return entityPresentations.get(entityRef)?.primaryTitle ?? option.metadata.name;
49
+ }
50
+ });
51
+ return /* @__PURE__ */ React.createElement("div", { className: classes.container }, /* @__PURE__ */ React.createElement(
52
+ Controller,
53
+ {
54
+ name,
55
+ control,
56
+ rules,
57
+ defaultValue: defaultValue ?? "",
58
+ render: ({ field: { onChange, value }, fieldState: { error } }) => /* @__PURE__ */ React.createElement(
59
+ Autocomplete,
60
+ {
61
+ className: classes.autocomplete,
62
+ fullWidth: true,
63
+ freeSolo: true,
64
+ disableClearable,
65
+ value,
66
+ options: users,
67
+ getOptionLabel,
68
+ renderOption: (option) => typeof option === "string" ? option : /* @__PURE__ */ React.createElement(EntityDisplayName, { entityRef: option }),
69
+ renderInput: (params) => /* @__PURE__ */ React.createElement(
70
+ TextField,
71
+ {
72
+ ...params,
73
+ label,
74
+ required: !!rules?.required,
75
+ error: !!error,
76
+ helperText: error?.message
77
+ }
78
+ ),
79
+ onChange: (_, data) => {
80
+ if (typeof data === "string") {
81
+ onChange(data);
82
+ } else if (data) {
83
+ onChange(stringifyEntityRef(data));
84
+ } else {
85
+ onChange("");
86
+ }
87
+ },
88
+ filterOptions: (options, params) => {
89
+ const filtered = filterOptions(options, params);
90
+ if (params.inputValue !== "" && !options.some(
91
+ (option) => getOptionLabel(option) === params.inputValue
92
+ )) {
93
+ filtered.push(params.inputValue);
94
+ }
95
+ return filtered;
96
+ }
97
+ }
98
+ )
99
+ }
100
+ ));
101
+ };
102
+
103
+ export { UserSelector };
104
+ //# sourceMappingURL=UserSelector.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UserSelector.esm.js","sources":["../../../src/components/UserSelector/UserSelector.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React, { useState, useEffect } from 'react';\nimport { Entity, stringifyEntityRef } from '@backstage/catalog-model';\nimport Autocomplete, {\n createFilterOptions,\n} from '@material-ui/lab/Autocomplete';\nimport TextField from '@material-ui/core/TextField';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { Controller, Control } from 'react-hook-form';\nimport { FormValues } from '../../types';\nimport { useApi } from '@backstage/core-plugin-api';\nimport {\n entityPresentationApiRef,\n EntityDisplayName,\n EntityRefPresentationSnapshot,\n} from '@backstage/plugin-catalog-react';\n\ntype Props = {\n users: Entity[];\n disableClearable: boolean;\n defaultValue: string | null;\n label: string;\n name: 'responsible';\n control: Control<FormValues, object>;\n rules?: Record<string, any>;\n};\n\nconst useStyles = makeStyles({\n container: { width: '100%', minWidth: '22rem' },\n autocomplete: { overflow: 'hidden' },\n});\n\nexport const UserSelector = ({\n users,\n disableClearable,\n defaultValue,\n label,\n name,\n control,\n rules,\n}: Props) => {\n const classes = useStyles();\n const entityPresentationApi = useApi(entityPresentationApiRef);\n const [entityPresentations, setEntityPresentations] = useState<\n Map<string, EntityRefPresentationSnapshot>\n >(new Map());\n\n useEffect(() => {\n const fetchPresentations = async () => {\n const presentations = new Map<string, EntityRefPresentationSnapshot>();\n await Promise.all(\n users.map(async user => {\n const presentation = await entityPresentationApi.forEntity(user)\n .promise;\n presentations.set(stringifyEntityRef(user), presentation);\n }),\n );\n setEntityPresentations(presentations);\n };\n\n fetchPresentations();\n }, [users, entityPresentationApi]);\n\n const getOptionLabel = (option: Entity | string) => {\n // option can be a string due to freeSolo.\n if (typeof option === 'string') return option;\n const entityRef = stringifyEntityRef(option);\n\n return (\n entityPresentations.get(entityRef)?.primaryTitle ?? option.metadata.name\n );\n };\n\n const filterOptions = createFilterOptions<Entity | string>({\n stringify: option => {\n if (typeof option === 'string') return option;\n const entityRef = stringifyEntityRef(option);\n return (\n entityPresentations.get(entityRef)?.primaryTitle ?? option.metadata.name\n );\n },\n });\n\n return (\n <div className={classes.container}>\n <Controller\n name={name}\n control={control}\n rules={rules}\n defaultValue={defaultValue ?? ''}\n render={({ field: { onChange, value }, fieldState: { error } }) => (\n <Autocomplete\n className={classes.autocomplete}\n fullWidth\n freeSolo\n disableClearable={disableClearable}\n value={value}\n options={users}\n getOptionLabel={getOptionLabel}\n renderOption={option =>\n typeof option === 'string' ? (\n option\n ) : (\n <EntityDisplayName entityRef={option} />\n )\n }\n renderInput={params => (\n <TextField\n {...params}\n label={label}\n required={!!rules?.required}\n error={!!error}\n helperText={error?.message}\n />\n )}\n onChange={(_, data) => {\n if (typeof data === 'string') {\n onChange(data);\n } else if (data) {\n onChange(stringifyEntityRef(data));\n } else {\n onChange('');\n }\n }}\n filterOptions={(options, params) => {\n const filtered = filterOptions(options, params);\n if (\n params.inputValue !== '' &&\n !options.some(\n option => getOptionLabel(option) === params.inputValue,\n )\n ) {\n filtered.push(params.inputValue);\n }\n return filtered;\n }}\n />\n )}\n />\n </div>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -21,6 +21,15 @@ const fetchCatalogItems = async (catalogApi) => {
21
21
  });
22
22
  return entities.items;
23
23
  };
24
+ const fetchUsers = async (catalogApi) => {
25
+ const entities = await catalogApi.getEntities({
26
+ filter: {
27
+ kind: ["User"]
28
+ },
29
+ fields: ["kind", "metadata.name", "metadata.namespace"]
30
+ });
31
+ return entities.items;
32
+ };
24
33
 
25
- export { fetchCatalogItems, fetchProjectMembers };
34
+ export { fetchCatalogItems, fetchProjectMembers, fetchUsers };
26
35
  //# sourceMappingURL=fetchMethods.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fetchMethods.esm.js","sources":["../../src/util/fetchMethods.ts"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { sortMembers } from './sortMethods';\nimport { parseMember } from './parseMethods';\nimport { BazaarProject, Member } from '../types';\nimport { BazaarApi } from '../api';\nimport { Entity } from '@backstage/catalog-model';\nimport { CatalogApi } from '@backstage/plugin-catalog-react';\n\nexport const fetchProjectMembers = async (\n bazaarApi: BazaarApi,\n project: BazaarProject,\n): Promise<Member[]> => {\n const response = await bazaarApi.getMembers(project.id);\n\n if (response.data.length > 0) {\n const dbMembers = response.data.map((member: any) => {\n return parseMember(member);\n });\n\n dbMembers.sort(sortMembers);\n return dbMembers;\n }\n return [];\n};\n\nexport const fetchCatalogItems = async (\n catalogApi: CatalogApi,\n): Promise<Entity[]> => {\n const entities = await catalogApi.getEntities({\n filter: {\n kind: ['Component', 'Resource'],\n },\n fields: ['kind', 'metadata.name', 'metadata.namespace'],\n });\n\n return entities.items;\n};\n"],"names":[],"mappings":";;;AAuBa,MAAA,mBAAA,GAAsB,OACjC,SAAA,EACA,OACsB,KAAA;AACtB,EAAA,MAAM,QAAW,GAAA,MAAM,SAAU,CAAA,UAAA,CAAW,QAAQ,EAAE,CAAA,CAAA;AAEtD,EAAI,IAAA,QAAA,CAAS,IAAK,CAAA,MAAA,GAAS,CAAG,EAAA;AAC5B,IAAA,MAAM,SAAY,GAAA,QAAA,CAAS,IAAK,CAAA,GAAA,CAAI,CAAC,MAAgB,KAAA;AACnD,MAAA,OAAO,YAAY,MAAM,CAAA,CAAA;AAAA,KAC1B,CAAA,CAAA;AAED,IAAA,SAAA,CAAU,KAAK,WAAW,CAAA,CAAA;AAC1B,IAAO,OAAA,SAAA,CAAA;AAAA,GACT;AACA,EAAA,OAAO,EAAC,CAAA;AACV,EAAA;AAEa,MAAA,iBAAA,GAAoB,OAC/B,UACsB,KAAA;AACtB,EAAM,MAAA,QAAA,GAAW,MAAM,UAAA,CAAW,WAAY,CAAA;AAAA,IAC5C,MAAQ,EAAA;AAAA,MACN,IAAA,EAAM,CAAC,WAAA,EAAa,UAAU,CAAA;AAAA,KAChC;AAAA,IACA,MAAQ,EAAA,CAAC,MAAQ,EAAA,eAAA,EAAiB,oBAAoB,CAAA;AAAA,GACvD,CAAA,CAAA;AAED,EAAA,OAAO,QAAS,CAAA,KAAA,CAAA;AAClB;;;;"}
1
+ {"version":3,"file":"fetchMethods.esm.js","sources":["../../src/util/fetchMethods.ts"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { sortMembers } from './sortMethods';\nimport { parseMember } from './parseMethods';\nimport { BazaarProject, Member } from '../types';\nimport { BazaarApi } from '../api';\nimport { Entity } from '@backstage/catalog-model';\nimport { CatalogApi } from '@backstage/plugin-catalog-react';\n\nexport const fetchProjectMembers = async (\n bazaarApi: BazaarApi,\n project: BazaarProject,\n): Promise<Member[]> => {\n const response = await bazaarApi.getMembers(project.id);\n\n if (response.data.length > 0) {\n const dbMembers = response.data.map((member: any) => {\n return parseMember(member);\n });\n\n dbMembers.sort(sortMembers);\n return dbMembers;\n }\n return [];\n};\n\nexport const fetchCatalogItems = async (\n catalogApi: CatalogApi,\n): Promise<Entity[]> => {\n const entities = await catalogApi.getEntities({\n filter: {\n kind: ['Component', 'Resource'],\n },\n fields: ['kind', 'metadata.name', 'metadata.namespace'],\n });\n\n return entities.items;\n};\n\nexport const fetchUsers = async (catalogApi: CatalogApi): Promise<Entity[]> => {\n const entities = await catalogApi.getEntities({\n filter: {\n kind: ['User'],\n },\n fields: ['kind', 'metadata.name', 'metadata.namespace'],\n });\n\n return entities.items;\n};\n"],"names":[],"mappings":";;;AAuBa,MAAA,mBAAA,GAAsB,OACjC,SAAA,EACA,OACsB,KAAA;AACtB,EAAA,MAAM,QAAW,GAAA,MAAM,SAAU,CAAA,UAAA,CAAW,QAAQ,EAAE,CAAA,CAAA;AAEtD,EAAI,IAAA,QAAA,CAAS,IAAK,CAAA,MAAA,GAAS,CAAG,EAAA;AAC5B,IAAA,MAAM,SAAY,GAAA,QAAA,CAAS,IAAK,CAAA,GAAA,CAAI,CAAC,MAAgB,KAAA;AACnD,MAAA,OAAO,YAAY,MAAM,CAAA,CAAA;AAAA,KAC1B,CAAA,CAAA;AAED,IAAA,SAAA,CAAU,KAAK,WAAW,CAAA,CAAA;AAC1B,IAAO,OAAA,SAAA,CAAA;AAAA,GACT;AACA,EAAA,OAAO,EAAC,CAAA;AACV,EAAA;AAEa,MAAA,iBAAA,GAAoB,OAC/B,UACsB,KAAA;AACtB,EAAM,MAAA,QAAA,GAAW,MAAM,UAAA,CAAW,WAAY,CAAA;AAAA,IAC5C,MAAQ,EAAA;AAAA,MACN,IAAA,EAAM,CAAC,WAAA,EAAa,UAAU,CAAA;AAAA,KAChC;AAAA,IACA,MAAQ,EAAA,CAAC,MAAQ,EAAA,eAAA,EAAiB,oBAAoB,CAAA;AAAA,GACvD,CAAA,CAAA;AAED,EAAA,OAAO,QAAS,CAAA,KAAA,CAAA;AAClB,EAAA;AAEa,MAAA,UAAA,GAAa,OAAO,UAA8C,KAAA;AAC7E,EAAM,MAAA,QAAA,GAAW,MAAM,UAAA,CAAW,WAAY,CAAA;AAAA,IAC5C,MAAQ,EAAA;AAAA,MACN,IAAA,EAAM,CAAC,MAAM,CAAA;AAAA,KACf;AAAA,IACA,MAAQ,EAAA,CAAC,MAAQ,EAAA,eAAA,EAAiB,oBAAoB,CAAA;AAAA,GACvD,CAAA,CAAA;AAED,EAAA,OAAO,QAAS,CAAA,KAAA,CAAA;AAClB;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage-community/plugin-bazaar",
3
- "version": "0.3.0",
3
+ "version": "0.5.0",
4
4
  "backstage": {
5
5
  "role": "frontend-plugin",
6
6
  "pluginId": "bazaar",