@backstage-community/plugin-bazaar 0.9.1 → 0.11.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.
Files changed (55) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/components/About/About.esm.js +21 -9
  3. package/dist/components/About/About.esm.js.map +1 -1
  4. package/dist/components/AddProjectDialog/AddProjectDialog.esm.js +4 -3
  5. package/dist/components/AddProjectDialog/AddProjectDialog.esm.js.map +1 -1
  6. package/dist/components/BazaarOverviewCard/BazaarOverviewCard.esm.js +18 -17
  7. package/dist/components/BazaarOverviewCard/BazaarOverviewCard.esm.js.map +1 -1
  8. package/dist/components/CardContentFields/AboutField.esm.js +6 -3
  9. package/dist/components/CardContentFields/AboutField.esm.js.map +1 -1
  10. package/dist/components/CardContentFields/CardContentFields.esm.js +65 -51
  11. package/dist/components/CardContentFields/CardContentFields.esm.js.map +1 -1
  12. package/dist/components/ConfirmationDialog/ConfirmationDialog.esm.js +12 -7
  13. package/dist/components/ConfirmationDialog/ConfirmationDialog.esm.js.map +1 -1
  14. package/dist/components/CustomDialogTitle/CustomDialogTitle.esm.js +13 -10
  15. package/dist/components/CustomDialogTitle/CustomDialogTitle.esm.js.map +1 -1
  16. package/dist/components/DateSelector/DateSelector.esm.js +5 -5
  17. package/dist/components/DateSelector/DateSelector.esm.js.map +1 -1
  18. package/dist/components/DoubleDateSelector/DoubleDateSelector.esm.js +6 -2
  19. package/dist/components/DoubleDateSelector/DoubleDateSelector.esm.js.map +1 -1
  20. package/dist/components/EditProjectDialog/EditProjectDialog.esm.js +40 -36
  21. package/dist/components/EditProjectDialog/EditProjectDialog.esm.js.map +1 -1
  22. package/dist/components/EntityBazaarInfoCard/EntityBazaarInfoCard.esm.js +4 -3
  23. package/dist/components/EntityBazaarInfoCard/EntityBazaarInfoCard.esm.js.map +1 -1
  24. package/dist/components/EntityBazaarInfoContent/EntityBazaarInfoContent.esm.js +61 -54
  25. package/dist/components/EntityBazaarInfoContent/EntityBazaarInfoContent.esm.js.map +1 -1
  26. package/dist/components/HomePage/HomePage.esm.js +13 -10
  27. package/dist/components/HomePage/HomePage.esm.js.map +1 -1
  28. package/dist/components/HomePageBazaarInfoCard/HomePageBazaarInfoCard.esm.js +72 -59
  29. package/dist/components/HomePageBazaarInfoCard/HomePageBazaarInfoCard.esm.js.map +1 -1
  30. package/dist/components/InputField/InputField.esm.js +3 -3
  31. package/dist/components/InputField/InputField.esm.js.map +1 -1
  32. package/dist/components/InputSelector/InputSelector.esm.js +28 -25
  33. package/dist/components/InputSelector/InputSelector.esm.js.map +1 -1
  34. package/dist/components/LinkProjectDialog/LinkProjectDialog.esm.js +23 -18
  35. package/dist/components/LinkProjectDialog/LinkProjectDialog.esm.js.map +1 -1
  36. package/dist/components/ProjectCard/ProjectCard.esm.js +31 -20
  37. package/dist/components/ProjectCard/ProjectCard.esm.js.map +1 -1
  38. package/dist/components/ProjectDialog/ProjectDialog.esm.js +112 -96
  39. package/dist/components/ProjectDialog/ProjectDialog.esm.js.map +1 -1
  40. package/dist/components/ProjectPreview/ProjectPreview.esm.js +32 -28
  41. package/dist/components/ProjectPreview/ProjectPreview.esm.js.map +1 -1
  42. package/dist/components/ProjectSelector/ProjectSelector.esm.js +5 -5
  43. package/dist/components/ProjectSelector/ProjectSelector.esm.js.map +1 -1
  44. package/dist/components/SortMethodSelector/SortMethodSelector.esm.js +11 -9
  45. package/dist/components/SortMethodSelector/SortMethodSelector.esm.js.map +1 -1
  46. package/dist/components/SortView/SortView.esm.js +63 -52
  47. package/dist/components/SortView/SortView.esm.js.map +1 -1
  48. package/dist/components/StatusTag/StatusTag.esm.js +5 -5
  49. package/dist/components/StatusTag/StatusTag.esm.js.map +1 -1
  50. package/dist/components/UserSelector/UserSelector.esm.js +7 -6
  51. package/dist/components/UserSelector/UserSelector.esm.js.map +1 -1
  52. package/dist/components/VirtualizedListbox/VirtualizedListbox.esm.js +8 -7
  53. package/dist/components/VirtualizedListbox/VirtualizedListbox.esm.js.map +1 -1
  54. package/dist/index.d.ts +5 -7
  55. package/package.json +16 -9
