Rework admin panel and other

This commit is contained in:
F4ilji
2025-04-02 18:37:20 +05:00
parent 49072e50c7
commit 5cd6ff11b5
198 changed files with 9715 additions and 6664 deletions
+122 -61
View File
@@ -6,6 +6,7 @@ use App\Enums\CustomFormStatus;
use App\Enums\PostStatus;
use App\Filament\Components\Forms\ItemForm\Pages\ContentBuilderItem;
use Filament\Forms;
use Filament\Forms\Components\Actions\Action;
use Filament\Forms\Components\Section;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
@@ -22,69 +23,129 @@ class PageForm
->schema([
Section::make()
->schema([
Forms\Components\Tabs::make('')->schema([
Forms\Components\Tabs\Tab::make('Основная информация')->schema([
Forms\Components\Grid::make(2)->schema([
TextInput::make('title')->label('Заголовок')->required()
->live(onBlur: true)
->afterStateUpdated(function (string $operation, string|null $state, Forms\Set $set) {
$set('slug', Str::slug($state));
$set('path', Str::slug($state));
}),
TextInput::make('slug')->label('Текстовый идентификатор страницы')->unique(ignoreRecord: true)->required()
->live(onBlur: true)
->afterStateUpdated(function (string $operation, string $state, Forms\Set $set, $get) {
$set('path', Str::slug($state));
}),
]),
Select::make('sub_section_id')->label('Подраздел')
->relationship('section', 'title')
->createOptionForm([
Forms\Components\TextInput::make('title')->label('Название подраздела')->required()
->live(onBlur: true)
->afterStateUpdated(function (string $operation, string $state, Forms\Set $set) {
$set('slug', Str::slug($state));
}),
TextInput::make('slug')->label('Slug')->unique(ignoreRecord: true)->readOnly()->required(),
Forms\Components\Tabs::make('Настройки страницы')
->persistTabInQueryString()
->columnSpanFull()
->tabs([
Forms\Components\Tabs\Tab::make('Основная информация')
->icon('heroicon-o-information-circle')
->schema([
Forms\Components\Grid::make(2)
->schema([
TextInput::make('title')
->label('Заголовок страницы')
->required()
->maxLength(255)
->placeholder('Введите название страницы')
->helperText('Этот заголовок будет отображаться в заголовке страницы и в навигации')
->live(onBlur: true)
->afterStateUpdated(function (string $operation, string|null $state, Forms\Set $set) {
$set('slug', Str::slug($state));
$set('path', Str::slug($state));
}),
TextInput::make('slug')
->label('URL-адрес страницы')
->required()
->unique(ignoreRecord: true)
->maxLength(255)
->helperText('Человеко-понятный URL для страницы')
->placeholder('example-page')
// ->prefix(fn ($record) => url('/') . '/' . substr($record->path, 0, strrpos($record->path, '/')))
->live(onBlur: true)
->afterStateUpdated(function (string $operation, string $state, Forms\Set $set, $get) {
$set('path', Str::slug($state));
})
->suffixAction(
Action::make('copy')
->icon('heroicon-s-clipboard-document-check')
->action(function ($livewire, $state, $record) {
$livewire->js(
'window.navigator.clipboard.writeText("'. url('/') . '/' . substr($record->path, 0, strrpos($record->path, '/')) . '/' . $state.'");
$tooltip("'.__('Copied to clipboard').'", { timeout: 1500 });'
);
})),
]),
Select::make('sub_section_id')
->label('Родительский подраздел')
->relationship('section', 'title')
->preload()
->searchable()
->placeholder('Выберите подраздел')
->helperText('Выберите раздел, к которому принадлежит эта страница')
->createOptionForm([
Forms\Components\Grid::make(2)
->schema([
Forms\Components\TextInput::make('title')
->label('Название подраздела')
->required()
->maxLength(255)
->placeholder('Введите название подраздела')
->live(onBlur: true)
->afterStateUpdated(function (string $operation, string $state, Forms\Set $set) {
$set('slug', Str::slug($state));
}),
TextInput::make('slug')
->label('URL подраздела')
->unique(ignoreRecord: true)
->readOnly()
->required()
->maxLength(255)
->helperText('Автоматически генерируется из названия'),
]),
]),
Select::make('code')
->label('HTTP статус страницы')
->options([
'200' => 'Обычная страница (200 OK)',
'404' => 'Страница не найдена (404 Not Found)',
'500' => 'Технические работы (500 Server Error)',
])
->required()
->default('200')
->helperText('Выберите HTTP статус, с которым будет отдаваться страница'),
Toggle::make('searchable')
->label('Индексировать в поиске')
->default(true)
->inline(false)
->helperText('Разрешить локальному поиску индексировать страницу'),
IconPicker::make('icon')
->label('Иконка страницы')
->default('heroicon-o-academic-cap')
->helperText('Выберите иконку для отображения в навигации')
->columns(6),
TextInput::make('search_data')
->hidden(),
]),
Forms\Components\Tabs\Tab::make('Содержание')
->icon('heroicon-o-document-text')
->schema([
ContentBuilderItem::getItem('content')
->helperText('Создайте содержимое страницы используя конструктор')
]),
Forms\Components\Tabs\Tab::make('Дополнительные настройки')
->icon('heroicon-o-cog')
->schema([
Section::make('Отображение элементов')
->description('Управление видимостью элементов на странице')
->collapsible()
->schema([
Toggle::make('settings.hide_page_sub_section_links')
->label('Скрыть боковую панель с ссылками на страницы раздела')
->helperText('Скрывает список страниц текущего раздела')
->columnSpan(1),
Toggle::make('settings.hide_page_navigate_links')
->label('Скрыть навигацию по странице')
->helperText('Скрывает навигацию по заголовкам')
->columnSpan(1),
Toggle::make('settings.hide_breadcrumbs')
->label('Скрыть хлебные крошки')
->helperText('Скрывает навигационную цепочку вверху страницы')
->columnSpan(1),
])
->columns(2),
]),
Select::make('code')->options([
'200' => 'Открытая страница',
'404' => 'Не найдено',
'500' => 'Ведутся технические работы',
])->label('Статус')->required()->default('200'),
Toggle::make('searchable')->default(true)->label('Индексируется поиском')->inline(false),
IconPicker::make('icon')
->default('heroicon-o-academic-cap')
->label('Icon'),
TextInput::make('search_data')->hidden(),
]),
Forms\Components\Tabs\Tab::make('Контент')->schema([
ContentBuilderItem::getItem('content')
]),
Forms\Components\Tabs\Tab::make('Настройки')->schema([
Section::make()->schema([
Toggle::make('settings.hide_page_sub_section_links')
->label('Скрыть сайдбар смежных страниц')
->columnSpan(1),
Toggle::make('settings.hide_page_navigate_links')
->label('Скрыть навигацию по страницу')
->columnSpan(1),
Toggle::make('settings.hide_breadcrumbs')
->label('Скрыть хлебные крошки')
->columnSpan(1),
//
// Toggle::make('settings.full_width_page')
// ->label('Страница на всю ширину')
// ->columnSpan(1)->default(true),
]),
]),
]),
])
]);
}