shaneburrell / livewire-datatables
livewire-datatables 包的分支。此包包含一些修改和新增功能。
Requires
- php: ^7.2.5|^8.0
- illuminate/support: ^7.0|^8.0|^9.0
- livewire/livewire: ^2.4.4
- maatwebsite/excel: ^3.1
- reedware/laravel-relation-joins: ^2.4|^3.0
Requires (Dev)
- laravel/legacy-factories: ^1.0.4
- orchestra/testbench: ^4.0|5.0|6.0|^7.0
- phpunit/phpunit: ^8.0|9.0|^9.5.10
- dev-master
- v0.9.8
- v0.9.7
- v0.9.6
- v0.9.5
- v0.9.3
- v0.9.2
- v0.9.1
- v0.9.0
- v0.8.0
- v0.7.0
- v0.6.8
- v0.6.7
- v0.6.6
- v0.6.5
- v0.6.4
- v0.6.3
- v0.6.2
- v0.6.1
- v0.6.0
- v0.5.4
- v0.5.3
- v0.5.2
- v0.5.1
- v0.5.0
- v0.4.3
- v0.4.2
- v0.4.1
- v0.4.0
- v0.3.1
- v0.3.0
- v0.2.2
- v0.2.1
- v0.2.0
- v0.1.3
- v0.1.2
- v0.1.1
- v0.1.0
- v0.0.4
- v0.0.3
- v0.0.2
- v0.0.1
- dev-relation-refactor
- dev-analysis-NAnyoE
- dev-analysis-L3Kbj6
- dev-analysis-64r1Lo
- dev-analysis-3wr0xr
- dev-thyseus-improve-link-to
- dev-complex-query-builder
- dev-analysis-3wZVoL
- dev-analysis-J2Lrmk
- dev-analysis-rdbGEZ
- dev-exports
- dev-analysis-jLbJRB
- dev-tw2
- dev-analysis-Rv7edK
- dev-pagination-search-fix
- dev-tailwind2
- dev-analysis-64Dxn4
- dev-truncate-search
- dev-query-builder
- dev-analysis-lKoEdw
- dev-lw2
- dev-selectable
- dev-bugfix
This package is auto-updated.
Last update: 2024-09-12 19:56:20 UTC
README
功能
- 使用模型或查询构建器提供数据
- 使用预设或自定义回调修改和格式化列
- 使用列或计算列排序数据
- 使用布尔值、时间、日期、选择或自由文本进行筛选
- 使用 复杂查询构建器 创建复杂组合筛选
- 显示/隐藏列
- 列组
- 支持批量操作
实时演示应用
演示应用仓库
要求
安装
您可以通过 Composer 安装此包
composer require mediconesystems/livewire-datatables
可选
您不需要这样做,但如果您喜欢,可以发布配置文件和 blade 模板资产
php artisan vendor:publish --provider="Mediconesystems\LivewireDatatables\LivewireDatatablesServiceProvider"
这将使您能够修改 blade 视图并应用自己的样式,datatables 视图将发布到 resources/livewire/datatables。配置文件包含在整个应用程序中使用的默认时间和日期格式
- 如果您在项目中使用 Purge CSS,这可能很有用,以确保所有 livewire-datatables 类都被包含在内
一些内置的动态组件使用 Alpine JS,所以要消除页面加载时的闪烁,请确保您的 CSS 中有
[x-cloak] { display: none; }
一些内容
基本用法
- 在 blade 视图中使用
livewire-datatable
组件,并传递一个模型
... <livewire:datatable model="App\User" name="all-users" /> ...
模板语法
- 有很多方法可以通过向组件传递额外的属性来修改表格
<livewire:datatable model="App\User" name="users" include="id, name, dob, created_at" dates="dob" />
注意:请注意,在同一页面上拥有多个数据表或在不同页面上拥有多个同一类型的数据表需要为每个数据表分配唯一的 name
属性,以免与上述示例中的其他数据表冲突。
属性
组件语法
创建一个扩展 Mediconesystems\LivewireDatatables\LivewireDatatable
的 livewire 组件
php artisan make:livewire-datatable foo
--> 'app/Http/Livewire/Foo.php'
php artisan make:livewire-datatable tables.bar
--> 'app/Http/Livewire/Tables/Bar.php'
通过声明公共属性 $model
或公共方法 builder()
(该方法返回 Illuminate\Database\Eloquent\Builder
实例)提供数据源
php artisan make:livewire-datatable users-table --model=user
--> 'app/Http/Livewire/UsersTable.php' withpublic $model = User::class
声明一个公共方法 columns
,该方法返回包含一个或多个 Mediconesystems\LivewireDatatables\Column
的数组
列
可以使用以下静态方法中的任何一种来构建列,然后使用流畅的方法链分配其属性。还有额外的特定类型的 Column;NumberColumn
、DateColumn
、TimeColumn
,使用正确的类型将启用特定类型的格式化和筛选
class ComplexDemoTable extends LivewireDatatable { public function builder() { return User::query(); } public function columns() { return [ NumberColumn::name('id') ->label('ID') ->linkTo('job', 6), BooleanColumn::name('email_verified_at') ->label('Email Verified') ->format() ->filterable(), Column::name('name') ->defaultSort('asc') ->group('group1') ->searchable() ->hideable() ->filterable(), Column::name('planet.name') ->label('Planet') ->group('group1') ->searchable() ->hideable() ->filterable($this->planets), // Column that counts every line from 1 upwards, independent of content Column::index($this); DateColumn::name('dob') ->label('DOB') ->group('group2') ->filterable() ->hide(), (new LabelColumn()) ->label('My custom heading') ->content('This fixed string appears in every row'), NumberColumn::name('dollars_spent') ->enableSummary(), ]; } }
列方法
监听器
组件将监听 refreshLivewireDatatable
事件,这允许您从外部组件刷新表格。
Eloquent 列名
使用Eloquent关系中的列时,可以使用常规的Eloquent点符号表示法,例如:planet.name
。Livewire Datatables会自动添加必要的表连接来包含该列。如果关系是“多”类型(HasMany
、BelongsToMany
、HasManyThrough
),则Livewire Datatables将创建一个聚合子查询(这比连接和分组更高效。感谢@reinink)。默认情况下,聚合类型将针对数字列是count
,针对字符串列是group_concat
,但可以使用冒号分隔符来覆盖。
NumberColumn::name('students.age:sum')->label('Student Sum'), NumberColumn::name('students.age:avg')->label('Student Avg'), NumberColumn::name('students.age:min')->label('Student Min'), NumberColumn::name('students.age:max')->label('Student Max'),
列分组
当您有一个非常大的表且有大量列时,可以创建“列分组”,允许用户一次性切换整个组的可见性。在任意列上使用->group('NAME')
即可实现。您可以通过表格的groupLabels
属性为您的组提供可读的标签和翻译。
class GroupDemoTable extends LivewireDatatable { public $groupLabels = [ 'group1' => 'app.translation_for_group_1' 'group2' => 'app.translation_for_group_2' ]; public function columns() { return [ Column::name('planets.name') ->group('group1') ->label('Planet'), Column::name('planets.name') ->group('group2') ->label('Planet'),
汇总行
如果您需要汇总特定列的所有单元格,可以使用enableSummary()
。
public function columns() { return [ Column::name('dollars_spent') ->label('Expenses in Dollar') ->enableSummary(), Column::name('euro_spent') ->label('Expenses in Euro') ->enableSummary(),
批量操作
如果您想能够一次性对多个记录进行操作,可以在表格中使用buildActions()
方法。
public function buildActions() { return [ Action::value('edit')->label('Edit Selected')->group('Default Options')->callback(function ($mode, $items) { // $items contains an array with the primary keys of the selected items }), Action::value('update')->label('Update Selected')->group('Default Options')->callback(function ($mode, $items) { // $items contains an array with the primary keys of the selected items }), Action::groupBy('Export Options', function () { return [ Action::value('csv')->label('Export CSV')->export('SalesOrders.csv'), Action::value('html')->label('Export HTML')->export('SalesOrders.html'), Action::value('xlsx')->label('Export XLSX')->export('SalesOrders.xlsx')->styles($this->exportStyles)->widths($this->exportWidths) ]; }), ]; }
批量操作样式
如果您只需对批量操作下拉菜单进行少量样式调整,可以在这里调整一些设置。
public function getExportStylesProperty() { return [ '1' => ['font' => ['bold' => true]], 'B2' => ['font' => ['italic' => true]], 'C' => ['font' => ['size' => 16]], ]; } public function getExportWidthsProperty() { return [ 'A' => 55, 'B' => 45, ]; }
固定记录
如果您想允许用户将特定记录固定以进行比较,可以使用CanPinRecords特质。请确保至少有一个复选框列,以便用户可以选择记录。
use Mediconesystems\LivewireDatatables\Traits\CanPinRecords; class RecordTable extends LivewireDatatable { use CanPinRecords; public $model = Record::class; public function columns() { return [ Column::checkbox(), // ...
自定义列名
您仍然可以完全控制您的表格,可以使用任意的查询定义一个builder
方法,使用您自己的连接、分组等,然后使用正常的SQL语法命名您的列。
public function builder() { return User::query() ->leftJoin('planets', 'planets.id', 'users.planet_id') ->leftJoin('moons', 'moons.id', 'planets.moon_id') ->groupBy('users.id'); } public function columns() { return [ NumberColumn::name('id') ->filterable(), Column::name('planets.name') ->label('Planet'), Column::raw('GROUP_CONCAT(planets.name SEPARATOR " | ") AS `Moon`'), ... }
回调
回调允许您在数据在表格中显示之前进行任何突变。
- 回调是在数据库查询的分页结果上执行的,因此不应消耗太多内存。
- 回调将接收所选列作为其参数。
- 回调可以如以下所示内联定义,也可以作为Datatable类的公共方法定义,通过将名称作为字符串作为回调方法的第二个参数传递来引用。
- 如果您想为导出格式化结果不同,请使用
->exportCallback(Closure $callback)
。
class CallbackDemoTable extends LivewireDatatable { public model = User::class public function columns() { return [ Column::name('users.id'), Column::name('users.dob')->format(), Column::callback(['dob', 'signup_date'], function ($dob, $signupDate) { $age = $signupDate->diffInYears($dob); return $age > 18 ? '<span class="text-red-500">' . $age . '</span>' : $age; })->exportCallback(function ($dob, $signupDate), { return $age = $signupDate->diffInYears($dob); }), ... } }
视图
您可以指定一个列的输出直接流入到单独的blade视图模板。
- 模板使用常用的Laravel视图助手语法指定。
- 视图将接收列的值作为
$value
,以及整个查询行作为$row
。
class CallbackDemoTable extends LivewireDatatable { public model = User::class public function columns() { return [ Column::name('users.id'), Column::name('users.dob')->view('tables.dateview'), Column::name('users.signup_date')->format(), ]; }
'tables/dateview.blade.php' <span class="mx-4 my-2 bg-pink-500"> <x-date-thing :value="$value" /> </span>
可编辑列
您可以使用editable
标记一列,这将使用上面的view()
方法将数据传递到可以直接更新底层数据库数据的Alpine/Livewire组件。需要列使用标准Laravel命名定义column
。这只是一个示例。可以通过上面的回调或视图方法构建更全面的自定义可编辑列,包括验证等。
class EditableTable extends LivewireDatatable { public $model = User::class; public function columns() { return [ Column::name('id') ->label('ID') ->linkTo('job', 6), Column::name('email') ->editable(), ... ]; } }
复杂查询构建器
只需将$complex = true
添加到您的Datatable类中,所有可筛选列都将可用在复杂查询构建器中。
功能
- 使用AND/OR逻辑组合规则和规则组
- 在界面中拖放规则
持久化查询(需要AlpineJS v3及$persist插件)
- 将
$persistComplexQuery = true
添加到您的类中,并将查询存储在浏览器localStorage中。 - 默认情况下,localStorage键将是类名。您可以通过设置公共属性
$persistKey
或覆盖Datatable类上的getPersistKeyProperty()
来提供自己的键。 - 例如:对于用户特定的持久化
public function getPersistKeyProperty() { return Auth::id() . '-' . parent::getPersistKeyProperty(); }
保存查询
如果您想永久保存查询,必须提供3种方法来添加、删除和检索您的保存查询,可以使用您喜欢的任何逻辑
public function saveQuery(String $name, Array $rules)
public function deleteQuery(Int $id)
public function getSavedQueries()
- 在您的保存和删除方法中,请确保触发一个
updateSavedQueries
livewire 事件,并传递一个新的结果数组(见以下示例)
示例
此示例展示了使用属于用户的常规 Laravel ComplexQuery 模型保存查询
/* Migration */ class CreateComplexQueriesTable extends Migration { public function up() { Schema::create('complex_queries', function (Blueprint $table) { $table->id(); $table->unsignedInteger('user_id'); $table->string('table'); $table->json('rules'); $table->string('name'); $table->timestamps(); }); } } /* Model */ class ComplexQuery extends BaseModel { protected $casts = ['rules' => 'array']; public function user() { return $this->belongsTo(User::class); } } /* Datatable Class */ class TableWithSaving extends LivewireDatatable { ... public function saveQuery($name, $rules) { Auth::user()->complex_queries()->create([ 'table' => $this->name, 'name' => $name, 'rules' => $rules ]); $this->emit('updateSavedQueries', $this->getSavedQueries()); } public function deleteQuery($id) { ComplexQuery::destroy($id); $this->emit('updateSavedQueries', $this->getSavedQueries()); } public function getSavedQueries() { return Auth::user()->complex_queries()->where('table', $this->name)->get(); } ... }
样式
我知道提供带有大量主观标记和样式的包并不酷。大多数其他包似乎都走上了传递可选类作为参数或配置变量的道路。我的观点是,由于这只是一个带有 Tailwind 的 Blade,因此您可以发布模板并对它们做任何您想做的事情——Livewire 和 Alpine 的运动部分应该很明显。
有方法可以应用于行和单元格的样式。 rowClasses
接收 $row
和 laravel 循环变量 作为参数。 cellClasses
接收 $row
和 $column
例如
public function rowClasses($row, $loop) { return 'divide-x divide-gray-100 text-sm text-gray-900 ' . ($this->rowIsSelected($row) ? 'bg-yellow-100' : ($row->{'car.model'} === 'Ferrari' ? 'bg-red-500' : ($loop->even ? 'bg-gray-100' : 'bg-gray-50'))); } public function cellClasses($row, $column) { return 'text-sm ' . ($this->rowIsSelected($row) ? ' text-gray-900' : ($row->{'car.model'} === 'Ferrari' ? ' text-white' : ' text-gray-900')); }
您可以通过更改 livewire-datatables.php
配置文件中的 default_classes
来更改 rowClasses
和 cellClasses
方法应用的默认 CSS 类。
您还可以在表的类中覆盖 render 方法,为不同的表提供不同的模板。