@elice/material-assignment 1.220803.0

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 (48) hide show
  1. package/README.md +3 -0
  2. package/cjs/components/index.d.ts +2 -0
  3. package/cjs/components/material-assignment/MaterialAssignment.d.ts +9 -0
  4. package/cjs/components/material-assignment/MaterialAssignment.js +40 -0
  5. package/cjs/components/material-assignment/MaterialAssignmentContent.d.ts +7 -0
  6. package/cjs/components/material-assignment/MaterialAssignmentContent.js +397 -0
  7. package/cjs/components/material-assignment/MaterialAssignmentUploadModal.d.ts +9 -0
  8. package/cjs/components/material-assignment/MaterialAssignmentUploadModal.js +201 -0
  9. package/cjs/components/material-assignment/index.d.ts +2 -0
  10. package/cjs/components/material-assignment/locales.d.ts +39 -0
  11. package/cjs/components/material-assignment/locales.js +83 -0
  12. package/cjs/components/material-assignment-admin/MaterialAssignmentAdmin.d.ts +14 -0
  13. package/cjs/components/material-assignment-admin/MaterialAssignmentAdmin.js +64 -0
  14. package/cjs/components/material-assignment-admin/MaterialAssignmentAdmin.styled.d.ts +13 -0
  15. package/cjs/components/material-assignment-admin/MaterialAssignmentAdmin.styled.js +41 -0
  16. package/cjs/components/material-assignment-admin/MaterialAssignmentAdminContent.d.ts +12 -0
  17. package/cjs/components/material-assignment-admin/MaterialAssignmentAdminContent.js +815 -0
  18. package/cjs/components/material-assignment-admin/MaterialAssignmentAdminContentTa.d.ts +8 -0
  19. package/cjs/components/material-assignment-admin/MaterialAssignmentAdminContentTa.js +479 -0
  20. package/cjs/components/material-assignment-admin/index.d.ts +3 -0
  21. package/cjs/components/shared/MaterialAssignmentContainer.d.ts +6 -0
  22. package/cjs/components/shared/MaterialAssignmentContainer.js +34 -0
  23. package/cjs/index.d.ts +1 -0
  24. package/cjs/index.js +11 -0
  25. package/es/components/index.d.ts +2 -0
  26. package/es/components/material-assignment/MaterialAssignment.d.ts +9 -0
  27. package/es/components/material-assignment/MaterialAssignment.js +33 -0
  28. package/es/components/material-assignment/MaterialAssignmentContent.d.ts +7 -0
  29. package/es/components/material-assignment/MaterialAssignmentContent.js +391 -0
  30. package/es/components/material-assignment/MaterialAssignmentUploadModal.d.ts +9 -0
  31. package/es/components/material-assignment/MaterialAssignmentUploadModal.js +194 -0
  32. package/es/components/material-assignment/index.d.ts +2 -0
  33. package/es/components/material-assignment/locales.d.ts +39 -0
  34. package/es/components/material-assignment/locales.js +78 -0
  35. package/es/components/material-assignment-admin/MaterialAssignmentAdmin.d.ts +14 -0
  36. package/es/components/material-assignment-admin/MaterialAssignmentAdmin.js +57 -0
  37. package/es/components/material-assignment-admin/MaterialAssignmentAdmin.styled.d.ts +13 -0
  38. package/es/components/material-assignment-admin/MaterialAssignmentAdmin.styled.js +27 -0
  39. package/es/components/material-assignment-admin/MaterialAssignmentAdminContent.d.ts +12 -0
  40. package/es/components/material-assignment-admin/MaterialAssignmentAdminContent.js +808 -0
  41. package/es/components/material-assignment-admin/MaterialAssignmentAdminContentTa.d.ts +8 -0
  42. package/es/components/material-assignment-admin/MaterialAssignmentAdminContentTa.js +472 -0
  43. package/es/components/material-assignment-admin/index.d.ts +3 -0
  44. package/es/components/shared/MaterialAssignmentContainer.d.ts +6 -0
  45. package/es/components/shared/MaterialAssignmentContainer.js +27 -0
  46. package/es/index.d.ts +1 -0
  47. package/es/index.js +2 -0
  48. package/package.json +70 -0
