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