2 changed files with 148 additions and 2 deletions
@ -0,0 +1,143 @@ |
|||||
|
<?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; |
||||
|
} |
||||
|
} |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue