@drodil/backstage-plugin-qeta-react 3.59.2 → 3.59.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/alpha.esm.js.map +1 -1
- package/dist/api.esm.js.map +1 -1
- package/dist/components/AIAnswerCard/AIAnswerCard.esm.js +1 -1
- package/dist/components/AIAnswerCard/AIAnswerCard.esm.js.map +1 -1
- package/dist/components/AnswerCard/AnswerCard.esm.js.map +1 -1
- package/dist/components/AnswerForm/AnswerForm.esm.js +1 -1
- package/dist/components/AnswerForm/AnswerForm.esm.js.map +1 -1
- package/dist/components/AnswersContainer/AnswerListItem.esm.js.map +1 -1
- package/dist/components/AnswersContainer/AnswersContainer.esm.js.map +1 -1
- package/dist/components/AnswersContainer/AnswersGridItem.esm.js.map +1 -1
- package/dist/components/ArticleContent/ArticleButtons.esm.js.map +1 -1
- package/dist/components/ArticleContent/ArticleContent.esm.js.map +1 -1
- package/dist/components/AuthorBox/AuthorBox.esm.js.map +1 -1
- package/dist/components/AuthorBox/AuthorBoxes.esm.js.map +1 -1
- package/dist/components/Badges/BadgeChip.esm.js.map +1 -1
- package/dist/components/Badges/UserBadges.esm.js.map +1 -1
- package/dist/components/Buttons/AddToCollectionButton.esm.js.map +1 -1
- package/dist/components/Buttons/AskQuestionButton.esm.js.map +1 -1
- package/dist/components/Buttons/ButtonContainer.esm.js.map +1 -1
- package/dist/components/Buttons/CollectionFollowButton.esm.js.map +1 -1
- package/dist/components/Buttons/ContentHeaderButton.esm.js.map +1 -1
- package/dist/components/Buttons/CreateCollectionButton.esm.js.map +1 -1
- package/dist/components/Buttons/CreateLinkButton.esm.js.map +1 -1
- package/dist/components/Buttons/EntityFollowButton.esm.js.map +1 -1
- package/dist/components/Buttons/FavoriteButton.esm.js.map +1 -1
- package/dist/components/Buttons/FollowPostButton.esm.js.map +1 -1
- package/dist/components/Buttons/LinkButton.esm.js.map +1 -1
- package/dist/components/Buttons/OpenLinkButton.esm.js.map +1 -1
- package/dist/components/Buttons/RankingButtons.esm.js.map +1 -1
- package/dist/components/Buttons/TagFollowButton.esm.js.map +1 -1
- package/dist/components/Buttons/UserFollowButton.esm.js.map +1 -1
- package/dist/components/Buttons/VoteButtons.esm.js.map +1 -1
- package/dist/components/Buttons/WriteArticleButton.esm.js.map +1 -1
- package/dist/components/CollectionForm/CollectionForm.esm.js.map +1 -1
- package/dist/components/CollectionsContainer/CollectionListItem.esm.js.map +1 -1
- package/dist/components/CollectionsContainer/CollectionsContainer.esm.js.map +1 -1
- package/dist/components/CollectionsContainer/CollectionsGridItem.esm.js.map +1 -1
- package/dist/components/CommentSection/CommentForm.esm.js.map +1 -1
- package/dist/components/CommentSection/CommentList.esm.js.map +1 -1
- package/dist/components/CommentSection/CommentListItem.esm.js.map +1 -1
- package/dist/components/CommentSection/CommentSection.esm.js.map +1 -1
- package/dist/components/ContentHeader/ContentHeader.esm.js.map +1 -1
- package/dist/components/ContentHeaderCard/ContentHeaderCard.esm.js.map +1 -1
- package/dist/components/EntitiesContainer/EntitiesContainer.esm.js.map +1 -1
- package/dist/components/EntitiesContainer/EntitiesGridItem.esm.js.map +1 -1
- package/dist/components/EntitiesContainer/EntityListItem.esm.js.map +1 -1
- package/dist/components/FaviconItem/FaviconItem.esm.js.map +1 -1
- package/dist/components/FilterPanel/DateRangeFilter.esm.js.map +1 -1
- package/dist/components/FilterPanel/FilterPanel.esm.js.map +1 -1
- package/dist/components/FollowedLists/FollowedCollectionsList.esm.js.map +1 -1
- package/dist/components/FollowedLists/FollowedEntitiesList.esm.js.map +1 -1
- package/dist/components/FollowedLists/FollowedTagsList.esm.js.map +1 -1
- package/dist/components/FollowedLists/FollowedUsersList.esm.js.map +1 -1
- package/dist/components/GridItemStyles/useGridItemStyles.esm.js.map +1 -1
- package/dist/components/HeaderImageInput/HeaderImageInput.esm.js.map +1 -1
- package/dist/components/HomePageCards/CommunityActivityCard.esm.js.map +1 -1
- package/dist/components/HomePageCards/FollowedItemsCard.esm.js.map +1 -1
- package/dist/components/HomePageCards/ImpactCard.esm.js.map +1 -1
- package/dist/components/HomePageCards/PostsCard.esm.js.map +1 -1
- package/dist/components/Icons/ExpertIcon.esm.js.map +1 -1
- package/dist/components/LeftMenu/LeftMenu.esm.js.map +1 -1
- package/dist/components/LeftMenu/LeftMenuButton.esm.js.map +1 -1
- package/dist/components/LinkCard/LinkCard.esm.js.map +1 -1
- package/dist/components/Links/Links.esm.js.map +1 -1
- package/dist/components/LoadingGrid/LoadingGrid.esm.js.map +1 -1
- package/dist/components/MarkdownEditor/MarkdownEditor.esm.js.map +1 -1
- package/dist/components/MarkdownRenderer/MarkdownRenderer.esm.js.map +1 -1
- package/dist/components/Modals/DeleteModal.esm.js.map +1 -1
- package/dist/components/Modals/ObsoleteModal.esm.js.map +1 -1
- package/dist/components/Modals/ValidReviewModal.esm.js.map +1 -1
- package/dist/components/PostAnonymouslyCheckbox/PostAnonymouslyCheckbox.esm.js.map +1 -1
- package/dist/components/PostForm/AutocompleteListComponent.esm.js +1 -1
- package/dist/components/PostForm/AutocompleteListComponent.esm.js.map +1 -1
- package/dist/components/PostForm/EntitiesInput.esm.js +3 -6
- package/dist/components/PostForm/EntitiesInput.esm.js.map +1 -1
- package/dist/components/PostForm/PostForm.esm.js.map +1 -1
- package/dist/components/PostForm/TagInput.esm.js +1 -1
- package/dist/components/PostForm/TagInput.esm.js.map +1 -1
- package/dist/components/PostHighlightList/PostHighlightList.esm.js.map +1 -1
- package/dist/components/PostHighlightList/PostHighlightListContainer.esm.js.map +1 -1
- package/dist/components/PostHistory/PostHistory.esm.js.map +1 -1
- package/dist/components/PostHistoryButton/PostHistoryButton.esm.js +4 -5
- package/dist/components/PostHistoryButton/PostHistoryButton.esm.js.map +1 -1
- package/dist/components/PostsContainer/NoPostsCard.esm.js.map +1 -1
- package/dist/components/PostsContainer/PostListItem.esm.js.map +1 -1
- package/dist/components/PostsContainer/PostsContainer.esm.js.map +1 -1
- package/dist/components/PostsContainer/PostsGridItem.esm.js.map +1 -1
- package/dist/components/PostsTable/PostsTable.esm.js.map +1 -1
- package/dist/components/PostsTable/PostsTableRow.esm.js.map +1 -1
- package/dist/components/QetaContext/QetaContext.esm.js +1 -1
- package/dist/components/QetaContext/QetaContext.esm.js.map +1 -1
- package/dist/components/QetaEntityContainer/QetaEntityContainer.esm.js.map +1 -1
- package/dist/components/QuestionCard/QuestionCard.esm.js.map +1 -1
- package/dist/components/RelativeTimeWithTooltip/RelativeTimeWithTooltip.esm.js.map +1 -1
- package/dist/components/SearchBar/SearchBar.esm.js.map +1 -1
- package/dist/components/SelectTemplateList/SelectTemplateList.esm.js.map +1 -1
- package/dist/components/StatsChart/StatsChart.esm.js +1 -1
- package/dist/components/StatsChart/StatsChart.esm.js.map +1 -1
- package/dist/components/StatsChart/util.esm.js.map +1 -1
- package/dist/components/SuggestionsCard/SuggestionsCard.esm.js.map +1 -1
- package/dist/components/TagsAndEntities/EntityChip.esm.js.map +1 -1
- package/dist/components/TagsAndEntities/TagChip.esm.js.map +1 -1
- package/dist/components/TagsAndEntities/TagsAndEntities.esm.js.map +1 -1
- package/dist/components/TagsContainer/CreateTagModal.esm.js.map +1 -1
- package/dist/components/TagsContainer/EditTagModal.esm.js.map +1 -1
- package/dist/components/TagsContainer/TagGridItem.esm.js.map +1 -1
- package/dist/components/TagsContainer/TagListItem.esm.js.map +1 -1
- package/dist/components/TagsContainer/TagsContainer.esm.js.map +1 -1
- package/dist/components/TemplateList/TemplateForm.esm.js.map +1 -1
- package/dist/components/TemplateList/TemplateList.esm.js.map +1 -1
- package/dist/components/Timeline/Timeline.esm.js.map +1 -1
- package/dist/components/Timeline/TimelineItem.esm.js.map +1 -1
- package/dist/components/Tooltips/CollectionTooltip.esm.js.map +1 -1
- package/dist/components/Tooltips/EntityTooltip.esm.js.map +1 -1
- package/dist/components/Tooltips/PostTooltip.esm.js.map +1 -1
- package/dist/components/Tooltips/TagTooltip.esm.js.map +1 -1
- package/dist/components/Tooltips/UserTooltip.esm.js.map +1 -1
- package/dist/components/TopRankingUsersCard/TopRankingUsersCard.esm.js.map +1 -1
- package/dist/components/TopRankingUsersCard/TrophyIcon.esm.js.map +1 -1
- package/dist/components/UsersContainer/UserListItem.esm.js.map +1 -1
- package/dist/components/UsersContainer/UsersContainer.esm.js.map +1 -1
- package/dist/components/UsersContainer/UsersGridItem.esm.js.map +1 -1
- package/dist/components/Utility/ClickableLink.esm.js.map +1 -1
- package/dist/components/Utility/DeletedBanner.esm.js.map +1 -1
- package/dist/components/Utility/DraftBanner.esm.js.map +1 -1
- package/dist/components/Utility/ModalContent.esm.js.map +1 -1
- package/dist/components/Utility/ObsoleteBanner.esm.js.map +1 -1
- package/dist/components/Utility/OptionalRequirePermission.esm.js.map +1 -1
- package/dist/components/Utility/QetaGridHeader.esm.js.map +1 -1
- package/dist/components/Utility/QetaPagination.esm.js.map +1 -1
- package/dist/components/Utility/RightList.esm.js +1 -1
- package/dist/components/Utility/RightList.esm.js.map +1 -1
- package/dist/components/Utility/StatusChip.esm.js.map +1 -1
- package/dist/components/Utility/VoteButtonContainer.esm.js.map +1 -1
- package/dist/components/ViewToggle/ViewToggle.esm.js.map +1 -1
- package/dist/hooks/useAI.esm.js.map +1 -1
- package/dist/hooks/useCanReview.esm.js.map +1 -1
- package/dist/hooks/useCollectionsFollow.esm.js.map +1 -1
- package/dist/hooks/useEntityAuthor.esm.js.map +1 -1
- package/dist/hooks/useEntityFollow.esm.js.map +1 -1
- package/dist/hooks/useEntityQueryParameter.esm.js.map +1 -1
- package/dist/hooks/useFavicon.esm.js.map +1 -1
- package/dist/hooks/useFollow.esm.js.map +1 -1
- package/dist/hooks/useGridPageSize.esm.js.map +1 -1
- package/dist/hooks/useHistoryEnabled.esm.js.map +1 -1
- package/dist/hooks/useIdentityApi.esm.js.map +1 -1
- package/dist/hooks/useIsDarkTheme.esm.js.map +1 -1
- package/dist/hooks/useIsModerator.esm.js.map +1 -1
- package/dist/hooks/useListItemStyles.esm.js.map +1 -1
- package/dist/hooks/useQetaApi.esm.js.map +1 -1
- package/dist/hooks/useQetaEntities.esm.js.map +1 -1
- package/dist/hooks/useTagsFollow.esm.js.map +1 -1
- package/dist/hooks/useTooltipStyles.esm.js.map +1 -1
- package/dist/hooks/useUserFollow.esm.js.map +1 -1
- package/dist/hooks/useUserSettings.esm.js.map +1 -1
- package/dist/hooks/useVoting.esm.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/routes.esm.js.map +1 -1
- package/dist/translation.esm.js.map +1 -1
- package/dist/utils/utils.esm.js.map +1 -1
- package/package.json +13 -13
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DraftBanner.esm.js","sources":["../../../src/components/Utility/DraftBanner.tsx"],"sourcesContent":["import { makeStyles, Paper, Typography } from '@material-ui/core';\nimport DraftsIcon from '@material-ui/icons/Drafts';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../../translation.ts';\n\nconst useStyles = makeStyles(\n theme => ({\n draftBanner: {\n backgroundColor: theme.palette.warning.light,\n color: theme.palette.warning.contrastText,\n padding: '8px 16px',\n marginBottom: '16px',\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n },\n }),\n { name: 'QetaDraftBanner' },\n);\n\nexport const DraftBanner = () => {\n const styles = useStyles();\n const { t } = useTranslationRef(qetaTranslationRef);\n\n return (\n <Paper className={styles.draftBanner} elevation={0}>\n <DraftsIcon fontSize=\"small\" />\n <Typography variant=\"body2\">{t('questionPage.draftStatus')}</Typography>\n </Paper>\n );\n};\n"],"names":[],"mappings":";;;;;;AAKA,MAAM,
|
|
1
|
+
{"version":3,"file":"DraftBanner.esm.js","sources":["../../../src/components/Utility/DraftBanner.tsx"],"sourcesContent":["import { makeStyles, Paper, Typography } from '@material-ui/core';\nimport DraftsIcon from '@material-ui/icons/Drafts';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../../translation.ts';\n\nconst useStyles = makeStyles(\n theme => ({\n draftBanner: {\n backgroundColor: theme.palette.warning.light,\n color: theme.palette.warning.contrastText,\n padding: '8px 16px',\n marginBottom: '16px',\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n },\n }),\n { name: 'QetaDraftBanner' },\n);\n\nexport const DraftBanner = () => {\n const styles = useStyles();\n const { t } = useTranslationRef(qetaTranslationRef);\n\n return (\n <Paper className={styles.draftBanner} elevation={0}>\n <DraftsIcon fontSize=\"small\" />\n <Typography variant=\"body2\">{t('questionPage.draftStatus')}</Typography>\n </Paper>\n );\n};\n"],"names":[],"mappings":";;;;;;AAKA,MAAM,SAAA,GAAY,UAAA;AAAA,EAChB,CAAA,KAAA,MAAU;AAAA,IACR,WAAA,EAAa;AAAA,MACX,eAAA,EAAiB,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,KAAA;AAAA,MACvC,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,YAAA;AAAA,MAC7B,OAAA,EAAS,UAAA;AAAA,MACT,YAAA,EAAc,MAAA;AAAA,MACd,OAAA,EAAS,MAAA;AAAA,MACT,UAAA,EAAY,QAAA;AAAA,MACZ,GAAA,EAAK;AAAA;AACP,GACF,CAAA;AAAA,EACA,EAAE,MAAM,iBAAA;AACV,CAAA;AAEO,MAAM,cAAc,MAAM;AAC/B,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,kBAAkB,CAAA;AAElD,EAAA,4BACG,KAAA,EAAA,EAAM,SAAA,EAAW,MAAA,CAAO,WAAA,EAAa,WAAW,CAAA,EAC/C,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,UAAS,OAAA,EAAQ,CAAA;AAAA,wBAC5B,UAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAS,QAAA,EAAA,CAAA,CAAE,0BAA0B,CAAA,EAAE;AAAA,GAAA,EAC7D,CAAA;AAEJ;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ModalContent.esm.js","sources":["../../../src/components/Utility/ModalContent.tsx"],"sourcesContent":["import { makeStyles } from '@material-ui/core';\nimport { ReactNode, forwardRef } from 'react';\n\nconst useStyles = makeStyles(theme => ({\n content: {\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n width: 400,\n backgroundColor: theme.palette.background.default,\n border: `1px solid ${theme.palette.action.selected}`,\n borderRadius: theme.shape.borderRadius,\n padding: '2em',\n '& button': {\n marginTop: '2em',\n float: 'right',\n },\n },\n}));\n\nexport const ModalContent = forwardRef<\n HTMLDivElement,\n { children: React.ReactNode }\n>((props: { children: ReactNode }, ref) => {\n const styles = useStyles();\n return (\n <div tabIndex={-1} className={styles.content} ref={ref}>\n {props.children}\n </div>\n );\n});\n"],"names":[],"mappings":";;;;AAGA,MAAM,SAAA,GAAY,WAAW,
|
|
1
|
+
{"version":3,"file":"ModalContent.esm.js","sources":["../../../src/components/Utility/ModalContent.tsx"],"sourcesContent":["import { makeStyles } from '@material-ui/core';\nimport { ReactNode, forwardRef } from 'react';\n\nconst useStyles = makeStyles(theme => ({\n content: {\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n width: 400,\n backgroundColor: theme.palette.background.default,\n border: `1px solid ${theme.palette.action.selected}`,\n borderRadius: theme.shape.borderRadius,\n padding: '2em',\n '& button': {\n marginTop: '2em',\n float: 'right',\n },\n },\n}));\n\nexport const ModalContent = forwardRef<\n HTMLDivElement,\n { children: React.ReactNode }\n>((props: { children: ReactNode }, ref) => {\n const styles = useStyles();\n return (\n <div tabIndex={-1} className={styles.content} ref={ref}>\n {props.children}\n </div>\n );\n});\n"],"names":[],"mappings":";;;;AAGA,MAAM,SAAA,GAAY,WAAW,CAAA,KAAA,MAAU;AAAA,EACrC,OAAA,EAAS;AAAA,IACP,QAAA,EAAU,UAAA;AAAA,IACV,GAAA,EAAK,KAAA;AAAA,IACL,IAAA,EAAM,KAAA;AAAA,IACN,SAAA,EAAW,uBAAA;AAAA,IACX,KAAA,EAAO,GAAA;AAAA,IACP,eAAA,EAAiB,KAAA,CAAM,OAAA,CAAQ,UAAA,CAAW,OAAA;AAAA,IAC1C,MAAA,EAAQ,CAAA,UAAA,EAAa,KAAA,CAAM,OAAA,CAAQ,OAAO,QAAQ,CAAA,CAAA;AAAA,IAClD,YAAA,EAAc,MAAM,KAAA,CAAM,YAAA;AAAA,IAC1B,OAAA,EAAS,KAAA;AAAA,IACT,UAAA,EAAY;AAAA,MACV,SAAA,EAAW,KAAA;AAAA,MACX,KAAA,EAAO;AAAA;AACT;AAEJ,CAAA,CAAE,CAAA;AAEK,MAAM,YAAA,GAAe,UAAA,CAG1B,CAAC,KAAA,EAAgC,GAAA,KAAQ;AACzC,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,uBACE,GAAA,CAAC,SAAI,QAAA,EAAU,EAAA,EAAI,WAAW,MAAA,CAAO,OAAA,EAAS,GAAA,EAC3C,QAAA,EAAA,KAAA,CAAM,QAAA,EACT,CAAA;AAEJ,CAAC;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ObsoleteBanner.esm.js","sources":["../../../src/components/Utility/ObsoleteBanner.tsx"],"sourcesContent":["import { makeStyles, Paper, Typography } from '@material-ui/core';\nimport WarningIcon from '@material-ui/icons/Warning';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../../translation.ts';\n\nconst useStyles = makeStyles(\n theme => ({\n obsoleteBanner: {\n backgroundColor: theme.palette.warning.main,\n color: theme.palette.warning.contrastText,\n padding: '8px 16px',\n marginBottom: '16px',\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n },\n }),\n { name: 'QetaObsoleteBanner' },\n);\n\nexport const ObsoleteBanner = () => {\n const styles = useStyles();\n const { t } = useTranslationRef(qetaTranslationRef);\n\n return (\n <Paper className={styles.obsoleteBanner} elevation={0}>\n <WarningIcon fontSize=\"small\" />\n <Typography variant=\"body2\">\n {t('questionPage.obsoleteStatus')}\n </Typography>\n </Paper>\n );\n};\n"],"names":[],"mappings":";;;;;;AAKA,MAAM,
|
|
1
|
+
{"version":3,"file":"ObsoleteBanner.esm.js","sources":["../../../src/components/Utility/ObsoleteBanner.tsx"],"sourcesContent":["import { makeStyles, Paper, Typography } from '@material-ui/core';\nimport WarningIcon from '@material-ui/icons/Warning';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../../translation.ts';\n\nconst useStyles = makeStyles(\n theme => ({\n obsoleteBanner: {\n backgroundColor: theme.palette.warning.main,\n color: theme.palette.warning.contrastText,\n padding: '8px 16px',\n marginBottom: '16px',\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n },\n }),\n { name: 'QetaObsoleteBanner' },\n);\n\nexport const ObsoleteBanner = () => {\n const styles = useStyles();\n const { t } = useTranslationRef(qetaTranslationRef);\n\n return (\n <Paper className={styles.obsoleteBanner} elevation={0}>\n <WarningIcon fontSize=\"small\" />\n <Typography variant=\"body2\">\n {t('questionPage.obsoleteStatus')}\n </Typography>\n </Paper>\n );\n};\n"],"names":[],"mappings":";;;;;;AAKA,MAAM,SAAA,GAAY,UAAA;AAAA,EAChB,CAAA,KAAA,MAAU;AAAA,IACR,cAAA,EAAgB;AAAA,MACd,eAAA,EAAiB,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,IAAA;AAAA,MACvC,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,YAAA;AAAA,MAC7B,OAAA,EAAS,UAAA;AAAA,MACT,YAAA,EAAc,MAAA;AAAA,MACd,OAAA,EAAS,MAAA;AAAA,MACT,UAAA,EAAY,QAAA;AAAA,MACZ,GAAA,EAAK;AAAA;AACP,GACF,CAAA;AAAA,EACA,EAAE,MAAM,oBAAA;AACV,CAAA;AAEO,MAAM,iBAAiB,MAAM;AAClC,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,kBAAkB,CAAA;AAElD,EAAA,4BACG,KAAA,EAAA,EAAM,SAAA,EAAW,MAAA,CAAO,cAAA,EAAgB,WAAW,CAAA,EAClD,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,WAAA,EAAA,EAAY,UAAS,OAAA,EAAQ,CAAA;AAAA,wBAC7B,UAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EACjB,QAAA,EAAA,CAAA,CAAE,6BAA6B,CAAA,EAClC;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OptionalRequirePermission.esm.js","sources":["../../../src/components/Utility/OptionalRequirePermission.tsx"],"sourcesContent":["import {\n RequirePermission,\n RequirePermissionProps,\n} from '@backstage/plugin-permission-react';\nimport { configApiRef, useApi } from '@backstage/core-plugin-api';\nimport { isPermission } from '@backstage/plugin-permission-common';\nimport { qetaCreateTagPermission } from '@drodil/backstage-plugin-qeta-common';\n\nexport const OptionalRequirePermission = (props: RequirePermissionProps) => {\n const config = useApi(configApiRef);\n if (config.getOptionalBoolean('qeta.permissions') !== true) {\n if (isPermission(props.permission, qetaCreateTagPermission)) {\n return (\n <>\n {(config.getOptionalBoolean('qeta.tags.allowCreation') ?? true)\n ? props.children\n : null}\n </>\n );\n }\n return <>{props.children}</>;\n }\n\n return <RequirePermission {...props} />;\n};\n"],"names":[],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"OptionalRequirePermission.esm.js","sources":["../../../src/components/Utility/OptionalRequirePermission.tsx"],"sourcesContent":["import {\n RequirePermission,\n RequirePermissionProps,\n} from '@backstage/plugin-permission-react';\nimport { configApiRef, useApi } from '@backstage/core-plugin-api';\nimport { isPermission } from '@backstage/plugin-permission-common';\nimport { qetaCreateTagPermission } from '@drodil/backstage-plugin-qeta-common';\n\nexport const OptionalRequirePermission = (props: RequirePermissionProps) => {\n const config = useApi(configApiRef);\n if (config.getOptionalBoolean('qeta.permissions') !== true) {\n if (isPermission(props.permission, qetaCreateTagPermission)) {\n return (\n <>\n {(config.getOptionalBoolean('qeta.tags.allowCreation') ?? true)\n ? props.children\n : null}\n </>\n );\n }\n return <>{props.children}</>;\n }\n\n return <RequirePermission {...props} />;\n};\n"],"names":[],"mappings":";;;;;;AAQO,MAAM,yBAAA,GAA4B,CAAC,KAAA,KAAkC;AAC1E,EAAA,MAAM,MAAA,GAAS,OAAO,YAAY,CAAA;AAClC,EAAA,IAAI,MAAA,CAAO,kBAAA,CAAmB,kBAAkB,CAAA,KAAM,IAAA,EAAM;AAC1D,IAAA,IAAI,YAAA,CAAa,KAAA,CAAM,UAAA,EAAY,uBAAuB,CAAA,EAAG;AAC3D,MAAA,uBACE,GAAA,CAAA,QAAA,EAAA,EACI,iBAAO,kBAAA,CAAmB,yBAAyB,KAAK,IAAA,GACtD,KAAA,CAAM,WACN,IAAA,EACN,CAAA;AAAA,IAEJ;AACA,IAAA,uBAAO,GAAA,CAAA,QAAA,EAAA,EAAG,gBAAM,QAAA,EAAS,CAAA;AAAA,EAC3B;AAEA,EAAA,uBAAO,GAAA,CAAC,iBAAA,EAAA,EAAmB,GAAG,KAAA,EAAO,CAAA;AACvC;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QetaGridHeader.esm.js","sources":["../../../src/components/Utility/QetaGridHeader.tsx"],"sourcesContent":["import { Box, Grid, Typography } from '@material-ui/core';\nimport { SearchBar } from '../SearchBar/SearchBar';\n\nexport type QetaGridHeaderProps = {\n title: React.ReactNode;\n searchBarLabel: string;\n loading: boolean;\n onSearch: (val: string) => void;\n buttons?: React.ReactNode;\n rightElement?: React.ReactNode;\n};\n\nexport const QetaGridHeader = ({\n title,\n searchBarLabel,\n loading,\n onSearch,\n buttons,\n rightElement,\n}: QetaGridHeaderProps) => {\n return (\n <Box mb={3}>\n <Box display=\"flex\" alignItems=\"center\" justifyContent=\"space-between\">\n <Box width=\"100%\" maxWidth={400}>\n <SearchBar\n onSearch={onSearch}\n label={searchBarLabel}\n loading={loading}\n />\n </Box>\n {rightElement && (\n <Box display=\"flex\" justifyContent=\"flex-end\">\n {rightElement}\n </Box>\n )}\n </Box>\n <Box mt={3} mb={2}>\n <Grid container alignItems=\"center\" justifyContent=\"space-between\">\n <Grid item>\n {!loading &&\n (typeof title === 'string' ? (\n <Typography\n variant=\"h6\"\n component=\"h2\"\n style={{ fontWeight: 500, paddingBottom: 2 }}\n >\n {title}\n </Typography>\n ) : (\n title\n ))}\n </Grid>\n {buttons && <Grid item>{buttons}</Grid>}\n </Grid>\n </Box>\n </Box>\n );\n};\n"],"names":[],"mappings":";;;;AAYO,MAAM,iBAAiB,CAAC;AAAA,EAC7B,KAAA;AAAA,EACA,cAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,
|
|
1
|
+
{"version":3,"file":"QetaGridHeader.esm.js","sources":["../../../src/components/Utility/QetaGridHeader.tsx"],"sourcesContent":["import { Box, Grid, Typography } from '@material-ui/core';\nimport { SearchBar } from '../SearchBar/SearchBar';\n\nexport type QetaGridHeaderProps = {\n title: React.ReactNode;\n searchBarLabel: string;\n loading: boolean;\n onSearch: (val: string) => void;\n buttons?: React.ReactNode;\n rightElement?: React.ReactNode;\n};\n\nexport const QetaGridHeader = ({\n title,\n searchBarLabel,\n loading,\n onSearch,\n buttons,\n rightElement,\n}: QetaGridHeaderProps) => {\n return (\n <Box mb={3}>\n <Box display=\"flex\" alignItems=\"center\" justifyContent=\"space-between\">\n <Box width=\"100%\" maxWidth={400}>\n <SearchBar\n onSearch={onSearch}\n label={searchBarLabel}\n loading={loading}\n />\n </Box>\n {rightElement && (\n <Box display=\"flex\" justifyContent=\"flex-end\">\n {rightElement}\n </Box>\n )}\n </Box>\n <Box mt={3} mb={2}>\n <Grid container alignItems=\"center\" justifyContent=\"space-between\">\n <Grid item>\n {!loading &&\n (typeof title === 'string' ? (\n <Typography\n variant=\"h6\"\n component=\"h2\"\n style={{ fontWeight: 500, paddingBottom: 2 }}\n >\n {title}\n </Typography>\n ) : (\n title\n ))}\n </Grid>\n {buttons && <Grid item>{buttons}</Grid>}\n </Grid>\n </Box>\n </Box>\n );\n};\n"],"names":[],"mappings":";;;;AAYO,MAAM,iBAAiB,CAAC;AAAA,EAC7B,KAAA;AAAA,EACA,cAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,KAA2B;AACzB,EAAA,uBACE,IAAA,CAAC,GAAA,EAAA,EAAI,EAAA,EAAI,CAAA,EACP,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,OAAI,OAAA,EAAQ,MAAA,EAAO,UAAA,EAAW,QAAA,EAAS,gBAAe,eAAA,EACrD,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,GAAA,EAAA,EAAI,KAAA,EAAM,MAAA,EAAO,QAAA,EAAU,GAAA,EAC1B,QAAA,kBAAA,GAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UACC,QAAA;AAAA,UACA,KAAA,EAAO,cAAA;AAAA,UACP;AAAA;AAAA,OACF,EACF,CAAA;AAAA,MACC,gCACC,GAAA,CAAC,GAAA,EAAA,EAAI,SAAQ,MAAA,EAAO,cAAA,EAAe,YAChC,QAAA,EAAA,YAAA,EACH;AAAA,KAAA,EAEJ,CAAA;AAAA,oBACA,GAAA,CAAC,GAAA,EAAA,EAAI,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EACd,QAAA,kBAAA,IAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAS,IAAA,EAAC,UAAA,EAAW,QAAA,EAAS,gBAAe,eAAA,EACjD,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,QAAK,IAAA,EAAI,IAAA,EACP,WAAC,OAAA,KACC,OAAO,UAAU,QAAA,mBAChB,GAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,IAAA;AAAA,UACR,SAAA,EAAU,IAAA;AAAA,UACV,KAAA,EAAO,EAAE,UAAA,EAAY,GAAA,EAAK,eAAe,CAAA,EAAE;AAAA,UAE1C,QAAA,EAAA;AAAA;AAAA,UAGH,KAAA,CAAA,EAEN,CAAA;AAAA,MACC,OAAA,oBAAW,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAI,MAAE,QAAA,EAAA,OAAA,EAAQ;AAAA,KAAA,EAClC,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QetaPagination.esm.js","sources":["../../../src/components/Utility/QetaPagination.tsx"],"sourcesContent":["import { ChangeEvent } from 'react';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../../translation.ts';\nimport {\n FormControl,\n Grid,\n makeStyles,\n MenuItem,\n Select,\n Tooltip,\n} from '@material-ui/core';\nimport { Pagination } from '@material-ui/lab';\n\nconst useStyles = makeStyles(\n () => ({\n root: {\n marginTop: '2em',\n marginBottom: '2em',\n },\n pageSizeSelect: {\n marginRight: '1em',\n maxHeight: '42px',\n },\n pagination: {},\n }),\n { name: 'QetaPagination' },\n);\n\nexport const QetaPagination = (props: {\n pageSize: number;\n handlePageChange: (_event: ChangeEvent<unknown>, value: number) => void;\n handlePageSizeChange: (event: ChangeEvent<{ value: unknown }>) => void;\n page: number;\n tooltip?: string;\n pageCount: number;\n}) => {\n const { handlePageChange, handlePageSizeChange, page, pageCount, tooltip } =\n props;\n const { t } = useTranslationRef(qetaTranslationRef);\n const styles = useStyles();\n return (\n <Grid\n container\n className={styles.root}\n spacing={0}\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n <Tooltip title={tooltip ?? t('pagination.defaultTooltip', {})} arrow>\n <FormControl variant=\"outlined\">\n <Select\n value={props.pageSize}\n onChange={handlePageSizeChange}\n variant=\"outlined\"\n className={styles.pageSizeSelect}\n >\n <MenuItem value={5}>5</MenuItem>\n <MenuItem value={10}>10</MenuItem>\n <MenuItem value={25}>25</MenuItem>\n <MenuItem value={50}>50</MenuItem>\n <MenuItem value={100}>100</MenuItem>\n </Select>\n </FormControl>\n </Tooltip>\n <Pagination\n page={page}\n onChange={handlePageChange}\n count={pageCount}\n size=\"large\"\n variant=\"outlined\"\n className={styles.pagination}\n showFirstButton\n showLastButton\n />\n </Grid>\n );\n};\n"],"names":[],"mappings":";;;;;;AAaA,MAAM,
|
|
1
|
+
{"version":3,"file":"QetaPagination.esm.js","sources":["../../../src/components/Utility/QetaPagination.tsx"],"sourcesContent":["import { ChangeEvent } from 'react';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../../translation.ts';\nimport {\n FormControl,\n Grid,\n makeStyles,\n MenuItem,\n Select,\n Tooltip,\n} from '@material-ui/core';\nimport { Pagination } from '@material-ui/lab';\n\nconst useStyles = makeStyles(\n () => ({\n root: {\n marginTop: '2em',\n marginBottom: '2em',\n },\n pageSizeSelect: {\n marginRight: '1em',\n maxHeight: '42px',\n },\n pagination: {},\n }),\n { name: 'QetaPagination' },\n);\n\nexport const QetaPagination = (props: {\n pageSize: number;\n handlePageChange: (_event: ChangeEvent<unknown>, value: number) => void;\n handlePageSizeChange: (event: ChangeEvent<{ value: unknown }>) => void;\n page: number;\n tooltip?: string;\n pageCount: number;\n}) => {\n const { handlePageChange, handlePageSizeChange, page, pageCount, tooltip } =\n props;\n const { t } = useTranslationRef(qetaTranslationRef);\n const styles = useStyles();\n return (\n <Grid\n container\n className={styles.root}\n spacing={0}\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n <Tooltip title={tooltip ?? t('pagination.defaultTooltip', {})} arrow>\n <FormControl variant=\"outlined\">\n <Select\n value={props.pageSize}\n onChange={handlePageSizeChange}\n variant=\"outlined\"\n className={styles.pageSizeSelect}\n >\n <MenuItem value={5}>5</MenuItem>\n <MenuItem value={10}>10</MenuItem>\n <MenuItem value={25}>25</MenuItem>\n <MenuItem value={50}>50</MenuItem>\n <MenuItem value={100}>100</MenuItem>\n </Select>\n </FormControl>\n </Tooltip>\n <Pagination\n page={page}\n onChange={handlePageChange}\n count={pageCount}\n size=\"large\"\n variant=\"outlined\"\n className={styles.pagination}\n showFirstButton\n showLastButton\n />\n </Grid>\n );\n};\n"],"names":[],"mappings":";;;;;;AAaA,MAAM,SAAA,GAAY,UAAA;AAAA,EAChB,OAAO;AAAA,IACL,IAAA,EAAM;AAAA,MACJ,SAAA,EAAW,KAAA;AAAA,MACX,YAAA,EAAc;AAAA,KAChB;AAAA,IACA,cAAA,EAAgB;AAAA,MACd,WAAA,EAAa,KAAA;AAAA,MACb,SAAA,EAAW;AAAA,KACb;AAAA,IACA,YAAY;AAAC,GACf,CAAA;AAAA,EACA,EAAE,MAAM,gBAAA;AACV,CAAA;AAEO,MAAM,cAAA,GAAiB,CAAC,KAAA,KAOzB;AACJ,EAAA,MAAM,EAAE,gBAAA,EAAkB,oBAAA,EAAsB,IAAA,EAAM,SAAA,EAAW,SAAQ,GACvE,KAAA;AACF,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,kBAAkB,CAAA;AAClD,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,uBACE,IAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAS,IAAA;AAAA,MACT,WAAW,MAAA,CAAO,IAAA;AAAA,MAClB,OAAA,EAAS,CAAA;AAAA,MACT,UAAA,EAAW,QAAA;AAAA,MACX,cAAA,EAAe,QAAA;AAAA,MAEf,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,OAAA,EAAA,EAAQ,KAAA,EAAO,OAAA,IAAW,CAAA,CAAE,2BAAA,EAA6B,EAAE,CAAA,EAAG,KAAA,EAAK,IAAA,EAClE,QAAA,kBAAA,GAAA,CAAC,WAAA,EAAA,EAAY,SAAQ,UAAA,EACnB,QAAA,kBAAA,IAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,OAAO,KAAA,CAAM,QAAA;AAAA,YACb,QAAA,EAAU,oBAAA;AAAA,YACV,OAAA,EAAQ,UAAA;AAAA,YACR,WAAW,MAAA,CAAO,cAAA;AAAA,YAElB,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EAAO,CAAA,EAAG,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,8BACrB,GAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EAAO,EAAA,EAAI,QAAA,EAAA,IAAA,EAAE,CAAA;AAAA,8BACvB,GAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EAAO,EAAA,EAAI,QAAA,EAAA,IAAA,EAAE,CAAA;AAAA,8BACvB,GAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EAAO,EAAA,EAAI,QAAA,EAAA,IAAA,EAAE,CAAA;AAAA,8BACvB,GAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EAAO,GAAA,EAAK,QAAA,EAAA,KAAA,EAAG;AAAA;AAAA;AAAA,WAE7B,CAAA,EACF,CAAA;AAAA,wBACA,GAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,IAAA;AAAA,YACA,QAAA,EAAU,gBAAA;AAAA,YACV,KAAA,EAAO,SAAA;AAAA,YACP,IAAA,EAAK,OAAA;AAAA,YACL,OAAA,EAAQ,UAAA;AAAA,YACR,WAAW,MAAA,CAAO,UAAA;AAAA,YAClB,eAAA,EAAe,IAAA;AAAA,YACf,cAAA,EAAc;AAAA;AAAA;AAChB;AAAA;AAAA,GACF;AAEJ;;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
2
|
import { useState, useMemo, Children } from 'react';
|
|
3
|
-
import { makeStyles, Box, List,
|
|
3
|
+
import { makeStyles, Box, List, Button, ListSubheader } from '@material-ui/core';
|
|
4
4
|
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
|
|
5
5
|
import { qetaTranslationRef } from '../../translation.esm.js';
|
|
6
6
|
import ExpandMoreIcon from '@material-ui/icons/ExpandMore';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RightList.esm.js","sources":["../../../src/components/Utility/RightList.tsx"],"sourcesContent":["import { ReactNode, useState, Children, useMemo } from 'react';\nimport {\n Box,\n Button,\n List,\n ListSubheader,\n makeStyles,\n} from '@material-ui/core';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../../translation';\nimport ExpandMore from '@material-ui/icons/ExpandMore';\nimport ExpandLess from '@material-ui/icons/ExpandLess';\n\nconst useStyles = makeStyles(theme => ({\n container: {\n width: '100%',\n marginBottom: '1em',\n },\n subheader: {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(0.5),\n color: theme.palette.text.hint,\n padding: '0px 0px 0.5rem 0.5rem',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n lineHeight: 1.5,\n },\n list: {\n '& li': {\n paddingLeft: theme.spacing(1),\n paddingRight: theme.spacing(1),\n },\n },\n showMoreButton: {\n marginLeft: theme.spacing(1),\n alignItems: 'center',\n display: 'flex',\n justifyContent: 'center',\n fontSize: '0.8rem',\n },\n}));\n\nexport const RightListContainer = (props: {\n children: ReactNode;\n className?: string;\n}) => {\n const styles = useStyles();\n return (\n <Box\n display={{ md: 'none', lg: 'block' }}\n className={`${styles.container} ${props.className ?? ''}`}\n >\n {props.children}\n </Box>\n );\n};\n\nexport const RightList = (props: {\n children: ReactNode;\n title?: string;\n icon?: ReactNode;\n limit?: number;\n randomize?: boolean;\n titleClassName?: string;\n}) => {\n const styles = useStyles();\n const { t } = useTranslationRef(qetaTranslationRef);\n const [expanded, setExpanded] = useState(false);\n const arrayChildren = useMemo(() => {\n const children = Children.toArray(props.children);\n if (props.randomize && props.limit && children.length > props.limit) {\n return children.sort(() => 0.5 - Math.random());\n }\n return children;\n }, [props.children, props.randomize, props.limit]);\n const showButton = props.limit && arrayChildren.length > props.limit;\n const displayChildren =\n showButton && !expanded\n ? arrayChildren.slice(0, props.limit)\n : arrayChildren;\n\n return (\n <List\n component=\"nav\"\n aria-labelledby=\"nested-list-subheader\"\n className={styles.list}\n subheader={\n <ListSubheader\n disableSticky\n component=\"div\"\n id=\"nested-list-subheader\"\n color=\"primary\"\n className={`${styles.subheader} ${props.titleClassName ?? ''}`}\n >\n {props.icon}\n {props.title}\n </ListSubheader>\n }\n >\n {displayChildren}\n {showButton && (\n <Button\n onClick={() => setExpanded(!expanded)}\n color=\"primary\"\n size=\"small\"\n className={styles.showMoreButton}\n endIcon={expanded ? <ExpandLess /> : <ExpandMore />}\n >\n {expanded ? t('common.showLess') : t('common.showMore')}\n </Button>\n )}\n </List>\n );\n};\n"],"names":["ExpandLess","ExpandMore"],"mappings":";;;;;;;;AAaA,MAAM,SAAA,GAAY,WAAW,
|
|
1
|
+
{"version":3,"file":"RightList.esm.js","sources":["../../../src/components/Utility/RightList.tsx"],"sourcesContent":["import { ReactNode, useState, Children, useMemo } from 'react';\nimport {\n Box,\n Button,\n List,\n ListSubheader,\n makeStyles,\n} from '@material-ui/core';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../../translation';\nimport ExpandMore from '@material-ui/icons/ExpandMore';\nimport ExpandLess from '@material-ui/icons/ExpandLess';\n\nconst useStyles = makeStyles(theme => ({\n container: {\n width: '100%',\n marginBottom: '1em',\n },\n subheader: {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(0.5),\n color: theme.palette.text.hint,\n padding: '0px 0px 0.5rem 0.5rem',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n lineHeight: 1.5,\n },\n list: {\n '& li': {\n paddingLeft: theme.spacing(1),\n paddingRight: theme.spacing(1),\n },\n },\n showMoreButton: {\n marginLeft: theme.spacing(1),\n alignItems: 'center',\n display: 'flex',\n justifyContent: 'center',\n fontSize: '0.8rem',\n },\n}));\n\nexport const RightListContainer = (props: {\n children: ReactNode;\n className?: string;\n}) => {\n const styles = useStyles();\n return (\n <Box\n display={{ md: 'none', lg: 'block' }}\n className={`${styles.container} ${props.className ?? ''}`}\n >\n {props.children}\n </Box>\n );\n};\n\nexport const RightList = (props: {\n children: ReactNode;\n title?: string;\n icon?: ReactNode;\n limit?: number;\n randomize?: boolean;\n titleClassName?: string;\n}) => {\n const styles = useStyles();\n const { t } = useTranslationRef(qetaTranslationRef);\n const [expanded, setExpanded] = useState(false);\n const arrayChildren = useMemo(() => {\n const children = Children.toArray(props.children);\n if (props.randomize && props.limit && children.length > props.limit) {\n return children.sort(() => 0.5 - Math.random());\n }\n return children;\n }, [props.children, props.randomize, props.limit]);\n const showButton = props.limit && arrayChildren.length > props.limit;\n const displayChildren =\n showButton && !expanded\n ? arrayChildren.slice(0, props.limit)\n : arrayChildren;\n\n return (\n <List\n component=\"nav\"\n aria-labelledby=\"nested-list-subheader\"\n className={styles.list}\n subheader={\n <ListSubheader\n disableSticky\n component=\"div\"\n id=\"nested-list-subheader\"\n color=\"primary\"\n className={`${styles.subheader} ${props.titleClassName ?? ''}`}\n >\n {props.icon}\n {props.title}\n </ListSubheader>\n }\n >\n {displayChildren}\n {showButton && (\n <Button\n onClick={() => setExpanded(!expanded)}\n color=\"primary\"\n size=\"small\"\n className={styles.showMoreButton}\n endIcon={expanded ? <ExpandLess /> : <ExpandMore />}\n >\n {expanded ? t('common.showLess') : t('common.showMore')}\n </Button>\n )}\n </List>\n );\n};\n"],"names":["ExpandLess","ExpandMore"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StatusChip.esm.js","sources":["../../../src/components/Utility/StatusChip.tsx"],"sourcesContent":["import { Chip, makeStyles } from '@material-ui/core';\nimport DraftsIcon from '@material-ui/icons/Drafts';\nimport DeleteIcon from '@material-ui/icons/Delete';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../../translation.ts';\n\nconst useStyles = makeStyles(theme => ({\n icon: {\n color: theme.palette.warning.contrastText,\n },\n statusChip: {\n marginLeft: theme.spacing(1),\n padding: '0.5rem 0.5rem',\n flexShrink: 0,\n backgroundColor: theme.palette.warning.light,\n color: theme.palette.warning.contrastText,\n '&.deleted': {\n backgroundColor: theme.palette.error.light,\n color: theme.palette.error.contrastText,\n },\n },\n}));\n\ninterface StatusChipProps {\n status?: string;\n className?: string;\n}\n\nexport const StatusChip = ({ status, className }: StatusChipProps) => {\n const styles = useStyles();\n const { t } = useTranslationRef(qetaTranslationRef);\n\n if (status === 'draft') {\n return (\n <Chip\n size=\"small\"\n icon={<DraftsIcon className={styles.icon} />}\n label={t('common.draft')}\n className={`${styles.statusChip} ${className || ''}`}\n />\n );\n }\n if (status === 'deleted') {\n return (\n <Chip\n size=\"small\"\n icon={<DeleteIcon className={styles.icon} />}\n label={t('common.deleted')}\n className={`${styles.statusChip} deleted ${className || ''}`}\n />\n );\n }\n return null;\n};\n"],"names":[],"mappings":";;;;;;;AAMA,MAAM,SAAA,GAAY,WAAW,
|
|
1
|
+
{"version":3,"file":"StatusChip.esm.js","sources":["../../../src/components/Utility/StatusChip.tsx"],"sourcesContent":["import { Chip, makeStyles } from '@material-ui/core';\nimport DraftsIcon from '@material-ui/icons/Drafts';\nimport DeleteIcon from '@material-ui/icons/Delete';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../../translation.ts';\n\nconst useStyles = makeStyles(theme => ({\n icon: {\n color: theme.palette.warning.contrastText,\n },\n statusChip: {\n marginLeft: theme.spacing(1),\n padding: '0.5rem 0.5rem',\n flexShrink: 0,\n backgroundColor: theme.palette.warning.light,\n color: theme.palette.warning.contrastText,\n '&.deleted': {\n backgroundColor: theme.palette.error.light,\n color: theme.palette.error.contrastText,\n },\n },\n}));\n\ninterface StatusChipProps {\n status?: string;\n className?: string;\n}\n\nexport const StatusChip = ({ status, className }: StatusChipProps) => {\n const styles = useStyles();\n const { t } = useTranslationRef(qetaTranslationRef);\n\n if (status === 'draft') {\n return (\n <Chip\n size=\"small\"\n icon={<DraftsIcon className={styles.icon} />}\n label={t('common.draft')}\n className={`${styles.statusChip} ${className || ''}`}\n />\n );\n }\n if (status === 'deleted') {\n return (\n <Chip\n size=\"small\"\n icon={<DeleteIcon className={styles.icon} />}\n label={t('common.deleted')}\n className={`${styles.statusChip} deleted ${className || ''}`}\n />\n );\n }\n return null;\n};\n"],"names":[],"mappings":";;;;;;;AAMA,MAAM,SAAA,GAAY,WAAW,CAAA,KAAA,MAAU;AAAA,EACrC,IAAA,EAAM;AAAA,IACJ,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ;AAAA,GAC/B;AAAA,EACA,UAAA,EAAY;AAAA,IACV,UAAA,EAAY,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,IAC3B,OAAA,EAAS,eAAA;AAAA,IACT,UAAA,EAAY,CAAA;AAAA,IACZ,eAAA,EAAiB,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,KAAA;AAAA,IACvC,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,YAAA;AAAA,IAC7B,WAAA,EAAa;AAAA,MACX,eAAA,EAAiB,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,KAAA;AAAA,MACrC,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM;AAAA;AAC7B;AAEJ,CAAA,CAAE,CAAA;AAOK,MAAM,UAAA,GAAa,CAAC,EAAE,MAAA,EAAQ,WAAU,KAAuB;AACpE,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,kBAAkB,CAAA;AAElD,EAAA,IAAI,WAAW,OAAA,EAAS;AACtB,IAAA,uBACE,GAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,OAAA;AAAA,QACL,IAAA,kBAAM,GAAA,CAAC,UAAA,EAAA,EAAW,SAAA,EAAW,OAAO,IAAA,EAAM,CAAA;AAAA,QAC1C,KAAA,EAAO,EAAE,cAAc,CAAA;AAAA,QACvB,WAAW,CAAA,EAAG,MAAA,CAAO,UAAU,CAAA,CAAA,EAAI,aAAa,EAAE,CAAA;AAAA;AAAA,KACpD;AAAA,EAEJ;AACA,EAAA,IAAI,WAAW,SAAA,EAAW;AACxB,IAAA,uBACE,GAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,OAAA;AAAA,QACL,IAAA,kBAAM,GAAA,CAAC,UAAA,EAAA,EAAW,SAAA,EAAW,OAAO,IAAA,EAAM,CAAA;AAAA,QAC1C,KAAA,EAAO,EAAE,gBAAgB,CAAA;AAAA,QACzB,WAAW,CAAA,EAAG,MAAA,CAAO,UAAU,CAAA,SAAA,EAAY,aAAa,EAAE,CAAA;AAAA;AAAA,KAC5D;AAAA,EAEJ;AACA,EAAA,OAAO,IAAA;AACT;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VoteButtonContainer.esm.js","sources":["../../../src/components/Utility/VoteButtonContainer.tsx"],"sourcesContent":["import { makeStyles } from '@material-ui/core';\nimport { ReactNode } from 'react';\n\nconst useStyles = makeStyles(\n theme => ({\n root: {\n textAlign: 'center',\n width: 'auto',\n minWidth: '40px',\n marginLeft: '0',\n marginRight: theme.spacing(1),\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n verticalAlign: 'top',\n padding: theme.spacing(0.5),\n },\n }),\n { name: 'QetaVoteButtonContainer' },\n);\n\nexport const VoteButtonContainer = (props: { children: ReactNode }) => {\n const styles = useStyles();\n return <div className={styles.root}>{props.children}</div>;\n};\n"],"names":[],"mappings":";;;AAGA,MAAM,
|
|
1
|
+
{"version":3,"file":"VoteButtonContainer.esm.js","sources":["../../../src/components/Utility/VoteButtonContainer.tsx"],"sourcesContent":["import { makeStyles } from '@material-ui/core';\nimport { ReactNode } from 'react';\n\nconst useStyles = makeStyles(\n theme => ({\n root: {\n textAlign: 'center',\n width: 'auto',\n minWidth: '40px',\n marginLeft: '0',\n marginRight: theme.spacing(1),\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n verticalAlign: 'top',\n padding: theme.spacing(0.5),\n },\n }),\n { name: 'QetaVoteButtonContainer' },\n);\n\nexport const VoteButtonContainer = (props: { children: ReactNode }) => {\n const styles = useStyles();\n return <div className={styles.root}>{props.children}</div>;\n};\n"],"names":[],"mappings":";;;AAGA,MAAM,SAAA,GAAY,UAAA;AAAA,EAChB,CAAA,KAAA,MAAU;AAAA,IACR,IAAA,EAAM;AAAA,MACJ,SAAA,EAAW,QAAA;AAAA,MACX,KAAA,EAAO,MAAA;AAAA,MACP,QAAA,EAAU,MAAA;AAAA,MACV,UAAA,EAAY,GAAA;AAAA,MACZ,WAAA,EAAa,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,MAC5B,OAAA,EAAS,MAAA;AAAA,MACT,aAAA,EAAe,QAAA;AAAA,MACf,UAAA,EAAY,QAAA;AAAA,MACZ,aAAA,EAAe,KAAA;AAAA,MACf,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,GAAG;AAAA;AAC5B,GACF,CAAA;AAAA,EACA,EAAE,MAAM,yBAAA;AACV,CAAA;AAEO,MAAM,mBAAA,GAAsB,CAAC,KAAA,KAAmC;AACrE,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,2BAAQ,KAAA,EAAA,EAAI,SAAA,EAAW,MAAA,CAAO,IAAA,EAAO,gBAAM,QAAA,EAAS,CAAA;AACtD;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ViewToggle.esm.js","sources":["../../../src/components/ViewToggle/ViewToggle.tsx"],"sourcesContent":["import { Button, ButtonGroup, Tooltip } from '@material-ui/core';\nimport ViewList from '@material-ui/icons/ViewList';\nimport ViewModule from '@material-ui/icons/ViewModule';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../../translation.ts';\n\nexport type ViewType = 'list' | 'grid';\n\ninterface ViewToggleProps {\n view: ViewType;\n onChange: (view: ViewType) => void;\n}\n\nexport const ViewToggle = ({ view, onChange }: ViewToggleProps) => {\n const { t } = useTranslationRef(qetaTranslationRef);\n\n return (\n <ButtonGroup size=\"small\">\n <Tooltip title={t('viewToggle.listView')}>\n <Button\n color={view === 'list' ? 'primary' : undefined}\n onClick={() => onChange('list')}\n aria-label={t('viewToggle.listView')}\n >\n <ViewList />\n </Button>\n </Tooltip>\n <Tooltip title={t('viewToggle.gridView')}>\n <Button\n color={view === 'grid' ? 'primary' : undefined}\n onClick={() => onChange('grid')}\n aria-label={t('viewToggle.gridView')}\n >\n <ViewModule />\n </Button>\n </Tooltip>\n </ButtonGroup>\n );\n};\n"],"names":[],"mappings":";;;;;;;AAaO,MAAM,
|
|
1
|
+
{"version":3,"file":"ViewToggle.esm.js","sources":["../../../src/components/ViewToggle/ViewToggle.tsx"],"sourcesContent":["import { Button, ButtonGroup, Tooltip } from '@material-ui/core';\nimport ViewList from '@material-ui/icons/ViewList';\nimport ViewModule from '@material-ui/icons/ViewModule';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../../translation.ts';\n\nexport type ViewType = 'list' | 'grid';\n\ninterface ViewToggleProps {\n view: ViewType;\n onChange: (view: ViewType) => void;\n}\n\nexport const ViewToggle = ({ view, onChange }: ViewToggleProps) => {\n const { t } = useTranslationRef(qetaTranslationRef);\n\n return (\n <ButtonGroup size=\"small\">\n <Tooltip title={t('viewToggle.listView')}>\n <Button\n color={view === 'list' ? 'primary' : undefined}\n onClick={() => onChange('list')}\n aria-label={t('viewToggle.listView')}\n >\n <ViewList />\n </Button>\n </Tooltip>\n <Tooltip title={t('viewToggle.gridView')}>\n <Button\n color={view === 'grid' ? 'primary' : undefined}\n onClick={() => onChange('grid')}\n aria-label={t('viewToggle.gridView')}\n >\n <ViewModule />\n </Button>\n </Tooltip>\n </ButtonGroup>\n );\n};\n"],"names":[],"mappings":";;;;;;;AAaO,MAAM,UAAA,GAAa,CAAC,EAAE,IAAA,EAAM,UAAS,KAAuB;AACjE,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,kBAAkB,CAAA;AAElD,EAAA,uBACE,IAAA,CAAC,WAAA,EAAA,EAAY,IAAA,EAAK,OAAA,EAChB,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,OAAA,EAAA,EAAQ,KAAA,EAAO,CAAA,CAAE,qBAAqB,CAAA,EACrC,QAAA,kBAAA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,IAAA,KAAS,MAAA,GAAS,SAAA,GAAY,MAAA;AAAA,QACrC,OAAA,EAAS,MAAM,QAAA,CAAS,MAAM,CAAA;AAAA,QAC9B,YAAA,EAAY,EAAE,qBAAqB,CAAA;AAAA,QAEnC,8BAAC,QAAA,EAAA,EAAS;AAAA;AAAA,KACZ,EACF,CAAA;AAAA,oBACA,GAAA,CAAC,OAAA,EAAA,EAAQ,KAAA,EAAO,CAAA,CAAE,qBAAqB,CAAA,EACrC,QAAA,kBAAA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,IAAA,KAAS,MAAA,GAAS,SAAA,GAAY,MAAA;AAAA,QACrC,OAAA,EAAS,MAAM,QAAA,CAAS,MAAM,CAAA;AAAA,QAC9B,YAAA,EAAY,EAAE,qBAAqB,CAAA;AAAA,QAEnC,8BAAC,UAAA,EAAA,EAAW;AAAA;AAAA,KACd,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAI.esm.js","sources":["../../src/hooks/useAI.ts"],"sourcesContent":["import { useApi } from '@backstage/core-plugin-api';\nimport { qetaApiRef } from '../api';\nimport { useState, useCallback, useEffect } from 'react';\nimport {\n AIQuery,\n AIStatusResponse,\n} from '@drodil/backstage-plugin-qeta-common';\n\nlet cache: AIStatusResponse | undefined = undefined;\n\nexport const useAI = () => {\n const qetaApi = useApi(qetaApiRef);\n const [isAIEnabled, setIsAIEnabled] = useState<boolean>(\n cache?.enabled ?? false,\n );\n const [isExistingQuestionsEnabled, setIsExistingQuestionsEnabled] =\n useState<boolean>(cache?.existingQuestions ?? false);\n const [isNewQuestionsEnabled, setIsNewQuestionsEnabled] = useState<boolean>(\n cache?.newQuestions ?? false,\n );\n const [isArticleSummaryEnabled, setIsArticleSummaryEnabled] =\n useState<boolean>(cache?.articleSummaries ?? false);\n\n useEffect(() => {\n if (cache?.enabled !== undefined) {\n return;\n }\n qetaApi.isAIEnabled().then(resp => {\n setIsAIEnabled(resp.enabled);\n setIsExistingQuestionsEnabled(resp.existingQuestions);\n setIsNewQuestionsEnabled(resp.newQuestions);\n setIsArticleSummaryEnabled(resp.articleSummaries);\n cache = resp;\n });\n }, [qetaApi]);\n\n const answerExistingQuestion = useCallback(\n async (questionId: number, options?: AIQuery) => {\n if (!isExistingQuestionsEnabled) {\n return null;\n }\n const ret = await qetaApi.getAIAnswerForQuestion(questionId, options);\n if (ret === null) {\n if (cache) {\n cache.existingQuestions = false;\n }\n setIsExistingQuestionsEnabled(false);\n }\n return ret;\n },\n [isExistingQuestionsEnabled, qetaApi],\n );\n\n const answerDraftQuestion = useCallback(\n async (draft: { title: string; content: string }) => {\n if (!isNewQuestionsEnabled) {\n return null;\n }\n const ret = await qetaApi.getAIAnswerForDraft(draft.title, draft.content);\n if (ret === null) {\n if (cache) {\n cache.newQuestions = false;\n }\n setIsNewQuestionsEnabled(false);\n }\n return ret;\n },\n [isNewQuestionsEnabled, qetaApi],\n );\n\n const summarizeArticle = useCallback(\n async (articleId: number, options?: AIQuery) => {\n if (!isArticleSummaryEnabled) {\n return null;\n }\n const ret = await qetaApi.getAISummaryForArticle(articleId, options);\n if (ret === null) {\n if (cache) {\n cache.articleSummaries = false;\n }\n setIsArticleSummaryEnabled(false);\n }\n return ret;\n },\n [isArticleSummaryEnabled, qetaApi],\n );\n\n return {\n isAIEnabled,\n isArticleSummaryEnabled,\n isExistingQuestionsEnabled,\n isNewQuestionsEnabled,\n answerExistingQuestion,\n answerDraftQuestion,\n summarizeArticle,\n };\n};\n"],"names":[],"mappings":";;;;AAQA,IAAI,
|
|
1
|
+
{"version":3,"file":"useAI.esm.js","sources":["../../src/hooks/useAI.ts"],"sourcesContent":["import { useApi } from '@backstage/core-plugin-api';\nimport { qetaApiRef } from '../api';\nimport { useState, useCallback, useEffect } from 'react';\nimport {\n AIQuery,\n AIStatusResponse,\n} from '@drodil/backstage-plugin-qeta-common';\n\nlet cache: AIStatusResponse | undefined = undefined;\n\nexport const useAI = () => {\n const qetaApi = useApi(qetaApiRef);\n const [isAIEnabled, setIsAIEnabled] = useState<boolean>(\n cache?.enabled ?? false,\n );\n const [isExistingQuestionsEnabled, setIsExistingQuestionsEnabled] =\n useState<boolean>(cache?.existingQuestions ?? false);\n const [isNewQuestionsEnabled, setIsNewQuestionsEnabled] = useState<boolean>(\n cache?.newQuestions ?? false,\n );\n const [isArticleSummaryEnabled, setIsArticleSummaryEnabled] =\n useState<boolean>(cache?.articleSummaries ?? false);\n\n useEffect(() => {\n if (cache?.enabled !== undefined) {\n return;\n }\n qetaApi.isAIEnabled().then(resp => {\n setIsAIEnabled(resp.enabled);\n setIsExistingQuestionsEnabled(resp.existingQuestions);\n setIsNewQuestionsEnabled(resp.newQuestions);\n setIsArticleSummaryEnabled(resp.articleSummaries);\n cache = resp;\n });\n }, [qetaApi]);\n\n const answerExistingQuestion = useCallback(\n async (questionId: number, options?: AIQuery) => {\n if (!isExistingQuestionsEnabled) {\n return null;\n }\n const ret = await qetaApi.getAIAnswerForQuestion(questionId, options);\n if (ret === null) {\n if (cache) {\n cache.existingQuestions = false;\n }\n setIsExistingQuestionsEnabled(false);\n }\n return ret;\n },\n [isExistingQuestionsEnabled, qetaApi],\n );\n\n const answerDraftQuestion = useCallback(\n async (draft: { title: string; content: string }) => {\n if (!isNewQuestionsEnabled) {\n return null;\n }\n const ret = await qetaApi.getAIAnswerForDraft(draft.title, draft.content);\n if (ret === null) {\n if (cache) {\n cache.newQuestions = false;\n }\n setIsNewQuestionsEnabled(false);\n }\n return ret;\n },\n [isNewQuestionsEnabled, qetaApi],\n );\n\n const summarizeArticle = useCallback(\n async (articleId: number, options?: AIQuery) => {\n if (!isArticleSummaryEnabled) {\n return null;\n }\n const ret = await qetaApi.getAISummaryForArticle(articleId, options);\n if (ret === null) {\n if (cache) {\n cache.articleSummaries = false;\n }\n setIsArticleSummaryEnabled(false);\n }\n return ret;\n },\n [isArticleSummaryEnabled, qetaApi],\n );\n\n return {\n isAIEnabled,\n isArticleSummaryEnabled,\n isExistingQuestionsEnabled,\n isNewQuestionsEnabled,\n answerExistingQuestion,\n answerDraftQuestion,\n summarizeArticle,\n };\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCanReview.esm.js","sources":["../../src/hooks/useCanReview.ts"],"sourcesContent":["import { configApiRef, useApi } from '@backstage/core-plugin-api';\nimport { useEffect, useMemo, useState } from 'react';\nimport { permissionApiRef } from '@backstage/plugin-permission-react';\nimport {\n qetaCreatePostReviewPermission,\n qetaReadPostReviewPermission,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { AuthorizeResult } from '@backstage/plugin-permission-common';\nimport { useIsModerator } from './useIsModerator';\n\nexport const useCanReview = () => {\n const configApi = useApi(configApiRef);\n const permissionApi = useApi(permissionApiRef);\n const { isModerator } = useIsModerator();\n const [canReview, setCanReview] = useState(false);\n const [canRead, setCanRead] = useState(false);\n const [loading, setLoading] = useState(true);\n\n const usePermissions = useMemo(\n () => configApi.getOptionalBoolean('qeta.permissions') ?? false,\n [configApi],\n );\n\n useEffect(() => {\n if (usePermissions) {\n permissionApi\n .authorize({ permission: qetaCreatePostReviewPermission })\n .then(resp => {\n setCanReview(resp.result === AuthorizeResult.ALLOW);\n })\n .catch(() => {\n setCanReview(false);\n });\n permissionApi\n .authorize({ permission: qetaReadPostReviewPermission })\n .then(resp => {\n setCanRead(resp.result === AuthorizeResult.ALLOW);\n })\n .catch(() => {\n setCanRead(false);\n });\n setLoading(false);\n return;\n }\n\n setCanReview(isModerator);\n setCanRead(isModerator);\n setLoading(false);\n }, [isModerator, permissionApi, usePermissions]);\n\n return { canReview, canRead, loading };\n};\n"],"names":[],"mappings":";;;;;;;AAUO,MAAM,eAAe,MAAM;AAChC,
|
|
1
|
+
{"version":3,"file":"useCanReview.esm.js","sources":["../../src/hooks/useCanReview.ts"],"sourcesContent":["import { configApiRef, useApi } from '@backstage/core-plugin-api';\nimport { useEffect, useMemo, useState } from 'react';\nimport { permissionApiRef } from '@backstage/plugin-permission-react';\nimport {\n qetaCreatePostReviewPermission,\n qetaReadPostReviewPermission,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { AuthorizeResult } from '@backstage/plugin-permission-common';\nimport { useIsModerator } from './useIsModerator';\n\nexport const useCanReview = () => {\n const configApi = useApi(configApiRef);\n const permissionApi = useApi(permissionApiRef);\n const { isModerator } = useIsModerator();\n const [canReview, setCanReview] = useState(false);\n const [canRead, setCanRead] = useState(false);\n const [loading, setLoading] = useState(true);\n\n const usePermissions = useMemo(\n () => configApi.getOptionalBoolean('qeta.permissions') ?? false,\n [configApi],\n );\n\n useEffect(() => {\n if (usePermissions) {\n permissionApi\n .authorize({ permission: qetaCreatePostReviewPermission })\n .then(resp => {\n setCanReview(resp.result === AuthorizeResult.ALLOW);\n })\n .catch(() => {\n setCanReview(false);\n });\n permissionApi\n .authorize({ permission: qetaReadPostReviewPermission })\n .then(resp => {\n setCanRead(resp.result === AuthorizeResult.ALLOW);\n })\n .catch(() => {\n setCanRead(false);\n });\n setLoading(false);\n return;\n }\n\n setCanReview(isModerator);\n setCanRead(isModerator);\n setLoading(false);\n }, [isModerator, permissionApi, usePermissions]);\n\n return { canReview, canRead, loading };\n};\n"],"names":[],"mappings":";;;;;;;AAUO,MAAM,eAAe,MAAM;AAChC,EAAA,MAAM,SAAA,GAAY,OAAO,YAAY,CAAA;AACrC,EAAA,MAAM,aAAA,GAAgB,OAAO,gBAAgB,CAAA;AAC7C,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,cAAA,EAAe;AACvC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,IAAI,CAAA;AAE3C,EAAA,MAAM,cAAA,GAAiB,OAAA;AAAA,IACrB,MAAM,SAAA,CAAU,kBAAA,CAAmB,kBAAkB,CAAA,IAAK,KAAA;AAAA,IAC1D,CAAC,SAAS;AAAA,GACZ;AAEA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,aAAA,CACG,UAAU,EAAE,UAAA,EAAY,gCAAgC,CAAA,CACxD,KAAK,CAAA,IAAA,KAAQ;AACZ,QAAA,YAAA,CAAa,IAAA,CAAK,MAAA,KAAW,eAAA,CAAgB,KAAK,CAAA;AAAA,MACpD,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AACX,QAAA,YAAA,CAAa,KAAK,CAAA;AAAA,MACpB,CAAC,CAAA;AACH,MAAA,aAAA,CACG,UAAU,EAAE,UAAA,EAAY,8BAA8B,CAAA,CACtD,KAAK,CAAA,IAAA,KAAQ;AACZ,QAAA,UAAA,CAAW,IAAA,CAAK,MAAA,KAAW,eAAA,CAAgB,KAAK,CAAA;AAAA,MAClD,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AACX,QAAA,UAAA,CAAW,KAAK,CAAA;AAAA,MAClB,CAAC,CAAA;AACH,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA;AAAA,IACF;AAEA,IAAA,YAAA,CAAa,WAAW,CAAA;AACxB,IAAA,UAAA,CAAW,WAAW,CAAA;AACtB,IAAA,UAAA,CAAW,KAAK,CAAA;AAAA,EAClB,CAAA,EAAG,CAAC,WAAA,EAAa,aAAA,EAAe,cAAc,CAAC,CAAA;AAE/C,EAAA,OAAO,EAAE,SAAA,EAAW,OAAA,EAAS,OAAA,EAAQ;AACvC;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCollectionsFollow.esm.js","sources":["../../src/hooks/useCollectionsFollow.ts"],"sourcesContent":["import { useCallback } from 'react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { qetaApiRef } from '../api';\nimport { Collection } from '@drodil/backstage-plugin-qeta-common';\nimport { useFollow } from './useFollow';\n\nexport const useCollectionsFollow = () => {\n const qetaApi = useApi(qetaApiRef);\n\n const { items, follow, unfollow, isFollowing, loading } =\n useFollow<Collection>('collections', {\n fetchFollowed: useCallback(\n () => qetaApi.getFollowedCollections().then(res => res.collections),\n [qetaApi],\n ),\n followItem: useCallback(\n (collection: Collection) => qetaApi.followCollection(collection.id),\n [qetaApi],\n ),\n unfollowItem: useCallback(\n (collection: Collection) => qetaApi.unfollowCollection(collection.id),\n [qetaApi],\n ),\n isEqual: (a, b) => a.id === b.id,\n });\n\n return {\n collections: items,\n followCollection: follow,\n unfollowCollection: unfollow,\n isFollowingCollection: isFollowing,\n loading,\n };\n};\n"],"names":[],"mappings":";;;;;AAMO,MAAM,uBAAuB,MAAM;AACxC,
|
|
1
|
+
{"version":3,"file":"useCollectionsFollow.esm.js","sources":["../../src/hooks/useCollectionsFollow.ts"],"sourcesContent":["import { useCallback } from 'react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { qetaApiRef } from '../api';\nimport { Collection } from '@drodil/backstage-plugin-qeta-common';\nimport { useFollow } from './useFollow';\n\nexport const useCollectionsFollow = () => {\n const qetaApi = useApi(qetaApiRef);\n\n const { items, follow, unfollow, isFollowing, loading } =\n useFollow<Collection>('collections', {\n fetchFollowed: useCallback(\n () => qetaApi.getFollowedCollections().then(res => res.collections),\n [qetaApi],\n ),\n followItem: useCallback(\n (collection: Collection) => qetaApi.followCollection(collection.id),\n [qetaApi],\n ),\n unfollowItem: useCallback(\n (collection: Collection) => qetaApi.unfollowCollection(collection.id),\n [qetaApi],\n ),\n isEqual: (a, b) => a.id === b.id,\n });\n\n return {\n collections: items,\n followCollection: follow,\n unfollowCollection: unfollow,\n isFollowingCollection: isFollowing,\n loading,\n };\n};\n"],"names":[],"mappings":";;;;;AAMO,MAAM,uBAAuB,MAAM;AACxC,EAAA,MAAM,OAAA,GAAU,OAAO,UAAU,CAAA;AAEjC,EAAA,MAAM,EAAE,OAAO,MAAA,EAAQ,QAAA,EAAU,aAAa,OAAA,EAAQ,GACpD,UAAsB,aAAA,EAAe;AAAA,IACnC,aAAA,EAAe,WAAA;AAAA,MACb,MAAM,OAAA,CAAQ,sBAAA,GAAyB,IAAA,CAAK,CAAA,GAAA,KAAO,IAAI,WAAW,CAAA;AAAA,MAClE,CAAC,OAAO;AAAA,KACV;AAAA,IACA,UAAA,EAAY,WAAA;AAAA,MACV,CAAC,UAAA,KAA2B,OAAA,CAAQ,gBAAA,CAAiB,WAAW,EAAE,CAAA;AAAA,MAClE,CAAC,OAAO;AAAA,KACV;AAAA,IACA,YAAA,EAAc,WAAA;AAAA,MACZ,CAAC,UAAA,KAA2B,OAAA,CAAQ,kBAAA,CAAmB,WAAW,EAAE,CAAA;AAAA,MACpE,CAAC,OAAO;AAAA,KACV;AAAA,IACA,SAAS,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,OAAO,CAAA,CAAE;AAAA,GAC/B,CAAA;AAEH,EAAA,OAAO;AAAA,IACL,WAAA,EAAa,KAAA;AAAA,IACb,gBAAA,EAAkB,MAAA;AAAA,IAClB,kBAAA,EAAoB,QAAA;AAAA,IACpB,qBAAA,EAAuB,WAAA;AAAA,IACvB;AAAA,GACF;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useEntityAuthor.esm.js","sources":["../../src/hooks/useEntityAuthor.ts"],"sourcesContent":["import {\n parseEntityRef,\n stringifyEntityRef,\n UserEntity,\n} from '@backstage/catalog-model';\nimport { CatalogApi } from '@backstage/catalog-client';\nimport DataLoader from 'dataloader';\nimport { identityApiRef, useApi } from '@backstage/core-plugin-api';\nimport {\n catalogApiRef,\n useEntityPresentation,\n} from '@backstage/plugin-catalog-react';\nimport { useEffect, useState } from 'react';\nimport {\n AnswerResponse,\n CollectionResponse,\n PostResponse,\n UserResponse,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../translation';\n\nconst userCache: Map<string, UserEntity> = new Map();\nlet userLoader: DataLoader<string, UserEntity | null> | undefined;\n\nexport const getEntityAuthorLoader = (catalogApi: CatalogApi) => {\n if (userLoader) {\n return userLoader;\n }\n userLoader = new DataLoader<string, UserEntity | null>(\n async (entityRefs: readonly string[]) => {\n const { items } = await catalogApi.getEntitiesByRefs({\n fields: [\n 'kind',\n 'metadata.name',\n 'metadata.namespace',\n 'spec.profile.displayName',\n 'spec.profile.picture',\n ],\n entityRefs: entityRefs as string[],\n });\n\n entityRefs.forEach((entityRef, index) => {\n if (items[index]) {\n userCache.set(entityRef, items[index] as UserEntity);\n }\n });\n return items as (UserEntity | null)[];\n },\n {\n name: 'EntityAuthorLoader',\n cacheMap: new Map(),\n maxBatchSize: 100,\n batchScheduleFn: callback => {\n setTimeout(callback, 50);\n },\n },\n );\n return userLoader;\n};\n\nexport const useUserInfo = (entityRef: string, anonymous?: boolean) => {\n const catalogApi = useApi(catalogApiRef);\n const identityApi = useApi(identityApiRef);\n const { t } = useTranslationRef(qetaTranslationRef);\n const [name, setName] = useState<string>('');\n const [isCurrentUser, setIsCurrentUser] = useState<boolean>(false);\n const [user, setUser] = useState<UserEntity | null>(null);\n const [initials, setInitials] = useState<string | null>(null);\n const [currentUser, setCurrentUser] = useState<string | null>(null);\n const ref = entityRef\n ? stringifyEntityRef(parseEntityRef(entityRef, { defaultKind: 'user' }))\n : 'user:default/guest';\n\n const {\n primaryTitle: userName,\n secondaryTitle,\n Icon,\n } = useEntityPresentation(ref, { defaultKind: 'user' });\n\n useEffect(() => {\n if (anonymous || !entityRef) {\n return;\n }\n\n if (userCache.get(ref)) {\n setUser(userCache.get(ref) as UserEntity);\n return;\n }\n\n getEntityAuthorLoader(catalogApi)\n .load(ref)\n .then(data => {\n if (data) {\n setUser(data);\n } else {\n setUser(null);\n }\n })\n .catch(() => {\n setUser(null);\n });\n }, [catalogApi, ref, anonymous, entityRef]);\n\n useEffect(() => {\n identityApi.getBackstageIdentity().then(res => {\n setCurrentUser(res.userEntityRef ?? 'user:default/guest');\n });\n }, [identityApi]);\n\n useEffect(() => {\n let displayName = userName;\n if (currentUser) {\n const currentUserRef = parseEntityRef(currentUser, {\n defaultKind: 'user',\n });\n const userRef = parseEntityRef(ref, { defaultKind: 'user' });\n if (\n currentUserRef.name === userRef.name &&\n currentUserRef.namespace === userRef.namespace\n ) {\n setIsCurrentUser(true);\n displayName = `${t('userLink.you')}${\n anonymous\n ? ` (${t('userLink.anonymous').toLocaleLowerCase('en-US')})`\n : ''\n }`;\n } else if (anonymous) {\n displayName = t('userLink.anonymous');\n }\n } else if (anonymous) {\n displayName = t('userLink.anonymous');\n }\n setName(displayName);\n }, [ref, anonymous, currentUser, userName, t]);\n\n useEffect(() => {\n const init = (name ?? '')\n .replace(/[^a-zA-Z]/g, '')\n .split(' ')\n .map(p => p[0])\n .join('')\n .substring(0, 2)\n .toUpperCase();\n setInitials(init);\n }, [name]);\n\n return { name, initials, user, secondaryTitle, Icon, isCurrentUser };\n};\n\nexport const useEntityAuthor = (\n entity: PostResponse | AnswerResponse | CollectionResponse | UserResponse,\n) => {\n const anonymous = 'anonymous' in entity ? (entity.anonymous ?? false) : false;\n const author =\n // eslint-disable-next-line no-nested-ternary\n 'author' in entity\n ? entity.author\n : 'userRef' in entity\n ? entity.userRef\n : entity.owner;\n return useUserInfo(author, anonymous);\n};\n"],"names":[],"mappings":";;;;;;;;AAsBA,MAAM,SAAA,uBAAyC,
|
|
1
|
+
{"version":3,"file":"useEntityAuthor.esm.js","sources":["../../src/hooks/useEntityAuthor.ts"],"sourcesContent":["import {\n parseEntityRef,\n stringifyEntityRef,\n UserEntity,\n} from '@backstage/catalog-model';\nimport { CatalogApi } from '@backstage/catalog-client';\nimport DataLoader from 'dataloader';\nimport { identityApiRef, useApi } from '@backstage/core-plugin-api';\nimport {\n catalogApiRef,\n useEntityPresentation,\n} from '@backstage/plugin-catalog-react';\nimport { useEffect, useState } from 'react';\nimport {\n AnswerResponse,\n CollectionResponse,\n PostResponse,\n UserResponse,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../translation';\n\nconst userCache: Map<string, UserEntity> = new Map();\nlet userLoader: DataLoader<string, UserEntity | null> | undefined;\n\nexport const getEntityAuthorLoader = (catalogApi: CatalogApi) => {\n if (userLoader) {\n return userLoader;\n }\n userLoader = new DataLoader<string, UserEntity | null>(\n async (entityRefs: readonly string[]) => {\n const { items } = await catalogApi.getEntitiesByRefs({\n fields: [\n 'kind',\n 'metadata.name',\n 'metadata.namespace',\n 'spec.profile.displayName',\n 'spec.profile.picture',\n ],\n entityRefs: entityRefs as string[],\n });\n\n entityRefs.forEach((entityRef, index) => {\n if (items[index]) {\n userCache.set(entityRef, items[index] as UserEntity);\n }\n });\n return items as (UserEntity | null)[];\n },\n {\n name: 'EntityAuthorLoader',\n cacheMap: new Map(),\n maxBatchSize: 100,\n batchScheduleFn: callback => {\n setTimeout(callback, 50);\n },\n },\n );\n return userLoader;\n};\n\nexport const useUserInfo = (entityRef: string, anonymous?: boolean) => {\n const catalogApi = useApi(catalogApiRef);\n const identityApi = useApi(identityApiRef);\n const { t } = useTranslationRef(qetaTranslationRef);\n const [name, setName] = useState<string>('');\n const [isCurrentUser, setIsCurrentUser] = useState<boolean>(false);\n const [user, setUser] = useState<UserEntity | null>(null);\n const [initials, setInitials] = useState<string | null>(null);\n const [currentUser, setCurrentUser] = useState<string | null>(null);\n const ref = entityRef\n ? stringifyEntityRef(parseEntityRef(entityRef, { defaultKind: 'user' }))\n : 'user:default/guest';\n\n const {\n primaryTitle: userName,\n secondaryTitle,\n Icon,\n } = useEntityPresentation(ref, { defaultKind: 'user' });\n\n useEffect(() => {\n if (anonymous || !entityRef) {\n return;\n }\n\n if (userCache.get(ref)) {\n setUser(userCache.get(ref) as UserEntity);\n return;\n }\n\n getEntityAuthorLoader(catalogApi)\n .load(ref)\n .then(data => {\n if (data) {\n setUser(data);\n } else {\n setUser(null);\n }\n })\n .catch(() => {\n setUser(null);\n });\n }, [catalogApi, ref, anonymous, entityRef]);\n\n useEffect(() => {\n identityApi.getBackstageIdentity().then(res => {\n setCurrentUser(res.userEntityRef ?? 'user:default/guest');\n });\n }, [identityApi]);\n\n useEffect(() => {\n let displayName = userName;\n if (currentUser) {\n const currentUserRef = parseEntityRef(currentUser, {\n defaultKind: 'user',\n });\n const userRef = parseEntityRef(ref, { defaultKind: 'user' });\n if (\n currentUserRef.name === userRef.name &&\n currentUserRef.namespace === userRef.namespace\n ) {\n setIsCurrentUser(true);\n displayName = `${t('userLink.you')}${\n anonymous\n ? ` (${t('userLink.anonymous').toLocaleLowerCase('en-US')})`\n : ''\n }`;\n } else if (anonymous) {\n displayName = t('userLink.anonymous');\n }\n } else if (anonymous) {\n displayName = t('userLink.anonymous');\n }\n setName(displayName);\n }, [ref, anonymous, currentUser, userName, t]);\n\n useEffect(() => {\n const init = (name ?? '')\n .replace(/[^a-zA-Z]/g, '')\n .split(' ')\n .map(p => p[0])\n .join('')\n .substring(0, 2)\n .toUpperCase();\n setInitials(init);\n }, [name]);\n\n return { name, initials, user, secondaryTitle, Icon, isCurrentUser };\n};\n\nexport const useEntityAuthor = (\n entity: PostResponse | AnswerResponse | CollectionResponse | UserResponse,\n) => {\n const anonymous = 'anonymous' in entity ? (entity.anonymous ?? false) : false;\n const author =\n // eslint-disable-next-line no-nested-ternary\n 'author' in entity\n ? entity.author\n : 'userRef' in entity\n ? entity.userRef\n : entity.owner;\n return useUserInfo(author, anonymous);\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useEntityFollow.esm.js","sources":["../../src/hooks/useEntityFollow.ts"],"sourcesContent":["import { useCallback } from 'react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { qetaApiRef } from '../api';\nimport { useFollow } from './useFollow';\n\nexport const useEntityFollow = () => {\n const qetaApi = useApi(qetaApiRef);\n\n const { items, follow, unfollow, isFollowing, loading } = useFollow<string>(\n 'entities',\n {\n fetchFollowed: useCallback(\n () => qetaApi.getFollowedEntities().then(res => res.entityRefs),\n [qetaApi],\n ),\n followItem: useCallback(\n (entityRef: string) => qetaApi.followEntity(entityRef),\n [qetaApi],\n ),\n unfollowItem: useCallback(\n (entityRef: string) => qetaApi.unfollowEntity(entityRef),\n [qetaApi],\n ),\n isEqual: (a, b) => a === b,\n },\n );\n\n return {\n entities: items,\n followEntity: follow,\n unfollowEntity: unfollow,\n isFollowingEntity: isFollowing,\n loading,\n };\n};\n"],"names":[],"mappings":";;;;;AAKO,MAAM,kBAAkB,MAAM;AACnC,
|
|
1
|
+
{"version":3,"file":"useEntityFollow.esm.js","sources":["../../src/hooks/useEntityFollow.ts"],"sourcesContent":["import { useCallback } from 'react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { qetaApiRef } from '../api';\nimport { useFollow } from './useFollow';\n\nexport const useEntityFollow = () => {\n const qetaApi = useApi(qetaApiRef);\n\n const { items, follow, unfollow, isFollowing, loading } = useFollow<string>(\n 'entities',\n {\n fetchFollowed: useCallback(\n () => qetaApi.getFollowedEntities().then(res => res.entityRefs),\n [qetaApi],\n ),\n followItem: useCallback(\n (entityRef: string) => qetaApi.followEntity(entityRef),\n [qetaApi],\n ),\n unfollowItem: useCallback(\n (entityRef: string) => qetaApi.unfollowEntity(entityRef),\n [qetaApi],\n ),\n isEqual: (a, b) => a === b,\n },\n );\n\n return {\n entities: items,\n followEntity: follow,\n unfollowEntity: unfollow,\n isFollowingEntity: isFollowing,\n loading,\n };\n};\n"],"names":[],"mappings":";;;;;AAKO,MAAM,kBAAkB,MAAM;AACnC,EAAA,MAAM,OAAA,GAAU,OAAO,UAAU,CAAA;AAEjC,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAU,WAAA,EAAa,SAAQ,GAAI,SAAA;AAAA,IACxD,UAAA;AAAA,IACA;AAAA,MACE,aAAA,EAAe,WAAA;AAAA,QACb,MAAM,OAAA,CAAQ,mBAAA,GAAsB,IAAA,CAAK,CAAA,GAAA,KAAO,IAAI,UAAU,CAAA;AAAA,QAC9D,CAAC,OAAO;AAAA,OACV;AAAA,MACA,UAAA,EAAY,WAAA;AAAA,QACV,CAAC,SAAA,KAAsB,OAAA,CAAQ,YAAA,CAAa,SAAS,CAAA;AAAA,QACrD,CAAC,OAAO;AAAA,OACV;AAAA,MACA,YAAA,EAAc,WAAA;AAAA,QACZ,CAAC,SAAA,KAAsB,OAAA,CAAQ,cAAA,CAAe,SAAS,CAAA;AAAA,QACvD,CAAC,OAAO;AAAA,OACV;AAAA,MACA,OAAA,EAAS,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,KAAM;AAAA;AAC3B,GACF;AAEA,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,KAAA;AAAA,IACV,YAAA,EAAc,MAAA;AAAA,IACd,cAAA,EAAgB,QAAA;AAAA,IAChB,iBAAA,EAAmB,WAAA;AAAA,IACnB;AAAA,GACF;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useEntityQueryParameter.esm.js","sources":["../../src/hooks/useEntityQueryParameter.ts"],"sourcesContent":["import { useSearchParams } from 'react-router-dom';\nimport { useState, useEffect } from 'react';\n\nexport function useEntityQueryParameter(entity?: string) {\n const [searchParams] = useSearchParams();\n const [entityRef, setEntityRef] = useState<string | undefined>(entity);\n\n useEffect(() => {\n setEntityRef(searchParams.get('entity') ?? undefined);\n }, [searchParams, setEntityRef]);\n\n return entityRef;\n}\n"],"names":[],"mappings":";;;AAGO,SAAS,wBAAwB,
|
|
1
|
+
{"version":3,"file":"useEntityQueryParameter.esm.js","sources":["../../src/hooks/useEntityQueryParameter.ts"],"sourcesContent":["import { useSearchParams } from 'react-router-dom';\nimport { useState, useEffect } from 'react';\n\nexport function useEntityQueryParameter(entity?: string) {\n const [searchParams] = useSearchParams();\n const [entityRef, setEntityRef] = useState<string | undefined>(entity);\n\n useEffect(() => {\n setEntityRef(searchParams.get('entity') ?? undefined);\n }, [searchParams, setEntityRef]);\n\n return entityRef;\n}\n"],"names":[],"mappings":";;;AAGO,SAAS,wBAAwB,MAAA,EAAiB;AACvD,EAAA,MAAM,CAAC,YAAY,CAAA,GAAI,eAAA,EAAgB;AACvC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAA6B,MAAM,CAAA;AAErE,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,YAAA,CAAa,YAAA,CAAa,GAAA,CAAI,QAAQ,CAAA,IAAK,MAAS,CAAA;AAAA,EACtD,CAAA,EAAG,CAAC,YAAA,EAAc,YAAY,CAAC,CAAA;AAE/B,EAAA,OAAO,SAAA;AACT;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFavicon.esm.js","sources":["../../src/hooks/useFavicon.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { qetaApiRef } from '../api';\nimport DataLoader from 'dataloader';\nimport { QetaApi } from '@drodil/backstage-plugin-qeta-common';\n\nconst loaderCache = new WeakMap<\n QetaApi,\n DataLoader<string, string | undefined>\n>();\n\nconst getFaviconLoader = (\n qetaApi: QetaApi,\n): DataLoader<string, string | undefined> => {\n const cached = loaderCache.get(qetaApi);\n if (cached) {\n return cached;\n }\n\n const loader = new DataLoader<string, string | undefined>(\n async (urls: readonly string[]) => {\n try {\n const response = await qetaApi.fetchBatchURLMetadata({\n urls: [...urls],\n });\n\n return urls.map(url => {\n const metadata = response.metadata?.[url];\n return metadata?.favicon;\n });\n } catch {\n return urls.map(() => undefined);\n }\n },\n {\n cache: true,\n batchScheduleFn: callback => setTimeout(callback, 10),\n maxBatchSize: 50,\n },\n );\n\n loaderCache.set(qetaApi, loader);\n return loader;\n};\n\nexport const useFavicon = (url?: string): string | undefined => {\n const qetaApi = useApi(qetaApiRef);\n const [favicon, setFavicon] = useState<string | undefined>(undefined);\n\n useEffect(() => {\n if (!url) {\n setFavicon(undefined);\n return;\n }\n\n const loader = getFaviconLoader(qetaApi);\n\n loader\n .load(url)\n .then(setFavicon)\n .catch(() => {\n setFavicon(undefined);\n });\n }, [url, qetaApi]);\n\n return favicon;\n};\n"],"names":[],"mappings":";;;;;AAMA,MAAM,WAAA,uBAAkB,
|
|
1
|
+
{"version":3,"file":"useFavicon.esm.js","sources":["../../src/hooks/useFavicon.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { qetaApiRef } from '../api';\nimport DataLoader from 'dataloader';\nimport { QetaApi } from '@drodil/backstage-plugin-qeta-common';\n\nconst loaderCache = new WeakMap<\n QetaApi,\n DataLoader<string, string | undefined>\n>();\n\nconst getFaviconLoader = (\n qetaApi: QetaApi,\n): DataLoader<string, string | undefined> => {\n const cached = loaderCache.get(qetaApi);\n if (cached) {\n return cached;\n }\n\n const loader = new DataLoader<string, string | undefined>(\n async (urls: readonly string[]) => {\n try {\n const response = await qetaApi.fetchBatchURLMetadata({\n urls: [...urls],\n });\n\n return urls.map(url => {\n const metadata = response.metadata?.[url];\n return metadata?.favicon;\n });\n } catch {\n return urls.map(() => undefined);\n }\n },\n {\n cache: true,\n batchScheduleFn: callback => setTimeout(callback, 10),\n maxBatchSize: 50,\n },\n );\n\n loaderCache.set(qetaApi, loader);\n return loader;\n};\n\nexport const useFavicon = (url?: string): string | undefined => {\n const qetaApi = useApi(qetaApiRef);\n const [favicon, setFavicon] = useState<string | undefined>(undefined);\n\n useEffect(() => {\n if (!url) {\n setFavicon(undefined);\n return;\n }\n\n const loader = getFaviconLoader(qetaApi);\n\n loader\n .load(url)\n .then(setFavicon)\n .catch(() => {\n setFavicon(undefined);\n });\n }, [url, qetaApi]);\n\n return favicon;\n};\n"],"names":[],"mappings":";;;;;AAMA,MAAM,WAAA,uBAAkB,OAAA,EAGtB;AAEF,MAAM,gBAAA,GAAmB,CACvB,OAAA,KAC2C;AAC3C,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,GAAA,CAAI,OAAO,CAAA;AACtC,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,SAAS,IAAI,UAAA;AAAA,IACjB,OAAO,IAAA,KAA4B;AACjC,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,qBAAA,CAAsB;AAAA,UACnD,IAAA,EAAM,CAAC,GAAG,IAAI;AAAA,SACf,CAAA;AAED,QAAA,OAAO,IAAA,CAAK,IAAI,CAAA,GAAA,KAAO;AACrB,UAAA,MAAM,QAAA,GAAW,QAAA,CAAS,QAAA,GAAW,GAAG,CAAA;AACxC,UAAA,OAAO,QAAA,EAAU,OAAA;AAAA,QACnB,CAAC,CAAA;AAAA,MACH,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,IAAA,CAAK,GAAA,CAAI,MAAM,MAAS,CAAA;AAAA,MACjC;AAAA,IACF,CAAA;AAAA,IACA;AAAA,MACE,KAAA,EAAO,IAAA;AAAA,MACP,eAAA,EAAiB,CAAA,QAAA,KAAY,UAAA,CAAW,QAAA,EAAU,EAAE,CAAA;AAAA,MACpD,YAAA,EAAc;AAAA;AAChB,GACF;AAEA,EAAA,WAAA,CAAY,GAAA,CAAI,SAAS,MAAM,CAAA;AAC/B,EAAA,OAAO,MAAA;AACT,CAAA;AAEO,MAAM,UAAA,GAAa,CAAC,GAAA,KAAqC;AAC9D,EAAA,MAAM,OAAA,GAAU,OAAO,UAAU,CAAA;AACjC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAA6B,MAAS,CAAA;AAEpE,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,UAAA,CAAW,MAAS,CAAA;AACpB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,iBAAiB,OAAO,CAAA;AAEvC,IAAA,MAAA,CACG,KAAK,GAAG,CAAA,CACR,KAAK,UAAU,CAAA,CACf,MAAM,MAAM;AACX,MAAA,UAAA,CAAW,MAAS,CAAA;AAAA,IACtB,CAAC,CAAA;AAAA,EACL,CAAA,EAAG,CAAC,GAAA,EAAK,OAAO,CAAC,CAAA;AAEjB,EAAA,OAAO,OAAA;AACT;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFollow.esm.js","sources":["../../src/hooks/useFollow.ts"],"sourcesContent":["import { useCallback, useEffect, useState } from 'react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { qetaApiRef } from '../api';\n\ninterface UseFollowOptions<T> {\n fetchFollowed: () => Promise<T[]>;\n followItem: (item: T) => Promise<unknown>;\n unfollowItem: (item: T) => Promise<unknown>;\n isEqual: (a: T, b: T) => boolean;\n}\n\ninterface UseFollowCache<T> {\n data: T[] | undefined;\n promise: Promise<T[]> | undefined;\n}\n\nconst caches = new Map<string, UseFollowCache<any>>();\n\nexport const useFollow = <T>(key: string, options: UseFollowOptions<T>) => {\n const { fetchFollowed, followItem, unfollowItem, isEqual } = options;\n\n // Get or create cache for this key\n if (!caches.has(key)) {\n caches.set(key, { data: undefined, promise: undefined });\n }\n const cache = caches.get(key) as UseFollowCache<T>;\n\n const [items, setItems] = useState<T[]>(cache.data ?? []);\n const [loading, setLoading] = useState(cache.data === undefined);\n const qetaApi = useApi(qetaApiRef);\n\n useEffect(() => {\n if (cache.data === undefined) {\n cache.promise ??= fetchFollowed().then(result => {\n cache.data = result;\n cache.promise = undefined;\n return result;\n });\n cache.promise.then(result => {\n setItems(result);\n setLoading(false);\n });\n } else {\n setItems(cache.data);\n }\n }, [qetaApi, fetchFollowed, cache]);\n\n const follow = useCallback(\n (item: T) => {\n followItem(item).then(() => {\n setItems(prev => [...prev, item]);\n cache.data?.push(item);\n });\n },\n [followItem, cache],\n );\n\n const unfollow = useCallback(\n (item: T) => {\n unfollowItem(item).then(() => {\n setItems(prev => prev.filter(i => !isEqual(i, item)));\n cache.data = cache.data?.filter(i => !isEqual(i, item));\n });\n },\n [unfollowItem, isEqual, cache],\n );\n\n const isFollowing = useCallback(\n (item: T) => items.some(i => isEqual(i, item)),\n [items, isEqual],\n );\n\n return {\n items,\n follow,\n unfollow,\n isFollowing,\n loading,\n };\n};\n"],"names":[],"mappings":";;;;AAgBA,MAAM,MAAA,uBAAa,
|
|
1
|
+
{"version":3,"file":"useFollow.esm.js","sources":["../../src/hooks/useFollow.ts"],"sourcesContent":["import { useCallback, useEffect, useState } from 'react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { qetaApiRef } from '../api';\n\ninterface UseFollowOptions<T> {\n fetchFollowed: () => Promise<T[]>;\n followItem: (item: T) => Promise<unknown>;\n unfollowItem: (item: T) => Promise<unknown>;\n isEqual: (a: T, b: T) => boolean;\n}\n\ninterface UseFollowCache<T> {\n data: T[] | undefined;\n promise: Promise<T[]> | undefined;\n}\n\nconst caches = new Map<string, UseFollowCache<any>>();\n\nexport const useFollow = <T>(key: string, options: UseFollowOptions<T>) => {\n const { fetchFollowed, followItem, unfollowItem, isEqual } = options;\n\n // Get or create cache for this key\n if (!caches.has(key)) {\n caches.set(key, { data: undefined, promise: undefined });\n }\n const cache = caches.get(key) as UseFollowCache<T>;\n\n const [items, setItems] = useState<T[]>(cache.data ?? []);\n const [loading, setLoading] = useState(cache.data === undefined);\n const qetaApi = useApi(qetaApiRef);\n\n useEffect(() => {\n if (cache.data === undefined) {\n cache.promise ??= fetchFollowed().then(result => {\n cache.data = result;\n cache.promise = undefined;\n return result;\n });\n cache.promise.then(result => {\n setItems(result);\n setLoading(false);\n });\n } else {\n setItems(cache.data);\n }\n }, [qetaApi, fetchFollowed, cache]);\n\n const follow = useCallback(\n (item: T) => {\n followItem(item).then(() => {\n setItems(prev => [...prev, item]);\n cache.data?.push(item);\n });\n },\n [followItem, cache],\n );\n\n const unfollow = useCallback(\n (item: T) => {\n unfollowItem(item).then(() => {\n setItems(prev => prev.filter(i => !isEqual(i, item)));\n cache.data = cache.data?.filter(i => !isEqual(i, item));\n });\n },\n [unfollowItem, isEqual, cache],\n );\n\n const isFollowing = useCallback(\n (item: T) => items.some(i => isEqual(i, item)),\n [items, isEqual],\n );\n\n return {\n items,\n follow,\n unfollow,\n isFollowing,\n loading,\n };\n};\n"],"names":[],"mappings":";;;;AAgBA,MAAM,MAAA,uBAAa,GAAA,EAAiC;AAE7C,MAAM,SAAA,GAAY,CAAI,GAAA,EAAa,OAAA,KAAiC;AACzE,EAAA,MAAM,EAAE,aAAA,EAAe,UAAA,EAAY,YAAA,EAAc,SAAQ,GAAI,OAAA;AAG7D,EAAA,IAAI,CAAC,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA,EAAG;AACpB,IAAA,MAAA,CAAO,IAAI,GAAA,EAAK,EAAE,MAAM,MAAA,EAAW,OAAA,EAAS,QAAW,CAAA;AAAA,EACzD;AACA,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA;AAE5B,EAAA,MAAM,CAAC,OAAO,QAAQ,CAAA,GAAI,SAAc,KAAA,CAAM,IAAA,IAAQ,EAAE,CAAA;AACxD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,IAAI,QAAA,CAAS,KAAA,CAAM,SAAS,MAAS,CAAA;AAC/D,EAAA,MAAM,OAAA,GAAU,OAAO,UAAU,CAAA;AAEjC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAW;AAC5B,MAAA,KAAA,CAAM,OAAA,KAAY,aAAA,EAAc,CAAE,IAAA,CAAK,CAAA,MAAA,KAAU;AAC/C,QAAA,KAAA,CAAM,IAAA,GAAO,MAAA;AACb,QAAA,KAAA,CAAM,OAAA,GAAU,MAAA;AAChB,QAAA,OAAO,MAAA;AAAA,MACT,CAAC,CAAA;AACD,MAAA,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,MAAA,KAAU;AAC3B,QAAA,QAAA,CAAS,MAAM,CAAA;AACf,QAAA,UAAA,CAAW,KAAK,CAAA;AAAA,MAClB,CAAC,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,MAAM,IAAI,CAAA;AAAA,IACrB;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,aAAA,EAAe,KAAK,CAAC,CAAA;AAElC,EAAA,MAAM,MAAA,GAAS,WAAA;AAAA,IACb,CAAC,IAAA,KAAY;AACX,MAAA,UAAA,CAAW,IAAI,CAAA,CAAE,IAAA,CAAK,MAAM;AAC1B,QAAA,QAAA,CAAS,CAAA,IAAA,KAAQ,CAAC,GAAG,IAAA,EAAM,IAAI,CAAC,CAAA;AAChC,QAAA,KAAA,CAAM,IAAA,EAAM,KAAK,IAAI,CAAA;AAAA,MACvB,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,YAAY,KAAK;AAAA,GACpB;AAEA,EAAA,MAAM,QAAA,GAAW,WAAA;AAAA,IACf,CAAC,IAAA,KAAY;AACX,MAAA,YAAA,CAAa,IAAI,CAAA,CAAE,IAAA,CAAK,MAAM;AAC5B,QAAA,QAAA,CAAS,CAAA,IAAA,KAAQ,KAAK,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,OAAA,CAAQ,CAAA,EAAG,IAAI,CAAC,CAAC,CAAA;AACpD,QAAA,KAAA,CAAM,IAAA,GAAO,MAAM,IAAA,EAAM,MAAA,CAAO,OAAK,CAAC,OAAA,CAAQ,CAAA,EAAG,IAAI,CAAC,CAAA;AAAA,MACxD,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,YAAA,EAAc,OAAA,EAAS,KAAK;AAAA,GAC/B;AAEA,EAAA,MAAM,WAAA,GAAc,WAAA;AAAA,IAClB,CAAC,SAAY,KAAA,CAAM,IAAA,CAAK,OAAK,OAAA,CAAQ,CAAA,EAAG,IAAI,CAAC,CAAA;AAAA,IAC7C,CAAC,OAAO,OAAO;AAAA,GACjB;AAEA,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,MAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useGridPageSize.esm.js","sources":["../../src/hooks/useGridPageSize.ts"],"sourcesContent":["import { useTheme, useMediaQuery } from '@material-ui/core';\n\nexport type GridType = 'posts' | 'tags' | 'entities' | 'users' | 'collections';\n\nexport function useGridPageSize(\n gridType: GridType,\n basePageSize: number = 24,\n): number {\n const theme = useTheme();\n\n const isXl = useMediaQuery(theme.breakpoints.up('xl'));\n const isLg = useMediaQuery(theme.breakpoints.up('lg'));\n const isMd = useMediaQuery(theme.breakpoints.up('md'));\n const isSm = useMediaQuery(theme.breakpoints.up('sm'));\n\n let itemsPerRow: number;\n\n switch (gridType) {\n case 'tags':\n case 'entities':\n if (isXl) {\n itemsPerRow = 3;\n } else if (isSm) {\n itemsPerRow = 2;\n } else {\n itemsPerRow = 1;\n }\n break;\n\n case 'users':\n if (isXl) {\n itemsPerRow = 3;\n } else if (isMd) {\n itemsPerRow = 2;\n } else {\n itemsPerRow = 1;\n }\n break;\n\n case 'posts':\n if (isXl) {\n itemsPerRow = 2;\n } else {\n itemsPerRow = 1;\n }\n break;\n\n case 'collections':\n if (isLg) {\n itemsPerRow = 2;\n } else {\n itemsPerRow = 1;\n }\n break;\n\n default:\n itemsPerRow = 1;\n }\n\n const remainder = basePageSize % itemsPerRow;\n if (remainder === 0) {\n return basePageSize;\n }\n return basePageSize + (itemsPerRow - remainder);\n}\n"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"useGridPageSize.esm.js","sources":["../../src/hooks/useGridPageSize.ts"],"sourcesContent":["import { useTheme, useMediaQuery } from '@material-ui/core';\n\nexport type GridType = 'posts' | 'tags' | 'entities' | 'users' | 'collections';\n\nexport function useGridPageSize(\n gridType: GridType,\n basePageSize: number = 24,\n): number {\n const theme = useTheme();\n\n const isXl = useMediaQuery(theme.breakpoints.up('xl'));\n const isLg = useMediaQuery(theme.breakpoints.up('lg'));\n const isMd = useMediaQuery(theme.breakpoints.up('md'));\n const isSm = useMediaQuery(theme.breakpoints.up('sm'));\n\n let itemsPerRow: number;\n\n switch (gridType) {\n case 'tags':\n case 'entities':\n if (isXl) {\n itemsPerRow = 3;\n } else if (isSm) {\n itemsPerRow = 2;\n } else {\n itemsPerRow = 1;\n }\n break;\n\n case 'users':\n if (isXl) {\n itemsPerRow = 3;\n } else if (isMd) {\n itemsPerRow = 2;\n } else {\n itemsPerRow = 1;\n }\n break;\n\n case 'posts':\n if (isXl) {\n itemsPerRow = 2;\n } else {\n itemsPerRow = 1;\n }\n break;\n\n case 'collections':\n if (isLg) {\n itemsPerRow = 2;\n } else {\n itemsPerRow = 1;\n }\n break;\n\n default:\n itemsPerRow = 1;\n }\n\n const remainder = basePageSize % itemsPerRow;\n if (remainder === 0) {\n return basePageSize;\n }\n return basePageSize + (itemsPerRow - remainder);\n}\n"],"names":[],"mappings":";;AAIO,SAAS,eAAA,CACd,QAAA,EACA,YAAA,GAAuB,EAAA,EACf;AACR,EAAA,MAAM,QAAQ,QAAA,EAAS;AAEvB,EAAA,MAAM,OAAO,aAAA,CAAc,KAAA,CAAM,WAAA,CAAY,EAAA,CAAG,IAAI,CAAC,CAAA;AACrD,EAAA,MAAM,OAAO,aAAA,CAAc,KAAA,CAAM,WAAA,CAAY,EAAA,CAAG,IAAI,CAAC,CAAA;AACrD,EAAA,MAAM,OAAO,aAAA,CAAc,KAAA,CAAM,WAAA,CAAY,EAAA,CAAG,IAAI,CAAC,CAAA;AACrD,EAAA,MAAM,OAAO,aAAA,CAAc,KAAA,CAAM,WAAA,CAAY,EAAA,CAAG,IAAI,CAAC,CAAA;AAErD,EAAA,IAAI,WAAA;AAEJ,EAAA,QAAQ,QAAA;AAAU,IAChB,KAAK,MAAA;AAAA,IACL,KAAK,UAAA;AACH,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,WAAA,GAAc,CAAA;AAAA,MAChB,WAAW,IAAA,EAAM;AACf,QAAA,WAAA,GAAc,CAAA;AAAA,MAChB,CAAA,MAAO;AACL,QAAA,WAAA,GAAc,CAAA;AAAA,MAChB;AACA,MAAA;AAAA,IAEF,KAAK,OAAA;AACH,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,WAAA,GAAc,CAAA;AAAA,MAChB,WAAW,IAAA,EAAM;AACf,QAAA,WAAA,GAAc,CAAA;AAAA,MAChB,CAAA,MAAO;AACL,QAAA,WAAA,GAAc,CAAA;AAAA,MAChB;AACA,MAAA;AAAA,IAEF,KAAK,OAAA;AACH,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,WAAA,GAAc,CAAA;AAAA,MAChB,CAAA,MAAO;AACL,QAAA,WAAA,GAAc,CAAA;AAAA,MAChB;AACA,MAAA;AAAA,IAEF,KAAK,aAAA;AACH,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,WAAA,GAAc,CAAA;AAAA,MAChB,CAAA,MAAO;AACL,QAAA,WAAA,GAAc,CAAA;AAAA,MAChB;AACA,MAAA;AAAA,IAEF;AACE,MAAA,WAAA,GAAc,CAAA;AAAA;AAGlB,EAAA,MAAM,YAAY,YAAA,GAAe,WAAA;AACjC,EAAA,IAAI,cAAc,CAAA,EAAG;AACnB,IAAA,OAAO,YAAA;AAAA,EACT;AACA,EAAA,OAAO,gBAAgB,WAAA,GAAc,SAAA,CAAA;AACvC;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useHistoryEnabled.esm.js","sources":["../../src/hooks/useHistoryEnabled.ts"],"sourcesContent":["import { configApiRef, useApi } from '@backstage/core-plugin-api';\nimport { PostType } from '@drodil/backstage-plugin-qeta-common';\n\n/**\n * Returns whether history / revision tracking is enabled for the given\n * content type (article, question, link).\n *\n * Reads from `qeta.history.enabled` and `qeta.history.enabledContent` in\n * the app config.\n */\nexport const useHistoryEnabled = (postType: PostType): boolean => {\n const configApi = useApi(configApiRef);\n const enabled = configApi.getOptionalBoolean('qeta.history.enabled') ?? false;\n if (!enabled) {\n return false;\n }\n const enabledContent = configApi.getOptionalStringArray(\n 'qeta.history.enabledContent',\n ) ?? ['article'];\n return enabledContent.includes(postType);\n};\n"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"useHistoryEnabled.esm.js","sources":["../../src/hooks/useHistoryEnabled.ts"],"sourcesContent":["import { configApiRef, useApi } from '@backstage/core-plugin-api';\nimport { PostType } from '@drodil/backstage-plugin-qeta-common';\n\n/**\n * Returns whether history / revision tracking is enabled for the given\n * content type (article, question, link).\n *\n * Reads from `qeta.history.enabled` and `qeta.history.enabledContent` in\n * the app config.\n */\nexport const useHistoryEnabled = (postType: PostType): boolean => {\n const configApi = useApi(configApiRef);\n const enabled = configApi.getOptionalBoolean('qeta.history.enabled') ?? false;\n if (!enabled) {\n return false;\n }\n const enabledContent = configApi.getOptionalStringArray(\n 'qeta.history.enabledContent',\n ) ?? ['article'];\n return enabledContent.includes(postType);\n};\n"],"names":[],"mappings":";;AAUO,MAAM,iBAAA,GAAoB,CAAC,QAAA,KAAgC;AAChE,EAAA,MAAM,SAAA,GAAY,OAAO,YAAY,CAAA;AACrC,EAAA,MAAM,OAAA,GAAU,SAAA,CAAU,kBAAA,CAAmB,sBAAsB,CAAA,IAAK,KAAA;AACxE,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,iBAAiB,SAAA,CAAU,sBAAA;AAAA,IAC/B;AAAA,GACF,IAAK,CAAC,SAAS,CAAA;AACf,EAAA,OAAO,cAAA,CAAe,SAAS,QAAQ,CAAA;AACzC;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useIdentityApi.esm.js","sources":["../../src/hooks/useIdentityApi.ts"],"sourcesContent":["import {\n IdentityApi,\n identityApiRef,\n useApi,\n} from '@backstage/core-plugin-api';\nimport useAsync from 'react-use/lib/useAsync';\n\nexport function useIdentityApi<T>(\n f: (api: IdentityApi) => Promise<T>,\n deps: any[] = [],\n) {\n const identityApi = useApi(identityApiRef);\n\n return useAsync(async () => {\n return await f(identityApi);\n }, deps);\n}\n"],"names":[],"mappings":";;;AAOO,SAAS,
|
|
1
|
+
{"version":3,"file":"useIdentityApi.esm.js","sources":["../../src/hooks/useIdentityApi.ts"],"sourcesContent":["import {\n IdentityApi,\n identityApiRef,\n useApi,\n} from '@backstage/core-plugin-api';\nimport useAsync from 'react-use/lib/useAsync';\n\nexport function useIdentityApi<T>(\n f: (api: IdentityApi) => Promise<T>,\n deps: any[] = [],\n) {\n const identityApi = useApi(identityApiRef);\n\n return useAsync(async () => {\n return await f(identityApi);\n }, deps);\n}\n"],"names":[],"mappings":";;;AAOO,SAAS,cAAA,CACd,CAAA,EACA,IAAA,GAAc,EAAC,EACf;AACA,EAAA,MAAM,WAAA,GAAc,OAAO,cAAc,CAAA;AAEzC,EAAA,OAAO,SAAS,YAAY;AAC1B,IAAA,OAAO,MAAM,EAAE,WAAW,CAAA;AAAA,EAC5B,GAAG,IAAI,CAAA;AACT;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useIsDarkTheme.esm.js","sources":["../../src/hooks/useIsDarkTheme.ts"],"sourcesContent":["import { appThemeApiRef, useApi } from '@backstage/core-plugin-api';\nimport { useMemo } from 'react';\n\nexport function useIsDarkTheme() {\n const appThemeApi = useApi(appThemeApiRef);\n const themes = appThemeApi.getInstalledThemes();\n const theme = useMemo(() => appThemeApi.getActiveThemeId(), [appThemeApi]);\n return Boolean(themes.find(t => t.id === theme)?.variant === 'dark');\n}\n"],"names":[],"mappings":";;;AAGO,SAAS,
|
|
1
|
+
{"version":3,"file":"useIsDarkTheme.esm.js","sources":["../../src/hooks/useIsDarkTheme.ts"],"sourcesContent":["import { appThemeApiRef, useApi } from '@backstage/core-plugin-api';\nimport { useMemo } from 'react';\n\nexport function useIsDarkTheme() {\n const appThemeApi = useApi(appThemeApiRef);\n const themes = appThemeApi.getInstalledThemes();\n const theme = useMemo(() => appThemeApi.getActiveThemeId(), [appThemeApi]);\n return Boolean(themes.find(t => t.id === theme)?.variant === 'dark');\n}\n"],"names":[],"mappings":";;;AAGO,SAAS,cAAA,GAAiB;AAC/B,EAAA,MAAM,WAAA,GAAc,OAAO,cAAc,CAAA;AACzC,EAAA,MAAM,MAAA,GAAS,YAAY,kBAAA,EAAmB;AAC9C,EAAA,MAAM,KAAA,GAAQ,QAAQ,MAAM,WAAA,CAAY,kBAAiB,EAAG,CAAC,WAAW,CAAC,CAAA;AACzE,EAAA,OAAO,OAAA,CAAQ,OAAO,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,EAAA,KAAO,KAAK,CAAA,EAAG,OAAA,KAAY,MAAM,CAAA;AACrE;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useIsModerator.esm.js","sources":["../../src/hooks/useIsModerator.ts"],"sourcesContent":["import { configApiRef, useApi } from '@backstage/core-plugin-api';\nimport { useIdentityApi } from './useIdentityApi';\nimport { useEffect, useMemo, useState } from 'react';\nimport { permissionApiRef } from '@backstage/plugin-permission-react';\nimport { qetaModeratePermission } from '@drodil/backstage-plugin-qeta-common';\nimport { AuthorizeResult } from '@backstage/plugin-permission-common';\n\nexport const useIsModerator = () => {\n const configApi = useApi(configApiRef);\n const permissionApi = useApi(permissionApiRef);\n const [isModerator, setIsModerator] = useState(false);\n const moderators = useMemo(\n () => configApi.getOptionalStringArray('qeta.moderators') ?? [],\n [configApi],\n );\n const usePermissions = useMemo(\n () => configApi.getOptionalBoolean('qeta.permissions') ?? false,\n [configApi],\n );\n\n const { value: user } = useIdentityApi(api => api.getBackstageIdentity(), []);\n\n useEffect(() => {\n if (usePermissions) {\n permissionApi\n .authorize({ permission: qetaModeratePermission })\n .then(resp => {\n setIsModerator(resp.result === AuthorizeResult.ALLOW);\n });\n return;\n }\n\n const ownership: string[] = user?.ownershipEntityRefs ?? [];\n if (user?.userEntityRef && !ownership.includes(user.userEntityRef)) {\n ownership.push(user.userEntityRef);\n }\n setIsModerator(moderators.some((m: string) => ownership.includes(m)));\n }, [moderators, permissionApi, usePermissions, user]);\n\n return { isModerator };\n};\n"],"names":[],"mappings":";;;;;;;AAOO,MAAM,iBAAiB,MAAM;AAClC,
|
|
1
|
+
{"version":3,"file":"useIsModerator.esm.js","sources":["../../src/hooks/useIsModerator.ts"],"sourcesContent":["import { configApiRef, useApi } from '@backstage/core-plugin-api';\nimport { useIdentityApi } from './useIdentityApi';\nimport { useEffect, useMemo, useState } from 'react';\nimport { permissionApiRef } from '@backstage/plugin-permission-react';\nimport { qetaModeratePermission } from '@drodil/backstage-plugin-qeta-common';\nimport { AuthorizeResult } from '@backstage/plugin-permission-common';\n\nexport const useIsModerator = () => {\n const configApi = useApi(configApiRef);\n const permissionApi = useApi(permissionApiRef);\n const [isModerator, setIsModerator] = useState(false);\n const moderators = useMemo(\n () => configApi.getOptionalStringArray('qeta.moderators') ?? [],\n [configApi],\n );\n const usePermissions = useMemo(\n () => configApi.getOptionalBoolean('qeta.permissions') ?? false,\n [configApi],\n );\n\n const { value: user } = useIdentityApi(api => api.getBackstageIdentity(), []);\n\n useEffect(() => {\n if (usePermissions) {\n permissionApi\n .authorize({ permission: qetaModeratePermission })\n .then(resp => {\n setIsModerator(resp.result === AuthorizeResult.ALLOW);\n });\n return;\n }\n\n const ownership: string[] = user?.ownershipEntityRefs ?? [];\n if (user?.userEntityRef && !ownership.includes(user.userEntityRef)) {\n ownership.push(user.userEntityRef);\n }\n setIsModerator(moderators.some((m: string) => ownership.includes(m)));\n }, [moderators, permissionApi, usePermissions, user]);\n\n return { isModerator };\n};\n"],"names":[],"mappings":";;;;;;;AAOO,MAAM,iBAAiB,MAAM;AAClC,EAAA,MAAM,SAAA,GAAY,OAAO,YAAY,CAAA;AACrC,EAAA,MAAM,aAAA,GAAgB,OAAO,gBAAgB,CAAA;AAC7C,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,KAAK,CAAA;AACpD,EAAA,MAAM,UAAA,GAAa,OAAA;AAAA,IACjB,MAAM,SAAA,CAAU,sBAAA,CAAuB,iBAAiB,KAAK,EAAC;AAAA,IAC9D,CAAC,SAAS;AAAA,GACZ;AACA,EAAA,MAAM,cAAA,GAAiB,OAAA;AAAA,IACrB,MAAM,SAAA,CAAU,kBAAA,CAAmB,kBAAkB,CAAA,IAAK,KAAA;AAAA,IAC1D,CAAC,SAAS;AAAA,GACZ;AAEA,EAAA,MAAM,EAAE,KAAA,EAAO,IAAA,EAAK,GAAI,cAAA,CAAe,SAAO,GAAA,CAAI,oBAAA,EAAqB,EAAG,EAAE,CAAA;AAE5E,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,aAAA,CACG,UAAU,EAAE,UAAA,EAAY,wBAAwB,CAAA,CAChD,KAAK,CAAA,IAAA,KAAQ;AACZ,QAAA,cAAA,CAAe,IAAA,CAAK,MAAA,KAAW,eAAA,CAAgB,KAAK,CAAA;AAAA,MACtD,CAAC,CAAA;AACH,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAsB,IAAA,EAAM,mBAAA,IAAuB,EAAC;AAC1D,IAAA,IAAI,MAAM,aAAA,IAAiB,CAAC,UAAU,QAAA,CAAS,IAAA,CAAK,aAAa,CAAA,EAAG;AAClE,MAAA,SAAA,CAAU,IAAA,CAAK,KAAK,aAAa,CAAA;AAAA,IACnC;AACA,IAAA,cAAA,CAAe,UAAA,CAAW,KAAK,CAAC,CAAA,KAAc,UAAU,QAAA,CAAS,CAAC,CAAC,CAAC,CAAA;AAAA,EACtE,GAAG,CAAC,UAAA,EAAY,aAAA,EAAe,cAAA,EAAgB,IAAI,CAAC,CAAA;AAEpD,EAAA,OAAO,EAAE,WAAA,EAAY;AACvB;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useListItemStyles.esm.js","sources":["../../src/hooks/useListItemStyles.ts"],"sourcesContent":["import { makeStyles } from '@material-ui/core';\n\nexport const useListItemStyles = makeStyles(theme => ({\n root: {\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n padding: theme.spacing(1, 2),\n '&:hover': {\n backgroundColor: theme.palette.action.hover,\n },\n textDecoration: 'none',\n color: 'inherit',\n width: '100%',\n '&:first-child': {\n paddingTop: theme.spacing(2),\n },\n },\n}));\n"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"useListItemStyles.esm.js","sources":["../../src/hooks/useListItemStyles.ts"],"sourcesContent":["import { makeStyles } from '@material-ui/core';\n\nexport const useListItemStyles = makeStyles(theme => ({\n root: {\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n padding: theme.spacing(1, 2),\n '&:hover': {\n backgroundColor: theme.palette.action.hover,\n },\n textDecoration: 'none',\n color: 'inherit',\n width: '100%',\n '&:first-child': {\n paddingTop: theme.spacing(2),\n },\n },\n}));\n"],"names":[],"mappings":";;AAEO,MAAM,iBAAA,GAAoB,WAAW,CAAA,KAAA,MAAU;AAAA,EACpD,IAAA,EAAM;AAAA,IACJ,OAAA,EAAS,MAAA;AAAA,IACT,aAAA,EAAe,KAAA;AAAA,IACf,UAAA,EAAY,QAAA;AAAA,IACZ,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,CAAA,EAAG,CAAC,CAAA;AAAA,IAC3B,SAAA,EAAW;AAAA,MACT,eAAA,EAAiB,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO;AAAA,KACxC;AAAA,IACA,cAAA,EAAgB,MAAA;AAAA,IAChB,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO,MAAA;AAAA,IACP,eAAA,EAAiB;AAAA,MACf,UAAA,EAAY,KAAA,CAAM,OAAA,CAAQ,CAAC;AAAA;AAC7B;AAEJ,CAAA,CAAE;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useQetaApi.esm.js","sources":["../../src/hooks/useQetaApi.ts"],"sourcesContent":["import { useApi } from '@backstage/core-plugin-api';\nimport { qetaApiRef } from '../api';\nimport { useAsyncRetry } from 'react-use';\nimport { QetaApi } from '@drodil/backstage-plugin-qeta-common';\n\nexport function useQetaApi<T>(\n f: (api: QetaApi) => Promise<T>,\n deps: any[] = [],\n) {\n const qetaApi = useApi(qetaApiRef);\n\n return useAsyncRetry(async () => {\n return await f(qetaApi);\n }, deps);\n}\n"],"names":[],"mappings":";;;;AAKO,SAAS,
|
|
1
|
+
{"version":3,"file":"useQetaApi.esm.js","sources":["../../src/hooks/useQetaApi.ts"],"sourcesContent":["import { useApi } from '@backstage/core-plugin-api';\nimport { qetaApiRef } from '../api';\nimport { useAsyncRetry } from 'react-use';\nimport { QetaApi } from '@drodil/backstage-plugin-qeta-common';\n\nexport function useQetaApi<T>(\n f: (api: QetaApi) => Promise<T>,\n deps: any[] = [],\n) {\n const qetaApi = useApi(qetaApiRef);\n\n return useAsyncRetry(async () => {\n return await f(qetaApi);\n }, deps);\n}\n"],"names":[],"mappings":";;;;AAKO,SAAS,UAAA,CACd,CAAA,EACA,IAAA,GAAc,EAAC,EACf;AACA,EAAA,MAAM,OAAA,GAAU,OAAO,UAAU,CAAA;AAEjC,EAAA,OAAO,cAAc,YAAY;AAC/B,IAAA,OAAO,MAAM,EAAE,OAAO,CAAA;AAAA,EACxB,GAAG,IAAI,CAAA;AACT;;;;"}
|