oro-sdk 6.0.2 → 6.2.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/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "6.0.2",
2
+ "version": "6.2.0",
3
3
  "main": "dist/index.js",
4
4
  "typings": "dist/index.d.ts",
5
5
  "files": [
@@ -55,7 +55,7 @@
55
55
  "form-data": "^4.0.0",
56
56
  "formdata-node": "^4.3.1",
57
57
  "idb-keyval": "^5.0.6",
58
- "oro-sdk-apis": "~6.0.2",
58
+ "oro-sdk-apis": "~6.1.0",
59
59
  "oro-toolbox": "0.0.6",
60
60
  "uuid": "^8.3.2"
61
61
  }
@@ -21,6 +21,7 @@ import {
21
21
  WorkflowData,
22
22
  } from 'oro-sdk-apis'
23
23
  import {
24
+ detectChangesInWorkflowAnswers,
24
25
  filterTriggeredAnsweredWithKind,
25
26
  getImagesFromIndexDb,
26
27
  getWorkflowDataByCategory,
@@ -81,6 +82,9 @@ export async function registerPatient(
81
82
  const stepsTotalNum = 9
82
83
  let currentStep: number
83
84
 
85
+ // toggle all changed statuses if this workflow has previous/revision data
86
+ workflow = detectChangesInWorkflowAnswers(workflow)
87
+
84
88
  for (; retry > 0; retry--) {
85
89
  try {
86
90
  currentStep = 0
@@ -168,10 +172,10 @@ export async function registerPatient(
168
172
  oroClient,
169
173
  onProgress
170
174
  ? {
171
- onProgress,
172
- currentStep,
173
- stepsTotalNum,
174
- }
175
+ onProgress,
176
+ currentStep,
177
+ stepsTotalNum,
178
+ }
175
179
  : undefined
176
180
  ).catch((err) => {
177
181
  console.error('[SDK: registration] Some errors happened during image upload', err)
@@ -246,9 +250,9 @@ export async function registerPatient(
246
250
 
247
251
  if (errorsThrown.length > 0) throw errorsThrown
248
252
 
249
- if( consult.statusMedical === MedicalStatus.Assigning ){
253
+ if (consult.statusMedical === MedicalStatus.Assigning) {
250
254
  //hopefully svelte query received all updates
251
- console.warn( 'Consult assignation took too much time, moving to new anyway')
255
+ console.warn('Consult assignation took too much time, moving to new anyway')
252
256
  }
253
257
  // Deem the consultation as ready
254
258
  await oroClient.consultClient.updateConsultByUUID(consult.uuid, {
@@ -443,11 +447,11 @@ async function storeImageAliases(
443
447
  Math.round(
444
448
  ((progress.currentStep + 1) / progress.stepsTotalNum -
445
449
  progress.currentStep / progress.stepsTotalNum) *
446
- 100
450
+ 100
447
451
  ) / 100
448
452
  progress.onProgress(
449
453
  progress.currentStep / progress.stepsTotalNum +
450
- progressStepValue * (storedImagesNum / totalImagesNum),
454
+ progressStepValue * (storedImagesNum / totalImagesNum),
451
455
  'store_images',
452
456
  {
453
457
  storedImagesNum,
@@ -4,6 +4,7 @@ import {
4
4
  MetadataCategory,
5
5
  PopulatedWorkflowData,
6
6
  PopulatedWorkflowField,
7
+ PreviousAnswerData,
7
8
  QuestionData,
8
9
  SelectedAnswerData,
9
10
  SelectedAnswersData,
@@ -85,14 +86,30 @@ export async function getWorkflowDataByCategory(
85
86
 
86
87
  const fields: Record<string, PopulatedWorkflowField> = {}
87
88
 
89
+ let answersPerPage = (workflowData.selectedAnswers ?? [])
90
+ .map((pageAnswers, _) =>
91
+ Object.entries(pageAnswers)
92
+ .map(([k, v]) => [k, v, undefined]) as [string, SelectedAnswerData, PreviousAnswerData | undefined][])
93
+
94
+ if (workflowData.previousAnswers) {
95
+ // Since the selectedAnswers and previousAnswers should be a 1-1, we can map them together
96
+ answersPerPage = answersPerPage
97
+ .map((pageAnswers, pageIndex) => pageAnswers
98
+ .map(([questionId, v]): [string, SelectedAnswerData, PreviousAnswerData | undefined] => {
99
+ if (workflowData.previousAnswers && workflowData.previousAnswers[pageIndex][questionId])
100
+ return [questionId, v, workflowData.previousAnswers[pageIndex][questionId]]
101
+ return [questionId, v, undefined]
102
+ }
103
+ ))
104
+ }
105
+
88
106
  // Generates the answers of the specified category and adds the appropriate values if any are missing
89
107
  return Promise.all(
90
- workflowData.selectedAnswers
91
- .map((e) => Object.entries(e))
92
- .flat()
93
- .filter(([k, v]) => triggeredQuestions[k] && triggeredQuestions[k]['metaCategory'] === category)
94
- .map(([k, v]) => {
95
- return populateWorkflowField(triggeredQuestions[k], v).then((populatedValue) => {
108
+ answersPerPage
109
+ .flat(1) // remove the pages, we want the answers all together
110
+ .filter(([k]) => triggeredQuestions[k] && triggeredQuestions[k]['metaCategory'] === category)
111
+ .map(([k, v, p]) => {
112
+ return populateWorkflowField(triggeredQuestions[k], v, p).then((populatedValue) => {
96
113
  fields[k] = populatedValue
97
114
  })
98
115
  })
@@ -127,7 +144,8 @@ export async function getImagesFromIndexDb(answer: SelectedAnswerData): Promise<
127
144
  */
128
145
  async function populateWorkflowField(
129
146
  question: QuestionData,
130
- answerValue: SelectedAnswerData
147
+ answerValue: SelectedAnswerData,
148
+ previousAnswer?: PreviousAnswerData
131
149
  ): Promise<PopulatedWorkflowField> {
132
150
  let answer: any
133
151
  let displayedAnswer: string | string[] | undefined = undefined
@@ -175,6 +193,7 @@ async function populateWorkflowField(
175
193
  return Promise.resolve({
176
194
  answer,
177
195
  displayedAnswer,
196
+ previousAnswer,
178
197
  kind: question.kind,
179
198
  })
180
199
  }
@@ -297,3 +316,29 @@ export function fillWorkflowFromPopulatedWorkflow(workflow: WorkflowData, popula
297
316
 
298
317
  return filledWorkflow
299
318
  }
319
+
320
+ /**
321
+ * Checks and toggles the changed status for every answer in the workflow
322
+ * by comparing the previous answer with the selected answer of the same question
323
+ *
324
+ * @param workflow
325
+ * @returns the workflow with the updated `changed` statuses
326
+ */
327
+ export function detectChangesInWorkflowAnswers(workflow: WorkflowData): WorkflowData {
328
+ return {
329
+ ...workflow,
330
+ previousAnswers: workflow.previousAnswers ?
331
+ workflow.previousAnswers
332
+ .map((pageAnswers, pageId) => Object.fromEntries(Object.entries(pageAnswers).map(([question, answer]) => {
333
+ let selectedAnswer = undefined
334
+ if (workflow.selectedAnswers && workflow.selectedAnswers[pageId][question])
335
+ selectedAnswer = workflow.selectedAnswers[pageId][question]
336
+ let changed = !!selectedAnswer && !equalsAnswer(selectedAnswer, answer.previousAnswer)
337
+ return [question, { ...answer, changed }]
338
+ }))) : undefined
339
+ }
340
+ }
341
+
342
+ function equalsAnswer<T = SelectedAnswerData | WorkflowUploadedImage[]>(answer1: T, answer2: T): boolean {
343
+ return JSON.stringify(answer1) === JSON.stringify(answer2)
344
+ }