Group Element

A comprehensive demonstration of using ObjectElement and ListElement in Laravel VueForm. This form showcases nested column layouts, conditional field rendering, tag selection with custom templates, dynamic remote items, and mixed input types. It includes validation, slot customization, static elements like horizontal dividers, and submit button integration. Ideal for developers looking to implement advanced, structured forms with flexible layouts and complex user interactions. Documentation


🧱 Import Class

use VueFormLaravel\Abstracts\VueFormBuilder;
use VueFormLaravel\Elements\Fields\TagsElement;
use VueFormLaravel\Elements\Fields\TextElement;
use VueFormLaravel\Elements\Static\ButtonElement;
use VueFormLaravel\Elements\Static\StaticElement;
use VueFormLaravel\Elements\Structure\ObjectElement;
use VueFormLaravel\Elements\Structure\ListElement;
use VueFormLaravel\Elements\Vueform;

🧩 Example

class ObjectElementForm extends VueFormBuilder
{
    protected function buildForm()
    {
        return Vueform::build()
            ->schema([
                ObjectElement::rowWith4Columns([
                    ObjectElement::rowWith4Columns([
                        TextElement::name('first_name'),
                        TextElement::name('first_namex')
                    ]),
                ]),
                ObjectElement::rowWith4Columns([
                    TagsElement::name('category')
                        ->type('tags')
                        ->closeOnSelect(false)
                        // ->inputType('search')
                        ->autocomplete('off')
                        ->limit(5)
                        ->rules('required')
                        ->conditions([
                            ['first_name', 'not_empty']
                        ])
                        // ->columns([
                        //     'container' => 12,
                        //     'wrapper' => 6
                        // ])
                        ->items([
                            ['value' => 1, 'label' => 'Category 1', 'color' => 'red', 'name' => 'foo'],
                            ['value' => 2, 'label' => 'Category 2', 'color' => 'red', 'name' => 'foo'],
                            ['value' => 3, 'label' => 'Category 3', 'color' => 'red', 'name' => 'foo']
                        ])
                        ->max(5)
                        ->events([
                            'select' => 'aaaa',
                        ])
                        ->slots([
                            'tag' => '<span
                            class="badge w-auto"
                            style="background-color: {{ option.color}};
                            color:{{ option.backgroundColor }};
                            padding: 5px 10px;
                            border-radius: 4px;
                            font-size: 14px;
                            font-weight: 500;
                            align-items: center;
                            display: flex;
                            margin: 4px 7px;"
                        >
                            {{ option.label }}
                            <span v-if="!{{ disabled }}" class="multiselect-tag-remove" id="{{ handleTagRemove(option, $event) }}">
                                <span class="multiselect-tag-remove-icon fa fa-times">
                                    <!-- <i class="fa fa-times text-light"></i> -->
                                </span>
                            </span>
                        </span>',
                            'info' => '<span>gggg ddd ddd</span>',
                            'before' => '<h1 style="color: blue;"> Please select categories cc</h1>',
                        ]),
                    TagsElement::name('tags')
                        ->type('tags')
                        ->closeOnSelect(false)
                        ->inputType('search')
                        ->autocomplete('off')
                        ->limit(5)
                        ->items('http://localhost:8000/tags/json')
                        ->max(5)
                        ->rules('required')
                        ->events([
                            'select' => 'aaaa',
                        ]),
                    TextElement::name('search'),
                    TextElement::name('number')->inputType('number'),
                ]),
                ListElement::schema([
                    TextElement::name('item_name')
                        ->label('Item Name')
                        ->rules('required'),
                ]),
                StaticElement::hr(),
                TagsElement::name('rating')
                    ->type('tags')
                    ->closeOnSelect(false)
                    ->inputType('search')
                    ->autocomplete('off')
                    ->limit(5)
                    ->columns([
                        'container' => 12,
                        'wrapper' => 6
                    ])
                    ->items([
                        ['value' => 1, 'label' => 'Category 1', 'color' => 'red', 'name' => 'foo'],
                        ['value' => 2, 'label' => 'Category 2', 'color' => 'red', 'name' => 'foo'],
                        ['value' => 3, 'label' => 'Category 3', 'color' => 'red', 'name' => 'foo']
                    ])
                    ->max(5)
                    ->events([
                        'select' => 'aaaa',
                    ]),
                ButtonElement::submitButton()
            ]);
    }

    public static function formData($request)
    {
        $request->validate([
            'category' => 'required',
            'first_name' => 'required',
            'rating' => 'required',
        ]);

        return response()->json([
            'status' => 'success'
        ]);
    }
}

⚙️ Allowed Attributes

