Version 1.0.0

This commit is contained in:
2025-05-10 16:52:45 +02:00
commit bed95bff35
459 changed files with 36475 additions and 0 deletions

View File

@@ -0,0 +1,115 @@
<?php
namespace App\Filament\Pages;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Pages\Page;
use Filament\Actions\Action;
use Filament\Notifications\Notification;
use Filament\Forms\Contracts\HasForms;
use Filament\Forms\Concerns\InteractsWithForms;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Components\Builder;
use Filament\Forms\Components\Toggle;
use Filament\Forms\Components\Card;
use Filament\Support\Enums\MaxWidth;
use Filament\Forms\Components\RichEditor;
class Contact extends Page implements HasForms
{
use InteractsWithForms;
public static function canAccess(): bool
{
return auth()->user()->can('manage_contact') || auth()->user()->can('admin');
}
protected static ?string $navigationIcon = 'heroicon-o-adjustments-horizontal';
protected static ?string $navigationGroup = 'Ustawienia';
protected static ?string $title = 'Kontakt';
protected static ?int $navigationSort = 3;
protected static string $view = 'filament.pages.custom-edit-page';
public function getMaxContentWidth(): MaxWidth
{
return MaxWidth::FourExtraLarge;
}
public ?array $data = [];
public function mount(): void
{
$firstRecord = \App\Models\Contact::first();
if ($firstRecord) {
$this->data = $firstRecord->toArray();
$this->form->fill($this->data);
}
}
public function form(Form $form): Form
{
return $form->schema([
Card::make()
->schema([
RichEditor::make('address')
->label('Adres')
->required()
->columnSpanFull(),
TextInput::make('telephone')
->label('Telefon')
->required()
->maxLength(2048),
TextInput::make('email')
->label('E-mail')
->required()
->maxLength(2048),
TextInput::make('fax')
->label('Faks')
->required()
->maxLength(2048),
]),
Card::make()
->schema([
TextInput::make('system_email')
->label('Na ten adres będzie wysyłany e-mail z formularza kontaktowego')
->required()
->maxLength(2048),
]),
])->statePath('data');
}
public function getFormActions(): array
{
return [
Action::make('save')
->label('Zapisz')
->action('save'),
];
}
public function save(): void
{
$validatedData = $this->form->getState();
try {
$contact = \App\Models\Contact::first();
$contact->fill($validatedData);
$contact->save();
Notification::make()
->title('Sukces!')
->body('Rekord został zapisany pomyślnie.')
->success()
->send();
} catch (\Exception $e) {
Notification::make()
->title('Błąd!')
->body('Wystąpił problem podczas zapisywania rekordu: ' . $e->getMessage())
->danger()
->send();
}
}
}

View File

@@ -0,0 +1,124 @@
<?php
namespace App\Filament\Pages;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Pages\Page;
use Filament\Actions\Action;
use Filament\Notifications\Notification;
use Filament\Forms\Contracts\HasForms;
use Filament\Forms\Concerns\InteractsWithForms;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Components\Builder;
use Filament\Forms\Components\Toggle;
use Filament\Forms\Components\Card;
use Filament\Support\Enums\MaxWidth;
use Filament\Forms\Components\RichEditor;
use Filament\Forms\Components\FileUpload;
use Composer\InstalledVersions;
use Symfony\Component\Process\Process;
class Diagnostic extends Page
{
public static function canAccess(): bool
{
return auth()->user()->can('view_diagnostics') || auth()->user()->can('admin');
}
protected static ?string $navigationIcon = 'heroicon-o-information-circle';
protected static ?string $navigationGroup = 'Ustawienia';
protected static ?string $title = 'Diagnostyka';
protected static ?int $navigationSort = 2;
protected static string $view = 'filament.pages.diagnostic-page';
public function getMaxContentWidth(): MaxWidth
{
return MaxWidth::FourExtraLarge;
}
public array $composerPackages = [];
public array $npmPackages = [];
public function mount(): void
{
$composerJson = json_decode(file_get_contents(base_path('composer.json')), true);
$direct = [];
foreach (['require', 'require-dev'] as $section) {
if (isset($composerJson[$section])) {
foreach ($composerJson[$section] as $name => $ver) {
if (strpos($name, 'ext-') !== 0 && $name !== 'php') {
$direct[] = $name;
}
}
}
}
foreach ($direct as $package) {
if (\Composer\InstalledVersions::isInstalled($package)) {
$this->composerPackages[$package] = [
'name' => $package,
'current_version' => \Composer\InstalledVersions::getPrettyVersion($package),
'latest_version' => null,
'is_up_to_date' => true,
];
}
}
try {
$env = $_ENV;
$env['HOME'] = base_path();
$composerProcess = new Process(['composer', 'outdated', '--format=json', '--direct'], base_path(), $env);
$composerProcess->run();
if ($composerProcess->isSuccessful()) {
$outdatedComposerPackages = json_decode($composerProcess->getOutput(), true);
foreach ($outdatedComposerPackages['installed'] ?? [] as $outdatedPackage) {
if (isset($this->composerPackages[$outdatedPackage['name']])) {
$this->composerPackages[$outdatedPackage['name']]['latest_version'] = $outdatedPackage['latest'];
$this->composerPackages[$outdatedPackage['name']]['is_up_to_date'] = false;
}
}
} else {
throw new \Exception($composerProcess->getErrorOutput());
}
} catch (\Exception $e) {
dd('Composer Error: ' . $e->getMessage());
}
try {
$packageJsonPath = base_path('package.json');
if (file_exists($packageJsonPath)) {
$packageJsonContent = json_decode(file_get_contents($packageJsonPath), true);
$outdatedNpmPackages = [];
$env = $_ENV;
$env['HOME'] = base_path();
$npmProcess = new Process(['npm', 'outdated', '--json'], base_path(), $env);
$npmProcess->run();
$outdatedNpmPackages = json_decode($npmProcess->getOutput(), true);
foreach (['dependencies', 'devDependencies'] as $dependencyType) {
if (isset($packageJsonContent[$dependencyType])) {
foreach ($packageJsonContent[$dependencyType] as $name => $version) {
$this->npmPackages[] = [
'name' => $name,
'current_version' => isset($outdatedNpmPackages[$name]) ? $outdatedNpmPackages[$name]['current'] : $version,
'wanted_version' => isset($outdatedNpmPackages[$name]) ? $outdatedNpmPackages[$name]['wanted'] : null,
'latest_version' => isset($outdatedNpmPackages[$name]) ? $outdatedNpmPackages[$name]['latest'] : null,
'is_up_to_date' => !isset($outdatedNpmPackages[$name]),
];
}
}
}
}
} catch (\Exception $e) {
dd('NPM Error: ' . $e->getMessage());
}
}
}

View File

@@ -0,0 +1,156 @@
<?php
namespace App\Filament\Pages;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Pages\Page;
use Filament\Actions\Action;
use Filament\Notifications\Notification;
use Filament\Forms\Contracts\HasForms;
use Filament\Forms\Concerns\InteractsWithForms;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Components\Builder;
use Filament\Forms\Components\Toggle;
use Filament\Forms\Components\Card;
use Filament\Forms\Components\Select;
use Filament\Support\Enums\MaxWidth;
class Footer extends Page implements HasForms
{
use InteractsWithForms;
public static function canAccess(): bool
{
return auth()->user()->can('manage_footer') || auth()->user()->can('admin');
}
protected static ?string $navigationIcon = 'heroicon-o-adjustments-horizontal';
protected static ?string $navigationGroup = 'Ustawienia';
protected static ?string $title = 'Stopka';
protected static ?int $navigationSort = 5;
protected static string $view = 'filament.pages.custom-edit-page';
public function getMaxContentWidth(): MaxWidth
{
return MaxWidth::FourExtraLarge;
}
public ?array $data = [];
public function mount(): void
{
$firstRecord = \App\Models\Footer::first();
if ($firstRecord) {
$this->data = $firstRecord->toArray();
$this->form->fill($this->data);
}
}
public function form(Form $form): Form
{
return $form->schema([
Card::make()
->schema([
Select::make('wosp_link')
->label('Powiązany artykuł WOŚP')
->options(function () {
return \App\Models\Article::all()->pluck('title', 'id');
})
->nullable()
->default(null)
->searchable()
->preload()
->reactive(),
]),
Card::make()
->schema([
Builder::make('links')
->label('Odnośniki')
->addActionLabel('Dodaj odnośnik')
->blocks([
Builder\Block::make('link')
->label(function (?array $state): string {
if ($state === null) {
return 'Odnośnik';
}
return $state['name'] ?? 'Odnośnik';
})
->schema([
TextInput::make('name')
->label('Nazwa')
->required(),
TextInput::make('url')
->label('Ścieżka lub URL')
->required(),
Toggle::make('external')
->label('Otwieraj w nowej karcie')
->required(),
])
->columns(2),
])
]),
Card::make()
->schema([
Builder::make('registration_hours')
->label('Godziny rejestracji')
->addActionLabel('Dodaj dzień z godzinami')
->blocks([
Builder\Block::make('registration_hour')
->label(function (?array $state): string {
if ($state === null) {
return 'Godziny rejestracji';
}
return $state['day'] ?? 'Godzina rejestracji';
})
->schema([
TextInput::make('day')
->label('Dzień tygodnia')
->required(),
TextInput::make('hours')
->label('Godziny')
->required(),
])
->columns(2),
])
])
])->statePath('data');
}
public function getFormActions(): array
{
return [
Action::make('save')
->label('Zapisz')
->action('save'),
];
}
public function save(): void
{
$validatedData = $this->form->getState();
try {
$footer = \App\Models\Footer::first();
$footer->fill($validatedData);
$footer->save();
Notification::make()
->title('Sukces!')
->body('Rekord został zapisany pomyślnie.')
->success()
->send();
} catch (\Exception $e) {
Notification::make()
->title('Błąd!')
->body('Wystąpił problem podczas zapisywania rekordu: ' . $e->getMessage())
->danger()
->send();
}
}
}

View File

