id())->firstOrFail(); return $guru->id; } public function index(Request $request) { $guruId = $this->getGuruId(); $mapelIds = Guru::find($guruId)->mapel()->pluck('mapels.id')->toArray(); $materi = Materi::with('children') ->whereNull('parent_id') ->where('guru_id', $guruId) ->whereIn('mapel_id', $mapelIds) ->get(); $mapel = Guru::find($guruId)->mapel()->first(); // ambil mapel pertama untuk passing ke view return view('guru.materi.index', compact('materi', 'mapel')); } public function preview($id) { $materi = Materi::findOrFail($id); $tugas = Tugas::where('materi_id', $id)->get(); return view('guru.materi.tab', compact('materi', 'tugas')); } public function create() { $guruId = auth()->user()->guru->id; // atau cara dapat guru_id sesuai setup kamu $mapel = Guru::find($guruId)->mapel()->first(); $daftarMateriInduk = Materi::where('guru_id', $guruId) ->whereNull('parent_id') ->get(); $kelasList = Kelas::all(); return view('guru.materi.create', compact('mapel', 'daftarMateriInduk', 'kelasList')); } public function store(Request $request) { $request->validate([ 'judul' => 'required', 'mapel_id' => 'required|exists:mapels,id', 'kelas_id' => 'array', 'kelas_id.*' => 'exists:kelas,id', 'tanggal_terbit' => 'array', 'tanggal_terbit.*' => 'nullable|date', 'parent_id' => 'nullable|exists:materi,id', 'is_parent' => 'required|in:0,1', ]); $guruId = $this->getGuruId(); $materi = Materi::create([ 'guru_id' => $guruId, 'mapel_id' => $request->mapel_id, 'judul' => $request->judul, 'parent_id' => $request->is_parent == 0 ? $request->parent_id : null, 'isi' => '', ]); if ($request->has('kelas_id')) { $kelasSyncData = []; foreach ($request->kelas_id as $kelasId) { $kelasSyncData[$kelasId] = [ 'tanggal_terbit' => $request->tanggal_terbit[$kelasId] ?? null, ]; } $materi->kelas()->sync($kelasSyncData); } return redirect()->route('guru.materi.index') ->with('success', 'Materi berhasil disimpan. Silakan isi konten materi.'); } public function edit($id) { $materi = Materi::with('kelas')->findOrFail($id); $guru = Guru::where('user_id', auth()->id())->firstOrFail(); $daftarMateriInduk = Materi::whereNull('parent_id') ->where('guru_id', $guru->id) ->where('id', '!=', $id) ->get(); $daftarMapel = $guru->mapel; // <== Tambahkan ini $kelasList = Kelas::all(); return view('guru.materi.edit', compact('materi', 'daftarMateriInduk', 'kelasList', 'daftarMapel')); } public function update(Request $request, $id) { $materi = Materi::findOrFail($id); $request->validate([ 'judul' => 'required', 'mapel_id' => 'required|exists:mapels,id', 'kelas_id' => 'array', 'kelas_id.*' => 'exists:kelas,id', 'tanggal_terbit' => 'array', 'tanggal_terbit.*' => 'nullable|date', 'parent_id' => 'nullable|exists:materi,id', 'is_parent' => 'required|in:0,1', ]); $materi->update([ 'judul' => $request->judul, 'mapel_id' => $request->mapel_id, 'parent_id' => $request->is_parent == 0 ? $request->parent_id : null, ]); if ($request->has('kelas_id')) { $kelasSyncData = []; foreach ($request->kelas_id as $kelasId) { $kelasSyncData[$kelasId] = [ 'tanggal_terbit' => $request->tanggal_terbit[$kelasId] ?? null, ]; } $materi->kelas()->sync($kelasSyncData); } return redirect()->route('guru.materi.index')->with('success', 'Materi diperbarui'); } public function editIsi($id) { $materi = Materi::findOrFail($id); return view('guru.materi.edit_isi', compact('materi')); } public function updateIsi(Request $request, $id) { $materi = Materi::findOrFail($id); $request->validate([ 'isi' => 'required', 'file' => 'nullable|file|mimes:jpeg,jpg,png,gif,svg,pdf,docx,xlsx,mp4,mov|max:20480', ]); $data = ['isi' => $request->isi]; if ($request->hasFile('file')) { $file = $request->file('file'); $ext = $file->getClientOriginalExtension(); if (in_array($ext, ['jpg', 'jpeg', 'png', 'gif', 'svg'])) { $path = $file->store('materi_images', 'public'); } elseif (in_array($ext, ['pdf', 'docx', 'xlsx'])) { $path = $file->store('materi_documents', 'public'); } elseif (in_array($ext, ['mp4', 'mov'])) { $path = $file->store('materi_videos', 'public'); } else { return redirect()->back()->withErrors('Format file tidak didukung'); } $data['file'] = $path; } $materi->update($data); return redirect()->route('guru.materi.index')->with('success', 'Isi materi berhasil diperbarui.'); } public function destroy($id) { $materi = Materi::findOrFail($id); $materi->delete(); return redirect()->route('guru.materi.index')->with('success', 'Materi dihapus'); } public function upload(Request $request) { $request->validate([ 'file' => 'required|file|mimes:jpeg,jpg,png,gif,svg,pdf,docx,xlsx,mp4|max:20480', ]); if ($request->hasFile('file')) { $file = $request->file('file'); $ext = $file->getClientOriginalExtension(); if (in_array($ext, ['jpg', 'jpeg', 'png', 'gif', 'svg'])) { $path = $file->store('materi_images', 'public'); } elseif (in_array($ext, ['pdf', 'docx', 'xlsx'])) { $path = $file->store('materi_documents', 'public'); } elseif ($ext === 'mp4') { $path = $file->store('materi_videos', 'public'); } else { return response()->json(['error' => 'Format file tidak didukung'], 400); } return response()->json([ 'location' => asset('storage/' . $path) ]); } return response()->json(['error' => 'Upload gagal'], 400); } }