@acorex/modules 21.0.0-next.59 → 21.0.0-next.64

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/assessment-management/README.md +4 -4
  2. package/fesm2022/{acorex-modules-assessment-management-acorex-modules-assessment-management-o8aFazwA.mjs → acorex-modules-assessment-management-acorex-modules-assessment-management-DqmJVJ0z.mjs} +3599 -373
  3. package/fesm2022/acorex-modules-assessment-management-acorex-modules-assessment-management-DqmJVJ0z.mjs.map +1 -0
  4. package/fesm2022/{acorex-modules-assessment-management-assessment-case.entity-yrc_Yybq.mjs → acorex-modules-assessment-management-assessment-case.entity-DhVwPz0T.mjs} +45 -29
  5. package/fesm2022/acorex-modules-assessment-management-assessment-case.entity-DhVwPz0T.mjs.map +1 -0
  6. package/fesm2022/{acorex-modules-assessment-management-assessment-session.entity-Cwf30iuu.mjs → acorex-modules-assessment-management-assessment-session.entity-BvV2Qgw1.mjs} +19 -3
  7. package/fesm2022/acorex-modules-assessment-management-assessment-session.entity-BvV2Qgw1.mjs.map +1 -0
  8. package/fesm2022/{acorex-modules-assessment-management-fill-assessment-session.command-CJieLR5g.mjs → acorex-modules-assessment-management-fill-assessment-session.command-4fkaeAG-.mjs} +2 -2
  9. package/fesm2022/acorex-modules-assessment-management-fill-assessment-session.command-4fkaeAG-.mjs.map +1 -0
  10. package/fesm2022/{acorex-modules-assessment-management-preview-question.command-D0-FB1HH.mjs → acorex-modules-assessment-management-preview-question.command-6IGOdVVZ.mjs} +2 -2
  11. package/fesm2022/acorex-modules-assessment-management-preview-question.command-6IGOdVVZ.mjs.map +1 -0
  12. package/fesm2022/{acorex-modules-assessment-management-preview-questionnaire.command-wqPNgv7q.mjs → acorex-modules-assessment-management-preview-questionnaire.command-CRDBe_BS.mjs} +2 -2
  13. package/fesm2022/{acorex-modules-assessment-management-preview-questionnaire.command-wqPNgv7q.mjs.map → acorex-modules-assessment-management-preview-questionnaire.command-CRDBe_BS.mjs.map} +1 -1
  14. package/fesm2022/{acorex-modules-assessment-management-question-bank-interface-editor-widget-edit.component-DYyUhSWd.mjs → acorex-modules-assessment-management-question-bank-interface-editor-widget-edit.component-B2ES-zcL.mjs} +2 -2
  15. package/fesm2022/acorex-modules-assessment-management-question-bank-interface-editor-widget-edit.component-B2ES-zcL.mjs.map +1 -0
  16. package/fesm2022/{acorex-modules-assessment-management-question-bank-item.entity-DUf2ceKY.mjs → acorex-modules-assessment-management-question-bank-item.entity-Cw2WCdYK.mjs} +2 -2
  17. package/fesm2022/{acorex-modules-assessment-management-question-bank-item.entity-DUf2ceKY.mjs.map → acorex-modules-assessment-management-question-bank-item.entity-Cw2WCdYK.mjs.map} +1 -1
  18. package/fesm2022/{acorex-modules-assessment-management-questionnaire-viewer-popup.component-Cy5ElBmU.mjs → acorex-modules-assessment-management-questionnaire-viewer-popup.component-D9I3S-ZT.mjs} +125 -124
  19. package/fesm2022/acorex-modules-assessment-management-questionnaire-viewer-popup.component-D9I3S-ZT.mjs.map +1 -0
  20. package/fesm2022/{acorex-modules-assessment-management-questionnaire.entity-RWSkzNbA.mjs → acorex-modules-assessment-management-questionnaire.entity-D9nHUmQB.mjs} +12 -36
  21. package/fesm2022/acorex-modules-assessment-management-questionnaire.entity-D9nHUmQB.mjs.map +1 -0
  22. package/fesm2022/acorex-modules-assessment-management-view-session-answers.command-BOeO3Dit.mjs +350 -0
  23. package/fesm2022/acorex-modules-assessment-management-view-session-answers.command-BOeO3Dit.mjs.map +1 -0
  24. package/fesm2022/acorex-modules-assessment-management.mjs +1 -1
  25. package/fesm2022/acorex-modules-common.mjs +1 -8
  26. package/fesm2022/acorex-modules-common.mjs.map +1 -1
  27. package/fesm2022/{acorex-modules-human-capital-management-acorex-modules-human-capital-management-BWezAea1.mjs → acorex-modules-human-capital-management-acorex-modules-human-capital-management-uRz1c5Km.mjs} +20 -20
  28. package/fesm2022/{acorex-modules-human-capital-management-acorex-modules-human-capital-management-BWezAea1.mjs.map → acorex-modules-human-capital-management-acorex-modules-human-capital-management-uRz1c5Km.mjs.map} +1 -1
  29. package/fesm2022/{acorex-modules-human-capital-management-approve-leave-request.command-Bh_Bbq5-.mjs → acorex-modules-human-capital-management-approve-leave-request.command-23klKnTy.mjs} +2 -2
  30. package/fesm2022/{acorex-modules-human-capital-management-approve-leave-request.command-Bh_Bbq5-.mjs.map → acorex-modules-human-capital-management-approve-leave-request.command-23klKnTy.mjs.map} +1 -1
  31. package/fesm2022/{acorex-modules-human-capital-management-assign-position-assignment.command-BpDdDG9i.mjs → acorex-modules-human-capital-management-assign-position-assignment.command-BJ8xUiR2.mjs} +2 -2
  32. package/fesm2022/{acorex-modules-human-capital-management-assign-position-assignment.command-BpDdDG9i.mjs.map → acorex-modules-human-capital-management-assign-position-assignment.command-BJ8xUiR2.mjs.map} +1 -1
  33. package/fesm2022/{acorex-modules-human-capital-management-cancel-leave-request.command-CjtKaKFw.mjs → acorex-modules-human-capital-management-cancel-leave-request.command-B3u1gXWI.mjs} +2 -2
  34. package/fesm2022/{acorex-modules-human-capital-management-cancel-leave-request.command-CjtKaKFw.mjs.map → acorex-modules-human-capital-management-cancel-leave-request.command-B3u1gXWI.mjs.map} +1 -1
  35. package/fesm2022/{acorex-modules-human-capital-management-employee.entity-Cx_oY2aK.mjs → acorex-modules-human-capital-management-employee.entity-uhwOOw_y.mjs} +11 -3
  36. package/fesm2022/acorex-modules-human-capital-management-employee.entity-uhwOOw_y.mjs.map +1 -0
  37. package/fesm2022/{acorex-modules-human-capital-management-employment-type.entity-B20Taa5x.mjs → acorex-modules-human-capital-management-employment-type.entity-BQe82rsr.mjs} +2 -2
  38. package/fesm2022/{acorex-modules-human-capital-management-employment-type.entity-B20Taa5x.mjs.map → acorex-modules-human-capital-management-employment-type.entity-BQe82rsr.mjs.map} +1 -1
  39. package/fesm2022/{acorex-modules-human-capital-management-leave-request.entity-BO8QXpZE.mjs → acorex-modules-human-capital-management-leave-request.entity-CE4hs4C8.mjs} +2 -2
  40. package/fesm2022/{acorex-modules-human-capital-management-leave-request.entity-BO8QXpZE.mjs.map → acorex-modules-human-capital-management-leave-request.entity-CE4hs4C8.mjs.map} +1 -1
  41. package/fesm2022/{acorex-modules-human-capital-management-leave-type.entity-CQwSWqSh.mjs → acorex-modules-human-capital-management-leave-type.entity-DJ4EEUKg.mjs} +2 -2
  42. package/fesm2022/{acorex-modules-human-capital-management-leave-type.entity-CQwSWqSh.mjs.map → acorex-modules-human-capital-management-leave-type.entity-DJ4EEUKg.mjs.map} +1 -1
  43. package/fesm2022/{acorex-modules-human-capital-management-lifecycle-event-type.entity-BPWJrvbN.mjs → acorex-modules-human-capital-management-lifecycle-event-type.entity-CB2hlyOP.mjs} +2 -2
  44. package/fesm2022/{acorex-modules-human-capital-management-lifecycle-event-type.entity-BPWJrvbN.mjs.map → acorex-modules-human-capital-management-lifecycle-event-type.entity-CB2hlyOP.mjs.map} +1 -1
  45. package/fesm2022/{acorex-modules-human-capital-management-lifecycle-event.entity-ZZuPu9KQ.mjs → acorex-modules-human-capital-management-lifecycle-event.entity-DWonFZpU.mjs} +2 -2
  46. package/fesm2022/{acorex-modules-human-capital-management-lifecycle-event.entity-ZZuPu9KQ.mjs.map → acorex-modules-human-capital-management-lifecycle-event.entity-DWonFZpU.mjs.map} +1 -1
  47. package/fesm2022/{acorex-modules-human-capital-management-position-assignment.entity-BN1y0qhi.mjs → acorex-modules-human-capital-management-position-assignment.entity-o8PjggiT.mjs} +2 -2
  48. package/fesm2022/{acorex-modules-human-capital-management-position-assignment.entity-BN1y0qhi.mjs.map → acorex-modules-human-capital-management-position-assignment.entity-o8PjggiT.mjs.map} +1 -1
  49. package/fesm2022/{acorex-modules-human-capital-management-reject-leave-request.command-LczqOHP-.mjs → acorex-modules-human-capital-management-reject-leave-request.command-B6sr7oey.mjs} +2 -2
  50. package/fesm2022/{acorex-modules-human-capital-management-reject-leave-request.command-LczqOHP-.mjs.map → acorex-modules-human-capital-management-reject-leave-request.command-B6sr7oey.mjs.map} +1 -1
  51. package/fesm2022/{acorex-modules-human-capital-management-revoke-position-assignment.command-Dm8YacDI.mjs → acorex-modules-human-capital-management-revoke-position-assignment.command-aH7qTRnr.mjs} +2 -2
  52. package/fesm2022/{acorex-modules-human-capital-management-revoke-position-assignment.command-Dm8YacDI.mjs.map → acorex-modules-human-capital-management-revoke-position-assignment.command-aH7qTRnr.mjs.map} +1 -1
  53. package/fesm2022/{acorex-modules-human-capital-management-start-lifecycle-event-flow.command-DPwuyFz2.mjs → acorex-modules-human-capital-management-start-lifecycle-event-flow.command-B-VsXS4c.mjs} +2 -2
  54. package/fesm2022/{acorex-modules-human-capital-management-start-lifecycle-event-flow.command-DPwuyFz2.mjs.map → acorex-modules-human-capital-management-start-lifecycle-event-flow.command-B-VsXS4c.mjs.map} +1 -1
  55. package/fesm2022/acorex-modules-human-capital-management.mjs +1 -1
  56. package/fesm2022/acorex-modules-report-management.mjs +1 -1
  57. package/fesm2022/acorex-modules-report-management.mjs.map +1 -1
  58. package/fesm2022/{acorex-modules-task-management-acorex-modules-task-management--mdNdYIs.mjs → acorex-modules-task-management-acorex-modules-task-management-DAh3IByo.mjs} +37 -19
  59. package/fesm2022/acorex-modules-task-management-acorex-modules-task-management-DAh3IByo.mjs.map +1 -0
  60. package/fesm2022/{acorex-modules-task-management-task-board.page-BIZ1qH7m.mjs → acorex-modules-task-management-task-board.page-C2hB9JPM.mjs} +21 -12
  61. package/fesm2022/acorex-modules-task-management-task-board.page-C2hB9JPM.mjs.map +1 -0
  62. package/fesm2022/acorex-modules-task-management.mjs +1 -1
  63. package/package.json +2 -2
  64. package/types/acorex-modules-assessment-management.d.ts +391 -271
  65. package/types/acorex-modules-common.d.ts +1 -0
  66. package/types/acorex-modules-task-management.d.ts +14 -1
  67. package/fesm2022/acorex-modules-assessment-management-acorex-modules-assessment-management-o8aFazwA.mjs.map +0 -1
  68. package/fesm2022/acorex-modules-assessment-management-assessment-case.entity-yrc_Yybq.mjs.map +0 -1
  69. package/fesm2022/acorex-modules-assessment-management-assessment-session-answers-view.util-BUQa_TSY.mjs +0 -47
  70. package/fesm2022/acorex-modules-assessment-management-assessment-session-answers-view.util-BUQa_TSY.mjs.map +0 -1
  71. package/fesm2022/acorex-modules-assessment-management-assessment-session.entity-Cwf30iuu.mjs.map +0 -1
  72. package/fesm2022/acorex-modules-assessment-management-fill-assessment-session.command-CJieLR5g.mjs.map +0 -1
  73. package/fesm2022/acorex-modules-assessment-management-index-D8KjfHAH.mjs +0 -1509
  74. package/fesm2022/acorex-modules-assessment-management-index-D8KjfHAH.mjs.map +0 -1
  75. package/fesm2022/acorex-modules-assessment-management-preview-question.command-D0-FB1HH.mjs.map +0 -1
  76. package/fesm2022/acorex-modules-assessment-management-question-bank-interface-editor-widget-edit.component-DYyUhSWd.mjs.map +0 -1
  77. package/fesm2022/acorex-modules-assessment-management-questionnaire-calculation.entity-CYF0k42_.mjs +0 -236
  78. package/fesm2022/acorex-modules-assessment-management-questionnaire-calculation.entity-CYF0k42_.mjs.map +0 -1
  79. package/fesm2022/acorex-modules-assessment-management-questionnaire-viewer-popup.component-Cy5ElBmU.mjs.map +0 -1
  80. package/fesm2022/acorex-modules-assessment-management-questionnaire.entity-RWSkzNbA.mjs.map +0 -1
  81. package/fesm2022/acorex-modules-assessment-management-save-questionnaire-questions.command-koGmUbNE.mjs +0 -61
  82. package/fesm2022/acorex-modules-assessment-management-save-questionnaire-questions.command-koGmUbNE.mjs.map +0 -1
  83. package/fesm2022/acorex-modules-assessment-management-view-case-last-session-answers.command-NTuDdoYk.mjs +0 -157
  84. package/fesm2022/acorex-modules-assessment-management-view-case-last-session-answers.command-NTuDdoYk.mjs.map +0 -1
  85. package/fesm2022/acorex-modules-assessment-management-view-session-answers.command-0btGV66_.mjs +0 -172
  86. package/fesm2022/acorex-modules-assessment-management-view-session-answers.command-0btGV66_.mjs.map +0 -1
  87. package/fesm2022/acorex-modules-human-capital-management-employee.entity-Cx_oY2aK.mjs.map +0 -1
  88. package/fesm2022/acorex-modules-task-management-acorex-modules-task-management--mdNdYIs.mjs.map +0 -1
  89. package/fesm2022/acorex-modules-task-management-task-board.page-BIZ1qH7m.mjs.map +0 -1