@@ -0,0 +1,815 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+ var reactHookForm = require('react-hook-form');
5
+ var reactIntl = require('react-intl');
6
+ var apiClient = require('@elice/api-client');
7
+ var blocks = require('@elice/blocks');
8
+ var designTokens = require('@elice/design-tokens');
9
+ var icons = require('@elice/icons');
10
+ var materialSharedUtils = require('@elice/material-shared-utils');
11
+ var dayjs = require('dayjs');
12
+ var MaterialAssignmentContainer = require('../shared/MaterialAssignmentContainer.js');
13
+ var MaterialAssignmentAdmin_styled = require('./MaterialAssignmentAdmin.styled.js');
14
+
15
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
16
+
17
+ var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
18
+ var dayjs__default = /*#__PURE__*/_interopDefaultLegacy(dayjs);
19
+
20
+ const FETCH_GRADE_LIST_COUNT = 5;
21
+ const MaterialAssignmentAdminContent = React.forwardRef(({
22
+ materialAssignmentId,
23
+ userId,
24
+ adminUserId,
25
+ updateMaterialUserBrowserResponse
26
+ }, ref) => {
27
+ var _a; // Form
28
+
29
+
30
+ const gradeEditFormMethods = reactHookForm.useForm({
31
+ defaultValues: {
32
+ score: 0,
33
+ comment: ''
34
+ },
35
+ mode: 'onChange'
36
+ });
37
+ const manualScoreEditFormMethods = reactHookForm.useForm({
38
+ defaultValues: {
39
+ manualScore: 0
40
+ },
41
+ mode: 'onChange'
42
+ }); // API Status
43
+
44
+ const isReady = materialSharedUtils.useMaterialConfigApiClientUpdate(apiClient.config.init);
45
+ const [submissionListGetStatus, setSubmissionListGetStatus] = React__default["default"].useState('idle');
46
+ const [gradeDeleteStatus, setGradeDeleteStatus] = React__default["default"].useState('idle'); // State related with component
47
+
48
+ const [showGradeEditModal, setShowGradeEditModal] = React__default["default"].useState(false);
49
+ const [showManualScoreEditModal, setShowManualScoreEditModal] = React__default["default"].useState(false);
50
+ const [selectedGradeForShow, setSelectedGradeForShow] = React__default["default"].useState(null);
51
+ const [selectedGradeForDelete, setSelectedGradeForDelete] = React__default["default"].useState(null); // State related with api
52
+
53
+ const [user, setUser] = React__default["default"].useState(null);
54
+ const [materialAssignment, setMaterialAssignment] = React__default["default"].useState(null);
55
+ const [userSubmission, setUserSubmission] = React__default["default"].useState(null);
56
+ const [myGrade, setMyGrade] = React__default["default"].useState(null);
57
+ const [gradeResult, setGradeResult] = React__default["default"].useState(null);
58
+ const [gradeList, setGradeList] = React__default["default"].useState([]);
59
+ const [gradeListCount, setGradeListCount] = React__default["default"].useState(0);
60
+ const [gradeListPage, setGradeListPage] = React__default["default"].useState(1);
61
+ const gradeListOffset = (gradeListPage - 1) * FETCH_GRADE_LIST_COUNT;
62
+ const isAssignmentClosed = dayjs__default["default"]().isAfter(dayjs__default["default"](materialAssignment === null || materialAssignment === void 0 ? void 0 : materialAssignment.closeDatetime));
63
+ const isScoreFinalized = Boolean(materialAssignment === null || materialAssignment === void 0 ? void 0 : materialAssignment.scoreFinalizedDatetime);
64
+ const isUserSubmitted = Boolean(userSubmission);
65
+ const fetchUserGet = React__default["default"].useCallback(() => {
66
+ void apiClient.getOrgUserGet({
67
+ userId
68
+ }).then(res => res.user).then(setUser);
69
+ }, [userId]);
70
+ const fetchMaterialAssignmentGet = React__default["default"].useCallback(() => {
71
+ void apiClient.getOrgMaterialAssignmentGet({
72
+ materialAssignmentId
73
+ }).then(res => res.materialAssignment).then(setMaterialAssignment);
74
+ }, [materialAssignmentId]);
75
+ const fetchSubmissionList = React__default["default"].useCallback(() => {
76
+ setSubmissionListGetStatus('pending');
77
+ void apiClient.getOrgMaterialAssignmentSubmissionList({
78
+ materialAssignmentId,
79
+ offset: 0,
80
+ count: 1,
81
+ filterConditions: {
82
+ isLast: true,
83
+ userIds: [userId]
84
+ }
85
+ }).then(res => res.materialAssignmentSubmissions[0]).then(submission => {
86
+ setUserSubmission(submission !== null && submission !== void 0 ? submission : null);
87
+ setSubmissionListGetStatus('resolved');
88
+ }).catch(err => {
89
+ console.error(err);
90
+ setSubmissionListGetStatus('rejected');
91
+ });
92
+ }, [materialAssignmentId, userId]);
93
+ const fetchGradeResult = React__default["default"].useCallback(() => {
94
+ void apiClient.getOrgMaterialAssignmentGradeResultGet({
95
+ materialAssignmentId,
96
+ userId
97
+ }).then(res => res.materialAssignmentGradeResult).then(setGradeResult).catch(() => {
98
+ setGradeResult(null);
99
+ });
100
+ }, [materialAssignmentId, userId]);
101
+ const fetchGradeList = React__default["default"].useCallback(() => {
102
+ void apiClient.getOrgMaterialAssignmentGradeList({
103
+ materialAssignmentId,
104
+ offset: gradeListOffset,
105
+ count: FETCH_GRADE_LIST_COUNT,
106
+ filterConditions: {
107
+ userId
108
+ }
109
+ }).then(({
110
+ materialAssignmentGrades,
111
+ materialAssignmentGradeCount
112
+ }) => {
113
+ setGradeList(materialAssignmentGrades);
114
+ setGradeListCount(materialAssignmentGradeCount);
115
+ });
116
+ }, [gradeListOffset, materialAssignmentId, userId]);
117
+ const fetchMyGrade = React__default["default"].useCallback(() => {
118
+ void apiClient.getOrgMaterialAssignmentGradeList({
119
+ materialAssignmentId,
120
+ offset: 0,
121
+ count: 1,
122
+ filterConditions: {
123
+ userId,
124
+ gradeUserId: adminUserId
125
+ }
126
+ }).then(res => res.materialAssignmentGrades[0]).then(grade => setMyGrade(grade !== null && grade !== void 0 ? grade : null));
127
+ }, [adminUserId, materialAssignmentId, userId]);
128
+
129
+ const handleManualScoreEditClick = () => {
130
+ var _a, _b;
131
+
132
+ setShowManualScoreEditModal(true);
133
+ manualScoreEditFormMethods.reset({
134
+ manualScore: (_b = (_a = gradeResult === null || gradeResult === void 0 ? void 0 : gradeResult.manualScore) !== null && _a !== void 0 ? _a : gradeResult === null || gradeResult === void 0 ? void 0 : gradeResult.avgCalcScore) !== null && _b !== void 0 ? _b : 0
135
+ });
136
+ };
137
+
138
+ const handleGradeEditClick = () => {
139
+ var _a, _b;
140
+
141
+ setShowGradeEditModal(true);
142
+ gradeEditFormMethods.reset({
143
+ score: (_a = myGrade === null || myGrade === void 0 ? void 0 : myGrade.score) !== null && _a !== void 0 ? _a : 0,
144
+ comment: (_b = myGrade === null || myGrade === void 0 ? void 0 : myGrade.comment) !== null && _b !== void 0 ? _b : ''
145
+ });
146
+ };
147
+
148
+ const handleGradeEditSubmit = gradeEditFormMethods.handleSubmit(async ({
149
+ score,
150
+ comment
151
+ }) => {
152
+ try {
153
+ await apiClient.postOrgMaterialAssignmentGradeEdit({
154
+ materialAssignmentGradeId: myGrade === null || myGrade === void 0 ? void 0 : myGrade.id,
155
+ materialAssignmentId,
156
+ userId,
157
+ score,
158
+ comment
159
+ });
160
+ fetchMyGrade();
161
+ fetchGradeResult();
162
+ fetchGradeList();
163
+
164
+ if (typeof updateMaterialUserBrowserResponse === 'function') {
165
+ updateMaterialUserBrowserResponse(userId);
166
+ }
167
+
168
+ blocks.Notification.success('저장되었습니다');
169
+ } catch (err) {
170
+ console.error(err);
171
+ blocks.Notification.error('오류가 발생했습니다.');
172
+ } finally {
173
+ setShowGradeEditModal(false);
174
+ }
175
+ });
176
+
177
+ const handleGradeDeleteSubmit = async () => {
178
+ if (!selectedGradeForDelete) {
179
+ return;
180
+ }
181
+
182
+ try {
183
+ setGradeDeleteStatus('pending');
184
+ await apiClient.postOrgMaterialAssignmentGradeDelete({
185
+ materialAssignmentGradeId: selectedGradeForDelete.id
186
+ }); // If delete my grade, re-fetch my grade data.
187
+
188
+ if (adminUserId === selectedGradeForDelete.gradeUser.id) {
189
+ fetchMyGrade();
190
+ }
191
+
192
+ fetchGradeList();
193
+ fetchGradeResult();
194
+ setGradeDeleteStatus('resolved');
195
+
196
+ if (typeof updateMaterialUserBrowserResponse === 'function') {
197
+ updateMaterialUserBrowserResponse(userId);
198
+ }
199
+
200
+ blocks.Notification.success('저장되었습니다');
201
+ } catch (err) {
202
+ console.error(err);
203
+ setGradeDeleteStatus('rejected');
204
+ blocks.Notification.error('오류가 발생했습니다.');
205
+ } finally {
206
+ setSelectedGradeForDelete(null);
207
+ }
208
+ };
209
+
210
+ const handleManualScoreEditSubmit = manualScoreEditFormMethods.handleSubmit(async ({
211
+ manualScore
212
+ }) => {
213
+ try {
214
+ await apiClient.postOrgMaterialAssignmentGradeResultManualScoreEdit({
215
+ userId,
216
+ manualScore,
217
+ materialAssignmentId
218
+ });
219
+ fetchGradeResult();
220
+
221
+ if (typeof updateMaterialUserBrowserResponse === 'function') {
222
+ updateMaterialUserBrowserResponse(userId);
223
+ }
224
+
225
+ blocks.Notification.success('저장되었습니다');
226
+ } catch (err) {
227
+ console.error(err);
228
+ blocks.Notification.error('오류가 발생했습니다.');
229
+ } finally {
230
+ setShowManualScoreEditModal(false);
231
+ }
232
+ });
233
+ React__default["default"].useEffect(() => {
234
+ if (!isReady) {
235
+ return;
236
+ }
237
+
238
+ fetchUserGet();
239
+ fetchMyGrade();
240
+ fetchGradeList();
241
+ fetchGradeResult();
242
+ fetchSubmissionList();
243
+ fetchMaterialAssignmentGet();
244
+ }, [isReady, fetchUserGet, fetchMyGrade, fetchGradeList, fetchGradeResult, fetchSubmissionList, fetchMaterialAssignmentGet]);
245
+ React__default["default"].useImperativeHandle(ref, () => ({
246
+ refreshMaterialAssignment: () => {
247
+ fetchMaterialAssignmentGet();
248
+ }
249
+ }), [fetchMaterialAssignmentGet]);
250
+
251
+ const renderHeader = () => {
252
+ var _a, _b, _c;
253
+
254
+ return React__default["default"].createElement(MaterialAssignmentAdmin_styled.StyledMaterialAssignmentAdminHeader, {
255
+ align: "center",
256
+ padding: "1rem",
257
+ width: "100%"
258
+ }, React__default["default"].createElement(blocks.Flex, {
259
+ auto: true,
260
+ align: "center"
261
+ }, React__default["default"].createElement(blocks.ProfileImage, {
262
+ src: (_a = user === null || user === void 0 ? void 0 : user.profileUrl) !== null && _a !== void 0 ? _a : '',
263
+ width: "2.5rem",
264
+ height: "2.5rem"
265
+ }), React__default["default"].createElement(blocks.Hspace, {
266
+ width: 1
267
+ }), React__default["default"].createElement(blocks.Text, {
268
+ size: "small",
269
+ role: "warmwhite"
270
+ }, user === null || user === void 0 ? void 0 : user.fullname)), React__default["default"].createElement(MaterialAssignmentAdmin_styled.StyledMaterialAssignmentAdminHeaderCell, null, React__default["default"].createElement(blocks.Text, {
271
+ size: "tiny",
272
+ role: "gray4"
273
+ }, "\uC810\uC218"), React__default["default"].createElement(blocks.Text, {
274
+ size: "small",
275
+ role: "white"
276
+ }, gradeResult ? `${(_c = (_b = gradeResult.manualScore) !== null && _b !== void 0 ? _b : gradeResult.avgCalcScore) !== null && _c !== void 0 ? _c : 0}${isScoreFinalized ? '(공개됨)' : '(비공개)'}` : '--')), React__default["default"].createElement(MaterialAssignmentAdmin_styled.StyledMaterialAssignmentAdminHeaderCell, null, React__default["default"].createElement(blocks.Text, {
277
+ size: "tiny",
278
+ role: "gray4"
279
+ }, "\uC81C\uCD9C \uC77C\uC2DC"), React__default["default"].createElement(blocks.Text, {
280
+ size: "small",
281
+ role: "white"
282
+ }, userSubmission ? React__default["default"].createElement(reactIntl.FormattedDate, {
283
+ value: userSubmission.createdDatetime,
284
+ dateStyle: "medium",
285
+ timeStyle: "short",
286
+ hour12: false
287
+ }) : '--')));
288
+ };
289
+
290
+ const renderManualScoreEditButton = () => {
291
+ return React__default["default"].createElement(blocks.Tooltip, {
292
+ placement: "top",
293
+ title: isUserSubmitted ? '제출 기한이 지난 이후 조정할 수 있습니다.' : '미제출인 경우 조정할 수 없습니다.',
294
+ visible: !isAssignmentClosed || !isUserSubmitted ? undefined : false
295
+ }, React__default["default"].createElement(MaterialAssignmentAdmin_styled.StyledMaterialAssignmentAdminManualScoreEditButtonWrapper, {
296
+ disabled: !isAssignmentClosed || !isUserSubmitted
297
+ }, React__default["default"].createElement(MaterialAssignmentAdmin_styled.StyledMaterialAssignmentAdminManualScoreEditButton, {
298
+ disabled: !isAssignmentClosed || !isUserSubmitted,
299
+ underline: true,
300
+ role: "navy3",
301
+ size: "tiny",
302
+ onClick: handleManualScoreEditClick
303
+ }, "\uC810\uC218 \uC870\uC815\uD558\uAE30")));
304
+ };
305
+
306
+ const renderGradeResult = () => {
307
+ var _a, _b;
308
+
309
+ return React__default["default"].createElement(MaterialAssignmentAdmin_styled.StyledMaterialAssignmentAdminGradeWrapper, {
310
+ wrap: true,
311
+ width: "100%",
312
+ align: "center"
313
+ }, React__default["default"].createElement(blocks.Flex, {
314
+ auto: true,
315
+ align: "center"
316
+ }, React__default["default"].createElement(blocks.Text, {
317
+ role: "navy1",
318
+ size: "small",
319
+ lineHeight: "1.375rem"
320
+ }, user ? `${user.fullname} 님의 점수` : null), React__default["default"].createElement(blocks.Hspace, {
321
+ width: 0.25
322
+ }), React__default["default"].createElement(blocks.Tooltip, {
323
+ useMaxWidth: true,
324
+ placement: "top",
325
+ title: "모든 채점 점수의 평균값이 반영된 종합 점수입니다. 평균값을 사용하지 않으려면 ‘조정하기'를 클릭해 직접 점수를 입력하세요."
326
+ }, React__default["default"].createElement(blocks.Icon, {
327
+ icon: icons.eilStatusInfo,
328
+ color: designTokens.base.color.navy1
329
+ })), React__default["default"].createElement(blocks.Hspace, {
330
+ width: 0.75
331
+ }), React__default["default"].createElement(blocks.Text, {
332
+ bold: true,
333
+ role: "white"
334
+ }, gradeResult ? `${(_b = (_a = gradeResult.manualScore) !== null && _a !== void 0 ? _a : gradeResult.avgCalcScore) !== null && _b !== void 0 ? _b : 0}${isScoreFinalized ? '(공개됨)' : '(비공개)'}` : '--')), renderManualScoreEditButton());
335
+ };
336
+
337
+ const renderSubmissionInfo = () => {
338
+ const statusText = (() => {
339
+ if (submissionListGetStatus === 'pending') {
340
+ return null;
341
+ }
342
+
343
+ switch (true) {
344
+ case !isUserSubmitted && isAssignmentClosed:
345
+ return React__default["default"].createElement(blocks.Text, {
346
+ bold: true,
347
+ role: "danger",
348
+ size: "small"
349
+ }, "\uC81C\uCD9C \uAE30\uD55C \uB9CC\uB8CC");
350
+
351
+ case isScoreFinalized:
352
+ return React__default["default"].createElement(blocks.Text, {
353
+ bold: true,
354
+ role: "lightpurple",
355
+ size: "small"
356
+ }, "\uCC44\uC810 \uC644\uB8CC");
357
+
358
+ case isUserSubmitted:
359
+ return React__default["default"].createElement(blocks.Text, {
360
+ bold: true,
361
+ role: "success",
362
+ size: "small"
363
+ }, "\uC81C\uCD9C\uB428");
364
+
365
+ case !isUserSubmitted:
366
+ return React__default["default"].createElement(blocks.Text, {
367
+ bold: true,
368
+ role: "warning",
369
+ size: "small"
370
+ }, "\uBBF8\uC81C\uCD9C");
371
+ }
372
+ })();
373
+
374
+ const submissionAttachment = (() => {
375
+ if (!userSubmission) {
376
+ return '--';
377
+ }
378
+
379
+ if (userSubmission.assignmentFileUrl) {
380
+ const assignmentFilename = decodeURIComponent(userSubmission.assignmentFileUrl && new URL(userSubmission.assignmentFileUrl).pathname.split('/').pop() || '');
381
+ return React__default["default"].createElement("a", {
382
+ href: userSubmission.assignmentFileUrl,
383
+ download: assignmentFilename,
384
+ target: "_blank",
385
+ rel: "noopener noreferrer"
386
+ }, React__default["default"].createElement(blocks.Text, {
387
+ hoverable: true,
388
+ underline: true,
389
+ role: "white",
390
+ size: "small"
391
+ }, assignmentFilename));
392
+ }
393
+
394
+ if (userSubmission === null || userSubmission === void 0 ? void 0 : userSubmission.assignmentUrl) {
395
+ return React__default["default"].createElement("a", {
396
+ href: userSubmission.assignmentUrl,
397
+ target: "_blank",
398
+ rel: "noopener noreferrer"
399
+ }, React__default["default"].createElement(blocks.Text, {
400
+ hoverable: true,
401
+ underline: true,
402
+ role: "white",
403
+ size: "small"
404
+ }, userSubmission.assignmentUrl));
405
+ }
406
+ })();
407
+
408
+ return React__default["default"].createElement(blocks.InfoTable, {
409
+ dark: true
410
+ }, React__default["default"].createElement("tbody", null, React__default["default"].createElement("tr", null, React__default["default"].createElement("td", null, "\uC0C1\uD0DC"), React__default["default"].createElement("td", null, statusText)), React__default["default"].createElement("tr", null, React__default["default"].createElement("td", null, "\uACFC\uC81C \uC81C\uCD9C \uAE30\uD55C"), React__default["default"].createElement("td", null, React__default["default"].createElement(reactIntl.FormattedDate, {
411
+ value: materialAssignment === null || materialAssignment === void 0 ? void 0 : materialAssignment.closeDatetime,
412
+ dateStyle: "medium",
413
+ timeStyle: "short",
414
+ hour12: false
415
+ }))), React__default["default"].createElement("tr", null, React__default["default"].createElement("td", null, "\uC81C\uCD9C \uC77C\uC2DC"), React__default["default"].createElement("td", null, userSubmission ? React__default["default"].createElement(reactIntl.FormattedDate, {
416
+ value: userSubmission.createdDatetime,
417
+ dateStyle: "medium",
418
+ timeStyle: "short",
419
+ hour12: false
420
+ }) : '--')), React__default["default"].createElement("tr", null, React__default["default"].createElement("td", null, "\uC5C5\uB85C\uB4DC\uB41C \uACFC\uC81C"), React__default["default"].createElement("td", null, submissionAttachment))));
421
+ };
422
+
423
+ const renderGradeList = () => {
424
+ return React__default["default"].createElement(blocks.Flex, {
425
+ column: true,
426
+ align: "center"
427
+ }, React__default["default"].createElement(blocks.Flex, {
428
+ align: "center",
429
+ width: "100%"
430
+ }, React__default["default"].createElement(blocks.Flex, {
431
+ column: true,
432
+ auto: true
433
+ }, React__default["default"].createElement(blocks.Text, {
434
+ block: true,
435
+ bold: true,
436
+ role: "white",
437
+ lineHeight: 1.375
438
+ }, "\uCC44\uC810 \uD604\uD669"), React__default["default"].createElement(blocks.Text, {
439
+ block: true,
440
+ size: "tiny",
441
+ role: "navy3",
442
+ lineHeight: 1.6
443
+ }, "\uCC44\uC810\uC644\uB8CC\uD55C \uCC44\uC810\uC790\uC758 \uC810\uC218\uC640 \uD53C\uB4DC\uBC31\uC744 \uBCFC \uC218 \uC788\uC2B5\uB2C8\uB2E4.")), React__default["default"].createElement(blocks.Tooltip, {
444
+ placement: "top",
445
+ title: isUserSubmitted ? '제출 기한이 지난 이후 채점할 수 있습니다.' : '미제출인 경우 채점할 수 없습니다.',
446
+ visible: !isAssignmentClosed || !isUserSubmitted ? undefined : false
447
+ }, React__default["default"].createElement("span", null, React__default["default"].createElement(blocks.Button, {
448
+ size: "small",
449
+ role: "lightpurple",
450
+ disabled: !isAssignmentClosed || !isUserSubmitted,
451
+ onClick: handleGradeEditClick
452
+ }, Boolean(myGrade) ? '내 채점 수정' : '내 채점 시작')))), React__default["default"].createElement(blocks.Vspace, {
453
+ height: 0.75
454
+ }), React__default["default"].createElement(blocks.TableNext, {
455
+ dark: true,
456
+ emptyMessage: "\uCC44\uC810 \uC644\uB8CC\uD55C \uCC44\uC810\uC790\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.",
457
+ columns: [{
458
+ Header: '채점자명',
459
+ accessor: 'fullname'
460
+ }, {
461
+ Header: '과제 점수',
462
+ accessor: 'grade'
463
+ }, {
464
+ Header: '채점 일시',
465
+ accessor: 'created',
466
+ textAlign: 'left'
467
+ }],
468
+ data: gradeList.map(grade => ({
469
+ fullname: React__default["default"].createElement(blocks.Flex, null, React__default["default"].createElement(blocks.Text, {
470
+ noWrap: true,
471
+ role: "navy0",
472
+ size: "small"
473
+ }, `${grade.gradeUser.fullname}${grade.gradeUser.id === adminUserId ? '(나)' : ''}`), React__default["default"].createElement(blocks.Hspace, {
474
+ width: 0.25
475
+ }), React__default["default"].createElement(blocks.Text, {
476
+ ellipsis: true,
477
+ role: "navy3",
478
+ size: "small"
479
+ }, grade.gradeUser.email)),
480
+ grade: grade.score,
481
+ created: React__default["default"].createElement(blocks.Flex, {
482
+ align: "center",
483
+ justify: "space-between"
484
+ }, React__default["default"].createElement(reactIntl.FormattedDate, {
485
+ value: grade.createdDatetime,
486
+ dateStyle: "medium",
487
+ timeStyle: "short",
488
+ hour12: false
489
+ }), React__default["default"].createElement(blocks.Flex, {
490
+ align: "center"
491
+ }, React__default["default"].createElement(blocks.IconButton, {
492
+ icon: icons.eilChat,
493
+ size: "tiny",
494
+ role: "navy3",
495
+ onClick: () => {
496
+ setSelectedGradeForShow(grade);
497
+ }
498
+ }), React__default["default"].createElement(blocks.Hspace, {
499
+ width: 0.5
500
+ }), React__default["default"].createElement(blocks.IconButton, {
501
+ icon: icons.eilDelete,
502
+ size: "tiny",
503
+ role: "navy3",
504
+ onClick: () => {
505
+ setSelectedGradeForDelete(grade);
506
+ }
507
+ })))
508
+ }))
509
+ }), React__default["default"].createElement(blocks.Vspace, {
510
+ height: 0.5
511
+ }), React__default["default"].createElement(blocks.Pagination, {
512
+ dark: true,
513
+ offset: gradeListOffset,
514
+ count: FETCH_GRADE_LIST_COUNT,
515
+ total: gradeListCount,
516
+ isNext: gradeListOffset + FETCH_GRADE_LIST_COUNT < gradeListCount,
517
+ isPrev: gradeListOffset > 0,
518
+ onClickNext: () => {
519
+ setGradeListPage(gradeListPage + 1);
520
+ },
521
+ onClickPrev: () => {
522
+ setGradeListPage(gradeListPage - 1);
523
+ }
524
+ }));
525
+ };
526
+
527
+ const renderGradeEditModal = () => {
528
+ if (!showGradeEditModal) {
529
+ return null;
530
+ }
531
+
532
+ return React__default["default"].createElement(blocks.Modal, {
533
+ title: Boolean(myGrade) ? '내 채점 수정' : '과제 채점',
534
+ footerButtons: [{
535
+ label: '확인',
536
+ size: 'small',
537
+ role: 'primary',
538
+ loading: gradeEditFormMethods.formState.isSubmitting,
539
+ disabled: gradeEditFormMethods.formState.isSubmitting || !gradeEditFormMethods.formState.isValid,
540
+ onClick: handleGradeEditSubmit
541
+ }, {
542
+ label: '취소',
543
+ size: 'small',
544
+ role: 'gray1',
545
+ onClick: () => {
546
+ setShowGradeEditModal(false);
547
+ }
548
+ }],
549
+ onHide: () => {
550
+ setShowGradeEditModal(false);
551
+ }
552
+ }, React__default["default"].createElement(blocks.Label, {
553
+ bold: true,
554
+ block: true,
555
+ required: true
556
+ }, "\uC810\uC218"), React__default["default"].createElement(blocks.Vspace, {
557
+ height: 0.5
558
+ }), React__default["default"].createElement(blocks.Flex, {
559
+ align: "center"
560
+ }, React__default["default"].createElement(reactHookForm.Controller, {
561
+ control: gradeEditFormMethods.control,
562
+ name: "score",
563
+ rules: {
564
+ required: true,
565
+ min: 0,
566
+ max: 100
567
+ },
568
+ render: ({
569
+ field,
570
+ fieldState
571
+ }) => React__default["default"].createElement(blocks.Input, Object.assign({}, field, {
572
+ invalid: fieldState.invalid,
573
+ size: "small",
574
+ width: "xsmall",
575
+ type: "number"
576
+ }))
577
+ }), React__default["default"].createElement(blocks.Hspace, {
578
+ width: 0.5
579
+ }), React__default["default"].createElement(blocks.Text, {
580
+ bold: true,
581
+ role: "gray9",
582
+ size: "small"
583
+ }, "\uC810"), React__default["default"].createElement(blocks.Text, {
584
+ role: "gray6",
585
+ size: "small"
586
+ }, ' / 100점 만점')), React__default["default"].createElement(blocks.Vspace, {
587
+ height: 1.25
588
+ }), React__default["default"].createElement(blocks.Label, {
589
+ bold: true,
590
+ block: true
591
+ }, "\uD53C\uB4DC\uBC31"), React__default["default"].createElement(blocks.Vspace, {
592
+ height: 0.5
593
+ }), React__default["default"].createElement(reactHookForm.Controller, {
594
+ control: gradeEditFormMethods.control,
595
+ name: "comment",
596
+ rules: {
597
+ maxLength: 1000
598
+ },
599
+ render: ({
600
+ field
601
+ }) => React__default["default"].createElement(blocks.Textarea, {
602
+ value: field.value,
603
+ wordLimit: 1000,
604
+ rows: 8,
605
+ onChange: field.onChange
606
+ })
607
+ }));
608
+ };
609
+
610
+ const renderGradeShowModal = () => {
611
+ if (!selectedGradeForShow) {
612
+ return null;
613
+ }
614
+
615
+ return React__default["default"].createElement(blocks.Modal, {
616
+ title: "\uCC44\uC810 \uACB0\uACFC \uD655\uC778",
617
+ footerButtons: [{
618
+ label: '확인',
619
+ size: 'small',
620
+ role: 'primary',
621
+ onClick: () => {
622
+ setSelectedGradeForShow(null);
623
+ }
624
+ }],
625
+ onHide: () => {
626
+ setSelectedGradeForShow(null);
627
+ }
628
+ }, React__default["default"].createElement(blocks.Label, {
629
+ bold: true,
630
+ block: true,
631
+ required: true
632
+ }, "\uC810\uC218"), React__default["default"].createElement(blocks.Vspace, {
633
+ height: 0.5
634
+ }), React__default["default"].createElement(blocks.Flex, {
635
+ align: "center"
636
+ }, React__default["default"].createElement(blocks.Input, {
637
+ disabled: true,
638
+ value: selectedGradeForShow.score,
639
+ size: "small",
640
+ width: "xsmall",
641
+ type: "number"
642
+ }), React__default["default"].createElement(blocks.Hspace, {
643
+ width: 0.5
644
+ }), React__default["default"].createElement(blocks.Text, {
645
+ bold: true,
646
+ role: "gray9",
647
+ size: "small"
648
+ }, "\uC810"), React__default["default"].createElement(blocks.Text, {
649
+ role: "gray6",
650
+ size: "small"
651
+ }, ' / 100점 만점')), React__default["default"].createElement(blocks.Vspace, {
652
+ height: 1.25
653
+ }), React__default["default"].createElement(blocks.Label, {
654
+ bold: true,
655
+ block: true
656
+ }, "\uD53C\uB4DC\uBC31"), React__default["default"].createElement(blocks.Vspace, {
657
+ height: 0.5
658
+ }), React__default["default"].createElement(MaterialAssignmentAdmin_styled.StyledMaterialAssignmentAdminTextareaWrapper, null, React__default["default"].createElement(blocks.Textarea, {
659
+ disabled: true,
660
+ value: selectedGradeForShow.comment,
661
+ wordLimit: 1000,
662
+ rows: 8
663
+ })));
664
+ };
665
+
666
+ const renderGradeDeleteModal = () => {
667
+ if (!selectedGradeForDelete) {
668
+ return null;
669
+ }
670
+
671
+ return React__default["default"].createElement(blocks.Modal, {
672
+ title: "\uCC44\uC810 \uC0AD\uC81C",
673
+ width: "narrow",
674
+ footerButtons: [{
675
+ label: '확인',
676
+ size: 'small',
677
+ role: 'primary',
678
+ loading: gradeDeleteStatus === 'pending',
679
+ disabled: gradeDeleteStatus === 'pending',
680
+ onClick: handleGradeDeleteSubmit
681
+ }, {
682
+ label: '취소',
683
+ size: 'small',
684
+ role: 'gray1',
685
+ onClick: () => {
686
+ setSelectedGradeForDelete(null);
687
+ }
688
+ }],
689
+ onHide: () => {
690
+ setSelectedGradeForDelete(null);
691
+ }
692
+ }, React__default["default"].createElement(blocks.Text, {
693
+ role: "gray9"
694
+ }, "\uC0AD\uC81C\uB41C \uC810\uC218\uC640 \uD53C\uB4DC\uBC31\uC740 \uB2E4\uC2DC \uBCF5\uAD6C\uB420 \uC218 \uC5C6\uC73C\uBA70 \uD559\uC0DD\uC758 \uD3C9\uADE0 \uC810\uC218\uAC00 \uBCC0\uACBD\uB420 \uC218 \uC788\uC2B5\uB2C8\uB2E4."), React__default["default"].createElement(blocks.Vspace, {
695
+ height: 0.75
696
+ }), React__default["default"].createElement(blocks.TableNext, {
697
+ columns: [{
698
+ Header: '채점자명',
699
+ accessor: 'fullname'
700
+ }, {
701
+ Header: '최종 점수',
702
+ accessor: 'score'
703
+ }],
704
+ data: [{
705
+ fullname: React__default["default"].createElement(blocks.Flex, null, React__default["default"].createElement(blocks.Text, {
706
+ noWrap: true,
707
+ role: "gray9",
708
+ size: "small"
709
+ }, selectedGradeForDelete.gradeUser.fullname), React__default["default"].createElement(blocks.Hspace, {
710
+ width: 0.25
711
+ }), React__default["default"].createElement(blocks.Text, {
712
+ ellipsis: true,
713
+ role: "gray5",
714
+ size: "small"
715
+ }, selectedGradeForDelete.gradeUser.email)),
716
+ score: selectedGradeForDelete.score
717
+ }]
718
+ }));
719
+ };
720
+
721
+ const renderManualScoreEditModal = () => {
722
+ var _a, _b;
723
+
724
+ if (!showManualScoreEditModal) {
725
+ return null;
726
+ }
727
+
728
+ return React__default["default"].createElement(blocks.Modal, {
729
+ title: "\uC810\uC218 \uC870\uC815",
730
+ width: "narrow",
731
+ footerButtons: [{
732
+ label: '확인',
733
+ size: 'small',
734
+ role: 'primary',
735
+ loading: manualScoreEditFormMethods.formState.isSubmitting,
736
+ disabled: manualScoreEditFormMethods.formState.isSubmitting || !manualScoreEditFormMethods.formState.isValid,
737
+ onClick: handleManualScoreEditSubmit
738
+ }, {
739
+ label: '취소',
740
+ size: 'small',
741
+ role: 'gray1',
742
+ onClick: () => {
743
+ setShowManualScoreEditModal(false);
744
+ }
745
+ }],
746
+ onHide: () => {
747
+ setShowManualScoreEditModal(false);
748
+ }
749
+ }, React__default["default"].createElement(blocks.Alert, {
750
+ role: "warning"
751
+ }, "\uC810\uC218 \uC870\uC815 \uC774\uD6C4 \uB2E4\uC2DC \uD3C9\uADE0\uAC12\uC73C\uB85C \uB418\uB3CC\uB9B4 \uC218 \uC5C6\uC73C\uB2C8 \uC720\uC758\uD574 \uC8FC\uC138\uC694."), React__default["default"].createElement(blocks.Vspace, {
752
+ height: 1
753
+ }), React__default["default"].createElement(blocks.Flex, {
754
+ align: "center"
755
+ }, React__default["default"].createElement(blocks.Input, {
756
+ disabled: true,
757
+ size: "small",
758
+ width: "xsmall",
759
+ type: "number",
760
+ label: "\uC774\uC804 \uC810\uC218",
761
+ value: (_b = (_a = gradeResult === null || gradeResult === void 0 ? void 0 : gradeResult.manualScore) !== null && _a !== void 0 ? _a : gradeResult === null || gradeResult === void 0 ? void 0 : gradeResult.avgCalcScore) !== null && _b !== void 0 ? _b : 0
762
+ }), React__default["default"].createElement(blocks.Hspace, {
763
+ width: 1
764
+ }), React__default["default"].createElement(blocks.Icon, {
765
+ icon: icons.eilArrowRightwardsBasic
766
+ }), React__default["default"].createElement(blocks.Hspace, {
767
+ width: 1
768
+ }), React__default["default"].createElement(reactHookForm.Controller, {
769
+ control: manualScoreEditFormMethods.control,
770
+ name: "manualScore",
771
+ rules: {
772
+ required: true,
773
+ min: 0,
774
+ max: 100
775
+ },
776
+ render: ({
777
+ field,
778
+ fieldState
779
+ }) => React__default["default"].createElement(blocks.Input, Object.assign({}, field, {
780
+ invalid: fieldState.invalid,
781
+ size: "small",
782
+ width: "xsmall",
783
+ type: "number",
784
+ label: "\uC870\uC815 \uC810\uC218"
785
+ }))
786
+ }), React__default["default"].createElement(blocks.Hspace, {
787
+ width: 0.75
788
+ }), React__default["default"].createElement(blocks.Text, {
789
+ bold: true,
790
+ role: "gray9",
791
+ size: "small"
792
+ }, "\uC810"), React__default["default"].createElement(blocks.Text, {
793
+ role: "gray6",
794
+ size: "small"
795
+ }, ' / 100점 만점')));
796
+ };
797
+
798
+ return React__default["default"].createElement(React__default["default"].Fragment, null, renderHeader(), React__default["default"].createElement(blocks.Flex, {
799
+ column: true,
800
+ auto: true,
801
+ padding: "3.625rem",
802
+ width: "100%",
803
+ height: "100%",
804
+ overflow: "hidden",
805
+ align: "center"
806
+ }, React__default["default"].createElement(MaterialAssignmentContainer, {
807
+ title: (_a = materialAssignment === null || materialAssignment === void 0 ? void 0 : materialAssignment.title) !== null && _a !== void 0 ? _a : ''
808
+ }, renderGradeResult(), React__default["default"].createElement(blocks.Vspace, {
809
+ height: 1.25
810
+ }), renderSubmissionInfo(), React__default["default"].createElement(blocks.Vspace, {
811
+ height: 1.5
812
+ }), renderGradeList())), renderGradeEditModal(), renderGradeShowModal(), renderGradeDeleteModal(), renderManualScoreEditModal());
813
+ });
814
+
815
+ module.exports = MaterialAssignmentAdminContent;