feat: Organize Filament resources with navigation groups, update modal width enum usage, and add clean code documentation.

This commit is contained in:
Yoga Pangestu 2025-12-16 13:53:59 +07:00
parent 2603d90271
commit 89f0d511e4
22 changed files with 284 additions and 120 deletions

92
README_CLEAN_CODE.md Normal file
View File

@ -0,0 +1,92 @@
# Clean Code Guidelines for Filament Resources
This document outlines the coding standards and structure for Filament Resources in this project.
## 1. Class Properties
Properties within the Resource class should be ordered alphabetically.
**Example:**
```php
protected static ?string $model = User::class;
protected static ?string $navigationGroup = 'Master';
protected static string|BackedEnum|null $navigationIcon = Heroicon::UserGroup;
protected static ?string $navigationLabel = 'Pengguna';
protected static ?int $navigationSort = 7;
protected static ?string $recordTitleAttribute = 'name';
protected static ?string $slug = 'master/users';
```
## 2. Form Structure
Form components should be structured with method calls in the following order:
1. **Basic**: `make`, `label`, `placeholder`
2. **HTML Attributes**: `autocomplete`, `autofocus`, etc.
3. **Validation**: `required`, `maxLength`, `email`, `unique`, `regex`, etc.
4. **Filament/Logic**: `relationship`, `live`, `afterStateUpdated`, etc.
**Formatting:**
- Use a blank line between each component definition.
**Example:**
```php
TextInput::make('name')
->label('Nama')
->placeholder('John Doe')
->autocomplete(false)
->autofocus()
->required()
->maxLength(100),
TextInput::make('email')
->label('Alamat Surel')
->placeholder('email@example.com')
->autocomplete(false)
->required()
->email(),
```
## 3. Table Structure
### Columns
Column definitions should be structured in the following order:
1. **Basic**: `make`, `label`
2. **Search & Sort**: `searchable`, `sortable` (These should be present for most fields)
3. **State & Attributes**: `getStateUsing`, `updateStateUsing`, `badge`, `icon`
4. **Formatting**: `dateTime`, `money`, etc.
**Formatting:**
- Use a blank line between each column definition.
**Example:**
```php
TextColumn::make('name')
->label('Nama')
->searchable()
->sortable(),
ToggleColumn::make('is_active')
->label('Status')
->sortable()
->updateStateUsing(...),
```
### Table Method Order
The methods chained to the `$table` object should follow this order:
1. `columns([\ ... ])`
2. `filters([\ ... ])`
3. `recordActions([\ ... ])` (or `actions`)
4. `toolbarActions([\ ... ])` (or `headerActions`)
5. `emptyStateIcon(...)`
6. `emptyStateDescription(...)`
7. `defaultSort(...)`
8. `deferFilters(...)`
9. Other configuration methods.
## 4. General Formatting
- Ensure consistent indentation.
- Always use a blank line to separate distinct logical blocks or component definitions to improve readability.

View File

