@acorex-platform/module-assessment-management-client 2.0.0-next.3 → 2.0.0-next.30

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.
Files changed (93) hide show
  1. package/fesm2022/{acorex-platform-module-assessment-management-client-acorex-platform-module-assessment-management-client-Dr56BtSo.mjs → acorex-platform-module-assessment-management-client-acorex-platform-module-assessment-management-client-CTgUvF5N.mjs} +429 -157
  2. package/fesm2022/acorex-platform-module-assessment-management-client-acorex-platform-module-assessment-management-client-CTgUvF5N.mjs.map +1 -0
  3. package/fesm2022/{acorex-platform-module-assessment-management-client-assessment-session-answers-view.util-42ZcOY2C.mjs → acorex-platform-module-assessment-management-client-assessment-session-answers-view.util-D5gUv0HJ.mjs} +4 -4
  4. package/fesm2022/acorex-platform-module-assessment-management-client-assessment-session-answers-view.util-D5gUv0HJ.mjs.map +1 -0
  5. package/fesm2022/{acorex-platform-module-assessment-management-client-assessment-voice.commands-Zv4Q1ASd.mjs → acorex-platform-module-assessment-management-client-assessment-voice.commands-i8HyWoKX.mjs} +2 -2
  6. package/fesm2022/{acorex-platform-module-assessment-management-client-assessment-voice.commands-Zv4Q1ASd.mjs.map → acorex-platform-module-assessment-management-client-assessment-voice.commands-i8HyWoKX.mjs.map} +1 -1
  7. package/fesm2022/acorex-platform-module-assessment-management-client-contracts-entities-assessment-session.mjs +1 -1
  8. package/fesm2022/acorex-platform-module-assessment-management-client-contracts-entities-assessment-session.mjs.map +1 -1
  9. package/fesm2022/acorex-platform-module-assessment-management-client-contracts-entities-question-bank-item.mjs +58 -7
  10. package/fesm2022/acorex-platform-module-assessment-management-client-contracts-entities-question-bank-item.mjs.map +1 -1
  11. package/fesm2022/acorex-platform-module-assessment-management-client-contracts-entities-questionnaire.mjs +137 -8
  12. package/fesm2022/acorex-platform-module-assessment-management-client-contracts-entities-questionnaire.mjs.map +1 -1
  13. package/fesm2022/{acorex-platform-module-assessment-management-client-contracts-entity-catalog-acorex-platform-module-assessment-management-client-contracts-entity-catalog-Buqp2FnP.mjs → acorex-platform-module-assessment-management-client-contracts-entity-catalog-acorex-platform-module-assessment-management-client-contracts-entity-catalog-3F4p6ljC.mjs} +6 -6
  14. package/fesm2022/{acorex-platform-module-assessment-management-client-contracts-entity-catalog-acorex-platform-module-assessment-management-client-contracts-entity-catalog-Buqp2FnP.mjs.map → acorex-platform-module-assessment-management-client-contracts-entity-catalog-acorex-platform-module-assessment-management-client-contracts-entity-catalog-3F4p6ljC.mjs.map} +1 -1
  15. package/fesm2022/{acorex-platform-module-assessment-management-client-contracts-entity-catalog-assessment-case.entity-IAO_eHLl.mjs → acorex-platform-module-assessment-management-client-contracts-entity-catalog-assessment-case.entity-CyWqUVBO.mjs} +2 -2
  16. package/fesm2022/{acorex-platform-module-assessment-management-client-contracts-entity-catalog-assessment-case.entity-IAO_eHLl.mjs.map → acorex-platform-module-assessment-management-client-contracts-entity-catalog-assessment-case.entity-CyWqUVBO.mjs.map} +1 -1
  17. package/fesm2022/{acorex-platform-module-assessment-management-client-contracts-entity-catalog-assessment-session.entity-BVVzsiLh.mjs → acorex-platform-module-assessment-management-client-contracts-entity-catalog-assessment-session.entity-CnfnDCou.mjs} +3 -3
  18. package/fesm2022/acorex-platform-module-assessment-management-client-contracts-entity-catalog-assessment-session.entity-CnfnDCou.mjs.map +1 -0
  19. package/fesm2022/{acorex-platform-module-assessment-management-client-contracts-entity-catalog-question-bank-item.entity-WON7pvW1.mjs → acorex-platform-module-assessment-management-client-contracts-entity-catalog-question-bank-item.entity-DTAhcFz1.mjs} +60 -9
  20. package/fesm2022/acorex-platform-module-assessment-management-client-contracts-entity-catalog-question-bank-item.entity-DTAhcFz1.mjs.map +1 -0
  21. package/fesm2022/{acorex-platform-module-assessment-management-client-contracts-entity-catalog-questionnaire.entity-BZ5FdPuP.mjs → acorex-platform-module-assessment-management-client-contracts-entity-catalog-questionnaire.entity-mSpjIACS.mjs} +139 -10
  22. package/fesm2022/acorex-platform-module-assessment-management-client-contracts-entity-catalog-questionnaire.entity-mSpjIACS.mjs.map +1 -0
  23. package/fesm2022/{acorex-platform-module-assessment-management-client-contracts-entity-catalog-template.entity-L_p7_kL1.mjs → acorex-platform-module-assessment-management-client-contracts-entity-catalog-template.entity-DqChTI6T.mjs} +2 -2
  24. package/fesm2022/{acorex-platform-module-assessment-management-client-contracts-entity-catalog-template.entity-L_p7_kL1.mjs.map → acorex-platform-module-assessment-management-client-contracts-entity-catalog-template.entity-DqChTI6T.mjs.map} +1 -1
  25. package/fesm2022/acorex-platform-module-assessment-management-client-contracts-entity-catalog.mjs +1 -1
  26. package/fesm2022/acorex-platform-module-assessment-management-client-contracts.mjs +248 -1
  27. package/fesm2022/acorex-platform-module-assessment-management-client-contracts.mjs.map +1 -1
  28. package/fesm2022/{acorex-platform-module-assessment-management-client-fill-assessment-session.command-B88LFQGF.mjs → acorex-platform-module-assessment-management-client-fill-assessment-session.command-BMbabfFM.mjs} +19 -7
  29. package/fesm2022/acorex-platform-module-assessment-management-client-fill-assessment-session.command-BMbabfFM.mjs.map +1 -0
  30. package/fesm2022/{acorex-platform-module-assessment-management-client-form-template-viewer-popup.component-BnSOK29v.mjs → acorex-platform-module-assessment-management-client-form-template-viewer-popup.component-DoHAqV-K.mjs} +2 -2
  31. package/fesm2022/{acorex-platform-module-assessment-management-client-form-template-viewer-popup.component-BnSOK29v.mjs.map → acorex-platform-module-assessment-management-client-form-template-viewer-popup.component-DoHAqV-K.mjs.map} +1 -1
  32. package/fesm2022/{acorex-platform-module-assessment-management-client-form-template-viewer.service-FsoP5GoC.mjs → acorex-platform-module-assessment-management-client-form-template-viewer.service-EyEqTudf.mjs} +3 -3
  33. package/fesm2022/{acorex-platform-module-assessment-management-client-form-template-viewer.service-FsoP5GoC.mjs.map → acorex-platform-module-assessment-management-client-form-template-viewer.service-EyEqTudf.mjs.map} +1 -1
  34. package/fesm2022/{acorex-platform-module-assessment-management-client-index-CY7Rj5LR.mjs → acorex-platform-module-assessment-management-client-index-37kgJmNx.mjs} +2 -2
  35. package/fesm2022/{acorex-platform-module-assessment-management-client-index-CY7Rj5LR.mjs.map → acorex-platform-module-assessment-management-client-index-37kgJmNx.mjs.map} +1 -1
  36. package/fesm2022/{acorex-platform-module-assessment-management-client-open-form-template.command-A-TnX3P_.mjs → acorex-platform-module-assessment-management-client-open-form-template.command-Cy63Naw1.mjs} +3 -3
  37. package/fesm2022/{acorex-platform-module-assessment-management-client-open-form-template.command-A-TnX3P_.mjs.map → acorex-platform-module-assessment-management-client-open-form-template.command-Cy63Naw1.mjs.map} +1 -1
  38. package/fesm2022/{acorex-platform-module-assessment-management-client-preview-form-template.command-C2oXajyi.mjs → acorex-platform-module-assessment-management-client-preview-form-template.command-DJvFt6nq.mjs} +2 -2
  39. package/fesm2022/{acorex-platform-module-assessment-management-client-preview-form-template.command-C2oXajyi.mjs.map → acorex-platform-module-assessment-management-client-preview-form-template.command-DJvFt6nq.mjs.map} +1 -1
  40. package/fesm2022/{acorex-platform-module-assessment-management-client-preview-question.command-CMInpf_N.mjs → acorex-platform-module-assessment-management-client-preview-question.command-DX416TnV.mjs} +2 -2
  41. package/fesm2022/{acorex-platform-module-assessment-management-client-preview-question.command-CMInpf_N.mjs.map → acorex-platform-module-assessment-management-client-preview-question.command-DX416TnV.mjs.map} +1 -1
  42. package/fesm2022/{acorex-platform-module-assessment-management-client-preview-questionnaire.command-BCl7mxLu.mjs → acorex-platform-module-assessment-management-client-preview-questionnaire.command-DK5332ue.mjs} +2 -2
  43. package/fesm2022/{acorex-platform-module-assessment-management-client-preview-questionnaire.command-BCl7mxLu.mjs.map → acorex-platform-module-assessment-management-client-preview-questionnaire.command-DK5332ue.mjs.map} +1 -1
  44. package/fesm2022/{acorex-platform-module-assessment-management-client-question-bank-interface-editor-widget-edit.component-SUpzNllw.mjs → acorex-platform-module-assessment-management-client-question-bank-interface-editor-widget-edit.component-BrVB3N7L.mjs} +3 -3
  45. package/fesm2022/{acorex-platform-module-assessment-management-client-question-bank-interface-editor-widget-edit.component-SUpzNllw.mjs.map → acorex-platform-module-assessment-management-client-question-bank-interface-editor-widget-edit.component-BrVB3N7L.mjs.map} +1 -1
  46. package/fesm2022/{acorex-platform-module-assessment-management-client-questionnaire-questions-editor-edit.component-DNNHMsa1.mjs → acorex-platform-module-assessment-management-client-questionnaire-questions-editor-edit.component-C4GtXmNi.mjs} +2 -2
  47. package/fesm2022/{acorex-platform-module-assessment-management-client-questionnaire-questions-editor-edit.component-DNNHMsa1.mjs.map → acorex-platform-module-assessment-management-client-questionnaire-questions-editor-edit.component-C4GtXmNi.mjs.map} +1 -1
  48. package/fesm2022/{acorex-platform-module-assessment-management-client-questionnaire-viewer-edit.component-CFsLdcCd.mjs → acorex-platform-module-assessment-management-client-questionnaire-viewer-edit.component-CooDmfmz.mjs} +2 -2
  49. package/fesm2022/{acorex-platform-module-assessment-management-client-questionnaire-viewer-edit.component-CFsLdcCd.mjs.map → acorex-platform-module-assessment-management-client-questionnaire-viewer-edit.component-CooDmfmz.mjs.map} +1 -1
  50. package/fesm2022/{acorex-platform-module-assessment-management-client-questionnaire-viewer-popup.component-_VaiHN2w.mjs → acorex-platform-module-assessment-management-client-questionnaire-viewer-popup.component-CwdllC6_.mjs} +38 -4
  51. package/fesm2022/acorex-platform-module-assessment-management-client-questionnaire-viewer-popup.component-CwdllC6_.mjs.map +1 -0
  52. package/fesm2022/{acorex-platform-module-assessment-management-client-related-content-viewer-page-component.provider-tSXHNIPe.mjs → acorex-platform-module-assessment-management-client-related-content-viewer-page-component.provider-D2J2uxu5.mjs} +2 -2
  53. package/fesm2022/{acorex-platform-module-assessment-management-client-related-content-viewer-page-component.provider-tSXHNIPe.mjs.map → acorex-platform-module-assessment-management-client-related-content-viewer-page-component.provider-D2J2uxu5.mjs.map} +1 -1
  54. package/fesm2022/{acorex-platform-module-assessment-management-client-review-assessment-session.command-ei5Yuxft.mjs → acorex-platform-module-assessment-management-client-review-assessment-session.command-CcFy_KhS.mjs} +5 -5
  55. package/fesm2022/acorex-platform-module-assessment-management-client-review-assessment-session.command-CcFy_KhS.mjs.map +1 -0
  56. package/fesm2022/{acorex-platform-module-assessment-management-client-show-form-template-viewer-popup.command-CC_MiEhE.mjs → acorex-platform-module-assessment-management-client-show-form-template-viewer-popup.command-2N9eq7ym.mjs} +3 -3
  57. package/fesm2022/{acorex-platform-module-assessment-management-client-show-form-template-viewer-popup.command-CC_MiEhE.mjs.map → acorex-platform-module-assessment-management-client-show-form-template-viewer-popup.command-2N9eq7ym.mjs.map} +1 -1
  58. package/fesm2022/{acorex-platform-module-assessment-management-client-show-questionnaire-questions-popup.command-6yO3hkNQ.mjs → acorex-platform-module-assessment-management-client-show-questionnaire-questions-popup.command-BU-ZiepT.mjs} +2 -2
  59. package/fesm2022/{acorex-platform-module-assessment-management-client-show-questionnaire-questions-popup.command-6yO3hkNQ.mjs.map → acorex-platform-module-assessment-management-client-show-questionnaire-questions-popup.command-BU-ZiepT.mjs.map} +1 -1
  60. package/fesm2022/{acorex-platform-module-assessment-management-client-show-questionnaire-viewer-popup.command-BgiXwWzD.mjs → acorex-platform-module-assessment-management-client-show-questionnaire-viewer-popup.command-DA_nZRms.mjs} +2 -2
  61. package/fesm2022/{acorex-platform-module-assessment-management-client-show-questionnaire-viewer-popup.command-BgiXwWzD.mjs.map → acorex-platform-module-assessment-management-client-show-questionnaire-viewer-popup.command-DA_nZRms.mjs.map} +1 -1
  62. package/fesm2022/{acorex-platform-module-assessment-management-client-template-widget-edit.component-Bw4pp8op.mjs → acorex-platform-module-assessment-management-client-template-widget-edit.component-DB43M3Tz.mjs} +2 -2
  63. package/fesm2022/{acorex-platform-module-assessment-management-client-template-widget-edit.component-Bw4pp8op.mjs.map → acorex-platform-module-assessment-management-client-template-widget-edit.component-DB43M3Tz.mjs.map} +1 -1
  64. package/fesm2022/{acorex-platform-module-assessment-management-client-test-sheet-cell-type-widget-edit.component-DIug50SN.mjs → acorex-platform-module-assessment-management-client-test-sheet-cell-type-widget-edit.component-DlUIJwXz.mjs} +3 -3
  65. package/fesm2022/{acorex-platform-module-assessment-management-client-test-sheet-cell-type-widget-edit.component-DIug50SN.mjs.map → acorex-platform-module-assessment-management-client-test-sheet-cell-type-widget-edit.component-DlUIJwXz.mjs.map} +1 -1
  66. package/fesm2022/{acorex-platform-module-assessment-management-client-test-sheet-grid.component-BgFhyqrK.mjs → acorex-platform-module-assessment-management-client-test-sheet-grid.component-BxQPkSpO.mjs} +3 -3
  67. package/fesm2022/{acorex-platform-module-assessment-management-client-test-sheet-grid.component-BgFhyqrK.mjs.map → acorex-platform-module-assessment-management-client-test-sheet-grid.component-BxQPkSpO.mjs.map} +1 -1
  68. package/fesm2022/{acorex-platform-module-assessment-management-client-test-sheet-schema-widget-edit.component-D320BoBB.mjs → acorex-platform-module-assessment-management-client-test-sheet-schema-widget-edit.component-C2VvPYjU.mjs} +3 -3
  69. package/fesm2022/{acorex-platform-module-assessment-management-client-test-sheet-schema-widget-edit.component-D320BoBB.mjs.map → acorex-platform-module-assessment-management-client-test-sheet-schema-widget-edit.component-C2VvPYjU.mjs.map} +1 -1
  70. package/fesm2022/{acorex-platform-module-assessment-management-client-test-sheet-widget-edit.component-DCuQsJUO.mjs → acorex-platform-module-assessment-management-client-test-sheet-widget-edit.component-CIlEOr4p.mjs} +3 -3
  71. package/fesm2022/{acorex-platform-module-assessment-management-client-test-sheet-widget-edit.component-DCuQsJUO.mjs.map → acorex-platform-module-assessment-management-client-test-sheet-widget-edit.component-CIlEOr4p.mjs.map} +1 -1
  72. package/fesm2022/{acorex-platform-module-assessment-management-client-test-sheet-widget-view.component-DT0jt6Cd.mjs → acorex-platform-module-assessment-management-client-test-sheet-widget-view.component-BJ-SF0L1.mjs} +3 -3
  73. package/fesm2022/{acorex-platform-module-assessment-management-client-test-sheet-widget-view.component-DT0jt6Cd.mjs.map → acorex-platform-module-assessment-management-client-test-sheet-widget-view.component-BJ-SF0L1.mjs.map} +1 -1
  74. package/fesm2022/{acorex-platform-module-assessment-management-client-test-sheet.util-CxWsnTvd.mjs → acorex-platform-module-assessment-management-client-test-sheet.util-CXwScb4j.mjs} +2 -2
  75. package/fesm2022/{acorex-platform-module-assessment-management-client-test-sheet.util-CxWsnTvd.mjs.map → acorex-platform-module-assessment-management-client-test-sheet.util-CXwScb4j.mjs.map} +1 -1
  76. package/fesm2022/{acorex-platform-module-assessment-management-client-view-session-answers.command-rsDFSIgz.mjs → acorex-platform-module-assessment-management-client-view-session-answers.command-DtmC9mBT.mjs} +6 -6
  77. package/fesm2022/acorex-platform-module-assessment-management-client-view-session-answers.command-DtmC9mBT.mjs.map +1 -0
  78. package/fesm2022/acorex-platform-module-assessment-management-client.mjs +1 -1
  79. package/i18n/en-AU/assessment-management.json +24 -2
  80. package/i18n/en-US/assessment-management.json +24 -2
  81. package/i18n/fa-IR/assessment-management.json +24 -2
  82. package/package.json +4 -4
  83. package/types/acorex-platform-module-assessment-management-client-contracts.d.ts +65 -4
  84. package/types/acorex-platform-module-assessment-management-client.d.ts +22 -0
  85. package/fesm2022/acorex-platform-module-assessment-management-client-acorex-platform-module-assessment-management-client-Dr56BtSo.mjs.map +0 -1
  86. package/fesm2022/acorex-platform-module-assessment-management-client-assessment-session-answers-view.util-42ZcOY2C.mjs.map +0 -1
  87. package/fesm2022/acorex-platform-module-assessment-management-client-contracts-entity-catalog-assessment-session.entity-BVVzsiLh.mjs.map +0 -1
  88. package/fesm2022/acorex-platform-module-assessment-management-client-contracts-entity-catalog-question-bank-item.entity-WON7pvW1.mjs.map +0 -1
  89. package/fesm2022/acorex-platform-module-assessment-management-client-contracts-entity-catalog-questionnaire.entity-BZ5FdPuP.mjs.map +0 -1
  90. package/fesm2022/acorex-platform-module-assessment-management-client-fill-assessment-session.command-B88LFQGF.mjs.map +0 -1
  91. package/fesm2022/acorex-platform-module-assessment-management-client-questionnaire-viewer-popup.component-_VaiHN2w.mjs.map +0 -1
  92. package/fesm2022/acorex-platform-module-assessment-management-client-review-assessment-session.command-ei5Yuxft.mjs.map +0 -1
  93. package/fesm2022/acorex-platform-module-assessment-management-client-view-session-answers.command-rsDFSIgz.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"acorex-platform-module-assessment-management-client-test-sheet.util-CxWsnTvd.mjs","sources":["../../../../libs/modules/assessment-management/client/src/lib/features/questionnaire-builder/questions/widgets/test-sheet/test-sheet.util.ts"],"sourcesContent":["import type { AXPWidgetNode } from '@acorex-platform/framework-shared/core';\nimport type { AXPSpreadsheetColumn, AXPSpreadsheetRowWidget } from '@acorex-platform/framework-client/layout/components';\n\nimport {\n AXM_TEST_SHEET_INPUT_WIDGET_TYPES,\n AXM_TEST_SHEET_ROW_GROUP_PATH,\n type AXMTestSheetColumn,\n type AXMTestSheetDefinition,\n type AXMTestSheetInputWidgetType,\n type AXMTestSheetLayout,\n type AXMTestSheetPercentDiff,\n type AXMTestSheetRow,\n type AXMTestSheetRowMode,\n} from './test-sheet.types';\n\n//#region ----- Normalize -----\n\nexport function emptyTestSheetDefinition(): AXMTestSheetDefinition {\n return {\n rowMode: 'fixed',\n layout: 'column-inputs',\n columns: [],\n rows: [],\n };\n}\n\nexport function normalizeTestSheetDefinition(value: unknown): AXMTestSheetDefinition {\n const source = isRecord(value) ? value : {};\n const rowMode: AXMTestSheetRowMode = source['rowMode'] === 'repeated' ? 'repeated' : 'fixed';\n const layout: AXMTestSheetLayout = source['layout'] === 'row-inputs' ? 'row-inputs' : 'column-inputs';\n const rowHeaderTitle = asText(source['rowHeaderTitle']) || undefined;\n const direction = source['direction'] === 'rtl' || source['direction'] === 'ltr' ? source['direction'] : undefined;\n const columns = Array.isArray(source['columns'])\n ? source['columns'].map((column) => normalizeColumn(column)).filter((column): column is AXMTestSheetColumn => !!column)\n : [];\n const rows = Array.isArray(source['rows'])\n ? source['rows'].map((row) => normalizeRow(row)).filter((row): row is AXMTestSheetRow => !!row)\n : [];\n return { rowMode, layout, rowHeaderTitle, direction, columns, rows };\n}\n\nfunction normalizeColumn(value: unknown): AXMTestSheetColumn | null {\n if (!isRecord(value)) {\n return null;\n }\n const name = asText(value['name']);\n if (!name) {\n return null;\n }\n const role = value['role'] === 'static' ? 'static' : 'input';\n const widgetType = asWidgetType(value['widgetType']);\n const baseWidget = asWidgetNode(value['widget']) ?? (role === 'input' ? legacyInputWidget(value) : undefined);\n return {\n name,\n title: asText(value['title']),\n description: asText(value['description']) || undefined,\n groupTitle: asText(value['groupTitle']) || undefined,\n role,\n widget: moveColumnOptionsOntoWidget(baseWidget, value),\n widgetType: role === 'input' ? widgetType : undefined,\n choices: asText(value['choices']) || undefined,\n percentDiff: normalizePercentDiff(value['percentDiff']),\n };\n}\n\nfunction normalizeRow(value: unknown): AXMTestSheetRow | null {\n if (!isRecord(value)) {\n return null;\n }\n const name = asText(value['name']);\n if (!name) {\n return null;\n }\n const cellsSource = isRecord(value['cells']) ? value['cells'] : {};\n const cells: Record<string, string> = {};\n for (const [key, cell] of Object.entries(cellsSource)) {\n cells[key] = asText(cell);\n }\n const role = value['role'] === 'static' ? 'static' : value['role'] === 'input' ? 'input' : undefined;\n return {\n name,\n groupTitle: asText(value['groupTitle']) || undefined,\n title: asText(value['title']) || undefined,\n role,\n widget: role === 'static' ? undefined : asWidgetNode(value['widget']),\n cells,\n };\n}\n\n//#endregion\n\n//#region ----- Spreadsheet mapping -----\n\nexport function testSheetHasRowGroups(definition: AXMTestSheetDefinition): boolean {\n return (\n definition.rowMode === 'fixed' &&\n definition.rows.some((row) => (row.groupTitle ?? '').trim().length > 0)\n );\n}\n\nexport function toTestSheetSpreadsheetColumns(definition: AXMTestSheetDefinition): AXPSpreadsheetColumn[] {\n return definition.columns.map((column) => ({\n name: column.name,\n title: column.title || column.name,\n description: column.description,\n path: column.name,\n groupTitle: column.groupTitle,\n readonly: column.role === 'static' || !!column.percentDiff,\n widget: column.percentDiff\n ? { type: 'number-editor', options: { decimals: 2 } }\n : column.role === 'static'\n ? staticCellWidget(column)\n : inputCellWidget(column),\n }));\n}\n\n/**\n * Writes percent-difference columns from the two source cells on each row.\n * Returns the same array when nothing changed.\n */\nexport function applyTestSheetComputations(\n rows: Record<string, unknown>[],\n definition: AXMTestSheetDefinition,\n): Record<string, unknown>[] {\n const computed = definition.columns.filter((column) => column.percentDiff);\n if (computed.length === 0) {\n return rows;\n }\n let changed = false;\n const next = rows.map((row) => {\n const copy: Record<string, unknown> = { ...row };\n let rowChanged = false;\n for (const column of computed) {\n const formula = column.percentDiff;\n if (!formula) {\n continue;\n }\n const value = percentDifference(copy[formula.base], copy[formula.other]);\n if (value == null) {\n if (Object.prototype.hasOwnProperty.call(copy, column.name)) {\n delete copy[column.name];\n rowChanged = true;\n }\n continue;\n }\n if (copy[column.name] !== value) {\n copy[column.name] = value;\n rowChanged = true;\n }\n }\n if (rowChanged) {\n changed = true;\n return copy;\n }\n return row;\n });\n return changed ? next : rows;\n}\n\n/** Row widgets for `row-inputs`. Static rows stay as authored text. */\nexport function toTestSheetRowWidgets(definition: AXMTestSheetDefinition): AXPSpreadsheetRowWidget[] | null {\n if (definition.layout !== 'row-inputs') {\n return null;\n }\n return definition.rows.map((row) => ({\n name: row.name,\n readonly: row.role === 'static',\n widget: row.role === 'static' ? undefined : row.widget,\n }));\n}\n\nexport function buildFixedTestSheetRows(\n definition: AXMTestSheetDefinition,\n answer: unknown,\n): Record<string, unknown>[] {\n const saved = asRowList(answer);\n const inputNames = inputColumnNames(definition);\n return definition.rows.map((row) => {\n const next: Record<string, unknown> = {\n name: row.name,\n [AXM_TEST_SHEET_ROW_GROUP_PATH]: row.groupTitle ?? '',\n };\n if (row.title) {\n next['title'] = row.title;\n }\n if (row.role === 'static') {\n for (const column of definition.columns) {\n next[column.name] = row.cells?.[column.name] ?? '';\n }\n return next;\n }\n for (const column of definition.columns) {\n if (column.role === 'static') {\n next[column.name] = row.cells?.[column.name] ?? '';\n }\n }\n const match = saved.find((item) => item['name'] === row.name);\n if (match) {\n for (const name of inputNames) {\n if (Object.prototype.hasOwnProperty.call(match, name)) {\n next[name] = match[name];\n }\n }\n }\n return next;\n });\n}\n\nexport function buildRepeatedTestSheetRows(answer: unknown): Record<string, unknown>[] {\n return asRowList(answer).map((row) => ({ ...row }));\n}\n\n/**\n * Persists the grid only after an input cell has a value.\n * Static text alone does not count as an answer.\n */\nexport function toStoredTestSheetAnswer(\n rows: Record<string, unknown>[],\n definition: AXMTestSheetDefinition,\n): Record<string, unknown>[] | null {\n const names = inputColumnNames(definition);\n const staticRowNames = new Set(\n definition.rows.filter((row) => row.role === 'static').map((row) => row.name),\n );\n const inputRows = rows.filter((row) => !staticRowNames.has(asText(row['name'])));\n const filled = inputRows.some((row) => names.some((name) => isFilledCell(row[name])));\n if (!filled) {\n return null;\n }\n return inputRows.map((row) => {\n const stored: Record<string, unknown> = { ...row };\n delete stored['title'];\n return stored;\n });\n}\n\nexport function nextTestSheetKey(prefix: string, used: string[]): string {\n const taken = new Set(used);\n let index = used.length + 1;\n let name = `${prefix}${index}`;\n while (taken.has(name)) {\n index += 1;\n name = `${prefix}${index}`;\n }\n return name;\n}\n\n/** Reads a select value stored as an id string or as `{ id }`. */\nexport function testSheetChoiceId(value: unknown): string {\n if (typeof value === 'string') {\n return value;\n }\n if (isRecord(value) && typeof value['id'] === 'string') {\n return value['id'];\n }\n return '';\n}\n\n/**\n * Fills blank or duplicate `name` keys on repeater rows.\n * Existing objects are kept when the name is already unique.\n */\nexport function assignTestSheetItemNames<T extends { name?: string }>(\n items: T[],\n prefix: string,\n): { items: T[]; changed: boolean } {\n const used = new Set<string>();\n let changed = false;\n const next = items.map((item) => {\n const current = item && typeof item === 'object' ? item : ({} as T);\n const name = typeof current.name === 'string' ? current.name.trim() : '';\n if (name && !used.has(name)) {\n used.add(name);\n return current;\n }\n changed = true;\n const assigned = nextTestSheetKey(prefix, [...used]);\n used.add(assigned);\n return { ...current, name: assigned };\n });\n return { items: next, changed };\n}\n\n/**\n * Older columns store `widgetType` and `choices`.\n * The configurator reads `widget`, so a missing node is built once from those fields.\n */\nexport function ensureTestSheetColumnWidgets<\n T extends {\n name?: string;\n role?: unknown;\n widget?: unknown;\n widgetType?: unknown;\n choices?: unknown;\n required?: unknown;\n defaultValue?: unknown;\n },\n>(items: T[]): { items: T[]; changed: boolean } {\n let changed = false;\n const next = items.map((item) => {\n if (!isRecord(item)) {\n return item;\n }\n const isStatic = testSheetChoiceId(item['role']) === 'static';\n const current = asWidgetNode(item['widget']);\n const base = current ?? (isStatic ? undefined : legacyInputWidget(item));\n const widget = moveColumnOptionsOntoWidget(base, item);\n const stripLegacy = item['required'] !== undefined || item['defaultValue'] !== undefined;\n if (widget === current && !stripLegacy) {\n return item;\n }\n changed = true;\n const nextItem: Record<string, unknown> = { ...item };\n if (widget) {\n nextItem['widget'] = widget;\n }\n delete nextItem['required'];\n delete nextItem['defaultValue'];\n return nextItem as T;\n });\n return { items: next, changed };\n}\n\n//#endregion\n\n//#region ----- Helpers -----\n\nfunction normalizePercentDiff(value: unknown): AXMTestSheetPercentDiff | undefined {\n if (!isRecord(value) || value['kind'] !== 'percent-diff') {\n return undefined;\n }\n const base = asText(value['base']);\n const other = asText(value['other']);\n if (!base || !other) {\n return undefined;\n }\n return { kind: 'percent-diff', base, other };\n}\n\n/** `|other - base| / |base| × 100`, rounded to two decimals. Empty when either side is missing or the base is 0. */\nfunction percentDifference(baseValue: unknown, otherValue: unknown): number | null {\n const base = asFiniteNumber(baseValue);\n const other = asFiniteNumber(otherValue);\n if (base == null || other == null || base === 0) {\n return null;\n }\n return Math.round((Math.abs(other - base) / Math.abs(base)) * 10000) / 100;\n}\n\nfunction asFiniteNumber(value: unknown): number | null {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === 'string' && value.trim() !== '') {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n }\n return null;\n}\n\nfunction inputColumnNames(definition: AXMTestSheetDefinition): string[] {\n return definition.columns.filter((column) => column.role === 'input').map((column) => column.name);\n}\n\nfunction staticCellWidget(column: AXMTestSheetColumn): AXPWidgetNode {\n return {\n type: 'text-editor',\n defaultValue: column.widget?.defaultValue ?? '',\n options: {},\n };\n}\n\nfunction inputCellWidget(column: AXMTestSheetColumn): AXPWidgetNode {\n return asWidgetNode(column.widget) ?? legacyInputWidget(column);\n}\n\nfunction legacyInputWidget(source: { widgetType?: unknown; choices?: unknown }): AXPWidgetNode {\n const type = asWidgetType(source.widgetType);\n if (type === 'select-editor') {\n const choices = typeof source.choices === 'string' ? source.choices : '';\n const dataSource = choices\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n .map((line) => ({ id: line, title: line }));\n return {\n type,\n options: {\n valueField: 'id',\n textField: 'title',\n dataSource,\n },\n };\n }\n return { type, options: {} };\n}\n\n/**\n * Older sheets stored required and default value on the column.\n * The widget configurator stores them on the node: `defaultValue` and `options.validations.required`.\n */\nfunction moveColumnOptionsOntoWidget(\n widget: AXPWidgetNode | undefined,\n source: { required?: unknown; defaultValue?: unknown },\n): AXPWidgetNode | undefined {\n const defaultValue = typeof source.defaultValue === 'string' ? source.defaultValue : '';\n const needsRequired = source.required === true && (!widget || !widgetHasRequired(widget));\n const needsDefault =\n defaultValue.length > 0 && (widget?.defaultValue === undefined || widget.defaultValue === '');\n if (!needsRequired && !needsDefault) {\n return widget;\n }\n const next: AXPWidgetNode = widget\n ? { ...widget, options: { ...(widget.options ?? {}) } }\n : { type: 'text-editor', options: {} };\n if (needsRequired) {\n const validations = isRecord(next.options?.['validations']) ? { ...next.options['validations'] } : {};\n validations['required'] = { rule: 'required' };\n next.options = { ...(next.options ?? {}), validations };\n }\n if (needsDefault) {\n next.defaultValue = defaultValue;\n }\n return next;\n}\n\nfunction widgetHasRequired(node: AXPWidgetNode): boolean {\n const validations = node.options?.['validations'];\n if (Array.isArray(validations)) {\n return validations.some((rule) => isRequiredRule(rule));\n }\n if (isRecord(validations)) {\n return isRequiredRule(validations['required']);\n }\n return false;\n}\n\nfunction isRequiredRule(value: unknown): boolean {\n return isRecord(value) && value['rule'] === 'required' && value['disabled'] !== true;\n}\n\nfunction asWidgetNode(value: unknown): AXPWidgetNode | undefined {\n if (!isRecord(value)) {\n return undefined;\n }\n const type = asText(value['type']).trim();\n if (!type) {\n return undefined;\n }\n const node: AXPWidgetNode = {\n type,\n options: isRecord(value['options']) ? value['options'] : {},\n };\n if (value['defaultValue'] !== undefined) {\n node.defaultValue = value['defaultValue'];\n }\n if (value['triggers']) {\n node.triggers = value['triggers'] as AXPWidgetNode['triggers'];\n }\n if (value['valueTransforms']) {\n node.valueTransforms = value['valueTransforms'] as AXPWidgetNode['valueTransforms'];\n }\n return node;\n}\n\nfunction asWidgetType(value: unknown): AXMTestSheetInputWidgetType {\n const text = asText(value);\n if ((AXM_TEST_SHEET_INPUT_WIDGET_TYPES as readonly string[]).includes(text)) {\n return text as AXMTestSheetInputWidgetType;\n }\n return 'text-editor';\n}\n\nfunction asRowList(value: unknown): Record<string, unknown>[] {\n if (!Array.isArray(value)) {\n return [];\n }\n return value.filter(isRecord);\n}\n\nfunction isFilledCell(value: unknown): boolean {\n if (value === null || value === undefined || value === '' || value === false) {\n return false;\n }\n if (Array.isArray(value)) {\n return value.length > 0;\n }\n return true;\n}\n\nfunction asText(value: unknown): string {\n return typeof value === 'string' ? value : '';\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n//#endregion\n"],"names":[],"mappings":";;AAeA;SAEgB,wBAAwB,GAAA;IACtC,OAAO;AACL,QAAA,OAAO,EAAE,OAAO;AAChB,QAAA,MAAM,EAAE,eAAe;AACvB,QAAA,OAAO,EAAE,EAAE;AACX,QAAA,IAAI,EAAE,EAAE;KACT;AACH;AAEM,SAAU,4BAA4B,CAAC,KAAc,EAAA;AACzD,IAAA,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE;AAC3C,IAAA,MAAM,OAAO,GAAwB,MAAM,CAAC,SAAS,CAAC,KAAK,UAAU,GAAG,UAAU,GAAG,OAAO;AAC5F,IAAA,MAAM,MAAM,GAAuB,MAAM,CAAC,QAAQ,CAAC,KAAK,YAAY,GAAG,YAAY,GAAG,eAAe;IACrG,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,IAAI,SAAS;IACpE,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,KAAK,KAAK,IAAI,MAAM,CAAC,WAAW,CAAC,KAAK,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,SAAS;IAClH,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC;AAC7C,UAAE,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,KAAmC,CAAC,CAAC,MAAM;UACpH,EAAE;IACN,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;AACvC,UAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,KAA6B,CAAC,CAAC,GAAG;UAC5F,EAAE;AACN,IAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE;AACtE;AAEA,SAAS,eAAe,CAAC,KAAc,EAAA;AACrC,IAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;AACpB,QAAA,OAAO,IAAI;IACb;IACA,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAClC,IAAI,CAAC,IAAI,EAAE;AACT,QAAA,OAAO,IAAI;IACb;AACA,IAAA,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,QAAQ,GAAG,QAAQ,GAAG,OAAO;IAC5D,MAAM,UAAU,GAAG,YAAY,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IACpD,MAAM,UAAU,GAAG,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,KAAK,IAAI,KAAK,OAAO,GAAG,iBAAiB,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC;IAC7G,OAAO;QACL,IAAI;AACJ,QAAA,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7B,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,SAAS;QACtD,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,IAAI,SAAS;QACpD,IAAI;AACJ,QAAA,MAAM,EAAE,2BAA2B,CAAC,UAAU,EAAE,KAAK,CAAC;QACtD,UAAU,EAAE,IAAI,KAAK,OAAO,GAAG,UAAU,GAAG,SAAS;QACrD,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,SAAS;AAC9C,QAAA,WAAW,EAAE,oBAAoB,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;KACxD;AACH;AAEA,SAAS,YAAY,CAAC,KAAc,EAAA;AAClC,IAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;AACpB,QAAA,OAAO,IAAI;IACb;IACA,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAClC,IAAI,CAAC,IAAI,EAAE;AACT,QAAA,OAAO,IAAI;IACb;IACA,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;IAClE,MAAM,KAAK,GAA2B,EAAE;AACxC,IAAA,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE;QACrD,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC;IAC3B;AACA,IAAA,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,QAAQ,GAAG,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,OAAO,GAAG,OAAO,GAAG,SAAS;IACpG,OAAO;QACL,IAAI;QACJ,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,IAAI,SAAS;QACpD,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,SAAS;QAC1C,IAAI;AACJ,QAAA,MAAM,EAAE,IAAI,KAAK,QAAQ,GAAG,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACrE,KAAK;KACN;AACH;AAEA;AAEA;AAEM,SAAU,qBAAqB,CAAC,UAAkC,EAAA;AACtE,IAAA,QACE,UAAU,CAAC,OAAO,KAAK,OAAO;QAC9B,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;AAE3E;AAEM,SAAU,6BAA6B,CAAC,UAAkC,EAAA;IAC9E,OAAO,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,MAAM;QACzC,IAAI,EAAE,MAAM,CAAC,IAAI;AACjB,QAAA,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI;QAClC,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,QAAQ,EAAE,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,CAAC,WAAW;QAC1D,MAAM,EAAE,MAAM,CAAC;AACb,cAAE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE;AACnD,cAAE,MAAM,CAAC,IAAI,KAAK;AAChB,kBAAE,gBAAgB,CAAC,MAAM;AACzB,kBAAE,eAAe,CAAC,MAAM,CAAC;AAC9B,KAAA,CAAC,CAAC;AACL;AAEA;;;AAGG;AACG,SAAU,0BAA0B,CACxC,IAA+B,EAC/B,UAAkC,EAAA;AAElC,IAAA,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,WAAW,CAAC;AAC1E,IAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;AACzB,QAAA,OAAO,IAAI;IACb;IACA,IAAI,OAAO,GAAG,KAAK;IACnB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAI;AAC5B,QAAA,MAAM,IAAI,GAA4B,EAAE,GAAG,GAAG,EAAE;QAChD,IAAI,UAAU,GAAG,KAAK;AACtB,QAAA,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE;AAC7B,YAAA,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW;YAClC,IAAI,CAAC,OAAO,EAAE;gBACZ;YACF;AACA,YAAA,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AACxE,YAAA,IAAI,KAAK,IAAI,IAAI,EAAE;AACjB,gBAAA,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE;AAC3D,oBAAA,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;oBACxB,UAAU,GAAG,IAAI;gBACnB;gBACA;YACF;YACA,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE;AAC/B,gBAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK;gBACzB,UAAU,GAAG,IAAI;YACnB;QACF;QACA,IAAI,UAAU,EAAE;YACd,OAAO,GAAG,IAAI;AACd,YAAA,OAAO,IAAI;QACb;AACA,QAAA,OAAO,GAAG;AACZ,IAAA,CAAC,CAAC;IACF,OAAO,OAAO,GAAG,IAAI,GAAG,IAAI;AAC9B;AAEA;AACM,SAAU,qBAAqB,CAAC,UAAkC,EAAA;AACtE,IAAA,IAAI,UAAU,CAAC,MAAM,KAAK,YAAY,EAAE;AACtC,QAAA,OAAO,IAAI;IACb;IACA,OAAO,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM;QACnC,IAAI,EAAE,GAAG,CAAC,IAAI;AACd,QAAA,QAAQ,EAAE,GAAG,CAAC,IAAI,KAAK,QAAQ;AAC/B,QAAA,MAAM,EAAE,GAAG,CAAC,IAAI,KAAK,QAAQ,GAAG,SAAS,GAAG,GAAG,CAAC,MAAM;AACvD,KAAA,CAAC,CAAC;AACL;AAEM,SAAU,uBAAuB,CACrC,UAAkC,EAClC,MAAe,EAAA;AAEf,IAAA,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC;AAC/B,IAAA,MAAM,UAAU,GAAG,gBAAgB,CAAC,UAAU,CAAC;IAC/C,OAAO,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAI;AACjC,QAAA,MAAM,IAAI,GAA4B;YACpC,IAAI,EAAE,GAAG,CAAC,IAAI;AACd,YAAA,CAAC,6BAA6B,GAAG,GAAG,CAAC,UAAU,IAAI,EAAE;SACtD;AACD,QAAA,IAAI,GAAG,CAAC,KAAK,EAAE;AACb,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,KAAK;QAC3B;AACA,QAAA,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;AACzB,YAAA,KAAK,MAAM,MAAM,IAAI,UAAU,CAAC,OAAO,EAAE;AACvC,gBAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE;YACpD;AACA,YAAA,OAAO,IAAI;QACb;AACA,QAAA,KAAK,MAAM,MAAM,IAAI,UAAU,CAAC,OAAO,EAAE;AACvC,YAAA,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE;AAC5B,gBAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE;YACpD;QACF;QACA,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC;QAC7D,IAAI,KAAK,EAAE;AACT,YAAA,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE;AAC7B,gBAAA,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE;oBACrD,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC;gBAC1B;YACF;QACF;AACA,QAAA,OAAO,IAAI;AACb,IAAA,CAAC,CAAC;AACJ;AAEM,SAAU,0BAA0B,CAAC,MAAe,EAAA;AACxD,IAAA,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;AACrD;AAEA;;;AAGG;AACG,SAAU,uBAAuB,CACrC,IAA+B,EAC/B,UAAkC,EAAA;AAElC,IAAA,MAAM,KAAK,GAAG,gBAAgB,CAAC,UAAU,CAAC;AAC1C,IAAA,MAAM,cAAc,GAAG,IAAI,GAAG,CAC5B,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,IAAI,CAAC,CAC9E;IACD,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAChF,IAAA,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACrF,IAAI,CAAC,MAAM,EAAE;AACX,QAAA,OAAO,IAAI;IACb;AACA,IAAA,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,KAAI;AAC3B,QAAA,MAAM,MAAM,GAA4B,EAAE,GAAG,GAAG,EAAE;AAClD,QAAA,OAAO,MAAM,CAAC,OAAO,CAAC;AACtB,QAAA,OAAO,MAAM;AACf,IAAA,CAAC,CAAC;AACJ;AAEM,SAAU,gBAAgB,CAAC,MAAc,EAAE,IAAc,EAAA;AAC7D,IAAA,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC;AAC3B,IAAA,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC;AAC3B,IAAA,IAAI,IAAI,GAAG,CAAA,EAAG,MAAM,CAAA,EAAG,KAAK,EAAE;AAC9B,IAAA,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;QACtB,KAAK,IAAI,CAAC;AACV,QAAA,IAAI,GAAG,CAAA,EAAG,MAAM,CAAA,EAAG,KAAK,EAAE;IAC5B;AACA,IAAA,OAAO,IAAI;AACb;AAEA;AACM,SAAU,iBAAiB,CAAC,KAAc,EAAA;AAC9C,IAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7B,QAAA,OAAO,KAAK;IACd;AACA,IAAA,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,QAAQ,EAAE;AACtD,QAAA,OAAO,KAAK,CAAC,IAAI,CAAC;IACpB;AACA,IAAA,OAAO,EAAE;AACX;AAEA;;;AAGG;AACG,SAAU,wBAAwB,CACtC,KAAU,EACV,MAAc,EAAA;AAEd,IAAA,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU;IAC9B,IAAI,OAAO,GAAG,KAAK;IACnB,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAI;AAC9B,QAAA,MAAM,OAAO,GAAG,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,GAAG,IAAI,GAAI,EAAQ;QACnE,MAAM,IAAI,GAAG,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE;QACxE,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;AAC3B,YAAA,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;AACd,YAAA,OAAO,OAAO;QAChB;QACA,OAAO,GAAG,IAAI;QACd,MAAM,QAAQ,GAAG,gBAAgB,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;AACpD,QAAA,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,OAAO,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE;AACvC,IAAA,CAAC,CAAC;AACF,IAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE;AACjC;AAEA;;;AAGG;AACG,SAAU,4BAA4B,CAU1C,KAAU,EAAA;IACV,IAAI,OAAO,GAAG,KAAK;IACnB,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAI;AAC9B,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;AACnB,YAAA,OAAO,IAAI;QACb;QACA,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,QAAQ;QAC7D,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC5C,QAAA,MAAM,IAAI,GAAG,OAAO,KAAK,QAAQ,GAAG,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACxE,MAAM,MAAM,GAAG,2BAA2B,CAAC,IAAI,EAAE,IAAI,CAAC;AACtD,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,SAAS,IAAI,IAAI,CAAC,cAAc,CAAC,KAAK,SAAS;AACxF,QAAA,IAAI,MAAM,KAAK,OAAO,IAAI,CAAC,WAAW,EAAE;AACtC,YAAA,OAAO,IAAI;QACb;QACA,OAAO,GAAG,IAAI;AACd,QAAA,MAAM,QAAQ,GAA4B,EAAE,GAAG,IAAI,EAAE;QACrD,IAAI,MAAM,EAAE;AACV,YAAA,QAAQ,CAAC,QAAQ,CAAC,GAAG,MAAM;QAC7B;AACA,QAAA,OAAO,QAAQ,CAAC,UAAU,CAAC;AAC3B,QAAA,OAAO,QAAQ,CAAC,cAAc,CAAC;AAC/B,QAAA,OAAO,QAAa;AACtB,IAAA,CAAC,CAAC;AACF,IAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE;AACjC;AAEA;AAEA;AAEA,SAAS,oBAAoB,CAAC,KAAc,EAAA;AAC1C,IAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,cAAc,EAAE;AACxD,QAAA,OAAO,SAAS;IAClB;IACA,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AACpC,IAAA,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE;AACnB,QAAA,OAAO,SAAS;IAClB;IACA,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE;AAC9C;AAEA;AACA,SAAS,iBAAiB,CAAC,SAAkB,EAAE,UAAmB,EAAA;AAChE,IAAA,MAAM,IAAI,GAAG,cAAc,CAAC,SAAS,CAAC;AACtC,IAAA,MAAM,KAAK,GAAG,cAAc,CAAC,UAAU,CAAC;AACxC,IAAA,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,KAAK,CAAC,EAAE;AAC/C,QAAA,OAAO,IAAI;IACb;IACA,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,GAAG,GAAG;AAC5E;AAEA,SAAS,cAAc,CAAC,KAAc,EAAA;AACpC,IAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;AACvD,QAAA,OAAO,KAAK;IACd;AACA,IAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;AACpD,QAAA,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC;AAC5B,QAAA,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,IAAI;IAChD;AACA,IAAA,OAAO,IAAI;AACb;AAEA,SAAS,gBAAgB,CAAC,UAAkC,EAAA;AAC1D,IAAA,OAAO,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,CAAC;AACpG;AAEA,SAAS,gBAAgB,CAAC,MAA0B,EAAA;IAClD,OAAO;AACL,QAAA,IAAI,EAAE,aAAa;AACnB,QAAA,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,IAAI,EAAE;AAC/C,QAAA,OAAO,EAAE,EAAE;KACZ;AACH;AAEA,SAAS,eAAe,CAAC,MAA0B,EAAA;IACjD,OAAO,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,iBAAiB,CAAC,MAAM,CAAC;AACjE;AAEA,SAAS,iBAAiB,CAAC,MAAmD,EAAA;IAC5E,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC;AAC5C,IAAA,IAAI,IAAI,KAAK,eAAe,EAAE;AAC5B,QAAA,MAAM,OAAO,GAAG,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,GAAG,MAAM,CAAC,OAAO,GAAG,EAAE;QACxE,MAAM,UAAU,GAAG;aAChB,KAAK,CAAC,OAAO;aACb,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE;aACzB,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,GAAG,CAAC;AAChC,aAAA,GAAG,CAAC,CAAC,IAAI,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,OAAO;YACL,IAAI;AACJ,YAAA,OAAO,EAAE;AACP,gBAAA,UAAU,EAAE,IAAI;AAChB,gBAAA,SAAS,EAAE,OAAO;gBAClB,UAAU;AACX,aAAA;SACF;IACH;AACA,IAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;AAC9B;AAEA;;;AAGG;AACH,SAAS,2BAA2B,CAClC,MAAiC,EACjC,MAAsD,EAAA;AAEtD,IAAA,MAAM,YAAY,GAAG,OAAO,MAAM,CAAC,YAAY,KAAK,QAAQ,GAAG,MAAM,CAAC,YAAY,GAAG,EAAE;AACvF,IAAA,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,KAAK,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACzF,MAAM,YAAY,GAChB,YAAY,CAAC,MAAM,GAAG,CAAC,KAAK,MAAM,EAAE,YAAY,KAAK,SAAS,IAAI,MAAM,CAAC,YAAY,KAAK,EAAE,CAAC;AAC/F,IAAA,IAAI,CAAC,aAAa,IAAI,CAAC,YAAY,EAAE;AACnC,QAAA,OAAO,MAAM;IACf;IACA,MAAM,IAAI,GAAkB;AAC1B,UAAE,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,EAAE,IAAI,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE;UACnD,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE,EAAE;IACxC,IAAI,aAAa,EAAE;AACjB,QAAA,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,GAAG,aAAa,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,GAAG,EAAE;QACrG,WAAW,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE;AAC9C,QAAA,IAAI,CAAC,OAAO,GAAG,EAAE,IAAI,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,WAAW,EAAE;IACzD;IACA,IAAI,YAAY,EAAE;AAChB,QAAA,IAAI,CAAC,YAAY,GAAG,YAAY;IAClC;AACA,IAAA,OAAO,IAAI;AACb;AAEA,SAAS,iBAAiB,CAAC,IAAmB,EAAA;IAC5C,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,GAAG,aAAa,CAAC;AACjD,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE;AAC9B,QAAA,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,IAAI,CAAC,CAAC;IACzD;AACA,IAAA,IAAI,QAAQ,CAAC,WAAW,CAAC,EAAE;AACzB,QAAA,OAAO,cAAc,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAChD;AACA,IAAA,OAAO,KAAK;AACd;AAEA,SAAS,cAAc,CAAC,KAAc,EAAA;AACpC,IAAA,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,UAAU,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,IAAI;AACtF;AAEA,SAAS,YAAY,CAAC,KAAc,EAAA;AAClC,IAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;AACpB,QAAA,OAAO,SAAS;IAClB;AACA,IAAA,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE;IACzC,IAAI,CAAC,IAAI,EAAE;AACT,QAAA,OAAO,SAAS;IAClB;AACA,IAAA,MAAM,IAAI,GAAkB;QAC1B,IAAI;AACJ,QAAA,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;KAC5D;AACD,IAAA,IAAI,KAAK,CAAC,cAAc,CAAC,KAAK,SAAS,EAAE;AACvC,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,cAAc,CAAC;IAC3C;AACA,IAAA,IAAI,KAAK,CAAC,UAAU,CAAC,EAAE;AACrB,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,UAAU,CAA8B;IAChE;AACA,IAAA,IAAI,KAAK,CAAC,iBAAiB,CAAC,EAAE;AAC5B,QAAA,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC,iBAAiB,CAAqC;IACrF;AACA,IAAA,OAAO,IAAI;AACb;AAEA,SAAS,YAAY,CAAC,KAAc,EAAA;AAClC,IAAA,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC;AAC1B,IAAA,IAAK,iCAAuD,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;AAC3E,QAAA,OAAO,IAAmC;IAC5C;AACA,IAAA,OAAO,aAAa;AACtB;AAEA,SAAS,SAAS,CAAC,KAAc,EAAA;IAC/B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACzB,QAAA,OAAO,EAAE;IACX;AACA,IAAA,OAAO,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC;AAC/B;AAEA,SAAS,YAAY,CAAC,KAAc,EAAA;AAClC,IAAA,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,IAAI,KAAK,KAAK,KAAK,EAAE;AAC5E,QAAA,OAAO,KAAK;IACd;AACA,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACxB,QAAA,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC;IACzB;AACA,IAAA,OAAO,IAAI;AACb;AAEA,SAAS,MAAM,CAAC,KAAc,EAAA;AAC5B,IAAA,OAAO,OAAO,KAAK,KAAK,QAAQ,GAAG,KAAK,GAAG,EAAE;AAC/C;AAEA,SAAS,QAAQ,CAAC,KAAc,EAAA;AAC9B,IAAA,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;AAC7E;AAEA;;"}
