@drodil/backstage-plugin-qeta 4.0.5 → 4.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -159,6 +159,35 @@
159
159
  "description": "Collections specific configuration.",
160
160
  "visibility": "frontend"
161
161
  },
162
+ "statistics": {
163
+ "type": "object",
164
+ "properties": {
165
+ "disabled": {
166
+ "type": "boolean",
167
+ "description": "Disable the global statistics page and global statistics endpoints.",
168
+ "visibility": "frontend"
169
+ },
170
+ "users": {
171
+ "type": "object",
172
+ "properties": {
173
+ "disabled": {
174
+ "type": "boolean",
175
+ "description": "Hide user profile statistics, user-directory activity metrics, and activity-based sorting. Prevent access to other users' activity.",
176
+ "visibility": "frontend"
177
+ },
178
+ "lastSeen": {
179
+ "type": "boolean",
180
+ "description": "Include last-seen timestamps in user statistics responses.",
181
+ "visibility": "frontend"
182
+ }
183
+ },
184
+ "description": "User-specific statistics and activity privacy configuration.",
185
+ "visibility": "frontend"
186
+ }
187
+ },
188
+ "description": "Statistics visibility and privacy configuration.",
189
+ "visibility": "frontend"
190
+ },
162
191
  "storage": {
163
192
  "type": "object",
164
193
  "properties": {
@@ -29,6 +29,18 @@ const AskPage = () => {
29
29
  const questionTitle = searchParams.get("title") ?? void 0;
30
30
  const content = searchParams.get("content") ?? void 0;
31
31
  const tags = filterTags(searchParams.get("tags"));
32
+ const hasPrefilledInputs = [
33
+ "entity",
34
+ "entityPage",
35
+ "title",
36
+ "content",
37
+ "tags"
38
+ ].some((param) => searchParams.has(param));
39
+ const requestedTemplateId = searchParams.get("template");
40
+ const requestedTemplate = value?.templates.find(
41
+ (item) => requestedTemplateId !== null && item.id === Number(requestedTemplateId)
42
+ );
43
+ const selectedTemplate = template ?? requestedTemplate;
32
44
  const { t } = useTranslationRef(qetaTranslationRef);
33
45
  let title;
34
46
  if (id) {
@@ -47,7 +59,7 @@ const AskPage = () => {
47
59
  if (loading) {
48
60
  return /* @__PURE__ */ jsx(Box, { role: "status", "aria-label": t("common.loading"), children: /* @__PURE__ */ jsx(Skeleton, { width: "100%", height: 200 }) });
49
61
  }
50
- if (!id && value && value.templates && value.total > 0 && template === void 0) {
62
+ if (!id && value && value.templates && value.total > 0 && template === void 0 && !requestedTemplate && !hasPrefilledInputs) {
51
63
  return /* @__PURE__ */ jsx(Box, { role: "region", "aria-label": t("askPage.templateSelection"), children: /* @__PURE__ */ jsx(
52
64
  SelectTemplateList,
53
65
  {
@@ -85,7 +97,7 @@ const AskPage = () => {
85
97
  entityPage,
86
98
  tags,
87
99
  type: "question",
88
- template,
100
+ template: selectedTemplate,
89
101
  onFormChange: handleFormChange,
90
102
  "aria-label": t("askPage.questionForm"),
91
103
  title: questionTitle,
@@ -1 +1 @@
1
- {"version":3,"file":"AskPage.esm.js","sources":["../../../src/components/AskPage/AskPage.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport { stringifyEntityRef } from '@backstage/catalog-model';\nimport {\n AIAnswerCard,\n PostForm,\n qetaTranslationRef,\n QuestionFormValues,\n SelectTemplateList,\n useAI,\n useQetaApi,\n useQetaConfig,\n useQetaContext,\n} from '@drodil/backstage-plugin-qeta-react';\nimport { useParams, useSearchParams } from 'react-router-dom';\nimport { useEntityPresentation } from '@backstage/plugin-catalog-react';\nimport { filterTags, Template } from '@drodil/backstage-plugin-qeta-common';\nimport { Box, Header, Skeleton } from '@backstage/ui';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\n\nexport const AskPage = () => {\n const { id } = useParams();\n const [searchParams] = useSearchParams();\n const { disabled } = useQetaConfig();\n const { isNewQuestionsEnabled } = useAI();\n const { value, loading } = useQetaApi(api => api.getTemplates());\n const [draft, setDraft] = useState<\n { title: string; content: string } | undefined\n >(undefined);\n const { setDraftQuestion } = useQetaContext();\n\n useEffect(() => {\n return () => {\n setDraftQuestion?.(undefined);\n };\n }, [setDraftQuestion]);\n\n const [template, setTemplate] = useState<Template | null | undefined>(\n undefined,\n );\n\n const entity = searchParams.get('entity') ?? undefined;\n const entityPage = searchParams.get('entityPage') === 'true';\n const questionTitle = searchParams.get('title') ?? undefined;\n const content = searchParams.get('content') ?? undefined;\n const tags = filterTags(searchParams.get('tags'));\n const { t } = useTranslationRef(qetaTranslationRef);\n let title;\n if (id) {\n title = t('askPage.title.existingQuestion');\n } else if (entity) {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const representation = useEntityPresentation(entity);\n title = t('askPage.title.entityQuestion', {\n entity: representation.primaryTitle,\n });\n } else {\n title = t('askPage.title.newQuestion');\n }\n\n if (disabled.questions) {\n return null;\n }\n\n if (loading) {\n return (\n <Box role=\"status\" aria-label={t('common.loading')}>\n <Skeleton width=\"100%\" height={200} />\n </Box>\n );\n }\n\n if (\n !id &&\n value &&\n value.templates &&\n value.total > 0 &&\n template === undefined\n ) {\n return (\n <Box role=\"region\" aria-label={t('askPage.templateSelection')}>\n <SelectTemplateList\n templates={value}\n onTemplateSelect={temp => setTemplate(temp)}\n aria-label={t('askPage.selectTemplate')}\n />\n </Box>\n );\n }\n\n const handleFormChange = (data: QuestionFormValues) => {\n if (setDraftQuestion) {\n setDraftQuestion({\n title: data.title,\n content: data.content,\n tags: data.tags,\n entities: data.entities?.map(stringifyEntityRef),\n });\n }\n if (!isNewQuestionsEnabled) {\n return;\n }\n setDraft({\n title: data.title,\n content: data.content,\n });\n };\n\n return (\n <>\n <Header title={title} />\n <Box>\n <PostForm\n id={id}\n entity={entity}\n entityPage={entityPage}\n tags={tags}\n type=\"question\"\n template={template}\n onFormChange={handleFormChange}\n aria-label={t('askPage.questionForm')}\n title={questionTitle}\n content={content}\n />\n <AIAnswerCard draft={draft} />\n </Box>\n </>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AskPage.esm.js","sources":["../../../src/components/AskPage/AskPage.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport { stringifyEntityRef } from '@backstage/catalog-model';\nimport {\n AIAnswerCard,\n PostForm,\n qetaTranslationRef,\n QuestionFormValues,\n SelectTemplateList,\n useAI,\n useQetaApi,\n useQetaConfig,\n useQetaContext,\n} from '@drodil/backstage-plugin-qeta-react';\nimport { useParams, useSearchParams } from 'react-router-dom';\nimport { useEntityPresentation } from '@backstage/plugin-catalog-react';\nimport { filterTags, Template } from '@drodil/backstage-plugin-qeta-common';\nimport { Box, Header, Skeleton } from '@backstage/ui';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\n\nexport const AskPage = () => {\n const { id } = useParams();\n const [searchParams] = useSearchParams();\n const { disabled } = useQetaConfig();\n const { isNewQuestionsEnabled } = useAI();\n const { value, loading } = useQetaApi(api => api.getTemplates());\n const [draft, setDraft] = useState<\n { title: string; content: string } | undefined\n >(undefined);\n const { setDraftQuestion } = useQetaContext();\n\n useEffect(() => {\n return () => {\n setDraftQuestion?.(undefined);\n };\n }, [setDraftQuestion]);\n\n const [template, setTemplate] = useState<Template | null | undefined>(\n undefined,\n );\n\n const entity = searchParams.get('entity') ?? undefined;\n const entityPage = searchParams.get('entityPage') === 'true';\n const questionTitle = searchParams.get('title') ?? undefined;\n const content = searchParams.get('content') ?? undefined;\n const tags = filterTags(searchParams.get('tags'));\n const hasPrefilledInputs = [\n 'entity',\n 'entityPage',\n 'title',\n 'content',\n 'tags',\n ].some(param => searchParams.has(param));\n const requestedTemplateId = searchParams.get('template');\n const requestedTemplate = value?.templates.find(\n item =>\n requestedTemplateId !== null && item.id === Number(requestedTemplateId),\n );\n const selectedTemplate = template ?? requestedTemplate;\n const { t } = useTranslationRef(qetaTranslationRef);\n let title;\n if (id) {\n title = t('askPage.title.existingQuestion');\n } else if (entity) {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const representation = useEntityPresentation(entity);\n title = t('askPage.title.entityQuestion', {\n entity: representation.primaryTitle,\n });\n } else {\n title = t('askPage.title.newQuestion');\n }\n\n if (disabled.questions) {\n return null;\n }\n\n if (loading) {\n return (\n <Box role=\"status\" aria-label={t('common.loading')}>\n <Skeleton width=\"100%\" height={200} />\n </Box>\n );\n }\n\n if (\n !id &&\n value &&\n value.templates &&\n value.total > 0 &&\n template === undefined &&\n !requestedTemplate &&\n !hasPrefilledInputs\n ) {\n return (\n <Box role=\"region\" aria-label={t('askPage.templateSelection')}>\n <SelectTemplateList\n templates={value}\n onTemplateSelect={temp => setTemplate(temp)}\n aria-label={t('askPage.selectTemplate')}\n />\n </Box>\n );\n }\n\n const handleFormChange = (data: QuestionFormValues) => {\n if (setDraftQuestion) {\n setDraftQuestion({\n title: data.title,\n content: data.content,\n tags: data.tags,\n entities: data.entities?.map(stringifyEntityRef),\n });\n }\n if (!isNewQuestionsEnabled) {\n return;\n }\n setDraft({\n title: data.title,\n content: data.content,\n });\n };\n\n return (\n <>\n <Header title={title} />\n <Box>\n <PostForm\n id={id}\n entity={entity}\n entityPage={entityPage}\n tags={tags}\n type=\"question\"\n template={selectedTemplate}\n onFormChange={handleFormChange}\n aria-label={t('askPage.questionForm')}\n title={questionTitle}\n content={content}\n />\n <AIAnswerCard draft={draft} />\n </Box>\n </>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -145,7 +145,7 @@ const QetaPage = (props) => {
145
145
  ] }),
146
146
  /* @__PURE__ */ jsx(Route, { path: usersRouteRef.path, element: /* @__PURE__ */ jsx(UsersPage, {}) }),
147
147
  /* @__PURE__ */ jsx(Route, { path: userRouteRef.path, element: /* @__PURE__ */ jsx(UserPage, {}) }),
148
- /* @__PURE__ */ jsx(
148
+ !disabled.statistics && /* @__PURE__ */ jsx(
149
149
  Route,
150
150
  {
151
151
  path: statisticsRouteRef.path,
@@ -1 +1 @@
1
- {"version":3,"file":"QetaPage.esm.js","sources":["../../../src/components/QetaPage/QetaPage.tsx"],"sourcesContent":["import { ReactNode } from 'react';\nimport { Content, Page } from '@backstage/core-components';\nimport { Route, Routes, useLocation } from 'react-router-dom';\nimport { AskPage } from '../AskPage';\nimport { QuestionPage } from '../QuestionPage/QuestionPage';\nimport { TagPage } from '../TagPage/TagPage';\nimport { UserPage } from '../UserPage/UserPage';\nimport { FavoritePage } from '../FavoritePage/FavoritePage';\nimport { StatisticsPage } from '../Statistics';\nimport {\n articleRouteRef,\n articlesRouteRef,\n askRouteRef,\n collectionCreateRouteRef,\n collectionEditRouteRef,\n collectionRouteRef,\n collectionsRouteRef,\n createLinkRouteRef,\n editArticleRouteRef,\n editLinkRouteRef,\n editQuestionRouteRef,\n entitiesRouteRef,\n entityRouteRef,\n favoriteQuestionsRouteRef,\n LeftMenu,\n LeftMenuButton,\n linkRouteRef,\n linksRouteRef,\n moderatorRouteRef,\n QetaProvider,\n questionRouteRef,\n questionsRouteRef,\n reviewRouteRef,\n settingsRouteRef,\n statisticsRouteRef,\n tagRouteRef,\n tagsRouteRef,\n userRouteRef,\n usersRouteRef,\n writeRouteRef,\n useQetaConfig,\n} from '@drodil/backstage-plugin-qeta-react';\nimport { QuestionsPage } from '../QuestionsPage/QuestionsPage';\nimport { HomePage } from '../HomePage/HomePage';\nimport { ArticlesPage } from '../ArticlesPage/ArticlesPage';\nimport { WritePage } from '../WritePage/WritePage';\nimport { ArticlePage } from '../ArticlePage/ArticlePage';\nimport { LinksPage } from '../LinksPage/LinksPage';\nimport { LinkPage } from '../LinkPage/LinkPage';\nimport { CreateLinkPage } from '../CreateLinkPage/CreateLinkPage';\nimport { CollectionsPage } from '../CollectionsPage/CollectionsPage';\nimport { CollectionPage } from '../CollectionPage/CollectionPage';\nimport { CollectionCreatePage } from '../CollectionCreatePage/CollectionCreatePage';\nimport { EntityPage } from '../EntityPage/EntityPage';\nimport { UsersPage } from '../UsersPage/UsersPage';\nimport { ModeratorPage } from '../ModeratorPage/ModeratorPage';\nimport { ReviewPage } from '../ReviewPage/ReviewPage';\nimport { SettingsPage } from '../SettingsPage/SettingsPage';\nimport { Box, useBreakpoint } from '@backstage/ui';\nimport { useSidebarSettings } from '../../hooks/useSidebarSettings';\nimport { RightContent } from '../RightContent/RightContent';\nimport type { PluggableList } from 'unified';\nimport styles from './QetaPage.module.css';\n\ntype Props = {\n themeId?: string;\n introElement?: ReactNode;\n remarkPlugins?: PluggableList;\n rehypePlugins?: PluggableList;\n};\n\nexport const QetaPage = (props?: Props) => {\n const {\n themeId = 'tool',\n introElement,\n remarkPlugins,\n rehypePlugins,\n } = props ?? {};\n const { leftCompact, rightCompact, toggleLeft, toggleRight } =\n useSidebarSettings();\n const { disabled } = useQetaConfig();\n const location = useLocation();\n const { down } = useBreakpoint();\n const isSmallScreen = down('lg');\n\n // Hide right sidebar on review and moderator pages\n const hideRightSidebar =\n location.pathname.includes('/review') ||\n location.pathname.includes('/moderate');\n\n return (\n <QetaProvider remarkPlugins={remarkPlugins} rehypePlugins={rehypePlugins}>\n <Page themeId={themeId}>\n <Content className=\"qetaHomePage\">\n {introElement}\n <Box className={styles.container}>\n <Box className={styles.row}>\n <Box\n className={`${styles.sidebarColumn} ${\n leftCompact ? styles.sidebarColumnCompact : ''\n }`}\n >\n {isSmallScreen ? (\n <LeftMenuButton />\n ) : (\n <LeftMenu compact={leftCompact} onToggle={toggleLeft} />\n )}\n </Box>\n <Box className={styles.mainColumn}>\n <Routes>\n <Route path=\"/\" element={<HomePage />} />\n {!disabled.questions && (\n <>\n <Route\n path={questionsRouteRef.path}\n element={<QuestionsPage />}\n />\n <Route path={askRouteRef.path} element={<AskPage />} />\n <Route\n path={editQuestionRouteRef.path}\n element={<AskPage />}\n />\n <Route\n path={questionRouteRef.path}\n element={<QuestionPage />}\n />\n </>\n )}\n {!disabled.articles && (\n <>\n <Route\n path={articlesRouteRef.path}\n element={<ArticlesPage />}\n />\n <Route\n path={writeRouteRef.path}\n element={<WritePage />}\n />\n <Route\n path={editArticleRouteRef.path}\n element={<WritePage />}\n />\n <Route\n path={articleRouteRef.path}\n element={<ArticlePage />}\n />\n </>\n )}\n {!disabled.links && (\n <>\n <Route\n path={linksRouteRef.path}\n element={<LinksPage />}\n />\n <Route\n path={createLinkRouteRef.path}\n element={<CreateLinkPage />}\n />\n <Route\n path={editLinkRouteRef.path}\n element={<CreateLinkPage />}\n />\n <Route path={linkRouteRef.path} element={<LinkPage />} />\n </>\n )}\n <Route\n path={favoriteQuestionsRouteRef.path}\n element={<FavoritePage />}\n />\n {!disabled.tags && (\n <>\n <Route path={tagsRouteRef.path} element={<TagPage />} />\n <Route path={tagRouteRef.path} element={<TagPage />} />\n </>\n )}\n <Route path={usersRouteRef.path} element={<UsersPage />} />\n <Route path={userRouteRef.path} element={<UserPage />} />\n <Route\n path={statisticsRouteRef.path}\n element={<StatisticsPage />}\n />\n {!disabled.collections && (\n <>\n <Route\n path={collectionsRouteRef.path}\n element={<CollectionsPage />}\n />\n <Route\n path={collectionCreateRouteRef.path}\n element={<CollectionCreatePage />}\n />\n <Route\n path={collectionEditRouteRef.path}\n element={<CollectionCreatePage />}\n />\n <Route\n path={collectionRouteRef.path}\n element={<CollectionPage />}\n />\n </>\n )}\n {!disabled.entities && (\n <>\n <Route\n path={entitiesRouteRef.path}\n element={<EntityPage />}\n />\n <Route\n path={entityRouteRef.path}\n element={<EntityPage />}\n />\n </>\n )}\n <Route\n path={moderatorRouteRef.path}\n element={<ModeratorPage />}\n />\n <Route path={reviewRouteRef.path} element={<ReviewPage />} />\n <Route\n path={settingsRouteRef.path}\n element={<SettingsPage />}\n />\n </Routes>\n </Box>\n {!hideRightSidebar && (\n <Box\n className={`${styles.rightSidebarColumn} ${\n rightCompact ? styles.rightSidebarColumnCompact : ''\n }`}\n >\n <RightContent compact={rightCompact} onToggle={toggleRight} />\n </Box>\n )}\n </Box>\n </Box>\n </Content>\n </Page>\n </QetaProvider>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"QetaPage.esm.js","sources":["../../../src/components/QetaPage/QetaPage.tsx"],"sourcesContent":["import { ReactNode } from 'react';\nimport { Content, Page } from '@backstage/core-components';\nimport { Route, Routes, useLocation } from 'react-router-dom';\nimport { AskPage } from '../AskPage';\nimport { QuestionPage } from '../QuestionPage/QuestionPage';\nimport { TagPage } from '../TagPage/TagPage';\nimport { UserPage } from '../UserPage/UserPage';\nimport { FavoritePage } from '../FavoritePage/FavoritePage';\nimport { StatisticsPage } from '../Statistics';\nimport {\n articleRouteRef,\n articlesRouteRef,\n askRouteRef,\n collectionCreateRouteRef,\n collectionEditRouteRef,\n collectionRouteRef,\n collectionsRouteRef,\n createLinkRouteRef,\n editArticleRouteRef,\n editLinkRouteRef,\n editQuestionRouteRef,\n entitiesRouteRef,\n entityRouteRef,\n favoriteQuestionsRouteRef,\n LeftMenu,\n LeftMenuButton,\n linkRouteRef,\n linksRouteRef,\n moderatorRouteRef,\n QetaProvider,\n questionRouteRef,\n questionsRouteRef,\n reviewRouteRef,\n settingsRouteRef,\n statisticsRouteRef,\n tagRouteRef,\n tagsRouteRef,\n userRouteRef,\n usersRouteRef,\n writeRouteRef,\n useQetaConfig,\n} from '@drodil/backstage-plugin-qeta-react';\nimport { QuestionsPage } from '../QuestionsPage/QuestionsPage';\nimport { HomePage } from '../HomePage/HomePage';\nimport { ArticlesPage } from '../ArticlesPage/ArticlesPage';\nimport { WritePage } from '../WritePage/WritePage';\nimport { ArticlePage } from '../ArticlePage/ArticlePage';\nimport { LinksPage } from '../LinksPage/LinksPage';\nimport { LinkPage } from '../LinkPage/LinkPage';\nimport { CreateLinkPage } from '../CreateLinkPage/CreateLinkPage';\nimport { CollectionsPage } from '../CollectionsPage/CollectionsPage';\nimport { CollectionPage } from '../CollectionPage/CollectionPage';\nimport { CollectionCreatePage } from '../CollectionCreatePage/CollectionCreatePage';\nimport { EntityPage } from '../EntityPage/EntityPage';\nimport { UsersPage } from '../UsersPage/UsersPage';\nimport { ModeratorPage } from '../ModeratorPage/ModeratorPage';\nimport { ReviewPage } from '../ReviewPage/ReviewPage';\nimport { SettingsPage } from '../SettingsPage/SettingsPage';\nimport { Box, useBreakpoint } from '@backstage/ui';\nimport { useSidebarSettings } from '../../hooks/useSidebarSettings';\nimport { RightContent } from '../RightContent/RightContent';\nimport type { PluggableList } from 'unified';\nimport styles from './QetaPage.module.css';\n\ntype Props = {\n themeId?: string;\n introElement?: ReactNode;\n remarkPlugins?: PluggableList;\n rehypePlugins?: PluggableList;\n};\n\nexport const QetaPage = (props?: Props) => {\n const {\n themeId = 'tool',\n introElement,\n remarkPlugins,\n rehypePlugins,\n } = props ?? {};\n const { leftCompact, rightCompact, toggleLeft, toggleRight } =\n useSidebarSettings();\n const { disabled } = useQetaConfig();\n const location = useLocation();\n const { down } = useBreakpoint();\n const isSmallScreen = down('lg');\n\n // Hide right sidebar on review and moderator pages\n const hideRightSidebar =\n location.pathname.includes('/review') ||\n location.pathname.includes('/moderate');\n\n return (\n <QetaProvider remarkPlugins={remarkPlugins} rehypePlugins={rehypePlugins}>\n <Page themeId={themeId}>\n <Content className=\"qetaHomePage\">\n {introElement}\n <Box className={styles.container}>\n <Box className={styles.row}>\n <Box\n className={`${styles.sidebarColumn} ${\n leftCompact ? styles.sidebarColumnCompact : ''\n }`}\n >\n {isSmallScreen ? (\n <LeftMenuButton />\n ) : (\n <LeftMenu compact={leftCompact} onToggle={toggleLeft} />\n )}\n </Box>\n <Box className={styles.mainColumn}>\n <Routes>\n <Route path=\"/\" element={<HomePage />} />\n {!disabled.questions && (\n <>\n <Route\n path={questionsRouteRef.path}\n element={<QuestionsPage />}\n />\n <Route path={askRouteRef.path} element={<AskPage />} />\n <Route\n path={editQuestionRouteRef.path}\n element={<AskPage />}\n />\n <Route\n path={questionRouteRef.path}\n element={<QuestionPage />}\n />\n </>\n )}\n {!disabled.articles && (\n <>\n <Route\n path={articlesRouteRef.path}\n element={<ArticlesPage />}\n />\n <Route\n path={writeRouteRef.path}\n element={<WritePage />}\n />\n <Route\n path={editArticleRouteRef.path}\n element={<WritePage />}\n />\n <Route\n path={articleRouteRef.path}\n element={<ArticlePage />}\n />\n </>\n )}\n {!disabled.links && (\n <>\n <Route\n path={linksRouteRef.path}\n element={<LinksPage />}\n />\n <Route\n path={createLinkRouteRef.path}\n element={<CreateLinkPage />}\n />\n <Route\n path={editLinkRouteRef.path}\n element={<CreateLinkPage />}\n />\n <Route path={linkRouteRef.path} element={<LinkPage />} />\n </>\n )}\n <Route\n path={favoriteQuestionsRouteRef.path}\n element={<FavoritePage />}\n />\n {!disabled.tags && (\n <>\n <Route path={tagsRouteRef.path} element={<TagPage />} />\n <Route path={tagRouteRef.path} element={<TagPage />} />\n </>\n )}\n <Route path={usersRouteRef.path} element={<UsersPage />} />\n <Route path={userRouteRef.path} element={<UserPage />} />\n {!disabled.statistics && (\n <Route\n path={statisticsRouteRef.path}\n element={<StatisticsPage />}\n />\n )}\n {!disabled.collections && (\n <>\n <Route\n path={collectionsRouteRef.path}\n element={<CollectionsPage />}\n />\n <Route\n path={collectionCreateRouteRef.path}\n element={<CollectionCreatePage />}\n />\n <Route\n path={collectionEditRouteRef.path}\n element={<CollectionCreatePage />}\n />\n <Route\n path={collectionRouteRef.path}\n element={<CollectionPage />}\n />\n </>\n )}\n {!disabled.entities && (\n <>\n <Route\n path={entitiesRouteRef.path}\n element={<EntityPage />}\n />\n <Route\n path={entityRouteRef.path}\n element={<EntityPage />}\n />\n </>\n )}\n <Route\n path={moderatorRouteRef.path}\n element={<ModeratorPage />}\n />\n <Route path={reviewRouteRef.path} element={<ReviewPage />} />\n <Route\n path={settingsRouteRef.path}\n element={<SettingsPage />}\n />\n </Routes>\n </Box>\n {!hideRightSidebar && (\n <Box\n className={`${styles.rightSidebarColumn} ${\n rightCompact ? styles.rightSidebarColumnCompact : ''\n }`}\n >\n <RightContent compact={rightCompact} onToggle={toggleRight} />\n </Box>\n )}\n </Box>\n </Box>\n </Content>\n </Page>\n </QetaProvider>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -6,7 +6,6 @@ import { HighlightedSearchResultText } from '@backstage/plugin-search-react';
6
6
  import { selectByPostType, truncate, removeMarkdownFormatting } from '@drodil/backstage-plugin-qeta-common';
7
7
  import { EntityRefLink } from '@backstage/plugin-catalog-react';
8
8
  import DOMPurify from 'dompurify';
9
- import { capitalize } from 'lodash';
10
9
  import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
11
10
  import { qetaTranslationRef } from '@drodil/backstage-plugin-qeta-react';
12
11
  import { parseEntityRef } from '@backstage/catalog-model';
@@ -44,7 +43,7 @@ const Excerpt = (props) => {
44
43
  variant: "body-small",
45
44
  color: "secondary",
46
45
  children: [
47
- capitalize(t(`common.${document.postType}`)),
46
+ t(`common.${document.postType}`).charAt(0).toLocaleUpperCase() + t(`common.${document.postType}`).slice(1).toLocaleLowerCase(),
48
47
  " \xB7 ",
49
48
  t("searchResult.created"),
50
49
  " ",
@@ -87,7 +86,7 @@ const Excerpt = (props) => {
87
86
  variant: "body-small",
88
87
  color: "secondary",
89
88
  children: [
90
- capitalize(t(`common.collection`)),
89
+ t("common.collection").charAt(0).toLocaleUpperCase() + t("common.collection").slice(1).toLocaleLowerCase(),
91
90
  " \xB7 ",
92
91
  t("searchResult.created"),
93
92
  " ",
@@ -1 +1 @@
1
- {"version":3,"file":"QetaSearchResultListItem.esm.js","sources":["../../../src/components/QetaSearchResultListItem/QetaSearchResultListItem.tsx"],"sourcesContent":["import { DateTime } from 'luxon';\nimport { Link } from 'react-router-dom';\nimport { Text } from '@backstage/ui';\nimport {\n IndexableDocument,\n ResultHighlight,\n} from '@backstage/plugin-search-common';\nimport { HighlightedSearchResultText } from '@backstage/plugin-search-react';\nimport {\n QetaCollectionDocument,\n QetaPostDocument,\n QetaSearchDocument,\n removeMarkdownFormatting,\n selectByPostType,\n truncate,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { EntityRefLink } from '@backstage/plugin-catalog-react';\nimport DOMPurify from 'dompurify';\nimport { capitalize } from 'lodash';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '@drodil/backstage-plugin-qeta-react';\nimport { parseEntityRef } from '@backstage/catalog-model';\nimport {\n RiBookOpenLine,\n RiLink,\n RiPlayList2Line,\n RiQuestionLine,\n} from '@remixicon/react';\nimport styles from './QetaSearchResultListItem.module.css';\n\nexport type QetaSearchResultListItemProps = {\n result?: IndexableDocument;\n highlight?: ResultHighlight;\n rank?: number;\n hideIcon?: boolean;\n};\n\nconst isQetaSearchDocument = (\n document: IndexableDocument,\n): document is QetaSearchDocument => {\n return (\n 'docType' in document &&\n (document.docType === 'qeta_post' || document.docType === 'qeta_collection')\n );\n};\n\nconst isQetaPostDocument = (\n document: QetaSearchDocument,\n): document is QetaPostDocument => {\n return document.docType === 'qeta_post';\n};\n\nconst isQetaCollectionDocument = (\n document: QetaSearchDocument,\n): document is QetaCollectionDocument => {\n return document.docType === 'qeta_collection';\n};\n\nconst Excerpt = (props: {\n document: QetaSearchDocument;\n highlight?: ResultHighlight;\n}) => {\n const { document, highlight } = props;\n const { t } = useTranslationRef(qetaTranslationRef);\n\n const text = DOMPurify.sanitize(\n truncate(\n removeMarkdownFormatting(highlight?.fields.text ?? document.text),\n 300,\n ),\n );\n\n if (isQetaPostDocument(document)) {\n const authorEntity = parseEntityRef(document.author, {\n defaultKind: 'user',\n defaultNamespace: 'default',\n });\n return (\n <>\n <Text\n className={styles.excerptMeta}\n variant=\"body-small\"\n color=\"secondary\"\n >\n {capitalize(t(`common.${document.postType}`))}\n {' · '}\n {t('searchResult.created')}{' '}\n {DateTime.fromISO(document.created.toString() as string).toRelative()}\n {' · '}\n <EntityRefLink entityRef={authorEntity} hideIcon />\n {document.postType !== 'link' && (\n <>\n {' · '}\n {t('common.score', { score: document.score.toString(10) })}\n </>\n )}\n {' · '}\n {document.postType === 'link' &&\n t('common.clicksCount', { count: document.views })}\n {document.postType !== 'link' &&\n t('common.viewsShort', { count: document.views })}\n {document.postType !== 'link' && (\n <>\n {' · '}\n {t('common.answersCount', { count: document.answerCount })}\n </>\n )}\n </Text>\n <>\n {highlight?.fields.text ? (\n <HighlightedSearchResultText\n text={text}\n preTag={highlight.preTag}\n postTag={highlight.postTag}\n />\n ) : (\n text\n )}\n </>\n </>\n );\n } else if (isQetaCollectionDocument(document)) {\n const ownerEntity = parseEntityRef(document.owner, {\n defaultKind: 'user',\n defaultNamespace: 'default',\n });\n return (\n <>\n <Text\n className={styles.excerptMeta}\n variant=\"body-small\"\n color=\"secondary\"\n >\n {capitalize(t(`common.collection`))}\n {' · '}\n {t('searchResult.created')}{' '}\n {DateTime.fromISO(document.created.toString() as string).toRelative()}\n {' · '}\n <EntityRefLink entityRef={ownerEntity} hideIcon />\n {' · '}\n {t('common.posts', {\n count: document.postsCount,\n itemType: t('common.post'),\n })}\n </Text>\n <>\n {highlight?.fields.text ? (\n <HighlightedSearchResultText\n text={text}\n preTag={highlight.preTag}\n postTag={highlight.postTag}\n />\n ) : (\n text\n )}\n </>\n </>\n );\n }\n\n return null;\n};\n\nconst ResultIcon = (props: { document: QetaSearchDocument }) => {\n const { document } = props;\n if (isQetaPostDocument(document)) {\n return selectByPostType(\n document.postType,\n <RiQuestionLine size={20} />,\n <RiBookOpenLine size={20} />,\n <RiLink size={20} />,\n );\n }\n\n return <RiPlayList2Line size={20} />;\n};\n\nexport const QetaSearchResultListItem = (\n props: QetaSearchResultListItemProps,\n) => {\n const { result, highlight, hideIcon } = props;\n\n if (!result || !isQetaSearchDocument(result)) {\n return null;\n }\n\n const title = (\n <Link to={result.location}>\n {highlight?.fields.title ? (\n <HighlightedSearchResultText\n text={highlight.fields.title}\n preTag={highlight.preTag}\n postTag={highlight.postTag}\n />\n ) : (\n result.title\n )}\n </Link>\n );\n\n return (\n <>\n <article\n className={styles.resultItem}\n aria-labelledby={`search-result-${result.title}`}\n >\n {hideIcon !== true && (\n <span className={styles.resultIcon}>\n <ResultIcon document={result} aria-hidden=\"true\" />\n </span>\n )}\n <div className={styles.itemText}>\n <h3 id={`search-result-${result.title}`} className={styles.title}>\n {title}\n </h3>\n <div className={styles.excerpt}>\n <Excerpt document={result} highlight={highlight} />\n </div>\n </div>\n </article>\n\n <hr className={styles.divider} aria-hidden=\"true\" />\n </>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"QetaSearchResultListItem.esm.js","sources":["../../../src/components/QetaSearchResultListItem/QetaSearchResultListItem.tsx"],"sourcesContent":["import { DateTime } from 'luxon';\nimport { Link } from 'react-router-dom';\nimport { Text } from '@backstage/ui';\nimport {\n IndexableDocument,\n ResultHighlight,\n} from '@backstage/plugin-search-common';\nimport { HighlightedSearchResultText } from '@backstage/plugin-search-react';\nimport {\n QetaCollectionDocument,\n QetaPostDocument,\n QetaSearchDocument,\n removeMarkdownFormatting,\n selectByPostType,\n truncate,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { EntityRefLink } from '@backstage/plugin-catalog-react';\nimport DOMPurify from 'dompurify';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '@drodil/backstage-plugin-qeta-react';\nimport { parseEntityRef } from '@backstage/catalog-model';\nimport {\n RiBookOpenLine,\n RiLink,\n RiPlayList2Line,\n RiQuestionLine,\n} from '@remixicon/react';\nimport styles from './QetaSearchResultListItem.module.css';\n\nexport type QetaSearchResultListItemProps = {\n result?: IndexableDocument;\n highlight?: ResultHighlight;\n rank?: number;\n hideIcon?: boolean;\n};\n\nconst isQetaSearchDocument = (\n document: IndexableDocument,\n): document is QetaSearchDocument => {\n return (\n 'docType' in document &&\n (document.docType === 'qeta_post' || document.docType === 'qeta_collection')\n );\n};\n\nconst isQetaPostDocument = (\n document: QetaSearchDocument,\n): document is QetaPostDocument => {\n return document.docType === 'qeta_post';\n};\n\nconst isQetaCollectionDocument = (\n document: QetaSearchDocument,\n): document is QetaCollectionDocument => {\n return document.docType === 'qeta_collection';\n};\n\nconst Excerpt = (props: {\n document: QetaSearchDocument;\n highlight?: ResultHighlight;\n}) => {\n const { document, highlight } = props;\n const { t } = useTranslationRef(qetaTranslationRef);\n\n const text = DOMPurify.sanitize(\n truncate(\n removeMarkdownFormatting(highlight?.fields.text ?? document.text),\n 300,\n ),\n );\n\n if (isQetaPostDocument(document)) {\n const authorEntity = parseEntityRef(document.author, {\n defaultKind: 'user',\n defaultNamespace: 'default',\n });\n return (\n <>\n <Text\n className={styles.excerptMeta}\n variant=\"body-small\"\n color=\"secondary\"\n >\n {t(`common.${document.postType}`).charAt(0).toLocaleUpperCase() +\n t(`common.${document.postType}`).slice(1).toLocaleLowerCase()}\n {' · '}\n {t('searchResult.created')}{' '}\n {DateTime.fromISO(document.created.toString() as string).toRelative()}\n {' · '}\n <EntityRefLink entityRef={authorEntity} hideIcon />\n {document.postType !== 'link' && (\n <>\n {' · '}\n {t('common.score', { score: document.score.toString(10) })}\n </>\n )}\n {' · '}\n {document.postType === 'link' &&\n t('common.clicksCount', { count: document.views })}\n {document.postType !== 'link' &&\n t('common.viewsShort', { count: document.views })}\n {document.postType !== 'link' && (\n <>\n {' · '}\n {t('common.answersCount', { count: document.answerCount })}\n </>\n )}\n </Text>\n <>\n {highlight?.fields.text ? (\n <HighlightedSearchResultText\n text={text}\n preTag={highlight.preTag}\n postTag={highlight.postTag}\n />\n ) : (\n text\n )}\n </>\n </>\n );\n } else if (isQetaCollectionDocument(document)) {\n const ownerEntity = parseEntityRef(document.owner, {\n defaultKind: 'user',\n defaultNamespace: 'default',\n });\n return (\n <>\n <Text\n className={styles.excerptMeta}\n variant=\"body-small\"\n color=\"secondary\"\n >\n {t('common.collection').charAt(0).toLocaleUpperCase() +\n t('common.collection').slice(1).toLocaleLowerCase()}\n {' · '}\n {t('searchResult.created')}{' '}\n {DateTime.fromISO(document.created.toString() as string).toRelative()}\n {' · '}\n <EntityRefLink entityRef={ownerEntity} hideIcon />\n {' · '}\n {t('common.posts', {\n count: document.postsCount,\n itemType: t('common.post'),\n })}\n </Text>\n <>\n {highlight?.fields.text ? (\n <HighlightedSearchResultText\n text={text}\n preTag={highlight.preTag}\n postTag={highlight.postTag}\n />\n ) : (\n text\n )}\n </>\n </>\n );\n }\n\n return null;\n};\n\nconst ResultIcon = (props: { document: QetaSearchDocument }) => {\n const { document } = props;\n if (isQetaPostDocument(document)) {\n return selectByPostType(\n document.postType,\n <RiQuestionLine size={20} />,\n <RiBookOpenLine size={20} />,\n <RiLink size={20} />,\n );\n }\n\n return <RiPlayList2Line size={20} />;\n};\n\nexport const QetaSearchResultListItem = (\n props: QetaSearchResultListItemProps,\n) => {\n const { result, highlight, hideIcon } = props;\n\n if (!result || !isQetaSearchDocument(result)) {\n return null;\n }\n\n const title = (\n <Link to={result.location}>\n {highlight?.fields.title ? (\n <HighlightedSearchResultText\n text={highlight.fields.title}\n preTag={highlight.preTag}\n postTag={highlight.postTag}\n />\n ) : (\n result.title\n )}\n </Link>\n );\n\n return (\n <>\n <article\n className={styles.resultItem}\n aria-labelledby={`search-result-${result.title}`}\n >\n {hideIcon !== true && (\n <span className={styles.resultIcon}>\n <ResultIcon document={result} aria-hidden=\"true\" />\n </span>\n )}\n <div className={styles.itemText}>\n <h3 id={`search-result-${result.title}`} className={styles.title}>\n {title}\n </h3>\n <div className={styles.excerpt}>\n <Excerpt document={result} highlight={highlight} />\n </div>\n </div>\n </article>\n\n <hr className={styles.divider} aria-hidden=\"true\" />\n </>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -15,15 +15,16 @@ const UserPage = () => {
15
15
  const [tab, setTab] = useState("statistics");
16
16
  const { t } = useTranslationRef(qetaTranslationRef);
17
17
  const [_searchParams, setSearchParams] = useSearchParams();
18
- const { disabled } = useQetaConfig();
18
+ const { disabled, showLastSeen } = useQetaConfig();
19
19
  const {
20
20
  value: currentUser,
21
21
  loading: loadingUser,
22
22
  error: userError
23
23
  } = useIdentityApi((api) => api.getBackstageIdentity(), []);
24
+ const canReadUserStats = !disabled.userStatistics || currentUser?.userEntityRef === identity;
24
25
  const { value: userStats, loading: loadingUserStats } = useQetaApi(
25
- (api) => api.getUserStats(identity),
26
- [identity]
26
+ (api) => canReadUserStats ? api.getUserStats(identity) : Promise.resolve(void 0),
27
+ [identity, canReadUserStats]
27
28
  );
28
29
  const handleChange = (newValue) => {
29
30
  setSearchParams({});
@@ -31,7 +32,7 @@ const UserPage = () => {
31
32
  };
32
33
  const availableTabs = useMemo(() => {
33
34
  return [
34
- "statistics",
35
+ !disabled.userStatistics ? "statistics" : null,
35
36
  !disabled.questions ? "questions" : null,
36
37
  !disabled.articles ? "articles" : null,
37
38
  !disabled.links ? "links" : null,
@@ -49,13 +50,13 @@ const UserPage = () => {
49
50
  /* @__PURE__ */ jsx("span", { children: label })
50
51
  ] });
51
52
  const tabItems = [
52
- /* @__PURE__ */ jsx(Tab, { id: "statistics", children: /* @__PURE__ */ jsx(
53
+ !disabled.userStatistics ? /* @__PURE__ */ jsx(Tab, { id: "statistics", children: /* @__PURE__ */ jsx(
53
54
  TabLabel,
54
55
  {
55
56
  icon: /* @__PURE__ */ jsx(RiBarChartLine, { size: 16 }),
56
57
  label: t("userPage.statistics", {})
57
58
  }
58
- ) }, "statistics"),
59
+ ) }, "statistics") : null,
59
60
  !disabled.questions ? /* @__PURE__ */ jsx(Tab, { id: "questions", children: /* @__PURE__ */ jsx(
60
61
  TabLabel,
61
62
  {
@@ -98,7 +99,7 @@ const UserPage = () => {
98
99
  value: /* @__PURE__ */ jsx(EntityRefLink, { entityRef: identity, children: secondaryTitle || user?.spec?.profile?.email })
99
100
  }
100
101
  ] : [],
101
- ...userStats?.summary?.lastSeen ? [
102
+ ...showLastSeen && userStats?.summary?.lastSeen ? [
102
103
  {
103
104
  label: t("stats.lastSeen"),
104
105
  value: /* @__PURE__ */ jsx(
@@ -132,7 +133,7 @@ const UserPage = () => {
132
133
  onSelectionChange: (key) => handleChange(key),
133
134
  children: [
134
135
  /* @__PURE__ */ jsx(TabList, { "aria-label": t("userPage.profileTab", {}), children: tabItems }),
135
- /* @__PURE__ */ jsx(TabPanel, { id: "statistics", className: styles.tabPanel, children: /* @__PURE__ */ jsx(
136
+ !disabled.userStatistics && /* @__PURE__ */ jsx(TabPanel, { id: "statistics", className: styles.tabPanel, children: /* @__PURE__ */ jsx(
136
137
  UserStatsContent,
137
138
  {
138
139
  userRef: identity ?? "",
@@ -1 +1 @@
1
- {"version":3,"file":"UserPage.esm.js","sources":["../../../src/components/UserPage/UserPage.tsx"],"sourcesContent":["import { ReactElement, ReactNode, useEffect, useMemo, useState } from 'react';\nimport { useParams, useSearchParams } from 'react-router-dom';\nimport {\n AnswersContainer,\n CollectionsContainer,\n PostsContainer,\n qetaTranslationRef,\n RelativeTimeWithTooltip,\n useIdentityApi,\n useQetaApi,\n useQetaConfig,\n UserFollowButton,\n useUserInfo,\n} from '@drodil/backstage-plugin-qeta-react';\nimport { UserStatsContent } from './UserStatsContent';\nimport { Flex, Header, Tab, TabList, TabPanel, Tabs } from '@backstage/ui';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport {\n RiBarChartLine,\n RiBookmarkLine,\n RiLink,\n RiQuestionAnswerLine,\n RiQuestionLine,\n RiStackLine,\n} from '@remixicon/react';\nimport styles from './UserPage.module.css';\nimport { EntityRefLink } from '@backstage/plugin-catalog-react';\n\nexport const UserPage = () => {\n const identity = useParams()['*'] ?? 'unknown';\n const { name, user, secondaryTitle } = useUserInfo(identity);\n const [tab, setTab] = useState('statistics');\n const { t } = useTranslationRef(qetaTranslationRef);\n const [_searchParams, setSearchParams] = useSearchParams();\n const { disabled } = useQetaConfig();\n const {\n value: currentUser,\n loading: loadingUser,\n error: userError,\n } = useIdentityApi(api => api.getBackstageIdentity(), []);\n const { value: userStats, loading: loadingUserStats } = useQetaApi(\n api => api.getUserStats(identity),\n [identity],\n );\n\n const handleChange = (newValue: string) => {\n setSearchParams({});\n setTab(newValue);\n };\n\n const availableTabs = useMemo(() => {\n return [\n 'statistics',\n !disabled.questions ? 'questions' : null,\n !disabled.articles ? 'articles' : null,\n !disabled.links ? 'links' : null,\n !disabled.collections ? 'collections' : null,\n !disabled.questions ? 'answers' : null,\n ].filter((v): v is string => Boolean(v));\n }, [disabled]);\n\n useEffect(() => {\n if (!availableTabs.includes(tab)) {\n setTab(availableTabs[0]);\n }\n }, [availableTabs, tab]);\n\n const TabLabel = ({ icon, label }: { icon: ReactNode; label: string }) => (\n <Flex align=\"center\" gap=\"2\" className={styles.tabLabel}>\n {icon}\n <span>{label}</span>\n </Flex>\n );\n\n const tabItems = [\n <Tab key=\"statistics\" id=\"statistics\">\n <TabLabel\n icon={<RiBarChartLine size={16} />}\n label={t('userPage.statistics', {})}\n />\n </Tab>,\n !disabled.questions ? (\n <Tab key=\"questions\" id=\"questions\">\n <TabLabel\n icon={<RiQuestionLine size={16} />}\n label={t('userPage.questions', {})}\n />\n </Tab>\n ) : null,\n !disabled.articles ? (\n <Tab key=\"articles\" id=\"articles\">\n <TabLabel\n icon={<RiBookmarkLine size={16} />}\n label={t('userPage.articles', {})}\n />\n </Tab>\n ) : null,\n !disabled.links ? (\n <Tab key=\"links\" id=\"links\">\n <TabLabel icon={<RiLink size={16} />} label={t('userPage.links', {})} />\n </Tab>\n ) : null,\n !disabled.collections ? (\n <Tab key=\"collections\" id=\"collections\">\n <TabLabel\n icon={<RiStackLine size={16} />}\n label={t('userPage.collections', {})}\n />\n </Tab>\n ) : null,\n !disabled.questions ? (\n <Tab key=\"answers\" id=\"answers\">\n <TabLabel\n icon={<RiQuestionAnswerLine size={16} />}\n label={t('userPage.answers', {})}\n />\n </Tab>\n ) : null,\n ].filter((item): item is ReactElement => item !== null);\n\n return (\n <>\n <Header\n title={name}\n metadata={[\n ...(secondaryTitle || user?.spec?.profile?.email\n ? [\n {\n label: t('userPage.profileHeader', {}),\n value: (\n <EntityRefLink entityRef={identity}>\n {secondaryTitle || user?.spec?.profile?.email}\n </EntityRefLink>\n ),\n },\n ]\n : []),\n ...(userStats?.summary?.lastSeen\n ? [\n {\n label: t('stats.lastSeen'),\n value: (\n <RelativeTimeWithTooltip\n value={userStats.summary.lastSeen}\n />\n ),\n },\n ]\n : []),\n ...(userStats?.summary?.totalFollowers\n ? [\n {\n label: t('metadata.followers'),\n value: userStats.summary.totalFollowers,\n },\n ]\n : []),\n ]}\n customActions={\n <>\n {!loadingUser &&\n !userError &&\n currentUser?.userEntityRef !== identity && (\n <UserFollowButton\n userRef={identity}\n aria-label={t('userPage.followUser', { name })}\n />\n )}\n </>\n }\n />\n <Tabs\n selectedKey={tab}\n onSelectionChange={key => handleChange(key as string)}\n >\n <TabList aria-label={t('userPage.profileTab', {})}>{tabItems}</TabList>\n <TabPanel id=\"statistics\" className={styles.tabPanel}>\n <UserStatsContent\n userRef={identity ?? ''}\n stats={userStats}\n loading={loadingUserStats}\n />\n </TabPanel>\n {!disabled.questions && (\n <TabPanel id=\"questions\" className={styles.tabPanel}>\n <PostsContainer\n author={identity ?? ''}\n showNoQuestionsBtn={false}\n type=\"question\"\n prefix=\"user-questions\"\n />\n </TabPanel>\n )}\n {!disabled.articles && (\n <TabPanel id=\"articles\" className={styles.tabPanel}>\n <PostsContainer\n author={identity ?? ''}\n type=\"article\"\n showNoQuestionsBtn={false}\n prefix=\"user-articles\"\n />\n </TabPanel>\n )}\n {!disabled.links && (\n <TabPanel id=\"links\" className={styles.tabPanel}>\n <PostsContainer\n author={identity ?? ''}\n type=\"link\"\n showNoQuestionsBtn={false}\n prefix=\"user-links\"\n />\n </TabPanel>\n )}\n {!disabled.collections && (\n <TabPanel id=\"collections\" className={styles.tabPanel}>\n <CollectionsContainer\n owner={identity ?? ''}\n prefix=\"user-collections\"\n />\n </TabPanel>\n )}\n {!disabled.questions && (\n <TabPanel id=\"answers\" className={styles.tabPanel}>\n <AnswersContainer\n author={identity ?? ''}\n title={t('userPage.answers', {})}\n prefix=\"user-answers\"\n />\n </TabPanel>\n )}\n </Tabs>\n </>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"UserPage.esm.js","sources":["../../../src/components/UserPage/UserPage.tsx"],"sourcesContent":["import { ReactElement, ReactNode, useEffect, useMemo, useState } from 'react';\nimport { useParams, useSearchParams } from 'react-router-dom';\nimport {\n AnswersContainer,\n CollectionsContainer,\n PostsContainer,\n qetaTranslationRef,\n RelativeTimeWithTooltip,\n useIdentityApi,\n useQetaApi,\n useQetaConfig,\n UserFollowButton,\n useUserInfo,\n} from '@drodil/backstage-plugin-qeta-react';\nimport { UserStatsContent } from './UserStatsContent';\nimport { Flex, Header, Tab, TabList, TabPanel, Tabs } from '@backstage/ui';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport {\n RiBarChartLine,\n RiBookmarkLine,\n RiLink,\n RiQuestionAnswerLine,\n RiQuestionLine,\n RiStackLine,\n} from '@remixicon/react';\nimport styles from './UserPage.module.css';\nimport { EntityRefLink } from '@backstage/plugin-catalog-react';\n\nexport const UserPage = () => {\n const identity = useParams()['*'] ?? 'unknown';\n const { name, user, secondaryTitle } = useUserInfo(identity);\n const [tab, setTab] = useState('statistics');\n const { t } = useTranslationRef(qetaTranslationRef);\n const [_searchParams, setSearchParams] = useSearchParams();\n const { disabled, showLastSeen } = useQetaConfig();\n const {\n value: currentUser,\n loading: loadingUser,\n error: userError,\n } = useIdentityApi(api => api.getBackstageIdentity(), []);\n const canReadUserStats =\n !disabled.userStatistics || currentUser?.userEntityRef === identity;\n const { value: userStats, loading: loadingUserStats } = useQetaApi(\n api =>\n canReadUserStats\n ? api.getUserStats(identity)\n : Promise.resolve(undefined),\n [identity, canReadUserStats],\n );\n\n const handleChange = (newValue: string) => {\n setSearchParams({});\n setTab(newValue);\n };\n\n const availableTabs = useMemo(() => {\n return [\n !disabled.userStatistics ? 'statistics' : null,\n !disabled.questions ? 'questions' : null,\n !disabled.articles ? 'articles' : null,\n !disabled.links ? 'links' : null,\n !disabled.collections ? 'collections' : null,\n !disabled.questions ? 'answers' : null,\n ].filter((v): v is string => Boolean(v));\n }, [disabled]);\n\n useEffect(() => {\n if (!availableTabs.includes(tab)) {\n setTab(availableTabs[0]);\n }\n }, [availableTabs, tab]);\n\n const TabLabel = ({ icon, label }: { icon: ReactNode; label: string }) => (\n <Flex align=\"center\" gap=\"2\" className={styles.tabLabel}>\n {icon}\n <span>{label}</span>\n </Flex>\n );\n\n const tabItems = [\n !disabled.userStatistics ? (\n <Tab key=\"statistics\" id=\"statistics\">\n <TabLabel\n icon={<RiBarChartLine size={16} />}\n label={t('userPage.statistics', {})}\n />\n </Tab>\n ) : null,\n !disabled.questions ? (\n <Tab key=\"questions\" id=\"questions\">\n <TabLabel\n icon={<RiQuestionLine size={16} />}\n label={t('userPage.questions', {})}\n />\n </Tab>\n ) : null,\n !disabled.articles ? (\n <Tab key=\"articles\" id=\"articles\">\n <TabLabel\n icon={<RiBookmarkLine size={16} />}\n label={t('userPage.articles', {})}\n />\n </Tab>\n ) : null,\n !disabled.links ? (\n <Tab key=\"links\" id=\"links\">\n <TabLabel icon={<RiLink size={16} />} label={t('userPage.links', {})} />\n </Tab>\n ) : null,\n !disabled.collections ? (\n <Tab key=\"collections\" id=\"collections\">\n <TabLabel\n icon={<RiStackLine size={16} />}\n label={t('userPage.collections', {})}\n />\n </Tab>\n ) : null,\n !disabled.questions ? (\n <Tab key=\"answers\" id=\"answers\">\n <TabLabel\n icon={<RiQuestionAnswerLine size={16} />}\n label={t('userPage.answers', {})}\n />\n </Tab>\n ) : null,\n ].filter((item): item is ReactElement => item !== null);\n\n return (\n <>\n <Header\n title={name}\n metadata={[\n ...(secondaryTitle || user?.spec?.profile?.email\n ? [\n {\n label: t('userPage.profileHeader', {}),\n value: (\n <EntityRefLink entityRef={identity}>\n {secondaryTitle || user?.spec?.profile?.email}\n </EntityRefLink>\n ),\n },\n ]\n : []),\n ...(showLastSeen && userStats?.summary?.lastSeen\n ? [\n {\n label: t('stats.lastSeen'),\n value: (\n <RelativeTimeWithTooltip\n value={userStats.summary.lastSeen}\n />\n ),\n },\n ]\n : []),\n ...(userStats?.summary?.totalFollowers\n ? [\n {\n label: t('metadata.followers'),\n value: userStats.summary.totalFollowers,\n },\n ]\n : []),\n ]}\n customActions={\n <>\n {!loadingUser &&\n !userError &&\n currentUser?.userEntityRef !== identity && (\n <UserFollowButton\n userRef={identity}\n aria-label={t('userPage.followUser', { name })}\n />\n )}\n </>\n }\n />\n <Tabs\n selectedKey={tab}\n onSelectionChange={key => handleChange(key as string)}\n >\n <TabList aria-label={t('userPage.profileTab', {})}>{tabItems}</TabList>\n {!disabled.userStatistics && (\n <TabPanel id=\"statistics\" className={styles.tabPanel}>\n <UserStatsContent\n userRef={identity ?? ''}\n stats={userStats}\n loading={loadingUserStats}\n />\n </TabPanel>\n )}\n {!disabled.questions && (\n <TabPanel id=\"questions\" className={styles.tabPanel}>\n <PostsContainer\n author={identity ?? ''}\n showNoQuestionsBtn={false}\n type=\"question\"\n prefix=\"user-questions\"\n />\n </TabPanel>\n )}\n {!disabled.articles && (\n <TabPanel id=\"articles\" className={styles.tabPanel}>\n <PostsContainer\n author={identity ?? ''}\n type=\"article\"\n showNoQuestionsBtn={false}\n prefix=\"user-articles\"\n />\n </TabPanel>\n )}\n {!disabled.links && (\n <TabPanel id=\"links\" className={styles.tabPanel}>\n <PostsContainer\n author={identity ?? ''}\n type=\"link\"\n showNoQuestionsBtn={false}\n prefix=\"user-links\"\n />\n </TabPanel>\n )}\n {!disabled.collections && (\n <TabPanel id=\"collections\" className={styles.tabPanel}>\n <CollectionsContainer\n owner={identity ?? ''}\n prefix=\"user-collections\"\n />\n </TabPanel>\n )}\n {!disabled.questions && (\n <TabPanel id=\"answers\" className={styles.tabPanel}>\n <AnswersContainer\n author={identity ?? ''}\n title={t('userPage.answers', {})}\n prefix=\"user-answers\"\n />\n </TabPanel>\n )}\n </Tabs>\n </>\n );\n};\n"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -92,7 +92,7 @@ declare const qetaPlugin: _backstage_frontend_plugin_api.OverridableFrontendPlug
92
92
  relations: string[] | undefined;
93
93
  path: string | undefined;
94
94
  title: string | undefined;
95
- filter: _backstage_filter_predicates.FilterPredicate | undefined;
95
+ filter: string | _backstage_filter_predicates.FilterPredicate | undefined;
96
96
  group: string | false | undefined;
97
97
  icon: string | undefined;
98
98
  };
@@ -109,7 +109,7 @@ declare const qetaPlugin: _backstage_frontend_plugin_api.OverridableFrontendPlug
109
109
  relations?: string[] | undefined;
110
110
  path?: string | undefined | undefined;
111
111
  title?: string | undefined | undefined;
112
- filter?: _backstage_filter_predicates.FilterPredicate | undefined;
112
+ filter?: string | _backstage_filter_predicates.FilterPredicate | undefined;
113
113
  group?: string | false | undefined | undefined;
114
114
  icon?: string | undefined | undefined;
115
115
  };
@@ -6,7 +6,7 @@ var keywords = [
6
6
  "frontend",
7
7
  "backstage.io"
8
8
  ];
9
- var version = "4.0.5";
9
+ var version = "4.1.1";
10
10
  var main = "src/index.tsx";
11
11
  var types = "src/index.tsx";
12
12
  var prepublishOnly = "yarn tsc && yarn build";
@@ -72,14 +72,13 @@ var dependencies = {
72
72
  "@drodil/backstage-plugin-qeta-react": "workspace:^",
73
73
  "@remixicon/react": "^4.2.0",
74
74
  dompurify: "^3.2.4",
75
- lodash: "^4.17.23",
76
75
  luxon: "^3.5.0",
77
76
  "react-use": "^17.4.0",
78
77
  unified: "^11.0.5",
79
78
  zod: "^4.0.0"
80
79
  };
81
80
  var peerDependencies = {
82
- "@backstage/catalog-client": "^1.16.1",
81
+ "@backstage/catalog-client": "^1.16.3",
83
82
  react: " ^18.0.0 || ^19.0.0",
84
83
  "react-dom": "^18.0.0 || ^19.0.0",
85
84
  "react-router-dom": "6.0.0-beta.0 || ^6.3.0"
@@ -99,7 +98,6 @@ var devDependencies = {
99
98
  "@backstage/plugin-techdocs": "backstage:^",
100
99
  "@backstage/plugin-user-settings": "backstage:^",
101
100
  "@testing-library/jest-dom": "^6.1.3",
102
- "@types/lodash": "^4.14.199",
103
101
  "@types/luxon": "^3",
104
102
  "cross-fetch": "^3.1.5",
105
103
  "rehype-mermaid": "^3.0.0"
@@ -1 +1 @@
1
- {"version":3,"file":"package.json.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"package.json.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/package.json CHANGED
@@ -7,7 +7,7 @@
7
7
  "frontend",
8
8
  "backstage.io"
9
9
  ],
10
- "version": "4.0.5",
10
+ "version": "4.1.1",
11
11
  "main": "./dist/index.esm.js",
12
12
  "types": "./dist/index.d.ts",
13
13
  "prepublishOnly": "yarn tsc && yarn build",
@@ -65,30 +65,29 @@
65
65
  "tsc": "tsc"
66
66
  },
67
67
  "dependencies": {
68
- "@backstage/catalog-model": "^1.10.0",
69
- "@backstage/core-compat-api": "^0.5.14",
70
- "@backstage/core-components": "^0.18.13",
71
- "@backstage/core-plugin-api": "^1.12.9",
72
- "@backstage/frontend-plugin-api": "^0.18.0",
73
- "@backstage/plugin-catalog-react": "^3.2.2",
74
- "@backstage/plugin-home-react": "^0.1.41",
75
- "@backstage/plugin-search-common": "^1.2.24",
76
- "@backstage/plugin-search-react": "^1.11.7",
77
- "@backstage/plugin-signals-react": "^0.0.25",
78
- "@backstage/plugin-techdocs-react": "^1.3.14",
79
- "@backstage/ui": "^0.17.1",
80
- "@drodil/backstage-plugin-qeta-common": "^4.0.5",
81
- "@drodil/backstage-plugin-qeta-react": "^4.0.5",
68
+ "@backstage/catalog-model": "^1.10.2",
69
+ "@backstage/core-compat-api": "^0.5.16",
70
+ "@backstage/core-components": "^0.18.15",
71
+ "@backstage/core-plugin-api": "^1.12.11",
72
+ "@backstage/frontend-plugin-api": "^0.18.2",
73
+ "@backstage/plugin-catalog-react": "^3.3.0",
74
+ "@backstage/plugin-home-react": "^0.1.43",
75
+ "@backstage/plugin-search-common": "^1.2.26",
76
+ "@backstage/plugin-search-react": "^1.11.9",
77
+ "@backstage/plugin-signals-react": "^0.0.27",
78
+ "@backstage/plugin-techdocs-react": "^1.4.0",
79
+ "@backstage/ui": "^0.19.0",
80
+ "@drodil/backstage-plugin-qeta-common": "^4.1.1",
81
+ "@drodil/backstage-plugin-qeta-react": "^4.1.1",
82
82
  "@remixicon/react": "^4.2.0",
83
83
  "dompurify": "^3.2.4",
84
- "lodash": "^4.17.23",
85
84
  "luxon": "^3.5.0",
86
85
  "react-use": "^17.4.0",
87
86
  "unified": "^11.0.5",
88
87
  "zod": "^4.0.0"
89
88
  },
90
89
  "peerDependencies": {
91
- "@backstage/catalog-client": "^1.16.1",
90
+ "@backstage/catalog-client": "^1.16.3",
92
91
  "react": " ^18.0.0 || ^19.0.0",
93
92
  "react-dom": "^18.0.0 || ^19.0.0",
94
93
  "react-router-dom": "6.0.0-beta.0 || ^6.3.0"
@@ -97,18 +96,17 @@
97
96
  "react-markdown": "8.0.7"
98
97
  },
99
98
  "devDependencies": {
100
- "@backstage/cli": "^0.36.5",
101
- "@backstage/frontend-defaults": "^0.5.5",
102
- "@backstage/plugin-catalog": "^2.0.8",
103
- "@backstage/plugin-home": "^0.9.9",
104
- "@backstage/plugin-notifications": "^0.5.20",
105
- "@backstage/plugin-search": "^1.7.7",
106
- "@backstage/plugin-search-react": "^1.11.7",
107
- "@backstage/plugin-signals": "^0.0.34",
108
- "@backstage/plugin-techdocs": "^1.18.0",
109
- "@backstage/plugin-user-settings": "^0.9.6",
99
+ "@backstage/cli": "^0.36.7",
100
+ "@backstage/frontend-defaults": "^0.5.7",
101
+ "@backstage/plugin-catalog": "^2.0.10",
102
+ "@backstage/plugin-home": "^0.9.11",
103
+ "@backstage/plugin-notifications": "^0.6.1",
104
+ "@backstage/plugin-search": "^1.7.9",
105
+ "@backstage/plugin-search-react": "^1.11.9",
106
+ "@backstage/plugin-signals": "^0.0.36",
107
+ "@backstage/plugin-techdocs": "^1.19.0",
108
+ "@backstage/plugin-user-settings": "^0.9.8",
110
109
  "@testing-library/jest-dom": "^6.1.3",
111
- "@types/lodash": "^4.14.199",
112
110
  "@types/luxon": "^3",
113
111
  "cross-fetch": "^3.1.5",
114
112
  "rehype-mermaid": "^3.0.0"