@@ -1 +1 @@
1
- {"version":3,"file":"SortView.esm.js","sources":["../../../src/components/SortView/SortView.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, { ChangeEvent, useEffect, useState } from 'react';\nimport { Content, SupportButton } from '@backstage/core-components';\nimport { AddProjectDialog } from '../AddProjectDialog';\nimport { ProjectPreview } from '../ProjectPreview/ProjectPreview';\nimport Button from '@material-ui/core/Button';\nimport { makeStyles } from '@material-ui/core/styles';\nimport useAsyncFn from 'react-use/esm/useAsyncFn';\nimport { Entity, stringifyEntityRef } from '@backstage/catalog-model';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { catalogApiRef } from '@backstage/plugin-catalog-react';\nimport { BazaarProject } from '../../types';\nimport { bazaarApiRef } from '../../api';\nimport Alert from '@material-ui/lab/Alert';\nimport SearchBar from 'material-ui-search-bar';\nimport {\n sortByDate,\n sortByMembers,\n sortByTitle,\n sortByTitleDescending,\n} from '../../util/sortMethods';\nimport { SortMethodSelector } from '../SortMethodSelector';\nimport { fetchCatalogItems } from '../../util/fetchMethods';\nimport { parseBazaarProject } from '../../util/parseMethods';\n\nconst useStyles = makeStyles({\n button: { minWidth: '11rem' },\n container: {\n marginTop: '2rem',\n },\n header: {\n width: '100%',\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'center',\n alignItems: 'center',\n margin: '0 auto',\n marginBottom: '1.2rem',\n },\n search: {\n marginRight: '1rem',\n height: '2.5rem',\n width: '35rem',\n },\n});\n\nconst getUnlinkedCatalogEntities = (\n bazaarProjects: BazaarProject[],\n catalogEntities: Entity[],\n) => {\n const bazaarProjectRefs = bazaarProjects.map(\n (project: BazaarProject) => project.entityRef,\n );\n\n return catalogEntities.filter((entity: Entity) => {\n return !bazaarProjectRefs?.includes(stringifyEntityRef(entity));\n });\n};\n\n/** @public */\nexport type SortViewProps = {\n fullWidth?: boolean;\n fullHeight?: boolean;\n};\n\n/** @public */\nexport const SortView = (props: SortViewProps) => {\n const { fullWidth = true, fullHeight = true } = props;\n const bazaarApi = useApi(bazaarApiRef);\n const catalogApi = useApi(catalogApiRef);\n const classes = useStyles();\n const sortMethods = [\n sortByDate,\n sortByTitle,\n sortByTitleDescending,\n sortByMembers,\n ];\n const [sortMethodNbr, setSortMethodNbr] = useState(0);\n const [openAdd, setOpenAdd] = useState(false);\n const [searchValue, setSearchValue] = useState('');\n const [unlinkedCatalogEntities, setUnlinkedCatalogEntities] =\n useState<Entity[]>();\n\n const [catalogEntities, fetchCatalogEntities] = useAsyncFn(async () => {\n return await fetchCatalogItems(catalogApi);\n });\n\n const [bazaarProjects, fetchBazaarProjects] = useAsyncFn(async () => {\n const response = await bazaarApi.getProjects();\n const dbProjects: BazaarProject[] = [];\n\n response.data.forEach((project: any) => {\n dbProjects.push(parseBazaarProject(project));\n });\n\n return dbProjects;\n });\n\n const catalogEntityRefs = catalogEntities.value?.map((project: Entity) =>\n stringifyEntityRef(project),\n );\n\n const getSearchResults = () => {\n return bazaarProjects.value\n ?.filter(project => project.title.includes(searchValue))\n .sort(sortMethods[sortMethodNbr]);\n };\n\n useEffect(() => {\n const filterBrokenLinks = () => {\n if (catalogEntityRefs) {\n bazaarProjects.value?.forEach(async (project: BazaarProject) => {\n if (project.entityRef) {\n if (!catalogEntityRefs?.includes(project.entityRef)) {\n await bazaarApi.updateProject({\n ...project,\n entityRef: null,\n });\n }\n }\n });\n }\n };\n filterBrokenLinks();\n }, [\n bazaarApi,\n bazaarProjects.value,\n catalogEntityRefs,\n catalogEntities.value,\n ]);\n\n useEffect(() => {\n fetchCatalogEntities();\n fetchBazaarProjects();\n }, [fetchBazaarProjects, fetchCatalogEntities]);\n\n useEffect(() => {\n const unlinkedCEntities = getUnlinkedCatalogEntities(\n bazaarProjects.value || [],\n catalogEntities.value || [],\n );\n\n if (unlinkedCEntities) {\n setUnlinkedCatalogEntities(unlinkedCEntities);\n }\n }, [bazaarProjects, catalogEntities]);\n\n const handleSortMethodChange = (\n event: ChangeEvent<{ name?: string | undefined; value: unknown }>,\n ) => {\n setSortMethodNbr(\n typeof event.target.value === 'number' ? event.target.value : 0,\n );\n };\n\n if (catalogEntities.error)\n return <Alert severity=\"error\">{catalogEntities.error.message}</Alert>;\n\n if (bazaarProjects.error)\n return <Alert severity=\"error\">{bazaarProjects.error.message}</Alert>;\n\n return (\n <Content noPadding>\n <div className={classes.header}>\n <SortMethodSelector\n sortMethodNbr={sortMethodNbr}\n handleSortMethodChange={handleSortMethodChange}\n />\n\n <SearchBar\n className={classes.search}\n value={searchValue}\n onChange={newSortMethod => {\n setSearchValue(newSortMethod);\n }}\n onCancelSearch={() => {\n setSearchValue('');\n }}\n />\n <Button\n className={classes.button}\n variant=\"contained\"\n color=\"primary\"\n onClick={() => {\n setOpenAdd(true);\n }}\n >\n Add project\n </Button>\n <AddProjectDialog\n catalogEntities={unlinkedCatalogEntities || []}\n handleClose={() => {\n setOpenAdd(false);\n }}\n open={openAdd}\n fetchBazaarProjects={fetchBazaarProjects}\n fetchCatalogEntities={fetchCatalogEntities}\n />\n <SupportButton />\n </div>\n <ProjectPreview\n bazaarProjects={getSearchResults() || []}\n fetchBazaarProjects={fetchBazaarProjects}\n catalogEntities={unlinkedCatalogEntities || []}\n gridSize={fullWidth ? 2 : 4}\n height={fullHeight ? 'large' : 'small'}\n />\n <Content noPadding className={classes.container} />\n </Content>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SortView.esm.js","sources":["../../../src/components/SortView/SortView.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 { ChangeEvent, useEffect, useState } from 'react';\nimport { Content, SupportButton } from '@backstage/core-components';\nimport { AddProjectDialog } from '../AddProjectDialog';\nimport { ProjectPreview } from '../ProjectPreview/ProjectPreview';\nimport Button from '@material-ui/core/Button';\nimport { makeStyles } from '@material-ui/core/styles';\nimport useAsyncFn from 'react-use/esm/useAsyncFn';\nimport { Entity, stringifyEntityRef } from '@backstage/catalog-model';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { catalogApiRef } from '@backstage/plugin-catalog-react';\nimport { BazaarProject } from '../../types';\nimport { bazaarApiRef } from '../../api';\nimport Alert from '@material-ui/lab/Alert';\nimport SearchBar from 'material-ui-search-bar';\nimport {\n sortByDate,\n sortByMembers,\n sortByTitle,\n sortByTitleDescending,\n} from '../../util/sortMethods';\nimport { SortMethodSelector } from '../SortMethodSelector';\nimport { fetchCatalogItems } from '../../util/fetchMethods';\nimport { parseBazaarProject } from '../../util/parseMethods';\n\nconst useStyles = makeStyles({\n button: { minWidth: '11rem' },\n container: {\n marginTop: '2rem',\n },\n header: {\n width: '100%',\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'center',\n alignItems: 'center',\n margin: '0 auto',\n marginBottom: '1.2rem',\n },\n search: {\n marginRight: '1rem',\n height: '2.5rem',\n width: '35rem',\n },\n});\n\nconst getUnlinkedCatalogEntities = (\n bazaarProjects: BazaarProject[],\n catalogEntities: Entity[],\n) => {\n const bazaarProjectRefs = bazaarProjects.map(\n (project: BazaarProject) => project.entityRef,\n );\n\n return catalogEntities.filter((entity: Entity) => {\n return !bazaarProjectRefs?.includes(stringifyEntityRef(entity));\n });\n};\n\n/** @public */\nexport type SortViewProps = {\n fullWidth?: boolean;\n fullHeight?: boolean;\n};\n\n/** @public */\nexport const SortView = (props: SortViewProps) => {\n const { fullWidth = true, fullHeight = true } = props;\n const bazaarApi = useApi(bazaarApiRef);\n const catalogApi = useApi(catalogApiRef);\n const classes = useStyles();\n const sortMethods = [\n sortByDate,\n sortByTitle,\n sortByTitleDescending,\n sortByMembers,\n ];\n const [sortMethodNbr, setSortMethodNbr] = useState(0);\n const [openAdd, setOpenAdd] = useState(false);\n const [searchValue, setSearchValue] = useState('');\n const [unlinkedCatalogEntities, setUnlinkedCatalogEntities] =\n useState<Entity[]>();\n\n const [catalogEntities, fetchCatalogEntities] = useAsyncFn(async () => {\n return await fetchCatalogItems(catalogApi);\n });\n\n const [bazaarProjects, fetchBazaarProjects] = useAsyncFn(async () => {\n const response = await bazaarApi.getProjects();\n const dbProjects: BazaarProject[] = [];\n\n response.data.forEach((project: any) => {\n dbProjects.push(parseBazaarProject(project));\n });\n\n return dbProjects;\n });\n\n const catalogEntityRefs = catalogEntities.value?.map((project: Entity) =>\n stringifyEntityRef(project),\n );\n\n const getSearchResults = () => {\n return bazaarProjects.value\n ?.filter(project => project.title.includes(searchValue))\n .sort(sortMethods[sortMethodNbr]);\n };\n\n useEffect(() => {\n const filterBrokenLinks = () => {\n if (catalogEntityRefs) {\n bazaarProjects.value?.forEach(async (project: BazaarProject) => {\n if (project.entityRef) {\n if (!catalogEntityRefs?.includes(project.entityRef)) {\n await bazaarApi.updateProject({\n ...project,\n entityRef: null,\n });\n }\n }\n });\n }\n };\n filterBrokenLinks();\n }, [\n bazaarApi,\n bazaarProjects.value,\n catalogEntityRefs,\n catalogEntities.value,\n ]);\n\n useEffect(() => {\n fetchCatalogEntities();\n fetchBazaarProjects();\n }, [fetchBazaarProjects, fetchCatalogEntities]);\n\n useEffect(() => {\n const unlinkedCEntities = getUnlinkedCatalogEntities(\n bazaarProjects.value || [],\n catalogEntities.value || [],\n );\n\n if (unlinkedCEntities) {\n setUnlinkedCatalogEntities(unlinkedCEntities);\n }\n }, [bazaarProjects, catalogEntities]);\n\n const handleSortMethodChange = (\n event: ChangeEvent<{ name?: string | undefined; value: unknown }>,\n ) => {\n setSortMethodNbr(\n typeof event.target.value === 'number' ? event.target.value : 0,\n );\n };\n\n if (catalogEntities.error)\n return <Alert severity=\"error\">{catalogEntities.error.message}</Alert>;\n\n if (bazaarProjects.error)\n return <Alert severity=\"error\">{bazaarProjects.error.message}</Alert>;\n\n return (\n <Content noPadding>\n <div className={classes.header}>\n <SortMethodSelector\n sortMethodNbr={sortMethodNbr}\n handleSortMethodChange={handleSortMethodChange}\n />\n\n <SearchBar\n className={classes.search}\n value={searchValue}\n onChange={newSortMethod => {\n setSearchValue(newSortMethod);\n }}\n onCancelSearch={() => {\n setSearchValue('');\n }}\n />\n <Button\n className={classes.button}\n variant=\"contained\"\n color=\"primary\"\n onClick={() => {\n setOpenAdd(true);\n }}\n >\n Add project\n </Button>\n <AddProjectDialog\n catalogEntities={unlinkedCatalogEntities || []}\n handleClose={() => {\n setOpenAdd(false);\n }}\n open={openAdd}\n fetchBazaarProjects={fetchBazaarProjects}\n fetchCatalogEntities={fetchCatalogEntities}\n />\n <SupportButton />\n </div>\n <ProjectPreview\n bazaarProjects={getSearchResults() || []}\n fetchBazaarProjects={fetchBazaarProjects}\n catalogEntities={unlinkedCatalogEntities || []}\n gridSize={fullWidth ? 2 : 4}\n height={fullHeight ? 'large' : 'small'}\n />\n <Content noPadding className={classes.container} />\n </Content>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -1,13 +1,13 @@
1
- import React from 'react';
1
+ import { jsx } from 'react/jsx-runtime';
2
2
  import { StatusWarning, StatusPending, StatusOK } from '@backstage/core-components';
3
3
 
4
4
  const statuses = {
5
- proposed: /* @__PURE__ */ React.createElement(StatusWarning, null, "proposed"),
6
- ongoing: /* @__PURE__ */ React.createElement(StatusPending, null, "ongoing"),
7
- completed: /* @__PURE__ */ React.createElement(StatusOK, null, "completed")
5
+ proposed: /* @__PURE__ */ jsx(StatusWarning, { children: "proposed" }),
6
+ ongoing: /* @__PURE__ */ jsx(StatusPending, { children: "ongoing" }),
7
+ completed: /* @__PURE__ */ jsx(StatusOK, { children: "completed" })
8
8
  };
9
9
  const StatusTag = ({ status, styles }) => {
10
- return /* @__PURE__ */ React.createElement("div", { className: styles }, statuses[status]);
10
+ return /* @__PURE__ */ jsx("div", { className: styles, children: statuses[status] });
11
11
  };
12
12
 
13
13
  export { StatusTag };
@@ -1 +1 @@
1
- {"version":3,"file":"StatusTag.esm.js","sources":["../../../src/components/StatusTag/StatusTag.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 {\n StatusOK,\n StatusPending,\n StatusWarning,\n} from '@backstage/core-components';\nimport { Status } from '../../types';\n\ninterface StatusComponent {\n [key: string]: JSX.Element | undefined;\n}\n\nconst statuses: StatusComponent = {\n proposed: <StatusWarning>proposed</StatusWarning>,\n ongoing: <StatusPending>ongoing</StatusPending>,\n completed: <StatusOK>completed</StatusOK>,\n};\n\ntype Props = {\n status: Status;\n styles?: string;\n};\n\nexport const StatusTag = ({ status, styles }: Props) => {\n return <div className={styles}>{statuses[status]}</div>;\n};\n"],"names":[],"mappings":";;;AA4BA,MAAM,QAA4B,GAAA;AAAA,EAChC,QAAA,kBAAW,KAAA,CAAA,aAAA,CAAA,aAAA,EAAA,IAAA,EAAc,UAAQ,CAAA;AAAA,EACjC,OAAA,kBAAU,KAAA,CAAA,aAAA,CAAA,aAAA,EAAA,IAAA,EAAc,SAAO,CAAA;AAAA,EAC/B,SAAA,kBAAY,KAAA,CAAA,aAAA,CAAA,QAAA,EAAA,IAAA,EAAS,WAAS;AAChC,CAAA;AAOO,MAAM,SAAY,GAAA,CAAC,EAAE,MAAA,EAAQ,QAAoB,KAAA;AACtD,EAAA,2CAAQ,KAAI,EAAA,EAAA,SAAA,EAAW,MAAS,EAAA,EAAA,QAAA,CAAS,MAAM,CAAE,CAAA;AACnD;;;;"}
1
+ {"version":3,"file":"StatusTag.esm.js","sources":["../../../src/components/StatusTag/StatusTag.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 {\n StatusOK,\n StatusPending,\n StatusWarning,\n} from '@backstage/core-components';\nimport { Status } from '../../types';\n\ninterface StatusComponent {\n [key: string]: JSX.Element | undefined;\n}\n\nconst statuses: StatusComponent = {\n proposed: <StatusWarning>proposed</StatusWarning>,\n ongoing: <StatusPending>ongoing</StatusPending>,\n completed: <StatusOK>completed</StatusOK>,\n};\n\ntype Props = {\n status: Status;\n styles?: string;\n};\n\nexport const StatusTag = ({ status, styles }: Props) => {\n return <div className={styles}>{statuses[status]}</div>;\n};\n"],"names":[],"mappings":";;;AA2BA,MAAM,QAA4B,GAAA;AAAA,EAChC,QAAA,kBAAW,GAAA,CAAA,aAAA,EAAA,EAAc,QAAQ,EAAA,UAAA,EAAA,CAAA;AAAA,EACjC,OAAA,kBAAU,GAAA,CAAA,aAAA,EAAA,EAAc,QAAO,EAAA,SAAA,EAAA,CAAA;AAAA,EAC/B,SAAA,kBAAY,GAAA,CAAA,QAAA,EAAA,EAAS,QAAS,EAAA,WAAA,EAAA;AAChC,CAAA;AAOO,MAAM,SAAY,GAAA,CAAC,EAAE,MAAA,EAAQ,QAAoB,KAAA;AACtD,EAAA,2BAAQ,KAAI,EAAA,EAAA,SAAA,EAAW,MAAS,EAAA,QAAA,EAAA,QAAA,CAAS,MAAM,CAAE,EAAA,CAAA;AACnD;;;;"}
@@ -1,4 +1,5 @@
1
- import React, { useCallback } from 'react';
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { useCallback } from 'react';
2
3
  import { stringifyEntityRef } from '@backstage/catalog-model';
3
4
  import Autocomplete, { createFilterOptions } from '@material-ui/lab/Autocomplete';
4
5
  import TextField from '@material-ui/core/TextField';
@@ -50,14 +51,14 @@ const UserSelector = ({
50
51
  return entityData?.entityRefToPresentation.get(entityRef)?.primaryTitle ?? option.metadata.name;
51
52
  }
52
53
  });
53
- return /* @__PURE__ */ React.createElement("div", { className: classes.container }, /* @__PURE__ */ React.createElement(
54
+ return /* @__PURE__ */ jsx("div", { className: classes.container, children: /* @__PURE__ */ jsx(
54
55
  Controller,
55
56
  {
56
57
  name,
57
58
  control,
58
59
  rules,
59
60
  defaultValue: defaultValue ?? "",
60
- render: ({ field: { onChange, value }, fieldState: { error } }) => /* @__PURE__ */ React.createElement(
61
+ render: ({ field: { onChange, value }, fieldState: { error } }) => /* @__PURE__ */ jsx(
61
62
  Autocomplete,
62
63
  {
63
64
  className: classes.autocomplete,
@@ -68,8 +69,8 @@ const UserSelector = ({
68
69
  value,
69
70
  options: users,
70
71
  getOptionLabel,
71
- renderOption: (option) => typeof option === "string" ? option : /* @__PURE__ */ React.createElement(EntityDisplayName, { entityRef: option }),
72
- renderInput: (params) => /* @__PURE__ */ React.createElement(
72
+ renderOption: (option) => typeof option === "string" ? option : /* @__PURE__ */ jsx(EntityDisplayName, { entityRef: option }),
73
+ renderInput: (params) => /* @__PURE__ */ jsx(
73
74
  TextField,
74
75
  {
75
76
  ...params,
@@ -101,7 +102,7 @@ const UserSelector = ({
101
102
  }
102
103
  )
103
104
  }
104
- ));
105
+ ) });
105
106
  };
106
107
 
107
108
  export { UserSelector };
@@ -1 +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, { useCallback } 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 useAsync from 'react-use/esm/useAsync';\nimport {\n entityPresentationApiRef,\n EntityDisplayName,\n} from '@backstage/plugin-catalog-react';\nimport { VirtualizedListbox } from '../VirtualizedListbox';\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\n const { value: entityData, loading } = useAsync(async () => {\n const entityRefToPresentation = new Map(\n await Promise.all(\n users.map(async user => {\n const presentation = await entityPresentationApi.forEntity(user)\n .promise;\n return [stringifyEntityRef(user), presentation] as const;\n }),\n ),\n );\n\n return { users, entityRefToPresentation };\n }, [users]);\n\n const getOptionLabel = useCallback(\n (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 return (\n entityData?.entityRefToPresentation.get(entityRef)?.primaryTitle ??\n option.metadata.name\n );\n },\n [entityData],\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 entityData?.entityRefToPresentation.get(entityRef)?.primaryTitle ??\n 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 loading={loading}\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 ListboxComponent={VirtualizedListbox}\n />\n )}\n />\n </div>\n );\n};\n"],"names":[],"mappings":"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"}
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 { useCallback } 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 useAsync from 'react-use/esm/useAsync';\nimport {\n entityPresentationApiRef,\n EntityDisplayName,\n} from '@backstage/plugin-catalog-react';\nimport { VirtualizedListbox } from '../VirtualizedListbox';\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\n const { value: entityData, loading } = useAsync(async () => {\n const entityRefToPresentation = new Map(\n await Promise.all(\n users.map(async user => {\n const presentation = await entityPresentationApi.forEntity(user)\n .promise;\n return [stringifyEntityRef(user), presentation] as const;\n }),\n ),\n );\n\n return { users, entityRefToPresentation };\n }, [users]);\n\n const getOptionLabel = useCallback(\n (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 return (\n entityData?.entityRefToPresentation.get(entityRef)?.primaryTitle ??\n option.metadata.name\n );\n },\n [entityData],\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 entityData?.entityRefToPresentation.get(entityRef)?.primaryTitle ??\n 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 loading={loading}\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 ListboxComponent={VirtualizedListbox}\n />\n )}\n />\n </div>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
- import React from 'react';
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import * as React from 'react';
2
3
  import { FixedSizeList } from 'react-window';
3
4
 
4
5
  const renderRow = (props) => {
@@ -9,7 +10,7 @@ const OuterElementContext = React.createContext({});
9
10
  const OuterElementType = React.forwardRef(
10
11
  (props, ref) => {
11
12
  const outerProps = React.useContext(OuterElementContext);
12
- return /* @__PURE__ */ React.createElement("div", { ref, ...props, ...outerProps });
13
+ return /* @__PURE__ */ jsx("div", { ref, ...props, ...outerProps });
13
14
  }
14
15
  );
15
16
  OuterElementType.displayName = "OuterElementType";
@@ -20,7 +21,7 @@ const VirtualizedListbox = React.forwardRef((props, ref) => {
20
21
  const itemSize = 36;
21
22
  const itemsToShow = Math.min(10, itemCount) + 0.5;
22
23
  const height = itemsToShow * itemSize;
23
- return /* @__PURE__ */ React.createElement("div", { ref }, /* @__PURE__ */ React.createElement(OuterElementContext.Provider, { value: other }, /* @__PURE__ */ React.createElement(
24
+ return /* @__PURE__ */ jsx("div", { ref, children: /* @__PURE__ */ jsx(OuterElementContext.Provider, { value: other, children: /* @__PURE__ */ jsx(
24
25
  FixedSizeList,
25
26
  {
26
27
  height,
@@ -28,10 +29,10 @@ const VirtualizedListbox = React.forwardRef((props, ref) => {
28
29
  itemCount,
29
30
  itemSize,
30
31
  itemData,
31
- outerElementType: OuterElementType
32
- },
33
- renderRow
34
- )));
32
+ outerElementType: OuterElementType,
33
+ children: renderRow
34
+ }
35
+ ) }) });
35
36
  });
36
37
 
37
38
  export { VirtualizedListbox };
@@ -1 +1 @@
1
- {"version":3,"file":"VirtualizedListbox.esm.js","sources":["../../../src/components/VirtualizedListbox/VirtualizedListbox.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 from 'react';\nimport { FixedSizeList, ListChildComponentProps } from 'react-window';\n\ntype HTMLDivProps = React.HTMLAttributes<HTMLDivElement>;\n\nconst renderRow = (props: ListChildComponentProps) => {\n const { data, index, style } = props;\n return React.cloneElement(data[index], { style });\n};\n\n// Context needed to keep Autocomplete working correctly : https://v4.mui.com/components/autocomplete/#Virtualize.tsx\nconst OuterElementContext = React.createContext<HTMLDivProps>({});\n\nconst OuterElementType = React.forwardRef<HTMLDivElement, HTMLDivProps>(\n (props, ref) => {\n const outerProps = React.useContext(OuterElementContext);\n return <div ref={ref} {...props} {...outerProps} />;\n },\n);\n\nOuterElementType.displayName = 'OuterElementType';\n\nexport const VirtualizedListbox = React.forwardRef<\n HTMLDivElement,\n HTMLDivProps\n>((props, ref) => {\n const { children, ...other } = props;\n const itemData = React.Children.toArray(children);\n const itemCount = itemData.length;\n\n const itemSize = 36;\n const itemsToShow = Math.min(10, itemCount) + 0.5;\n const height = itemsToShow * itemSize;\n\n return (\n <div ref={ref}>\n <OuterElementContext.Provider value={other}>\n <FixedSizeList\n height={height}\n width=\"100%\"\n itemCount={itemCount}\n itemSize={itemSize}\n itemData={itemData}\n outerElementType={OuterElementType}\n >\n {renderRow}\n </FixedSizeList>\n </OuterElementContext.Provider>\n </div>\n );\n});\n"],"names":[],"mappings":";;;AAoBA,MAAM,SAAA,GAAY,CAAC,KAAmC,KAAA;AACpD,EAAA,MAAM,EAAE,IAAA,EAAM,KAAO,EAAA,KAAA,EAAU,GAAA,KAAA;AAC/B,EAAA,OAAO,MAAM,YAAa,CAAA,IAAA,CAAK,KAAK,CAAG,EAAA,EAAE,OAAO,CAAA;AAClD,CAAA;AAGA,MAAM,mBAAsB,GAAA,KAAA,CAAM,aAA4B,CAAA,EAAE,CAAA;AAEhE,MAAM,mBAAmB,KAAM,CAAA,UAAA;AAAA,EAC7B,CAAC,OAAO,GAAQ,KAAA;AACd,IAAM,MAAA,UAAA,GAAa,KAAM,CAAA,UAAA,CAAW,mBAAmB,CAAA;AACvD,IAAA,2CAAQ,KAAI,EAAA,EAAA,GAAA,EAAW,GAAG,KAAA,EAAQ,GAAG,UAAY,EAAA,CAAA;AAAA;AAErD,CAAA;AAEA,gBAAA,CAAiB,WAAc,GAAA,kBAAA;AAExB,MAAM,kBAAqB,GAAA,KAAA,CAAM,UAGtC,CAAA,CAAC,OAAO,GAAQ,KAAA;AAChB,EAAA,MAAM,EAAE,QAAA,EAAU,GAAG,KAAA,EAAU,GAAA,KAAA;AAC/B,EAAA,MAAM,QAAW,GAAA,KAAA,CAAM,QAAS,CAAA,OAAA,CAAQ,QAAQ,CAAA;AAChD,EAAA,MAAM,YAAY,QAAS,CAAA,MAAA;AAE3B,EAAA,MAAM,QAAW,GAAA,EAAA;AACjB,EAAA,MAAM,WAAc,GAAA,IAAA,CAAK,GAAI,CAAA,EAAA,EAAI,SAAS,CAAI,GAAA,GAAA;AAC9C,EAAA,MAAM,SAAS,WAAc,GAAA,QAAA;AAE7B,EACE,uBAAA,KAAA,CAAA,aAAA,CAAC,SAAI,GACH,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,oBAAoB,QAApB,EAAA,EAA6B,OAAO,KACnC,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,MAAA;AAAA,MACA,KAAM,EAAA,MAAA;AAAA,MACN,SAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA;AAAA,MACA,gBAAkB,EAAA;AAAA,KAAA;AAAA,IAEjB;AAAA,GAEL,CACF,CAAA;AAEJ,CAAC;;;;"}
1
+ {"version":3,"file":"VirtualizedListbox.esm.js","sources":["../../../src/components/VirtualizedListbox/VirtualizedListbox.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 * as React from 'react';\nimport { FixedSizeList, ListChildComponentProps } from 'react-window';\n\ntype HTMLDivProps = React.HTMLAttributes<HTMLDivElement>;\n\nconst renderRow = (props: ListChildComponentProps) => {\n const { data, index, style } = props;\n return React.cloneElement(data[index], { style });\n};\n\n// Context needed to keep Autocomplete working correctly : https://v4.mui.com/components/autocomplete/#Virtualize.tsx\nconst OuterElementContext = React.createContext<HTMLDivProps>({});\n\nconst OuterElementType = React.forwardRef<HTMLDivElement, HTMLDivProps>(\n (props, ref) => {\n const outerProps = React.useContext(OuterElementContext);\n return <div ref={ref} {...props} {...outerProps} />;\n },\n);\n\nOuterElementType.displayName = 'OuterElementType';\n\nexport const VirtualizedListbox = React.forwardRef<\n HTMLDivElement,\n HTMLDivProps\n>((props, ref) => {\n const { children, ...other } = props;\n const itemData = React.Children.toArray(children);\n const itemCount = itemData.length;\n\n const itemSize = 36;\n const itemsToShow = Math.min(10, itemCount) + 0.5;\n const height = itemsToShow * itemSize;\n\n return (\n <div ref={ref}>\n <OuterElementContext.Provider value={other}>\n <FixedSizeList\n height={height}\n width=\"100%\"\n itemCount={itemCount}\n itemSize={itemSize}\n itemData={itemData}\n outerElementType={OuterElementType}\n >\n {renderRow}\n </FixedSizeList>\n </OuterElementContext.Provider>\n </div>\n );\n});\n"],"names":[],"mappings":";;;;AAoBA,MAAM,SAAA,GAAY,CAAC,KAAmC,KAAA;AACpD,EAAA,MAAM,EAAE,IAAA,EAAM,KAAO,EAAA,KAAA,EAAU,GAAA,KAAA;AAC/B,EAAA,OAAO,MAAM,YAAa,CAAA,IAAA,CAAK,KAAK,CAAG,EAAA,EAAE,OAAO,CAAA;AAClD,CAAA;AAGA,MAAM,mBAAsB,GAAA,KAAA,CAAM,aAA4B,CAAA,EAAE,CAAA;AAEhE,MAAM,mBAAmB,KAAM,CAAA,UAAA;AAAA,EAC7B,CAAC,OAAO,GAAQ,KAAA;AACd,IAAM,MAAA,UAAA,GAAa,KAAM,CAAA,UAAA,CAAW,mBAAmB,CAAA;AACvD,IAAA,2BAAQ,KAAI,EAAA,EAAA,GAAA,EAAW,GAAG,KAAA,EAAQ,GAAG,UAAY,EAAA,CAAA;AAAA;AAErD,CAAA;AAEA,gBAAA,CAAiB,WAAc,GAAA,kBAAA;AAExB,MAAM,kBAAqB,GAAA,KAAA,CAAM,UAGtC,CAAA,CAAC,OAAO,GAAQ,KAAA;AAChB,EAAA,MAAM,EAAE,QAAA,EAAU,GAAG,KAAA,EAAU,GAAA,KAAA;AAC/B,EAAA,MAAM,QAAW,GAAA,KAAA,CAAM,QAAS,CAAA,OAAA,CAAQ,QAAQ,CAAA;AAChD,EAAA,MAAM,YAAY,QAAS,CAAA,MAAA;AAE3B,EAAA,MAAM,QAAW,GAAA,EAAA;AACjB,EAAA,MAAM,WAAc,GAAA,IAAA,CAAK,GAAI,CAAA,EAAA,EAAI,SAAS,CAAI,GAAA,GAAA;AAC9C,EAAA,MAAM,SAAS,WAAc,GAAA,QAAA;AAE7B,EACE,uBAAA,GAAA,CAAC,SAAI,GACH,EAAA,QAAA,kBAAA,GAAA,CAAC,oBAAoB,QAApB,EAAA,EAA6B,OAAO,KACnC,EAAA,QAAA,kBAAA,GAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,MAAA;AAAA,MACA,KAAM,EAAA,MAAA;AAAA,MACN,SAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA;AAAA,MACA,gBAAkB,EAAA,gBAAA;AAAA,MAEjB,QAAA,EAAA;AAAA;AAAA,KAEL,CACF,EAAA,CAAA;AAEJ,CAAC;;;;"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,4 @@
1
- /// <reference types="react" />
2
- import * as React from 'react';
3
- import React__default from 'react';
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
4
2
  import * as _backstage_core_plugin_api from '@backstage/core-plugin-api';
5
3
  import { ApiHolder } from '@backstage/core-plugin-api';
6
4
  import { Entity } from '@backstage/catalog-model';
@@ -18,7 +16,7 @@ declare const bazaarPlugin: _backstage_core_plugin_api.BackstagePlugin<{
18
16
  root: _backstage_core_plugin_api.RouteRef<undefined>;
19
17
  }, {}, {}>;
20
18
  /** @public */
21
- declare const BazaarPage: (props: HomePageProps) => React.JSX.Element;
19
+ declare const BazaarPage: (props: HomePageProps) => react_jsx_runtime.JSX.Element;
22
20
 
23
21
  /** @public */
24
22
  declare const isBazaarAvailable: (entity: Entity, context: {
@@ -33,10 +31,10 @@ type BazaarOverviewCardProps = {
33
31
  fullHeight?: boolean;
34
32
  };
35
33
  /** @public */
36
- declare const BazaarOverviewCard: (props: BazaarOverviewCardProps) => React__default.JSX.Element;
34
+ declare const BazaarOverviewCard: (props: BazaarOverviewCardProps) => react_jsx_runtime.JSX.Element;
37
35
 
38
36
  /** @public */
39
- declare const EntityBazaarInfoCard: () => React__default.JSX.Element | null;
37
+ declare const EntityBazaarInfoCard: () => react_jsx_runtime.JSX.Element | null;
40
38
 
41
39
  /** @public */
42
40
  type SortViewProps = {
@@ -44,6 +42,6 @@ type SortViewProps = {
44
42
  fullHeight?: boolean;
45
43
  };
46
44
  /** @public */
47
- declare const SortView: (props: SortViewProps) => React__default.JSX.Element;
45
+ declare const SortView: (props: SortViewProps) => react_jsx_runtime.JSX.Element;
48
46
 
49
47
  export { BazaarOverviewCard, type BazaarOverviewCardProps, BazaarPage, type HomePageProps as BazaarPageProps, EntityBazaarInfoCard, SortView, type SortViewProps, bazaarPlugin, isBazaarAvailable };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage-community/plugin-bazaar",
3
- "version": "0.9.1",
3
+ "version": "0.11.0",
4
4
  "backstage": {
5
5
  "role": "frontend-plugin",
6
6
  "pluginId": "bazaar",
@@ -37,12 +37,12 @@
37
37
  "test": "backstage-cli package test"
38
38
  },
39
39
  "dependencies": {
40
- "@backstage/catalog-client": "^1.9.1",
41
- "@backstage/catalog-model": "^1.7.3",
42
- "@backstage/core-components": "^0.17.0",
43
- "@backstage/core-plugin-api": "^1.10.5",
40
+ "@backstage/catalog-client": "^1.10.0",
41
+ "@backstage/catalog-model": "^1.7.4",
42
+ "@backstage/core-components": "^0.17.2",
43
+ "@backstage/core-plugin-api": "^1.10.7",
44
44
  "@backstage/errors": "^1.2.7",
45
- "@backstage/plugin-catalog-react": "^1.16.0",
45
+ "@backstage/plugin-catalog-react": "^1.18.0",
46
46
  "@date-io/luxon": "1.x",
47
47
  "@material-ui/core": "^4.12.2",
48
48
  "@material-ui/icons": "^4.9.1",
@@ -57,9 +57,9 @@
57
57
  "react-window": "^1.8.10"
58
58
  },
59
59
  "devDependencies": {
60
- "@backstage/cli": "^0.31.0",
61
- "@backstage/dev-utils": "^1.1.8",
62
- "@backstage/plugin-catalog": "^1.28.0",
60
+ "@backstage/cli": "^0.32.1",
61
+ "@backstage/dev-utils": "^1.1.10",
62
+ "@backstage/plugin-catalog": "^1.30.0",
63
63
  "@testing-library/dom": "^10.0.0",
64
64
  "@testing-library/jest-dom": "^6.0.0",
65
65
  "@testing-library/react": "^15.0.0",
@@ -74,5 +74,12 @@
74
74
  "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0",
75
75
  "react-router-dom": "6.0.0-beta.0 || ^6.3.0"
76
76
  },
77
+ "typesVersions": {
78
+ "*": {
79
+ "package.json": [
80
+ "package.json"
81
+ ]
82
+ }
83
+ },
77
84
  "module": "./dist/index.esm.js"
78
85
  }