1
+ {"version":3,"file":"acorex-platform-module-assessment-management-client-test-sheet.util-CXwScb4j.mjs","sources":["../../../../libs/modules/assessment-management/client/src/lib/features/questionnaire-builder/questions/widgets/test-sheet/test-sheet.util.ts"],"sourcesContent":["import type { AXPWidgetNode } from '@acorex-platform/framework-shared/core';\nimport type { AXPSpreadsheetColumn, AXPSpreadsheetRowWidget } from '@acorex-platform/framework-client/layout/components';\n\nimport {\n AXM_TEST_SHEET_INPUT_WIDGET_TYPES,\n AXM_TEST_SHEET_ROW_GROUP_PATH,\n type AXMTestSheetColumn,\n type AXMTestSheetDefinition,\n type AXMTestSheetInputWidgetType,\n type AXMTestSheetLayout,\n type AXMTestSheetPercentDiff,\n type AXMTestSheetRow,\n type AXMTestSheetRowMode,\n} from './test-sheet.types';\n\n//#region ----- Normalize -----\n\nexport function emptyTestSheetDefinition(): AXMTestSheetDefinition {\n return {\n rowMode: 'fixed',\n layout: 'column-inputs',\n columns: [],\n rows: [],\n };\n}\n\nexport function normalizeTestSheetDefinition(value: unknown): AXMTestSheetDefinition {\n const source = isRecord(value) ? value : {};\n const rowMode: AXMTestSheetRowMode = source['rowMode'] === 'repeated' ? 'repeated' : 'fixed';\n const layout: AXMTestSheetLayout = source['layout'] === 'row-inputs' ? 'row-inputs' : 'column-inputs';\n const rowHeaderTitle = asText(source['rowHeaderTitle']) || undefined;\n const direction = source['direction'] === 'rtl' || source['direction'] === 'ltr' ? source['direction'] : undefined;\n const columns = Array.isArray(source['columns'])\n ? source['columns'].map((column) => normalizeColumn(column)).filter((column): column is AXMTestSheetColumn => !!column)\n : [];\n const rows = Array.isArray(source['rows'])\n ? source['rows'].map((row) => normalizeRow(row)).filter((row): row is AXMTestSheetRow => !!row)\n : [];\n return { rowMode, layout, rowHeaderTitle, direction, columns, rows };\n}\n\nfunction normalizeColumn(value: unknown): AXMTestSheetColumn | null {\n if (!isRecord(value)) {\n return null;\n }\n const name = asText(value['name']);\n if (!name) {\n return null;\n }\n const role = value['role'] === 'static' ? 'static' : 'input';\n const widgetType = asWidgetType(value['widgetType']);\n const baseWidget = asWidgetNode(value['widget']) ?? (role === 'input' ? legacyInputWidget(value) : undefined);\n return {\n name,\n title: asText(value['title']),\n description: asText(value['description']) || undefined,\n groupTitle: asText(value['groupTitle']) || undefined,\n role,\n widget: moveColumnOptionsOntoWidget(baseWidget, value),\n widgetType: role === 'input' ? widgetType : undefined,\n choices: asText(value['choices']) || undefined,\n percentDiff: normalizePercentDiff(value['percentDiff']),\n };\n}\n\nfunction normalizeRow(value: unknown): AXMTestSheetRow | null {\n if (!isRecord(value)) {\n return null;\n }\n const name = asText(value['name']);\n if (!name) {\n return null;\n }\n const cellsSource = isRecord(value['cells']) ? value['cells'] : {};\n const cells: Record<string, string> = {};\n for (const [key, cell] of Object.entries(cellsSource)) {\n cells[key] = asText(cell);\n }\n const role = value['role'] === 'static' ? 'static' : value['role'] === 'input' ? 'input' : undefined;\n return {\n name,\n groupTitle: asText(value['groupTitle']) || undefined,\n title: asText(value['title']) || undefined,\n role,\n widget: role === 'static' ? undefined : asWidgetNode(value['widget']),\n cells,\n };\n}\n\n//#endregion\n\n//#region ----- Spreadsheet mapping -----\n\nexport function testSheetHasRowGroups(definition: AXMTestSheetDefinition): boolean {\n return (\n definition.rowMode === 'fixed' &&\n definition.rows.some((row) => (row.groupTitle ?? '').trim().length > 0)\n );\n}\n\nexport function toTestSheetSpreadsheetColumns(definition: AXMTestSheetDefinition): AXPSpreadsheetColumn[] {\n return definition.columns.map((column) => ({\n name: column.name,\n title: column.title || column.name,\n description: column.description,\n path: column.name,\n groupTitle: column.groupTitle,\n readonly: column.role === 'static' || !!column.percentDiff,\n widget: column.percentDiff\n ? { type: 'number-editor', options: { decimals: 2 } }\n : column.role === 'static'\n ? staticCellWidget(column)\n : inputCellWidget(column),\n }));\n}\n\n/**\n * Writes percent-difference columns from the two source cells on each row.\n * Returns the same array when nothing changed.\n */\nexport function applyTestSheetComputations(\n rows: Record<string, unknown>[],\n definition: AXMTestSheetDefinition,\n): Record<string, unknown>[] {\n const computed = definition.columns.filter((column) => column.percentDiff);\n if (computed.length === 0) {\n return rows;\n }\n let changed = false;\n const next = rows.map((row) => {\n const copy: Record<string, unknown> = { ...row };\n let rowChanged = false;\n for (const column of computed) {\n const formula = column.percentDiff;\n if (!formula) {\n continue;\n }\n const value = percentDifference(copy[formula.base], copy[formula.other]);\n if (value == null) {\n if (Object.prototype.hasOwnProperty.call(copy, column.name)) {\n delete copy[column.name];\n rowChanged = true;\n }\n continue;\n }\n if (copy[column.name] !== value) {\n copy[column.name] = value;\n rowChanged = true;\n }\n }\n if (rowChanged) {\n changed = true;\n return copy;\n }\n return row;\n });\n return changed ? next : rows;\n}\n\n/** Row widgets for `row-inputs`. Static rows stay as authored text. */\nexport function toTestSheetRowWidgets(definition: AXMTestSheetDefinition): AXPSpreadsheetRowWidget[] | null {\n if (definition.layout !== 'row-inputs') {\n return null;\n }\n return definition.rows.map((row) => ({\n name: row.name,\n readonly: row.role === 'static',\n widget: row.role === 'static' ? undefined : row.widget,\n }));\n}\n\nexport function buildFixedTestSheetRows(\n definition: AXMTestSheetDefinition,\n answer: unknown,\n): Record<string, unknown>[] {\n const saved = asRowList(answer);\n const inputNames = inputColumnNames(definition);\n return definition.rows.map((row) => {\n const next: Record<string, unknown> = {\n name: row.name,\n [AXM_TEST_SHEET_ROW_GROUP_PATH]: row.groupTitle ?? '',\n };\n if (row.title) {\n next['title'] = row.title;\n }\n if (row.role === 'static') {\n for (const column of definition.columns) {\n next[column.name] = row.cells?.[column.name] ?? '';\n }\n return next;\n }\n for (const column of definition.columns) {\n if (column.role === 'static') {\n next[column.name] = row.cells?.[column.name] ?? '';\n }\n }\n const match = saved.find((item) => item['name'] === row.name);\n if (match) {\n for (const name of inputNames) {\n if (Object.prototype.hasOwnProperty.call(match, name)) {\n next[name] = match[name];\n }\n }\n }\n return next;\n });\n}\n\nexport function buildRepeatedTestSheetRows(answer: unknown): Record<string, unknown>[] {\n return asRowList(answer).map((row) => ({ ...row }));\n}\n\n/**\n * Persists the grid only after an input cell has a value.\n * Static text alone does not count as an answer.\n */\nexport function toStoredTestSheetAnswer(\n rows: Record<string, unknown>[],\n definition: AXMTestSheetDefinition,\n): Record<string, unknown>[] | null {\n const names = inputColumnNames(definition);\n const staticRowNames = new Set(\n definition.rows.filter((row) => row.role === 'static').map((row) => row.name),\n );\n const inputRows = rows.filter((row) => !staticRowNames.has(asText(row['name'])));\n const filled = inputRows.some((row) => names.some((name) => isFilledCell(row[name])));\n if (!filled) {\n return null;\n }\n return inputRows.map((row) => {\n const stored: Record<string, unknown> = { ...row };\n delete stored['title'];\n return stored;\n });\n}\n\nexport function nextTestSheetKey(prefix: string, used: string[]): string {\n const taken = new Set(used);\n let index = used.length + 1;\n let name = `${prefix}${index}`;\n while (taken.has(name)) {\n index += 1;\n name = `${prefix}${index}`;\n }\n return name;\n}\n\n/** Reads a select value stored as an id string or as `{ id }`. */\nexport function testSheetChoiceId(value: unknown): string {\n if (typeof value === 'string') {\n return value;\n }\n if (isRecord(value) && typeof value['id'] === 'string') {\n return value['id'];\n }\n return '';\n}\n\n/**\n * Fills blank or duplicate `name` keys on repeater rows.\n * Existing objects are kept when the name is already unique.\n */\nexport function assignTestSheetItemNames<T extends { name?: string }>(\n items: T[],\n prefix: string,\n): { items: T[]; changed: boolean } {\n const used = new Set<string>();\n let changed = false;\n const next = items.map((item) => {\n const current = item && typeof item === 'object' ? item : ({} as T);\n const name = typeof current.name === 'string' ? current.name.trim() : '';\n if (name && !used.has(name)) {\n used.add(name);\n return current;\n }\n changed = true;\n const assigned = nextTestSheetKey(prefix, [...used]);\n used.add(assigned);\n return { ...current, name: assigned };\n });\n return { items: next, changed };\n}\n\n/**\n * Older columns store `widgetType` and `choices`.\n * The configurator reads `widget`, so a missing node is built once from those fields.\n */\nexport function ensureTestSheetColumnWidgets<\n T extends {\n name?: string;\n role?: unknown;\n widget?: unknown;\n widgetType?: unknown;\n choices?: unknown;\n required?: unknown;\n defaultValue?: unknown;\n },\n>(items: T[]): { items: T[]; changed: boolean } {\n let changed = false;\n const next = items.map((item) => {\n if (!isRecord(item)) {\n return item;\n }\n const isStatic = testSheetChoiceId(item['role']) === 'static';\n const current = asWidgetNode(item['widget']);\n const base = current ?? (isStatic ? undefined : legacyInputWidget(item));\n const widget = moveColumnOptionsOntoWidget(base, item);\n const stripLegacy = item['required'] !== undefined || item['defaultValue'] !== undefined;\n if (widget === current && !stripLegacy) {\n return item;\n }\n changed = true;\n const nextItem: Record<string, unknown> = { ...item };\n if (widget) {\n nextItem['widget'] = widget;\n }\n delete nextItem['required'];\n delete nextItem['defaultValue'];\n return nextItem as T;\n });\n return { items: next, changed };\n}\n\n//#endregion\n\n//#region ----- Helpers -----\n\nfunction normalizePercentDiff(value: unknown): AXMTestSheetPercentDiff | undefined {\n if (!isRecord(value) || value['kind'] !== 'percent-diff') {\n return undefined;\n }\n const base = asText(value['base']);\n const other = asText(value['other']);\n if (!base || !other) {\n return undefined;\n }\n return { kind: 'percent-diff', base, other };\n}\n\n/** `|other - base| / |base| × 100`, rounded to two decimals. Empty when either side is missing or the base is 0. */\nfunction percentDifference(baseValue: unknown, otherValue: unknown): number | null {\n const base = asFiniteNumber(baseValue);\n const other = asFiniteNumber(otherValue);\n if (base == null || other == null || base === 0) {\n return null;\n }\n return Math.round((Math.abs(other - base) / Math.abs(base)) * 10000) / 100;\n}\n\nfunction asFiniteNumber(value: unknown): number | null {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === 'string' && value.trim() !== '') {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n }\n return null;\n}\n\nfunction inputColumnNames(definition: AXMTestSheetDefinition): string[] {\n return definition.columns.filter((column) => column.role === 'input').map((column) => column.name);\n}\n\nfunction staticCellWidget(column: AXMTestSheetColumn): AXPWidgetNode {\n return {\n type: 'text-editor',\n defaultValue: column.widget?.defaultValue ?? '',\n options: {},\n };\n}\n\nfunction inputCellWidget(column: AXMTestSheetColumn): AXPWidgetNode {\n return asWidgetNode(column.widget) ?? legacyInputWidget(column);\n}\n\nfunction legacyInputWidget(source: { widgetType?: unknown; choices?: unknown }): AXPWidgetNode {\n const type = asWidgetType(source.widgetType);\n if (type === 'select-editor') {\n const choices = typeof source.choices === 'string' ? source.choices : '';\n const dataSource = choices\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n .map((line) => ({ id: line, title: line }));\n return {\n type,\n options: {\n valueField: 'id',\n textField: 'title',\n dataSource,\n },\n };\n }\n return { type, options: {} };\n}\n\n/**\n * Older sheets stored required and default value on the column.\n * The widget configurator stores them on the node: `defaultValue` and `options.validations.required`.\n */\nfunction moveColumnOptionsOntoWidget(\n widget: AXPWidgetNode | undefined,\n source: { required?: unknown; defaultValue?: unknown },\n): AXPWidgetNode | undefined {\n const defaultValue = typeof source.defaultValue === 'string' ? source.defaultValue : '';\n const needsRequired = source.required === true && (!widget || !widgetHasRequired(widget));\n const needsDefault =\n defaultValue.length > 0 && (widget?.defaultValue === undefined || widget.defaultValue === '');\n if (!needsRequired && !needsDefault) {\n return widget;\n }\n const next: AXPWidgetNode = widget\n ? { ...widget, options: { ...(widget.options ?? {}) } }\n : { type: 'text-editor', options: {} };\n if (needsRequired) {\n const validations = isRecord(next.options?.['validations']) ? { ...next.options['validations'] } : {};\n validations['required'] = { rule: 'required' };\n next.options = { ...(next.options ?? {}), validations };\n }\n if (needsDefault) {\n next.defaultValue = defaultValue;\n }\n return next;\n}\n\nfunction widgetHasRequired(node: AXPWidgetNode): boolean {\n const validations = node.options?.['validations'];\n if (Array.isArray(validations)) {\n return validations.some((rule) => isRequiredRule(rule));\n }\n if (isRecord(validations)) {\n return isRequiredRule(validations['required']);\n }\n return false;\n}\n\nfunction isRequiredRule(value: unknown): boolean {\n return isRecord(value) && value['rule'] === 'required' && value['disabled'] !== true;\n}\n\nfunction asWidgetNode(value: unknown): AXPWidgetNode | undefined {\n if (!isRecord(value)) {\n return undefined;\n }\n const type = asText(value['type']).trim();\n if (!type) {\n return undefined;\n }\n const node: AXPWidgetNode = {\n type,\n options: isRecord(value['options']) ? value['options'] : {},\n };\n if (value['defaultValue'] !== undefined) {\n node.defaultValue = value['defaultValue'];\n }\n if (value['triggers']) {\n node.triggers = value['triggers'] as AXPWidgetNode['triggers'];\n }\n if (value['valueTransforms']) {\n node.valueTransforms = value['valueTransforms'] as AXPWidgetNode['valueTransforms'];\n }\n return node;\n}\n\nfunction asWidgetType(value: unknown): AXMTestSheetInputWidgetType {\n const text = asText(value);\n if ((AXM_TEST_SHEET_INPUT_WIDGET_TYPES as readonly string[]).includes(text)) {\n return text as AXMTestSheetInputWidgetType;\n }\n return 'text-editor';\n}\n\nfunction asRowList(value: unknown): Record<string, unknown>[] {\n if (!Array.isArray(value)) {\n return [];\n }\n return value.filter(isRecord);\n}\n\nfunction isFilledCell(value: unknown): boolean {\n if (value === null || value === undefined || value === '' || value === false) {\n return false;\n }\n if (Array.isArray(value)) {\n return value.length > 0;\n }\n return true;\n}\n\nfunction asText(value: unknown): string {\n return typeof value === 'string' ? value : '';\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n//#endregion\n"],"names":[],"mappings":"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"}
@@ -2,10 +2,10 @@ import { AXTranslationService } from '@acorex/core/translation';
2
2
  import * as i0 from '@angular/core';
