Merge pull request #8 from reihanrere/add-notification-database
Some checks failed
continuous-integration/drone/push Build is failing

add notif & soft delete all table
This commit is contained in:
Reihan Renaldi 2025-06-09 20:08:14 +07:00 committed by GitHub
commit da48d1a986
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
62 changed files with 401 additions and 191 deletions

View File

@ -4,10 +4,13 @@ namespace App\Filament\Imports;
use App\Models\Student;
use App\Models\User;
use Carbon\Carbon;
use Filament\Actions\Imports\ImportColumn;
use Filament\Actions\Imports\Importer;
use Filament\Actions\Imports\Models\Import;
use Filament\Actions\Imports\Exceptions\RowImportFailedException;
use Filament\Notifications\Notification;
use Spatie\Permission\Models\Role;
class StudentImporter extends Importer
{
@ -65,6 +68,31 @@ class StudentImporter extends Importer
throw new RowImportFailedException('Email sudah digunakan');
}
$parentRole = Role::where('name', 'parent')->first();
$birthDate = Carbon::parse($this->data['birth_date']);
$password = $birthDate->format('dmY') . $this->data['nis'];
$parentUser = User::updateOrCreate(
['email' => $this->data['email']],
[
'name' => $this->data['parent_name'],
'password' => bcrypt($password),
'phone' => $this->data['parent_phone'],
]
);
$parentUser->assignRole($parentRole);
$recipient = auth()->user();
if ($recipient) {
Notification::make()
->title('Impor Siswa Berhasil')
->body('Siswa baru dengan NIS ' . $this->data['nis'] . ' dan orang tua ' . $this->data['parent_name'] . ' berhasil diimpor.')
->success()
->sendToDatabase($recipient);
}
return new Student();
}

View File

@ -5,6 +5,7 @@ namespace App\Filament\Resources;
use App\Filament\Resources\AcademicYearResource\Pages;
use App\Filament\Resources\AcademicYearResource\RelationManagers;
use App\Models\AcademicYear;
use App\Models\ClassSubject;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Notifications\Notification;
@ -70,7 +71,9 @@ class AcademicYearResource extends Resource
Tables\Filters\TrashedFilter::make(),
])
->actions([
Tables\Actions\EditAction::make(),
Tables\Actions\EditAction::make()->visible(fn () => auth()->user()->hasRole('admin')),
Tables\Actions\DeleteAction::make()->visible(fn () => auth()->user()->hasRole('admin')),
Tables\Actions\RestoreAction::make()->visible(fn (AcademicYear $record) => auth()->user()->hasRole('admin') && $record->trashed()),
Tables\Actions\Action::make('toggleActive')
->label('Toggle Active')
->icon('heroicon-o-power')
@ -90,13 +93,8 @@ class AcademicYearResource extends Resource
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
Tables\Actions\ForceDeleteBulkAction::make(),
Tables\Actions\RestoreBulkAction::make(),
Tables\Actions\DeleteBulkAction::make()->visible(fn () => auth()->user()->hasRole('admin')),
]),
])
->emptyStateActions([
Tables\Actions\CreateAction::make(),
]);
}

View File

@ -35,13 +35,4 @@ class EditAcademicYear extends EditRecord
return $data;
}
protected function getHeaderActions(): array
{
return [
Actions\DeleteAction::make(),
Actions\ForceDeleteAction::make(),
Actions\RestoreAction::make(),
];
}
}

View File

@ -7,6 +7,7 @@ use App\Filament\Resources\AssessmentResource\RelationManagers;
use App\Models\Assessment;
use App\Models\AssessmentComponent;
use App\Models\ClassStudent;
use App\Models\ExtracurricularAssessment;
use App\Models\HomeRoomTeacher;
use App\Models\Student;
use App\Models\TeacherSubject;
@ -179,13 +180,31 @@ class AssessmentResource extends Resource
->getOptionLabelFromRecordUsing(fn (TeacherSubject $record) =>
$record->teacher->name . ' - ' . $record->subject->name)
->preload(),
Tables\Columns\TextColumn::make('created_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('updated_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('deleted_at') // Add this column to show deleted timestamp
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
->filters([
Tables\Filters\TrashedFilter::make()->label('Tampilkan Data yang Dihapus'),
])
->actions([
Tables\Actions\EditAction::make(),
Tables\Actions\EditAction::make()->visible(fn () => auth()->user()->hasRole('admin')),
Tables\Actions\DeleteAction::make()->visible(fn () => auth()->user()->hasRole('admin')),
Tables\Actions\RestoreAction::make()->visible(fn (Assessment $record) => auth()->user()->hasRole('admin') && $record->trashed()),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make()->visible(fn () => auth()->user()->hasRole('admin') || auth()->user()->hasRole('teacher')),
Tables\Actions\DeleteBulkAction::make()->visible(fn () => auth()->user()->hasRole('admin')),
]),
]);
}

