From e84be27dfed87105c1b7c0ecd39566a2ef074bca Mon Sep 17 00:00:00 2001 From: Mark Salmon Date: Thu, 6 Jan 2022 14:45:49 +0000 Subject: [PATCH 01/46] wip --- composer.json | 3 +- src/Column.php | 49 ++++++++++++++++++++ src/Http/Livewire/LivewireDatatable.php | 60 +++++++++++++++++++------ 3 files changed, 97 insertions(+), 15 deletions(-) diff --git a/composer.json b/composer.json index 963137f4..8a2b19bb 100644 --- a/composer.json +++ b/composer.json @@ -19,7 +19,8 @@ "php": "^7.2.5|^8.0", "illuminate/support": "^7.0|^8.0", "livewire/livewire": "^2.4.4", - "maatwebsite/excel": "^3.1" + "maatwebsite/excel": "^3.1", + "reedware/laravel-relation-joins": "^2.4" }, "require-dev": { "laravel/legacy-factories": "^1.0.4", diff --git a/src/Column.php b/src/Column.php index 1972f94a..4e77fab5 100644 --- a/src/Column.php +++ b/src/Column.php @@ -373,6 +373,55 @@ public function group($group) return $this; } + public function resolveName($query) + { + return $this->isBaseColumn() + ? $query->getModel()->getTable() . '.' . ($this->base ?? Str::before($this->name, ':')) + : $this->joinRelations($query); + } + + public function joinRelations($query) + { + $parts = explode('.', Str::before($this->name, ':')); + + $columnName = array_pop($parts); + // callsign + + $relation = implode('.', $parts); + // job.crew + + $table = ''; + $model = ''; + $lastQuery = $query; + foreach (explode('.', $relation) as $eachRelation) { + $model = $lastQuery->getRelation($eachRelation); + + ray( + $eachRelation, + $lastQuery + // collect($lastQuery->getQuery()->joins)->pluck('table'), + // $model->getQuery()->from, + // collect($lastQuery->getQuery()->joins)->pluck('table')->contains( + // $model->getQuery()->from + // ) + )->purple(); + if ( + ! collect($lastQuery->getQuery()->joins)->pluck('table')->contains( + $model->getQuery()->from + ) + ) { + ray($eachRelation, collect($lastQuery->getQuery()->joins)->pluck('table'), $model->getQuery()->from)->red(); + $query->leftJoinRelation($model); + } + + + + $lastQuery = $model->getQuery(); + } + + return $lastQuery->getQuery()->from . '.' . $columnName; + } + public function relations() { return $this->isBaseColumn() ? null : collect(explode('.', Str::beforeLast($this->name, '.'))); diff --git a/src/Http/Livewire/LivewireDatatable.php b/src/Http/Livewire/LivewireDatatable.php index 15a91e45..a4cfd2c6 100644 --- a/src/Http/Livewire/LivewireDatatable.php +++ b/src/Http/Livewire/LivewireDatatable.php @@ -313,22 +313,16 @@ public function getProcessedColumnsProperty() ->sort($this->sort); } - public function resolveColumnName($column) - { - return $column->isBaseColumn() - ? $this->query->getModel()->getTable() . '.' . ($column->base ?? Str::before($column->name, ':')) - : $column->select ?? $this->resolveRelationColumn($column->base ?? $column->name, $column->aggregate); - } - public function resolveCheckboxColumnName($column) { - $column = is_object($column) - ? $column->toArray() - : $column; + // $column = is_object($column) + // ? $column->toArray() + // : $column; - return Str::contains($column['base'], '.') - ? $this->resolveRelationColumn($column['base'], $column['aggregate']) - : $this->query->getModel()->getTable() . '.' . $column['base']; + return $this->resolveColumnName($column); + // return Str::contains($column['base'], '.') + // ? $this->resolveRelationColumn($column['base'], $column['aggregate']) + // : $this->query->getModel()->getTable() . '.' . $column['base']; } public function resolveAdditionalSelects($column) @@ -372,13 +366,13 @@ public function getSelectStatements($withAlias = false, $export = false) } if (Str::startsWith($column->name, 'callback_')) { + ray($column)->red(); $column->select = $this->resolveAdditionalSelects($column); return $column; } $column->select = $this->resolveColumnName($column); - if ($column->isEditable()) { $column->select = $this->resolveEditableColumnName($column); } @@ -412,6 +406,44 @@ public function getSelectStatements($withAlias = false, $export = false) }); } + protected function resolveColumnName($column) + { + if ($column->isBaseColumn()) { + return $this->query->getModel()->getTable() . '.' . ($column->base ?? Str::before($column->name, ':')); + } + + $relations = explode('.', Str::before($column->name, ':')); + $aggregate = Str::after($column->name, ':'); + + if (! method_exists($this->query->getModel(), $relations[0])) { + return $column->name; + } + + $columnName = array_pop($relations); + $aggregateName = implode('.', $relations); + + $relatedQuery = $this->query; + + while (count($relations) > 0) { + $relation = array_shift($relations); + + $useThrough = collect($relatedQuery->getQuery()->joins) + ->pluck('table') + ->contains($relatedQuery->getRelation($relation)->getRelated()->getTable()); + + // BAIL HERE AND DO THE AGGREGATE THING + + if ($relatedQuery->getRelation($relation) instanceof HasMany || $relatedQuery->getRelation($relation) instanceof BelongsToMany) { + $this->query->customWithAggregate($aggregateName, $column->aggregate ?? 'count', $columnName, $column->name); + return null; + } + + $relatedQuery = $this->query->joinRelation($relation, null, 'left', $useThrough, $relatedQuery); + } + + return $relatedQuery->getQuery()->from . '.' . $columnName; + } + protected function resolveRelationColumn($name, $aggregate = null, $alias = null) { $parts = explode('.', Str::before($name, ':')); From 73e677b01c04e0442d5d02af79716c22b5edea16 Mon Sep 17 00:00:00 2001 From: Mark Salmon Date: Thu, 6 Jan 2022 15:53:38 +0000 Subject: [PATCH 02/46] wip --- src/Http/Livewire/LivewireDatatable.php | 4 ++-- tests/LivewireDatatableQueryBuilderTest.php | 10 +++++----- tests/TestCase.php | 6 ++++-- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/Http/Livewire/LivewireDatatable.php b/src/Http/Livewire/LivewireDatatable.php index a4cfd2c6..7f994c02 100644 --- a/src/Http/Livewire/LivewireDatatable.php +++ b/src/Http/Livewire/LivewireDatatable.php @@ -427,13 +427,13 @@ protected function resolveColumnName($column) while (count($relations) > 0) { $relation = array_shift($relations); - $useThrough = collect($relatedQuery->getQuery()->joins) + $useThrough = collect($this->query->getQuery()->joins) ->pluck('table') ->contains($relatedQuery->getRelation($relation)->getRelated()->getTable()); // BAIL HERE AND DO THE AGGREGATE THING - if ($relatedQuery->getRelation($relation) instanceof HasMany || $relatedQuery->getRelation($relation) instanceof BelongsToMany) { + if ($relatedQuery->getRelation($relation) instanceof HasMany || $relatedQuery->getRelation($relation) instanceof HasManyThrough || $relatedQuery->getRelation($relation) instanceof BelongsToMany) { $this->query->customWithAggregate($aggregateName, $column->aggregate ?? 'count', $columnName, $column->name); return null; } diff --git a/tests/LivewireDatatableQueryBuilderTest.php b/tests/LivewireDatatableQueryBuilderTest.php index 6d839891..725b5c6f 100644 --- a/tests/LivewireDatatableQueryBuilderTest.php +++ b/tests/LivewireDatatableQueryBuilderTest.php @@ -123,17 +123,17 @@ public function it_creates_a_query_builder_for_belongs_to_relation_columns() $subject = new LivewireDatatable(1); $subject->mount(DummyHasManyModel::class, ['id', 'dummy_model.name']); - $this->assertEquals('select "dummy_has_many_models"."id" as "id", "dummy_models"."name" as "dummy_model.name" from "dummy_has_many_models" left join "dummy_models" on "dummy_has_many_models"."dummy_model_id" = "dummy_models"."id" order by `id` desc', $subject->getQuery()->toSql()); + $this->assertEquals('select "dummy_has_many_models"."id" as "id", "dummy_models"."name" as "dummy_model.name" from "dummy_has_many_models" left join "dummy_models" on "dummy_models"."id" = "dummy_has_many_models"."dummy_model_id" order by `id` desc', $subject->getQuery()->toSql()); $subject->sort(1); $subject->forgetComputed(); - $this->assertEquals('select "dummy_has_many_models"."id" as "id", "dummy_models"."name" as "dummy_model.name" from "dummy_has_many_models" left join "dummy_models" on "dummy_has_many_models"."dummy_model_id" = "dummy_models"."id" order by dummy_models.name desc', $subject->getQuery()->toSql()); + $this->assertEquals('select "dummy_has_many_models"."id" as "id", "dummy_models"."name" as "dummy_model.name" from "dummy_has_many_models" left join "dummy_models" on "dummy_models"."id" = "dummy_has_many_models"."dummy_model_id" order by dummy_models.name desc', $subject->getQuery()->toSql()); $subject->sort(1); $subject->forgetComputed(); - $this->assertEquals('select "dummy_has_many_models"."id" as "id", "dummy_models"."name" as "dummy_model.name" from "dummy_has_many_models" left join "dummy_models" on "dummy_has_many_models"."dummy_model_id" = "dummy_models"."id" order by dummy_models.name asc', $subject->getQuery()->toSql()); + $this->assertEquals('select "dummy_has_many_models"."id" as "id", "dummy_models"."name" as "dummy_model.name" from "dummy_has_many_models" left join "dummy_models" on "dummy_models"."id" = "dummy_has_many_models"."dummy_model_id" order by dummy_models.name asc', $subject->getQuery()->toSql()); } /** @test */ @@ -148,7 +148,7 @@ public function it_creates_a_where_query_for_belongs_to_relation_columns() // $subject->doNumberFilterEnd(1, 456); $subject->forgetComputed(); - $this->assertEquals('select "dummy_has_many_models"."id" as "id", "dummy_models"."name" as "dummy_model.name" from "dummy_has_many_models" left join "dummy_models" on "dummy_has_many_models"."dummy_model_id" = "dummy_models"."id" where (dummy_models.name >= ?) order by dummy_has_many_models.id desc', $subject->getQuery()->toSql()); + $this->assertEquals('select "dummy_has_many_models"."id" as "id", "dummy_models"."name" as "dummy_model.name" from "dummy_has_many_models" left join "dummy_models" on "dummy_models"."id" = "dummy_has_many_models"."dummy_model_id" where (dummy_models.name >= ?) order by dummy_has_many_models.id desc', $subject->getQuery()->toSql()); $this->assertEquals([123], $subject->getQuery()->getBindings()); @@ -163,7 +163,7 @@ public function it_creates_a_where_query_for_belongs_to_relation_columns() $subject->doNumberFilterEnd(1, null); $subject->forgetComputed(); - $this->assertEquals('select "dummy_has_many_models"."id" as "id", "dummy_models"."name" as "dummy_model.name" from "dummy_has_many_models" left join "dummy_models" on "dummy_has_many_models"."dummy_model_id" = "dummy_models"."id" order by dummy_has_many_models.id desc', $subject->getQuery()->toSql()); + $this->assertEquals('select "dummy_has_many_models"."id" as "id", "dummy_models"."name" as "dummy_model.name" from "dummy_has_many_models" left join "dummy_models" on "dummy_models"."id" = "dummy_has_many_models"."dummy_model_id" order by dummy_has_many_models.id desc', $subject->getQuery()->toSql()); $this->assertEquals([], $subject->getQuery()->getBindings()); } diff --git a/tests/TestCase.php b/tests/TestCase.php index 7f834513..0a2a1d45 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -2,12 +2,13 @@ namespace Mediconesystems\LivewireDatatables\Tests; -use Illuminate\Support\Facades\View; use Illuminate\Support\Str; +use Illuminate\Support\Facades\View; use Livewire\LivewireServiceProvider; use Maatwebsite\Excel\ExcelServiceProvider; -use Mediconesystems\LivewireDatatables\LivewireDatatablesServiceProvider; use Orchestra\Testbench\TestCase as Orchestra; +use Reedware\LaravelRelationJoins\LaravelRelationJoinServiceProvider; +use Mediconesystems\LivewireDatatables\LivewireDatatablesServiceProvider; class TestCase extends Orchestra { @@ -26,6 +27,7 @@ protected function getPackageProviders($app) LivewireServiceProvider::class, LivewireDatatablesServiceProvider::class, ExcelServiceProvider::class, + LaravelRelationJoinServiceProvider::class, ]; } From 653abb653d2d11ae0f7b2d240ac1e0e83e48dc17 Mon Sep 17 00:00:00 2001 From: Mark Salmon Date: Thu, 6 Jan 2022 15:56:01 +0000 Subject: [PATCH 03/46] wip --- src/Column.php | 49 ------------------------------------------------- 1 file changed, 49 deletions(-) diff --git a/src/Column.php b/src/Column.php index 4e77fab5..1972f94a 100644 --- a/src/Column.php +++ b/src/Column.php @@ -373,55 +373,6 @@ public function group($group) return $this; } - public function resolveName($query) - { - return $this->isBaseColumn() - ? $query->getModel()->getTable() . '.' . ($this->base ?? Str::before($this->name, ':')) - : $this->joinRelations($query); - } - - public function joinRelations($query) - { - $parts = explode('.', Str::before($this->name, ':')); - - $columnName = array_pop($parts); - // callsign - - $relation = implode('.', $parts); - // job.crew - - $table = ''; - $model = ''; - $lastQuery = $query; - foreach (explode('.', $relation) as $eachRelation) { - $model = $lastQuery->getRelation($eachRelation); - - ray( - $eachRelation, - $lastQuery - // collect($lastQuery->getQuery()->joins)->pluck('table'), - // $model->getQuery()->from, - // collect($lastQuery->getQuery()->joins)->pluck('table')->contains( - // $model->getQuery()->from - // ) - )->purple(); - if ( - ! collect($lastQuery->getQuery()->joins)->pluck('table')->contains( - $model->getQuery()->from - ) - ) { - ray($eachRelation, collect($lastQuery->getQuery()->joins)->pluck('table'), $model->getQuery()->from)->red(); - $query->leftJoinRelation($model); - } - - - - $lastQuery = $model->getQuery(); - } - - return $lastQuery->getQuery()->from . '.' . $columnName; - } - public function relations() { return $this->isBaseColumn() ? null : collect(explode('.', Str::beforeLast($this->name, '.'))); From 073688a0c4a75f29578a1f58c1aab21b3f101a18 Mon Sep 17 00:00:00 2001 From: Mark Salmon Date: Thu, 6 Jan 2022 20:47:19 +0000 Subject: [PATCH 04/46] wip --- src/Column.php | 2 +- src/Http/Livewire/LivewireDatatable.php | 134 ++---------------------- 2 files changed, 12 insertions(+), 124 deletions(-) diff --git a/src/Column.php b/src/Column.php index 1972f94a..699098bb 100644 --- a/src/Column.php +++ b/src/Column.php @@ -353,7 +353,7 @@ public function aggregate() public function isBaseColumn() { - return ! Str::contains($this->name, '.') && ! $this->raw; + return ! Str::startsWith($this->name, 'callback_') && ! Str::contains($this->name, '.') && ! $this->raw; } public function field() diff --git a/src/Http/Livewire/LivewireDatatable.php b/src/Http/Livewire/LivewireDatatable.php index 7f994c02..1b2fbb2a 100644 --- a/src/Http/Livewire/LivewireDatatable.php +++ b/src/Http/Livewire/LivewireDatatable.php @@ -313,31 +313,20 @@ public function getProcessedColumnsProperty() ->sort($this->sort); } - public function resolveCheckboxColumnName($column) - { - // $column = is_object($column) - // ? $column->toArray() - // : $column; - - return $this->resolveColumnName($column); - // return Str::contains($column['base'], '.') - // ? $this->resolveRelationColumn($column['base'], $column['aggregate']) - // : $this->query->getModel()->getTable() . '.' . $column['base']; - } public function resolveAdditionalSelects($column) { $selects = collect($column->additionalSelects)->map(function ($select) use ($column) { return Str::contains($select, '.') - ? $this->resolveRelationColumn($select, Str::contains($select, ':') ? Str::after($select, ':') : null, $column->name) + ? $this->resolveColumnName($column, $select) : $this->query->getModel()->getTable() . '.' . $select; }); return $selects->count() > 1 ? new Expression("CONCAT_WS('" . static::SEPARATOR . "' ," . - collect($selects)->map(function ($select) { - return "COALESCE($select, '')"; - })->join(', ') . ')') + collect($selects)->map(function ($select) { + return "COALESCE($select, '')"; + })->join(', ') . ')') : $selects->first(); } @@ -345,7 +334,7 @@ public function resolveEditableColumnName($column) { return [ $column->select, - $this->query->getModel()->getTable() . '.' . $this->query->getModel()->getKeyName(), + $this->query->getModel()->getTable() . '.' . $this->query->getModel()->getKeyName() . ' AS ' . $column->name . '_edit_id', ]; } @@ -359,23 +348,18 @@ public function getSelectStatements($withAlias = false, $export = false) return $column; } - if ($column->isType('checkbox')) { - $column->select = $this->resolveCheckboxColumnName($column); - - return $column; - } - if (Str::startsWith($column->name, 'callback_')) { - ray($column)->red(); $column->select = $this->resolveAdditionalSelects($column); return $column; } $column->select = $this->resolveColumnName($column); + if ($column->isEditable()) { $column->select = $this->resolveEditableColumnName($column); } + // ray($column)->red(); return $column; })->when($withAlias, function ($columns) { @@ -406,14 +390,14 @@ public function getSelectStatements($withAlias = false, $export = false) }); } - protected function resolveColumnName($column) + protected function resolveColumnName($column, $additional = null) { if ($column->isBaseColumn()) { return $this->query->getModel()->getTable() . '.' . ($column->base ?? Str::before($column->name, ':')); } - $relations = explode('.', Str::before($column->name, ':')); - $aggregate = Str::after($column->name, ':'); + $relations = explode('.', Str::before(($additional ?: $column->name), ':')); + $aggregate = Str::after(($additional ?: $column->name), ':'); if (! method_exists($this->query->getModel(), $relations[0])) { return $column->name; @@ -431,8 +415,6 @@ protected function resolveColumnName($column) ->pluck('table') ->contains($relatedQuery->getRelation($relation)->getRelated()->getTable()); - // BAIL HERE AND DO THE AGGREGATE THING - if ($relatedQuery->getRelation($relation) instanceof HasMany || $relatedQuery->getRelation($relation) instanceof HasManyThrough || $relatedQuery->getRelation($relation) instanceof BelongsToMany) { $this->query->customWithAggregate($aggregateName, $column->aggregate ?? 'count', $columnName, $column->name); return null; @@ -444,96 +426,6 @@ protected function resolveColumnName($column) return $relatedQuery->getQuery()->from . '.' . $columnName; } - protected function resolveRelationColumn($name, $aggregate = null, $alias = null) - { - $parts = explode('.', Str::before($name, ':')); - $columnName = array_pop($parts); - $relation = implode('.', $parts); - - return method_exists($this->query->getModel(), $parts[0]) - ? $this->joinRelation($relation, $columnName, $aggregate, $alias ?? $name) - : $name; - } - - protected function joinRelation($relation, $relationColumn, $aggregate = null, $alias = null) - { - $table = ''; - $model = ''; - $lastQuery = $this->query; - foreach (explode('.', $relation) as $eachRelation) { - $model = $lastQuery->getRelation($eachRelation); - - switch (true) { - case $model instanceof HasOne: - $table = $model->getRelated()->getTable(); - $foreign = $model->getQualifiedForeignKeyName(); - $other = $model->getQualifiedParentKeyName(); - break; - - case $model instanceof HasMany: - $this->query->customWithAggregate($relation, $aggregate ?? 'count', $relationColumn, $alias); - $table = null; - break; - - case $model instanceof BelongsTo: - $table = $model->getRelated()->getTable(); - $foreign = $model->getQualifiedForeignKeyName(); - $other = $model->getQualifiedOwnerKeyName(); - break; - - case $model instanceof BelongsToMany: - $this->query->customWithAggregate($relation, $aggregate ?? 'count', $relationColumn, $alias); - $table = null; - break; - - case $model instanceof HasOneThrough: - $pivot = explode('.', $model->getQualifiedParentKeyName())[0]; - $pivotPK = $model->getQualifiedFirstKeyName(); - $pivotFK = $model->getQualifiedLocalKeyName(); - $this->performJoin($pivot, $pivotPK, $pivotFK); - - $related = $model->getRelated(); - $table = $related->getTable(); - $tablePK = $related->getForeignKey(); - $foreign = $pivot . '.' . $tablePK; - $other = $related->getQualifiedKeyName(); - - break; - - default: - $this->query->customWithAggregate($relation, $aggregate ?? 'count', $relationColumn, $alias); - } - if ($table) { - $this->performJoin($table, $foreign, $other); - } - $lastQuery = $model->getQuery(); - } - - if ($model instanceof HasOne || $model instanceof BelongsTo || $model instanceof HasOneThrough) { - return $table . '.' . $relationColumn; - } - - if ($model instanceof HasMany) { - return; - } - - if ($model instanceof BelongsToMany) { - return; - } - } - - protected function performJoin($table, $foreign, $other, $type = 'left') - { - $joins = []; - foreach ((array) $this->query->getQuery()->joins as $key => $join) { - $joins[] = $join->table; - } - - if (! in_array($table, $joins)) { - $this->query->join($table, $foreign, '=', $other, $type); - } - } - public function getFreshColumnsProperty() { $columns = $this->processedColumns->columnsArray(); @@ -1524,10 +1416,8 @@ public function mapCallbacks($paginatedCollection, $export = false) 'value' => $value, 'key' => $this->builder()->getModel()->getQualifiedKeyName(), 'column' => Str::after($name, '.'), - 'rowId' => $row->{$this->builder()->getModel()->getTable() . '.' . $this->builder()->getModel()->getKeyName()} ?? $row->{$this->builder()->getModel()->getKeyName()}, + 'rowId' => $row->{$name . '_edit_id'}, ]); - } elseif ($export && isset($this->export_callbacks[$name])) { - $row->$name = $this->export_callbacks[$name]($value, $row); } elseif (isset($this->callbacks[$name]) && is_string($this->callbacks[$name])) { $row->$name = $this->{$this->callbacks[$name]}($value, $row); } elseif (Str::startsWith($name, 'callback_')) { @@ -1643,8 +1533,6 @@ public function getQuery($export = false) public function checkboxQuery() { - $this->resolveCheckboxColumnName(collect($this->freshColumns)->firstWhere('type', 'checkbox')); - return $this->query->reorder()->get()->map(function ($row) { return (string) $row->checkbox_attribute; }); From 3f9566bf0276289bff532dcfbf5e6c093f776ff4 Mon Sep 17 00:00:00 2001 From: Mark Salmon Date: Thu, 6 Jan 2022 21:20:33 +0000 Subject: [PATCH 05/46] Apply fixes from StyleCI (#374) Co-authored-by: StyleCI Bot --- src/Http/Livewire/LivewireDatatable.php | 5 +---- tests/TestCase.php | 4 ++-- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/Http/Livewire/LivewireDatatable.php b/src/Http/Livewire/LivewireDatatable.php index 1b2fbb2a..b2f151ad 100644 --- a/src/Http/Livewire/LivewireDatatable.php +++ b/src/Http/Livewire/LivewireDatatable.php @@ -3,12 +3,9 @@ namespace Mediconesystems\LivewireDatatables\Http\Livewire; use Exception; -use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\HasManyThrough; -use Illuminate\Database\Eloquent\Relations\HasOne; -use Illuminate\Database\Eloquent\Relations\HasOneThrough; use Illuminate\Database\Query\Expression; use Illuminate\Support\Arr; use Illuminate\Support\Facades\DB; @@ -313,7 +310,6 @@ public function getProcessedColumnsProperty() ->sort($this->sort); } - public function resolveAdditionalSelects($column) { $selects = collect($column->additionalSelects)->map(function ($select) use ($column) { @@ -417,6 +413,7 @@ protected function resolveColumnName($column, $additional = null) if ($relatedQuery->getRelation($relation) instanceof HasMany || $relatedQuery->getRelation($relation) instanceof HasManyThrough || $relatedQuery->getRelation($relation) instanceof BelongsToMany) { $this->query->customWithAggregate($aggregateName, $column->aggregate ?? 'count', $columnName, $column->name); + return null; } diff --git a/tests/TestCase.php b/tests/TestCase.php index 0a2a1d45..9680e5d3 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -2,13 +2,13 @@ namespace Mediconesystems\LivewireDatatables\Tests; -use Illuminate\Support\Str; use Illuminate\Support\Facades\View; +use Illuminate\Support\Str; use Livewire\LivewireServiceProvider; use Maatwebsite\Excel\ExcelServiceProvider; +use Mediconesystems\LivewireDatatables\LivewireDatatablesServiceProvider; use Orchestra\Testbench\TestCase as Orchestra; use Reedware\LaravelRelationJoins\LaravelRelationJoinServiceProvider; -use Mediconesystems\LivewireDatatables\LivewireDatatablesServiceProvider; class TestCase extends Orchestra { From 5a60a95f61232cd5c273fb2755a69623967a6c02 Mon Sep 17 00:00:00 2001 From: Mark Salmon Date: Fri, 7 Jan 2022 10:53:51 +0000 Subject: [PATCH 06/46] bugfix --- src/Http/Livewire/LivewireDatatable.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Http/Livewire/LivewireDatatable.php b/src/Http/Livewire/LivewireDatatable.php index b2f151ad..7dd0faff 100644 --- a/src/Http/Livewire/LivewireDatatable.php +++ b/src/Http/Livewire/LivewireDatatable.php @@ -355,7 +355,6 @@ public function getSelectStatements($withAlias = false, $export = false) if ($column->isEditable()) { $column->select = $this->resolveEditableColumnName($column); } - // ray($column)->red(); return $column; })->when($withAlias, function ($columns) { @@ -396,7 +395,7 @@ protected function resolveColumnName($column, $additional = null) $aggregate = Str::after(($additional ?: $column->name), ':'); if (! method_exists($this->query->getModel(), $relations[0])) { - return $column->name; + return ($additional ?: $column->name); } $columnName = array_pop($relations); From 2696ff22bb772931c9153b3072f9aa33fbcee004 Mon Sep 17 00:00:00 2001 From: StyleCI Bot Date: Fri, 7 Jan 2022 10:54:11 +0000 Subject: [PATCH 07/46] Apply fixes from StyleCI --- src/Http/Livewire/LivewireDatatable.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Http/Livewire/LivewireDatatable.php b/src/Http/Livewire/LivewireDatatable.php index 7dd0faff..5bf08e87 100644 --- a/src/Http/Livewire/LivewireDatatable.php +++ b/src/Http/Livewire/LivewireDatatable.php @@ -395,7 +395,7 @@ protected function resolveColumnName($column, $additional = null) $aggregate = Str::after(($additional ?: $column->name), ':'); if (! method_exists($this->query->getModel(), $relations[0])) { - return ($additional ?: $column->name); + return $additional ?: $column->name; } $columnName = array_pop($relations); From 8ed023d3770a901e1f4874ab33479e69cda98c3b Mon Sep 17 00:00:00 2001 From: Mark Salmon Date: Wed, 23 Mar 2022 19:47:35 +0000 Subject: [PATCH 08/46] Update composer.json --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 8a2b19bb..608c6261 100644 --- a/composer.json +++ b/composer.json @@ -20,7 +20,7 @@ "illuminate/support": "^7.0|^8.0", "livewire/livewire": "^2.4.4", "maatwebsite/excel": "^3.1", - "reedware/laravel-relation-joins": "^2.4" + "reedware/laravel-relation-joins": "^2.4|^3.0" }, "require-dev": { "laravel/legacy-factories": "^1.0.4", From f22720ccff6711125c5405d3327c7135201ce9e3 Mon Sep 17 00:00:00 2001 From: Mark Salmon Date: Wed, 23 Mar 2022 19:48:23 +0000 Subject: [PATCH 09/46] Update composer.json --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 608c6261..463a5ff8 100644 --- a/composer.json +++ b/composer.json @@ -17,7 +17,7 @@ ], "require": { "php": "^7.2.5|^8.0", - "illuminate/support": "^7.0|^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" From d3559c08217294df648f42fd1d818ba28c2df9bd Mon Sep 17 00:00:00 2001 From: Mark Salmon Date: Wed, 18 May 2022 11:34:04 +0100 Subject: [PATCH 10/46] fix boolean complex query --- src/Http/Livewire/LivewireDatatable.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Http/Livewire/LivewireDatatable.php b/src/Http/Livewire/LivewireDatatable.php index 7dd0faff..0bb0feb8 100644 --- a/src/Http/Livewire/LivewireDatatable.php +++ b/src/Http/Livewire/LivewireDatatable.php @@ -1111,9 +1111,9 @@ public function processNested($rules = null, $query = null, $logic = 'and') $query->whereNotNull($column); } elseif ($this->columns[$rule['content']['column']]['type'] === 'boolean') { if ($rule['content']['value'] === 'true') { - $query->whereNotNull(Str::contains($column, '(') ? DB::raw($column) : $column); + $query->where(Str::contains($column, '(') ? DB::raw($column) : $column, 1); } else { - $query->whereNull(Str::contains($column, '(') ? DB::raw($column) : $column); + $query->where(Str::contains($column, '(') ? DB::raw($column) : $column, '<>', 1); } } else { $col = (isset($this->freshColumns[$rule['content']['column']]['round']) && $this->freshColumns[$rule['content']['column']]['round'] !== null) From e8de7c886864002148ef0ebf10de9ed0001d2b71 Mon Sep 17 00:00:00 2001 From: Mark Salmon Date: Wed, 18 May 2022 12:08:30 +0100 Subject: [PATCH 11/46] try again --- src/Http/Livewire/LivewireDatatable.php | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/Http/Livewire/LivewireDatatable.php b/src/Http/Livewire/LivewireDatatable.php index cb579c68..8b4a9eaa 100644 --- a/src/Http/Livewire/LivewireDatatable.php +++ b/src/Http/Livewire/LivewireDatatable.php @@ -395,7 +395,7 @@ protected function resolveColumnName($column, $additional = null) $aggregate = Str::after(($additional ?: $column->name), ':'); if (! method_exists($this->query->getModel(), $relations[0])) { - return $additional ?: $column->name; + return ($additional ?: $column->name); } $columnName = array_pop($relations); @@ -1111,9 +1111,15 @@ public function processNested($rules = null, $query = null, $logic = 'and') $query->whereNotNull($column); } elseif ($this->columns[$rule['content']['column']]['type'] === 'boolean') { if ($rule['content']['value'] === 'true') { - $query->where(Str::contains($column, '(') ? DB::raw($column) : $column, 1); + $query->where(function ($query) use ($column) { + $query->whereNotNull(Str::contains($column, '(') ? DB::raw($column) : $column) + ->where($column, '<>', 0); + }); } else { - $query->where(Str::contains($column, '(') ? DB::raw($column) : $column, '<>', 1); + $query->where(function ($query) use ($column) { + $query->whereNull(Str::contains($column, '(') ? DB::raw($column) : $column) + ->orWhere(Str::contains($column, '(') ? DB::raw($column) : $column, 0); + }); } } else { $col = (isset($this->freshColumns[$rule['content']['column']]['round']) && $this->freshColumns[$rule['content']['column']]['round'] !== null) From 966b719637c1e64eb0c708d28db1a5d00775301b Mon Sep 17 00:00:00 2001 From: StyleCI Bot Date: Fri, 7 Jan 2022 10:54:11 +0000 Subject: [PATCH 12/46] Apply fixes from StyleCI --- src/Http/Livewire/LivewireDatatable.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Http/Livewire/LivewireDatatable.php b/src/Http/Livewire/LivewireDatatable.php index 0bb0feb8..cb579c68 100644 --- a/src/Http/Livewire/LivewireDatatable.php +++ b/src/Http/Livewire/LivewireDatatable.php @@ -395,7 +395,7 @@ protected function resolveColumnName($column, $additional = null) $aggregate = Str::after(($additional ?: $column->name), ':'); if (! method_exists($this->query->getModel(), $relations[0])) { - return ($additional ?: $column->name); + return $additional ?: $column->name; } $columnName = array_pop($relations); From 1d4a02ad4db0f319b432cb5278ea4941573d97b0 Mon Sep 17 00:00:00 2001 From: Mark Salmon Date: Wed, 23 Mar 2022 19:47:35 +0000 Subject: [PATCH 13/46] Update composer.json --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 8a2b19bb..608c6261 100644 --- a/composer.json +++ b/composer.json @@ -20,7 +20,7 @@ "illuminate/support": "^7.0|^8.0", "livewire/livewire": "^2.4.4", "maatwebsite/excel": "^3.1", - "reedware/laravel-relation-joins": "^2.4" + "reedware/laravel-relation-joins": "^2.4|^3.0" }, "require-dev": { "laravel/legacy-factories": "^1.0.4", From 1cc392dea6bfb1755c0413c916dc33b16eb64df9 Mon Sep 17 00:00:00 2001 From: Mark Salmon Date: Wed, 23 Mar 2022 19:48:23 +0000 Subject: [PATCH 14/46] Update composer.json --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 608c6261..463a5ff8 100644 --- a/composer.json +++ b/composer.json @@ -17,7 +17,7 @@ ], "require": { "php": "^7.2.5|^8.0", - "illuminate/support": "^7.0|^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" From 35586580a12f7e8ab92be33f5898f25c457cb243 Mon Sep 17 00:00:00 2001 From: Mark Salmon Date: Wed, 18 May 2022 12:08:30 +0100 Subject: [PATCH 15/46] try again --- src/Http/Livewire/LivewireDatatable.php | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/Http/Livewire/LivewireDatatable.php b/src/Http/Livewire/LivewireDatatable.php index cb579c68..8b4a9eaa 100644 --- a/src/Http/Livewire/LivewireDatatable.php +++ b/src/Http/Livewire/LivewireDatatable.php @@ -395,7 +395,7 @@ protected function resolveColumnName($column, $additional = null) $aggregate = Str::after(($additional ?: $column->name), ':'); if (! method_exists($this->query->getModel(), $relations[0])) { - return $additional ?: $column->name; + return ($additional ?: $column->name); } $columnName = array_pop($relations); @@ -1111,9 +1111,15 @@ public function processNested($rules = null, $query = null, $logic = 'and') $query->whereNotNull($column); } elseif ($this->columns[$rule['content']['column']]['type'] === 'boolean') { if ($rule['content']['value'] === 'true') { - $query->where(Str::contains($column, '(') ? DB::raw($column) : $column, 1); + $query->where(function ($query) use ($column) { + $query->whereNotNull(Str::contains($column, '(') ? DB::raw($column) : $column) + ->where($column, '<>', 0); + }); } else { - $query->where(Str::contains($column, '(') ? DB::raw($column) : $column, '<>', 1); + $query->where(function ($query) use ($column) { + $query->whereNull(Str::contains($column, '(') ? DB::raw($column) : $column) + ->orWhere(Str::contains($column, '(') ? DB::raw($column) : $column, 0); + }); } } else { $col = (isset($this->freshColumns[$rule['content']['column']]['round']) && $this->freshColumns[$rule['content']['column']]['round'] !== null) From 7957648cc73e574d36546bf1b5428545605acf9b Mon Sep 17 00:00:00 2001 From: Mark Salmon Date: Fri, 2 Dec 2022 14:47:42 +0000 Subject: [PATCH 16/46] Apply fixes from StyleCI (#528) Co-authored-by: StyleCI Bot --- src/Http/Livewire/LivewireDatatable.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Http/Livewire/LivewireDatatable.php b/src/Http/Livewire/LivewireDatatable.php index 8b4a9eaa..35922a85 100644 --- a/src/Http/Livewire/LivewireDatatable.php +++ b/src/Http/Livewire/LivewireDatatable.php @@ -395,7 +395,7 @@ protected function resolveColumnName($column, $additional = null) $aggregate = Str::after(($additional ?: $column->name), ':'); if (! method_exists($this->query->getModel(), $relations[0])) { - return ($additional ?: $column->name); + return $additional ?: $column->name; } $columnName = array_pop($relations); From b09bb9f161eba579f80fd9856ce5b2374f8492c5 Mon Sep 17 00:00:00 2001 From: Mark Salmon Date: Thu, 6 Jan 2022 14:45:49 +0000 Subject: [PATCH 17/46] rebase master --- src/Column.php | 49 +++++++++++++++++++++++++ src/Http/Livewire/LivewireDatatable.php | 2 +- 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/src/Column.php b/src/Column.php index 5208b0f6..3f406581 100644 --- a/src/Column.php +++ b/src/Column.php @@ -481,6 +481,55 @@ public function group($group) return $this; } + public function resolveName($query) + { + return $this->isBaseColumn() + ? $query->getModel()->getTable() . '.' . ($this->base ?? Str::before($this->name, ':')) + : $this->joinRelations($query); + } + + public function joinRelations($query) + { + $parts = explode('.', Str::before($this->name, ':')); + + $columnName = array_pop($parts); + // callsign + + $relation = implode('.', $parts); + // job.crew + + $table = ''; + $model = ''; + $lastQuery = $query; + foreach (explode('.', $relation) as $eachRelation) { + $model = $lastQuery->getRelation($eachRelation); + + ray( + $eachRelation, + $lastQuery + // collect($lastQuery->getQuery()->joins)->pluck('table'), + // $model->getQuery()->from, + // collect($lastQuery->getQuery()->joins)->pluck('table')->contains( + // $model->getQuery()->from + // ) + )->purple(); + if ( + ! collect($lastQuery->getQuery()->joins)->pluck('table')->contains( + $model->getQuery()->from + ) + ) { + ray($eachRelation, collect($lastQuery->getQuery()->joins)->pluck('table'), $model->getQuery()->from)->red(); + $query->leftJoinRelation($model); + } + + + + $lastQuery = $model->getQuery(); + } + + return $lastQuery->getQuery()->from . '.' . $columnName; + } + public function relations() { return $this->isBaseColumn() ? null : collect(explode('.', Str::beforeLast($this->name, '.'))); diff --git a/src/Http/Livewire/LivewireDatatable.php b/src/Http/Livewire/LivewireDatatable.php index cb0d1269..19ebf8e3 100644 --- a/src/Http/Livewire/LivewireDatatable.php +++ b/src/Http/Livewire/LivewireDatatable.php @@ -390,13 +390,13 @@ public function getSelectStatements($withAlias = false, $export = false) } if (Str::startsWith($column->name, 'callback_')) { + ray($column)->red(); $column->select = $this->resolveAdditionalSelects($column); return $column; } $column->select = $this->resolveColumnName($column); - if ($column->isEditable()) { $column->select = $this->resolveEditableColumnName($column); } From 1749ded34cd2a15e18ce1801460ceef90fa57fc4 Mon Sep 17 00:00:00 2001 From: Mark Salmon Date: Thu, 6 Jan 2022 15:53:38 +0000 Subject: [PATCH 18/46] wip --- tests/TestCase.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/TestCase.php b/tests/TestCase.php index 9680e5d3..0a2a1d45 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -2,13 +2,13 @@ namespace Mediconesystems\LivewireDatatables\Tests; -use Illuminate\Support\Facades\View; use Illuminate\Support\Str; +use Illuminate\Support\Facades\View; use Livewire\LivewireServiceProvider; use Maatwebsite\Excel\ExcelServiceProvider; -use Mediconesystems\LivewireDatatables\LivewireDatatablesServiceProvider; use Orchestra\Testbench\TestCase as Orchestra; use Reedware\LaravelRelationJoins\LaravelRelationJoinServiceProvider; +use Mediconesystems\LivewireDatatables\LivewireDatatablesServiceProvider; class TestCase extends Orchestra { From 91fc90bfab685a1f3b5d4737cac707e76fb79cfb Mon Sep 17 00:00:00 2001 From: Mark Salmon Date: Thu, 6 Jan 2022 15:56:01 +0000 Subject: [PATCH 19/46] wip --- src/Column.php | 49 ------------------------------------------------- 1 file changed, 49 deletions(-) diff --git a/src/Column.php b/src/Column.php index 3f406581..5208b0f6 100644 --- a/src/Column.php +++ b/src/Column.php @@ -481,55 +481,6 @@ public function group($group) return $this; } - public function resolveName($query) - { - return $this->isBaseColumn() - ? $query->getModel()->getTable() . '.' . ($this->base ?? Str::before($this->name, ':')) - : $this->joinRelations($query); - } - - public function joinRelations($query) - { - $parts = explode('.', Str::before($this->name, ':')); - - $columnName = array_pop($parts); - // callsign - - $relation = implode('.', $parts); - // job.crew - - $table = ''; - $model = ''; - $lastQuery = $query; - foreach (explode('.', $relation) as $eachRelation) { - $model = $lastQuery->getRelation($eachRelation); - - ray( - $eachRelation, - $lastQuery - // collect($lastQuery->getQuery()->joins)->pluck('table'), - // $model->getQuery()->from, - // collect($lastQuery->getQuery()->joins)->pluck('table')->contains( - // $model->getQuery()->from - // ) - )->purple(); - if ( - ! collect($lastQuery->getQuery()->joins)->pluck('table')->contains( - $model->getQuery()->from - ) - ) { - ray($eachRelation, collect($lastQuery->getQuery()->joins)->pluck('table'), $model->getQuery()->from)->red(); - $query->leftJoinRelation($model); - } - - - - $lastQuery = $model->getQuery(); - } - - return $lastQuery->getQuery()->from . '.' . $columnName; - } - public function relations() { return $this->isBaseColumn() ? null : collect(explode('.', Str::beforeLast($this->name, '.'))); From fad8d27a8f7067e8682eaeddf5c4664cef499f17 Mon Sep 17 00:00:00 2001 From: Mark Salmon Date: Thu, 6 Jan 2022 20:47:19 +0000 Subject: [PATCH 20/46] wip --- src/Http/Livewire/LivewireDatatable.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Http/Livewire/LivewireDatatable.php b/src/Http/Livewire/LivewireDatatable.php index 19ebf8e3..662c27d7 100644 --- a/src/Http/Livewire/LivewireDatatable.php +++ b/src/Http/Livewire/LivewireDatatable.php @@ -390,16 +390,17 @@ public function getSelectStatements($withAlias = false, $export = false) } if (Str::startsWith($column->name, 'callback_')) { - ray($column)->red(); $column->select = $this->resolveAdditionalSelects($column); return $column; } $column->select = $this->resolveColumnName($column); + if ($column->isEditable()) { $column->select = $this->resolveEditableColumnName($column); } + // ray($column)->red(); return $column; })->when($withAlias, function ($columns) { From 7a0757b73a4b22170254ea75a1b14451de218e69 Mon Sep 17 00:00:00 2001 From: Mark Salmon Date: Thu, 6 Jan 2022 21:20:33 +0000 Subject: [PATCH 21/46] Apply fixes from StyleCI (#374) Co-authored-by: StyleCI Bot --- tests/TestCase.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/TestCase.php b/tests/TestCase.php index 0a2a1d45..9680e5d3 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -2,13 +2,13 @@ namespace Mediconesystems\LivewireDatatables\Tests; -use Illuminate\Support\Str; use Illuminate\Support\Facades\View; +use Illuminate\Support\Str; use Livewire\LivewireServiceProvider; use Maatwebsite\Excel\ExcelServiceProvider; +use Mediconesystems\LivewireDatatables\LivewireDatatablesServiceProvider; use Orchestra\Testbench\TestCase as Orchestra; use Reedware\LaravelRelationJoins\LaravelRelationJoinServiceProvider; -use Mediconesystems\LivewireDatatables\LivewireDatatablesServiceProvider; class TestCase extends Orchestra { From 7d1e3cfe85e71eb08fe51fd07a6e8235f36cb229 Mon Sep 17 00:00:00 2001 From: Mark Salmon Date: Fri, 7 Jan 2022 10:53:51 +0000 Subject: [PATCH 22/46] bugfix --- src/Http/Livewire/LivewireDatatable.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Http/Livewire/LivewireDatatable.php b/src/Http/Livewire/LivewireDatatable.php index 662c27d7..b24d416d 100644 --- a/src/Http/Livewire/LivewireDatatable.php +++ b/src/Http/Livewire/LivewireDatatable.php @@ -400,7 +400,6 @@ public function getSelectStatements($withAlias = false, $export = false) if ($column->isEditable()) { $column->select = $this->resolveEditableColumnName($column); } - // ray($column)->red(); return $column; })->when($withAlias, function ($columns) { @@ -441,7 +440,7 @@ protected function resolveColumnName($column, $additional = null) $aggregate = Str::after(($additional ?: $column->name), ':'); if (! method_exists($this->query->getModel(), $relations[0])) { - return $additional ?: $column->name; + return ($additional ?: $column->name); } $columnName = array_pop($relations); From 73f9a77f034f9d2583a337613bdd3632fc29a186 Mon Sep 17 00:00:00 2001 From: Mark Salmon Date: Wed, 18 May 2022 11:34:04 +0100 Subject: [PATCH 23/46] fix boolean complex query --- src/Http/Livewire/LivewireDatatable.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Http/Livewire/LivewireDatatable.php b/src/Http/Livewire/LivewireDatatable.php index b24d416d..cfe15f3e 100644 --- a/src/Http/Livewire/LivewireDatatable.php +++ b/src/Http/Livewire/LivewireDatatable.php @@ -1277,9 +1277,9 @@ public function processNested($rules = null, $query = null, $logic = 'and') $query->whereNotNull($column); } elseif ($this->columns[$rule['content']['column']]['type'] === 'boolean') { if ($rule['content']['value'] === 'true') { - $query->whereNotNull(Str::contains($column, '(') ? DB::raw($column) : $column); + $query->where(Str::contains($column, '(') ? DB::raw($column) : $column, 1); } else { - $query->whereNull(Str::contains($column, '(') ? DB::raw($column) : $column); + $query->where(Str::contains($column, '(') ? DB::raw($column) : $column, '<>', 1); } } else { $col = (isset($this->freshColumns[$rule['content']['column']]['round']) && $this->freshColumns[$rule['content']['column']]['round'] !== null) From 0490d7451d4e6dce2ae5fcbcb429d37c56269bd7 Mon Sep 17 00:00:00 2001 From: StyleCI Bot Date: Fri, 7 Jan 2022 10:54:11 +0000 Subject: [PATCH 24/46] Apply fixes from StyleCI --- src/Http/Livewire/LivewireDatatable.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Http/Livewire/LivewireDatatable.php b/src/Http/Livewire/LivewireDatatable.php index cfe15f3e..b329bf9e 100644 --- a/src/Http/Livewire/LivewireDatatable.php +++ b/src/Http/Livewire/LivewireDatatable.php @@ -440,7 +440,7 @@ protected function resolveColumnName($column, $additional = null) $aggregate = Str::after(($additional ?: $column->name), ':'); if (! method_exists($this->query->getModel(), $relations[0])) { - return ($additional ?: $column->name); + return $additional ?: $column->name; } $columnName = array_pop($relations); From 63233cf6d1744bf1238c1fd67e8fbed074bfa651 Mon Sep 17 00:00:00 2001 From: Mark Salmon Date: Wed, 18 May 2022 12:08:30 +0100 Subject: [PATCH 25/46] try again --- src/Http/Livewire/LivewireDatatable.php | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/Http/Livewire/LivewireDatatable.php b/src/Http/Livewire/LivewireDatatable.php index b329bf9e..008dca5f 100644 --- a/src/Http/Livewire/LivewireDatatable.php +++ b/src/Http/Livewire/LivewireDatatable.php @@ -440,7 +440,7 @@ protected function resolveColumnName($column, $additional = null) $aggregate = Str::after(($additional ?: $column->name), ':'); if (! method_exists($this->query->getModel(), $relations[0])) { - return $additional ?: $column->name; + return ($additional ?: $column->name); } $columnName = array_pop($relations); @@ -1277,9 +1277,15 @@ public function processNested($rules = null, $query = null, $logic = 'and') $query->whereNotNull($column); } elseif ($this->columns[$rule['content']['column']]['type'] === 'boolean') { if ($rule['content']['value'] === 'true') { - $query->where(Str::contains($column, '(') ? DB::raw($column) : $column, 1); + $query->where(function ($query) use ($column) { + $query->whereNotNull(Str::contains($column, '(') ? DB::raw($column) : $column) + ->where($column, '<>', 0); + }); } else { - $query->where(Str::contains($column, '(') ? DB::raw($column) : $column, '<>', 1); + $query->where(function ($query) use ($column) { + $query->whereNull(Str::contains($column, '(') ? DB::raw($column) : $column) + ->orWhere(Str::contains($column, '(') ? DB::raw($column) : $column, 0); + }); } } else { $col = (isset($this->freshColumns[$rule['content']['column']]['round']) && $this->freshColumns[$rule['content']['column']]['round'] !== null) From 101861ce27260137726d6b5fa46aaead419d188e Mon Sep 17 00:00:00 2001 From: StyleCI Bot Date: Fri, 7 Jan 2022 10:54:11 +0000 Subject: [PATCH 26/46] Apply fixes from StyleCI --- src/Http/Livewire/LivewireDatatable.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Http/Livewire/LivewireDatatable.php b/src/Http/Livewire/LivewireDatatable.php index 008dca5f..4ef8e211 100644 --- a/src/Http/Livewire/LivewireDatatable.php +++ b/src/Http/Livewire/LivewireDatatable.php @@ -440,7 +440,7 @@ protected function resolveColumnName($column, $additional = null) $aggregate = Str::after(($additional ?: $column->name), ':'); if (! method_exists($this->query->getModel(), $relations[0])) { - return ($additional ?: $column->name); + return $additional ?: $column->name; } $columnName = array_pop($relations); From 1e5a8dc840ceaea601d015cf900f93b9c9807c2c Mon Sep 17 00:00:00 2001 From: Mark Salmon Date: Wed, 18 May 2022 12:08:30 +0100 Subject: [PATCH 27/46] try again --- src/Http/Livewire/LivewireDatatable.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Http/Livewire/LivewireDatatable.php b/src/Http/Livewire/LivewireDatatable.php index 4ef8e211..008dca5f 100644 --- a/src/Http/Livewire/LivewireDatatable.php +++ b/src/Http/Livewire/LivewireDatatable.php @@ -440,7 +440,7 @@ protected function resolveColumnName($column, $additional = null) $aggregate = Str::after(($additional ?: $column->name), ':'); if (! method_exists($this->query->getModel(), $relations[0])) { - return $additional ?: $column->name; + return ($additional ?: $column->name); } $columnName = array_pop($relations); From f42471532ca6ea3e24a1e64220c696fba3ee8ee8 Mon Sep 17 00:00:00 2001 From: Mark Salmon Date: Fri, 2 Dec 2022 15:56:19 +0000 Subject: [PATCH 28/46] wip --- src/Http/Livewire/LivewireDatatable.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Http/Livewire/LivewireDatatable.php b/src/Http/Livewire/LivewireDatatable.php index 008dca5f..bdfc7c42 100644 --- a/src/Http/Livewire/LivewireDatatable.php +++ b/src/Http/Livewire/LivewireDatatable.php @@ -1692,10 +1692,10 @@ public function getExportResultsSet() })->get(), true )->map(function ($item) { - return collect($this->columns())->reject(function ($value, $key) { - return $value->preventExport == true || $value->hidden == true; - })->mapWithKeys(function ($value, $key) use ($item) { - return [$value->label ?? $value->name => $item->{$value->name}]; + return collect($this->columns)->reject(function ($value) { + return $value['preventExport'] == true || $value['hidden'] == true; + })->mapWithKeys(function ($value) use ($item) { + return [$value['label'] ?? $value['name'] => $item->{$value['name']}]; })->all(); }); } From 51388ad1c6a088a45d12c841d674b15a43ab1229 Mon Sep 17 00:00:00 2001 From: Mark Salmon Date: Fri, 2 Dec 2022 17:14:17 +0000 Subject: [PATCH 29/46] Apply fixes from StyleCI (#529) Co-authored-by: StyleCI Bot --- src/Http/Livewire/LivewireDatatable.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Http/Livewire/LivewireDatatable.php b/src/Http/Livewire/LivewireDatatable.php index bdfc7c42..e56c9bbc 100644 --- a/src/Http/Livewire/LivewireDatatable.php +++ b/src/Http/Livewire/LivewireDatatable.php @@ -440,7 +440,7 @@ protected function resolveColumnName($column, $additional = null) $aggregate = Str::after(($additional ?: $column->name), ':'); if (! method_exists($this->query->getModel(), $relations[0])) { - return ($additional ?: $column->name); + return $additional ?: $column->name; } $columnName = array_pop($relations); From 628c06ad2cc702ab9c41f4e705b07f9a163dcfd5 Mon Sep 17 00:00:00 2001 From: Mark Salmon Date: Fri, 2 Dec 2022 17:29:35 +0000 Subject: [PATCH 30/46] wip --- .../datatables/complex-query.blade.php | 96 ++++++++++--------- 1 file changed, 51 insertions(+), 45 deletions(-) diff --git a/resources/views/livewire/datatables/complex-query.blade.php b/resources/views/livewire/datatables/complex-query.blade.php index 57542edf..af86ff30 100644 --- a/resources/views/livewire/datatables/complex-query.blade.php +++ b/resources/views/livewire/datatables/complex-query.blade.php @@ -16,58 +16,64 @@ @endif - @if(count($this->rules[0]['content'])) -
{{ $this->rulesString }}@if($errors->any()) Invalid rules @endif
- @endif +
+ @if(count($this->rules[0]['content'])) +
{{ $this->rulesString }}@if($errors->any()) Invalid rules @endif
+ @endif +
@include('datatables::complex-query-group', ['rules' => $rules, 'parentIndex' => null])
- @if(count($this->rules[0]['content'])) - @unless($errors->any()) -
-
- {{-- --}} +
+ @if(count($this->rules[0]['content'])) + @unless($errors->any()) +
+
+ {{-- --}} +
+
+ @isset($savedQueries) +
+ + +
+ @endisset + +
-
- @isset($savedQueries) -
- -
+ +
+ @if(count($savedQueries ?? [])) +
+
Saved Queries
+
+ @foreach($savedQueries as $saved) +
+ +
- @endisset - + @endforeach
@endif - - @endif - @if(count($savedQueries ?? [])) -
-
Saved Queries
-
- @foreach($savedQueries as $saved) -
- - -
- @endforeach -
-
- @endif +
From 784e245e1447264586039fff772c0cdaef4d2795 Mon Sep 17 00:00:00 2001 From: Mark Salmon Date: Mon, 5 Dec 2022 10:36:15 +0000 Subject: [PATCH 31/46] fix pagination with complex query --- src/Http/Livewire/LivewireDatatable.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Http/Livewire/LivewireDatatable.php b/src/Http/Livewire/LivewireDatatable.php index e56c9bbc..1366cc7f 100644 --- a/src/Http/Livewire/LivewireDatatable.php +++ b/src/Http/Livewire/LivewireDatatable.php @@ -1220,6 +1220,7 @@ public function buildDatabaseQuery($export = false) public function complexQuery($rules) { $this->complexQuery = $rules; + $this->setPage(1); } public function addComplexQuery() @@ -1232,8 +1233,6 @@ public function addComplexQuery() $this->processNested($this->complexQuery, $query); }); - $this->setPage(1); - return $this; } From 370d229c899b5266cad0d46e833608dafe67cbc4 Mon Sep 17 00:00:00 2001 From: Mark Salmon Date: Tue, 20 Dec 2022 15:11:46 +0000 Subject: [PATCH 32/46] replace excel exporter --- README.md | 2 +- composer.json | 4 +- src/Exports/DatatableExport.php | 88 ------------------------- src/Http/Livewire/LivewireDatatable.php | 7 +- tests/TestCase.php | 2 - 5 files changed, 7 insertions(+), 96 deletions(-) delete mode 100644 src/Exports/DatatableExport.php diff --git a/README.md b/README.md index ff4e45af..7cd3b444 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ composer require mediconesystems/livewire-datatables ``` If you use laravel 9 first execute ```bash -composer require psr/simple-cache:^1.0 maatwebsite/excel +composer require psr/simple-cache:^1.0 ``` ### Optional diff --git a/composer.json b/composer.json index f970fae2..8b5bfeba 100644 --- a/composer.json +++ b/composer.json @@ -30,8 +30,8 @@ "php": "^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" + "reedware/laravel-relation-joins": "^2.4|^3.0", + "spatie/simple-excel": "^3.0" }, "require-dev": { "laravel/legacy-factories": "^1.0.4", diff --git a/src/Exports/DatatableExport.php b/src/Exports/DatatableExport.php deleted file mode 100644 index 7800e539..00000000 --- a/src/Exports/DatatableExport.php +++ /dev/null @@ -1,88 +0,0 @@ -collection = $collection; - } - - public function collection() - { - return $this->collection; - } - - public function headings(): array - { - return array_keys((array) $this->collection->first()); - } - - public function setFileName($fileName) - { - $this->fileName = $fileName; - - return $this; - } - - public function getFileName(): string - { - return $this->fileName; - } - - public function setColumnWidths($columnWidths) - { - $this->columnWidths = $columnWidths; - - return $this; - } - - public function getColumnWidths(): array - { - return $this->columnWidths; - } - - public function columnWidths(): array - { - return $this->getColumnWidths(); - } - - public function setStyles($styles) - { - $this->styles = $styles; - - return $this; - } - - public function getStyles(): array - { - return $this->styles; - } - - public function styles(Worksheet $sheet) - { - return $this->getStyles(); - } - - public function download() - { - return Excel::download($this, $this->getFileName()); - } -} diff --git a/src/Http/Livewire/LivewireDatatable.php b/src/Http/Livewire/LivewireDatatable.php index 1366cc7f..34971441 100644 --- a/src/Http/Livewire/LivewireDatatable.php +++ b/src/Http/Livewire/LivewireDatatable.php @@ -19,6 +19,7 @@ use Mediconesystems\LivewireDatatables\Traits\WithCallbacks; use Mediconesystems\LivewireDatatables\Traits\WithPresetDateFilters; use Mediconesystems\LivewireDatatables\Traits\WithPresetTimeFilters; +use Spatie\SimpleExcel\SimpleExcelWriter; class LivewireDatatable extends Component { @@ -1677,10 +1678,10 @@ public function export(string $filename = 'DatatableExport.xlsx') { $this->forgetComputed(); - $export = new DatatableExport($this->getExportResultsSet()); - $export->setFilename($filename); + $writer = SimpleExcelWriter::create(storage_path($filename)) + ->addRows($this->getExportResultsSet()); - return $export->download(); + return response()->download($writer->getPath())->deleteFileAfterSend(); } public function getExportResultsSet() diff --git a/tests/TestCase.php b/tests/TestCase.php index 9680e5d3..2f76c60f 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -5,7 +5,6 @@ use Illuminate\Support\Facades\View; use Illuminate\Support\Str; use Livewire\LivewireServiceProvider; -use Maatwebsite\Excel\ExcelServiceProvider; use Mediconesystems\LivewireDatatables\LivewireDatatablesServiceProvider; use Orchestra\Testbench\TestCase as Orchestra; use Reedware\LaravelRelationJoins\LaravelRelationJoinServiceProvider; @@ -26,7 +25,6 @@ protected function getPackageProviders($app) return [ LivewireServiceProvider::class, LivewireDatatablesServiceProvider::class, - ExcelServiceProvider::class, LaravelRelationJoinServiceProvider::class, ]; } From ed3b73a8a9a7507b153459d7081e7a3a062cb1f6 Mon Sep 17 00:00:00 2001 From: Mark Salmon Date: Sun, 15 Jan 2023 19:52:59 +0000 Subject: [PATCH 33/46] fix error as no json filter type --- src/JsonColumn.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/JsonColumn.php b/src/JsonColumn.php index 4b89d168..a513b326 100644 --- a/src/JsonColumn.php +++ b/src/JsonColumn.php @@ -4,8 +4,9 @@ class JsonColumn extends Column { - public $type = 'json'; public $callback; + public $type = 'json'; + public $filterView = 'string'; public function __construct() { From 725d4199d04a3d4f84b325fe512b8d9f47fa050d Mon Sep 17 00:00:00 2001 From: Mark Salmon Date: Tue, 21 Mar 2023 18:05:05 +0000 Subject: [PATCH 34/46] Apply fixes from StyleCI (#560) Co-authored-by: StyleCI Bot --- src/Http/Controllers/FileExportController.php | 28 +++++++++---------- src/Http/Livewire/LivewireDatatable.php | 4 +-- tests/ColumnSetTest.php | 1 + tests/ColumnTest.php | 1 + 4 files changed, 18 insertions(+), 16 deletions(-) diff --git a/src/Http/Controllers/FileExportController.php b/src/Http/Controllers/FileExportController.php index 0f8500c1..0d581e4f 100644 --- a/src/Http/Controllers/FileExportController.php +++ b/src/Http/Controllers/FileExportController.php @@ -5,20 +5,20 @@ use Illuminate\Support\Facades\Response; use Illuminate\Support\Facades\Storage; - class FileExportController - { - public function handle($filename) - { - $response = Response::make(Storage::disk(config('livewire-datatables.file_export.disk') ?: config('filesystems.default')) - ->get('datatables/' . $filename), 200, [ - 'Content-Type' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', - 'Content-Disposition' => 'inline; filename="' . $filename . '"', - 'X-Vapor-Base64-Encode' => 'True', - ]); +class FileExportController +{ + public function handle($filename) + { + $response = Response::make(Storage::disk(config('livewire-datatables.file_export.disk') ?: config('filesystems.default')) + ->get('datatables/' . $filename), 200, [ + 'Content-Type' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + 'Content-Disposition' => 'inline; filename="' . $filename . '"', + 'X-Vapor-Base64-Encode' => 'True', + ]); - Storage::disk(config('livewire-datatables.file_export.disk') ?: config('filesystems.default')) + Storage::disk(config('livewire-datatables.file_export.disk') ?: config('filesystems.default')) ->delete('datatables/' . $filename); - return $response; - } - } + return $response; + } +} diff --git a/src/Http/Livewire/LivewireDatatable.php b/src/Http/Livewire/LivewireDatatable.php index 34971441..f1367182 100644 --- a/src/Http/Livewire/LivewireDatatable.php +++ b/src/Http/Livewire/LivewireDatatable.php @@ -437,8 +437,8 @@ protected function resolveColumnName($column, $additional = null) return $this->query->getModel()->getTable() . '.' . ($column->base ?? Str::before($column->name, ':')); } - $relations = explode('.', Str::before(($additional ?: $column->name), ':')); - $aggregate = Str::after(($additional ?: $column->name), ':'); + $relations = explode('.', Str::before($additional ?: $column->name, ':')); + $aggregate = Str::after($additional ?: $column->name, ':'); if (! method_exists($this->query->getModel(), $relations[0])) { return $additional ?: $column->name; diff --git a/tests/ColumnSetTest.php b/tests/ColumnSetTest.php index 14130cf0..890ed36f 100644 --- a/tests/ColumnSetTest.php +++ b/tests/ColumnSetTest.php @@ -24,6 +24,7 @@ public function it_can_generate_an_array_of_columns_from_a_model() /** * @test + * * @dataProvider fieldDataProvider */ public function it_can_correctly_populate_the_columns_from_the_model($name, $index, $column) diff --git a/tests/ColumnTest.php b/tests/ColumnTest.php index 20b772b6..81e60a35 100644 --- a/tests/ColumnTest.php +++ b/tests/ColumnTest.php @@ -38,6 +38,7 @@ public function it_can_generate_a_delete_column() /** * @test + * * @dataProvider settersDataProvider */ public function it_sets_properties_and_parameters($method, $value, $attribute) From 94c5b628218bdfeedfc6fa07c5f6e7832e1cad82 Mon Sep 17 00:00:00 2001 From: Mark Salmon Date: Tue, 21 Mar 2023 18:17:02 +0000 Subject: [PATCH 35/46] remove weird checkbox stuff --- src/Http/Livewire/LivewireDatatable.php | 92 ++++++++++++------------- 1 file changed, 46 insertions(+), 46 deletions(-) diff --git a/src/Http/Livewire/LivewireDatatable.php b/src/Http/Livewire/LivewireDatatable.php index 34971441..0777911d 100644 --- a/src/Http/Livewire/LivewireDatatable.php +++ b/src/Http/Livewire/LivewireDatatable.php @@ -66,7 +66,7 @@ class LivewireDatatable extends Component public $persistSort = true; public $persistPerPage = true; public $persistFilters = true; - public $visibleSelected = []; + // public $visibleSelected = []; public $row = 1; public $tablePrefix = ''; @@ -219,7 +219,7 @@ public function resetHiddenColumns() public function updatedSearch() { - $this->visibleSelected = ($this->search) ? array_intersect($this->getQuery()->get()->pluck('checkbox_attribute')->toArray(), $this->selected) : $this->selected; + // $this->visibleSelected = ($this->search) ? array_intersect($this->getQuery()->get()->pluck('checkbox_attribute')->toArray(), $this->selected) : $this->selected; $this->setPage(1); } @@ -884,7 +884,7 @@ public function isGroupHidden($group) public function doBooleanFilter($index, $value) { $this->activeBooleanFilters[$index] = $value; - $this->setVisibleSelected(); + // $this->setVisibleSelected(); $this->setPage(1); $this->setSessionStoredFilters(); } @@ -892,7 +892,7 @@ public function doBooleanFilter($index, $value) public function doSelectFilter($index, $value) { $this->activeSelectFilters[$index][] = $value; - $this->setVisibleSelected(); + // $this->setVisibleSelected(); $this->setPage(1); $this->setSessionStoredFilters(); } @@ -902,7 +902,7 @@ public function doTextFilter($index, $value) foreach (explode(' ', $value) as $val) { $this->activeTextFilters[$index][] = $val; } - $this->setVisibleSelected(); + // $this->setVisibleSelected(); $this->setPage(1); $this->setSessionStoredFilters(); } @@ -910,7 +910,7 @@ public function doTextFilter($index, $value) public function doDateFilterStart($index, $start) { $this->activeDateFilters[$index]['start'] = $start; - $this->setVisibleSelected(); + // $this->setVisibleSelected(); $this->setPage(1); $this->setSessionStoredFilters(); } @@ -918,7 +918,7 @@ public function doDateFilterStart($index, $start) public function doDateFilterEnd($index, $end) { $this->activeDateFilters[$index]['end'] = $end; - $this->setVisibleSelected(); + // $this->setVisibleSelected(); $this->setPage(1); $this->setSessionStoredFilters(); } @@ -926,7 +926,7 @@ public function doDateFilterEnd($index, $end) public function doTimeFilterStart($index, $start) { $this->activeTimeFilters[$index]['start'] = $start; - $this->setVisibleSelected(); + // $this->setVisibleSelected(); $this->setPage(1); $this->setSessionStoredFilters(); } @@ -934,7 +934,7 @@ public function doTimeFilterStart($index, $start) public function doTimeFilterEnd($index, $end) { $this->activeTimeFilters[$index]['end'] = $end; - $this->setVisibleSelected(); + // $this->setVisibleSelected(); $this->setPage(1); $this->setSessionStoredFilters(); } @@ -943,7 +943,7 @@ public function doNumberFilterStart($index, $start) { $this->activeNumberFilters[$index]['start'] = ($start != '') ? (int) $start : null; $this->clearEmptyNumberFilter($index); - $this->setVisibleSelected(); + // $this->setVisibleSelected(); $this->setPage(1); $this->setSessionStoredFilters(); } @@ -952,7 +952,7 @@ public function doNumberFilterEnd($index, $end) { $this->activeNumberFilters[$index]['end'] = ($end != '') ? (int) $end : null; $this->clearEmptyNumberFilter($index); - $this->setVisibleSelected(); + // $this->setVisibleSelected(); $this->setPage(1); $this->setSessionStoredFilters(); } @@ -969,7 +969,7 @@ public function clearEmptyNumberFilter($index) public function removeSelectFilter($column, $key = null) { unset($this->activeSelectFilters[$column][$key]); - $this->visibleSelected = $this->selected; + // $this->visibleSelected = $this->selected; if (count($this->activeSelectFilters[$column]) < 1) { unset($this->activeSelectFilters[$column]); } @@ -987,7 +987,7 @@ public function clearAllFilters() $this->activeNumberFilters = []; $this->complexQuery = null; $this->userFilter = null; - $this->visibleSelected = $this->selected; + // $this->visibleSelected = $this->selected; $this->setPage(1); $this->setSessionStoredFilters(); @@ -997,7 +997,7 @@ public function clearAllFilters() public function removeBooleanFilter($column) { unset($this->activeBooleanFilters[$column]); - $this->visibleSelected = $this->selected; + // $this->visibleSelected = $this->selected; $this->setSessionStoredFilters(); } @@ -1011,14 +1011,14 @@ public function removeTextFilter($column, $key = null) } else { unset($this->activeTextFilters[$column]); } - $this->visibleSelected = $this->selected; + // $this->visibleSelected = $this->selected; $this->setSessionStoredFilters(); } public function removeNumberFilter($column) { unset($this->activeNumberFilters[$column]); - $this->visibleSelected = $this->selected; + // $this->visibleSelected = $this->selected; $this->setSessionStoredFilters(); } @@ -1716,37 +1716,37 @@ public function checkboxQuery() public function toggleSelectAll() { - $visible_checkboxes = $this->getQuery()->get()->pluck('checkbox_attribute')->toArray(); - $visible_checkboxes = array_map('strval', $visible_checkboxes); - if ($this->searchOrFilterActive()) { - if (count($this->visibleSelected) === count($visible_checkboxes)) { - $this->selected = array_values(array_diff($this->selected, $visible_checkboxes)); - $this->visibleSelected = []; - } else { - $this->selected = array_unique(array_merge($this->selected, $visible_checkboxes)); - sort($this->selected); - $this->visibleSelected = $visible_checkboxes; - } + // $visible_checkboxes = $this->getQuery()->get()->pluck('checkbox_attribute')->toArray(); + // $visible_checkboxes = array_map('strval', $visible_checkboxes); + // if ($this->searchOrFilterActive()) { + // if (count($this->visibleSelected) === count($visible_checkboxes)) { + // $this->selected = array_values(array_diff($this->selected, $visible_checkboxes)); + // $this->visibleSelected = []; + // } else { + // $this->selected = array_unique(array_merge($this->selected, $visible_checkboxes)); + // sort($this->selected); + // $this->visibleSelected = $visible_checkboxes; + // } + // } else { + if (count($this->selected) === $this->getQuery()->getCountForPagination()) { + $this->selected = []; } else { - if (count($this->selected) === $this->getQuery()->getCountForPagination()) { - $this->selected = []; - } else { - $this->selected = $this->checkboxQuery()->values()->toArray(); - } - $this->visibleSelected = $this->selected; + $this->selected = $this->checkboxQuery()->values()->toArray(); } + // $this->visibleSelected = $this->selected; + // } $this->forgetComputed(); } - public function updatedSelected() - { - if ($this->searchOrFilterActive()) { - $this->setVisibleSelected(); - } else { - $this->visibleSelected = $this->selected; - } - } + // public function updatedSelected() + // { + // if ($this->searchOrFilterActive()) { + // $this->setVisibleSelected(); + // } else { + // $this->visibleSelected = $this->selected; + // } + // } public function rowIsSelected($row) { @@ -1864,9 +1864,9 @@ private function searchOrFilterActive() return ! empty($this->search) || $this->getActiveFiltersProperty(); } - private function setVisibleSelected() - { - $this->visibleSelected = array_intersect($this->getQuery()->get()->pluck('checkbox_attribute')->toArray(), $this->selected); - $this->visibleSelected = array_map('strval', $this->visibleSelected); - } + // private function setVisibleSelected() + // { + // $this->visibleSelected = array_intersect($this->getQuery()->get()->pluck('checkbox_attribute')->toArray(), $this->selected); + // $this->visibleSelected = array_map('strval', $this->visibleSelected); + // } } From a941d7df051c5d42d26f89d75421399d453eaa9f Mon Sep 17 00:00:00 2001 From: Mark Salmon Date: Sun, 9 Apr 2023 19:14:15 +0100 Subject: [PATCH 36/46] update laravel-relation-joins --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 8b5bfeba..1104959d 100644 --- a/composer.json +++ b/composer.json @@ -30,7 +30,7 @@ "php": "^8.0", "illuminate/support": "^7.0|^8.0|^9.0", "livewire/livewire": "^2.4.4", - "reedware/laravel-relation-joins": "^2.4|^3.0", + "reedware/laravel-relation-joins": "^2.4|^3.0|^4.0", "spatie/simple-excel": "^3.0" }, "require-dev": { From 1504918aa816783da12373d33b4e4ba843bec765 Mon Sep 17 00:00:00 2001 From: Mark Salmon Date: Sun, 9 Apr 2023 19:15:49 +0100 Subject: [PATCH 37/46] unupdate laravel-relation-joins --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 1104959d..8b5bfeba 100644 --- a/composer.json +++ b/composer.json @@ -30,7 +30,7 @@ "php": "^8.0", "illuminate/support": "^7.0|^8.0|^9.0", "livewire/livewire": "^2.4.4", - "reedware/laravel-relation-joins": "^2.4|^3.0|^4.0", + "reedware/laravel-relation-joins": "^2.4|^3.0", "spatie/simple-excel": "^3.0" }, "require-dev": { From 847143f08a247500a3231636f5c049f28899ff3f Mon Sep 17 00:00:00 2001 From: Mark Salmon Date: Tue, 2 May 2023 18:45:45 +0100 Subject: [PATCH 38/46] fix boolean query column name --- .phpunit.result.cache | 2 +- src/Http/Livewire/LivewireDatatable.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.phpunit.result.cache b/.phpunit.result.cache index 03884ce7..83bd16dd 100644 --- a/.phpunit.result.cache +++ b/.phpunit.result.cache @@ -1 +1 @@ -{"version":1,"defects":{"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_returns_an_array_from_column":3,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_returns_an_array_from_raw":3,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_returns_width_property_from_column":3},"times":{"Mediconesystems\\LivewireDatatables\\Tests\\ColumnSetTest::it_can_generate_an_array_of_columns_from_a_model":0.127,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnSetTest::it_can_correctly_populate_the_columns_from_the_model with data set #0":0.013,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnSetTest::it_can_correctly_populate_the_columns_from_the_model with data set #1":0.012,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnSetTest::it_can_correctly_populate_the_columns_from_the_model with data set #2":0.012,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnSetTest::it_can_correctly_populate_the_columns_from_the_model with data set #3":0.012,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnSetTest::it_can_correctly_populate_the_columns_from_the_model with data set #4":0.012,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnSetTest::it_can_correctly_populate_the_columns_from_the_model with data set #5":0.013,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnSetTest::it_can_correctly_populate_the_columns_from_the_model with data set #6":0.013,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnSetTest::it_can_correctly_populate_the_columns_from_the_model with data set #7":0.012,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnSetTest::it_can_exclude_columns":0.014,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnSetTest::it_can_include_columns":0.012,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnSetTest::it_can_rename_columns":0.011,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_can_generate_a_column_from_a_table_column":0.011,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_can_generate_a_column_from_a_scope":0.012,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_can_generate_a_delete_column":0.011,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_sets_properties_and_parameters with data set #0":0.011,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_sets_properties_and_parameters with data set #1":0.011,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_sets_properties_and_parameters with data set #2":0.011,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_sets_properties_and_parameters with data set #3":0.011,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_sets_properties_and_parameters with data set #4":0.012,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_returns_an_array_from_column":0.014,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_returns_an_array_from_raw":0.012,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_returns_width_property_from_column":0.011,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableClassTest::it_can_mount_using_the_class":0.054,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableClassTest::it_can_set_a_default_sort":0.019,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableClassTest::it_can_show_and_hide_a_column":0.039,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableClassTest::it_can_order_results":0.014,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableClassTest::it_can_filter_results_based_on_text":0.026,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableClassTest::it_can_filter_results_based_on_boolean":0.026,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableClassTest::it_can_filter_strings_as_a_boolean":0.029,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableClassTest::it_can_filter_results_based_on_selects":0.025,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableClassTest::it_can_filter_results_based_on_numbers":0.059,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a_query_builder_for_base_columns":0.013,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a_query_builder_for_has_one_relation_columns":0.013,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a_where_query_for_a_has_one_column":0.013,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a_query_builder_for_has_many_relation_columns":0.014,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a_query_builder_for_has_many_relation_column_with_specific_aggregate":0.014,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a_where_query_for_has_many_relation_columns":0.013,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a_query_builder_for_belongs_to_relation_columns":0.018,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a_where_query_for_belongs_to_relation_columns":0.014,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a_query_builder_for_belongs_to_many_relation_columns":0.016,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a__where_query_for_belongs_to_many_relation_columns":0.013,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableTemplateTest::it_can_mount_from_the_default_template_with_a_model":0.017,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableTemplateTest::the_header_can_be_hidden_with_a_property":0.016,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableTemplateTest::the_pagination_bar_can_be_hidden_with_a_property":0.016,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableTemplateTest::it_can_set_per_page_with_a_property":0.023,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableTemplateTest::it_can_include_columns_from_a_property":0.016,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableTemplateTest::it_can_exclude_columns_from_a_property":0.017,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableTemplateTest::it_can_hide_columns_from_a_property":0.021,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableTemplateTest::it_can_mark_columns_for_date_format_from_a_property":0.017,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableTemplateTest::it_can_mark_columns_for_time_format_from_a_property":0.018,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableTemplateTest::it_can_set_sort_from_a_property":0.018,"Mediconesystems\\LivewireDatatables\\Tests\\MakeDatatableCommandTest::component_is_created_by_make_command":0.017,"Mediconesystems\\LivewireDatatables\\Tests\\MakeDatatableCommandTest::dot_nested_component_is_created_by_make_command":0.019,"Mediconesystems\\LivewireDatatables\\Tests\\MakeDatatableCommandTest::forward_slash_nested_component_is_created_by_make_command":0.016,"Mediconesystems\\LivewireDatatables\\Tests\\MakeDatatableCommandTest::multiword_component_is_created_by_make_command":0.014,"Mediconesystems\\LivewireDatatables\\Tests\\MakeDatatableCommandTest::pascal_case_component_is_automatically_converted_by_make_command":0.014,"Mediconesystems\\LivewireDatatables\\Tests\\MakeDatatableCommandTest::snake_case_component_is_automatically_converted_by_make_command":0.017,"Mediconesystems\\LivewireDatatables\\Tests\\MakeDatatableCommandTest::snake_case_component_is_automatically_converted_by_make_command_on_nested_component":0.018,"Mediconesystems\\LivewireDatatables\\Tests\\MakeDatatableCommandTest::new_component_model_name_matches_option":0.014,"Mediconesystems\\LivewireDatatables\\Tests\\MakeDatatableCommandTest::a_component_is_not_created_with_a_reserved_class_name":0.013}} \ No newline at end of file +{"version":1,"defects":{"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_returns_an_array_from_column":3,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_returns_an_array_from_raw":3,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_returns_width_property_from_column":3,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a_query_builder_for_base_columns":3,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a_query_builder_for_has_one_relation_columns":3,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a_where_query_for_a_has_one_column":3,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a_query_builder_for_has_many_relation_columns":3,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a_query_builder_for_has_many_relation_column_with_specific_aggregate":3,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a_where_query_for_has_many_relation_columns":3,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a_query_builder_for_belongs_to_relation_columns":3,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a_query_builder_for_belongs_to_many_relation_columns":3,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a__where_query_for_belongs_to_many_relation_columns":3},"times":{"Mediconesystems\\LivewireDatatables\\Tests\\ColumnSetTest::it_can_generate_an_array_of_columns_from_a_model":0.135,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnSetTest::it_can_correctly_populate_the_columns_from_the_model with data set #0":0.007,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnSetTest::it_can_correctly_populate_the_columns_from_the_model with data set #1":0.007,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnSetTest::it_can_correctly_populate_the_columns_from_the_model with data set #2":0.007,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnSetTest::it_can_correctly_populate_the_columns_from_the_model with data set #3":0.007,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnSetTest::it_can_correctly_populate_the_columns_from_the_model with data set #4":0.007,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnSetTest::it_can_correctly_populate_the_columns_from_the_model with data set #5":0.007,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnSetTest::it_can_correctly_populate_the_columns_from_the_model with data set #6":0.007,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnSetTest::it_can_correctly_populate_the_columns_from_the_model with data set #7":0.007,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnSetTest::it_can_exclude_columns":0.008,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnSetTest::it_can_include_columns":0.009,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnSetTest::it_can_rename_columns":0.007,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_can_generate_a_column_from_a_table_column":0.007,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_can_generate_a_column_from_a_scope":0.007,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_can_generate_a_delete_column":0.006,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_sets_properties_and_parameters with data set #0":0.007,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_sets_properties_and_parameters with data set #1":0.006,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_sets_properties_and_parameters with data set #2":0.007,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_sets_properties_and_parameters with data set #3":0.006,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_sets_properties_and_parameters with data set #4":0.006,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_returns_an_array_from_column":0.008,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_returns_an_array_from_raw":0.008,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_returns_width_property_from_column":0.007,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableClassTest::it_can_mount_using_the_class":0.05,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableClassTest::it_can_set_a_default_sort":0.012,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableClassTest::it_can_show_and_hide_a_column":0.029,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableClassTest::it_can_order_results":0.008,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableClassTest::it_can_filter_results_based_on_text":0.017,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableClassTest::it_can_filter_results_based_on_boolean":0.017,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableClassTest::it_can_filter_strings_as_a_boolean":0.017,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableClassTest::it_can_filter_results_based_on_selects":0.017,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableClassTest::it_can_filter_results_based_on_numbers":0.044,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a_query_builder_for_base_columns":0.009,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a_query_builder_for_has_one_relation_columns":0.008,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a_where_query_for_a_has_one_column":0.008,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a_query_builder_for_has_many_relation_columns":0.008,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a_query_builder_for_has_many_relation_column_with_specific_aggregate":0.008,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a_where_query_for_has_many_relation_columns":0.008,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a_query_builder_for_belongs_to_relation_columns":0.009,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a_where_query_for_belongs_to_relation_columns":0.009,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a_query_builder_for_belongs_to_many_relation_columns":0.01,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a__where_query_for_belongs_to_many_relation_columns":0.008,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableTemplateTest::it_can_mount_from_the_default_template_with_a_model":0.011,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableTemplateTest::the_header_can_be_hidden_with_a_property":0.013,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableTemplateTest::the_pagination_bar_can_be_hidden_with_a_property":0.01,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableTemplateTest::it_can_set_per_page_with_a_property":0.018,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableTemplateTest::it_can_include_columns_from_a_property":0.01,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableTemplateTest::it_can_exclude_columns_from_a_property":0.011,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableTemplateTest::it_can_hide_columns_from_a_property":0.011,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableTemplateTest::it_can_mark_columns_for_date_format_from_a_property":0.012,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableTemplateTest::it_can_mark_columns_for_time_format_from_a_property":0.013,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableTemplateTest::it_can_set_sort_from_a_property":0.012,"Mediconesystems\\LivewireDatatables\\Tests\\MakeDatatableCommandTest::component_is_created_by_make_command":0.011,"Mediconesystems\\LivewireDatatables\\Tests\\MakeDatatableCommandTest::dot_nested_component_is_created_by_make_command":0.011,"Mediconesystems\\LivewireDatatables\\Tests\\MakeDatatableCommandTest::forward_slash_nested_component_is_created_by_make_command":0.008,"Mediconesystems\\LivewireDatatables\\Tests\\MakeDatatableCommandTest::multiword_component_is_created_by_make_command":0.009,"Mediconesystems\\LivewireDatatables\\Tests\\MakeDatatableCommandTest::pascal_case_component_is_automatically_converted_by_make_command":0.009,"Mediconesystems\\LivewireDatatables\\Tests\\MakeDatatableCommandTest::snake_case_component_is_automatically_converted_by_make_command":0.009,"Mediconesystems\\LivewireDatatables\\Tests\\MakeDatatableCommandTest::snake_case_component_is_automatically_converted_by_make_command_on_nested_component":0.009,"Mediconesystems\\LivewireDatatables\\Tests\\MakeDatatableCommandTest::new_component_model_name_matches_option":0.008,"Mediconesystems\\LivewireDatatables\\Tests\\MakeDatatableCommandTest::a_component_is_not_created_with_a_reserved_class_name":0.007}} \ No newline at end of file diff --git a/src/Http/Livewire/LivewireDatatable.php b/src/Http/Livewire/LivewireDatatable.php index a1472d6e..d7c0fd18 100644 --- a/src/Http/Livewire/LivewireDatatable.php +++ b/src/Http/Livewire/LivewireDatatable.php @@ -1279,7 +1279,7 @@ public function processNested($rules = null, $query = null, $logic = 'and') if ($rule['content']['value'] === 'true') { $query->where(function ($query) use ($column) { $query->whereNotNull(Str::contains($column, '(') ? DB::raw($column) : $column) - ->where($column, '<>', 0); + ->where(Str::contains($column, '(') ? DB::raw($column) : $column, '<>', 0); }); } else { $query->where(function ($query) use ($column) { From 1addfdc9687cbc057ffd9057cbd82fda1cd66f8b Mon Sep 17 00:00:00 2001 From: Mark Salmon Date: Mon, 15 May 2023 21:57:47 +0100 Subject: [PATCH 39/46] fix hidden column persistence --- src/Http/Livewire/LivewireDatatable.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Http/Livewire/LivewireDatatable.php b/src/Http/Livewire/LivewireDatatable.php index d7c0fd18..1febd415 100644 --- a/src/Http/Livewire/LivewireDatatable.php +++ b/src/Http/Livewire/LivewireDatatable.php @@ -546,7 +546,7 @@ public function setSessionStoredHidden() $hidden = collect($this->columns)->filter->hidden->keys()->toArray(); - session()->put([$this->sessionStorageKey() . $this->name . '_hidden_columns' => $hidden]); + session()->put([$this->sessionStorageKey() . '_hidden_columns' => $hidden]); } public function initialiseSearch() From 21f56aec42e26bfff28ffec09c0c6ee62cd612fd Mon Sep 17 00:00:00 2001 From: Mark Salmon Date: Mon, 15 May 2023 22:02:24 +0100 Subject: [PATCH 40/46] fix perpage persistence --- src/Http/Livewire/LivewireDatatable.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Http/Livewire/LivewireDatatable.php b/src/Http/Livewire/LivewireDatatable.php index 1febd415..ff0e7421 100644 --- a/src/Http/Livewire/LivewireDatatable.php +++ b/src/Http/Livewire/LivewireDatatable.php @@ -504,7 +504,7 @@ public function getSessionStoredPerPage() return; } - $this->perPage = session()->get($this->sessionStorageKey() . $this->name . '_perpage', $this->perPage); + $this->perPage = session()->get($this->sessionStorageKey() . '_perpage', $this->perPage); } public function setSessionStoredSort() From 7b62e53fce80e6563f0e064802b32ef19fccce3d Mon Sep 17 00:00:00 2001 From: Mark Salmon Date: Mon, 15 May 2023 22:14:14 +0100 Subject: [PATCH 41/46] dynamic hide column --- src/Column.php | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/Column.php b/src/Column.php index 5208b0f6..d73dd4fe 100644 --- a/src/Column.php +++ b/src/Column.php @@ -398,6 +398,20 @@ public function hide() return $this; } + public function hideIf($boolean) + { + $this->hidden = $boolean; + + return $this; + } + + public function hideUnless($boolean) + { + $this->hidden = ! $boolean; + + return $this; + } + public function alignRight() { $this->headerAlign = 'right'; From 49e4232062fe5be38be6c7ba6403816f928adc04 Mon Sep 17 00:00:00 2001 From: Mark Salmon Date: Tue, 30 May 2023 16:15:58 +0100 Subject: [PATCH 42/46] boolean non-zero --- .../livewire/datatables/boolean-non-zero.blade.php | 13 +++++++++++++ .../datatables/filters/boolean-non-zero.blade.php | 1 + src/Http/Livewire/LivewireDatatable.php | 12 ++++++++++++ 3 files changed, 26 insertions(+) create mode 100644 resources/views/livewire/datatables/boolean-non-zero.blade.php create mode 100644 resources/views/livewire/datatables/filters/boolean-non-zero.blade.php diff --git a/resources/views/livewire/datatables/boolean-non-zero.blade.php b/resources/views/livewire/datatables/boolean-non-zero.blade.php new file mode 100644 index 00000000..2202b04c --- /dev/null +++ b/resources/views/livewire/datatables/boolean-non-zero.blade.php @@ -0,0 +1,13 @@ +
+ @if(filled($value)) +
+ + + +
+ @else + + @endif +
diff --git a/resources/views/livewire/datatables/filters/boolean-non-zero.blade.php b/resources/views/livewire/datatables/filters/boolean-non-zero.blade.php new file mode 100644 index 00000000..5e82fd8d --- /dev/null +++ b/resources/views/livewire/datatables/filters/boolean-non-zero.blade.php @@ -0,0 +1 @@ +@include('boolean') diff --git a/src/Http/Livewire/LivewireDatatable.php b/src/Http/Livewire/LivewireDatatable.php index ff0e7421..84c68b6b 100644 --- a/src/Http/Livewire/LivewireDatatable.php +++ b/src/Http/Livewire/LivewireDatatable.php @@ -1287,6 +1287,12 @@ public function processNested($rules = null, $query = null, $logic = 'and') ->orWhere(Str::contains($column, '(') ? DB::raw($column) : $column, 0); }); } + } elseif ($this->columns[$rule['content']['column']]['type'] === 'boolean-non-zero') { + if ($rule['content']['value'] === 'true') { + $query->whereNotNull(Str::contains($column, '(') ? DB::raw($column) : $column); + } else { + $query->whereNull(Str::contains($column, '(') ? DB::raw($column) : $column); + } } else { $col = (isset($this->freshColumns[$rule['content']['column']]['round']) && $this->freshColumns[$rule['content']['column']]['round'] !== null) ? DB::raw('ROUND(' . $column . ', ' . $this->freshColumns[$rule['content']['column']]['round'] . ')') @@ -1417,6 +1423,12 @@ public function addBooleanFilters() ->orWhere(DB::raw($this->getColumnFilterStatement($index)[0]), ''); }); } + } elseif ($this->freshColumns[$index]['type'] === 'boolean-non-zero') { + if ($value == 1) { + $query->whereNotNull($this->getColumnFilterStatement($index)[0]); + } elseif (strlen($value)) { + $query->whereNull(DB::raw($this->getColumnFilterStatement($index)[0])); + } } elseif ($value == 1) { $query->where(DB::raw($this->getColumnFilterStatement($index)[0]), '>', 0); } elseif (strlen($value)) { From c04b8b83fe931bec8728c783955dd59f93cdeeae Mon Sep 17 00:00:00 2001 From: Mark Salmon Date: Tue, 30 May 2023 16:20:02 +0100 Subject: [PATCH 43/46] boolean non zero column --- src/BooleanNonZeroColumn.php | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/BooleanNonZeroColumn.php diff --git a/src/BooleanNonZeroColumn.php b/src/BooleanNonZeroColumn.php new file mode 100644 index 00000000..6f95580a --- /dev/null +++ b/src/BooleanNonZeroColumn.php @@ -0,0 +1,20 @@ +callback = function ($value) { + return view('datatables::boolean-non-zero', ['value' => $value]); + }; + + $this->exportCallback = function ($value) { + return filled($value) ? 1 : 0; + }; + } +} From 864cfda380617e0bbd4a47b11f84ac988ec60674 Mon Sep 17 00:00:00 2001 From: Mark Salmon Date: Tue, 30 May 2023 16:20:26 +0100 Subject: [PATCH 44/46] wip --- src/BooleanNonZeroColumn.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/BooleanNonZeroColumn.php b/src/BooleanNonZeroColumn.php index 6f95580a..4996a546 100644 --- a/src/BooleanNonZeroColumn.php +++ b/src/BooleanNonZeroColumn.php @@ -2,7 +2,7 @@ namespace Mediconesystems\LivewireDatatables; -class BooleanColumn extends Column +class BooleanNonZeroColumn extends Column { public $type = 'boolean-non-zero'; public $callback; From 5c949bdc0d6ac67bbd8b200940f36129ed7ff29a Mon Sep 17 00:00:00 2001 From: Mark Salmon Date: Sun, 3 Dec 2023 23:25:32 +0000 Subject: [PATCH 45/46] resetSessionStoredHidden --- src/Http/Livewire/LivewireDatatable.php | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/Http/Livewire/LivewireDatatable.php b/src/Http/Livewire/LivewireDatatable.php index 84c68b6b..58e96f1e 100644 --- a/src/Http/Livewire/LivewireDatatable.php +++ b/src/Http/Livewire/LivewireDatatable.php @@ -549,6 +549,17 @@ public function setSessionStoredHidden() session()->put([$this->sessionStorageKey() . '_hidden_columns' => $hidden]); } + public function resetSessionStoredHidden() + { + if (! $this->persistHiddenColumns) { + return; + } + + session()->forget($this->sessionStorageKey() . '_hidden_columns'); + + $this->columns = $this->getViewColumns(); + } + public function initialiseSearch() { if (! $this->persistSearch) { From f16b8d99d17fc98091a07de0fb9a87a8d909f6f6 Mon Sep 17 00:00:00 2001 From: Mark Salmon Date: Tue, 16 Jan 2024 17:43:54 +0000 Subject: [PATCH 46/46] Update ComplexQuery.php --- src/Http/Livewire/ComplexQuery.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Http/Livewire/ComplexQuery.php b/src/Http/Livewire/ComplexQuery.php index 8341c62a..554c1623 100644 --- a/src/Http/Livewire/ComplexQuery.php +++ b/src/Http/Livewire/ComplexQuery.php @@ -209,6 +209,7 @@ public function getOperands($key) 'date' => ['=', '<>', '<', '<=', '>', '>='], 'time' => ['=', '<>', '<', '<=', '>', '>='], 'boolean' => [], + 'boolean-non-zero' => [], 'scope' => ['includes'], ];