Laravel-Backpack / community-forum

A workspace to discuss improvement and feature ideas, before they're actually implemented.
28 stars 0 forks source link

[Feature|HasCode] Allow select_grouped to work with multiple selections #202

Open pxpm opened 3 years ago

tabacitu commented 3 years ago

Agreed - sounds like something we should have 😀 Nice feature request - short and concise 😂

kasperbjerby commented 2 years ago

Here you go

<!-- select_multiple_grouped -->
@php
    $field['allows_null'] = $field['allows_null'] ?? true;

    $field['value'] = old_empty_or_null($field['name'], collect()) ??  $field['value'] ?? $field['default'] ?? collect();

    if (is_a($field['value'], \Illuminate\Support\Collection::class)) {
        $field['value'] = $field['value']->pluck(app($field['model'])->getKeyName())->toArray();
    }

    $related_model = $field['model'];
    $group_by_model = (new $related_model)->{$field['group_by']}()->getRelated();
    $categories = $group_by_model::with($field['group_by_relationship_back'])->get();
    if (isset($field['model'])) {
        $categorylessEntries = $related_model::doesnthave($field['group_by'])->get();
    }
@endphp

@include('crud::fields.inc.wrapper_start')
    <label>{!! $field['label'] !!}</label>
    @include('crud::fields.inc.translatable_icon')
    {{-- To make sure a value gets submitted even if the "select multiple" is empty, we need a hidden input --}}
    <input type="hidden" name="{{ $field['name'] }}" value="" @if(in_array('disabled', $field['attributes'] ?? [])) disabled @endif />
    <select
        name="{{ $field['name'] }}[]"
        @include('crud::fields.inc.attributes', ['default_class' =>  'form-control'])
        bp-field-main-input
        multiple>

            @if ($field['allows_null'])
                <option value="">-</option>
            @endif

            @if (isset($field['model']) && isset($field['group_by']))
                @foreach ($categories as $category)
                    <optgroup label="{{ $category->{$field['group_by_attribute']} }}">
                        @foreach ($category->{$field['group_by_relationship_back']} as $option)
                            @if(in_array($option->getKey(), $field['value']))
                                <option value="{{ $option->getKey() }}" selected>{{ $option->{$field['attribute']} }}</option>
                            @else
                                <option value="{{ $option->getKey() }}">{{ $option->{$field['attribute']} }}</option>
                            @endif
                        @endforeach
                    </optgroup>
                @endforeach

                @if ($categorylessEntries->count())
                    <optgroup label="-">
                        @foreach ($categorylessEntries as $option)
                            @if($current_value == $option->getKey())
                                <option value="{{ $option->getKey() }}" selected>{{ $option->{$field['attribute']} }}</option>
                            @else
                                <option value="{{ $option->getKey() }}">{{ $option->{$field['attribute']} }}</option>
                            @endif
                        @endforeach
                    </optgroup>
                @endif
            @endif
    </select>

    {{-- HINT --}}
    @if (isset($field['hint']))
        <p class="help-block">{!! $field['hint'] !!}</p>
    @endif
@include('crud::fields.inc.wrapper_end')