Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: amend updating signatures in client and workflow #7579

Merged
merged 9 commits into from
Sep 9, 2024
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@
- Fixed an issue where address line fields (e.g., address line 1, address line 2, etc.) were not being updated correctly when a user attempted to update a record's event location, such as place of birth or place of death. [#7531](https:/opencrvs/opencrvs-core/issues/7531)
- When a declaration(birth/death) is created the event location information was not being parsed to ElasticSearch which caused the Advanced search feature to not work when searching for records by event location.[7494](https:/opencrvs/opencrvs-core/issues/7494)
- When any user's role was updated, incorrect role was shown for that user's actions in the history section of a declaration's record audit page. [#7495](https:/opencrvs/opencrvs-core/issues/7495)
- When a user updates a marriage declaration editing the signature of the bride, groom, witness one or witness two, handle the changed value of the signature properly. [#7462](https:/opencrvs/opencrvs-core/issues/7462)

## 1.5.0 (TBD)

Expand Down
16 changes: 10 additions & 6 deletions packages/client/src/declarations/submissionMiddleware.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ import { getOfflineData } from '@client/offline/selectors'
import { IOfflineData } from '@client/offline/reducer'
import type { MutationToRequestRegistrationCorrectionArgs } from '@client/utils/gateway-deprecated-do-not-use'
import { UserDetails } from '@client/utils/userUtils'
import { getReviewForm } from '@client/forms/register/review-selectors'

type IReadyDeclaration = IDeclaration & {
action: SubmissionAction
Expand Down Expand Up @@ -172,10 +173,16 @@ export const submissionMiddleware: Middleware<{}, IStoreState> =
}
}

const form = getRegisterForm(getState())[event]
const isUpdateAction =
isValidationAction(submissionAction) || isRegisterAction(submissionAction)

const form = isUpdateAction
? getReviewForm(getState())[event]
: getRegisterForm(getState())[event]

const offlineData = getOfflineData(getState())
const graphqlPayload = getGqlDetails(
getRegisterForm(getState())[event],
form,
declaration,
getOfflineData(getState()),
getState().offline.userDetails as UserDetails
Expand All @@ -189,10 +196,7 @@ export const submissionMiddleware: Middleware<{}, IStoreState> =
graphqlPayload.registration.correction.values = changedValues
}

