add-setting

This commit is contained in:
reihanrere 2025-05-24 21:08:04 +07:00
parent f6efb0d61e
commit babc8b2bd3
17 changed files with 3414 additions and 91 deletions

View File

@ -7,6 +7,7 @@ use App\Models\Assessment;
use App\Models\ClassRoom; use App\Models\ClassRoom;
use App\Models\ClassStudent; use App\Models\ClassStudent;
use App\Models\ClassSubject; use App\Models\ClassSubject;
use App\Models\HomeRoomTeacher;
use App\Models\Student; use App\Models\Student;
use App\Models\Subject; use App\Models\Subject;
use App\Models\TeacherSubject; use App\Models\TeacherSubject;
@ -32,12 +33,26 @@ class StudentReport extends Page
public static function canAccess(): bool public static function canAccess(): bool
{ {
return auth()->user()->hasAnyRole(['super_admin']); $user = auth()->user();
$isTeacher = false;
$homeRoomTeacher = HomeRoomTeacher::where('teacher_id', $user->id)->first();
if ($homeRoomTeacher) {
$isTeacher = true;
}
return auth()->user()->hasAnyRole(['super_admin']) || auth()->user()->hasAnyRole(['headmaster']) || $isTeacher;
} }
public static function shouldRegisterNavigation(): bool public static function shouldRegisterNavigation(): bool
{ {
return auth()->user()->hasAnyRole(['super_admin']); $user = auth()->user();
$isTeacher = false;
$homeRoomTeacher = HomeRoomTeacher::where('teacher_id', $user->id)->first();
if ($homeRoomTeacher) {
$isTeacher = true;
}
return auth()->user()->hasAnyRole(['super_admin']) || auth()->user()->hasAnyRole(['headmaster']) || $isTeacher;
} }
public function mount(): void public function mount(): void
@ -51,12 +66,36 @@ class StudentReport extends Page
public function form(Form $form): Form public function form(Form $form): Form
{ {
return $form->schema([ return $form->schema([
// Select::make('class_id')
// ->label('Class')
// ->required()
// ->options(ClassRoom::pluck('class_name', 'id')->toArray())
// ->searchable()
// ->reactive()
// ->afterStateUpdated(function ($state) {
// $this->class_id = $state;
// $this->data['class_id'] = $state; // Update data array
// $this->loadData();
// }),
Select::make('class_id') Select::make('class_id')
->label('Class') ->label('Class')
->required() ->required()
->options(ClassRoom::pluck('class_name', 'id')->toArray()) ->options(function () {
$query = ClassRoom::query();
$user = auth()->user();
if ($user->hasAnyRole(['teacher'])) {
$homeRoomTeacher = HomeRoomTeacher::where('teacher_id', $user->id)->first();
if ($homeRoomTeacher) {
$query->where('id', $homeRoomTeacher->class_room_id);
}
}
return $query->pluck('class_name', 'id')->toArray();
})
->searchable() ->searchable()
->reactive() ->native(false)
->afterStateUpdated(function ($state) { ->afterStateUpdated(function ($state) {
$this->class_id = $state; $this->class_id = $state;
$this->data['class_id'] = $state; // Update data array $this->data['class_id'] = $state; // Update data array

View File

@ -7,6 +7,7 @@ use App\Filament\Resources\AcademicYearResource\RelationManagers;
use App\Models\AcademicYear; use App\Models\AcademicYear;
use Filament\Forms; use Filament\Forms;
use Filament\Forms\Form; use Filament\Forms\Form;
use Filament\Notifications\Notification;
use Filament\Resources\Resource; use Filament\Resources\Resource;
use Filament\Tables; use Filament\Tables;
use Filament\Tables\Table; use Filament\Tables\Table;
@ -41,7 +42,9 @@ class AcademicYearResource extends Resource
return $table return $table
->columns([ ->columns([
Tables\Columns\TextColumn::make('name') Tables\Columns\TextColumn::make('name')
->searchable(), ->searchable()
->weight(fn (AcademicYear $record) => $record->is_active ? 'bold' : 'normal')
->color(fn (AcademicYear $record) => $record->is_active ? 'success' : null),
Tables\Columns\IconColumn::make('is_active') Tables\Columns\IconColumn::make('is_active')
->boolean(), ->boolean(),
Tables\Columns\TextColumn::make('start_date') Tables\Columns\TextColumn::make('start_date')
@ -68,6 +71,22 @@ class AcademicYearResource extends Resource
]) ])
->actions([ ->actions([
Tables\Actions\EditAction::make(), Tables\Actions\EditAction::make(),
Tables\Actions\Action::make('toggleActive')
->label('Toggle Active')
->icon('heroicon-o-power')
->action(function (AcademicYear $record) {
// If setting to active, deactivate all others
if ($record->is_active) {
Notification::make()
->title('Info')
->body('The school year is active')
->info()
->send();
} else {
AcademicYear::where('is_active', true)->update(['is_active' => false]);
$record->update(['is_active' => true]);
}
}),
]) ])
->bulkActions([ ->bulkActions([
Tables\Actions\BulkActionGroup::make([ Tables\Actions\BulkActionGroup::make([

View File

@ -7,9 +7,11 @@ use App\Filament\Resources\AssessmentResource\RelationManagers;
use App\Models\Assessment; use App\Models\Assessment;
use App\Models\AssessmentComponent; use App\Models\AssessmentComponent;
use App\Models\ClassStudent; use App\Models\ClassStudent;
use App\Models\HomeRoomTeacher;
use App\Models\Student; use App\Models\Student;
use App\Models\TeacherSubject; use App\Models\TeacherSubject;
use Filament\Forms; use Filament\Forms;
use Filament\Forms\Components\Select;
use Filament\Forms\Form; use Filament\Forms\Form;
use Filament\Resources\Resource; use Filament\Resources\Resource;
use Filament\Tables; use Filament\Tables;
@ -29,14 +31,56 @@ class AssessmentResource extends Resource
{ {
return $form return $form
->schema([ ->schema([
Forms\Components\Select::make('teacher_subject_id') // Forms\Components\Select::make('teacher_subject_id')
// ->label('Teacher Subject')
// ->required()
// ->relationship('teacherSubject', 'id')
// ->getOptionLabelFromRecordUsing(fn (TeacherSubject $record) =>
// $record->teacher->name . ' - ' . $record->subject->name . ' - ' . $record->class->class_name . ' - ' . $record->academicYear->name)
// ->searchable()
// ->preload()
// ->afterStateUpdated(function (callable $set, $state) {
// if ($state) {
// $teacherSubject = TeacherSubject::find($state);
// if ($teacherSubject) {
// $set('student_id', null);
// }
// }
// })
// ->required(),
Select::make('teacher_subject_id')
->label('Teacher Subject') ->label('Teacher Subject')
->required() ->required()
->relationship('teacherSubject', 'id') ->options(function () {
->getOptionLabelFromRecordUsing(fn (TeacherSubject $record) => $user = auth()->user();
$record->teacher->name . ' - ' . $record->subject->name . ' - ' . $record->class->class_name . ' - ' . $record->academicYear->name) $query = TeacherSubject::with(['teacher', 'subject', 'class', 'academicYear']);
if ($user->hasRole('teacher')) {
// Ambil ID kelas dimana user menjadi wali kelas
$homeRoomClassIds = HomeRoomTeacher::where('teacher_id', $user->id)
->pluck('class_room_id')
->toArray();
$query->where(function($q) use ($user, $homeRoomClassIds) {
// Mata pelajaran yang diajarkan oleh guru ini
$q->where('teacher_id', $user->id)
// ATAU kelas dimana dia menjadi wali kelas
->orWhereIn('class_id', $homeRoomClassIds);
});
}
return $query->get()->mapWithKeys(fn ($item) => [
$item->id => sprintf('%s - %s - %s - %s',
$item->teacher->name,
$item->subject->name,
$item->class->class_name,
$item->academicYear->name
)
]);
})
->searchable() ->searchable()
->preload() ->live()
->afterStateUpdated(function (callable $set, $state) { ->afterStateUpdated(function (callable $set, $state) {
if ($state) { if ($state) {
$teacherSubject = TeacherSubject::find($state); $teacherSubject = TeacherSubject::find($state);
@ -44,8 +88,7 @@ class AssessmentResource extends Resource
$set('student_id', null); $set('student_id', null);
} }
} }
}) }),
->required(),
Forms\Components\Select::make('student_id') Forms\Components\Select::make('student_id')
->label('Student') ->label('Student')
@ -128,7 +171,7 @@ class AssessmentResource extends Resource
]) ])
->bulkActions([ ->bulkActions([
Tables\Actions\BulkActionGroup::make([ Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(), Tables\Actions\DeleteBulkAction::make()->visible(fn () => auth()->user()->hasRole('super_admin') || auth()->user()->hasRole('teacher')),
]), ]),
]) ])
->emptyStateActions([ ->emptyStateActions([

View File

@ -3,21 +3,43 @@
namespace App\Filament\Resources\AssessmentResource\Pages; namespace App\Filament\Resources\AssessmentResource\Pages;
use App\Filament\Resources\AssessmentResource; use App\Filament\Resources\AssessmentResource;
use App\Models\Assessment;
use App\Models\HomeRoomTeacher;
use Filament\Actions; use Filament\Actions;
use Filament\Resources\Pages\ListRecords; use Filament\Resources\Pages\ListRecords;
use Illuminate\Database\Eloquent\Builder;
class ListAssessments extends ListRecords class ListAssessments extends ListRecords
{ {
protected static string $resource = AssessmentResource::class; protected static string $resource = AssessmentResource::class;
protected function getTableQuery(): Builder
{
$user = auth()->user();
if ($user->hasRole('teacher')) {
$homeRoomClassIds = HomeRoomTeacher::where('teacher_id', $user->id)
->pluck('class_room_id')
->toArray();
return Assessment::with('teacherSubject', 'student')
->whereHas('teacherSubject', function (Builder $query) use ($homeRoomClassIds, $user) {
$query->where('teacher_id', $user->id)
->orWhereIn('class_id', $homeRoomClassIds);
});
}
return Assessment::query();
}
protected function getHeaderActions(): array protected function getHeaderActions(): array
{ {
return [ return [
Actions\CreateAction::make(), Actions\CreateAction::make()->visible(fn () => auth()->user()->hasRole('super_admin')),
Actions\Action::make('multiple') Actions\Action::make('multiple')
->label('Multiple Assessments') ->label('Multiple Assessments')
->url('assessments/multiple') ->url('assessments/multiple')
->icon('heroicon-o-user-group'), ->icon('heroicon-o-user-group')
->visible(fn () => auth()->user()->hasRole('super_admin') || auth()->user()->hasRole('teacher')),
]; ];
} }
} }

View File

@ -6,6 +6,7 @@ use App\Filament\Resources\AssessmentResource;
use App\Models\Assessment; use App\Models\Assessment;
use App\Models\Attendances; use App\Models\Attendances;
use App\Models\ClassStudent; use App\Models\ClassStudent;
use App\Models\HomeRoomTeacher;
use Filament\Actions; use Filament\Actions;
use Filament\Forms\Components\Select; use Filament\Forms\Components\Select;
use Filament\Resources\Pages\page; use Filament\Resources\Pages\page;
@ -43,17 +44,51 @@ class MultipleAssessments extends page
return [ return [
Forms\Components\Grid::make(2) Forms\Components\Grid::make(2)
->schema([ ->schema([
Forms\Components\Select::make('teacherSubjectId') // Forms\Components\Select::make('teacherSubjectId')
// ->label('Teacher Subject')
// ->options(
// TeacherSubject::with(['teacher', 'subject', 'class', 'academicYear'])->get()->mapWithKeys(function ($item) {
// return [
// $item->id => "{$item->teacher->name} - {$item->subject->name} - {$item->class->class_name} - {$item->academicYear->name}"
// ];
// })->toArray()
// )
// ->searchable()
// ->reactive()
// ->afterStateUpdated(function ($state) {
// $this->teacherSubjectId = $state;
// $this->loadStudents();
// }),
Select::make('teacherSubjectId')
->label('Teacher Subject') ->label('Teacher Subject')
->options( ->required()
TeacherSubject::with(['teacher', 'subject', 'class', 'academicYear'])->get()->mapWithKeys(function ($item) { ->options(function () {
return [ $user = auth()->user();
$item->id => "{$item->teacher->name} - {$item->subject->name} - {$item->class->class_name} - {$item->academicYear->name}" $query = TeacherSubject::with(['teacher', 'subject', 'class', 'academicYear']);
];
})->toArray() if ($user->hasRole('teacher')) {
) $homeRoomClassIds = HomeRoomTeacher::where('teacher_id', $user->id)
->pluck('class_room_id')
->toArray();
$query->where(function($q) use ($user, $homeRoomClassIds) {
$q->where('teacher_id', $user->id)
->orWhereIn('class_id', $homeRoomClassIds);
});
}
return $query->get()->mapWithKeys(fn ($item) => [
$item->id => sprintf('%s - %s - %s - %s',
$item->teacher->name,
$item->subject->name,
$item->class->class_name,
$item->academicYear->name
)
]);
})
->searchable() ->searchable()
->reactive() ->live()
->afterStateUpdated(function ($state) { ->afterStateUpdated(function ($state) {
$this->teacherSubjectId = $state; $this->teacherSubjectId = $state;
$this->loadStudents(); $this->loadStudents();

View File

@ -6,11 +6,13 @@ use App\Filament\Resources\AttendancesResource\Pages;
use App\Models\Attendances; use App\Models\Attendances;
use App\Models\ClassRoom; use App\Models\ClassRoom;
use App\Models\ClassStudent; use App\Models\ClassStudent;
use App\Models\HomeRoomTeacher;
use App\Models\Student; use App\Models\Student;
use App\Models\Subject; use App\Models\Subject;
use App\Models\TeacherSubject; use App\Models\TeacherSubject;
use App\Models\User; use App\Models\User;
use Filament\Forms; use Filament\Forms;
use Filament\Forms\Components\Select;
use Filament\Forms\Form; use Filament\Forms\Form;
use Filament\Resources\Resource; use Filament\Resources\Resource;
use Filament\Tables; use Filament\Tables;
@ -29,14 +31,38 @@ class AttendancesResource extends Resource
->schema([ ->schema([
Forms\Components\Section::make('Data Absensi') Forms\Components\Section::make('Data Absensi')
->schema([ ->schema([
Forms\Components\Select::make('teacher_subject_id') Select::make('teacher_subject_id')
->label('Teacher Subject') ->label('Teacher Subject')
->required() ->required()
->relationship('teacherSubject', 'id') ->options(function () {
->getOptionLabelFromRecordUsing(fn (TeacherSubject $record) => $user = auth()->user();
$record->teacher->name . ' - ' . $record->subject->name . ' - ' . $record->class->class_name . ' - ' . $record->academicYear->name) $query = TeacherSubject::with(['teacher', 'subject', 'class', 'academicYear']);
if ($user->hasRole('teacher')) {
// Ambil ID kelas dimana user menjadi wali kelas
$homeRoomClassIds = HomeRoomTeacher::where('teacher_id', $user->id)
->pluck('class_room_id')
->toArray();
$query->where(function($q) use ($user, $homeRoomClassIds) {
// Mata pelajaran yang diajarkan oleh guru ini
$q->where('teacher_id', $user->id)
// ATAU kelas dimana dia menjadi wali kelas
->orWhereIn('class_id', $homeRoomClassIds);
});
}
return $query->get()->mapWithKeys(fn ($item) => [
$item->id => sprintf('%s - %s - %s - %s',
$item->teacher->name,
$item->subject->name,
$item->class->class_name,
$item->academicYear->name
)
]);
})
->searchable() ->searchable()
->preload() ->live()
->afterStateUpdated(function (callable $set, $state) { ->afterStateUpdated(function (callable $set, $state) {
if ($state) { if ($state) {
$teacherSubject = TeacherSubject::find($state); $teacherSubject = TeacherSubject::find($state);
@ -53,7 +79,7 @@ class AttendancesResource extends Resource
->default(now()) ->default(now())
->live(), ->live(),
Forms\Components\Select::make('student_id') Select::make('student_id')
->label('Student') ->label('Student')
->required() ->required()
->searchable() ->searchable()
@ -77,7 +103,7 @@ class AttendancesResource extends Resource
return $student ? $student->full_name . ' (' . $student->nis . ')' : null; return $student ? $student->full_name . ' (' . $student->nis . ')' : null;
}), }),
Forms\Components\Select::make('semester') Select::make('semester')
->label('Semester') ->label('Semester')
->required() ->required()
->options([ ->options([
@ -85,7 +111,7 @@ class AttendancesResource extends Resource
'second' => 'Second Semester' 'second' => 'Second Semester'
]), ]),
Forms\Components\Select::make('status') Select::make('status')
->label('Status') ->label('Status')
->required() ->required()
->options([ ->options([
@ -161,10 +187,6 @@ class AttendancesResource extends Resource
Tables\Columns\TextColumn::make('recorder.name') Tables\Columns\TextColumn::make('recorder.name')
->label('Record by') ->label('Record by')
->toggleable(), ->toggleable(),
Tables\Columns\TextColumn::make('notes')
->label('Notes')
->toggleable()
]) ])
->filters([ ->filters([
Tables\Filters\SelectFilter::make('status') Tables\Filters\SelectFilter::make('status')
@ -218,12 +240,9 @@ class AttendancesResource extends Resource
]) ])
->bulkActions([ ->bulkActions([
Tables\Actions\BulkActionGroup::make([ Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(), Tables\Actions\DeleteBulkAction::make()->visible(fn () => auth()->user()->hasRole('super_admin') || auth()->user()->hasRole('teacher')),
]), ]),
]) ])
->emptyStateActions([
Tables\Actions\CreateAction::make(),
])
->defaultSort('date', 'desc') ->defaultSort('date', 'desc')
->groups([ ->groups([
Tables\Grouping\Group::make('date') Tables\Grouping\Group::make('date')

View File

@ -3,21 +3,43 @@
namespace App\Filament\Resources\AttendancesResource\Pages; namespace App\Filament\Resources\AttendancesResource\Pages;
use App\Filament\Resources\AttendancesResource; use App\Filament\Resources\AttendancesResource;
use App\Models\Attendances;
use App\Models\HomeRoomTeacher;
use Filament\Actions; use Filament\Actions;
use Filament\Resources\Pages\ListRecords; use Filament\Resources\Pages\ListRecords;
use Illuminate\Database\Eloquent\Builder;
class ListAttendances extends ListRecords class ListAttendances extends ListRecords
{ {
protected static string $resource = AttendancesResource::class; protected static string $resource = AttendancesResource::class;
protected function getTableQuery(): ?Builder
{
$user = auth()->user();
if ($user->hasRole('teacher')) {
$homeRoomClassIds = HomeRoomTeacher::where('teacher_id', $user->id)
->pluck('class_room_id')
->toArray();
return Attendances::with('teacherSubject', 'student')
->whereHas('teacherSubject', function (Builder $query) use ($homeRoomClassIds, $user) {
$query->where('teacher_id', $user->id)
->orWhereIn('class_id', $homeRoomClassIds);
});
}
return Attendances::query();
}
protected function getHeaderActions(): array protected function getHeaderActions(): array
{ {
return [ return [
Actions\CreateAction::make(), Actions\CreateAction::make()->visible(fn () => auth()->user()->hasRole('super_admin')),
Actions\Action::make('multiple') Actions\Action::make('multiple')
->label('Multiple Attendance') ->label('Multiple Attendance')
->url('attendances/multiple') ->url('attendances/multiple')
->icon('heroicon-o-user-group'), ->icon('heroicon-o-user-group')
->visible(fn () => auth()->user()->hasRole('super_admin') || auth()->user()->hasRole('teacher')),
]; ];
} }
} }

View File

@ -7,6 +7,7 @@ use App\Models\Assessment;
use App\Models\Attendances; use App\Models\Attendances;
use App\Models\ClassRoom; use App\Models\ClassRoom;
use App\Models\ClassStudent; use App\Models\ClassStudent;
use App\Models\HomeRoomTeacher;
use App\Models\Student; use App\Models\Student;
use App\Models\TeacherSubject; use App\Models\TeacherSubject;
use Filament\Actions; use Filament\Actions;
@ -48,11 +49,33 @@ class MultipleAttendances extends Page
Select::make('teacher_subject_id') Select::make('teacher_subject_id')
->label('Teacher Subject') ->label('Teacher Subject')
->required() ->required()
->options(TeacherSubject::with(['teacher', 'subject', 'class']) ->options(function () {
->get() $user = auth()->user();
->mapWithKeys(fn ($item) => [ $query = TeacherSubject::with(['teacher', 'subject', 'class', 'academicYear']);
$item->id => $item->teacher->name . ' - ' . $item->subject->name . ' - ' . $item->class->class_name . ' - ' . $item->academicYear->name
])) if ($user->hasRole('teacher')) {
// Ambil ID kelas dimana user menjadi wali kelas
$homeRoomClassIds = HomeRoomTeacher::where('teacher_id', $user->id)
->pluck('class_room_id')
->toArray();
$query->where(function($q) use ($user, $homeRoomClassIds) {
// Mata pelajaran yang diajarkan oleh guru ini
$q->where('teacher_id', $user->id)
// ATAU kelas dimana dia menjadi wali kelas
->orWhereIn('class_id', $homeRoomClassIds);
});
}
return $query->get()->mapWithKeys(fn ($item) => [
$item->id => sprintf('%s - %s - %s - %s',
$item->teacher->name,
$item->subject->name,
$item->class->class_name,
$item->academicYear->name
)
]);
})
->searchable() ->searchable()
->live() ->live()
->afterStateUpdated(function ($state) { ->afterStateUpdated(function ($state) {
@ -135,28 +158,6 @@ class MultipleAttendances extends Page
} }
$this->students = $result; $this->students = $result;
// $this->students = ClassStudent::where('class_room_id', $this->teacherSubjectId)
// ->where('academic_year_id', $this->teacherSubject->academic_year_id)
// ->with('student')
// ->get()
// ->map(function ($student) {
// $existingAttendance = Attendances::where('student_id', $student->student_id)
// ->where('teacher_subject_id', $this->teacherSubjectId)
// ->whereDate('date', $this->attendanceDate)
// ->where('semester', $this->semester)
// ->first();
//
// return [
// 'id' => $student->student->id,
// 'name' => $student->student->full_name,
// 'nis' => $student->student->nis,
// 'status' => $existingAttendance ? $existingAttendance->status : null,
// 'attendance_id' => $existingAttendance ? $existingAttendance->id : null,
// ];
// })
// ->values()
// ->toArray();
} }
public function markAll($status): void public function markAll($status): void

View File

@ -6,6 +6,7 @@ use App\Filament\Resources\CompetencyAchievementResource\Pages;
use App\Filament\Resources\CompetencyAchievementResource\RelationManagers; use App\Filament\Resources\CompetencyAchievementResource\RelationManagers;
use App\Models\ClassRoom; use App\Models\ClassRoom;
use App\Models\CompetencyAchievement; use App\Models\CompetencyAchievement;
use App\Models\HomeRoomTeacher;
use App\Models\Subject; use App\Models\Subject;
use Filament\Forms; use Filament\Forms;
use Filament\Forms\Form; use Filament\Forms\Form;
@ -35,7 +36,20 @@ class CompetencyAchievementResource extends Resource
Forms\Components\Select::make('class_room_id') Forms\Components\Select::make('class_room_id')
->label('Class') ->label('Class')
->required() ->required()
->options(ClassRoom::pluck('class_name', 'id')->toArray()) ->options(function () {
$query = ClassRoom::query();
$user = auth()->user();
if ($user->hasAnyRole(['teacher'])) {
$homeRoomTeacher = HomeRoomTeacher::where('teacher_id', $user->id)->first();
if ($homeRoomTeacher) {
$query->where('id', $homeRoomTeacher->class_room_id);
}
}
return $query->pluck('class_name', 'id')->toArray();
})
->searchable() ->searchable()
->native(false), ->native(false),
@ -87,7 +101,7 @@ class CompetencyAchievementResource extends Resource
]) ])
->bulkActions([ ->bulkActions([
Tables\Actions\BulkActionGroup::make([ Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(), Tables\Actions\DeleteBulkAction::make()->visible(fn () => auth()->user()->hasRole('super_admin') || auth()->user()->hasRole('teacher')),
]), ]),
]) ])
->emptyStateActions([ ->emptyStateActions([

View File

@ -3,13 +3,30 @@
namespace App\Filament\Resources\CompetencyAchievementResource\Pages; namespace App\Filament\Resources\CompetencyAchievementResource\Pages;
use App\Filament\Resources\CompetencyAchievementResource; use App\Filament\Resources\CompetencyAchievementResource;
use App\Models\CompetencyAchievement;
use App\Models\HomeRoomTeacher;
use Filament\Actions; use Filament\Actions;
use Filament\Resources\Pages\ListRecords; use Filament\Resources\Pages\ListRecords;
use Illuminate\Database\Eloquent\Builder;
class ListCompetencyAchievements extends ListRecords class ListCompetencyAchievements extends ListRecords
{ {
protected static string $resource = CompetencyAchievementResource::class; protected static string $resource = CompetencyAchievementResource::class;
protected function getTableQuery(): Builder
{
$user = auth()->user();
if ($user->hasRole('teacher')) {
$homeRoomTeacher = HomeRoomTeacher::where('teacher_id', $user->id)->firstOrFail();
if ($homeRoomTeacher) {
return CompetencyAchievement::where('class_room_id', $homeRoomTeacher->class_room_id);
}
}
return CompetencyAchievement::query();
}
protected function getHeaderActions(): array protected function getHeaderActions(): array
{ {
return [ return [

View File

@ -7,14 +7,12 @@ use App\Filament\Resources\ExtracurricularAssessmentResource\RelationManagers;
use App\Models\ClassStudent; use App\Models\ClassStudent;
use App\Models\Extracurricular; use App\Models\Extracurricular;
use App\Models\ExtracurricularAssessment; use App\Models\ExtracurricularAssessment;
use App\Models\TeacherSubject; use App\Models\HomeRoomTeacher;
use Filament\Forms; use Filament\Forms;
use Filament\Forms\Form; use Filament\Forms\Form;
use Filament\Resources\Resource; use Filament\Resources\Resource;
use Filament\Tables; use Filament\Tables;
use Filament\Tables\Table; use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
class ExtracurricularAssessmentResource extends Resource class ExtracurricularAssessmentResource extends Resource
{ {
@ -27,14 +25,36 @@ class ExtracurricularAssessmentResource extends Resource
public static function form(Form $form): Form public static function form(Form $form): Form
{ {
return $form return $form
->schema([ ->schema(components: [
Forms\Components\Select::make('class_student_id') Forms\Components\Select::make('class_student_id')
->relationship('classStudent', 'id') // atau gunakan relasi yang lebih deskriptif jika ada ->label('Siswa & Kelas')
->getOptionLabelFromRecordUsing(fn (ClassStudent $record) => ->options(function () {
$record->class->class_name . ' - ' . $record->student->full_name . ' - ' . $record->academicYear->name) $user = auth()->user();
$query = ClassStudent::with(['student', 'class']);
if ($user->hasAnyRole(['super_admin']))
{
return $query->get()->mapWithKeys(function ($cs) {
return [
$cs->id => $cs->student->full_name . ' - ' . $cs->class->class_name . ' - ' . $cs->academicYear->name,
];
});
} else if ($user->hasAnyRole(['teacher'])) {
$homeRoomTeacher = HomeRoomTeacher::where('teacher_id', $user->id)->firstOrFail();
$query->whereHas('class', function ($query) use ($homeRoomTeacher) {
$query->where('id', $homeRoomTeacher->class_room_id);
});
return $query->get()->mapWithKeys(function ($cs) {
return [
$cs->id => $cs->student->full_name . ' - ' . $cs->class->class_name . ' - ' . $cs->academicYear->name,
];
});
} else {
return [];
}
})
->searchable() ->searchable()
->preload() ->preload(),
->required(),
Forms\Components\Select::make('extracurricular_id') Forms\Components\Select::make('extracurricular_id')
->relationship('extracurricular', 'name') ->relationship('extracurricular', 'name')
@ -105,8 +125,11 @@ class ExtracurricularAssessmentResource extends Resource
]) ])
->bulkActions([ ->bulkActions([
Tables\Actions\BulkActionGroup::make([ Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(), Tables\Actions\DeleteBulkAction::make()->visible(fn () => auth()->user()->hasRole('super_admin') || auth()->user()->hasRole('teacher')),
]), ]),
])
->emptyStateActions([
Tables\Actions\CreateAction::make(),
]); ]);
} }

View File

@ -3,13 +3,32 @@
namespace App\Filament\Resources\ExtracurricularAssessmentResource\Pages; namespace App\Filament\Resources\ExtracurricularAssessmentResource\Pages;
use App\Filament\Resources\ExtracurricularAssessmentResource; use App\Filament\Resources\ExtracurricularAssessmentResource;
use App\Models\ExtracurricularAssessment;
use App\Models\HomeRoomTeacher;
use Filament\Actions; use Filament\Actions;
use Filament\Resources\Pages\ListRecords; use Filament\Resources\Pages\ListRecords;
use Illuminate\Database\Eloquent\Builder;
class ListExtracurricularAssessments extends ListRecords class ListExtracurricularAssessments extends ListRecords
{ {
protected static string $resource = ExtracurricularAssessmentResource::class; protected static string $resource = ExtracurricularAssessmentResource::class;
protected function getTableQuery() : Builder
{
$user = auth()->user();
if ($user->hasRole('teacher')) {
$homeRoomTeacher = HomeRoomTeacher::where('teacher_id', $user->id)->firstOrFail();
return ExtracurricularAssessment::with('classStudent', 'extracurricular')
->whereHas('classStudent', function (Builder $query) use ($homeRoomTeacher) {
$query->where('class_room_id', $homeRoomTeacher->class_room_id)
->where('academic_year_id', $homeRoomTeacher->academic_year_id);
});
} else {
return ExtracurricularAssessment::query();
}
}
protected function getHeaderActions(): array protected function getHeaderActions(): array
{ {
return [ return [

View File

@ -3,10 +3,53 @@
namespace App\Filament\Resources\StudentResource\Pages; namespace App\Filament\Resources\StudentResource\Pages;
use App\Filament\Resources\StudentResource; use App\Filament\Resources\StudentResource;
use App\Models\Student;
use App\Models\User;
use Filament\Actions; use Filament\Actions;
use Filament\Notifications\Notification;
use Filament\Resources\Pages\CreateRecord; use Filament\Resources\Pages\CreateRecord;
class CreateStudent extends CreateRecord class CreateStudent extends CreateRecord
{ {
protected static string $resource = StudentResource::class; protected static string $resource = StudentResource::class;
// protected function mutateFormDataBeforeCreate(array $data): array
// {
//// $user = User::firstOrCreate(
//// ['email' => 'teacher@example.com'],
//// [
//// 'name' => 'teacher',
//// 'password' => bcrypt('teacher'),
//// ]
//// );
////
// $birthDate = explode('-', $data['birth_date']);
//
//
// $password = join("", $birthDate) . '-' . $data['nis'];
//
// $add = [
// 'email' => $data['email'],
// 'name' => $data['parent_name'],
// 'password' => $password,
// ];
//
// dd($add);
// die;
//
// $exists = Student::where('name', $data['name'])
// ->exists();
//
// if ($exists) {
// Notification::make()
// ->title('Failed to save')
// ->body('A record already exists.')
// ->danger()
// ->send();
//
// $this->halt(); // Stop the save process
// }
//
// return $data;
// }
} }

View File

@ -102,11 +102,11 @@ class UserResource extends Resource
// //
]) ])
->actions([ ->actions([
Tables\Actions\EditAction::make(), Tables\Actions\EditAction::make()->visible(fn () => auth()->user()->hasRole('super_admin')),
]) ])
->bulkActions([ ->bulkActions([
Tables\Actions\BulkActionGroup::make([ Tables\Actions\BulkActionGroup::make([
// Tables\Actions\DeleteBulkAction::make(), // Tables\Actions\DeleteBulkAction::make()->visible(fn () => auth()->user()->hasRole('super_admin')),
]), ]),
]) ])
->emptyStateActions([ ->emptyStateActions([

View File

@ -13,7 +13,7 @@ class HomeRoomTeacherPolicy
*/ */
public function viewAny(User $user): bool public function viewAny(User $user): bool
{ {
return $user->can('view_any_home::rome::teacher'); return $user->can('view_any_home::room::teacher');
} }
/** /**
@ -21,7 +21,7 @@ class HomeRoomTeacherPolicy
*/ */
public function view(User $user, HomeRoomTeacher $homeRomeTeacher): bool public function view(User $user, HomeRoomTeacher $homeRomeTeacher): bool
{ {
return $user->can('view_home::rome::teacher'); return $user->can('view_home::room::teacher');
} }
/** /**
@ -29,7 +29,7 @@ class HomeRoomTeacherPolicy
*/ */
public function create(User $user): bool public function create(User $user): bool
{ {
return $user->can('create_home::rome::teacher'); return $user->can('create_home::room::teacher');
} }
/** /**
@ -37,7 +37,7 @@ class HomeRoomTeacherPolicy
*/ */
public function update(User $user, HomeRoomTeacher $homeRomeTeacher): bool public function update(User $user, HomeRoomTeacher $homeRomeTeacher): bool
{ {
return $user->can('update_home::rome::teacher'); return $user->can('update_home::room::teacher');
} }
/** /**
@ -45,7 +45,7 @@ class HomeRoomTeacherPolicy
*/ */
public function delete(User $user, HomeRoomTeacher $homeRomeTeacher): bool public function delete(User $user, HomeRoomTeacher $homeRomeTeacher): bool
{ {
return $user->can('delete_home::rome::teacher'); return $user->can('delete_home::room::teacher');
} }
/** /**
@ -53,7 +53,7 @@ class HomeRoomTeacherPolicy
*/ */
public function restore(User $user, HomeRoomTeacher $homeRomeTeacher): bool public function restore(User $user, HomeRoomTeacher $homeRomeTeacher): bool
{ {
return $user->can('restore_home::rome::teacher'); return $user->can('restore_home::room::teacher');
} }
/** /**
@ -61,6 +61,6 @@ class HomeRoomTeacherPolicy
*/ */
public function forceDelete(User $user, HomeRoomTeacher $homeRomeTeacher): bool public function forceDelete(User $user, HomeRoomTeacher $homeRomeTeacher): bool
{ {
return $user->can('force_delete_home::rome::teacher'); return $user->can('force_delete_home::room::teacher');
} }
} }

3007
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@ -12,6 +12,6 @@
"laravel-vite-plugin": "^1.2.0", "laravel-vite-plugin": "^1.2.0",
"postcss": "^8.4.47", "postcss": "^8.4.47",
"tailwindcss": "^3.4.13", "tailwindcss": "^3.4.13",
"vite": "^6.0.11" "vite": "^6.3.5"
} }
} }