@@ -0,0 +1,350 @@
1
+ import { AXTranslationService } from '@acorex/core/translation';
2
+ import * as i0 from '@angular/core';
3
+ import { inject, Injectable } from '@angular/core';
4
+ import { AXPEntityService } from '@acorex/platform/layout/entity';
5
+ import { defaultTo, get, isEmpty, isString, toString, first } from 'lodash-es';
6
+ import { R as RootConfig, e as toDisplaySettings, A as AXMQuestionnaireViewerService } from './acorex-modules-assessment-management-acorex-modules-assessment-management-DqmJVJ0z.mjs';
7
+
8
+ //#region ---- Imports ----
9
+ //#endregion
10
+ //#region ---- Viewer ----
11
+ /**
12
+ * Returns pre-built outcome results when the session has a non-empty stored outcomes snapshot.
13
+ */
14
+ async function resolveStoredOutcomeResults(questionnaireViewerService, session, questionnaireId) {
15
+ const storedOutcomes = defaultTo(get(session, 'outcomes'), {});
16
+ if (isEmpty(storedOutcomes)) {
17
+ return null;
18
+ }
19
+ const snapshot = await questionnaireViewerService.buildOutcomeResultsFromStoredValues(storedOutcomes, {
20
+ questionnaireId,
21
+ });
22
+ const hasOutcomeSections = (snapshot.outcomeSections?.length ?? 0) > 0;
23
+ const hasOutcomeValues = !isEmpty(snapshot.outcomes);
24
+ if (!hasOutcomeSections && !hasOutcomeValues) {
25
+ return null;
26
+ }
27
+ return snapshot;
28
+ }
29
+ /**
30
+ * Opens a readonly questionnaire viewer dialog for the given assessment session.
31
+ */
32
+ async function openAssessmentSessionAnswersView(deps, session, assessmentCase, options = {}) {
33
+ const initialStep = options.initialStep ?? 'answers';
34
+ const questionnaireId = assessmentCase.questionnaireId;
35
+ if (!questionnaireId) {
36
+ throw new Error('Assessment case is missing questionnaireId');
37
+ }
38
+ const questionnaire = await deps.entityService
39
+ .withEntity(RootConfig.module.name, RootConfig.entities.questionnaire.name)
40
+ .data()
41
+ .byKey(questionnaireId);
42
+ if (!questionnaire) {
43
+ throw new Error(`Questionnaire with ID ${questionnaireId} not found`);
44
+ }
45
+ const sections = get(questionnaire, 'questions.sections');
46
+ if (isEmpty(sections)) {
47
+ throw new Error('Questionnaire has no questions to display');
48
+ }
49
+ const viewTitleKey = initialStep === 'results'
50
+ ? '@assessment-management:sessions.actions.view-outcomes.title'
51
+ : '@assessment-management:sessions.actions.view-answers.title';
52
+ const viewTitleBase = (await deps.translationService.translateAsync(viewTitleKey)) ||
53
+ (initialStep === 'results' ? 'View outcome results' : 'View Answers');
54
+ const responderName = defaultTo(get(session, 'responder.displayName'), get(session, 'responderId'));
55
+ const viewTitle = !isEmpty(responderName) ? `${viewTitleBase}: ${responderName}` : viewTitleBase;
56
+ const questions = get(questionnaire, 'questions');
57
+ const structure = {
58
+ sections: defaultTo(get(questions, 'sections'), []),
59
+ displaySettings: toDisplaySettings(questionnaire) ?? undefined,
60
+ };
61
+ const storedOutcomeResults = await resolveStoredOutcomeResults(deps.questionnaireViewerService, session, questionnaireId);
62
+ if (initialStep === 'results' && !storedOutcomeResults) {
63
+ throw new Error('Assessment session has no displayable outcome results');
64
+ }
65
+ await deps.questionnaireViewerService.open({
66
+ title: viewTitle,
67
+ structure,
68
+ config: {
69
+ readonly: true,
70
+ initialFlowStep: initialStep === 'results' ? 'results' : 'questions',
71
+ },
72
+ initialAnswers: defaultTo(get(session, 'answers'), {}),
73
+ questionnaireId,
74
+ storedOutcomeResults,
75
+ });
76
+ }
77
+ //#endregion
78
+
79
+ //#endregion
80
+ //#region ---- View Session Answers Command ----
81
+ /**
82
+ * Command that opens a readonly view of assessment session answers in a dialog.
83
+ */
84
+ class ViewSessionAnswersCommand {
85
+ constructor() {
86
+ //#region ---- Services & Dependencies ----
87
+ this.entityService = inject(AXPEntityService);
88
+ this.questionnaireViewerService = inject(AXMQuestionnaireViewerService);
89
+ this.translationService = inject(AXTranslationService);
90
+ }
91
+ //#endregion
92
+ //#region ---- Command Implementation ----
93
+ /**
94
+ * Returns a non-empty string or undefined.
95
+ */
96
+ asNonEmptyString(value) {
97
+ if (isString(value) && !isEmpty(value)) {
98
+ return value;
99
+ }
100
+ if (value != null && !isString(value)) {
101
+ const normalized = toString(value).trim();
102
+ return isEmpty(normalized) ? undefined : normalized;
103
+ }
104
+ return undefined;
105
+ }
106
+ /**
107
+ * Resolves session id from root input, action options, or related-list row data.
108
+ */
109
+ resolveSessionId(input) {
110
+ const candidates = [
111
+ get(input, 'sessionId'),
112
+ get(input, 'options.sessionId'),
113
+ get(input, '__context__.options.sessionId'),
114
+ ];
115
+ for (const candidate of candidates) {
116
+ const resolved = this.asNonEmptyString(candidate);
117
+ if (resolved) {
118
+ return resolved;
119
+ }
120
+ }
121
+ const row = get(input, '__context__.data');
122
+ if (row && this.asNonEmptyString(get(row, 'caseId'))) {
123
+ return this.asNonEmptyString(get(row, 'id')) ?? null;
124
+ }
125
+ return null;
126
+ }
127
+ /**
128
+ * Resolves case id from root input, action options, or list row data.
129
+ */
130
+ resolveCaseId(input) {
131
+ const candidates = [
132
+ get(input, 'caseId'),
133
+ get(input, 'options.caseId'),
134
+ get(input, '__context__.options.caseId'),
135
+ ];
136
+ for (const candidate of candidates) {
137
+ const resolved = this.asNonEmptyString(candidate);
138
+ if (resolved) {
139
+ return resolved;
140
+ }
141
+ }
142
+ const row = get(input, '__context__.data');
143
+ if (row && !this.asNonEmptyString(get(row, 'caseId'))) {
144
+ return this.asNonEmptyString(get(row, 'id')) ?? null;
145
+ }
146
+ return null;
147
+ }
148
+ /**
149
+ * Resolves initial viewer step from root input or action options.
150
+ */
151
+ resolveInitialStep(input) {
152
+ const candidates = [
153
+ get(input, 'initialStep'),
154
+ get(input, 'options.initialStep'),
155
+ get(input, '__context__.options.initialStep'),
156
+ ];
157
+ for (const candidate of candidates) {
158
+ const normalized = this.asNonEmptyString(candidate);
159
+ if (normalized === 'results') {
160
+ return 'results';
161
+ }
162
+ }
163
+ return 'answers';
164
+ }
165
+ /**
166
+ * Loads session from related-list row data, list query, or byKey (in that order).
167
+ */
168
+ async loadSession(sessionId, input) {
169
+ const row = get(input, '__context__.data');
170
+ const rowCaseId = this.asNonEmptyString(get(row, 'caseId'));
171
+ if (row && rowCaseId) {
172
+ return {
173
+ ...row,
174
+ id: sessionId,
175
+ answers: defaultTo(get(row, 'answers'), {}),
176
+ };
177
+ }
178
+ const sessionAccessor = this.entityService
179
+ .withEntity(RootConfig.module.name, RootConfig.entities.assessmentSession.name)
180
+ .data();
181
+ const listMatch = await sessionAccessor.query({
182
+ skip: 0,
183
+ take: 1,
184
+ filter: {
185
+ field: 'id',
186
+ operator: { type: 'equal' },
187
+ value: sessionId,
188
+ },
189
+ });
190
+ const fromQuery = first(listMatch.items);
191
+ if (fromQuery) {
192
+ return fromQuery;
193
+ }
194
+ return defaultTo(await sessionAccessor.byKey(sessionId), null);
195
+ }
196
+ /**
197
+ * Loads case by id using query first, then byKey.
198
+ */
199
+ async loadCase(caseId) {
200
+ const caseAccessor = this.entityService
201
+ .withEntity(RootConfig.module.name, RootConfig.entities.assessmentCase.name)
202
+ .data();
203
+ const listMatch = await caseAccessor.query({
204
+ skip: 0,
205
+ take: 1,
206
+ filter: {
207
+ field: 'id',
208
+ operator: { type: 'equal' },
209
+ value: caseId,
210
+ },
211
+ });
212
+ const fromQuery = first(listMatch.items);
213
+ if (fromQuery) {
214
+ return fromQuery;
215
+ }
216
+ return defaultTo(await caseAccessor.byKey(caseId), null);
217
+ }
218
+ /**
219
+ * Finds the latest session record for a case (by lastSavedAt, then createdAt).
220
+ */
221
+ async findLatestSession(caseId) {
222
+ const sessionAccessor = this.entityService
223
+ .withEntity(RootConfig.module.name, RootConfig.entities.assessmentSession.name)
224
+ .data();
225
+ const listMatch = await sessionAccessor.query({
226
+ skip: 0,
227
+ take: 1,
228
+ sort: [
229
+ { field: 'lastSavedAt', dir: 'desc' },
230
+ { field: 'createdAt', dir: 'desc' },
231
+ ],
232
+ filter: {
233
+ field: 'caseId',
234
+ operator: { type: 'equal' },
235
+ value: caseId,
236
+ },
237
+ });
238
+ return first(listMatch.items) ?? null;
239
+ }
240
+ async execute(input) {
241
+ try {
242
+ const sessionId = this.resolveSessionId(input);
243
+ const caseId = this.resolveCaseId(input);
244
+ if (!sessionId && !caseId) {
245
+ return {
246
+ success: false,
247
+ message: {
248
+ text: 'Assessment case ID or session ID is required',
249
+ },
250
+ };
251
+ }
252
+ let session = null;
253
+ let assessmentCase = null;
254
+ if (sessionId) {
255
+ session = await this.loadSession(sessionId, input);
256
+ if (!session) {
257
+ return {
258
+ success: false,
259
+ message: {
260
+ text: `Assessment session with ID ${sessionId} not found`,
261
+ },
262
+ };
263
+ }
264
+ const resolvedCaseId = this.asNonEmptyString(get(session, 'caseId')) ?? caseId;
265
+ if (!resolvedCaseId) {
266
+ return {
267
+ success: false,
268
+ message: {
269
+ text: 'Assessment session is missing caseId',
270
+ },
271
+ };
272
+ }
273
+ assessmentCase = await this.loadCase(resolvedCaseId);
274
+ if (!assessmentCase) {
275
+ return {
276
+ success: false,
277
+ message: {
278
+ text: `Assessment case with ID ${resolvedCaseId} not found`,
279
+ },
280
+ };
281
+ }
282
+ }
283
+ else if (caseId) {
284
+ assessmentCase = await this.loadCase(caseId);
285
+ if (!assessmentCase) {
286
+ return {
287
+ success: false,
288
+ message: {
289
+ text: `Assessment case with ID ${caseId} not found`,
290
+ },
291
+ };
292
+ }
293
+ session = await this.findLatestSession(caseId);
294
+ if (!session) {
295
+ const messageKey = '@assessment-management:cases.actions.view-last-session-answers.no-session';
296
+ const messageText = (await this.translationService.translateAsync(messageKey)) ||
297
+ 'No assessment session found for this case';
298
+ return {
299
+ success: false,
300
+ message: {
301
+ text: messageText,
302
+ },
303
+ };
304
+ }
305
+ }
306
+ if (!session || !assessmentCase) {
307
+ return {
308
+ success: false,
309
+ message: {
310
+ text: 'Unable to resolve assessment session answers',
311
+ },
312
+ };
313
+ }
314
+ const initialStep = this.resolveInitialStep(input);
315
+ if (initialStep === 'results' && isEmpty(get(session, 'outcomes'))) {
316
+ return {
317
+ success: false,
318
+ message: {
319
+ text: await this.translationService.translateAsync('@assessment-management:sessions.actions.view-outcomes.empty'),
320
+ },
321
+ };
322
+ }
323
+ await openAssessmentSessionAnswersView({
324
+ entityService: this.entityService,
325
+ questionnaireViewerService: this.questionnaireViewerService,
326
+ translationService: this.translationService,
327
+ }, session, assessmentCase, { initialStep });
328
+ return {
329
+ success: true,
330
+ };
331
+ }
332
+ catch (error) {
333
+ const message = error instanceof Error ? error.message : 'Unknown error';
334
+ return {
335
+ success: false,
336
+ message: {
337
+ text: `Error viewing session answers: ${message}`,
338
+ },
339
+ };
340
+ }
341
+ }
342
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ViewSessionAnswersCommand, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
343
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ViewSessionAnswersCommand }); }
344
+ }
345
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ViewSessionAnswersCommand, decorators: [{
346
+ type: Injectable
347
+ }] });
348
+
349
+ export { ViewSessionAnswersCommand };
350
+ //# sourceMappingURL=acorex-modules-assessment-management-view-session-answers.command-BOeO3Dit.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acorex-modules-assessment-management-view-session-answers.command-BOeO3Dit.mjs","sources":["../../../../libs/modules/assessment-management/src/lib/features/questionnaire-viewer/utils/assessment-session-answers-view.util.ts","../../../../libs/modules/assessment-management/src/lib/features/questionnaire-viewer/commands/view-session-answers.command.ts"],"sourcesContent":["//#region ---- Imports ----\n\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { AXPEntityService } from '@acorex/platform/layout/entity';\nimport { defaultTo, get, isEmpty } from 'lodash-es';\nimport type { AXMAssessmentManagementAssessmentCaseEntityModel } from '../../../entities/assessment-case/assessment-case.types';\nimport type { AXMAssessmentManagementAssessmentSessionEntityModel } from '../../../entities/assessment-session/assessment-session.types';\nimport {\n type AXMAssessmentManagementQuestionnaireEntityModel,\n toDisplaySettings,\n} from '../../../entities/questionnaire/questionnaire.types';\nimport { RootConfig } from '../../../const';\nimport { AXMQuestionnaireViewerService } from '../questionnaire-viewer.service';\nimport type { SummaryPlaceholderValues } from './pre-post-content.utils';\n\n//#endregion\n\n//#region ---- Types ----\n\nexport interface OpenAssessmentSessionAnswersViewDeps {\n entityService: AXPEntityService;\n questionnaireViewerService: AXMQuestionnaireViewerService;\n translationService: AXTranslationService;\n}\n\n/** Readonly session viewer entry step (default: questionnaire answers). */\nexport type OpenAssessmentSessionAnswersInitialStep = 'answers' | 'results';\n\nexport interface OpenAssessmentSessionAnswersViewOptions {\n initialStep?: OpenAssessmentSessionAnswersInitialStep;\n}\n\n//#endregion\n\n//#region ---- Viewer ----\n\n/**\n * Returns pre-built outcome results when the session has a non-empty stored outcomes snapshot.\n */\nasync function resolveStoredOutcomeResults(\n questionnaireViewerService: AXMQuestionnaireViewerService,\n session: AXMAssessmentManagementAssessmentSessionEntityModel,\n questionnaireId: string,\n): Promise<SummaryPlaceholderValues | null> {\n const storedOutcomes = defaultTo(get(session, 'outcomes') as Record<string, unknown> | undefined, {});\n if (isEmpty(storedOutcomes)) {\n return null;\n }\n\n const snapshot = await questionnaireViewerService.buildOutcomeResultsFromStoredValues(storedOutcomes, {\n questionnaireId,\n });\n\n const hasOutcomeSections = (snapshot.outcomeSections?.length ?? 0) > 0;\n const hasOutcomeValues = !isEmpty(snapshot.outcomes);\n if (!hasOutcomeSections && !hasOutcomeValues) {\n return null;\n }\n\n return snapshot;\n}\n\n/**\n * Opens a readonly questionnaire viewer dialog for the given assessment session.\n */\nexport async function openAssessmentSessionAnswersView(\n deps: OpenAssessmentSessionAnswersViewDeps,\n session: AXMAssessmentManagementAssessmentSessionEntityModel,\n assessmentCase: AXMAssessmentManagementAssessmentCaseEntityModel,\n options: OpenAssessmentSessionAnswersViewOptions = {},\n): Promise<void> {\n const initialStep = options.initialStep ?? 'answers';\n const questionnaireId = assessmentCase.questionnaireId;\n if (!questionnaireId) {\n throw new Error('Assessment case is missing questionnaireId');\n }\n\n const questionnaire = await deps.entityService\n .withEntity(RootConfig.module.name, RootConfig.entities.questionnaire.name)\n .data<string, AXMAssessmentManagementQuestionnaireEntityModel>()\n .byKey(questionnaireId);\n\n if (!questionnaire) {\n throw new Error(`Questionnaire with ID ${questionnaireId} not found`);\n }\n\n const sections = get(questionnaire, 'questions.sections');\n if (isEmpty(sections)) {\n throw new Error('Questionnaire has no questions to display');\n }\n\n const viewTitleKey =\n initialStep === 'results'\n ? '@assessment-management:sessions.actions.view-outcomes.title'\n : '@assessment-management:sessions.actions.view-answers.title';\n const viewTitleBase =\n (await deps.translationService.translateAsync(viewTitleKey)) ||\n (initialStep === 'results' ? 'View outcome results' : 'View Answers');\n const responderName = defaultTo(get(session, 'responder.displayName'), get(session, 'responderId'));\n const viewTitle = !isEmpty(responderName) ? `${viewTitleBase}: ${responderName}` : viewTitleBase;\n\n const questions = get(questionnaire, 'questions');\n const structure = {\n sections: defaultTo(get(questions, 'sections'), []),\n displaySettings: toDisplaySettings(questionnaire) ?? undefined,\n };\n\n const storedOutcomeResults = await resolveStoredOutcomeResults(\n deps.questionnaireViewerService,\n session,\n questionnaireId,\n );\n\n if (initialStep === 'results' && !storedOutcomeResults) {\n throw new Error('Assessment session has no displayable outcome results');\n }\n\n await deps.questionnaireViewerService.open({\n title: viewTitle,\n structure,\n config: {\n readonly: true,\n initialFlowStep: initialStep === 'results' ? 'results' : 'questions',\n },\n initialAnswers: defaultTo(get(session, 'answers'), {}),\n questionnaireId,\n storedOutcomeResults,\n });\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXPExecuteCommandResult } from '@acorex/platform/core';\nimport { AXPCommand } from '@acorex/platform/runtime';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { Injectable, inject } from '@angular/core';\nimport { AXPEntityService } from '@acorex/platform/layout/entity';\nimport { defaultTo, first, get, isEmpty, isString, toString } from 'lodash-es';\nimport { AXMQuestionnaireViewerService } from '../questionnaire-viewer.service';\nimport type { AXMAssessmentManagementAssessmentCaseEntityModel } from '../../../entities/assessment-case/assessment-case.types';\nimport type { AXMAssessmentManagementAssessmentSessionEntityModel } from '../../../entities/assessment-session/assessment-session.types';\nimport { RootConfig } from '../../../const';\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 `__context__.options` / row `data`. */\ntype ViewSessionAnswersCommandInvocation = ViewSessionAnswersCommandInput & {\n options?: Partial<ViewSessionAnswersCommandInput>;\n __context__?: {\n options?: Partial<ViewSessionAnswersCommandInput>;\n data?: Record<string, unknown>;\n };\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, '__context__.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, '__context__.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, '__context__.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, '__context__.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, '__context__.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, '__context__.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): Promise<AXPExecuteCommandResult<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 {\n success: true,\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 { z as AXMAssessmentManagementEntityProvider, B as AXMAssessmentManagementFeatureDefinitionProvider, C as AXMAssessmentManagementFeatureKeys, D as AXMAssessmentManagementMenuProvider, E as AXMAssessmentManagementModule, F as AXMAssessmentManagementPermissionDefinitionProvider, G as AXMAssessmentManagementPermissionKeys, H as AXMAssessmentManagementSearchCommandProvider, I as AXMQuestionnaireViewerPageComponent, A as AXMQuestionnaireViewerService, J as AXMQuestionnaireViewerStandalonePageComponent, K as AXPAssessmentManagementMenuKeys, L as DEFAULT_POST_QUESTIONNAIRE_CONFIG, M as DEFAULT_PRE_QUESTIONNAIRE_CONFIG, N as DEFAULT_QUESTIONNAIRE_ENTITY_DISPLAY, O as DEFAULT_QUESTION_COMMENT_CONFIG, P as DEFAULT_QUESTION_HINT_CONFIG, R as RootConfig, o as diffQuestionCommentOverride, l as diffQuestionHintOverride, Q as getQuestionAnswerCommentStoragePath, m as mergeQuestionCommentConfig, f as mergeQuestionHintForViewer, w as normalizeCompletionMode, n as normalizeQuestionCommentConfig, k as normalizeQuestionHintConfig, e as normalizeQuestionHintFromEntityRow, j as normalizeQuestionHintMode, S as normalizeValidationStrategy, T as normalizeViewMode, p as parseQuestionHintPartialFromRecord, U as readHintFieldsFromRecord, y as resolveWidgetNodeFromMetaDataDefinitionInterface, x as stripQuestionBankInterfaceMetadata, t as toDisplaySettings, q as toPrePostConfig } from './acorex-modules-assessment-management-acorex-modules-assessment-management-o8aFazwA.mjs';
1
+ export { f as AXMAssessmentManagementEntityProvider, g as AXMAssessmentManagementFeatureDefinitionProvider, h as AXMAssessmentManagementFeatureKeys, i as AXMAssessmentManagementMenuProvider, j as AXMAssessmentManagementModule, k as AXMAssessmentManagementPermissionDefinitionProvider, l as AXMAssessmentManagementPermissionKeys, m as AXMAssessmentManagementSearchCommandProvider, o as AXMQuestionnaireViewerPageComponent, A as AXMQuestionnaireViewerService, q as AXMQuestionnaireViewerStandalonePageComponent, u as AXPAssessmentManagementMenuKeys, D as DEFAULT_POST_QUESTIONNAIRE_CONFIG, v as DEFAULT_PRE_QUESTIONNAIRE_CONFIG, w as DEFAULT_QUESTIONNAIRE_ENTITY_DISPLAY, x as DEFAULT_QUESTIONNAIRE_OUTCOMES, y as DEFAULT_QUESTION_COMMENT_CONFIG, z as DEFAULT_QUESTION_HINT_CONFIG, R as RootConfig, B as diffQuestionCommentOverride, C as diffQuestionHintOverride, E as findDuplicateOutcomeNames, F as flattenQuestionnaireOutcomeItems, G as getQuestionAnswerCommentStoragePath, H as isQuestionnaireOutcomeDisplayColorHex, I as matchesQuestionnaireOutcomeDisplayRule, J as mergeQuestionCommentConfig, K as mergeQuestionHintForViewer, n as normalizeCompletionMode, L as normalizeQuestionCommentConfig, M as normalizeQuestionHintConfig, N as normalizeQuestionHintFromEntityRow, O as normalizeQuestionHintMode, P as normalizeQuestionnaireOutcomeDisplayRules, S as normalizeQuestionnaireOutcomesValue, T as normalizeValidationStrategy, U as normalizeViewMode, V as parseQuestionHintPartialFromRecord, W as parseQuestionnaireOutcomeDisplayColor, X as readHintFieldsFromRecord, r as resolveWidgetNodeFromMetaDataDefinitionInterface, s as stripQuestionBankInterfaceMetadata, e as toDisplaySettings, t as toPrePostConfig } from './acorex-modules-assessment-management-acorex-modules-assessment-management-DqmJVJ0z.mjs';
2
2
  //# sourceMappingURL=acorex-modules-assessment-management.mjs.map
