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
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;
|
|
}
|
|
}
|