@acorex-platform/module-assessment-management-client 2.0.0-next.0 → 2.0.0-next.2
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-kwOuHx62.mjs → acorex-platform-module-assessment-management-client-acorex-platform-module-assessment-management-client-Dr56BtSo.mjs} +73 -67
- package/fesm2022/acorex-platform-module-assessment-management-client-acorex-platform-module-assessment-management-client-Dr56BtSo.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-assessment-management-client-assessment-voice.commands-CtcvGNf-.mjs → acorex-platform-module-assessment-management-client-assessment-voice.commands-Zv4Q1ASd.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-assessment-management-client-assessment-voice.commands-CtcvGNf-.mjs.map → acorex-platform-module-assessment-management-client-assessment-voice.commands-Zv4Q1ASd.mjs.map} +1 -1
- package/fesm2022/acorex-platform-module-assessment-management-client-contracts-entities-assessment-case.mjs +10 -0
- package/fesm2022/acorex-platform-module-assessment-management-client-contracts-entities-assessment-case.mjs.map +1 -1
- package/fesm2022/acorex-platform-module-assessment-management-client-contracts-entities-questionnaire.mjs +12 -2
- 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-DDCy1T4t.mjs → acorex-platform-module-assessment-management-client-contracts-entity-catalog-acorex-platform-module-assessment-management-client-contracts-entity-catalog-Buqp2FnP.mjs} +6 -6
- package/fesm2022/{acorex-platform-module-assessment-management-client-contracts-entity-catalog-acorex-platform-module-assessment-management-client-contracts-entity-catalog-DDCy1T4t.mjs.map → acorex-platform-module-assessment-management-client-contracts-entity-catalog-acorex-platform-module-assessment-management-client-contracts-entity-catalog-Buqp2FnP.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-assessment-management-client-contracts-entity-catalog-assessment-case.entity-DXJp2k3o.mjs → acorex-platform-module-assessment-management-client-contracts-entity-catalog-assessment-case.entity-IAO_eHLl.mjs} +6 -2
- package/fesm2022/acorex-platform-module-assessment-management-client-contracts-entity-catalog-assessment-case.entity-IAO_eHLl.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-assessment-management-client-contracts-entity-catalog-assessment-session.entity-Q7-5toSQ.mjs → acorex-platform-module-assessment-management-client-contracts-entity-catalog-assessment-session.entity-BVVzsiLh.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-assessment-management-client-contracts-entity-catalog-assessment-session.entity-Q7-5toSQ.mjs.map → acorex-platform-module-assessment-management-client-contracts-entity-catalog-assessment-session.entity-BVVzsiLh.mjs.map} +1 -1
- package/fesm2022/acorex-platform-module-assessment-management-client-contracts-entity-catalog-features.keys-BVOMWggD.mjs +9 -0
- package/fesm2022/acorex-platform-module-assessment-management-client-contracts-entity-catalog-features.keys-BVOMWggD.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-assessment-management-client-contracts-entity-catalog-question-bank-item.entity-CPEpSSlP.mjs → acorex-platform-module-assessment-management-client-contracts-entity-catalog-question-bank-item.entity-WON7pvW1.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-assessment-management-client-contracts-entity-catalog-question-bank-item.entity-CPEpSSlP.mjs.map → acorex-platform-module-assessment-management-client-contracts-entity-catalog-question-bank-item.entity-WON7pvW1.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-assessment-management-client-contracts-entity-catalog-questionnaire.entity-DOG7yHv-.mjs → acorex-platform-module-assessment-management-client-contracts-entity-catalog-questionnaire.entity-BZ5FdPuP.mjs} +8 -4
- package/fesm2022/acorex-platform-module-assessment-management-client-contracts-entity-catalog-questionnaire.entity-BZ5FdPuP.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-assessment-management-client-contracts-entity-catalog-template.entity-BeYGYRb7.mjs → acorex-platform-module-assessment-management-client-contracts-entity-catalog-template.entity-L_p7_kL1.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-assessment-management-client-contracts-entity-catalog-template.entity-BeYGYRb7.mjs.map → acorex-platform-module-assessment-management-client-contracts-entity-catalog-template.entity-L_p7_kL1.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 +2 -0
- 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-CimjqylS.mjs → acorex-platform-module-assessment-management-client-fill-assessment-session.command-B88LFQGF.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-assessment-management-client-fill-assessment-session.command-CimjqylS.mjs.map → acorex-platform-module-assessment-management-client-fill-assessment-session.command-B88LFQGF.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-assessment-management-client-form-template-viewer-popup.component-CotFW7s2.mjs → acorex-platform-module-assessment-management-client-form-template-viewer-popup.component-BnSOK29v.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-assessment-management-client-form-template-viewer-popup.component-CotFW7s2.mjs.map → acorex-platform-module-assessment-management-client-form-template-viewer-popup.component-BnSOK29v.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-assessment-management-client-form-template-viewer.service-D8fZ47sd.mjs → acorex-platform-module-assessment-management-client-form-template-viewer.service-FsoP5GoC.mjs} +3 -3
- package/fesm2022/{acorex-platform-module-assessment-management-client-form-template-viewer.service-D8fZ47sd.mjs.map → acorex-platform-module-assessment-management-client-form-template-viewer.service-FsoP5GoC.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-assessment-management-client-index-Bl0lyOlF.mjs → acorex-platform-module-assessment-management-client-index-CY7Rj5LR.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-assessment-management-client-index-Bl0lyOlF.mjs.map → acorex-platform-module-assessment-management-client-index-CY7Rj5LR.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-assessment-management-client-open-form-template.command-C3tCVcd7.mjs → acorex-platform-module-assessment-management-client-open-form-template.command-A-TnX3P_.mjs} +3 -3
- package/fesm2022/{acorex-platform-module-assessment-management-client-open-form-template.command-C3tCVcd7.mjs.map → acorex-platform-module-assessment-management-client-open-form-template.command-A-TnX3P_.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-assessment-management-client-preview-form-template.command-CsRk-3Q9.mjs → acorex-platform-module-assessment-management-client-preview-form-template.command-C2oXajyi.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-assessment-management-client-preview-form-template.command-CsRk-3Q9.mjs.map → acorex-platform-module-assessment-management-client-preview-form-template.command-C2oXajyi.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-assessment-management-client-preview-question.command-BgY1J9Xh.mjs → acorex-platform-module-assessment-management-client-preview-question.command-CMInpf_N.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-assessment-management-client-preview-question.command-BgY1J9Xh.mjs.map → acorex-platform-module-assessment-management-client-preview-question.command-CMInpf_N.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-assessment-management-client-preview-questionnaire.command-WD8wW-bw.mjs → acorex-platform-module-assessment-management-client-preview-questionnaire.command-BCl7mxLu.mjs} +3 -2
- package/fesm2022/acorex-platform-module-assessment-management-client-preview-questionnaire.command-BCl7mxLu.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-assessment-management-client-question-bank-interface-editor-widget-edit.component-DY8Fk3fM.mjs → acorex-platform-module-assessment-management-client-question-bank-interface-editor-widget-edit.component-SUpzNllw.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-assessment-management-client-question-bank-interface-editor-widget-edit.component-DY8Fk3fM.mjs.map → acorex-platform-module-assessment-management-client-question-bank-interface-editor-widget-edit.component-SUpzNllw.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-assessment-management-client-questionnaire-questions-editor-edit.component-H2USWjbM.mjs → acorex-platform-module-assessment-management-client-questionnaire-questions-editor-edit.component-DNNHMsa1.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-assessment-management-client-questionnaire-questions-editor-edit.component-H2USWjbM.mjs.map → acorex-platform-module-assessment-management-client-questionnaire-questions-editor-edit.component-DNNHMsa1.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-assessment-management-client-questionnaire-viewer-edit.component-DQzu4IOs.mjs → acorex-platform-module-assessment-management-client-questionnaire-viewer-edit.component-CFsLdcCd.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-assessment-management-client-questionnaire-viewer-edit.component-DQzu4IOs.mjs.map → acorex-platform-module-assessment-management-client-questionnaire-viewer-edit.component-CFsLdcCd.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-assessment-management-client-questionnaire-viewer-popup.component-DkwPx-gd.mjs → acorex-platform-module-assessment-management-client-questionnaire-viewer-popup.component-_VaiHN2w.mjs} +8 -5
- package/fesm2022/acorex-platform-module-assessment-management-client-questionnaire-viewer-popup.component-_VaiHN2w.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-assessment-management-client-related-content-viewer-page-component.provider-CC-BCqXP.mjs → acorex-platform-module-assessment-management-client-related-content-viewer-page-component.provider-tSXHNIPe.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-assessment-management-client-related-content-viewer-page-component.provider-CC-BCqXP.mjs.map → acorex-platform-module-assessment-management-client-related-content-viewer-page-component.provider-tSXHNIPe.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-assessment-management-client-review-assessment-session.command-CiP6lJ7H.mjs → acorex-platform-module-assessment-management-client-review-assessment-session.command-ei5Yuxft.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-assessment-management-client-review-assessment-session.command-CiP6lJ7H.mjs.map → acorex-platform-module-assessment-management-client-review-assessment-session.command-ei5Yuxft.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-assessment-management-client-show-form-template-viewer-popup.command-B6VYZDv5.mjs → acorex-platform-module-assessment-management-client-show-form-template-viewer-popup.command-CC_MiEhE.mjs} +3 -3
- package/fesm2022/{acorex-platform-module-assessment-management-client-show-form-template-viewer-popup.command-B6VYZDv5.mjs.map → acorex-platform-module-assessment-management-client-show-form-template-viewer-popup.command-CC_MiEhE.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-assessment-management-client-show-questionnaire-questions-popup.command-DdRW1b8S.mjs → acorex-platform-module-assessment-management-client-show-questionnaire-questions-popup.command-6yO3hkNQ.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-assessment-management-client-show-questionnaire-questions-popup.command-DdRW1b8S.mjs.map → acorex-platform-module-assessment-management-client-show-questionnaire-questions-popup.command-6yO3hkNQ.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-assessment-management-client-show-questionnaire-viewer-popup.command-CM78H7mA.mjs → acorex-platform-module-assessment-management-client-show-questionnaire-viewer-popup.command-BgiXwWzD.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-assessment-management-client-show-questionnaire-viewer-popup.command-CM78H7mA.mjs.map → acorex-platform-module-assessment-management-client-show-questionnaire-viewer-popup.command-BgiXwWzD.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-assessment-management-client-template-widget-edit.component-wKfBtWT5.mjs → acorex-platform-module-assessment-management-client-template-widget-edit.component-Bw4pp8op.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-assessment-management-client-template-widget-edit.component-wKfBtWT5.mjs.map → acorex-platform-module-assessment-management-client-template-widget-edit.component-Bw4pp8op.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-assessment-management-client-test-sheet-cell-type-widget-edit.component-CzIEAF5x.mjs → acorex-platform-module-assessment-management-client-test-sheet-cell-type-widget-edit.component-DIug50SN.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-assessment-management-client-test-sheet-cell-type-widget-edit.component-CzIEAF5x.mjs.map → acorex-platform-module-assessment-management-client-test-sheet-cell-type-widget-edit.component-DIug50SN.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-assessment-management-client-test-sheet-grid.component-Bnk3D-XP.mjs → acorex-platform-module-assessment-management-client-test-sheet-grid.component-BgFhyqrK.mjs} +3 -3
- package/fesm2022/{acorex-platform-module-assessment-management-client-test-sheet-grid.component-Bnk3D-XP.mjs.map → acorex-platform-module-assessment-management-client-test-sheet-grid.component-BgFhyqrK.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-assessment-management-client-test-sheet-schema-widget-edit.component-CcW25ca0.mjs → acorex-platform-module-assessment-management-client-test-sheet-schema-widget-edit.component-D320BoBB.mjs} +3 -3
- package/fesm2022/{acorex-platform-module-assessment-management-client-test-sheet-schema-widget-edit.component-CcW25ca0.mjs.map → acorex-platform-module-assessment-management-client-test-sheet-schema-widget-edit.component-D320BoBB.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-assessment-management-client-test-sheet-widget-edit.component-aNeP4b0V.mjs → acorex-platform-module-assessment-management-client-test-sheet-widget-edit.component-DCuQsJUO.mjs} +3 -3
- package/fesm2022/{acorex-platform-module-assessment-management-client-test-sheet-widget-edit.component-aNeP4b0V.mjs.map → acorex-platform-module-assessment-management-client-test-sheet-widget-edit.component-DCuQsJUO.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-assessment-management-client-test-sheet-widget-view.component-zCAaOqjf.mjs → acorex-platform-module-assessment-management-client-test-sheet-widget-view.component-DT0jt6Cd.mjs} +3 -3
- package/fesm2022/{acorex-platform-module-assessment-management-client-test-sheet-widget-view.component-zCAaOqjf.mjs.map → acorex-platform-module-assessment-management-client-test-sheet-widget-view.component-DT0jt6Cd.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-assessment-management-client-test-sheet.util-ycKdHd3Z.mjs → acorex-platform-module-assessment-management-client-test-sheet.util-CxWsnTvd.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-assessment-management-client-test-sheet.util-ycKdHd3Z.mjs.map → acorex-platform-module-assessment-management-client-test-sheet.util-CxWsnTvd.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-assessment-management-client-view-session-answers.command-Bi-Dwlld.mjs → acorex-platform-module-assessment-management-client-view-session-answers.command-rsDFSIgz.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-assessment-management-client-view-session-answers.command-Bi-Dwlld.mjs.map → acorex-platform-module-assessment-management-client-view-session-answers.command-rsDFSIgz.mjs.map} +1 -1
- package/fesm2022/acorex-platform-module-assessment-management-client.mjs +1 -1
- package/i18n/en-AU/assessment-management.json +5 -1
- package/i18n/en-US/assessment-management.json +5 -1
- package/i18n/fa-IR/assessment-management.json +4 -0
- package/package.json +4 -4
- package/types/acorex-platform-module-assessment-management-client-contracts.d.ts +2 -0
- package/types/acorex-platform-module-assessment-management-client.d.ts +4 -0
- package/fesm2022/acorex-platform-module-assessment-management-client-acorex-platform-module-assessment-management-client-kwOuHx62.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-assessment-management-client-contracts-entity-catalog-assessment-case.entity-DXJp2k3o.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-assessment-management-client-contracts-entity-catalog-questionnaire.entity-DOG7yHv-.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-assessment-management-client-preview-questionnaire.command-WD8wW-bw.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-assessment-management-client-questionnaire-viewer-popup.component-DkwPx-gd.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-platform-module-assessment-management-client-test-sheet-widget-edit.component-
|
|
1
|
+
{"version":3,"file":"acorex-platform-module-assessment-management-client-test-sheet-widget-edit.component-DCuQsJUO.mjs","sources":["../../../../libs/modules/assessment-management/client/src/lib/features/questionnaire-builder/questions/widgets/test-sheet/test-sheet-widget-edit.component.ts","../../../../libs/modules/assessment-management/client/src/lib/features/questionnaire-builder/questions/widgets/test-sheet/test-sheet-widget-edit.component.html"],"sourcesContent":["//#region ----- Imports -----\n\nimport { AXPValueWidgetComponent } from '@acorex-platform/framework-client/layout/widget-core';\nimport { ChangeDetectionStrategy, Component, computed, effect, model, signal, untracked } from '@angular/core';\nimport { isEqual } from 'lodash-es';\n\nimport { AXMTestSheetGridComponent } from './test-sheet-grid.component';\nimport type { AXMTestSheetDefinition } from './test-sheet.types';\nimport {\n applyTestSheetComputations,\n buildFixedTestSheetRows,\n buildRepeatedTestSheetRows,\n normalizeTestSheetDefinition,\n toStoredTestSheetAnswer,\n} from './test-sheet.util';\n\n//#endregion\n\n//#region ----- Component -----\n\n@Component({\n selector: 'axm-test-sheet-widget-edit',\n templateUrl: './test-sheet-widget-edit.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AXMTestSheetGridComponent],\n})\nexport class AXMTestSheetWidgetEditComponent extends AXPValueWidgetComponent<Record<string, unknown>[] | null> {\n //#region ----- State Signals -----\n\n protected readonly repeatedRows = model<Record<string, unknown>[]>([]);\n\n /** Fixed-mode rows. Stops tracking the saved answer after the first edit so the grid is not rebuilt. */\n protected readonly fixedRows = signal<Record<string, unknown>[]>([]);\n\n private answerTouched = false;\n\n //#endregion\n\n //#region ----- Computed Properties -----\n\n protected readonly definition = computed<AXMTestSheetDefinition>(() =>\n normalizeTestSheetDefinition(this.options()['sheet']),\n );\n\n protected readonly isReadonly = computed(() => this.options()['readonly'] === true);\n\n //#endregion\n\n //#region ----- Lifecycle -----\n\n constructor() {\n super();\n effect(() => {\n const definition = this.definition();\n const value = this.getValue();\n if (this.answerTouched) {\n return;\n }\n untracked(() => {\n if (definition.rowMode === 'repeated') {\n const next = buildRepeatedTestSheetRows(value);\n if (!isEqual(next, this.repeatedRows())) {\n this.repeatedRows.set(next);\n }\n return;\n }\n const next = buildFixedTestSheetRows(definition, value);\n if (!isEqual(next, this.fixedRows())) {\n this.fixedRows.set(next);\n }\n });\n });\n }\n\n //#endregion\n\n //#region ----- Event Handlers -----\n\n protected onSheetChange(rows: Record<string, unknown>[]): void {\n if (this.isReadonly()) {\n return;\n }\n this.answerTouched = true;\n const next = applyTestSheetComputations(rows, this.definition());\n if (next !== rows) {\n if (this.definition().rowMode === 'repeated') {\n this.repeatedRows.set(next);\n } else {\n this.fixedRows.set(next);\n }\n }\n const stored = toStoredTestSheetAnswer(next, this.definition());\n const current = this.getValue() ?? null;\n if (!isEqual(stored, current)) {\n this.setValue(stored);\n }\n }\n\n //#endregion\n}\n\n//#endregion\n","<axm-test-sheet-grid\n [definition]=\"definition()\"\n [rowsInput]=\"fixedRows()\"\n [(rowsModel)]=\"repeatedRows\"\n [readonly]=\"isReadonly()\"\n (sheetChange)=\"onSheetChange($event)\"\n/>\n"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { AXPValueWidgetComponent } from '@acorex-platform/framework-client/layout/widget-core';
|
|
2
2
|
import * as i0 from '@angular/core';
|
|
3
3
|
import { computed, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
4
|
-
import { A as AXMTestSheetGridComponent } from './acorex-platform-module-assessment-management-client-test-sheet-grid.component-
|
|
5
|
-
import { n as normalizeTestSheetDefinition, b as buildFixedTestSheetRows, a as buildRepeatedTestSheetRows } from './acorex-platform-module-assessment-management-client-test-sheet.util-
|
|
4
|
+
import { A as AXMTestSheetGridComponent } from './acorex-platform-module-assessment-management-client-test-sheet-grid.component-BgFhyqrK.mjs';
|
|
5
|
+
import { n as normalizeTestSheetDefinition, b as buildFixedTestSheetRows, a as buildRepeatedTestSheetRows } from './acorex-platform-module-assessment-management-client-test-sheet.util-CxWsnTvd.mjs';
|
|
6
6
|
|
|
7
7
|
//#region ----- Imports -----
|
|
8
8
|
//#endregion
|
|
@@ -27,4 +27,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
27
27
|
}] });
|
|
28
28
|
|
|
29
29
|
export { AXMTestSheetWidgetViewComponent };
|
|
30
|
-
//# sourceMappingURL=acorex-platform-module-assessment-management-client-test-sheet-widget-view.component-
|
|
30
|
+
//# sourceMappingURL=acorex-platform-module-assessment-management-client-test-sheet-widget-view.component-DT0jt6Cd.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-platform-module-assessment-management-client-test-sheet-widget-view.component-
|
|
1
|
+
{"version":3,"file":"acorex-platform-module-assessment-management-client-test-sheet-widget-view.component-DT0jt6Cd.mjs","sources":["../../../../libs/modules/assessment-management/client/src/lib/features/questionnaire-builder/questions/widgets/test-sheet/test-sheet-widget-view.component.ts","../../../../libs/modules/assessment-management/client/src/lib/features/questionnaire-builder/questions/widgets/test-sheet/test-sheet-widget-view.component.html"],"sourcesContent":["//#region ----- Imports -----\n\nimport { AXPValueWidgetComponent } from '@acorex-platform/framework-client/layout/widget-core';\nimport { ChangeDetectionStrategy, Component, computed } from '@angular/core';\n\nimport { AXMTestSheetGridComponent } from './test-sheet-grid.component';\nimport {\n buildFixedTestSheetRows,\n buildRepeatedTestSheetRows,\n normalizeTestSheetDefinition,\n} from './test-sheet.util';\n\n//#endregion\n\n//#region ----- Component -----\n\n@Component({\n selector: 'axm-test-sheet-widget-view',\n templateUrl: './test-sheet-widget-view.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AXMTestSheetGridComponent],\n})\nexport class AXMTestSheetWidgetViewComponent extends AXPValueWidgetComponent<Record<string, unknown>[] | null> {\n //#region ----- Computed Properties -----\n\n protected readonly definition = computed(() => normalizeTestSheetDefinition(this.options()['sheet']));\n\n protected readonly fixedRows = computed(() => buildFixedTestSheetRows(this.definition(), this.getValue()));\n\n protected readonly repeatedRows = computed(() => buildRepeatedTestSheetRows(this.getValue()));\n\n //#endregion\n}\n\n//#endregion\n","<axm-test-sheet-grid\n [definition]=\"definition()\"\n [rowsInput]=\"fixedRows()\"\n [rowsModel]=\"repeatedRows()\"\n [readonly]=\"true\"\n/>\n"],"names":[],"mappings":";;;;;;AAAA;AAYA;AAEA;AAQM,MAAO,+BAAgC,SAAQ,uBAAyD,CAAA;AAN9G,IAAA,WAAA,GAAA;;;AASqB,QAAA,IAAA,CAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,4BAA4B,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC;uFAAC;AAElF,QAAA,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,uBAAuB,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;sFAAC;AAEvF,QAAA,IAAA,CAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,0BAA0B,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;yFAAC;AAG9F,IAAA;8GAVY,+BAA+B,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAA/B,+BAA+B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,4BAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECtB5C,qJAMA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDcY,yBAAyB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,WAAA,EAAA,WAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,EAAA,aAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAExB,+BAA+B,EAAA,UAAA,EAAA,CAAA;kBAN3C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,4BAA4B,mBAErB,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,yBAAyB,CAAC,EAAA,QAAA,EAAA,qJAAA,EAAA;;;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { x as AXM_TEST_SHEET_ROW_GROUP_PATH, y as AXM_TEST_SHEET_INPUT_WIDGET_TYPES } from './acorex-platform-module-assessment-management-client-acorex-platform-module-assessment-management-client-
|
|
1
|
+
import { x as AXM_TEST_SHEET_ROW_GROUP_PATH, y as AXM_TEST_SHEET_INPUT_WIDGET_TYPES } from './acorex-platform-module-assessment-management-client-acorex-platform-module-assessment-management-client-Dr56BtSo.mjs';
|
|
2
2
|
|
|
3
3
|
//#region ----- Normalize -----
|
|
4
4
|
function emptyTestSheetDefinition() {
|
|
@@ -420,4 +420,4 @@ function isRecord(value) {
|
|
|
420
420
|
//#endregion
|
|
421
421
|
|
|
422
422
|
export { buildRepeatedTestSheetRows as a, buildFixedTestSheetRows as b, toTestSheetRowWidgets as c, testSheetHasRowGroups as d, applyTestSheetComputations as e, toStoredTestSheetAnswer as f, testSheetChoiceId as g, assignTestSheetItemNames as h, ensureTestSheetColumnWidgets as i, normalizeTestSheetDefinition as n, toTestSheetSpreadsheetColumns as t };
|
|
423
|
-
//# sourceMappingURL=acorex-platform-module-assessment-management-client-test-sheet.util-
|
|
423
|
+
//# sourceMappingURL=acorex-platform-module-assessment-management-client-test-sheet.util-CxWsnTvd.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-platform-module-assessment-management-client-test-sheet.util-ycKdHd3Z.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-CxWsnTvd.mjs","sources":["../../../../libs/modules/assessment-management/client/src/lib/features/questionnaire-builder/questions/widgets/test-sheet/test-sheet.util.ts"],"sourcesContent":["import type { AXPWidgetNode } from '@acorex-platform/framework-shared/core';\nimport type { AXPSpreadsheetColumn, AXPSpreadsheetRowWidget } from '@acorex-platform/framework-client/layout/components';\n\nimport {\n AXM_TEST_SHEET_INPUT_WIDGET_TYPES,\n AXM_TEST_SHEET_ROW_GROUP_PATH,\n type AXMTestSheetColumn,\n type AXMTestSheetDefinition,\n type AXMTestSheetInputWidgetType,\n type AXMTestSheetLayout,\n type AXMTestSheetPercentDiff,\n type AXMTestSheetRow,\n type AXMTestSheetRowMode,\n} from './test-sheet.types';\n\n//#region ----- Normalize -----\n\nexport function emptyTestSheetDefinition(): AXMTestSheetDefinition {\n return {\n rowMode: 'fixed',\n layout: 'column-inputs',\n columns: [],\n rows: [],\n };\n}\n\nexport function normalizeTestSheetDefinition(value: unknown): AXMTestSheetDefinition {\n const source = isRecord(value) ? value : {};\n const rowMode: AXMTestSheetRowMode = source['rowMode'] === 'repeated' ? 'repeated' : 'fixed';\n const layout: AXMTestSheetLayout = source['layout'] === 'row-inputs' ? 'row-inputs' : 'column-inputs';\n const rowHeaderTitle = asText(source['rowHeaderTitle']) || undefined;\n const direction = source['direction'] === 'rtl' || source['direction'] === 'ltr' ? source['direction'] : undefined;\n const columns = Array.isArray(source['columns'])\n ? source['columns'].map((column) => normalizeColumn(column)).filter((column): column is AXMTestSheetColumn => !!column)\n : [];\n const rows = Array.isArray(source['rows'])\n ? source['rows'].map((row) => normalizeRow(row)).filter((row): row is AXMTestSheetRow => !!row)\n : [];\n return { rowMode, layout, rowHeaderTitle, direction, columns, rows };\n}\n\nfunction normalizeColumn(value: unknown): AXMTestSheetColumn | null {\n if (!isRecord(value)) {\n return null;\n }\n const name = asText(value['name']);\n if (!name) {\n return null;\n }\n const role = value['role'] === 'static' ? 'static' : 'input';\n const widgetType = asWidgetType(value['widgetType']);\n const baseWidget = asWidgetNode(value['widget']) ?? (role === 'input' ? legacyInputWidget(value) : undefined);\n return {\n name,\n title: asText(value['title']),\n description: asText(value['description']) || undefined,\n groupTitle: asText(value['groupTitle']) || undefined,\n role,\n widget: moveColumnOptionsOntoWidget(baseWidget, value),\n widgetType: role === 'input' ? widgetType : undefined,\n choices: asText(value['choices']) || undefined,\n percentDiff: normalizePercentDiff(value['percentDiff']),\n };\n}\n\nfunction normalizeRow(value: unknown): AXMTestSheetRow | null {\n if (!isRecord(value)) {\n return null;\n }\n const name = asText(value['name']);\n if (!name) {\n return null;\n }\n const cellsSource = isRecord(value['cells']) ? value['cells'] : {};\n const cells: Record<string, string> = {};\n for (const [key, cell] of Object.entries(cellsSource)) {\n cells[key] = asText(cell);\n }\n const role = value['role'] === 'static' ? 'static' : value['role'] === 'input' ? 'input' : undefined;\n return {\n name,\n groupTitle: asText(value['groupTitle']) || undefined,\n title: asText(value['title']) || undefined,\n role,\n widget: role === 'static' ? undefined : asWidgetNode(value['widget']),\n cells,\n };\n}\n\n//#endregion\n\n//#region ----- Spreadsheet mapping -----\n\nexport function testSheetHasRowGroups(definition: AXMTestSheetDefinition): boolean {\n return (\n definition.rowMode === 'fixed' &&\n definition.rows.some((row) => (row.groupTitle ?? '').trim().length > 0)\n );\n}\n\nexport function toTestSheetSpreadsheetColumns(definition: AXMTestSheetDefinition): AXPSpreadsheetColumn[] {\n return definition.columns.map((column) => ({\n name: column.name,\n title: column.title || column.name,\n description: column.description,\n path: column.name,\n groupTitle: column.groupTitle,\n readonly: column.role === 'static' || !!column.percentDiff,\n widget: column.percentDiff\n ? { type: 'number-editor', options: { decimals: 2 } }\n : column.role === 'static'\n ? staticCellWidget(column)\n : inputCellWidget(column),\n }));\n}\n\n/**\n * Writes percent-difference columns from the two source cells on each row.\n * Returns the same array when nothing changed.\n */\nexport function applyTestSheetComputations(\n rows: Record<string, unknown>[],\n definition: AXMTestSheetDefinition,\n): Record<string, unknown>[] {\n const computed = definition.columns.filter((column) => column.percentDiff);\n if (computed.length === 0) {\n return rows;\n }\n let changed = false;\n const next = rows.map((row) => {\n const copy: Record<string, unknown> = { ...row };\n let rowChanged = false;\n for (const column of computed) {\n const formula = column.percentDiff;\n if (!formula) {\n continue;\n }\n const value = percentDifference(copy[formula.base], copy[formula.other]);\n if (value == null) {\n if (Object.prototype.hasOwnProperty.call(copy, column.name)) {\n delete copy[column.name];\n rowChanged = true;\n }\n continue;\n }\n if (copy[column.name] !== value) {\n copy[column.name] = value;\n rowChanged = true;\n }\n }\n if (rowChanged) {\n changed = true;\n return copy;\n }\n return row;\n });\n return changed ? next : rows;\n}\n\n/** Row widgets for `row-inputs`. Static rows stay as authored text. */\nexport function toTestSheetRowWidgets(definition: AXMTestSheetDefinition): AXPSpreadsheetRowWidget[] | null {\n if (definition.layout !== 'row-inputs') {\n return null;\n }\n return definition.rows.map((row) => ({\n name: row.name,\n readonly: row.role === 'static',\n widget: row.role === 'static' ? undefined : row.widget,\n }));\n}\n\nexport function buildFixedTestSheetRows(\n definition: AXMTestSheetDefinition,\n answer: unknown,\n): Record<string, unknown>[] {\n const saved = asRowList(answer);\n const inputNames = inputColumnNames(definition);\n return definition.rows.map((row) => {\n const next: Record<string, unknown> = {\n name: row.name,\n [AXM_TEST_SHEET_ROW_GROUP_PATH]: row.groupTitle ?? '',\n };\n if (row.title) {\n next['title'] = row.title;\n }\n if (row.role === 'static') {\n for (const column of definition.columns) {\n next[column.name] = row.cells?.[column.name] ?? '';\n }\n return next;\n }\n for (const column of definition.columns) {\n if (column.role === 'static') {\n next[column.name] = row.cells?.[column.name] ?? '';\n }\n }\n const match = saved.find((item) => item['name'] === row.name);\n if (match) {\n for (const name of inputNames) {\n if (Object.prototype.hasOwnProperty.call(match, name)) {\n next[name] = match[name];\n }\n }\n }\n return next;\n });\n}\n\nexport function buildRepeatedTestSheetRows(answer: unknown): Record<string, unknown>[] {\n return asRowList(answer).map((row) => ({ ...row }));\n}\n\n/**\n * Persists the grid only after an input cell has a value.\n * Static text alone does not count as an answer.\n */\nexport function toStoredTestSheetAnswer(\n rows: Record<string, unknown>[],\n definition: AXMTestSheetDefinition,\n): Record<string, unknown>[] | null {\n const names = inputColumnNames(definition);\n const staticRowNames = new Set(\n definition.rows.filter((row) => row.role === 'static').map((row) => row.name),\n );\n const inputRows = rows.filter((row) => !staticRowNames.has(asText(row['name'])));\n const filled = inputRows.some((row) => names.some((name) => isFilledCell(row[name])));\n if (!filled) {\n return null;\n }\n return inputRows.map((row) => {\n const stored: Record<string, unknown> = { ...row };\n delete stored['title'];\n return stored;\n });\n}\n\nexport function nextTestSheetKey(prefix: string, used: string[]): string {\n const taken = new Set(used);\n let index = used.length + 1;\n let name = `${prefix}${index}`;\n while (taken.has(name)) {\n index += 1;\n name = `${prefix}${index}`;\n }\n return name;\n}\n\n/** Reads a select value stored as an id string or as `{ id }`. */\nexport function testSheetChoiceId(value: unknown): string {\n if (typeof value === 'string') {\n return value;\n }\n if (isRecord(value) && typeof value['id'] === 'string') {\n return value['id'];\n }\n return '';\n}\n\n/**\n * Fills blank or duplicate `name` keys on repeater rows.\n * Existing objects are kept when the name is already unique.\n */\nexport function assignTestSheetItemNames<T extends { name?: string }>(\n items: T[],\n prefix: string,\n): { items: T[]; changed: boolean } {\n const used = new Set<string>();\n let changed = false;\n const next = items.map((item) => {\n const current = item && typeof item === 'object' ? item : ({} as T);\n const name = typeof current.name === 'string' ? current.name.trim() : '';\n if (name && !used.has(name)) {\n used.add(name);\n return current;\n }\n changed = true;\n const assigned = nextTestSheetKey(prefix, [...used]);\n used.add(assigned);\n return { ...current, name: assigned };\n });\n return { items: next, changed };\n}\n\n/**\n * Older columns store `widgetType` and `choices`.\n * The configurator reads `widget`, so a missing node is built once from those fields.\n */\nexport function ensureTestSheetColumnWidgets<\n T extends {\n name?: string;\n role?: unknown;\n widget?: unknown;\n widgetType?: unknown;\n choices?: unknown;\n required?: unknown;\n defaultValue?: unknown;\n },\n>(items: T[]): { items: T[]; changed: boolean } {\n let changed = false;\n const next = items.map((item) => {\n if (!isRecord(item)) {\n return item;\n }\n const isStatic = testSheetChoiceId(item['role']) === 'static';\n const current = asWidgetNode(item['widget']);\n const base = current ?? (isStatic ? undefined : legacyInputWidget(item));\n const widget = moveColumnOptionsOntoWidget(base, item);\n const stripLegacy = item['required'] !== undefined || item['defaultValue'] !== undefined;\n if (widget === current && !stripLegacy) {\n return item;\n }\n changed = true;\n const nextItem: Record<string, unknown> = { ...item };\n if (widget) {\n nextItem['widget'] = widget;\n }\n delete nextItem['required'];\n delete nextItem['defaultValue'];\n return nextItem as T;\n });\n return { items: next, changed };\n}\n\n//#endregion\n\n//#region ----- Helpers -----\n\nfunction normalizePercentDiff(value: unknown): AXMTestSheetPercentDiff | undefined {\n if (!isRecord(value) || value['kind'] !== 'percent-diff') {\n return undefined;\n }\n const base = asText(value['base']);\n const other = asText(value['other']);\n if (!base || !other) {\n return undefined;\n }\n return { kind: 'percent-diff', base, other };\n}\n\n/** `|other - base| / |base| × 100`, rounded to two decimals. Empty when either side is missing or the base is 0. */\nfunction percentDifference(baseValue: unknown, otherValue: unknown): number | null {\n const base = asFiniteNumber(baseValue);\n const other = asFiniteNumber(otherValue);\n if (base == null || other == null || base === 0) {\n return null;\n }\n return Math.round((Math.abs(other - base) / Math.abs(base)) * 10000) / 100;\n}\n\nfunction asFiniteNumber(value: unknown): number | null {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === 'string' && value.trim() !== '') {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n }\n return null;\n}\n\nfunction inputColumnNames(definition: AXMTestSheetDefinition): string[] {\n return definition.columns.filter((column) => column.role === 'input').map((column) => column.name);\n}\n\nfunction staticCellWidget(column: AXMTestSheetColumn): AXPWidgetNode {\n return {\n type: 'text-editor',\n defaultValue: column.widget?.defaultValue ?? '',\n options: {},\n };\n}\n\nfunction inputCellWidget(column: AXMTestSheetColumn): AXPWidgetNode {\n return asWidgetNode(column.widget) ?? legacyInputWidget(column);\n}\n\nfunction legacyInputWidget(source: { widgetType?: unknown; choices?: unknown }): AXPWidgetNode {\n const type = asWidgetType(source.widgetType);\n if (type === 'select-editor') {\n const choices = typeof source.choices === 'string' ? source.choices : '';\n const dataSource = choices\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n .map((line) => ({ id: line, title: line }));\n return {\n type,\n options: {\n valueField: 'id',\n textField: 'title',\n dataSource,\n },\n };\n }\n return { type, options: {} };\n}\n\n/**\n * Older sheets stored required and default value on the column.\n * The widget configurator stores them on the node: `defaultValue` and `options.validations.required`.\n */\nfunction moveColumnOptionsOntoWidget(\n widget: AXPWidgetNode | undefined,\n source: { required?: unknown; defaultValue?: unknown },\n): AXPWidgetNode | undefined {\n const defaultValue = typeof source.defaultValue === 'string' ? source.defaultValue : '';\n const needsRequired = source.required === true && (!widget || !widgetHasRequired(widget));\n const needsDefault =\n defaultValue.length > 0 && (widget?.defaultValue === undefined || widget.defaultValue === '');\n if (!needsRequired && !needsDefault) {\n return widget;\n }\n const next: AXPWidgetNode = widget\n ? { ...widget, options: { ...(widget.options ?? {}) } }\n : { type: 'text-editor', options: {} };\n if (needsRequired) {\n const validations = isRecord(next.options?.['validations']) ? { ...next.options['validations'] } : {};\n validations['required'] = { rule: 'required' };\n next.options = { ...(next.options ?? {}), validations };\n }\n if (needsDefault) {\n next.defaultValue = defaultValue;\n }\n return next;\n}\n\nfunction widgetHasRequired(node: AXPWidgetNode): boolean {\n const validations = node.options?.['validations'];\n if (Array.isArray(validations)) {\n return validations.some((rule) => isRequiredRule(rule));\n }\n if (isRecord(validations)) {\n return isRequiredRule(validations['required']);\n }\n return false;\n}\n\nfunction isRequiredRule(value: unknown): boolean {\n return isRecord(value) && value['rule'] === 'required' && value['disabled'] !== true;\n}\n\nfunction asWidgetNode(value: unknown): AXPWidgetNode | undefined {\n if (!isRecord(value)) {\n return undefined;\n }\n const type = asText(value['type']).trim();\n if (!type) {\n return undefined;\n }\n const node: AXPWidgetNode = {\n type,\n options: isRecord(value['options']) ? value['options'] : {},\n };\n if (value['defaultValue'] !== undefined) {\n node.defaultValue = value['defaultValue'];\n }\n if (value['triggers']) {\n node.triggers = value['triggers'] as AXPWidgetNode['triggers'];\n }\n if (value['valueTransforms']) {\n node.valueTransforms = value['valueTransforms'] as AXPWidgetNode['valueTransforms'];\n }\n return node;\n}\n\nfunction asWidgetType(value: unknown): AXMTestSheetInputWidgetType {\n const text = asText(value);\n if ((AXM_TEST_SHEET_INPUT_WIDGET_TYPES as readonly string[]).includes(text)) {\n return text as AXMTestSheetInputWidgetType;\n }\n return 'text-editor';\n}\n\nfunction asRowList(value: unknown): Record<string, unknown>[] {\n if (!Array.isArray(value)) {\n return [];\n }\n return value.filter(isRecord);\n}\n\nfunction isFilledCell(value: unknown): boolean {\n if (value === null || value === undefined || value === '' || value === false) {\n return false;\n }\n if (Array.isArray(value)) {\n return value.length > 0;\n }\n return true;\n}\n\nfunction asText(value: unknown): string {\n return typeof value === 'string' ? value : '';\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n//#endregion\n"],"names":[],"mappings":"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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, defaultTo, first } 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-Dr56BtSo.mjs';
|
|
7
7
|
import { 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-42ZcOY2C.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-rsDFSIgz.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-platform-module-assessment-management-client-view-session-answers.command-Bi-Dwlld.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 } 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: defaultTo(get(row, 'answers') as Record<string, unknown> | undefined, {}),\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-rsDFSIgz.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 } 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: defaultTo(get(row, 'answers') as Record<string, unknown> | undefined, {}),\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-Dr56BtSo.mjs';
|
|
2
2
|
//# sourceMappingURL=acorex-platform-module-assessment-management-client.mjs.map
|
|
@@ -17,6 +17,10 @@
|
|
|
17
17
|
"questionnaire-management": {
|
|
18
18
|
"title": "Questionnaire Management",
|
|
19
19
|
"description": "Enable questionnaire management functionality"
|
|
20
|
+
},
|
|
21
|
+
"questionnaire-print": {
|
|
22
|
+
"title": "Questionnaire Print",
|
|
23
|
+
"description": "Print questionnaires and show printing options."
|
|
20
24
|
}
|
|
21
25
|
},
|
|
22
26
|
"question-bank": {
|
|
@@ -602,7 +606,7 @@
|
|
|
602
606
|
}
|
|
603
607
|
},
|
|
604
608
|
"completion-mode": {
|
|
605
|
-
"title": "Completion
|
|
609
|
+
"title": "Completion Mode",
|
|
606
610
|
"description": "Whether respondents can save a draft before final submit",
|
|
607
611
|
"options": {
|
|
608
612
|
"submit-only": "Submit only",
|
|
@@ -17,6 +17,10 @@
|
|
|
17
17
|
"questionnaire-management": {
|
|
18
18
|
"title": "Questionnaire Management",
|
|
19
19
|
"description": "Enable questionnaire management functionality"
|
|
20
|
+
},
|
|
21
|
+
"questionnaire-print": {
|
|
22
|
+
"title": "Questionnaire Print",
|
|
23
|
+
"description": "Print questionnaires and show printing options."
|
|
20
24
|
}
|
|
21
25
|
},
|
|
22
26
|
"question-bank": {
|
|
@@ -602,7 +606,7 @@
|
|
|
602
606
|
}
|
|
603
607
|
},
|
|
604
608
|
"completion-mode": {
|
|
605
|
-
"title": "Completion
|
|
609
|
+
"title": "Completion Mode",
|
|
606
610
|
"description": "Whether respondents can save a draft before final submit",
|
|
607
611
|
"options": {
|
|
608
612
|
"submit-only": "Submit only",
|
|
@@ -17,6 +17,10 @@
|
|
|
17
17
|
"questionnaire-management": {
|
|
18
18
|
"title": "مدیریت پرسشنامهها",
|
|
19
19
|
"description": "فعالسازی قابلیت مدیریت پرسشنامهها"
|
|
20
|
+
},
|
|
21
|
+
"questionnaire-print": {
|
|
22
|
+
"title": "چاپ پرسشنامه",
|
|
23
|
+
"description": "چاپ پرسشنامه و نمایش گزینههای چاپ را فعال میکند."
|
|
20
24
|
}
|
|
21
25
|
},
|
|
22
26
|
"assetSystemTypes": {
|
package/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@acorex-platform/module-assessment-management-client",
|
|
3
|
-
"version": "2.0.0-next.
|
|
3
|
+
"version": "2.0.0-next.2",
|
|
4
4
|
"sideEffects": false,
|
|
5
5
|
"peerDependencies": {
|
|
6
|
-
"@acorex-platform/extension-ai-voice-shell-client": "2.0.0-next.0",
|
|
7
|
-
"@acorex-platform/module-content-management-client": "2.0.0-next.0",
|
|
8
6
|
"@angular/common": "^21.0.0 || ^22.0.0",
|
|
9
|
-
"@angular/core": "^21.0.0 || ^22.0.0"
|
|
7
|
+
"@angular/core": "^21.0.0 || ^22.0.0",
|
|
8
|
+
"@acorex-platform/extension-ai-voice-shell-client": "2.0.0-next.2",
|
|
9
|
+
"@acorex-platform/module-content-management-client": "2.0.0-next.2"
|
|
10
10
|
},
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"tslib": "^2.3.0"
|
|
@@ -5,6 +5,8 @@ import { AXPEntityModel, AXPEntityCreateDto, AXPEntityDetailDto, AXPEntityListIt
|
|
|
5
5
|
declare const AXMAssessmentManagementFeatureKeys: {
|
|
6
6
|
readonly QuestionnaireManagement: "AssessmentManagement:Feature:Questionnaire.Management";
|
|
7
7
|
readonly FormTemplates: "AssessmentManagement:Feature:FormTemplates";
|
|
8
|
+
/** Questionnaire print section, preview PDF button, and session PDF actions. */
|
|
9
|
+
readonly QuestionnairePrint: "AssessmentManagement:Feature:Questionnaire.Print";
|
|
8
10
|
};
|
|
9
11
|
|
|
10
12
|
declare const AXPAssessmentManagementMenuKeys: {
|
|
@@ -177,6 +177,10 @@ interface QuestionnaireViewerConfig {
|
|
|
177
177
|
* Author preview: interactive answers allowed, but nothing is persisted; submit actions use preview copy.
|
|
178
178
|
*/
|
|
179
179
|
previewMode?: boolean;
|
|
180
|
+
/**
|
|
181
|
+
* Show Preview PDF in the viewer footer. Off unless the host calls the assessment print command.
|
|
182
|
+
*/
|
|
183
|
+
pdfPreview?: boolean;
|
|
180
184
|
/**
|
|
181
185
|
* Answer keys (question item names) that stay readonly while the rest of the form is editable.
|
|
182
186
|
* Used e.g. for work-order checklist asset prefill fields.
|