diff --git a/plugin/think-library/src/builder/form/component/PickerFieldComponent.php b/plugin/think-library/src/builder/form/component/PickerFieldComponent.php
index 41d1881b7..e221ad3bf 100644
--- a/plugin/think-library/src/builder/form/component/PickerFieldComponent.php
+++ b/plugin/think-library/src/builder/form/component/PickerFieldComponent.php
@@ -28,7 +28,7 @@ class PickerFieldComponent extends AbstractFormComponent
public function mount(FormNode $parent): FormNode
{
- $node = $parent->node('label')->class(trim(strval($this->config['class'] ?? 'relative block')));
+ $node = $parent->node('label')->class(trim(strval($this->config['class'] ?? 'block')));
foreach ((array)($this->config['attrs'] ?? []) as $name => $value) {
$node->attr(strval($name), $value);
}
@@ -51,9 +51,14 @@ class PickerFieldComponent extends AbstractFormComponent
]);
}
- $input = $node->node('input')->attrs([
+ $control = $node->div()->class(trim(strval($this->config['control_class'] ?? 'relative')));
+ foreach ((array)($this->config['control_attrs'] ?? []) as $name => $value) {
+ $control->attr(strval($name), $value);
+ }
+
+ $input = $control->node('input')->attrs([
'readonly' => null,
- 'class' => trim(strval($this->config['input_class'] ?? 'layui-input')),
+ 'class' => trim(strval($this->config['input_class'] ?? 'layui-input pr40')),
'value' => strval($this->config['value'] ?? ''),
'title' => strval($this->config['value'] ?? ''),
]);
@@ -64,7 +69,7 @@ class PickerFieldComponent extends AbstractFormComponent
foreach ((array)($this->config['input_attrs'] ?? []) as $name => $value) {
$input->attr(strval($name), $value);
}
- $icon = $node->node('span')->class(trim(strval($this->config['icon_class'] ?? 'input-right-icon layui-icon layui-icon-theme')));
+ $icon = $control->node('span')->class(trim(strval($this->config['icon_class'] ?? 'input-right-icon layui-icon layui-icon-theme')));
foreach ((array)($this->config['icon_attrs'] ?? []) as $name => $value) {
$icon->attr(strval($name), $value);
}
diff --git a/plugin/think-plugs-system/src/builder/MenuBuilder.php b/plugin/think-plugs-system/src/builder/MenuBuilder.php
index b1f45dd11..d1e258ab3 100644
--- a/plugin/think-plugs-system/src/builder/MenuBuilder.php
+++ b/plugin/think-plugs-system/src/builder/MenuBuilder.php
@@ -153,6 +153,7 @@ SCRIPT);
$form->action(strval($context['actionUrl'] ?? ''))
->attrs(['id' => 'MenuForm', 'data-table-id' => 'MenuTable'])
->class('system-menu-form');
+ $form->html('');
FormModules::section($form, [
'title' => '层级归属',
@@ -236,7 +237,7 @@ SCRIPT);
$fields = $grid->div()->class('layui-col-xs12 layui-col-md6');
$fields->fields(function ($fields) {
- $fields->text('icon', '菜单图标', 'Menu Icon', false, '可手动输入图标类名,或通过右侧图标选择器回填。', null, [
+ $status = $fields->text('icon', '菜单图标', 'Menu Icon', false, '可手动输入图标类名,或通过右侧图标选择器回填。', null, [
'placeholder' => '例如:layui-icon layui-icon-set-fill',
])->text('sort', '排序权重', 'Sort Order', false, '数值越大越靠前。', null, [
'type' => 'number',
@@ -244,7 +245,8 @@ SCRIPT);
'placeholder' => '请输入排序权重',
])->defaultValue(0)->radio('status', '使用状态', 'Status', '', true, [
'required-error' => '请选择当前菜单的启用状态。',
- ])->options([
+ ]);
+ $status->body()->class('system-menu-status-options')->end()->options([
1 => '已启用',
0 => '已禁用',
])->defaultValue('1');
@@ -255,6 +257,9 @@ SCRIPT);
'title' => '图标选择器',
'subtitle' => 'Icon Picker',
'value' => '点击打开图标选择器',
+ 'class' => 'block system-menu-icon-picker',
+ 'control_class' => 'relative',
+ 'input_class' => 'layui-input pr40',
'attrs' => ['data-open-menu-icon' => null],
'input_attrs' => [
'data-open-menu-icon' => null,
@@ -264,7 +269,7 @@ SCRIPT);
'icon_attrs' => ['data-open-menu-icon' => null],
'help' => '选择后会自动同步到“菜单图标”字段,并实时预览当前图标样式。',
]);
- $picker->div()->class('layui-form-mid color-desc')->html(sprintf(
+ $picker->div()->class('layui-form-mid color-desc system-menu-icon-preview')->html(sprintf(
'%s',
self::escape(BuilderLang::text('未设置图标'))
));
@@ -345,6 +350,55 @@ SCRIPT;
return strval(json_encode($value, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT));
}
+ private static function renderFormStyle(): string
+ {
+ return <<<'STYLE'
+#MenuForm .system-menu-icon-picker .layui-input {
+ cursor: pointer;
+ padding-right: 44px !important;
+}
+#MenuForm .system-menu-icon-picker .input-right-icon {
+ top: 1px;
+ right: 1px;
+ width: 34px;
+ height: 32px;
+ line-height: 32px;
+ box-sizing: border-box;
+ border-left: 1px solid var(--ta-border-color, #dce8e5);
+ border-radius: 0 3px 3px 0;
+}
+#MenuForm .system-menu-icon-preview {
+ min-height: 20px;
+ margin-top: 8px;
+ padding: 0 2px;
+ line-height: 20px;
+}
+#MenuForm .system-menu-icon-preview .layui-icon {
+ width: 18px;
+ text-align: center;
+}
+#MenuForm [data-field-name="status"] .system-menu-status-options {
+ height: auto !important;
+ min-height: 34px !important;
+ padding: 1px 0 1px 8px !important;
+ line-height: 32px !important;
+ align-items: center;
+ box-sizing: border-box;
+ border-color: var(--ta-border-color, #dce8e5);
+ background: var(--ta-surface-soft, #f7fbfb) !important;
+}
+#MenuForm [data-field-name="status"] .system-menu-status-options .layui-form-radio {
+ margin: 0 18px 0 0;
+ padding-right: 0;
+ line-height: 32px;
+}
+#MenuForm [data-field-name="status"] .system-menu-status-options .layui-form-radio > i {
+ margin-right: 5px;
+ font-size: 18px;
+}
+STYLE;
+ }
+
private static function renderFormScript(): string
{
return sprintf(<<<'SCRIPT'