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;']), ]), ]); } }