@@ -0,0 +1,157 @@
<?php
namespace App\Filament\Pages;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Pages\Page;
use Filament\Actions\Action;
use Filament\Notifications\Notification;
use Filament\Forms\Contracts\HasForms;
use Filament\Forms\Concerns\InteractsWithForms;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Components\Builder;
use Filament\Forms\Components\Toggle;
use Filament\Forms\Components\Card;
use Filament\Forms\Components\Grid;
use Filament\Forms\Components\FileUpload;
use Filament\Support\Enums\MaxWidth;
class Header extends Page implements HasForms
{
use InteractsWithForms;
public static function canAccess(): bool
{
return auth()->user()->can('manage_header') || auth()->user()->can('admin');
}
protected static ?string $navigationIcon = 'heroicon-o-adjustments-horizontal';
protected static ?string $navigationGroup = 'Ustawienia';
protected static ?string $title = 'Nagłówek';
protected static ?int $navigationSort = 4;
protected static string $view = 'filament.pages.custom-edit-page';
public function getMaxContentWidth(): MaxWidth
{
return MaxWidth::FourExtraLarge;
}
public ?array $data = [];
public function mount(): void
{
$firstRecord = \App\Models\Header::first();
if ($firstRecord) {
$this->data = $firstRecord->toArray();
$this->form->fill($this->data);
}
}
public function form(Form $form): Form
{
return $form->schema([
Card::make()
->schema([
Grid::make(2)
->schema([
TextInput::make('title1')
->label('Tytuł 1')
->required()
->maxLength(2048),
TextInput::make('title2')
->label('Tytuł 2')
->required()
->maxLength(2048),
]),
TextInput::make('subtitle')
->label('Podtytuł')
->maxLength(2048),
FileUpload::make('logo')
->image()
->imageEditor()
->acceptedFileTypes(['image/png'])
->label('Logo strony')
->disk('public')
->directory('header-logo')
->default(null),
TextInput::make('telephone')
->label('Numer telefonu')
->required()
->maxLength(15),
]),
Card::make()
->schema([
Builder::make('links')
->label('Odnośniki')
->addActionLabel('Dodaj odnośnik')
->blocks([
Builder\Block::make('link')
->label(function (?array $state): string {
if ($state === null) {
return 'Odnośnik';
}
return $state['name'] ?? 'Odnośnik';
})
->schema([
TextInput::make('name')
->label('Nazwa')
->required(),
FileUpload::make('icon')
->image()
->imageEditor()
->label('Ikona')
->disk('public')
->directory('header-links')
->default(null),
TextInput::make('icon-alt')
->label('Opis ikony')
->default(null),
TextInput::make('url')
->label('Ścieżka lub URL')
->required(),
Toggle::make('external')
->label('Otwieraj w nowej karcie')
->required(),
])
->columns(1),
])
])
])->statePath('data');
}
public function getFormActions(): array
{
return [
Action::make('save')
->label('Zapisz')
->action('save'),
];
}
public function save(): void
{
$validatedData = $this->form->getState();
try {
$header = \App\Models\Header::first();
$header->fill($validatedData);
$header->save();
Notification::make()
->title('Sukces!')
->body('Rekord został zapisany pomyślnie.')
->success()
->send();
} catch (\Exception $e) {
Notification::make()
->title('Błąd!')
->body('Wystąpił problem podczas zapisywania rekordu: ' . $e->getMessage())
->danger()
->send();
}
}
}

View File

@@ -0,0 +1,151 @@
<?php
namespace App\Filament\Pages;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Pages\Page;
use Filament\Actions\Action;
use Filament\Notifications\Notification;
use Filament\Forms\Contracts\HasForms;
use Filament\Forms\Concerns\InteractsWithForms;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Components\Builder;
use Filament\Forms\Components\Toggle;
use Filament\Forms\Components\Card;
use Filament\Support\Enums\MaxWidth;
use Filament\Forms\Components\RichEditor;
use Filament\Forms\Components\FileUpload;
class Homepage extends Page implements HasForms
{
use InteractsWithForms;
public static function canAccess(): bool
{
return auth()->user()->can('manage_homepage') || auth()->user()->can('admin');
}
protected static ?string $navigationIcon = 'heroicon-o-home';
protected static ?string $navigationGroup = 'Treści';
protected static ?string $title = 'Strona główna';
protected static ?int $navigationSort = 3;
protected static string $view = 'filament.pages.custom-edit-page';
public function getMaxContentWidth(): MaxWidth
{
return MaxWidth::FourExtraLarge;
}
public ?array $data = [];
public function mount(): void
{
$firstRecord = \App\Models\Homepage::first();
if ($firstRecord) {
$this->data = $firstRecord->toArray();
$this->form->fill($this->data);
}
}
public function form(Form $form): Form
{
return $form->schema([
Card::make()
->schema([
TextInput::make('title')
->label('Tytuł strony')
->required()
->maxLength(2048),
FileUpload::make('photo')
->image()
->imageEditor()
->disk('public')
->directory('homepage')
->label('Zdjęcie'),
RichEditor::make('content')
->label('Treść strony')
->required()
->columnSpanFull(),
]),
Card::make()
->schema([
Builder::make('carousel_photos')
->label('Zdjęcia w karuzeli')
->addActionLabel('Dodaj zdjęcie')
->collapsible()
->collapsed()
->reorderable()
->blocks([
Builder\Block::make('carousel_photo')
->label(function (?array $state): string {
if ($state === null) {
return 'Zdjęcie';
}
return $state['name'] ?? 'Zdjęcie';
})
->schema([
TextInput::make('name')
->label('Nazwa')
->required(),
FileUpload::make('photo')
->image()
->imageEditor()
->required()
->label('Zdjęcie')
->disk('public')
->directory('homepage-carousel')
->default(null),
TextInput::make('description')
->label('Opis')
->default(null)
->required(),
TextInput::make('url')
->label('Ścieżka lub URL')
->required(),
Toggle::make('external')
->label('Otwieraj w nowej karcie')
->default(false)
->required(),
])
->columns(1),
])
])
])->statePath('data');
}
public function getFormActions(): array
{
return [
Action::make('save')
->label('Zapisz')
->action('save'),
];
}
public function save(): void
{
$validatedData = $this->form->getState();
try {
$homepage = \App\Models\Homepage::first();
$homepage->fill($validatedData);
$homepage->save();
Notification::make()
->title('Sukces!')
->body('Rekord został zapisany pomyślnie.')
->success()
->send();
} catch (\Exception $e) {
Notification::make()
->title('Błąd!')
->body('Wystąpił problem podczas zapisywania rekordu: ' . $e->getMessage())
->danger()
->send();
}
}
}

View File

@@ -0,0 +1,103 @@
<?php
namespace App\Filament\Pages;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Pages\Page;
use Filament\Actions\Action;
use Filament\Notifications\Notification;
use Filament\Forms\Contracts\HasForms;
use Filament\Forms\Concerns\InteractsWithForms;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Components\Builder;
use Filament\Forms\Components\Toggle;
use Filament\Forms\Components\Card;
use Filament\Support\Enums\MaxWidth;
use Filament\Forms\Components\RichEditor;
use Filament\Forms\Components\Select;
class Location extends Page implements HasForms
{
use InteractsWithForms;
public static function canAccess(): bool
{
return auth()->user()->can('manage_location') || auth()->user()->can('admin');
}
protected static ?string $navigationIcon = 'heroicon-o-map-pin';
protected static ?string $navigationGroup = 'Pozostałe';
protected static ?string $title = 'Mapa budynków';
protected static ?int $navigationSort = 2;
protected static string $view = 'filament.pages.custom-edit-page';
public function getMaxContentWidth(): MaxWidth
{
return MaxWidth::FourExtraLarge;
}
public ?array $data = [];
public function mount(): void
{
$firstRecord = \App\Models\Location::first();
if ($firstRecord) {
$this->data = $firstRecord->toArray();
$this->form->fill($this->data);
}
}
public function form(Form $form): Form
{
return $form->schema([
Card::make()
->schema([
Select::make('photo_id')
->label('Powiązane zdjęcie')
->options(function () {
return \App\Models\Photo::all()->pluck('image_name', 'id');
})
->nullable()
->default(null)
->searchable()
->preload()
->reactive(),
]),
])->statePath('data');
}
public function getFormActions(): array
{
return [
Action::make('save')
->label('Zapisz')
->action('save'),
];
}
public function save(): void
{
$validatedData = $this->form->getState();
try {
$location = \App\Models\Location::first();
$location->fill($validatedData);
$location->save();
Notification::make()
->title('Sukces!')
->body('Rekord został zapisany pomyślnie.')
->success()
->send();
} catch (\Exception $e) {
Notification::make()
->title('Błąd!')
->body('Wystąpił problem podczas zapisywania rekordu: ' . $e->getMessage())
->danger()
->send();
}
}
}

View File

@@ -0,0 +1,103 @@
<?php
namespace App\Filament\Pages;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Pages\Page;
use Filament\Actions\Action;
use Filament\Notifications\Notification;
use Filament\Forms\Contracts\HasForms;
use Filament\Forms\Concerns\InteractsWithForms;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Components\Builder;
use Filament\Forms\Components\Toggle;
use Filament\Forms\Components\Card;
use Filament\Support\Enums\MaxWidth;
use Filament\Forms\Components\RichEditor;
use Filament\Forms\Components\Select;
class Price extends Page implements HasForms
{
use InteractsWithForms;
public static function canAccess(): bool
{
return auth()->user()->can('manage_prices') || auth()->user()->can('admin');
}
protected static ?string $navigationIcon = 'heroicon-o-banknotes';
protected static ?string $navigationGroup = 'Pozostałe';
protected static ?string $title = 'Cennik badań';
protected static ?int $navigationSort = 1;
protected static string $view = 'filament.pages.custom-edit-page';
public function getMaxContentWidth(): MaxWidth
{
return MaxWidth::FourExtraLarge;
}
public ?array $data = [];
public function mount(): void
{
$firstRecord = \App\Models\Price::first();
if ($firstRecord) {
$this->data = $firstRecord->toArray();
$this->form->fill($this->data);
}
}
public function form(Form $form): Form
{
return $form->schema([
Card::make()
->schema([
Select::make('attachment_id')
->label('Powiązany załącznik')
->options(function () {
return \App\Models\Attachment::all()->pluck('file_name', 'id');
})
->nullable()
->default(null)
->searchable()
->preload()
->reactive(),
]),
])->statePath('data');
}
public function getFormActions(): array
{
return [
Action::make('save')
->label('Zapisz')
->action('save'),
];
}
public function save(): void
{
$validatedData = $this->form->getState();
try {
$price = \App\Models\Price::first();
$price->fill($validatedData);
$price->save();
Notification::make()
->title('Sukces!')
->body('Rekord został zapisany pomyślnie.')
->success()
->send();
} catch (\Exception $e) {
Notification::make()
->title('Błąd!')
->body('Wystąpił problem podczas zapisywania rekordu: ' . $e->getMessage())
->danger()
->send();
}
}
}

View File

