@drodil/backstage-plugin-qeta-react 3.55.3 → 3.55.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/ArticleContent/ArticleButtons.esm.js +1 -1
- package/dist/components/Badges/BadgeChip.esm.js +14 -6
- package/dist/components/Badges/BadgeChip.esm.js.map +1 -1
- package/dist/components/Badges/UserBadges.esm.js +2 -2
- package/dist/components/Badges/UserBadges.esm.js.map +1 -1
- package/dist/components/Buttons/AddToCollectionButton.esm.js +1 -1
- package/dist/components/Buttons/EntityFollowButton.esm.js +1 -1
- package/dist/components/Buttons/TagFollowButton.esm.js +1 -1
- package/dist/components/Buttons/UserFollowButton.esm.js +1 -1
- package/dist/components/CollectionsContainer/CollectionListItem.esm.js +1 -1
- package/dist/components/CollectionsContainer/CollectionsContainer.esm.js +6 -0
- package/dist/components/CollectionsContainer/CollectionsContainer.esm.js.map +1 -1
- package/dist/components/ContentHeader/ContentHeader.esm.js +1 -1
- package/dist/components/EntitiesContainer/EntitiesContainer.esm.js +3 -1
- package/dist/components/EntitiesContainer/EntitiesContainer.esm.js.map +1 -1
- package/dist/components/EntitiesContainer/EntityListItem.esm.js +1 -1
- package/dist/components/FollowedLists/FollowedEntitiesList.esm.js +1 -1
- package/dist/components/FollowedLists/FollowedTagsList.esm.js +1 -1
- package/dist/components/FollowedLists/FollowedUsersList.esm.js +1 -1
- package/dist/components/HomePageCards/ImpactCard.esm.js +1 -1
- package/dist/components/HomePageCards/PostsCard.esm.js +2 -1
- package/dist/components/HomePageCards/PostsCard.esm.js.map +1 -1
- package/dist/components/LeftMenu/LeftMenu.esm.js +5 -16
- package/dist/components/LeftMenu/LeftMenu.esm.js.map +1 -1
- package/dist/components/LinkCard/LinkCard.esm.js +1 -1
- package/dist/components/Links/Links.esm.js +1 -1
- package/dist/components/PostHighlightList/PostHighlightList.esm.js +1 -1
- package/dist/components/PostsContainer/PostListItem.esm.js +1 -1
- package/dist/components/PostsContainer/PostsContainer.esm.js +2 -1
- package/dist/components/PostsContainer/PostsContainer.esm.js.map +1 -1
- package/dist/components/PostsContainer/PostsGridItem.esm.js +1 -1
- package/dist/components/PostsTable/PostsTable.esm.js +1 -1
- package/dist/components/QetaContext/QetaContext.esm.js +154 -4
- package/dist/components/QetaContext/QetaContext.esm.js.map +1 -1
- package/dist/components/QuestionCard/QuestionCard.esm.js +1 -1
- package/dist/components/SuggestionsCard/SuggestionsCard.esm.js +1 -1
- package/dist/components/TagsAndEntities/EntityChip.esm.js +1 -1
- package/dist/components/TagsAndEntities/TagChip.esm.js +1 -1
- package/dist/components/TagsAndEntities/UserChip.esm.js +1 -1
- package/dist/components/TagsContainer/TagListItem.esm.js +1 -1
- package/dist/components/TagsContainer/TagsContainer.esm.js +3 -1
- package/dist/components/TagsContainer/TagsContainer.esm.js.map +1 -1
- package/dist/components/TemplateList/TemplateForm.esm.js +2 -1
- package/dist/components/TemplateList/TemplateForm.esm.js.map +1 -1
- package/dist/components/TemplateList/TemplateList.esm.js +1 -1
- package/dist/components/Timeline/TimelineItem.esm.js +1 -1
- package/dist/components/TopRankingUsersCard/TopRankingUsersCard.esm.js +1 -1
- package/dist/components/UsersContainer/UserListItem.esm.js +1 -1
- package/dist/components/UsersContainer/UsersContainer.esm.js +3 -1
- package/dist/components/UsersContainer/UsersContainer.esm.js.map +1 -1
- package/dist/components/UsersContainer/UsersGridItem.esm.js +1 -1
- package/dist/hooks/useUserSettings.esm.js +8 -104
- package/dist/hooks/useUserSettings.esm.js.map +1 -1
- package/dist/index.d.ts +19 -10
- package/dist/translation.esm.js +3 -1
- package/dist/translation.esm.js.map +1 -1
- package/package.json +2 -2
|
@@ -36,7 +36,7 @@ import 'react-use/lib/useAsync';
|
|
|
36
36
|
import { Link } from 'react-router-dom';
|
|
37
37
|
import 'react-use/lib/useDebounce';
|
|
38
38
|
import '../FilterPanel/FilterPanel.esm.js';
|
|
39
|
-
import '
|
|
39
|
+
import '../QetaContext/QetaContext.esm.js';
|
|
40
40
|
import '@material-ui/icons/Create';
|
|
41
41
|
import { OpenLinkButton } from '../Buttons/OpenLinkButton.esm.js';
|
|
42
42
|
import '@material-ui/icons/PlaylistAdd';
|
|
@@ -29,11 +29,12 @@ import 'react-use/lib/useAsync';
|
|
|
29
29
|
import 'react-router-dom';
|
|
30
30
|
import 'react-use/lib/useDebounce';
|
|
31
31
|
import '../FilterPanel/FilterPanel.esm.js';
|
|
32
|
-
import
|
|
32
|
+
import '../QetaContext/QetaContext.esm.js';
|
|
33
33
|
import '@material-ui/icons/Visibility';
|
|
34
34
|
import '@material-ui/icons/VisibilityOff';
|
|
35
35
|
import '../Buttons/ButtonContainer.esm.js';
|
|
36
36
|
import '../Buttons/RankingButtons.esm.js';
|
|
37
|
+
import { capitalize } from 'lodash';
|
|
37
38
|
import { QetaEntityContainer } from '../QetaEntityContainer/QetaEntityContainer.esm.js';
|
|
38
39
|
import { PostsGridItem } from './PostsGridItem.esm.js';
|
|
39
40
|
import { PostListItem } from './PostListItem.esm.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PostsContainer.esm.js","sources":["../../../src/components/PostsContainer/PostsContainer.tsx"],"sourcesContent":["import {\n CommonFilterPanelProps,\n PostFilters,\n} from '../FilterPanel/FilterPanel';\nimport { AskQuestionButton } from '../Buttons/AskQuestionButton';\nimport { EntityRefLink } from '@backstage/plugin-catalog-react';\nimport { TagFollowButton } from '../Buttons/TagFollowButton';\nimport { EntityFollowButton } from '../Buttons/EntityFollowButton';\nimport { CreateLinkButton, WriteArticleButton } from '../Buttons';\nimport { ViewType } from '../ViewToggle/ViewToggle';\nimport { capitalize } from 'lodash';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../../translation';\nimport { Box, Grid, Typography } from '@material-ui/core';\nimport { QetaEntityContainer } from '../QetaEntityContainer/QetaEntityContainer';\nimport { PostsGridItem } from './PostsGridItem';\nimport { PostListItem } from './PostListItem';\nimport { PostResponse, PostType } from '@drodil/backstage-plugin-qeta-common';\nimport { getFiltersWithDateRange } from '../../utils';\nimport { NoPostsCard } from './NoPostsCard';\n\nexport type PostsContainerProps = {\n type?: PostType;\n tags?: string[];\n author?: string;\n showFilters?: boolean;\n showTitle?: boolean;\n title?: string;\n favorite?: boolean;\n showAskButton?: boolean;\n showWriteButton?: boolean;\n showLinkButton?: boolean;\n showNoQuestionsBtn?: boolean;\n collectionId?: number;\n initialPageSize?: number;\n entity?: string;\n filterPanelProps?: CommonFilterPanelProps;\n showTypeLabel?: boolean;\n allowRanking?: boolean;\n defaultView?: ViewType;\n view?: ViewType;\n onViewChange?: (view: ViewType) => void;\n status?: string;\n prefix?: string;\n orderBy?:\n | 'rank'\n | 'created'\n | 'title'\n | 'views'\n | 'score'\n | 'trend'\n | 'answersCount'\n | 'updated';\n};\n\nexport const PostsContainer = (props: PostsContainerProps) => {\n const {\n type,\n tags,\n author,\n entity,\n showFilters,\n showTitle,\n title,\n favorite,\n showAskButton,\n showWriteButton,\n showLinkButton,\n showNoQuestionsBtn,\n showTypeLabel,\n allowRanking,\n defaultView,\n collectionId,\n initialPageSize,\n orderBy,\n prefix,\n } = props;\n\n const { t } = useTranslationRef(qetaTranslationRef);\n\n const itemType = capitalize(t(`common.${type ?? 'post'}` as any, {}));\n let shownTitle: React.ReactNode = title;\n let link = undefined;\n let btn = undefined;\n\n if (author) {\n shownTitle = t(`postsContainer.title.by`, { itemType });\n link = <EntityRefLink entityRef={author} hideIcon defaultKind=\"user\" />;\n } else if (entity) {\n shownTitle = t(`postsContainer.title.about`, { itemType });\n link = <EntityRefLink entityRef={entity} />;\n btn = <EntityFollowButton entityRef={entity} />;\n } else if (tags) {\n shownTitle = `#${tags.join(', #')}`;\n if (tags.length === 1) {\n btn = <TagFollowButton tag={tags[0]} />;\n }\n } else if (favorite) {\n shownTitle = t('postsContainer.title.favorite', {\n itemType: itemType.toLowerCase(),\n });\n }\n\n const headerElement = (showTitle ||\n showAskButton ||\n showWriteButton ||\n showLinkButton) && (\n <Box mb={3}>\n <Grid container alignItems=\"center\" justifyContent=\"space-between\">\n <Grid item>\n {showTitle && (\n <Typography\n variant=\"h5\"\n className=\"qetaPostsContainerTitle\"\n style={{ fontWeight: 500, paddingBottom: 2 }}\n >\n {shownTitle} {link} {btn}\n </Typography>\n )}\n </Grid>\n <Grid item>\n {showAskButton && (\n <AskQuestionButton\n entity={entity}\n entityPage={entity !== undefined}\n tags={tags}\n />\n )}\n {showWriteButton && (\n <WriteArticleButton\n entity={entity}\n entityPage={entity !== undefined}\n tags={tags}\n />\n )}\n {showLinkButton && (\n <CreateLinkButton\n entity={entity}\n entityPage={entity !== undefined}\n tags={tags}\n />\n )}\n </Grid>\n </Grid>\n </Box>\n );\n\n return (\n <Box className=\"qetaPostsContainer\">\n {headerElement}\n <QetaEntityContainer<PostResponse, PostFilters>\n prefix={prefix ?? `posts${type ? `-${type}` : ''}`}\n defaultPageSize={initialPageSize}\n initialFilters={{\n order: 'desc',\n searchQuery: '',\n orderBy: orderBy ?? 'created',\n type: type,\n tags: tags,\n entity: entity,\n author: author,\n noAnswers: 'false',\n noVotes: 'false',\n noCorrectAnswer: 'false',\n status: props.status as any,\n collectionId: collectionId,\n }}\n filterPanelProps={\n showFilters ?? true\n ? {\n mode: 'posts',\n type: type as PostType,\n showEntityFilter: entity === undefined,\n ...props.filterPanelProps,\n }\n : undefined\n }\n fetchDeps={[type, tags, author, entity, favorite, collectionId]}\n fetch={(api, limit, offset, filters) => {\n const { entity: _entity, ...otherFilters } = filters;\n return api\n .getPosts({\n limit,\n offset,\n ...(getFiltersWithDateRange(otherFilters) as any),\n type: type,\n tags: tags ?? filters.tags,\n entities: entity ? [entity] : filters.entities,\n author: author ?? filters.author,\n favorite: favorite,\n collectionId: collectionId,\n })\n .then(res => ({ items: res.posts, total: res.total }));\n }}\n renderGridItem={(post, { retry }) => (\n <PostsGridItem\n post={post}\n entity={entity}\n type={type as PostType}\n allowRanking={allowRanking}\n onRankUpdate={retry}\n collectionId={collectionId}\n />\n )}\n renderListItem={(post, { retry }) => (\n <PostListItem\n post={post}\n entity={entity}\n type={type as PostType}\n showTypeLabel={showTypeLabel}\n allowRanking={allowRanking}\n onRankUpdate={retry}\n collectionId={collectionId}\n />\n )}\n title={total => (\n <Typography\n variant=\"h6\"\n component=\"h2\"\n className=\"qetaPostsContainerQuestionCount\"\n style={{ fontWeight: 500, paddingBottom: 2 }}\n >\n {t('common.posts', { count: total, itemType })}\n </Typography>\n )}\n searchPlaceholder={t('postsContainer.search.label', {\n itemType: itemType.toLowerCase(),\n })}\n emptyMessage={t('common.posts', { count: 0, itemType })}\n getKey={post => post.id}\n defaultView={defaultView} // Pass the view prop as defaultView\n emptyState={\n <NoPostsCard\n showNoPostsBtn={showNoQuestionsBtn}\n entity={entity}\n entityPage={entity !== undefined}\n tags={tags}\n type={type}\n />\n }\n />\n </Box>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PostsContainer.esm.js","sources":["../../../src/components/PostsContainer/PostsContainer.tsx"],"sourcesContent":["import {\n CommonFilterPanelProps,\n PostFilters,\n} from '../FilterPanel/FilterPanel';\nimport { AskQuestionButton } from '../Buttons/AskQuestionButton';\nimport { EntityRefLink } from '@backstage/plugin-catalog-react';\nimport { TagFollowButton } from '../Buttons/TagFollowButton';\nimport { EntityFollowButton } from '../Buttons/EntityFollowButton';\nimport { CreateLinkButton, WriteArticleButton } from '../Buttons';\nimport { ViewType } from '../ViewToggle/ViewToggle';\nimport { capitalize } from 'lodash';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../../translation';\nimport { Box, Grid, Typography } from '@material-ui/core';\nimport { QetaEntityContainer } from '../QetaEntityContainer/QetaEntityContainer';\nimport { PostsGridItem } from './PostsGridItem';\nimport { PostListItem } from './PostListItem';\nimport { PostResponse, PostType } from '@drodil/backstage-plugin-qeta-common';\nimport { getFiltersWithDateRange } from '../../utils';\nimport { NoPostsCard } from './NoPostsCard';\n\nexport type PostsContainerProps = {\n type?: PostType;\n tags?: string[];\n author?: string;\n showFilters?: boolean;\n showTitle?: boolean;\n title?: string;\n favorite?: boolean;\n showAskButton?: boolean;\n showWriteButton?: boolean;\n showLinkButton?: boolean;\n showNoQuestionsBtn?: boolean;\n collectionId?: number;\n initialPageSize?: number;\n entity?: string;\n filterPanelProps?: CommonFilterPanelProps;\n showTypeLabel?: boolean;\n allowRanking?: boolean;\n defaultView?: ViewType;\n view?: ViewType;\n onViewChange?: (view: ViewType) => void;\n status?: string;\n prefix?: string;\n orderBy?:\n | 'rank'\n | 'created'\n | 'title'\n | 'views'\n | 'score'\n | 'trend'\n | 'answersCount'\n | 'updated';\n};\n\nexport const PostsContainer = (props: PostsContainerProps) => {\n const {\n type,\n tags,\n author,\n entity,\n showFilters,\n showTitle,\n title,\n favorite,\n showAskButton,\n showWriteButton,\n showLinkButton,\n showNoQuestionsBtn,\n showTypeLabel,\n allowRanking,\n defaultView,\n collectionId,\n initialPageSize,\n orderBy,\n prefix,\n } = props;\n\n const { t } = useTranslationRef(qetaTranslationRef);\n\n const itemType = capitalize(t(`common.${type ?? 'post'}` as any, {}));\n let shownTitle: React.ReactNode = title;\n let link = undefined;\n let btn = undefined;\n\n if (author) {\n shownTitle = t(`postsContainer.title.by`, { itemType });\n link = <EntityRefLink entityRef={author} hideIcon defaultKind=\"user\" />;\n } else if (entity) {\n shownTitle = t(`postsContainer.title.about`, { itemType });\n link = <EntityRefLink entityRef={entity} />;\n btn = <EntityFollowButton entityRef={entity} />;\n } else if (tags) {\n shownTitle = `#${tags.join(', #')}`;\n if (tags.length === 1) {\n btn = <TagFollowButton tag={tags[0]} />;\n }\n } else if (favorite) {\n shownTitle = t('postsContainer.title.favorite', {\n itemType: itemType.toLowerCase(),\n });\n }\n\n const headerElement = (showTitle ||\n showAskButton ||\n showWriteButton ||\n showLinkButton) && (\n <Box mb={3}>\n <Grid container alignItems=\"center\" justifyContent=\"space-between\">\n <Grid item>\n {showTitle && (\n <Typography\n variant=\"h5\"\n className=\"qetaPostsContainerTitle\"\n style={{ fontWeight: 500, paddingBottom: 2 }}\n >\n {shownTitle} {link} {btn}\n </Typography>\n )}\n </Grid>\n <Grid item>\n {showAskButton && (\n <AskQuestionButton\n entity={entity}\n entityPage={entity !== undefined}\n tags={tags}\n />\n )}\n {showWriteButton && (\n <WriteArticleButton\n entity={entity}\n entityPage={entity !== undefined}\n tags={tags}\n />\n )}\n {showLinkButton && (\n <CreateLinkButton\n entity={entity}\n entityPage={entity !== undefined}\n tags={tags}\n />\n )}\n </Grid>\n </Grid>\n </Box>\n );\n\n return (\n <Box className=\"qetaPostsContainer\">\n {headerElement}\n <QetaEntityContainer<PostResponse, PostFilters>\n prefix={prefix ?? `posts${type ? `-${type}` : ''}`}\n defaultPageSize={initialPageSize}\n initialFilters={{\n order: 'desc',\n searchQuery: '',\n orderBy: orderBy ?? 'created',\n type: type,\n tags: tags,\n entity: entity,\n author: author,\n noAnswers: 'false',\n noVotes: 'false',\n noCorrectAnswer: 'false',\n status: props.status as any,\n collectionId: collectionId,\n }}\n filterPanelProps={\n showFilters ?? true\n ? {\n mode: 'posts',\n type: type as PostType,\n showEntityFilter: entity === undefined,\n ...props.filterPanelProps,\n }\n : undefined\n }\n fetchDeps={[type, tags, author, entity, favorite, collectionId]}\n fetch={(api, limit, offset, filters) => {\n const { entity: _entity, ...otherFilters } = filters;\n return api\n .getPosts({\n limit,\n offset,\n ...(getFiltersWithDateRange(otherFilters) as any),\n type: type,\n tags: tags ?? filters.tags,\n entities: entity ? [entity] : filters.entities,\n author: author ?? filters.author,\n favorite: favorite,\n collectionId: collectionId,\n })\n .then(res => ({ items: res.posts, total: res.total }));\n }}\n renderGridItem={(post, { retry }) => (\n <PostsGridItem\n post={post}\n entity={entity}\n type={type as PostType}\n allowRanking={allowRanking}\n onRankUpdate={retry}\n collectionId={collectionId}\n />\n )}\n renderListItem={(post, { retry }) => (\n <PostListItem\n post={post}\n entity={entity}\n type={type as PostType}\n showTypeLabel={showTypeLabel}\n allowRanking={allowRanking}\n onRankUpdate={retry}\n collectionId={collectionId}\n />\n )}\n title={total => (\n <Typography\n variant=\"h6\"\n component=\"h2\"\n className=\"qetaPostsContainerQuestionCount\"\n style={{ fontWeight: 500, paddingBottom: 2 }}\n >\n {t('common.posts', { count: total, itemType })}\n </Typography>\n )}\n searchPlaceholder={t('postsContainer.search.label', {\n itemType: itemType.toLowerCase(),\n })}\n emptyMessage={t('common.posts', { count: 0, itemType })}\n getKey={post => post.id}\n defaultView={defaultView} // Pass the view prop as defaultView\n emptyState={\n <NoPostsCard\n showNoPostsBtn={showNoQuestionsBtn}\n entity={entity}\n entityPage={entity !== undefined}\n tags={tags}\n type={type}\n />\n }\n />\n </Box>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -35,7 +35,7 @@ import '@backstage/plugin-catalog-react';
|
|
|
35
35
|
import 'react-use/lib/useAsync';
|
|
36
36
|
import 'react-use/lib/useDebounce';
|
|
37
37
|
import '../FilterPanel/FilterPanel.esm.js';
|
|
38
|
-
import '
|
|
38
|
+
import '../QetaContext/QetaContext.esm.js';
|
|
39
39
|
import '@material-ui/icons/Create';
|
|
40
40
|
import '@material-ui/icons/PlaylistAdd';
|
|
41
41
|
import '@material-ui/icons/AddCircle';
|
|
@@ -20,7 +20,7 @@ import { Grid, Typography, ButtonGroup, Button, TableContainer, Table, TableHead
|
|
|
20
20
|
import 'react-router-dom';
|
|
21
21
|
import 'react-use/lib/useDebounce';
|
|
22
22
|
import '../FilterPanel/FilterPanel.esm.js';
|
|
23
|
-
import '
|
|
23
|
+
import '../QetaContext/QetaContext.esm.js';
|
|
24
24
|
import RefreshIcon from '@material-ui/icons/Refresh';
|
|
25
25
|
import { LoadingGrid } from '../LoadingGrid/LoadingGrid.esm.js';
|
|
26
26
|
|
|
@@ -1,13 +1,154 @@
|
|
|
1
1
|
import { jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { createContext, useState, useContext } from 'react';
|
|
2
|
+
import { createContext, useState, useRef, useEffect, useCallback, useMemo, useContext } from 'react';
|
|
3
|
+
import { useApi, storageApiRef } from '@backstage/core-plugin-api';
|
|
4
|
+
import { merge } from 'lodash';
|
|
3
5
|
|
|
6
|
+
const DEFAULT_SETTINGS = {
|
|
7
|
+
autoSaveEnabled: false,
|
|
8
|
+
anonymousPosting: false,
|
|
9
|
+
filterPanelExpanded: {},
|
|
10
|
+
viewType: {},
|
|
11
|
+
aiAnswerExpanded: false,
|
|
12
|
+
usePagination: false
|
|
13
|
+
};
|
|
14
|
+
const BUCKET_KEY = "qeta";
|
|
15
|
+
const STORAGE_KEY = "qeta-user-settings";
|
|
4
16
|
const QetaContext = createContext({
|
|
5
17
|
remarkPlugins: [],
|
|
6
|
-
rehypePlugins: []
|
|
18
|
+
rehypePlugins: [],
|
|
19
|
+
settings: DEFAULT_SETTINGS,
|
|
20
|
+
updateSettings: async () => {
|
|
21
|
+
},
|
|
22
|
+
getSetting: (key) => DEFAULT_SETTINGS[key],
|
|
23
|
+
setSetting: async () => {
|
|
24
|
+
},
|
|
25
|
+
resetSettings: async () => {
|
|
26
|
+
},
|
|
27
|
+
isSettingsLoaded: false
|
|
7
28
|
});
|
|
8
29
|
const QetaProvider = (props) => {
|
|
30
|
+
const storageApi = useApi(storageApiRef);
|
|
31
|
+
const [settings, setSettings] = useState(DEFAULT_SETTINGS);
|
|
32
|
+
const [isSettingsLoaded, setIsSettingsLoaded] = useState(false);
|
|
33
|
+
const settingsRef = useRef(DEFAULT_SETTINGS);
|
|
34
|
+
const isUpdatingRef = useRef(false);
|
|
9
35
|
const [draftQuestion, setDraftQuestion] = useState(void 0);
|
|
10
|
-
|
|
36
|
+
useEffect(() => {
|
|
37
|
+
settingsRef.current = settings;
|
|
38
|
+
}, [settings]);
|
|
39
|
+
useEffect(() => {
|
|
40
|
+
const bucket = storageApi.forBucket(BUCKET_KEY);
|
|
41
|
+
isUpdatingRef.current = false;
|
|
42
|
+
const snapshot = bucket.snapshot(STORAGE_KEY);
|
|
43
|
+
const stored = snapshot.value;
|
|
44
|
+
if (stored) {
|
|
45
|
+
const merged = merge({}, DEFAULT_SETTINGS, stored);
|
|
46
|
+
setSettings(merged);
|
|
47
|
+
settingsRef.current = merged;
|
|
48
|
+
} else {
|
|
49
|
+
setSettings(DEFAULT_SETTINGS);
|
|
50
|
+
settingsRef.current = DEFAULT_SETTINGS;
|
|
51
|
+
}
|
|
52
|
+
setIsSettingsLoaded(true);
|
|
53
|
+
const subscription = bucket.observe$(STORAGE_KEY).subscribe({
|
|
54
|
+
next: (newSnapshot) => {
|
|
55
|
+
if (isUpdatingRef.current) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const value = newSnapshot.value;
|
|
59
|
+
if (value) {
|
|
60
|
+
const merged = merge({}, DEFAULT_SETTINGS, value);
|
|
61
|
+
setSettings(merged);
|
|
62
|
+
settingsRef.current = merged;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
return () => {
|
|
67
|
+
subscription.unsubscribe();
|
|
68
|
+
};
|
|
69
|
+
}, [storageApi]);
|
|
70
|
+
const updateSettings = useCallback(
|
|
71
|
+
async (updates) => {
|
|
72
|
+
const bucket = storageApi.forBucket(BUCKET_KEY);
|
|
73
|
+
const snapshot = bucket.snapshot(STORAGE_KEY);
|
|
74
|
+
const storedSettings = snapshot.value;
|
|
75
|
+
const currentSettings = storedSettings ? merge({}, DEFAULT_SETTINGS, storedSettings) : settingsRef.current;
|
|
76
|
+
const newSettings = { ...currentSettings };
|
|
77
|
+
Object.keys(updates).forEach((key) => {
|
|
78
|
+
const k = key;
|
|
79
|
+
const value = updates[k];
|
|
80
|
+
if (Object.hasOwn(updates, k)) {
|
|
81
|
+
if (k === "viewType" || k === "filterPanelExpanded") {
|
|
82
|
+
const currentValue = currentSettings[k] || {};
|
|
83
|
+
const updateValue = value || {};
|
|
84
|
+
const merged = { ...currentValue };
|
|
85
|
+
Object.keys(updateValue).forEach((subKey) => {
|
|
86
|
+
if (updateValue[subKey] === void 0) {
|
|
87
|
+
delete merged[subKey];
|
|
88
|
+
} else {
|
|
89
|
+
merged[subKey] = updateValue[subKey];
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
newSettings[k] = merged;
|
|
93
|
+
} else if (value !== void 0 && value && typeof value === "object" && !Array.isArray(value)) {
|
|
94
|
+
newSettings[k] = merge({}, currentSettings[k], value);
|
|
95
|
+
} else if (value !== void 0) {
|
|
96
|
+
newSettings[k] = value;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
settingsRef.current = newSettings;
|
|
101
|
+
setSettings(newSettings);
|
|
102
|
+
isUpdatingRef.current = true;
|
|
103
|
+
try {
|
|
104
|
+
await bucket.set(STORAGE_KEY, newSettings);
|
|
105
|
+
} finally {
|
|
106
|
+
await Promise.resolve();
|
|
107
|
+
isUpdatingRef.current = false;
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
[storageApi]
|
|
111
|
+
);
|
|
112
|
+
const getSetting = useCallback(
|
|
113
|
+
(key) => {
|
|
114
|
+
return settingsRef.current[key] ?? DEFAULT_SETTINGS[key];
|
|
115
|
+
},
|
|
116
|
+
[]
|
|
117
|
+
);
|
|
118
|
+
const setSetting = useCallback(
|
|
119
|
+
async (key, value) => {
|
|
120
|
+
await updateSettings({ [key]: value });
|
|
121
|
+
},
|
|
122
|
+
[updateSettings]
|
|
123
|
+
);
|
|
124
|
+
const resetSettings = useCallback(async () => {
|
|
125
|
+
await updateSettings(DEFAULT_SETTINGS);
|
|
126
|
+
}, [updateSettings]);
|
|
127
|
+
const contextValue = useMemo(
|
|
128
|
+
() => ({
|
|
129
|
+
...props,
|
|
130
|
+
draftQuestion,
|
|
131
|
+
setDraftQuestion,
|
|
132
|
+
settings,
|
|
133
|
+
updateSettings,
|
|
134
|
+
getSetting,
|
|
135
|
+
setSetting,
|
|
136
|
+
resetSettings,
|
|
137
|
+
isSettingsLoaded
|
|
138
|
+
}),
|
|
139
|
+
[
|
|
140
|
+
props,
|
|
141
|
+
draftQuestion,
|
|
142
|
+
setDraftQuestion,
|
|
143
|
+
settings,
|
|
144
|
+
updateSettings,
|
|
145
|
+
getSetting,
|
|
146
|
+
setSetting,
|
|
147
|
+
resetSettings,
|
|
148
|
+
isSettingsLoaded
|
|
149
|
+
]
|
|
150
|
+
);
|
|
151
|
+
return /* @__PURE__ */ jsx(QetaContext.Provider, { value: contextValue, children: props.children });
|
|
11
152
|
};
|
|
12
153
|
function useQetaContext() {
|
|
13
154
|
const context = useContext(QetaContext);
|
|
@@ -16,7 +157,16 @@ function useQetaContext() {
|
|
|
16
157
|
remarkPlugins: [],
|
|
17
158
|
rehypePlugins: [],
|
|
18
159
|
draftQuestion: void 0,
|
|
19
|
-
setDraftQuestion: void 0
|
|
160
|
+
setDraftQuestion: void 0,
|
|
161
|
+
settings: DEFAULT_SETTINGS,
|
|
162
|
+
updateSettings: async () => {
|
|
163
|
+
},
|
|
164
|
+
getSetting: (key) => DEFAULT_SETTINGS[key],
|
|
165
|
+
setSetting: async () => {
|
|
166
|
+
},
|
|
167
|
+
resetSettings: async () => {
|
|
168
|
+
},
|
|
169
|
+
isSettingsLoaded: false
|
|
20
170
|
};
|
|
21
171
|
}
|
|
22
172
|
return context;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QetaContext.esm.js","sources":["../../../src/components/QetaContext/QetaContext.tsx"],"sourcesContent":["import {\n createContext,\n Dispatch,\n PropsWithChildren,\n SetStateAction,\n useContext,\n useState,\n} from 'react';\nimport type { PluggableList } from 'unified';\n\nexport type QetaContextProps = {\n remarkPlugins?: PluggableList;\n rehypePlugins?: PluggableList;\n draftQuestion?: {\n title: string;\n content: string;\n tags?: string[];\n entities?: string[];\n };\n setDraftQuestion?: Dispatch<\n SetStateAction<\n | {\n title: string;\n content: string;\n tags?: string[];\n entities?: string[];\n }\n | undefined\n >\n >;\n};\n\nexport const QetaContext = createContext<QetaContextProps>({\n remarkPlugins: [],\n rehypePlugins: [],\n});\n\nexport const QetaProvider = (props: PropsWithChildren<QetaContextProps>) => {\n const [draftQuestion, setDraftQuestion] = useState<\n | {\n title: string;\n content: string;\n tags?: string[];\n entities?: string[];\n }\n | undefined\n >(undefined);\n\n return (\n <QetaContext.Provider value={{ ...props, draftQuestion, setDraftQuestion }}>\n {props.children}\n </QetaContext.Provider>\n );\n};\n\nexport function useQetaContext(): QetaContextProps {\n const context = useContext(QetaContext);\n\n if (!context) {\n return {\n remarkPlugins: [],\n rehypePlugins: [],\n draftQuestion: undefined,\n setDraftQuestion: undefined,\n };\n }\n\n return context;\n}\n"],"names":[],"mappings":";;;AAgCO,MAAM,cAAc,aAAgC,CAAA;AAAA,EACzD,eAAe,EAAC;AAAA,EAChB,eAAe;AACjB,CAAC;AAEY,MAAA,YAAA,GAAe,CAAC,KAA+C,KAAA;AAC1E,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,SAQxC,KAAS,CAAA,CAAA;AAEX,EAAA,uBACG,GAAA,CAAA,WAAA,CAAY,QAAZ,EAAA,EAAqB,KAAO,EAAA,EAAE,GAAG,KAAA,EAAO,aAAe,EAAA,gBAAA,EACrD,EAAA,QAAA,EAAA,KAAA,CAAM,QACT,EAAA,CAAA;AAEJ;AAEO,SAAS,cAAmC,GAAA;AACjD,EAAM,MAAA,OAAA,GAAU,WAAW,WAAW,CAAA;AAEtC,EAAA,IAAI,CAAC,OAAS,EAAA;AACZ,IAAO,OAAA;AAAA,MACL,eAAe,EAAC;AAAA,MAChB,eAAe,EAAC;AAAA,MAChB,aAAe,EAAA,KAAA,CAAA;AAAA,MACf,gBAAkB,EAAA,KAAA;AAAA,KACpB;AAAA;AAGF,EAAO,OAAA,OAAA;AACT;;;;"}
|
|
1
|
+
{"version":3,"file":"QetaContext.esm.js","sources":["../../../src/components/QetaContext/QetaContext.tsx"],"sourcesContent":["import {\n createContext,\n Dispatch,\n PropsWithChildren,\n SetStateAction,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type { PluggableList } from 'unified';\nimport { storageApiRef, useApi } from '@backstage/core-plugin-api';\nimport { merge } from 'lodash';\nimport { ViewType } from '../ViewToggle/ViewToggle';\n\nexport type UserSettings = {\n autoSaveEnabled: boolean;\n anonymousPosting: 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 anonymousPosting: 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 type QetaContextProps = {\n remarkPlugins?: PluggableList;\n rehypePlugins?: PluggableList;\n draftQuestion?: {\n title: string;\n content: string;\n tags?: string[];\n entities?: string[];\n };\n setDraftQuestion?: Dispatch<\n SetStateAction<\n | {\n title: string;\n content: string;\n tags?: string[];\n entities?: string[];\n }\n | undefined\n >\n >;\n settings?: UserSettings;\n updateSettings?: (updates: Partial<UserSettings>) => Promise<void>;\n getSetting?: <K extends keyof UserSettings>(key: K) => UserSettings[K];\n setSetting?: <K extends keyof UserSettings>(\n key: K,\n value: UserSettings[K],\n ) => Promise<void>;\n resetSettings?: () => Promise<void>;\n isSettingsLoaded?: boolean;\n};\n\nexport const QetaContext = createContext<QetaContextProps>({\n remarkPlugins: [],\n rehypePlugins: [],\n settings: DEFAULT_SETTINGS,\n updateSettings: async () => {},\n getSetting: <K extends keyof UserSettings>(key: K): UserSettings[K] =>\n DEFAULT_SETTINGS[key],\n setSetting: async () => {},\n resetSettings: async () => {},\n isSettingsLoaded: false,\n});\n\nexport const QetaProvider = (props: PropsWithChildren<QetaContextProps>) => {\n const storageApi = useApi(storageApiRef);\n const [settings, setSettings] = useState<UserSettings>(DEFAULT_SETTINGS);\n const [isSettingsLoaded, setIsSettingsLoaded] = useState(false);\n const settingsRef = useRef<UserSettings>(DEFAULT_SETTINGS);\n const isUpdatingRef = useRef(false);\n\n const [draftQuestion, setDraftQuestion] = useState<\n | {\n title: string;\n content: string;\n tags?: string[];\n entities?: string[];\n }\n | undefined\n >(undefined);\n\n useEffect(() => {\n settingsRef.current = settings;\n }, [settings]);\n\n useEffect(() => {\n const bucket = storageApi.forBucket(BUCKET_KEY);\n\n isUpdatingRef.current = false;\n\n const snapshot = bucket.snapshot(STORAGE_KEY);\n const stored = snapshot.value as UserSettings | undefined;\n\n if (stored) {\n const merged = merge({}, DEFAULT_SETTINGS, stored);\n setSettings(merged);\n settingsRef.current = merged;\n } else {\n setSettings(DEFAULT_SETTINGS);\n settingsRef.current = DEFAULT_SETTINGS;\n }\n\n setIsSettingsLoaded(true);\n\n const subscription = bucket.observe$<UserSettings>(STORAGE_KEY).subscribe({\n next: newSnapshot => {\n if (isUpdatingRef.current) {\n return;\n }\n\n const value = newSnapshot.value;\n if (value) {\n const merged = merge({}, DEFAULT_SETTINGS, value);\n setSettings(merged);\n settingsRef.current = merged;\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\n const snapshot = bucket.snapshot(STORAGE_KEY);\n const storedSettings = snapshot.value as UserSettings | undefined;\n const currentSettings = storedSettings\n ? merge({}, DEFAULT_SETTINGS, storedSettings)\n : settingsRef.current;\n\n const newSettings = { ...currentSettings };\n Object.keys(updates).forEach(key => {\n const k = key as keyof UserSettings;\n const value = updates[k];\n if (Object.hasOwn(updates, k)) {\n if (k === 'viewType' || k === 'filterPanelExpanded') {\n const currentValue = currentSettings[k] || {};\n const updateValue = (value || {}) as Record<string, any>;\n const merged = { ...currentValue };\n\n Object.keys(updateValue).forEach(subKey => {\n if (updateValue[subKey] === undefined) {\n delete merged[subKey];\n } else {\n merged[subKey] = updateValue[subKey];\n }\n });\n\n newSettings[k] = merged as any;\n } else if (\n value !== undefined &&\n value &&\n typeof value === 'object' &&\n !Array.isArray(value)\n ) {\n newSettings[k] = merge({}, currentSettings[k], value);\n } else if (value !== undefined) {\n newSettings[k] = value as any;\n }\n }\n });\n\n settingsRef.current = newSettings;\n setSettings(newSettings);\n\n isUpdatingRef.current = true;\n try {\n await bucket.set(STORAGE_KEY, newSettings);\n } finally {\n await Promise.resolve();\n isUpdatingRef.current = false;\n }\n },\n [storageApi],\n );\n\n const getSetting = useCallback(\n <K extends keyof UserSettings>(key: K): UserSettings[K] => {\n return settingsRef.current[key] ?? DEFAULT_SETTINGS[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 await updateSettings(DEFAULT_SETTINGS);\n }, [updateSettings]);\n\n const contextValue = useMemo(\n () => ({\n ...props,\n draftQuestion,\n setDraftQuestion,\n settings,\n updateSettings,\n getSetting,\n setSetting,\n resetSettings,\n isSettingsLoaded,\n }),\n [\n props,\n draftQuestion,\n setDraftQuestion,\n settings,\n updateSettings,\n getSetting,\n setSetting,\n resetSettings,\n isSettingsLoaded,\n ],\n );\n\n return (\n <QetaContext.Provider value={contextValue}>\n {props.children}\n </QetaContext.Provider>\n );\n};\n\nexport function useQetaContext(): QetaContextProps {\n const context = useContext(QetaContext);\n\n if (!context) {\n return {\n remarkPlugins: [],\n rehypePlugins: [],\n draftQuestion: undefined,\n setDraftQuestion: undefined,\n settings: DEFAULT_SETTINGS,\n updateSettings: async () => {},\n getSetting: <K extends keyof UserSettings>(key: K): UserSettings[K] =>\n DEFAULT_SETTINGS[key],\n setSetting: async () => {},\n resetSettings: async () => {},\n isSettingsLoaded: false,\n };\n }\n\n return context;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -35,7 +35,7 @@ import '@drodil/backstage-plugin-qeta-common';
|
|
|
35
35
|
import '@backstage/plugin-permission-common';
|
|
36
36
|
import 'react-use/lib/useDebounce';
|
|
37
37
|
import '../FilterPanel/FilterPanel.esm.js';
|
|
38
|
-
import '
|
|
38
|
+
import '../QetaContext/QetaContext.esm.js';
|
|
39
39
|
import { AuthorBoxes } from '../AuthorBox/AuthorBoxes.esm.js';
|
|
40
40
|
|
|
41
41
|
const useStyles = makeStyles(
|
|
@@ -18,7 +18,7 @@ import { makeStyles, Card, CardHeader, IconButton, Divider, List, ListItem, List
|
|
|
18
18
|
import { Link } from 'react-router-dom';
|
|
19
19
|
import 'react-use/lib/useDebounce';
|
|
20
20
|
import '../FilterPanel/FilterPanel.esm.js';
|
|
21
|
-
import '
|
|
21
|
+
import '../QetaContext/QetaContext.esm.js';
|
|
22
22
|
import { Skeleton } from '@material-ui/lab';
|
|
23
23
|
import AssistantIcon from '@material-ui/icons/Assistant';
|
|
24
24
|
import HelpOutlinedIcon from '@material-ui/icons/HelpOutlined';
|
|
@@ -20,7 +20,7 @@ import { Tooltip, Chip, Grid, Box, Typography, Button } from '@material-ui/core'
|
|
|
20
20
|
import { Link } from 'react-router-dom';
|
|
21
21
|
import 'react-use/lib/useDebounce';
|
|
22
22
|
import '../FilterPanel/FilterPanel.esm.js';
|
|
23
|
-
import '
|
|
23
|
+
import '../QetaContext/QetaContext.esm.js';
|
|
24
24
|
import VisibilityOff from '@material-ui/icons/VisibilityOff';
|
|
25
25
|
import Visibility from '@material-ui/icons/Visibility';
|
|
26
26
|
import { useTooltipStyles } from '../../hooks/useTooltipStyles.esm.js';
|
|
@@ -21,7 +21,7 @@ import { Tooltip, Chip, Grid, Box, Typography, Button } from '@material-ui/core'
|
|
|
21
21
|
import { Link } from 'react-router-dom';
|
|
22
22
|
import 'react-use/lib/useDebounce';
|
|
23
23
|
import '../FilterPanel/FilterPanel.esm.js';
|
|
24
|
-
import '
|
|
24
|
+
import '../QetaContext/QetaContext.esm.js';
|
|
25
25
|
import VisibilityOff from '@material-ui/icons/VisibilityOff';
|
|
26
26
|
import Visibility from '@material-ui/icons/Visibility';
|
|
27
27
|
import LoyaltyOutlined from '@material-ui/icons/LoyaltyOutlined';
|
|
@@ -18,7 +18,7 @@ import { Grid, Box, Avatar, Typography, Button } from '@material-ui/core';
|
|
|
18
18
|
import 'react-router-dom';
|
|
19
19
|
import 'react-use/lib/useDebounce';
|
|
20
20
|
import '../FilterPanel/FilterPanel.esm.js';
|
|
21
|
-
import '
|
|
21
|
+
import '../QetaContext/QetaContext.esm.js';
|
|
22
22
|
import '@backstage/plugin-catalog-react';
|
|
23
23
|
import VisibilityOff from '@material-ui/icons/VisibilityOff';
|
|
24
24
|
import Visibility from '@material-ui/icons/Visibility';
|
|
@@ -35,7 +35,7 @@ import '@backstage/plugin-permission-react';
|
|
|
35
35
|
import '@backstage/plugin-permission-common';
|
|
36
36
|
import 'react-use/lib/useDebounce';
|
|
37
37
|
import '../FilterPanel/FilterPanel.esm.js';
|
|
38
|
-
import '
|
|
38
|
+
import '../QetaContext/QetaContext.esm.js';
|
|
39
39
|
|
|
40
40
|
const useStyles = makeStyles((theme) => ({
|
|
41
41
|
icon: {
|
|
@@ -37,7 +37,9 @@ const TagsContainer = (props) => {
|
|
|
37
37
|
return api.getTags({
|
|
38
38
|
limit,
|
|
39
39
|
offset,
|
|
40
|
-
searchQuery: filters.searchQuery
|
|
40
|
+
searchQuery: filters.searchQuery,
|
|
41
|
+
order: filters.order,
|
|
42
|
+
orderBy: filters.orderBy
|
|
41
43
|
}).then((res) => ({ items: res.tags, total: res.total }));
|
|
42
44
|
},
|
|
43
45
|
filterPanelProps: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TagsContainer.esm.js","sources":["../../../src/components/TagsContainer/TagsContainer.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../../translation';\nimport { Button } from '@material-ui/core';\nimport Add from '@material-ui/icons/Add';\nimport { useIsModerator } from '../../hooks/useIsModerator';\nimport {
|
|
1
|
+
{"version":3,"file":"TagsContainer.esm.js","sources":["../../../src/components/TagsContainer/TagsContainer.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../../translation';\nimport { Button } from '@material-ui/core';\nimport Add from '@material-ui/icons/Add';\nimport { useIsModerator } from '../../hooks/useIsModerator';\nimport { CommonFilterPanelProps, TagFilters } from '../FilterPanel/FilterPanel';\nimport { TagGridItem } from './TagGridItem';\nimport { TagListItem } from './TagListItem';\nimport {\n qetaCreateTagPermission,\n TagResponse,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { OptionalRequirePermission } from '../Utility/OptionalRequirePermission';\nimport { CreateTagModal } from './CreateTagModal';\nimport { QetaEntityContainer } from '../QetaEntityContainer/QetaEntityContainer';\nimport { ViewType } from '../ViewToggle/ViewToggle';\n\nexport const TagsContainer = (props: {\n filterPanelProps?: CommonFilterPanelProps;\n defaultView?: ViewType;\n}) => {\n const { filterPanelProps, defaultView } = props;\n const { t } = useTranslationRef(qetaTranslationRef);\n const { isModerator } = useIsModerator();\n const [createModalOpen, setCreateModalOpen] = useState(false);\n const handleCreateModalOpen = () => setCreateModalOpen(true);\n\n const handleCreateModalCloseWithRetry = (retry: () => void) => {\n setCreateModalOpen(false);\n retry();\n };\n\n return (\n <QetaEntityContainer<TagResponse, TagFilters>\n prefix=\"tags\"\n defaultPageSize={24}\n defaultView={defaultView}\n initialFilters={{\n order: 'desc',\n orderBy: 'postsCount',\n searchQuery: '',\n }}\n fetch={(api, limit, offset, filters) => {\n return api\n .getTags({\n limit,\n offset,\n searchQuery: filters.searchQuery,\n order: filters.order,\n orderBy: filters.orderBy,\n })\n .then(res => ({ items: res.tags, total: res.total }));\n }}\n filterPanelProps={{\n ...filterPanelProps,\n mode: 'tags',\n }}\n renderListItem={(tag, { retry }) => (\n <TagListItem tag={tag} onTagEdit={retry} isModerator={isModerator} />\n )}\n renderGridItem={(tag, { retry }) => (\n <TagGridItem tag={tag} onTagEdit={retry} isModerator={isModerator} />\n )}\n title={total => t('tagPage.tags', { count: total })}\n searchPlaceholder={t('tagPage.search.label')}\n emptyMessage={t('tagPage.tags', { count: 0 })}\n getKey={tag => tag.tag}\n headerButtons={({ retry }) => (\n <>\n <OptionalRequirePermission\n permission={qetaCreateTagPermission}\n errorPage={<></>}\n >\n <Button\n variant=\"outlined\"\n color=\"primary\"\n startIcon={<Add />}\n size=\"small\"\n onClick={handleCreateModalOpen}\n >\n {t('tagPage.createTag')}\n </Button>\n <CreateTagModal\n open={createModalOpen}\n onClose={() => handleCreateModalCloseWithRetry(retry)}\n isModerator={isModerator}\n />\n </OptionalRequirePermission>\n </>\n )}\n />\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -19,8 +19,9 @@ import { TextField, Button } from '@material-ui/core';
|
|
|
19
19
|
import 'react-router-dom';
|
|
20
20
|
import 'react-use/lib/useDebounce';
|
|
21
21
|
import '../FilterPanel/FilterPanel.esm.js';
|
|
22
|
-
import
|
|
22
|
+
import '../QetaContext/QetaContext.esm.js';
|
|
23
23
|
import { useForm, Controller } from 'react-hook-form';
|
|
24
|
+
import { compact } from 'lodash';
|
|
24
25
|
import { MarkdownEditor } from '../MarkdownEditor/MarkdownEditor.esm.js';
|
|
25
26
|
import { TagInput } from '../PostForm/TagInput.esm.js';
|
|
26
27
|
import { EntitiesInput } from '../PostForm/EntitiesInput.esm.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TemplateForm.esm.js","sources":["../../../src/components/TemplateList/TemplateForm.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport { useIsModerator } from '../../hooks';\nimport { QetaApi, TemplateRequest } from '@drodil/backstage-plugin-qeta-common';\nimport { alertApiRef, useApi } from '@backstage/core-plugin-api';\nimport { qetaApiRef } from '../../api';\nimport { Controller, useForm } from 'react-hook-form';\nimport { stringifyEntityRef } from '@backstage/catalog-model';\nimport { CatalogApi } from '@backstage/catalog-client';\nimport { compact } from 'lodash';\nimport { catalogApiRef } from '@backstage/plugin-catalog-react';\nimport { MarkdownEditor } from '../MarkdownEditor/MarkdownEditor';\nimport { TagInput } from '../PostForm/TagInput';\nimport { EntitiesInput } from '../PostForm/EntitiesInput';\nimport { TemplateFormValues } from '../PostForm/types';\nimport { Button, TextField } from '@material-ui/core';\nimport { Alert } from '@material-ui/lab';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../../translation.ts';\n\nconst formToRequest = (form: TemplateFormValues): TemplateRequest => {\n return {\n ...form,\n entities: form.entities?.map(stringifyEntityRef),\n };\n};\n\nconst getDefaultValues = (): TemplateFormValues => {\n return {\n title: '',\n description: '',\n tags: [],\n entities: [],\n };\n};\n\nconst getValues = async (\n api: QetaApi,\n catalogApi: CatalogApi,\n id?: string,\n): Promise<TemplateFormValues> => {\n if (!id) {\n return getDefaultValues();\n }\n\n const template = await api.getTemplate(id);\n const entities =\n template.entities && template.entities.length > 0\n ? await catalogApi.getEntitiesByRefs({\n entityRefs: template.entities,\n fields: [\n 'kind',\n 'metadata.name',\n 'metadata.namespace',\n 'metadata.title',\n ],\n })\n : [];\n return {\n title: template.title,\n description: template.description,\n questionTitle: template.questionTitle,\n questionContent: template.questionContent,\n tags: template.tags ?? [],\n entities: 'items' in entities ? compact(entities.items) : [],\n };\n};\n\nexport const TemplateForm = (props: { id?: number; onPost: () => void }) => {\n const { id, onPost } = props;\n const [posting, setPosting] = useState(false);\n const catalogApi = useApi(catalogApiRef);\n const qetaApi = useApi(qetaApiRef);\n const alertApi = useApi(alertApiRef);\n const [error, setError] = useState(false);\n const [values, setValues] = useState(getDefaultValues());\n const { isModerator } = useIsModerator();\n const { t } = useTranslationRef(qetaTranslationRef);\n const {\n register,\n handleSubmit,\n control,\n getValues: getFormValues,\n setValue,\n reset,\n formState: { errors },\n } = useForm<TemplateFormValues>({\n values,\n defaultValues: getDefaultValues(),\n });\n\n useEffect(() => {\n if (id) {\n getValues(qetaApi, catalogApi, id.toString(10))\n .catch(e =>\n alertApi.post({\n message: e.message,\n severity: 'error',\n display: 'transient',\n }),\n )\n .then(data => {\n if (data) {\n setValues(data);\n }\n });\n }\n }, [qetaApi, catalogApi, id, alertApi]);\n\n const postTemplate = (data: TemplateFormValues) => {\n setPosting(true);\n\n if (id) {\n qetaApi\n .updateTemplate(id, formToRequest(data))\n .then(_q => {\n reset();\n onPost();\n })\n .catch(e => {\n setError(true);\n alertApi.post({\n message: e.message,\n severity: 'error',\n display: 'transient',\n });\n })\n .finally(() => setPosting(false));\n return;\n }\n qetaApi\n .createTemplate(formToRequest(data))\n .then(q => {\n if (!q || !q.id) {\n setError(true);\n return;\n }\n reset();\n onPost();\n })\n .catch(e => {\n setError(true);\n alertApi.post({\n message: e.message,\n severity: 'error',\n display: 'transient',\n });\n })\n .finally(() => setPosting(false));\n };\n\n if (!isModerator) {\n return null;\n }\n\n return (\n <form onSubmit={handleSubmit(postTemplate)}>\n {error && (\n <Alert severity=\"error\">{t('templateList.errorPosting')}</Alert>\n )}\n <TextField\n label={t('templateList.titleInput.label')}\n className=\"qetaTemplateFormTitle\"\n required\n fullWidth\n error={'title' in errors}\n margin=\"normal\"\n variant=\"outlined\"\n helperText={t('templateList.titleInput.helperText')}\n FormHelperTextProps={{\n style: { marginLeft: '0.2em' },\n }}\n {\n // @ts-ignore\n ...register('title', { required: true, maxLength: 255 })\n }\n />\n\n <TextField\n label={t('templateList.descriptionInput.label')}\n className=\"qetaTemplateFormDescription\"\n required\n fullWidth\n error={'description' in errors}\n margin=\"normal\"\n variant=\"outlined\"\n helperText={t('templateList.descriptionInput.helperText')}\n FormHelperTextProps={{\n style: { marginLeft: '0.2em' },\n }}\n {\n // @ts-ignore\n ...register('description', { required: true, maxLength: 255 })\n }\n />\n\n <TextField\n label={t('templateList.questionTitleInput.label')}\n className=\"qetaTemplateFormQuestionTitle\"\n fullWidth\n error={'questionTitle' in errors}\n margin=\"normal\"\n variant=\"outlined\"\n FormHelperTextProps={{\n style: { marginLeft: '0.2em' },\n }}\n helperText={t('templateList.questionTitleInput.helperText')}\n {\n // @ts-ignore\n ...register('questionTitle', { maxLength: 255 })\n }\n />\n\n <Controller\n control={control}\n rules={{}}\n render={({ field: { onChange, value } }) => (\n <MarkdownEditor\n value={value ?? ''}\n disableAttachments\n onChange={onChange}\n height={400}\n error={'questionContent' in errors}\n placeholder={t('templateList.questionContentInput.placeholder')}\n onTagsChange={tags => {\n const existing = getFormValues('tags') ?? [];\n const newTags = [...new Set([...existing, ...tags])];\n setValue('tags', newTags, { shouldValidate: true });\n }}\n />\n )}\n name=\"questionContent\"\n />\n <Controller\n control={control}\n render={({\n field: { onChange, value },\n fieldState: { error: tagError },\n }) => <TagInput value={value} onChange={onChange} error={tagError} />}\n name=\"tags\"\n />\n <Controller\n control={control}\n render={({ field: { onChange, value } }) => (\n <EntitiesInput value={value} onChange={onChange} />\n )}\n name=\"entities\"\n />\n <Button\n color=\"primary\"\n type=\"submit\"\n variant=\"contained\"\n disabled={posting}\n >\n {id\n ? t('templateList.submit.existingTemplate')\n : t('templateList.submit.newTemplate')}\n </Button>\n </form>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmBA,MAAM,aAAA,GAAgB,CAAC,IAA8C,KAAA;AACnE,EAAO,OAAA;AAAA,IACL,GAAG,IAAA;AAAA,IACH,QAAU,EAAA,IAAA,CAAK,QAAU,EAAA,GAAA,CAAI,kBAAkB;AAAA,GACjD;AACF,CAAA;AAEA,MAAM,mBAAmB,MAA0B;AACjD,EAAO,OAAA;AAAA,IACL,KAAO,EAAA,EAAA;AAAA,IACP,WAAa,EAAA,EAAA;AAAA,IACb,MAAM,EAAC;AAAA,IACP,UAAU;AAAC,GACb;AACF,CAAA;AAEA,MAAM,SAAY,GAAA,OAChB,GACA,EAAA,UAAA,EACA,EACgC,KAAA;AAChC,EAAA,IAAI,CAAC,EAAI,EAAA;AACP,IAAA,OAAO,gBAAiB,EAAA;AAAA;AAG1B,EAAA,MAAM,QAAW,GAAA,MAAM,GAAI,CAAA,WAAA,CAAY,EAAE,CAAA;AACzC,EAAM,MAAA,QAAA,GACJ,SAAS,QAAY,IAAA,QAAA,CAAS,SAAS,MAAS,GAAA,CAAA,GAC5C,MAAM,UAAA,CAAW,iBAAkB,CAAA;AAAA,IACjC,YAAY,QAAS,CAAA,QAAA;AAAA,IACrB,MAAQ,EAAA;AAAA,MACN,MAAA;AAAA,MACA,eAAA;AAAA,MACA,oBAAA;AAAA,MACA;AAAA;AACF,GACD,IACD,EAAC;AACP,EAAO,OAAA;AAAA,IACL,OAAO,QAAS,CAAA,KAAA;AAAA,IAChB,aAAa,QAAS,CAAA,WAAA;AAAA,IACtB,eAAe,QAAS,CAAA,aAAA;AAAA,IACxB,iBAAiB,QAAS,CAAA,eAAA;AAAA,IAC1B,IAAA,EAAM,QAAS,CAAA,IAAA,IAAQ,EAAC;AAAA,IACxB,UAAU,OAAW,IAAA,QAAA,GAAW,QAAQ,QAAS,CAAA,KAAK,IAAI;AAAC,GAC7D;AACF,CAAA;AAEa,MAAA,YAAA,GAAe,CAAC,KAA+C,KAAA;AAC1E,EAAM,MAAA,EAAE,EAAI,EAAA,MAAA,EAAW,GAAA,KAAA;AACvB,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,KAAK,CAAA;AAC5C,EAAM,MAAA,UAAA,GAAa,OAAO,aAAa,CAAA;AACvC,EAAM,MAAA,OAAA,GAAU,OAAO,UAAU,CAAA;AACjC,EAAM,MAAA,QAAA,GAAW,OAAO,WAAW,CAAA;AACnC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAS,KAAK,CAAA;AACxC,EAAA,MAAM,CAAC,MAAQ,EAAA,SAAS,CAAI,GAAA,QAAA,CAAS,kBAAkB,CAAA;AACvD,EAAM,MAAA,EAAE,WAAY,EAAA,GAAI,cAAe,EAAA;AACvC,EAAA,MAAM,EAAE,CAAA,EAAM,GAAA,iBAAA,CAAkB,kBAAkB,CAAA;AAClD,EAAM,MAAA;AAAA,IACJ,QAAA;AAAA,IACA,YAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAW,EAAA,aAAA;AAAA,IACX,QAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA,EAAW,EAAE,MAAO;AAAA,MAClB,OAA4B,CAAA;AAAA,IAC9B,MAAA;AAAA,IACA,eAAe,gBAAiB;AAAA,GACjC,CAAA;AAED,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,EAAI,EAAA;AACN,MAAA,SAAA,CAAU,SAAS,UAAY,EAAA,EAAA,CAAG,QAAS,CAAA,EAAE,CAAC,CAC3C,CAAA,KAAA;AAAA,QAAM,CAAA,CAAA,KACL,SAAS,IAAK,CAAA;AAAA,UACZ,SAAS,CAAE,CAAA,OAAA;AAAA,UACX,QAAU,EAAA,OAAA;AAAA,UACV,OAAS,EAAA;AAAA,SACV;AAAA,OACH,CACC,KAAK,CAAQ,IAAA,KAAA;AACZ,QAAA,IAAI,IAAM,EAAA;AACR,UAAA,SAAA,CAAU,IAAI,CAAA;AAAA;AAChB,OACD,CAAA;AAAA;AACL,KACC,CAAC,OAAA,EAAS,UAAY,EAAA,EAAA,EAAI,QAAQ,CAAC,CAAA;AAEtC,EAAM,MAAA,YAAA,GAAe,CAAC,IAA6B,KAAA;AACjD,IAAA,UAAA,CAAW,IAAI,CAAA;AAEf,IAAA,IAAI,EAAI,EAAA;AACN,MAAA,OAAA,CACG,eAAe,EAAI,EAAA,aAAA,CAAc,IAAI,CAAC,CAAA,CACtC,KAAK,CAAM,EAAA,KAAA;AACV,QAAM,KAAA,EAAA;AACN,QAAO,MAAA,EAAA;AAAA,OACR,CACA,CAAA,KAAA,CAAM,CAAK,CAAA,KAAA;AACV,QAAA,QAAA,CAAS,IAAI,CAAA;AACb,QAAA,QAAA,CAAS,IAAK,CAAA;AAAA,UACZ,SAAS,CAAE,CAAA,OAAA;AAAA,UACX,QAAU,EAAA,OAAA;AAAA,UACV,OAAS,EAAA;AAAA,SACV,CAAA;AAAA,OACF,CACA,CAAA,OAAA,CAAQ,MAAM,UAAA,CAAW,KAAK,CAAC,CAAA;AAClC,MAAA;AAAA;AAEF,IAAA,OAAA,CACG,eAAe,aAAc,CAAA,IAAI,CAAC,CAAA,CAClC,KAAK,CAAK,CAAA,KAAA;AACT,MAAA,IAAI,CAAC,CAAA,IAAK,CAAC,CAAA,CAAE,EAAI,EAAA;AACf,QAAA,QAAA,CAAS,IAAI,CAAA;AACb,QAAA;AAAA;AAEF,MAAM,KAAA,EAAA;AACN,MAAO,MAAA,EAAA;AAAA,KACR,CACA,CAAA,KAAA,CAAM,CAAK,CAAA,KAAA;AACV,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,QAAA,CAAS,IAAK,CAAA;AAAA,QACZ,SAAS,CAAE,CAAA,OAAA;AAAA,QACX,QAAU,EAAA,OAAA;AAAA,QACV,OAAS,EAAA;AAAA,OACV,CAAA;AAAA,KACF,CACA,CAAA,OAAA,CAAQ,MAAM,UAAA,CAAW,KAAK,CAAC,CAAA;AAAA,GACpC;AAEA,EAAA,IAAI,CAAC,WAAa,EAAA;AAChB,IAAO,OAAA,IAAA;AAAA;AAGT,EAAA,uBACG,IAAA,CAAA,MAAA,EAAA,EAAK,QAAU,EAAA,YAAA,CAAa,YAAY,CACtC,EAAA,QAAA,EAAA;AAAA,IAAA,KAAA,wBACE,KAAM,EAAA,EAAA,QAAA,EAAS,OAAS,EAAA,QAAA,EAAA,CAAA,CAAE,2BAA2B,CAAE,EAAA,CAAA;AAAA,oBAE1D,GAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,+BAA+B,CAAA;AAAA,QACxC,SAAU,EAAA,uBAAA;AAAA,QACV,QAAQ,EAAA,IAAA;AAAA,QACR,SAAS,EAAA,IAAA;AAAA,QACT,OAAO,OAAW,IAAA,MAAA;AAAA,QAClB,MAAO,EAAA,QAAA;AAAA,QACP,OAAQ,EAAA,UAAA;AAAA,QACR,UAAA,EAAY,EAAE,oCAAoC,CAAA;AAAA,QAClD,mBAAqB,EAAA;AAAA,UACnB,KAAA,EAAO,EAAE,UAAA,EAAY,OAAQ;AAAA,SAC/B;AAAA;AAAA,QAGE,GAAG,SAAS,OAAS,EAAA,EAAE,UAAU,IAAM,EAAA,SAAA,EAAW,KAAK;AAAA;AAAA,KAE3D;AAAA,oBAEA,GAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,qCAAqC,CAAA;AAAA,QAC9C,SAAU,EAAA,6BAAA;AAAA,QACV,QAAQ,EAAA,IAAA;AAAA,QACR,SAAS,EAAA,IAAA;AAAA,QACT,OAAO,aAAiB,IAAA,MAAA;AAAA,QACxB,MAAO,EAAA,QAAA;AAAA,QACP,OAAQ,EAAA,UAAA;AAAA,QACR,UAAA,EAAY,EAAE,0CAA0C,CAAA;AAAA,QACxD,mBAAqB,EAAA;AAAA,UACnB,KAAA,EAAO,EAAE,UAAA,EAAY,OAAQ;AAAA,SAC/B;AAAA;AAAA,QAGE,GAAG,SAAS,aAAe,EAAA,EAAE,UAAU,IAAM,EAAA,SAAA,EAAW,KAAK;AAAA;AAAA,KAEjE;AAAA,oBAEA,GAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,uCAAuC,CAAA;AAAA,QAChD,SAAU,EAAA,+BAAA;AAAA,QACV,SAAS,EAAA,IAAA;AAAA,QACT,OAAO,eAAmB,IAAA,MAAA;AAAA,QAC1B,MAAO,EAAA,QAAA;AAAA,QACP,OAAQ,EAAA,UAAA;AAAA,QACR,mBAAqB,EAAA;AAAA,UACnB,KAAA,EAAO,EAAE,UAAA,EAAY,OAAQ;AAAA,SAC/B;AAAA,QACA,UAAA,EAAY,EAAE,4CAA4C,CAAA;AAAA;AAAA,QAGxD,GAAG,QAAS,CAAA,eAAA,EAAiB,EAAE,SAAA,EAAW,KAAK;AAAA;AAAA,KAEnD;AAAA,oBAEA,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,OAAA;AAAA,QACA,OAAO,EAAC;AAAA,QACR,MAAA,EAAQ,CAAC,EAAE,KAAA,EAAO,EAAE,QAAU,EAAA,KAAA,IAC5B,qBAAA,GAAA;AAAA,UAAC,cAAA;AAAA,UAAA;AAAA,YACC,OAAO,KAAS,IAAA,EAAA;AAAA,YAChB,kBAAkB,EAAA,IAAA;AAAA,YAClB,QAAA;AAAA,YACA,MAAQ,EAAA,GAAA;AAAA,YACR,OAAO,iBAAqB,IAAA,MAAA;AAAA,YAC5B,WAAA,EAAa,EAAE,+CAA+C,CAAA;AAAA,YAC9D,cAAc,CAAQ,IAAA,KAAA;AACpB,cAAA,MAAM,QAAW,GAAA,aAAA,CAAc,MAAM,CAAA,IAAK,EAAC;AAC3C,cAAM,MAAA,OAAA,GAAU,CAAC,mBAAO,IAAA,GAAA,CAAI,CAAC,GAAG,QAAU,EAAA,GAAG,IAAI,CAAC,CAAC,CAAA;AACnD,cAAA,QAAA,CAAS,MAAQ,EAAA,OAAA,EAAS,EAAE,cAAA,EAAgB,MAAM,CAAA;AAAA;AACpD;AAAA,SACF;AAAA,QAEF,IAAK,EAAA;AAAA;AAAA,KACP;AAAA,oBACA,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,OAAA;AAAA,QACA,QAAQ,CAAC;AAAA,UACP,KAAA,EAAO,EAAE,QAAA,EAAU,KAAM,EAAA;AAAA,UACzB,UAAA,EAAY,EAAE,KAAA,EAAO,QAAS;AAAA,8BACzB,GAAA,CAAA,QAAA,EAAA,EAAS,KAAc,EAAA,QAAA,EAAoB,OAAO,QAAU,EAAA,CAAA;AAAA,QACnE,IAAK,EAAA;AAAA;AAAA,KACP;AAAA,oBACA,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,OAAA;AAAA,QACA,MAAQ,EAAA,CAAC,EAAE,KAAA,EAAO,EAAE,QAAA,EAAU,KAAM,EAAA,EAClC,qBAAA,GAAA,CAAC,aAAc,EAAA,EAAA,KAAA,EAAc,QAAoB,EAAA,CAAA;AAAA,QAEnD,IAAK,EAAA;AAAA;AAAA,KACP;AAAA,oBACA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,KAAM,EAAA,SAAA;AAAA,QACN,IAAK,EAAA,QAAA;AAAA,QACL,OAAQ,EAAA,WAAA;AAAA,QACR,QAAU,EAAA,OAAA;AAAA,QAET,QACG,EAAA,EAAA,GAAA,CAAA,CAAE,sCAAsC,CAAA,GACxC,EAAE,iCAAiC;AAAA;AAAA;AACzC,GACF,EAAA,CAAA;AAEJ;;;;"}
|
|
1
|
+
{"version":3,"file":"TemplateForm.esm.js","sources":["../../../src/components/TemplateList/TemplateForm.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport { useIsModerator } from '../../hooks';\nimport { QetaApi, TemplateRequest } from '@drodil/backstage-plugin-qeta-common';\nimport { alertApiRef, useApi } from '@backstage/core-plugin-api';\nimport { qetaApiRef } from '../../api';\nimport { Controller, useForm } from 'react-hook-form';\nimport { stringifyEntityRef } from '@backstage/catalog-model';\nimport { CatalogApi } from '@backstage/catalog-client';\nimport { compact } from 'lodash';\nimport { catalogApiRef } from '@backstage/plugin-catalog-react';\nimport { MarkdownEditor } from '../MarkdownEditor/MarkdownEditor';\nimport { TagInput } from '../PostForm/TagInput';\nimport { EntitiesInput } from '../PostForm/EntitiesInput';\nimport { TemplateFormValues } from '../PostForm/types';\nimport { Button, TextField } from '@material-ui/core';\nimport { Alert } from '@material-ui/lab';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../../translation.ts';\n\nconst formToRequest = (form: TemplateFormValues): TemplateRequest => {\n return {\n ...form,\n entities: form.entities?.map(stringifyEntityRef),\n };\n};\n\nconst getDefaultValues = (): TemplateFormValues => {\n return {\n title: '',\n description: '',\n tags: [],\n entities: [],\n };\n};\n\nconst getValues = async (\n api: QetaApi,\n catalogApi: CatalogApi,\n id?: string,\n): Promise<TemplateFormValues> => {\n if (!id) {\n return getDefaultValues();\n }\n\n const template = await api.getTemplate(id);\n const entities =\n template.entities && template.entities.length > 0\n ? await catalogApi.getEntitiesByRefs({\n entityRefs: template.entities,\n fields: [\n 'kind',\n 'metadata.name',\n 'metadata.namespace',\n 'metadata.title',\n ],\n })\n : [];\n return {\n title: template.title,\n description: template.description,\n questionTitle: template.questionTitle,\n questionContent: template.questionContent,\n tags: template.tags ?? [],\n entities: 'items' in entities ? compact(entities.items) : [],\n };\n};\n\nexport const TemplateForm = (props: { id?: number; onPost: () => void }) => {\n const { id, onPost } = props;\n const [posting, setPosting] = useState(false);\n const catalogApi = useApi(catalogApiRef);\n const qetaApi = useApi(qetaApiRef);\n const alertApi = useApi(alertApiRef);\n const [error, setError] = useState(false);\n const [values, setValues] = useState(getDefaultValues());\n const { isModerator } = useIsModerator();\n const { t } = useTranslationRef(qetaTranslationRef);\n const {\n register,\n handleSubmit,\n control,\n getValues: getFormValues,\n setValue,\n reset,\n formState: { errors },\n } = useForm<TemplateFormValues>({\n values,\n defaultValues: getDefaultValues(),\n });\n\n useEffect(() => {\n if (id) {\n getValues(qetaApi, catalogApi, id.toString(10))\n .catch(e =>\n alertApi.post({\n message: e.message,\n severity: 'error',\n display: 'transient',\n }),\n )\n .then(data => {\n if (data) {\n setValues(data);\n }\n });\n }\n }, [qetaApi, catalogApi, id, alertApi]);\n\n const postTemplate = (data: TemplateFormValues) => {\n setPosting(true);\n\n if (id) {\n qetaApi\n .updateTemplate(id, formToRequest(data))\n .then(_q => {\n reset();\n onPost();\n })\n .catch(e => {\n setError(true);\n alertApi.post({\n message: e.message,\n severity: 'error',\n display: 'transient',\n });\n })\n .finally(() => setPosting(false));\n return;\n }\n qetaApi\n .createTemplate(formToRequest(data))\n .then(q => {\n if (!q || !q.id) {\n setError(true);\n return;\n }\n reset();\n onPost();\n })\n .catch(e => {\n setError(true);\n alertApi.post({\n message: e.message,\n severity: 'error',\n display: 'transient',\n });\n })\n .finally(() => setPosting(false));\n };\n\n if (!isModerator) {\n return null;\n }\n\n return (\n <form onSubmit={handleSubmit(postTemplate)}>\n {error && (\n <Alert severity=\"error\">{t('templateList.errorPosting')}</Alert>\n )}\n <TextField\n label={t('templateList.titleInput.label')}\n className=\"qetaTemplateFormTitle\"\n required\n fullWidth\n error={'title' in errors}\n margin=\"normal\"\n variant=\"outlined\"\n helperText={t('templateList.titleInput.helperText')}\n FormHelperTextProps={{\n style: { marginLeft: '0.2em' },\n }}\n {\n // @ts-ignore\n ...register('title', { required: true, maxLength: 255 })\n }\n />\n\n <TextField\n label={t('templateList.descriptionInput.label')}\n className=\"qetaTemplateFormDescription\"\n required\n fullWidth\n error={'description' in errors}\n margin=\"normal\"\n variant=\"outlined\"\n helperText={t('templateList.descriptionInput.helperText')}\n FormHelperTextProps={{\n style: { marginLeft: '0.2em' },\n }}\n {\n // @ts-ignore\n ...register('description', { required: true, maxLength: 255 })\n }\n />\n\n <TextField\n label={t('templateList.questionTitleInput.label')}\n className=\"qetaTemplateFormQuestionTitle\"\n fullWidth\n error={'questionTitle' in errors}\n margin=\"normal\"\n variant=\"outlined\"\n FormHelperTextProps={{\n style: { marginLeft: '0.2em' },\n }}\n helperText={t('templateList.questionTitleInput.helperText')}\n {\n // @ts-ignore\n ...register('questionTitle', { maxLength: 255 })\n }\n />\n\n <Controller\n control={control}\n rules={{}}\n render={({ field: { onChange, value } }) => (\n <MarkdownEditor\n value={value ?? ''}\n disableAttachments\n onChange={onChange}\n height={400}\n error={'questionContent' in errors}\n placeholder={t('templateList.questionContentInput.placeholder')}\n onTagsChange={tags => {\n const existing = getFormValues('tags') ?? [];\n const newTags = [...new Set([...existing, ...tags])];\n setValue('tags', newTags, { shouldValidate: true });\n }}\n />\n )}\n name=\"questionContent\"\n />\n <Controller\n control={control}\n render={({\n field: { onChange, value },\n fieldState: { error: tagError },\n }) => <TagInput value={value} onChange={onChange} error={tagError} />}\n name=\"tags\"\n />\n <Controller\n control={control}\n render={({ field: { onChange, value } }) => (\n <EntitiesInput value={value} onChange={onChange} />\n )}\n name=\"entities\"\n />\n <Button\n color=\"primary\"\n type=\"submit\"\n variant=\"contained\"\n disabled={posting}\n >\n {id\n ? t('templateList.submit.existingTemplate')\n : t('templateList.submit.newTemplate')}\n </Button>\n </form>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -19,7 +19,7 @@ import { Button, Box, List, ListItem, ListItemText, ListItemSecondaryAction, Ico
|
|
|
19
19
|
import { useNavigate } from 'react-router-dom';
|
|
20
20
|
import 'react-use/lib/useDebounce';
|
|
21
21
|
import '../FilterPanel/FilterPanel.esm.js';
|
|
22
|
-
import '
|
|
22
|
+
import '../QetaContext/QetaContext.esm.js';
|
|
23
23
|
import { Progress, WarningPanel } from '@backstage/core-components';
|
|
24
24
|
import EditIcon from '@material-ui/icons/Edit';
|
|
25
25
|
import DeleteIcon from '@material-ui/icons/Delete';
|
|
@@ -19,7 +19,7 @@ import '@drodil/backstage-plugin-qeta-common';
|
|
|
19
19
|
import '@backstage/plugin-permission-common';
|
|
20
20
|
import 'react-use/lib/useDebounce';
|
|
21
21
|
import '../FilterPanel/FilterPanel.esm.js';
|
|
22
|
-
import '
|
|
22
|
+
import '../QetaContext/QetaContext.esm.js';
|
|
23
23
|
|
|
24
24
|
const useStyles = makeStyles((theme) => ({
|
|
25
25
|
root: {
|
|
@@ -21,7 +21,7 @@ import '@backstage/plugin-permission-common';
|
|
|
21
21
|
import 'react-router-dom';
|
|
22
22
|
import 'react-use/lib/useDebounce';
|
|
23
23
|
import '../FilterPanel/FilterPanel.esm.js';
|
|
24
|
-
import '
|
|
24
|
+
import '../QetaContext/QetaContext.esm.js';
|
|
25
25
|
|
|
26
26
|
const useStyles = makeStyles((theme) => {
|
|
27
27
|
return {
|
|
@@ -17,7 +17,7 @@ import { makeStyles, Avatar, Box, Tooltip, Typography } from '@material-ui/core'
|
|
|
17
17
|
import { Link } from 'react-router-dom';
|
|
18
18
|
import 'react-use/lib/useDebounce';
|
|
19
19
|
import '../FilterPanel/FilterPanel.esm.js';
|
|
20
|
-
import '
|
|
20
|
+
import '../QetaContext/QetaContext.esm.js';
|
|
21
21
|
import { UserFollowButton } from '../Buttons/UserFollowButton.esm.js';
|
|
22
22
|
import Visibility from '@material-ui/icons/Visibility';
|
|
23
23
|
import QuestionAnswerIcon from '@material-ui/icons/QuestionAnswer';
|
|
@@ -23,7 +23,9 @@ const UsersContainer = (props) => {
|
|
|
23
23
|
return api.getUsers({
|
|
24
24
|
limit,
|
|
25
25
|
offset,
|
|
26
|
-
searchQuery: filters.searchQuery
|
|
26
|
+
searchQuery: filters.searchQuery,
|
|
27
|
+
order: filters.order,
|
|
28
|
+
orderBy: filters.orderBy
|
|
27
29
|
}).then((res) => ({ items: res.users, total: res.total }));
|
|
28
30
|
},
|
|
29
31
|
filterPanelProps: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UsersContainer.esm.js","sources":["../../../src/components/UsersContainer/UsersContainer.tsx"],"sourcesContent":["import { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { QetaEntityContainer } from '../QetaEntityContainer/QetaEntityContainer';\nimport { UserListItem } from './UserListItem';\nimport { UsersGridItem } from './UsersGridItem';\nimport { UserResponse } from '@drodil/backstage-plugin-qeta-common';\nimport {\n CommonFilterPanelProps,\n UserFilters,\n} from '../FilterPanel/FilterPanel';\nimport { qetaTranslationRef } from '../../translation';\nimport { ViewType } from '../ViewToggle/ViewToggle';\n\nexport const UsersContainer = (props: {\n filterPanelProps?: CommonFilterPanelProps;\n defaultView?: ViewType;\n}) => {\n const { filterPanelProps, defaultView } = props;\n const { t } = useTranslationRef(qetaTranslationRef);\n\n return (\n <QetaEntityContainer<UserResponse, UserFilters>\n prefix=\"users\"\n defaultPageSize={24}\n defaultView={defaultView}\n initialFilters={{\n order: 'desc',\n orderBy: 'totalPosts',\n searchQuery: '',\n }}\n fetch={(api, limit, offset, filters) => {\n return api\n .getUsers({\n limit,\n offset,\n searchQuery: filters.searchQuery,\n })\n .then(res => ({ items: res.users, total: res.total }));\n }}\n filterPanelProps={{\n ...filterPanelProps,\n mode: 'users',\n }}\n renderListItem={user => <UserListItem user={user} />}\n renderGridItem={user => <UsersGridItem user={user} />}\n title={total => t('usersPage.users', { count: total })}\n searchPlaceholder={t('usersPage.search.label')}\n emptyMessage={t('usersPage.users', { count: 0 })}\n getKey={user => user.userRef}\n />\n );\n};\n"],"names":[],"mappings":";;;;;;;AAYa,MAAA,cAAA,GAAiB,CAAC,KAGzB,KAAA;AACJ,EAAM,MAAA,EAAE,gBAAkB,EAAA,WAAA,EAAgB,GAAA,KAAA;AAC1C,EAAA,MAAM,EAAE,CAAA,EAAM,GAAA,iBAAA,CAAkB,kBAAkB,CAAA;AAElD,EACE,uBAAA,GAAA;AAAA,IAAC,mBAAA;AAAA,IAAA;AAAA,MACC,MAAO,EAAA,OAAA;AAAA,MACP,eAAiB,EAAA,EAAA;AAAA,MACjB,WAAA;AAAA,MACA,cAAgB,EAAA;AAAA,QACd,KAAO,EAAA,MAAA;AAAA,QACP,OAAS,EAAA,YAAA;AAAA,QACT,WAAa,EAAA;AAAA,OACf;AAAA,MACA,KAAO,EAAA,CAAC,GAAK,EAAA,KAAA,EAAO,QAAQ,OAAY,KAAA;AACtC,QAAA,OAAO,IACJ,QAAS,CAAA;AAAA,UACR,KAAA;AAAA,UACA,MAAA;AAAA,UACA,aAAa,OAAQ,CAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"UsersContainer.esm.js","sources":["../../../src/components/UsersContainer/UsersContainer.tsx"],"sourcesContent":["import { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { QetaEntityContainer } from '../QetaEntityContainer/QetaEntityContainer';\nimport { UserListItem } from './UserListItem';\nimport { UsersGridItem } from './UsersGridItem';\nimport { UserResponse } from '@drodil/backstage-plugin-qeta-common';\nimport {\n CommonFilterPanelProps,\n UserFilters,\n} from '../FilterPanel/FilterPanel';\nimport { qetaTranslationRef } from '../../translation';\nimport { ViewType } from '../ViewToggle/ViewToggle';\n\nexport const UsersContainer = (props: {\n filterPanelProps?: CommonFilterPanelProps;\n defaultView?: ViewType;\n}) => {\n const { filterPanelProps, defaultView } = props;\n const { t } = useTranslationRef(qetaTranslationRef);\n\n return (\n <QetaEntityContainer<UserResponse, UserFilters>\n prefix=\"users\"\n defaultPageSize={24}\n defaultView={defaultView}\n initialFilters={{\n order: 'desc',\n orderBy: 'totalPosts',\n searchQuery: '',\n }}\n fetch={(api, limit, offset, filters) => {\n return api\n .getUsers({\n limit,\n offset,\n searchQuery: filters.searchQuery,\n order: filters.order,\n orderBy: filters.orderBy,\n })\n .then(res => ({ items: res.users, total: res.total }));\n }}\n filterPanelProps={{\n ...filterPanelProps,\n mode: 'users',\n }}\n renderListItem={user => <UserListItem user={user} />}\n renderGridItem={user => <UsersGridItem user={user} />}\n title={total => t('usersPage.users', { count: total })}\n searchPlaceholder={t('usersPage.search.label')}\n emptyMessage={t('usersPage.users', { count: 0 })}\n getKey={user => user.userRef}\n />\n );\n};\n"],"names":[],"mappings":";;;;;;;AAYa,MAAA,cAAA,GAAiB,CAAC,KAGzB,KAAA;AACJ,EAAM,MAAA,EAAE,gBAAkB,EAAA,WAAA,EAAgB,GAAA,KAAA;AAC1C,EAAA,MAAM,EAAE,CAAA,EAAM,GAAA,iBAAA,CAAkB,kBAAkB,CAAA;AAElD,EACE,uBAAA,GAAA;AAAA,IAAC,mBAAA;AAAA,IAAA;AAAA,MACC,MAAO,EAAA,OAAA;AAAA,MACP,eAAiB,EAAA,EAAA;AAAA,MACjB,WAAA;AAAA,MACA,cAAgB,EAAA;AAAA,QACd,KAAO,EAAA,MAAA;AAAA,QACP,OAAS,EAAA,YAAA;AAAA,QACT,WAAa,EAAA;AAAA,OACf;AAAA,MACA,KAAO,EAAA,CAAC,GAAK,EAAA,KAAA,EAAO,QAAQ,OAAY,KAAA;AACtC,QAAA,OAAO,IACJ,QAAS,CAAA;AAAA,UACR,KAAA;AAAA,UACA,MAAA;AAAA,UACA,aAAa,OAAQ,CAAA,WAAA;AAAA,UACrB,OAAO,OAAQ,CAAA,KAAA;AAAA,UACf,SAAS,OAAQ,CAAA;AAAA,SAClB,CACA,CAAA,IAAA,CAAK,CAAQ,GAAA,MAAA,EAAE,KAAO,EAAA,GAAA,CAAI,KAAO,EAAA,KAAA,EAAO,GAAI,CAAA,KAAA,EAAQ,CAAA,CAAA;AAAA,OACzD;AAAA,MACA,gBAAkB,EAAA;AAAA,QAChB,GAAG,gBAAA;AAAA,QACH,IAAM,EAAA;AAAA,OACR;AAAA,MACA,cAAgB,EAAA,CAAA,IAAA,qBAAS,GAAA,CAAA,YAAA,EAAA,EAAa,IAAY,EAAA,CAAA;AAAA,MAClD,cAAgB,EAAA,CAAA,IAAA,qBAAS,GAAA,CAAA,aAAA,EAAA,EAAc,IAAY,EAAA,CAAA;AAAA,MACnD,OAAO,CAAS,KAAA,KAAA,CAAA,CAAE,mBAAmB,EAAE,KAAA,EAAO,OAAO,CAAA;AAAA,MACrD,iBAAA,EAAmB,EAAE,wBAAwB,CAAA;AAAA,MAC7C,cAAc,CAAE,CAAA,iBAAA,EAAmB,EAAE,KAAA,EAAO,GAAG,CAAA;AAAA,MAC/C,MAAA,EAAQ,UAAQ,IAAK,CAAA;AAAA;AAAA,GACvB;AAEJ;;;;"}
|
|
@@ -18,7 +18,7 @@ import { makeStyles, Card, Box, Avatar, Tooltip, Typography, CardContent, Grid }
|
|
|
18
18
|
import 'react-router-dom';
|
|
19
19
|
import 'react-use/lib/useDebounce';
|
|
20
20
|
import '../FilterPanel/FilterPanel.esm.js';
|
|
21
|
-
import '
|
|
21
|
+
import '../QetaContext/QetaContext.esm.js';
|
|
22
22
|
import { UserFollowButton } from '../Buttons/UserFollowButton.esm.js';
|
|
23
23
|
import Visibility from '@material-ui/icons/Visibility';
|
|
24
24
|
import QuestionAnswerIcon from '@material-ui/icons/QuestionAnswer';
|