3
3
  import { inject, Injectable } from '@angular/core';
4
4
  import { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';
5
- import { isString, isEmpty, toString, get, defaultTo, first } from 'lodash';
6
- import { h as AXMQuestionnaireViewerService } from './acorex-platform-module-assessment-management-client-acorex-platform-module-assessment-management-client-Dr56BtSo.mjs';
7
- import { RootConfig } from '@acorex-platform/module-assessment-management-client/contracts';
8
- import { o as openAssessmentSessionAnswersView } from './acorex-platform-module-assessment-management-client-assessment-session-answers-view.util-42ZcOY2C.mjs';
5
+ import { isString, isEmpty, toString, get, first, defaultTo } from 'lodash';
6
+ import { h as AXMQuestionnaireViewerService } from './acorex-platform-module-assessment-management-client-acorex-platform-module-assessment-management-client-CTgUvF5N.mjs';
7
+ import { toPersistedAnswers, RootConfig } from '@acorex-platform/module-assessment-management-client/contracts';
8
+ import { o as openAssessmentSessionAnswersView } from './acorex-platform-module-assessment-management-client-assessment-session-answers-view.util-D5gUv0HJ.mjs';
9
9
 
10
10
  //#endregion
11
11
  //#region ---- View Session Answers Command ----
@@ -103,7 +103,7 @@ class ViewSessionAnswersCommand {
103
103
  return {
104
104
  ...row,
105
105
  id: sessionId,
106
- answers: defaultTo(get(row, 'answers'), {}),
106
+ answers: toPersistedAnswers(get(row, 'answers')),
107
107
  };
108
108
  }
109
109
  const sessionAccessor = this.entityService
@@ -277,4 +277,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
277
277
  }] });
