391 lines
15 KiB
PHP
391 lines
15 KiB
PHP
<?php
|
|
|
|
namespace App\Filament\Pages;
|
|
|
|
use App\Models\UserRole;
|
|
use App\Settings\SolutionSettings;
|
|
use Filament\Forms\Components\FileUpload;
|
|
use Filament\Forms\Components\Grid;
|
|
use Filament\Forms\Components\Repeater;
|
|
use Filament\Forms\Components\Section;
|
|
use Filament\Forms\Components\Select;
|
|
use Filament\Forms\Components\TextInput;
|
|
use Filament\Forms\Form;
|
|
use Filament\Pages\SettingsPage;
|
|
use Illuminate\Contracts\Support\Htmlable;
|
|
|
|
class ManageSolutions extends SettingsPage
|
|
{
|
|
protected static ?string $navigationGroup = 'Home';
|
|
|
|
protected static ?string $navigationIcon = 'heroicon-o-wrench-screwdriver';
|
|
|
|
protected static string $settings = SolutionSettings::class;
|
|
|
|
public function form(Form $form): Form
|
|
{
|
|
return $form
|
|
->schema([
|
|
Section::make('Solutions Section')
|
|
->description('Manage the content for the solutions section on the homepage.')
|
|
->icon('heroicon-o-puzzle-piece')
|
|
->schema([
|
|
TextInput::make('solutions_subtitle')
|
|
->label('Subtitle')
|
|
->required()
|
|
->maxLength(100),
|
|
TextInput::make('solutions_header')
|
|
->label('Header')
|
|
->required()
|
|
->maxLength(255),
|
|
FileUpload::make('solutions_image')
|
|
->label('Image 1060x453')
|
|
->image()
|
|
->directory('solutions')
|
|
->required(),
|
|
Grid::make()->schema([
|
|
TextInput::make('solutions_button_text')
|
|
->label('Button Text')
|
|
->required()
|
|
->maxLength(50),
|
|
TextInput::make('solutions_button_url')
|
|
->label('Button URL')
|
|
->required()
|
|
->maxLength(255)
|
|
->url(),
|
|
])->columns(2),
|
|
]),
|
|
Section::make('Solution Items')
|
|
->description('Manage individual solution items.')
|
|
->icon('heroicon-o-cube')
|
|
->schema([
|
|
Repeater::make('solution_items')
|
|
->label('Solution Items')
|
|
->schema([
|
|
Select::make('icon_class')
|
|
->label('Icon Class')
|
|
->searchable()
|
|
->helperText('e.g., flaticon-it-department. Refer to Flaticon for available icons.')
|
|
->required()
|
|
->options(self::getIconOptions()),
|
|
TextInput::make('title')
|
|
->label('Title')
|
|
->required()
|
|
->maxLength(100),
|
|
TextInput::make('link')
|
|
->label('Link')
|
|
->required()
|
|
->maxLength(255)
|
|
->url(),
|
|
])
|
|
->columns(3)
|
|
->minItems(1)
|
|
->maxItems(6)
|
|
->defaultItems(3)
|
|
->grid(2)
|
|
->reorderable()
|
|
->collapsible(),
|
|
]),
|
|
])
|
|
->columns(1)
|
|
->statePath('data');
|
|
}
|
|
|
|
private static function getIconOptions(): array
|
|
{
|
|
return [
|
|
'microsoft-word' => 'microsoft-word',
|
|
'text-box' => 'text-box',
|
|
'document-1' => 'document-1',
|
|
'layers-1' => 'layers-1',
|
|
'folder-1' => 'folder-1',
|
|
'contract' => 'contract',
|
|
'layer' => 'layer',
|
|
'download-pdf' => 'download-pdf',
|
|
'pdf' => 'pdf',
|
|
'cloud-computing' => 'cloud-computing',
|
|
'downloads' => 'downloads',
|
|
'layers' => 'layers',
|
|
'document' => 'document',
|
|
'light-bulb-1' => 'light-bulb-1',
|
|
'idea-2' => 'idea-2',
|
|
'light-bulb' => 'light-bulb',
|
|
'idea-1' => 'idea-1',
|
|
'solution-2' => 'solution-2',
|
|
'lightbulb' => 'lightbulb',
|
|
'menus' => 'menus',
|
|
'support-1' => 'support-1',
|
|
'swipe-left' => 'swipe-left',
|
|
'development' => 'development',
|
|
'domain' => 'domain',
|
|
'pets' => 'pets',
|
|
'diagram' => 'diagram',
|
|
'targeting' => 'targeting',
|
|
'business-intelligence' => 'business-intelligence',
|
|
'menu-6' => 'menu-6',
|
|
'high-quality' => 'high-quality',
|
|
'campaign' => 'campaign',
|
|
'brain' => 'brain',
|
|
'software-application' => 'software-application',
|
|
'apps' => 'apps',
|
|
'wrench-1' => 'wrench-1',
|
|
'social-media-marketing-1' => 'social-media-marketing-1',
|
|
'category-1' => 'category-1',
|
|
'trophy-3' => 'trophy-3',
|
|
'email-marketing' => 'email-marketing',
|
|
'setting' => 'setting',
|
|
'more' => 'more',
|
|
'menu-5' => 'menu-5',
|
|
'menu-4' => 'menu-4',
|
|
'medical' => 'medical',
|
|
'sparkle' => 'sparkle',
|
|
'menu-3' => 'menu-3',
|
|
'technology-2' => 'technology-2',
|
|
'process' => 'process',
|
|
'hearth-1' => 'hearth-1',
|
|
'hearth' => 'hearth',
|
|
'technology-1' => 'technology-1',
|
|
'category' => 'category',
|
|
'customer-care' => 'customer-care',
|
|
'folder' => 'folder',
|
|
'portfolio-1' => 'portfolio-1',
|
|
'report' => 'report',
|
|
'thinking' => 'thinking',
|
|
'fingerprint' => 'fingerprint',
|
|
'clock-2' => 'clock-2',
|
|
'award' => 'award',
|
|
'paper-plane' => 'paper-plane',
|
|
'repair' => 'repair',
|
|
'email-5' => 'email-5',
|
|
'strategy' => 'strategy',
|
|
'portfolio' => 'portfolio',
|
|
'web-design' => 'web-design',
|
|
'email-4' => 'email-4',
|
|
'down-arrow-1' => 'down-arrow-1',
|
|
'location-2' => 'location-2',
|
|
'phone-call-2' => 'phone-call-2',
|
|
'telephone-call' => 'telephone-call',
|
|
'teamwork' => 'teamwork',
|
|
'up-arrow-1' => 'up-arrow-1',
|
|
'menu-2' => 'menu-2',
|
|
'developing' => 'developing',
|
|
'money-bag' => 'money-bag',
|
|
'thumbs-up' => 'thumbs-up',
|
|
'profits' => 'profits',
|
|
'location-1' => 'location-1',
|
|
'help-1' => 'help-1',
|
|
'online-chat' => 'online-chat',
|
|
'worker' => 'worker',
|
|
'smart-home' => 'smart-home',
|
|
'customer-service-1' => 'customer-service-1',
|
|
'internet' => 'internet',
|
|
'cash-flow' => 'cash-flow',
|
|
'monitor' => 'monitor',
|
|
'search-1' => 'search-1',
|
|
'wrench' => 'wrench',
|
|
'coin' => 'coin',
|
|
'cash' => 'cash',
|
|
'analyst' => 'analyst',
|
|
'dashboard-1' => 'dashboard-1',
|
|
'digital' => 'digital',
|
|
'searching' => 'searching',
|
|
'email-3' => 'email-3',
|
|
'star-1' => 'star-1',
|
|
'touch' => 'touch',
|
|
'medal' => 'medal',
|
|
'world-wide-web-1' => 'world-wide-web-1',
|
|
'phone' => 'phone',
|
|
'social-media' => 'social-media',
|
|
'24-7' => '24-7',
|
|
'hard-work' => 'hard-work',
|
|
'star' => 'star',
|
|
'plus' => 'plus',
|
|
'minus-2' => 'minus-2',
|
|
'menu-1' => 'menu-1',
|
|
'cloud' => 'cloud',
|
|
'handshake' => 'handshake',
|
|
'people' => 'people',
|
|
'ai' => 'ai',
|
|
'save-money' => 'save-money',
|
|
'shopping-online' => 'shopping-online',
|
|
'profit-1' => 'profit-1',
|
|
'blockchain' => 'blockchain',
|
|
'sales' => 'sales',
|
|
'back-in-time' => 'back-in-time',
|
|
'clock-1' => 'clock-1',
|
|
'user-3' => 'user-3',
|
|
'user-2' => 'user-2',
|
|
'pawprint' => 'pawprint',
|
|
'payment-method' => 'payment-method',
|
|
'world-wide-web' => 'world-wide-web',
|
|
'minus-1' => 'minus-1',
|
|
'add-1' => 'add-1',
|
|
'management' => 'management',
|
|
'help' => 'help',
|
|
'chip' => 'chip',
|
|
'artificial-intelligence' => 'artificial-intelligence',
|
|
'group' => 'group',
|
|
'money-1' => 'money-1',
|
|
'conversation' => 'conversation',
|
|
'email-2' => 'email-2',
|
|
'rating' => 'rating',
|
|
'placeholder' => 'placeholder',
|
|
'trophy-2' => 'trophy-2',
|
|
'cpu' => 'cpu',
|
|
'home' => 'home',
|
|
'right-arrow-1' => 'right-arrow-1',
|
|
'like' => 'like',
|
|
'mail' => 'mail',
|
|
'briefcase' => 'briefcase',
|
|
'money' => 'money',
|
|
'up-arrow' => 'up-arrow',
|
|
'trophy-1' => 'trophy-1',
|
|
'user-1' => 'user-1',
|
|
'question' => 'question',
|
|
'team-1' => 'team-1',
|
|
'user' => 'user',
|
|
'email-1' => 'email-1',
|
|
'price-tag-1' => 'price-tag-1',
|
|
'tag' => 'tag',
|
|
'loupe' => 'loupe',
|
|
'right-arrow' => 'right-arrow',
|
|
'left-arrow-1' => 'left-arrow-1',
|
|
'down-arrow' => 'down-arrow',
|
|
'price-tag' => 'price-tag',
|
|
'stars' => 'stars',
|
|
'search' => 'search',
|
|
'phone-call-1' => 'phone-call-1',
|
|
'award-symbol' => 'award-symbol',
|
|
'christmas-stars' => 'christmas-stars',
|
|
'minus' => 'minus',
|
|
'add' => 'add',
|
|
'cancel-1' => 'cancel-1',
|
|
'checked' => 'checked',
|
|
'cyber-security' => 'cyber-security',
|
|
'data-protection' => 'data-protection',
|
|
'hosting' => 'hosting',
|
|
'brand-awareness' => 'brand-awareness',
|
|
'ux-design' => 'ux-design',
|
|
'influencer' => 'influencer',
|
|
'online-advertising' => 'online-advertising',
|
|
'web-management' => 'web-management',
|
|
'seo-1' => 'seo-1',
|
|
'computer' => 'computer',
|
|
'software-development' => 'software-development',
|
|
'coding-1' => 'coding-1',
|
|
'coding' => 'coding',
|
|
'app-development' => 'app-development',
|
|
'content-marketing' => 'content-marketing',
|
|
'social-media-marketing' => 'social-media-marketing',
|
|
'analysis-1' => 'analysis-1',
|
|
'twitter' => 'twitter',
|
|
'repairing' => 'repairing',
|
|
'data-visualization' => 'data-visualization',
|
|
'information-technology' => 'information-technology',
|
|
'statistics-1' => 'statistics-1',
|
|
'exploration' => 'exploration',
|
|
'project-1' => 'project-1',
|
|
'cross-mark' => 'cross-mark',
|
|
'search-analysis' => 'search-analysis',
|
|
'system' => 'system',
|
|
'hashtag-1' => 'hashtag-1',
|
|
'hashtag' => 'hashtag',
|
|
'it-department' => 'it-department',
|
|
'creative' => 'creative',
|
|
'online-analytical' => 'online-analytical',
|
|
'secure-data' => 'secure-data',
|
|
'slash' => 'slash',
|
|
'creative-thinking' => 'creative-thinking',
|
|
'right-up' => 'right-up',
|
|
'dashboard' => 'dashboard',
|
|
'profit' => 'profit',
|
|
'project' => 'project',
|
|
'phone-call' => 'phone-call',
|
|
'seo' => 'seo',
|
|
'prototype' => 'prototype',
|
|
'creative-process' => 'creative-process',
|
|
'growth' => 'growth',
|
|
'technical-support' => 'technical-support',
|
|
'technology' => 'technology',
|
|
'solution-1' => 'solution-1',
|
|
'creative-tools' => 'creative-tools',
|
|
'data-science' => 'data-science',
|
|
'costumer' => 'costumer',
|
|
'cooperation' => 'cooperation',
|
|
'next' => 'next',
|
|
'back' => 'back',
|
|
'brand' => 'brand',
|
|
'right-arrows' => 'right-arrows',
|
|
'idea' => 'idea',
|
|
'design-thinking' => 'design-thinking',
|
|
'check' => 'check',
|
|
'cross' => 'cross',
|
|
'right' => 'right',
|
|
'link' => 'link',
|
|
'server' => 'server',
|
|
'analysis' => 'analysis',
|
|
'support' => 'support',
|
|
'project-management' => 'project-management',
|
|
'networking' => 'networking',
|
|
'team' => 'team',
|
|
'check-mark' => 'check-mark',
|
|
'consultation' => 'consultation',
|
|
'solution' => 'solution',
|
|
'success' => 'success',
|
|
'customer-review' => 'customer-review',
|
|
'select' => 'select',
|
|
'statistics' => 'statistics',
|
|
'machine-learning' => 'machine-learning',
|
|
'vector' => 'vector',
|
|
'trophy' => 'trophy',
|
|
'data' => 'data',
|
|
'clock' => 'clock',
|
|
'cancel' => 'cancel',
|
|
'customer-service' => 'customer-service',
|
|
'digital-marketing' => 'digital-marketing',
|
|
'email' => 'email',
|
|
'stats' => 'stats',
|
|
'menu' => 'menu',
|
|
'location' => 'location',
|
|
'tick' => 'tick',
|
|
'left-arrow' => 'left-arrow',
|
|
'dots-menu' => 'dots-menu',
|
|
];
|
|
}
|
|
|
|
public static function getNavigationGroup(): ?string
|
|
{
|
|
return __('Home');
|
|
}
|
|
|
|
public static function getNavigationLabel(): string
|
|
{
|
|
return __('Manage Solutions');
|
|
}
|
|
|
|
public function getTitle(): string|Htmlable
|
|
{
|
|
return 'Solutions';
|
|
}
|
|
|
|
public function getHeading(): string|Htmlable
|
|
{
|
|
return 'Edit solutions text, icons, and links from here';
|
|
}
|
|
|
|
public function getSubheading(): string|Htmlable|null
|
|
{
|
|
return 'Manage the solutions section content, including individual solution items.';
|
|
}
|
|
|
|
public static function canAccess(): bool
|
|
{
|
|
return auth()->user()->canManageSettings();
|
|
}
|
|
|
|
public static function canView(): bool
|
|
{
|
|
return auth()->user()->role === UserRole::ADMIN || auth()->user()->role === UserRole::MANAGER;
|
|
}
|
|
}
|