diff --git a/app/Filament/Resources/Activities/ActivityResource.php b/app/Filament/Resources/Activities/ActivityResource.php new file mode 100644 index 0000000..1be828f --- /dev/null +++ b/app/Filament/Resources/Activities/ActivityResource.php @@ -0,0 +1,40 @@ + ListActivities::route('/'), + 'create' => CreateActivity::route('/create'), + 'edit' => EditActivity::route('/{record}/edit'), + ]; + } +} diff --git a/app/Filament/Resources/Activities/Pages/CreateActivity.php b/app/Filament/Resources/Activities/Pages/CreateActivity.php new file mode 100644 index 0000000..7731008 --- /dev/null +++ b/app/Filament/Resources/Activities/Pages/CreateActivity.php @@ -0,0 +1,11 @@ +components([ + TextInput::make('title')->label('Judul')->required(), + Textarea::make('description')->label('Deskripsi')->rows(3)->columnSpanFull(), + DatePicker::make('start_date')->label('Mulai')->required(), + DatePicker::make('end_date')->label('Selesai')->required(), + Select::make('status') + ->options([ + 'draft' => 'Draft', + 'pending' => 'Pending', + 'approved' => 'Disetujui', + 'rejected' => 'Ditolak', + ]) + ->default('draft') + ->required(), + Select::make('participants') + ->label('Peserta') + ->relationship('participants', 'name') + ->multiple() + ->preload() + ->searchable() + ->columnSpanFull(), + DateTimePicker::make('executed_at')->label('Waktu Pelaksanaan'), + Textarea::make('execution_notes')->label('Catatan Pelaksanaan')->rows(3)->columnSpanFull(), + ]); + } +} diff --git a/app/Filament/Resources/Activities/Tables/ActivitiesTable.php b/app/Filament/Resources/Activities/Tables/ActivitiesTable.php new file mode 100644 index 0000000..077b15a --- /dev/null +++ b/app/Filament/Resources/Activities/Tables/ActivitiesTable.php @@ -0,0 +1,41 @@ +columns([ + TextColumn::make('title')->label('Judul')->searchable()->sortable(), + TextColumn::make('start_date')->label('Mulai')->date('d M Y')->sortable(), + TextColumn::make('end_date')->label('Selesai')->date('d M Y'), + TextColumn::make('status')->badge() + ->color(fn ($state) => match ($state) { + 'approved' => 'success', + 'rejected' => 'danger', + 'pending' => 'warning', + default => 'gray', + }), + TextColumn::make('creator.name')->label('Dibuat Oleh'), + ]) + ->filters([ + SelectFilter::make('status')->options([ + 'draft' => 'Draft', + 'pending' => 'Pending', + 'approved' => 'Disetujui', + 'rejected' => 'Ditolak', + ]), + ]) + ->recordActions([EditAction::make()]) + ->toolbarActions([BulkActionGroup::make([DeleteBulkAction::make()])]); + } +} diff --git a/app/Filament/Resources/Approvals/ApprovalResource.php b/app/Filament/Resources/Approvals/ApprovalResource.php new file mode 100644 index 0000000..aa67369 --- /dev/null +++ b/app/Filament/Resources/Approvals/ApprovalResource.php @@ -0,0 +1,40 @@ + ListApprovals::route('/'), + 'create' => CreateApproval::route('/create'), + 'edit' => EditApproval::route('/{record}/edit'), + ]; + } +} diff --git a/app/Filament/Resources/Approvals/Pages/CreateApproval.php b/app/Filament/Resources/Approvals/Pages/CreateApproval.php new file mode 100644 index 0000000..1a051c3 --- /dev/null +++ b/app/Filament/Resources/Approvals/Pages/CreateApproval.php @@ -0,0 +1,11 @@ +components([ + TextInput::make('model_type')->label('Tipe Model')->required(), + TextInput::make('model_id')->label('ID Model')->numeric()->required(), + TextInput::make('required_approvals')->label('Jumlah Persetujuan')->numeric()->default(1), + Select::make('status') + ->options([ + 'pending' => 'Pending', + 'approved' => 'Disetujui', + 'rejected' => 'Ditolak', + ]) + ->default('pending') + ->required(), + ]); + } +} diff --git a/app/Filament/Resources/Approvals/Tables/ApprovalsTable.php b/app/Filament/Resources/Approvals/Tables/ApprovalsTable.php new file mode 100644 index 0000000..262046d --- /dev/null +++ b/app/Filament/Resources/Approvals/Tables/ApprovalsTable.php @@ -0,0 +1,39 @@ +columns([ + TextColumn::make('model_type')->label('Tipe'), + TextColumn::make('model_id')->label('ID'), + TextColumn::make('required_approvals')->label('Dibutuhkan'), + TextColumn::make('items_count')->counts('items')->label('Sudah Approve'), + TextColumn::make('status')->badge() + ->color(fn ($state) => match ($state) { + 'approved' => 'success', + 'rejected' => 'danger', + default => 'warning', + }), + ]) + ->filters([ + SelectFilter::make('status')->options([ + 'pending' => 'Pending', + 'approved' => 'Disetujui', + 'rejected' => 'Ditolak', + ]), + ]) + ->recordActions([EditAction::make()]) + ->toolbarActions([BulkActionGroup::make([DeleteBulkAction::make()])]); + } +} diff --git a/app/Filament/Resources/Audits/AuditResource.php b/app/Filament/Resources/Audits/AuditResource.php new file mode 100644 index 0000000..9a70f30 --- /dev/null +++ b/app/Filament/Resources/Audits/AuditResource.php @@ -0,0 +1,40 @@ + ListAudits::route('/'), + 'create' => CreateAudit::route('/create'), + 'edit' => EditAudit::route('/{record}/edit'), + ]; + } +} diff --git a/app/Filament/Resources/Audits/Pages/CreateAudit.php b/app/Filament/Resources/Audits/Pages/CreateAudit.php new file mode 100644 index 0000000..cd0e8d2 --- /dev/null +++ b/app/Filament/Resources/Audits/Pages/CreateAudit.php @@ -0,0 +1,11 @@ +components([ + Select::make('auditor_id')->label('Auditor') + ->options(User::pluck('name', 'id')) + ->searchable() + ->required(), + TextInput::make('model_type')->label('Tipe Model')->required(), + TextInput::make('model_id')->label('ID Model')->numeric()->required(), + Select::make('issue_type')->label('Jenis Temuan') + ->options(['warning' => 'Peringatan', 'critical' => 'Kritis']) + ->required(), + Textarea::make('description')->label('Deskripsi')->rows(3)->required()->columnSpanFull(), + Select::make('status') + ->options(['open' => 'Terbuka', 'resolved' => 'Selesai']) + ->default('open') + ->required(), + ]); + } +} diff --git a/app/Filament/Resources/Audits/Tables/AuditsTable.php b/app/Filament/Resources/Audits/Tables/AuditsTable.php new file mode 100644 index 0000000..47a4520 --- /dev/null +++ b/app/Filament/Resources/Audits/Tables/AuditsTable.php @@ -0,0 +1,34 @@ +columns([ + TextColumn::make('auditor.name')->label('Auditor'), + TextColumn::make('model_type')->label('Tipe'), + TextColumn::make('issue_type')->label('Jenis')->badge() + ->color(fn ($state) => $state === 'critical' ? 'danger' : 'warning'), + TextColumn::make('description')->label('Deskripsi')->limit(50), + TextColumn::make('status')->badge() + ->color(fn ($state) => $state === 'resolved' ? 'success' : 'danger'), + TextColumn::make('created_at')->label('Tanggal')->date('d M Y'), + ]) + ->filters([ + SelectFilter::make('issue_type')->options(['warning' => 'Peringatan', 'critical' => 'Kritis']), + SelectFilter::make('status')->options(['open' => 'Terbuka', 'resolved' => 'Selesai']), + ]) + ->recordActions([EditAction::make()]) + ->toolbarActions([BulkActionGroup::make([DeleteBulkAction::make()])]); + } +} diff --git a/app/Filament/Resources/CashCategories/CashCategoryResource.php b/app/Filament/Resources/CashCategories/CashCategoryResource.php new file mode 100644 index 0000000..f873832 --- /dev/null +++ b/app/Filament/Resources/CashCategories/CashCategoryResource.php @@ -0,0 +1,40 @@ + ListCashCategories::route('/'), + 'create' => CreateCashCategory::route('/create'), + 'edit' => EditCashCategory::route('/{record}/edit'), + ]; + } +} diff --git a/app/Filament/Resources/CashCategories/Pages/CreateCashCategory.php b/app/Filament/Resources/CashCategories/Pages/CreateCashCategory.php new file mode 100644 index 0000000..3e08d11 --- /dev/null +++ b/app/Filament/Resources/CashCategories/Pages/CreateCashCategory.php @@ -0,0 +1,11 @@ +components([ + TextInput::make('name')->label('Nama')->required(), + ]); + } +} diff --git a/app/Filament/Resources/CashCategories/Tables/CashCategoriesTable.php b/app/Filament/Resources/CashCategories/Tables/CashCategoriesTable.php new file mode 100644 index 0000000..9c3dc78 --- /dev/null +++ b/app/Filament/Resources/CashCategories/Tables/CashCategoriesTable.php @@ -0,0 +1,23 @@ +columns([ + TextColumn::make('name')->label('Nama')->searchable(), + TextColumn::make('records_count')->counts('records')->label('Transaksi'), + ]) + ->recordActions([EditAction::make()]) + ->toolbarActions([BulkActionGroup::make([DeleteBulkAction::make()])]); + } +} diff --git a/app/Filament/Resources/CashRecords/CashRecordResource.php b/app/Filament/Resources/CashRecords/CashRecordResource.php new file mode 100644 index 0000000..7edd20a --- /dev/null +++ b/app/Filament/Resources/CashRecords/CashRecordResource.php @@ -0,0 +1,40 @@ + ListCashRecords::route('/'), + 'create' => CreateCashRecord::route('/create'), + 'edit' => EditCashRecord::route('/{record}/edit'), + ]; + } +} diff --git a/app/Filament/Resources/CashRecords/Pages/CreateCashRecord.php b/app/Filament/Resources/CashRecords/Pages/CreateCashRecord.php new file mode 100644 index 0000000..5200a23 --- /dev/null +++ b/app/Filament/Resources/CashRecords/Pages/CreateCashRecord.php @@ -0,0 +1,11 @@ +components([ + Select::make('category_id')->label('Kategori') + ->options(CashCategory::pluck('name', 'id')) + ->required(), + TextInput::make('amount')->label('Jumlah (Rp)')->numeric()->required(), + Textarea::make('description')->label('Keterangan')->required()->columnSpanFull(), + DatePicker::make('date')->label('Tanggal')->required(), + ]); + } +} diff --git a/app/Filament/Resources/CashRecords/Tables/CashRecordsTable.php b/app/Filament/Resources/CashRecords/Tables/CashRecordsTable.php new file mode 100644 index 0000000..5ffff84 --- /dev/null +++ b/app/Filament/Resources/CashRecords/Tables/CashRecordsTable.php @@ -0,0 +1,34 @@ +columns([ + TextColumn::make('date')->label('Tanggal')->date('d M Y')->sortable(), + TextColumn::make('category.name')->label('Kategori'), + TextColumn::make('amount')->label('Jumlah')->money('IDR')->sortable(), + TextColumn::make('description')->label('Keterangan')->limit(40), + TextColumn::make('creator.name')->label('Dibuat Oleh'), + TextColumn::make('verifier.name')->label('Diverifikasi')->default('-'), + TextColumn::make('verified_at')->label('Tgl Verifikasi')->dateTime('d M Y')->default('-'), + ]) + ->filters([ + SelectFilter::make('category_id')->label('Kategori') + ->options(CashCategory::pluck('name', 'id')), + ]) + ->recordActions([EditAction::make()]) + ->toolbarActions([BulkActionGroup::make([DeleteBulkAction::make()])]); + } +} diff --git a/app/Filament/Resources/Divisions/DivisionResource.php b/app/Filament/Resources/Divisions/DivisionResource.php new file mode 100644 index 0000000..c2ce60f --- /dev/null +++ b/app/Filament/Resources/Divisions/DivisionResource.php @@ -0,0 +1,40 @@ + ListDivisions::route('/'), + 'create' => CreateDivision::route('/create'), + 'edit' => EditDivision::route('/{record}/edit'), + ]; + } +} diff --git a/app/Filament/Resources/Divisions/Pages/CreateDivision.php b/app/Filament/Resources/Divisions/Pages/CreateDivision.php new file mode 100644 index 0000000..3af672f --- /dev/null +++ b/app/Filament/Resources/Divisions/Pages/CreateDivision.php @@ -0,0 +1,11 @@ +components([ + TextInput::make('name')->label('Nama')->required(), + Textarea::make('description')->label('Deskripsi')->rows(3)->columnSpanFull(), + ]); + } +} diff --git a/app/Filament/Resources/Divisions/Tables/DivisionsTable.php b/app/Filament/Resources/Divisions/Tables/DivisionsTable.php new file mode 100644 index 0000000..96a7ad6 --- /dev/null +++ b/app/Filament/Resources/Divisions/Tables/DivisionsTable.php @@ -0,0 +1,24 @@ +columns([ + TextColumn::make('name')->label('Nama')->searchable()->sortable(), + TextColumn::make('description')->label('Deskripsi')->limit(50), + TextColumn::make('members_count')->counts('members')->label('Anggota'), + ]) + ->recordActions([EditAction::make()]) + ->toolbarActions([BulkActionGroup::make([DeleteBulkAction::make()])]); + } +} diff --git a/app/Filament/Resources/Users/Pages/CreateUser.php b/app/Filament/Resources/Users/Pages/CreateUser.php new file mode 100644 index 0000000..125b3ff --- /dev/null +++ b/app/Filament/Resources/Users/Pages/CreateUser.php @@ -0,0 +1,11 @@ +components([ + TextInput::make('name')->required(), + TextInput::make('email')->email()->unique(ignoreRecord: true), + TextInput::make('password')->password()->revealable() + ->required(fn ($operation) => $operation === 'create') + ->dehydrateStateUsing(fn ($state) => filled($state) ? bcrypt($state) : null) + ->dehydrated(fn ($state) => filled($state)), + TextInput::make('phone')->label('Telepon'), + Textarea::make('address')->label('Alamat')->rows(2)->columnSpanFull(), + Select::make('division_id')->label('Divisi') + ->options(Division::pluck('name', 'id')) + ->searchable(), + Select::make('status') + ->options(['aktif' => 'Aktif', 'nonaktif' => 'Nonaktif']) + ->default('aktif') + ->required() + ->live(), + Textarea::make('inactive_reason')->label('Alasan Nonaktif') + ->visible(fn ($get) => $get('status') === 'nonaktif') + ->required(fn ($get) => $get('status') === 'nonaktif') + ->columnSpanFull(), + DatePicker::make('last_activity_date')->label('Terakhir Aktif'), + Select::make('roles')->relationship('roles', 'name') + ->multiple()->preload()->label('Role'), + ]); + } +} diff --git a/app/Filament/Resources/Users/Tables/UsersTable.php b/app/Filament/Resources/Users/Tables/UsersTable.php new file mode 100644 index 0000000..c06dec2 --- /dev/null +++ b/app/Filament/Resources/Users/Tables/UsersTable.php @@ -0,0 +1,36 @@ +columns([ + TextColumn::make('name')->searchable()->sortable(), + TextColumn::make('email')->searchable(), + TextColumn::make('phone')->label('Telepon'), + TextColumn::make('division.name')->label('Divisi')->sortable(), + TextColumn::make('status')->badge() + ->color(fn ($state) => $state === 'aktif' ? 'success' : 'danger'), + TextColumn::make('roles.name')->label('Role')->badge(), + ]) + ->filters([ + SelectFilter::make('status') + ->options(['aktif' => 'Aktif', 'nonaktif' => 'Nonaktif']), + SelectFilter::make('division_id')->label('Divisi') + ->options(Division::pluck('name', 'id')), + ]) + ->recordActions([EditAction::make()]) + ->toolbarActions([BulkActionGroup::make([DeleteBulkAction::make()])]); + } +} diff --git a/app/Filament/Resources/Users/UserResource.php b/app/Filament/Resources/Users/UserResource.php new file mode 100644 index 0000000..b145e80 --- /dev/null +++ b/app/Filament/Resources/Users/UserResource.php @@ -0,0 +1,40 @@ + ListUsers::route('/'), + 'create' => CreateUser::route('/create'), + 'edit' => EditUser::route('/{record}/edit'), + ]; + } +} diff --git a/app/Filament/Resources/Votes/Pages/CreateVote.php b/app/Filament/Resources/Votes/Pages/CreateVote.php new file mode 100644 index 0000000..ec6cc5e --- /dev/null +++ b/app/Filament/Resources/Votes/Pages/CreateVote.php @@ -0,0 +1,11 @@ +components([ + TextInput::make('title')->label('Judul')->required(), + Textarea::make('description')->label('Deskripsi')->rows(3)->columnSpanFull(), + Select::make('type')->options([ + 'activity' => 'Kegiatan', + 'finance' => 'Keuangan', + 'general' => 'Umum', + ])->required(), + Select::make('status') + ->options(['open' => 'Buka', 'closed' => 'Tutup']) + ->default('open') + ->required(), + DateTimePicker::make('deadline')->label('Batas Waktu'), + ]); + } +} diff --git a/app/Filament/Resources/Votes/Tables/VotesTable.php b/app/Filament/Resources/Votes/Tables/VotesTable.php new file mode 100644 index 0000000..f80dde2 --- /dev/null +++ b/app/Filament/Resources/Votes/Tables/VotesTable.php @@ -0,0 +1,36 @@ +columns([ + TextColumn::make('title')->label('Judul')->searchable(), + TextColumn::make('type')->badge(), + TextColumn::make('status')->badge() + ->color(fn ($state) => $state === 'open' ? 'success' : 'gray'), + TextColumn::make('deadline')->label('Batas Waktu')->dateTime('d M Y H:i'), + TextColumn::make('items_count')->counts('items')->label('Suara'), + ]) + ->filters([ + SelectFilter::make('status')->options(['open' => 'Buka', 'closed' => 'Tutup']), + SelectFilter::make('type')->options([ + 'activity' => 'Kegiatan', + 'finance' => 'Keuangan', + 'general' => 'Umum', + ]), + ]) + ->recordActions([EditAction::make()]) + ->toolbarActions([BulkActionGroup::make([DeleteBulkAction::make()])]); + } +} diff --git a/app/Filament/Resources/Votes/VoteResource.php b/app/Filament/Resources/Votes/VoteResource.php new file mode 100644 index 0000000..2196266 --- /dev/null +++ b/app/Filament/Resources/Votes/VoteResource.php @@ -0,0 +1,40 @@ + ListVotes::route('/'), + 'create' => CreateVote::route('/create'), + 'edit' => EditVote::route('/{record}/edit'), + ]; + } +}