278
278
 
279
279
  export { ViewSessionAnswersCommand };
280
- //# sourceMappingURL=acorex-platform-module-assessment-management-client-view-session-answers.command-rsDFSIgz.mjs.map
280
+ //# sourceMappingURL=acorex-platform-module-assessment-management-client-view-session-answers.command-DtmC9mBT.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acorex-platform-module-assessment-management-client-view-session-answers.command-DtmC9mBT.mjs","sources":["../../../../libs/modules/assessment-management/client/src/lib/features/questionnaire-viewer/commands/view-session-answers.command.ts"],"sourcesContent":["//#region ---- Imports ----\n\nimport { AXPCommand, type AXPCommandExecuteResultPromise } from '@acorex-platform/framework-shared/runtime';\nimport { AXPRuntimeCommandResult } from '@acorex-platform/framework-shared/core';\n\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { Injectable, inject } from '@angular/core';\nimport { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';\nimport { defaultTo, first, get, isEmpty, isString, toString } from 'lodash';\nimport { AXMQuestionnaireViewerService } from '../questionnaire-viewer.service';\nimport type { AXMAssessmentManagementAssessmentCaseEntityModel } from '@acorex-platform/module-assessment-management-client/contracts';\nimport type { AXMAssessmentManagementAssessmentSessionEntityModel } from '@acorex-platform/module-assessment-management-client/contracts';\nimport { RootConfig, toPersistedAnswers } from '@acorex-platform/module-assessment-management-client/contracts';\nimport { openAssessmentSessionAnswersView, type OpenAssessmentSessionAnswersInitialStep } from '../utils/assessment-session-answers-view.util';\n\n//#endregion\n\n//#region ---- Command Input/Output Types ----\n\n/**\n * Input for ViewSessionAnswers command.\n */\nexport interface ViewSessionAnswersCommandInput {\n /**\n * Assessment Case ID. Required when `sessionId` is omitted; used to resolve the latest session.\n */\n caseId?: string;\n\n /**\n * Assessment Session ID to view answers for. When omitted, the latest session for `caseId` is used.\n */\n sessionId?: string;\n\n /**\n * When `results`, opens the readonly viewer on the outcome results step (requires stored session outcomes).\n */\n initialStep?: OpenAssessmentSessionAnswersInitialStep;\n}\n\n/** Entity list passes evaluated action options on `options` / row `data`. */\ntype ViewSessionAnswersCommandInvocation = ViewSessionAnswersCommandInput & {\n data?: Record<string, unknown>;\n options?: Partial<ViewSessionAnswersCommandInput>;\n};\n\n//#endregion\n\n//#region ---- View Session Answers Command ----\n\n/**\n * Command that opens a readonly view of assessment session answers in a dialog.\n */\n@Injectable()\nexport class ViewSessionAnswersCommand implements AXPCommand<ViewSessionAnswersCommandInput, void> {\n //#region ---- Services & Dependencies ----\n\n private readonly entityService = inject(AXPEntityService);\n private readonly questionnaireViewerService = inject(AXMQuestionnaireViewerService);\n private readonly translationService = inject(AXTranslationService);\n\n //#endregion\n\n //#region ---- Command Implementation ----\n\n /**\n * Returns a non-empty string or undefined.\n */\n private asNonEmptyString(value: unknown): string | undefined {\n if (isString(value) && !isEmpty(value)) {\n return value;\n }\n if (value != null && !isString(value)) {\n const normalized = toString(value).trim();\n return isEmpty(normalized) ? undefined : normalized;\n }\n return undefined;\n }\n\n /**\n * Resolves session id from root input, action options, or related-list row data.\n */\n private resolveSessionId(input: ViewSessionAnswersCommandInvocation): string | null {\n const candidates = [\n get(input, 'sessionId'),\n get(input, 'options.sessionId'),\n get(input, 'options.sessionId'),\n ];\n\n for (const candidate of candidates) {\n const resolved = this.asNonEmptyString(candidate);\n if (resolved) {\n return resolved;\n }\n }\n\n const row = get(input, 'data') as Record<string, unknown> | undefined;\n if (row && this.asNonEmptyString(get(row, 'caseId'))) {\n return this.asNonEmptyString(get(row, 'id')) ?? null;\n }\n\n return null;\n }\n\n /**\n * Resolves case id from root input, action options, or list row data.\n */\n private resolveCaseId(input: ViewSessionAnswersCommandInvocation): string | null {\n const candidates = [\n get(input, 'caseId'),\n get(input, 'options.caseId'),\n get(input, 'options.caseId'),\n ];\n\n for (const candidate of candidates) {\n const resolved = this.asNonEmptyString(candidate);\n if (resolved) {\n return resolved;\n }\n }\n\n const row = get(input, 'data') as Record<string, unknown> | undefined;\n if (row && !this.asNonEmptyString(get(row, 'caseId'))) {\n return this.asNonEmptyString(get(row, 'id')) ?? null;\n }\n\n return null;\n }\n\n /**\n * Resolves initial viewer step from root input or action options.\n */\n private resolveInitialStep(input: ViewSessionAnswersCommandInvocation): OpenAssessmentSessionAnswersInitialStep {\n const candidates = [\n get(input, 'initialStep'),\n get(input, 'options.initialStep'),\n get(input, 'options.initialStep'),\n ];\n\n for (const candidate of candidates) {\n const normalized = this.asNonEmptyString(candidate);\n if (normalized === 'results') {\n return 'results';\n }\n }\n\n return 'answers';\n }\n\n /**\n * Loads session from related-list row data, list query, or byKey (in that order).\n */\n private async loadSession(\n sessionId: string,\n input: ViewSessionAnswersCommandInvocation,\n ): Promise<AXMAssessmentManagementAssessmentSessionEntityModel | null> {\n const row = get(input, 'data') as Record<string, unknown> | undefined;\n const rowCaseId = this.asNonEmptyString(get(row, 'caseId'));\n\n if (row && rowCaseId) {\n return {\n ...(row as unknown as AXMAssessmentManagementAssessmentSessionEntityModel),\n id: sessionId,\n answers: toPersistedAnswers(get(row, 'answers')),\n };\n }\n\n const sessionAccessor = this.entityService\n .withEntity(RootConfig.module.name, RootConfig.entities.assessmentSession.name)\n .data<string, AXMAssessmentManagementAssessmentSessionEntityModel>();\n\n const listMatch = await sessionAccessor.query({\n skip: 0,\n take: 1,\n filter: {\n field: 'id',\n operator: { type: 'equal' },\n value: sessionId,\n },\n });\n\n const fromQuery = first(listMatch.items);\n if (fromQuery) {\n return fromQuery;\n }\n\n return defaultTo(await sessionAccessor.byKey(sessionId), null);\n }\n\n /**\n * Loads case by id using query first, then byKey.\n */\n private async loadCase(caseId: string): Promise<AXMAssessmentManagementAssessmentCaseEntityModel | null> {\n const caseAccessor = this.entityService\n .withEntity(RootConfig.module.name, RootConfig.entities.assessmentCase.name)\n .data<string, AXMAssessmentManagementAssessmentCaseEntityModel>();\n\n const listMatch = await caseAccessor.query({\n skip: 0,\n take: 1,\n filter: {\n field: 'id',\n operator: { type: 'equal' },\n value: caseId,\n },\n });\n\n const fromQuery = first(listMatch.items);\n if (fromQuery) {\n return fromQuery;\n }\n\n return defaultTo(await caseAccessor.byKey(caseId), null);\n }\n\n /**\n * Finds the latest session record for a case (by lastSavedAt, then createdAt).\n */\n private async findLatestSession(\n caseId: string,\n ): Promise<AXMAssessmentManagementAssessmentSessionEntityModel | null> {\n const sessionAccessor = this.entityService\n .withEntity(RootConfig.module.name, RootConfig.entities.assessmentSession.name)\n .data<string, AXMAssessmentManagementAssessmentSessionEntityModel>();\n\n const listMatch = await sessionAccessor.query({\n skip: 0,\n take: 1,\n sort: [\n { field: 'lastSavedAt', dir: 'desc' },\n { field: 'createdAt', dir: 'desc' },\n ],\n filter: {\n field: 'caseId',\n operator: { type: 'equal' },\n value: caseId,\n },\n });\n\n return first(listMatch.items) ?? null;\n }\n\n async execute(input: ViewSessionAnswersCommandInvocation): AXPCommandExecuteResultPromise<void> {\n try {\n const sessionId = this.resolveSessionId(input);\n const caseId = this.resolveCaseId(input);\n\n if (!sessionId && !caseId) {\n return {\n success: false,\n message: {\n text: 'Assessment case ID or session ID is required',\n },\n };\n }\n\n let session: AXMAssessmentManagementAssessmentSessionEntityModel | null = null;\n let assessmentCase: AXMAssessmentManagementAssessmentCaseEntityModel | null = null;\n\n if (sessionId) {\n session = await this.loadSession(sessionId, input);\n if (!session) {\n return {\n success: false,\n message: {\n text: `Assessment session with ID ${sessionId} not found`,\n },\n };\n }\n\n const resolvedCaseId = this.asNonEmptyString(get(session, 'caseId')) ?? caseId;\n if (!resolvedCaseId) {\n return {\n success: false,\n message: {\n text: 'Assessment session is missing caseId',\n },\n };\n }\n\n assessmentCase = await this.loadCase(resolvedCaseId);\n if (!assessmentCase) {\n return {\n success: false,\n message: {\n text: `Assessment case with ID ${resolvedCaseId} not found`,\n },\n };\n }\n } else if (caseId) {\n assessmentCase = await this.loadCase(caseId);\n if (!assessmentCase) {\n return {\n success: false,\n message: {\n text: `Assessment case with ID ${caseId} not found`,\n },\n };\n }\n\n session = await this.findLatestSession(caseId);\n if (!session) {\n const messageKey = '@assessment-management:cases.actions.view-last-session-answers.no-session';\n const messageText =\n (await this.translationService.translateAsync(messageKey)) ||\n 'No assessment session found for this case';\n return {\n success: false,\n message: {\n text: messageText,\n },\n };\n }\n }\n\n if (!session || !assessmentCase) {\n return {\n success: false,\n message: {\n text: 'Unable to resolve assessment session answers',\n },\n };\n }\n\n const initialStep = this.resolveInitialStep(input);\n if (initialStep === 'results' && isEmpty(get(session, 'outcomes'))) {\n return {\n success: false,\n message: {\n text: await this.translationService.translateAsync(\n '@assessment-management:sessions.actions.view-outcomes.empty',\n ),\n },\n };\n }\n\n await openAssessmentSessionAnswersView(\n {\n entityService: this.entityService,\n questionnaireViewerService: this.questionnaireViewerService,\n translationService: this.translationService,\n },\n session,\n assessmentCase,\n { initialStep },\n );\n\n return { success: true, kind: 'object', data: undefined,\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n return {\n success: false,\n message: {\n text: `Error viewing session answers: ${message}`,\n },\n };\n }\n }\n\n //#endregion\n}\n\n//#endregion\n"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- export { C as AXMAssessmentManagementFeatureDefinitionProvider, D as AXMAssessmentManagementMenuProvider, E as AXMAssessmentManagementModule, G as AXMAssessmentManagementPermissionDefinitionProvider, H as AXMAssessmentManagementSearchCommandProvider, I as AXMQuestionnaireViewerPageComponent, h as AXMQuestionnaireViewerService, J as AXMQuestionnaireViewerStandalonePageComponent, w as resolveWidgetNodeFromMetaDataDefinitionInterface, v as stripQuestionBankInterfaceMetadata } from './acorex-platform-module-assessment-management-client-acorex-platform-module-assessment-management-client-Dr56BtSo.mjs';
1
+ export { C as AXMAssessmentManagementFeatureDefinitionProvider, D as AXMAssessmentManagementMenuProvider, E as AXMAssessmentManagementModule, G as AXMAssessmentManagementPermissionDefinitionProvider, H as AXMAssessmentManagementSearchCommandProvider, I as AXMQuestionnaireViewerPageComponent, h as AXMQuestionnaireViewerService, J as AXMQuestionnaireViewerStandalonePageComponent, w as resolveWidgetNodeFromMetaDataDefinitionInterface, v as stripQuestionBankInterfaceMetadata } from './acorex-platform-module-assessment-management-client-acorex-platform-module-assessment-management-client-CTgUvF5N.mjs';
2
2
  //# sourceMappingURL=acorex-platform-module-assessment-management-client.mjs.map
