formfeed-uk/nova-dependable-panel

一个充当分组 dependsOn 功能面板的 Laravel Nova 字段

1.2.3 2023-01-05 15:27 UTC

This package is auto-updated.

Last update: 2024-09-17 02:43:54 UTC


README

Laravel Nova包添加了面板,允许分组 dependsOn 功能

Dusk 测试仓库: https://github.com/Formfeed-UK/nova-dependable-panel-tests

要求

  • php: ^7.3|^8.0
  • laravel/nova: ^4.0

功能

  • 将此面板内所有 fields 的 dependsOn 请求合并为一个请求
  • 根据 dependsOn 函数隐藏/显示整个面板
  • 根据 dependsOn 函数更改面板内的字段
  • 为面板内所有字段创建批量 dependsOn 函数,(在字段级别覆盖)
  • 与 Nova 选项卡兼容
  • 与 Nova 可扩展内容的分支兼容,允许在布局组内使用 dependsOn 字段
  • 字段可以添加到现有面板或分离到新的面板

注意,此包是字段的扩展,而不是面板,但是当使用 separatePanel 方法时,它可以充当面板。这是为了在使用现有面板的字段时提供更多灵活性。

安装

使用 composer 将包安装到使用 Nova 的 Laravel 应用程序中

composer require formfeed-uk/nova-dependable-panel

使用方法

基本用法

基于 dependsOn 函数隐藏整个面板

    use FormFeed\DependablePanel\DependablePanel;

    public function fields(NovaRequest $request)
    {
        return [
            Select::make('Select', 'select')->options([
                'option1' => 'Option 1',
                'option2' => 'Option 2',
            ]),
            DependablePanel::make('Panel Title', [
                Text::make('Field 1'),
                Text::make('Field 2'),
            ])
            ->dependsOn(["select"], function (DependablePanel $panel, NovaRequest $request, FormData $formData) {
                if ($formData['select'] == "option1") {
                    $panel->hide();
                }
            }),
        ];
    }

面板内所有字段的单个 dependsOn 请求

所有文本字段的 dependsOn 请求将使用 singleRequest 方法发送为一个请求。这有助于减少大型表单上的请求数量,并提高用户体验,因为字段同时更改。

    use FormFeed\DependablePanel\DependablePanel;

    public function fields(NovaRequest $request)
    {
        return [
            DependablePanel::make('Panel Title', [
                Select::make('Select', 'select')->options([
                    'option1' => 'Option 1',
                    'option2' => 'Option 2',
                ]),
                Text::make('Hide Field 1')
                    ->dependsOn(["select"], function (Text $field, NovaRequest $request, FormData $formData) {
                        if ($formData['select'] == "option1") {
                            $field->hide();
                        }
                    }),
                Text::make('Hide Field 2')
                    ->dependsOn(["select"], function (Text $field, NovaRequest $request, FormData $formData) {
                        if ($formData['select'] == "option1") {
                            $field->hide();
                        }
                    }),
                Text::make('Show Field 3')
                    ->hide()
                    ->dependsOn(["select"], function (Text $field, NovaRequest $request, FormData $formData) {
                        if ($formData['select'] == "option1") {
                            $field->show();
                        }
                    }),
                Text::make('Show Field 4')
                    ->hide()
                    ->dependsOn(["select"], function (Text $field, NovaRequest $request, FormData $formData) {
                        if ($formData['select'] == "option1") {
                            $field->show();
                        }
                    }),
            ])
            ->singleRequest(true);
        ];
    }

为所有包含字段批量 dependsOn 功能

您还可以使用 applyToFields 方法为面板内的所有字段批量 dependsOn 功能。例如,如果您需要所有字段都变为只读。这可以在字段级别进行覆盖。

注意:第一个参数应该是 Field 类型,以确保函数可以应用于面板内的所有字段,无论其类型如何。

    use FormFeed\DependablePanel\DependablePanel;

    public function fields(NovaRequest $request)
    {
        return [
            DependablePanel::make('Panel Title', [
                Select::make('Select', 'select')->options([
                    'option1' => 'Option 1',
                    'option2' => 'Option 2',
                ]),
                Text::make('Field 1'),
                Text::make('Field 2'),
                Text::make('Field 3')
                ->dependsOn(['select'], function (Text $field, NovaRequest $request, FormData $formData) {
                    if ($formData['select'] == "option1") {
                        $field->readOnly(false);
                    }
                })
            ])
            ->dependsOn(["select"], function (DependablePanel $panel, NovaRequest $request, FormData $formData) {
                $panel->applyToFields(function (Field $field, NovaRequest $request, FormData $formData) {
                    if ($formData['select'] == "option1") {
                        $field->readOnly();
                    }
                });
            }),
        ];
    }