@@ -142,6 +142,7 @@ const AXPWidgetsList = {
142
142
  Advanced: {
143
143
  CodeEditor: 'code-editor',
144
144
  JsonViewer: 'json-viewer',
145
+ OutcomeResultsViewer: 'outcome-results-viewer',
145
146
  QRCode: 'qrcode',
146
147
  schedulerPicker: 'scheduler-picker',
147
148
  Signature: 'signature',
@@ -2557,7 +2558,6 @@ const colorPlugin = {
2557
2558
  ctx.columns.add({
2558
2559
  name: 'color',
2559
2560
  title: '@general:terms.common.color',
2560
- sort: { enabled: false },
2561
2561
  options: {
2562
2562
  visible: options?.column?.visible ?? true,
2563
2563
  width: `${options?.column?.width ?? 120}px`,
@@ -4377,7 +4377,6 @@ const iconPlugin = {
4377
4377
  ctx.columns.add({
4378
4378
  name: 'icon',
4379
4379
  title: '@general:terms.common.icon',
4380
- sort: { enabled: false },
4381
4380
  options: {
4382
4381
  visible: options?.column?.visible ?? false,
4383
4382
  width: `${options?.column?.width ?? 120}px`,
@@ -4759,9 +4758,6 @@ const namePlugin = {
4759
4758
  width: '200px',
4760
4759
  visible: true,
4761
4760
  },
4762
- sort: {
4763
- enabled: true,
4764
- },
4765
4761
  });
4766
4762
  }
4767
4763
  }
@@ -5551,9 +5547,6 @@ const titlePlugin = {
5551
5547
  width: '200px',
5552
5548
  visible: true,
5553
5549
  },
5554
- sort: {
5555
- enabled: true,
5556
- },
5557
5550
  });
5558
5551
  }
5559
5552
  }