feat: tambah Filament 5 resources dengan schemas dan tables

This commit is contained in:
2026-04-03 04:22:34 +07:00
parent 401aa30ce8
commit aef6978b2a
48 changed files with 1211 additions and 0 deletions
@@ -0,0 +1,40 @@
<?php
namespace App\Filament\Resources\Activities;
use App\Filament\Resources\Activities\Pages\CreateActivity;
use App\Filament\Resources\Activities\Pages\EditActivity;
use App\Filament\Resources\Activities\Pages\ListActivities;
use App\Filament\Resources\Activities\Schemas\ActivityForm;
use App\Filament\Resources\Activities\Tables\ActivitiesTable;
use App\Models\Activity;
use Filament\Resources\Resource;
use Filament\Schemas\Schema;
use Filament\Tables\Table;
class ActivityResource extends Resource
{
protected static ?string $model = Activity::class;
protected static string|\BackedEnum|null $navigationIcon = 'heroicon-o-calendar-days';
protected static string|\UnitEnum|null $navigationGroup = 'Kegiatan';
protected static ?string $modelLabel = 'Kegiatan';
public static function form(Schema $form): Schema
{
return ActivityForm::configure($form);
}
public static function table(Table $table): Table
{
return ActivitiesTable::configure($table);
}
public static function getPages(): array
{
return [
'index' => ListActivities::route('/'),
'create' => CreateActivity::route('/create'),
'edit' => EditActivity::route('/{record}/edit'),
];
}
}
@@ -0,0 +1,11 @@
<?php
namespace App\Filament\Resources\Activities\Pages;
use App\Filament\Resources\Activities\ActivityResource;
use Filament\Resources\Pages\CreateRecord;
class CreateActivity extends CreateRecord
{
protected static string $resource = ActivityResource::class;
}
@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\Activities\Pages;
use App\Filament\Resources\Activities\ActivityResource;
use Filament\Actions\DeleteAction;
use Filament\Resources\Pages\EditRecord;
class EditActivity extends EditRecord
{
protected static string $resource = ActivityResource::class;
protected function getHeaderActions(): array
{
return [
DeleteAction::make(),
];
}
}
@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\Activities\Pages;
use App\Filament\Resources\Activities\ActivityResource;
use Filament\Actions\CreateAction;
use Filament\Resources\Pages\ListRecords;
class ListActivities extends ListRecords
{
protected static string $resource = ActivityResource::class;
protected function getHeaderActions(): array
{
return [
CreateAction::make(),
];
}
}
@@ -0,0 +1,42 @@
<?php
namespace App\Filament\Resources\Activities\Schemas;
use App\Models\User;
use Filament\Forms\Components\DatePicker;
use Filament\Forms\Components\DateTimePicker;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\Textarea;
use Filament\Forms\Components\TextInput;
use Filament\Schemas\Schema;
class ActivityForm
{
public static function configure(Schema $schema): Schema
{
return $schema->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(),
]);
}
}
@@ -0,0 +1,41 @@
<?php
namespace App\Filament\Resources\Activities\Tables;
use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteBulkAction;
use Filament\Actions\EditAction;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Filters\SelectFilter;
use Filament\Tables\Table;
class ActivitiesTable
{
public static function configure(Table $table): Table
{
return $table
->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()])]);
}
}
@@ -0,0 +1,40 @@
<?php
namespace App\Filament\Resources\Approvals;
use App\Filament\Resources\Approvals\Pages\CreateApproval;
use App\Filament\Resources\Approvals\Pages\EditApproval;
use App\Filament\Resources\Approvals\Pages\ListApprovals;
use App\Filament\Resources\Approvals\Schemas\ApprovalForm;
use App\Filament\Resources\Approvals\Tables\ApprovalsTable;
use App\Models\Approval;
use Filament\Resources\Resource;
use Filament\Schemas\Schema;
use Filament\Tables\Table;
class ApprovalResource extends Resource
{
protected static ?string $model = Approval::class;
protected static string|\BackedEnum|null $navigationIcon = 'heroicon-o-clipboard-document-check';
protected static string|\UnitEnum|null $navigationGroup = 'Keputusan';
protected static ?string $modelLabel = 'Persetujuan';
public static function form(Schema $form): Schema
{
return ApprovalForm::configure($form);
}
public static function table(Table $table): Table
{
return ApprovalsTable::configure($table);
}
public static function getPages(): array
{
return [
'index' => ListApprovals::route('/'),
'create' => CreateApproval::route('/create'),
'edit' => EditApproval::route('/{record}/edit'),
];
}
}
@@ -0,0 +1,11 @@
<?php
namespace App\Filament\Resources\Approvals\Pages;
use App\Filament\Resources\Approvals\ApprovalResource;
use Filament\Resources\Pages\CreateRecord;
class CreateApproval extends CreateRecord
{
protected static string $resource = ApprovalResource::class;
}
@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\Approvals\Pages;
use App\Filament\Resources\Approvals\ApprovalResource;
use Filament\Actions\DeleteAction;
use Filament\Resources\Pages\EditRecord;
class EditApproval extends EditRecord
{
protected static string $resource = ApprovalResource::class;
protected function getHeaderActions(): array
{
return [
DeleteAction::make(),
];
}
}
@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\Approvals\Pages;
use App\Filament\Resources\Approvals\ApprovalResource;
use Filament\Actions\CreateAction;
use Filament\Resources\Pages\ListRecords;
class ListApprovals extends ListRecords
{
protected static string $resource = ApprovalResource::class;
protected function getHeaderActions(): array
{
return [
CreateAction::make(),
];
}
}
@@ -0,0 +1,27 @@
<?php
namespace App\Filament\Resources\Approvals\Schemas;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Schemas\Schema;
class ApprovalForm
{
public static function configure(Schema $schema): Schema
{
return $schema->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(),
]);
}
}
@@ -0,0 +1,39 @@
<?php
namespace App\Filament\Resources\Approvals\Tables;
use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteBulkAction;
use Filament\Actions\EditAction;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Filters\SelectFilter;
use Filament\Tables\Table;
class ApprovalsTable
{
public static function configure(Table $table): Table
{
return $table
->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()])]);
}
}
@@ -0,0 +1,40 @@
<?php
namespace App\Filament\Resources\Audits;
use App\Filament\Resources\Audits\Pages\CreateAudit;
use App\Filament\Resources\Audits\Pages\EditAudit;
use App\Filament\Resources\Audits\Pages\ListAudits;
use App\Filament\Resources\Audits\Schemas\AuditForm;
use App\Filament\Resources\Audits\Tables\AuditsTable;
use App\Models\Audit;
use Filament\Resources\Resource;
use Filament\Schemas\Schema;
use Filament\Tables\Table;
class AuditResource extends Resource
{
protected static ?string $model = Audit::class;
protected static string|\BackedEnum|null $navigationIcon = 'heroicon-o-magnifying-glass';
protected static string|\UnitEnum|null $navigationGroup = 'Audit';
protected static ?string $modelLabel = 'Temuan Audit';
public static function form(Schema $form): Schema
{
return AuditForm::configure($form);
}
public static function table(Table $table): Table
{
return AuditsTable::configure($table);
}
public static function getPages(): array
{
return [
'index' => ListAudits::route('/'),
'create' => CreateAudit::route('/create'),
'edit' => EditAudit::route('/{record}/edit'),
];
}
}
@@ -0,0 +1,11 @@
<?php
namespace App\Filament\Resources\Audits\Pages;
use App\Filament\Resources\Audits\AuditResource;
use Filament\Resources\Pages\CreateRecord;
class CreateAudit extends CreateRecord
{
protected static string $resource = AuditResource::class;
}
@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\Audits\Pages;
use App\Filament\Resources\Audits\AuditResource;
use Filament\Actions\DeleteAction;
use Filament\Resources\Pages\EditRecord;
class EditAudit extends EditRecord
{
protected static string $resource = AuditResource::class;
protected function getHeaderActions(): array
{
return [
DeleteAction::make(),
];
}
}
@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\Audits\Pages;
use App\Filament\Resources\Audits\AuditResource;
use Filament\Actions\CreateAction;
use Filament\Resources\Pages\ListRecords;
class ListAudits extends ListRecords
{
protected static string $resource = AuditResource::class;
protected function getHeaderActions(): array
{
return [
CreateAction::make(),
];
}
}
@@ -0,0 +1,32 @@
<?php
namespace App\Filament\Resources\Audits\Schemas;
use App\Models\User;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\Textarea;
use Filament\Forms\Components\TextInput;
use Filament\Schemas\Schema;
class AuditForm
{
public static function configure(Schema $schema): Schema
{
return $schema->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(),
]);
}
}
@@ -0,0 +1,34 @@
<?php
namespace App\Filament\Resources\Audits\Tables;
use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteBulkAction;
use Filament\Actions\EditAction;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Filters\SelectFilter;
use Filament\Tables\Table;
class AuditsTable
{
public static function configure(Table $table): Table
{
return $table
->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()])]);
}
}
@@ -0,0 +1,40 @@
<?php
namespace App\Filament\Resources\CashCategories;
use App\Filament\Resources\CashCategories\Pages\CreateCashCategory;
use App\Filament\Resources\CashCategories\Pages\EditCashCategory;
use App\Filament\Resources\CashCategories\Pages\ListCashCategories;
use App\Filament\Resources\CashCategories\Schemas\CashCategoryForm;
use App\Filament\Resources\CashCategories\Tables\CashCategoriesTable;
use App\Models\CashCategory;
use Filament\Resources\Resource;
use Filament\Schemas\Schema;
use Filament\Tables\Table;
class CashCategoryResource extends Resource
{
protected static ?string $model = CashCategory::class;
protected static string|\BackedEnum|null $navigationIcon = 'heroicon-o-tag';
protected static string|\UnitEnum|null $navigationGroup = 'Keuangan';
protected static ?string $modelLabel = 'Kategori Kas';
public static function form(Schema $form): Schema
{
return CashCategoryForm::configure($form);
}
public static function table(Table $table): Table
{
return CashCategoriesTable::configure($table);
}
public static function getPages(): array
{
return [
'index' => ListCashCategories::route('/'),
'create' => CreateCashCategory::route('/create'),
'edit' => EditCashCategory::route('/{record}/edit'),
];
}
}
@@ -0,0 +1,11 @@
<?php
namespace App\Filament\Resources\CashCategories\Pages;
use App\Filament\Resources\CashCategories\CashCategoryResource;
use Filament\Resources\Pages\CreateRecord;
class CreateCashCategory extends CreateRecord
{
protected static string $resource = CashCategoryResource::class;
}
@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\CashCategories\Pages;
use App\Filament\Resources\CashCategories\CashCategoryResource;
use Filament\Actions\DeleteAction;
use Filament\Resources\Pages\EditRecord;
class EditCashCategory extends EditRecord
{
protected static string $resource = CashCategoryResource::class;
protected function getHeaderActions(): array
{
return [
DeleteAction::make(),
];
}
}
@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\CashCategories\Pages;
use App\Filament\Resources\CashCategories\CashCategoryResource;
use Filament\Actions\CreateAction;
use Filament\Resources\Pages\ListRecords;
class ListCashCategories extends ListRecords
{
protected static string $resource = CashCategoryResource::class;
protected function getHeaderActions(): array
{
return [
CreateAction::make(),
];
}
}
@@ -0,0 +1,16 @@
<?php
namespace App\Filament\Resources\CashCategories\Schemas;
use Filament\Forms\Components\TextInput;
use Filament\Schemas\Schema;
class CashCategoryForm
{
public static function configure(Schema $schema): Schema
{
return $schema->components([
TextInput::make('name')->label('Nama')->required(),
]);
}
}
@@ -0,0 +1,23 @@
<?php
namespace App\Filament\Resources\CashCategories\Tables;
use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteBulkAction;
use Filament\Actions\EditAction;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
class CashCategoriesTable
{
public static function configure(Table $table): Table
{
return $table
->columns([
TextColumn::make('name')->label('Nama')->searchable(),
TextColumn::make('records_count')->counts('records')->label('Transaksi'),
])
->recordActions([EditAction::make()])
->toolbarActions([BulkActionGroup::make([DeleteBulkAction::make()])]);
}
}
@@ -0,0 +1,40 @@
<?php
namespace App\Filament\Resources\CashRecords;
use App\Filament\Resources\CashRecords\Pages\CreateCashRecord;
use App\Filament\Resources\CashRecords\Pages\EditCashRecord;
use App\Filament\Resources\CashRecords\Pages\ListCashRecords;
use App\Filament\Resources\CashRecords\Schemas\CashRecordForm;
use App\Filament\Resources\CashRecords\Tables\CashRecordsTable;
use App\Models\CashRecord;
use Filament\Resources\Resource;
use Filament\Schemas\Schema;
use Filament\Tables\Table;
class CashRecordResource extends Resource
{
protected static ?string $model = CashRecord::class;
protected static string|\BackedEnum|null $navigationIcon = 'heroicon-o-banknotes';
protected static string|\UnitEnum|null $navigationGroup = 'Keuangan';
protected static ?string $modelLabel = 'Transaksi Kas';
public static function form(Schema $form): Schema
{
return CashRecordForm::configure($form);
}
public static function table(Table $table): Table
{
return CashRecordsTable::configure($table);
}
public static function getPages(): array
{
return [
'index' => ListCashRecords::route('/'),
'create' => CreateCashRecord::route('/create'),
'edit' => EditCashRecord::route('/{record}/edit'),
];
}
}
@@ -0,0 +1,11 @@
<?php
namespace App\Filament\Resources\CashRecords\Pages;
use App\Filament\Resources\CashRecords\CashRecordResource;
use Filament\Resources\Pages\CreateRecord;
class CreateCashRecord extends CreateRecord
{
protected static string $resource = CashRecordResource::class;
}
@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\CashRecords\Pages;
use App\Filament\Resources\CashRecords\CashRecordResource;
use Filament\Actions\DeleteAction;
use Filament\Resources\Pages\EditRecord;
class EditCashRecord extends EditRecord
{
protected static string $resource = CashRecordResource::class;
protected function getHeaderActions(): array
{
return [
DeleteAction::make(),
];
}
}
@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\CashRecords\Pages;
use App\Filament\Resources\CashRecords\CashRecordResource;
use Filament\Actions\CreateAction;
use Filament\Resources\Pages\ListRecords;
class ListCashRecords extends ListRecords
{
protected static string $resource = CashRecordResource::class;
protected function getHeaderActions(): array
{
return [
CreateAction::make(),
];
}
}
@@ -0,0 +1,25 @@
<?php
namespace App\Filament\Resources\CashRecords\Schemas;
use App\Models\CashCategory;
use Filament\Forms\Components\DatePicker;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\Textarea;
use Filament\Forms\Components\TextInput;
use Filament\Schemas\Schema;
class CashRecordForm
{
public static function configure(Schema $schema): Schema
{
return $schema->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(),
]);
}
}
@@ -0,0 +1,34 @@
<?php
namespace App\Filament\Resources\CashRecords\Tables;
use App\Models\CashCategory;
use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteBulkAction;
use Filament\Actions\EditAction;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Filters\SelectFilter;
use Filament\Tables\Table;
class CashRecordsTable
{
public static function configure(Table $table): Table
{
return $table
->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()])]);
}
}
@@ -0,0 +1,40 @@
<?php
namespace App\Filament\Resources\Divisions;
use App\Filament\Resources\Divisions\Pages\CreateDivision;
use App\Filament\Resources\Divisions\Pages\EditDivision;
use App\Filament\Resources\Divisions\Pages\ListDivisions;
use App\Filament\Resources\Divisions\Schemas\DivisionForm;
use App\Filament\Resources\Divisions\Tables\DivisionsTable;
use App\Models\Division;
use Filament\Resources\Resource;
use Filament\Schemas\Schema;
use Filament\Tables\Table;
class DivisionResource extends Resource
{
protected static ?string $model = Division::class;
protected static string|\BackedEnum|null $navigationIcon = 'heroicon-o-rectangle-group';
protected static string|\UnitEnum|null $navigationGroup = 'Organisasi';
protected static ?string $modelLabel = 'Divisi';
public static function form(Schema $form): Schema
{
return DivisionForm::configure($form);
}
public static function table(Table $table): Table
{
return DivisionsTable::configure($table);
}
public static function getPages(): array
{
return [
'index' => ListDivisions::route('/'),
'create' => CreateDivision::route('/create'),
'edit' => EditDivision::route('/{record}/edit'),
];
}
}
@@ -0,0 +1,11 @@
<?php
namespace App\Filament\Resources\Divisions\Pages;
use App\Filament\Resources\Divisions\DivisionResource;
use Filament\Resources\Pages\CreateRecord;
class CreateDivision extends CreateRecord
{
protected static string $resource = DivisionResource::class;
}
@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\Divisions\Pages;
use App\Filament\Resources\Divisions\DivisionResource;
use Filament\Actions\DeleteAction;
use Filament\Resources\Pages\EditRecord;
class EditDivision extends EditRecord
{
protected static string $resource = DivisionResource::class;
protected function getHeaderActions(): array
{
return [
DeleteAction::make(),
];
}
}
@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\Divisions\Pages;
use App\Filament\Resources\Divisions\DivisionResource;
use Filament\Actions\CreateAction;
use Filament\Resources\Pages\ListRecords;
class ListDivisions extends ListRecords
{
protected static string $resource = DivisionResource::class;
protected function getHeaderActions(): array
{
return [
CreateAction::make(),
];
}
}
@@ -0,0 +1,18 @@
<?php
namespace App\Filament\Resources\Divisions\Schemas;
use Filament\Forms\Components\Textarea;
use Filament\Forms\Components\TextInput;
use Filament\Schemas\Schema;
class DivisionForm
{
public static function configure(Schema $schema): Schema
{
return $schema->components([
TextInput::make('name')->label('Nama')->required(),
Textarea::make('description')->label('Deskripsi')->rows(3)->columnSpanFull(),
]);
}
}
@@ -0,0 +1,24 @@
<?php
namespace App\Filament\Resources\Divisions\Tables;
use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteBulkAction;
use Filament\Actions\EditAction;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
class DivisionsTable
{
public static function configure(Table $table): Table
{
return $table
->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()])]);
}
}
@@ -0,0 +1,11 @@
<?php
namespace App\Filament\Resources\Users\Pages;
use App\Filament\Resources\Users\UserResource;
use Filament\Resources\Pages\CreateRecord;
class CreateUser extends CreateRecord
{
protected static string $resource = UserResource::class;
}
@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\Users\Pages;
use App\Filament\Resources\Users\UserResource;
use Filament\Actions\DeleteAction;
use Filament\Resources\Pages\EditRecord;
class EditUser extends EditRecord
{
protected static string $resource = UserResource::class;
protected function getHeaderActions(): array
{
return [
DeleteAction::make(),
];
}
}
@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\Users\Pages;
use App\Filament\Resources\Users\UserResource;
use Filament\Actions\CreateAction;
use Filament\Resources\Pages\ListRecords;
class ListUsers extends ListRecords
{
protected static string $resource = UserResource::class;
protected function getHeaderActions(): array
{
return [
CreateAction::make(),
];
}
}
@@ -0,0 +1,42 @@
<?php
namespace App\Filament\Resources\Users\Schemas;
use App\Models\Division;
use Filament\Forms\Components\DatePicker;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\Textarea;
use Filament\Forms\Components\TextInput;
use Filament\Schemas\Schema;
class UserForm
{
public static function configure(Schema $schema): Schema
{
return $schema->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'),
]);
}
}
@@ -0,0 +1,36 @@
<?php
namespace App\Filament\Resources\Users\Tables;
use App\Models\Division;
use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteBulkAction;
use Filament\Actions\EditAction;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Filters\SelectFilter;
use Filament\Tables\Table;
class UsersTable
{
public static function configure(Table $table): Table
{
return $table
->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()])]);
}
}
@@ -0,0 +1,40 @@
<?php
namespace App\Filament\Resources\Users;
use App\Filament\Resources\Users\Pages\CreateUser;
use App\Filament\Resources\Users\Pages\EditUser;
use App\Filament\Resources\Users\Pages\ListUsers;
use App\Filament\Resources\Users\Schemas\UserForm;
use App\Filament\Resources\Users\Tables\UsersTable;
use App\Models\User;
use Filament\Resources\Resource;
use Filament\Schemas\Schema;
use Filament\Tables\Table;
class UserResource extends Resource
{
protected static ?string $model = User::class;
protected static string|\BackedEnum|null $navigationIcon = 'heroicon-o-users';
protected static string|\UnitEnum|null $navigationGroup = 'Organisasi';
protected static ?string $modelLabel = 'Anggota';
public static function form(Schema $form): Schema
{
return UserForm::configure($form);
}
public static function table(Table $table): Table
{
return UsersTable::configure($table);
}
public static function getPages(): array
{
return [
'index' => ListUsers::route('/'),
'create' => CreateUser::route('/create'),
'edit' => EditUser::route('/{record}/edit'),
];
}
}
@@ -0,0 +1,11 @@
<?php
namespace App\Filament\Resources\Votes\Pages;
use App\Filament\Resources\Votes\VoteResource;
use Filament\Resources\Pages\CreateRecord;
class CreateVote extends CreateRecord
{
protected static string $resource = VoteResource::class;
}
@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\Votes\Pages;
use App\Filament\Resources\Votes\VoteResource;
use Filament\Actions\DeleteAction;
use Filament\Resources\Pages\EditRecord;
class EditVote extends EditRecord
{
protected static string $resource = VoteResource::class;
protected function getHeaderActions(): array
{
return [
DeleteAction::make(),
];
}
}
@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\Votes\Pages;
use App\Filament\Resources\Votes\VoteResource;
use Filament\Actions\CreateAction;
use Filament\Resources\Pages\ListRecords;
class ListVotes extends ListRecords
{
protected static string $resource = VoteResource::class;
protected function getHeaderActions(): array
{
return [
CreateAction::make(),
];
}
}
@@ -0,0 +1,30 @@
<?php
namespace App\Filament\Resources\Votes\Schemas;
use Filament\Forms\Components\DateTimePicker;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\Textarea;
use Filament\Forms\Components\TextInput;
use Filament\Schemas\Schema;
class VoteForm
{
public static function configure(Schema $schema): Schema
{
return $schema->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'),
]);
}
}
@@ -0,0 +1,36 @@
<?php
namespace App\Filament\Resources\Votes\Tables;
use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteBulkAction;
use Filament\Actions\EditAction;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Filters\SelectFilter;
use Filament\Tables\Table;
class VotesTable
{
public static function configure(Table $table): Table
{
return $table
->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()])]);
}
}
@@ -0,0 +1,40 @@
<?php
namespace App\Filament\Resources\Votes;
use App\Filament\Resources\Votes\Pages\CreateVote;
use App\Filament\Resources\Votes\Pages\EditVote;
use App\Filament\Resources\Votes\Pages\ListVotes;
use App\Filament\Resources\Votes\Schemas\VoteForm;
use App\Filament\Resources\Votes\Tables\VotesTable;
use App\Models\Vote;
use Filament\Resources\Resource;
use Filament\Schemas\Schema;
use Filament\Tables\Table;
class VoteResource extends Resource
{
protected static ?string $model = Vote::class;
protected static string|\BackedEnum|null $navigationIcon = 'heroicon-o-check-badge';
protected static string|\UnitEnum|null $navigationGroup = 'Keputusan';
protected static ?string $modelLabel = 'Voting';
public static function form(Schema $form): Schema
{
return VoteForm::configure($form);
}
public static function table(Table $table): Table
{
return VotesTable::configure($table);
}
public static function getPages(): array
{
return [
'index' => ListVotes::route('/'),
'create' => CreateVote::route('/create'),
'edit' => EditVote::route('/{record}/edit'),
];
}
}