@drodil/backstage-plugin-qeta 2.4.1 → 2.4.2
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/api/QetaClient.esm.js +3 -9
- package/dist/api/QetaClient.esm.js.map +1 -1
- package/dist/components/AskForm/AskForm.esm.js +3 -6
- package/dist/components/AskForm/AskForm.esm.js.map +1 -1
- package/dist/components/AskForm/EntitiesInput.esm.js +1 -4
- package/dist/components/AskForm/EntitiesInput.esm.js.map +1 -1
- package/dist/components/AskForm/TagInput.esm.js +4 -13
- package/dist/components/AskForm/TagInput.esm.js.map +1 -1
- package/dist/components/AskPage/AskPage.esm.js +1 -2
- package/dist/components/AskPage/AskPage.esm.js.map +1 -1
- package/dist/components/CommentSection/CommentList.esm.js +2 -3
- package/dist/components/CommentSection/CommentList.esm.js.map +1 -1
- package/dist/components/HomePage/HomePage.esm.js +2 -3
- package/dist/components/HomePage/HomePage.esm.js.map +1 -1
- package/dist/components/MarkdownEditor/MarkdownEditor.esm.js +2 -3
- package/dist/components/MarkdownEditor/MarkdownEditor.esm.js.map +1 -1
- package/dist/components/QuestionHighlightList/QuestionHighlightList.esm.js +1 -2
- package/dist/components/QuestionHighlightList/QuestionHighlightList.esm.js.map +1 -1
- package/dist/components/QuestionPage/AuthorBox.esm.js +1 -2
- package/dist/components/QuestionPage/AuthorBox.esm.js.map +1 -1
- package/dist/components/QuestionPage/EntityChip.esm.js +1 -1
- package/dist/components/QuestionPage/EntityChip.esm.js.map +1 -1
- package/dist/components/QuestionPage/QuestionCard.esm.js +1 -2
- package/dist/components/QuestionPage/QuestionCard.esm.js.map +1 -1
- package/dist/components/QuestionPage/QuestionPage.esm.js +5 -7
- package/dist/components/QuestionPage/QuestionPage.esm.js.map +1 -1
- package/dist/components/QuestionPage/VoteButtons.esm.js +6 -7
- package/dist/components/QuestionPage/VoteButtons.esm.js.map +1 -1
- package/dist/components/QuestionTableCard/QuestionsTable.esm.js +3 -4
- package/dist/components/QuestionTableCard/QuestionsTable.esm.js.map +1 -1
- package/dist/components/QuestionsContainer/FilterPanel.esm.js +4 -4
- package/dist/components/QuestionsContainer/FilterPanel.esm.js.map +1 -1
- package/dist/components/QuestionsContainer/QuestionList.esm.js +1 -1
- package/dist/components/QuestionsContainer/QuestionList.esm.js.map +1 -1
- package/dist/components/QuestionsContainer/QuestionListItem.esm.js +2 -3
- package/dist/components/QuestionsContainer/QuestionListItem.esm.js.map +1 -1
- package/dist/components/QuestionsContainer/QuestionsContainer.esm.js +7 -9
- package/dist/components/QuestionsContainer/QuestionsContainer.esm.js.map +1 -1
- package/dist/components/Statistics/TopRankingUsersCard.esm.js +16 -21
- package/dist/components/Statistics/TopRankingUsersCard.esm.js.map +1 -1
- package/dist/components/TagPage/TagPage.esm.js +1 -1
- package/dist/components/TagPage/TagPage.esm.js.map +1 -1
- package/dist/components/TagPage/TagsContainer.esm.js +1 -1
- package/dist/components/TagPage/TagsContainer.esm.js.map +1 -1
- package/dist/components/UserPage/UserPage.esm.js +2 -3
- package/dist/components/UserPage/UserPage.esm.js.map +1 -1
- package/dist/utils/hooks.esm.js +5 -9
- package/dist/utils/hooks.esm.js.map +1 -1
- package/dist/utils/utils.esm.js +2 -3
- package/dist/utils/utils.esm.js.map +1 -1
- package/package.json +24 -16
|
@@ -3,26 +3,20 @@ import { CustomErrorBase } from '@backstage/errors';
|
|
|
3
3
|
import omitBy from 'lodash/omitBy';
|
|
4
4
|
import isEmpty from 'lodash/isEmpty';
|
|
5
5
|
|
|
6
|
-
var __defProp = Object.defineProperty;
|
|
7
|
-
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
8
|
-
var __publicField = (obj, key, value) => {
|
|
9
|
-
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
10
|
-
return value;
|
|
11
|
-
};
|
|
12
6
|
const qetaApiRef = createApiRef({
|
|
13
7
|
id: "plugin.qeta.service"
|
|
14
8
|
});
|
|
15
9
|
class QetaError extends CustomErrorBase {
|
|
10
|
+
errors;
|
|
16
11
|
constructor(message, errors) {
|
|
17
12
|
super(message);
|
|
18
|
-
__publicField(this, "errors");
|
|
19
13
|
this.errors = errors;
|
|
20
14
|
}
|
|
21
15
|
}
|
|
22
16
|
class QetaClient {
|
|
17
|
+
fetchApi;
|
|
18
|
+
discoveryApi;
|
|
23
19
|
constructor(options) {
|
|
24
|
-
__publicField(this, "fetchApi");
|
|
25
|
-
__publicField(this, "discoveryApi");
|
|
26
20
|
this.fetchApi = options.fetchApi;
|
|
27
21
|
this.discoveryApi = options.discoveryApi;
|
|
28
22
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QetaClient.esm.js","sources":["../../src/api/QetaClient.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport { QetaApi } from './QetaApi';\nimport {\n createApiRef,\n DiscoveryApi,\n FetchApi,\n} from '@backstage/core-plugin-api';\nimport { CustomErrorBase } from '@backstage/errors';\nimport {\n Answer,\n AnswerRequest,\n AnswerResponseBody,\n AttachmentResponseBody,\n EntityResponse,\n Question,\n QuestionRequest,\n QuestionResponseBody,\n QuestionsResponse,\n QuestionsResponseBody,\n StatisticResponse,\n StatisticsRequestParameters,\n TagResponse,\n} from '@drodil/backstage-plugin-qeta-common';\nimport omitBy from 'lodash/omitBy';\nimport isEmpty from 'lodash/isEmpty';\n\nexport const qetaApiRef = createApiRef<QetaApi>({\n id: 'plugin.qeta.service',\n});\n\nexport class QetaError extends CustomErrorBase {\n public errors: null | undefined | any[];\n\n constructor(message: string, errors: null | undefined | any[]) {\n super(message);\n\n this.errors = errors;\n }\n}\n\nexport class QetaClient implements QetaApi {\n private readonly fetchApi: FetchApi;\n private readonly discoveryApi: DiscoveryApi;\n\n constructor(options: { fetchApi: FetchApi; discoveryApi: DiscoveryApi }) {\n this.fetchApi = options.fetchApi;\n this.discoveryApi = options.discoveryApi;\n }\n\n async getBaseUrl(): Promise<string> {\n return this.discoveryApi.getBaseUrl('qeta');\n }\n\n async getQuestions(options: {\n noCorrectAnswer: string;\n offset: number;\n includeEntities: boolean;\n author: string | undefined;\n orderBy: string;\n tags: string[] | undefined;\n noVotes: string;\n noAnswers: string;\n searchQuery: string;\n limit: number;\n favorite: undefined | boolean;\n entity: string | undefined;\n order: string;\n }): Promise<QuestionsResponse> {\n const query = this.getQueryParameters(options).toString();\n\n let url = `${await this.getBaseUrl()}/questions`;\n if (query) {\n url += `?${query}`;\n }\n\n const response = await this.fetchApi.fetch(url);\n if (response.status === 403) {\n return { questions: [], total: 0 };\n }\n const data = (await response.json()) as QuestionsResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async getQuestionsList(type: string): Promise<QuestionsResponse> {\n const query = new URLSearchParams({ limit: '7' }).toString();\n\n let url = `${await this.getBaseUrl()}/questions/list/${type}`;\n if (query) {\n url += `?${query}`;\n }\n\n const response = await this.fetchApi.fetch(url);\n if (response.status === 403) {\n return { questions: [], total: 0 };\n }\n\n const data = (await response.json()) as QuestionsResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async postQuestion(question: QuestionRequest): Promise<Question> {\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions`,\n {\n method: 'POST',\n body: JSON.stringify(question),\n headers: { 'Content-Type': 'application/json' },\n },\n );\n const data = (await response.json()) as QuestionResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async commentQuestion(id: number, content: string): Promise<Question> {\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${id}/comments`,\n {\n method: 'POST',\n body: JSON.stringify({ content }),\n headers: { 'Content-Type': 'application/json' },\n },\n );\n const data = (await response.json()) as QuestionResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async deleteQuestionComment(\n questionId: number,\n id: number,\n ): Promise<Question> {\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${questionId}/comments/${id}`,\n {\n method: 'DELETE',\n },\n );\n const data = (await response.json()) as QuestionResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async getQuestion(id?: string): Promise<Question> {\n if (!id) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${id}`,\n );\n\n const data = (await response.json()) as QuestionResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async getTags(): Promise<TagResponse[]> {\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/tags`,\n );\n return (await response.json()) as TagResponse[];\n }\n\n async getEntities(): Promise<EntityResponse[]> {\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/entities`,\n );\n return (await response.json()) as EntityResponse[];\n }\n\n async voteQuestionUp(id: number): Promise<Question> {\n if (!id) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${id}/upvote`,\n );\n const data = (await response.json()) as QuestionResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async voteQuestionDown(id: number): Promise<Question> {\n if (!id) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${id}/downvote`,\n );\n const data = (await response.json()) as QuestionResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async favoriteQuestion(id: number): Promise<Question> {\n if (!id) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${id}/favorite`,\n );\n const data = (await response.json()) as QuestionResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async unfavoriteQuestion(id: number): Promise<Question> {\n if (!id) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${id}/unfavorite`,\n );\n const data = (await response.json()) as QuestionResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async postAnswer(answer: AnswerRequest): Promise<AnswerResponseBody> {\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${answer.questionId}/answers`,\n {\n method: 'POST',\n body: JSON.stringify({\n answer: answer.answer,\n images: answer.images,\n anonymous: answer.anonymous,\n }),\n headers: { 'Content-Type': 'application/json' },\n },\n );\n const data = (await response.json()) as AnswerResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async commentAnswer(\n questionId: number,\n id: number,\n content: string,\n ): Promise<Answer> {\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${questionId}/answers/${id}/comments`,\n {\n method: 'POST',\n body: JSON.stringify({ content }),\n headers: { 'Content-Type': 'application/json' },\n },\n );\n const data = (await response.json()) as AnswerResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async deleteAnswerComment(\n questionId: number,\n answerId: number,\n id: number,\n ): Promise<Answer> {\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${questionId}/answers/${answerId}/comments/${id}`,\n {\n method: 'DELETE',\n },\n );\n const data = (await response.json()) as AnswerResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async voteAnswerUp(questionId: number, id: number): Promise<Answer> {\n if (!id || !questionId) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${questionId}/answers/${id}/upvote`,\n );\n const data = (await response.json()) as AnswerResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async voteAnswerDown(questionId: number, id: number): Promise<Answer> {\n if (!id || !questionId) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${questionId}/answers/${id}/downvote`,\n );\n const data = (await response.json()) as AnswerResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async markAnswerCorrect(questionId: number, id: number): Promise<boolean> {\n if (!id || !questionId) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${questionId}/answers/${id}/correct`,\n );\n const data = await response;\n return data.ok;\n }\n\n async markAnswerIncorrect(questionId: number, id: number): Promise<boolean> {\n if (!id || !questionId) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${questionId}/answers/${id}/incorrect`,\n );\n const data = await response;\n return data.ok;\n }\n\n async deleteQuestion(questionId: number): Promise<boolean> {\n if (!questionId) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${questionId}`,\n {\n method: 'DELETE',\n },\n );\n const data = await response;\n return data.ok;\n }\n\n async deleteAnswer(questionId: number, id: number): Promise<boolean> {\n if (!questionId || !id) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${questionId}/answers/${id}`,\n {\n method: 'DELETE',\n },\n );\n const data = await response;\n return data.ok;\n }\n\n async updateQuestion(\n id: string,\n question: QuestionRequest,\n ): Promise<Question> {\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${id}`,\n {\n method: 'POST',\n body: JSON.stringify(question),\n headers: { 'Content-Type': 'application/json' },\n },\n );\n const data = (await response.json()) as QuestionResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to update', data.errors);\n }\n\n return data;\n }\n\n async updateAnswer(\n id: number,\n answer: AnswerRequest,\n ): Promise<AnswerResponseBody> {\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${answer.questionId}/answers/${id}`,\n {\n method: 'POST',\n body: JSON.stringify({ answer: answer.answer, images: answer.images }),\n headers: { 'Content-Type': 'application/json' },\n },\n );\n const data = (await response.json()) as AnswerResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async getAnswer(\n questionId: string | number | undefined,\n id: string | number | undefined,\n ): Promise<AnswerResponseBody> {\n if (!questionId || !id) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${questionId}/answers/${id}`,\n );\n const data = (await response.json()) as AnswerResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async postAttachment(file: Blob): Promise<AttachmentResponseBody> {\n const qetaUrl = `${await this.getBaseUrl()}/attachments`;\n const formData = new FormData();\n\n formData.append('image', file);\n\n const requestOptions = {\n method: 'POST',\n body: formData,\n };\n\n const response = await this.fetchApi.fetch(qetaUrl, requestOptions);\n return (await response.json()) as AttachmentResponseBody;\n }\n\n async getMostUpvotedAnswers(\n options: StatisticsRequestParameters,\n ): Promise<StatisticResponse> {\n const query = this.getQueryParameters(options.options).toString();\n\n let url = `${await this.getBaseUrl()}/statistics/answers/top-upvoted-users`;\n if (query) {\n url += `?${query}`;\n }\n\n const response = await this.fetchApi.fetch(url);\n\n const data = (await response.json()) as StatisticResponse;\n\n return data;\n }\n\n async getMostUpvotedCorrectAnswers(\n options: StatisticsRequestParameters,\n ): Promise<StatisticResponse> {\n const query = this.getQueryParameters(options.options).toString();\n let url = `${await this.getBaseUrl()}/statistics/answers/top-correct-upvoted-users`;\n\n if (query) {\n url += `?${query}`;\n }\n\n const response = await this.fetchApi.fetch(url);\n\n const data = (await response.json()) as StatisticResponse;\n\n return data;\n }\n\n async getMostUpvotedQuestions(\n options: StatisticsRequestParameters,\n ): Promise<StatisticResponse> {\n const query = this.getQueryParameters(options.options).toString();\n let url = `${await this.getBaseUrl()}/statistics/questions/top-upvoted-users`;\n\n if (query) {\n url += `?${query}`;\n }\n\n const response = await this.fetchApi.fetch(url);\n\n const data = (await response.json()) as StatisticResponse;\n\n return data;\n }\n\n async getMostQuestions(\n options: StatisticsRequestParameters,\n ): Promise<StatisticResponse> {\n const query = this.getQueryParameters(options.options).toString();\n let url = `${await this.getBaseUrl()}/statistics/questions/most-questions`;\n\n if (query) {\n url += `?${query}`;\n }\n\n const response = await this.fetchApi.fetch(url);\n\n const data = (await response.json()) as StatisticResponse;\n\n return data;\n }\n\n async getMostAnswers(\n options: StatisticsRequestParameters,\n ): Promise<StatisticResponse> {\n const query = this.getQueryParameters(options.options).toString();\n let url = `${await this.getBaseUrl()}/statistics/answers/most-answers`;\n\n if (query) {\n url += `?${query}`;\n }\n\n const response = await this.fetchApi.fetch(url);\n\n const data = (await response.json()) as StatisticResponse;\n\n return data;\n }\n\n async getTopStatisticsHomepage(\n options: StatisticsRequestParameters,\n ): Promise<StatisticResponse[]> {\n const response = await Promise.all([\n this.getMostQuestions(options),\n this.getMostAnswers(options),\n this.getMostUpvotedQuestions(options),\n this.getMostUpvotedAnswers(options),\n this.getMostUpvotedCorrectAnswers(options),\n ]);\n\n return response;\n }\n\n private getQueryParameters(params: any): URLSearchParams {\n const asStrings = Object.fromEntries(\n Object.entries(params).map(([k, v]) => {\n if (!v) {\n return [k, ''];\n }\n if (Array.isArray(v)) {\n return [k, v.join(',')];\n }\n return [k, `${v}`];\n }),\n );\n return new URLSearchParams(omitBy(asStrings, isEmpty));\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"QetaClient.esm.js","sources":["../../src/api/QetaClient.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport { QetaApi } from './QetaApi';\nimport {\n createApiRef,\n DiscoveryApi,\n FetchApi,\n} from '@backstage/core-plugin-api';\nimport { CustomErrorBase } from '@backstage/errors';\nimport {\n Answer,\n AnswerRequest,\n AnswerResponseBody,\n AttachmentResponseBody,\n EntityResponse,\n Question,\n QuestionRequest,\n QuestionResponseBody,\n QuestionsResponse,\n QuestionsResponseBody,\n StatisticResponse,\n StatisticsRequestParameters,\n TagResponse,\n} from '@drodil/backstage-plugin-qeta-common';\nimport omitBy from 'lodash/omitBy';\nimport isEmpty from 'lodash/isEmpty';\n\nexport const qetaApiRef = createApiRef<QetaApi>({\n id: 'plugin.qeta.service',\n});\n\nexport class QetaError extends CustomErrorBase {\n public errors: null | undefined | any[];\n\n constructor(message: string, errors: null | undefined | any[]) {\n super(message);\n\n this.errors = errors;\n }\n}\n\nexport class QetaClient implements QetaApi {\n private readonly fetchApi: FetchApi;\n private readonly discoveryApi: DiscoveryApi;\n\n constructor(options: { fetchApi: FetchApi; discoveryApi: DiscoveryApi }) {\n this.fetchApi = options.fetchApi;\n this.discoveryApi = options.discoveryApi;\n }\n\n async getBaseUrl(): Promise<string> {\n return this.discoveryApi.getBaseUrl('qeta');\n }\n\n async getQuestions(options: {\n noCorrectAnswer: string;\n offset: number;\n includeEntities: boolean;\n author: string | undefined;\n orderBy: string;\n tags: string[] | undefined;\n noVotes: string;\n noAnswers: string;\n searchQuery: string;\n limit: number;\n favorite: undefined | boolean;\n entity: string | undefined;\n order: string;\n }): Promise<QuestionsResponse> {\n const query = this.getQueryParameters(options).toString();\n\n let url = `${await this.getBaseUrl()}/questions`;\n if (query) {\n url += `?${query}`;\n }\n\n const response = await this.fetchApi.fetch(url);\n if (response.status === 403) {\n return { questions: [], total: 0 };\n }\n const data = (await response.json()) as QuestionsResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async getQuestionsList(type: string): Promise<QuestionsResponse> {\n const query = new URLSearchParams({ limit: '7' }).toString();\n\n let url = `${await this.getBaseUrl()}/questions/list/${type}`;\n if (query) {\n url += `?${query}`;\n }\n\n const response = await this.fetchApi.fetch(url);\n if (response.status === 403) {\n return { questions: [], total: 0 };\n }\n\n const data = (await response.json()) as QuestionsResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async postQuestion(question: QuestionRequest): Promise<Question> {\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions`,\n {\n method: 'POST',\n body: JSON.stringify(question),\n headers: { 'Content-Type': 'application/json' },\n },\n );\n const data = (await response.json()) as QuestionResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async commentQuestion(id: number, content: string): Promise<Question> {\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${id}/comments`,\n {\n method: 'POST',\n body: JSON.stringify({ content }),\n headers: { 'Content-Type': 'application/json' },\n },\n );\n const data = (await response.json()) as QuestionResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async deleteQuestionComment(\n questionId: number,\n id: number,\n ): Promise<Question> {\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${questionId}/comments/${id}`,\n {\n method: 'DELETE',\n },\n );\n const data = (await response.json()) as QuestionResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async getQuestion(id?: string): Promise<Question> {\n if (!id) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${id}`,\n );\n\n const data = (await response.json()) as QuestionResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async getTags(): Promise<TagResponse[]> {\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/tags`,\n );\n return (await response.json()) as TagResponse[];\n }\n\n async getEntities(): Promise<EntityResponse[]> {\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/entities`,\n );\n return (await response.json()) as EntityResponse[];\n }\n\n async voteQuestionUp(id: number): Promise<Question> {\n if (!id) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${id}/upvote`,\n );\n const data = (await response.json()) as QuestionResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async voteQuestionDown(id: number): Promise<Question> {\n if (!id) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${id}/downvote`,\n );\n const data = (await response.json()) as QuestionResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async favoriteQuestion(id: number): Promise<Question> {\n if (!id) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${id}/favorite`,\n );\n const data = (await response.json()) as QuestionResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async unfavoriteQuestion(id: number): Promise<Question> {\n if (!id) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${id}/unfavorite`,\n );\n const data = (await response.json()) as QuestionResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async postAnswer(answer: AnswerRequest): Promise<AnswerResponseBody> {\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${answer.questionId}/answers`,\n {\n method: 'POST',\n body: JSON.stringify({\n answer: answer.answer,\n images: answer.images,\n anonymous: answer.anonymous,\n }),\n headers: { 'Content-Type': 'application/json' },\n },\n );\n const data = (await response.json()) as AnswerResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async commentAnswer(\n questionId: number,\n id: number,\n content: string,\n ): Promise<Answer> {\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${questionId}/answers/${id}/comments`,\n {\n method: 'POST',\n body: JSON.stringify({ content }),\n headers: { 'Content-Type': 'application/json' },\n },\n );\n const data = (await response.json()) as AnswerResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async deleteAnswerComment(\n questionId: number,\n answerId: number,\n id: number,\n ): Promise<Answer> {\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${questionId}/answers/${answerId}/comments/${id}`,\n {\n method: 'DELETE',\n },\n );\n const data = (await response.json()) as AnswerResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async voteAnswerUp(questionId: number, id: number): Promise<Answer> {\n if (!id || !questionId) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${questionId}/answers/${id}/upvote`,\n );\n const data = (await response.json()) as AnswerResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async voteAnswerDown(questionId: number, id: number): Promise<Answer> {\n if (!id || !questionId) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${questionId}/answers/${id}/downvote`,\n );\n const data = (await response.json()) as AnswerResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async markAnswerCorrect(questionId: number, id: number): Promise<boolean> {\n if (!id || !questionId) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${questionId}/answers/${id}/correct`,\n );\n const data = await response;\n return data.ok;\n }\n\n async markAnswerIncorrect(questionId: number, id: number): Promise<boolean> {\n if (!id || !questionId) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${questionId}/answers/${id}/incorrect`,\n );\n const data = await response;\n return data.ok;\n }\n\n async deleteQuestion(questionId: number): Promise<boolean> {\n if (!questionId) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${questionId}`,\n {\n method: 'DELETE',\n },\n );\n const data = await response;\n return data.ok;\n }\n\n async deleteAnswer(questionId: number, id: number): Promise<boolean> {\n if (!questionId || !id) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${questionId}/answers/${id}`,\n {\n method: 'DELETE',\n },\n );\n const data = await response;\n return data.ok;\n }\n\n async updateQuestion(\n id: string,\n question: QuestionRequest,\n ): Promise<Question> {\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${id}`,\n {\n method: 'POST',\n body: JSON.stringify(question),\n headers: { 'Content-Type': 'application/json' },\n },\n );\n const data = (await response.json()) as QuestionResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to update', data.errors);\n }\n\n return data;\n }\n\n async updateAnswer(\n id: number,\n answer: AnswerRequest,\n ): Promise<AnswerResponseBody> {\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${answer.questionId}/answers/${id}`,\n {\n method: 'POST',\n body: JSON.stringify({ answer: answer.answer, images: answer.images }),\n headers: { 'Content-Type': 'application/json' },\n },\n );\n const data = (await response.json()) as AnswerResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async getAnswer(\n questionId: string | number | undefined,\n id: string | number | undefined,\n ): Promise<AnswerResponseBody> {\n if (!questionId || !id) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${questionId}/answers/${id}`,\n );\n const data = (await response.json()) as AnswerResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async postAttachment(file: Blob): Promise<AttachmentResponseBody> {\n const qetaUrl = `${await this.getBaseUrl()}/attachments`;\n const formData = new FormData();\n\n formData.append('image', file);\n\n const requestOptions = {\n method: 'POST',\n body: formData,\n };\n\n const response = await this.fetchApi.fetch(qetaUrl, requestOptions);\n return (await response.json()) as AttachmentResponseBody;\n }\n\n async getMostUpvotedAnswers(\n options: StatisticsRequestParameters,\n ): Promise<StatisticResponse> {\n const query = this.getQueryParameters(options.options).toString();\n\n let url = `${await this.getBaseUrl()}/statistics/answers/top-upvoted-users`;\n if (query) {\n url += `?${query}`;\n }\n\n const response = await this.fetchApi.fetch(url);\n\n const data = (await response.json()) as StatisticResponse;\n\n return data;\n }\n\n async getMostUpvotedCorrectAnswers(\n options: StatisticsRequestParameters,\n ): Promise<StatisticResponse> {\n const query = this.getQueryParameters(options.options).toString();\n let url = `${await this.getBaseUrl()}/statistics/answers/top-correct-upvoted-users`;\n\n if (query) {\n url += `?${query}`;\n }\n\n const response = await this.fetchApi.fetch(url);\n\n const data = (await response.json()) as StatisticResponse;\n\n return data;\n }\n\n async getMostUpvotedQuestions(\n options: StatisticsRequestParameters,\n ): Promise<StatisticResponse> {\n const query = this.getQueryParameters(options.options).toString();\n let url = `${await this.getBaseUrl()}/statistics/questions/top-upvoted-users`;\n\n if (query) {\n url += `?${query}`;\n }\n\n const response = await this.fetchApi.fetch(url);\n\n const data = (await response.json()) as StatisticResponse;\n\n return data;\n }\n\n async getMostQuestions(\n options: StatisticsRequestParameters,\n ): Promise<StatisticResponse> {\n const query = this.getQueryParameters(options.options).toString();\n let url = `${await this.getBaseUrl()}/statistics/questions/most-questions`;\n\n if (query) {\n url += `?${query}`;\n }\n\n const response = await this.fetchApi.fetch(url);\n\n const data = (await response.json()) as StatisticResponse;\n\n return data;\n }\n\n async getMostAnswers(\n options: StatisticsRequestParameters,\n ): Promise<StatisticResponse> {\n const query = this.getQueryParameters(options.options).toString();\n let url = `${await this.getBaseUrl()}/statistics/answers/most-answers`;\n\n if (query) {\n url += `?${query}`;\n }\n\n const response = await this.fetchApi.fetch(url);\n\n const data = (await response.json()) as StatisticResponse;\n\n return data;\n }\n\n async getTopStatisticsHomepage(\n options: StatisticsRequestParameters,\n ): Promise<StatisticResponse[]> {\n const response = await Promise.all([\n this.getMostQuestions(options),\n this.getMostAnswers(options),\n this.getMostUpvotedQuestions(options),\n this.getMostUpvotedAnswers(options),\n this.getMostUpvotedCorrectAnswers(options),\n ]);\n\n return response;\n }\n\n private getQueryParameters(params: any): URLSearchParams {\n const asStrings = Object.fromEntries(\n Object.entries(params).map(([k, v]) => {\n if (!v) {\n return [k, ''];\n }\n if (Array.isArray(v)) {\n return [k, v.join(',')];\n }\n return [k, `${v}`];\n }),\n );\n return new URLSearchParams(omitBy(asStrings, isEmpty));\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -16,24 +16,21 @@ import { AskAnonymouslyCheckbox } from '../AskAnonymouslyCheckbox/AskAnonymously
|
|
|
16
16
|
import { qetaApiRef } from '../../api/QetaClient.esm.js';
|
|
17
17
|
|
|
18
18
|
const formToRequest = (form, images) => {
|
|
19
|
-
var _a;
|
|
20
19
|
return {
|
|
21
20
|
...form,
|
|
22
|
-
entities:
|
|
21
|
+
entities: form.entities?.map(stringifyEntityRef),
|
|
23
22
|
images
|
|
24
23
|
};
|
|
25
24
|
};
|
|
26
25
|
const getDefaultValues = (props) => {
|
|
27
|
-
var _a;
|
|
28
26
|
return {
|
|
29
27
|
title: "",
|
|
30
28
|
content: "",
|
|
31
|
-
tags:
|
|
29
|
+
tags: props.tags ?? [],
|
|
32
30
|
entities: []
|
|
33
31
|
};
|
|
34
32
|
};
|
|
35
33
|
const getValues = async (api, catalogApi, id) => {
|
|
36
|
-
var _a;
|
|
37
34
|
if (!id) {
|
|
38
35
|
return getDefaultValues({});
|
|
39
36
|
}
|
|
@@ -50,7 +47,7 @@ const getValues = async (api, catalogApi, id) => {
|
|
|
50
47
|
return {
|
|
51
48
|
title: question.title,
|
|
52
49
|
content: question.content,
|
|
53
|
-
tags:
|
|
50
|
+
tags: question.tags ?? [],
|
|
54
51
|
entities: "items" in entities ? compact(entities.items) : []
|
|
55
52
|
};
|
|
56
53
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AskForm.esm.js","sources":["../../../src/components/AskForm/AskForm.tsx"],"sourcesContent":["import {\n configApiRef,\n useAnalytics,\n useApi,\n useRouteRef,\n} from '@backstage/core-plugin-api';\nimport { Button, TextField } from '@material-ui/core';\nimport { Alert } from '@material-ui/lab';\nimport React, { useEffect } from 'react';\nimport { Controller, useForm } from 'react-hook-form';\nimport { useNavigate, useSearchParams } from 'react-router-dom';\nimport {\n QuestionRequest,\n QuestionResponse,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { useStyles } from '../../utils/hooks';\nimport { MarkdownEditor } from '../MarkdownEditor/MarkdownEditor';\nimport { catalogApiRef } from '@backstage/plugin-catalog-react';\nimport { stringifyEntityRef } from '@backstage/catalog-model';\nimport { CatalogApi } from '@backstage/catalog-client';\nimport { compact } from 'lodash';\nimport { TagInput } from './TagInput';\nimport { QuestionForm } from './types';\nimport { EntitiesInput } from './EntitiesInput';\nimport { questionRouteRef } from '@drodil/backstage-plugin-qeta-react';\nimport { AskAnonymouslyCheckbox } from '../AskAnonymouslyCheckbox/AskAnonymouslyCheckbox';\nimport { QetaApi, qetaApiRef } from '../../api';\n\nconst formToRequest = (\n form: QuestionForm,\n images: number[],\n): QuestionRequest => {\n return {\n ...form,\n entities: form.entities?.map(stringifyEntityRef),\n images,\n };\n};\n\nexport type AskFormProps = {\n id?: string;\n entity?: string;\n tags?: string[];\n onPost?: (question: QuestionResponse) => void;\n entityPage?: boolean;\n};\n\nconst getDefaultValues = (props: AskFormProps): QuestionForm => {\n return {\n title: '',\n content: '',\n tags: props.tags ?? [],\n entities: [],\n };\n};\n\nconst getValues = async (\n api: QetaApi,\n catalogApi: CatalogApi,\n id?: string,\n): Promise<QuestionForm> => {\n if (!id) {\n return getDefaultValues({});\n }\n\n const question = await api.getQuestion(id);\n const entities =\n question.entities && question.entities.length > 0\n ? await catalogApi.getEntitiesByRefs({\n entityRefs: question.entities,\n fields: [\n 'kind',\n 'metadata.name',\n 'metadata.namespace',\n 'metadata.title',\n ],\n })\n : [];\n return {\n title: question.title,\n content: question.content,\n tags: question.tags ?? [],\n entities: 'items' in entities ? compact(entities.items) : [],\n };\n};\n\nexport const AskForm = (props: AskFormProps) => {\n const { id, entity, onPost, entityPage } = props;\n const questionRoute = useRouteRef(questionRouteRef);\n const navigate = useNavigate();\n const analytics = useAnalytics();\n const [entityRef, setEntityRef] = React.useState(entity);\n const [posting, setPosting] = React.useState(false);\n const [values, setValues] = React.useState(getDefaultValues(props));\n const [error, setError] = React.useState(false);\n\n const [images, setImages] = React.useState<number[]>([]);\n const [searchParams, _setSearchParams] = useSearchParams();\n\n const qetaApi = useApi(qetaApiRef);\n const catalogApi = useApi(catalogApiRef);\n const configApi = useApi(configApiRef);\n const allowAnonymouns = configApi.getOptionalBoolean('qeta.allowAnonymous');\n const styles = useStyles();\n const {\n register,\n handleSubmit,\n control,\n reset,\n formState: { errors },\n } = useForm<QuestionForm>({\n values,\n defaultValues: getDefaultValues(props),\n });\n\n const postQuestion = (data: QuestionForm) => {\n setPosting(true);\n\n const queryParams = new URLSearchParams();\n if (entity) {\n queryParams.set('entity', entity);\n }\n if (entityPage) {\n queryParams.set('entityPage', 'true');\n }\n\n if (id) {\n qetaApi\n .updateQuestion(id, formToRequest(data, images))\n .then(q => {\n if (!q || !q.id) {\n setError(true);\n return;\n }\n reset();\n analytics.captureEvent('edit', 'question');\n if (onPost) {\n onPost(q);\n } else if (entity) {\n navigate(\n `${questionRoute({\n id: q.id.toString(10),\n })}?${queryParams.toString()}`,\n );\n } else {\n navigate(questionRoute({ id: q.id.toString(10) }));\n }\n })\n .catch(_e => {\n setError(true);\n setPosting(false);\n });\n return;\n }\n qetaApi\n .postQuestion(formToRequest(data, images))\n .then(q => {\n if (!q || !q.id) {\n setError(true);\n return;\n }\n analytics.captureEvent('post', 'question');\n reset();\n if (entity) {\n navigate(\n `${questionRoute({\n id: q.id.toString(10),\n })}?${queryParams.toString()}`,\n );\n } else {\n navigate(questionRoute({ id: q.id.toString(10) }));\n }\n })\n .catch(_e => {\n setError(true);\n setPosting(false);\n });\n };\n\n useEffect(() => {\n if (!entityRef) {\n const e = searchParams.get('entity');\n if (e) {\n setEntityRef(e);\n }\n }\n }, [entityRef, searchParams]);\n\n useEffect(() => {\n if (id) {\n getValues(qetaApi, catalogApi, id).then(data => {\n setValues(data);\n });\n }\n }, [qetaApi, catalogApi, id]);\n\n useEffect(() => {\n if (entityRef) {\n catalogApi.getEntityByRef(entityRef).then(data => {\n if (data) {\n setValues(v => {\n return { ...v, entities: [data] };\n });\n }\n });\n }\n }, [catalogApi, entityRef]);\n\n useEffect(() => {\n reset(values);\n }, [values, reset]);\n\n return (\n <form onSubmit={handleSubmit(postQuestion)} className=\"qetaAskForm\">\n {error && <Alert severity=\"error\">Could not post question</Alert>}\n <TextField\n label=\"Title\"\n className=\"qetaAskFormTitle\"\n required\n fullWidth\n error={'title' in errors}\n margin=\"normal\"\n variant=\"outlined\"\n helperText=\"Write good title for your question that people can understand\"\n {\n // @ts-ignore\n ...register('title', { required: true, maxLength: 255 })\n }\n />\n <Controller\n control={control}\n rules={{\n required: true,\n }}\n render={({ field: { onChange, value } }) => (\n <MarkdownEditor\n value={value}\n onChange={onChange}\n height={400}\n error={'content' in errors}\n placeholder=\"Your question\"\n config={configApi}\n onImageUpload={(imageId: number) => {\n setImages(prevImages => [...prevImages, imageId]);\n }}\n />\n )}\n name=\"content\"\n />\n <TagInput control={control} />\n <EntitiesInput control={control} entityRef={entityRef} />\n {allowAnonymouns && !id && (\n <AskAnonymouslyCheckbox control={control} label=\"Ask anonymously\" />\n )}\n <Button\n color=\"primary\"\n type=\"submit\"\n variant=\"contained\"\n disabled={posting}\n className={`qetaAskFormSubmitBtn ${styles.postButton}`}\n >\n {id ? 'Save' : 'Post'}\n </Button>\n </form>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AskForm.esm.js","sources":["../../../src/components/AskForm/AskForm.tsx"],"sourcesContent":["import {\n configApiRef,\n useAnalytics,\n useApi,\n useRouteRef,\n} from '@backstage/core-plugin-api';\nimport { Button, TextField } from '@material-ui/core';\nimport { Alert } from '@material-ui/lab';\nimport React, { useEffect } from 'react';\nimport { Controller, useForm } from 'react-hook-form';\nimport { useNavigate, useSearchParams } from 'react-router-dom';\nimport {\n QuestionRequest,\n QuestionResponse,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { useStyles } from '../../utils/hooks';\nimport { MarkdownEditor } from '../MarkdownEditor/MarkdownEditor';\nimport { catalogApiRef } from '@backstage/plugin-catalog-react';\nimport { stringifyEntityRef } from '@backstage/catalog-model';\nimport { CatalogApi } from '@backstage/catalog-client';\nimport { compact } from 'lodash';\nimport { TagInput } from './TagInput';\nimport { QuestionForm } from './types';\nimport { EntitiesInput } from './EntitiesInput';\nimport { questionRouteRef } from '@drodil/backstage-plugin-qeta-react';\nimport { AskAnonymouslyCheckbox } from '../AskAnonymouslyCheckbox/AskAnonymouslyCheckbox';\nimport { QetaApi, qetaApiRef } from '../../api';\n\nconst formToRequest = (\n form: QuestionForm,\n images: number[],\n): QuestionRequest => {\n return {\n ...form,\n entities: form.entities?.map(stringifyEntityRef),\n images,\n };\n};\n\nexport type AskFormProps = {\n id?: string;\n entity?: string;\n tags?: string[];\n onPost?: (question: QuestionResponse) => void;\n entityPage?: boolean;\n};\n\nconst getDefaultValues = (props: AskFormProps): QuestionForm => {\n return {\n title: '',\n content: '',\n tags: props.tags ?? [],\n entities: [],\n };\n};\n\nconst getValues = async (\n api: QetaApi,\n catalogApi: CatalogApi,\n id?: string,\n): Promise<QuestionForm> => {\n if (!id) {\n return getDefaultValues({});\n }\n\n const question = await api.getQuestion(id);\n const entities =\n question.entities && question.entities.length > 0\n ? await catalogApi.getEntitiesByRefs({\n entityRefs: question.entities,\n fields: [\n 'kind',\n 'metadata.name',\n 'metadata.namespace',\n 'metadata.title',\n ],\n })\n : [];\n return {\n title: question.title,\n content: question.content,\n tags: question.tags ?? [],\n entities: 'items' in entities ? compact(entities.items) : [],\n };\n};\n\nexport const AskForm = (props: AskFormProps) => {\n const { id, entity, onPost, entityPage } = props;\n const questionRoute = useRouteRef(questionRouteRef);\n const navigate = useNavigate();\n const analytics = useAnalytics();\n const [entityRef, setEntityRef] = React.useState(entity);\n const [posting, setPosting] = React.useState(false);\n const [values, setValues] = React.useState(getDefaultValues(props));\n const [error, setError] = React.useState(false);\n\n const [images, setImages] = React.useState<number[]>([]);\n const [searchParams, _setSearchParams] = useSearchParams();\n\n const qetaApi = useApi(qetaApiRef);\n const catalogApi = useApi(catalogApiRef);\n const configApi = useApi(configApiRef);\n const allowAnonymouns = configApi.getOptionalBoolean('qeta.allowAnonymous');\n const styles = useStyles();\n const {\n register,\n handleSubmit,\n control,\n reset,\n formState: { errors },\n } = useForm<QuestionForm>({\n values,\n defaultValues: getDefaultValues(props),\n });\n\n const postQuestion = (data: QuestionForm) => {\n setPosting(true);\n\n const queryParams = new URLSearchParams();\n if (entity) {\n queryParams.set('entity', entity);\n }\n if (entityPage) {\n queryParams.set('entityPage', 'true');\n }\n\n if (id) {\n qetaApi\n .updateQuestion(id, formToRequest(data, images))\n .then(q => {\n if (!q || !q.id) {\n setError(true);\n return;\n }\n reset();\n analytics.captureEvent('edit', 'question');\n if (onPost) {\n onPost(q);\n } else if (entity) {\n navigate(\n `${questionRoute({\n id: q.id.toString(10),\n })}?${queryParams.toString()}`,\n );\n } else {\n navigate(questionRoute({ id: q.id.toString(10) }));\n }\n })\n .catch(_e => {\n setError(true);\n setPosting(false);\n });\n return;\n }\n qetaApi\n .postQuestion(formToRequest(data, images))\n .then(q => {\n if (!q || !q.id) {\n setError(true);\n return;\n }\n analytics.captureEvent('post', 'question');\n reset();\n if (entity) {\n navigate(\n `${questionRoute({\n id: q.id.toString(10),\n })}?${queryParams.toString()}`,\n );\n } else {\n navigate(questionRoute({ id: q.id.toString(10) }));\n }\n })\n .catch(_e => {\n setError(true);\n setPosting(false);\n });\n };\n\n useEffect(() => {\n if (!entityRef) {\n const e = searchParams.get('entity');\n if (e) {\n setEntityRef(e);\n }\n }\n }, [entityRef, searchParams]);\n\n useEffect(() => {\n if (id) {\n getValues(qetaApi, catalogApi, id).then(data => {\n setValues(data);\n });\n }\n }, [qetaApi, catalogApi, id]);\n\n useEffect(() => {\n if (entityRef) {\n catalogApi.getEntityByRef(entityRef).then(data => {\n if (data) {\n setValues(v => {\n return { ...v, entities: [data] };\n });\n }\n });\n }\n }, [catalogApi, entityRef]);\n\n useEffect(() => {\n reset(values);\n }, [values, reset]);\n\n return (\n <form onSubmit={handleSubmit(postQuestion)} className=\"qetaAskForm\">\n {error && <Alert severity=\"error\">Could not post question</Alert>}\n <TextField\n label=\"Title\"\n className=\"qetaAskFormTitle\"\n required\n fullWidth\n error={'title' in errors}\n margin=\"normal\"\n variant=\"outlined\"\n helperText=\"Write good title for your question that people can understand\"\n {\n // @ts-ignore\n ...register('title', { required: true, maxLength: 255 })\n }\n />\n <Controller\n control={control}\n rules={{\n required: true,\n }}\n render={({ field: { onChange, value } }) => (\n <MarkdownEditor\n value={value}\n onChange={onChange}\n height={400}\n error={'content' in errors}\n placeholder=\"Your question\"\n config={configApi}\n onImageUpload={(imageId: number) => {\n setImages(prevImages => [...prevImages, imageId]);\n }}\n />\n )}\n name=\"content\"\n />\n <TagInput control={control} />\n <EntitiesInput control={control} entityRef={entityRef} />\n {allowAnonymouns && !id && (\n <AskAnonymouslyCheckbox control={control} label=\"Ask anonymously\" />\n )}\n <Button\n color=\"primary\"\n type=\"submit\"\n variant=\"contained\"\n disabled={posting}\n className={`qetaAskFormSubmitBtn ${styles.postButton}`}\n >\n {id ? 'Save' : 'Post'}\n </Button>\n </form>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -20,10 +20,7 @@ const EntitiesInput = (props) => {
|
|
|
20
20
|
return kinds || ["Component", "System"];
|
|
21
21
|
}, [configApi]);
|
|
22
22
|
const max = useMemo(
|
|
23
|
-
() =>
|
|
24
|
-
var _a;
|
|
25
|
-
return (_a = configApi.getOptionalNumber("qeta.entities.max")) != null ? _a : 3;
|
|
26
|
-
},
|
|
23
|
+
() => configApi.getOptionalNumber("qeta.entities.max") ?? 3,
|
|
27
24
|
[configApi]
|
|
28
25
|
);
|
|
29
26
|
useEffect(() => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EntitiesInput.esm.js","sources":["../../../src/components/AskForm/EntitiesInput.tsx"],"sourcesContent":["import { Control, Controller } from 'react-hook-form';\nimport { QuestionForm } from './types';\nimport { Autocomplete } from '@material-ui/lab';\nimport { getEntityTitle } from '../../utils/utils';\nimport { Entity, stringifyEntityRef } from '@backstage/catalog-model';\nimport { TextField } from '@material-ui/core';\nimport React, { useEffect, useMemo } from 'react';\nimport { configApiRef, useApi } from '@backstage/core-plugin-api';\nimport { catalogApiRef } from '@backstage/plugin-catalog-react';\n\nexport const EntitiesInput = (props: {\n control: Control<QuestionForm>;\n entityRef?: string;\n}) => {\n const { control, entityRef } = props;\n const configApi = useApi(configApiRef);\n const catalogApi = useApi(catalogApiRef);\n const [availableEntities, setAvailableEntities] = React.useState<\n Entity[] | null\n >([]);\n\n const entityKinds: string[] = useMemo(() => {\n let kinds = configApi.getOptionalStringArray('qeta.entityKinds');\n if (!kinds) {\n kinds = configApi.getOptionalStringArray('qeta.entities.kinds');\n }\n return kinds || ['Component', 'System'];\n }, [configApi]);\n const max = useMemo(\n () => configApi.getOptionalNumber('qeta.entities.max') ?? 3,\n [configApi],\n );\n\n useEffect(() => {\n if (entityRef) {\n catalogApi.getEntityByRef(entityRef).then(data => {\n if (data) {\n setAvailableEntities([data]);\n }\n });\n }\n }, [catalogApi, entityRef]);\n\n useEffect(() => {\n if (entityRef) {\n return;\n }\n\n if (entityKinds && entityKinds.length > 0) {\n catalogApi\n .getEntities({\n filter: { kind: entityKinds },\n fields: [\n 'kind',\n 'metadata.name',\n 'metadata.namespace',\n 'metadata.title',\n ],\n })\n .catch(_ => setAvailableEntities(null))\n .then(data =>\n data ? setAvailableEntities(data.items) : setAvailableEntities(null),\n );\n }\n }, [catalogApi, entityRef, configApi, entityKinds]);\n\n if (!availableEntities || availableEntities.length === 0) {\n return null;\n }\n\n return (\n <Controller\n control={control}\n render={({ field: { onChange, value } }) => (\n <Autocomplete\n multiple\n className=\"qetaAskFormEntities\"\n value={value}\n groupBy={entityKinds.length > 1 ? option => option.kind : undefined}\n id=\"entities-select\"\n options={availableEntities}\n getOptionLabel={getEntityTitle}\n getOptionSelected={(o, v) =>\n stringifyEntityRef(o) === stringifyEntityRef(v)\n }\n onChange={(_e, newValue) => {\n if (!value || value.length < max) {\n onChange(newValue);\n }\n }}\n renderInput={params => (\n <TextField\n {...params}\n variant=\"outlined\"\n margin=\"normal\"\n label=\"Entities\"\n placeholder=\"Type or select entities\"\n helperText={`Add up to ${max} entities this question relates to`}\n />\n )}\n />\n )}\n name=\"entities\"\n />\n );\n};\n"],"names":[],"mappings":";;;;;;;;;AAUa,MAAA,aAAA,GAAgB,CAAC,KAGxB,KAAA;AACJ,EAAM,MAAA,EAAE,OAAS,EAAA,SAAA,EAAc,GAAA,KAAA,CAAA;AAC/B,EAAM,MAAA,SAAA,GAAY,OAAO,YAAY,CAAA,CAAA;AACrC,EAAM,MAAA,UAAA,GAAa,OAAO,aAAa,CAAA,CAAA;AACvC,EAAA,MAAM,CAAC,iBAAmB,EAAA,oBAAoB,IAAI,KAAM,CAAA,QAAA,CAEtD,EAAE,CAAA,CAAA;AAEJ,EAAM,MAAA,WAAA,GAAwB,QAAQ,MAAM;AAC1C,IAAI,IAAA,KAAA,GAAQ,SAAU,CAAA,sBAAA,CAAuB,kBAAkB,CAAA,CAAA;AAC/D,IAAA,IAAI,CAAC,KAAO,EAAA;AACV,MAAQ,KAAA,GAAA,SAAA,CAAU,uBAAuB,qBAAqB,CAAA,CAAA;AAAA,KAChE;AACA,IAAO,OAAA,KAAA,IAAS,CAAC,WAAA,EAAa,QAAQ,CAAA,CAAA;AAAA,GACxC,EAAG,CAAC,SAAS,CAAC,CAAA,CAAA;AACd,EAAA,MAAM,GAAM,GAAA,OAAA;AAAA,IACV,
|
|
1
|
+
{"version":3,"file":"EntitiesInput.esm.js","sources":["../../../src/components/AskForm/EntitiesInput.tsx"],"sourcesContent":["import { Control, Controller } from 'react-hook-form';\nimport { QuestionForm } from './types';\nimport { Autocomplete } from '@material-ui/lab';\nimport { getEntityTitle } from '../../utils/utils';\nimport { Entity, stringifyEntityRef } from '@backstage/catalog-model';\nimport { TextField } from '@material-ui/core';\nimport React, { useEffect, useMemo } from 'react';\nimport { configApiRef, useApi } from '@backstage/core-plugin-api';\nimport { catalogApiRef } from '@backstage/plugin-catalog-react';\n\nexport const EntitiesInput = (props: {\n control: Control<QuestionForm>;\n entityRef?: string;\n}) => {\n const { control, entityRef } = props;\n const configApi = useApi(configApiRef);\n const catalogApi = useApi(catalogApiRef);\n const [availableEntities, setAvailableEntities] = React.useState<\n Entity[] | null\n >([]);\n\n const entityKinds: string[] = useMemo(() => {\n let kinds = configApi.getOptionalStringArray('qeta.entityKinds');\n if (!kinds) {\n kinds = configApi.getOptionalStringArray('qeta.entities.kinds');\n }\n return kinds || ['Component', 'System'];\n }, [configApi]);\n const max = useMemo(\n () => configApi.getOptionalNumber('qeta.entities.max') ?? 3,\n [configApi],\n );\n\n useEffect(() => {\n if (entityRef) {\n catalogApi.getEntityByRef(entityRef).then(data => {\n if (data) {\n setAvailableEntities([data]);\n }\n });\n }\n }, [catalogApi, entityRef]);\n\n useEffect(() => {\n if (entityRef) {\n return;\n }\n\n if (entityKinds && entityKinds.length > 0) {\n catalogApi\n .getEntities({\n filter: { kind: entityKinds },\n fields: [\n 'kind',\n 'metadata.name',\n 'metadata.namespace',\n 'metadata.title',\n ],\n })\n .catch(_ => setAvailableEntities(null))\n .then(data =>\n data ? setAvailableEntities(data.items) : setAvailableEntities(null),\n );\n }\n }, [catalogApi, entityRef, configApi, entityKinds]);\n\n if (!availableEntities || availableEntities.length === 0) {\n return null;\n }\n\n return (\n <Controller\n control={control}\n render={({ field: { onChange, value } }) => (\n <Autocomplete\n multiple\n className=\"qetaAskFormEntities\"\n value={value}\n groupBy={entityKinds.length > 1 ? option => option.kind : undefined}\n id=\"entities-select\"\n options={availableEntities}\n getOptionLabel={getEntityTitle}\n getOptionSelected={(o, v) =>\n stringifyEntityRef(o) === stringifyEntityRef(v)\n }\n onChange={(_e, newValue) => {\n if (!value || value.length < max) {\n onChange(newValue);\n }\n }}\n renderInput={params => (\n <TextField\n {...params}\n variant=\"outlined\"\n margin=\"normal\"\n label=\"Entities\"\n placeholder=\"Type or select entities\"\n helperText={`Add up to ${max} entities this question relates to`}\n />\n )}\n />\n )}\n name=\"entities\"\n />\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -11,24 +11,15 @@ const TagInput = (props) => {
|
|
|
11
11
|
const qetaApi = useApi(qetaApiRef);
|
|
12
12
|
const config = useApi(configApiRef);
|
|
13
13
|
const allowCreation = useMemo(
|
|
14
|
-
() =>
|
|
15
|
-
var _a;
|
|
16
|
-
return (_a = config.getOptionalBoolean("qeta.tags.allowCreation")) != null ? _a : true;
|
|
17
|
-
},
|
|
14
|
+
() => config.getOptionalBoolean("qeta.tags.allowCreation") ?? true,
|
|
18
15
|
[config]
|
|
19
16
|
);
|
|
20
17
|
const allowedTags = useMemo(
|
|
21
|
-
() =>
|
|
22
|
-
var _a;
|
|
23
|
-
return (_a = config.getOptionalStringArray("qeta.tags.allowedTags")) != null ? _a : null;
|
|
24
|
-
},
|
|
18
|
+
() => config.getOptionalStringArray("qeta.tags.allowedTags") ?? null,
|
|
25
19
|
[config]
|
|
26
20
|
);
|
|
27
21
|
const maximumTags = useMemo(
|
|
28
|
-
() =>
|
|
29
|
-
var _a;
|
|
30
|
-
return (_a = config.getOptionalNumber("qeta.tags.max")) != null ? _a : 5;
|
|
31
|
-
},
|
|
22
|
+
() => config.getOptionalNumber("qeta.tags.max") ?? 5,
|
|
32
23
|
[config]
|
|
33
24
|
);
|
|
34
25
|
const [availableTags, setAvailableTags] = React.useState([]);
|
|
@@ -55,7 +46,7 @@ const TagInput = (props) => {
|
|
|
55
46
|
id: "tags-select",
|
|
56
47
|
className: "qetaAskFormTags",
|
|
57
48
|
value,
|
|
58
|
-
options: availableTags
|
|
49
|
+
options: availableTags ?? [],
|
|
59
50
|
freeSolo: allowCreation,
|
|
60
51
|
onChange: (_e, newValue) => {
|
|
61
52
|
const tags = filterTags(newValue);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TagInput.esm.js","sources":["../../../src/components/AskForm/TagInput.tsx"],"sourcesContent":["import { Control, Controller } from 'react-hook-form';\nimport { Autocomplete } from '@material-ui/lab';\nimport { TextField } from '@material-ui/core';\nimport React, { useEffect, useMemo } from 'react';\nimport { qetaApiRef } from '../../api';\nimport { QuestionForm } from './types';\nimport { configApiRef, useApi } from '@backstage/core-plugin-api';\nimport { filterTags } from '@drodil/backstage-plugin-qeta-common';\n\nexport const TagInput = (props: { control: Control<QuestionForm> }) => {\n const { control } = props;\n const qetaApi = useApi(qetaApiRef);\n const config = useApi(configApiRef);\n const allowCreation = useMemo(\n () => config.getOptionalBoolean('qeta.tags.allowCreation') ?? true,\n [config],\n );\n const allowedTags = useMemo(\n () => config.getOptionalStringArray('qeta.tags.allowedTags') ?? null,\n [config],\n );\n const maximumTags = useMemo(\n () => config.getOptionalNumber('qeta.tags.max') ?? 5,\n [config],\n );\n const [availableTags, setAvailableTags] = React.useState<string[] | null>([]);\n useEffect(() => {\n if (allowCreation) {\n qetaApi\n .getTags()\n .catch(_ => setAvailableTags(null))\n .then(data =>\n data\n ? setAvailableTags(data.map(tag => tag.tag))\n : setAvailableTags(null),\n );\n } else {\n setAvailableTags(allowedTags);\n }\n }, [qetaApi, allowCreation, allowedTags]);\n\n if (!allowCreation && (allowedTags === null || allowedTags.length === 0)) {\n return null;\n }\n\n return (\n <Controller\n control={control}\n render={({ field: { onChange, value }, fieldState: { error } }) => (\n <Autocomplete\n multiple\n id=\"tags-select\"\n className=\"qetaAskFormTags\"\n value={value}\n options={availableTags ?? []}\n freeSolo={allowCreation}\n onChange={(_e, newValue) => {\n const tags = filterTags(newValue);\n if (\n tags &&\n tags.length <= maximumTags &&\n tags.length === newValue.length\n ) {\n onChange(newValue);\n }\n }}\n renderInput={params => (\n <TextField\n {...params}\n variant=\"outlined\"\n margin=\"normal\"\n label=\"Tags\"\n placeholder=\"Type or select tags\"\n helperText={`Add up to ${maximumTags} tags to categorize your question`}\n error={error !== undefined}\n />\n )}\n />\n )}\n name=\"tags\"\n />\n );\n};\n"],"names":[],"mappings":";;;;;;;;AASa,MAAA,QAAA,GAAW,CAAC,KAA8C,KAAA;AACrE,EAAM,MAAA,EAAE,SAAY,GAAA,KAAA,CAAA;AACpB,EAAM,MAAA,OAAA,GAAU,OAAO,UAAU,CAAA,CAAA;AACjC,EAAM,MAAA,MAAA,GAAS,OAAO,YAAY,CAAA,CAAA;AAClC,EAAA,MAAM,aAAgB,GAAA,OAAA;AAAA,IACpB,
|
|
1
|
+
{"version":3,"file":"TagInput.esm.js","sources":["../../../src/components/AskForm/TagInput.tsx"],"sourcesContent":["import { Control, Controller } from 'react-hook-form';\nimport { Autocomplete } from '@material-ui/lab';\nimport { TextField } from '@material-ui/core';\nimport React, { useEffect, useMemo } from 'react';\nimport { qetaApiRef } from '../../api';\nimport { QuestionForm } from './types';\nimport { configApiRef, useApi } from '@backstage/core-plugin-api';\nimport { filterTags } from '@drodil/backstage-plugin-qeta-common';\n\nexport const TagInput = (props: { control: Control<QuestionForm> }) => {\n const { control } = props;\n const qetaApi = useApi(qetaApiRef);\n const config = useApi(configApiRef);\n const allowCreation = useMemo(\n () => config.getOptionalBoolean('qeta.tags.allowCreation') ?? true,\n [config],\n );\n const allowedTags = useMemo(\n () => config.getOptionalStringArray('qeta.tags.allowedTags') ?? null,\n [config],\n );\n const maximumTags = useMemo(\n () => config.getOptionalNumber('qeta.tags.max') ?? 5,\n [config],\n );\n const [availableTags, setAvailableTags] = React.useState<string[] | null>([]);\n useEffect(() => {\n if (allowCreation) {\n qetaApi\n .getTags()\n .catch(_ => setAvailableTags(null))\n .then(data =>\n data\n ? setAvailableTags(data.map(tag => tag.tag))\n : setAvailableTags(null),\n );\n } else {\n setAvailableTags(allowedTags);\n }\n }, [qetaApi, allowCreation, allowedTags]);\n\n if (!allowCreation && (allowedTags === null || allowedTags.length === 0)) {\n return null;\n }\n\n return (\n <Controller\n control={control}\n render={({ field: { onChange, value }, fieldState: { error } }) => (\n <Autocomplete\n multiple\n id=\"tags-select\"\n className=\"qetaAskFormTags\"\n value={value}\n options={availableTags ?? []}\n freeSolo={allowCreation}\n onChange={(_e, newValue) => {\n const tags = filterTags(newValue);\n if (\n tags &&\n tags.length <= maximumTags &&\n tags.length === newValue.length\n ) {\n onChange(newValue);\n }\n }}\n renderInput={params => (\n <TextField\n {...params}\n variant=\"outlined\"\n margin=\"normal\"\n label=\"Tags\"\n placeholder=\"Type or select tags\"\n helperText={`Add up to ${maximumTags} tags to categorize your question`}\n error={error !== undefined}\n />\n )}\n />\n )}\n name=\"tags\"\n />\n );\n};\n"],"names":[],"mappings":";;;;;;;;AASa,MAAA,QAAA,GAAW,CAAC,KAA8C,KAAA;AACrE,EAAM,MAAA,EAAE,SAAY,GAAA,KAAA,CAAA;AACpB,EAAM,MAAA,OAAA,GAAU,OAAO,UAAU,CAAA,CAAA;AACjC,EAAM,MAAA,MAAA,GAAS,OAAO,YAAY,CAAA,CAAA;AAClC,EAAA,MAAM,aAAgB,GAAA,OAAA;AAAA,IACpB,MAAM,MAAA,CAAO,kBAAmB,CAAA,yBAAyB,CAAK,IAAA,IAAA;AAAA,IAC9D,CAAC,MAAM,CAAA;AAAA,GACT,CAAA;AACA,EAAA,MAAM,WAAc,GAAA,OAAA;AAAA,IAClB,MAAM,MAAA,CAAO,sBAAuB,CAAA,uBAAuB,CAAK,IAAA,IAAA;AAAA,IAChE,CAAC,MAAM,CAAA;AAAA,GACT,CAAA;AACA,EAAA,MAAM,WAAc,GAAA,OAAA;AAAA,IAClB,MAAM,MAAA,CAAO,iBAAkB,CAAA,eAAe,CAAK,IAAA,CAAA;AAAA,IACnD,CAAC,MAAM,CAAA;AAAA,GACT,CAAA;AACA,EAAA,MAAM,CAAC,aAAe,EAAA,gBAAgB,IAAI,KAAM,CAAA,QAAA,CAA0B,EAAE,CAAA,CAAA;AAC5E,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,aAAe,EAAA;AACjB,MAAA,OAAA,CACG,SACA,CAAA,KAAA,CAAM,OAAK,gBAAiB,CAAA,IAAI,CAAC,CACjC,CAAA,IAAA;AAAA,QAAK,CAAA,IAAA,KACJ,IACI,GAAA,gBAAA,CAAiB,IAAK,CAAA,GAAA,CAAI,CAAO,GAAA,KAAA,GAAA,CAAI,GAAG,CAAC,CACzC,GAAA,gBAAA,CAAiB,IAAI,CAAA;AAAA,OAC3B,CAAA;AAAA,KACG,MAAA;AACL,MAAA,gBAAA,CAAiB,WAAW,CAAA,CAAA;AAAA,KAC9B;AAAA,GACC,EAAA,CAAC,OAAS,EAAA,aAAA,EAAe,WAAW,CAAC,CAAA,CAAA;AAExC,EAAA,IAAI,CAAC,aAAkB,KAAA,WAAA,KAAgB,IAAQ,IAAA,WAAA,CAAY,WAAW,CAAI,CAAA,EAAA;AACxE,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAEA,EACE,uBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,OAAA;AAAA,MACA,MAAQ,EAAA,CAAC,EAAE,KAAA,EAAO,EAAE,QAAA,EAAU,KAAM,EAAA,EAAG,UAAY,EAAA,EAAE,KAAM,EAAA,EACzD,qBAAA,KAAA,CAAA,aAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,QAAQ,EAAA,IAAA;AAAA,UACR,EAAG,EAAA,aAAA;AAAA,UACH,SAAU,EAAA,iBAAA;AAAA,UACV,KAAA;AAAA,UACA,OAAA,EAAS,iBAAiB,EAAC;AAAA,UAC3B,QAAU,EAAA,aAAA;AAAA,UACV,QAAA,EAAU,CAAC,EAAA,EAAI,QAAa,KAAA;AAC1B,YAAM,MAAA,IAAA,GAAO,WAAW,QAAQ,CAAA,CAAA;AAChC,YAAA,IACE,QACA,IAAK,CAAA,MAAA,IAAU,eACf,IAAK,CAAA,MAAA,KAAW,SAAS,MACzB,EAAA;AACA,cAAA,QAAA,CAAS,QAAQ,CAAA,CAAA;AAAA,aACnB;AAAA,WACF;AAAA,UACA,aAAa,CACX,MAAA,qBAAA,KAAA,CAAA,aAAA;AAAA,YAAC,SAAA;AAAA,YAAA;AAAA,cACE,GAAG,MAAA;AAAA,cACJ,OAAQ,EAAA,UAAA;AAAA,cACR,MAAO,EAAA,QAAA;AAAA,cACP,KAAM,EAAA,MAAA;AAAA,cACN,WAAY,EAAA,qBAAA;AAAA,cACZ,UAAA,EAAY,aAAa,WAAW,CAAA,iCAAA,CAAA;AAAA,cACpC,OAAO,KAAU,KAAA,KAAA,CAAA;AAAA,aAAA;AAAA,WACnB;AAAA,SAAA;AAAA,OAEJ;AAAA,MAEF,IAAK,EAAA,MAAA;AAAA,KAAA;AAAA,GACP,CAAA;AAEJ;;;;"}
|
|
@@ -8,10 +8,9 @@ import { useEntityPresentation } from '@backstage/plugin-catalog-react';
|
|
|
8
8
|
import { filterTags } from '@drodil/backstage-plugin-qeta-common';
|
|
9
9
|
|
|
10
10
|
const AskPage = () => {
|
|
11
|
-
var _a;
|
|
12
11
|
const { id } = useParams();
|
|
13
12
|
const [searchParams] = useSearchParams();
|
|
14
|
-
const entity =
|
|
13
|
+
const entity = searchParams.get("entity") ?? void 0;
|
|
15
14
|
const entityPage = searchParams.get("entityPage") === "true";
|
|
16
15
|
const tags = filterTags(searchParams.get("tags"));
|
|
17
16
|
let title;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AskPage.esm.js","sources":["../../../src/components/AskPage/AskPage.tsx"],"sourcesContent":["import { Content, ContentHeader, InfoCard } from '@backstage/core-components';\nimport { Grid } from '@material-ui/core';\nimport React from 'react';\n\nimport { AskForm } from '../AskForm/AskForm';\nimport { useParams, useSearchParams } from 'react-router-dom';\nimport { BackToQuestionsButton } from '../Buttons/BackToQuestionsButton';\nimport { useEntityPresentation } from '@backstage/plugin-catalog-react';\nimport { filterTags } from '@drodil/backstage-plugin-qeta-common';\n\nexport const AskPage = () => {\n const { id } = useParams();\n const [searchParams] = useSearchParams();\n const entity = searchParams.get('entity') ?? undefined;\n const entityPage = searchParams.get('entityPage') === 'true';\n const tags = filterTags(searchParams.get('tags'));\n let title;\n if (id) {\n title = 'Edit question';\n } else if (entity) {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const representation = useEntityPresentation(entity);\n title = `Ask a question about ${representation.primaryTitle}`;\n } else {\n title = 'Ask question';\n }\n\n return (\n <Content className=\"qetaAskPage\">\n <ContentHeader title={title}>\n <BackToQuestionsButton entityPage={entityPage} />\n </ContentHeader>\n <Grid container spacing={3} direction=\"column\">\n <Grid item>\n <InfoCard>\n <AskForm\n id={id}\n entity={entity}\n entityPage={entityPage}\n tags={tags}\n />\n </InfoCard>\n </Grid>\n </Grid>\n </Content>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;AAUO,MAAM,UAAU,MAAM;
|
|
1
|
+
{"version":3,"file":"AskPage.esm.js","sources":["../../../src/components/AskPage/AskPage.tsx"],"sourcesContent":["import { Content, ContentHeader, InfoCard } from '@backstage/core-components';\nimport { Grid } from '@material-ui/core';\nimport React from 'react';\n\nimport { AskForm } from '../AskForm/AskForm';\nimport { useParams, useSearchParams } from 'react-router-dom';\nimport { BackToQuestionsButton } from '../Buttons/BackToQuestionsButton';\nimport { useEntityPresentation } from '@backstage/plugin-catalog-react';\nimport { filterTags } from '@drodil/backstage-plugin-qeta-common';\n\nexport const AskPage = () => {\n const { id } = useParams();\n const [searchParams] = useSearchParams();\n const entity = searchParams.get('entity') ?? undefined;\n const entityPage = searchParams.get('entityPage') === 'true';\n const tags = filterTags(searchParams.get('tags'));\n let title;\n if (id) {\n title = 'Edit question';\n } else if (entity) {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const representation = useEntityPresentation(entity);\n title = `Ask a question about ${representation.primaryTitle}`;\n } else {\n title = 'Ask question';\n }\n\n return (\n <Content className=\"qetaAskPage\">\n <ContentHeader title={title}>\n <BackToQuestionsButton entityPage={entityPage} />\n </ContentHeader>\n <Grid container spacing={3} direction=\"column\">\n <Grid item>\n <InfoCard>\n <AskForm\n id={id}\n entity={entity}\n entityPage={entityPage}\n tags={tags}\n />\n </InfoCard>\n </Grid>\n </Grid>\n </Content>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;AAUO,MAAM,UAAU,MAAM;AAC3B,EAAM,MAAA,EAAE,EAAG,EAAA,GAAI,SAAU,EAAA,CAAA;AACzB,EAAM,MAAA,CAAC,YAAY,CAAA,GAAI,eAAgB,EAAA,CAAA;AACvC,EAAA,MAAM,MAAS,GAAA,YAAA,CAAa,GAAI,CAAA,QAAQ,CAAK,IAAA,KAAA,CAAA,CAAA;AAC7C,EAAA,MAAM,UAAa,GAAA,YAAA,CAAa,GAAI,CAAA,YAAY,CAAM,KAAA,MAAA,CAAA;AACtD,EAAA,MAAM,IAAO,GAAA,UAAA,CAAW,YAAa,CAAA,GAAA,CAAI,MAAM,CAAC,CAAA,CAAA;AAChD,EAAI,IAAA,KAAA,CAAA;AACJ,EAAA,IAAI,EAAI,EAAA;AACN,IAAQ,KAAA,GAAA,eAAA,CAAA;AAAA,aACC,MAAQ,EAAA;AAEjB,IAAM,MAAA,cAAA,GAAiB,sBAAsB,MAAM,CAAA,CAAA;AACnD,IAAQ,KAAA,GAAA,CAAA,qBAAA,EAAwB,eAAe,YAAY,CAAA,CAAA,CAAA;AAAA,GACtD,MAAA;AACL,IAAQ,KAAA,GAAA,cAAA,CAAA;AAAA,GACV;AAEA,EACE,uBAAA,KAAA,CAAA,aAAA,CAAC,OAAQ,EAAA,EAAA,SAAA,EAAU,aACjB,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,iBAAc,KACb,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,qBAAsB,EAAA,EAAA,UAAA,EAAwB,CACjD,CAAA,sCACC,IAAK,EAAA,EAAA,SAAA,EAAS,IAAC,EAAA,OAAA,EAAS,CAAG,EAAA,SAAA,EAAU,QACpC,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IACR,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,QACC,EAAA,IAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,EAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,MACA,IAAA;AAAA,KAAA;AAAA,GAEJ,CACF,CACF,CACF,CAAA,CAAA;AAEJ;;;;"}
|
|
@@ -8,9 +8,8 @@ import { AuthorLink } from '../Links/Links.esm.js';
|
|
|
8
8
|
import { qetaApiRef } from '../../api/QetaClient.esm.js';
|
|
9
9
|
|
|
10
10
|
const CommentList = (props) => {
|
|
11
|
-
var _a;
|
|
12
11
|
const { question, answer, onCommentDelete } = props;
|
|
13
|
-
const entity = answer
|
|
12
|
+
const entity = answer ?? question;
|
|
14
13
|
const styles = useStyles();
|
|
15
14
|
const qetaApi = useApi(qetaApiRef);
|
|
16
15
|
const deleteComment = (id) => {
|
|
@@ -22,7 +21,7 @@ const CommentList = (props) => {
|
|
|
22
21
|
}
|
|
23
22
|
qetaApi.deleteQuestionComment(question.id, id).then((q) => onCommentDelete(q));
|
|
24
23
|
};
|
|
25
|
-
return /* @__PURE__ */ React.createElement(React.Fragment, null,
|
|
24
|
+
return /* @__PURE__ */ React.createElement(React.Fragment, null, entity.comments?.map((c) => {
|
|
26
25
|
return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Box, { key: c.id, className: "qetaCommentBox" }, /* @__PURE__ */ React.createElement(
|
|
27
26
|
MarkdownContent,
|
|
28
27
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CommentList.esm.js","sources":["../../../src/components/CommentSection/CommentList.tsx"],"sourcesContent":["import {\n AnswerResponse,\n QuestionResponse,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { Box, Divider, Typography } from '@material-ui/core';\nimport React from 'react';\nimport { Link, MarkdownContent } from '@backstage/core-components';\nimport { useStyles } from '../../utils/hooks';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { RelativeTimeWithTooltip } from '../RelativeTimeWithTooltip/RelativeTimeWithTooltip';\nimport { AuthorLink } from '../Links/Links';\nimport { qetaApiRef } from '../../api';\n\nexport const CommentList = (props: {\n onCommentDelete: (\n question: QuestionResponse,\n answer?: AnswerResponse,\n ) => void;\n question: QuestionResponse;\n answer?: AnswerResponse;\n}) => {\n const { question, answer, onCommentDelete } = props;\n const entity = answer ?? question;\n const styles = useStyles();\n const qetaApi = useApi(qetaApiRef);\n\n const deleteComment = (id: number) => {\n if (answer) {\n qetaApi.deleteAnswerComment(question.id, answer.id, id).then(a => {\n onCommentDelete(question, a);\n return;\n });\n }\n qetaApi\n .deleteQuestionComment(question.id, id)\n .then(q => onCommentDelete(q));\n };\n\n return (\n <>\n {entity.comments?.map(c => {\n return (\n <>\n <Box key={c.id} className=\"qetaCommentBox\">\n <MarkdownContent\n dialect=\"gfm\"\n content={c.content}\n className={`${styles.markdownContent} inline`}\n />\n {' – '}\n <AuthorLink entity={c} />{' '}\n <Typography variant=\"caption\" className=\"qetaCommentTime\">\n <RelativeTimeWithTooltip value={c.created} />\n </Typography>\n {(c.own || c.canDelete) && (\n <>\n {' / '}\n <Link\n underline=\"none\"\n to=\"#\"\n className=\"qetaCommentDeleteBtn\"\n onClick={() => deleteComment(c.id)}\n >\n delete\n </Link>\n </>\n )}\n </Box>\n <Divider />\n </>\n );\n })}\n </>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;AAaa,MAAA,WAAA,GAAc,CAAC,KAOtB,KAAA;
|
|
1
|
+
{"version":3,"file":"CommentList.esm.js","sources":["../../../src/components/CommentSection/CommentList.tsx"],"sourcesContent":["import {\n AnswerResponse,\n QuestionResponse,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { Box, Divider, Typography } from '@material-ui/core';\nimport React from 'react';\nimport { Link, MarkdownContent } from '@backstage/core-components';\nimport { useStyles } from '../../utils/hooks';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { RelativeTimeWithTooltip } from '../RelativeTimeWithTooltip/RelativeTimeWithTooltip';\nimport { AuthorLink } from '../Links/Links';\nimport { qetaApiRef } from '../../api';\n\nexport const CommentList = (props: {\n onCommentDelete: (\n question: QuestionResponse,\n answer?: AnswerResponse,\n ) => void;\n question: QuestionResponse;\n answer?: AnswerResponse;\n}) => {\n const { question, answer, onCommentDelete } = props;\n const entity = answer ?? question;\n const styles = useStyles();\n const qetaApi = useApi(qetaApiRef);\n\n const deleteComment = (id: number) => {\n if (answer) {\n qetaApi.deleteAnswerComment(question.id, answer.id, id).then(a => {\n onCommentDelete(question, a);\n return;\n });\n }\n qetaApi\n .deleteQuestionComment(question.id, id)\n .then(q => onCommentDelete(q));\n };\n\n return (\n <>\n {entity.comments?.map(c => {\n return (\n <>\n <Box key={c.id} className=\"qetaCommentBox\">\n <MarkdownContent\n dialect=\"gfm\"\n content={c.content}\n className={`${styles.markdownContent} inline`}\n />\n {' – '}\n <AuthorLink entity={c} />{' '}\n <Typography variant=\"caption\" className=\"qetaCommentTime\">\n <RelativeTimeWithTooltip value={c.created} />\n </Typography>\n {(c.own || c.canDelete) && (\n <>\n {' / '}\n <Link\n underline=\"none\"\n to=\"#\"\n className=\"qetaCommentDeleteBtn\"\n onClick={() => deleteComment(c.id)}\n >\n delete\n </Link>\n </>\n )}\n </Box>\n <Divider />\n </>\n );\n })}\n </>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;AAaa,MAAA,WAAA,GAAc,CAAC,KAOtB,KAAA;AACJ,EAAA,MAAM,EAAE,QAAA,EAAU,MAAQ,EAAA,eAAA,EAAoB,GAAA,KAAA,CAAA;AAC9C,EAAA,MAAM,SAAS,MAAU,IAAA,QAAA,CAAA;AACzB,EAAA,MAAM,SAAS,SAAU,EAAA,CAAA;AACzB,EAAM,MAAA,OAAA,GAAU,OAAO,UAAU,CAAA,CAAA;AAEjC,EAAM,MAAA,aAAA,GAAgB,CAAC,EAAe,KAAA;AACpC,IAAA,IAAI,MAAQ,EAAA;AACV,MAAQ,OAAA,CAAA,mBAAA,CAAoB,SAAS,EAAI,EAAA,MAAA,CAAO,IAAI,EAAE,CAAA,CAAE,KAAK,CAAK,CAAA,KAAA;AAChE,QAAA,eAAA,CAAgB,UAAU,CAAC,CAAA,CAAA;AAC3B,QAAA,OAAA;AAAA,OACD,CAAA,CAAA;AAAA,KACH;AACA,IACG,OAAA,CAAA,qBAAA,CAAsB,SAAS,EAAI,EAAA,EAAE,EACrC,IAAK,CAAA,CAAA,CAAA,KAAK,eAAgB,CAAA,CAAC,CAAC,CAAA,CAAA;AAAA,GACjC,CAAA;AAEA,EAAA,uBAEK,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,EAAA,MAAA,CAAO,QAAU,EAAA,GAAA,CAAI,CAAK,CAAA,KAAA;AACzB,IAAA,iFAEK,KAAA,CAAA,aAAA,CAAA,GAAA,EAAA,EAAI,KAAK,CAAE,CAAA,EAAA,EAAI,WAAU,gBACxB,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACC,OAAQ,EAAA,KAAA;AAAA,QACR,SAAS,CAAE,CAAA,OAAA;AAAA,QACX,SAAA,EAAW,CAAG,EAAA,MAAA,CAAO,eAAe,CAAA,OAAA,CAAA;AAAA,OAAA;AAAA,KACtC,EACC,UACD,kBAAA,KAAA,CAAA,aAAA,CAAC,UAAW,EAAA,EAAA,MAAA,EAAQ,CAAG,EAAA,CAAA,EAAG,GAC1B,kBAAA,KAAA,CAAA,aAAA,CAAC,UAAW,EAAA,EAAA,OAAA,EAAQ,SAAU,EAAA,SAAA,EAAU,qCACrC,KAAA,CAAA,aAAA,CAAA,uBAAA,EAAA,EAAwB,KAAO,EAAA,CAAA,CAAE,OAAS,EAAA,CAC7C,CACE,EAAA,CAAA,CAAA,CAAE,GAAO,IAAA,CAAA,CAAE,SACX,qBAAA,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,EACG,KACD,kBAAA,KAAA,CAAA,aAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,SAAU,EAAA,MAAA;AAAA,QACV,EAAG,EAAA,GAAA;AAAA,QACH,SAAU,EAAA,sBAAA;AAAA,QACV,OAAS,EAAA,MAAM,aAAc,CAAA,CAAA,CAAE,EAAE,CAAA;AAAA,OAAA;AAAA,MAClC,QAAA;AAAA,KAGH,CAEJ,CACA,kBAAA,KAAA,CAAA,aAAA,CAAC,aAAQ,CACX,CAAA,CAAA;AAAA,GAEH,CACH,CAAA,CAAA;AAEJ;;;;"}
|
|
@@ -83,8 +83,7 @@ const HomePageContent = () => {
|
|
|
83
83
|
);
|
|
84
84
|
const [tags, setTags] = React.useState(void 0);
|
|
85
85
|
useEffect(() => {
|
|
86
|
-
|
|
87
|
-
setEntityRef((_a = searchParams.get("entity")) != null ? _a : void 0);
|
|
86
|
+
setEntityRef(searchParams.get("entity") ?? void 0);
|
|
88
87
|
setTags(filterTags(searchParams.get("tags")));
|
|
89
88
|
}, [searchParams, setEntityRef]);
|
|
90
89
|
return /* @__PURE__ */ React.createElement(Content, { className: "qetaHomePage" }, /* @__PURE__ */ React.createElement(Container, { maxWidth: "lg" }, /* @__PURE__ */ React.createElement(Grid, { container: true, spacing: 3 }, /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 12, lg: 9, xl: 10 }, /* @__PURE__ */ React.createElement(ContentHeader, { title: "All questions" }, /* @__PURE__ */ React.createElement(MoreMenu, null), /* @__PURE__ */ React.createElement(AskQuestionButton, { entity: entityRef, tags })), /* @__PURE__ */ React.createElement(QuestionsContainer, { entity: entityRef, tags })), /* @__PURE__ */ React.createElement(Grid, { item: true, lg: 3, xl: 2 }, /* @__PURE__ */ React.createElement(
|
|
@@ -120,7 +119,7 @@ const HomePage = (props) => {
|
|
|
120
119
|
headerTooltip,
|
|
121
120
|
headerType,
|
|
122
121
|
headerTypeLink
|
|
123
|
-
} = props
|
|
122
|
+
} = props ?? {};
|
|
124
123
|
return /* @__PURE__ */ React.createElement(Page, { themeId }, /* @__PURE__ */ React.createElement(
|
|
125
124
|
Header,
|
|
126
125
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HomePage.esm.js","sources":["../../../src/components/HomePage/HomePage.tsx"],"sourcesContent":["import React, { ReactNode, useEffect } from 'react';\nimport {\n Container,\n Grid,\n IconButton,\n ListItemIcon,\n Menu,\n MenuItem,\n Tooltip,\n} from '@material-ui/core';\nimport {\n Content,\n ContentHeader,\n Header,\n Page,\n} from '@backstage/core-components';\nimport { Route, Routes, useSearchParams } from 'react-router-dom';\nimport { AskPage } from '../AskPage';\nimport { QuestionPage } from '../QuestionPage/QuestionPage';\nimport { QuestionsContainer } from '../QuestionsContainer/QuestionsContainer';\nimport { TagPage } from '../TagPage/TagPage';\nimport { UserPage } from '../UserPage/UserPage';\nimport LoyaltyOutlined from '@material-ui/icons/LoyaltyOutlined';\nimport { QuestionHighlightList } from '../QuestionHighlightList/QuestionHighlightList';\nimport { useIdentityApi, useStyles } from '../../utils/hooks';\nimport Whatshot from '@material-ui/icons/Whatshot';\nimport MoreVertIcon from '@material-ui/icons/MoreVert';\nimport StarIcon from '@material-ui/icons/Star';\nimport AccountBox from '@material-ui/icons/AccountBox';\nimport { FavoritePage } from '../FavoritePage/FavoritePage';\nimport { AskQuestionButton } from '../Buttons/AskQuestionButton';\nimport { StatisticsPage, TrophyIcon } from '../Statistics';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport {\n askRouteRef,\n editQuestionRouteRef,\n favoriteQuestionsRouteRef,\n questionRouteRef,\n statisticsRouteRef,\n tagRouteRef,\n tagsRouteRef,\n userRouteRef,\n} from '@drodil/backstage-plugin-qeta-react';\nimport { filterTags } from '@drodil/backstage-plugin-qeta-common';\n\nconst MoreMenu = () => {\n const [anchorEl, setAnchorEl] = React.useState(null);\n const tagsRoute = useRouteRef(tagsRouteRef);\n const favoritesRoute = useRouteRef(favoriteQuestionsRouteRef);\n const statisticsRoute = useRouteRef(statisticsRouteRef);\n const userRoute = useRouteRef(userRouteRef);\n const open = Boolean(anchorEl);\n const styles = useStyles();\n const {\n value: user,\n loading: loadingUser,\n error: userError,\n } = useIdentityApi(api => api.getBackstageIdentity(), []);\n\n const handleMenuOpen = (event: any) => {\n setAnchorEl(event.currentTarget);\n };\n\n const handleMenuClose = () => {\n setAnchorEl(null);\n };\n\n return (\n <>\n <Tooltip arrow title=\"More\">\n <IconButton\n aria-label=\"more\"\n aria-controls=\"long-menu\"\n aria-haspopup=\"true\"\n onClick={handleMenuOpen}\n >\n <MoreVertIcon />\n </IconButton>\n </Tooltip>\n <Menu\n id=\"long-menu\"\n anchorEl={anchorEl}\n keepMounted\n open={open}\n getContentAnchorEl={null}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'center',\n }}\n transformOrigin={{\n vertical: 'top',\n horizontal: 'center',\n }}\n onClose={handleMenuClose}\n >\n <MenuItem component=\"a\" href={tagsRoute()}>\n <ListItemIcon className={styles.menuIcon}>\n <LoyaltyOutlined fontSize=\"small\" />\n </ListItemIcon>\n Tags\n </MenuItem>\n {user && !loadingUser && !userError && (\n <MenuItem component=\"a\" href={`${userRoute()}/${user.userEntityRef}`}>\n <ListItemIcon className={styles.menuIcon}>\n <AccountBox fontSize=\"small\" />\n </ListItemIcon>\n My questions\n </MenuItem>\n )}\n <MenuItem component=\"a\" href={favoritesRoute()}>\n <ListItemIcon className={styles.menuIcon}>\n <StarIcon fontSize=\"small\" />\n </ListItemIcon>\n Favorite questions\n </MenuItem>\n <MenuItem component=\"a\" href={statisticsRoute()}>\n <ListItemIcon className={styles.menuIcon}>\n <TrophyIcon />\n </ListItemIcon>\n Statistics\n </MenuItem>\n </Menu>\n </>\n );\n};\n\nexport const HomePageContent = () => {\n const [searchParams] = useSearchParams();\n const [entityRef, setEntityRef] = React.useState<string | undefined>(\n undefined,\n );\n const [tags, setTags] = React.useState<string[] | undefined>(undefined);\n useEffect(() => {\n setEntityRef(searchParams.get('entity') ?? undefined);\n setTags(filterTags(searchParams.get('tags')));\n }, [searchParams, setEntityRef]);\n\n return (\n <Content className=\"qetaHomePage\">\n <Container maxWidth=\"lg\">\n <Grid container spacing={3}>\n <Grid item xs={12} lg={9} xl={10}>\n <ContentHeader title=\"All questions\">\n <MoreMenu />\n <AskQuestionButton entity={entityRef} tags={tags} />\n </ContentHeader>\n <QuestionsContainer entity={entityRef} tags={tags} />\n </Grid>\n <Grid item lg={3} xl={2}>\n <QuestionHighlightList\n type=\"hot\"\n title=\"Hot questions\"\n noQuestionsLabel=\"No questions\"\n icon={<Whatshot fontSize=\"small\" />}\n />\n <QuestionHighlightList\n type=\"unanswered\"\n title=\"Unanswered questions\"\n noQuestionsLabel=\"No unanswered questions\"\n />\n <QuestionHighlightList\n type=\"incorrect\"\n title=\"Questions without correct answer\"\n noQuestionsLabel=\"No questions without correct answers\"\n />\n </Grid>\n </Grid>\n </Container>\n </Content>\n );\n};\n\ntype Props = {\n title?: string;\n subtitle?: string;\n headerElements?: ReactNode[];\n themeId?: string;\n headerTooltip?: string;\n headerType?: string;\n headerTypeLink?: string;\n};\n\nexport const HomePage = (props?: Props) => {\n const {\n title = 'Q&A',\n subtitle,\n headerElements,\n themeId = 'tool',\n headerTooltip,\n headerType,\n headerTypeLink,\n } = props ?? {};\n\n return (\n <Page themeId={themeId}>\n <Header\n title={title}\n subtitle={subtitle}\n type={headerType}\n typeLink={headerTypeLink}\n tooltip={headerTooltip}\n >\n {headerElements}\n </Header>\n <Routes>\n <Route path=\"/\" element={<HomePageContent />} />\n <Route path={askRouteRef.path} element={<AskPage />} />\n <Route\n path={favoriteQuestionsRouteRef.path}\n element={<FavoritePage />}\n />\n <Route path={editQuestionRouteRef.path} element={<AskPage />} />\n <Route path={questionRouteRef.path} element={<QuestionPage />} />\n <Route path={tagsRouteRef.path} element={<TagPage />} />\n <Route path={tagRouteRef.path} element={<TagPage />} />\n <Route path={userRouteRef.path} element={<UserPage />} />\n <Route path={statisticsRouteRef.path} element={<StatisticsPage />} />\n </Routes>\n </Page>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"HomePage.esm.js","sources":["../../../src/components/HomePage/HomePage.tsx"],"sourcesContent":["import React, { ReactNode, useEffect } from 'react';\nimport {\n Container,\n Grid,\n IconButton,\n ListItemIcon,\n Menu,\n MenuItem,\n Tooltip,\n} from '@material-ui/core';\nimport {\n Content,\n ContentHeader,\n Header,\n Page,\n} from '@backstage/core-components';\nimport { Route, Routes, useSearchParams } from 'react-router-dom';\nimport { AskPage } from '../AskPage';\nimport { QuestionPage } from '../QuestionPage/QuestionPage';\nimport { QuestionsContainer } from '../QuestionsContainer/QuestionsContainer';\nimport { TagPage } from '../TagPage/TagPage';\nimport { UserPage } from '../UserPage/UserPage';\nimport LoyaltyOutlined from '@material-ui/icons/LoyaltyOutlined';\nimport { QuestionHighlightList } from '../QuestionHighlightList/QuestionHighlightList';\nimport { useIdentityApi, useStyles } from '../../utils/hooks';\nimport Whatshot from '@material-ui/icons/Whatshot';\nimport MoreVertIcon from '@material-ui/icons/MoreVert';\nimport StarIcon from '@material-ui/icons/Star';\nimport AccountBox from '@material-ui/icons/AccountBox';\nimport { FavoritePage } from '../FavoritePage/FavoritePage';\nimport { AskQuestionButton } from '../Buttons/AskQuestionButton';\nimport { StatisticsPage, TrophyIcon } from '../Statistics';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport {\n askRouteRef,\n editQuestionRouteRef,\n favoriteQuestionsRouteRef,\n questionRouteRef,\n statisticsRouteRef,\n tagRouteRef,\n tagsRouteRef,\n userRouteRef,\n} from '@drodil/backstage-plugin-qeta-react';\nimport { filterTags } from '@drodil/backstage-plugin-qeta-common';\n\nconst MoreMenu = () => {\n const [anchorEl, setAnchorEl] = React.useState(null);\n const tagsRoute = useRouteRef(tagsRouteRef);\n const favoritesRoute = useRouteRef(favoriteQuestionsRouteRef);\n const statisticsRoute = useRouteRef(statisticsRouteRef);\n const userRoute = useRouteRef(userRouteRef);\n const open = Boolean(anchorEl);\n const styles = useStyles();\n const {\n value: user,\n loading: loadingUser,\n error: userError,\n } = useIdentityApi(api => api.getBackstageIdentity(), []);\n\n const handleMenuOpen = (event: any) => {\n setAnchorEl(event.currentTarget);\n };\n\n const handleMenuClose = () => {\n setAnchorEl(null);\n };\n\n return (\n <>\n <Tooltip arrow title=\"More\">\n <IconButton\n aria-label=\"more\"\n aria-controls=\"long-menu\"\n aria-haspopup=\"true\"\n onClick={handleMenuOpen}\n >\n <MoreVertIcon />\n </IconButton>\n </Tooltip>\n <Menu\n id=\"long-menu\"\n anchorEl={anchorEl}\n keepMounted\n open={open}\n getContentAnchorEl={null}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'center',\n }}\n transformOrigin={{\n vertical: 'top',\n horizontal: 'center',\n }}\n onClose={handleMenuClose}\n >\n <MenuItem component=\"a\" href={tagsRoute()}>\n <ListItemIcon className={styles.menuIcon}>\n <LoyaltyOutlined fontSize=\"small\" />\n </ListItemIcon>\n Tags\n </MenuItem>\n {user && !loadingUser && !userError && (\n <MenuItem component=\"a\" href={`${userRoute()}/${user.userEntityRef}`}>\n <ListItemIcon className={styles.menuIcon}>\n <AccountBox fontSize=\"small\" />\n </ListItemIcon>\n My questions\n </MenuItem>\n )}\n <MenuItem component=\"a\" href={favoritesRoute()}>\n <ListItemIcon className={styles.menuIcon}>\n <StarIcon fontSize=\"small\" />\n </ListItemIcon>\n Favorite questions\n </MenuItem>\n <MenuItem component=\"a\" href={statisticsRoute()}>\n <ListItemIcon className={styles.menuIcon}>\n <TrophyIcon />\n </ListItemIcon>\n Statistics\n </MenuItem>\n </Menu>\n </>\n );\n};\n\nexport const HomePageContent = () => {\n const [searchParams] = useSearchParams();\n const [entityRef, setEntityRef] = React.useState<string | undefined>(\n undefined,\n );\n const [tags, setTags] = React.useState<string[] | undefined>(undefined);\n useEffect(() => {\n setEntityRef(searchParams.get('entity') ?? undefined);\n setTags(filterTags(searchParams.get('tags')));\n }, [searchParams, setEntityRef]);\n\n return (\n <Content className=\"qetaHomePage\">\n <Container maxWidth=\"lg\">\n <Grid container spacing={3}>\n <Grid item xs={12} lg={9} xl={10}>\n <ContentHeader title=\"All questions\">\n <MoreMenu />\n <AskQuestionButton entity={entityRef} tags={tags} />\n </ContentHeader>\n <QuestionsContainer entity={entityRef} tags={tags} />\n </Grid>\n <Grid item lg={3} xl={2}>\n <QuestionHighlightList\n type=\"hot\"\n title=\"Hot questions\"\n noQuestionsLabel=\"No questions\"\n icon={<Whatshot fontSize=\"small\" />}\n />\n <QuestionHighlightList\n type=\"unanswered\"\n title=\"Unanswered questions\"\n noQuestionsLabel=\"No unanswered questions\"\n />\n <QuestionHighlightList\n type=\"incorrect\"\n title=\"Questions without correct answer\"\n noQuestionsLabel=\"No questions without correct answers\"\n />\n </Grid>\n </Grid>\n </Container>\n </Content>\n );\n};\n\ntype Props = {\n title?: string;\n subtitle?: string;\n headerElements?: ReactNode[];\n themeId?: string;\n headerTooltip?: string;\n headerType?: string;\n headerTypeLink?: string;\n};\n\nexport const HomePage = (props?: Props) => {\n const {\n title = 'Q&A',\n subtitle,\n headerElements,\n themeId = 'tool',\n headerTooltip,\n headerType,\n headerTypeLink,\n } = props ?? {};\n\n return (\n <Page themeId={themeId}>\n <Header\n title={title}\n subtitle={subtitle}\n type={headerType}\n typeLink={headerTypeLink}\n tooltip={headerTooltip}\n >\n {headerElements}\n </Header>\n <Routes>\n <Route path=\"/\" element={<HomePageContent />} />\n <Route path={askRouteRef.path} element={<AskPage />} />\n <Route\n path={favoriteQuestionsRouteRef.path}\n element={<FavoritePage />}\n />\n <Route path={editQuestionRouteRef.path} element={<AskPage />} />\n <Route path={questionRouteRef.path} element={<QuestionPage />} />\n <Route path={tagsRouteRef.path} element={<TagPage />} />\n <Route path={tagRouteRef.path} element={<TagPage />} />\n <Route path={userRouteRef.path} element={<UserPage />} />\n <Route path={statisticsRouteRef.path} element={<StatisticsPage />} />\n </Routes>\n </Page>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -19,7 +19,6 @@ const MarkdownEditor = (props) => {
|
|
|
19
19
|
const qetaApi = useApi(qetaApiRef);
|
|
20
20
|
const imageUpload = () => {
|
|
21
21
|
return async function* (data) {
|
|
22
|
-
var _a, _b;
|
|
23
22
|
const fileType = await FileType.fromBuffer(data);
|
|
24
23
|
const mimeType = fileType ? fileType.mime : "text/plain";
|
|
25
24
|
const attachment = await qetaApi.postAttachment(
|
|
@@ -28,7 +27,7 @@ const MarkdownEditor = (props) => {
|
|
|
28
27
|
if ("errors" in attachment) {
|
|
29
28
|
errorApi.post({
|
|
30
29
|
name: "Upload failed",
|
|
31
|
-
message:
|
|
30
|
+
message: attachment.errors?.map((e) => e.message).join(", ") ?? ""
|
|
32
31
|
});
|
|
33
32
|
return false;
|
|
34
33
|
}
|
|
@@ -37,7 +36,7 @@ const MarkdownEditor = (props) => {
|
|
|
37
36
|
return true;
|
|
38
37
|
};
|
|
39
38
|
};
|
|
40
|
-
const isUploadDisabled =
|
|
39
|
+
const isUploadDisabled = config?.getOptionalBoolean("qeta.storage.disabled") || false;
|
|
41
40
|
return /* @__PURE__ */ React.createElement(
|
|
42
41
|
ReactMde,
|
|
43
42
|
{
|