@@ -157,7 +157,7 @@
157
157
  },
158
158
  "print-template-id": {
159
159
  "title": "Print Template",
160
- "description": "Content template that wraps the filled questionnaire. Uses the company print master for letterhead and border."
160
+ "description": "Master template whose email body includes the [content] slot."
161
161
  },
162
162
  "sections": {
163
163
  "title": "Sections",
@@ -573,6 +573,7 @@
573
573
  "error-title": "Validation Error",
574
574
  "current-page-error": "Please complete all required questions on this page before continuing.",
575
575
  "all-questions-error": "Please complete all required questions in the questionnaire before submitting.",
576
+ "question-required": "This question is required.",
576
577
  "comment-required": "A comment is required for {{ title }}."
577
578
  },
578
579
  "fields": {
@@ -589,6 +590,24 @@
589
590
  "side-menu": "Side Menu (Sections in Sidebar, Questions On Right)"
590
591
  }
591
592
  },
593
+ "question-layout": {
594
+ "title": "Question Layout",
595
+ "description": "Where the answer sits relative to the question. Automatic uses one row when the question is short and the answer control is compact.",
596
+ "options": {
597
+ "below": "Below Question",
598
+ "opposite": "Opposite",
599
+ "auto": "Automatic"
600
+ }
601
+ },
602
+ "question-appearance": {
603
+ "title": "Question Appearance",
604
+ "description": "Visual style of each question.",
605
+ "options": {
606
+ "card": "Card",
607
+ "plain": "Plain",
608
+ "accent": "Accent"
609
+ }
610
+ },
592
611
  "show-timer": {
593
612
  "title": "Show Timer"
594
613
  },
