海南旅游SAAS
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

143 lines
3.4 KiB

<?php
namespace App\Admin\Extensions\Form;
use Dcat\Admin\Form\Field\Radio;
use Dcat\Admin\Widgets\Radio as WidgetRadio;
/**
* 由于信息收集表单中,hasMany中的radio存在多个时出现问题,故重写覆盖
* Class Radio2
* @package App\Admin\Extensions\Form
*/
class Radio2 extends Radio
{
protected $view = 'admin::form.radio';
/**
* {@inheritdoc}
*/
public function render()
{
if ($this->options instanceof \Closure) {
$this->options(
$this->options->call($this->values(), $this->value(), $this)
);
}
$this->addCascadeScript();
$radio = WidgetRadio::make($this->getElementName(), $this->options, $this->style);
if ($this->attributes['disabled'] ?? false) {
$radio->disable();
}
$radio
->inline($this->inline)
->check($this->value())
->class($this->getElementClassString())
->size($this->size);
$this->addVariables([
'radio' => $radio,
]);
return parent::render();
}
/**
* Add cascade scripts to contents.
*
* @return string
*/
protected function getCascadeScript()
{
if (empty($this->conditions)) {
return;
}
$cascadeGroups = collect($this->conditions)->map(function ($condition) {
return [
'class' => $this->getCascadeClass($condition['value'], $condition['operator']),
'operator' => $condition['operator'],
'value' => $condition['value'],
];
})->toJson();
return <<<JS
(function () {
var compare = function (a, b, o) {
if (! $.isArray(b)) {
return operator_table[o](a, b)
}
if (o === '!=') {
var result = true;
for (var i in b) {
if (! operator_table[o](a, b[i])) {
result = false;
break;
}
}
return result;
}
for (var i in b) {
if (operator_table[o](a, b[i])) {
return true;
}
}
};
var operator_table = {
'=': function(a, b) {
if ($.isArray(a) && $.isArray(b)) {
return $(a).not(b).length === 0 && $(b).not(a).length === 0;
}
return String(a) === String(b);
},
'>': function(a, b) {
return a > b;
},
'<': function(a, b) {
return a < b;
},
'>=': function(a, b) { return a >= b; },
'<=': function(a, b) { return a <= b; },
'!=': function(a, b) {
return ! operator_table['='](a, b);
},
'in': function(a, b) { return Dcat.helpers.inObject(a, String(b), true); },
'notIn': function(a, b) { return ! Dcat.helpers.inObject(a, String(b), true); },
'has': function(a, b) { return Dcat.helpers.inObject(b, String(b), true); },
};
var cascade_groups = {$cascadeGroups}, event = '{$this->cascadeEvent}';
\$this.on(event, function (e) {
{$this->getFormFrontValue()}
cascade_groups.forEach(function (event) {
var group = $(e.target).closest('.form-group.form-field').next('div.cascade-group.'+event.class);
if (compare(checked, event.value, event.operator)) {
group.removeClass('d-none');
} else {
group.addClass('d-none');
}
});
}).trigger(event);
})();
JS;
}
/**
* @return string
*/
protected function getFormFrontValue()
{
return <<<JS
var checked = $('{$this->getElementClassSelector()}:checked').val();
JS;
}
}