View File

@ -3,6 +3,7 @@
namespace App\Filament\Resources;
use App\Filament\Resources\AttendancesResource\Pages;
use App\Models\Assessment;
use App\Models\Attendances;
use App\Models\ClassRoom;
use App\Models\ClassStudent;
@ -232,19 +233,32 @@ class AttendancesResource extends Resource
->getOptionLabelFromRecordUsing(fn (TeacherSubject $record) =>
$record->teacher->name . ' - ' . $record->subject->name)
->preload(),
Tables\Columns\TextColumn::make('created_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('updated_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('deleted_at') // Add this column to show deleted timestamp
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
->filters([
Tables\Filters\TrashedFilter::make()->label('Tampilkan Data yang Dihapus'),
])
->actions([
Tables\Actions\EditAction::make()
->iconButton(),
Tables\Actions\DeleteAction::make()
->iconButton(),
Tables\Actions\EditAction::make()->visible(fn () => auth()->user()->hasRole('admin')),
Tables\Actions\DeleteAction::make()->visible(fn () => auth()->user()->hasRole('admin')),
Tables\Actions\RestoreAction::make()->visible(fn (Attendances $record) => auth()->user()->hasRole('admin') && $record->trashed()),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make()->visible(fn () => auth()->user()->hasRole('admin') || auth()->user()->hasRole('teacher')),
Tables\Actions\DeleteBulkAction::make()->visible(fn () => auth()->user()->hasRole('admin')),
]),
])
// ->defaultSort('teacherSubject.academicYear.name', 'desc')
->groups([
Tables\Grouping\Group::make('teacherSubject.subject.name')
->label('Mapel')

View File

@ -5,6 +5,7 @@ namespace App\Filament\Resources;
use App\Filament\Resources\ClassRoomResource\Pages;
use App\Filament\Resources\ClassRoomResource\RelationManagers;
use App\Models\ClassRoom;
use App\Models\Extracurricular;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Resources\Resource;
@ -55,6 +56,7 @@ class ClassRoomResource extends Resource
->searchable(),
Tables\Columns\TextColumn::make('class_level')
->searchable(),
Tables\Columns\TextColumn::make('created_at')
->dateTime()
->sortable()
@ -63,22 +65,23 @@ class ClassRoomResource extends Resource
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('deleted_at') // Add this column to show deleted timestamp
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
->filters([
Tables\Filters\TrashedFilter::make(),
Tables\Filters\TrashedFilter::make()->label('Tampilkan Data yang Dihapus'),
])
->actions([
Tables\Actions\EditAction::make(),
Tables\Actions\DeleteAction::make(),
Tables\Actions\RestoreAction::make(),
Tables\Actions\EditAction::make()->visible(fn () => auth()->user()->hasRole('admin')),
Tables\Actions\DeleteAction::make()->visible(fn () => auth()->user()->hasRole('admin')),
Tables\Actions\RestoreAction::make()->visible(fn (ClassRoom $record) => auth()->user()->hasRole('admin') && $record->trashed()),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
Tables\Actions\DeleteBulkAction::make()->visible(fn () => auth()->user()->hasRole('admin')),
]),
])
->emptyStateActions([
Tables\Actions\CreateAction::make(),
]);
}

View File

@ -14,10 +14,4 @@ class EditClassRoom extends EditRecord
{
return 'Edit Kelas';
}
protected function getHeaderActions(): array
{
return [
Actions\DeleteAction::make(),
];
}
}

View File

@ -18,7 +18,9 @@ class ListClassRooms extends ListRecords
protected function getHeaderActions(): array
{
return [
Actions\CreateAction::make(),
Actions\CreateAction::make()
->label('Tambah Kelas')
->icon('heroicon-o-user-group'),
];
}
}

View File

@ -90,9 +90,6 @@ class ClassStudentResource extends Resource
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
]),
])
->emptyStateActions([
Tables\Actions\CreateAction::make(),
]);
}

View File

