@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,391 @@
1
+ import React from 'react';
2
+ import { useIntl, FormattedDate } from 'react-intl';
3
+ import { config, getOrgMaterialAssignmentGet, getOrgMaterialAssignmentGradeList, getOrgMaterialAssignmentGradeResultGet, getOrgMaterialAssignmentSubmissionGet } from '@elice/api-client';
4
+ import { Spinner, Text, Vspace, InfoTable, Button, TableNext, Hspace } from '@elice/blocks';
5
+ import { useMaterialConfigApiClientUpdate } from '@elice/material-shared-utils';
6
+ import MaterialAssignmentContainer from '../shared/MaterialAssignmentContainer.js';
7
+ import MaterialAssignmentUploadModal from './MaterialAssignmentUploadModal.js';
8
+
9
+ const GRADE_LIST_COUNT = 20;
10
+
11
+ const MaterialAssignmentContent = ({
12
+ materialAssignmentId,
13
+ userId
14
+ }) => {
15
+ const intl = useIntl();
16
+ const [assignmentGetStatus, setAssignmentGetStatus] = React.useState('idle');
17
+ const [assignmentGradeListGetStatus, setAssignmentGradeListGetStatus] = React.useState('idle');
18
+ const [assignmentGradeResultGetStatus, setAssignmentGradeResultGetStatus] = React.useState('idle');
19
+ const [assignmentSubmissionGetStatus, setAssignmentSubmissionGetStatus] = React.useState('idle');
20
+ const [materialAssignment, setMaterialAssignment] = React.useState();
21
+ const [materialAssignmentSubmission, setMaterialAssignmentSubmission] = React.useState();
22
+ const [materialAssignmentGradeResult, setMaterialAssignmentGradeResult] = React.useState();
23
+ const [materialAssignmentGradeList, setMaterialAssignmentGradeList] = React.useState();
24
+ /** Is confirm modal visible? */
25
+
26
+ const [showAssignmentSubmitModal, setShowAssignmentSubmitModal] = React.useState(false);
27
+ const isAssignmentSubmitted = Boolean(materialAssignment === null || materialAssignment === void 0 ? void 0 : materialAssignment.lastAssignmentSubmissionId);
28
+ const isAssignmentClosed = materialAssignment && Boolean(materialAssignment.closeDatetime < Date.now());
29
+ const isAssignmentResultVisible = Boolean(materialAssignment === null || materialAssignment === void 0 ? void 0 : materialAssignment.scoreFinalizedDatetime);
30
+ const isReady = useMaterialConfigApiClientUpdate(config.init);
31
+ /**
32
+ *
33
+ */
34
+
35
+ const doGetOrgMaterialAssignmentGet = React.useCallback(() => {
36
+ setAssignmentGetStatus('pending');
37
+ return getOrgMaterialAssignmentGet({
38
+ materialAssignmentId
39
+ }).then(({
40
+ materialAssignment
41
+ }) => {
42
+ setAssignmentGetStatus('resolved');
43
+ setMaterialAssignment(materialAssignment);
44
+ }).catch(error => {
45
+ setAssignmentGetStatus('rejected');
46
+ console.error(error);
47
+ });
48
+ }, [materialAssignmentId]); //
49
+ //
50
+ //
51
+
52
+ /**
53
+ * Get assignment info
54
+ */
55
+
56
+ React.useEffect(() => {
57
+ if (!isReady) {
58
+ return;
59
+ }
60
+
61
+ void doGetOrgMaterialAssignmentGet();
62
+ }, [doGetOrgMaterialAssignmentGet, isReady]);
63
+ /**
64
+ * When Grade_result exist, a comment list is called.
65
+ */
66
+
67
+ React.useEffect(() => {
68
+ if (!isReady) {
69
+ return;
70
+ }
71
+
72
+ if (!isAssignmentResultVisible) {
73
+ return;
74
+ }
75
+
76
+ setAssignmentGradeListGetStatus('pending');
77
+ getOrgMaterialAssignmentGradeList({
78
+ offset: 0,
79
+ count: GRADE_LIST_COUNT,
80
+ materialAssignmentId,
81
+ filterConditions: {
82
+ userId
83
+ }
84
+ }).then(({
85
+ materialAssignmentGrades,
86
+ materialAssignmentGradeCount
87
+ }) => {
88
+ setAssignmentGradeListGetStatus('resolved');
89
+ setMaterialAssignmentGradeList(materialAssignmentGrades);
90
+ }).catch(error => {
91
+ console.error(error);
92
+ setAssignmentGradeListGetStatus('rejected');
93
+ });
94
+ }, [isAssignmentResultVisible, isReady, materialAssignmentId, userId]);
95
+ /**
96
+ * When Grade_result exist, a score is called.
97
+ */
98
+
99
+ React.useEffect(() => {
100
+ if (!isReady) {
101
+ return;
102
+ }
103
+
104
+ if (!isAssignmentResultVisible) {
105
+ return;
106
+ }
107
+
108
+ setAssignmentGradeResultGetStatus('pending');
109
+ getOrgMaterialAssignmentGradeResultGet({
110
+ materialAssignmentId,
111
+ userId
112
+ }).then(({
113
+ materialAssignmentGradeResult
114
+ }) => {
115
+ setAssignmentGradeResultGetStatus('resolved');
116
+ setMaterialAssignmentGradeResult(materialAssignmentGradeResult);
117
+ }).catch(error => {
118
+ console.error(error);
119
+ setAssignmentGradeResultGetStatus('rejected');
120
+ });
121
+ }, [isAssignmentResultVisible, isReady, materialAssignmentId, userId]);
122
+ /**
123
+ * Get information on the assignment submitted
124
+ */
125
+
126
+ React.useEffect(() => {
127
+ var _a;
128
+
129
+ if (!isReady) {
130
+ return;
131
+ } // Get assignment response according to `lastAssignmentSubmissionId` of material.
132
+
133
+
134
+ if (!isAssignmentSubmitted) {
135
+ setMaterialAssignmentSubmission(undefined);
136
+ return;
137
+ }
138
+
139
+ setAssignmentSubmissionGetStatus('pending');
140
+ getOrgMaterialAssignmentSubmissionGet({
141
+ materialAssignmentSubmissionId: (_a = materialAssignment === null || materialAssignment === void 0 ? void 0 : materialAssignment.lastAssignmentSubmissionId) !== null && _a !== void 0 ? _a : 0
142
+ }).then(({
143
+ materialAssignmentSubmission
144
+ }) => {
145
+ setAssignmentSubmissionGetStatus('resolved');
146
+ setMaterialAssignmentSubmission(materialAssignmentSubmission);
147
+ }).catch(error => {
148
+ console.error(error);
149
+ setAssignmentSubmissionGetStatus('rejected');
150
+ setMaterialAssignmentSubmission(undefined);
151
+ });
152
+ }, [isAssignmentSubmitted, isReady, materialAssignment]);
153
+
154
+ if (assignmentGetStatus === 'pending' || assignmentGradeListGetStatus === 'pending' || assignmentGradeResultGetStatus === 'pending' || assignmentSubmissionGetStatus === 'pending') {
155
+ return React.createElement(Spinner, null);
156
+ }
157
+
158
+ if (!materialAssignment || assignmentGetStatus === 'rejected') {
159
+ return React.createElement(Text, {
160
+ role: "white"
161
+ }, intl.formatMessage({
162
+ id: 'materialAssignment.error'
163
+ }));
164
+ }
165
+ /**
166
+ *
167
+ */
168
+
169
+
170
+ const renderAssignmentInfo = () => {
171
+ const assignmentFilename = decodeURIComponent((materialAssignmentSubmission === null || materialAssignmentSubmission === void 0 ? void 0 : materialAssignmentSubmission.assignmentFileUrl) && new URL(materialAssignmentSubmission.assignmentFileUrl).pathname.split('/').pop() || '');
172
+
173
+ const renderAssignmentStatus = () => {
174
+ if (!isAssignmentSubmitted && isAssignmentClosed) {
175
+ return React.createElement(Text, {
176
+ bold: true,
177
+ role: "danger",
178
+ size: "small"
179
+ }, intl.formatMessage({
180
+ id: 'materialAssignment.status.deadlineExpired'
181
+ }));
182
+ }
183
+
184
+ if (isAssignmentResultVisible) {
185
+ return React.createElement(Text, {
186
+ bold: true,
187
+ role: "lightpurple",
188
+ size: "small"
189
+ }, intl.formatMessage({
190
+ id: 'materialAssignment.status.graded'
191
+ }));
192
+ }
193
+
194
+ if (isAssignmentSubmitted) {
195
+ return React.createElement(Text, {
196
+ bold: true,
197
+ role: "success",
198
+ size: "small"
199
+ }, intl.formatMessage({
200
+ id: 'materialAssignment.status.submitted'
201
+ }));
202
+ }
203
+
204
+ return React.createElement(Text, {
205
+ bold: true,
206
+ role: "warning",
207
+ size: "small"
208
+ }, intl.formatMessage({
209
+ id: 'materialAssignment.status.noSubmitted'
210
+ }));
211
+ };
212
+
213
+ const renderAssignmentScore = () => {
214
+ var _a;
215
+
216
+ return React.createElement(React.Fragment, null, React.createElement(Text, {
217
+ bold: true,
218
+ role: "white",
219
+ size: "small"
220
+ }, intl.formatMessage({
221
+ id: 'materialAssignment.table.column.score'
222
+ }, {
223
+ score: (_a = materialAssignmentGradeResult === null || materialAssignmentGradeResult === void 0 ? void 0 : materialAssignmentGradeResult.score) !== null && _a !== void 0 ? _a : '--'
224
+ })), React.createElement(Hspace, {
225
+ width: 0.25
226
+ }));
227
+ };
228
+
229
+ const renderAssignmentAttachment = () => {
230
+ if (materialAssignmentSubmission === null || materialAssignmentSubmission === void 0 ? void 0 : materialAssignmentSubmission.assignmentFileUrl) {
231
+ return React.createElement("a", {
232
+ href: materialAssignmentSubmission.assignmentFileUrl,
233
+ download: assignmentFilename,
234
+ target: "_blank",
235
+ rel: "noopener noreferrer"
236
+ }, React.createElement(Text, {
237
+ hoverable: true,
238
+ underline: true,
239
+ role: "white",
240
+ size: "small"
241
+ }, assignmentFilename));
242
+ }
243
+
244
+ if (materialAssignmentSubmission === null || materialAssignmentSubmission === void 0 ? void 0 : materialAssignmentSubmission.assignmentUrl) {
245
+ return React.createElement("a", {
246
+ href: materialAssignmentSubmission.assignmentUrl,
247
+ target: "_blank",
248
+ rel: "noopener noreferrer"
249
+ }, React.createElement(Text, {
250
+ hoverable: true,
251
+ underline: true,
252
+ role: "white",
253
+ size: "small"
254
+ }, materialAssignmentSubmission.assignmentUrl));
255
+ }
256
+
257
+ return '--';
258
+ };
259
+
260
+ return React.createElement(InfoTable, {
261
+ dark: true
262
+ }, React.createElement("tbody", null, React.createElement("tr", null, React.createElement("td", {
263
+ style: {
264
+ width: '19%'
265
+ }
266
+ }, intl.formatMessage({
267
+ id: 'materialAssignment.table.column.status'
268
+ })), React.createElement("td", null, renderAssignmentStatus())), React.createElement("tr", null, React.createElement("td", null, intl.formatMessage({
269
+ id: 'materialAssignment.table.column.deadlineDatetime'
270
+ })), React.createElement("td", null, React.createElement(FormattedDate, {
271
+ value: materialAssignment.closeDatetime,
272
+ dateStyle: "medium",
273
+ timeStyle: "short",
274
+ hour12: false
275
+ }))), React.createElement("tr", null, React.createElement("td", null, intl.formatMessage({
276
+ id: 'materialAssignment.table.column.lastSubmitDatetime'
277
+ })), React.createElement("td", null, (materialAssignmentSubmission === null || materialAssignmentSubmission === void 0 ? void 0 : materialAssignmentSubmission.createdDatetime) ? React.createElement(FormattedDate, {
278
+ value: materialAssignmentSubmission.createdDatetime,
279
+ dateStyle: "medium",
280
+ timeStyle: "short",
281
+ hour12: false
282
+ }) : '--')), React.createElement("tr", null, React.createElement("td", null, intl.formatMessage({
283
+ id: 'materialAssignment.table.column.uploadedFile'
284
+ })), React.createElement("td", null, React.createElement("div", null, renderAssignmentAttachment(), React.createElement(Vspace, {
285
+ height: 0.75
286
+ }), React.createElement(Button, {
287
+ size: "tiny",
288
+ role: "lightpurple",
289
+ disabled: [isAssignmentResultVisible, !materialAssignment.isResubmitEnabled && isAssignmentSubmitted, isAssignmentClosed].some(Boolean),
290
+ onClick: () => setShowAssignmentSubmitModal(true)
291
+ }, intl.formatMessage({
292
+ id: 'materialAssignment.button.upload'
293
+ }))))), React.createElement("tr", null, React.createElement("td", null, intl.formatMessage({
294
+ id: 'materialAssignment.table.column.assignmentScore'
295
+ })), React.createElement("td", null, renderAssignmentScore(), React.createElement(Text, {
296
+ role: "navy4",
297
+ size: "small"
298
+ }, intl.formatMessage({
299
+ id: 'materialAssignment.table.column.totalPoint'
300
+ }, {
301
+ point: materialAssignment.point
302
+ }))))));
303
+ };
304
+ /**
305
+ *
306
+ */
307
+
308
+
309
+ const renderAssignmentFeedback = () => {
310
+ var _a;
311
+
312
+ const tableColumns = [{
313
+ Header: intl.formatMessage({
314
+ id: 'materialAssignment.table.header.index'
315
+ }),
316
+ accessor: 'index',
317
+ width: 50
318
+ }, {
319
+ Header: intl.formatMessage({
320
+ id: 'materialAssignment.table.header.feedback'
321
+ }),
322
+ accessor: 'feedback'
323
+ }];
324
+ const tableData = (_a = materialAssignmentGradeList === null || materialAssignmentGradeList === void 0 ? void 0 : materialAssignmentGradeList.filter(grade => grade.comment.length).map((grade, index) => ({
325
+ index: index + 1,
326
+ feedback: React.createElement(Text, {
327
+ preWrap: true,
328
+ size: "small",
329
+ role: "navy1"
330
+ }, grade.comment)
331
+ }))) !== null && _a !== void 0 ? _a : [];
332
+ return React.createElement(TableNext, {
333
+ dark: true,
334
+ columns: tableColumns,
335
+ data: tableData,
336
+ emptyMessage: intl.formatMessage({
337
+ id: isAssignmentResultVisible ? 'materialAssignment.table.empty.noFeedback' : 'materialAssignment.table.empty.noAssignment'
338
+ })
339
+ });
340
+ };
341
+ /**
342
+ *
343
+ */
344
+
345
+
346
+ const renderAssignmentUploadModal = () => {
347
+ if (!showAssignmentSubmitModal) {
348
+ return null;
349
+ }
350
+
351
+ return React.createElement(MaterialAssignmentUploadModal, {
352
+ materialAssignment: materialAssignment,
353
+ onClose: () => setShowAssignmentSubmitModal(false),
354
+ onSubmitCallback: doGetOrgMaterialAssignmentGet
355
+ });
356
+ };
357
+
358
+ return React.createElement(MaterialAssignmentContainer, {
359
+ title: materialAssignment.title
360
+ }, React.createElement(Text, {
361
+ bold: true,
362
+ block: true,
363
+ role: "white"
364
+ }, intl.formatMessage({
365
+ id: 'materialAssignment.label.general'
366
+ })), React.createElement(Text, {
367
+ role: "navy3",
368
+ size: "tiny"
369
+ }, intl.formatMessage({
370
+ id: 'materialAssignment.description.general'
371
+ })), React.createElement(Vspace, {
372
+ height: 0.75
373
+ }), renderAssignmentInfo(), React.createElement(Vspace, {
374
+ height: 1.5
375
+ }), React.createElement(Text, {
376
+ bold: true,
377
+ block: true,
378
+ role: "white"
379
+ }, intl.formatMessage({
380
+ id: 'materialAssignment.label.feedback'
381
+ })), React.createElement(Text, {
382
+ role: "navy3",
383
+ size: "tiny"
384
+ }, intl.formatMessage({
385
+ id: 'materialAssignment.description.feedback'
386
+ })), React.createElement(Vspace, {
387
+ height: 0.75
388
+ }), renderAssignmentFeedback(), renderAssignmentUploadModal());
389
+ };
390
+
391
+ export { MaterialAssignmentContent as default };
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ import type { GetOrgMaterialAssignmentGetResponses } from '@elice/types';
3
+ interface MaterialAssignmentUploadModalProps {
4
+ materialAssignment: GetOrgMaterialAssignmentGetResponses['materialAssignment'];
5
+ onClose: () => void;
6
+ onSubmitCallback?: () => void;
7
+ }
8
+ declare const MaterialAssignmentUploadModal: React.FC<MaterialAssignmentUploadModalProps>;
9
+ export default MaterialAssignmentUploadModal;
@@ -0,0 +1,194 @@
1
+ import React from 'react';
2
+ import { useForm, Controller } from 'react-hook-form';
3
+ import { useIntl } from 'react-intl';
4
+ import { postOrgMaterialAssignmentSubmissionAdd } from '@elice/api-client';
5
+ import { Files, Notification, Modal, Alert, Vspace, Radio, RadioButton, Input, Checkbox, Text } from '@elice/blocks';
6
+ import { base } from '@elice/design-tokens';
7
+ import { validateUrl } from '@elice/utils';
8
+ import styled from 'styled-components';
9
+
10
+ const StyledAssignmentContentFiles = styled(Files).withConfig({
11
+ componentId: "sc-9bizrf-0"
12
+ })(["width:100%;.eb-files__choose-button{border-color:", ";background-color:", ";}"], base.color.primary5, base.color.primary5);
13
+
14
+ const MaterialAssignmentUploadModal = ({
15
+ materialAssignment,
16
+ onClose,
17
+ onSubmitCallback
18
+ }) => {
19
+ const intl = useIntl();
20
+ const abortCtrl = React.useRef(new AbortController());
21
+ /** Select submission method */
22
+
23
+ const [assignmentMode, setAssignmentMode] = React.useState('attachment');
24
+ /** Check "Once you submit it, you cannot submit it again." */
25
+
26
+ const [isAgreedSubmit, setAgreedSubmit] = React.useState(false);
27
+ /** Check if the submission time is past */
28
+
29
+ const isAssignmentClosed = Boolean(materialAssignment.closeDatetime < Date.now());
30
+ /** Check if it is possible to resubmit */
31
+
32
+ const isAssignmentResubmitEnabled = Boolean(materialAssignment.isResubmitEnabled);
33
+ const {
34
+ control,
35
+ formState,
36
+ handleSubmit,
37
+ reset
38
+ } = useForm({
39
+ mode: 'onChange'
40
+ });
41
+ /**
42
+ * Submit assignment.
43
+ */
44
+
45
+ const submitAssignment = handleSubmit(async data => {
46
+ var _a;
47
+
48
+ try {
49
+ await postOrgMaterialAssignmentSubmissionAdd(Object.assign(Object.assign({}, data), {
50
+ materialAssignmentId: (_a = materialAssignment === null || materialAssignment === void 0 ? void 0 : materialAssignment.id) !== null && _a !== void 0 ? _a : 0
51
+ }), {
52
+ signal: abortCtrl.current.signal
53
+ });
54
+ onClose();
55
+ Notification.success(intl.formatMessage({
56
+ id: 'materialAssignment.notification.submit.success'
57
+ }));
58
+
59
+ if (typeof onSubmitCallback === 'function') {
60
+ onSubmitCallback();
61
+ }
62
+ } catch (error) {
63
+ if (error.name === 'AbortError') {
64
+ return Notification.error(intl.formatMessage({
65
+ id: 'materialAssignment.notification.submit.cancel'
66
+ }));
67
+ }
68
+
69
+ Notification.error(intl.formatMessage({
70
+ id: 'materialAssignment.notification.submit.failure'
71
+ }));
72
+ }
73
+ }); //
74
+ //
75
+ //
76
+
77
+ React.useEffect(() => {
78
+ const _abortCtrl = abortCtrl.current;
79
+ return () => {
80
+ _abortCtrl.abort();
81
+ };
82
+ }, []);
83
+ return React.createElement(Modal, {
84
+ title: intl.formatMessage({
85
+ id: 'materialAssignment.modal.title'
86
+ }),
87
+ footerButtons: [{
88
+ label: intl.formatMessage({
89
+ id: 'materialAssignment.modal.button.submit'
90
+ }),
91
+ loading: formState.isSubmitting,
92
+ disabled: [!isAssignmentResubmitEnabled && !isAgreedSubmit, formState.isSubmitting, !formState.isValid].some(Boolean),
93
+ onClick: submitAssignment
94
+ }, {
95
+ label: intl.formatMessage({
96
+ id: 'materialAssignment.modal.button.cancel'
97
+ }),
98
+ role: 'gray1',
99
+ onClick: onClose
100
+ }],
101
+ onHide: onClose
102
+ }, React.createElement(Alert, {
103
+ role: isAssignmentResubmitEnabled ? 'primary' : 'warning'
104
+ }, intl.formatMessage({
105
+ id: isAssignmentResubmitEnabled ? 'materialAssignment.alert.oftenSubmit' : 'materialAssignment.alert.onceSubmit'
106
+ })), React.createElement(Vspace, {
107
+ height: 1.5
108
+ }), React.createElement(Radio, {
109
+ purpleWhite: true,
110
+ borderRound: true,
111
+ value: assignmentMode,
112
+ onChange: value => {
113
+ reset();
114
+ setAgreedSubmit(false);
115
+ setAssignmentMode(value);
116
+ }
117
+ }, React.createElement(RadioButton, {
118
+ value: "attachment"
119
+ }, intl.formatMessage({
120
+ id: 'materialAssignment.radio.option.attachment'
121
+ })), React.createElement(RadioButton, {
122
+ value: "url"
123
+ }, intl.formatMessage({
124
+ id: 'materialAssignment.radio.option.url'
125
+ }))), React.createElement(Vspace, {
126
+ height: 1
127
+ }), assignmentMode === 'attachment' ? React.createElement(Controller, {
128
+ control: control,
129
+ name: "assignmentFile",
130
+ rules: {
131
+ required: true
132
+ },
133
+ render: ({
134
+ field
135
+ }) => React.createElement(StyledAssignmentContentFiles, Object.assign({}, field, {
136
+ files: field.value ? [field.value] : undefined,
137
+ accept: "*",
138
+ maxCount: 1,
139
+ maxSize: 300,
140
+ disabled: isAssignmentClosed,
141
+ dropMessage: intl.formatMessage({
142
+ id: 'materialAssignment.attachment.dropMessage'
143
+ }),
144
+ buttonMessage: intl.formatMessage({
145
+ id: 'materialAssignment.attachment.button'
146
+ }),
147
+ maxSizeMessage: intl.formatMessage({
148
+ id: 'materialAssignment.attachment.maxSizeMessage'
149
+ }),
150
+ onChange: newFiles => {
151
+ if (Array.isArray(newFiles) && newFiles[0] instanceof File) {
152
+ field.onChange(newFiles[0]);
153
+ } else {
154
+ field.onChange(undefined);
155
+ }
156
+ }
157
+ }))
158
+ }) : React.createElement(Controller, {
159
+ control: control,
160
+ name: "assignmentUrl",
161
+ rules: {
162
+ required: true,
163
+ validate: url => validateUrl(url !== null && url !== void 0 ? url : '') ? true : intl.formatMessage({
164
+ id: 'materialAssignment.input.invalid'
165
+ })
166
+ },
167
+ render: ({
168
+ field,
169
+ fieldState
170
+ }) => {
171
+ var _a;
172
+
173
+ return React.createElement(Input, Object.assign({}, field, {
174
+ width: "full",
175
+ size: "small",
176
+ placeholder: "http(s)://",
177
+ invalid: fieldState.invalid,
178
+ invalidText: (_a = fieldState.error) === null || _a === void 0 ? void 0 : _a.message
179
+ }));
180
+ }
181
+ }), isAssignmentResubmitEnabled ? null : React.createElement(React.Fragment, null, React.createElement(Vspace, {
182
+ height: 1
183
+ }), React.createElement(Checkbox, {
184
+ size: "small",
185
+ value: isAgreedSubmit,
186
+ onChange: setAgreedSubmit
187
+ }, React.createElement(Text, {
188
+ size: "small"
189
+ }, intl.formatMessage({
190
+ id: 'materialAssignment.attachment.checkbox.onceSubmit'
191
+ })))));
192
+ };
193
+
194
+ export { MaterialAssignmentUploadModal as default };
@@ -0,0 +1,2 @@
1
+ export { default as MaterialAssignment } from './MaterialAssignment';
2
+ export type { MaterialAssignmentProps } from './MaterialAssignment';
@@ -0,0 +1,39 @@
1
+ export declare const en: {
2
+ 'materialAssignment.button.upload': string;
3
+ 'materialAssignment.error': string;
4
+ 'materialAssignment.status.noSubmitted': string;
5
+ 'materialAssignment.status.submitted': string;
6
+ 'materialAssignment.status.graded': string;
7
+ 'materialAssignment.status.deadlineExpired': string;
8
+ 'materialAssignment.table.column.status': string;
9
+ 'materialAssignment.table.column.deadlineDatetime': string;
10
+ 'materialAssignment.table.column.lastSubmitDatetime': string;
11
+ 'materialAssignment.table.column.uploadedFile': string;
12
+ 'materialAssignment.table.column.assignmentScore': string;
13
+ 'materialAssignment.table.column.score': string;
14
+ 'materialAssignment.table.column.totalPoint': string;
15
+ 'materialAssignment.table.header.index': string;
16
+ 'materialAssignment.table.header.feedback': string;
17
+ 'materialAssignment.table.empty.noAssignment': string;
18
+ 'materialAssignment.table.empty.noFeedback': string;
19
+ 'materialAssignment.label.general': string;
20
+ 'materialAssignment.label.feedback': string;
21
+ 'materialAssignment.description.general': string;
22
+ 'materialAssignment.description.feedback': string;
23
+ 'materialAssignment.notification.submit.success': string;
24
+ 'materialAssignment.notification.submit.failure': string;
25
+ 'materialAssignment.notification.submit.cancel': string;
26
+ 'materialAssignment.modal.title': string;
27
+ 'materialAssignment.modal.button.submit': string;
28
+ 'materialAssignment.modal.button.cancel': string;
29
+ 'materialAssignment.alert.onceSubmit': string;
30
+ 'materialAssignment.alert.oftenSubmit': string;
31
+ 'materialAssignment.radio.option.attachment': string;
32
+ 'materialAssignment.radio.option.url': string;
33
+ 'materialAssignment.attachment.dropMessage': string;
34
+ 'materialAssignment.attachment.maxSizeMessage': string;
35
+ 'materialAssignment.attachment.button': string;
36
+ 'materialAssignment.attachment.checkbox.onceSubmit': string;
37
+ 'materialAssignment.input.invalid': string;
38
+ };
39
+ export declare const ko: typeof en;