@quesmed/types 2.6.234 → 2.6.236
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/dist/cjs/models/Blog.d.ts +2 -1
- package/dist/cjs/models/Blog.js +1 -0
- package/dist/cjs/models/Question.d.ts +1 -1
- package/dist/cjs/resolvers/fragments/index.d.ts +0 -2
- package/dist/cjs/resolvers/fragments/index.js +0 -2
- package/dist/cjs/resolvers/mutation/admin/index.d.ts +0 -4
- package/dist/cjs/resolvers/mutation/admin/index.js +0 -4
- package/dist/cjs/resolvers/mutation/restricted/marksheet.js +85 -31
- package/dist/cjs/resolvers/mutation/restricted/questionDiscussion.js +1 -1
- package/dist/cjs/resolvers/mutation/restricted/users.d.ts +1 -0
- package/dist/cjs/resolvers/mutation/restricted/users.js +20 -1
- package/dist/cjs/resolvers/query/admin/index.d.ts +0 -2
- package/dist/cjs/resolvers/query/admin/index.js +0 -2
- package/dist/cjs/resolvers/query/restricted/marksheet.d.ts +6 -0
- package/dist/cjs/resolvers/query/restricted/marksheet.js +22 -1
- package/dist/cjs/utils/evaluateMark.js +1 -1
- package/dist/mjs/models/Blog.d.ts +2 -1
- package/dist/mjs/models/Blog.js +1 -0
- package/dist/mjs/models/Question.d.ts +1 -1
- package/dist/mjs/resolvers/fragments/index.d.ts +0 -2
- package/dist/mjs/resolvers/fragments/index.js +0 -2
- package/dist/mjs/resolvers/mutation/admin/index.d.ts +0 -4
- package/dist/mjs/resolvers/mutation/admin/index.js +0 -4
- package/dist/mjs/resolvers/mutation/restricted/marksheet.js +85 -31
- package/dist/mjs/resolvers/mutation/restricted/questionDiscussion.js +1 -1
- package/dist/mjs/resolvers/mutation/restricted/users.d.ts +1 -0
- package/dist/mjs/resolvers/mutation/restricted/users.js +18 -0
- package/dist/mjs/resolvers/query/admin/index.d.ts +0 -2
- package/dist/mjs/resolvers/query/admin/index.js +0 -2
- package/dist/mjs/resolvers/query/restricted/marksheet.d.ts +6 -0
- package/dist/mjs/resolvers/query/restricted/marksheet.js +21 -0
- package/dist/mjs/utils/evaluateMark.js +1 -1
- package/package.json +1 -1
- package/dist/cjs/resolvers/fragments/job.d.ts +0 -10
- package/dist/cjs/resolvers/fragments/job.js +0 -191
- package/dist/cjs/resolvers/fragments/record.d.ts +0 -10
- package/dist/cjs/resolvers/fragments/record.js +0 -187
- package/dist/cjs/resolvers/mutation/admin/assets.d.ts +0 -44
- package/dist/cjs/resolvers/mutation/admin/assets.js +0 -39
- package/dist/cjs/resolvers/mutation/admin/job.d.ts +0 -75
- package/dist/cjs/resolvers/mutation/admin/job.js +0 -102
- package/dist/cjs/resolvers/mutation/admin/question.d.ts +0 -41
- package/dist/cjs/resolvers/mutation/admin/question.js +0 -34
- package/dist/cjs/resolvers/mutation/admin/record.d.ts +0 -52
- package/dist/cjs/resolvers/mutation/admin/record.js +0 -62
- package/dist/cjs/resolvers/query/admin/job.d.ts +0 -46
- package/dist/cjs/resolvers/query/admin/job.js +0 -56
- package/dist/cjs/resolvers/query/admin/record.d.ts +0 -25
- package/dist/cjs/resolvers/query/admin/record.js +0 -35
- package/dist/mjs/resolvers/fragments/job.d.ts +0 -10
- package/dist/mjs/resolvers/fragments/job.js +0 -188
- package/dist/mjs/resolvers/fragments/record.d.ts +0 -10
- package/dist/mjs/resolvers/fragments/record.js +0 -184
- package/dist/mjs/resolvers/mutation/admin/assets.d.ts +0 -44
- package/dist/mjs/resolvers/mutation/admin/assets.js +0 -36
- package/dist/mjs/resolvers/mutation/admin/job.d.ts +0 -75
- package/dist/mjs/resolvers/mutation/admin/job.js +0 -99
- package/dist/mjs/resolvers/mutation/admin/question.d.ts +0 -41
- package/dist/mjs/resolvers/mutation/admin/question.js +0 -31
- package/dist/mjs/resolvers/mutation/admin/record.d.ts +0 -52
- package/dist/mjs/resolvers/mutation/admin/record.js +0 -59
- package/dist/mjs/resolvers/query/admin/job.d.ts +0 -46
- package/dist/mjs/resolvers/query/admin/job.js +0 -53
- package/dist/mjs/resolvers/query/admin/record.d.ts +0 -25
- package/dist/mjs/resolvers/query/admin/record.js +0 -32
package/dist/cjs/models/Blog.js
CHANGED
|
@@ -204,7 +204,7 @@ export interface IQuestionRanking extends IQuestion {
|
|
|
204
204
|
}
|
|
205
205
|
export interface IQuestionSjtTwoAnswer extends IQuestion {
|
|
206
206
|
answer: [string, string];
|
|
207
|
-
|
|
207
|
+
sbaAnswer: [string, string];
|
|
208
208
|
}
|
|
209
209
|
export interface IQuestionPrescribe extends IQuestion {
|
|
210
210
|
answer: IPrescribeAnswer[];
|
|
@@ -2,13 +2,11 @@ export * from './blog';
|
|
|
2
2
|
export * from './chapter';
|
|
3
3
|
export * from './concept';
|
|
4
4
|
export * from './highlight';
|
|
5
|
-
export * from './job';
|
|
6
5
|
export * from './marksheet';
|
|
7
6
|
export * from './mockTest';
|
|
8
7
|
export * from './osce';
|
|
9
8
|
export * from './picture';
|
|
10
9
|
export * from './question';
|
|
11
|
-
export * from './record';
|
|
12
10
|
export * from './topic';
|
|
13
11
|
export * from './user';
|
|
14
12
|
export * from './video';
|
|
@@ -18,13 +18,11 @@ __exportStar(require("./blog"), exports);
|
|
|
18
18
|
__exportStar(require("./chapter"), exports);
|
|
19
19
|
__exportStar(require("./concept"), exports);
|
|
20
20
|
__exportStar(require("./highlight"), exports);
|
|
21
|
-
__exportStar(require("./job"), exports);
|
|
22
21
|
__exportStar(require("./marksheet"), exports);
|
|
23
22
|
__exportStar(require("./mockTest"), exports);
|
|
24
23
|
__exportStar(require("./osce"), exports);
|
|
25
24
|
__exportStar(require("./picture"), exports);
|
|
26
25
|
__exportStar(require("./question"), exports);
|
|
27
|
-
__exportStar(require("./record"), exports);
|
|
28
26
|
__exportStar(require("./topic"), exports);
|
|
29
27
|
__exportStar(require("./user"), exports);
|
|
30
28
|
__exportStar(require("./video"), exports);
|
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
export * from './ai';
|
|
2
2
|
export * from './algoliaSync';
|
|
3
|
-
export * from './assets';
|
|
4
3
|
export * from './chapter';
|
|
5
4
|
export * from './content';
|
|
6
5
|
export * from './database';
|
|
7
|
-
export * from './job';
|
|
8
6
|
export * from './notification';
|
|
9
|
-
export * from './question';
|
|
10
|
-
export * from './record';
|
|
11
7
|
export * from './token';
|
|
@@ -16,12 +16,8 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
__exportStar(require("./ai"), exports);
|
|
18
18
|
__exportStar(require("./algoliaSync"), exports);
|
|
19
|
-
__exportStar(require("./assets"), exports);
|
|
20
19
|
__exportStar(require("./chapter"), exports);
|
|
21
20
|
__exportStar(require("./content"), exports);
|
|
22
21
|
__exportStar(require("./database"), exports);
|
|
23
|
-
__exportStar(require("./job"), exports);
|
|
24
22
|
__exportStar(require("./notification"), exports);
|
|
25
|
-
__exportStar(require("./question"), exports);
|
|
26
|
-
__exportStar(require("./record"), exports);
|
|
27
23
|
__exportStar(require("./token"), exports);
|
|
@@ -81,10 +81,39 @@ exports.SAVE_MARKSHEET = (0, client_1.gql) `
|
|
|
81
81
|
flagged
|
|
82
82
|
mark
|
|
83
83
|
}
|
|
84
|
+
sections {
|
|
85
|
+
entitlementId
|
|
86
|
+
marks {
|
|
87
|
+
isAnswered
|
|
88
|
+
isInDailyStack
|
|
89
|
+
result
|
|
90
|
+
score
|
|
91
|
+
id
|
|
92
|
+
marksheetId
|
|
93
|
+
questionChoiceId
|
|
94
|
+
timeTaken
|
|
95
|
+
flagged
|
|
96
|
+
mark
|
|
97
|
+
}
|
|
98
|
+
}
|
|
84
99
|
}
|
|
85
100
|
}
|
|
86
101
|
}
|
|
87
102
|
`;
|
|
103
|
+
function getMarksFromMarksheet(marksheets, marksheetId) {
|
|
104
|
+
const marksheet = marksheets.find((m) => Number(m.id) === Number(marksheetId));
|
|
105
|
+
if (!marksheet)
|
|
106
|
+
return [];
|
|
107
|
+
// Case 1: direct marks
|
|
108
|
+
if (Array.isArray(marksheet.marks) && marksheet.marks.length > 0) {
|
|
109
|
+
return marksheet.marks;
|
|
110
|
+
}
|
|
111
|
+
// Case 2: nested sections → flatten marks
|
|
112
|
+
if (Array.isArray(marksheet.sections)) {
|
|
113
|
+
return marksheet.sections.flatMap((section) => section.marks || []);
|
|
114
|
+
}
|
|
115
|
+
return [];
|
|
116
|
+
}
|
|
88
117
|
const updateMarksheets = (cache, result, options) => {
|
|
89
118
|
const { saveMarksheets } = result?.data?.restricted || {};
|
|
90
119
|
const { variables } = options || {};
|
|
@@ -95,7 +124,7 @@ const updateMarksheets = (cache, result, options) => {
|
|
|
95
124
|
const { input } = variables;
|
|
96
125
|
for (let i = 0; i < input.length; i++) {
|
|
97
126
|
const inputData = input[i];
|
|
98
|
-
const savedMarks = saveMarksheets
|
|
127
|
+
const savedMarks = getMarksFromMarksheet(saveMarksheets, inputData.marksheetId);
|
|
99
128
|
const savedData = savedMarks?.find((m) => m.id === inputData.markId);
|
|
100
129
|
cache.writeFragment({
|
|
101
130
|
id: cache.identify({
|
|
@@ -121,43 +150,68 @@ const updateMarksheets = (cache, result, options) => {
|
|
|
121
150
|
exports.updateMarksheets = updateMarksheets;
|
|
122
151
|
const optimisticSaveMarksheets = (marksheet, marksheetInput, questionIndex) => {
|
|
123
152
|
const { timeTaken, choiceId, mark, marksheetId, markId } = marksheetInput;
|
|
124
|
-
const { marks = [], ...rest } = marksheet || {};
|
|
125
|
-
const
|
|
126
|
-
|
|
153
|
+
const { marks = [], sections = [], ...rest } = marksheet || {};
|
|
154
|
+
const updateMarksArray = (marksArr) => {
|
|
155
|
+
const currentMark = marksArr.find((m) => Number(m.id) === Number(markId));
|
|
156
|
+
if (!currentMark)
|
|
157
|
+
return marksArr;
|
|
158
|
+
const { psaSectionId, choices, typeId } = currentMark.question;
|
|
159
|
+
const { answerField } = (0, utils_1.getQuestionInfo)(typeId, psaSectionId);
|
|
160
|
+
const answer = currentMark.question[answerField];
|
|
161
|
+
const { result, score } = (0, utils_1.evaluateMark)({
|
|
162
|
+
mark: mark || '',
|
|
163
|
+
answer,
|
|
164
|
+
psaSectionId,
|
|
165
|
+
questionTypeId: typeId,
|
|
166
|
+
choices,
|
|
167
|
+
});
|
|
168
|
+
const updatedMark = {
|
|
169
|
+
...marksArr[questionIndex],
|
|
170
|
+
marksheetId,
|
|
171
|
+
timeTaken,
|
|
172
|
+
questionChoiceId: choiceId ?? null,
|
|
173
|
+
isAnswered: true,
|
|
174
|
+
mark: mark || null,
|
|
175
|
+
result,
|
|
176
|
+
score,
|
|
177
|
+
};
|
|
178
|
+
return [
|
|
179
|
+
...marksArr.slice(0, questionIndex),
|
|
180
|
+
updatedMark,
|
|
181
|
+
...marksArr.slice(questionIndex + 1),
|
|
182
|
+
];
|
|
183
|
+
};
|
|
184
|
+
// Case 1: marks
|
|
185
|
+
if (marks.length > 0) {
|
|
127
186
|
return {
|
|
128
187
|
restricted: {
|
|
129
|
-
saveMarksheets: [{ ...rest, marks }],
|
|
188
|
+
saveMarksheets: [{ ...rest, marks: updateMarksArray(marks), sections }],
|
|
130
189
|
},
|
|
131
190
|
};
|
|
132
191
|
}
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
const updatedMarks = [
|
|
154
|
-
...marks.slice(0, questionIndex),
|
|
155
|
-
updatedMark,
|
|
156
|
-
...marks.slice(questionIndex + 1),
|
|
157
|
-
];
|
|
192
|
+
// Case 2: sections
|
|
193
|
+
if (sections.length > 0) {
|
|
194
|
+
const updatedSections = sections.map((section) => {
|
|
195
|
+
if (!Array.isArray(section.marks))
|
|
196
|
+
return section;
|
|
197
|
+
const hasMark = section.marks.some((m) => Number(m.id) === Number(markId));
|
|
198
|
+
if (!hasMark)
|
|
199
|
+
return section;
|
|
200
|
+
return {
|
|
201
|
+
...section,
|
|
202
|
+
marks: updateMarksArray(section.marks),
|
|
203
|
+
};
|
|
204
|
+
});
|
|
205
|
+
return {
|
|
206
|
+
restricted: {
|
|
207
|
+
saveMarksheets: [{ ...rest, sections: updatedSections, marks }],
|
|
208
|
+
},
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
// fallback
|
|
158
212
|
return {
|
|
159
213
|
restricted: {
|
|
160
|
-
saveMarksheets: [{ ...rest, marks
|
|
214
|
+
saveMarksheets: [{ ...rest, marks, sections }],
|
|
161
215
|
},
|
|
162
216
|
};
|
|
163
217
|
};
|
|
@@ -46,7 +46,7 @@ const getQuestionTypeName = (typeId) => {
|
|
|
46
46
|
[models_1.EQuestionType.DECISION_MAKING_SBA]: 'QuestionSBA',
|
|
47
47
|
[models_1.EQuestionType.DECISION_MAKING_YES_NO]: 'QuestionMultiA',
|
|
48
48
|
[models_1.EQuestionType.SJT_SINGLE_CHOICE]: 'QuestionSBA',
|
|
49
|
-
[models_1.EQuestionType.SJT_TWO_ANSWERS]: '
|
|
49
|
+
[models_1.EQuestionType.SJT_TWO_ANSWERS]: 'QuestionSBA',
|
|
50
50
|
};
|
|
51
51
|
return mappedObj[typeId] ?? 'QuestionSBA';
|
|
52
52
|
};
|
|
@@ -63,6 +63,7 @@ export type IRenewTokenData = RestrictedData<string, 'renewToken'>;
|
|
|
63
63
|
export declare const TOC_ACCEPT: import("@apollo/client").DocumentNode;
|
|
64
64
|
export type ITocAcceptVar = null;
|
|
65
65
|
export type ITocAcceptData = RestrictedData<string, 'tocAccept'>;
|
|
66
|
+
export declare const updateCacheOnTocAccept: (userId: Id) => (cache: ApolloCache<any>, _result: ApolloUpdateResultRestricted<ITocAcceptData>, _options?: ApolloUpdateOptions<ITocAcceptVar>) => void;
|
|
66
67
|
export type ICompletedCardsData = Pick<IUser, 'completedCards' | 'completedCardsCount'>;
|
|
67
68
|
export type IUpsertUserConceptStatusVar = {
|
|
68
69
|
conceptIds: Id[];
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.optimisticVideoLearningStatus = exports.updateCacheOnVideoLearningStatusUpdate = exports.UPSERT_USER_VIDEO_STATUS = exports.optimisticStationLearningStatus = exports.updateCacheOnStationLearningStatusUpdate = exports.UPSERT_USER_STATION_STATUS = exports.optimisticConceptLearningStatus = exports.updateCacheOnConceptLearningStatusUpdate = exports.UPSERT_USER_CONCEPT_STATUS = exports.TOC_ACCEPT = exports.RENEW_TOKEN = exports.updateCacheOnUpdateUserSettings = exports.optimisticUpdateUserSettings = exports.optimisticAddProductFeedback = exports.ADD_PRODUCT_FEEDBACK = exports.UPDATE_USER_SETTINGS = exports.UPDATE_USER = exports.DELETE_USER = exports.RESET_CATEGORY_PROGRESS = exports.RESET_PROGRESS = exports.LOGOUT_USER = void 0;
|
|
3
|
+
exports.optimisticVideoLearningStatus = exports.updateCacheOnVideoLearningStatusUpdate = exports.UPSERT_USER_VIDEO_STATUS = exports.optimisticStationLearningStatus = exports.updateCacheOnStationLearningStatusUpdate = exports.UPSERT_USER_STATION_STATUS = exports.optimisticConceptLearningStatus = exports.updateCacheOnConceptLearningStatusUpdate = exports.UPSERT_USER_CONCEPT_STATUS = exports.updateCacheOnTocAccept = exports.TOC_ACCEPT = exports.RENEW_TOKEN = exports.updateCacheOnUpdateUserSettings = exports.optimisticUpdateUserSettings = exports.optimisticAddProductFeedback = exports.ADD_PRODUCT_FEEDBACK = exports.UPDATE_USER_SETTINGS = exports.UPDATE_USER = exports.DELETE_USER = exports.RESET_CATEGORY_PROGRESS = exports.RESET_PROGRESS = exports.LOGOUT_USER = void 0;
|
|
4
4
|
const client_1 = require("@apollo/client");
|
|
5
5
|
const models_1 = require("../../../models");
|
|
6
6
|
const utils_1 = require("../../../utils");
|
|
@@ -159,6 +159,25 @@ exports.TOC_ACCEPT = (0, client_1.gql) `
|
|
|
159
159
|
}
|
|
160
160
|
}
|
|
161
161
|
`;
|
|
162
|
+
const TOC_ACCEPTED_FRAGMENT = (0, client_1.gql) `
|
|
163
|
+
fragment TocAcceptedFragment on User {
|
|
164
|
+
tocAccepted
|
|
165
|
+
}
|
|
166
|
+
`;
|
|
167
|
+
const updateCacheOnTocAccept = (userId) => (cache, _result, _options) => {
|
|
168
|
+
if (!userId) {
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
cache.writeFragment({
|
|
172
|
+
id: cache.identify({ id: userId, __typename: 'User' }),
|
|
173
|
+
data: {
|
|
174
|
+
tocAccepted: true,
|
|
175
|
+
},
|
|
176
|
+
fragment: TOC_ACCEPTED_FRAGMENT,
|
|
177
|
+
fragmentName: 'TocAcceptedFragment',
|
|
178
|
+
});
|
|
179
|
+
};
|
|
180
|
+
exports.updateCacheOnTocAccept = updateCacheOnTocAccept;
|
|
162
181
|
exports.UPSERT_USER_CONCEPT_STATUS = (0, client_1.gql) `
|
|
163
182
|
mutation UpsertUserConceptStatus($conceptIds: [Int!]!, $status: Int!) {
|
|
164
183
|
restricted {
|
|
@@ -18,5 +18,3 @@ __exportStar(require("./chapter"), exports);
|
|
|
18
18
|
__exportStar(require("./dashboard"), exports);
|
|
19
19
|
__exportStar(require("./database"), exports);
|
|
20
20
|
__exportStar(require("./getUserToken"), exports);
|
|
21
|
-
__exportStar(require("./job"), exports);
|
|
22
|
-
__exportStar(require("./record"), exports);
|
|
@@ -32,8 +32,14 @@ export interface IMarksheetsVar {
|
|
|
32
32
|
order?: ESortOrder;
|
|
33
33
|
lastId?: number;
|
|
34
34
|
solo?: boolean;
|
|
35
|
+
mockTestId?: number;
|
|
35
36
|
};
|
|
36
37
|
}
|
|
38
|
+
export type IMarksheetList = RestrictedData<graphqlNormalize & {
|
|
39
|
+
results: IMarksheet[];
|
|
40
|
+
total: number;
|
|
41
|
+
}, 'marksheetList'>;
|
|
42
|
+
export declare const MARKSHEET_LIST: import("@apollo/client").DocumentNode;
|
|
37
43
|
export type IMarksheetsData = RestrictedData<{
|
|
38
44
|
results: (graphqlNormalize & IMarksheet)[];
|
|
39
45
|
total: number;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.PRE_BUILD_MARKSHEET = exports.HEARTBEAT_QBANK = exports.MARKSHEET_FEEDBACK = exports.FLAGGED_QUESTIONS_MARKSHEET = exports.FLAGGED_QUESTIONS = exports.LATEST_PAST_SESSION_ID = exports.LATEST_PAST_MARKSHEET_ID = exports.MARKSHEETS_TRACKER = exports.MARKSHEETS = exports.MARKSHEETS_WINDOW = exports.MARKSHEET = void 0;
|
|
3
|
+
exports.PRE_BUILD_MARKSHEET = exports.HEARTBEAT_QBANK = exports.MARKSHEET_FEEDBACK = exports.FLAGGED_QUESTIONS_MARKSHEET = exports.FLAGGED_QUESTIONS = exports.LATEST_PAST_SESSION_ID = exports.LATEST_PAST_MARKSHEET_ID = exports.MARKSHEETS_TRACKER = exports.MARKSHEETS = exports.MARKSHEET_LIST = exports.MARKSHEETS_WINDOW = exports.MARKSHEET = void 0;
|
|
4
4
|
const client_1 = require("@apollo/client");
|
|
5
5
|
const marksheet_1 = require("../../fragments/marksheet");
|
|
6
6
|
exports.MARKSHEET = (0, client_1.gql) `
|
|
@@ -48,6 +48,27 @@ exports.MARKSHEETS_WINDOW = (0, client_1.gql) `
|
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
50
|
`;
|
|
51
|
+
exports.MARKSHEET_LIST = (0, client_1.gql) `
|
|
52
|
+
${marksheet_1.MARKSHEET_STATS_FIELDS}
|
|
53
|
+
query MarksheetList($options: MarksheetOptions!) {
|
|
54
|
+
restricted {
|
|
55
|
+
marksheetList(options: $options) {
|
|
56
|
+
results {
|
|
57
|
+
id
|
|
58
|
+
endedAt
|
|
59
|
+
stats {
|
|
60
|
+
...MarksheetStatsFields
|
|
61
|
+
}
|
|
62
|
+
isTestMarksheet
|
|
63
|
+
solo
|
|
64
|
+
completed
|
|
65
|
+
updatedAt
|
|
66
|
+
}
|
|
67
|
+
total
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
`;
|
|
51
72
|
exports.MARKSHEETS = (0, client_1.gql) `
|
|
52
73
|
${marksheet_1.MARKSHEET_STATS_FIELDS}
|
|
53
74
|
query Marksheets($filter: MarksheetFilterInput!) {
|
|
@@ -81,7 +81,7 @@ function getQuestionInfo(questionType, psaSectionId) {
|
|
|
81
81
|
case models_1.EQuestionType.SJT_SINGLE_CHOICE:
|
|
82
82
|
return { maxScore: 1, answerField: 'sbaAnswer' };
|
|
83
83
|
case models_1.EQuestionType.SJT_TWO_ANSWERS:
|
|
84
|
-
return { maxScore: 1, answerField: '
|
|
84
|
+
return { maxScore: 1, answerField: 'sbaAnswer' };
|
|
85
85
|
default:
|
|
86
86
|
return { maxScore: 1, answerField: 'answer' };
|
|
87
87
|
}
|
package/dist/mjs/models/Blog.js
CHANGED
|
@@ -204,7 +204,7 @@ export interface IQuestionRanking extends IQuestion {
|
|
|
204
204
|
}
|
|
205
205
|
export interface IQuestionSjtTwoAnswer extends IQuestion {
|
|
206
206
|
answer: [string, string];
|
|
207
|
-
|
|
207
|
+
sbaAnswer: [string, string];
|
|
208
208
|
}
|
|
209
209
|
export interface IQuestionPrescribe extends IQuestion {
|
|
210
210
|
answer: IPrescribeAnswer[];
|
|
@@ -2,13 +2,11 @@ export * from './blog';
|
|
|
2
2
|
export * from './chapter';
|
|
3
3
|
export * from './concept';
|
|
4
4
|
export * from './highlight';
|
|
5
|
-
export * from './job';
|
|
6
5
|
export * from './marksheet';
|
|
7
6
|
export * from './mockTest';
|
|
8
7
|
export * from './osce';
|
|
9
8
|
export * from './picture';
|
|
10
9
|
export * from './question';
|
|
11
|
-
export * from './record';
|
|
12
10
|
export * from './topic';
|
|
13
11
|
export * from './user';
|
|
14
12
|
export * from './video';
|
|
@@ -2,13 +2,11 @@ export * from './blog';
|
|
|
2
2
|
export * from './chapter';
|
|
3
3
|
export * from './concept';
|
|
4
4
|
export * from './highlight';
|
|
5
|
-
export * from './job';
|
|
6
5
|
export * from './marksheet';
|
|
7
6
|
export * from './mockTest';
|
|
8
7
|
export * from './osce';
|
|
9
8
|
export * from './picture';
|
|
10
9
|
export * from './question';
|
|
11
|
-
export * from './record';
|
|
12
10
|
export * from './topic';
|
|
13
11
|
export * from './user';
|
|
14
12
|
export * from './video';
|
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
export * from './ai';
|
|
2
2
|
export * from './algoliaSync';
|
|
3
|
-
export * from './assets';
|
|
4
3
|
export * from './chapter';
|
|
5
4
|
export * from './content';
|
|
6
5
|
export * from './database';
|
|
7
|
-
export * from './job';
|
|
8
6
|
export * from './notification';
|
|
9
|
-
export * from './question';
|
|
10
|
-
export * from './record';
|
|
11
7
|
export * from './token';
|
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
export * from './ai';
|
|
2
2
|
export * from './algoliaSync';
|
|
3
|
-
export * from './assets';
|
|
4
3
|
export * from './chapter';
|
|
5
4
|
export * from './content';
|
|
6
5
|
export * from './database';
|
|
7
|
-
export * from './job';
|
|
8
6
|
export * from './notification';
|
|
9
|
-
export * from './question';
|
|
10
|
-
export * from './record';
|
|
11
7
|
export * from './token';
|
|
@@ -78,10 +78,39 @@ export const SAVE_MARKSHEET = gql `
|
|
|
78
78
|
flagged
|
|
79
79
|
mark
|
|
80
80
|
}
|
|
81
|
+
sections {
|
|
82
|
+
entitlementId
|
|
83
|
+
marks {
|
|
84
|
+
isAnswered
|
|
85
|
+
isInDailyStack
|
|
86
|
+
result
|
|
87
|
+
score
|
|
88
|
+
id
|
|
89
|
+
marksheetId
|
|
90
|
+
questionChoiceId
|
|
91
|
+
timeTaken
|
|
92
|
+
flagged
|
|
93
|
+
mark
|
|
94
|
+
}
|
|
95
|
+
}
|
|
81
96
|
}
|
|
82
97
|
}
|
|
83
98
|
}
|
|
84
99
|
`;
|
|
100
|
+
function getMarksFromMarksheet(marksheets, marksheetId) {
|
|
101
|
+
const marksheet = marksheets.find((m) => Number(m.id) === Number(marksheetId));
|
|
102
|
+
if (!marksheet)
|
|
103
|
+
return [];
|
|
104
|
+
// Case 1: direct marks
|
|
105
|
+
if (Array.isArray(marksheet.marks) && marksheet.marks.length > 0) {
|
|
106
|
+
return marksheet.marks;
|
|
107
|
+
}
|
|
108
|
+
// Case 2: nested sections → flatten marks
|
|
109
|
+
if (Array.isArray(marksheet.sections)) {
|
|
110
|
+
return marksheet.sections.flatMap((section) => section.marks || []);
|
|
111
|
+
}
|
|
112
|
+
return [];
|
|
113
|
+
}
|
|
85
114
|
export const updateMarksheets = (cache, result, options) => {
|
|
86
115
|
const { saveMarksheets } = result?.data?.restricted || {};
|
|
87
116
|
const { variables } = options || {};
|
|
@@ -92,7 +121,7 @@ export const updateMarksheets = (cache, result, options) => {
|
|
|
92
121
|
const { input } = variables;
|
|
93
122
|
for (let i = 0; i < input.length; i++) {
|
|
94
123
|
const inputData = input[i];
|
|
95
|
-
const savedMarks = saveMarksheets
|
|
124
|
+
const savedMarks = getMarksFromMarksheet(saveMarksheets, inputData.marksheetId);
|
|
96
125
|
const savedData = savedMarks?.find((m) => m.id === inputData.markId);
|
|
97
126
|
cache.writeFragment({
|
|
98
127
|
id: cache.identify({
|
|
@@ -117,43 +146,68 @@ export const updateMarksheets = (cache, result, options) => {
|
|
|
117
146
|
};
|
|
118
147
|
export const optimisticSaveMarksheets = (marksheet, marksheetInput, questionIndex) => {
|
|
119
148
|
const { timeTaken, choiceId, mark, marksheetId, markId } = marksheetInput;
|
|
120
|
-
const { marks = [], ...rest } = marksheet || {};
|
|
121
|
-
const
|
|
122
|
-
|
|
149
|
+
const { marks = [], sections = [], ...rest } = marksheet || {};
|
|
150
|
+
const updateMarksArray = (marksArr) => {
|
|
151
|
+
const currentMark = marksArr.find((m) => Number(m.id) === Number(markId));
|
|
152
|
+
if (!currentMark)
|
|
153
|
+
return marksArr;
|
|
154
|
+
const { psaSectionId, choices, typeId } = currentMark.question;
|
|
155
|
+
const { answerField } = getQuestionInfo(typeId, psaSectionId);
|
|
156
|
+
const answer = currentMark.question[answerField];
|
|
157
|
+
const { result, score } = evaluateMark({
|
|
158
|
+
mark: mark || '',
|
|
159
|
+
answer,
|
|
160
|
+
psaSectionId,
|
|
161
|
+
questionTypeId: typeId,
|
|
162
|
+
choices,
|
|
163
|
+
});
|
|
164
|
+
const updatedMark = {
|
|
165
|
+
...marksArr[questionIndex],
|
|
166
|
+
marksheetId,
|
|
167
|
+
timeTaken,
|
|
168
|
+
questionChoiceId: choiceId ?? null,
|
|
169
|
+
isAnswered: true,
|
|
170
|
+
mark: mark || null,
|
|
171
|
+
result,
|
|
172
|
+
score,
|
|
173
|
+
};
|
|
174
|
+
return [
|
|
175
|
+
...marksArr.slice(0, questionIndex),
|
|
176
|
+
updatedMark,
|
|
177
|
+
...marksArr.slice(questionIndex + 1),
|
|
178
|
+
];
|
|
179
|
+
};
|
|
180
|
+
// Case 1: marks
|
|
181
|
+
if (marks.length > 0) {
|
|
123
182
|
return {
|
|
124
183
|
restricted: {
|
|
125
|
-
saveMarksheets: [{ ...rest, marks }],
|
|
184
|
+
saveMarksheets: [{ ...rest, marks: updateMarksArray(marks), sections }],
|
|
126
185
|
},
|
|
127
186
|
};
|
|
128
187
|
}
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
const updatedMarks = [
|
|
150
|
-
...marks.slice(0, questionIndex),
|
|
151
|
-
updatedMark,
|
|
152
|
-
...marks.slice(questionIndex + 1),
|
|
153
|
-
];
|
|
188
|
+
// Case 2: sections
|
|
189
|
+
if (sections.length > 0) {
|
|
190
|
+
const updatedSections = sections.map((section) => {
|
|
191
|
+
if (!Array.isArray(section.marks))
|
|
192
|
+
return section;
|
|
193
|
+
const hasMark = section.marks.some((m) => Number(m.id) === Number(markId));
|
|
194
|
+
if (!hasMark)
|
|
195
|
+
return section;
|
|
196
|
+
return {
|
|
197
|
+
...section,
|
|
198
|
+
marks: updateMarksArray(section.marks),
|
|
199
|
+
};
|
|
200
|
+
});
|
|
201
|
+
return {
|
|
202
|
+
restricted: {
|
|
203
|
+
saveMarksheets: [{ ...rest, sections: updatedSections, marks }],
|
|
204
|
+
},
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
// fallback
|
|
154
208
|
return {
|
|
155
209
|
restricted: {
|
|
156
|
-
saveMarksheets: [{ ...rest, marks
|
|
210
|
+
saveMarksheets: [{ ...rest, marks, sections }],
|
|
157
211
|
},
|
|
158
212
|
};
|
|
159
213
|
};
|
|
@@ -42,7 +42,7 @@ export const getQuestionTypeName = (typeId) => {
|
|
|
42
42
|
[EQuestionType.DECISION_MAKING_SBA]: 'QuestionSBA',
|
|
43
43
|
[EQuestionType.DECISION_MAKING_YES_NO]: 'QuestionMultiA',
|
|
44
44
|
[EQuestionType.SJT_SINGLE_CHOICE]: 'QuestionSBA',
|
|
45
|
-
[EQuestionType.SJT_TWO_ANSWERS]: '
|
|
45
|
+
[EQuestionType.SJT_TWO_ANSWERS]: 'QuestionSBA',
|
|
46
46
|
};
|
|
47
47
|
return mappedObj[typeId] ?? 'QuestionSBA';
|
|
48
48
|
};
|
|
@@ -63,6 +63,7 @@ export type IRenewTokenData = RestrictedData<string, 'renewToken'>;
|
|
|
63
63
|
export declare const TOC_ACCEPT: import("@apollo/client").DocumentNode;
|
|
64
64
|
export type ITocAcceptVar = null;
|
|
65
65
|
export type ITocAcceptData = RestrictedData<string, 'tocAccept'>;
|
|
66
|
+
export declare const updateCacheOnTocAccept: (userId: Id) => (cache: ApolloCache<any>, _result: ApolloUpdateResultRestricted<ITocAcceptData>, _options?: ApolloUpdateOptions<ITocAcceptVar>) => void;
|
|
66
67
|
export type ICompletedCardsData = Pick<IUser, 'completedCards' | 'completedCardsCount'>;
|
|
67
68
|
export type IUpsertUserConceptStatusVar = {
|
|
68
69
|
conceptIds: Id[];
|
|
@@ -153,6 +153,24 @@ export const TOC_ACCEPT = gql `
|
|
|
153
153
|
}
|
|
154
154
|
}
|
|
155
155
|
`;
|
|
156
|
+
const TOC_ACCEPTED_FRAGMENT = gql `
|
|
157
|
+
fragment TocAcceptedFragment on User {
|
|
158
|
+
tocAccepted
|
|
159
|
+
}
|
|
160
|
+
`;
|
|
161
|
+
export const updateCacheOnTocAccept = (userId) => (cache, _result, _options) => {
|
|
162
|
+
if (!userId) {
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
cache.writeFragment({
|
|
166
|
+
id: cache.identify({ id: userId, __typename: 'User' }),
|
|
167
|
+
data: {
|
|
168
|
+
tocAccepted: true,
|
|
169
|
+
},
|
|
170
|
+
fragment: TOC_ACCEPTED_FRAGMENT,
|
|
171
|
+
fragmentName: 'TocAcceptedFragment',
|
|
172
|
+
});
|
|
173
|
+
};
|
|
156
174
|
export const UPSERT_USER_CONCEPT_STATUS = gql `
|
|
157
175
|
mutation UpsertUserConceptStatus($conceptIds: [Int!]!, $status: Int!) {
|
|
158
176
|
restricted {
|