This commit is contained in:
@@ -61,7 +61,6 @@ export const ExamRoomWorkspace: React.FC<Props> = ({ examId, onBack }) => {
|
||||
const [editable, setEditable] = useState(false);
|
||||
const [prepEditable, setPrepEditable] = useState(false);
|
||||
const [displayStatus, setDisplayStatus] = useState('draft');
|
||||
const canEditApps = displayStatus === 'draft' || displayStatus === 'ready' || displayStatus === 'active';
|
||||
const [searchMode, setSearchMode] = useState<'single' | 'bulk'>('single');
|
||||
const [bulkInput, setBulkInput] = useState('');
|
||||
const [canPublish, setCanPublish] = useState(false);
|
||||
@@ -96,6 +95,10 @@ export const ExamRoomWorkspace: React.FC<Props> = ({ examId, onBack }) => {
|
||||
const [pdfLoading, setPdfLoading] = useState(false);
|
||||
const [inlineResource, setInlineResource] = useState<{ url: string; title: string; isImage: boolean } | null>(null);
|
||||
|
||||
const canEditApps = displayStatus === 'draft' || displayStatus === 'ready' || displayStatus === 'active';
|
||||
const anyPaperSent = students.some((s) => s.paperSentAt);
|
||||
const canModifyPapers = prepEditable || (!anyPaperSent && (displayStatus === 'draft' || displayStatus === 'ready' || displayStatus === 'active'));
|
||||
|
||||
const load = useCallback(async () => {
|
||||
setLoading(true);
|
||||
try {
|
||||
@@ -727,12 +730,12 @@ export const ExamRoomWorkspace: React.FC<Props> = ({ examId, onBack }) => {
|
||||
<p className="config-card-desc">
|
||||
Mỗi gói đề gồm <strong>1 file PDF</strong> (đề chính) và <strong>tài nguyên kèm</strong> (ảnh, zip, doc…). Chia ngẫu nhiên sẽ gán cả gói cho từng sinh viên.
|
||||
</p>
|
||||
{!prepEditable && (
|
||||
{!canModifyPapers && (
|
||||
<p className="config-card-desc" style={{ color: 'var(--danger)' }}>
|
||||
Không thể thêm gói đề — phòng đã khóa hoặc đã tới giờ thi.
|
||||
Không thể thay đổi gói đề — đề thi đã được gửi cho sinh viên hoặc phòng thi đã kết thúc.
|
||||
</p>
|
||||
)}
|
||||
{prepEditable && (
|
||||
{canModifyPapers && (
|
||||
<div style={{ display: 'flex', flexDirection: 'column', gap: '0.65rem', marginBottom: '0.75rem' }}>
|
||||
<input
|
||||
className="search-input"
|
||||
@@ -749,7 +752,7 @@ export const ExamRoomWorkspace: React.FC<Props> = ({ examId, onBack }) => {
|
||||
/>
|
||||
</label>
|
||||
<label className="login-field">
|
||||
<span>Tài nguyên kèm (tùy chọn, nhiều file)</span>
|
||||
<span>Tài nguyên kèm (tùy chọn, many files)</span>
|
||||
<input
|
||||
type="file"
|
||||
multiple
|
||||
@@ -800,7 +803,7 @@ export const ExamRoomWorkspace: React.FC<Props> = ({ examId, onBack }) => {
|
||||
))
|
||||
)}
|
||||
</ul>
|
||||
{prepEditable && (
|
||||
{canModifyPapers && (
|
||||
<div style={{ display: 'flex', gap: '0.35rem', marginTop: '0.5rem', flexWrap: 'wrap' }}>
|
||||
<label className="btn btn-ghost btn-sm" style={{ cursor: 'pointer' }}>
|
||||
+ Tài nguyên
|
||||
@@ -815,7 +818,7 @@ export const ExamRoomWorkspace: React.FC<Props> = ({ examId, onBack }) => {
|
||||
))}
|
||||
</div>
|
||||
)}
|
||||
{papers.length > 0 && students.length > 0 && prepEditable && (
|
||||
{papers.length > 0 && students.length > 0 && canModifyPapers && (
|
||||
<button type="button" className="btn btn-secondary" style={{ width: '100%', marginTop: '0.65rem' }} onClick={assignRandomPackages}>
|
||||
Chia gói đề ngẫu nhiên
|
||||
</button>
|
||||
|
||||
Reference in New Issue
Block a user