2022-03-21 17:05:51 +01:00
|
|
|
import {
|
2022-06-11 07:27:38 +02:00
|
|
|
Group,
|
2022-03-21 17:05:51 +01:00
|
|
|
Variable,
|
2022-06-11 07:27:38 +02:00
|
|
|
InputBlock,
|
2022-03-21 17:05:51 +01:00
|
|
|
ResultHeaderCell,
|
|
|
|
ResultWithAnswers,
|
|
|
|
Answer,
|
|
|
|
VariableWithValue,
|
|
|
|
} from 'models'
|
2022-06-11 07:27:38 +02:00
|
|
|
import { isInputBlock, isDefined, byId } from './utils'
|
2022-03-21 17:05:51 +01:00
|
|
|
|
|
|
|
export const parseResultHeader = ({
|
2022-06-11 07:27:38 +02:00
|
|
|
groups,
|
2022-03-21 17:05:51 +01:00
|
|
|
variables,
|
|
|
|
}: {
|
2022-06-11 07:27:38 +02:00
|
|
|
groups: Group[]
|
2022-03-21 17:05:51 +01:00
|
|
|
variables: Variable[]
|
|
|
|
}): ResultHeaderCell[] => {
|
2022-06-11 07:27:38 +02:00
|
|
|
const parsedGroups = parseInputsResultHeader({ groups, variables })
|
2022-03-21 17:05:51 +01:00
|
|
|
return [
|
2022-07-01 17:08:35 +02:00
|
|
|
{ label: 'Submitted at', id: 'date' },
|
2022-06-11 07:27:38 +02:00
|
|
|
...parsedGroups,
|
|
|
|
...parseVariablesHeaders(variables, parsedGroups),
|
2022-03-21 17:05:51 +01:00
|
|
|
]
|
|
|
|
}
|
|
|
|
|
|
|
|
const parseInputsResultHeader = ({
|
2022-06-11 07:27:38 +02:00
|
|
|
groups,
|
2022-03-21 17:05:51 +01:00
|
|
|
variables,
|
|
|
|
}: {
|
2022-06-11 07:27:38 +02:00
|
|
|
groups: Group[]
|
2022-03-21 17:05:51 +01:00
|
|
|
variables: Variable[]
|
|
|
|
}): ResultHeaderCell[] =>
|
|
|
|
(
|
2022-06-11 07:27:38 +02:00
|
|
|
groups
|
|
|
|
.flatMap((g) =>
|
|
|
|
g.blocks.map((s) => ({
|
2022-03-21 17:05:51 +01:00
|
|
|
...s,
|
2022-06-11 07:27:38 +02:00
|
|
|
blockTitle: g.title,
|
2022-03-21 17:05:51 +01:00
|
|
|
}))
|
|
|
|
)
|
2022-06-11 07:27:38 +02:00
|
|
|
.filter((block) => isInputBlock(block)) as (InputBlock & {
|
2022-03-21 17:05:51 +01:00
|
|
|
blockTitle: string
|
|
|
|
})[]
|
2022-06-11 07:27:38 +02:00
|
|
|
).reduce<ResultHeaderCell[]>((headers, inputBlock) => {
|
2022-03-21 17:05:51 +01:00
|
|
|
if (
|
|
|
|
headers.find(
|
|
|
|
(h) =>
|
|
|
|
isDefined(h.variableId) &&
|
|
|
|
h.variableId ===
|
2022-06-11 07:27:38 +02:00
|
|
|
variables.find(byId(inputBlock.options.variableId))?.id
|
2022-03-21 17:05:51 +01:00
|
|
|
)
|
|
|
|
)
|
|
|
|
return headers
|
|
|
|
const matchedVariableName =
|
2022-06-11 07:27:38 +02:00
|
|
|
inputBlock.options.variableId &&
|
|
|
|
variables.find(byId(inputBlock.options.variableId))?.name
|
2022-03-21 17:05:51 +01:00
|
|
|
|
2022-06-11 07:27:38 +02:00
|
|
|
let label = matchedVariableName ?? inputBlock.blockTitle
|
2022-03-21 17:05:51 +01:00
|
|
|
const totalPrevious = headers.filter((h) => h.label.includes(label)).length
|
|
|
|
if (totalPrevious > 0) label = label + ` (${totalPrevious})`
|
|
|
|
return [
|
|
|
|
...headers,
|
|
|
|
{
|
2022-07-01 17:08:35 +02:00
|
|
|
id: inputBlock.id,
|
2022-06-11 07:27:38 +02:00
|
|
|
blockType: inputBlock.type,
|
|
|
|
blockId: inputBlock.id,
|
|
|
|
variableId: inputBlock.options.variableId,
|
2022-03-21 17:05:51 +01:00
|
|
|
label,
|
2022-06-11 07:27:38 +02:00
|
|
|
isLong: 'isLong' in inputBlock.options && inputBlock.options.isLong,
|
2022-03-21 17:05:51 +01:00
|
|
|
},
|
|
|
|
]
|
|
|
|
}, [])
|
|
|
|
|
|
|
|
const parseVariablesHeaders = (
|
|
|
|
variables: Variable[],
|
2022-06-11 07:27:38 +02:00
|
|
|
blockResultHeader: ResultHeaderCell[]
|
2022-03-21 17:05:51 +01:00
|
|
|
) =>
|
|
|
|
variables.reduce<ResultHeaderCell[]>((headers, v) => {
|
2022-06-11 07:27:38 +02:00
|
|
|
if (blockResultHeader.find((h) => h.variableId === v.id)) return headers
|
2022-03-21 17:05:51 +01:00
|
|
|
return [
|
|
|
|
...headers,
|
|
|
|
{
|
2022-07-01 17:08:35 +02:00
|
|
|
id: v.id,
|
2022-03-21 17:05:51 +01:00
|
|
|
label: v.name,
|
|
|
|
variableId: v.id,
|
|
|
|
},
|
|
|
|
]
|
|
|
|
}, [])
|
|
|
|
|
|
|
|
export const parseAnswers =
|
2022-06-11 07:27:38 +02:00
|
|
|
({ groups, variables }: { groups: Group[]; variables: Variable[] }) =>
|
2022-03-21 17:05:51 +01:00
|
|
|
({
|
|
|
|
createdAt,
|
|
|
|
answers,
|
2022-03-28 17:07:47 +02:00
|
|
|
variables: resultVariables,
|
|
|
|
}: Pick<ResultWithAnswers, 'createdAt' | 'answers' | 'variables'>): {
|
2022-03-21 17:05:51 +01:00
|
|
|
[key: string]: string
|
|
|
|
} => {
|
2022-06-11 07:27:38 +02:00
|
|
|
const header = parseResultHeader({ groups, variables })
|
2022-03-21 17:05:51 +01:00
|
|
|
return {
|
|
|
|
submittedAt: createdAt,
|
2022-03-28 17:07:47 +02:00
|
|
|
...[...answers, ...resultVariables].reduce<{
|
2022-03-21 17:05:51 +01:00
|
|
|
[key: string]: string
|
|
|
|
}>((o, answerOrVariable) => {
|
|
|
|
if ('blockId' in answerOrVariable) {
|
|
|
|
const answer = answerOrVariable as Answer
|
|
|
|
const key = answer.variableId
|
|
|
|
? header.find((cell) => cell.variableId === answer.variableId)
|
|
|
|
?.label
|
2022-06-11 07:27:38 +02:00
|
|
|
: header.find((cell) => cell.blockId === answer.blockId)?.label
|
2022-03-21 17:05:51 +01:00
|
|
|
if (!key) return o
|
|
|
|
return {
|
|
|
|
...o,
|
2022-03-29 11:37:36 +02:00
|
|
|
[key]: answer.content.toString(),
|
2022-03-21 17:05:51 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
const variable = answerOrVariable as VariableWithValue
|
2022-04-06 10:31:02 +02:00
|
|
|
if (isDefined(o[variable.name])) return o
|
|
|
|
return { ...o, [variable.name]: variable.value }
|
2022-03-21 17:05:51 +01:00
|
|
|
}, {}),
|
|
|
|
}
|
|
|
|
}
|