@ -18,7 +18,9 @@ class ListClassStudents extends ListRecords
protected function getHeaderActions(): array
{
return [
Actions\CreateAction::make(),
Actions\CreateAction::make()
->label('Tambah Kelas per-Siswa')
->icon('heroicon-o-user-group'),
];
}
}

View File

@ -4,6 +4,7 @@ namespace App\Filament\Resources;
use App\Filament\Resources\ClassSubjectResource\Pages;
use App\Filament\Resources\ClassSubjectResource\RelationManagers;
use App\Models\ClassRoom;
use App\Models\ClassSubject;
use Filament\Forms;
use Filament\Forms\Form;
@ -50,17 +51,31 @@ class ClassSubjectResource extends Resource
->columns([
TextColumn::make('class.class_name')->label('Kelas')->sortable()->searchable(),
TextColumn::make('subject.name')->label('Mata Pelajaran')->sortable()->searchable(),
TextColumn::make('academicYear.name')->label('Tahun Ajaran')->sortable(),
Tables\Columns\TextColumn::make('created_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('updated_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('deleted_at') // Add this column to show deleted timestamp
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
->filters([
//
Tables\Filters\TrashedFilter::make()->label('Tampilkan Data yang Dihapus'),
])
->actions([
Tables\Actions\EditAction::make(),
Tables\Actions\EditAction::make()->visible(fn () => auth()->user()->hasRole('admin')),
Tables\Actions\DeleteAction::make()->visible(fn () => auth()->user()->hasRole('admin')),
Tables\Actions\RestoreAction::make()->visible(fn (ClassSubject $record) => auth()->user()->hasRole('admin') && $record->trashed()),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
Tables\Actions\DeleteBulkAction::make()->visible(fn () => auth()->user()->hasRole('admin')),
]),
]);
}

View File

@ -14,11 +14,4 @@ class EditClassSubject extends EditRecord
{
return 'Edit Mata Pelajaran per-Kelas';
}
protected function getHeaderActions(): array
{
return [
Actions\DeleteAction::make(),
];
}
}

View File

@ -18,7 +18,9 @@ class ListClassSubjects extends ListRecords
protected function getHeaderActions(): array
{
return [
Actions\CreateAction::make(),
Actions\CreateAction::make()
->label('Tambah Mata Pelajaran per-Kelas')
->icon('heroicon-o-user-group'),
];
}
}

View File

@ -103,9 +103,6 @@ class CompetencyAchievementResource extends Resource
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make()->visible(fn () => auth()->user()->hasRole('admin') || auth()->user()->hasRole('teacher')),
]),
])
->emptyStateActions([
Tables\Actions\CreateAction::make(),
]);
}

View File

@ -5,6 +5,7 @@ namespace App\Filament\Resources;
use App\Filament\Resources\ExtracurricularAssessmentResource\Pages;
use App\Filament\Resources\ExtracurricularAssessmentResource\RelationManagers;
use App\Models\ClassStudent;
use App\Models\ClassSubject;
use App\Models\Extracurricular;
use App\Models\ExtracurricularAssessment;
use App\Models\HomeRoomTeacher;
@ -116,20 +117,32 @@ class ExtracurricularAssessmentResource extends Resource
Tables\Columns\TextColumn::make('description')
->label('Description'),
Tables\Columns\TextColumn::make('created_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('updated_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('deleted_at') // Add this column to show deleted timestamp
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
->filters([
//
Tables\Filters\TrashedFilter::make()->label('Tampilkan Data yang Dihapus'),
])
->actions([
Tables\Actions\EditAction::make(),
Tables\Actions\EditAction::make()->visible(fn () => auth()->user()->hasRole('admin')),
Tables\Actions\DeleteAction::make()->visible(fn () => auth()->user()->hasRole('admin')),
Tables\Actions\RestoreAction::make()->visible(fn (ExtracurricularAssessment $record) => auth()->user()->hasRole('admin') && $record->trashed()),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make()->visible(fn () => auth()->user()->hasRole('admin') || auth()->user()->hasRole('teacher')),
Tables\Actions\DeleteBulkAction::make()->visible(fn () => auth()->user()->hasRole('admin')),
]),
])
->emptyStateActions([
Tables\Actions\CreateAction::make(),
]);
}

View File

@ -14,11 +14,4 @@ class EditExtracurricularAssessment extends EditRecord
{
return 'Edit Penilaian Ektrakurikuler';
}
protected function getHeaderActions(): array
{
return [
Actions\DeleteAction::make(),
];
}
}

