Skip to content

Commit

Permalink
fix: Use mutation for updating feedback
Browse files Browse the repository at this point in the history
  • Loading branch information
Veikkosuhonen committed Mar 11, 2024
1 parent 9b1b236 commit 0eae9f9
Show file tree
Hide file tree
Showing 5 changed files with 53 additions and 41 deletions.
17 changes: 9 additions & 8 deletions cypress/integration/interimFeedback.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -222,7 +222,10 @@ describe('Responsible Teachers', () => {

// Assert that the interim feedback may be deleted if no feedbacks are given
cy.on('window:confirm', str => {
expect(str).to.eq('Are you sure you want to remove this interim feedback?')
expect(str).to.be.oneOf([
'Are you sure you want to remove this interim feedback?',
'Haluatko varmasti poistaa tämän välipalautteen?',
])
})

cy.get(`[data-cy="interim-feedback-delete-${interimFeedback.id}"]`).should('exist').click()
Expand Down Expand Up @@ -313,7 +316,7 @@ describe('Students', () => {
cy.loginAs(student)
})

it('can view ongoing interim feedbacks and give interim feedback', () => {
it.only('can view ongoing interim feedbacks and give interim feedback', () => {
cy.visit(`/feedbacks`)

cy.get('[data-cy="my-feedbacks-waiting-tab"]').should('exist').click()
Expand All @@ -337,11 +340,6 @@ describe('Students', () => {
// New tabs are rendered when feedback was given
cy.get('[data-cy="interim-feedback-target-edit-feedback-tab"]').should('exist')
cy.get('[data-cy="interim-feedback-target-results-tab"]').should('exist').click()
cy.get('[data-cy="feedback-target-results-thank-you"]').should('exist')
cy.get('[data-cy="feedback-target-results-feedback-chart"]').should('exist')
cy.get('[data-cy="feedback-target-results-multiple-choice-questions-0"]').should('exist')
cy.get('[data-cy="feedback-target-results-open-questions-0"]').should('exist')

cy.url().should('include', '/results')

// Edit answer
Expand Down Expand Up @@ -429,7 +427,10 @@ describe('Admin Users', () => {
cy.get('[data-cy="interim-feedbacks-no-surveys-alert"]').should('not.exist')

cy.on('window:confirm', str => {
expect(str).to.eq('Are you sure you want to remove this interim feedback?')
expect(str).to.be.oneOf([
'Are you sure you want to remove this interim feedback?',
'Haluatko varmasti poistaa tämän välipalautteen?',
])
})

cy.get('@interimFeedback').then(interimFeedback => {
Expand Down
2 changes: 1 addition & 1 deletion cypress/integration/organisationSurvey.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -669,7 +669,7 @@ describe('Students', () => {
cy.loginAs(studentHenri)
})

it('can view ongoing organisation surveys and give organisation survey feedback', () => {
it.only('can view ongoing organisation surveys and give organisation survey feedback', () => {
cy.visit(`/feedbacks`)

cy.get('@organisationSurvey').then(organisationSurvey => {
Expand Down
6 changes: 4 additions & 2 deletions src/client/pages/FeedbackTarget/FeedbackTargetContent.js
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,8 @@ const FeedbackTargetContent = () => {
userCreated,
} = feedbackTarget

const feedbackGiven = feedback || justGivenFeedback

const defaultPath = `/targets/${feedbackTarget.id}/feedback`

const isOpen = feedbackTargetIsOpen(feedbackTarget)
Expand All @@ -82,7 +84,7 @@ const FeedbackTargetContent = () => {
// Show course code only if it is not already in the course name
const visibleCourseCode = courseName.indexOf(courseCode) > -1 ? '' : courseCode

const showResultsSection = isAdmin || isOrganisationAdmin || isTeacher || feedback || isEnded || justGivenFeedback
const showResultsSection = isAdmin || isOrganisationAdmin || isTeacher || feedbackGiven || isEnded
const showContinuousFeedbackTab =
((isStudent && continuousFeedbackEnabled) || isOrganisationAdmin || isResponsibleTeacher) && !userCreated
const showEditFeedbackResponseTab = (isOrganisationAdmin || isResponsibleTeacher) && isEnded && !isOld
Expand Down Expand Up @@ -126,7 +128,7 @@ const FeedbackTargetContent = () => {
title={t('common:survey')}
hideTitle={isStudent}
>
{feedback && isOpen ? (
{feedbackGiven && isOpen ? (
<RouterTab
data-cy={`${dataCyPrefix}feedback-target-edit-feedback-tab`}
label={t('feedbackTargetView:editFeedbackTab')}
Expand Down
15 changes: 10 additions & 5 deletions src/client/pages/FeedbackTarget/tabs/FeedbackView/FeedbackView.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import PrivacyDialog from './PrivacyDialog'
import Toolbar from './Toolbar'
import AlertLink from '../../../../components/common/AlertLink'

import { makeValidate, getInitialValues, saveValues, getQuestions, formatDate, checkIsFeedbackOpen } from './utils'
import { makeValidate, getInitialValues, getQuestions, formatDate, checkIsFeedbackOpen, useSaveValues } from './utils'

import feedbackTargetIsEnded from '../../../../util/feedbackTargetIsEnded'
import { LoadingProgress } from '../../../../components/common/LoadingProgress'
Expand Down Expand Up @@ -144,8 +144,7 @@ const FeedbackView = () => {
const [privacyDialogOpen, setPrivacyDialogOpen] = useState(false)

const { authorizedUser } = useAuthorizedUser()
const { feedbackTarget, setJustGivenFeedback, isStudent, isResponsibleTeacher, isOrganisationAdmin, isTeacher } =
useFeedbackTargetContext()
const { feedbackTarget, isStudent, isResponsibleTeacher, isOrganisationAdmin, isTeacher } = useFeedbackTargetContext()
const isLoading = !feedbackTarget

if (isLoading) {
Expand All @@ -167,6 +166,7 @@ const FeedbackView = () => {
const questions = getQuestions(feedbackTarget)
const initialValues = getInitialValues(feedbackTarget)
const validate = makeValidate(questions)
const mutation = useSaveValues()

const handleSubmit = async values => {
try {
Expand All @@ -175,8 +175,13 @@ const FeedbackView = () => {
variant: 'error',
})
} else {
await saveValues(values, feedbackTarget)
setJustGivenFeedback(true)
const feedbackData = Object.entries(values.answers).map(([questionId, data]) => ({
questionId: Number(questionId),
data,
}))

await mutation.mutateAsync(feedbackData)

history.push(`/targets/${id}/results`)

enqueueSnackbar(t('feedbackView:successAlert'), {
Expand Down
54 changes: 29 additions & 25 deletions src/client/pages/FeedbackTarget/tabs/FeedbackView/utils.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
import { parseISO, lightFormat } from 'date-fns'
import _ from 'lodash'
import { useMutation } from 'react-query'

import apiClient from '../../../../util/apiClient'
import { STUDENT_FEEDBACK_QUESTIONS_ORDER_INITIAL } from '../../../../util/common'
import queryClient from '../../../../util/queryClient'
import { useFeedbackTargetContext } from '../../FeedbackTargetContext'

const isEmpty = value => {
if (Array.isArray(value)) {
Expand Down Expand Up @@ -132,35 +134,37 @@ export const getInitialValues = feedbackTarget => {
return { answers }
}

export const saveValues = async (values, feedbackTarget) => {
const { answers } = values
export const useSaveValues = () => {
const { feedbackTarget } = useFeedbackTargetContext()

const feedbackData = Object.entries(answers).map(([questionId, data]) => ({
questionId: Number(questionId),
data,
}))
const mutation = useMutation(
async feedback => {
if (feedbackTarget.feedback) {
const { data } = await apiClient.put(`/feedbacks/${feedbackTarget.feedback.id}`, {
data: feedback,
})

queryClient.setQueryData(['feedbackTarget', feedbackTarget.id], prev => ({
...prev,
feedback: feedbackData,
}))

const { id: feedbackTargetId, feedback } = feedbackTarget

if (feedback) {
const { data } = await apiClient.put(`/feedbacks/${feedback.id}`, {
data: feedbackData,
})

return data
}
return data
}

const { data } = await apiClient.post('/feedbacks', {
feedbackTargetId,
data: feedbackData,
})
const { data } = await apiClient.post('/feedbacks', {
feedbackTargetId: feedbackTarget.id,
data: feedback,
})

return data
},
{
onSuccess: feedback => {
queryClient.setQueryData(['feedbackTarget', String(feedbackTarget.id)], prev => ({
...prev,
feedback,
}))
},
}
)

return data
return mutation
}

export const saveContinuousFeedback = async (values, feedbackTargetId) => {
Expand Down

0 comments on commit 0eae9f9

Please sign in to comment.