🆙 Final fix delete storage link to fix news_images and logs 🆙

This commit is contained in:
Remco
2026-01-07 20:29:24 +01:00
parent 65ea6c167f
commit acf2d7e661
447 changed files with 208 additions and 66965 deletions
@@ -1,176 +0,0 @@
<?php
namespace App\Filament\Resources\Hotel\Achievements;
use App\Enums\AchievementCategory;
use App\Enums\CurrencyTypes;
use App\Filament\Resources\Hotel\Achievements\Pages\CreateAchievement;
use App\Filament\Resources\Hotel\Achievements\Pages\EditAchievement;
use App\Filament\Resources\Hotel\Achievements\Pages\ListAchievements;
use App\Filament\Resources\Hotel\Achievements\Pages\ViewAchievement;
use App\Filament\Tables\Columns\HabboBadgeColumn;
use App\Filament\Traits\TranslatableResource;
use App\Models\Achievement;
use Filament\Actions\EditAction;
use Filament\Actions\ViewAction;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Resources\Resource;
use Filament\Schemas\Components\Tabs;
use Filament\Schemas\Components\Tabs\Tab;
use Filament\Schemas\Schema;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Columns\ToggleColumn;
use Filament\Tables\Filters\SelectFilter;
use Filament\Tables\Table;
class AchievementResource extends Resource
{
use TranslatableResource;
protected static ?string $model = Achievement::class;
protected static string|\BackedEnum|null $navigationIcon = 'heroicon-o-academic-cap';
protected static string|\UnitEnum|null $navigationGroup = 'Hotel';
public static string $translateIdentifier = 'achievements';
protected static ?string $slug = 'hotel/achievements';
#[\Override]
public static function form(Schema $schema): Schema
{
return $schema
->components([
Tabs::make('Main')
->tabs([
Tab::make(__('filament::resources.tabs.Home'))
->icon('heroicon-o-home')
->schema([
TextInput::make('name')
->label(__('filament::resources.inputs.name'))
->required()
->maxLength(64)
->autocomplete()
->columnSpan('full'),
TextInput::make('level')
->label(__('filament::resources.inputs.level'))
->numeric()
->required()
->autocomplete()
->columnSpan('full'),
Select::make('category')
->native(false)
->label(__('filament::resources.inputs.category'))
->options(AchievementCategory::toInput()),
]),
Tab::make(__('filament::resources.tabs.Configurations'))
->icon('heroicon-o-cog')
->schema([
Select::make('visible')
->native(false)
->label(__('filament::resources.inputs.visible'))
->options([
'1' => __('filament::resources.common.Yes'),
'0' => __('filament::resources.common.No'),
]),
Select::make('reward_type')
->native(false)
->label(__('filament::resources.inputs.reward_type'))
->options(CurrencyTypes::toInput()),
TextInput::make('reward_amount')
->label(__('filament::resources.inputs.reward_amount'))
->numeric()
->required(),
TextInput::make('points')
->label(__('filament::resources.inputs.points'))
->helperText(__('filament::resources.helpers.achievement_points'))
->numeric()
->required(),
TextInput::make('progress_needed')
->label(__('filament::resources.inputs.progress_needed'))
->helperText(__('filament::resources.helpers.achievement_progress_needed'))
->numeric()
->required(),
]),
])->columnSpanFull(),
]);
}
#[\Override]
public static function table(Table $table): Table
{
return $table
->defaultSort('id', 'desc')
->columns([
TextColumn::make('id')
->label(__('filament::resources.columns.id')),
HabboBadgeColumn::make('badge')
->label(__('filament::resources.columns.badge')),
TextColumn::make('name')
->label(__('filament::resources.columns.name'))
->searchable(),
TextColumn::make('level')
->label(__('filament::resources.columns.level')),
TextColumn::make('category')
->badge()
->searchable()
->label(__('filament::resources.columns.category'))
->toggleable(),
ToggleColumn::make('visible')
->label(__('filament::resources.columns.visible'))
->disabled()
->toggleable(),
])
->filters([
SelectFilter::make('visible')
->options([
'1' => __('filament::resources.common.Yes'),
'0' => __('filament::resources.common.No'),
])
->label(__('filament::resources.columns.visible'))
->placeholder(__('filament::resources.common.All')),
SelectFilter::make('category')
->options(AchievementCategory::toInput())
->label(__('filament::resources.columns.category'))
->placeholder(__('filament::resources.common.All')),
])
->recordActions([
ViewAction::make(),
EditAction::make(),
])
->toolbarActions([]);
}
#[\Override]
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => ListAchievements::route('/'),
'create' => CreateAchievement::route('/create'),
'view' => ViewAchievement::route('/{record}'),
'edit' => EditAchievement::route('/{record}/edit'),
];
}
}
@@ -1,11 +0,0 @@
<?php
namespace App\Filament\Resources\Hotel\Achievements\Pages;
use App\Filament\Resources\Hotel\Achievements\AchievementResource;
use Filament\Resources\Pages\CreateRecord;
class CreateAchievement extends CreateRecord
{
protected static string $resource = AchievementResource::class;
}
@@ -1,19 +0,0 @@
<?php
namespace App\Filament\Resources\Hotel\Achievements\Pages;
use App\Filament\Resources\Hotel\Achievements\AchievementResource;
use Filament\Pages\Actions;
use Filament\Resources\Pages\EditRecord;
class EditAchievement extends EditRecord
{
protected static string $resource = AchievementResource::class;
protected function getActions(): array
{
return [
// Actions\DeleteAction::make(),
];
}
}
@@ -1,19 +0,0 @@
<?php
namespace App\Filament\Resources\Hotel\Achievements\Pages;
use App\Filament\Resources\Hotel\Achievements\AchievementResource;
use Filament\Pages\Actions;
use Filament\Resources\Pages\ListRecords;
class ListAchievements extends ListRecords
{
protected static string $resource = AchievementResource::class;
protected function getActions(): array
{
return [
// Actions\CreateAction::make(),
];
}
}
@@ -1,11 +0,0 @@
<?php
namespace App\Filament\Resources\Hotel\Achievements\Pages;
use App\Filament\Resources\Hotel\Achievements\AchievementResource;
use Filament\Resources\Pages\ViewRecord;
class ViewAchievement extends ViewRecord
{
protected static string $resource = AchievementResource::class;
}
@@ -1,101 +0,0 @@
<?php
namespace App\Filament\Resources\Hotel\BadgeTextEditors;
use App\Filament\Resources\Hotel\BadgeTextEditors\Pages\CreateBadgeTextEditor;
use App\Filament\Resources\Hotel\BadgeTextEditors\Pages\EditBadgeTextEditor;
use App\Filament\Resources\Hotel\BadgeTextEditors\Pages\ListBadgeTextEditors;
use App\Models\WebsiteBadge;
use App\Services\SettingsService;
use Filament\Actions\DeleteAction;
use Filament\Actions\EditAction;
use Filament\Forms\Components\Textarea;
use Filament\Forms\Components\TextInput;
use Filament\Resources\Resource;
use Filament\Schemas\Schema;
use Filament\Tables\Columns\ImageColumn;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
use Illuminate\Support\Str;
class BadgeTextEditorResource extends Resource
{
protected static ?string $model = WebsiteBadge::class;
protected static string|\UnitEnum|null $navigationGroup = 'Hotel';
protected static string|\BackedEnum|null $navigationIcon = 'heroicon-o-pencil-square';
protected static ?string $navigationLabel = 'Badge Editor';
protected static ?string $modelLabel = 'Badge Text';
protected static ?string $slug = 'hotel/badge-text-editor';
#[\Override]
public static function form(Schema $schema): Schema
{
return $schema
->components([
TextInput::make('badge_key')
->required()
->label('Badge Key - Expl. ATOM101')
->placeholder('This is the badge code'),
TextInput::make('badge_name')
->required()
->label('Badge Name')
->placeholder('This is the name of the badge: Expl. The ATOM Badge'),
Textarea::make('badge_description')
->required()
->label('Badge Description')
->placeholder('Please add a description for the badge.'),
]);
}
#[\Override]
public static function table(Table $table): Table
{
$settingsService = app(SettingsService::class);
$badgesPath = $settingsService->getOrDefault('badges_path', '/gamedata/c_images/album1584/');
return $table
->columns([
ImageColumn::make('badge_key')
->label('Badge Image')
->getStateUsing(function ($record) use ($badgesPath) {
$badgeName = str_replace('badge_desc_', '', $record->badge_key);
return asset($badgesPath . $badgeName . '.gif');
})
->width(50)
->height(50),
TextColumn::make('badge_name')
->label('Badge Code & Name')
->formatStateUsing(fn ($record) => $record->badge_key . ' : ' . $record->badge_name)
->searchable(query: function ($query, $search): void {
$query->where('badge_key', 'like', "%{$search}%")
->orWhere('badge_name', 'like', "%{$search}%");
})
->sortable(),
TextColumn::make('badge_description')
->label('Badge Description')
->getStateUsing(fn ($record) => Str::limit($record->badge_description, 65))
->searchable(),
])
->filters([])
->defaultSort('badge_key', 'asc')
->recordActions([
EditAction::make(),
DeleteAction::make(),
]);
}
public static function getPages(): array
{
return [
'index' => ListBadgeTextEditors::route('/'),
'create' => CreateBadgeTextEditor::route('/create'),
'edit' => EditBadgeTextEditor::route('/{record}/edit'),
];
}
}
@@ -1,11 +0,0 @@
<?php
namespace App\Filament\Resources\Hotel\BadgeTextEditors\Pages;
use App\Filament\Resources\Hotel\BadgeTextEditors\BadgeTextEditorResource;
use Filament\Resources\Pages\CreateRecord;
class CreateBadgeTextEditor extends CreateRecord
{
protected static string $resource = BadgeTextEditorResource::class;
}
@@ -1,51 +0,0 @@
<?php
namespace App\Filament\Resources\Hotel\BadgeTextEditors\Pages;
use App\Filament\Resources\Hotel\BadgeTextEditors\BadgeTextEditorResource;
use Filament\Actions\DeleteAction;
use Filament\Notifications\Notification;
use Filament\Resources\Pages\EditRecord;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Log;
use PDOException;
class EditBadgeTextEditor extends EditRecord
{
protected static string $resource = BadgeTextEditorResource::class;
protected function getActions(): array
{
return [DeleteAction::make()];
}
#[\Override]
protected function mutateFormDataBeforeSave(array $data): array
{
return $data;
}
protected function afterSave(): void {}
#[\Override]
protected function handleRecordUpdate(Model $record, array $data): Model
{
try {
return parent::handleRecordUpdate($record, $data);
} catch (PDOException $e) {
if ($e->getCode() === '23000') {
Log::error('Duplicate badge key error: ' . $e->getMessage());
Notification::make()
->title('Duplicate Badge Key')
->body('The badge key already exists. Please use a unique badge key.')
->danger()
->persistent()
->send();
return $record;
}
throw $e;
}
}
}
@@ -1,153 +0,0 @@
<?php
namespace App\Filament\Resources\Hotel\BadgeTextEditors\Pages;
use App\Filament\Resources\Hotel\BadgeTextEditors\BadgeTextEditorResource;
use App\Models\WebsiteBadge;
use App\Services\SettingsService;
use Exception;
use Filament\Actions\Action;
use Filament\Actions\CreateAction;
use Filament\Notifications\Notification;
use Filament\Resources\Pages\ListRecords;
use Illuminate\Support\Facades\Log;
class ListBadgeTextEditors extends ListRecords
{
protected static string $resource = BadgeTextEditorResource::class;
protected function getActions(): array
{
return [
CreateAction::make()
->label('Add Badge')
->color('info')
->modalHeading('Add a New Badge')
->modalButton('Create Badge')
->after(function (): void {
Notification::make()
->title('Badge Created')
->body('The badge was successfully created.')
->success()
->send();
}),
Action::make('export')
->label('Export to ExternalTexts')
->action('exportToJson'),
Action::make('backup')
->label('Create Backup of ExternalTexts')
->color('success')
->action('createBackup'),
];
}
public function exportToJson(SettingsService $settingsService)
{
$jsonPath = $settingsService->getOrDefault('nitro_external_texts_file');
if ($jsonPath === '' || $jsonPath === '0') {
Notification::make()
->title('Export Failed')
->body('The JSON file path is not configured in the website settings.')
->danger()
->send();
return;
}
if (! file_exists($jsonPath)) {
Notification::make()
->title('Export Failed')
->body('The JSON file does not exist at the specified path.')
->danger()
->send();
return;
}
$jsonData = json_decode(file_get_contents($jsonPath), true);
$badges = WebsiteBadge::all();
$badgeKeys = $badges->pluck('badge_key')->toArray();
foreach ($jsonData as $key => $value) {
if (
(str_starts_with((string) $key, 'badge_desc_') || str_starts_with((string) $key, 'badge_name_')) &&
! in_array(str_replace(['badge_desc_', 'badge_name_'], '', $key), $badgeKeys)
) {
unset($jsonData[$key]);
}
}
foreach ($badges as $badge) {
$jsonData['badge_desc_' . $badge->badge_key] = $badge->badge_description;
$jsonData['badge_name_' . $badge->badge_key] = $badge->badge_name;
}
try {
$result = file_put_contents(
$jsonPath,
json_encode($jsonData, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES),
);
if ($result === false) {
throw new Exception('Failed to write to the JSON file.');
}
Notification::make()
->title('Export Successful')
->body('Badge data exported successfully.')
->success()
->send();
} catch (Exception $e) {
Log::error('Failed to export badge data: ' . $e->getMessage());
Notification::make()
->title('Export Failed')
->body('Failed to export badge data. Please check file permissions or contact your administrator.')
->danger()
->send();
}
}
public function createBackup(SettingsService $settingsService)
{
$jsonPath = $settingsService->getOrDefault('nitro_external_texts_file');
if ($jsonPath === '' || $jsonPath === '0') {
Notification::make()
->title('Backup Failed')
->body('The JSON file path is not configured in the website settings.')
->danger()
->send();
return;
}
if (! file_exists($jsonPath)) {
Notification::make()
->title('Backup Failed')
->body('The JSON file does not exist at the specified path.')
->danger()
->send();
return;
}
$backupPath = dirname($jsonPath) . '/ExternalTexts_' . time() . '.json';
if (copy($jsonPath, $backupPath)) {
Notification::make()
->title('Backup Successful')
->body('A backup of the JSON file has been created: ' . basename($backupPath))
->success()
->send();
} else {
Notification::make()
->title('Backup Failed')
->body('Failed to create a backup of the JSON file.')
->danger()
->send();
}
}
}
@@ -1,69 +0,0 @@
<?php
namespace App\Filament\Resources\Hotel\BadgeUploads;
use App\Filament\Resources\Hotel\BadgeUploads\Pages\ManageBadgeUploads;
use Filament\Forms\Components\FileUpload;
use Filament\Resources\Resource;
use Filament\Schemas\Schema;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
use Illuminate\Support\Facades\Storage;
use Livewire\Features\SupportFileUploads\TemporaryUploadedFile;
class BadgeUploadResource extends Resource
{
protected static string|\UnitEnum|null $navigationGroup = 'Hotel';
protected static string|\BackedEnum|null $navigationIcon = 'heroicon-o-gif';
protected static ?string $label = 'Badge Upload';
#[\Override]
public static function form(Schema $schema): Schema
{
return $schema
->components([
FileUpload::make('badge_file')
->label('Upload Badge')
->disk('local')
->directory(setting('badge_path_filesystem'))
->required()
->getUploadedFileNameForStorageUsing(
fn (TemporaryUploadedFile $file): string => strtolower(str_replace([' ', '-', 'æ', 'ø', 'å'], ['_', '_', 'ae', 'oe', 'aa'], $file->getClientOriginalName())),
),
]);
}
#[\Override]
public static function table(Table $table): Table
{
return $table
->columns([
TextColumn::make('filename')
->label('File Name')
->sortable(),
TextColumn::make('path')
->label('File Path'),
])
->filters([]);
}
public static function getPages(): array
{
return [
'index' => ManageBadgeUploads::route('/'),
];
}
public static function getFiles(): array
{
$badgePath = env('BadgePath', 'badges');
$files = Storage::disk('local')->files($badgePath);
return collect($files)->map(fn ($file) => [
'filename' => basename($file),
'path' => $file,
])->toArray();
}
}
@@ -1,48 +0,0 @@
<?php
namespace App\Filament\Resources\Hotel\BadgeUploads\Pages;
use Filament\Forms\Components\FileUpload;
use Filament\Forms\Concerns\InteractsWithForms;
use Filament\Forms\Contracts\HasForms;
use Filament\Notifications\Notification;
use Filament\Resources\Pages\Page; // Import the Notification class
class ManageBadgeUploads extends Page implements HasForms
{
use InteractsWithForms;
public $badge_file;
protected static string $resource = \App\Filament\Resources\Hotel\BadgeUploads\BadgeUploadResource::class;
protected string $view = 'filament.pages.manage-badge-uploads';
public function mount(): void
{
$this->form->fill([]);
}
protected function getFormSchema(): array
{
return [
FileUpload::make('badge_file')
->label('Upload Badge')
->disk('badges')
->preserveFilenames()
->acceptedFileTypes(['image/gif'])
->rules(['mimes:gif'])
->required(),
];
}
public function save(): void
{
$this->form->getState();
Notification::make()
->title('Badge uploaded successfully!')
->success()
->send();
}
}
@@ -1,180 +0,0 @@
<?php
namespace App\Filament\Resources\Hotel\CatalogPages;
use App\Filament\Resources\Hotel\CatalogPages\Pages\CreateCatalogPage;
use App\Filament\Resources\Hotel\CatalogPages\Pages\EditCatalogPage;
use App\Filament\Resources\Hotel\CatalogPages\Pages\ListCatalogPages;
use App\Filament\Resources\Hotel\CatalogPages\RelationManagers\CatalogItemsRelationManager;
use App\Models\Game\Furniture\CatalogPage;
use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteAction;
use Filament\Actions\DeleteBulkAction;
use Filament\Actions\EditAction;
use Filament\Forms\Components\TextInput;
use Filament\Resources\Resource;
use Filament\Schemas\Schema;
use Filament\Tables\Columns\ImageColumn;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
class CatalogPageResource extends Resource
{
protected static ?string $model = CatalogPage::class;
protected static string|\BackedEnum|null $navigationIcon = 'heroicon-o-rectangle-stack';
protected static string|\UnitEnum|null $navigationGroup = 'Hotel';
public static string $translateIdentifier = 'catalog-pages';
protected static ?string $slug = 'hotel/catalog-pages';
#[\Override]
public static function form(Schema $schema): Schema
{
return $schema
->components([
TextInput::make('parent_id')
->required()
->integer(),
TextInput::make('caption_save')
->required(),
TextInput::make('caption')
->required(),
TextInput::make('page_layout')
->required(),
TextInput::make('icon_color')
->required()
->integer(),
TextInput::make('icon_image')
->required()
->integer(),
TextInput::make('min_rank')
->required()
->integer(),
TextInput::make('order_num')
->required()
->integer(),
TextInput::make('visible')
->required(),
TextInput::make('enabled')
->required(),
TextInput::make('club_only')
->required(),
TextInput::make('vip_only')
->required(),
TextInput::make('page_headline')
->required(),
TextInput::make('page_teaser')
->required(),
TextInput::make('page_special'),
TextInput::make('page_text1'),
TextInput::make('page_text2'),
TextInput::make('page_text_details'),
TextInput::make('page_text_teaser'),
TextInput::make('room_id')
->integer(),
]);
}
#[\Override]
public static function table(Table $table): Table
{
return $table
->columns([
TextColumn::make('parent_id'),
TextColumn::make('caption_save'),
TextColumn::make('caption')
->searchable()
->sortable(),
TextColumn::make('page_layout'),
TextColumn::make('icon_color'),
ImageColumn::make('icon_image'),
TextColumn::make('min_rank'),
TextColumn::make('order_num'),
TextColumn::make('visible'),
TextColumn::make('enabled'),
TextColumn::make('club_only'),
TextColumn::make('vip_only'),
TextColumn::make('page_headline'),
TextColumn::make('page_teaser'),
TextColumn::make('page_special'),
TextColumn::make('page_text1'),
TextColumn::make('page_text2'),
TextColumn::make('room_id'),
TextColumn::make('includes'),
])
->filters([
//
])
->recordActions([
EditAction::make(),
DeleteAction::make(),
])
->toolbarActions([
BulkActionGroup::make([
DeleteBulkAction::make(),
]),
]);
}
public static function getPages(): array
{
return [
'index' => ListCatalogPages::route('/'),
'create' => CreateCatalogPage::route('/create'),
'edit' => EditCatalogPage::route('/{record}/edit'),
];
}
#[\Override]
public static function getRelations(): array
{
return [
CatalogItemsRelationManager::class,
];
}
public static function getGloballySearchableAttributes(): array
{
return ['caption'];
}
}
@@ -1,18 +0,0 @@
<?php
namespace App\Filament\Resources\Hotel\CatalogPages\Pages;
use App\Filament\Resources\Hotel\CatalogPages\CatalogPageResource;
use Filament\Resources\Pages\CreateRecord;
class CreateCatalogPage extends CreateRecord
{
protected static string $resource = CatalogPageResource::class;
protected function getHeaderActions(): array
{
return [
];
}
}
@@ -1,19 +0,0 @@
<?php
namespace App\Filament\Resources\Hotel\CatalogPages\Pages;
use App\Filament\Resources\Hotel\CatalogPages\CatalogPageResource;
use Filament\Actions\DeleteAction;
use Filament\Resources\Pages\EditRecord;
class EditCatalogPage extends EditRecord
{
protected static string $resource = CatalogPageResource::class;
protected function getHeaderActions(): array
{
return [
DeleteAction::make(),
];
}
}
@@ -1,19 +0,0 @@
<?php
namespace App\Filament\Resources\Hotel\CatalogPages\Pages;
use App\Filament\Resources\Hotel\CatalogPages\CatalogPageResource;
use Filament\Actions\CreateAction;
use Filament\Resources\Pages\ListRecords;
class ListCatalogPages extends ListRecords
{
protected static string $resource = CatalogPageResource::class;
protected function getHeaderActions(): array
{
return [
CreateAction::make(),
];
}
}
@@ -1,467 +0,0 @@
<?php
namespace App\Filament\Resources\Hotel\CatalogPages\RelationManagers;
use App\Models\Game\Furniture\ItemBase;
use Filament\Actions\Action;
use Filament\Actions\BulkActionGroup;
use Filament\Actions\CreateAction;
use Filament\Actions\DeleteAction;
use Filament\Actions\DeleteBulkAction;
use Filament\Actions\EditAction;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\Textarea;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Components\Toggle;
use Filament\Resources\RelationManagers\RelationManager;
use Filament\Schemas\Components\Grid;
use Filament\Schemas\Schema;
use Filament\Tables\Columns\IconColumn;
use Filament\Tables\Columns\ImageColumn;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Filters\SelectFilter;
use Filament\Tables\Filters\TernaryFilter;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
class CatalogItemsRelationManager extends RelationManager
{
protected static string $relationship = 'catalogItems';
public function form(Schema $schema): Schema
{
return $schema
->components([
Select::make('item_ids')
->label('Furniture Item')
->relationship(
name: 'itemBase',
titleAttribute: 'item_name',
modifyQueryUsing: fn (Builder $query) => $query->orderBy('item_name'),
)
->searchable()
->required()
->preload()
->createOptionForm([
TextInput::make('sprite_id')
->label('Sprite ID')
->numeric()
->default(0),
TextInput::make('public_name')
->maxLength(56),
TextInput::make('item_name')
->required()
->maxLength(70),
TextInput::make('type')
->default('s')
->maxLength(3),
Grid::make(3)
->schema([
TextInput::make('width')
->numeric()
->default(1),
TextInput::make('length')
->numeric()
->default(1),
TextInput::make('stack_height')
->numeric()
->default(0.00),
]),
Grid::make(3)
->schema([
Toggle::make('allow_stack')
->default(true),
Toggle::make('allow_sit')
->default(false),
Toggle::make('allow_lay')
->default(false),
]),
Grid::make(3)
->schema([
Toggle::make('allow_walk')
->default(false),
Toggle::make('allow_gift')
->default(true),
Toggle::make('allow_trade')
->default(true),
]),
Grid::make(3)
->schema([
Toggle::make('allow_recycle')
->default(false),
Toggle::make('allow_marketplace_sell')
->default(false),
Toggle::make('allow_inventory_stack')
->default(true),
]),
TextInput::make('interaction_type')
->default('default')
->maxLength(500),
Grid::make(2)
->schema([
TextInput::make('interaction_modes_count')
->numeric()
->default(1),
TextInput::make('vending_ids')
->default('0')
->maxLength(255),
]),
Grid::make(2)
->schema([
TextInput::make('multiheight')
->default('0')
->maxLength(50),
TextInput::make('customparams')
->maxLength(256),
]),
Grid::make(2)
->schema([
TextInput::make('effect_id_male')
->numeric()
->default(0),
TextInput::make('effect_id_female')
->numeric()
->default(0),
]),
TextInput::make('clothing_on_walk')
->maxLength(255),
])
->columnSpanFull(),
TextInput::make('catalog_name')
->label('Catalog Name')
->required()
->maxLength(100)
->nullable()
->dehydrateStateUsing(fn ($state) => $state ?? ''),
Grid::make(2)
->schema([
TextInput::make('cost_credits')
->label('Cost Credits')
->numeric()
->nullable()
->dehydrateStateUsing(fn ($state) => $state ?? '')
->default(3),
TextInput::make('cost_points')
->label('Cost Points')
->numeric()
->nullable()
->dehydrateStateUsing(fn ($state) => $state ?? '')
->default(0),
]),
Grid::make(2)
->schema([
TextInput::make('points_type')
->label('Points Type')
->numeric()
->nullable()
->dehydrateStateUsing(fn ($state) => $state ?? '')
->default(0),
TextInput::make('amount')
->label('Amount')
->numeric()
->nullable()
->dehydrateStateUsing(fn ($state) => $state ?? '')
->default(1),
]),
Grid::make(2)
->schema([
Toggle::make('limited_stack')
->label('Limited Stack')
->dehydrateStateUsing(fn ($state) => $state ? '1' : '0'),
Toggle::make('limited_sells')
->label('Limited Sells')
->dehydrateStateUsing(fn ($state) => $state ? '1' : '0'),
]),
Grid::make(3)
->schema([
TextInput::make('order_number')
->numeric()
->nullable()
->dehydrateStateUsing(fn ($state) => $state ?? '')
->default(1),
TextInput::make('offer_id')
->numeric()
->nullable()
->dehydrateStateUsing(fn ($state) => $state ?? ''),
TextInput::make('song_id')
->numeric()
->nullable()
->dehydrateStateUsing(fn ($state) => $state ?? '')
->default(0),
]),
Textarea::make('extradata')
->label('Extra Data')
->maxLength(500)
->nullable()
->dehydrateStateUsing(fn ($state) => $state ?? ''),
Grid::make(2)
->schema([
Toggle::make('have_offer')
->label('Have Offer')
->default(true)
->dehydrateStateUsing(fn ($state) => $state ? '1' : '0'),
Toggle::make('club_only')
->label('Club Only')
->default(false)
->dehydrateStateUsing(fn ($state) => $state ? '1' : '0'),
]),
]);
}
public function table(Table $table): Table
{
return $table
->recordTitleAttribute('catalog_name')
->columns([
ImageColumn::make('icon')
->getStateUsing(fn ($record) => url($record->itemBase?->icon()))
->size('25px')
->label('Icon')
->circular(),
TextColumn::make('itemBase.item_name')
->label('Furniture Name')
->sortable()
->searchable(),
TextColumn::make('catalog_name')
->label('Catalog Name')
->sortable()
->searchable(),
TextColumn::make('cost_credits')
->label('Credits')
->sortable(),
TextColumn::make('cost_points')
->label('Points')
->sortable(),
IconColumn::make('limited_stack')
->label('Limited')
->boolean(),
IconColumn::make('club_only')
->label('HC Only')
->boolean(),
TextColumn::make('itemBase.type')
->label('Type')
->toggleable(isToggledHiddenByDefault: true),
TextColumn::make('itemBase.width')
->label('Width')
->toggleable(isToggledHiddenByDefault: true),
TextColumn::make('itemBase.length')
->label('Length')
->toggleable(isToggledHiddenByDefault: true),
TextColumn::make('order_number')
->label('Order')
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
->filters([
SelectFilter::make('type')
->query(fn (Builder $query, array $data): Builder => empty($data['values'])
? $query
: $query->whereHas('itemBase', function (Builder $query) use ($data): void {
$query->whereIn('type', $data['values']);
}))
->options(
fn () => ItemBase::query()
->select('type')
->distinct()
->orderBy('type')
->pluck('type', 'type')
->toArray(),
)
->multiple()
->searchable()
->preload(),
TernaryFilter::make('club_only')
->label('HC Only'),
TernaryFilter::make('limited_stack')
->label('Limited'),
])
->defaultSort('order_number')
->headerActions([
CreateAction::make(),
])
->recordActions([
EditAction::make()->label('Edit Catalog Item'),
Action::make('editItemBase')
->label('Edit Item base')
->icon('heroicon-m-cube')
->modalWidth('3xl')
->modalHeading('Edit Item Base')
->fillForm(function ($record) {
$itemBase = $record->itemBase;
if (! $itemBase) {
return [];
}
return [
'sprite_id' => $itemBase->sprite_id,
'public_name' => $itemBase->public_name,
'item_name' => $itemBase->item_name,
'type' => $itemBase->type,
'width' => $itemBase->width,
'length' => $itemBase->length,
'stack_height' => $itemBase->stack_height,
'allow_stack' => $itemBase->allow_stack,
'allow_sit' => $itemBase->allow_sit,
'allow_lay' => $itemBase->allow_lay,
'allow_walk' => $itemBase->allow_walk,
'allow_gift' => $itemBase->allow_gift,
'allow_trade' => $itemBase->allow_trade,
'allow_recycle' => $itemBase->allow_recycle,
'allow_marketplace_sell' => $itemBase->allow_marketplace_sell,
'allow_inventory_stack' => $itemBase->allow_inventory_stack,
'interaction_type' => $itemBase->interaction_type,
'interaction_modes_count' => $itemBase->interaction_modes_count,
'vending_ids' => $itemBase->vending_ids,
'multiheight' => $itemBase->multiheight,
'customparams' => $itemBase->customparams,
'effect_id_male' => $itemBase->effect_id_male,
'effect_id_female' => $itemBase->effect_id_female,
'clothing_on_walk' => $itemBase->clothing_on_walk,
];
})
->schema([
TextInput::make('sprite_id')
->label('Sprite ID')
->numeric()
->nullable()
->dehydrateStateUsing(fn ($state) => $state ?? ''),
TextInput::make('public_name')
->label('Public Name')
->maxLength(56)
->nullable()
->dehydrateStateUsing(fn ($state) => $state ?? ''),
TextInput::make('item_name')
->label('Item Name')
->required()
->maxLength(70),
TextInput::make('type')
->maxLength(3)
->nullable()
->dehydrateStateUsing(fn ($state) => $state ?? ''),
Grid::make(3)
->schema([
TextInput::make('width')
->numeric()
->nullable()
->dehydrateStateUsing(fn ($state) => $state ?? ''),
TextInput::make('length')
->numeric()
->nullable()
->dehydrateStateUsing(fn ($state) => $state ?? ''),
TextInput::make('stack_height')
->numeric()
->nullable()
->dehydrateStateUsing(fn ($state) => $state ?? ''),
]),
Grid::make(3)
->schema([
Toggle::make('allow_stack'),
Toggle::make('allow_sit'),
Toggle::make('allow_lay'),
]),
Grid::make(3)
->schema([
Toggle::make('allow_walk'),
Toggle::make('allow_gift'),
Toggle::make('allow_trade'),
]),
Grid::make(3)
->schema([
Toggle::make('allow_recycle'),
Toggle::make('allow_marketplace_sell'),
Toggle::make('allow_inventory_stack'),
]),
TextInput::make('interaction_type')
->maxLength(500)
->nullable()
->dehydrateStateUsing(fn ($state) => $state ?? ''),
Grid::make(2)
->schema([
TextInput::make('interaction_modes_count')
->numeric()
->nullable()
->dehydrateStateUsing(fn ($state) => $state ?? ''),
TextInput::make('vending_ids')
->maxLength(255)
->nullable()
->dehydrateStateUsing(fn ($state) => $state ?? ''),
]),
Grid::make(2)
->schema([
TextInput::make('multiheight')
->maxLength(50)
->nullable()
->dehydrateStateUsing(fn ($state) => $state ?? ''),
TextInput::make('customparams')
->maxLength(256)
->nullable()
->dehydrateStateUsing(fn ($state) => $state ?? ''),
]),
Grid::make(2)
->schema([
TextInput::make('effect_id_male')
->numeric()
->nullable()
->dehydrateStateUsing(fn ($state) => $state ?? ''),
TextInput::make('effect_id_female')
->numeric()
->nullable()
->dehydrateStateUsing(fn ($state) => $state ?? ''),
]),
TextInput::make('clothing_on_walk')
->maxLength(255)
->nullable()
->dehydrateStateUsing(fn ($state) => $state ?? ''),
])
->action(function (array $data, $record): void {
// Transform any null or empty values to empty strings
$data = collect($data)->map(function ($value) {
if ($value === null || $value === '') {
return '';
}
if (is_bool($value)) {
return $value ? '1' : '0';
}
return $value;
})->toArray();
$record->itemBase->forceFill($data)->save();
})
->visible(fn ($record) => $record->itemBase !== null),
DeleteAction::make(),
])
->toolbarActions([
BulkActionGroup::make([
DeleteBulkAction::make(),
]),
]);
}
}
@@ -1,96 +0,0 @@
<?php
namespace App\Filament\Resources\Hotel\ChatlogPrivates;
use App\Filament\Resources\Hotel\ChatlogPrivates\Pages\ManageChatlogPrivates;
use App\Filament\Traits\TranslatableResource;
use App\Models\ChatlogPrivate;
use Filament\Actions\ViewAction;
use Filament\Forms\Components\Textarea;
use Filament\Forms\Components\TextInput;
use Filament\Resources\Resource;
use Filament\Schemas\Schema;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
class ChatlogPrivateResource extends Resource
{
use TranslatableResource;
protected static ?string $model = ChatlogPrivate::class;
protected static string|\BackedEnum|null $navigationIcon = 'heroicon-o-chat-bubble-left-right';
protected static string|\UnitEnum|null $navigationGroup = 'Logs';
public static string $translateIdentifier = 'chatlog-private';
protected static ?string $slug = 'hotel/chatlog-private';
#[\Override]
public static function form(Schema $schema): Schema
{
return $schema
->components([
TextInput::make('sender')
->disabled()
->formatStateUsing(fn ($record) => $record->sender?->username)
->label(__('filament::resources.inputs.sender')),
TextInput::make('receiver')
->disabled()
->formatStateUsing(fn ($record) => $record->receiver?->username)
->label(__('filament::resources.inputs.receiver')),
Textarea::make('message')
->label(__('filament::resources.inputs.message'))
->columnSpanFull()
->disabled(),
]);
}
#[\Override]
public static function table(Table $table): Table
{
return $table
->defaultSort('timestamp', 'desc')
->columns(self::getTable())
->filters([])
->recordActions([
ViewAction::make(),
])
->toolbarActions([]);
}
public static function getTable(): array
{
return [
TextColumn::make('sender.username')
->label(__('filament::resources.columns.sender'))
->toggleable()
->searchable(isIndividual: true),
TextColumn::make('receiver.username')
->label(__('filament::resources.columns.receiver'))
->toggleable()
->searchable(isIndividual: true),
TextColumn::make('message')
->label(__('filament::resources.columns.message'))
->limit(40)
->searchable(isIndividual: true),
TextColumn::make('timestamp')
->label(__('filament::resources.columns.executed_at'))
->dateTime('Y-m-d H:i')
->toggleable(),
];
}
public static function getPages(): array
{
return [
'index' => ManageChatlogPrivates::route('/'),
];
}
}
@@ -1,16 +0,0 @@
<?php
namespace App\Filament\Resources\Hotel\ChatlogPrivates\Pages;
use App\Filament\Resources\Hotel\ChatlogPrivates\ChatlogPrivateResource;
use Filament\Resources\Pages\ManageRecords;
class ManageChatlogPrivates extends ManageRecords
{
protected static string $resource = ChatlogPrivateResource::class;
protected function getHeaderActions(): array
{
return [];
}
}
@@ -1,109 +0,0 @@
<?php
namespace App\Filament\Resources\Hotel\ChatlogRooms;
use App\Filament\Resources\Hotel\ChatlogRooms\Pages\ManageChatlogRooms;
use App\Filament\Traits\TranslatableResource;
use App\Models\ChatlogRoom;
use Filament\Actions\ViewAction;
use Filament\Forms\Components\Textarea;
use Filament\Forms\Components\TextInput;
use Filament\Resources\Resource;
use Filament\Schemas\Schema;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
class ChatlogRoomResource extends Resource
{
use TranslatableResource;
protected static ?string $model = ChatlogRoom::class;
protected static string|\BackedEnum|null $navigationIcon = 'heroicon-o-chat-bubble-left-right';
protected static string|\UnitEnum|null $navigationGroup = 'Logs';
public static string $translateIdentifier = 'chatlog-rooms';
protected static ?string $slug = 'hotel/chatlog-room';
#[\Override]
public static function form(Schema $schema): Schema
{
return $schema
->components([
TextInput::make('room')
->label(__('filament::resources.inputs.room'))
->formatStateUsing(fn ($record) => $record->room?->name)
->columnSpanFull()
->disabled(),
TextInput::make('sender')
->label(__('filament::resources.inputs.sender'))
->formatStateUsing(fn ($record) => $record->sender?->username)
->disabled(),
TextInput::make('receiver')
->label(__('filament::resources.inputs.receiver'))
->formatStateUsing(fn ($record) => $record->receiver?->username)
->disabled(),
Textarea::make('message')
->label(__('filament::resources.inputs.message'))
->columnSpanFull()
->disabled(),
]);
}
#[\Override]
public static function table(Table $table): Table
{
return $table
->defaultSort('timestamp', 'desc')
->columns(self::getTable())
->filters([
//
])
->recordActions([
ViewAction::make(),
])
->toolbarActions([]);
}
public static function getTable(): array
{
return [
TextColumn::make('room.name')
->label(__('filament::resources.columns.room'))
->toggleable()
->searchable(isIndividual: true),
TextColumn::make('sender.username')
->label(__('filament::resources.columns.sender'))
->toggleable()
->searchable(isIndividual: true),
TextColumn::make('receiver.username')
->label(__('filament::resources.columns.receiver'))
->toggleable()
->searchable(isIndividual: true),
TextColumn::make('message')
->label(__('filament::resources.columns.message'))
->limit(40)
->searchable(isIndividual: true),
TextColumn::make('timestamp')
->label(__('filament::resources.columns.executed_at'))
->dateTime('Y-m-d H:i')
->toggleable(),
];
}
public static function getPages(): array
{
return [
'index' => ManageChatlogRooms::route('/'),
];
}
}
@@ -1,16 +0,0 @@
<?php
namespace App\Filament\Resources\Hotel\ChatlogRooms\Pages;
use App\Filament\Resources\Hotel\ChatlogRooms\ChatlogRoomResource;
use Filament\Resources\Pages\ManageRecords;
class ManageChatlogRooms extends ManageRecords
{
protected static string $resource = ChatlogRoomResource::class;
protected function getHeaderActions(): array
{
return [];
}
}
@@ -1,80 +0,0 @@
<?php
namespace App\Filament\Resources\Hotel\CommandLogs;
use App\Filament\Resources\Hotel\CommandLogs\Pages\ManageCommandLogs;
use App\Filament\Traits\TranslatableResource;
use App\Models\CommandLog;
use Filament\Resources\Resource;
use Filament\Schemas\Schema;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Filters\SelectFilter;
use Filament\Tables\Table;
class CommandLogResource extends Resource
{
use TranslatableResource;
protected static ?string $model = CommandLog::class;
protected static string|\BackedEnum|null $navigationIcon = 'heroicon-o-chat-bubble-bottom-center-text';
protected static string|\UnitEnum|null $navigationGroup = 'Logs';
public static string $translateIdentifier = 'command-logs';
protected static ?string $slug = 'logs/commands';
#[\Override]
public static function form(Schema $schema): Schema
{
return $schema->components([]);
}
#[\Override]
public static function table(Table $table): Table
{
return $table
->defaultSort('timestamp', 'desc')
->columns([
TextColumn::make('user.username')
->label(__('filament::resources.columns.username'))
->searchable(),
TextColumn::make('command')
->label(__('filament::resources.columns.command'))
->searchable(),
TextColumn::make('succes')
->badge()
->color(fn (string $state): string => match ($state) {
'yes' => 'primary',
'no' => 'warning'
})
->label(__('filament::resources.columns.success'))
->formatStateUsing(fn (string $state): string => __("filament::resources.options.{$state}")),
TextColumn::make('timestamp')
->label(__('filament::resources.columns.executed_at'))
->dateTime('Y-m-d H:i')
->searchable(),
])
->filters([
SelectFilter::make('succes')
->label(__('filament::resources.filters.success'))
->options([
'yes' => __('filament::resources.options.yes'),
'no' => __('filament::resources.options.no'),
]),
])
->recordActions([])
->toolbarActions([]);
}
public static function getPages(): array
{
return [
'index' => ManageCommandLogs::route('/'),
];
}
}
@@ -1,21 +0,0 @@
<?php
namespace App\Filament\Resources\Hotel\CommandLogs\Pages;
use App\Filament\Resources\Hotel\CommandLogs\CommandLogResource;
use Filament\Resources\Pages\ManageRecords;
class ManageCommandLogs extends ManageRecords
{
protected static string $resource = CommandLogResource::class;
protected function getActions(): array
{
return [];
}
public function getPrimaryKey(): string
{
return 'timestamp';
}
}
@@ -1,21 +0,0 @@
<?php
namespace App\Filament\Resources\Hotel;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Collection;
class CustomQueryBuilder extends Builder
{
public function __construct()
{
// Call the parent constructor with a dummy query
parent::__construct(app('db')->query());
}
#[\Override]
public function get($columns = ['*']): Collection
{
return collect(); // Return an empty collection
}
}
@@ -1,93 +0,0 @@
<?php
namespace App\Filament\Resources\Hotel\EmulatorSettings;
use App\Filament\Resources\Hotel\EmulatorSettings\Pages\CreateEmulatorSetting;
use App\Filament\Resources\Hotel\EmulatorSettings\Pages\EditEmulatorSetting;
use App\Filament\Resources\Hotel\EmulatorSettings\Pages\ListEmulatorSettings;
use App\Filament\Traits\TranslatableResource;
use App\Models\EmulatorSetting;
use Filament\Actions\EditAction;
use Filament\Actions\ViewAction;
use Filament\Forms\Components\TextInput;
use Filament\Resources\Resource;
use Filament\Schemas\Components\Section;
use Filament\Schemas\Schema;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
class EmulatorSettingResource extends Resource
{
use TranslatableResource;
protected static ?string $model = EmulatorSetting::class;
protected static string|\BackedEnum|null $navigationIcon = 'heroicon-o-adjustments-horizontal';
protected static string|\UnitEnum|null $navigationGroup = 'Hotel';
public static string $translateIdentifier = 'emulator-settings';
protected static ?string $slug = 'hotel/emulator-settings';
#[\Override]
public static function form(Schema $schema): Schema
{
return $schema
->components([
Section::make()
->schema([
TextInput::make('key')
->label(__('filament::resources.inputs.key'))
->required()
->maxLength(100)
->unique(ignoreRecord: true),
TextInput::make('value')
->label(__('filament::resources.inputs.value'))
->required()
->maxLength(512),
]),
]);
}
#[\Override]
public static function table(Table $table): Table
{
return $table
->columns([
TextColumn::make('key')
->label(__('filament::resources.columns.key'))
->searchable(),
TextColumn::make('value')
->label(__('filament::resources.columns.value'))
->searchable(),
])
->filters([
//
])
->recordActions([
ViewAction::make(),
EditAction::make(),
])
->toolbarActions([]);
}
#[\Override]
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => ListEmulatorSettings::route('/'),
'create' => CreateEmulatorSetting::route('/create'),
'edit' => EditEmulatorSetting::route('/{record}/edit'),
];
}
}
@@ -1,11 +0,0 @@
<?php
namespace App\Filament\Resources\Hotel\EmulatorSettings\Pages;
use App\Filament\Resources\Hotel\EmulatorSettings\EmulatorSettingResource;
use Filament\Resources\Pages\CreateRecord;
class CreateEmulatorSetting extends CreateRecord
{
protected static string $resource = EmulatorSettingResource::class;
}
@@ -1,19 +0,0 @@
<?php
namespace App\Filament\Resources\Hotel\EmulatorSettings\Pages;
use App\Filament\Resources\Hotel\EmulatorSettings\EmulatorSettingResource;
use Filament\Actions\DeleteAction;
use Filament\Resources\Pages\EditRecord;
class EditEmulatorSetting extends EditRecord
{
protected static string $resource = EmulatorSettingResource::class;
protected function getActions(): array
{
return [
DeleteAction::make(),
];
}
}
@@ -1,19 +0,0 @@
<?php
namespace App\Filament\Resources\Hotel\EmulatorSettings\Pages;
use App\Filament\Resources\Hotel\EmulatorSettings\EmulatorSettingResource;
use Filament\Actions\CreateAction;
use Filament\Resources\Pages\ListRecords;
class ListEmulatorSettings extends ListRecords
{
protected static string $resource = EmulatorSettingResource::class;
protected function getActions(): array
{
return [
CreateAction::make(),
];
}
}
@@ -1,89 +0,0 @@
<?php
namespace App\Filament\Resources\Hotel\EmulatorTexts;
use App\Filament\Resources\Hotel\EmulatorTexts\Pages\ManageEmulatorTexts;
use App\Filament\Traits\TranslatableResource;
use App\Models\EmulatorText;
use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteBulkAction;
use Filament\Actions\EditAction;
use Filament\Forms\Components\TextInput;
use Filament\Resources\Resource;
use Filament\Schemas\Schema;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
class EmulatorTextResource extends Resource
{
use TranslatableResource;
protected static ?string $model = EmulatorText::class;
protected static string|\BackedEnum|null $navigationIcon = 'heroicon-o-clipboard-document-list';
protected static string|\UnitEnum|null $navigationGroup = 'Hotel';
protected static ?string $slug = 'hotel/emulator-texts';
public static string $translateIdentifier = 'emulator-texts';
#[\Override]
public static function form(Schema $schema): Schema
{
return $schema
->components([
TextInput::make('key')
->label(__('filament::resources.inputs.key'))
->required()
->maxLength(100)
->unique(ignoreRecord: true),
TextInput::make('value')
->label(__('filament::resources.inputs.value'))
->required()
->maxLength(512),
]);
}
#[\Override]
public static function table(Table $table): Table
{
return $table
->columns([
TextColumn::make('key')
->label(__('filament::resources.columns.key'))
->searchable(),
TextColumn::make('value')
->label(__('filament::resources.columns.value'))
->searchable(),
])
->filters([
//
])
->recordActions([
EditAction::make(),
])
->toolbarActions([
BulkActionGroup::make([
DeleteBulkAction::make(),
]),
]);
}
#[\Override]
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => ManageEmulatorTexts::route('/'),
];
}
}
@@ -1,24 +0,0 @@
<?php
namespace App\Filament\Resources\Hotel\EmulatorTexts\Pages;
use App\Filament\Resources\Hotel\EmulatorTexts\EmulatorTextResource;
use Filament\Actions\CreateAction;
use Filament\Resources\Pages\ManageRecords;
class ManageEmulatorTexts extends ManageRecords
{
protected static string $resource = EmulatorTextResource::class;
protected function getActions(): array
{
return [
CreateAction::make('create'),
];
}
public function getPrimaryKey(): string
{
return 'key';
}
}
@@ -1,121 +0,0 @@
<?php
namespace App\Filament\Resources\Hotel\OpenPositions;
use App\Filament\Resources\Hotel\OpenPositions\Pages\CreateOpenPosition;
use App\Filament\Resources\Hotel\OpenPositions\Pages\EditOpenPosition;
use App\Filament\Resources\Hotel\OpenPositions\Pages\ListOpenPositions;
use App\Models\Community\Staff\WebsiteOpenPosition;
use Filament\Actions\DeleteAction;
use Filament\Actions\DeleteBulkAction;
use Filament\Actions\EditAction;
use Filament\Forms\Components\DateTimePicker;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\Textarea;
use Filament\Notifications\Notification;
use Filament\Resources\Resource;
use Filament\Schemas\Schema;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
class OpenPositionResource extends Resource
{
protected static ?string $model = WebsiteOpenPosition::class;
protected static string|\BackedEnum|null $navigationIcon = 'heroicon-o-briefcase';
protected static string|\UnitEnum|null $navigationGroup = 'Hotel';
#[\Override]
public static function form(Schema $schema): Schema
{
return $schema
->components([
Select::make('permission_id')
->label('Rank')
->relationship('permission', 'rank_name')
->required()
->searchable()
->preload()
->unique(ignoreRecord: true)
->placeholder('Select a rank'),
Textarea::make('description')
->label('Position Description')
->required()
->maxLength(65535)
->columnSpanFull(),
DateTimePicker::make('apply_from')
->label('Application Start Date')
->nullable(),
DateTimePicker::make('apply_to')
->label('Application End Date')
->nullable(),
]);
}
#[\Override]
public static function table(Table $table): Table
{
return $table
->columns([
TextColumn::make('permission.rank_name')
->label('Rank')
->sortable()
->searchable(),
TextColumn::make('description')
->label('Description')
->limit(50)
->searchable(),
TextColumn::make('apply_from')
->label('Apply From')
->dateTime()
->sortable(),
TextColumn::make('apply_to')
->label('Apply To')
->dateTime()
->sortable(),
TextColumn::make('created_at')
->label('Created')
->dateTime()
->sortable(),
])
->filters([
])
->recordActions([
EditAction::make(),
DeleteAction::make()
->requiresConfirmation()
->modalHeading('Delete Open Position')
->modalDescription('This will also delete all related staff applications. Are you sure?')
->modalSubmitActionLabel('Yes, delete')
->successNotification(
Notification::make()
->success()
->title('Open Position Deleted')
->body('The open position and its related staff applications have been deleted successfully.'),
),
])
->toolbarActions([
DeleteBulkAction::make()
->requiresConfirmation()
->modalHeading('Delete Open Positions')
->modalDescription('This will also delete all related staff applications for the selected positions. Are you sure?')
->modalSubmitActionLabel('Yes, delete')
->successNotification(
Notification::make()
->success()
->title('Open Positions Deleted')
->body('The selected open positions and their related staff applications have been deleted successfully.'),
),
]);
}
public static function getPages(): array
{
return [
'index' => ListOpenPositions::route('/'),
'create' => CreateOpenPosition::route('/create'),
'edit' => EditOpenPosition::route('/{record}/edit'),
];
}
}
@@ -1,11 +0,0 @@
<?php
namespace App\Filament\Resources\Hotel\OpenPositions\Pages;
use App\Filament\Resources\Hotel\OpenPositions\OpenPositionResource;
use Filament\Resources\Pages\CreateRecord;
class CreateOpenPosition extends CreateRecord
{
protected static string $resource = OpenPositionResource::class;
}
@@ -1,11 +0,0 @@
<?php
namespace App\Filament\Resources\Hotel\OpenPositions\Pages;
use App\Filament\Resources\Hotel\OpenPositions\OpenPositionResource;
use Filament\Resources\Pages\EditRecord;
class EditOpenPosition extends EditRecord
{
protected static string $resource = OpenPositionResource::class;
}
@@ -1,19 +0,0 @@
<?php
namespace App\Filament\Resources\Hotel\OpenPositions\Pages;
use App\Filament\Resources\Hotel\OpenPositions\OpenPositionResource;
use Filament\Actions\CreateAction;
use Filament\Resources\Pages\ListRecords;
class ListOpenPositions extends ListRecords
{
protected static string $resource = OpenPositionResource::class;
protected function getHeaderActions(): array
{
return [
CreateAction::make(),
];
}
}
@@ -1,19 +0,0 @@
<?php
namespace App\Filament\Resources\Hotel\StaffApplications\Pages;
use App\Filament\Resources\Hotel\StaffApplications\StaffApplicationResource;
use Filament\Actions\DeleteAction;
use Filament\Resources\Pages\EditRecord;
class EditStaffApplication extends EditRecord
{
protected static string $resource = StaffApplicationResource::class;
protected function getHeaderActions(): array
{
return [
DeleteAction::make(),
];
}
}
@@ -1,19 +0,0 @@
<?php
namespace App\Filament\Resources\Hotel\StaffApplications\Pages;
use App\Filament\Resources\Hotel\StaffApplications\StaffApplicationResource;
use Filament\Actions\CreateAction;
use Filament\Resources\Pages\ListRecords;
class ListStaffApplications extends ListRecords
{
protected static string $resource = StaffApplicationResource::class;
protected function getHeaderActions(): array
{
return [
CreateAction::make(),
];
}
}
@@ -1,92 +0,0 @@
<?php
namespace App\Filament\Resources\Hotel\StaffApplications;
use App\Filament\Resources\Hotel\StaffApplications\Pages\EditStaffApplication;
use App\Filament\Resources\Hotel\StaffApplications\Pages\ListStaffApplications;
use App\Models\Community\Staff\WebsiteStaffApplications;
use Filament\Actions\DeleteAction;
use Filament\Actions\DeleteBulkAction;
use Filament\Actions\EditAction;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\Textarea;
use Filament\Resources\Resource;
use Filament\Schemas\Schema;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
class StaffApplicationResource extends Resource
{
protected static ?string $model = WebsiteStaffApplications::class;
protected static string|\BackedEnum|null $navigationIcon = 'heroicon-o-user-group';
protected static string|\UnitEnum|null $navigationGroup = 'Hotel';
public static function canCreate(): bool
{
return false;
}
#[\Override]
public static function form(Schema $schema): Schema
{
return $schema
->components([
Select::make('user_id')
->relationship('user', 'username')
->required()
->searchable(),
Select::make('rank_id')
->relationship('rank', 'rank_name')
->required()
->searchable(),
Textarea::make('content')
->required()
->columnSpanFull(),
]);
}
#[\Override]
public static function table(Table $table): Table
{
return $table
->columns([
TextColumn::make('user.username')
->label('User')
->sortable()
->searchable(),
TextColumn::make('rank.rank_name')
->label('Rank')
->sortable()
->searchable(),
TextColumn::make('content')
->limit(50)
->sortable(),
TextColumn::make('created_at')
->dateTime()
->sortable(),
TextColumn::make('updated_at')
->dateTime()
->sortable(),
])
->filters([
// Add filters if needed
])
->recordActions([
EditAction::make(),
DeleteAction::make(),
])
->toolbarActions([
DeleteBulkAction::make(),
]);
}
public static function getPages(): array
{
return [
'index' => ListStaffApplications::route('/'),
'edit' => EditStaffApplication::route('/{record}/edit'),
];
}
}
@@ -1,11 +0,0 @@
<?php
namespace App\Filament\Resources\Hotel\WebsiteAds\Pages;
use App\Filament\Resources\Hotel\WebsiteAds\WebsiteAdResource;
use Filament\Resources\Pages\CreateRecord;
class CreateWebsiteAd extends CreateRecord
{
protected static string $resource = WebsiteAdResource::class;
}
@@ -1,19 +0,0 @@
<?php
namespace App\Filament\Resources\Hotel\WebsiteAds\Pages;
use App\Filament\Resources\Hotel\WebsiteAds\WebsiteAdResource;
use Filament\Actions\DeleteAction;
use Filament\Resources\Pages\EditRecord;
class EditWebsiteAd extends EditRecord
{
protected static string $resource = WebsiteAdResource::class;
protected function getHeaderActions(): array
{
return [
DeleteAction::make(),
];
}
}
@@ -1,46 +0,0 @@
<?php
namespace App\Filament\Resources\Hotel\WebsiteAds\Pages;
use App\Filament\Resources\Hotel\WebsiteAds\WebsiteAdResource;
use App\Models\WebsiteAd;
use Filament\Actions\Action;
use Filament\Actions\CreateAction;
use Filament\Resources\Pages\ListRecords;
use Illuminate\Support\Facades\Artisan;
class ListWebsiteAds extends ListRecords
{
protected static string $resource = WebsiteAdResource::class;
protected function getActions(): array
{
return [
CreateAction::make()
->label('Create new ADS')
->color('success'),
Action::make('importAdsData')
->label('Import ADS Images from folder')
->color('info')
->action(function (): void {
Artisan::call('import:ads-data');
session()->flash('success', 'ADS data imported successfully!');
})
->requiresConfirmation()
->modalHeading('Import ADS Data')
->modalDescription('Are you sure you want to import ADS data? This action cannot be undone.')
->modalButton('Yes, import data'),
Action::make('emptyTable')
->label('Empty Database Table')
->color('danger')
->action(function (): void {
WebsiteAd::truncate();
session()->flash('success', 'The table has been emptied successfully!');
})
->requiresConfirmation()
->modalHeading('Empty Table')
->modalDescription('Are you sure you want to empty the table? This action cannot be undone and will delete all records.')
->modalButton('Yes, empty table'),
];
}
}
@@ -1,81 +0,0 @@
<?php
namespace App\Filament\Resources\Hotel\WebsiteAds;
use App\Filament\Resources\Hotel\WebsiteAds\Pages\CreateWebsiteAd;
use App\Filament\Resources\Hotel\WebsiteAds\Pages\ListWebsiteAds;
use App\Models\WebsiteAd;
use Filament\Actions\DeleteAction;
use Filament\Forms\Components\FileUpload;
use Filament\Resources\Resource;
use Filament\Schemas\Schema;
use Filament\Tables\Columns\ImageColumn;
use Filament\Tables\Columns\Layout\Stack;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
use Livewire\Features\SupportFileUploads\TemporaryUploadedFile;
class WebsiteAdResource extends Resource
{
protected static ?string $model = WebsiteAd::class;
protected static string|\UnitEnum|null $navigationGroup = 'Hotel';
protected static ?string $navigationLabel = 'ADS Images';
protected static string|\BackedEnum|null $navigationIcon = 'heroicon-o-sparkles';
#[\Override]
public static function form(Schema $schema): Schema
{
return $schema
->components([
FileUpload::make('image')
->label('Image')
->disk('ads')
->preserveFilenames()
->image()
->rules(['required', 'image', 'mimes:jpeg,png,jpg,gif'])
->validationMessages([
'required' => 'Please upload an image.', 'image' => 'The file must be a valid image.', 'mimes' => 'Only JPEG, PNG, JPG, and GIF images are allowed.'])
->required()
->getUploadedFileNameForStorageUsing(
fn (TemporaryUploadedFile $file): string => strtolower(str_replace([' ', '-', 'æ', 'ø', 'å'], ['_', '_', 'ae', 'oe', 'aa'], $file->getClientOriginalName())),
),
]);
}
#[\Override]
public static function table(Table $table): Table
{
return $table
->columns([
Stack::make([
ImageColumn::make('image_url')
->label('')
->extraAttributes(['style' => 'image-rendering: pixelated'])
->size(125),
TextColumn::make('image')
->label('')
->alignCenter()
->searchable(),
]),
TextColumn::make('created_at')
->dateTime(),
])
->filters([
])
->recordActions([
DeleteAction::make(),
])
->searchable();
}
public static function getPages(): array
{
return [
'index' => ListWebsiteAds::route('/'),
'create' => CreateWebsiteAd::route('/create'),
];
}
}
@@ -1,19 +0,0 @@
<?php
namespace App\Filament\Resources\Hotel\WordFilters\Pages;
use App\Filament\Resources\Hotel\WordFilters\WordFilterResource;
use Filament\Actions\CreateAction;
use Filament\Resources\Pages\ManageRecords;
class ManageWordFilters extends ManageRecords
{
protected static string $resource = WordFilterResource::class;
protected function getActions(): array
{
return [
CreateAction::make(),
];
}
}
@@ -1,125 +0,0 @@
<?php
namespace App\Filament\Resources\Hotel\WordFilters;
use App\Filament\Resources\Hotel\WordFilters\Pages\ManageWordFilters;
use App\Filament\Traits\TranslatableResource;
use App\Models\Wordfilter;
use Filament\Actions\DeleteAction;
use Filament\Actions\DeleteBulkAction;
use Filament\Actions\EditAction;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Resources\Resource;
use Filament\Schemas\Schema;
use Filament\Tables\Columns\IconColumn;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
class WordFilterResource extends Resource
{
use TranslatableResource;
protected static ?string $model = Wordfilter::class;
protected static string|\BackedEnum|null $navigationIcon = 'heroicon-o-eye-slash';
protected static string|\UnitEnum|null $navigationGroup = 'Hotel';
protected static ?string $slug = 'hotel/wordfilters';
public static string $translateIdentifier = 'word-filters';
#[\Override]
public static function form(Schema $schema): Schema
{
return $schema
->components([
TextInput::make('key')
->label(__('filament::resources.inputs.key'))
->maxLength(256)
->unique('wordfilter', 'key', ignoreRecord: true)
->required(),
TextInput::make('replacement')
->label(__('filament::resources.inputs.replacement'))
->maxLength(16)
->required(),
Select::make('hide')
->native(false)
->label(__('filament::resources.inputs.hideable'))
->default('0')
->options([
'0' => __('filament::resources.options.no'),
'1' => __('filament::resources.options.yes'),
]),
Select::make('report')
->native(false)
->label(__('filament::resources.inputs.reportable'))
->default('0')
->options([
'0' => __('filament::resources.options.no'),
'1' => __('filament::resources.options.yes'),
]),
TextInput::make('mute')
->label(__('filament::resources.inputs.mute_time'))
->columnSpanFull()
->default(0),
]);
}
#[\Override]
public static function table(Table $table): Table
{
return $table
->columns([
TextColumn::make('key')
->label(__('filament::resources.columns.key'))
->searchable(),
TextColumn::make('replacement')
->label(__('filament::resources.columns.replacement'))
->searchable(),
IconColumn::make('hide')
->label(__('filament::resources.columns.hideable'))
->icon(fn (string $state): string => $state === '0' ? 'heroicon-o-x-circle' : 'heroicon-o-check-circle')
->colors([
'danger' => '0',
'success' => '1',
]),
IconColumn::make('report')
->label(__('filament::resources.columns.reportable'))
->icon(fn (string $state): string => $state === '0' ? 'heroicon-o-x-circle' : 'heroicon-o-check-circle')
->colors([
'danger' => '0',
'success' => '1',
]),
TextColumn::make('mute')
->label(__('filament::resources.columns.mute_time'))
->searchable(),
])
->filters([
])
->recordActions([
EditAction::make(),
DeleteAction::make(),
])
->toolbarActions([
DeleteBulkAction::make(),
]);
}
public static function getPages(): array
{
return [
'index' => ManageWordFilters::route('/'),
];
}
}