View File

@ -37,7 +37,9 @@ class ListExtracurricularAssessments extends ListRecords
protected function getHeaderActions(): array
{
return [
Actions\CreateAction::make(),
Actions\CreateAction::make()
->label('Tambah Penilaian Ekstrakurikuler')
->icon('heroicon-o-user-group'),
];
}
}

View File

@ -4,6 +4,7 @@ namespace App\Filament\Resources;
use App\Filament\Resources\ExtracurricularResource\Pages;
use App\Models\Extracurricular;
use App\Models\Student;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Resources\Resource;
@ -49,20 +50,30 @@ class ExtracurricularResource extends Resource
->limit(50),
Tables\Columns\TextColumn::make('created_at')
->label('Created at')
->dateTime('d M Y'),
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('updated_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('deleted_at') // Add this column to show deleted timestamp
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
->filters([
Tables\Filters\TrashedFilter::make()->label('Tampilkan Data yang Dihapus'),
])
->actions([
Tables\Actions\EditAction::make(),
Tables\Actions\DeleteAction::make(),
Tables\Actions\EditAction::make()->visible(fn () => auth()->user()->hasRole('admin')),
Tables\Actions\DeleteAction::make()->visible(fn () => auth()->user()->hasRole('admin')),
Tables\Actions\RestoreAction::make()->visible(fn (Extracurricular $record) => auth()->user()->hasRole('admin') && $record->trashed()),
])
->bulkActions([
Tables\Actions\DeleteBulkAction::make(),
])
->emptyStateActions([
Tables\Actions\CreateAction::make(),
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make()->visible(fn () => auth()->user()->hasRole('admin')),
]),
]);
}

View File

@ -14,11 +14,4 @@ class EditExtracurricular extends EditRecord
{
return 'Edit Ektrakuriler';
}
protected function getHeaderActions(): array
{
return [
Actions\DeleteAction::make(),
];
}
}

View File

@ -18,7 +18,9 @@ class ListExtracurriculars extends ListRecords
protected function getHeaderActions(): array
{
return [
Actions\CreateAction::make()->label('Tambah Ekstrakurikuler'),
Actions\CreateAction::make()
->label('Tambah Ektrakurikuler')
->icon('heroicon-o-user-group'),
];
}
}

View File

@ -7,6 +7,7 @@ use App\Filament\Resources\HomeRoomTeacherResource\RelationManagers;
use App\Models\AcademicYear;
use App\Models\ClassRoom;
use App\Models\HomeRoomTeacher;
use App\Models\LearningObjective;
use App\Models\User;
use Filament\Forms;
use Filament\Forms\Form;
@ -72,24 +73,23 @@ class HomeRoomTeacherResource extends Resource
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('deleted_at')
Tables\Columns\TextColumn::make('deleted_at') // Add this column to show deleted timestamp
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
->filters([
//
Tables\Filters\TrashedFilter::make()->label('Tampilkan Data yang Dihapus'),
])
->actions([
Tables\Actions\EditAction::make(),
Tables\Actions\EditAction::make()->visible(fn () => auth()->user()->hasRole('admin')),
Tables\Actions\DeleteAction::make()->visible(fn () => auth()->user()->hasRole('admin')),
Tables\Actions\RestoreAction::make()->visible(fn (HomeRoomTeacher $record) => auth()->user()->hasRole('admin') && $record->trashed()),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
Tables\Actions\DeleteBulkAction::make()->visible(fn () => auth()->user()->hasRole('admin')),
]),
])
->emptyStateActions([
Tables\Actions\CreateAction::make(),
]);
}

View File

@ -39,10 +39,4 @@ class EditHomeRoomTeacher extends EditRecord
return $data;
}
protected function getHeaderActions(): array
{
return [
Actions\DeleteAction::make(),
];
}
}

View File

@ -18,7 +18,9 @@ class ListHomeRoomTeachers extends ListRecords
protected function getHeaderActions(): array
{
return [
Actions\CreateAction::make(),
Actions\CreateAction::make()
->label('Tambah Wali Kelas')
->icon('heroicon-o-user-group'),
];
}
}

View File