@@ -0,0 +1,175 @@
<?php
namespace App\Filament\Resources;
use App\Filament\Resources\ArticleNewsResource\Pages;
use App\Filament\Resources\ArticleNewsResource\RelationManagers;
use App\Models\ArticleNews;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
use Filament\Forms\Components\Card;
use Filament\Forms\Set;
use Illuminate\Support\Str;
use Filament\Forms\Components\Grid;
use Filament\Forms\Components\Select;
class ArticleNewsResource extends Resource
{
public static function canAccess(): bool
{
return auth()->user()->can('manage_news') || auth()->user()->can('admin');
}
protected static ?string $model = ArticleNews::class;
protected static ?string $navigationGroup = 'Ogłoszenia';
protected static ?string $navigationIcon = 'heroicon-o-newspaper';
protected static ?string $modelLabel = 'Artykuł';
protected static ?string $pluralModelLabel = 'Aktualności';
protected static ?int $navigationSort = 1;
public static function form(Form $form): Form
{
return $form
->schema([
Grid::make()
->schema([
Card::make()
->schema([
Forms\Components\TextInput::make('title')
->label('Tytuł')
->required()
->maxLength(2048)
->live(onBlur: true)
->afterStateUpdated(function (Set $set, ?string $state) {
$set('slug', Str::slug($state));
}),
Forms\Components\TextInput::make('slug')
->label('Przyjazny link')
->required()
->maxLength(2048),
Forms\Components\DateTimePicker::make('published_at')
->label('Data publikacji')
->native(false)
->displayFormat('d.m.Y')
->closeOnDateSelection()
->timezone('Europe/Warsaw')
->default(now())
->required(),
Forms\Components\FileUpload::make('thumbnail')
->label('Obraz')
->image()
->imageEditor()
->disk('public')
->directory('news-thumbnails')
->default(null),
Forms\Components\RichEditor::make('body')
->label('Treść')
->required()
->fileAttachmentsDisk('public')
->fileAttachmentsDirectory('news-content')
->fileAttachmentsVisibility('private')
->columnSpanFull(),
Forms\Components\Toggle::make('active')
->label('Aktywny')
->required(),
])
])->columnSpan(8),
Grid::make()
->schema([
Card::make()
->schema([
Select::make('attachments')
->multiple()
->required()
->label('Przypięte załączniki')
->nullable()
->placeholder('Wybierz załączniki')
->searchable()
->preload()
->reactive()
->relationship('attachments', 'file_name'),
]),
Card::make()
->schema([
Select::make('photos')
->multiple()
->required()
->label('Przypięte zdjęcia')
->nullable()
->placeholder('Wybierz zdjęcia')
->searchable()
->preload()
->reactive()
->relationship('photos', 'image_name'),
]),
])->columnSpan(8),
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
Tables\Columns\TextColumn::make('title')
->label('Tytuł')
->searchable()
->limit(35)
->tooltip(function (Tables\Columns\TextColumn $column): ?string {
$state = $column->getState();
if (strlen($state) <= 35) {
return null;
}
return $state;
}),
Tables\Columns\ImageColumn::make('thumbnail')
->label('Obraz')
->searchable(),
Tables\Columns\IconColumn::make('active')
->label('Aktywny')
->boolean(),
Tables\Columns\TextColumn::make('published_at')
->label('Data publikacji')
->dateTime()
->sortable(),
])
->defaultSort('published_at', 'desc')
->description('Aktualności dostępne pod /aktualnosci i /aktualnosci/slug')
->filters([
//
])
->actions([
Tables\Actions\ViewAction::make(),
Tables\Actions\EditAction::make(),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
]),
]);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => Pages\ListArticleNews::route('/'),
'create' => Pages\CreateArticleNews::route('/create'),
'view' => Pages\ViewArticleNews::route('/{record}'),
'edit' => Pages\EditArticleNews::route('/{record}/edit'),
];
}
}

View File

@@ -0,0 +1,18 @@
<?php
namespace App\Filament\Resources\ArticleNewsResource\Pages;
use App\Filament\Resources\ArticleNewsResource;
use Filament\Actions;
use Filament\Resources\Pages\CreateRecord;
class CreateArticleNews extends CreateRecord
{
protected static string $resource = ArticleNewsResource::class;
protected function mutateFormDataBeforeCreate(array $data): array
{
$data['user_id'] = auth()->id();
return $data;
}
}

View File

