From 510a94d89f9b4a886610f4171dfdd5416335ed18 Mon Sep 17 00:00:00 2001 From: nikolar Date: Mon, 22 Jan 2024 21:59:04 -0800 Subject: [PATCH 01/13] option to link feedbackResponses to additional comments Signed-off-by: nikolar --- plugins/entity-feedback-backend/package.json | 1 + .../src/service/router.ts | 5 +- .../FeedbackResponseDialog.tsx | 58 +++++++++++++++++-- .../FeedbackResponseTable.tsx | 9 ++- yarn.lock | 1 + 5 files changed, 64 insertions(+), 10 deletions(-) diff --git a/plugins/entity-feedback-backend/package.json b/plugins/entity-feedback-backend/package.json index 896b2c9c14..14bfabd98b 100644 --- a/plugins/entity-feedback-backend/package.json +++ b/plugins/entity-feedback-backend/package.json @@ -33,6 +33,7 @@ "@backstage/catalog-client": "workspace:^", "@backstage/catalog-model": "workspace:^", "@backstage/config": "workspace:^", + "@backstage/errors": "workspace:^", "@backstage/plugin-auth-node": "workspace:^", "@backstage/plugin-entity-feedback-common": "workspace:^", "@types/express": "*", diff --git a/plugins/entity-feedback-backend/src/service/router.ts b/plugins/entity-feedback-backend/src/service/router.ts index 7cf89bfd5c..8d8cb0d600 100644 --- a/plugins/entity-feedback-backend/src/service/router.ts +++ b/plugins/entity-feedback-backend/src/service/router.ts @@ -28,6 +28,7 @@ import { EntityRatingsData, Ratings, } from '@backstage/plugin-entity-feedback-common'; +import { InputError } from '@backstage/errors'; import express from 'express'; import Router from 'express-promise-router'; import { Logger } from 'winston'; @@ -138,11 +139,9 @@ export async function createRouter( const rating = req.body.rating; if (!rating) { - logger.warn( + throw new InputError( `Can't save rating because there is not enough info: user=${credentials.principal.userEntityRef}, rating=${rating}`, ); - res.status(400).end(); - return; } await dbHandler.recordRating({ diff --git a/plugins/entity-feedback/src/components/FeedbackResponseDialog/FeedbackResponseDialog.tsx b/plugins/entity-feedback/src/components/FeedbackResponseDialog/FeedbackResponseDialog.tsx index c3f935e432..4e98f3b8d8 100644 --- a/plugins/entity-feedback/src/components/FeedbackResponseDialog/FeedbackResponseDialog.tsx +++ b/plugins/entity-feedback/src/components/FeedbackResponseDialog/FeedbackResponseDialog.tsx @@ -16,7 +16,12 @@ import { Entity, stringifyEntityRef } from '@backstage/catalog-model'; import { Progress } from '@backstage/core-components'; -import { ErrorApiError, errorApiRef, useApi } from '@backstage/core-plugin-api'; +import { + ErrorApiError, + errorApiRef, + useApi, + alertApiRef, +} from '@backstage/core-plugin-api'; import { Button, Checkbox, @@ -45,12 +50,13 @@ import { entityFeedbackApiRef } from '../../api'; export interface EntityFeedbackResponse { id: string; label: string; + mustComment?: boolean; } const defaultFeedbackResponses: EntityFeedbackResponse[] = [ { id: 'incorrect', label: 'Incorrect info' }, { id: 'missing', label: 'Missing info' }, - { id: 'other', label: 'Other (please specify below)' }, + { id: 'other', label: 'Other (please specify below)', mustComment: true }, ]; /** @@ -81,13 +87,41 @@ export const FeedbackResponseDialog = (props: FeedbackResponseDialogProps) => { const classes = useStyles(); const errorApi = useApi(errorApiRef); const feedbackApi = useApi(entityFeedbackApiRef); + const alertApi = useApi(alertApiRef); const [responseSelections, setResponseSelections] = useState( Object.fromEntries(feedbackDialogResponses.map(r => [r.id, false])), ); const [comments, setComments] = useState(''); const [consent, setConsent] = useState(true); + const requireComments = feedbackDialogResponses + .filter(r => r.mustComment) + .map(r => r.id); + + const isMandatedBoxChecked = () => { + const checkedBoxes = Object.keys(responseSelections).filter( + id => responseSelections[id], + ); + return checkedBoxes.some(id => requireComments.includes(id)); + }; const [{ loading: saving }, saveResponse] = useAsyncFn(async () => { + if (requireComments.length > 0) { + if (comments.length === 0 && isMandatedBoxChecked()) { + alertApi.post({ + message: + 'The selected option(s) require a comment. Please provide a comment.', + severity: 'info', + }); + return; + } + if (comments.length > 0 && !isMandatedBoxChecked()) { + alertApi.post({ + message: 'Please select the option(s) that require a comment.', + severity: 'info', + }); + return; + } + } try { await feedbackApi.recordResponse(stringifyEntityRef(entity), { comments, @@ -102,13 +136,29 @@ export const FeedbackResponseDialog = (props: FeedbackResponseDialogProps) => { } }, [comments, consent, entity, feedbackApi, onClose, responseSelections]); + const selectMandatedBox = (res: boolean) => { + const newResponseSelections = { ...responseSelections }; + requireComments.forEach(id => newResponseSelections[id] === res); + setResponseSelections(newResponseSelections); + }; + + const verifyComments = (e: any) => { + setComments(e.target.value); + if (requireComments.length > 0) { + selectMandatedBox(true); + if (e.target.value.length === 0) { + selectMandatedBox(false); + } + } + }; + return ( !saving && onClose()}> {saving && } {feedbackDialogTitle} - Choose all that applies + Choose all that apply {feedbackDialogResponses.map(response => ( { label="Additional comments" multiline minRows={2} - onChange={e => setComments(e.target.value)} + onChange={e => verifyComments(e)} variant="outlined" value={comments} /> diff --git a/plugins/entity-feedback/src/components/FeedbackResponseTable/FeedbackResponseTable.tsx b/plugins/entity-feedback/src/components/FeedbackResponseTable/FeedbackResponseTable.tsx index 863cdcc6b6..22155f90ce 100644 --- a/plugins/entity-feedback/src/components/FeedbackResponseTable/FeedbackResponseTable.tsx +++ b/plugins/entity-feedback/src/components/FeedbackResponseTable/FeedbackResponseTable.tsx @@ -80,9 +80,12 @@ export const FeedbackResponseTable = (props: FeedbackResponseTableProps) => { width: '35%', render: (response: ResponseRow) => ( <> - {response.response?.split(',').map(res => ( - - ))} + {response.response?.length !== undefined && + response.response?.length > 0 + ? response.response + ?.split(',') + .map(res => ) + : ''} ), }, diff --git a/yarn.lock b/yarn.lock index 1d2fe96275..13d7effd5c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6288,6 +6288,7 @@ __metadata: "@backstage/catalog-model": "workspace:^" "@backstage/cli": "workspace:^" "@backstage/config": "workspace:^" + "@backstage/errors": "workspace:^" "@backstage/plugin-auth-node": "workspace:^" "@backstage/plugin-entity-feedback-common": "workspace:^" "@types/express": "*" From 96adf78fbdb7c76da0c11896a3ab7c7706426c77 Mon Sep 17 00:00:00 2001 From: nikolar Date: Mon, 22 Jan 2024 22:29:36 -0800 Subject: [PATCH 02/13] add documentation, changeset, and api-report Signed-off-by: nikolar --- .changeset/perfect-shoes-arrive.md | 28 +++++++++++++++++++++++++++ plugins/entity-feedback/README.md | 18 +++++++++++++++++ plugins/entity-feedback/api-report.md | 2 ++ 3 files changed, 48 insertions(+) create mode 100644 .changeset/perfect-shoes-arrive.md diff --git a/.changeset/perfect-shoes-arrive.md b/.changeset/perfect-shoes-arrive.md new file mode 100644 index 0000000000..adc642db47 --- /dev/null +++ b/.changeset/perfect-shoes-arrive.md @@ -0,0 +1,28 @@ +--- +'@backstage/plugin-entity-feedback': minor +'@backstage/plugin-entity-feedback-backend': patch +--- + + + +Add in logic to require comments for specific feedback responses +const overviewContent = ( + +... + +- +- +- +- +- + ... + + ); + + Add in description for 400 response when rating and not authenticated diff --git a/plugins/entity-feedback/README.md b/plugins/entity-feedback/README.md index c405bd4083..4878b2e01e 100644 --- a/plugins/entity-feedback/README.md +++ b/plugins/entity-feedback/README.md @@ -90,6 +90,24 @@ const overviewContent = ( ); +// Require comments for specific feedback responses +const overviewContent = ( + + ... ++ ++ ++ ++ ++ + ... + +); ... // Add to each applicable kind/type of entity as desired diff --git a/plugins/entity-feedback/api-report.md b/plugins/entity-feedback/api-report.md index 27e56e5282..d5c03685cd 100644 --- a/plugins/entity-feedback/api-report.md +++ b/plugins/entity-feedback/api-report.md @@ -79,6 +79,8 @@ export interface EntityFeedbackResponse { id: string; // (undocumented) label: string; + // (undocumented) + mustComment?: boolean; } // @public (undocumented) From 2bb58bfee261d8eb23fed109bd6288132ca702a7 Mon Sep 17 00:00:00 2001 From: nikolar Date: Tue, 23 Jan 2024 14:00:31 -0800 Subject: [PATCH 03/13] add test Signed-off-by: nikolar --- .../FeedbackResponseDialog.test.tsx | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/plugins/entity-feedback/src/components/FeedbackResponseDialog/FeedbackResponseDialog.test.tsx b/plugins/entity-feedback/src/components/FeedbackResponseDialog/FeedbackResponseDialog.test.tsx index 631738d6f9..620548d1e1 100644 --- a/plugins/entity-feedback/src/components/FeedbackResponseDialog/FeedbackResponseDialog.test.tsx +++ b/plugins/entity-feedback/src/components/FeedbackResponseDialog/FeedbackResponseDialog.test.tsx @@ -115,4 +115,22 @@ describe('FeedbackResponseDialog', () => { ); }); }); + + it('will not submit "other" without comments', async () => { + const rendered = await render(); + + await userEvent.click( + rendered.getByRole('checkbox', { name: 'Incorrect info' }), + ); + await userEvent.click( + rendered.getByRole('checkbox', { name: 'Other (please specify below)' }), + ); + await userEvent.click( + rendered.getByTestId('feedback-response-dialog-submit-button'), + ); + + await waitFor(() => { + expect(feedbackApi.recordResponse).toHaveBeenCalledTimes(0); + }); + }); }); From 3a5ae74da0d12b10754d77a29ffa2f156004332c Mon Sep 17 00:00:00 2001 From: nikolar Date: Tue, 23 Jan 2024 14:32:25 -0800 Subject: [PATCH 04/13] edit changeset Signed-off-by: nikolar --- .changeset/perfect-shoes-arrive.md | 32 ++++++++++++++---------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/.changeset/perfect-shoes-arrive.md b/.changeset/perfect-shoes-arrive.md index adc642db47..924267822e 100644 --- a/.changeset/perfect-shoes-arrive.md +++ b/.changeset/perfect-shoes-arrive.md @@ -6,23 +6,21 @@ Add in logic to require comments for specific feedback responses -const overviewContent = ( +const requireComments = ( ... + -- -- -- -- - ... - - ); - - Add in description for 400 response when rating and not authenticated +- feedbackDialogResponses = {[ +- { id: 'incorrect', label: 'Incorrect info' }, +- { id: 'missing', label: 'Missing info', mustComment: true }, +- { id: 'other', label: 'Other (please specify below)', mustComment: true }, +- ]} +- /> + ... + + ); + + + +Add in description for 400 response when rating and not authenticated From 0b90651d0a65a4d85e665f8411b2f95db206528e Mon Sep 17 00:00:00 2001 From: nikolar Date: Tue, 23 Jan 2024 17:33:01 -0800 Subject: [PATCH 05/13] add mustComment to accepted words Signed-off-by: nikolar --- .github/vale/config/vocabularies/Backstage/accept.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/vale/config/vocabularies/Backstage/accept.txt b/.github/vale/config/vocabularies/Backstage/accept.txt index c38a115fa3..f4afe605f1 100644 --- a/.github/vale/config/vocabularies/Backstage/accept.txt +++ b/.github/vale/config/vocabularies/Backstage/accept.txt @@ -236,6 +236,7 @@ Monorepo monorepos msgraph msw +mustComment mutex mutexes mysql From 20c445b18fad03e733f1ad2ae377711550c063a7 Mon Sep 17 00:00:00 2001 From: nikolar Date: Tue, 23 Jan 2024 18:23:26 -0800 Subject: [PATCH 06/13] remove changes from accept and try backticks Signed-off-by: nikolar --- .changeset/perfect-shoes-arrive.md | 4 ++-- .github/vale/config/vocabularies/Backstage/accept.txt | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.changeset/perfect-shoes-arrive.md b/.changeset/perfect-shoes-arrive.md index 924267822e..52cc34d675 100644 --- a/.changeset/perfect-shoes-arrive.md +++ b/.changeset/perfect-shoes-arrive.md @@ -13,8 +13,8 @@ const requireComments = ( - feedbackDialogResponses = {[ - { id: 'incorrect', label: 'Incorrect info' }, -- { id: 'missing', label: 'Missing info', mustComment: true }, -- { id: 'other', label: 'Other (please specify below)', mustComment: true }, +- { id: 'missing', label: 'Missing info', `mustComment`: true }, +- { id: 'other', label: 'Other (please specify below)', `mustComment`: true }, - ]} - /> ... diff --git a/.github/vale/config/vocabularies/Backstage/accept.txt b/.github/vale/config/vocabularies/Backstage/accept.txt index f4afe605f1..c38a115fa3 100644 --- a/.github/vale/config/vocabularies/Backstage/accept.txt +++ b/.github/vale/config/vocabularies/Backstage/accept.txt @@ -236,7 +236,6 @@ Monorepo monorepos msgraph msw -mustComment mutex mutexes mysql From 8ac7843c7e03c3ade6d797aae24d7f20f4b33baa Mon Sep 17 00:00:00 2001 From: nikolar Date: Wed, 24 Jan 2024 09:56:23 -0800 Subject: [PATCH 07/13] improve variable names and update docs Signed-off-by: nikolar --- .changeset/perfect-shoes-arrive.md | 2 +- plugins/entity-feedback/README.md | 2 +- .../FeedbackResponseDialog.tsx | 12 ++++++------ 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.changeset/perfect-shoes-arrive.md b/.changeset/perfect-shoes-arrive.md index 52cc34d675..5ba02e2184 100644 --- a/.changeset/perfect-shoes-arrive.md +++ b/.changeset/perfect-shoes-arrive.md @@ -5,7 +5,7 @@ -Add in logic to require comments for specific feedback responses +Add in logic to link the feedback comment box to specific feedback responses const requireComments = ( ... diff --git a/plugins/entity-feedback/README.md b/plugins/entity-feedback/README.md index 4878b2e01e..b66cf6f567 100644 --- a/plugins/entity-feedback/README.md +++ b/plugins/entity-feedback/README.md @@ -90,7 +90,7 @@ const overviewContent = ( ); -// Require comments for specific feedback responses +// Link the feedback comment box to specific feedback responses const overviewContent = ( ... diff --git a/plugins/entity-feedback/src/components/FeedbackResponseDialog/FeedbackResponseDialog.tsx b/plugins/entity-feedback/src/components/FeedbackResponseDialog/FeedbackResponseDialog.tsx index 4e98f3b8d8..1acf58003a 100644 --- a/plugins/entity-feedback/src/components/FeedbackResponseDialog/FeedbackResponseDialog.tsx +++ b/plugins/entity-feedback/src/components/FeedbackResponseDialog/FeedbackResponseDialog.tsx @@ -97,7 +97,7 @@ export const FeedbackResponseDialog = (props: FeedbackResponseDialogProps) => { .filter(r => r.mustComment) .map(r => r.id); - const isMandatedBoxChecked = () => { + const isLinkedBoxChecked = () => { const checkedBoxes = Object.keys(responseSelections).filter( id => responseSelections[id], ); @@ -106,7 +106,7 @@ export const FeedbackResponseDialog = (props: FeedbackResponseDialogProps) => { const [{ loading: saving }, saveResponse] = useAsyncFn(async () => { if (requireComments.length > 0) { - if (comments.length === 0 && isMandatedBoxChecked()) { + if (comments.length === 0 && isLinkedBoxChecked()) { alertApi.post({ message: 'The selected option(s) require a comment. Please provide a comment.', @@ -114,7 +114,7 @@ export const FeedbackResponseDialog = (props: FeedbackResponseDialogProps) => { }); return; } - if (comments.length > 0 && !isMandatedBoxChecked()) { + if (comments.length > 0 && !isLinkedBoxChecked()) { alertApi.post({ message: 'Please select the option(s) that require a comment.', severity: 'info', @@ -136,7 +136,7 @@ export const FeedbackResponseDialog = (props: FeedbackResponseDialogProps) => { } }, [comments, consent, entity, feedbackApi, onClose, responseSelections]); - const selectMandatedBox = (res: boolean) => { + const selectLinkedBox = (res: boolean) => { const newResponseSelections = { ...responseSelections }; requireComments.forEach(id => newResponseSelections[id] === res); setResponseSelections(newResponseSelections); @@ -145,9 +145,9 @@ export const FeedbackResponseDialog = (props: FeedbackResponseDialogProps) => { const verifyComments = (e: any) => { setComments(e.target.value); if (requireComments.length > 0) { - selectMandatedBox(true); + selectLinkedBox(true); if (e.target.value.length === 0) { - selectMandatedBox(false); + selectLinkedBox(false); } } }; From 4f8f3df8fd39705919436b8570b9ee8d6b90c3df Mon Sep 17 00:00:00 2001 From: nikolar Date: Wed, 21 Feb 2024 10:50:28 -0800 Subject: [PATCH 08/13] remove dialog box changes Signed-off-by: nikolar --- .changeset/perfect-shoes-arrive.md | 16 +----- plugins/entity-feedback/README.md | 18 ------ plugins/entity-feedback/api-report.md | 2 - .../FeedbackResponseDialog.test.tsx | 18 ------ .../FeedbackResponseDialog.tsx | 56 +------------------ .../FeedbackResponseTable.tsx | 10 ++-- 6 files changed, 8 insertions(+), 112 deletions(-) diff --git a/.changeset/perfect-shoes-arrive.md b/.changeset/perfect-shoes-arrive.md index 5ba02e2184..fbd4d0fec1 100644 --- a/.changeset/perfect-shoes-arrive.md +++ b/.changeset/perfect-shoes-arrive.md @@ -5,21 +5,7 @@ -Add in logic to link the feedback comment box to specific feedback responses -const requireComments = ( - -... - - ... - - ); +Remove empty Chip in `FeedbackResponseTable.tsx` when there is no response diff --git a/plugins/entity-feedback/README.md b/plugins/entity-feedback/README.md index b66cf6f567..c405bd4083 100644 --- a/plugins/entity-feedback/README.md +++ b/plugins/entity-feedback/README.md @@ -90,24 +90,6 @@ const overviewContent = ( ); -// Link the feedback comment box to specific feedback responses -const overviewContent = ( - - ... -+ -+ -+ -+ -+ - ... - -); ... // Add to each applicable kind/type of entity as desired diff --git a/plugins/entity-feedback/api-report.md b/plugins/entity-feedback/api-report.md index d5c03685cd..27e56e5282 100644 --- a/plugins/entity-feedback/api-report.md +++ b/plugins/entity-feedback/api-report.md @@ -79,8 +79,6 @@ export interface EntityFeedbackResponse { id: string; // (undocumented) label: string; - // (undocumented) - mustComment?: boolean; } // @public (undocumented) diff --git a/plugins/entity-feedback/src/components/FeedbackResponseDialog/FeedbackResponseDialog.test.tsx b/plugins/entity-feedback/src/components/FeedbackResponseDialog/FeedbackResponseDialog.test.tsx index 620548d1e1..631738d6f9 100644 --- a/plugins/entity-feedback/src/components/FeedbackResponseDialog/FeedbackResponseDialog.test.tsx +++ b/plugins/entity-feedback/src/components/FeedbackResponseDialog/FeedbackResponseDialog.test.tsx @@ -115,22 +115,4 @@ describe('FeedbackResponseDialog', () => { ); }); }); - - it('will not submit "other" without comments', async () => { - const rendered = await render(); - - await userEvent.click( - rendered.getByRole('checkbox', { name: 'Incorrect info' }), - ); - await userEvent.click( - rendered.getByRole('checkbox', { name: 'Other (please specify below)' }), - ); - await userEvent.click( - rendered.getByTestId('feedback-response-dialog-submit-button'), - ); - - await waitFor(() => { - expect(feedbackApi.recordResponse).toHaveBeenCalledTimes(0); - }); - }); }); diff --git a/plugins/entity-feedback/src/components/FeedbackResponseDialog/FeedbackResponseDialog.tsx b/plugins/entity-feedback/src/components/FeedbackResponseDialog/FeedbackResponseDialog.tsx index 1acf58003a..6bd4510d3e 100644 --- a/plugins/entity-feedback/src/components/FeedbackResponseDialog/FeedbackResponseDialog.tsx +++ b/plugins/entity-feedback/src/components/FeedbackResponseDialog/FeedbackResponseDialog.tsx @@ -16,12 +16,7 @@ import { Entity, stringifyEntityRef } from '@backstage/catalog-model'; import { Progress } from '@backstage/core-components'; -import { - ErrorApiError, - errorApiRef, - useApi, - alertApiRef, -} from '@backstage/core-plugin-api'; +import { ErrorApiError, errorApiRef, useApi } from '@backstage/core-plugin-api'; import { Button, Checkbox, @@ -50,13 +45,12 @@ import { entityFeedbackApiRef } from '../../api'; export interface EntityFeedbackResponse { id: string; label: string; - mustComment?: boolean; } const defaultFeedbackResponses: EntityFeedbackResponse[] = [ { id: 'incorrect', label: 'Incorrect info' }, { id: 'missing', label: 'Missing info' }, - { id: 'other', label: 'Other (please specify below)', mustComment: true }, + { id: 'other', label: 'Other (please specify below)' }, ]; /** @@ -87,41 +81,13 @@ export const FeedbackResponseDialog = (props: FeedbackResponseDialogProps) => { const classes = useStyles(); const errorApi = useApi(errorApiRef); const feedbackApi = useApi(entityFeedbackApiRef); - const alertApi = useApi(alertApiRef); const [responseSelections, setResponseSelections] = useState( Object.fromEntries(feedbackDialogResponses.map(r => [r.id, false])), ); const [comments, setComments] = useState(''); const [consent, setConsent] = useState(true); - const requireComments = feedbackDialogResponses - .filter(r => r.mustComment) - .map(r => r.id); - - const isLinkedBoxChecked = () => { - const checkedBoxes = Object.keys(responseSelections).filter( - id => responseSelections[id], - ); - return checkedBoxes.some(id => requireComments.includes(id)); - }; const [{ loading: saving }, saveResponse] = useAsyncFn(async () => { - if (requireComments.length > 0) { - if (comments.length === 0 && isLinkedBoxChecked()) { - alertApi.post({ - message: - 'The selected option(s) require a comment. Please provide a comment.', - severity: 'info', - }); - return; - } - if (comments.length > 0 && !isLinkedBoxChecked()) { - alertApi.post({ - message: 'Please select the option(s) that require a comment.', - severity: 'info', - }); - return; - } - } try { await feedbackApi.recordResponse(stringifyEntityRef(entity), { comments, @@ -136,22 +102,6 @@ export const FeedbackResponseDialog = (props: FeedbackResponseDialogProps) => { } }, [comments, consent, entity, feedbackApi, onClose, responseSelections]); - const selectLinkedBox = (res: boolean) => { - const newResponseSelections = { ...responseSelections }; - requireComments.forEach(id => newResponseSelections[id] === res); - setResponseSelections(newResponseSelections); - }; - - const verifyComments = (e: any) => { - setComments(e.target.value); - if (requireComments.length > 0) { - selectLinkedBox(true); - if (e.target.value.length === 0) { - selectLinkedBox(false); - } - } - }; - return ( !saving && onClose()}> {saving && } @@ -188,7 +138,7 @@ export const FeedbackResponseDialog = (props: FeedbackResponseDialogProps) => { label="Additional comments" multiline minRows={2} - onChange={e => verifyComments(e)} + onChange={e => setComments(e.target.value)} variant="outlined" value={comments} /> diff --git a/plugins/entity-feedback/src/components/FeedbackResponseTable/FeedbackResponseTable.tsx b/plugins/entity-feedback/src/components/FeedbackResponseTable/FeedbackResponseTable.tsx index 22155f90ce..0c26d7a2ba 100644 --- a/plugins/entity-feedback/src/components/FeedbackResponseTable/FeedbackResponseTable.tsx +++ b/plugins/entity-feedback/src/components/FeedbackResponseTable/FeedbackResponseTable.tsx @@ -80,12 +80,10 @@ export const FeedbackResponseTable = (props: FeedbackResponseTableProps) => { width: '35%', render: (response: ResponseRow) => ( <> - {response.response?.length !== undefined && - response.response?.length > 0 - ? response.response - ?.split(',') - .map(res => ) - : ''} + {response.response?.length && + response.response + ?.split(',') + .map(res => )} ), }, From 45115fd213e7647916b36651349163eea879e1c8 Mon Sep 17 00:00:00 2001 From: nikolar Date: Wed, 21 Feb 2024 10:55:24 -0800 Subject: [PATCH 09/13] fix changesets Signed-off-by: nikolar --- .changeset/cyan-toes-repeat.md | 5 +++++ .changeset/perfect-shoes-arrive.md | 5 ----- 2 files changed, 5 insertions(+), 5 deletions(-) create mode 100644 .changeset/cyan-toes-repeat.md diff --git a/.changeset/cyan-toes-repeat.md b/.changeset/cyan-toes-repeat.md new file mode 100644 index 0000000000..c261ed829a --- /dev/null +++ b/.changeset/cyan-toes-repeat.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-entity-feedback-backend': patch +--- + +Add in description for 400 response when rating and not authenticated diff --git a/.changeset/perfect-shoes-arrive.md b/.changeset/perfect-shoes-arrive.md index fbd4d0fec1..c494df9320 100644 --- a/.changeset/perfect-shoes-arrive.md +++ b/.changeset/perfect-shoes-arrive.md @@ -1,12 +1,7 @@ --- '@backstage/plugin-entity-feedback': minor -'@backstage/plugin-entity-feedback-backend': patch --- Remove empty Chip in `FeedbackResponseTable.tsx` when there is no response - - - -Add in description for 400 response when rating and not authenticated From cf72b0fcaa42168c7ca1c2e5cdcd108b2310f342 Mon Sep 17 00:00:00 2001 From: nikolar Date: Wed, 21 Feb 2024 11:12:11 -0800 Subject: [PATCH 10/13] fix changeset Signed-off-by: nikolar --- .changeset/perfect-shoes-arrive.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/perfect-shoes-arrive.md b/.changeset/perfect-shoes-arrive.md index c494df9320..5db5f2f9f6 100644 --- a/.changeset/perfect-shoes-arrive.md +++ b/.changeset/perfect-shoes-arrive.md @@ -4,4 +4,4 @@ -Remove empty Chip in `FeedbackResponseTable.tsx` when there is no response +Remove empty Chip in `FeedbackResponseTable.tsx` when there is no response, and fix typo in Feedback Dialog Box. From 9b40f579190c673558a9fc2f85272d12007a2c29 Mon Sep 17 00:00:00 2001 From: nikolar Date: Thu, 22 Feb 2024 09:02:26 -0800 Subject: [PATCH 11/13] add changeset suggestions Signed-off-by: nikolar --- .changeset/cyan-toes-repeat.md | 2 +- .changeset/perfect-shoes-arrive.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.changeset/cyan-toes-repeat.md b/.changeset/cyan-toes-repeat.md index c261ed829a..7963e0cb36 100644 --- a/.changeset/cyan-toes-repeat.md +++ b/.changeset/cyan-toes-repeat.md @@ -2,4 +2,4 @@ '@backstage/plugin-entity-feedback-backend': patch --- -Add in description for 400 response when rating and not authenticated +Add in description for 400 response when encountering an invalid rating request diff --git a/.changeset/perfect-shoes-arrive.md b/.changeset/perfect-shoes-arrive.md index 5db5f2f9f6..eaff65c082 100644 --- a/.changeset/perfect-shoes-arrive.md +++ b/.changeset/perfect-shoes-arrive.md @@ -1,5 +1,5 @@ --- -'@backstage/plugin-entity-feedback': minor +'@backstage/plugin-entity-feedback': patch --- From e150fe7e19947f98d45b2e5c6c5ec983a51cfc0f Mon Sep 17 00:00:00 2001 From: nikolar Date: Tue, 27 Feb 2024 16:56:09 -0800 Subject: [PATCH 12/13] fix empty response Signed-off-by: nikolar --- .../components/FeedbackResponseTable/FeedbackResponseTable.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/entity-feedback/src/components/FeedbackResponseTable/FeedbackResponseTable.tsx b/plugins/entity-feedback/src/components/FeedbackResponseTable/FeedbackResponseTable.tsx index 0c26d7a2ba..2a756ee105 100644 --- a/plugins/entity-feedback/src/components/FeedbackResponseTable/FeedbackResponseTable.tsx +++ b/plugins/entity-feedback/src/components/FeedbackResponseTable/FeedbackResponseTable.tsx @@ -80,7 +80,8 @@ export const FeedbackResponseTable = (props: FeedbackResponseTableProps) => { width: '35%', render: (response: ResponseRow) => ( <> - {response.response?.length && + {response?.response && + response.response.length > 0 && response.response ?.split(',') .map(res => )} From 83e7ec63222bc41b26f9dd3e445e2ea397e3ecad Mon Sep 17 00:00:00 2001 From: nikolar Date: Wed, 28 Feb 2024 09:59:13 -0800 Subject: [PATCH 13/13] add review suggestion Signed-off-by: nikolar --- .changeset/perfect-shoes-arrive.md | 2 -- .../FeedbackResponseTable/FeedbackResponseTable.tsx | 12 +++++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.changeset/perfect-shoes-arrive.md b/.changeset/perfect-shoes-arrive.md index eaff65c082..93862df24d 100644 --- a/.changeset/perfect-shoes-arrive.md +++ b/.changeset/perfect-shoes-arrive.md @@ -2,6 +2,4 @@ '@backstage/plugin-entity-feedback': patch --- - - Remove empty Chip in `FeedbackResponseTable.tsx` when there is no response, and fix typo in Feedback Dialog Box. diff --git a/plugins/entity-feedback/src/components/FeedbackResponseTable/FeedbackResponseTable.tsx b/plugins/entity-feedback/src/components/FeedbackResponseTable/FeedbackResponseTable.tsx index 2a756ee105..8cede00878 100644 --- a/plugins/entity-feedback/src/components/FeedbackResponseTable/FeedbackResponseTable.tsx +++ b/plugins/entity-feedback/src/components/FeedbackResponseTable/FeedbackResponseTable.tsx @@ -80,11 +80,13 @@ export const FeedbackResponseTable = (props: FeedbackResponseTableProps) => { width: '35%', render: (response: ResponseRow) => ( <> - {response?.response && - response.response.length > 0 && - response.response - ?.split(',') - .map(res => )} + {(response.response || '') + .split(',') + .map(v => v.trim()) // removes whitespace + .filter(Boolean) // removes accidental empty entries + .map(res => ( + + ))} ), },