@ -7,6 +7,7 @@ use App\Filament\Resources\LearningObjectiveResource\RelationManagers;
use App\Models\ClassRoom; // Import ClassRoom model
use App\Models\LearningObjective;
use App\Models\Subject; // Import Subject model
use App\Models\TeacherSubject;
use Filament\Forms;
use Filament\Forms\Components\Select;
use Filament\Forms\Form;
@ -73,7 +74,6 @@ class LearningObjectiveResource extends Resource
->tooltip(fn (LearningObjective $record): string => $record->description) // Show full text on hover
->sortable(),
// Standard timestamp columns
Tables\Columns\TextColumn::make('created_at')
->dateTime()
->sortable()
@ -82,26 +82,22 @@ class LearningObjectiveResource extends Resource
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('deleted_at')
Tables\Columns\TextColumn::make('deleted_at') // Add this column to show deleted timestamp
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true), // Show deleted_at if soft deletes are used
->toggleable(isToggledHiddenByDefault: true),
])
->filters([
// TrashedFilter works with SoftDeletes trait on the model
Tables\Filters\TrashedFilter::make(),
Tables\Filters\TrashedFilter::make()->label('Tampilkan Data yang Dihapus'),
])
->actions([
Tables\Actions\EditAction::make(),
Tables\Actions\DeleteAction::make(), // For soft deleting records
Tables\Actions\RestoreAction::make(), // For restoring soft-deleted records
Tables\Actions\ForceDeleteAction::make(), // For permanently deleting records
Tables\Actions\EditAction::make()->visible(fn () => auth()->user()->hasRole('admin')),
Tables\Actions\DeleteAction::make()->visible(fn () => auth()->user()->hasRole('admin')),
Tables\Actions\RestoreAction::make()->visible(fn (LearningObjective $record) => auth()->user()->hasRole('admin') && $record->trashed()),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
Tables\Actions\ForceDeleteBulkAction::make(),
Tables\Actions\RestoreBulkAction::make(),
Tables\Actions\DeleteBulkAction::make()->visible(fn () => auth()->user()->hasRole('admin')),
]),
]);
}

View File

@ -14,13 +14,4 @@ class EditLearningObjective extends EditRecord
{
return 'Edit Tujuan Pembelajaran';
}
protected function getHeaderActions(): array
{
return [
Actions\DeleteAction::make(),
Actions\ForceDeleteAction::make(),
Actions\RestoreAction::make(),
];
}
}

View File

@ -35,7 +35,9 @@ class ListLearningObjectives extends ListRecords
protected function getHeaderActions(): array
{
return [
Actions\CreateAction::make()->label('Tambah Tujuan Pembelajaran Baru'),
Actions\CreateAction::make()
->label('Tambah Tujuan Pembelajaran')
->icon('heroicon-o-user-group'),
];
}

View File

@ -5,6 +5,7 @@ namespace App\Filament\Resources;
use App\Filament\Resources\StudentResource\Pages;
use App\Models\ClassRoom;
use App\Models\Student;
use App\Models\Subject;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Resources\Resource;
@ -125,21 +126,27 @@ class StudentResource extends Resource
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('updated_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('deleted_at') // Add this column to show deleted timestamp
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
->filters([
//
Tables\Filters\TrashedFilter::make()->label('Tampilkan Data yang Dihapus'),
])
->actions([
Tables\Actions\ViewAction::make(),
Tables\Actions\EditAction::make(),
Tables\Actions\EditAction::make()->visible(fn () => auth()->user()->hasRole('admin')),
Tables\Actions\DeleteAction::make()->visible(fn () => auth()->user()->hasRole('admin')),
Tables\Actions\RestoreAction::make()->visible(fn (Student $record) => auth()->user()->hasRole('admin') && $record->trashed()),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
Tables\Actions\DeleteBulkAction::make()->visible(fn () => auth()->user()->hasRole('admin')),
]),
])
->emptyStateActions([
Tables\Actions\CreateAction::make(),
]);
}

View File

@ -48,18 +48,4 @@ class EditStudent extends EditRecord
return $data;
}
protected function getHeaderActions(): array
{
return [
Actions\DeleteAction::make()
->before(function (Actions\DeleteAction $action) {
$student = $this->record;
if ($student->email) {
User::where('email', $student->email)->delete();
}
}),
];
}
}

View File