@@ -0,0 +1,20 @@
<?php
namespace App\Filament\Resources\ArticleNewsResource\Pages;
use App\Filament\Resources\ArticleNewsResource;
use Filament\Actions;
use Filament\Resources\Pages\EditRecord;
class EditArticleNews extends EditRecord
{
protected static string $resource = ArticleNewsResource::class;
protected function getHeaderActions(): array
{
return [
Actions\ViewAction::make(),
Actions\DeleteAction::make(),
];
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\ArticleNewsResource\Pages;
use App\Filament\Resources\ArticleNewsResource;
use Filament\Actions;
use Filament\Resources\Pages\ListRecords;
class ListArticleNews extends ListRecords
{
protected static string $resource = ArticleNewsResource::class;
protected function getHeaderActions(): array
{
return [
Actions\CreateAction::make(),
];
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\ArticleNewsResource\Pages;
use App\Filament\Resources\ArticleNewsResource;
use Filament\Actions;
use Filament\Resources\Pages\ViewRecord;
class ViewArticleNews extends ViewRecord
{
protected static string $resource = ArticleNewsResource::class;
protected function getHeaderActions(): array
{
return [
Actions\EditAction::make(),
];
}
}

View File

@@ -0,0 +1,299 @@
<?php
namespace App\Filament\Resources;
use App\Filament\Resources\ArticleResource\Pages;
use App\Filament\Resources\ArticleResource\RelationManagers;
use App\Models\Article;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\SoftDeletingScope;
use Filament\Forms\Set;
use Illuminate\Support\Str;
use Filament\Forms\Components\Card;
use Filament\Forms\Components\Grid;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Components\RichEditor;
use Filament\Forms\Components\DateTimePicker;
use Filament\Forms\Components\Toggle;
use Filament\Forms\Components\FileUpload;
use Filament\Forms\Components\Hidden;
use Filament\Forms\Components\Repeater;
use Filament\Forms\Components\Builder;
use Filament\Forms\Components\Textarea;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Columns\ImageColumn;
use Filament\Tables\Columns\IconColumn;
use App\Models\Attachment;
use App\Models\Photo;
use Illuminate\Support\Facades\Storage;
class ArticleResource extends Resource
{
public static function canAccess(): bool
{
return auth()->user()->can('manage_articles') || auth()->user()->can('admin');
}
protected static ?string $model = Article::class;
protected static ?string $navigationGroup = 'Treści';
protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack';
protected static ?string $modelLabel = 'Artykuł / Odnośnik';
protected static ?string $pluralModelLabel = 'Artykuły / Odnośniki';
protected static ?int $navigationSort = 1;
protected static ?array $articleTypes = ['article', 'article-with-map'];
public static function form(Form $form): Form
{
return $form
->extraAttributes(['style' => 'gap:0.5rem'])
->schema([
Card::make()
->schema([
// SELECT TYPE
Select::make('type')
->label("Rodzaj artykułu")
->required()
->default('article')
->options([
'article' => 'Artykuł',
'article-with-map' => 'Artykuł z mapą lokalizacyjną',
'link' => 'Odnośnik',
])
->reactive()
->afterStateUpdated(function (callable $set, $state) {
if ($state === 'link') {
$set('slug', null);
$set('body', null);
$set('active', false);
$set('external', false);
$set('thumbnail', null);
$set('attachments', null);
$set('photos', null);
$set('employees', null);
$set('additional_body', null);
$set('map_body', null);
} elseif (in_array($state, static::$articleTypes)) {
$set('body', null);
$set('active', false);
$set('external', false);
$set('attachments', null);
$set('photos', null);
$set('employees', null);
$set('additional_body', null);
$set('map_body', null);
}
}),
// END SELECT TYPE
// LINK TYPE
Card::make()
->hidden(fn ($get): bool => $get('type') != 'link')
->schema([
TextInput::make('title')
->label('Tytuł')
->required()
->maxLength(2048),
TextInput::make('slug')
->label('Ścieżka lub URL (np. /aktualnosci lub https://szpital.oborniki.info)')
->required()
->maxLength(2048),
Select::make('categories')
->multiple()
->label('Kategorie')
->nullable()
->placeholder('Wybierz kategorię')
->searchable()
->preload()
->reactive()
->relationship('categories', 'title'),
DateTimePicker::make('published_at')
->label('Data publikacji')
->native(false)
->displayFormat('d.m.Y')
->closeOnDateSelection()
->timezone('Europe/Warsaw'),
Grid::make()
->schema([
Toggle::make('active')
->label('Aktywny')
->required(),
Toggle::make('external')
->label('Otwieraj w nowej karcie')
->required(),
]),
]),
// END LINK TYPE
// ARTICLE TYPE
Grid::make()
->hidden(fn ($get): bool => !in_array($get('type'), static::$articleTypes))
->schema([
TextInput::make('title')
->label('Tytuł')
->required()
->maxLength(2048)
//->reactive() // this works without waiting but very slowly
//->live(debounce: 500) // wait 500 ms before update
->live(onBlur: true) // Update only after focus on other element
->afterStateUpdated(function (Set $set, ?string $state) {
$set('slug', Str::slug($state));
}),
TextInput::make('slug')
->label('Przyjazny link')
->required()
->maxLength(2048),
]),
RichEditor::make('body')
->label('Treść')
->hidden(fn ($get): bool => !in_array($get('type'), static::$articleTypes))
->required()
->fileAttachmentsDisk('public')
->fileAttachmentsDirectory('article-content')
->columnSpanFull(),
RichEditor::make('additional_body')
->label('Dodatkowa treść')
->hidden(fn ($get): bool => !in_array($get('type'), static::$articleTypes))
->fileAttachmentsDisk('public')
->fileAttachmentsDirectory('article-additional-content')
->columnSpanFull(),
RichEditor::make('map_body')
->label('Lokalizacja (widoczna pod mapą budynków)')
->hidden(fn ($get): bool => $get('type') != 'article-with-map')
->required()
->fileAttachmentsDisk('public')
->fileAttachmentsDirectory('article-map-content')
->columnSpanFull(),
Toggle::make('active')
->label('Aktywny')
->hidden(fn ($get): bool => !in_array($get('type'), static::$articleTypes))
->required(),
DateTimePicker::make('published_at')
->hidden(fn ($get): bool => !in_array($get('type'), static::$articleTypes))
->label('Data publikacji')
->native(false)
->displayFormat('d.m.Y')
->closeOnDateSelection()
->timezone('Europe/Warsaw'),
])->columnSpan(8),
Card::make()
->hidden(fn ($get): bool => !in_array($get('type'), static::$articleTypes))
->schema([
FileUpload::make('thumbnail')
->hidden(fn ($get): bool => $get('type') != 'article')
->label('Obraz')
->disk('public')
->directory('thumbnails')
->default(null),
Select::make('categories')
->multiple()
->label('Kategorie')
->nullable()
->placeholder('Wybierz kategorię')
->searchable()
->preload()
->reactive()
->relationship('categories', 'title'),
])->columnSpan(4),
Grid::make()
->hidden(fn ($get): bool => !in_array($get('type'), static::$articleTypes))
->schema([
Card::make()
->schema([
Select::make('attachments')
->multiple()
->required()
->label('Przypięte załączniki')
->nullable()
->placeholder('Wybierz załączniki')
->searchable()
->preload()
->reactive()
->relationship('attachments', 'file_name'),
]),
Card::make()
->schema([
Select::make('photos')
->multiple()
->required()
->label('Przypięte zdjęcia')
->nullable()
->placeholder('Wybierz zdjęcia')
->searchable()
->preload()
->reactive()
->relationship('photos', 'image_name'),
]),
])->columnSpan(8),
// END ARTICLE TYPE
])->columns(12);
}
public static function table(Table $table): Table
{
return $table
->columns([
TextColumn::make('type')
->label('Rodzaj')
->formatStateUsing(function ($state) {
return $state === 'article' ? 'Artykuł' : ($state === 'article-with-map' ? 'Artykuł z mapą' : 'Odnośnik');
}),
TextColumn::make('title')
->label('Tytuł')
->searchable()
->sortable(),
ImageColumn::make('thumbnail')
->label('Obraz'),
IconColumn::make('active')
->label('Aktywny')
->boolean(),
TextColumn::make('published_at')
->label('Data publikacji')
->dateTime('d.m.Y')
->sortable(),
TextColumn::make('user.name')
->label('Twórca')
->numeric(),
TextColumn::make('updated_at')
->label('Data aktualizacji')
->dateTime('d.m.Y')
->toggleable(isToggledHiddenByDefault: true),
])
->defaultSort('updated_at', 'desc')
->description('W tym miejscu możesz dodać, edytować oraz usuwać artykuły oraz odnośniki.')
->filters([
//
])
->actions([
Tables\Actions\ViewAction::make(),
Tables\Actions\EditAction::make(),
Tables\Actions\DeleteAction::make(),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
]),
]);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => Pages\ListArticles::route('/'),
'create' => Pages\CreateArticle::route('/create'),
'view' => Pages\ViewArticle::route('/{record}'),
'edit' => Pages\EditArticle::route('/{record}/edit'),
];
}
}

View File

@@ -0,0 +1,18 @@
<?php
namespace App\Filament\Resources\ArticleResource\Pages;
use App\Filament\Resources\ArticleResource;
use Filament\Actions;
use Filament\Resources\Pages\CreateRecord;
class CreateArticle extends CreateRecord
{
protected static string $resource = ArticleResource::class;
protected function mutateFormDataBeforeCreate(array $data): array
{
$data['user_id'] = auth()->id();
return $data;
}
}

View File

@@ -0,0 +1,20 @@
<?php
namespace App\Filament\Resources\ArticleResource\Pages;
use App\Filament\Resources\ArticleResource;
use Filament\Actions;
use Filament\Resources\Pages\EditRecord;
class EditArticle extends EditRecord
{
protected static string $resource = ArticleResource::class;
protected function getHeaderActions(): array
{
return [
Actions\ViewAction::make(),
Actions\DeleteAction::make(),
];
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\ArticleResource\Pages;
use App\Filament\Resources\ArticleResource;
use Filament\Actions;
use Filament\Resources\Pages\ListRecords;
class ListArticles extends ListRecords
{
protected static string $resource = ArticleResource::class;
protected function getHeaderActions(): array
{
return [
Actions\CreateAction::make(),
];
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\ArticleResource\Pages;
use App\Filament\Resources\ArticleResource;
use Filament\Actions;
use Filament\Resources\Pages\ViewRecord;
class ViewArticle extends ViewRecord
{
protected static string $resource = ArticleResource::class;
protected function getHeaderActions(): array
{
return [
Actions\EditAction::make(),
];
}
}

View File

@@ -0,0 +1,142 @@
<?php
namespace App\Filament\Resources;
use App\Filament\Resources\AttachmentResource\Pages;
use App\Filament\Resources\AttachmentResource\RelationManagers;
use App\Models\Attachment;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
use Filament\Forms\Components\FileUpload;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Components\Grid;
use Filament\Forms\Components\Card;
use Filament\Forms\Components\Repeater;
use Filament\Forms\Components\Select;
use App\Models\Article;
class AttachmentResource extends Resource
{
public static function canAccess(): bool
{
return auth()->user()->can('manage_attachments') || auth()->user()->can('admin');
}
protected static ?string $model = Attachment::class;
protected static ?string $navigationIcon = 'heroicon-o-paper-clip';
protected static ?string $navigationGroup = 'Ogólne';
protected static ?string $modelLabel = 'Załącznik';
protected static ?string $pluralModelLabel = 'Załączniki';
protected static ?int $navigationSort = 2;
public static function form(Form $form): Form
{
return $form
->schema([
Grid::make()
->schema([
Card::make()
->schema([
FileUpload::make('file_path')
->disk('public')
->directory('attachments')
->label('Załącznik')
->required(),
TextInput::make('file_name')
->label('Nazwa')
->required(),
]),
Card::make()
->schema([
Select::make('articles')
->multiple()
->label('Przypięte artykuły')
->nullable()
->placeholder('Wybierz artykuły')
->searchable()
->preload()
->reactive()
->relationship('articles', 'title', fn ($query) => $query->whereIn('type', ['article', 'article-with-map'])),
]),
Card::make()
->schema([
Select::make('articlesNews')
->multiple()
->label('Przypięte aktualności')
->nullable()
->placeholder('Wybierz aktualności')
->searchable()
->preload()
->reactive()
->relationship('articlesNews', 'title'),
]),
Card::make()
->schema([
Select::make('jobOffers')
->multiple()
->label('Przypięte oferty pracy')
->nullable()
->placeholder('Wybierz oferty pracy')
->searchable()
->preload()
->reactive()
->relationship('jobOffers', 'title'),
]),
])->columnSpan(8),
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
Tables\Columns\TextColumn::make('file_name')->label('Nazwa')
->limit(35)
->tooltip(function (Tables\Columns\TextColumn $column): ?string {
$state = $column->getState();
if (strlen($state) <= 35) {
return null;
}
return $state;
}),
Tables\Columns\TextColumn::make('file_path')->label('Załącznik'),
])
->filters([
//
])
->actions([
Tables\Actions\ViewAction::make(),
Tables\Actions\EditAction::make(),
Tables\Actions\DeleteAction::make(),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
]),
]);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => Pages\ListAttachments::route('/'),
'create' => Pages\CreateAttachment::route('/create'),
'view' => Pages\ViewAttachment::route('/{record}'),
'edit' => Pages\EditAttachment::route('/{record}/edit'),
];
}
}

View File

@@ -0,0 +1,12 @@
<?php
namespace App\Filament\Resources\AttachmentResource\Pages;
use App\Filament\Resources\AttachmentResource;
use Filament\Actions;
use Filament\Resources\Pages\CreateRecord;
class CreateAttachment extends CreateRecord
{
protected static string $resource = AttachmentResource::class;
}

View File

@@ -0,0 +1,20 @@
<?php
namespace App\Filament\Resources\AttachmentResource\Pages;
use App\Filament\Resources\AttachmentResource;
use Filament\Actions;
use Filament\Resources\Pages\EditRecord;
class EditAttachment extends EditRecord
{
protected static string $resource = AttachmentResource::class;
protected function getHeaderActions(): array
{
return [
Actions\ViewAction::make(),
Actions\DeleteAction::make(),
];
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\AttachmentResource\Pages;
use App\Filament\Resources\AttachmentResource;
use Filament\Actions;
use Filament\Resources\Pages\ListRecords;
class ListAttachments extends ListRecords
{
protected static string $resource = AttachmentResource::class;
protected function getHeaderActions(): array
{
return [
Actions\CreateAction::make(),
];
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\AttachmentResource\Pages;
use App\Filament\Resources\AttachmentResource;
use Filament\Actions;
use Filament\Resources\Pages\ViewRecord;
class ViewAttachment extends ViewRecord
{
protected static string $resource = AttachmentResource::class;
protected function getHeaderActions(): array
{
return [
Actions\EditAction::make(),
];
}
}

View File

@@ -0,0 +1,128 @@
<?php
namespace App\Filament\Resources;
use App\Filament\Resources\CategoryResource\Pages;
use App\Filament\Resources\CategoryResource\RelationManagers;
use App\Models\Category;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
use Filament\Forms\Set;
use Illuminate\Support\Str;
use Filament\Forms\Components\Repeater;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Components\Hidden;
use App\Models\Article;
class CategoryResource extends Resource
{
public static function canAccess(): bool
{
return auth()->user()->can('manage_categories') || auth()->user()->can('admin');
}
protected static ?string $model = Category::class;
protected static ?string $navigationGroup = 'Treści';
protected static ?string $navigationIcon = 'heroicon-o-hashtag';
protected static ?string $modelLabel = 'Kategoria';
protected static ?string $pluralModelLabel = 'Kategorie';
protected static ?int $navigationSort = 2;
public static function form(Form $form): Form
{
return $form
->schema([
TextInput::make('title')
->label('Tytuł')
->required()
->maxLength(2048)
->live(onBlur: true)
->afterStateUpdated(function (Set $set, ?string $state) {
$set('slug', Str::slug($state));
}),
TextInput::make('slug')
->label('Przyjazny link')
->required()
->maxLength(2048),
Repeater::make('articles')
->relationship('articles')
->schema([
Select::make('id')
->label('Artykuł / Odnośnik')
->options(Article::all()->pluck('title', 'id'))
->required()
->searchable()
->preload()
->reactive()
->disabled(true)
->default(null),
])
->orderColumn('sort_order')
->reorderableWithButtons()
->label('Artykuły w tej kategorii')
->visibleOn('edit')
->hidden(fn ($get) => empty($get('articles')))
->defaultItems(0)
->collapsible(false)
->deletable(false)
->addable(false)
->addActionLabel('Dodaj artykuł / odnośnik')
->itemLabel(fn (array $state): ?string => $state['id'] ? Article::find($state['id'])?->title : null)
->afterStateUpdated(function ($state, $record) {
if (!$record) return;
$state = collect($state)->values()->all();
foreach ($state as $index => $item) {
if (isset($item['id'])) {
\DB::table('category_article')
->where('category_id', $record->id)
->where('article_id', $item['id'])
->update(['sort_order' => $index]);
}
}
}),
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
Tables\Columns\TextColumn::make('title')
->label('Tytuł')
->searchable(),
Tables\Columns\TextColumn::make('updated_at')
->label('Data aktualizacji')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
->description('W tym miejscu możesz dodawać oraz usuwać kategorie, w trakcie edycjii możliwa jest zmiana kolejności artykułów.')
->filters([
//
])
->actions([
Tables\Actions\EditAction::make(),
Tables\Actions\DeleteAction::make(),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
]),
]);
}
public static function getPages(): array
{
return [
'index' => Pages\ManageCategories::route('/'),
];
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\CategoryResource\Pages;
use App\Filament\Resources\CategoryResource;
use Filament\Actions;
use Filament\Resources\Pages\ManageRecords;
class ManageCategories extends ManageRecords
{
protected static string $resource = CategoryResource::class;
protected function getHeaderActions(): array
{
return [
Actions\CreateAction::make(),
];
}
}

View File

@@ -0,0 +1,134 @@
<?php
namespace App\Filament\Resources;
use App\Filament\Resources\DietResource\Pages;
use App\Filament\Resources\DietResource\RelationManagers;
use App\Models\Diet;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
use Filament\Forms\Components\RichEditor;
use Filament\Forms\Components\Card;
class DietResource extends Resource
{
public static function canAccess(): bool
{
return auth()->user()->can('manage_diets') || auth()->user()->can('admin');
}
protected static ?string $model = Diet::class;
protected static ?string $navigationIcon = 'heroicon-o-building-storefront';
protected static ?string $navigationGroup = 'Pilotaż "Dobry posiłek"';
protected static ?string $modelLabel = 'Dieta';
protected static ?string $pluralModelLabel = 'Diety';
public static function form(Form $form): Form
{
return $form
->schema([
Card::make()
->schema([
Forms\Components\DateTimePicker::make('published_at')
->label('Data diety')
->native(false)
->displayFormat('d.m.Y')
->closeOnDateSelection()
->timezone('Europe/Warsaw')
->default(now())
->required(),
Forms\Components\TextInput::make('name')
->label('Nazwa')
->required()
->maxLength(2048),
Forms\Components\FileUpload::make('breakfast_photo')
->image()
->imageEditor()
->label('Zdjęcie śniadania')
->disk('public')
->directory('diets-photos')
->default(null),
Forms\Components\RichEditor::make('breakfast_body')
->label('Treść śniadania')
->columnSpanFull(),
Forms\Components\FileUpload::make('lunch_photo')
->image()
->imageEditor()
->label('Zdjęcie obiadu')
->disk('public')
->directory('diets-photos')
->default(null),
Forms\Components\RichEditor::make('lunch_body')
->label('Treść obiadu')
->columnSpanFull(),
Forms\Components\FileUpload::make('diet_attachment')
->label('Załącznik')
->disk('public')
->directory('diets-attachments')
->default(null),
Forms\Components\Toggle::make('active')
->label('Aktywny')
->required(),
])
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
Tables\Columns\TextColumn::make('name')
->label('Nazwa')
->searchable(),
Tables\Columns\ImageColumn::make('breakfast_photo')
->label('Zdjęcie śniadania')
->searchable(),
Tables\Columns\ImageColumn::make('lunch_photo')
->label('Zdjęcie obiadu')
->searchable(),
Tables\Columns\IconColumn::make('active')
->label('Aktywny')
->boolean(),
Tables\Columns\TextColumn::make('published_at')
->label('Data diety')
->dateTime('d.m.Y')
->sortable(),
])
->defaultSort('published_at', 'desc')
->defaultPaginationPageOption(20)
->filters([
//
])
->actions([
Tables\Actions\ViewAction::make(),
Tables\Actions\EditAction::make(),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
]),
]);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => Pages\ListDiets::route('/'),
'create' => Pages\CreateDiet::route('/create'),
'view' => Pages\ViewDiet::route('/{record}'),
'edit' => Pages\EditDiet::route('/{record}/edit'),
];
}
}

View File

@@ -0,0 +1,18 @@
<?php
namespace App\Filament\Resources\DietResource\Pages;
use App\Filament\Resources\DietResource;
use Filament\Actions;
use Filament\Resources\Pages\CreateRecord;
class CreateDiet extends CreateRecord
{
protected static string $resource = DietResource::class;
protected function mutateFormDataBeforeCreate(array $data): array
{
$data['user_id'] = auth()->id();
return $data;
}
}

View File

@@ -0,0 +1,20 @@
<?php
namespace App\Filament\Resources\DietResource\Pages;
use App\Filament\Resources\DietResource;
use Filament\Actions;
use Filament\Resources\Pages\EditRecord;
class EditDiet extends EditRecord
{
protected static string $resource = DietResource::class;
protected function getHeaderActions(): array
{
return [
Actions\ViewAction::make(),
Actions\DeleteAction::make(),
];
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\DietResource\Pages;
use App\Filament\Resources\DietResource;
use Filament\Actions;
use Filament\Resources\Pages\ListRecords;
class ListDiets extends ListRecords
{
protected static string $resource = DietResource::class;
protected function getHeaderActions(): array
{
return [
Actions\CreateAction::make(),
];
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\DietResource\Pages;
use App\Filament\Resources\DietResource;
use Filament\Actions;
use Filament\Resources\Pages\ViewRecord;
class ViewDiet extends ViewRecord
{
protected static string $resource = DietResource::class;
protected function getHeaderActions(): array
{
return [
Actions\EditAction::make(),
];
}
}

View File

@@ -0,0 +1,133 @@
<?php
namespace App\Filament\Resources;
use App\Filament\Resources\EmployeeResource\Pages;
use App\Filament\Resources\EmployeeResource\RelationManagers;
use App\Models\Employee;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\SoftDeletingScope;
use Filament\Forms\Components\Builder;
use Filament\Forms\Components\Card;
use Filament\Forms\Components\TextInput;
use Filament\Tables\Actions\Action;
use Illuminate\Support\Str;
use Filament\Forms\Set;
class EmployeeResource extends Resource
{
public static function canAccess(): bool
{
return auth()->user()->can('manage_employees') || auth()->user()->can('admin');
}
protected static ?string $model = Employee::class;
protected static ?string $navigationIcon = 'heroicon-o-building-library';
protected static ?string $navigationGroup = 'Pozostałe';
protected static ?string $modelLabel = 'Pracownicy';
protected static ?string $pluralModelLabel = 'Pracownicy';
protected static ?int $navigationSort = 3;
public static function form(Form $form): Form
{
return $form
->schema([
Card::make()
->schema([
TextInput::make('section')
->label('Sekcja')
->required()
->maxLength(2048)
->live(onBlur: true)
->afterStateUpdated(function (Set $set, ?string $state) {
$set('slug', Str::slug($state));
}),
TextInput::make('slug')
->label('Przyjazny link')
->required()
->maxLength(2048),
]),
Card::make()
->schema([
Builder::make('employees')
->label('Pracownicy')
->blocks([
Builder\Block::make('employee')
->label('Pracownik')
->schema([
TextInput::make('other-section')
->label('Inna sekcja'),
TextInput::make('title')
->label('Stopień naukowy'),
TextInput::make('first_name')
->label('Imię')
->required(),
TextInput::make('last_name')
->label('Nazwisko')
->required(),
TextInput::make('position')
->label('Stanowisko')
->required(),
TextInput::make('email')
->label('E-mail'),
TextInput::make('phone')
->label('Telefon'),
])
->columns(2),
])
])
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
Tables\Columns\TextColumn::make('section')
->label('Sekcja')
->searchable(),
])
->defaultSort('sort_order')
->description('W tym miejscu możesz dodać, edytować oraz usuwać sekcje z administracją. Po utworzeniu sekcji pamiętaj o dodaniu jej do nawigacji jako odnośnika. Każda sekcja dostępna jest pod linkiem /administracja/slug')
->reorderable('sort_order')
->reorderRecordsTriggerAction(
fn (Action $action, bool $isReordering) => $action
->button()
->label($isReordering ? 'Wyłącz zmianę kolejności' : 'Zmień kolejność'),
)
->filters([
//
])
->actions([
Tables\Actions\ViewAction::make(),
Tables\Actions\EditAction::make(),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
]),
]);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => Pages\ListEmployees::route('/'),
'create' => Pages\CreateEmployee::route('/create'),
'view' => Pages\ViewEmployee::route('/{record}'),
'edit' => Pages\EditEmployee::route('/{record}/edit'),
];
}
}

View File

@@ -0,0 +1,12 @@
<?php
namespace App\Filament\Resources\EmployeeResource\Pages;
use App\Filament\Resources\EmployeeResource;
use Filament\Actions;
use Filament\Resources\Pages\CreateRecord;
class CreateEmployee extends CreateRecord
{
protected static string $resource = EmployeeResource::class;
}

View File

@@ -0,0 +1,20 @@
<?php
namespace App\Filament\Resources\EmployeeResource\Pages;
use App\Filament\Resources\EmployeeResource;
use Filament\Actions;
use Filament\Resources\Pages\EditRecord;
class EditEmployee extends EditRecord
{
protected static string $resource = EmployeeResource::class;
protected function getHeaderActions(): array
{
return [
Actions\ViewAction::make(),
Actions\DeleteAction::make(),
];
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\EmployeeResource\Pages;
use App\Filament\Resources\EmployeeResource;
use Filament\Actions;
use Filament\Resources\Pages\ListRecords;
class ListEmployees extends ListRecords
{
protected static string $resource = EmployeeResource::class;
protected function getHeaderActions(): array
{
return [
Actions\CreateAction::make(),
];
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\EmployeeResource\Pages;
use App\Filament\Resources\EmployeeResource;
use Filament\Actions;
use Filament\Resources\Pages\ViewRecord;
class ViewEmployee extends ViewRecord
{
protected static string $resource = EmployeeResource::class;
protected function getHeaderActions(): array
{
return [
Actions\EditAction::make(),
];
}
}

View File

@@ -0,0 +1,163 @@
<?php
namespace App\Filament\Resources;
use App\Filament\Resources\JobOffersResource\Pages;
use App\Filament\Resources\JobOffersResource\RelationManagers;
use App\Models\JobOffers;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
use Filament\Forms\Components\Card;
use Filament\Forms\Components\Grid;
use Filament\Forms\Set;
use Illuminate\Support\Str;
use Filament\Forms\Components\Select;
class JobOffersResource extends Resource
{
public static function canAccess(): bool
{
return auth()->user()->can('manage_job_offers') || auth()->user()->can('admin');
}
protected static ?string $model = JobOffers::class;
protected static ?string $navigationGroup = 'Ogłoszenia';
protected static ?string $navigationIcon = 'heroicon-o-briefcase';
protected static ?string $modelLabel = 'Oferta pracy';
protected static ?string $pluralModelLabel = 'Oferty pracy';
protected static ?int $navigationSort = 2;
public static function form(Form $form): Form
{
return $form
->schema([
Grid::make()
->schema([
Card::make()
->schema([
Forms\Components\TextInput::make('title')
->label('Tytuł')
->required()
->maxLength(2048),
// ->live(onBlur: true)
// ->afterStateUpdated(function (Set $set, ?string $state) {
// $set('slug', Str::slug($state));
// }),
// Forms\Components\TextInput::make('slug')
// ->label('Przyjazny link')
// ->required()
// ->maxLength(2048),
Forms\Components\RichEditor::make('body')
->label('Treść')
->required()
->columnSpanFull(),
Forms\Components\Toggle::make('active')
->label('Aktywny')
->required(),
Forms\Components\DateTimePicker::make('published_at')
->label('Data publikacji')
->native(false)
->displayFormat('d.m.Y')
->closeOnDateSelection()
->timezone('Europe/Warsaw')
->default(now())
->required(),
])
])->columnSpan(8),
Grid::make()
->schema([
Card::make()
->schema([
Select::make('attachments')
->multiple()
->required()
->label('Przypięte załączniki')
->nullable()
->placeholder('Wybierz załączniki')
->searchable()
->preload()
->reactive()
->relationship('attachments', 'file_name'),
]),
// Card::make()
// ->schema([
// Select::make('photos')
// ->multiple()
// ->required()
// ->label('Pinned photos')
// ->nullable()
// ->placeholder('Select photos')
// ->searchable()
// ->preload()
// ->reactive()
// ->relationship('photos', 'image_name'),
// ]),
])->columnSpan(8),
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
Tables\Columns\TextColumn::make('title')
->label('Tytuł')
->limit(35)
->tooltip(function (Tables\Columns\TextColumn $column): ?string {
$state = $column->getState();
if (strlen($state) <= 35) {
return null;
}
return $state;
})
->searchable()
->sortable(),
Tables\Columns\IconColumn::make('active')
->label('Aktywny')
->boolean(),
Tables\Columns\TextColumn::make('published_at')
->label('Data publikacji')
->dateTime()
->sortable(),
])
->defaultSort('published_at', 'desc')
->description('Aktualne rekrutacje dostępne pod /oferty-pracy')
->filters([
//
])
->actions([
Tables\Actions\ViewAction::make(),
Tables\Actions\EditAction::make(),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
]),
]);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => Pages\ListJobOffers::route('/'),
'create' => Pages\CreateJobOffers::route('/create'),
'view' => Pages\ViewJobOffers::route('/{record}'),
'edit' => Pages\EditJobOffers::route('/{record}/edit'),
];
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\JobOffersResource\Pages;
use App\Filament\Resources\JobOffersResource;
use Filament\Actions;
use Filament\Resources\Pages\CreateRecord;
class CreateJobOffers extends CreateRecord
{
protected static string $resource = JobOffersResource::class;
protected function mutateFormDataBeforeCreate(array $data): array
{
$data['user_id'] = auth()->id();
$data['slug'] = '/empty';
return $data;
}
}

View File

@@ -0,0 +1,20 @@
<?php
namespace App\Filament\Resources\JobOffersResource\Pages;
use App\Filament\Resources\JobOffersResource;
use Filament\Actions;
use Filament\Resources\Pages\EditRecord;
class EditJobOffers extends EditRecord
{
protected static string $resource = JobOffersResource::class;
protected function getHeaderActions(): array
{
return [
Actions\ViewAction::make(),
Actions\DeleteAction::make(),
];
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\JobOffersResource\Pages;
use App\Filament\Resources\JobOffersResource;
use Filament\Actions;
use Filament\Resources\Pages\ListRecords;
class ListJobOffers extends ListRecords
{
protected static string $resource = JobOffersResource::class;
protected function getHeaderActions(): array
{
return [
Actions\CreateAction::make(),
];
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\JobOffersResource\Pages;
use App\Filament\Resources\JobOffersResource;
use Filament\Actions;
use Filament\Resources\Pages\ViewRecord;
class ViewJobOffers extends ViewRecord
{
protected static string $resource = JobOffersResource::class;
protected function getHeaderActions(): array
{
return [
Actions\EditAction::make(),
];
}
}

View File

@@ -0,0 +1,153 @@
<?php
namespace App\Filament\Resources;
use App\Filament\Resources\NavigationItemResource\Pages;
use App\Models\NavigationItem;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Table;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Tables\Columns\TextColumn;
use App\Models\Article;
use App\Models\Category;
use Filament\Tables\Actions\Action;
class NavigationItemResource extends Resource
{
public static function canAccess(): bool
{
return auth()->user()->can('manage_navigation') || auth()->user()->can('admin');
}
protected static ?string $model = NavigationItem::class;
protected static ?string $navigationIcon = 'heroicon-o-bars-3';
protected static ?string $navigationGroup = 'Ogólne';
protected static ?string $modelLabel = 'Nawigacja';
protected static ?string $pluralModelLabel = 'Nawigacja';
protected static ?int $navigationSort = 1;
public static function form(Form $form): Form
{
return $form
->schema([
TextInput::make('name')
->label('Nazwa (Opcjonalnie)')
->maxLength(255)
->default(null),
Select::make('navigable_type')
->label('Wybierz typ')
->default('Article')
->options([
'Article' => 'Artykuł / Odnośnik',
'Category' => 'Kategoria',
])
->reactive()
->afterStateUpdated(function (callable $set) {
$set('navigable_id', null);
})
->required(),
Select::make('navigable_id')
->label('Wybierz element')
->options(function ($get) {
if ($get('navigable_type') === 'Article') {
return Article::all()->mapWithKeys(function ($article) {
if ($article->type === 'link') {
return [$article->id => 'Odnośnik: ' . $article->title];
} else {
return [$article->id => 'Artykuł: ' . $article->title];
}
})->toArray();
} elseif ($get('navigable_type') === 'Category') {
return Category::all()->pluck('title', 'id')->mapWithKeys(function ($title, $id) {
return [$id => 'Kategoria: ' . $title];
})->toArray();
}
return [];
})
->reactive()
->searchable()
->required(),
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
TextColumn::make('name')
->getStateUsing(function ($record) {
if($record->name) return $record->name;
$type = $record->navigable_type;
$id = $record->navigable_id;
return match ($type) {
'Article' => Article::class::find($id)?->title ?? 'Artykuł / Odnośnik bez tytułu',
'Category' => Category::class::find($id)?->title ?? 'Kategoria bez tytułu',
default => $record->name,
};
})
->label('Nazwa')
->searchable(),
TextColumn::make('navigable_type')
->label('Typ')
->formatStateUsing(function ($record, $state) {
if($state === 'Article') {
$id = $record->navigable_id;
$type = Article::class::find($id)?->type;
if($type === 'link') {
return 'Odnośnik';
} else if($type === 'article') {
return 'Artykuł';
}
} else {
return 'Kategoria';
}
})
->searchable(),
])
->description('W tym miejscu możesz dodać Artykuł, Odnośnik lub Kategorię do nawigacji, możesz ustalać własną kolejność oraz nadawać niestandardowe nazwy.')
->reorderable('sort_order')
->defaultSort('sort_order')
->reorderRecordsTriggerAction(
fn (Action $action, bool $isReordering) => $action
->button()
->label($isReordering ? 'Wyłącz zmianę kolejności' : 'Zmień kolejność'),
)
->filters([
//
])
->actions([
Tables\Actions\ViewAction::make(),
Tables\Actions\EditAction::make(),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
]),
]);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => Pages\ListNavigationItems::route('/'),
'create' => Pages\CreateNavigationItem::route('/create'),
'view' => Pages\ViewNavigationItem::route('/{record}'),
'edit' => Pages\EditNavigationItem::route('/{record}/edit'),
];
}
}

View File

@@ -0,0 +1,12 @@
<?php
namespace App\Filament\Resources\NavigationItemResource\Pages;
use App\Filament\Resources\NavigationItemResource;
use Filament\Actions;
use Filament\Resources\Pages\CreateRecord;
class CreateNavigationItem extends CreateRecord
{
protected static string $resource = NavigationItemResource::class;
}

View File

@@ -0,0 +1,20 @@
<?php
namespace App\Filament\Resources\NavigationItemResource\Pages;
use App\Filament\Resources\NavigationItemResource;
use Filament\Actions;
use Filament\Resources\Pages\EditRecord;
class EditNavigationItem extends EditRecord
{
protected static string $resource = NavigationItemResource::class;
protected function getHeaderActions(): array
{
return [
Actions\ViewAction::make(),
Actions\DeleteAction::make(),
];
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\NavigationItemResource\Pages;
use App\Filament\Resources\NavigationItemResource;
use Filament\Actions;
use Filament\Resources\Pages\ListRecords;
class ListNavigationItems extends ListRecords
{
protected static string $resource = NavigationItemResource::class;
protected function getHeaderActions(): array
{
return [
Actions\CreateAction::make(),
];
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\NavigationItemResource\Pages;
use App\Filament\Resources\NavigationItemResource;
use Filament\Actions;
use Filament\Resources\Pages\ViewRecord;
class ViewNavigationItem extends ViewRecord
{
protected static string $resource = NavigationItemResource::class;
protected function getHeaderActions(): array
{
return [
Actions\EditAction::make(),
];
}
}

View File

@@ -0,0 +1,87 @@
<?php
namespace App\Filament\Resources;
use App\Filament\Resources\PermissionResource\Pages;
use App\Filament\Resources\PermissionResource\RelationManagers;
use Filament\Forms;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Form;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
use Spatie\Permission\Models\Permission;
class PermissionResource extends Resource
{
public static function canAccess(): bool
{
return auth()->user()->can('manage_permissions') || auth()->user()->can('admin');
}
protected static ?string $model = Permission::class;
protected static ?string $navigationIcon = 'heroicon-o-key';
protected static ?string $navigationGroup = 'Ustawienia';
protected static ?string $modelLabel = 'Uprawnienie';
protected static ?string $pluralModelLabel = 'Uprawnienia';
protected static ?int $navigationSort = 3;
public static function form(Form $form): Form
{
return $form
->schema([
Forms\Components\Section::make('Informacje o uprawnieniu')
->schema([
TextInput::make('name')
->label('Nazwa uprawnienia')
->required()
->maxLength(255)
->unique(ignoreRecord: true)
])
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
TextColumn::make('name')
->label('Nazwa uprawnienia')
->searchable(),
TextColumn::make('roles.name')
->label('Przypisane role')
->badge()
])
->filters([
//
])
->actions([
Tables\Actions\EditAction::make(),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
]),
]);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => Pages\ListPermissions::route('/'),
'create' => Pages\CreatePermission::route('/create'),
'edit' => Pages\EditPermission::route('/{record}/edit'),
];
}
}

View File

@@ -0,0 +1,12 @@
<?php
namespace App\Filament\Resources\PermissionResource\Pages;
use App\Filament\Resources\PermissionResource;
use Filament\Actions;
use Filament\Resources\Pages\CreateRecord;
class CreatePermission extends CreateRecord
{
protected static string $resource = PermissionResource::class;
}

View File

@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\PermissionResource\Pages;
use App\Filament\Resources\PermissionResource;
use Filament\Actions;
use Filament\Resources\Pages\EditRecord;
class EditPermission extends EditRecord
{
protected static string $resource = PermissionResource::class;
protected function getHeaderActions(): array
{
return [
Actions\DeleteAction::make(),
];
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\PermissionResource\Pages;
use App\Filament\Resources\PermissionResource;
use Filament\Actions;
use Filament\Resources\Pages\ListRecords;
class ListPermissions extends ListRecords
{
protected static string $resource = PermissionResource::class;
protected function getHeaderActions(): array
{
return [
Actions\CreateAction::make(),
];
}
}

View File

@@ -0,0 +1,138 @@
<?php
namespace App\Filament\Resources;
use App\Filament\Resources\PhotoResource\Pages;
use App\Filament\Resources\PhotoResource\RelationManagers;
use App\Models\Photo;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
use Filament\Forms\Components\FileUpload;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Components\Grid;
use Filament\Forms\Components\Card;
use Filament\Forms\Components\Repeater;
use Filament\Forms\Components\Select;
use App\Models\Article;
class PhotoResource extends Resource
{
public static function canAccess(): bool
{
return auth()->user()->can('manage_photos') || auth()->user()->can('admin');
}
protected static ?string $model = Photo::class;
protected static ?string $navigationIcon = 'heroicon-o-photo';
protected static ?string $navigationGroup = 'Ogólne';
protected static ?string $modelLabel = 'Zdjęcie';
protected static ?string $pluralModelLabel = 'Zdjęcia';
protected static ?int $navigationSort = 3;
public static function form(Form $form): Form
{
return $form
->schema([
Grid::make()
->schema([
Card::make()
->schema([
FileUpload::make('image_path')
->image()
->imageEditor()
->disk('public')
->directory('photos')
->label('Zdjęcie')
->required(),
TextInput::make('image_name')
->label('Nazwa')
->required(),
TextInput::make('image_desc')
->label('Opis (wykorzystywany w SEO)')
->required(),
]),
Card::make()
->schema([
Select::make('articles')
->multiple()
->label('Przypięte artykuły')
->nullable()
->placeholder('Wybierz artykuły')
->searchable()
->preload()
->reactive()
->relationship('articles', 'title', fn ($query) => $query->whereIn('type', ['article', 'article-with-map'])),
]),
Card::make()
->schema([
Select::make('articlesNews')
->multiple()
->label('Przypięte aktualności')
->nullable()
->placeholder('Wybierz aktualności')
->searchable()
->preload()
->reactive()
->relationship('articlesNews', 'title'),
]),
// Card::make()
// ->schema([
// Select::make('jobOffers')
// ->multiple()
// ->label('Pinned job offers')
// ->nullable()
// ->placeholder('Select job offers')
// ->searchable()
// ->preload()
// ->reactive()
// ->relationship('jobOffers', 'title'),
// ]),
])->columnSpan(8),
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
Tables\Columns\TextColumn::make('image_name')->label('Nazwa')->limit(35),
Tables\Columns\TextColumn::make('image_desc')->label('Opis')->limit(35),
Tables\Columns\ImageColumn::make('image_path')->label('Zdjęcie'),
])
->filters([
//
])
->actions([
Tables\Actions\ViewAction::make(),
Tables\Actions\EditAction::make(),
Tables\Actions\DeleteAction::make(),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
]),
]);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => Pages\ListPhotos::route('/'),
'create' => Pages\CreatePhoto::route('/create'),
'view' => Pages\ViewPhoto::route('/{record}'),
'edit' => Pages\EditPhoto::route('/{record}/edit'),
];
}
}

View File

@@ -0,0 +1,12 @@
<?php
namespace App\Filament\Resources\PhotoResource\Pages;
use App\Filament\Resources\PhotoResource;
use Filament\Actions;
use Filament\Resources\Pages\CreateRecord;
class CreatePhoto extends CreateRecord
{
protected static string $resource = PhotoResource::class;
}

View File

@@ -0,0 +1,20 @@
<?php
namespace App\Filament\Resources\PhotoResource\Pages;
use App\Filament\Resources\PhotoResource;
use Filament\Actions;
use Filament\Resources\Pages\EditRecord;
class EditPhoto extends EditRecord
{
protected static string $resource = PhotoResource::class;
protected function getHeaderActions(): array
{
return [
Actions\ViewAction::make(),
Actions\DeleteAction::make(),
];
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\PhotoResource\Pages;
use App\Filament\Resources\PhotoResource;
use Filament\Actions;
use Filament\Resources\Pages\ListRecords;
class ListPhotos extends ListRecords
{
protected static string $resource = PhotoResource::class;
protected function getHeaderActions(): array
{
return [
Actions\CreateAction::make(),
];
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\PhotoResource\Pages;
use App\Filament\Resources\PhotoResource;
use Filament\Actions;
use Filament\Resources\Pages\ViewRecord;
class ViewPhoto extends ViewRecord
{
protected static string $resource = PhotoResource::class;
protected function getHeaderActions(): array
{
return [
Actions\EditAction::make(),
];
}
}

View File

@@ -0,0 +1,185 @@
<?php
namespace App\Filament\Resources;
use App\Filament\Resources\ProjectArticleResource\Pages;
use App\Filament\Resources\ProjectArticleResource\RelationManagers;
use App\Models\ProjectArticle;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
use Filament\Forms\Components\Grid;
use Filament\Forms\Components\Card;
use Filament\Forms\Components\Select;
use Illuminate\Support\Str;
use Filament\Forms\Set;
use Filament\Forms\Components\RichEditor;
use Filament\Forms\Components\Toggle;
use Filament\Forms\Components\DateTimePicker;
use Filament\Forms\Components\FileUpload;
use Filament\Forms\Components\TextInput;
class ProjectArticleResource extends Resource
{
public static function canAccess(): bool
{
return auth()->user()->can('manage_projects') || auth()->user()->can('admin');
}
protected static ?string $model = ProjectArticle::class;
protected static ?string $navigationGroup = 'Projekty';
protected static ?string $navigationIcon = 'heroicon-o-currency-dollar';
protected static ?string $modelLabel = 'Dofinansowanie';
protected static ?string $pluralModelLabel = 'Dofinansowania';
protected static ?int $navigationSort = 1;
public static function form(Form $form): Form
{
return $form
->extraAttributes(['style' => 'gap:0.5rem'])
->schema([
Card::make()
->schema([
Grid::make()
->schema([
TextInput::make('title')
->label('Nazwa')
->required()
->maxLength(2048)
->live(onBlur: true)
->afterStateUpdated(function (Set $set, ?string $state) {
$set('slug', Str::slug($state));
}),
TextInput::make('slug')
->label('Przyjazny link')
->required()
->maxLength(2048),
]),
FileUpload::make('logo')
->image()
->imageEditor()
->label('Logo')
->default(null),
RichEditor::make('body')
->label('Treść')
->fileAttachmentsDisk('public')
->fileAttachmentsDirectory('project-content')
->columnSpanFull(),
Toggle::make('active')
->label('Aktywny')
->required(),
DateTimePicker::make('published_at')
->label('Data publikacji')
->required(),
])->columnSpan(8),
Card::make()
->schema([
Select::make('projectTypes')
->multiple()
->required()
->label('Rodzaje dofinansowań')
->nullable()
->placeholder('Wybierz rodzaje dofinansowań')
->searchable()
->preload()
->reactive()
->relationship('projectTypes', 'title'),
Select::make('attachments')
->multiple()
->required()
->label('Przypięte załączniki')
->nullable()
->placeholder('Wybierz załączniki')
->searchable()
->preload()
->reactive()
->relationship('attachments', 'file_name'),
Select::make('photos')
->multiple()
->required()
->label('Przypięte zdjęcia')
->nullable()
->placeholder('Wybierz zdjęcia')
->searchable()
->preload()
->reactive()
->relationship('photos', 'image_name'),
])->columnSpan(4),
])->columns(12);
}
public static function table(Table $table): Table
{
return $table
->columns([
Tables\Columns\TextColumn::make('title')
->label('Nazwa')
->searchable()
->limit(35)
->tooltip(function (Tables\Columns\TextColumn $column): ?string {
$state = $column->getState();
if (strlen($state) <= 35) {
return null;
}
return $state;
}),
Tables\Columns\TextColumn::make('projectTypes.title')
->label('Kategorie')
->limit(30)
->listWithLineBreaks()
->tooltip(function (Tables\Columns\TextColumn $column): ?string {
$state = $column->getState();
if (is_array($state) && strlen(implode(', ', $state)) <= 30) {
return null;
}
return is_array($state) ? implode(", ", $state) : $state;
}),
Tables\Columns\IconColumn::make('active')
->label('Aktywny')
->boolean(),
Tables\Columns\TextColumn::make('published_at')
->label('Data publikacji')
->dateTime()
->sortable(),
])
->defaultSort('published_at', 'desc')
->filters([
//
])
->actions([
Tables\Actions\ViewAction::make(),
Tables\Actions\EditAction::make(),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
]),
]);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => Pages\ListProjectArticles::route('/'),
'create' => Pages\CreateProjectArticle::route('/create'),
'view' => Pages\ViewProjectArticle::route('/{record}'),
'edit' => Pages\EditProjectArticle::route('/{record}/edit'),
];
}
}

View File

@@ -0,0 +1,18 @@
<?php
namespace App\Filament\Resources\ProjectArticleResource\Pages;
use App\Filament\Resources\ProjectArticleResource;
use Filament\Actions;
use Filament\Resources\Pages\CreateRecord;
class CreateProjectArticle extends CreateRecord
{
protected static string $resource = ProjectArticleResource::class;
protected function mutateFormDataBeforeCreate(array $data): array
{
$data['user_id'] = auth()->id();
return $data;
}
}

View File

@@ -0,0 +1,20 @@
<?php
namespace App\Filament\Resources\ProjectArticleResource\Pages;
use App\Filament\Resources\ProjectArticleResource;
use Filament\Actions;
use Filament\Resources\Pages\EditRecord;
class EditProjectArticle extends EditRecord
{
protected static string $resource = ProjectArticleResource::class;
protected function getHeaderActions(): array
{
return [
Actions\ViewAction::make(),
Actions\DeleteAction::make(),
];
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\ProjectArticleResource\Pages;
use App\Filament\Resources\ProjectArticleResource;
use Filament\Actions;
use Filament\Resources\Pages\ListRecords;
class ListProjectArticles extends ListRecords
{
protected static string $resource = ProjectArticleResource::class;
protected function getHeaderActions(): array
{
return [
Actions\CreateAction::make(),
];
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\ProjectArticleResource\Pages;
use App\Filament\Resources\ProjectArticleResource;
use Filament\Actions;
use Filament\Resources\Pages\ViewRecord;
class ViewProjectArticle extends ViewRecord
{
protected static string $resource = ProjectArticleResource::class;
protected function getHeaderActions(): array
{
return [
Actions\EditAction::make(),
];
}
}

View File

@@ -0,0 +1,126 @@
<?php
namespace App\Filament\Resources;
use App\Filament\Resources\ProjectTypeResource\Pages;
use App\Filament\Resources\ProjectTypeResource\RelationManagers;
use App\Models\ProjectType;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
use Filament\Forms\Components\Grid;
use Filament\Forms\Components\Card;
use Filament\Forms\Components\Select;
use Illuminate\Support\Str;
use Filament\Forms\Set;
class ProjectTypeResource extends Resource
{
public static function canAccess(): bool
{
return auth()->user()->can('manage_projects') || auth()->user()->can('admin');
}
protected static ?string $model = ProjectType::class;
protected static ?string $navigationGroup = 'Projekty';
protected static ?string $navigationIcon = 'heroicon-o-currency-dollar';
protected static ?string $modelLabel = 'Rodzaj dofinansowania';
protected static ?string $pluralModelLabel = 'Rodzaje dofinansowań';
protected static ?int $navigationSort = 2;
public static function form(Form $form): Form
{
return $form
->extraAttributes(['style' => 'gap:0.5rem'])
->schema([
Grid::make()
->schema([
Card::make()
->schema([
Forms\Components\TextInput::make('title')
->label('Nazwa')
->required()
->maxLength(2048)
->live(onBlur: true)
->afterStateUpdated(function (Set $set, ?string $state) {
$set('slug', Str::slug($state));
}),
Forms\Components\TextInput::make('slug')
->label('Przyjazny link')
->required()
->maxLength(2048),
]),
])->columnSpan(8),
Grid::make()
->schema([
Card::make()
->schema([
Select::make('projectArticles')
->multiple()
->required()
->label('Przypięte dofinansowania')
->nullable()
->placeholder('Wybierz dofinansowania')
->searchable()
->preload()
->reactive()
->relationship('projectArticles', 'title'),
]),
])->columnSpan(8),
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
Tables\Columns\TextColumn::make('title')
->label('Nazwa')
->searchable(),
Tables\Columns\TextColumn::make('created_at')
->label('Data dodania')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('updated_at')
->label('Data aktualizacji')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
->filters([
//
])
->actions([
Tables\Actions\ViewAction::make(),
Tables\Actions\EditAction::make(),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
]),
]);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => Pages\ListProjectTypes::route('/'),
'create' => Pages\CreateProjectType::route('/create'),
'view' => Pages\ViewProjectType::route('/{record}'),
'edit' => Pages\EditProjectType::route('/{record}/edit'),
];
}
}

View File

@@ -0,0 +1,12 @@
<?php
namespace App\Filament\Resources\ProjectTypeResource\Pages;
use App\Filament\Resources\ProjectTypeResource;
use Filament\Actions;
use Filament\Resources\Pages\CreateRecord;
class CreateProjectType extends CreateRecord
{
protected static string $resource = ProjectTypeResource::class;
}

View File

@@ -0,0 +1,20 @@
<?php
namespace App\Filament\Resources\ProjectTypeResource\Pages;
use App\Filament\Resources\ProjectTypeResource;
use Filament\Actions;
use Filament\Resources\Pages\EditRecord;
class EditProjectType extends EditRecord
{
protected static string $resource = ProjectTypeResource::class;
protected function getHeaderActions(): array
{
return [
Actions\ViewAction::make(),
Actions\DeleteAction::make(),
];
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\ProjectTypeResource\Pages;
use App\Filament\Resources\ProjectTypeResource;
use Filament\Actions;
use Filament\Resources\Pages\ListRecords;
class ListProjectTypes extends ListRecords
{
protected static string $resource = ProjectTypeResource::class;
protected function getHeaderActions(): array
{
return [
Actions\CreateAction::make(),
];
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\ProjectTypeResource\Pages;
use App\Filament\Resources\ProjectTypeResource;
use Filament\Actions;
use Filament\Resources\Pages\ViewRecord;
class ViewProjectType extends ViewRecord
{
protected static string $resource = ProjectTypeResource::class;
protected function getHeaderActions(): array
{
return [
Actions\EditAction::make(),
];
}
}

View File

@@ -0,0 +1,96 @@
<?php
namespace App\Filament\Resources;
use App\Filament\Resources\RoleResource\Pages;
use App\Filament\Resources\RoleResource\RelationManagers;
use Filament\Forms;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Form;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
use Spatie\Permission\Models\Role;
class RoleResource extends Resource
{
public static function canAccess(): bool
{
return auth()->user()->can('manage_roles') || auth()->user()->can('admin');
}
protected static ?string $model = Role::class;
protected static ?string $navigationIcon = 'heroicon-o-shield-check';
protected static ?string $navigationGroup = 'Ustawienia';
protected static ?string $modelLabel = 'Rola';
protected static ?string $pluralModelLabel = 'Role';
protected static ?int $navigationSort = 2;
public static function form(Form $form): Form
{
return $form
->schema([
Forms\Components\Section::make('Informacje o roli')
->schema([
TextInput::make('name')
->label('Nazwa roli')
->required()
->maxLength(255)
->unique(ignoreRecord: true),
Select::make('permissions')
->label('Uprawnienia')
->relationship('permissions', 'name')
->multiple()
->preload()
->searchable()
])
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
TextColumn::make('name')
->label('Nazwa roli')
->searchable(),
TextColumn::make('permissions.name')
->label('Uprawnienia')
->badge()
])
->filters([
//
])
->actions([
Tables\Actions\EditAction::make(),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
]),
]);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => Pages\ListRoles::route('/'),
'create' => Pages\CreateRole::route('/create'),
'edit' => Pages\EditRole::route('/{record}/edit'),
];
}
}

View File

@@ -0,0 +1,12 @@
<?php
namespace App\Filament\Resources\RoleResource\Pages;
use App\Filament\Resources\RoleResource;
use Filament\Actions;
use Filament\Resources\Pages\CreateRecord;
class CreateRole extends CreateRecord
{
protected static string $resource = RoleResource::class;
}

View File

@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\RoleResource\Pages;
use App\Filament\Resources\RoleResource;
use Filament\Actions;
use Filament\Resources\Pages\EditRecord;
class EditRole extends EditRecord
{
protected static string $resource = RoleResource::class;
protected function getHeaderActions(): array
{
return [
Actions\DeleteAction::make(),
];
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\RoleResource\Pages;
use App\Filament\Resources\RoleResource;
use Filament\Actions;
use Filament\Resources\Pages\ListRecords;
class ListRoles extends ListRecords
{
protected static string $resource = RoleResource::class;
protected function getHeaderActions(): array
{
return [
Actions\CreateAction::make(),
];
}
}

View File

@@ -0,0 +1,113 @@
<?php
namespace App\Filament\Resources;
use App\Filament\Resources\TelephoneResource\Pages;
use App\Filament\Resources\TelephoneResource\RelationManagers;
use App\Models\Telephone;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\SoftDeletingScope;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Components\RichEditor;
use Filament\Forms\Components\Card;
use Filament\Tables\Actions\Action;
use Filament\Forms\Components\Builder;
class TelephoneResource extends Resource
{
public static function canAccess(): bool
{
return auth()->user()->can('manage_telephones') || auth()->user()->can('admin');
}
protected static ?string $model = Telephone::class;
protected static ?string $navigationIcon = 'heroicon-o-phone';
protected static ?string $navigationGroup = 'Pozostałe';
protected static ?string $modelLabel = 'Telefony';
protected static ?string $pluralModelLabel = 'Telefony';
protected static ?int $navigationSort = 4;
public static function form(Form $form): Form
{
return $form
->schema([
Card::make()
->schema([
TextInput::make('section')
->label('Sekcja')
->required()
->maxLength(2048),
]),
Card::make()
->schema([
Builder::make('telephones')
->label('Telefony')
->blocks([
Builder\Block::make('telephone')
->label('Telefon')
->schema([
TextInput::make('name')
->label('Nazwa')
->required(),
TextInput::make('number')
->label('Numer')
->required(),
])
->columns(2),
])
])
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
Tables\Columns\TextColumn::make('section')
->label('Sekcja')
->searchable(),
])
->defaultSort('sort_order')
->description('W tym miejscu możesz dodać, edytować oraz usuwać sekcje z numerami telefonów.')
->reorderable('sort_order')
->reorderRecordsTriggerAction(
fn (Action $action, bool $isReordering) => $action
->button()
->label($isReordering ? 'Wyłącz zmianę kolejności' : 'Zmień kolejność'),
)
->filters([
//
])
->actions([
Tables\Actions\ViewAction::make(),
Tables\Actions\EditAction::make(),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
]),
]);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => Pages\ListTelephones::route('/'),
'create' => Pages\CreateTelephone::route('/create'),
'view' => Pages\ViewTelephone::route('/{record}'),
'edit' => Pages\EditTelephone::route('/{record}/edit'),
];
}
}

View File

@@ -0,0 +1,12 @@
<?php
namespace App\Filament\Resources\TelephoneResource\Pages;
use App\Filament\Resources\TelephoneResource;
use Filament\Actions;
use Filament\Resources\Pages\CreateRecord;
class CreateTelephone extends CreateRecord
{
protected static string $resource = TelephoneResource::class;
}

View File

@@ -0,0 +1,20 @@
<?php
namespace App\Filament\Resources\TelephoneResource\Pages;
use App\Filament\Resources\TelephoneResource;
use Filament\Actions;
use Filament\Resources\Pages\EditRecord;
class EditTelephone extends EditRecord
{
protected static string $resource = TelephoneResource::class;
protected function getHeaderActions(): array
{
return [
Actions\ViewAction::make(),
Actions\DeleteAction::make(),
];
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\TelephoneResource\Pages;
use App\Filament\Resources\TelephoneResource;
use Filament\Actions;
use Filament\Resources\Pages\ListRecords;
class ListTelephones extends ListRecords
{
protected static string $resource = TelephoneResource::class;
protected function getHeaderActions(): array
{
return [
Actions\CreateAction::make(),
];
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\TelephoneResource\Pages;
use App\Filament\Resources\TelephoneResource;
use Filament\Actions;
use Filament\Resources\Pages\ViewRecord;
class ViewTelephone extends ViewRecord
{
protected static string $resource = TelephoneResource::class;
protected function getHeaderActions(): array
{
return [
Actions\EditAction::make(),
];
}
}

View File

@@ -0,0 +1,103 @@
<?php
namespace App\Filament\Resources;
use App\Filament\Resources\UserResource\Pages;
use App\Filament\Resources\UserResource\RelationManagers;
use App\Models\User;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Components\Select;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Columns\TagsColumn;
class UserResource extends Resource
{
public static function canAccess(): bool
{
return auth()->user()->can('manage_users') || auth()->user()->can('admin');
}
protected static ?string $model = User::class;
protected static ?string $navigationIcon = 'heroicon-o-users';
protected static ?string $navigationGroup = 'Ustawienia';
protected static ?string $modelLabel = 'Administrator';
protected static ?string $pluralModelLabel = 'Administratorzy';
protected static ?int $navigationSort = 1;
public static function form(Form $form): Form
{
return $form
->schema([
Forms\Components\Section::make('Dane użytkownika')
->schema([
TextInput::make('name')
->label('Nazwa użytkownika')
->required(),
TextInput::make('email')
->label('Adres e-mail')
->email()
->required(),
TextInput::make('password')
->label('Hasło')
->password()
->required(fn ($livewire) => $livewire instanceof \Filament\Resources\Pages\CreateRecord)
->dehydrated(fn ($state) => filled($state))
->dehydrateStateUsing(fn ($state) => bcrypt($state)),
Select::make('roles')
->label('Role')
->relationship('roles', 'name')
->multiple()
->preload()
->searchable(),
])
->columns(2)
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
TextColumn::make('name')->label('Użytkownik')->searchable(),
TextColumn::make('email')->label('E-mail')->searchable(),
TagsColumn::make('roles.name')->label('Role'),
TextColumn::make('created_at')->label('Data utworzenia')->dateTime(),
])
->description('Dodawaj lub edytuj administratorów.')
->filters([
//
])
->actions([
Tables\Actions\EditAction::make(),
])
->bulkActions([
//
]);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => Pages\ListUsers::route('/'),
'create' => Pages\CreateUser::route('/create'),
'edit' => Pages\EditUser::route('/{record}/edit'),
];
}
}

View File

@@ -0,0 +1,12 @@
<?php
namespace App\Filament\Resources\UserResource\Pages;
use App\Filament\Resources\UserResource;
use Filament\Actions;
use Filament\Resources\Pages\CreateRecord;
class CreateUser extends CreateRecord
{
protected static string $resource = UserResource::class;
}

View File

@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\UserResource\Pages;
use App\Filament\Resources\UserResource;
use Filament\Actions;
use Filament\Resources\Pages\EditRecord;
class EditUser extends EditRecord
{
protected static string $resource = UserResource::class;
protected function getHeaderActions(): array
{
return [
Actions\DeleteAction::make(),
];
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\UserResource\Pages;
use App\Filament\Resources\UserResource;
use Filament\Actions;
use Filament\Resources\Pages\ListRecords;
class ListUsers extends ListRecords
{
protected static string $resource = UserResource::class;
protected function getHeaderActions(): array
{
return [
Actions\CreateAction::make(),
];
}
}