Files

147 lines
7.5 KiB
PHP

<?php
namespace App\Filament\Resources\FormTemplates\Schemas;
use Filament\Forms\Components\KeyValue;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\RichEditor;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Components\Repeater;
use Filament\Schemas\Components\Section;
use Filament\Schemas\Components\Grid;
use Filament\Schemas\Schema;
class FormTemplateForm
{
public static function configure(Schema $schema): Schema
{
return $schema
->components([
// SECTION 1: Full width, field chia 3 cột
Section::make('Thông tin biểu mẫu')
->columnSpanFull()
->schema([
Grid::make(3)
->schema([
TextInput::make('name')
->label('Tên biểu mẫu')
->required(),
TextInput::make('code')
->label('Mã biểu mẫu')
->required()
->unique(ignoreRecord: true),
Select::make('target_model')
->label('Áp dụng cho')
->options([
'App\Models\Contract' => 'Hợp đồng',
'App\Models\Product' => 'Sản phẩm',
'App\Models\Customer' => 'Khách hàng',
])
->required(),
Select::make('paper_size')
->label('Khổ giấy')
->options([
'A4' => 'A4',
'A5' => 'A5',
'Letter' => 'Letter',
])
->default('A4')
->required(),
]),
]),
// SECTION 2: Full width, Repeater item chia 3 cột
Section::make('Danh sách trường dữ liệu (Merge Fields)')
->columnSpanFull()
->schema([
Repeater::make('fields')
->relationship('fields')
->schema([
Grid::make(3)
->schema([
TextInput::make('code')
->label('Mã trường')
->required()
->placeholder('ten_khach_hang'),
TextInput::make('label')
->label('Tên hiển thị')
->required()
->placeholder('Tên khách hàng'),
Select::make('source_type')
->label('Nguồn dữ liệu')
->options([
'db_column' => 'Cột trong DB',
'db_relation' => 'Quan hệ (relation)',
'formula' => 'Công thức tính toán',
'input' => 'Nhập tay khi in',
'static' => 'Giá trị cố định',
])
->required()
->live(),
KeyValue::make('source_config')
->label('Cấu hình nguồn')
->keyLabel('Tham số')
->valueLabel('Giá trị')
->helperText(fn ($get) => match ($get('source_type')) {
'db_column' => 'Ví dụ: column => land_value',
'db_relation' => 'Ví dụ: relation => customers, column => full_name, index => 0',
'formula' => 'Ví dụ: expression => land_value + foundation_value',
'input' => 'Ví dụ: default => (giá trị mặc định)',
'static' => 'Ví dụ: value => Hà Nội',
default => 'Nhập cấu hình phù hợp với loại nguồn dữ liệu',
}),
Select::make('format')
->label('Định dạng hiển thị')
->options([
'text' => 'Văn bản',
'number' => 'Số',
'currency' => 'Tiền tệ (VNĐ)',
'date' => 'Ngày tháng',
'percent' => 'Phần trăm',
])
->default('text'),
TextInput::make('decimal_places')
->label('Số thập phân')
->numeric()
->default(0)
->visible(fn ($get) => in_array($get('format'), ['number', 'currency', 'percent'])),
TextInput::make('display_order')
->label('Thứ tự')
->numeric()
->default(0)
->hidden(),
]),
])
->addActionLabel('Thêm trường dữ liệu')
->reorderable()
->orderColumn('display_order')
->defaultItems(0)
->collapsible()
->columnSpanFull(),
]),
// SECTION 3: Full width, RichEditor to
Section::make('Nội dung mẫu in')
->columnSpanFull()
->schema([
RichEditor::make('html_template')
->label('')
->required()
->placeholder('Soạn thảo nội dung biểu mẫu...')
->helperText('Chèn trường dữ liệu bằng cú pháp {{ma_truong}}. Ví dụ: Tên khách hàng: {{ten_khach_hang}}')
->columnSpanFull()
->extraInputAttributes(['style' => 'min-height: 500px;']),
]),
]);
}
}