@ -18,7 +18,9 @@ class ListStudents extends ListRecords
protected function getHeaderActions(): array
{
return [
Actions\CreateAction::make(),
Actions\CreateAction::make()
->label('Tambah Siswa')
->icon('heroicon-o-user-group'),
Actions\ImportAction::make('importBrands')
->importer(StudentImporter::class),
];

View File

@ -5,6 +5,7 @@ namespace App\Filament\Resources;
use App\Filament\Resources\SubjectResource\Pages;
use App\Filament\Resources\SubjectResource\RelationManagers;
use App\Models\Subject;
use App\Models\User;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Resources\Resource;
@ -67,20 +68,23 @@ class SubjectResource extends Resource
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('deleted_at') // Add this column to show deleted timestamp
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
->filters([
//
Tables\Filters\TrashedFilter::make()->label('Tampilkan Data yang Dihapus'),
])
->actions([
Tables\Actions\EditAction::make(),
Tables\Actions\EditAction::make()->visible(fn () => auth()->user()->hasRole('admin')),
Tables\Actions\DeleteAction::make()->visible(fn () => auth()->user()->hasRole('admin')),
Tables\Actions\RestoreAction::make()->visible(fn (Subject $record) => auth()->user()->hasRole('admin') && $record->trashed()),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
Tables\Actions\DeleteBulkAction::make()->visible(fn () => auth()->user()->hasRole('admin')),
]),
])
->emptyStateActions([
Tables\Actions\CreateAction::make(),
]);
}

View File

@ -14,11 +14,4 @@ class EditSubject extends EditRecord
{
return 'Edit Mata Pelajaran';
}
protected function getHeaderActions(): array
{
return [
Actions\DeleteAction::make(),
];
}
}

View File

@ -18,7 +18,9 @@ class ListSubjects extends ListRecords
protected function getHeaderActions(): array
{
return [
Actions\CreateAction::make()->label('Tambah Mata Pelajaran'),
Actions\CreateAction::make()
->label('Tambah Mata Pelajaran')
->icon('heroicon-o-user-group'),
];
}
}

View File

@ -112,19 +112,31 @@ class TeacherSubjectResource extends Resource
->relationship('class', 'class_name')
->searchable()
->preload(),
Tables\Columns\TextColumn::make('created_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('updated_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('deleted_at') // Add this column to show deleted timestamp
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
->filters([
Tables\Filters\TrashedFilter::make()->label('Tampilkan Data yang Dihapus'),
])
->actions([
Tables\Actions\EditAction::make(),
Tables\Actions\DeleteAction::make(),
Tables\Actions\EditAction::make()->visible(fn () => auth()->user()->hasRole('admin')),
Tables\Actions\DeleteAction::make()->visible(fn () => auth()->user()->hasRole('admin')),
Tables\Actions\RestoreAction::make()->visible(fn (TeacherSubject $record) => auth()->user()->hasRole('admin') && $record->trashed()),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
Tables\Actions\DeleteBulkAction::make()->visible(fn () => auth()->user()->hasRole('admin')),
]),
])
->emptyStateActions([
Tables\Actions\CreateAction::make(),
]);
}

View File

@ -14,11 +14,4 @@ class EditTeacherSubject extends EditRecord
{
return 'Edit Guru per-Mapel';
}
protected function getHeaderActions(): array
{
return [
Actions\DeleteAction::make(),
];
}
}

View File

@ -18,7 +18,9 @@ class ListTeacherSubjects extends ListRecords
protected function getHeaderActions(): array
{
return [
Actions\CreateAction::make(),
Actions\CreateAction::make()
->label('Tambah Guru per-Mapel')
->icon('heroicon-o-user-group'),
];
}
}

View File

@ -109,20 +109,23 @@ class UserResource extends Resource
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('deleted_at') // Add this column to show deleted timestamp
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
->filters([
//
Tables\Filters\TrashedFilter::make()->label('Tampilkan Data yang Dihapus'),
])
->actions([
Tables\Actions\EditAction::make()->visible(fn () => auth()->user()->hasRole('admin')),
Tables\Actions\DeleteAction::make()->visible(fn () => auth()->user()->hasRole('admin')),
Tables\Actions\RestoreAction::make()->visible(fn (User $record) => auth()->user()->hasRole('admin') && $record->trashed()),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
// Tables\Actions\DeleteBulkAction::make()->visible(fn () => auth()->user()->hasRole('admin')),
Tables\Actions\DeleteBulkAction::make()->visible(fn () => auth()->user()->hasRole('admin')),
]),
])
->emptyStateActions([
Tables\Actions\CreateAction::make(),
]);
}
@ -156,4 +159,13 @@ class UserResource extends Resource
{
return 'Pengguna';
}
// This method is required to apply the SoftDeletingScope to the query
public static function getEloquentQuery(): Builder
{
return parent::getEloquentQuery()
->withoutGlobalScopes([
SoftDeletingScope::class,
]);
}
}