分离面板

Nova Dependable Panel 中的字段可以是任何其他面板的一部分(默认),或者可以使用 separatePanel 方法分离到另一个面板。

此面板将使用 DependablePanel 的第一个参数作为其面板名称。

    use FormFeed\DependablePanel\DependablePanel;

    public function fields(NovaRequest $request)
    {
        return [
            DependablePanel::make('Panel Title', [
                Select::make('Select', 'select')->options([
                    'option1' => 'Option 1',
                    'option2' => 'Option 2',
                ]),
                Text::make('Field 1'),
                Text::make('Field 2'),
                Text::make('Field 3')
            ])
            ->separatePanel(true)   
        ];
    }

根据 dependsOn 更改面板内的字段

而不是隐藏/显示字段,您可以使用 fields 方法更改字段本身。注意,此功能需要 singleRequest 正确运行。

    use FormFeed\DependablePanel\DependablePanel;

    public function fields(NovaRequest $request)
    {
        return [
            Select::make('Select', 'select')->options([
                'option1' => 'Option 1',
                'option2' => 'Option 2',
            ]),
            DependablePanel::make('Panel Title', [
                Text::make('Field 1'),
                Text::make('Field 2'),
            ])
            ->singleRequest(true)
            ->dependsOn(["select"], function (DependablePanel $panel, NovaRequest $request, FormData $formData) {
                if ($formData['select'] == "option1") {
                    $panel->fields([
                        Text::make('Field 3'),
                        Text::make('Field 4'),
                    ]);
                }
            }),
        ];
    }

注意:如果通过 fields 方法添加的字段也定义了 dependsOn,并且您希望在字段首次挂载时正确应用这些 dependsOn 混合,则应在面板的 dependsOn 函数中包含它们依赖的字段。

以下示例中,如果勾选了“只读”复选框,然后将选择项更改为“选项 1”,为了使这些字段在挂载时为只读,您可以看到“readonly”需要包含在面板的 dependsOn 函数中。

    use FormFeed\DependablePanel\DependablePanel;

    public function fields(NovaRequest $request)
    {
        return [
            Select::make('Select', 'select')->options([
                'option1' => 'Option 1',
                'option2' => 'Option 2',
            ]),
            Boolean::make('Readonly'),
            DependablePanel::make('Panel Title', [
                Text::make('Field 1'),
                Text::make('Field 2'),
            ])
            ->singleRequest(true)
            ->dependsOn(["select", "readonly"], function (DependablePanel $panel, NovaRequest $request, FormData $formData) {
                if ($formData['select'] == "option1") {
                    $panel->fields([
                        Text::make('Field 3')
                            ->dependsOn(["readonly"], function (Text $field, NovaRequest $request, FormData $formData) {
                                if ($formData['readonly']) {
                                    $field->readonly();
                                }
                            }),
                        Text::make('Field 4')
                            ->dependsOn(["readonly"], function (Text $field, NovaRequest $request, FormData $formData) {
                                if ($formData['readonly']) {
                                    $field->readonly();
                                }
                            }),
                    ]);
                }
            }),
        ];
    }

已知问题

  • dependsOn 函数中不能分离/合并面板,这只能在页面加载时设置一次。
  • 当通过面板的 dependsOn 中的 Fields 方法在不同字段集之间切换时,对于已在数据库中存储了该资源的值的字段,更新表单中的更改值将不会持久化。
  • Nova 的布尔字段由于其在为 null 时被设置为 false 而表现不符合预期,这意味着由可信赖面板更改的布尔字段将变为 false,这并不是一个好的用户体验。一个中间件修复即将到来,但在此期间,建议您在项目中扩展布尔字段并执行以下覆盖:
    protected function resolveDefaultValue(NovaRequest $request)
    {
        return Field::resolveDefaultValue($request);
    }

许可

Nova Dependable Panel 是开源软件,遵循 MIT 许可协议