if (
isValidationAction(submissionAction) ||
isRegisterAction(submissionAction)
) {
if (isUpdateAction) {
const changedValues = getChangedValues(form, declaration, offlineData)
graphqlPayload.registration ??= {}
graphqlPayload.registration.changedValues = changedValues
Expand Down
11 changes: 9 additions & 2 deletions packages/client/src/views/RecordAudit/ActionDetailsModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -44,11 +44,13 @@ import { Pill } from '@opencrvs/components/lib/Pill'
import { recordAuditMessages } from '@client/i18n/messages/views/recordAudit'
import { formatLongDate } from '@client/utils/date-formatting'
import { EMPTY_STRING } from '@client/utils/constants'
import { IReviewFormState } from '@client/forms/register/reviewReducer'

interface IActionDetailsModalListTable {
actionDetailsData: History
actionDetailsIndex: number
registerForm: IForm
reviewForm: IReviewFormState
intl: IntlShape
offlineData: Partial<IOfflineData>
draft: IDeclaration | null
Expand Down Expand Up @@ -207,6 +209,7 @@ const ActionDetailsModalListTable = ({
actionDetailsData,
actionDetailsIndex,
registerForm,
reviewForm,
intl,
offlineData,
draft
Expand All @@ -215,7 +218,8 @@ const ActionDetailsModalListTable = ({

if (registerForm === undefined) return <></>

const sections = registerForm?.sections || []
const event = draft?.event || 'birth'
const sections = reviewForm.reviewForm?.[event].sections || []
const requesterColumn = [
{
key: 'requester',
Expand Down Expand Up @@ -322,7 +326,7 @@ const ActionDetailsModalListTable = ({
(section) => section.id === item?.valueCode
) as IFormSection

if (section.id === 'documents') {
if (['documents', 'review', 'preview'].includes(section.id)) {
item.value = EMPTY_STRING
editedValue.value = intl.formatMessage(dynamicConstantsMessages.updated)
}
Expand Down Expand Up @@ -625,6 +629,7 @@ export const ActionDetailsModal = ({
userDetails,
goToUser,
registerForm,
reviewForm,
offlineData,
draft
}: {
Expand All @@ -636,6 +641,7 @@ export const ActionDetailsModal = ({
userDetails: UserDetails | null
goToUser: typeof goToUserProfile
registerForm: IForm
reviewForm: IReviewFormState
offlineData: Partial<IOfflineData>
draft: IDeclaration | null
}) => {
Expand Down Expand Up @@ -695,6 +701,7 @@ export const ActionDetailsModal = ({
actionDetailsData={actionDetailsData}
actionDetailsIndex={actionDetailsIndex}
registerForm={registerForm}
reviewForm={reviewForm}
intl={intl}
offlineData={offlineData}
draft={draft}
Expand Down
12 changes: 9 additions & 3 deletions packages/client/src/views/RecordAudit/RecordAudit.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,7 @@ import { Icon } from '@opencrvs/components/lib/Icon'

import { UserDetails } from '@client/utils/userUtils'
import { client } from '@client/utils/apolloClient'
import { IReviewFormState } from '@client/forms/register/reviewReducer'

const DesktopHeader = styled(Header)`
@media (max-width: ${({ theme }) => theme.grid.breakpoints.lg}px) {
Expand Down Expand Up @@ -178,6 +179,7 @@ interface IStateProps {
workqueueDeclaration: GQLEventSearchSet | null
registerForm: IRegisterFormState
offlineData: Partial<IOfflineData>
reviewForm: IReviewFormState
}

interface IDispatchProps {
Expand Down Expand Up @@ -295,7 +297,8 @@ function RecordAuditBody({
goToUserProfile,
goToTeamUserList,
goBack,
offlineData
offlineData,
reviewForm
}: {
declaration: IDeclarationData
draft: IDeclaration | null
Expand All @@ -307,6 +310,7 @@ function RecordAuditBody({
offlineData: Partial<IOfflineData>
refetchDeclarationInfo?: () => void
tab: IRecordAuditTabs
reviewForm: IReviewFormState
} & IDispatchProps) {
const [showDialog, setShowDialog] = React.useState(false)
const [showActionDetails, setActionDetails] = React.useState(false)
Expand Down Expand Up @@ -558,7 +562,8 @@ function RecordAuditBody({
goToUser: goToUserProfile,
registerForm: regForm,
offlineData,
draft
draft,
reviewForm
}

const mobileProps: IAppBarProps = {
Expand Down Expand Up @@ -865,7 +870,8 @@ function mapStateToProps(state: IStoreState, props: RouteProps): IStateProps {
state.workqueueState.workqueue.data[tab]?.results?.find(
(gqlSearchSet) => gqlSearchSet?.id === declarationId
)) ||
null
null,
reviewForm: state.reviewForm
}
}

Expand Down
70 changes: 68 additions & 2 deletions packages/workflow/src/records/handler/update.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,10 @@ import {
InProgressRecord,
ReadyForReviewRecord,
getComposition,
getInformantType
getInformantType,
getTaskFromSavedBundle,
findExtension,
SavedTask
} from '@opencrvs/commons/types'
import { z } from 'zod'
import { indexBundle } from '@workflow/records/search'
Expand Down Expand Up @@ -82,6 +85,7 @@ export const updateRoute = createRoute({
handler: async (request, record) => {
const token = getToken(request)
const payload = validateRequest(requestSchema, request.payload)
const oldRecord = JSON.parse(JSON.stringify(record))

const informantTypeOfBundle = getInformantType(record)
const payloadInformantType = payload.details.registration.informantType
Expand Down Expand Up @@ -115,9 +119,71 @@ export const updateRoute = createRoute({
recordInputWithUploadedAttachments,
event
)
const updatedRecord = await toUpdated(updatedBundle, token, updatedDetails)

const updatedBundleWithSignaturesUri = keepPreviousSignatureUris(
oldRecord,
updatedBundle
)

const updatedRecord = await toUpdated(
updatedBundleWithSignaturesUri,
token,
updatedDetails
)

await indexBundle(updatedRecord, token)
return updatedRecord
}
})

const signatureExtensions = [
'http://opencrvs.org/specs/extension/informants-signature',
'http://opencrvs.org/specs/extension/groom-signature',
'http://opencrvs.org/specs/extension/bride-signature',
'http://opencrvs.org/specs/extension/witness-one-signature',
'http://opencrvs.org/specs/extension/witness-two-signature'
] as const

function keepPreviousSignatureUris(
Nil20 marked this conversation as resolved.
Show resolved Hide resolved
previousBundle: InProgressRecord | ReadyForReviewRecord,
updatedBundle: InProgressRecord | ReadyForReviewRecord
) {
const oldTask = getTaskFromSavedBundle(previousBundle)
const newTask = getTaskFromSavedBundle(updatedBundle)
let newBundle: InProgressRecord | ReadyForReviewRecord = updatedBundle

for (const ext of signatureExtensions) {
if (
findExtension(ext, newTask.extension) &&
findExtension(ext, oldTask.extension)
) {
const taskFromTheUpdatedBundle = getTaskFromSavedBundle(newBundle)
const replacingTaskExtension = oldTask.extension.find(
(e) => e.url === ext
)!

const replacingTask: SavedTask = {
...taskFromTheUpdatedBundle,
extension: [
...taskFromTheUpdatedBundle.extension.filter((e) => e.url !== ext),
replacingTaskExtension
]
}

newBundle = {
...newBundle,
entry: [
...newBundle.entry.filter((e) => e.resource.resourceType !== 'Task'),
{
fullUrl: previousBundle.entry.find(
(e) => e.resource.resourceType === 'Task'
)!.fullUrl,
resource: replacingTask
}
]
}
}
}

return newBundle
}
Loading