149 lines
7.5 KiB
PHP
149 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([
|
|
// BLOCK 1: Thông tin cơ bản
|
|
Section::make('Thông tin biểu mẫu')
|
|
->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(),
|
|
]),
|
|
|
|
Grid::make(3)
|
|
->schema([
|
|
Select::make('paper_size')
|
|
->label('Khổ giấy')
|
|
->options([
|
|
'A4' => 'A4',
|
|
'A5' => 'A5',
|
|
'Letter' => 'Letter',
|
|
])
|
|
->default('A4')
|
|
->required(),
|
|
]),
|
|
]),
|
|
|
|
// BLOCK 2: Danh sách trường dữ liệu
|
|
Section::make('Danh sách trường dữ liệu (Merge Fields)')
|
|
->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(),
|
|
]),
|
|
|
|
Grid::make(3)
|
|
->schema([
|
|
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(),
|
|
]),
|
|
|
|
// BLOCK 3: Nội dung mẫu in - FULL WIDTH, TO RỘNG
|
|
Section::make('Nội dung mẫu in')
|
|
->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(),
|
|
]),
|
|
]);
|
|
}
|
|
}
|