View File

@ -13,7 +13,7 @@ class EditUser extends EditRecord
protected function getHeaderActions(): array
{
return [
Actions\DeleteAction::make(),
// Actions\DeleteAction::make(),
];
}

View File

@ -18,7 +18,9 @@ class ListUsers extends ListRecords
protected function getHeaderActions(): array
{
return [
Actions\CreateAction::make()->label('Tambah Pengguna'),
Actions\CreateAction::make()
->label('Tambah Pengguna')
->icon('heroicon-o-user'),
];
}
}

View File

@ -0,0 +1,44 @@
<?php
namespace App\Filament\Widgets;
use App\Models\Student;
use Filament\Tables;
use Filament\Tables\Table;
use Filament\Widgets\TableWidget as BaseWidget;
class AdminRankingWidgets extends BaseWidget
{
protected static ?int $sort = 2;
public static function canView(): bool
{
return false;
}
// protected int | string | array $columnSpan = 'full'; // Atur lebar widget jika perlu
protected function getHeading(): string
{
return 'Ranking';
}
public function table(Table $table): Table
{
return $table
->query(
Student::select('students.id', 'students.full_name')
->join('assessments', 'students.id', '=', 'assessments.student_id')
->selectRaw('AVG(assessments.score) as average_score')
->groupBy('students.id', 'students.full_name')
->orderByDesc('average_score')
)
->columns([
Tables\Columns\TextColumn::make('full_name')
->label('Nama Siswa'),
Tables\Columns\TextColumn::make('average_score')
->label('Rata-rata Nilai')
->sortable()
->formatStateUsing(fn ($state) => number_format($state, 2)),
]);
}
}

View File

@ -0,0 +1,43 @@
<?php
namespace App\Filament\Widgets;
use App\Models\ClassRoom;
use App\Models\Student;
use App\Models\Subject;
use App\Models\User;
use Filament\Widgets\StatsOverviewWidget as BaseWidget;
use Filament\Widgets\StatsOverviewWidget\Stat;
class AdminStatsWidgets extends BaseWidget
{
protected function getColumns(): int
{
return 4;
}
protected function getStats(): array
{
$studnet = count(Student::where('is_active', true)
->get()
->toArray()
);
$teacher = count(User::role('teacher')->get()->toArray());
$classRoom = Classroom::count();
$subject = Subject::count();
$nonTeacherUser = User::whereDoesntHave('roles', function ($query) {
$query->where('name', 'teacher');
})->count();
return [
Stat::make('Total Siswa', $studnet),
Stat::make('Total Guru ', $teacher),
Stat::make('Total Kelas ', $classRoom),
Stat::make('Total Mapel ', $subject),
];
}
}

View File

@ -0,0 +1,14 @@
<?php
namespace App\Filament\Widgets;
use App\Models\ClassRoom;
use App\Models\Student;
use App\Models\Subject;
use App\Models\User;
use Filament\Widgets\StatsOverviewWidget as BaseWidget;
use Filament\Widgets\StatsOverviewWidget\Stat;
class AdminWidgets extends BaseWidget
{
}

View File

