@drodil/backstage-plugin-qeta 2.4.1 → 2.5.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/api/QetaClient.esm.js +19 -9
- package/dist/api/QetaClient.esm.js.map +1 -1
- package/dist/components/AnswersContainer/AnswerList.esm.js +99 -0
- package/dist/components/AnswersContainer/AnswerList.esm.js.map +1 -0
- package/dist/components/AnswersContainer/AnswerListItem.esm.js +86 -0
- package/dist/components/AnswersContainer/AnswerListItem.esm.js.map +1 -0
- package/dist/components/AnswersContainer/AnswersContainer.esm.js +214 -0
- package/dist/components/AnswersContainer/AnswersContainer.esm.js.map +1 -0
- 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 +4 -5
- 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 +7 -5
- 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 +9 -8
- 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 +10 -8
- 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 +8 -11
- 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 +22 -8
- package/dist/components/UserPage/UserPage.esm.js.map +1 -1
- package/dist/index.d.ts +59 -29
- package/dist/index.esm.js +3 -0
- package/dist/index.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
|
}
|
|
@@ -330,6 +324,22 @@ class QetaClient {
|
|
|
330
324
|
}
|
|
331
325
|
return data;
|
|
332
326
|
}
|
|
327
|
+
async getAnswers(options) {
|
|
328
|
+
const query = this.getQueryParameters(options).toString();
|
|
329
|
+
let url = `${await this.getBaseUrl()}/answers`;
|
|
330
|
+
if (query) {
|
|
331
|
+
url += `?${query}`;
|
|
332
|
+
}
|
|
333
|
+
const response = await this.fetchApi.fetch(url);
|
|
334
|
+
if (response.status === 403) {
|
|
335
|
+
return { answers: [], total: 0 };
|
|
336
|
+
}
|
|
337
|
+
const data = await response.json();
|
|
338
|
+
if ("errors" in data) {
|
|
339
|
+
throw new QetaError("Failed to fetch", data.errors);
|
|
340
|
+
}
|
|
341
|
+
return data;
|
|
342
|
+
}
|
|
333
343
|
async getAnswer(questionId, id) {
|
|
334
344
|
if (!questionId || !id) {
|
|
335
345
|
throw new QetaError("Invalid id provided", void 0);
|
|
@@ -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 { GetAnswersOptions, GetQuestionsOptions, 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 AnswersResponse,\n AnswersResponseBody,\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: GetQuestionsOptions): 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 getAnswers(options: GetAnswersOptions): Promise<AnswersResponse> {\n const query = this.getQueryParameters(options).toString();\n\n let url = `${await this.getBaseUrl()}/answers`;\n if (query) {\n url += `?${query}`;\n }\n\n const response = await this.fetchApi.fetch(url);\n if (response.status === 403) {\n return { answers: [], total: 0 };\n }\n const data = (await response.json()) as AnswersResponseBody;\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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"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { useStyles } from '../../utils/hooks.esm.js';
|
|
2
|
+
import { Progress, WarningPanel } from '@backstage/core-components';
|
|
3
|
+
import { Card, CardContent, Grid, Typography, Box, Divider, Tooltip, FormControl, Select, MenuItem } from '@material-ui/core';
|
|
4
|
+
import React, { useRef, useState, useEffect } from 'react';
|
|
5
|
+
import { Pagination } from '@material-ui/lab';
|
|
6
|
+
import { AnswerListItem } from './AnswerListItem.esm.js';
|
|
7
|
+
|
|
8
|
+
const AnswerList = (props) => {
|
|
9
|
+
const {
|
|
10
|
+
loading,
|
|
11
|
+
error,
|
|
12
|
+
response,
|
|
13
|
+
onPageChange,
|
|
14
|
+
entity,
|
|
15
|
+
page,
|
|
16
|
+
onPageSizeChange
|
|
17
|
+
} = props;
|
|
18
|
+
const styles = useStyles();
|
|
19
|
+
const listRef = useRef(null);
|
|
20
|
+
const [initialLoad, setInitialLoad] = useState(true);
|
|
21
|
+
useEffect(() => {
|
|
22
|
+
if (!initialLoad) {
|
|
23
|
+
setInitialLoad(false);
|
|
24
|
+
}
|
|
25
|
+
}, [initialLoad, loading]);
|
|
26
|
+
const handlePageChange = (_event, value) => {
|
|
27
|
+
if (listRef.current) {
|
|
28
|
+
listRef.current.scrollIntoView();
|
|
29
|
+
}
|
|
30
|
+
onPageChange(value);
|
|
31
|
+
};
|
|
32
|
+
const handlePageSizeChange = (event) => {
|
|
33
|
+
if (listRef.current) {
|
|
34
|
+
listRef.current.scrollIntoView();
|
|
35
|
+
}
|
|
36
|
+
onPageSizeChange(Number.parseInt(event.target.value, 10));
|
|
37
|
+
};
|
|
38
|
+
if (loading && initialLoad) {
|
|
39
|
+
return /* @__PURE__ */ React.createElement(Progress, null);
|
|
40
|
+
}
|
|
41
|
+
if (error || response === void 0) {
|
|
42
|
+
return /* @__PURE__ */ React.createElement(WarningPanel, { severity: "error", title: "Could not load answers." }, error?.message);
|
|
43
|
+
}
|
|
44
|
+
if (initialLoad && (!response.answers || response.answers.length === 0)) {
|
|
45
|
+
return /* @__PURE__ */ React.createElement(Card, { style: { marginTop: "2rem" } }, /* @__PURE__ */ React.createElement(CardContent, null, /* @__PURE__ */ React.createElement(
|
|
46
|
+
Grid,
|
|
47
|
+
{
|
|
48
|
+
container: true,
|
|
49
|
+
justifyContent: "center",
|
|
50
|
+
alignItems: "center",
|
|
51
|
+
direction: "column"
|
|
52
|
+
},
|
|
53
|
+
/* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(Typography, { variant: "h6" }, "No answers found"))
|
|
54
|
+
)));
|
|
55
|
+
}
|
|
56
|
+
const pageCount = response.total < props.pageSize ? 1 : Math.ceil(response.total / props.pageSize);
|
|
57
|
+
return /* @__PURE__ */ React.createElement("div", { ref: listRef }, /* @__PURE__ */ React.createElement(Box, { sx: { mt: 2 }, className: "qetaAnswerList" }, /* @__PURE__ */ React.createElement(Grid, { container: true, spacing: 2, className: "qetaAnswerListGrid" }, response.answers.map((answer) => {
|
|
58
|
+
return /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 12, key: answer.id }, /* @__PURE__ */ React.createElement(AnswerListItem, { answer, entity }), /* @__PURE__ */ React.createElement(Divider, null));
|
|
59
|
+
})), /* @__PURE__ */ React.createElement(
|
|
60
|
+
Grid,
|
|
61
|
+
{
|
|
62
|
+
container: true,
|
|
63
|
+
spacing: 0,
|
|
64
|
+
className: `qetaAnswerListPaginationGrid ${styles.questionListPagination}`,
|
|
65
|
+
alignItems: "center",
|
|
66
|
+
justifyContent: "space-between"
|
|
67
|
+
},
|
|
68
|
+
/* @__PURE__ */ React.createElement(Tooltip, { title: "Answers per page", arrow: true }, /* @__PURE__ */ React.createElement(FormControl, { variant: "filled" }, /* @__PURE__ */ React.createElement(
|
|
69
|
+
Select,
|
|
70
|
+
{
|
|
71
|
+
value: props.pageSize,
|
|
72
|
+
onChange: handlePageSizeChange,
|
|
73
|
+
className: `qetaAnswerListPaginationSizeSelect ${styles.questionsPerPage}`,
|
|
74
|
+
inputProps: { className: styles.questionsPerPageInput }
|
|
75
|
+
},
|
|
76
|
+
/* @__PURE__ */ React.createElement(MenuItem, { value: 5 }, "5"),
|
|
77
|
+
/* @__PURE__ */ React.createElement(MenuItem, { value: 10 }, "10"),
|
|
78
|
+
/* @__PURE__ */ React.createElement(MenuItem, { value: 25 }, "25"),
|
|
79
|
+
/* @__PURE__ */ React.createElement(MenuItem, { value: 50 }, "50"),
|
|
80
|
+
/* @__PURE__ */ React.createElement(MenuItem, { value: 100 }, "100")
|
|
81
|
+
))),
|
|
82
|
+
/* @__PURE__ */ React.createElement(
|
|
83
|
+
Pagination,
|
|
84
|
+
{
|
|
85
|
+
page,
|
|
86
|
+
onChange: handlePageChange,
|
|
87
|
+
count: pageCount,
|
|
88
|
+
size: "large",
|
|
89
|
+
variant: "outlined",
|
|
90
|
+
className: "qetaAnswerListPagination",
|
|
91
|
+
showFirstButton: true,
|
|
92
|
+
showLastButton: true
|
|
93
|
+
}
|
|
94
|
+
)
|
|
95
|
+
)));
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
export { AnswerList };
|
|
99
|
+
//# sourceMappingURL=AnswerList.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AnswerList.esm.js","sources":["../../../src/components/AnswersContainer/AnswerList.tsx"],"sourcesContent":["import { useStyles } from '../../utils/hooks';\nimport { Progress, WarningPanel } from '@backstage/core-components';\nimport {\n Box,\n Card,\n CardContent,\n Divider,\n FormControl,\n Grid,\n MenuItem,\n Select,\n Tooltip,\n Typography,\n} from '@material-ui/core';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Pagination } from '@material-ui/lab';\nimport { AnswersResponse } from '@drodil/backstage-plugin-qeta-common';\nimport { AnswerListItem } from './AnswerListItem';\n\nexport const AnswerList = (props: {\n loading: boolean;\n error: any;\n response?: AnswersResponse;\n onPageChange: (page: number) => void;\n onPageSizeChange: (size: number) => void;\n page: number;\n pageSize: number;\n entity?: string;\n tags?: string[];\n entityPage?: boolean;\n}) => {\n const {\n loading,\n error,\n response,\n onPageChange,\n entity,\n page,\n onPageSizeChange,\n } = props;\n const styles = useStyles();\n const listRef = useRef<HTMLDivElement | null>(null);\n const [initialLoad, setInitialLoad] = useState(true);\n\n useEffect(() => {\n if (!initialLoad) {\n setInitialLoad(false);\n }\n }, [initialLoad, loading]);\n\n const handlePageChange = (\n _event: React.ChangeEvent<unknown>,\n value: number,\n ) => {\n if (listRef.current) {\n listRef.current.scrollIntoView();\n }\n onPageChange(value);\n };\n\n const handlePageSizeChange = (\n event: React.ChangeEvent<{ value: unknown }>,\n ) => {\n if (listRef.current) {\n listRef.current.scrollIntoView();\n }\n onPageSizeChange(Number.parseInt(event.target.value as string, 10));\n };\n\n if (loading && initialLoad) {\n return <Progress />;\n }\n\n if (error || response === undefined) {\n return (\n <WarningPanel severity=\"error\" title=\"Could not load answers.\">\n {error?.message}\n </WarningPanel>\n );\n }\n\n if (initialLoad && (!response.answers || response.answers.length === 0)) {\n return (\n <Card style={{ marginTop: '2rem' }}>\n <CardContent>\n <Grid\n container\n justifyContent=\"center\"\n alignItems=\"center\"\n direction=\"column\"\n >\n <Grid item>\n <Typography variant=\"h6\">No answers found</Typography>\n </Grid>\n </Grid>\n </CardContent>\n </Card>\n );\n }\n\n const pageCount =\n response.total < props.pageSize\n ? 1\n : Math.ceil(response.total / props.pageSize);\n\n return (\n <div ref={listRef}>\n <Box sx={{ mt: 2 }} className=\"qetaAnswerList\">\n <Grid container spacing={2} className=\"qetaAnswerListGrid\">\n {response.answers.map(answer => {\n return (\n <Grid item xs={12} key={answer.id}>\n <AnswerListItem answer={answer} entity={entity} />\n <Divider />\n </Grid>\n );\n })}\n </Grid>\n <Grid\n container\n spacing={0}\n className={`qetaAnswerListPaginationGrid ${styles.questionListPagination}`}\n alignItems=\"center\"\n justifyContent=\"space-between\"\n >\n <Tooltip title=\"Answers per page\" arrow>\n <FormControl variant=\"filled\">\n <Select\n value={props.pageSize}\n onChange={handlePageSizeChange}\n className={`qetaAnswerListPaginationSizeSelect ${styles.questionsPerPage}`}\n inputProps={{ className: styles.questionsPerPageInput }}\n >\n <MenuItem value={5}>5</MenuItem>\n <MenuItem value={10}>10</MenuItem>\n <MenuItem value={25}>25</MenuItem>\n <MenuItem value={50}>50</MenuItem>\n <MenuItem value={100}>100</MenuItem>\n </Select>\n </FormControl>\n </Tooltip>\n <Pagination\n page={page}\n onChange={handlePageChange}\n count={pageCount}\n size=\"large\"\n variant=\"outlined\"\n className=\"qetaAnswerListPagination\"\n showFirstButton\n showLastButton\n />\n </Grid>\n </Box>\n </div>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { Card, CardContent, Box, Typography, Avatar } from '@material-ui/core';
|
|
2
|
+
import { Link } from '@backstage/core-components';
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import DOMPurify from 'dompurify';
|
|
5
|
+
import { truncate, removeMarkdownFormatting } from '../../utils/utils.esm.js';
|
|
6
|
+
import { useRouteRef } from '@backstage/core-plugin-api';
|
|
7
|
+
import { questionRouteRef, userRouteRef } from '@drodil/backstage-plugin-qeta-react';
|
|
8
|
+
import { RelativeTimeWithTooltip } from '../RelativeTimeWithTooltip/RelativeTimeWithTooltip.esm.js';
|
|
9
|
+
import { useStyles, useEntityAuthor } from '../../utils/hooks.esm.js';
|
|
10
|
+
import { TagsAndEntities } from '../QuestionPage/TagsAndEntities.esm.js';
|
|
11
|
+
|
|
12
|
+
const AnswerListItem = (props) => {
|
|
13
|
+
const { answer, entity } = props;
|
|
14
|
+
const questionRoute = useRouteRef(questionRouteRef);
|
|
15
|
+
const userRoute = useRouteRef(userRouteRef);
|
|
16
|
+
const styles = useStyles();
|
|
17
|
+
const { name, initials, user } = useEntityAuthor(answer);
|
|
18
|
+
const getAnswerLink = () => {
|
|
19
|
+
return entity ? `${questionRoute({
|
|
20
|
+
id: answer.questionId.toString(10)
|
|
21
|
+
})}?entity=${entity}#answer_${answer.id}` : `${questionRoute({
|
|
22
|
+
id: answer.questionId.toString(10)
|
|
23
|
+
})}/#answer_${answer.id}`;
|
|
24
|
+
};
|
|
25
|
+
return /* @__PURE__ */ React.createElement(Card, { className: "qetaQuestionListItem" }, /* @__PURE__ */ React.createElement(CardContent, null, /* @__PURE__ */ React.createElement(Box, { className: styles.questionListItemStats }, /* @__PURE__ */ React.createElement(
|
|
26
|
+
Typography,
|
|
27
|
+
{
|
|
28
|
+
display: "block",
|
|
29
|
+
variant: "caption",
|
|
30
|
+
className: "qetaQuestionListItemScore"
|
|
31
|
+
},
|
|
32
|
+
answer.score,
|
|
33
|
+
" score"
|
|
34
|
+
)), /* @__PURE__ */ React.createElement(Box, { className: styles.questionListItemContent }, /* @__PURE__ */ React.createElement(Typography, { variant: "h5", component: "div" }, /* @__PURE__ */ React.createElement(
|
|
35
|
+
Link,
|
|
36
|
+
{
|
|
37
|
+
to: getAnswerLink(),
|
|
38
|
+
className: "qetaAnswerListItemQuestionBtn"
|
|
39
|
+
},
|
|
40
|
+
"Q: ",
|
|
41
|
+
answer.question?.title
|
|
42
|
+
)), /* @__PURE__ */ React.createElement(
|
|
43
|
+
Typography,
|
|
44
|
+
{
|
|
45
|
+
variant: "caption",
|
|
46
|
+
noWrap: true,
|
|
47
|
+
component: "div",
|
|
48
|
+
className: "qetaQuestionListItemContent",
|
|
49
|
+
style: { marginBottom: "5px" }
|
|
50
|
+
},
|
|
51
|
+
DOMPurify.sanitize(
|
|
52
|
+
truncate(removeMarkdownFormatting(answer.content), 150)
|
|
53
|
+
)
|
|
54
|
+
), answer.question && /* @__PURE__ */ React.createElement(TagsAndEntities, { question: answer.question }), /* @__PURE__ */ React.createElement(
|
|
55
|
+
Typography,
|
|
56
|
+
{
|
|
57
|
+
variant: "caption",
|
|
58
|
+
display: "inline",
|
|
59
|
+
className: `${styles.questionListItemAuthor} qetaAnswerListItemAuthor`
|
|
60
|
+
},
|
|
61
|
+
/* @__PURE__ */ React.createElement(
|
|
62
|
+
Avatar,
|
|
63
|
+
{
|
|
64
|
+
src: user?.spec?.profile?.picture,
|
|
65
|
+
className: styles.questionListItemAvatar,
|
|
66
|
+
alt: name,
|
|
67
|
+
variant: "rounded"
|
|
68
|
+
},
|
|
69
|
+
initials
|
|
70
|
+
),
|
|
71
|
+
answer.author === "anonymous" ? "Anonymous" : /* @__PURE__ */ React.createElement(Link, { to: `${userRoute()}/${answer.author}` }, name),
|
|
72
|
+
" ",
|
|
73
|
+
/* @__PURE__ */ React.createElement(
|
|
74
|
+
Link,
|
|
75
|
+
{
|
|
76
|
+
to: getAnswerLink(),
|
|
77
|
+
className: "qetaQuestionListItemQuestionBtn"
|
|
78
|
+
},
|
|
79
|
+
"answered ",
|
|
80
|
+
/* @__PURE__ */ React.createElement(RelativeTimeWithTooltip, { value: answer.created })
|
|
81
|
+
)
|
|
82
|
+
))));
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
export { AnswerListItem };
|
|
86
|
+
//# sourceMappingURL=AnswerListItem.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AnswerListItem.esm.js","sources":["../../../src/components/AnswersContainer/AnswerListItem.tsx"],"sourcesContent":["import { Avatar, Box, Card, CardContent, Typography } from '@material-ui/core';\nimport { Link } from '@backstage/core-components';\nimport React from 'react';\nimport DOMPurify from 'dompurify';\nimport { removeMarkdownFormatting, truncate } from '../../utils/utils';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport {\n questionRouteRef,\n userRouteRef,\n} from '@drodil/backstage-plugin-qeta-react';\nimport { RelativeTimeWithTooltip } from '../RelativeTimeWithTooltip/RelativeTimeWithTooltip';\nimport { AnswerResponse } from '@drodil/backstage-plugin-qeta-common';\nimport { useEntityAuthor, useStyles } from '../../utils/hooks';\nimport { TagsAndEntities } from '../QuestionPage/TagsAndEntities';\n\nexport interface AnswerListItemProps {\n answer: AnswerResponse;\n entity?: string;\n}\n\nexport const AnswerListItem = (props: AnswerListItemProps) => {\n const { answer, entity } = props;\n\n const questionRoute = useRouteRef(questionRouteRef);\n const userRoute = useRouteRef(userRouteRef);\n const styles = useStyles();\n const { name, initials, user } = useEntityAuthor(answer);\n\n const getAnswerLink = () => {\n return entity\n ? `${questionRoute({\n id: answer.questionId.toString(10),\n })}?entity=${entity}#answer_${answer.id}`\n : `${questionRoute({\n id: answer.questionId.toString(10),\n })}/#answer_${answer.id}`;\n };\n\n return (\n <Card className=\"qetaQuestionListItem\">\n <CardContent>\n <Box className={styles.questionListItemStats}>\n <Typography\n display=\"block\"\n variant=\"caption\"\n className=\"qetaQuestionListItemScore\"\n >\n {answer.score} score\n </Typography>\n </Box>\n <Box className={styles.questionListItemContent}>\n <Typography variant=\"h5\" component=\"div\">\n <Link\n to={getAnswerLink()}\n className=\"qetaAnswerListItemQuestionBtn\"\n >\n Q: {answer.question?.title}\n </Link>\n </Typography>\n <Typography\n variant=\"caption\"\n noWrap\n component=\"div\"\n className=\"qetaQuestionListItemContent\"\n style={{ marginBottom: '5px' }}\n >\n {DOMPurify.sanitize(\n truncate(removeMarkdownFormatting(answer.content), 150),\n )}\n </Typography>\n {answer.question && <TagsAndEntities question={answer.question} />}\n <Typography\n variant=\"caption\"\n display=\"inline\"\n className={`${styles.questionListItemAuthor} qetaAnswerListItemAuthor`}\n >\n <Avatar\n src={user?.spec?.profile?.picture}\n className={styles.questionListItemAvatar}\n alt={name}\n variant=\"rounded\"\n >\n {initials}\n </Avatar>\n {answer.author === 'anonymous' ? (\n 'Anonymous'\n ) : (\n <Link to={`${userRoute()}/${answer.author}`}>{name}</Link>\n )}{' '}\n <Link\n to={getAnswerLink()}\n className=\"qetaQuestionListItemQuestionBtn\"\n >\n {'answered '}\n <RelativeTimeWithTooltip value={answer.created} />\n </Link>\n </Typography>\n </Box>\n </CardContent>\n </Card>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { useQetaApi } from '../../utils/hooks.esm.js';
|
|
2
|
+
import { Box, Typography, Grid, TextField, Button, Collapse } from '@material-ui/core';
|
|
3
|
+
import React, { useEffect } from 'react';
|
|
4
|
+
import useDebounce from 'react-use/lib/useDebounce';
|
|
5
|
+
import FilterList from '@material-ui/icons/FilterList';
|
|
6
|
+
import { useSearchParams } from 'react-router-dom';
|
|
7
|
+
import { EntityRefLink } from '@backstage/plugin-catalog-react';
|
|
8
|
+
import { useAnalytics } from '@backstage/core-plugin-api';
|
|
9
|
+
import { filterTags } from '@drodil/backstage-plugin-qeta-common';
|
|
10
|
+
import { getFiltersWithDateRange } from '../../utils/utils.esm.js';
|
|
11
|
+
import { filterKeys, FilterPanel } from '../QuestionsContainer/FilterPanel.esm.js';
|
|
12
|
+
import { AnswerList } from './AnswerList.esm.js';
|
|
13
|
+
|
|
14
|
+
const AnswersContainer = (props) => {
|
|
15
|
+
const { tags, author, entity, showFilters, showTitle, title } = props;
|
|
16
|
+
const analytics = useAnalytics();
|
|
17
|
+
const [page, setPage] = React.useState(1);
|
|
18
|
+
const [answersPerPage, setAnswersPerPage] = React.useState(10);
|
|
19
|
+
const [showFilterPanel, setShowFilterPanel] = React.useState(false);
|
|
20
|
+
const [searchParams, setSearchParams] = useSearchParams();
|
|
21
|
+
const [searchQuery, setSearchQuery] = React.useState("");
|
|
22
|
+
const [filters, setFilters] = React.useState({
|
|
23
|
+
order: "desc",
|
|
24
|
+
orderBy: "created",
|
|
25
|
+
searchQuery: "",
|
|
26
|
+
dateRange: "",
|
|
27
|
+
noCorrectAnswer: "false",
|
|
28
|
+
entity: entity ?? "",
|
|
29
|
+
noAnswers: "false",
|
|
30
|
+
tags: tags ?? [],
|
|
31
|
+
noVotes: "false"
|
|
32
|
+
});
|
|
33
|
+
const onPageChange = (value) => {
|
|
34
|
+
setPage(value);
|
|
35
|
+
setSearchParams((prev) => {
|
|
36
|
+
const newValue = prev;
|
|
37
|
+
newValue.set("page", String(value));
|
|
38
|
+
return newValue;
|
|
39
|
+
});
|
|
40
|
+
};
|
|
41
|
+
const onFilterChange = (key, value) => {
|
|
42
|
+
if (filters[key] === value) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
setPage(1);
|
|
46
|
+
setFilters({ ...filters, ...{ [key]: value } });
|
|
47
|
+
setSearchParams((prev) => {
|
|
48
|
+
const newValue = prev;
|
|
49
|
+
if (!value || value === "false") {
|
|
50
|
+
newValue.delete(key);
|
|
51
|
+
} else if (Array.isArray(value)) {
|
|
52
|
+
if (value.length === 0) {
|
|
53
|
+
newValue.delete(key);
|
|
54
|
+
} else {
|
|
55
|
+
newValue.set(key, value.join(","));
|
|
56
|
+
}
|
|
57
|
+
} else if (value.length > 0) {
|
|
58
|
+
newValue.set(key, value);
|
|
59
|
+
} else {
|
|
60
|
+
newValue.delete(key);
|
|
61
|
+
}
|
|
62
|
+
return newValue;
|
|
63
|
+
});
|
|
64
|
+
};
|
|
65
|
+
const onSearchQueryChange = (event) => {
|
|
66
|
+
onPageChange(1);
|
|
67
|
+
if (event.target.value) {
|
|
68
|
+
analytics.captureEvent("qeta_search", event.target.value);
|
|
69
|
+
}
|
|
70
|
+
setSearchQuery(event.target.value);
|
|
71
|
+
};
|
|
72
|
+
useDebounce(
|
|
73
|
+
() => {
|
|
74
|
+
if (filters.searchQuery !== searchQuery) {
|
|
75
|
+
setFilters({ ...filters, searchQuery });
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
400,
|
|
79
|
+
[searchQuery]
|
|
80
|
+
);
|
|
81
|
+
useEffect(() => {
|
|
82
|
+
let filtersApplied = false;
|
|
83
|
+
searchParams.forEach((value, key) => {
|
|
84
|
+
try {
|
|
85
|
+
if (key === "page") {
|
|
86
|
+
const pv = Number.parseInt(value, 10);
|
|
87
|
+
if (pv > 0) {
|
|
88
|
+
setPage(pv);
|
|
89
|
+
} else {
|
|
90
|
+
setPage(1);
|
|
91
|
+
}
|
|
92
|
+
} else if (key === "answersPerPage") {
|
|
93
|
+
const qpp = Number.parseInt(value, 10);
|
|
94
|
+
if (qpp > 0) setAnswersPerPage(qpp);
|
|
95
|
+
} else if (filterKeys.includes(key)) {
|
|
96
|
+
filtersApplied = true;
|
|
97
|
+
if (key === "tags") {
|
|
98
|
+
filters.tags = filterTags(value) ?? [];
|
|
99
|
+
} else {
|
|
100
|
+
filters[key] = value;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
} catch (_e) {
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
setFilters(filters);
|
|
107
|
+
if (filtersApplied) {
|
|
108
|
+
setShowFilterPanel(true);
|
|
109
|
+
}
|
|
110
|
+
}, [searchParams, filters]);
|
|
111
|
+
const {
|
|
112
|
+
value: response,
|
|
113
|
+
loading,
|
|
114
|
+
error
|
|
115
|
+
} = useQetaApi(
|
|
116
|
+
(api) => {
|
|
117
|
+
return api.getAnswers({
|
|
118
|
+
limit: answersPerPage,
|
|
119
|
+
offset: (page - 1) * answersPerPage,
|
|
120
|
+
author,
|
|
121
|
+
...getFiltersWithDateRange(filters)
|
|
122
|
+
});
|
|
123
|
+
},
|
|
124
|
+
[page, filters, answersPerPage]
|
|
125
|
+
);
|
|
126
|
+
const onPageSizeChange = (value) => {
|
|
127
|
+
if (response) {
|
|
128
|
+
let newPage = page;
|
|
129
|
+
while (newPage * value > response.total) {
|
|
130
|
+
newPage -= 1;
|
|
131
|
+
}
|
|
132
|
+
onPageChange(Math.max(1, newPage));
|
|
133
|
+
}
|
|
134
|
+
setAnswersPerPage(value);
|
|
135
|
+
setSearchParams((prev) => {
|
|
136
|
+
const newValue = prev;
|
|
137
|
+
newValue.set("answersPerPage", String(value));
|
|
138
|
+
return newValue;
|
|
139
|
+
});
|
|
140
|
+
};
|
|
141
|
+
let shownTitle = title;
|
|
142
|
+
let link = void 0;
|
|
143
|
+
if (author) {
|
|
144
|
+
shownTitle = `Answers by `;
|
|
145
|
+
link = /* @__PURE__ */ React.createElement(EntityRefLink, { entityRef: author, hideIcon: true, defaultKind: "user" });
|
|
146
|
+
} else if (entity) {
|
|
147
|
+
shownTitle = `Answers about `;
|
|
148
|
+
link = /* @__PURE__ */ React.createElement(EntityRefLink, { entityRef: entity });
|
|
149
|
+
} else if (tags) {
|
|
150
|
+
shownTitle = `Answers tagged with [${tags.join(", ")}]`;
|
|
151
|
+
}
|
|
152
|
+
return /* @__PURE__ */ React.createElement(Box, { className: "qetaAnswersContainer" }, showTitle && /* @__PURE__ */ React.createElement(
|
|
153
|
+
Typography,
|
|
154
|
+
{
|
|
155
|
+
variant: "h5",
|
|
156
|
+
className: "qetaAnswersContainerTitle",
|
|
157
|
+
style: { marginBottom: "1.5rem" }
|
|
158
|
+
},
|
|
159
|
+
shownTitle,
|
|
160
|
+
link
|
|
161
|
+
), /* @__PURE__ */ React.createElement(Grid, { container: true, justifyContent: "space-between" }, /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 12, md: 4 }, /* @__PURE__ */ React.createElement(
|
|
162
|
+
TextField,
|
|
163
|
+
{
|
|
164
|
+
id: "search-bar",
|
|
165
|
+
fullWidth: true,
|
|
166
|
+
onChange: onSearchQueryChange,
|
|
167
|
+
label: "Search for answers",
|
|
168
|
+
className: "qetaAnswersContainerSearchInput",
|
|
169
|
+
variant: "outlined",
|
|
170
|
+
placeholder: "Search...",
|
|
171
|
+
size: "small",
|
|
172
|
+
style: { marginBottom: "5px" }
|
|
173
|
+
}
|
|
174
|
+
))), /* @__PURE__ */ React.createElement(Grid, { container: true, justifyContent: "space-between" }, /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(
|
|
175
|
+
Typography,
|
|
176
|
+
{
|
|
177
|
+
variant: "h6",
|
|
178
|
+
className: "qetaAnswersContainerAnswerCount"
|
|
179
|
+
},
|
|
180
|
+
`${response?.total ?? 0} ${response?.total === 1 ? "answer" : "answers"}`
|
|
181
|
+
)), (showFilters ?? true) && /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(
|
|
182
|
+
Button,
|
|
183
|
+
{
|
|
184
|
+
onClick: () => setShowFilterPanel(!showFilterPanel),
|
|
185
|
+
className: "qetaAnswerContainerFilterPanelBtn",
|
|
186
|
+
startIcon: /* @__PURE__ */ React.createElement(FilterList, null)
|
|
187
|
+
},
|
|
188
|
+
"Filter"
|
|
189
|
+
))), (showFilters ?? true) && /* @__PURE__ */ React.createElement(Collapse, { in: showFilterPanel }, /* @__PURE__ */ React.createElement(
|
|
190
|
+
FilterPanel,
|
|
191
|
+
{
|
|
192
|
+
onChange: onFilterChange,
|
|
193
|
+
filters,
|
|
194
|
+
answerFilters: true
|
|
195
|
+
}
|
|
196
|
+
)), /* @__PURE__ */ React.createElement(
|
|
197
|
+
AnswerList,
|
|
198
|
+
{
|
|
199
|
+
loading,
|
|
200
|
+
error,
|
|
201
|
+
response,
|
|
202
|
+
onPageChange,
|
|
203
|
+
onPageSizeChange,
|
|
204
|
+
entity,
|
|
205
|
+
page,
|
|
206
|
+
pageSize: answersPerPage,
|
|
207
|
+
entityPage: entity !== void 0,
|
|
208
|
+
tags
|
|
209
|
+
}
|
|
210
|
+
));
|
|
211
|
+
};
|
|
212
|
+
|
|
213
|
+
export { AnswersContainer };
|
|
214
|
+
//# sourceMappingURL=AnswersContainer.esm.js.map
|