@drodil/backstage-plugin-qeta-react 3.52.6 → 3.53.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/dist/components/AIAnswerCard/AIAnswerCard.esm.js +11 -11
  2. package/dist/components/AIAnswerCard/AIAnswerCard.esm.js.map +1 -1
  3. package/dist/components/AnswerForm/AnswerForm.esm.js +5 -0
  4. package/dist/components/AnswerForm/AnswerForm.esm.js.map +1 -1
  5. package/dist/components/AnswersContainer/AnswerListItem.esm.js +4 -2
  6. package/dist/components/AnswersContainer/AnswerListItem.esm.js.map +1 -1
  7. package/dist/components/AnswersContainer/AnswersContainer.esm.js +59 -231
  8. package/dist/components/AnswersContainer/AnswersContainer.esm.js.map +1 -1
  9. package/dist/components/AnswersContainer/AnswersGridItem.esm.js +167 -0
  10. package/dist/components/AnswersContainer/AnswersGridItem.esm.js.map +1 -0
  11. package/dist/components/ArticleContent/ArticleButtons.esm.js +3 -0
  12. package/dist/components/ArticleContent/ArticleButtons.esm.js.map +1 -1
  13. package/dist/components/Badges/UserBadges.esm.js +7 -2
  14. package/dist/components/Badges/UserBadges.esm.js.map +1 -1
  15. package/dist/components/Buttons/AddToCollectionButton.esm.js +7 -2
  16. package/dist/components/Buttons/AddToCollectionButton.esm.js.map +1 -1
  17. package/dist/components/Buttons/EntityFollowButton.esm.js +7 -2
  18. package/dist/components/Buttons/EntityFollowButton.esm.js.map +1 -1
  19. package/dist/components/Buttons/RankingButtons.esm.js +94 -0
  20. package/dist/components/Buttons/RankingButtons.esm.js.map +1 -0
  21. package/dist/components/Buttons/TagFollowButton.esm.js +8 -3
  22. package/dist/components/Buttons/TagFollowButton.esm.js.map +1 -1
  23. package/dist/components/Buttons/UserFollowButton.esm.js +7 -2
  24. package/dist/components/Buttons/UserFollowButton.esm.js.map +1 -1
  25. package/dist/components/CollectionsContainer/CollectionListItem.esm.js +143 -0
  26. package/dist/components/CollectionsContainer/CollectionListItem.esm.js.map +1 -0
  27. package/dist/components/CollectionsContainer/CollectionsContainer.esm.js +45 -0
  28. package/dist/components/CollectionsContainer/CollectionsContainer.esm.js.map +1 -0
  29. package/dist/components/CollectionsContainer/CollectionsGridItem.esm.js.map +1 -0
  30. package/dist/components/ContentHeader/ContentHeader.esm.js +6 -0
  31. package/dist/components/ContentHeader/ContentHeader.esm.js.map +1 -1
  32. package/dist/components/EntitiesContainer/EntitiesContainer.esm.js +44 -0
  33. package/dist/components/EntitiesContainer/EntitiesContainer.esm.js.map +1 -0
  34. package/dist/components/{EntitiesGrid → EntitiesContainer}/EntitiesGridItem.esm.js +18 -26
  35. package/dist/components/EntitiesContainer/EntitiesGridItem.esm.js.map +1 -0
  36. package/dist/components/EntitiesContainer/EntityListItem.esm.js +102 -0
  37. package/dist/components/EntitiesContainer/EntityListItem.esm.js.map +1 -0
  38. package/dist/components/FilterPanel/FilterPanel.esm.js +2 -2
  39. package/dist/components/FilterPanel/FilterPanel.esm.js.map +1 -1
  40. package/dist/components/FollowedLists/FollowedEntitiesList.esm.js +7 -3
  41. package/dist/components/FollowedLists/FollowedEntitiesList.esm.js.map +1 -1
  42. package/dist/components/FollowedLists/FollowedTagsList.esm.js +8 -4
  43. package/dist/components/FollowedLists/FollowedTagsList.esm.js.map +1 -1
  44. package/dist/components/FollowedLists/FollowedUsersList.esm.js +7 -3
  45. package/dist/components/FollowedLists/FollowedUsersList.esm.js.map +1 -1
  46. package/dist/components/HomePageCards/ImpactCard.esm.js +7 -2
  47. package/dist/components/HomePageCards/ImpactCard.esm.js.map +1 -1
  48. package/dist/components/HomePageCards/PostsCard.esm.js +23 -15
  49. package/dist/components/HomePageCards/PostsCard.esm.js.map +1 -1
  50. package/dist/components/LeftMenu/LeftMenu.esm.js +15 -16
  51. package/dist/components/LeftMenu/LeftMenu.esm.js.map +1 -1
  52. package/dist/components/LinkCard/LinkCard.esm.js +4 -0
  53. package/dist/components/LinkCard/LinkCard.esm.js.map +1 -1
  54. package/dist/components/Links/Links.esm.js +7 -0
  55. package/dist/components/Links/Links.esm.js.map +1 -1
  56. package/dist/components/PostForm/EntitiesInput.esm.js +229 -226
  57. package/dist/components/PostForm/EntitiesInput.esm.js.map +1 -1
  58. package/dist/components/PostForm/PostForm.esm.js +13 -10
  59. package/dist/components/PostForm/PostForm.esm.js.map +1 -1
  60. package/dist/components/PostForm/TagInput.esm.js +4 -3
  61. package/dist/components/PostForm/TagInput.esm.js.map +1 -1
  62. package/dist/components/PostHighlightList/PostHighlightList.esm.js +6 -2
  63. package/dist/components/PostHighlightList/PostHighlightList.esm.js.map +1 -1
  64. package/dist/components/PostsContainer/PostListItem.esm.js +57 -18
  65. package/dist/components/PostsContainer/PostListItem.esm.js.map +1 -1
  66. package/dist/components/PostsContainer/PostsContainer.esm.js +137 -128
  67. package/dist/components/PostsContainer/PostsContainer.esm.js.map +1 -1
  68. package/dist/components/{PostsGrid → PostsContainer}/PostsGridItem.esm.js +29 -53
  69. package/dist/components/PostsContainer/PostsGridItem.esm.js.map +1 -0
  70. package/dist/components/PostsTable/PostsTable.esm.js +7 -2
  71. package/dist/components/PostsTable/PostsTable.esm.js.map +1 -1
  72. package/dist/components/QetaEntityContainer/QetaEntityContainer.esm.js +178 -0
  73. package/dist/components/QetaEntityContainer/QetaEntityContainer.esm.js.map +1 -0
  74. package/dist/components/QuestionCard/QuestionCard.esm.js +4 -0
  75. package/dist/components/QuestionCard/QuestionCard.esm.js.map +1 -1
  76. package/dist/components/SuggestionsCard/SuggestionsCard.esm.js +7 -3
  77. package/dist/components/SuggestionsCard/SuggestionsCard.esm.js.map +1 -1
  78. package/dist/components/TagsAndEntities/EntityChip.esm.js +6 -2
  79. package/dist/components/TagsAndEntities/EntityChip.esm.js.map +1 -1
  80. package/dist/components/TagsAndEntities/TagChip.esm.js +6 -2
  81. package/dist/components/TagsAndEntities/TagChip.esm.js.map +1 -1
  82. package/dist/components/TagsAndEntities/UserChip.esm.js +7 -3
  83. package/dist/components/TagsAndEntities/UserChip.esm.js.map +1 -1
  84. package/dist/components/TagsContainer/CreateTagModal.esm.js.map +1 -0
  85. package/dist/components/TagsContainer/EditTagModal.esm.js.map +1 -0
  86. package/dist/components/{TagsGrid → TagsContainer}/TagGridItem.esm.js +3 -3
  87. package/dist/components/TagsContainer/TagGridItem.esm.js.map +1 -0
  88. package/dist/components/TagsContainer/TagListItem.esm.js +243 -0
  89. package/dist/components/TagsContainer/TagListItem.esm.js.map +1 -0
  90. package/dist/components/TagsContainer/TagsContainer.esm.js +86 -0
  91. package/dist/components/TagsContainer/TagsContainer.esm.js.map +1 -0
  92. package/dist/components/TemplateList/TemplateForm.esm.js +7 -2
  93. package/dist/components/TemplateList/TemplateForm.esm.js.map +1 -1
  94. package/dist/components/TemplateList/TemplateList.esm.js +7 -3
  95. package/dist/components/TemplateList/TemplateList.esm.js.map +1 -1
  96. package/dist/components/Timeline/TimelineItem.esm.js +4 -0
  97. package/dist/components/Timeline/TimelineItem.esm.js.map +1 -1
  98. package/dist/components/TopRankingUsersCard/TopRankingUsersCard.esm.js +7 -2
  99. package/dist/components/TopRankingUsersCard/TopRankingUsersCard.esm.js.map +1 -1
  100. package/dist/components/UsersContainer/UserListItem.esm.js +133 -0
  101. package/dist/components/UsersContainer/UserListItem.esm.js.map +1 -0
  102. package/dist/components/UsersContainer/UsersContainer.esm.js +44 -0
  103. package/dist/components/UsersContainer/UsersContainer.esm.js.map +1 -0
  104. package/dist/components/{UsersGrid → UsersContainer}/UsersGridItem.esm.js +35 -38
  105. package/dist/components/UsersContainer/UsersGridItem.esm.js.map +1 -0
  106. package/dist/components/Utility/QetaGridHeader.esm.js +15 -11
  107. package/dist/components/Utility/QetaGridHeader.esm.js.map +1 -1
  108. package/dist/components/Utility/QetaPagination.esm.js +69 -0
  109. package/dist/components/Utility/QetaPagination.esm.js.map +1 -0
  110. package/dist/hooks/useListItemStyles.esm.js +22 -0
  111. package/dist/hooks/useListItemStyles.esm.js.map +1 -0
  112. package/dist/hooks/{usePaginatedPosts.esm.js → useQetaEntities.esm.js} +59 -86
  113. package/dist/hooks/useQetaEntities.esm.js.map +1 -0
  114. package/dist/hooks/useUserSettings.esm.js +83 -0
  115. package/dist/hooks/useUserSettings.esm.js.map +1 -0
  116. package/dist/index.d.ts +209 -58
  117. package/dist/index.esm.js +21 -8
  118. package/dist/index.esm.js.map +1 -1
  119. package/dist/routes.esm.js +6 -1
  120. package/dist/routes.esm.js.map +1 -1
  121. package/dist/translation.esm.js +49 -0
  122. package/dist/translation.esm.js.map +1 -1
  123. package/package.json +2 -2
  124. package/dist/components/AnswersContainer/AnswerList.esm.js +0 -54
  125. package/dist/components/AnswersContainer/AnswerList.esm.js.map +0 -1
  126. package/dist/components/CollectionsGrid/CollectionsGrid.esm.js +0 -204
  127. package/dist/components/CollectionsGrid/CollectionsGrid.esm.js.map +0 -1
  128. package/dist/components/CollectionsGrid/CollectionsGridContent.esm.js +0 -55
  129. package/dist/components/CollectionsGrid/CollectionsGridContent.esm.js.map +0 -1
  130. package/dist/components/CollectionsGrid/CollectionsGridItem.esm.js.map +0 -1
  131. package/dist/components/CollectionsGrid/NoCollectionsCard.esm.js +0 -21
  132. package/dist/components/CollectionsGrid/NoCollectionsCard.esm.js.map +0 -1
  133. package/dist/components/EntitiesGrid/EntitiesGrid.esm.js +0 -136
  134. package/dist/components/EntitiesGrid/EntitiesGrid.esm.js.map +0 -1
  135. package/dist/components/EntitiesGrid/EntitiesGridContent.esm.js +0 -46
  136. package/dist/components/EntitiesGrid/EntitiesGridContent.esm.js.map +0 -1
  137. package/dist/components/EntitiesGrid/EntitiesGridItem.esm.js.map +0 -1
  138. package/dist/components/EntitiesGrid/NoEntitiesCard.esm.js +0 -21
  139. package/dist/components/EntitiesGrid/NoEntitiesCard.esm.js.map +0 -1
  140. package/dist/components/PostsContainer/PostList.esm.js +0 -83
  141. package/dist/components/PostsContainer/PostList.esm.js.map +0 -1
  142. package/dist/components/PostsGrid/PostsGrid.esm.js +0 -197
  143. package/dist/components/PostsGrid/PostsGrid.esm.js.map +0 -1
  144. package/dist/components/PostsGrid/PostsGridContent.esm.js +0 -90
  145. package/dist/components/PostsGrid/PostsGridContent.esm.js.map +0 -1
  146. package/dist/components/PostsGrid/PostsGridItem.esm.js.map +0 -1
  147. package/dist/components/TagsGrid/CreateTagModal.esm.js.map +0 -1
  148. package/dist/components/TagsGrid/EditTagModal.esm.js.map +0 -1
  149. package/dist/components/TagsGrid/NoTagsCard.esm.js +0 -21
  150. package/dist/components/TagsGrid/NoTagsCard.esm.js.map +0 -1
  151. package/dist/components/TagsGrid/TagGridItem.esm.js.map +0 -1
  152. package/dist/components/TagsGrid/TagsGrid.esm.js +0 -190
  153. package/dist/components/TagsGrid/TagsGrid.esm.js.map +0 -1
  154. package/dist/components/TagsGrid/TagsGridContent.esm.js +0 -62
  155. package/dist/components/TagsGrid/TagsGridContent.esm.js.map +0 -1
  156. package/dist/components/UsersGrid/NoUsersCard.esm.js +0 -21
  157. package/dist/components/UsersGrid/NoUsersCard.esm.js.map +0 -1
  158. package/dist/components/UsersGrid/UsersGrid.esm.js +0 -137
  159. package/dist/components/UsersGrid/UsersGrid.esm.js.map +0 -1
  160. package/dist/components/UsersGrid/UsersGridContent.esm.js +0 -46
  161. package/dist/components/UsersGrid/UsersGridContent.esm.js.map +0 -1
  162. package/dist/components/UsersGrid/UsersGridItem.esm.js.map +0 -1
  163. package/dist/hooks/usePaginatedPosts.esm.js.map +0 -1
  164. /package/dist/components/{CollectionsGrid → CollectionsContainer}/CollectionsGridItem.esm.js +0 -0
  165. /package/dist/components/{TagsGrid → TagsContainer}/CreateTagModal.esm.js +0 -0
  166. /package/dist/components/{TagsGrid → TagsContainer}/EditTagModal.esm.js +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useQetaEntities.esm.js","sources":["../../src/hooks/useQetaEntities.ts"],"sourcesContent":["import { useAnalytics } from '@backstage/core-plugin-api';\nimport { useEffect, useState } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport useDebounce from 'react-use/lib/useDebounce';\nimport { useQetaApi } from './useQetaApi';\nimport { QetaApi } from '@drodil/backstage-plugin-qeta-common';\nimport { filterKeys as globalFilterKeys } from '../components/FilterPanel/FilterPanel';\nimport { filterTags } from '@drodil/backstage-plugin-qeta-common';\nimport { useUserSettings } from './useUserSettings';\n\nexport type QetaEntitiesProps<T, F> = {\n fetch: (\n api: QetaApi,\n limit: number,\n offset: number,\n filters: F,\n ) => Promise<{ items: T[]; total: number }>;\n initialFilters: F;\n prefix: string;\n defaultPageSize?: number;\n filterKeys?: string[];\n fetchDeps?: any[];\n getKey?: (item: T) => string | number;\n usePagination?: boolean;\n};\n\nexport type FilterChange<F> = {\n key: keyof F;\n value?: F[keyof F] | string | string[];\n};\n\nexport function useQetaEntities<T, F>(props: QetaEntitiesProps<T, F>) {\n const {\n fetch,\n initialFilters,\n prefix,\n defaultPageSize,\n filterKeys,\n fetchDeps,\n getKey,\n usePagination,\n } = props;\n const analytics = useAnalytics();\n const [page, setPage] = useState(1);\n const [pageSize, setPageSize] = useState(defaultPageSize ?? 24);\n const { getSetting, setSetting } = useUserSettings();\n const [showFilterPanel, setShowFilterPanel] = useState(\n getSetting('filterPanelExpanded')[prefix] ?? false,\n );\n const [searchParams, setSearchParams] = useSearchParams();\n const [searchQuery, setSearchQuery] = useState('');\n const [filters, setFilters] = useState<F>(initialFilters);\n\n const [items, setItems] = useState<T[]>([]);\n const [hasMore, setHasMore] = useState(true);\n const [total, setTotal] = useState(0);\n\n useEffect(() => {\n if (defaultPageSize) {\n setPageSize(defaultPageSize);\n }\n }, [defaultPageSize]);\n\n useEffect(() => {\n const currentExpanded = getSetting('filterPanelExpanded');\n setSetting('filterPanelExpanded', {\n ...currentExpanded,\n [prefix]: showFilterPanel,\n });\n }, [showFilterPanel, prefix, getSetting, setSetting]);\n\n const onPageChange = (value: number) => {\n setPage(value);\n setSearchParams(prev => {\n const newValue = prev;\n newValue.set('page', String(value));\n return newValue;\n });\n };\n\n const loadNextPage = () => {\n setPage(prev => prev + 1);\n };\n\n const onFilterChange = (changes: FilterChange<F> | FilterChange<F>[]) => {\n const changesArray = Array.isArray(changes) ? changes : [changes];\n setPage(1);\n setFilters(prev => {\n const newValue = { ...prev };\n for (const { key, value } of changesArray) {\n (newValue as any)[key] = value;\n }\n return newValue;\n });\n setSearchParams(prev => {\n const newValue = prev;\n for (const { key, value } of changesArray) {\n const allowedKeys = filterKeys ?? globalFilterKeys;\n if (!allowedKeys.includes(key as any)) {\n continue;\n }\n if (!value || value === 'false') {\n newValue.delete(key as string);\n } else if (Array.isArray(value)) {\n if (value.length === 0) {\n newValue.delete(key as string);\n } else {\n newValue.set(key as string, value.join(','));\n }\n } else if (typeof value === 'number') {\n newValue.set(key as string, String(value));\n } else if ((value as any).length > 0) {\n newValue.set(key as string, value as any);\n } else {\n newValue.delete(key as string);\n }\n }\n return newValue;\n });\n };\n\n const onSearchQueryChange = (query: string) => {\n onPageChange(1);\n if (query) {\n analytics.captureEvent(`qeta_search_${prefix}`, query);\n }\n setSearchQuery(query);\n };\n\n useDebounce(\n () => {\n if ((filters as any).searchQuery !== searchQuery) {\n setFilters({ ...filters, searchQuery: searchQuery });\n }\n },\n 400,\n [searchQuery],\n );\n\n useEffect(() => {\n let filtersApplied = false;\n searchParams.forEach((value, key) => {\n try {\n if (key === 'page') {\n const pv = Number.parseInt(value, 10);\n if (pv > 0) {\n setPage(pv);\n } else {\n setPage(1);\n setItems([]);\n }\n } else if (key === `${prefix}PerPage`) {\n const qpp = Number.parseInt(value, 10);\n if (qpp > 0) setPageSize(qpp);\n } else if ((filterKeys ?? globalFilterKeys).includes(key as any)) {\n filtersApplied = true;\n if (key === 'tags') {\n (filters as any).tags = filterTags(value.split(',')) ?? [];\n } else if (key === 'entities') {\n (filters as any).entities = value.split(',');\n } else {\n (filters as any)[key] = value;\n }\n }\n } catch (_e) {\n // NOOP\n }\n });\n setFilters(filters);\n if (filtersApplied) {\n setShowFilterPanel(true);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [searchParams, filterKeys, prefix]);\n\n const {\n value: response,\n loading,\n error,\n retry,\n } = useQetaApi(\n api => {\n return fetch(api, pageSize, (page - 1) * pageSize, filters);\n },\n [page, filters, pageSize, ...(fetchDeps ?? [])],\n );\n\n useEffect(() => {\n if (response) {\n if (page === 1 || usePagination) {\n setItems(response.items);\n } else {\n setItems(prev => {\n const newItems = response.items.filter(\n newItem =>\n !prev.some(prevItem => {\n if (getKey) {\n return getKey(prevItem) === getKey(newItem);\n }\n return (prevItem as any).id === (newItem as any).id;\n }),\n );\n return [...prev, ...newItems];\n });\n }\n setHasMore((response.items ?? []).length >= pageSize);\n setTotal(response.total);\n }\n }, [response, page, pageSize, getKey, usePagination]);\n\n const onPageSizeChange = (value: number) => {\n if (response) {\n let newPage = page;\n while (newPage * value > response.total) {\n newPage -= 1;\n }\n onPageChange(Math.max(1, newPage));\n }\n setPageSize(value);\n setSearchParams(prev => {\n const newValue = prev;\n newValue.set(`${prefix}PerPage`, String(value));\n return newValue;\n });\n };\n\n return {\n page,\n setPage,\n pageSize,\n setPageSize,\n showFilterPanel,\n setShowFilterPanel,\n searchParams,\n setSearchParams,\n searchQuery,\n setSearchQuery,\n filters,\n setFilters,\n onPageChange,\n onPageSizeChange,\n onFilterChange,\n onSearchQueryChange,\n response,\n items:\n (page === 1 || usePagination) && !loading && response\n ? response.items\n : items,\n hasMore,\n total,\n loading,\n error,\n loadNextPage,\n retry,\n fetchNextPage: loadNextPage,\n };\n}\n"],"names":["filterKeys","globalFilterKeys"],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ import { useApi, storageApiRef } from '@backstage/core-plugin-api';
2
+ import { useState, useRef, useEffect, useCallback } from 'react';
3
+
4
+ const DEFAULT_SETTINGS = {
5
+ autoSaveEnabled: false,
6
+ filterPanelExpanded: {},
7
+ viewType: {},
8
+ aiAnswerExpanded: false,
9
+ usePagination: false
10
+ };
11
+ const BUCKET_KEY = "qeta";
12
+ const STORAGE_KEY = "qeta-user-settings";
13
+ const useUserSettings = () => {
14
+ const storageApi = useApi(storageApiRef);
15
+ const [settings, setSettings] = useState(DEFAULT_SETTINGS);
16
+ const [isLoaded, setIsLoaded] = useState(false);
17
+ const settingsRef = useRef(DEFAULT_SETTINGS);
18
+ useEffect(() => {
19
+ settingsRef.current = settings;
20
+ }, [settings]);
21
+ useEffect(() => {
22
+ const bucket = storageApi.forBucket(BUCKET_KEY);
23
+ const snapshot = bucket.snapshot(STORAGE_KEY);
24
+ const stored = snapshot.value;
25
+ if (stored) {
26
+ setSettings(stored);
27
+ }
28
+ setIsLoaded(true);
29
+ const subscription = bucket.observe$(STORAGE_KEY).subscribe({
30
+ next: (newSnapshot) => {
31
+ const value = newSnapshot.value;
32
+ if (value) {
33
+ setSettings(value);
34
+ } else {
35
+ setSettings(DEFAULT_SETTINGS);
36
+ }
37
+ }
38
+ });
39
+ return () => {
40
+ subscription.unsubscribe();
41
+ };
42
+ }, [storageApi]);
43
+ const updateSettings = useCallback(
44
+ async (updates) => {
45
+ const bucket = storageApi.forBucket(BUCKET_KEY);
46
+ const snapshot = bucket.snapshot(STORAGE_KEY);
47
+ const currentSettings = snapshot.value || DEFAULT_SETTINGS;
48
+ const newSettings = {
49
+ ...currentSettings,
50
+ ...updates
51
+ };
52
+ await bucket.set(STORAGE_KEY, newSettings);
53
+ },
54
+ [storageApi]
55
+ );
56
+ const getSetting = useCallback(
57
+ (key) => {
58
+ return settingsRef.current[key];
59
+ },
60
+ []
61
+ );
62
+ const setSetting = useCallback(
63
+ async (key, value) => {
64
+ await updateSettings({ [key]: value });
65
+ },
66
+ [updateSettings]
67
+ );
68
+ const resetSettings = useCallback(async () => {
69
+ const bucket = storageApi.forBucket("qeta");
70
+ await bucket.set(STORAGE_KEY, DEFAULT_SETTINGS);
71
+ }, [storageApi]);
72
+ return {
73
+ settings,
74
+ updateSettings,
75
+ getSetting,
76
+ setSetting,
77
+ resetSettings,
78
+ isLoaded
79
+ };
80
+ };
81
+
82
+ export { useUserSettings };
83
+ //# sourceMappingURL=useUserSettings.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useUserSettings.esm.js","sources":["../../src/hooks/useUserSettings.ts"],"sourcesContent":["import { useApi } from '@backstage/core-plugin-api';\nimport { storageApiRef } from '@backstage/core-plugin-api';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { ViewType } from '../components/ViewToggle/ViewToggle';\n\nexport type UserSettings = {\n autoSaveEnabled: boolean;\n filterPanelExpanded: Record<string, boolean>;\n viewType: Record<string, ViewType>;\n aiAnswerExpanded: boolean;\n usePagination: boolean;\n};\n\nconst DEFAULT_SETTINGS: UserSettings = {\n autoSaveEnabled: false,\n filterPanelExpanded: {},\n viewType: {},\n aiAnswerExpanded: false,\n usePagination: false,\n};\n\nconst BUCKET_KEY = 'qeta';\nconst STORAGE_KEY = 'qeta-user-settings';\n\nexport const useUserSettings = () => {\n const storageApi = useApi(storageApiRef);\n const [settings, setSettings] = useState<UserSettings>(DEFAULT_SETTINGS);\n const [isLoaded, setIsLoaded] = useState(false);\n const settingsRef = useRef<UserSettings>(DEFAULT_SETTINGS);\n\n useEffect(() => {\n settingsRef.current = settings;\n }, [settings]);\n\n useEffect(() => {\n const bucket = storageApi.forBucket(BUCKET_KEY);\n const snapshot = bucket.snapshot(STORAGE_KEY);\n const stored = snapshot.value as UserSettings | undefined;\n\n if (stored) {\n setSettings(stored);\n }\n\n setIsLoaded(true);\n\n const subscription = bucket.observe$<UserSettings>(STORAGE_KEY).subscribe({\n next: newSnapshot => {\n const value = newSnapshot.value as UserSettings | undefined;\n if (value) {\n setSettings(value);\n } else {\n setSettings(DEFAULT_SETTINGS);\n }\n },\n });\n\n return () => {\n subscription.unsubscribe();\n };\n }, [storageApi]);\n\n const updateSettings = useCallback(\n async (updates: Partial<UserSettings>) => {\n const bucket = storageApi.forBucket(BUCKET_KEY);\n const snapshot = bucket.snapshot(STORAGE_KEY);\n const currentSettings =\n (snapshot.value as UserSettings) || DEFAULT_SETTINGS;\n const newSettings = {\n ...currentSettings,\n ...(updates as Partial<UserSettings>),\n };\n await bucket.set(STORAGE_KEY, newSettings);\n },\n [storageApi],\n );\n\n const getSetting = useCallback(\n <K extends keyof UserSettings>(key: K): UserSettings[K] => {\n return settingsRef.current[key];\n },\n [],\n );\n\n const setSetting = useCallback(\n async <K extends keyof UserSettings>(\n key: K,\n value: UserSettings[K],\n ): Promise<void> => {\n await updateSettings({ [key]: value } as Partial<UserSettings>);\n },\n [updateSettings],\n );\n\n const resetSettings = useCallback(async () => {\n const bucket = storageApi.forBucket('qeta');\n await bucket.set(STORAGE_KEY, DEFAULT_SETTINGS);\n }, [storageApi]);\n\n return {\n settings,\n updateSettings,\n getSetting,\n setSetting,\n resetSettings,\n isLoaded,\n };\n};\n"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -2,7 +2,7 @@ import * as _backstage_core_plugin_api from '@backstage/core-plugin-api';
2
2
  import { IdentityApi } from '@backstage/core-plugin-api';
3
3
  import * as _backstage_frontend_plugin_api from '@backstage/frontend-plugin-api';
4
4
  import * as _drodil_backstage_plugin_qeta_common from '@drodil/backstage-plugin-qeta-common';
5
- import { QetaApi, TimelineItem, PostType, PostStatus, PostResponse, Template, PostsResponse, AnswersResponse, AnswerResponse, Collection, Post, PostsQuery, CollectionResponse, TagResponse, Answer, Comment, Stat, Badge, TemplatesResponse, Article, UserResponse, AIQuery } from '@drodil/backstage-plugin-qeta-common';
5
+ import { QetaApi, TimelineItem, PostType, PostStatus, PostResponse, Template, AnswerResponse, Collection, Post, PostsQuery, CollectionResponse, TagResponse, Answer, Comment, Stat, Badge, EntityResponse, UserResponse, TemplatesResponse, Article, AIQuery } from '@drodil/backstage-plugin-qeta-common';
6
6
  import * as react_jsx_runtime from 'react/jsx-runtime';
7
7
  import { Entity, UserEntity } from '@backstage/catalog-model';
8
8
  import * as react from 'react';
@@ -10,7 +10,9 @@ import { CSSProperties, ReactNode, KeyboardEvent, MouseEvent, Dispatch, SetState
10
10
  import { LinkProps } from '@backstage/core-components';
11
11
  import { SvgIconProps } from '@material-ui/core';
12
12
  import { PluggableList } from 'unified';
13
+ import * as _material_ui_styles from '@material-ui/styles';
13
14
  import * as react_use_lib_useAsyncFn from 'react-use/lib/useAsyncFn';
15
+ import * as react_router_dom from 'react-router-dom';
14
16
  import { Overrides } from '@material-ui/core/styles/overrides';
15
17
  import { StyleRules } from '@material-ui/core/styles/withStyles';
16
18
 
@@ -41,6 +43,7 @@ declare const entitiesRouteRef: _backstage_core_plugin_api.SubRouteRef<undefined
41
43
  declare const entityRouteRef: _backstage_core_plugin_api.SubRouteRef<_backstage_core_plugin_api.PathParams<"/entities/:entityRef">>;
42
44
  declare const moderatorRouteRef: _backstage_core_plugin_api.SubRouteRef<undefined>;
43
45
  declare const reviewRouteRef: _backstage_core_plugin_api.SubRouteRef<undefined>;
46
+ declare const settingsRouteRef: _backstage_core_plugin_api.SubRouteRef<undefined>;
44
47
 
45
48
  declare const qetaApiRef: _backstage_frontend_plugin_api.ApiRef<QetaApi>;
46
49
 
@@ -102,19 +105,6 @@ type Filters = {
102
105
  dateRange?: string;
103
106
  status?: PostStatus;
104
107
  };
105
- type PostFilters = Filters & {
106
- orderBy?: 'rank' | 'created' | 'title' | 'views' | 'score' | 'trend' | 'answersCount' | 'updated';
107
- noAnswers?: 'true' | 'false';
108
- noCorrectAnswer?: 'true' | 'false';
109
- noVotes?: 'true' | 'false';
110
- collectionId?: number;
111
- type?: PostType;
112
- entities?: string[];
113
- tags?: string[];
114
- tagsRelation?: 'and' | 'or';
115
- entitiesRelation?: 'and' | 'or';
116
- status?: PostStatus;
117
- };
118
108
  type Change<T extends Filters> = {
119
109
  key: keyof T;
120
110
  value?: string | string[];
@@ -139,7 +129,9 @@ interface ViewToggleProps {
139
129
  }
140
130
  declare const ViewToggle: ({ view, onChange }: ViewToggleProps) => react_jsx_runtime.JSX.Element;
141
131
 
142
- type PaginatedPostsProps = PostFilters & {
132
+ type PostsContainerProps = {
133
+ type?: PostType;
134
+ tags?: string[];
143
135
  author?: string;
144
136
  showFilters?: boolean;
145
137
  showTitle?: boolean;
@@ -149,52 +141,41 @@ type PaginatedPostsProps = PostFilters & {
149
141
  showWriteButton?: boolean;
150
142
  showLinkButton?: boolean;
151
143
  showNoQuestionsBtn?: boolean;
152
- initialPageSize?: number;
153
144
  collectionId?: number;
154
- status?: PostStatus;
155
- };
156
-
157
- type PostsContainerProps = PaginatedPostsProps & {
145
+ initialPageSize?: number;
158
146
  entity?: string;
159
147
  filterPanelProps?: CommonFilterPanelProps;
160
148
  showTypeLabel?: boolean;
149
+ allowRanking?: boolean;
150
+ defaultView?: ViewType;
161
151
  view?: ViewType;
162
152
  onViewChange?: (view: ViewType) => void;
153
+ status?: string;
154
+ prefix?: string;
155
+ orderBy?: 'rank' | 'created' | 'title' | 'views' | 'score' | 'trend' | 'answersCount' | 'updated';
163
156
  };
164
157
  declare const PostsContainer: (props: PostsContainerProps) => react_jsx_runtime.JSX.Element;
165
158
 
166
- declare const PostList: (props: {
167
- loading: boolean;
168
- error: any;
169
- response?: PostsResponse;
170
- entity?: string;
171
- tags?: string[];
172
- showNoQuestionsBtn?: boolean;
173
- entityPage?: boolean;
174
- type?: PostType;
175
- showTypeLabel?: boolean;
176
- hasMore?: boolean;
177
- loadNextPage?: () => void;
178
- }) => react_jsx_runtime.JSX.Element;
179
-
180
159
  interface PostListItemProps {
181
160
  post: PostResponse;
182
161
  entity?: string;
183
162
  type?: PostType;
184
163
  showTypeLabel?: boolean;
164
+ allowRanking?: boolean;
165
+ onRankUpdate?: () => void;
166
+ collectionId?: number;
185
167
  }
186
168
  declare const PostListItem: (props: PostListItemProps) => react_jsx_runtime.JSX.Element;
187
169
 
188
- declare const AnswerList: (props: {
189
- loading: boolean;
190
- error: any;
191
- response?: AnswersResponse;
170
+ interface PostsGridItemProps {
171
+ post: PostResponse;
192
172
  entity?: string;
193
- tags?: string[];
194
- entityPage?: boolean;
195
- hasMore?: boolean;
196
- loadNextPage?: () => void;
197
- }) => react_jsx_runtime.JSX.Element;
173
+ type?: PostType;
174
+ allowRanking?: boolean;
175
+ onRankUpdate?: () => void;
176
+ collectionId?: number;
177
+ }
178
+ declare const PostsGridItem: (props: PostsGridItemProps) => react_jsx_runtime.JSX.Element;
198
179
 
199
180
  interface AnswersContainerProps {
200
181
  tags?: string[];
@@ -203,6 +184,7 @@ interface AnswersContainerProps {
203
184
  showFilters?: boolean;
204
185
  showTitle?: boolean;
205
186
  title?: string;
187
+ prefix?: string;
206
188
  }
207
189
  declare const AnswersContainer: (props: AnswersContainerProps) => react_jsx_runtime.JSX.Element;
208
190
 
@@ -212,6 +194,12 @@ interface AnswerListItemProps {
212
194
  }
213
195
  declare const AnswerListItem: (props: AnswerListItemProps) => react_jsx_runtime.JSX.Element;
214
196
 
197
+ interface AnswersGridItemProps {
198
+ answer: AnswerResponse;
199
+ entity?: string;
200
+ }
201
+ declare const AnswersGridItem: (props: AnswersGridItemProps) => react_jsx_runtime.JSX.Element;
202
+
215
203
  declare const AskQuestionButton: (props: {
216
204
  entity?: string;
217
205
  tags?: string[];
@@ -274,6 +262,13 @@ interface ContentHeaderButtonProps {
274
262
  }
275
263
  declare const ContentHeaderButton: (props: ContentHeaderButtonProps) => react_jsx_runtime.JSX.Element;
276
264
 
265
+ interface RankingButtonsProps {
266
+ postId: number;
267
+ collectionId: number | undefined;
268
+ onRankUpdate?: () => void;
269
+ }
270
+ declare const RankingButtons: (props: RankingButtonsProps) => react_jsx_runtime.JSX.Element | null;
271
+
277
272
  declare const PostHighlightListContent: (props: {
278
273
  loading?: boolean;
279
274
  error?: any;
@@ -421,19 +416,61 @@ declare const TopRankingUsers: (props: {
421
416
 
422
417
  declare const TrophyIcon: (props: SvgIconProps) => react_jsx_runtime.JSX.Element;
423
418
 
424
- declare const TagsGrid: () => react_jsx_runtime.JSX.Element;
419
+ declare const TagsContainer: (props: {
420
+ filterPanelProps?: CommonFilterPanelProps;
421
+ defaultView?: ViewType;
422
+ }) => react_jsx_runtime.JSX.Element;
425
423
 
426
- declare const EntitiesGrid: () => react_jsx_runtime.JSX.Element;
424
+ declare const TagGridItem: (props: {
425
+ tag: TagResponse;
426
+ onTagEdit: () => void;
427
+ isModerator?: boolean;
428
+ }) => react_jsx_runtime.JSX.Element;
427
429
 
428
- declare const UsersGrid: () => react_jsx_runtime.JSX.Element;
430
+ declare const TagListItem: (props: {
431
+ tag: TagResponse;
432
+ onTagEdit: () => void;
433
+ isModerator?: boolean;
434
+ }) => react_jsx_runtime.JSX.Element;
429
435
 
430
- type PostGridProps = PaginatedPostsProps & {
431
- allowRanking?: boolean;
436
+ declare const CreateTagModal: (props: {
437
+ open: boolean;
438
+ onClose: () => void;
439
+ isModerator?: boolean;
440
+ }) => react_jsx_runtime.JSX.Element;
441
+
442
+ declare const EditTagModal: (props: {
443
+ tag: TagResponse;
444
+ open: boolean;
445
+ onClose: () => void;
446
+ isModerator?: boolean;
447
+ }) => react_jsx_runtime.JSX.Element;
448
+
449
+ declare const EntitiesContainer: (props: {
432
450
  filterPanelProps?: CommonFilterPanelProps;
433
- view?: ViewType;
434
- onViewChange?: (view: ViewType) => void;
435
- };
436
- declare const PostsGrid: (props: PostGridProps) => react_jsx_runtime.JSX.Element;
451
+ defaultView?: ViewType;
452
+ }) => react_jsx_runtime.JSX.Element;
453
+
454
+ declare const EntitiesGridItem: (props: {
455
+ entity: EntityResponse;
456
+ }) => react_jsx_runtime.JSX.Element;
457
+
458
+ declare const EntityListItem: (props: {
459
+ entity: EntityResponse;
460
+ }) => react_jsx_runtime.JSX.Element;
461
+
462
+ declare const UsersContainer: (props: {
463
+ filterPanelProps?: CommonFilterPanelProps;
464
+ defaultView?: ViewType;
465
+ }) => react_jsx_runtime.JSX.Element;
466
+
467
+ declare const UsersGridItem: (props: {
468
+ user: UserResponse;
469
+ }) => react_jsx_runtime.JSX.Element;
470
+
471
+ declare const UserListItem: (props: {
472
+ user: UserResponse;
473
+ }) => react_jsx_runtime.JSX.Element;
437
474
 
438
475
  type QetaArticleContentClassKey = 'content' | 'headerImage' | 'commentSection' | 'commentSectionContainer';
439
476
  declare const ArticleContent: (props: {
@@ -447,12 +484,12 @@ type CollectionFormProps = {
447
484
  };
448
485
  declare const CollectionForm: (props: CollectionFormProps) => react_jsx_runtime.JSX.Element;
449
486
 
450
- type CollectionsGridProps = {
451
- owner?: string;
452
- showFilters?: boolean;
487
+ declare const CollectionsContainer: (props: {
453
488
  filterPanelProps?: CommonFilterPanelProps;
454
- };
455
- declare const CollectionsGrid: (props: CollectionsGridProps) => react_jsx_runtime.JSX.Element;
489
+ defaultView?: ViewType;
490
+ owner?: string;
491
+ prefix?: string;
492
+ }) => react_jsx_runtime.JSX.Element;
456
493
 
457
494
  declare const LeftMenu: (props: {
458
495
  onKeyDown?: (event: KeyboardEvent) => void;
@@ -577,6 +614,21 @@ declare function useQetaApi<T>(f: (api: QetaApi) => Promise<T>, deps?: any[]): {
577
614
  value: T;
578
615
  };
579
616
 
617
+ declare function useVoting(resp: PostResponse | AnswerResponse): {
618
+ entity: _drodil_backstage_plugin_qeta_common.Post | _drodil_backstage_plugin_qeta_common.Answer;
619
+ ownVote: number;
620
+ correctAnswer: boolean;
621
+ score: number;
622
+ voteUp: () => void;
623
+ voteDown: () => void;
624
+ toggleCorrectAnswer: () => void;
625
+ voteUpTooltip: string;
626
+ voteDownTooltip: string;
627
+ correctTooltip: string;
628
+ };
629
+
630
+ declare const useListItemStyles: (props?: any) => _material_ui_styles.ClassNameMap<"root">;
631
+
580
632
  declare const useTagsFollow: () => {
581
633
  tags: string[];
582
634
  followTag: (tag: string) => void;
@@ -652,6 +704,70 @@ declare const useCanReview: () => {
652
704
  type GridType = 'posts' | 'tags' | 'entities' | 'users' | 'collections';
653
705
  declare function useGridPageSize(gridType: GridType, basePageSize?: number): number;
654
706
 
707
+ type QetaEntitiesProps<T, F> = {
708
+ fetch: (api: QetaApi, limit: number, offset: number, filters: F) => Promise<{
709
+ items: T[];
710
+ total: number;
711
+ }>;
712
+ initialFilters: F;
713
+ prefix: string;
714
+ defaultPageSize?: number;
715
+ filterKeys?: string[];
716
+ fetchDeps?: any[];
717
+ getKey?: (item: T) => string | number;
718
+ usePagination?: boolean;
719
+ };
720
+ type FilterChange<F> = {
721
+ key: keyof F;
722
+ value?: F[keyof F] | string | string[];
723
+ };
724
+ declare function useQetaEntities<T, F>(props: QetaEntitiesProps<T, F>): {
725
+ page: number;
726
+ setPage: react.Dispatch<react.SetStateAction<number>>;
727
+ pageSize: number;
728
+ setPageSize: react.Dispatch<react.SetStateAction<number>>;
729
+ showFilterPanel: boolean;
730
+ setShowFilterPanel: react.Dispatch<react.SetStateAction<boolean>>;
731
+ searchParams: URLSearchParams;
732
+ setSearchParams: react_router_dom.SetURLSearchParams;
733
+ searchQuery: string;
734
+ setSearchQuery: react.Dispatch<react.SetStateAction<string>>;
735
+ filters: F;
736
+ setFilters: react.Dispatch<react.SetStateAction<F>>;
737
+ onPageChange: (value: number) => void;
738
+ onPageSizeChange: (value: number) => void;
739
+ onFilterChange: (changes: FilterChange<F> | FilterChange<F>[]) => void;
740
+ onSearchQueryChange: (query: string) => void;
741
+ response: {
742
+ items: T[];
743
+ total: number;
744
+ } | undefined;
745
+ items: T[];
746
+ hasMore: boolean;
747
+ total: number;
748
+ loading: boolean;
749
+ error: Error | undefined;
750
+ loadNextPage: () => void;
751
+ retry: (() => void) | (() => void) | (() => void) | (() => void);
752
+ fetchNextPage: () => void;
753
+ };
754
+
755
+ type UserSettings = {
756
+ autoSaveEnabled: boolean;
757
+ filterPanelExpanded: Record<string, boolean>;
758
+ viewType: Record<string, ViewType>;
759
+ aiAnswerExpanded: boolean;
760
+ usePagination: boolean;
761
+ };
762
+ declare const useUserSettings: () => {
763
+ settings: UserSettings;
764
+ updateSettings: (updates: Partial<UserSettings>) => Promise<void>;
765
+ getSetting: <K extends keyof UserSettings>(key: K) => UserSettings[K];
766
+ setSetting: <K extends keyof UserSettings>(key: K, value: UserSettings[K]) => Promise<void>;
767
+ resetSettings: () => Promise<void>;
768
+ isLoaded: boolean;
769
+ };
770
+
655
771
  /** @alpha */
656
772
  declare const qetaTranslationRef: _backstage_frontend_plugin_api.TranslationRef<"qeta", {
657
773
  readonly "answer.questionTitle": "Q: {{question}}";
@@ -711,6 +827,7 @@ declare const qetaTranslationRef: _backstage_frontend_plugin_api.TranslationRef<
711
827
  readonly "common.draft": "Draft";
712
828
  readonly "common.deleted": "Deleted";
713
829
  readonly "common.score": "{{score}} score";
830
+ readonly "common.error": "Error";
714
831
  readonly "common.answers": "answers";
715
832
  readonly "common.links": "links";
716
833
  readonly "common.questions": "questions";
@@ -938,6 +1055,7 @@ declare const qetaTranslationRef: _backstage_frontend_plugin_api.TranslationRef<
938
1055
  readonly "leftMenu.articles": "Articles";
939
1056
  readonly "leftMenu.moderate": "Moderate";
940
1057
  readonly "leftMenu.review": "Review";
1058
+ readonly "leftMenu.settings": "Settings";
941
1059
  readonly "leftMenu.manage": "Manage";
942
1060
  readonly "leftMenu.buttonLabel": "Menu";
943
1061
  readonly "leftMenu.home": "Home";
@@ -951,6 +1069,35 @@ declare const qetaTranslationRef: _backstage_frontend_plugin_api.TranslationRef<
951
1069
  readonly "moderatorPage.tools": "Tools";
952
1070
  readonly "moderatorPage.templatesInfo": "Templates can be used to prefill question content for the user";
953
1071
  readonly "moderatorPage.deletedPosts": "Deleted posts";
1072
+ readonly "settingsPage.title": "User Settings";
1073
+ readonly "settingsPage.autoSave.description": "Automatically save your drafts while writing questions and articles";
1074
+ readonly "settingsPage.autoSave.label": "Enable Auto-save";
1075
+ readonly "settingsPage.editorPreferences": "Editor Preferences";
1076
+ readonly "settingsPage.displayPreferences": "Display Preferences";
1077
+ readonly "settingsPage.aiAnswerExpanded.description": "Show AI-generated answers in expanded state when viewing questions";
1078
+ readonly "settingsPage.aiAnswerExpanded.label": "Expand AI Answers by Default";
1079
+ readonly "settingsPage.usePagination.description": "Use traditional pagination instead of infinite scrolling to load more items";
1080
+ readonly "settingsPage.usePagination.label": "Use Pagination";
1081
+ readonly "settingsPage.viewTypePreferences.title": "View Type Preferences";
1082
+ readonly "settingsPage.viewTypePreferences.default": "Default";
1083
+ readonly "settingsPage.viewTypePreferences.description": "Choose how you want to view different types of content. Select \"Default\" to use the system default view.";
1084
+ readonly "settingsPage.viewTypePreferences.labels.tags": "Tags";
1085
+ readonly "settingsPage.viewTypePreferences.labels.entities": "Entities";
1086
+ readonly "settingsPage.viewTypePreferences.labels.users": "Users";
1087
+ readonly "settingsPage.viewTypePreferences.labels.collections": "Collections";
1088
+ readonly "settingsPage.viewTypePreferences.labels.links": "Links";
1089
+ readonly "settingsPage.viewTypePreferences.labels.questions": "Questions";
1090
+ readonly "settingsPage.viewTypePreferences.labels.favorites": "Favorites";
1091
+ readonly "settingsPage.viewTypePreferences.labels.articles": "Articles";
1092
+ readonly "settingsPage.viewTypePreferences.labels.tagPosts": "Tag page posts";
1093
+ readonly "settingsPage.viewTypePreferences.labels.collectionPosts": "Collection page posts";
1094
+ readonly "settingsPage.viewTypePreferences.labels.userQuestions": "User page questions";
1095
+ readonly "settingsPage.viewTypePreferences.labels.userArticles": "User page articles";
1096
+ readonly "settingsPage.viewTypePreferences.labels.userLinks": "User page links";
1097
+ readonly "settingsPage.viewTypePreferences.labels.userCollections": "User page collections";
1098
+ readonly "settingsPage.viewTypePreferences.labels.userAnswers": "User page answers";
1099
+ readonly "settingsPage.viewTypePreferences.grid": "Grid";
1100
+ readonly "settingsPage.viewTypePreferences.list": "List";
954
1101
  readonly "suggestionsCard.title": "Suggestions";
955
1102
  readonly "suggestionsCard.noSuggestions": "No suggestions";
956
1103
  readonly "suggestionsCard.noCorrectAnswer1": "Your question \"{{title}}\" does not have a correct answer";
@@ -1115,6 +1262,7 @@ declare const qetaTranslationRef: _backstage_frontend_plugin_api.TranslationRef<
1115
1262
  readonly "datePicker.range.last7days": "Last 7 days";
1116
1263
  readonly "datePicker.range.last30days": "Last 30 days";
1117
1264
  readonly "datePicker.range.custom": "Custom";
1265
+ readonly "pagination.defaultTooltip": "Items per page";
1118
1266
  readonly "filterPanel.entitiesRelation.label": "Entities relation";
1119
1267
  readonly "filterPanel.noAnswers.label": "No answers";
1120
1268
  readonly "filterPanel.noVotes.label": "No votes";
@@ -1175,6 +1323,7 @@ declare const qetaTranslationRef: _backstage_frontend_plugin_api.TranslationRef<
1175
1323
  readonly "postsTable.cells.updated": "Last updated";
1176
1324
  readonly "postsTable.cells.title": "Title";
1177
1325
  readonly "postsTable.cells.asked": "Asked";
1326
+ readonly "tagPage.tags": "Tags";
1178
1327
  readonly "tagPage.search.label": "Search tag";
1179
1328
  readonly "tagPage.search.placeholder": "Search...";
1180
1329
  readonly "tagPage.errorLoading": "Could not load tags";
@@ -1183,6 +1332,7 @@ declare const qetaTranslationRef: _backstage_frontend_plugin_api.TranslationRef<
1183
1332
  readonly "tagPage.tags_zero": "No tags";
1184
1333
  readonly "tagPage.tags_one": "{{count}} tag";
1185
1334
  readonly "tagPage.tags_other": "{{count}} tags";
1335
+ readonly "entitiesPage.entities": "Entities";
1186
1336
  readonly "entitiesPage.search.label": "Search entity";
1187
1337
  readonly "entitiesPage.search.placeholder": "Search...";
1188
1338
  readonly "entitiesPage.errorLoading": "Could not load entities";
@@ -1197,6 +1347,7 @@ declare const qetaTranslationRef: _backstage_frontend_plugin_api.TranslationRef<
1197
1347
  readonly "aiAnswerCard.show": "Show";
1198
1348
  readonly "aiAnswerCard.hide": "Hide";
1199
1349
  readonly "usersPage.title": "Users";
1350
+ readonly "usersPage.users": "Users";
1200
1351
  readonly "usersPage.search.label": "Search user";
1201
1352
  readonly "usersPage.search.placeholder": "Search...";
1202
1353
  readonly "usersPage.errorLoading": "Could not load users";
@@ -1317,4 +1468,4 @@ type QetaOverrides = Overrides & {
1317
1468
  [Name in keyof QetaComponentsNameToClassKey]?: Partial<StyleRules<QetaComponentsNameToClassKey[Name]>>;
1318
1469
  };
1319
1470
 
1320
- export { AIAnswerCard, AddToCollectionButton, AnswerCard, AnswerForm, AnswerList, AnswerListItem, AnswersContainer, ArticleContent, AskQuestionButton, AuthorLink, BadgeChip, ButtonContainer, CollectionFollowButton, CollectionForm, CollectionsGrid, ContentHeader, ContentHeaderButton, ContentHeaderCard, type ContentHeaderCardProps, type ContentHeaderProps, CreateCollectionButton, CreateLinkButton, DeleteModal, DeletedBanner, DraftBanner, EntitiesGrid, EntityFollowButton, FaviconItem, FilterPanel, FollowedCollectionsList, FollowedEntitiesList, FollowedTagsList, FollowedUsersList, type GridType, ImpactCard, LeftMenu, LeftMenuButton, LinkCard, MarkdownRenderer, ObsoleteBanner, ObsoleteModal, OpenLinkButton, PostForm, type PostGridProps, PostHighlightList, PostHighlightListContainer, PostHighlightListContent, PostList, PostListItem, PostsCard, PostsContainer, type PostsContainerProps, PostsGrid, PostsTable, QetaContext, type QetaContextProps, type QetaOverrides, QetaProvider, QuestionCard, type QuestionFormValues, QuestionsTable, RelativeTimeWithTooltip, SelectTemplateList, StatsChart, StatusChip, SuggestionsCard, type TagAndEntitiesFormValues, TagFollowButton, TagsGrid, type TemplateFormValues, TemplateList, Timeline, TimelineItemCard, TopRankingUsers, TrophyIcon, UpdatedByLink, UserBadges, UserFollowButton, UserLink, UsersGrid, ValidReviewModal, ViewToggle, type ViewType, WriteArticleButton, articleRouteRef, articlesRouteRef, askRouteRef, collectionCreateRouteRef, collectionEditRouteRef, collectionRouteRef, collectionsRouteRef, createLinkRouteRef, editArticleRouteRef, editLinkRouteRef, editQuestionRouteRef, entitiesRouteRef, entityRouteRef, favoriteQuestionsRouteRef, linkRouteRef, linksRouteRef, moderatorRouteRef, qetaApiRef, qetaRouteRef, qetaTranslationRef, qetaTranslations, questionRouteRef, questionsRouteRef, reviewRouteRef, statisticsRouteRef, tagRouteRef, tagsRouteRef, useAI, useCanReview, useCollectionsFollow, useEntityAuthor, useEntityFollow, useGridPageSize, useIdentityApi, useIsModerator, useQetaApi, useQetaContext, useTagsFollow, useUserFollow, useUserInfo, userRouteRef, usersRouteRef, writeRouteRef };
1471
+ export { AIAnswerCard, AddToCollectionButton, AnswerCard, AnswerForm, AnswerListItem, AnswersContainer, AnswersGridItem, ArticleContent, AskQuestionButton, AuthorLink, BadgeChip, ButtonContainer, CollectionFollowButton, CollectionForm, CollectionsContainer, ContentHeader, ContentHeaderButton, ContentHeaderCard, type ContentHeaderCardProps, type ContentHeaderProps, CreateCollectionButton, CreateLinkButton, CreateTagModal, DeleteModal, DeletedBanner, DraftBanner, EditTagModal, EntitiesContainer, EntitiesGridItem, EntityFollowButton, EntityListItem, FaviconItem, type FilterChange, FilterPanel, FollowedCollectionsList, FollowedEntitiesList, FollowedTagsList, FollowedUsersList, type GridType, ImpactCard, LeftMenu, LeftMenuButton, LinkCard, MarkdownRenderer, ObsoleteBanner, ObsoleteModal, OpenLinkButton, PostForm, PostHighlightList, PostHighlightListContainer, PostHighlightListContent, PostListItem, PostsCard, PostsContainer, type PostsContainerProps, PostsGridItem, PostsTable, QetaContext, type QetaContextProps, type QetaEntitiesProps, type QetaOverrides, QetaProvider, QuestionCard, type QuestionFormValues, QuestionsTable, RankingButtons, RelativeTimeWithTooltip, SelectTemplateList, StatsChart, StatusChip, SuggestionsCard, type TagAndEntitiesFormValues, TagFollowButton, TagGridItem, TagListItem, TagsContainer, type TemplateFormValues, TemplateList, Timeline, TimelineItemCard, TopRankingUsers, TrophyIcon, UpdatedByLink, UserBadges, UserFollowButton, UserLink, UserListItem, type UserSettings, UsersContainer, UsersGridItem, ValidReviewModal, ViewToggle, type ViewType, WriteArticleButton, articleRouteRef, articlesRouteRef, askRouteRef, collectionCreateRouteRef, collectionEditRouteRef, collectionRouteRef, collectionsRouteRef, createLinkRouteRef, editArticleRouteRef, editLinkRouteRef, editQuestionRouteRef, entitiesRouteRef, entityRouteRef, favoriteQuestionsRouteRef, linkRouteRef, linksRouteRef, moderatorRouteRef, qetaApiRef, qetaRouteRef, qetaTranslationRef, qetaTranslations, questionRouteRef, questionsRouteRef, reviewRouteRef, settingsRouteRef, statisticsRouteRef, tagRouteRef, tagsRouteRef, useAI, useCanReview, useCollectionsFollow, useEntityAuthor, useEntityFollow, useGridPageSize, useIdentityApi, useIsModerator, useListItemStyles, useQetaApi, useQetaContext, useQetaEntities, useTagsFollow, useUserFollow, useUserInfo, useUserSettings, useVoting, userRouteRef, usersRouteRef, writeRouteRef };
package/dist/index.esm.js CHANGED
@@ -1,15 +1,15 @@
1
- export { articleRouteRef, articlesRouteRef, askRouteRef, collectionCreateRouteRef, collectionEditRouteRef, collectionRouteRef, collectionsRouteRef, createLinkRouteRef, editArticleRouteRef, editLinkRouteRef, editQuestionRouteRef, entitiesRouteRef, entityRouteRef, favoriteQuestionsRouteRef, linkRouteRef, linksRouteRef, moderatorRouteRef, qetaRouteRef, questionRouteRef, questionsRouteRef, reviewRouteRef, statisticsRouteRef, tagRouteRef, tagsRouteRef, userRouteRef, usersRouteRef, writeRouteRef } from './routes.esm.js';
1
+ export { articleRouteRef, articlesRouteRef, askRouteRef, collectionCreateRouteRef, collectionEditRouteRef, collectionRouteRef, collectionsRouteRef, createLinkRouteRef, editArticleRouteRef, editLinkRouteRef, editQuestionRouteRef, entitiesRouteRef, entityRouteRef, favoriteQuestionsRouteRef, linkRouteRef, linksRouteRef, moderatorRouteRef, qetaRouteRef, questionRouteRef, questionsRouteRef, reviewRouteRef, settingsRouteRef, statisticsRouteRef, tagRouteRef, tagsRouteRef, userRouteRef, usersRouteRef, writeRouteRef } from './routes.esm.js';
2
2
  export { qetaApiRef } from './api.esm.js';
3
3
  export { Timeline } from './components/Timeline/Timeline.esm.js';
4
4
  export { TimelineItemCard } from './components/Timeline/TimelineItem.esm.js';
5
5
  export { PostForm } from './components/PostForm/PostForm.esm.js';
6
6
  export { PostsContainer } from './components/PostsContainer/PostsContainer.esm.js';
7
- export { PostList } from './components/PostsContainer/PostList.esm.js';
8
7
  export { PostListItem } from './components/PostsContainer/PostListItem.esm.js';
8
+ export { PostsGridItem } from './components/PostsContainer/PostsGridItem.esm.js';
9
9
  export { FilterPanel } from './components/FilterPanel/FilterPanel.esm.js';
10
- export { AnswerList } from './components/AnswersContainer/AnswerList.esm.js';
11
10
  export { AnswersContainer } from './components/AnswersContainer/AnswersContainer.esm.js';
12
11
  export { AnswerListItem } from './components/AnswersContainer/AnswerListItem.esm.js';
12
+ export { AnswersGridItem } from './components/AnswersContainer/AnswersGridItem.esm.js';
13
13
  export { AskQuestionButton } from './components/Buttons/AskQuestionButton.esm.js';
14
14
  export { EntityFollowButton } from './components/Buttons/EntityFollowButton.esm.js';
15
15
  export { TagFollowButton } from './components/Buttons/TagFollowButton.esm.js';
@@ -22,6 +22,7 @@ export { UserFollowButton } from './components/Buttons/UserFollowButton.esm.js';
22
22
  export { CollectionFollowButton } from './components/Buttons/CollectionFollowButton.esm.js';
23
23
  export { ButtonContainer } from './components/Buttons/ButtonContainer.esm.js';
24
24
  export { ContentHeaderButton } from './components/Buttons/ContentHeaderButton.esm.js';
25
+ export { RankingButtons } from './components/Buttons/RankingButtons.esm.js';
25
26
  export { PostHighlightList, PostHighlightListContent } from './components/PostHighlightList/PostHighlightList.esm.js';
26
27
  export { PostHighlightListContainer } from './components/PostHighlightList/PostHighlightListContainer.esm.js';
27
28
  export { MarkdownRenderer } from './components/MarkdownRenderer/MarkdownRenderer.esm.js';
@@ -45,13 +46,20 @@ export { BadgeChip } from './components/Badges/BadgeChip.esm.js';
45
46
  export { UserBadges } from './components/Badges/UserBadges.esm.js';
46
47
  export { TopRankingUsers } from './components/TopRankingUsersCard/TopRankingUsersCard.esm.js';
47
48
  export { TrophyIcon } from './components/TopRankingUsersCard/TrophyIcon.esm.js';
48
- export { TagsGrid } from './components/TagsGrid/TagsGrid.esm.js';
49
- export { EntitiesGrid } from './components/EntitiesGrid/EntitiesGrid.esm.js';
50
- export { UsersGrid } from './components/UsersGrid/UsersGrid.esm.js';
51
- export { PostsGrid } from './components/PostsGrid/PostsGrid.esm.js';
49
+ export { TagsContainer } from './components/TagsContainer/TagsContainer.esm.js';
50
+ export { TagGridItem } from './components/TagsContainer/TagGridItem.esm.js';
51
+ export { TagListItem } from './components/TagsContainer/TagListItem.esm.js';
52
+ export { CreateTagModal } from './components/TagsContainer/CreateTagModal.esm.js';
53
+ export { EditTagModal } from './components/TagsContainer/EditTagModal.esm.js';
54
+ export { EntitiesContainer } from './components/EntitiesContainer/EntitiesContainer.esm.js';
55
+ export { EntitiesGridItem } from './components/EntitiesContainer/EntitiesGridItem.esm.js';
56
+ export { EntityListItem } from './components/EntitiesContainer/EntityListItem.esm.js';
57
+ export { UsersContainer } from './components/UsersContainer/UsersContainer.esm.js';
58
+ export { UsersGridItem } from './components/UsersContainer/UsersGridItem.esm.js';
59
+ export { UserListItem } from './components/UsersContainer/UserListItem.esm.js';
52
60
  export { ArticleContent } from './components/ArticleContent/ArticleContent.esm.js';
53
61
  export { CollectionForm } from './components/CollectionForm/CollectionForm.esm.js';
54
- export { CollectionsGrid } from './components/CollectionsGrid/CollectionsGrid.esm.js';
62
+ export { CollectionsContainer } from './components/CollectionsContainer/CollectionsContainer.esm.js';
55
63
  export { LeftMenu } from './components/LeftMenu/LeftMenu.esm.js';
56
64
  export { LeftMenuButton } from './components/LeftMenu/LeftMenuButton.esm.js';
57
65
  export { TemplateList } from './components/TemplateList/TemplateList.esm.js';
@@ -67,10 +75,13 @@ export { DeletedBanner } from './components/Utility/DeletedBanner.esm.js';
67
75
  export { DraftBanner } from './components/Utility/DraftBanner.esm.js';
68
76
  export { ObsoleteBanner } from './components/Utility/ObsoleteBanner.esm.js';
69
77
  export { StatusChip } from './components/Utility/StatusChip.esm.js';
78
+ import './components/Utility/QetaPagination.esm.js';
70
79
  export { ContentHeaderCard } from './components/ContentHeaderCard/ContentHeaderCard.esm.js';
71
80
  export { ContentHeader } from './components/ContentHeader/ContentHeader.esm.js';
72
81
  export { ViewToggle } from './components/ViewToggle/ViewToggle.esm.js';
73
82
  export { useQetaApi } from './hooks/useQetaApi.esm.js';
83
+ export { useVoting } from './hooks/useVoting.esm.js';
84
+ export { useListItemStyles } from './hooks/useListItemStyles.esm.js';
74
85
  export { useTagsFollow } from './hooks/useTagsFollow.esm.js';
75
86
  export { useEntityFollow } from './hooks/useEntityFollow.esm.js';
76
87
  export { useEntityAuthor, useUserInfo } from './hooks/useEntityAuthor.esm.js';
@@ -81,5 +92,7 @@ export { useIsModerator } from './hooks/useIsModerator.esm.js';
81
92
  export { useAI } from './hooks/useAI.esm.js';
82
93
  export { useCanReview } from './hooks/useCanReview.esm.js';
83
94
  export { useGridPageSize } from './hooks/useGridPageSize.esm.js';
95
+ export { useQetaEntities } from './hooks/useQetaEntities.esm.js';
96
+ export { useUserSettings } from './hooks/useUserSettings.esm.js';
84
97
  export { qetaTranslationRef, qetaTranslations } from './translation.esm.js';
85
98
  //# sourceMappingURL=index.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}