Skip to content
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions modules/backend/ServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ protected function registerAssetBundles()
$combiner->registerBundle('~/modules/backend/formwidgets/codeeditor/assets/less/codeeditor.less');
$combiner->registerBundle('~/modules/backend/formwidgets/repeater/assets/less/repeater.less');
$combiner->registerBundle('~/modules/backend/formwidgets/codeeditor/assets/js/build.js');
$combiner->registerBundle('~/modules/backend/formwidgets/fieldset/assets/less/fieldset.less');
$combiner->registerBundle('~/modules/backend/formwidgets/fileupload/assets/less/fileupload.less');
$combiner->registerBundle('~/modules/backend/formwidgets/nestedform/assets/less/nestedform.less');
$combiner->registerBundle('~/modules/backend/formwidgets/richeditor/assets/js/build-plugins.js');
Expand Down Expand Up @@ -248,6 +249,7 @@ protected function registerBackendWidgets()
$manager->registerFormWidget(\Backend\FormWidgets\ColorPicker::class, 'colorpicker');
$manager->registerFormWidget(\Backend\FormWidgets\DataTable::class, 'datatable');
$manager->registerFormWidget(\Backend\FormWidgets\DatePicker::class, 'datepicker');
$manager->registerFormWidget(\Backend\FormWidgets\FieldSet::class, 'fieldset');
$manager->registerFormWidget(\Backend\FormWidgets\FileUpload::class, 'fileupload');
$manager->registerFormWidget(\Backend\FormWidgets\IconPicker::class, 'iconpicker');
$manager->registerFormWidget(\Backend\FormWidgets\MarkdownEditor::class, 'markdown');
Expand Down
82 changes: 82 additions & 0 deletions modules/backend/formwidgets/FieldSet.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
<?php
namespace Backend\FormWidgets;

use Backend\Classes\FormWidgetBase;
use Backend\Widgets\Form;

/**
* FieldSet
* Renders a fieldset from multiple form fields.
*
* @package winter\wn-backend-module
* @author Marc Jauvin <marc.jauvin@gmail.com>
*/
class FieldSet extends FormWidgetBase
{
/**
* @inheritDoc
*/
protected $defaultAlias = 'fieldset';

/**
* @var array Form configuration
*/
public $form;

public $showLabels = false;

/**
* @var Form form widget reference
*/
protected $formWidget;

/**
* @inheritDoc
*/
public function init()
{
$this->fillFromConfig([
'form',
]);

if ($this->formField->disabled) {
$this->previewMode = true;
}

$config = $this->makeConfig($this->form);
$config->model = $this->model;
$config->data = $this->getLoadValue();
$config->alias = $this->alias . $this->defaultAlias;
// set arrayName from parent form to save fields to the model
$config->arrayName = $this->getParentForm()->arrayName;
$config->isNested = true;

$this->formWidget = $widget = $this->makeWidget(Form::class, $config);
$widget->previewMode = $this->previewMode;
$widget->bindToController();
}

protected function loadAssets()
{
$this->addCss('css/fieldset.css', 'core');
}

public function getFormFields()
{
return $this->formWidget->getFields();
}

/**
* @inheritdoc
*/
public function render()
{
$this->prepareVars();
return $this->makePartial('fieldset');
}

public function prepareVars()
{
$this->formWidget->previewMode = $this->previewMode;
}
}
9 changes: 9 additions & 0 deletions modules/backend/formwidgets/fieldset/assets/css/fieldset.css

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

52 changes: 52 additions & 0 deletions modules/backend/formwidgets/fieldset/assets/less/fieldset.less
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
@import "../../../../assets/less/core/boot.less";

@panel-bg: #f5f5f5;
@panel-bg-dark: #000;

.fieldset {
position: relative;
min-height: 30px;

border: 1px solid @input-border;
border-radius: 0.5rem;
box-shadow: @input-box-shadow;

margin-top: 5px;
padding: 1em 1.25em 0 1.25em;

background: @panel-bg;
@media (prefers-color-scheme: dark) {
background: @panel-bg-dark;
}

& > legend {
border: none;
margin: 0;
padding-inline: 1rem;
width: fit-content;
font-size: 18px;
color: inherit;
}
.control-tabs.primary-tabs {
.nav-tabs {
margin: 0;
> li.active > a:before {
background-color: @panel-bg;
border-color: @panel-bg;
@media (prefers-color-scheme: dark) {
background-color: @panel-bg-dark;
border-color: @panel-bg-dark;
}
}

> li > a > span.title {
&:before, &:after {
background-color: @panel-bg;
@media (prefers-color-scheme: dark) {
background-color: @panel-bg-dark;
}
}
}
}
}
}
9 changes: 9 additions & 0 deletions modules/backend/formwidgets/fieldset/partials/_fieldset.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<?php $label = object_get($this->config, 'label'); ?>

<fieldset class="fieldset">
<?php if ($label): ?>
<legend><?= trans($label) ?></legend>
<?php endif ?>

<?= $this->formWidget->render() ?>
</fieldset>
17 changes: 17 additions & 0 deletions modules/backend/widgets/Form.php
Original file line number Diff line number Diff line change
Expand Up @@ -1221,6 +1221,23 @@ public function getSaveData(): array
continue;
}

// get nested widget fields that should be saved to the model
if (method_exists($widget, 'getFormFields')) {
foreach ($widget->getFormFields() as $field) {
$parts = HtmlHelper::nameToArray($field->fieldName);
if (($value = $this->dataArrayGet($data, $parts)) !== null) {
/*
* Number fields should be converted to integers
*/
if ($field->type === 'number') {
$value = !strlen(trim($value)) ? null : (float) $value;
}

$this->dataArraySet($result, $parts, $value);
}
}
}

// Exclude fields that didn't provide any value
$fieldValue = $this->dataArrayGet($result, $parts, FormField::NO_SAVE_DATA);
if ($fieldValue === FormField::NO_SAVE_DATA) {
Expand Down
Loading