@@ -1033,7 +1052,9 @@
1033
1052
  "comment": { "title": "Comment" },
1034
1053
  "question-bank-item-id": { "title": "Question Bank Item Id" },
1035
1054
  "structure": { "title": "Structure" },
1036
- "dialog-title": { "title": "Dialog Title" }
1055
+ "dialog-title": { "title": "Dialog Title" },
1056
+ "allow-edit-submitted": { "title": "Allow Editing Submitted" },
1057
+ "readonly": { "title": "Read Only" }
1037
1058
  }
1038
1059
  },
1039
1060
  "view-session-answers": {
@@ -1052,6 +1073,7 @@
1052
1073
  "questionnaire-not-found": "Questionnaire with ID {{questionnaireId}} was not found.",
1053
1074
  "no-questions": "Questionnaire has no questions to display.",
1054
1075
  "no-responder": "No responder ID provided and no current user found.",
1076
+ "session-case-mismatch": "This assessment session does not belong to the selected case.",
1055
1077
  "failed": "Error filling assessment session: {{message}}"
1056
1078
  }
1057
1079
  },
@@ -157,7 +157,7 @@
157
157
  },
158
158
  "print-template-id": {
159
159
  "title": "Print Template",
160
- "description": "Content template that wraps the filled questionnaire. Uses the company print master for letterhead and border."
160
+ "description": "Master template whose email body includes the [content] slot."
161
161
  },
