@acorex-platform/module-assessment-management-client 2.0.0-next.20 → 2.0.0-next.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/{acorex-platform-module-assessment-management-client-acorex-platform-module-assessment-management-client-clUYFK16.mjs → acorex-platform-module-assessment-management-client-acorex-platform-module-assessment-management-client-5ECR73Eo.mjs} +326 -138
- package/fesm2022/acorex-platform-module-assessment-management-client-acorex-platform-module-assessment-management-client-5ECR73Eo.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-assessment-management-client-assessment-voice.commands-oKEAM8zA.mjs → acorex-platform-module-assessment-management-client-assessment-voice.commands-DGcCkudt.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-assessment-management-client-assessment-voice.commands-oKEAM8zA.mjs.map → acorex-platform-module-assessment-management-client-assessment-voice.commands-DGcCkudt.mjs.map} +1 -1
- package/fesm2022/acorex-platform-module-assessment-management-client-contracts-entities-question-bank-item.mjs +58 -7
- package/fesm2022/acorex-platform-module-assessment-management-client-contracts-entities-question-bank-item.mjs.map +1 -1
- package/fesm2022/acorex-platform-module-assessment-management-client-contracts-entities-questionnaire.mjs +137 -8
- package/fesm2022/acorex-platform-module-assessment-management-client-contracts-entities-questionnaire.mjs.map +1 -1
- package/fesm2022/{acorex-platform-module-assessment-management-client-contracts-entity-catalog-acorex-platform-module-assessment-management-client-contracts-entity-catalog-CgUoWW8B.mjs → acorex-platform-module-assessment-management-client-contracts-entity-catalog-acorex-platform-module-assessment-management-client-contracts-entity-catalog-3F4p6ljC.mjs} +6 -6
- package/fesm2022/{acorex-platform-module-assessment-management-client-contracts-entity-catalog-acorex-platform-module-assessment-management-client-contracts-entity-catalog-CgUoWW8B.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
- package/fesm2022/{acorex-platform-module-assessment-management-client-contracts-entity-catalog-assessment-case.entity-GDJX71dY.mjs → acorex-platform-module-assessment-management-client-contracts-entity-catalog-assessment-case.entity-CyWqUVBO.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-assessment-management-client-contracts-entity-catalog-assessment-case.entity-GDJX71dY.mjs.map → acorex-platform-module-assessment-management-client-contracts-entity-catalog-assessment-case.entity-CyWqUVBO.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-assessment-management-client-contracts-entity-catalog-assessment-session.entity-tP9SU7u8.mjs → acorex-platform-module-assessment-management-client-contracts-entity-catalog-assessment-session.entity-CnfnDCou.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-assessment-management-client-contracts-entity-catalog-assessment-session.entity-tP9SU7u8.mjs.map → acorex-platform-module-assessment-management-client-contracts-entity-catalog-assessment-session.entity-CnfnDCou.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-assessment-management-client-contracts-entity-catalog-question-bank-item.entity-BSXs6_z8.mjs → acorex-platform-module-assessment-management-client-contracts-entity-catalog-question-bank-item.entity-DTAhcFz1.mjs} +60 -9
- package/fesm2022/acorex-platform-module-assessment-management-client-contracts-entity-catalog-question-bank-item.entity-DTAhcFz1.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-assessment-management-client-contracts-entity-catalog-questionnaire.entity-a63MvFoX.mjs → acorex-platform-module-assessment-management-client-contracts-entity-catalog-questionnaire.entity-mSpjIACS.mjs} +139 -10
- package/fesm2022/acorex-platform-module-assessment-management-client-contracts-entity-catalog-questionnaire.entity-mSpjIACS.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-assessment-management-client-contracts-entity-catalog-template.entity-DWRFJCah.mjs → acorex-platform-module-assessment-management-client-contracts-entity-catalog-template.entity-DqChTI6T.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-assessment-management-client-contracts-entity-catalog-template.entity-DWRFJCah.mjs.map → acorex-platform-module-assessment-management-client-contracts-entity-catalog-template.entity-DqChTI6T.mjs.map} +1 -1
- package/fesm2022/acorex-platform-module-assessment-management-client-contracts-entity-catalog.mjs +1 -1
- package/fesm2022/acorex-platform-module-assessment-management-client-contracts.mjs +44 -1
- package/fesm2022/acorex-platform-module-assessment-management-client-contracts.mjs.map +1 -1
- package/fesm2022/{acorex-platform-module-assessment-management-client-fill-assessment-session.command-DRi6bK2i.mjs → acorex-platform-module-assessment-management-client-fill-assessment-session.command-DPoL2WXF.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-assessment-management-client-fill-assessment-session.command-DRi6bK2i.mjs.map → acorex-platform-module-assessment-management-client-fill-assessment-session.command-DPoL2WXF.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-assessment-management-client-form-template-viewer-popup.component-ByHoX67r.mjs → acorex-platform-module-assessment-management-client-form-template-viewer-popup.component-DzLMXy9Y.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-assessment-management-client-form-template-viewer-popup.component-ByHoX67r.mjs.map → acorex-platform-module-assessment-management-client-form-template-viewer-popup.component-DzLMXy9Y.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-assessment-management-client-form-template-viewer.service-BXa0_2G9.mjs → acorex-platform-module-assessment-management-client-form-template-viewer.service-0Fhk3cd6.mjs} +3 -3
- package/fesm2022/{acorex-platform-module-assessment-management-client-form-template-viewer.service-BXa0_2G9.mjs.map → acorex-platform-module-assessment-management-client-form-template-viewer.service-0Fhk3cd6.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-assessment-management-client-index-BMB2Htf1.mjs → acorex-platform-module-assessment-management-client-index-xC4NiE8P.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-assessment-management-client-index-BMB2Htf1.mjs.map → acorex-platform-module-assessment-management-client-index-xC4NiE8P.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-assessment-management-client-open-form-template.command-Cd2K2-GM.mjs → acorex-platform-module-assessment-management-client-open-form-template.command-xaDs3wr5.mjs} +3 -3
- package/fesm2022/{acorex-platform-module-assessment-management-client-open-form-template.command-Cd2K2-GM.mjs.map → acorex-platform-module-assessment-management-client-open-form-template.command-xaDs3wr5.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-assessment-management-client-preview-form-template.command-BJk6_haJ.mjs → acorex-platform-module-assessment-management-client-preview-form-template.command-CO_Z0X5u.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-assessment-management-client-preview-form-template.command-BJk6_haJ.mjs.map → acorex-platform-module-assessment-management-client-preview-form-template.command-CO_Z0X5u.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-assessment-management-client-preview-question.command-DWH4Nvo-.mjs → acorex-platform-module-assessment-management-client-preview-question.command-aNpcP2j-.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-assessment-management-client-preview-question.command-DWH4Nvo-.mjs.map → acorex-platform-module-assessment-management-client-preview-question.command-aNpcP2j-.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-assessment-management-client-preview-questionnaire.command-ZblqNQzw.mjs → acorex-platform-module-assessment-management-client-preview-questionnaire.command-CqAlLD06.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-assessment-management-client-preview-questionnaire.command-ZblqNQzw.mjs.map → acorex-platform-module-assessment-management-client-preview-questionnaire.command-CqAlLD06.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-assessment-management-client-question-bank-interface-editor-widget-edit.component-3eHfj_1n.mjs → acorex-platform-module-assessment-management-client-question-bank-interface-editor-widget-edit.component-j_TDGlON.mjs} +3 -3
- package/fesm2022/{acorex-platform-module-assessment-management-client-question-bank-interface-editor-widget-edit.component-3eHfj_1n.mjs.map → acorex-platform-module-assessment-management-client-question-bank-interface-editor-widget-edit.component-j_TDGlON.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-assessment-management-client-questionnaire-questions-editor-edit.component-CctbSOfG.mjs → acorex-platform-module-assessment-management-client-questionnaire-questions-editor-edit.component-LKydg7hM.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-assessment-management-client-questionnaire-questions-editor-edit.component-CctbSOfG.mjs.map → acorex-platform-module-assessment-management-client-questionnaire-questions-editor-edit.component-LKydg7hM.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-assessment-management-client-questionnaire-viewer-edit.component-DD431Nru.mjs → acorex-platform-module-assessment-management-client-questionnaire-viewer-edit.component-BKBBMXN9.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-assessment-management-client-questionnaire-viewer-edit.component-DD431Nru.mjs.map → acorex-platform-module-assessment-management-client-questionnaire-viewer-edit.component-BKBBMXN9.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-assessment-management-client-questionnaire-viewer-popup.component-CjMCIExs.mjs → acorex-platform-module-assessment-management-client-questionnaire-viewer-popup.component-BLUdC219.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-assessment-management-client-questionnaire-viewer-popup.component-CjMCIExs.mjs.map → acorex-platform-module-assessment-management-client-questionnaire-viewer-popup.component-BLUdC219.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-assessment-management-client-related-content-viewer-page-component.provider-CebpEyUN.mjs → acorex-platform-module-assessment-management-client-related-content-viewer-page-component.provider-CbmBo7Ve.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-assessment-management-client-related-content-viewer-page-component.provider-CebpEyUN.mjs.map → acorex-platform-module-assessment-management-client-related-content-viewer-page-component.provider-CbmBo7Ve.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-assessment-management-client-review-assessment-session.command-CGaUOa7I.mjs → acorex-platform-module-assessment-management-client-review-assessment-session.command-D2MyU3wd.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-assessment-management-client-review-assessment-session.command-CGaUOa7I.mjs.map → acorex-platform-module-assessment-management-client-review-assessment-session.command-D2MyU3wd.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-assessment-management-client-show-form-template-viewer-popup.command-B58iMbgj.mjs → acorex-platform-module-assessment-management-client-show-form-template-viewer-popup.command-CJ2EIOfz.mjs} +3 -3
- package/fesm2022/{acorex-platform-module-assessment-management-client-show-form-template-viewer-popup.command-B58iMbgj.mjs.map → acorex-platform-module-assessment-management-client-show-form-template-viewer-popup.command-CJ2EIOfz.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-assessment-management-client-show-questionnaire-questions-popup.command-PG2CAV-I.mjs → acorex-platform-module-assessment-management-client-show-questionnaire-questions-popup.command-BVzSq-rX.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-assessment-management-client-show-questionnaire-questions-popup.command-PG2CAV-I.mjs.map → acorex-platform-module-assessment-management-client-show-questionnaire-questions-popup.command-BVzSq-rX.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-assessment-management-client-show-questionnaire-viewer-popup.command--e1ACDbF.mjs → acorex-platform-module-assessment-management-client-show-questionnaire-viewer-popup.command-CEjI6ebC.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-assessment-management-client-show-questionnaire-viewer-popup.command--e1ACDbF.mjs.map → acorex-platform-module-assessment-management-client-show-questionnaire-viewer-popup.command-CEjI6ebC.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-assessment-management-client-template-widget-edit.component-D7zOnGwK.mjs → acorex-platform-module-assessment-management-client-template-widget-edit.component-BSg5lWIS.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-assessment-management-client-template-widget-edit.component-D7zOnGwK.mjs.map → acorex-platform-module-assessment-management-client-template-widget-edit.component-BSg5lWIS.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-assessment-management-client-test-sheet-cell-type-widget-edit.component-CzT6Iw5l.mjs → acorex-platform-module-assessment-management-client-test-sheet-cell-type-widget-edit.component-BKdMZDZd.mjs} +3 -3
- package/fesm2022/{acorex-platform-module-assessment-management-client-test-sheet-cell-type-widget-edit.component-CzT6Iw5l.mjs.map → acorex-platform-module-assessment-management-client-test-sheet-cell-type-widget-edit.component-BKdMZDZd.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-assessment-management-client-test-sheet-grid.component-BqKikmM8.mjs → acorex-platform-module-assessment-management-client-test-sheet-grid.component-BaBbL32O.mjs} +3 -3
- package/fesm2022/{acorex-platform-module-assessment-management-client-test-sheet-grid.component-BqKikmM8.mjs.map → acorex-platform-module-assessment-management-client-test-sheet-grid.component-BaBbL32O.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-assessment-management-client-test-sheet-schema-widget-edit.component-10mrzzqk.mjs → acorex-platform-module-assessment-management-client-test-sheet-schema-widget-edit.component-C9B-HU4h.mjs} +3 -3
- package/fesm2022/{acorex-platform-module-assessment-management-client-test-sheet-schema-widget-edit.component-10mrzzqk.mjs.map → acorex-platform-module-assessment-management-client-test-sheet-schema-widget-edit.component-C9B-HU4h.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-assessment-management-client-test-sheet-widget-edit.component--4ywmLk9.mjs → acorex-platform-module-assessment-management-client-test-sheet-widget-edit.component-DwB4tgSZ.mjs} +3 -3
- package/fesm2022/{acorex-platform-module-assessment-management-client-test-sheet-widget-edit.component--4ywmLk9.mjs.map → acorex-platform-module-assessment-management-client-test-sheet-widget-edit.component-DwB4tgSZ.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-assessment-management-client-test-sheet-widget-view.component-j-ClIxCR.mjs → acorex-platform-module-assessment-management-client-test-sheet-widget-view.component-CbbpEr9W.mjs} +3 -3
- package/fesm2022/{acorex-platform-module-assessment-management-client-test-sheet-widget-view.component-j-ClIxCR.mjs.map → acorex-platform-module-assessment-management-client-test-sheet-widget-view.component-CbbpEr9W.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-assessment-management-client-test-sheet.util-DuWQlwcz.mjs → acorex-platform-module-assessment-management-client-test-sheet.util-DP8KRA3M.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-assessment-management-client-test-sheet.util-DuWQlwcz.mjs.map → acorex-platform-module-assessment-management-client-test-sheet.util-DP8KRA3M.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-assessment-management-client-view-session-answers.command-EAfaZgB8.mjs → acorex-platform-module-assessment-management-client-view-session-answers.command-BCmla5AS.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-assessment-management-client-view-session-answers.command-EAfaZgB8.mjs.map → acorex-platform-module-assessment-management-client-view-session-answers.command-BCmla5AS.mjs.map} +1 -1
- package/fesm2022/acorex-platform-module-assessment-management-client.mjs +1 -1
- package/i18n/en-AU/assessment-management.json +20 -1
- package/i18n/en-US/assessment-management.json +20 -1
- package/i18n/fa-IR/assessment-management.json +20 -1
- package/package.json +3 -3
- package/types/acorex-platform-module-assessment-management-client-contracts.d.ts +31 -3
- package/types/acorex-platform-module-assessment-management-client.d.ts +8 -0
- package/fesm2022/acorex-platform-module-assessment-management-client-acorex-platform-module-assessment-management-client-clUYFK16.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-assessment-management-client-contracts-entity-catalog-question-bank-item.entity-BSXs6_z8.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-assessment-management-client-contracts-entity-catalog-questionnaire.entity-a63MvFoX.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-platform-module-assessment-management-client-test-sheet.util-DuWQlwcz.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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"}
|
|
1
|
+
{"version":3,"file":"acorex-platform-module-assessment-management-client-test-sheet.util-DP8KRA3M.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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"}
|
|
@@ -3,7 +3,7 @@ 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
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-
|
|
6
|
+
import { h as AXMQuestionnaireViewerService } from './acorex-platform-module-assessment-management-client-acorex-platform-module-assessment-management-client-5ECR73Eo.mjs';
|
|
7
7
|
import { toPersistedAnswers, RootConfig } from '@acorex-platform/module-assessment-management-client/contracts';
|
|
8
8
|
import { o as openAssessmentSessionAnswersView } from './acorex-platform-module-assessment-management-client-assessment-session-answers-view.util-D5gUv0HJ.mjs';
|
|
9
9
|
|
|
@@ -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-
|
|
280
|
+
//# sourceMappingURL=acorex-platform-module-assessment-management-client-view-session-answers.command-BCmla5AS.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-platform-module-assessment-management-client-view-session-answers.command-EAfaZgB8.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
|
+
{"version":3,"file":"acorex-platform-module-assessment-management-client-view-session-answers.command-BCmla5AS.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-
|
|
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-5ECR73Eo.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": "
|
|
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
|
},
|
|
@@ -157,7 +157,7 @@
|
|
|
157
157
|
},
|
|
158
158
|
"print-template-id": {
|
|
159
159
|
"title": "Print Template",
|
|
160
|
-
"description": "
|
|
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
|
},
|
|
@@ -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
|
},
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@acorex-platform/module-assessment-management-client",
|
|
3
|
-
"version": "2.0.0-next.
|
|
3
|
+
"version": "2.0.0-next.21",
|
|
4
4
|
"sideEffects": false,
|
|
5
5
|
"peerDependencies": {
|
|
6
|
-
"@acorex-platform/extension-ai-voice-shell-client": "2.0.0-next.
|
|
7
|
-
"@acorex-platform/module-content-management-client": "2.0.0-next.
|
|
6
|
+
"@acorex-platform/extension-ai-voice-shell-client": "2.0.0-next.21",
|
|
7
|
+
"@acorex-platform/module-content-management-client": "2.0.0-next.21",
|
|
8
8
|
"@angular/common": "^21.0.0 || ^22.0.0",
|
|
9
9
|
"@angular/core": "^21.0.0 || ^22.0.0"
|
|
10
10
|
},
|
|
@@ -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)
|
|
@@ -794,7 +810,7 @@ type AssessmentPostContent = PostQuestionnaireConfig;
|
|
|
794
810
|
/**
|
|
795
811
|
* Entity-level display options (viewer / builder preview). Subset of {@link QuestionnaireDisplaySettings}.
|
|
796
812
|
*/
|
|
797
|
-
type QuestionnaireEntityDisplaySettings = Pick<QuestionnaireDisplaySettings, 'viewMode' | 'showProgressBar' | 'showTimer' | 'showQuestionNumbers' | 'validationStrategy' | 'completionMode'>;
|
|
813
|
+
type QuestionnaireEntityDisplaySettings = Pick<QuestionnaireDisplaySettings, 'viewMode' | 'showProgressBar' | 'showTimer' | 'showQuestionNumbers' | 'validationStrategy' | 'completionMode' | 'questionLayout' | 'questionAppearance'>;
|
|
798
814
|
declare const DEFAULT_QUESTIONNAIRE_ENTITY_DISPLAY: QuestionnaireEntityDisplaySettings;
|
|
799
815
|
/** Entity-level print document defaults. */
|
|
800
816
|
type QuestionnaireEntityPrintSettings = QuestionnairePrintSettings;
|
|
@@ -843,6 +859,10 @@ declare const VALIDATION_STRATEGY_VALUES: readonly ["step", "end"];
|
|
|
843
859
|
type ValidationStrategyValue = (typeof VALIDATION_STRATEGY_VALUES)[number];
|
|
844
860
|
declare const COMPLETION_MODE_VALUES: readonly ["submit-only", "save-and-continue"];
|
|
845
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];
|
|
846
866
|
/**
|
|
847
867
|
* Coerces stored view mode (string or SelectBox `{ id }`) to a known value.
|
|
848
868
|
*/
|
|
@@ -855,6 +875,14 @@ declare function normalizeValidationStrategy(value: unknown): ValidationStrategy
|
|
|
855
875
|
* Coerces stored completion mode (string or SelectBox `{ id }`) to a known value.
|
|
856
876
|
*/
|
|
857
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;
|
|
858
886
|
/**
|
|
859
887
|
* Maps entity `display` to {@link QuestionnaireDisplaySettings} (defaults when omitted).
|
|
860
888
|
*/
|
|
@@ -929,5 +957,5 @@ interface AXMFormTemplateListItemDto extends AXPEntityListItemDto<string> {
|
|
|
929
957
|
}[];
|
|
930
958
|
}
|
|
931
959
|
|
|
932
|
-
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, normalizeQuestionCommentConfig, normalizeQuestionHintConfig, normalizeQuestionHintFromEntityRow, normalizeQuestionHintMode, normalizeQuestionnaireOutcomeDisplayRules, normalizeQuestionnaireOutcomesValue, normalizeValidationStrategy, normalizeViewMode, parseQuestionHintPartialFromRecord, parseQuestionnaireOutcomeDisplayColor, questionnaireItemLayoutOverride, readHintFieldsFromRecord, readQuestionnaireItemColSpan, resolvePrintContentWidthMm, resolvePrintLetterheadPdfMargin, resolvePrintPaging, resolvePrintPdfPageOptions, resolvePrintPlainText, resolvePrintSettings, storedAnswersHaveContent, toDisplaySettings, toPersistedAnswers, toPrePostConfig, toPrintSettings, toViewerAnswers, wrapPrintDocument };
|
|
933
|
-
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 };
|
|
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 };
|
|
@@ -288,6 +288,7 @@ declare class AXMQuestionnaireViewerComponent {
|
|
|
288
288
|
sectionVisibilityById: _angular_core.Signal<Record<string, boolean>>;
|
|
289
289
|
questionVisibilityById: _angular_core.Signal<Record<string, boolean>>;
|
|
290
290
|
commentVisibilityById: _angular_core.Signal<Record<string, boolean>>;
|
|
291
|
+
questionRequiredById: _angular_core.Signal<Record<string, boolean>>;
|
|
291
292
|
viewMode: _angular_core.Signal<QuestionnaireViewMode>;
|
|
292
293
|
isReadonly: _angular_core.Signal<boolean>;
|
|
293
294
|
printLayout: _angular_core.Signal<boolean>;
|
|
@@ -384,6 +385,7 @@ declare class AXMQuestionnaireViewerComponent {
|
|
|
384
385
|
sectionVisibilityById: Record<string, boolean>;
|
|
385
386
|
questionVisibilityById: Record<string, boolean>;
|
|
386
387
|
commentVisibilityById: Record<string, boolean>;
|
|
388
|
+
questionRequiredById: Record<string, boolean>;
|
|
387
389
|
}>;
|
|
388
390
|
private readonly translationService;
|
|
389
391
|
/**
|
|
@@ -446,6 +448,7 @@ declare class AXMQuestionnaireViewerComponent {
|
|
|
446
448
|
sectionVisibilityById: _angular_core.Signal<Record<string, boolean>>;
|
|
447
449
|
questionVisibilityById: _angular_core.Signal<Record<string, boolean>>;
|
|
448
450
|
commentVisibilityById: _angular_core.Signal<Record<string, boolean>>;
|
|
451
|
+
questionRequiredById: _angular_core.Signal<Record<string, boolean>>;
|
|
449
452
|
viewMode: _angular_core.Signal<QuestionnaireViewMode>;
|
|
450
453
|
isReadonly: _angular_core.Signal<boolean>;
|
|
451
454
|
printLayout: _angular_core.Signal<boolean>;
|
|
@@ -542,6 +545,7 @@ declare class AXMQuestionnaireViewerComponent {
|
|
|
542
545
|
sectionVisibilityById: Record<string, boolean>;
|
|
543
546
|
questionVisibilityById: Record<string, boolean>;
|
|
544
547
|
commentVisibilityById: Record<string, boolean>;
|
|
548
|
+
questionRequiredById: Record<string, boolean>;
|
|
545
549
|
}>;
|
|
546
550
|
/**
|
|
547
551
|
* Check if can navigate previous
|
|
@@ -986,6 +990,7 @@ declare class AXMQuestionnaireViewerPageComponent extends AXPPageLayoutBaseCompo
|
|
|
986
990
|
sectionVisibilityById: _angular_core.Signal<Record<string, boolean>>;
|
|
987
991
|
questionVisibilityById: _angular_core.Signal<Record<string, boolean>>;
|
|
988
992
|
commentVisibilityById: _angular_core.Signal<Record<string, boolean>>;
|
|
993
|
+
questionRequiredById: _angular_core.Signal<Record<string, boolean>>;
|
|
989
994
|
viewMode: _angular_core.Signal<QuestionnaireViewMode>;
|
|
990
995
|
isReadonly: _angular_core.Signal<boolean>;
|
|
991
996
|
printLayout: _angular_core.Signal<boolean>;
|
|
@@ -1082,6 +1087,7 @@ declare class AXMQuestionnaireViewerPageComponent extends AXPPageLayoutBaseCompo
|
|
|
1082
1087
|
sectionVisibilityById: Record<string, boolean>;
|
|
1083
1088
|
questionVisibilityById: Record<string, boolean>;
|
|
1084
1089
|
commentVisibilityById: Record<string, boolean>;
|
|
1090
|
+
questionRequiredById: Record<string, boolean>;
|
|
1085
1091
|
}>) | undefined>;
|
|
1086
1092
|
protected readonly totalQuestionsCount: _angular_core.Signal<number>;
|
|
1087
1093
|
protected readonly totalSectionsCount: _angular_core.Signal<number>;
|
|
@@ -1166,6 +1172,7 @@ declare class AXMQuestionnaireViewerStandalonePageComponent implements OnInit {
|
|
|
1166
1172
|
sectionVisibilityById: _angular_core.Signal<Record<string, boolean>>;
|
|
1167
1173
|
questionVisibilityById: _angular_core.Signal<Record<string, boolean>>;
|
|
1168
1174
|
commentVisibilityById: _angular_core.Signal<Record<string, boolean>>;
|
|
1175
|
+
questionRequiredById: _angular_core.Signal<Record<string, boolean>>;
|
|
1169
1176
|
viewMode: _angular_core.Signal<QuestionnaireViewMode>;
|
|
1170
1177
|
isReadonly: _angular_core.Signal<boolean>;
|
|
1171
1178
|
printLayout: _angular_core.Signal<boolean>;
|
|
@@ -1262,6 +1269,7 @@ declare class AXMQuestionnaireViewerStandalonePageComponent implements OnInit {
|
|
|
1262
1269
|
sectionVisibilityById: Record<string, boolean>;
|
|
1263
1270
|
questionVisibilityById: Record<string, boolean>;
|
|
1264
1271
|
commentVisibilityById: Record<string, boolean>;
|
|
1272
|
+
questionRequiredById: Record<string, boolean>;
|
|
1265
1273
|
}>) | undefined>;
|
|
1266
1274
|
protected readonly totalQuestionsCount: _angular_core.Signal<number>;
|
|
1267
1275
|
protected readonly showTimer: _angular_core.Signal<boolean>;
|