@drodil/backstage-plugin-qeta 2.15.0 → 3.0.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.
- package/dist/components/ArticlePage/ArticlePage.esm.js +45 -0
- package/dist/components/ArticlePage/ArticlePage.esm.js.map +1 -0
- package/dist/components/ArticlesPage/ArticlesPage.esm.js +34 -0
- package/dist/components/ArticlesPage/ArticlesPage.esm.js.map +1 -0
- package/dist/components/AskPage/AskPage.esm.js +4 -4
- package/dist/components/AskPage/AskPage.esm.js.map +1 -1
- package/dist/components/CollectionCreatePage/CollectionCreatePage.esm.js +20 -0
- package/dist/components/CollectionCreatePage/CollectionCreatePage.esm.js.map +1 -0
- package/dist/components/CollectionPage/CollectionPage.esm.js +34 -0
- package/dist/components/CollectionPage/CollectionPage.esm.js.map +1 -0
- package/dist/components/CollectionsPage/CollectionsPage.esm.js +11 -0
- package/dist/components/CollectionsPage/CollectionsPage.esm.js.map +1 -0
- package/dist/components/EntityPage/EntityPage.esm.js +75 -0
- package/dist/components/EntityPage/EntityPage.esm.js.map +1 -0
- package/dist/components/FavoritePage/FavoritePage.esm.js +14 -22
- package/dist/components/FavoritePage/FavoritePage.esm.js.map +1 -1
- package/dist/components/HomePage/HomePage.esm.js +7 -10
- package/dist/components/HomePage/HomePage.esm.js.map +1 -1
- package/dist/components/LeftMenu/LeftMenu.esm.js +47 -16
- package/dist/components/LeftMenu/LeftMenu.esm.js.map +1 -1
- package/dist/components/LeftMenu/LeftMenuButton.esm.js +75 -0
- package/dist/components/LeftMenu/LeftMenuButton.esm.js.map +1 -0
- package/dist/components/QetaPage/QetaPage.esm.js +51 -9
- package/dist/components/QetaPage/QetaPage.esm.js.map +1 -1
- package/dist/components/QuestionPage/QuestionPage.esm.js +7 -13
- package/dist/components/QuestionPage/QuestionPage.esm.js.map +1 -1
- package/dist/components/QuestionTableCard/Content.esm.js +1 -1
- package/dist/components/QuestionTableCard/Content.esm.js.map +1 -1
- package/dist/components/QuestionTableCard/index.esm.js +0 -1
- package/dist/components/QuestionTableCard/index.esm.js.map +1 -1
- package/dist/components/QuestionsPage/QuestionsPage.esm.js +13 -15
- package/dist/components/QuestionsPage/QuestionsPage.esm.js.map +1 -1
- package/dist/components/Statistics/GlobalStatsContent.esm.js +1 -3
- package/dist/components/Statistics/GlobalStatsContent.esm.js.map +1 -1
- package/dist/components/Statistics/StatisticsPage.esm.js +2 -3
- package/dist/components/Statistics/StatisticsPage.esm.js.map +1 -1
- package/dist/components/TagPage/TagPage.esm.js +32 -25
- package/dist/components/TagPage/TagPage.esm.js.map +1 -1
- package/dist/components/UserPage/UserPage.esm.js +7 -16
- package/dist/components/UserPage/UserPage.esm.js.map +1 -1
- package/dist/components/UserPage/UserStatsContent.esm.js +1 -3
- package/dist/components/UserPage/UserStatsContent.esm.js.map +1 -1
- package/dist/components/UsersPage/UsersPage.esm.js +11 -0
- package/dist/components/UsersPage/UsersPage.esm.js.map +1 -0
- package/dist/components/WritePage/WritePage.esm.js +40 -0
- package/dist/components/WritePage/WritePage.esm.js.map +1 -0
- package/dist/index.d.ts +8 -422
- package/dist/index.esm.js +0 -10
- package/dist/index.esm.js.map +1 -1
- package/dist/plugin.esm.js +2 -2
- package/dist/plugin.esm.js.map +1 -1
- package/package.json +4 -24
- package/dist/api/QetaClient.esm.js +0 -513
- package/dist/api/QetaClient.esm.js.map +0 -1
- package/dist/components/AnswersContainer/AnswerList.esm.js +0 -100
- package/dist/components/AnswersContainer/AnswerList.esm.js.map +0 -1
- package/dist/components/AnswersContainer/AnswerListItem.esm.js +0 -90
- package/dist/components/AnswersContainer/AnswerListItem.esm.js.map +0 -1
- package/dist/components/AnswersContainer/AnswersContainer.esm.js +0 -210
- package/dist/components/AnswersContainer/AnswersContainer.esm.js.map +0 -1
- package/dist/components/AskAnonymouslyCheckbox/AskAnonymouslyCheckbox.esm.js +0 -34
- package/dist/components/AskAnonymouslyCheckbox/AskAnonymouslyCheckbox.esm.js.map +0 -1
- package/dist/components/AskForm/AskForm.esm.js +0 -245
- package/dist/components/AskForm/AskForm.esm.js.map +0 -1
- package/dist/components/AskForm/EntitiesInput.esm.js +0 -100
- package/dist/components/AskForm/EntitiesInput.esm.js.map +0 -1
- package/dist/components/AskForm/TagInput.esm.js +0 -81
- package/dist/components/AskForm/TagInput.esm.js.map +0 -1
- package/dist/components/Buttons/AskQuestionButton.esm.js +0 -45
- package/dist/components/Buttons/AskQuestionButton.esm.js.map +0 -1
- package/dist/components/Buttons/BackToQuestionsButton.esm.js +0 -39
- package/dist/components/Buttons/BackToQuestionsButton.esm.js.map +0 -1
- package/dist/components/Buttons/EntityFollowButton.esm.js +0 -34
- package/dist/components/Buttons/EntityFollowButton.esm.js.map +0 -1
- package/dist/components/Buttons/TagFollowButton.esm.js +0 -33
- package/dist/components/Buttons/TagFollowButton.esm.js.map +0 -1
- package/dist/components/CommentSection/CommentList.esm.js +0 -47
- package/dist/components/CommentSection/CommentList.esm.js.map +0 -1
- package/dist/components/CommentSection/CommentSection.esm.js +0 -126
- package/dist/components/CommentSection/CommentSection.esm.js.map +0 -1
- package/dist/components/DeleteModal/DeleteModal.esm.js +0 -78
- package/dist/components/DeleteModal/DeleteModal.esm.js.map +0 -1
- package/dist/components/HomePageCards/ImpactCard.esm.js +0 -22
- package/dist/components/HomePageCards/ImpactCard.esm.js.map +0 -1
- package/dist/components/HomePageCards/QuestionsCard.esm.js +0 -21
- package/dist/components/HomePageCards/QuestionsCard.esm.js.map +0 -1
- package/dist/components/Links/Links.esm.js +0 -33
- package/dist/components/Links/Links.esm.js.map +0 -1
- package/dist/components/MarkdownEditor/MarkdownEditor.esm.js +0 -78
- package/dist/components/MarkdownEditor/MarkdownEditor.esm.js.map +0 -1
- package/dist/components/MarkdownRenderer/MarkdownRenderer.esm.js +0 -37
- package/dist/components/MarkdownRenderer/MarkdownRenderer.esm.js.map +0 -1
- package/dist/components/QetaPage/FollowedEntitiesList.esm.js +0 -43
- package/dist/components/QetaPage/FollowedEntitiesList.esm.js.map +0 -1
- package/dist/components/QetaPage/FollowedTagsList.esm.js +0 -56
- package/dist/components/QetaPage/FollowedTagsList.esm.js.map +0 -1
- package/dist/components/QuestionHighlightList/QuestionHighlightList.esm.js +0 -64
- package/dist/components/QuestionHighlightList/QuestionHighlightList.esm.js.map +0 -1
- package/dist/components/QuestionPage/AnswerCard.esm.js +0 -113
- package/dist/components/QuestionPage/AnswerCard.esm.js.map +0 -1
- package/dist/components/QuestionPage/AnswerForm.esm.js +0 -153
- package/dist/components/QuestionPage/AnswerForm.esm.js.map +0 -1
- package/dist/components/QuestionPage/AuthorBox.esm.js +0 -25
- package/dist/components/QuestionPage/AuthorBox.esm.js.map +0 -1
- package/dist/components/QuestionPage/EntityChip.esm.js +0 -27
- package/dist/components/QuestionPage/EntityChip.esm.js.map +0 -1
- package/dist/components/QuestionPage/FavoriteButton.esm.js +0 -45
- package/dist/components/QuestionPage/FavoriteButton.esm.js.map +0 -1
- package/dist/components/QuestionPage/LinkButton.esm.js +0 -28
- package/dist/components/QuestionPage/LinkButton.esm.js.map +0 -1
- package/dist/components/QuestionPage/QuestionCard.esm.js +0 -107
- package/dist/components/QuestionPage/QuestionCard.esm.js.map +0 -1
- package/dist/components/QuestionPage/TagsAndEntities.esm.js +0 -44
- package/dist/components/QuestionPage/TagsAndEntities.esm.js.map +0 -1
- package/dist/components/QuestionPage/VoteButtons.esm.js +0 -153
- package/dist/components/QuestionPage/VoteButtons.esm.js.map +0 -1
- package/dist/components/QuestionTableCard/QuestionTableRow.esm.js +0 -21
- package/dist/components/QuestionTableCard/QuestionTableRow.esm.js.map +0 -1
- package/dist/components/QuestionTableCard/QuestionsTable.esm.js +0 -130
- package/dist/components/QuestionTableCard/QuestionsTable.esm.js.map +0 -1
- package/dist/components/QuestionsContainer/DateRangeFilter.esm.js +0 -110
- package/dist/components/QuestionsContainer/DateRangeFilter.esm.js.map +0 -1
- package/dist/components/QuestionsContainer/FilterPanel.esm.js +0 -237
- package/dist/components/QuestionsContainer/FilterPanel.esm.js.map +0 -1
- package/dist/components/QuestionsContainer/NoQuestionsCard.esm.js +0 -47
- package/dist/components/QuestionsContainer/NoQuestionsCard.esm.js.map +0 -1
- package/dist/components/QuestionsContainer/QuestionList.esm.js +0 -103
- package/dist/components/QuestionsContainer/QuestionList.esm.js.map +0 -1
- package/dist/components/QuestionsContainer/QuestionListItem.esm.js +0 -123
- package/dist/components/QuestionsContainer/QuestionListItem.esm.js.map +0 -1
- package/dist/components/QuestionsContainer/QuestionsContainer.esm.js +0 -243
- package/dist/components/QuestionsContainer/QuestionsContainer.esm.js.map +0 -1
- package/dist/components/RelativeTimeWithTooltip/RelativeTimeWithTooltip.esm.js +0 -22
- package/dist/components/RelativeTimeWithTooltip/RelativeTimeWithTooltip.esm.js.map +0 -1
- package/dist/components/Statistics/StatsChart.esm.js +0 -238
- package/dist/components/Statistics/StatsChart.esm.js.map +0 -1
- package/dist/components/Statistics/SummaryStatsGrid.esm.js +0 -47
- package/dist/components/Statistics/SummaryStatsGrid.esm.js.map +0 -1
- package/dist/components/Statistics/TopRankingUsersCard.esm.js +0 -161
- package/dist/components/Statistics/TopRankingUsersCard.esm.js.map +0 -1
- package/dist/components/Statistics/TrophyIcon.esm.js +0 -19
- package/dist/components/Statistics/TrophyIcon.esm.js.map +0 -1
- package/dist/components/Statistics/styles.esm.js +0 -23
- package/dist/components/Statistics/styles.esm.js.map +0 -1
- package/dist/components/TagPage/TagsContainer.esm.js +0 -57
- package/dist/components/TagPage/TagsContainer.esm.js.map +0 -1
- package/dist/locale/fi.esm.js +0 -195
- package/dist/locale/fi.esm.js.map +0 -1
- package/dist/translation.esm.js +0 -359
- package/dist/translation.esm.js.map +0 -1
- package/dist/utils/hooks.esm.js +0 -430
- package/dist/utils/hooks.esm.js.map +0 -1
- package/dist/utils/utils.esm.js +0 -72
- package/dist/utils/utils.esm.js.map +0 -1
package/dist/utils/hooks.esm.js
DELETED
|
@@ -1,430 +0,0 @@
|
|
|
1
|
-
import { qetaApiRef } from '../api/QetaClient.esm.js';
|
|
2
|
-
import useAsync from 'react-use/lib/useAsync';
|
|
3
|
-
import { useApi, identityApiRef, appThemeApiRef, configApiRef } from '@backstage/core-plugin-api';
|
|
4
|
-
import { makeStyles } from '@material-ui/core';
|
|
5
|
-
import { catalogApiRef, useEntityPresentation } from '@backstage/plugin-catalog-react';
|
|
6
|
-
import { trimEnd } from 'lodash';
|
|
7
|
-
import { useSearchParams } from 'react-router-dom';
|
|
8
|
-
import React, { useEffect, useCallback, useMemo } from 'react';
|
|
9
|
-
import DataLoader from 'dataloader';
|
|
10
|
-
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
|
|
11
|
-
import { qetaTranslationRef } from '../translation.esm.js';
|
|
12
|
-
|
|
13
|
-
function useQetaApi(f, deps = []) {
|
|
14
|
-
const qetaApi = useApi(qetaApiRef);
|
|
15
|
-
return useAsync(async () => {
|
|
16
|
-
return await f(qetaApi);
|
|
17
|
-
}, deps);
|
|
18
|
-
}
|
|
19
|
-
function useIdentityApi(f, deps = []) {
|
|
20
|
-
const identityApi = useApi(identityApiRef);
|
|
21
|
-
return useAsync(async () => {
|
|
22
|
-
return await f(identityApi);
|
|
23
|
-
}, deps);
|
|
24
|
-
}
|
|
25
|
-
function useEntityQueryParameter(entity) {
|
|
26
|
-
const [searchParams] = useSearchParams();
|
|
27
|
-
const [entityRef, setEntityRef] = React.useState(entity);
|
|
28
|
-
useEffect(() => {
|
|
29
|
-
setEntityRef(searchParams.get("entity") ?? void 0);
|
|
30
|
-
}, [searchParams, setEntityRef]);
|
|
31
|
-
return entityRef;
|
|
32
|
-
}
|
|
33
|
-
function useIsDarkTheme() {
|
|
34
|
-
const appThemeApi = useApi(appThemeApiRef);
|
|
35
|
-
const themes = appThemeApi.getInstalledThemes();
|
|
36
|
-
const theme = useMemo(() => appThemeApi.getActiveThemeId(), [appThemeApi]);
|
|
37
|
-
return Boolean(themes.find((t) => t.id === theme)?.variant === "dark");
|
|
38
|
-
}
|
|
39
|
-
const useStyles = makeStyles((theme) => {
|
|
40
|
-
return {
|
|
41
|
-
leftMenu: {
|
|
42
|
-
position: "sticky",
|
|
43
|
-
top: "0",
|
|
44
|
-
width: "180px"
|
|
45
|
-
},
|
|
46
|
-
selectedMenuItem: {
|
|
47
|
-
color: theme.palette.primary.contrastText,
|
|
48
|
-
backgroundColor: theme.palette.primary.light,
|
|
49
|
-
borderRadius: theme.shape.borderRadius,
|
|
50
|
-
"&:hover": {
|
|
51
|
-
backgroundColor: theme.palette.primary.dark
|
|
52
|
-
},
|
|
53
|
-
"& svg": {
|
|
54
|
-
color: theme.palette.primary.contrastText
|
|
55
|
-
}
|
|
56
|
-
},
|
|
57
|
-
nonSelectedMenuItem: {
|
|
58
|
-
backgroundColor: "initial"
|
|
59
|
-
},
|
|
60
|
-
markdownEditor: {
|
|
61
|
-
backgroundColor: "initial",
|
|
62
|
-
color: theme.palette.text.primary,
|
|
63
|
-
border: `1px solid ${theme.palette.action.disabled}`,
|
|
64
|
-
borderRadius: theme.shape.borderRadius,
|
|
65
|
-
"&:hover": {
|
|
66
|
-
borderColor: theme.palette.action.active
|
|
67
|
-
},
|
|
68
|
-
"&:focus-within": {
|
|
69
|
-
borderColor: theme.palette.primary.main
|
|
70
|
-
},
|
|
71
|
-
"& .mde-header": {
|
|
72
|
-
backgroundColor: "initial",
|
|
73
|
-
color: theme.palette.text.primary,
|
|
74
|
-
borderBottom: `1px solid ${theme.palette.action.selected}`,
|
|
75
|
-
"& .mde-tabs button, .mde-header-item > button": {
|
|
76
|
-
color: `${theme.palette.text.primary} !important`
|
|
77
|
-
}
|
|
78
|
-
},
|
|
79
|
-
"& .mde-preview-content": {
|
|
80
|
-
padding: "10px"
|
|
81
|
-
},
|
|
82
|
-
"& .mde-text, .mde-preview": {
|
|
83
|
-
fontSize: theme.typography.body1.fontSize,
|
|
84
|
-
fontFamily: theme.typography.body1.fontFamily,
|
|
85
|
-
lineHeight: theme.typography.body1.lineHeight
|
|
86
|
-
},
|
|
87
|
-
"& .mde-text": {
|
|
88
|
-
backgroundColor: "initial",
|
|
89
|
-
color: theme.palette.text.primary,
|
|
90
|
-
outline: "none"
|
|
91
|
-
},
|
|
92
|
-
"& .image-tip": {
|
|
93
|
-
color: theme.palette.text.primary,
|
|
94
|
-
backgroundColor: "initial"
|
|
95
|
-
}
|
|
96
|
-
},
|
|
97
|
-
markdownEditorError: {
|
|
98
|
-
border: `1px solid ${theme.palette.error.main} !important`
|
|
99
|
-
},
|
|
100
|
-
markdownContent: {
|
|
101
|
-
"& *": {
|
|
102
|
-
wordBreak: "break-word"
|
|
103
|
-
},
|
|
104
|
-
"&.inline": {
|
|
105
|
-
display: "inline-block"
|
|
106
|
-
},
|
|
107
|
-
"& > :first-child": {
|
|
108
|
-
marginTop: "0px !important"
|
|
109
|
-
},
|
|
110
|
-
"& > :last-child": {
|
|
111
|
-
marginBottom: "0px !important"
|
|
112
|
-
}
|
|
113
|
-
},
|
|
114
|
-
successColor: {
|
|
115
|
-
color: theme.palette.success.main
|
|
116
|
-
},
|
|
117
|
-
questionDivider: {
|
|
118
|
-
marginTop: theme.spacing(2),
|
|
119
|
-
marginBottom: theme.spacing(2)
|
|
120
|
-
},
|
|
121
|
-
questionCard: {
|
|
122
|
-
marginBottom: theme.spacing(1),
|
|
123
|
-
position: "relative"
|
|
124
|
-
},
|
|
125
|
-
questionCardVote: {
|
|
126
|
-
textAlign: "center",
|
|
127
|
-
width: "32px",
|
|
128
|
-
marginRight: "20px",
|
|
129
|
-
marginLeft: "5px",
|
|
130
|
-
marginTop: "10px",
|
|
131
|
-
display: "inline-block",
|
|
132
|
-
verticalAlign: "top"
|
|
133
|
-
},
|
|
134
|
-
questionCardContent: {
|
|
135
|
-
minHeight: "160px"
|
|
136
|
-
},
|
|
137
|
-
questionListItem: {
|
|
138
|
-
padding: "0.7rem",
|
|
139
|
-
paddingBottom: "1.4rem"
|
|
140
|
-
},
|
|
141
|
-
questionListItemStats: {
|
|
142
|
-
width: "70px",
|
|
143
|
-
textAlign: "right",
|
|
144
|
-
marginRight: "5px",
|
|
145
|
-
display: "inline-block",
|
|
146
|
-
verticalAlign: "top"
|
|
147
|
-
},
|
|
148
|
-
questionListItemContent: {
|
|
149
|
-
display: "inline-block",
|
|
150
|
-
width: "calc(100% - 80px)"
|
|
151
|
-
},
|
|
152
|
-
questionListItemAuthor: {
|
|
153
|
-
display: "inline",
|
|
154
|
-
float: "right"
|
|
155
|
-
},
|
|
156
|
-
questionListItemAvatar: {
|
|
157
|
-
display: "inline-flex !important",
|
|
158
|
-
marginRight: "0.25rem",
|
|
159
|
-
fontSize: "1rem",
|
|
160
|
-
maxWidth: "1rem",
|
|
161
|
-
maxHeight: "1rem"
|
|
162
|
-
},
|
|
163
|
-
answerCardContent: {
|
|
164
|
-
display: "inline-block",
|
|
165
|
-
width: "calc(100% - 70px)"
|
|
166
|
-
},
|
|
167
|
-
questionCardAuthor: {
|
|
168
|
-
padding: theme.spacing(1),
|
|
169
|
-
float: "right",
|
|
170
|
-
maxWidth: "200px",
|
|
171
|
-
border: `1px solid ${theme.palette.action.selected}`,
|
|
172
|
-
"& .avatar": {
|
|
173
|
-
width: theme.spacing(3),
|
|
174
|
-
height: theme.spacing(3),
|
|
175
|
-
fontSize: "1rem"
|
|
176
|
-
}
|
|
177
|
-
},
|
|
178
|
-
questionListPagination: {
|
|
179
|
-
marginTop: theme.spacing(2)
|
|
180
|
-
},
|
|
181
|
-
postButton: {
|
|
182
|
-
marginTop: theme.spacing(1),
|
|
183
|
-
marginBottom: theme.spacing(1)
|
|
184
|
-
},
|
|
185
|
-
questionsPerPageInput: {
|
|
186
|
-
paddingTop: "10px"
|
|
187
|
-
},
|
|
188
|
-
questionsPerPage: {
|
|
189
|
-
marginRight: theme.spacing(3)
|
|
190
|
-
},
|
|
191
|
-
questionHighlightListContainer: {
|
|
192
|
-
width: "100%",
|
|
193
|
-
backgroundColor: theme.palette.background.paper,
|
|
194
|
-
border: `1px solid ${theme.palette.action.selected}`,
|
|
195
|
-
borderRadius: theme.shape.borderRadius,
|
|
196
|
-
"&:not(:first-child)": {
|
|
197
|
-
marginTop: theme.spacing(2)
|
|
198
|
-
}
|
|
199
|
-
},
|
|
200
|
-
questionHighlightList: {
|
|
201
|
-
paddingBottom: "0px",
|
|
202
|
-
"& p": {
|
|
203
|
-
marginTop: "0",
|
|
204
|
-
marginBottom: "0"
|
|
205
|
-
}
|
|
206
|
-
},
|
|
207
|
-
filterPanel: {
|
|
208
|
-
border: `1px solid ${theme.palette.action.selected}`,
|
|
209
|
-
borderRadius: theme.shape.borderRadius,
|
|
210
|
-
padding: theme.spacing(3)
|
|
211
|
-
},
|
|
212
|
-
questionCardMetadata: {
|
|
213
|
-
marginTop: theme.spacing(3)
|
|
214
|
-
},
|
|
215
|
-
marginRight: {
|
|
216
|
-
marginRight: theme.spacing(1)
|
|
217
|
-
},
|
|
218
|
-
questionCardActions: {
|
|
219
|
-
marginTop: theme.spacing(2),
|
|
220
|
-
"& a": {
|
|
221
|
-
marginRight: theme.spacing(1)
|
|
222
|
-
}
|
|
223
|
-
},
|
|
224
|
-
noPadding: {
|
|
225
|
-
padding: `0 !important`
|
|
226
|
-
},
|
|
227
|
-
menuIcon: {
|
|
228
|
-
minWidth: "26px"
|
|
229
|
-
},
|
|
230
|
-
deleteModal: {
|
|
231
|
-
position: "absolute",
|
|
232
|
-
top: "20%",
|
|
233
|
-
left: "50%",
|
|
234
|
-
transform: "translate(-50%, -50%)",
|
|
235
|
-
width: 400,
|
|
236
|
-
backgroundColor: theme.palette.background.default,
|
|
237
|
-
border: `1px solid ${theme.palette.action.selected}`,
|
|
238
|
-
borderRadius: theme.shape.borderRadius,
|
|
239
|
-
padding: theme.spacing(2),
|
|
240
|
-
"& button": {
|
|
241
|
-
marginTop: theme.spacing(2),
|
|
242
|
-
float: "right"
|
|
243
|
-
}
|
|
244
|
-
},
|
|
245
|
-
authorLink: {
|
|
246
|
-
textOverflow: "ellipsis",
|
|
247
|
-
overflow: "hidden",
|
|
248
|
-
whiteSpace: "nowrap"
|
|
249
|
-
},
|
|
250
|
-
highlight: {
|
|
251
|
-
animation: "$highlight 2s"
|
|
252
|
-
},
|
|
253
|
-
"@keyframes highlight": {
|
|
254
|
-
"0%": {
|
|
255
|
-
boxShadow: `0px 0px 0px 3px ${theme.palette.secondary.light}`
|
|
256
|
-
},
|
|
257
|
-
"100%": {
|
|
258
|
-
boxShadow: "none"
|
|
259
|
-
}
|
|
260
|
-
},
|
|
261
|
-
dateFilter: {
|
|
262
|
-
minWidth: "200px",
|
|
263
|
-
marginTop: theme.spacing(2),
|
|
264
|
-
marginBottom: theme.spacing(2)
|
|
265
|
-
}
|
|
266
|
-
};
|
|
267
|
-
});
|
|
268
|
-
const useBaseUrl = () => {
|
|
269
|
-
try {
|
|
270
|
-
const config = useApi(configApiRef);
|
|
271
|
-
return config.getOptionalString("app.baseUrl");
|
|
272
|
-
} catch {
|
|
273
|
-
return void 0;
|
|
274
|
-
}
|
|
275
|
-
};
|
|
276
|
-
const useBasePath = () => {
|
|
277
|
-
const base = "http://sample.dev";
|
|
278
|
-
const url = useBaseUrl() ?? "/";
|
|
279
|
-
const { pathname } = new URL(url, base);
|
|
280
|
-
return trimEnd(pathname, "/");
|
|
281
|
-
};
|
|
282
|
-
const userCache = /* @__PURE__ */ new Map();
|
|
283
|
-
const dataLoaderFactory = (catalogApi) => new DataLoader(
|
|
284
|
-
async (entityRefs) => {
|
|
285
|
-
const { items } = await catalogApi.getEntitiesByRefs({
|
|
286
|
-
fields: [
|
|
287
|
-
"kind",
|
|
288
|
-
"metadata.name",
|
|
289
|
-
"metadata.namespace",
|
|
290
|
-
"spec.profile.displayName",
|
|
291
|
-
"spec.profile.picture"
|
|
292
|
-
],
|
|
293
|
-
entityRefs
|
|
294
|
-
});
|
|
295
|
-
entityRefs.forEach((entityRef, index) => {
|
|
296
|
-
userCache.set(entityRef, items[index]);
|
|
297
|
-
});
|
|
298
|
-
return items;
|
|
299
|
-
},
|
|
300
|
-
{
|
|
301
|
-
name: "EntityAuthorLoader",
|
|
302
|
-
cacheMap: /* @__PURE__ */ new Map(),
|
|
303
|
-
maxBatchSize: 100,
|
|
304
|
-
batchScheduleFn: (callback) => {
|
|
305
|
-
setTimeout(callback, 50);
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
);
|
|
309
|
-
const useEntityAuthor = (entity) => {
|
|
310
|
-
const catalogApi = useApi(catalogApiRef);
|
|
311
|
-
const identityApi = useApi(identityApiRef);
|
|
312
|
-
const [name, setName] = React.useState(void 0);
|
|
313
|
-
const [user, setUser] = React.useState(null);
|
|
314
|
-
const [initials, setInitials] = React.useState(null);
|
|
315
|
-
const [currentUser, setCurrentUser] = React.useState(null);
|
|
316
|
-
const anonymous = entity.anonymous ?? false;
|
|
317
|
-
let author = entity.author;
|
|
318
|
-
if (!author.startsWith("user:")) {
|
|
319
|
-
author = `user:${author}`;
|
|
320
|
-
}
|
|
321
|
-
const { primaryTitle: userName } = useEntityPresentation(author);
|
|
322
|
-
useEffect(() => {
|
|
323
|
-
if (anonymous) {
|
|
324
|
-
return;
|
|
325
|
-
}
|
|
326
|
-
if (userCache.get(author)) {
|
|
327
|
-
setUser(userCache.get(author));
|
|
328
|
-
return;
|
|
329
|
-
}
|
|
330
|
-
dataLoaderFactory(catalogApi).load(author).then((data) => {
|
|
331
|
-
if (data) {
|
|
332
|
-
setUser(data);
|
|
333
|
-
} else {
|
|
334
|
-
setUser(null);
|
|
335
|
-
}
|
|
336
|
-
}).catch(() => {
|
|
337
|
-
setUser(null);
|
|
338
|
-
});
|
|
339
|
-
}, [catalogApi, author, anonymous]);
|
|
340
|
-
useEffect(() => {
|
|
341
|
-
identityApi.getBackstageIdentity().then((res) => {
|
|
342
|
-
setCurrentUser(res.userEntityRef ?? "user:default/guest");
|
|
343
|
-
});
|
|
344
|
-
}, [identityApi]);
|
|
345
|
-
useEffect(() => {
|
|
346
|
-
let displayName = userName;
|
|
347
|
-
if (entity.author === currentUser) {
|
|
348
|
-
displayName = "You";
|
|
349
|
-
if (anonymous) {
|
|
350
|
-
displayName += " (anonymous)";
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
setName(displayName);
|
|
354
|
-
}, [entity.author, anonymous, currentUser, userName]);
|
|
355
|
-
useEffect(() => {
|
|
356
|
-
const init = (name ?? "").split(" ").map((p) => p[0]).join("").substring(0, 2).toUpperCase();
|
|
357
|
-
setInitials(init);
|
|
358
|
-
}, [name]);
|
|
359
|
-
return { name, initials, user };
|
|
360
|
-
};
|
|
361
|
-
const useTagsFollow = () => {
|
|
362
|
-
const [tags, setTags] = React.useState([]);
|
|
363
|
-
const [loading, setLoading] = React.useState(true);
|
|
364
|
-
const qetaApi = useApi(qetaApiRef);
|
|
365
|
-
useEffect(() => {
|
|
366
|
-
qetaApi.getFollowedTags().then((res) => {
|
|
367
|
-
setTags(res.tags);
|
|
368
|
-
setLoading(false);
|
|
369
|
-
});
|
|
370
|
-
}, [qetaApi]);
|
|
371
|
-
const followTag = useCallback(
|
|
372
|
-
(tag) => {
|
|
373
|
-
qetaApi.followTag(tag).then(() => {
|
|
374
|
-
setTags((prev) => [...prev, tag]);
|
|
375
|
-
});
|
|
376
|
-
},
|
|
377
|
-
[qetaApi]
|
|
378
|
-
);
|
|
379
|
-
const unfollowTag = useCallback(
|
|
380
|
-
(tag) => {
|
|
381
|
-
qetaApi.unfollowTag(tag).then(() => {
|
|
382
|
-
setTags((prev) => prev.filter((t) => t !== tag));
|
|
383
|
-
});
|
|
384
|
-
},
|
|
385
|
-
[qetaApi]
|
|
386
|
-
);
|
|
387
|
-
const isFollowingTag = useCallback(
|
|
388
|
-
(tag) => tags.includes(tag),
|
|
389
|
-
[tags]
|
|
390
|
-
);
|
|
391
|
-
return { tags, followTag, unfollowTag, isFollowingTag, loading };
|
|
392
|
-
};
|
|
393
|
-
const useEntityFollow = () => {
|
|
394
|
-
const [entities, setEntities] = React.useState([]);
|
|
395
|
-
const [loading, setLoading] = React.useState(true);
|
|
396
|
-
const qetaApi = useApi(qetaApiRef);
|
|
397
|
-
useEffect(() => {
|
|
398
|
-
qetaApi.getFollowedEntities().then((res) => {
|
|
399
|
-
setEntities(res.entityRefs);
|
|
400
|
-
setLoading(false);
|
|
401
|
-
});
|
|
402
|
-
}, [qetaApi]);
|
|
403
|
-
const followEntity = useCallback(
|
|
404
|
-
(entityRef) => {
|
|
405
|
-
qetaApi.followEntity(entityRef).then(() => {
|
|
406
|
-
setEntities((prev) => [...prev, entityRef]);
|
|
407
|
-
});
|
|
408
|
-
},
|
|
409
|
-
[qetaApi]
|
|
410
|
-
);
|
|
411
|
-
const unfollowEntity = useCallback(
|
|
412
|
-
(entityRef) => {
|
|
413
|
-
qetaApi.unfollowEntity(entityRef).then(() => {
|
|
414
|
-
setEntities((prev) => prev.filter((t) => t !== entityRef));
|
|
415
|
-
});
|
|
416
|
-
},
|
|
417
|
-
[qetaApi]
|
|
418
|
-
);
|
|
419
|
-
const isFollowingEntity = useCallback(
|
|
420
|
-
(entityRef) => entities.includes(entityRef),
|
|
421
|
-
[entities]
|
|
422
|
-
);
|
|
423
|
-
return { entities, followEntity, unfollowEntity, isFollowingEntity, loading };
|
|
424
|
-
};
|
|
425
|
-
const useTranslation = () => {
|
|
426
|
-
return useTranslationRef(qetaTranslationRef);
|
|
427
|
-
};
|
|
428
|
-
|
|
429
|
-
export { useBasePath, useBaseUrl, useEntityAuthor, useEntityFollow, useEntityQueryParameter, useIdentityApi, useIsDarkTheme, useQetaApi, useStyles, useTagsFollow, useTranslation };
|
|
430
|
-
//# sourceMappingURL=hooks.esm.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.esm.js","sources":["../../src/utils/hooks.ts"],"sourcesContent":["import { QetaApi, qetaApiRef } from '../api';\nimport useAsync from 'react-use/lib/useAsync';\nimport {\n appThemeApiRef,\n configApiRef,\n IdentityApi,\n identityApiRef,\n useApi,\n} from '@backstage/core-plugin-api';\nimport { makeStyles } from '@material-ui/core';\nimport { CatalogApi } from '@backstage/catalog-client';\nimport {\n catalogApiRef,\n useEntityPresentation,\n} from '@backstage/plugin-catalog-react';\nimport { trimEnd } from 'lodash';\nimport { useSearchParams } from 'react-router-dom';\nimport React, { useCallback, useEffect, useMemo } from 'react';\nimport { UserEntity } from '@backstage/catalog-model';\nimport {\n AnswerResponse,\n QuestionResponse,\n} from '@drodil/backstage-plugin-qeta-common';\nimport DataLoader from 'dataloader';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../translation';\n\nexport function useQetaApi<T>(\n f: (api: QetaApi) => Promise<T>,\n deps: any[] = [],\n) {\n const qetaApi = useApi(qetaApiRef);\n\n return useAsync(async () => {\n return await f(qetaApi);\n }, deps);\n}\n\nexport function useCatalogApi<T>(\n f: (api: CatalogApi) => Promise<T>,\n deps: any[] = [],\n) {\n const catalogApi = useApi(catalogApiRef);\n\n return useAsync(async () => {\n return await f(catalogApi);\n }, deps);\n}\n\nexport function useIdentityApi<T>(\n f: (api: IdentityApi) => Promise<T>,\n deps: any[] = [],\n) {\n const identityApi = useApi(identityApiRef);\n\n return useAsync(async () => {\n return await f(identityApi);\n }, deps);\n}\n\nexport function useEntityQueryParameter(entity?: string) {\n const [searchParams] = useSearchParams();\n const [entityRef, setEntityRef] = React.useState<string | undefined>(entity);\n\n useEffect(() => {\n setEntityRef(searchParams.get('entity') ?? undefined);\n }, [searchParams, setEntityRef]);\n\n return entityRef;\n}\n\nexport function useIsDarkTheme() {\n const appThemeApi = useApi(appThemeApiRef);\n const themes = appThemeApi.getInstalledThemes();\n const theme = useMemo(() => appThemeApi.getActiveThemeId(), [appThemeApi]);\n return Boolean(themes.find(t => t.id === theme)?.variant === 'dark');\n}\n\nexport const useStyles = makeStyles(theme => {\n return {\n leftMenu: {\n position: 'sticky',\n top: '0',\n width: '180px',\n },\n selectedMenuItem: {\n color: theme.palette.primary.contrastText,\n backgroundColor: theme.palette.primary.light,\n borderRadius: theme.shape.borderRadius,\n '&:hover': {\n backgroundColor: theme.palette.primary.dark,\n },\n '& svg': {\n color: theme.palette.primary.contrastText,\n },\n },\n nonSelectedMenuItem: {\n backgroundColor: 'initial',\n },\n markdownEditor: {\n backgroundColor: 'initial',\n color: theme.palette.text.primary,\n border: `1px solid ${theme.palette.action.disabled}`,\n borderRadius: theme.shape.borderRadius,\n '&:hover': {\n borderColor: theme.palette.action.active,\n },\n '&:focus-within': {\n borderColor: theme.palette.primary.main,\n },\n '& .mde-header': {\n backgroundColor: 'initial',\n color: theme.palette.text.primary,\n borderBottom: `1px solid ${theme.palette.action.selected}`,\n '& .mde-tabs button, .mde-header-item > button': {\n color: `${theme.palette.text.primary} !important`,\n },\n },\n '& .mde-preview-content': {\n padding: '10px',\n },\n '& .mde-text, .mde-preview': {\n fontSize: theme.typography.body1.fontSize,\n fontFamily: theme.typography.body1.fontFamily,\n lineHeight: theme.typography.body1.lineHeight,\n },\n '& .mde-text': {\n backgroundColor: 'initial',\n color: theme.palette.text.primary,\n outline: 'none',\n },\n '& .image-tip': {\n color: theme.palette.text.primary,\n backgroundColor: 'initial',\n },\n },\n markdownEditorError: {\n border: `1px solid ${theme.palette.error.main} !important`,\n },\n markdownContent: {\n '& *': {\n wordBreak: 'break-word',\n },\n '&.inline': {\n display: 'inline-block',\n },\n '& > :first-child': {\n marginTop: '0px !important',\n },\n '& > :last-child': {\n marginBottom: '0px !important',\n },\n },\n successColor: {\n color: theme.palette.success.main,\n },\n questionDivider: {\n marginTop: theme.spacing(2),\n marginBottom: theme.spacing(2),\n },\n questionCard: {\n marginBottom: theme.spacing(1),\n position: 'relative',\n },\n questionCardVote: {\n textAlign: 'center',\n width: '32px',\n marginRight: '20px',\n marginLeft: '5px',\n marginTop: '10px',\n display: 'inline-block',\n verticalAlign: 'top',\n },\n questionCardContent: {\n minHeight: '160px',\n },\n questionListItem: {\n padding: '0.7rem',\n paddingBottom: '1.4rem',\n },\n questionListItemStats: {\n width: '70px',\n textAlign: 'right',\n marginRight: '5px',\n display: 'inline-block',\n verticalAlign: 'top',\n },\n questionListItemContent: {\n display: 'inline-block',\n width: 'calc(100% - 80px)',\n },\n questionListItemAuthor: {\n display: 'inline',\n float: 'right',\n },\n questionListItemAvatar: {\n display: 'inline-flex !important',\n marginRight: '0.25rem',\n fontSize: '1rem',\n maxWidth: '1rem',\n maxHeight: '1rem',\n },\n answerCardContent: {\n display: 'inline-block',\n width: 'calc(100% - 70px)',\n },\n questionCardAuthor: {\n padding: theme.spacing(1),\n float: 'right',\n maxWidth: '200px',\n border: `1px solid ${theme.palette.action.selected}`,\n '& .avatar': {\n width: theme.spacing(3),\n height: theme.spacing(3),\n fontSize: '1rem',\n },\n },\n questionListPagination: {\n marginTop: theme.spacing(2),\n },\n postButton: {\n marginTop: theme.spacing(1),\n marginBottom: theme.spacing(1),\n },\n questionsPerPageInput: {\n paddingTop: '10px',\n },\n questionsPerPage: {\n marginRight: theme.spacing(3),\n },\n questionHighlightListContainer: {\n width: '100%',\n backgroundColor: theme.palette.background.paper,\n border: `1px solid ${theme.palette.action.selected}`,\n borderRadius: theme.shape.borderRadius,\n '&:not(:first-child)': {\n marginTop: theme.spacing(2),\n },\n },\n questionHighlightList: {\n paddingBottom: '0px',\n '& p': {\n marginTop: '0',\n marginBottom: '0',\n },\n },\n filterPanel: {\n border: `1px solid ${theme.palette.action.selected}`,\n borderRadius: theme.shape.borderRadius,\n padding: theme.spacing(3),\n },\n questionCardMetadata: {\n marginTop: theme.spacing(3),\n },\n marginRight: {\n marginRight: theme.spacing(1),\n },\n questionCardActions: {\n marginTop: theme.spacing(2),\n '& a': {\n marginRight: theme.spacing(1),\n },\n },\n noPadding: {\n padding: `0 !important`,\n },\n menuIcon: {\n minWidth: '26px',\n },\n deleteModal: {\n position: 'absolute',\n top: '20%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n width: 400,\n backgroundColor: theme.palette.background.default,\n border: `1px solid ${theme.palette.action.selected}`,\n borderRadius: theme.shape.borderRadius,\n padding: theme.spacing(2),\n '& button': {\n marginTop: theme.spacing(2),\n float: 'right',\n },\n },\n authorLink: {\n textOverflow: 'ellipsis',\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n },\n highlight: {\n animation: '$highlight 2s',\n },\n '@keyframes highlight': {\n '0%': {\n boxShadow: `0px 0px 0px 3px ${theme.palette.secondary.light}`,\n },\n '100%': {\n boxShadow: 'none',\n },\n },\n dateFilter: {\n minWidth: '200px',\n marginTop: theme.spacing(2),\n marginBottom: theme.spacing(2),\n },\n };\n});\n\n// Url resolving logic from https://github.com/backstage/backstage/blob/master/packages/core-components/src/components/Link/Link.tsx\n\n/**\n * Returns the app base url that could be empty if the Config API is not properly implemented.\n * The only cases there would be no Config API are in tests and in storybook stories, and in those cases, it's unlikely that callers would rely on this subpath behavior.\n */\nexport const useBaseUrl = () => {\n try {\n const config = useApi(configApiRef);\n return config.getOptionalString('app.baseUrl');\n } catch {\n return undefined;\n }\n};\n\nexport const useBasePath = () => {\n // baseUrl can be specified as just a path\n const base = 'http://sample.dev';\n const url = useBaseUrl() ?? '/';\n const { pathname } = new URL(url, base);\n return trimEnd(pathname, '/');\n};\n\nconst userCache: Map<string, UserEntity> = new Map();\nconst dataLoaderFactory = (catalogApi: CatalogApi) =>\n new DataLoader(\n async (entityRefs: readonly string[]) => {\n const { items } = await catalogApi.getEntitiesByRefs({\n fields: [\n 'kind',\n 'metadata.name',\n 'metadata.namespace',\n 'spec.profile.displayName',\n 'spec.profile.picture',\n ],\n entityRefs: entityRefs as string[],\n });\n\n entityRefs.forEach((entityRef, index) => {\n userCache.set(entityRef, items[index] as UserEntity);\n });\n return items;\n },\n {\n name: 'EntityAuthorLoader',\n cacheMap: new Map(),\n maxBatchSize: 100,\n batchScheduleFn: callback => {\n setTimeout(callback, 50);\n },\n },\n );\n\nexport const useEntityAuthor = (entity: QuestionResponse | AnswerResponse) => {\n const catalogApi = useApi(catalogApiRef);\n const identityApi = useApi(identityApiRef);\n const [name, setName] = React.useState<string | undefined>(undefined);\n const [user, setUser] = React.useState<UserEntity | null>(null);\n const [initials, setInitials] = React.useState<string | null>(null);\n const [currentUser, setCurrentUser] = React.useState<string | null>(null);\n const anonymous = entity.anonymous ?? false;\n let author = entity.author;\n if (!author.startsWith('user:')) {\n author = `user:${author}`;\n }\n\n const { primaryTitle: userName } = useEntityPresentation(author);\n\n useEffect(() => {\n if (anonymous) {\n return;\n }\n\n if (userCache.get(author)) {\n setUser(userCache.get(author) as UserEntity);\n return;\n }\n\n dataLoaderFactory(catalogApi)\n .load(author)\n .then(data => {\n if (data) {\n setUser(data as UserEntity);\n } else {\n setUser(null);\n }\n })\n .catch(() => {\n setUser(null);\n });\n }, [catalogApi, author, anonymous]);\n\n useEffect(() => {\n identityApi.getBackstageIdentity().then(res => {\n setCurrentUser(res.userEntityRef ?? 'user:default/guest');\n });\n }, [identityApi]);\n\n useEffect(() => {\n let displayName = userName;\n if (entity.author === currentUser) {\n displayName = 'You';\n if (anonymous) {\n displayName += ' (anonymous)';\n }\n }\n setName(displayName);\n }, [entity.author, anonymous, currentUser, userName]);\n\n useEffect(() => {\n const init = (name ?? '')\n .split(' ')\n .map(p => p[0])\n .join('')\n .substring(0, 2)\n .toUpperCase();\n setInitials(init);\n }, [name]);\n\n return { name, initials, user };\n};\n\nexport const useTagsFollow = () => {\n const [tags, setTags] = React.useState<string[]>([]);\n const [loading, setLoading] = React.useState(true);\n const qetaApi = useApi(qetaApiRef);\n\n useEffect(() => {\n qetaApi.getFollowedTags().then(res => {\n setTags(res.tags);\n setLoading(false);\n });\n }, [qetaApi]);\n\n const followTag = useCallback(\n (tag: string) => {\n qetaApi.followTag(tag).then(() => {\n setTags(prev => [...prev, tag]);\n });\n },\n [qetaApi],\n );\n\n const unfollowTag = useCallback(\n (tag: string) => {\n qetaApi.unfollowTag(tag).then(() => {\n setTags(prev => prev.filter(t => t !== tag));\n });\n },\n [qetaApi],\n );\n\n const isFollowingTag = useCallback(\n (tag: string) => tags.includes(tag),\n [tags],\n );\n return { tags, followTag, unfollowTag, isFollowingTag, loading };\n};\n\nexport const useEntityFollow = () => {\n const [entities, setEntities] = React.useState<string[]>([]);\n const [loading, setLoading] = React.useState(true);\n const qetaApi = useApi(qetaApiRef);\n\n useEffect(() => {\n qetaApi.getFollowedEntities().then(res => {\n setEntities(res.entityRefs);\n setLoading(false);\n });\n }, [qetaApi]);\n\n const followEntity = useCallback(\n (entityRef: string) => {\n qetaApi.followEntity(entityRef).then(() => {\n setEntities(prev => [...prev, entityRef]);\n });\n },\n [qetaApi],\n );\n\n const unfollowEntity = useCallback(\n (entityRef: string) => {\n qetaApi.unfollowEntity(entityRef).then(() => {\n setEntities(prev => prev.filter(t => t !== entityRef));\n });\n },\n [qetaApi],\n );\n\n const isFollowingEntity = useCallback(\n (entityRef: string) => entities.includes(entityRef),\n [entities],\n );\n return { entities, followEntity, unfollowEntity, isFollowingEntity, loading };\n};\n\nexport const useTranslation = () => {\n return useTranslationRef(qetaTranslationRef);\n};\n"],"names":[],"mappings":"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"}
|
package/dist/utils/utils.esm.js
DELETED
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import { stringifyEntityRef } from '@backstage/catalog-model';
|
|
2
|
-
|
|
3
|
-
const formatEntityName = (username) => {
|
|
4
|
-
if (!username) {
|
|
5
|
-
return "";
|
|
6
|
-
}
|
|
7
|
-
const plainName = username.split(/[/:]+/).pop();
|
|
8
|
-
return plainName?.split(/[_.-]+/).map((a) => a.charAt(0).toUpperCase() + a.slice(1)).join(" ");
|
|
9
|
-
};
|
|
10
|
-
const getEntityTitle = (entity) => {
|
|
11
|
-
const stringified = stringifyEntityRef(entity);
|
|
12
|
-
return formatEntityName(entity.metadata.title ?? stringified) ?? stringified;
|
|
13
|
-
};
|
|
14
|
-
const formatDate = (localDate) => {
|
|
15
|
-
let date = localDate.getDate();
|
|
16
|
-
let month = localDate.getMonth() + 1;
|
|
17
|
-
if (date < 10) {
|
|
18
|
-
date = `0${date}`;
|
|
19
|
-
}
|
|
20
|
-
if (month < 10) {
|
|
21
|
-
month = `0${month}`;
|
|
22
|
-
}
|
|
23
|
-
return `${localDate.getFullYear()}-${month}-${date}`;
|
|
24
|
-
};
|
|
25
|
-
const getFiltersWithDateRange = (filters) => {
|
|
26
|
-
let filtersWithDateRange;
|
|
27
|
-
const to = /* @__PURE__ */ new Date();
|
|
28
|
-
const from = new Date(to);
|
|
29
|
-
if (filters.dateRange) {
|
|
30
|
-
let fromDate = "";
|
|
31
|
-
let toDate = "";
|
|
32
|
-
switch (filters.dateRange) {
|
|
33
|
-
case "7-days":
|
|
34
|
-
toDate = formatDate(to);
|
|
35
|
-
from.setDate(to.getDate() - 6);
|
|
36
|
-
fromDate = formatDate(from);
|
|
37
|
-
break;
|
|
38
|
-
case "30-days":
|
|
39
|
-
toDate = formatDate(to);
|
|
40
|
-
from.setDate(to.getDate() - 29);
|
|
41
|
-
fromDate = formatDate(from);
|
|
42
|
-
break;
|
|
43
|
-
default:
|
|
44
|
-
if (filters.dateRange.indexOf("--") > 0) {
|
|
45
|
-
fromDate = filters.dateRange.split("--")[0];
|
|
46
|
-
toDate = filters.dateRange.split("--")[1];
|
|
47
|
-
}
|
|
48
|
-
break;
|
|
49
|
-
}
|
|
50
|
-
if (fromDate && toDate) {
|
|
51
|
-
filtersWithDateRange = { ...filters, fromDate, toDate };
|
|
52
|
-
delete filtersWithDateRange.dateRange;
|
|
53
|
-
return filtersWithDateRange;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
return filters;
|
|
57
|
-
};
|
|
58
|
-
const confirmNavigationIfEdited = (edited) => {
|
|
59
|
-
const handleBeforeUnload = (event) => {
|
|
60
|
-
if (edited) {
|
|
61
|
-
event.preventDefault();
|
|
62
|
-
event.returnValue = "";
|
|
63
|
-
}
|
|
64
|
-
};
|
|
65
|
-
window.addEventListener("beforeunload", handleBeforeUnload);
|
|
66
|
-
return () => {
|
|
67
|
-
window.removeEventListener("beforeunload", handleBeforeUnload);
|
|
68
|
-
};
|
|
69
|
-
};
|
|
70
|
-
|
|
71
|
-
export { confirmNavigationIfEdited, formatDate, formatEntityName, getEntityTitle, getFiltersWithDateRange };
|
|
72
|
-
//# sourceMappingURL=utils.esm.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"utils.esm.js","sources":["../../src/utils/utils.ts"],"sourcesContent":["import { Entity, stringifyEntityRef } from '@backstage/catalog-model';\nimport { Filters } from '../components/QuestionsContainer/FilterPanel';\n\nexport const formatEntityName = (username?: string) => {\n if (!username) {\n return '';\n }\n const plainName = username.split(/[/:]+/).pop();\n return plainName\n ?.split(/[_.-]+/)\n .map(a => a.charAt(0).toUpperCase() + a.slice(1))\n .join(' ');\n};\n\nexport const getEntityTitle = (entity: Entity): string => {\n const stringified = stringifyEntityRef(entity);\n return formatEntityName(entity.metadata.title ?? stringified) ?? stringified;\n};\n\nexport const formatDate = (localDate: Date) => {\n let date: any = localDate.getDate();\n let month: any = localDate.getMonth() + 1;\n if (date < 10) {\n date = `0${date}`;\n }\n\n if (month < 10) {\n month = `0${month}`;\n }\n return `${localDate.getFullYear()}-${month}-${date}`;\n};\n\nexport type FiltersWithDateRange = Filters & {\n fromDate: string;\n toDate: string;\n};\n\nexport const getFiltersWithDateRange = (filters: Filters) => {\n let filtersWithDateRange: FiltersWithDateRange;\n const to = new Date();\n const from = new Date(to);\n if (filters.dateRange) {\n let fromDate = '';\n let toDate = '';\n\n switch (filters.dateRange) {\n case '7-days':\n toDate = formatDate(to);\n from.setDate(to.getDate() - 6);\n fromDate = formatDate(from);\n break;\n\n case '30-days':\n toDate = formatDate(to);\n from.setDate(to.getDate() - 29);\n fromDate = formatDate(from);\n break;\n default:\n if (filters.dateRange.indexOf('--') > 0) {\n fromDate = filters.dateRange.split('--')[0];\n toDate = filters.dateRange.split('--')[1];\n }\n break;\n }\n if (fromDate && toDate) {\n filtersWithDateRange = { ...filters, fromDate, toDate };\n delete filtersWithDateRange.dateRange;\n return filtersWithDateRange;\n }\n }\n return filters;\n};\n\nexport const confirmNavigationIfEdited = (edited: boolean) => {\n const handleBeforeUnload = (event: BeforeUnloadEvent) => {\n if (edited) {\n event.preventDefault();\n event.returnValue = ''; // Included for legacy support, e.g. Chrome/Edge < 119\n }\n };\n\n window.addEventListener('beforeunload', handleBeforeUnload);\n\n return () => {\n window.removeEventListener('beforeunload', handleBeforeUnload);\n };\n};\n"],"names":[],"mappings":"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"}
|