162
162
  "sections": {
163
163
  "title": "Sections",
@@ -573,6 +573,7 @@
573
573
  "error-title": "Validation Error",
574
574
  "current-page-error": "Please complete all required questions on this page before continuing.",
575
575
  "all-questions-error": "Please complete all required questions in the questionnaire before submitting.",
576
+ "question-required": "This question is required.",
576
577
  "comment-required": "A comment is required for {{ title }}."
577
578
  },
578
579
  "fields": {
@@ -589,6 +590,24 @@
589
590
  "side-menu": "Side Menu (Sections in Sidebar, Questions On Right)"
590
591
  }
591
592
  },
593
+ "question-layout": {
594
+ "title": "Question Layout",
595
+ "description": "Where the answer sits relative to the question. Automatic uses one row when the question is short and the answer control is compact.",
596
+ "options": {
597
+ "below": "Below Question",
598
+ "opposite": "Opposite",
599
+ "auto": "Automatic"
600
+ }
601
+ },
602
+ "question-appearance": {
603
+ "title": "Question Appearance",
604
+ "description": "Visual style of each question.",
605
+ "options": {
606
+ "card": "Card",
607
+ "plain": "Plain",
608
+ "accent": "Accent"
609
+ }
610
+ },
592
611
  "show-timer": {
593
612
  "title": "Show Timer"
594
613
  },
@@ -1033,7 +1052,9 @@
1033
1052
  "comment": { "title": "Comment" },
1034
1053
  "question-bank-item-id": { "title": "Question Bank Item Id" },
1035
1054
  "structure": { "title": "Structure" },
1036
- "dialog-title": { "title": "Dialog Title" }
1055
+ "dialog-title": { "title": "Dialog Title" },
1056
+ "allow-edit-submitted": { "title": "Allow Editing Submitted" },
1057
+ "readonly": { "title": "Read Only" }
1037
1058
  }
1038
1059
  },
1039
1060
  "view-session-answers": {
@@ -1052,6 +1073,7 @@
1052
1073
  "questionnaire-not-found": "Questionnaire with ID {{questionnaireId}} was not found.",
1053
1074
  "no-questions": "Questionnaire has no questions to display.",
1054
1075
  "no-responder": "No responder ID provided and no current user found.",
1076
+ "session-case-mismatch": "This assessment session does not belong to the selected case.",
1055
1077
  "failed": "Error filling assessment session: {{message}}"
1056
1078
  }
1057
1079
  },
@@ -192,7 +192,7 @@
192
192
  },
193
193
  "print-template-id": {
194
194
  "title": "قالب چاپ",
195
- "description": "قالب محتوایی که پرسشنامه پرشده را می‌پوشاند. سربرگ و حاشیه از قالب اصلی چاپ شرکت می‌آید."
195
+ "description": "قالب اصلی که در متن ایمیل جای [content] دارد."
196
196
  },
197
197
  "sections": {
198
198
  "title": "بخش‌ها",
@@ -629,6 +629,7 @@
629
629
  "error-title": "خطای اعتبارسنجی",
630
630
  "current-page-error": "لطفاً تمام سوالات اجباری این صفحه را تکمیل کنید.",
631
631
  "all-questions-error": "لطفاً تمام سوالات اجباری پرسشنامه را قبل از ارسال تکمیل کنید.",
632
+ "question-required": "پاسخ به این سوال الزامی است.",
632
633
  "comment-required": "برای «{{ title }}» وارد کردن توضیح الزامی است."
633
634
  },
634
635
  "fields": {
@@ -645,6 +646,24 @@
645
646
  "side-menu": "منوی کناری (بخش‌ها در سایدبار، سوالات در سمت راست)"
646
647
  }
647
648
  },
649
+ "question-layout": {
650
+ "title": "چیدمان سوال",
651
+ "description": "جای پاسخ نسبت به متن سوال. خودکار برای سوال کوتاه با پاسخ فشرده، روبرو نشان می‌دهد.",
652
+ "options": {
653
+ "below": "زیر سوال",
654
+ "opposite": "روبرو",
655
+ "auto": "خودکار"
656
+ }
657
+ },
658
+ "question-appearance": {
659
+ "title": "ظاهر سوال",
660
+ "description": "سبک نمایش هر سوال.",
661
+ "options": {
662
+ "card": "کارتی",
663
+ "plain": "ساده",
664
+ "accent": "رنگی"
665
+ }
666
+ },
648
667
  "show-timer": {
649
668
  "title": "نمایش تایمر"
650
669
  },
@@ -1068,7 +1087,9 @@
1068
1087
  "comment": { "title": "توضیح" },
1069
1088
  "question-bank-item-id": { "title": "شناسه آیتم بانک سؤال" },
1070
1089
  "structure": { "title": "ساختار" },
1071
- "dialog-title": { "title": "عنوان پنجره" }
1090
+ "dialog-title": { "title": "عنوان پنجره" },
1091
+ "allow-edit-submitted": { "title": "اجازه ویرایش ارسال‌شده" },
1092
+ "readonly": { "title": "فقط خواندنی" }
1072
1093
  }
1073
1094
  },
1074
1095
  "view-session-answers": {
@@ -1087,6 +1108,7 @@
1087
1108
  "questionnaire-not-found": "پرسشنامه با شناسه {{questionnaireId}} یافت نشد.",
1088
1109
  "no-questions": "پرسشنامه سؤالی برای نمایش ندارد.",
1089
1110
  "no-responder": "شناسه پاسخ‌دهنده مشخص نشده و کاربر جاری یافت نشد.",
1111
+ "session-case-mismatch": "این جلسه ارزیابی به پرونده انتخاب‌شده تعلق ندارد.",
1090
1112
  "failed": "خطا در پر کردن جلسه ارزیابی: {{message}}"
1091
1113
  }
1092
1114
  },
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@acorex-platform/module-assessment-management-client",
3
- "version": "2.0.0-next.3",
3
+ "version": "2.0.0-next.30",
4
4
  "sideEffects": false,
5
5
  "peerDependencies": {
6
+ "@acorex-platform/extension-ai-voice-shell-client": "2.0.0-next.30",
7
+ "@acorex-platform/module-content-management-client": "2.0.0-next.30",
6
8
  "@angular/common": "^21.0.0 || ^22.0.0",
7
- "@angular/core": "^21.0.0 || ^22.0.0",
8
- "@acorex-platform/extension-ai-voice-shell-client": "2.0.0-next.3",
9
- "@acorex-platform/module-content-management-client": "2.0.0-next.3"
9
+ "@angular/core": "^21.0.0 || ^22.0.0"
10
10
  },