@ -3,9 +3,12 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Assessment extends Model
{
use SoftDeletes;
protected $fillable = [
'teacher_subject_id',
'student_id',

View File

@ -4,9 +4,12 @@ namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class AssessmentLearningObjective extends Model
{
use SoftDeletes;
protected $fillable = [
'teacher_subject_id',
'student_id',

View File

@ -3,9 +3,12 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Attendances extends Model
{
use SoftDeletes;
protected $fillable = ['student_id', 'teacher_subject_id', 'date', 'status', 'recorded_by', 'semester', 'notes'];
public function student()

View File

@ -5,9 +5,12 @@ namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\SoftDeletes;
class ClassSubject extends Model
{
use SoftDeletes;
protected $fillable = ['class_room_id', 'subject_id', 'academic_year_id'];
public function subject(): BelongsTo

View File

@ -3,9 +3,11 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Extracurricular extends Model
{
use SoftDeletes;
protected $fillable = ['name', 'description'];
public function assessments()

View File

@ -3,9 +3,12 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class ExtracurricularAssessment extends Model
{
use SoftDeletes;
protected $fillable = [
'class_student_id',
'extracurricular_id',

View File

@ -3,9 +3,12 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Student extends Model
{
use SoftDeletes;
protected $fillable = [
'nis',
'nisn',

View File

@ -4,9 +4,12 @@ namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\SoftDeletes;
class Subject extends Model
{
use SoftDeletes;
protected $fillable = ['name', 'is_religious', 'category'];
public function scopes()

View File

@ -5,9 +5,12 @@ namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\SoftDeletes;
class TeacherSubject extends Model
{
use SoftDeletes;
protected $fillable = ['teacher_id', 'subject_id', 'class_id', 'academic_year_id'];
public function teacher(): BelongsTo

View File

@ -7,6 +7,7 @@ use Filament\Models\Contracts\FilamentUser;
use Filament\Panel;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Spatie\Permission\Traits\HasRoles;
@ -15,6 +16,7 @@ class User extends Authenticatable implements FilamentUser
{
/** @use HasFactory<\Database\Factories\UserFactory> */
use HasFactory, Notifiable, HasRoles;
use SoftDeletes;
/**
* The attributes that are mass assignable.

View File

@ -2,6 +2,7 @@
namespace App\Providers\Filament;
use App\Filament\Widgets\AdminStatsWidgets;
use Filament\Http\Middleware\Authenticate;
use Filament\Http\Middleware\AuthenticateSession;
use Filament\Http\Middleware\DisableBladeIconComponents;
@ -37,8 +38,9 @@ class AdminPanelProvider extends PanelProvider
])
->discoverWidgets(in: app_path('Filament/Widgets'), for: 'App\\Filament\\Widgets')
->widgets([
Widgets\AccountWidget::class,
Widgets\FilamentInfoWidget::class,
// Widgets\AccountWidget::class,
// Widgets\FilamentInfoWidget::class,
AdminStatsWidgets::class,
])
->middleware([
EncryptCookies::class,
@ -57,6 +59,7 @@ class AdminPanelProvider extends PanelProvider
->plugins([
\BezhanSalleh\FilamentShield\FilamentShieldPlugin::make(),
])
->databaseNotifications()
->brandName('Sistem Akademik Sekolah');
}
}

View File

@ -24,6 +24,7 @@ return new class extends Migration
$table->string('password');
$table->rememberToken();
$table->timestamps();
$table->softDeletes();
});
Schema::create('password_reset_tokens', function (Blueprint $table) {

View File

@ -19,6 +19,7 @@ return new class extends Migration
$table->timestamps();
$table->unique(['name', 'is_religious', 'category']);
$table->softDeletes();
});
}

View File

@ -16,6 +16,7 @@ return new class extends Migration
$table->string('name');
$table->text('description')->nullable();
$table->timestamps();
$table->softDeletes();
});
}

View File

@ -20,6 +20,7 @@ return new class extends Migration
$table->timestamps();
$table->unique(['teacher_id', 'subject_id', 'class_id', 'academic_year_id']);
$table->softDeletes();
});
}

View File

@ -23,6 +23,7 @@ return new class extends Migration
$table->timestamps();
$table->unique(['teacher_subject_id', 'student_id', 'date', 'semester']);
$table->softDeletes();
});
}

View File

@ -20,6 +20,7 @@ return new class extends Migration
$table->timestamps();
$table->unique(['teacher_subject_id', 'student_id', 'semester']);
$table->softDeletes();
});
}

View File

@ -20,6 +20,7 @@ return new class extends Migration
$table->string('semester');
$table->timestamps();
$table->softDeletes();
});
}

View File

@ -15,7 +15,7 @@ return new class extends Migration
$table->uuid('id')->primary();
$table->string('type');
$table->morphs('notifiable');
$table->text('data');
$table->jsonb('data');
$table->timestamp('read_at')->nullable();
$table->timestamps();
});

View File

@ -18,6 +18,8 @@ return new class extends Migration
$table->foreignId('learning_objective_id')->constrained('learning_objectives')->onDelete('cascade');
$table->enum('type', ['highest', 'lower']);
$table->timestamps();
$table->softDeletes();
});
}

View File

@ -70,7 +70,7 @@ class UserSeeder extends Seeder
'guard_name' => 'web',
]);
$teacher->syncPermissions($rolePermissions);
// $teacher->syncPermissions($rolePermissions);
$role->syncPermissions($rolePermissions);
@ -78,8 +78,8 @@ class UserSeeder extends Seeder
$admin->assignRole($role);
}
if (!$user->hasRole($teacher)) {
$user->assignRole($teacher);
}
// if (!$user->hasRole($teacher)) {
// $user->assignRole($teacher);
// }
}
}