Name Data Type Default Example
addClass array|object|string|function null ObjectElement::name("name")->addClass()
addClasses object|function null ObjectElement::name("name")->addClasses()
after object|string|number null ObjectElement::name("name")->after()
before object|string|number null ObjectElement::name("name")->before()
between object|string|number null ObjectElement::name("name")->between()
columns object|string|number null ObjectElement::name("name")->columns()
conditions array null ObjectElement::name("name")->conditions()
default object null ObjectElement::name("name")->default()
description string|object null ObjectElement::name("name")->description()
displayErrors boolean null ObjectElement::name("name")->displayErrors()
embed boolean null ObjectElement::name("name")->embed()
fieldName string|object null ObjectElement::name("name")->fieldName()
formatData function null ObjectElement::name("name")->formatData()
formatLoad function null ObjectElement::name("name")->formatLoad()
id string null ObjectElement::name("name")->id()
info string|object null ObjectElement::name("name")->info()
infoPosition string null ObjectElement::name("name")->infoPosition()
inline boolean null ObjectElement::name("name")->inline()
label string|object|function null ObjectElement::name("name")->label()
messages object null ObjectElement::name("name")->messages()
name string|number null ObjectElement::name("name")->name()
overrideClass array|object|string|function null ObjectElement::name("name")->overrideClass()
overrideClasses object|function null ObjectElement::name("name")->overrideClasses()
presets array null ObjectElement::name("name")->presets()
removeClass array|object|function null ObjectElement::name("name")->removeClass()
removeClasses object|function null ObjectElement::name("name")->removeClasses()
replaceClass object|function null ObjectElement::name("name")->replaceClass()
replaceClasses object|function null ObjectElement::name("name")->replaceClasses()
rules array|string|object null ObjectElement::name("name")->rules()
schema object null ObjectElement::name("name")->schema()
size string null ObjectElement::name("name")->size()
slots object null ObjectElement::name("name")->slots()
submit boolean null ObjectElement::name("name")->submit()
templates object null ObjectElement::name("name")->templates()
view string null ObjectElement::name("name")->view()
views object null ObjectElement::name("name")->views()

⚡ Events

The following events Documentation are available for this element:

Name Parameters Description
reset - {component} el$ - the element's component Triggered when the input is resetted.
clear - {component} el$ - the element's component Triggered when the input is cleared.
change - {string} newValue - the new value
- {string} oldValue - the old value
- {component} el$ - the element's component
Triggered when the element's value is changed.
beforeCreate - {component} el$ - the element's component Triggered in beforeCreate hook.
created - {component} el$ - the element's component Triggered in created hook.
beforeMount - {component} el$ - the element's component Triggered in beforeMount hook.
mounted - {component} el$ - the element's component Triggered in mounted hook.
beforeUpdate - {component} el$ - the element's component Triggered in beforeUpdate hook.
updated - {component} el$ - the element's component Triggered in updated hook.
beforeUnmount - {component} el$ - the element's component Triggered in beforeUnmount (or beforeDestroy in Vue 2) hook.
unmounted - {component} el$ - the element's component Triggered in unmounted (or destroyed in Vue 2) hook.

🔔 Example Usage of PHP

ObjectElement::name('example')
    ->events([
        'reset' => 'handleReset',
        'clear' => 'handleClear',
        'change' => 'handleChange',
        'beforeCreate' => 'handleBeforeCreate',
        'created' => 'handleCreated',
        'beforeMount' => 'handleBeforeMount',
        'mounted' => 'handleMounted',
        'beforeUpdate' => 'handleBeforeUpdate',
        'updated' => 'handleUpdated',
        'beforeUnmount' => 'handleBeforeUnmount',
        'unmounted' => 'handleUnmounted',
    ])

🔔 Example Usage of JavaScript

function handleReset(el$) {
    // Your code here
}
function handleClear(el$) {
    // Your code here
}
function handleChange(newValue, oldValue, el$) {
    // Your code here
}
function handleBeforeCreate(el$) {
    // Your code here
}
function handleCreated(el$) {
    // Your code here
}
function handleBeforeMount(el$) {
    // Your code here
}
function handleMounted(el$) {
    // Your code here
}
function handleBeforeUpdate(el$) {
    // Your code here
}
function handleUpdated(el$) {
    // Your code here
}
function handleBeforeUnmount(el$) {
    // Your code here
}
function handleUnmounted(el$) {
    // Your code here
}
---

## ⚙️ Available Static Methods

| Method | Description |
| --- | --- |
| `rowWith1Columns` | This method generates a group element in VueForm with each item occupying a full row (1 column). |
| `rowWith2Columns` | This method generates a group element in VueForm with 2 items per row. |
| `rowWith3Columns` | This method generates a group element in VueForm with 3 items per row. |
| `rowWith4Columns` | This method generates a group element in VueForm with 4 items per row. |
| `rowWith6Columns` | This method generates a group element in VueForm with 6 items per row. |