11
11
  "dependencies": {
12
12
  "tslib": "^2.3.0"
@@ -206,6 +206,13 @@ declare function resolvePrintPdfPageOptions(print: Pick<QuestionnairePrintSettin
206
206
  */
207
207
  /** Whether the respondent can save a draft before final submit. */
208
208
  type QuestionnaireCompletionMode = 'submit-only' | 'save-and-continue';
209
+ /**
210
+ * Where the answer sits relative to the question text.
211
+ * `auto` uses one row when the question text is short and the answer control is compact.
212
+ */
213
+ type QuestionnaireQuestionLayout = 'below' | 'opposite' | 'auto';
214
+ /** Visual style of each question. Independent of {@link QuestionnaireQuestionLayout}. */
215
+ type QuestionnaireQuestionAppearance = 'card' | 'plain' | 'accent';
209
216
  interface QuestionnaireDisplaySettings {
210
217
  /**
211
218
  * View mode: single-page, page-per-group, page-per-question, side-menu
@@ -254,6 +261,15 @@ interface QuestionnaireDisplaySettings {
254
261
  * Default: step
255
262
  */
256
263
  validationStrategy?: 'step' | 'end';
264
+ /**
265
+ * Answer placement: below the question, on the opposite edge of the same row, or automatic.
266
+ * Default: below.
267
+ */
268
+ questionLayout?: QuestionnaireQuestionLayout;
269
+ /**
270
+ * Question chrome: card, plain, or accent. Default: card.
271
+ */
272
+ questionAppearance?: QuestionnaireQuestionAppearance;
257
273
  }
258
274
  /**
259
275
  * Value structure stored in entity (simplified for persistence)
@@ -497,6 +513,38 @@ interface AXMAssessmentManagementAssessmentCaseEntityModel extends AXPEntityMode
497
513
  statusId?: AXMAssessmentCaseStatus;
498
514
  }
499
515
 
516
+ /**
517
+ * One saved questionnaire answer on an assessment session.
518
+ * `key` is the question item name. `order` is that item's `order`.
519
+ */
520
+ interface AXMAssessmentSessionAnswer {
521
+ key: string;
522
+ order: number;
523
+ value: unknown;
524
+ comment?: string;
525
+ }
526
+ /**
527
+ * Viewer context map (`answers.<key>`, plus `answers.comments.<key>`).
528
+ * Accepts the persisted array and the older object document.
529
+ */
530
+ declare function toViewerAnswers(stored: unknown): Record<string, unknown>;
531
+ /**
532
+ * Persists the viewer map as an ordered answer array.
533
+ * Question `order` comes from `structure`. Keys already stored keep their order when the structure has no match.
534
+ * Empty answers are omitted. A comment without a value is kept.
535
+ */
536
+ declare function toPersistedAnswers(viewerOrStored: unknown, structure?: QuestionnaireBuilderValue | null, previousStored?: unknown): AXMAssessmentSessionAnswer[];
537
+ /** True when the stored document has at least one answer or comment. */
538
+ declare function storedAnswersHaveContent(stored: unknown): boolean;
539
+ /**
540
+ * Fills missing answer keys and always returns the persisted array.
541
+ * Existing values, including `false` and `0`, are left in place.
542
+ */
543
+ declare function mergeMissingPersistedAnswers(stored: unknown, prefill: Record<string, unknown>, structure?: QuestionnaireBuilderValue | null): {
544
+ answers: AXMAssessmentSessionAnswer[];
545
+ changed: boolean;
546
+ };
547
+
500
548
  type AXMAssessmentSessionRole = 'responder' | 'supervisor' | 'reviewer';
501
549
  type AXMAssessmentSessionStatus = 'not-started' | 'in-progress' | 'submitted' | 'under-review' | 'approved' | 'rejected' | 'completed';
502
550
  interface AXMAssessmentManagementAssessmentSessionEntityModel extends AXPEntityModel<string> {
@@ -510,7 +558,8 @@ interface AXMAssessmentManagementAssessmentSessionEntityModel extends AXPEntityM
510
558
  timeSpent?: number;
511
559
  progressPercentage: number;
512
560
  answeredQuestionsCount: number;
513
- answers: Record<string, unknown>;
561
+ /** Saved answers, ordered like the questionnaire items (`key` + `order` + `value`). */
562
+ answers: AXMAssessmentSessionAnswer[];
514
563
  /**
515
564
  * Evaluated questionnaire outcome values (rule `name` → value), snapshot at submit.
516
565
  */
@@ -761,7 +810,7 @@ type AssessmentPostContent = PostQuestionnaireConfig;
761
810
  /**
762
811
  * Entity-level display options (viewer / builder preview). Subset of {@link QuestionnaireDisplaySettings}.
763
812
  */
764
- type QuestionnaireEntityDisplaySettings = Pick<QuestionnaireDisplaySettings, 'viewMode' | 'showProgressBar' | 'showTimer' | 'showQuestionNumbers' | 'validationStrategy' | 'completionMode'>;
813
+ type QuestionnaireEntityDisplaySettings = Pick<QuestionnaireDisplaySettings, 'viewMode' | 'showProgressBar' | 'showTimer' | 'showQuestionNumbers' | 'validationStrategy' | 'completionMode' | 'questionLayout' | 'questionAppearance'>;
765
814
  declare const DEFAULT_QUESTIONNAIRE_ENTITY_DISPLAY: QuestionnaireEntityDisplaySettings;
766
815
  /** Entity-level print document defaults. */
767
816
  type QuestionnaireEntityPrintSettings = QuestionnairePrintSettings;
@@ -810,6 +859,10 @@ declare const VALIDATION_STRATEGY_VALUES: readonly ["step", "end"];
810
859
  type ValidationStrategyValue = (typeof VALIDATION_STRATEGY_VALUES)[number];
811
860
  declare const COMPLETION_MODE_VALUES: readonly ["submit-only", "save-and-continue"];
812
861
  type CompletionModeValue = (typeof COMPLETION_MODE_VALUES)[number];
862
+ declare const QUESTION_LAYOUT_VALUES: readonly ["below", "opposite", "auto"];
863
+ type QuestionLayoutValue = (typeof QUESTION_LAYOUT_VALUES)[number];
864
+ declare const QUESTION_APPEARANCE_VALUES: readonly ["card", "plain", "accent"];
865
+ type QuestionAppearanceValue = (typeof QUESTION_APPEARANCE_VALUES)[number];
813
866
  /**
814
867
  * Coerces stored view mode (string or SelectBox `{ id }`) to a known value.
815
868
  */
@@ -822,6 +875,14 @@ declare function normalizeValidationStrategy(value: unknown): ValidationStrategy
822
875
  * Coerces stored completion mode (string or SelectBox `{ id }`) to a known value.
823
876
  */
824
877
  declare function normalizeCompletionMode(value: unknown): CompletionModeValue;
878
+ /**
879
+ * Coerces stored question layout (string or SelectBox `{ id }`) to a known value.
880
+ */
881
+ declare function normalizeQuestionLayout(value: unknown): QuestionLayoutValue;
882
+ /**
883
+ * Coerces stored question appearance (string or SelectBox `{ id }`) to a known value.
884
+ */
885
+ declare function normalizeQuestionAppearance(value: unknown): QuestionAppearanceValue;
825
886
  /**
826
887
  * Maps entity `display` to {@link QuestionnaireDisplaySettings} (defaults when omitted).
827
888
  */
@@ -896,5 +957,5 @@ interface AXMFormTemplateListItemDto extends AXPEntityListItemDto<string> {
896
957
  }[];
897
958
  }
898
959
 
899
- export { ASSESSMENT_PRINT_CONTENT_WIDTH_MM, ASSESSMENT_PRINT_HTML_GZIP_ENCODING, ASSESSMENT_PRINT_PAGE_FORMAT, AXMAssessmentManagementFeatureKeys, AXMAssessmentManagementPermissionKeys, AXMFormTemplateTypes, AXM_ASSESSMENT_PRINT_MERGE_KEYS, AXM_ASSESSMENT_SESSION_PREVIEW_PDF_CLIENT_COMMAND_KEY, AXM_ASSESSMENT_SESSION_PREVIEW_PDF_COMMAND_KEY, AXPAssessmentManagementMenuKeys, AXPContentDocumentsPermissionKeys, AXPFormTemplateManagementMenuKeys, AXPFormTemplateManagementPermissionKeys, AXPFormTemplateSettings, AXPSafetyRiskPermissionKeys, AssessmentManagementManifest, DEFAULT_POST_QUESTIONNAIRE_CONFIG, DEFAULT_PRE_QUESTIONNAIRE_CONFIG, DEFAULT_QUESTIONNAIRE_ENTITY_DISPLAY, DEFAULT_QUESTIONNAIRE_ENTITY_PRINT, DEFAULT_QUESTIONNAIRE_OUTCOMES, DEFAULT_QUESTIONNAIRE_PRINT_SETTINGS, DEFAULT_QUESTION_COMMENT_CONFIG, DEFAULT_QUESTION_HINT_CONFIG, PRINT_PAGE_LETTERHEAD_BOTTOM_MARGIN_MM, PRINT_PAGE_LETTERHEAD_TOP_MARGIN_MM, PRINT_PAGE_SIDE_MARGIN_MM, QUESTIONNAIRE_ITEM_COL_SPANS, QUESTIONNAIRE_OUTCOMES_PAGE_COMPONENT_KEY, QUESTIONNAIRE_QUESTIONS_PAGE_COMPONENT_KEY, RootConfig, applyQuestionnairePrintHeader, buildQuestionnairePrintBodyHtml, buildQuestionnairePrintHeaderRegion, buildQuestionnaireQuestionCardHtml, buildQuestionnaireSessionBodyHtml, coerceQuestionnaireItemColSpan, commentConfigForEditForm, diffQuestionCommentOverride, diffQuestionHintOverride, escapePrintDocumentText, extractPrintDocumentBodyHtml, findDuplicateOutcomeNames, flattenQuestionnaireOutcomeItems, formatPrintAnswerText, getQuestionAnswerCommentStoragePath, getQuestionCommentVisibilityFlag, isQuestionnaireOutcomeDisplayColorHex, matchesQuestionnaireOutcomeDisplayRule, mergeQuestionCommentConfig, mergeQuestionHintForViewer, minifyPrintHtml, normalizeCompletionMode, normalizePrintOrientation, normalizePrintPaperSize, normalizePrintWatermark, normalizeQuestionCommentConfig, normalizeQuestionHintConfig, normalizeQuestionHintFromEntityRow, normalizeQuestionHintMode, normalizeQuestionnaireOutcomeDisplayRules, normalizeQuestionnaireOutcomesValue, normalizeValidationStrategy, normalizeViewMode, parseQuestionHintPartialFromRecord, parseQuestionnaireOutcomeDisplayColor, questionnaireItemLayoutOverride, readHintFieldsFromRecord, readQuestionnaireItemColSpan, resolvePrintContentWidthMm, resolvePrintLetterheadPdfMargin, resolvePrintPaging, resolvePrintPdfPageOptions, resolvePrintPlainText, resolvePrintSettings, toDisplaySettings, toPrePostConfig, toPrintSettings, wrapPrintDocument };
900
- export type { AXMAssessmentCaseStatus, AXMAssessmentManagementAssessmentCaseEntityModel, AXMAssessmentManagementAssessmentSessionEntityModel, AXMAssessmentManagementQuestionBankItemEntityModel, AXMAssessmentManagementQuestionnaireEntityModel, AXMAssessmentPrintMergeKey, AXMAssessmentQuestionCommentConfig, AXMAssessmentQuestionHintConfig, AXMAssessmentQuestionHintConfigOff, AXMAssessmentQuestionHintConfigShown, AXMAssessmentQuestionHintMode, AXMAssessmentQuestionHintPartial, AXMAssessmentQuestionHintVisualMode, AXMAssessmentSessionPreviewPdfRequest, AXMAssessmentSessionPreviewPdfResult, AXMAssessmentSessionRole, AXMAssessmentSessionStatus, AXMCreateFormTemplateDto, AXMFormTemplateDetailDto, AXMFormTemplateListItemDto, AXMFormTemplateType, AXMFormTemplateTypeOption, AXMQuestionBankItemInterfaceMetadata, AXMQuestionBankItemInterfaceValue, AXMUpdateFormTemplateDto, AssessmentOutcomeItem, AssessmentOutcomesValue, AssessmentPostContent, AssessmentPreContent, PostQuestionnaireConfig, PrePostConfig, PrePostContentValue, PreQuestionnaireConfig, QuestionnaireBuilderValue, QuestionnaireCompletionMode, QuestionnaireDisplaySettings, QuestionnaireEntityDisplaySettings, QuestionnaireEntityPrintSettings, QuestionnaireItemColSpan, QuestionnaireOutcomeDisplayColor, QuestionnaireOutcomeDisplayEmphasis, QuestionnaireOutcomeDisplayIcon, QuestionnaireOutcomeDisplayOperator, QuestionnaireOutcomeDisplayRule, QuestionnaireOutcomeItem, QuestionnaireOutcomeResultKind, QuestionnaireOutcomeSection, QuestionnaireOutcomesValue, QuestionnairePrintBodySection, QuestionnairePrintHeaderInput, QuestionnairePrintOrientation, QuestionnairePrintPaging, QuestionnairePrintPaperSize, QuestionnairePrintQuestionHtml, QuestionnairePrintSettings };
960
+ export { ASSESSMENT_PRINT_CONTENT_WIDTH_MM, ASSESSMENT_PRINT_HTML_GZIP_ENCODING, ASSESSMENT_PRINT_PAGE_FORMAT, AXMAssessmentManagementFeatureKeys, AXMAssessmentManagementPermissionKeys, AXMFormTemplateTypes, AXM_ASSESSMENT_PRINT_MERGE_KEYS, AXM_ASSESSMENT_SESSION_PREVIEW_PDF_CLIENT_COMMAND_KEY, AXM_ASSESSMENT_SESSION_PREVIEW_PDF_COMMAND_KEY, AXPAssessmentManagementMenuKeys, AXPContentDocumentsPermissionKeys, AXPFormTemplateManagementMenuKeys, AXPFormTemplateManagementPermissionKeys, AXPFormTemplateSettings, AXPSafetyRiskPermissionKeys, AssessmentManagementManifest, DEFAULT_POST_QUESTIONNAIRE_CONFIG, DEFAULT_PRE_QUESTIONNAIRE_CONFIG, DEFAULT_QUESTIONNAIRE_ENTITY_DISPLAY, DEFAULT_QUESTIONNAIRE_ENTITY_PRINT, DEFAULT_QUESTIONNAIRE_OUTCOMES, DEFAULT_QUESTIONNAIRE_PRINT_SETTINGS, DEFAULT_QUESTION_COMMENT_CONFIG, DEFAULT_QUESTION_HINT_CONFIG, PRINT_PAGE_LETTERHEAD_BOTTOM_MARGIN_MM, PRINT_PAGE_LETTERHEAD_TOP_MARGIN_MM, PRINT_PAGE_SIDE_MARGIN_MM, QUESTIONNAIRE_ITEM_COL_SPANS, QUESTIONNAIRE_OUTCOMES_PAGE_COMPONENT_KEY, QUESTIONNAIRE_QUESTIONS_PAGE_COMPONENT_KEY, RootConfig, applyQuestionnairePrintHeader, buildQuestionnairePrintBodyHtml, buildQuestionnairePrintHeaderRegion, buildQuestionnaireQuestionCardHtml, buildQuestionnaireSessionBodyHtml, coerceQuestionnaireItemColSpan, commentConfigForEditForm, diffQuestionCommentOverride, diffQuestionHintOverride, escapePrintDocumentText, extractPrintDocumentBodyHtml, findDuplicateOutcomeNames, flattenQuestionnaireOutcomeItems, formatPrintAnswerText, getQuestionAnswerCommentStoragePath, getQuestionCommentVisibilityFlag, isQuestionnaireOutcomeDisplayColorHex, matchesQuestionnaireOutcomeDisplayRule, mergeMissingPersistedAnswers, mergeQuestionCommentConfig, mergeQuestionHintForViewer, minifyPrintHtml, normalizeCompletionMode, normalizePrintOrientation, normalizePrintPaperSize, normalizePrintWatermark, normalizeQuestionAppearance, normalizeQuestionCommentConfig, normalizeQuestionHintConfig, normalizeQuestionHintFromEntityRow, normalizeQuestionHintMode, normalizeQuestionLayout, normalizeQuestionnaireOutcomeDisplayRules, normalizeQuestionnaireOutcomesValue, normalizeValidationStrategy, normalizeViewMode, parseQuestionHintPartialFromRecord, parseQuestionnaireOutcomeDisplayColor, questionnaireItemLayoutOverride, readHintFieldsFromRecord, readQuestionnaireItemColSpan, resolvePrintContentWidthMm, resolvePrintLetterheadPdfMargin, resolvePrintPaging, resolvePrintPdfPageOptions, resolvePrintPlainText, resolvePrintSettings, storedAnswersHaveContent, toDisplaySettings, toPersistedAnswers, toPrePostConfig, toPrintSettings, toViewerAnswers, wrapPrintDocument };
961
+ export type { AXMAssessmentCaseStatus, AXMAssessmentManagementAssessmentCaseEntityModel, AXMAssessmentManagementAssessmentSessionEntityModel, AXMAssessmentManagementQuestionBankItemEntityModel, AXMAssessmentManagementQuestionnaireEntityModel, AXMAssessmentPrintMergeKey, AXMAssessmentQuestionCommentConfig, AXMAssessmentQuestionHintConfig, AXMAssessmentQuestionHintConfigOff, AXMAssessmentQuestionHintConfigShown, AXMAssessmentQuestionHintMode, AXMAssessmentQuestionHintPartial, AXMAssessmentQuestionHintVisualMode, AXMAssessmentSessionAnswer, AXMAssessmentSessionPreviewPdfRequest, AXMAssessmentSessionPreviewPdfResult, AXMAssessmentSessionRole, AXMAssessmentSessionStatus, AXMCreateFormTemplateDto, AXMFormTemplateDetailDto, AXMFormTemplateListItemDto, AXMFormTemplateType, AXMFormTemplateTypeOption, AXMQuestionBankItemInterfaceMetadata, AXMQuestionBankItemInterfaceValue, AXMUpdateFormTemplateDto, AssessmentOutcomeItem, AssessmentOutcomesValue, AssessmentPostContent, AssessmentPreContent, PostQuestionnaireConfig, PrePostConfig, PrePostContentValue, PreQuestionnaireConfig, QuestionnaireBuilderValue, QuestionnaireCompletionMode, QuestionnaireDisplaySettings, QuestionnaireEntityDisplaySettings, QuestionnaireEntityPrintSettings, QuestionnaireItemColSpan, QuestionnaireOutcomeDisplayColor, QuestionnaireOutcomeDisplayEmphasis, QuestionnaireOutcomeDisplayIcon, QuestionnaireOutcomeDisplayOperator, QuestionnaireOutcomeDisplayRule, QuestionnaireOutcomeItem, QuestionnaireOutcomeResultKind, QuestionnaireOutcomeSection, QuestionnaireOutcomesValue, QuestionnairePrintBodySection, QuestionnairePrintHeaderInput, QuestionnairePrintOrientation, QuestionnairePrintPaging, QuestionnairePrintPaperSize, QuestionnairePrintQuestionHtml, QuestionnairePrintSettings, QuestionnaireQuestionAppearance, QuestionnaireQuestionLayout };