@ -11,7 +11,6 @@ public static function make(): array
return [ return [
TextColumn::make('created_at') TextColumn::make('created_at')
->label('Dibuat') ->label('Dibuat')
->dateTime()
->sortable() ->sortable()
->toggleable(isToggledHiddenByDefault: true) ->toggleable(isToggledHiddenByDefault: true)
->dateTime('l, d F Y H:i:s') ->dateTime('l, d F Y H:i:s')
@ -19,7 +18,6 @@ public static function make(): array
TextColumn::make('updated_at') TextColumn::make('updated_at')
->label('Diperbarui') ->label('Diperbarui')
->dateTime()
->sortable() ->sortable()
->toggleable(isToggledHiddenByDefault: true) ->toggleable(isToggledHiddenByDefault: true)
->dateTime('l, d F Y H:i:s') ->dateTime('l, d F Y H:i:s')
@ -27,7 +25,6 @@ public static function make(): array
TextColumn::make('deleted_at') TextColumn::make('deleted_at')
->label('Dihapus') ->label('Dihapus')
->dateTime()
->sortable() ->sortable()
->toggleable(isToggledHiddenByDefault: true) ->toggleable(isToggledHiddenByDefault: true)
->dateTime('l, d F Y H:i:s') ->dateTime('l, d F Y H:i:s')

View File

@ -30,17 +30,17 @@ class CooperationResource extends Resource
{ {
protected static ?string $model = Cooperation::class; protected static ?string $model = Cooperation::class;
protected static string|UnitEnum|null $navigationGroup = 'Manage';
protected static string|BackedEnum|null $navigationIcon = Heroicon::HandRaised; protected static string|BackedEnum|null $navigationIcon = Heroicon::HandRaised;
protected static ?string $navigationLabel = 'Kerja Sama'; protected static ?string $navigationLabel = 'Kerja Sama';
protected static string|UnitEnum|null $navigationGroup = 'Manage'; protected static ?int $navigationSort = 20;
protected static ?string $slug = 'manage/cooperations';
protected static ?string $recordTitleAttribute = 'title'; protected static ?string $recordTitleAttribute = 'title';
protected static ?int $navigationSort = 20; protected static ?string $slug = 'manage/cooperations';
public static function form(Schema $schema): Schema public static function form(Schema $schema): Schema
{ {

View File

@ -13,6 +13,7 @@
use Filament\Infolists\Infolist; use Filament\Infolists\Infolist;
use Filament\Notifications\Notification; use Filament\Notifications\Notification;
use Filament\Resources\RelationManagers\RelationManager; use Filament\Resources\RelationManagers\RelationManager;
use Filament\Support\Enums\Width;
use Filament\Support\Icons\Heroicon; use Filament\Support\Icons\Heroicon;
use Filament\Tables\Columns\TextColumn; use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table; use Filament\Tables\Table;
@ -70,6 +71,7 @@ public function table(Table $table): Table
->headerActions([]) ->headerActions([])
->recordActions([ ->recordActions([
ViewAction::make(), ViewAction::make(),
Action::make('accept') Action::make('accept')
->label('Terima') ->label('Terima')
->icon(Heroicon::OutlinedCheck) ->icon(Heroicon::OutlinedCheck)
@ -87,6 +89,7 @@ public function table(Table $table): Table
->send(); ->send();
}) })
->visible(fn(CooperationProposal $record) => ! auth()->user()->hasRole('Perusahaan') && $record->status === ApprovalStatus::PENDING), ->visible(fn(CooperationProposal $record) => ! auth()->user()->hasRole('Perusahaan') && $record->status === ApprovalStatus::PENDING),
Action::make('reject') Action::make('reject')
->label('Tolak') ->label('Tolak')
->icon(Heroicon::XMark) ->icon(Heroicon::XMark)
@ -112,7 +115,7 @@ public function table(Table $table): Table
->send(); ->send();
}) })
->visible(fn(CooperationProposal $record) => ! auth()->user()->hasRole('Perusahaan') && $record->status === ApprovalStatus::PENDING) ->visible(fn(CooperationProposal $record) => ! auth()->user()->hasRole('Perusahaan') && $record->status === ApprovalStatus::PENDING)
->modalWidth('lg'), ->modalWidth(Width::Large),
]) ])
->toolbarActions([ ->toolbarActions([
BulkActionGroup::make([ BulkActionGroup::make([

View File

@ -13,6 +13,7 @@
use Filament\Notifications\Notification; use Filament\Notifications\Notification;
use Filament\Resources\RelationManagers\RelationManager; use Filament\Resources\RelationManagers\RelationManager;
use Filament\Schemas\Schema; use Filament\Schemas\Schema;
use Filament\Support\Enums\Width;
use Filament\Support\Icons\Heroicon; use Filament\Support\Icons\Heroicon;
use Filament\Tables\Columns\TextColumn; use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table; use Filament\Tables\Table;
@ -36,22 +37,26 @@ public function form(Schema $schema): Schema
->placeholder('Dirgahayu Purwakarta') ->placeholder('Dirgahayu Purwakarta')
->required() ->required()
->maxLength(200), ->maxLength(200),
DatePicker::make('publication_date') DatePicker::make('publication_date')
->label('Tanggal Publikasi') ->label('Tanggal Publikasi')
->placeholder(fn() => now()->format('l, d F Y')) ->placeholder(fn() => now()->format('l, d F Y'))
->native(false) ->native(false)
->displayFormat('l, d F Y') ->displayFormat('l, d F Y')
->required(), ->required(),
TextInput::make('link') TextInput::make('link')
->label('Tautan') ->label('Tautan')
->placeholder('https://example.com') ->placeholder('https://example.com')
->maxLength(50) ->maxLength(50)
->url() ->url()
->required(), ->required(),
Textarea::make('description') Textarea::make('description')
->label('Deskripsi') ->label('Deskripsi')
->placeholder('....') ->placeholder('....')
->required(), ->required(),
SpatieMediaLibraryFileUpload::make('image') SpatieMediaLibraryFileUpload::make('image')
->label('Gambar') ->label('Gambar')
->disk(config('filesystems.default')) ->disk(config('filesystems.default'))
@ -72,17 +77,21 @@ public function table(Table $table): Table
TextColumn::make('title') TextColumn::make('title')
->label('Judul') ->label('Judul')
->searchable(), ->searchable(),
TextColumn::make('publication_date') TextColumn::make('publication_date')
->label('Tanggal Publikasi') ->label('Tanggal Publikasi')
->date('l, d F Y'), ->date('l, d F Y'),
TextColumn::make('link') TextColumn::make('link')
->label('Link') ->label('Link')
->limit(30) ->limit(30)
->url(fn($record) => $record->link) ->url(fn($record) => $record->link)
->openUrlInNewTab(), ->openUrlInNewTab(),
TextColumn::make('status') TextColumn::make('status')
->label('Status') ->label('Status')
->badge(), ->badge(),
TextColumn::make('rejectionReasons.reason') TextColumn::make('rejectionReasons.reason')
->label('Alasan Penolakan') ->label('Alasan Penolakan')
->searchable(), ->searchable(),
@ -105,6 +114,7 @@ public function table(Table $table): Table
->send(); ->send();
}) })
->visible(fn(Report $record) => ! auth()->user()->hasRole('Perusahaan') && $record->status === ApprovalStatus::PENDING), ->visible(fn(Report $record) => ! auth()->user()->hasRole('Perusahaan') && $record->status === ApprovalStatus::PENDING),
Action::make('reject') Action::make('reject')
->label('Tolak') ->label('Tolak')
->icon(Heroicon::XMark) ->icon(Heroicon::XMark)
@ -129,7 +139,7 @@ public function table(Table $table): Table
->send(); ->send();
}) })
->visible(fn(Report $record) => ! auth()->user()->hasRole('Perusahaan') && $record->status === ApprovalStatus::PENDING) ->visible(fn(Report $record) => ! auth()->user()->hasRole('Perusahaan') && $record->status === ApprovalStatus::PENDING)
->modalWidth('lg'), ->modalWidth(Width::Large),
]) ])
->headerActions([ ->headerActions([
CreateAction::make() CreateAction::make()

View File

@ -90,7 +90,6 @@ public function table(Table $table): Table
TextColumn::make('report_amount') TextColumn::make('report_amount')
->label('Jumlah Laporan'), ->label('Jumlah Laporan'),
TextColumn::make('report_count') TextColumn::make('report_count')
->label('Laporan Diterima') ->label('Laporan Diterima')
->getStateUsing(function (TaskAssignment $record) { ->getStateUsing(function (TaskAssignment $record) {

View File

@ -20,6 +20,7 @@
use Filament\Schemas\Components\Group; use Filament\Schemas\Components\Group;
use Filament\Schemas\Components\Section; use Filament\Schemas\Components\Section;
use Filament\Schemas\Schema; use Filament\Schemas\Schema;
use Filament\Support\Enums\Width;
use Filament\Support\Icons\Heroicon; use Filament\Support\Icons\Heroicon;
use Filament\Tables\Columns\TextColumn; use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Filters\TrashedFilter; use Filament\Tables\Filters\TrashedFilter;
@ -34,17 +35,17 @@ class JournalistResource extends Resource
{ {
protected static ?string $model = Journalist::class; protected static ?string $model = Journalist::class;
protected static string|UnitEnum|null $navigationGroup = 'Kelola';
protected static string|BackedEnum|null $navigationIcon = Heroicon::Identification; protected static string|BackedEnum|null $navigationIcon = Heroicon::Identification;
protected static ?string $navigationLabel = 'Jurnalis'; protected static ?string $navigationLabel = 'Jurnalis';
protected static string|UnitEnum|null $navigationGroup = 'Kelola'; protected static ?int $navigationSort = 11;
protected static ?string $slug = 'manage/journalists';
protected static ?string $recordTitleAttribute = 'name'; protected static ?string $recordTitleAttribute = 'name';
protected static ?int $navigationSort = 11; protected static ?string $slug = 'manage/journalists';
public static function form(Schema $schema): Schema public static function form(Schema $schema): Schema
{ {
@ -161,11 +162,12 @@ public static function table(Table $table): Table
...TimestampColumns::make(), ...TimestampColumns::make(),
]) ])
->filters([ ->filters([
TrashedFilter::make()->native(false), TrashedFilter::make()
->native(false),
]) ])
->recordActions([ ->recordActions([
EditAction::make() EditAction::make()
->modalWidth('lg') ->modalWidth(Width::Large)
->fillForm(function (Journalist $journalist) { ->fillForm(function (Journalist $journalist) {
$data = [ $data = [
'name' => $journalist->name, 'name' => $journalist->name,
@ -237,8 +239,11 @@ public static function table(Table $table): Table
return $record; return $record;
}), }),
DeleteAction::make(), DeleteAction::make(),
ForceDeleteAction::make(), ForceDeleteAction::make(),
RestoreAction::make(), RestoreAction::make(),
]) ])
->toolbarActions([ ->toolbarActions([

View File

@ -16,6 +16,7 @@
use Filament\Forms\Components\TextInput; use Filament\Forms\Components\TextInput;
use Filament\Resources\Resource; use Filament\Resources\Resource;
use Filament\Schemas\Schema; use Filament\Schemas\Schema;
use Filament\Support\Enums\Width;
use Filament\Support\Icons\Heroicon; use Filament\Support\Icons\Heroicon;
use Filament\Tables\Columns\TextColumn; use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Filters\TrashedFilter; use Filament\Tables\Filters\TrashedFilter;
@ -27,17 +28,17 @@ class PartnerResource extends Resource
{ {
protected static ?string $model = User::class; protected static ?string $model = User::class;
protected static string|UnitEnum|null $navigationGroup = 'Kelola';
protected static string|BackedEnum|null $navigationIcon = Heroicon::BuildingOffice2; protected static string|BackedEnum|null $navigationIcon = Heroicon::BuildingOffice2;
protected static ?string $navigationLabel = 'Rekanan'; protected static ?string $navigationLabel = 'Rekanan';
protected static string|UnitEnum|null $navigationGroup = 'Kelola'; protected static ?int $navigationSort = 8;
protected static ?string $slug = 'manage/partners';
protected static ?string $recordTitleAttribute = 'name'; protected static ?string $recordTitleAttribute = 'name';
protected static ?int $navigationSort = 8; protected static ?string $slug = 'manage/partners';
public static function form(Schema $schema): Schema public static function form(Schema $schema): Schema
{ {

View File

@ -16,6 +16,7 @@
use Filament\Forms\Components\TextInput; use Filament\Forms\Components\TextInput;
use Filament\Resources\Resource; use Filament\Resources\Resource;
use Filament\Schemas\Schema; use Filament\Schemas\Schema;
use Filament\Support\Enums\Width;
use Filament\Support\Icons\Heroicon; use Filament\Support\Icons\Heroicon;
use Filament\Tables\Columns\TextColumn; use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Columns\ToggleColumn; use Filament\Tables\Columns\ToggleColumn;
@ -29,17 +30,17 @@ class ClassificationResource extends Resource
{ {
protected static ?string $model = Classification::class; protected static ?string $model = Classification::class;
protected static string|UnitEnum|null $navigationGroup = 'Master';
protected static string|BackedEnum|null $navigationIcon = Heroicon::BookOpen; protected static string|BackedEnum|null $navigationIcon = Heroicon::BookOpen;
protected static ?string $navigationLabel = 'Klasifikasi'; protected static ?string $navigationLabel = 'Klasifikasi';
protected static string|UnitEnum|null $navigationGroup = 'Master'; protected static ?int $navigationSort = 1;
protected static ?string $slug = 'master/classifications';
protected static ?string $recordTitleAttribute = 'name'; protected static ?string $recordTitleAttribute = 'name';
protected static ?int $navigationSort = 1; protected static ?string $slug = 'master/classifications';
public static function form(Schema $schema): Schema public static function form(Schema $schema): Schema
{ {
@ -68,22 +69,27 @@ public static function table(Table $table): Table
ToggleColumn::make('is_active') ToggleColumn::make('is_active')
->label('Aktif?') ->label('Aktif?')
->sortable()
->getStateUsing(fn(Classification $record) => $record->is_active === IsActive::ACTIVE) ->getStateUsing(fn(Classification $record) => $record->is_active === IsActive::ACTIVE)
->updateStateUsing(function (Classification $record, bool $state) { ->updateStateUsing(function (Classification $record, bool $state) {
$record->is_active = $state ? IsActive::ACTIVE : IsActive::INACTIVE; $record->is_active = $state ? IsActive::ACTIVE : IsActive::INACTIVE;
$record->save(); $record->save();
}) }),
->sortable(),
...TimestampColumns::make(), ...TimestampColumns::make(),
]) ])
->filters([ ->filters([
TrashedFilter::make()->native(false), TrashedFilter::make()
->native(false),
]) ])
->recordActions([ ->recordActions([
EditAction::make()->modalWidth('lg'), EditAction::make()
->modalWidth(Width::Large),
DeleteAction::make(), DeleteAction::make(),
ForceDeleteAction::make(), ForceDeleteAction::make(),
RestoreAction::make(), RestoreAction::make(),
]) ])
->toolbarActions([ ->toolbarActions([

View File

@ -16,6 +16,7 @@
use Filament\Forms\Components\TextInput; use Filament\Forms\Components\TextInput;
use Filament\Resources\Resource; use Filament\Resources\Resource;
use Filament\Schemas\Schema; use Filament\Schemas\Schema;
use Filament\Support\Enums\Width;
use Filament\Support\Icons\Heroicon; use Filament\Support\Icons\Heroicon;
use Filament\Tables\Columns\TextColumn; use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Columns\ToggleColumn; use Filament\Tables\Columns\ToggleColumn;
@ -29,17 +30,17 @@ class DepartmentResource extends Resource
{ {
protected static ?string $model = Department::class; protected static ?string $model = Department::class;
protected static string|UnitEnum|null $navigationGroup = 'Master';
protected static string|BackedEnum|null $navigationIcon = Heroicon::BuildingLibrary; protected static string|BackedEnum|null $navigationIcon = Heroicon::BuildingLibrary;
protected static ?string $navigationLabel = 'OPD'; protected static ?string $navigationLabel = 'OPD';
protected static string|UnitEnum|null $navigationGroup = 'Master'; protected static ?int $navigationSort = 5;
protected static ?string $slug = 'master/departments';
protected static ?string $recordTitleAttribute = 'name'; protected static ?string $recordTitleAttribute = 'name';
protected static ?int $navigationSort = 5; protected static ?string $slug = 'master/departments';
public static function form(Schema $schema): Schema public static function form(Schema $schema): Schema
{ {
@ -79,22 +80,27 @@ public static function table(Table $table): Table
ToggleColumn::make('is_active') ToggleColumn::make('is_active')
->label('Aktif?') ->label('Aktif?')
->sortable()
->getStateUsing(fn(Department $record) => $record->is_active === IsActive::ACTIVE) ->getStateUsing(fn(Department $record) => $record->is_active === IsActive::ACTIVE)
->updateStateUsing(function (Department $record, bool $state) { ->updateStateUsing(function (Department $record, bool $state) {
$record->is_active = $state ? IsActive::ACTIVE : IsActive::INACTIVE; $record->is_active = $state ? IsActive::ACTIVE : IsActive::INACTIVE;
$record->save(); $record->save();
}) }),
->sortable(),
...TimestampColumns::make(), ...TimestampColumns::make(),
]) ])
->filters([ ->filters([
TrashedFilter::make()->native(false), TrashedFilter::make()
->native(false),
]) ])
->recordActions([ ->recordActions([
EditAction::make()->modalWidth('lg'), EditAction::make()
->modalWidth(Width::Large),
DeleteAction::make(), DeleteAction::make(),
ForceDeleteAction::make(), ForceDeleteAction::make(),
RestoreAction::make(), RestoreAction::make(),
]) ])
->toolbarActions([ ->toolbarActions([

View File

@ -16,6 +16,7 @@
use Filament\Forms\Components\TextInput; use Filament\Forms\Components\TextInput;
use Filament\Resources\Resource; use Filament\Resources\Resource;
use Filament\Schemas\Schema; use Filament\Schemas\Schema;
use Filament\Support\Enums\Width;
use Filament\Support\Icons\Heroicon; use Filament\Support\Icons\Heroicon;
use Filament\Tables\Columns\TextColumn; use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Columns\ToggleColumn; use Filament\Tables\Columns\ToggleColumn;
@ -29,17 +30,17 @@ class LocationResource extends Resource
{ {
protected static ?string $model = Location::class; protected static ?string $model = Location::class;
protected static string|UnitEnum|null $navigationGroup = 'Master';
protected static string|BackedEnum|null $navigationIcon = Heroicon::MapPin; protected static string|BackedEnum|null $navigationIcon = Heroicon::MapPin;
protected static ?string $navigationLabel = 'Lokasi'; protected static ?string $navigationLabel = 'Lokasi';
protected static string|UnitEnum|null $navigationGroup = 'Master'; protected static ?int $navigationSort = 3;
protected static ?string $slug = 'master/locations';
protected static ?string $recordTitleAttribute = 'name'; protected static ?string $recordTitleAttribute = 'name';
protected static ?int $navigationSort = 3; protected static ?string $slug = 'master/locations';
public static function form(Schema $schema): Schema public static function form(Schema $schema): Schema
{ {
@ -68,22 +69,27 @@ public static function table(Table $table): Table
ToggleColumn::make('is_active') ToggleColumn::make('is_active')
->label('Aktif?') ->label('Aktif?')
->sortable()
->getStateUsing(fn(Location $record) => $record->is_active === IsActive::ACTIVE) ->getStateUsing(fn(Location $record) => $record->is_active === IsActive::ACTIVE)
->updateStateUsing(function (Location $record, bool $state) { ->updateStateUsing(function (Location $record, bool $state) {
$record->is_active = $state ? IsActive::ACTIVE : IsActive::INACTIVE; $record->is_active = $state ? IsActive::ACTIVE : IsActive::INACTIVE;
$record->save(); $record->save();
}) }),
->sortable(),
...TimestampColumns::make(), ...TimestampColumns::make(),
]) ])
->filters([ ->filters([
TrashedFilter::make()->native(false), TrashedFilter::make()
->native(false),
]) ])
->recordActions([ ->recordActions([
EditAction::make()->modalWidth('lg'), EditAction::make()
->modalWidth(Width::Large),
DeleteAction::make(), DeleteAction::make(),
ForceDeleteAction::make(), ForceDeleteAction::make(),
RestoreAction::make(), RestoreAction::make(),
]) ])
->toolbarActions([ ->toolbarActions([

View File

@ -18,6 +18,7 @@
use Filament\Forms\Components\TextInput; use Filament\Forms\Components\TextInput;
use Filament\Resources\Resource; use Filament\Resources\Resource;
use Filament\Schemas\Schema; use Filament\Schemas\Schema;
use Filament\Support\Enums\Width;
use Filament\Support\Icons\Heroicon; use Filament\Support\Icons\Heroicon;
use Filament\Tables\Columns\TextColumn; use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Columns\ToggleColumn; use Filament\Tables\Columns\ToggleColumn;
@ -31,17 +32,17 @@ class SubClassificationResource extends Resource
{ {
protected static ?string $model = SubClassification::class; protected static ?string $model = SubClassification::class;
protected static string|UnitEnum|null $navigationGroup = 'Master';
protected static string|BackedEnum|null $navigationIcon = Heroicon::QueueList; protected static string|BackedEnum|null $navigationIcon = Heroicon::QueueList;
protected static ?string $navigationLabel = 'Sub Klasifikasi'; protected static ?string $navigationLabel = 'Sub Klasifikasi';
protected static string|UnitEnum|null $navigationGroup = 'Master'; protected static ?int $navigationSort = 2;
protected static ?string $slug = 'master/sub-classifications';
protected static ?string $recordTitleAttribute = 'name'; protected static ?string $recordTitleAttribute = 'name';
protected static ?int $navigationSort = 2; protected static ?string $slug = 'master/sub-classifications';
public static function form(Schema $schema): Schema public static function form(Schema $schema): Schema
{ {
@ -83,22 +84,27 @@ public static function table(Table $table): Table
ToggleColumn::make('is_active') ToggleColumn::make('is_active')
->label('Aktif?') ->label('Aktif?')
->sortable()
->getStateUsing(fn(SubClassification $record) => $record->is_active === IsActive::ACTIVE) ->getStateUsing(fn(SubClassification $record) => $record->is_active === IsActive::ACTIVE)
->updateStateUsing(function (SubClassification $record, bool $state) { ->updateStateUsing(function (SubClassification $record, bool $state) {
$record->is_active = $state ? IsActive::ACTIVE : IsActive::INACTIVE; $record->is_active = $state ? IsActive::ACTIVE : IsActive::INACTIVE;
$record->save(); $record->save();
}) }),
->sortable(),
...TimestampColumns::make(), ...TimestampColumns::make(),
]) ])
->filters([ ->filters([
TrashedFilter::make()->native(false), TrashedFilter::make()
->native(false),
]) ])
->recordActions([ ->recordActions([
EditAction::make()->modalWidth('lg'), EditAction::make()
->modalWidth(Width::Large),
DeleteAction::make(), DeleteAction::make(),
ForceDeleteAction::make(), ForceDeleteAction::make(),
RestoreAction::make(), RestoreAction::make(),
]) ])
->toolbarActions([ ->toolbarActions([

View File

@ -18,6 +18,7 @@
use Filament\Forms\Components\TextInput; use Filament\Forms\Components\TextInput;
use Filament\Resources\Resource; use Filament\Resources\Resource;
use Filament\Schemas\Schema; use Filament\Schemas\Schema;
use Filament\Support\Enums\Width;
use Filament\Support\Icons\Heroicon; use Filament\Support\Icons\Heroicon;
use Filament\Tables\Columns\TextColumn; use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Columns\ToggleColumn; use Filament\Tables\Columns\ToggleColumn;
@ -31,17 +32,17 @@ class SubLocationResource extends Resource
{ {
protected static ?string $model = SubLocation::class; protected static ?string $model = SubLocation::class;
protected static string|UnitEnum|null $navigationGroup = 'Master';
protected static string|BackedEnum|null $navigationIcon = Heroicon::NumberedList; protected static string|BackedEnum|null $navigationIcon = Heroicon::NumberedList;
protected static ?string $navigationLabel = 'Sub Lokasi'; protected static ?string $navigationLabel = 'Sub Lokasi';
protected static string|UnitEnum|null $navigationGroup = 'Master'; protected static ?int $navigationSort = 4;
protected static ?string $slug = 'master/sub-locations';
protected static ?string $recordTitleAttribute = 'name'; protected static ?string $recordTitleAttribute = 'name';
protected static ?int $navigationSort = 4; protected static ?string $slug = 'master/sub-locations';
public static function form(Schema $schema): Schema public static function form(Schema $schema): Schema
{ {
@ -83,22 +84,27 @@ public static function table(Table $table): Table
ToggleColumn::make('is_active') ToggleColumn::make('is_active')
->label('Aktif?') ->label('Aktif?')
->sortable()
->getStateUsing(fn(SubLocation $record) => $record->is_active === IsActive::ACTIVE) ->getStateUsing(fn(SubLocation $record) => $record->is_active === IsActive::ACTIVE)
->updateStateUsing(function (SubLocation $record, bool $state) { ->updateStateUsing(function (SubLocation $record, bool $state) {
$record->is_active = $state ? IsActive::ACTIVE : IsActive::INACTIVE; $record->is_active = $state ? IsActive::ACTIVE : IsActive::INACTIVE;
$record->save(); $record->save();
}) }),
->sortable(),
...TimestampColumns::make(), ...TimestampColumns::make(),
]) ])
->filters([ ->filters([
TrashedFilter::make()->native(false), TrashedFilter::make()
->native(false),
]) ])
->recordActions([ ->recordActions([
EditAction::make()->modalWidth('lg'), EditAction::make()
->modalWidth(Width::Large),
DeleteAction::make(), DeleteAction::make(),
ForceDeleteAction::make(), ForceDeleteAction::make(),
RestoreAction::make(), RestoreAction::make(),
]) ])
->toolbarActions([ ->toolbarActions([

View File

@ -16,6 +16,7 @@
use Filament\Forms\Components\TextInput; use Filament\Forms\Components\TextInput;
use Filament\Resources\Resource; use Filament\Resources\Resource;
use Filament\Schemas\Schema; use Filament\Schemas\Schema;
use Filament\Support\Enums\Width;
use Filament\Support\Icons\Heroicon; use Filament\Support\Icons\Heroicon;
use Filament\Tables\Columns\TextColumn; use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Columns\ToggleColumn; use Filament\Tables\Columns\ToggleColumn;
@ -29,17 +30,17 @@ class ThemeResource extends Resource
{ {
protected static ?string $model = Theme::class; protected static ?string $model = Theme::class;
protected static string|UnitEnum|null $navigationGroup = 'Master';
protected static string|BackedEnum|null $navigationIcon = Heroicon::PuzzlePiece; protected static string|BackedEnum|null $navigationIcon = Heroicon::PuzzlePiece;
protected static ?string $navigationLabel = 'Tema'; protected static ?string $navigationLabel = 'Tema';
protected static string|UnitEnum|null $navigationGroup = 'Master'; protected static ?int $navigationSort = 6;
protected static ?string $slug = 'master/themes';
protected static ?string $recordTitleAttribute = 'name'; protected static ?string $recordTitleAttribute = 'name';
protected static ?int $navigationSort = 6; protected static ?string $slug = 'master/themes';
public static function form(Schema $schema): Schema public static function form(Schema $schema): Schema
{ {
@ -68,22 +69,27 @@ public static function table(Table $table): Table
ToggleColumn::make('is_active') ToggleColumn::make('is_active')
->label('Aktif?') ->label('Aktif?')
->sortable()
->getStateUsing(fn(Theme $record) => $record->is_active === IsActive::ACTIVE) ->getStateUsing(fn(Theme $record) => $record->is_active === IsActive::ACTIVE)
->updateStateUsing(function (Theme $record, bool $state) { ->updateStateUsing(function (Theme $record, bool $state) {
$record->is_active = $state ? IsActive::ACTIVE : IsActive::INACTIVE; $record->is_active = $state ? IsActive::ACTIVE : IsActive::INACTIVE;
$record->save(); $record->save();
}) }),
->sortable(),
...TimestampColumns::make(), ...TimestampColumns::make(),
]) ])
->filters([ ->filters([
TrashedFilter::make()->native(false), TrashedFilter::make()
->native(false),
]) ])
->recordActions([ ->recordActions([
EditAction::make()->modalWidth('lg'), EditAction::make()
->modalWidth(Width::Large),
DeleteAction::make(), DeleteAction::make(),
ForceDeleteAction::make(), ForceDeleteAction::make(),
RestoreAction::make(), RestoreAction::make(),
]) ])
->toolbarActions([ ->toolbarActions([

View File

@ -34,17 +34,17 @@ class UserResource extends Resource
{ {
protected static ?string $model = User::class; protected static ?string $model = User::class;
protected static string|UnitEnum|null $navigationGroup = 'Master';
protected static string|BackedEnum|null $navigationIcon = Heroicon::UserGroup; protected static string|BackedEnum|null $navigationIcon = Heroicon::UserGroup;
protected static ?string $navigationLabel = 'Pengguna'; protected static ?string $navigationLabel = 'Pengguna';
protected static string|UnitEnum|null $navigationGroup = 'Master'; protected static ?int $navigationSort = 7;
protected static ?string $slug = 'master/users';
protected static ?string $recordTitleAttribute = 'name'; protected static ?string $recordTitleAttribute = 'name';
protected static ?int $navigationSort = 7; protected static ?string $slug = 'master/users';
public static function form(Schema $schema): Schema public static function form(Schema $schema): Schema
{ {
@ -64,8 +64,8 @@ public static function form(Schema $schema): Schema
->autocomplete(false) ->autocomplete(false)
->required() ->required()
->maxLength(254) ->maxLength(254)
->unique(ignoreRecord: true) ->email()
->email(), ->unique(ignoreRecord: true),
TextInput::make('username') TextInput::make('username')
->label('Nama Pengguna') ->label('Nama Pengguna')
@ -79,11 +79,11 @@ public static function form(Schema $schema): Schema
Select::make('roles') Select::make('roles')
->label('Peran') ->label('Peran')
->required()
->relationship('roles', 'name', fn($query) => $query->whereNotIn('name', [RoleEnum::DEVELOPER, RoleEnum::PERUSAHAAN])) ->relationship('roles', 'name', fn($query) => $query->whereNotIn('name', [RoleEnum::DEVELOPER, RoleEnum::PERUSAHAAN]))
->multiple() ->multiple()
->preload() ->preload()
->searchable() ->searchable(),
->required(),
Hidden::make('password') Hidden::make('password')
->default(fn($record) => $record ? null : config('auth.password_default')), ->default(fn($record) => $record ? null : config('auth.password_default')),
@ -98,18 +98,22 @@ public static function table(Table $table): Table
->columns([ ->columns([
TextColumn::make('name') TextColumn::make('name')
->label('Nama') ->label('Nama')
->searchable(), ->searchable()
->sortable(),
TextColumn::make('email') TextColumn::make('email')
->label('Alamat Surel') ->label('Alamat Surel')
->searchable(), ->searchable()
->sortable(),
TextColumn::make('username') TextColumn::make('username')
->label('Nama Pengguna') ->label('Nama Pengguna')
->searchable(), ->searchable()
->sortable(),
ToggleColumn::make('is_active') ToggleColumn::make('is_active')
->label('Status') ->label('Status')
->sortable()
->getStateUsing(fn(User $record) => $record->is_active === IsActive::ACTIVE) ->getStateUsing(fn(User $record) => $record->is_active === IsActive::ACTIVE)
->updateStateUsing(function (User $record, bool $state) { ->updateStateUsing(function (User $record, bool $state) {
$record->is_active = $state ? IsActive::ACTIVE : IsActive::INACTIVE; $record->is_active = $state ? IsActive::ACTIVE : IsActive::INACTIVE;
@ -124,20 +128,25 @@ public static function table(Table $table): Table
TextColumn::make('roles.name') TextColumn::make('roles.name')
->label('Peran') ->label('Peran')
->getStateUsing(fn (User $record) => $record->roles->pluck('name', 'id')->toArray()) ->searchable()
->sortable()
->badge() ->badge()
->sortable(), ->getStateUsing(fn(User $record) => $record->roles->pluck('name', 'id')->toArray()),
...TimestampColumns::make(), ...TimestampColumns::make(),
]) ])
->filters([ ->filters([
TrashedFilter::make()->native(false), TrashedFilter::make()
->native(false),
]) ])
->recordActions([ ->recordActions([
EditAction::make() EditAction::make()
->modalWidth(Width::Large), ->modalWidth(Width::Large),
DeleteAction::make(), DeleteAction::make(),
ForceDeleteAction::make(), ForceDeleteAction::make(),
RestoreAction::make(), RestoreAction::make(),
]) ])
->toolbarActions([ ->toolbarActions([

View File

@ -21,17 +21,17 @@ class ContentRecapResource extends Resource
{ {
protected static ?string $model = ContentRecap::class; protected static ?string $model = ContentRecap::class;
protected static string|UnitEnum|null $navigationGroup = 'Monitoring';
protected static string|BackedEnum|null $navigationIcon = Heroicon::ClipboardDocumentList; protected static string|BackedEnum|null $navigationIcon = Heroicon::ClipboardDocumentList;
protected static ?string $navigationLabel = 'Rekap Konten'; protected static ?string $navigationLabel = 'Rekap Konten';
protected static string|UnitEnum|null $navigationGroup = 'Monitoring'; protected static ?int $navigationSort = 13;
protected static ?string $slug = 'monitoring/content-recaps';
protected static ?string $recordTitleAttribute = 'title'; protected static ?string $recordTitleAttribute = 'title';
protected static ?int $navigationSort = 13; protected static ?string $slug = 'monitoring/content-recaps';
public static function form(Schema $schema): Schema public static function form(Schema $schema): Schema
{ {

View File

@ -64,8 +64,11 @@ public static function configure(Table $table): Table
]) ])
->recordActions([ ->recordActions([
EditAction::make(), EditAction::make(),
DeleteAction::make(), DeleteAction::make(),
ForceDeleteAction::make(), ForceDeleteAction::make(),
RestoreAction::make(), RestoreAction::make(),
]) ])
->toolbarActions([ ->toolbarActions([

View File

@ -21,17 +21,17 @@ class IssueManagementResource extends Resource
{ {
protected static ?string $model = IssueManagement::class; protected static ?string $model = IssueManagement::class;
protected static string|UnitEnum|null $navigationGroup = 'Monitoring';
protected static string|BackedEnum|null $navigationIcon = Heroicon::ExclamationCircle; protected static string|BackedEnum|null $navigationIcon = Heroicon::ExclamationCircle;
protected static ?string $navigationLabel = 'Manajemen Isu'; protected static ?string $navigationLabel = 'Manajemen Isu';
protected static string|UnitEnum|null $navigationGroup = 'Monitoring'; protected static ?int $navigationSort = 13;
protected static ?string $slug = 'monitoring/issue-managements';
protected static ?string $recordTitleAttribute = 'mediaMonitoring.title'; protected static ?string $recordTitleAttribute = 'mediaMonitoring.title';
protected static ?int $navigationSort = 13; protected static ?string $slug = 'monitoring/issue-managements';
public static function form(Schema $schema): Schema public static function form(Schema $schema): Schema
{ {

View File

@ -52,11 +52,14 @@ public static function configure(Table $table): Table
...TimestampColumns::make(), ...TimestampColumns::make(),
]) ])
->filters([ ->filters([
TrashedFilter::make()->native(false), TrashedFilter::make()
->native(false),
SelectFilter::make('issue') SelectFilter::make('issue')
->label('Filter Isu') ->label('Filter Isu')
->options(\App\Enums\IssueSentiment::class) ->options(\App\Enums\IssueSentiment::class)
->native(false), ->native(false),
SelectFilter::make('response') SelectFilter::make('response')
->label('Filter Respon') ->label('Filter Respon')
->options(\App\Enums\IssueSentiment::class) ->options(\App\Enums\IssueSentiment::class)
@ -64,8 +67,11 @@ public static function configure(Table $table): Table
]) ])
->recordActions([ ->recordActions([
EditAction::make(), EditAction::make(),
DeleteAction::make(), DeleteAction::make(),
RestoreAction::make(), RestoreAction::make(),
ForceDeleteAction::make(), ForceDeleteAction::make(),
]) ])
->toolbarActions([ ->toolbarActions([

View File

@ -21,17 +21,17 @@ class MediaMonitoringResource extends Resource
{ {
protected static ?string $model = MediaMonitoring::class; protected static ?string $model = MediaMonitoring::class;
protected static string|UnitEnum|null $navigationGroup = 'Monitoring';
protected static string|BackedEnum|null $navigationIcon = Heroicon::ClipboardDocumentCheck; protected static string|BackedEnum|null $navigationIcon = Heroicon::ClipboardDocumentCheck;
protected static ?string $navigationLabel = 'Monitoring Media'; protected static ?string $navigationLabel = 'Monitoring Media';
protected static string|UnitEnum|null $navigationGroup = 'Monitoring'; protected static ?int $navigationSort = 12;
protected static ?string $slug = 'monitoring/media-monitorings';
protected static ?string $recordTitleAttribute = 'media_name'; protected static ?string $recordTitleAttribute = 'media_name';
protected static ?int $navigationSort = 12; protected static ?string $slug = 'monitoring/media-monitorings';
public static function form(Schema $schema): Schema public static function form(Schema $schema): Schema
{ {

View File

@ -88,8 +88,11 @@ public static function configure(Table $table): Table
]) ])
->recordActions([ ->recordActions([
EditAction::make(), EditAction::make(),
DeleteAction::make(), DeleteAction::make(),
ForceDeleteAction::make(), ForceDeleteAction::make(),
RestoreAction::make(), RestoreAction::make(),
]) ])
->toolbarActions([ ->toolbarActions([