From 99b05d270e0b6e140676aa16cf571c88b3d2601d Mon Sep 17 00:00:00 2001 From: LRLJoe Date: Sun, 9 Feb 2025 07:32:59 +0000 Subject: [PATCH 01/12] Add Missing Pills Test --- tests/Unit/Views/Filters/FilterTestCase.php | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tests/Unit/Views/Filters/FilterTestCase.php b/tests/Unit/Views/Filters/FilterTestCase.php index 5375e4890..9032ae818 100644 --- a/tests/Unit/Views/Filters/FilterTestCase.php +++ b/tests/Unit/Views/Filters/FilterTestCase.php @@ -245,4 +245,18 @@ public function test_can_set_reset_attributes_merged(): void 'class' => 'bg-blue-500', ]); } + + public function test_can_check_pills_are_html(): void + { + $filter = self::$filterInstance; + $this->assertFalse($filter->getPillsAreHtml()); + + $filter->setPillsAsHtmlEnabled(); + $this->assertTrue($filter->getPillsAreHtml()); + + $filter->setPillsAsHtmlDisabled(); + $this->assertFalse($filter->getPillsAreHtml()); + + } + } From 3e694c335b8af5fa7e1a259db4fefc4a2a38100d Mon Sep 17 00:00:00 2001 From: lrljoe <104938042+lrljoe@users.noreply.github.com> Date: Sun, 9 Feb 2025 07:33:32 +0000 Subject: [PATCH 02/12] Fix styling --- tests/Unit/Views/Filters/FilterTestCase.php | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/Unit/Views/Filters/FilterTestCase.php b/tests/Unit/Views/Filters/FilterTestCase.php index 9032ae818..407aac428 100644 --- a/tests/Unit/Views/Filters/FilterTestCase.php +++ b/tests/Unit/Views/Filters/FilterTestCase.php @@ -258,5 +258,4 @@ public function test_can_check_pills_are_html(): void $this->assertFalse($filter->getPillsAreHtml()); } - } From 81f3b40a7e0aefb51b011d546101eac9c08249d5 Mon Sep 17 00:00:00 2001 From: LRLJoe Date: Sun, 9 Feb 2025 07:38:29 +0000 Subject: [PATCH 03/12] Tweak PillDataHandling --- src/Traits/Filters/HandlesPillsData.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/Traits/Filters/HandlesPillsData.php b/src/Traits/Filters/HandlesPillsData.php index 84dd1e642..acd8b47f7 100644 --- a/src/Traits/Filters/HandlesPillsData.php +++ b/src/Traits/Filters/HandlesPillsData.php @@ -12,17 +12,18 @@ public function getPillDataForFilter(): array foreach ($this->getAppliedFiltersWithValuesForPills() as $filterSelectName => $value) { if (! is_null($filter = $this->getFilterByKey($filterSelectName))) { - if ($filter->isEmpty($value)) { - continue; - } + //if ($filter->isEmpty($value)) { + // continue; + // } $customPillBlade = null; + $hasCustomPillBlade = $filter->hasCustomPillBlade(); $isAnExternalLivewireFilter = (method_exists($filter, 'isAnExternalLivewireFilter') && $filter->isAnExternalLivewireFilter()); $separator = method_exists($filter, 'getPillsSeparator') ? $filter->getPillsSeparator() : ', '; $separatedValues = null; // dd($value); - if ($hasCustomPillBlade = $filter->hasCustomPillBlade()) { + if ($hasCustomPillBlade) { $customPillBlade = $filter->getCustomPillBlade(); } From c505525885c46be5cd9f1c4232b625a6a906e516 Mon Sep 17 00:00:00 2001 From: lrljoe <104938042+lrljoe@users.noreply.github.com> Date: Sun, 9 Feb 2025 07:38:57 +0000 Subject: [PATCH 04/12] Fix styling --- src/Traits/Filters/HandlesPillsData.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Traits/Filters/HandlesPillsData.php b/src/Traits/Filters/HandlesPillsData.php index acd8b47f7..e2b82af9d 100644 --- a/src/Traits/Filters/HandlesPillsData.php +++ b/src/Traits/Filters/HandlesPillsData.php @@ -12,9 +12,9 @@ public function getPillDataForFilter(): array foreach ($this->getAppliedFiltersWithValuesForPills() as $filterSelectName => $value) { if (! is_null($filter = $this->getFilterByKey($filterSelectName))) { - //if ($filter->isEmpty($value)) { - // continue; - // } + // if ($filter->isEmpty($value)) { + // continue; + // } $customPillBlade = null; $hasCustomPillBlade = $filter->hasCustomPillBlade(); $isAnExternalLivewireFilter = (method_exists($filter, 'isAnExternalLivewireFilter') && $filter->isAnExternalLivewireFilter()); From b82ea91e2a444e166908ddacc184899067bf0a1a Mon Sep 17 00:00:00 2001 From: LRLJoe Date: Sun, 9 Feb 2025 07:56:26 +0000 Subject: [PATCH 05/12] Add fix for View Compnent Column attribute type --- .../Views/Columns/ViewComponentColumnTest.php | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tests/Unit/Views/Columns/ViewComponentColumnTest.php b/tests/Unit/Views/Columns/ViewComponentColumnTest.php index c5d138d71..e350bc60d 100644 --- a/tests/Unit/Views/Columns/ViewComponentColumnTest.php +++ b/tests/Unit/Views/Columns/ViewComponentColumnTest.php @@ -92,4 +92,19 @@ public function test_can_not_return_invalid_attributes(): void $column = ViewComponentColumn::make('Total Users')->component('test-component')->attributes(fn ($value, $row, Column $column) => 'test')->getContents(Pet::find(1)); } + + public function test_can_not_return_invalid_attributes_return(): void + { + $this->expectException(DataTableConfigurationException::class); + + $column = ViewComponentColumn::make('Total Users') + ->customComponent(\Rappasoft\LaravelLivewireTables\Tests\Http\TestComponent::class) + ->attributes(fn ($value, $row, Column $column) => (string) 'test'); + + $contents = $column->getContents(Pet::find(1)); + + $this->assertSame('
2420
', $contents); + + } + } From 9dd42ccdb9aad263115b231205324e87520c6264 Mon Sep 17 00:00:00 2001 From: lrljoe <104938042+lrljoe@users.noreply.github.com> Date: Sun, 9 Feb 2025 07:56:55 +0000 Subject: [PATCH 06/12] Fix styling --- tests/Unit/Views/Columns/ViewComponentColumnTest.php | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/Unit/Views/Columns/ViewComponentColumnTest.php b/tests/Unit/Views/Columns/ViewComponentColumnTest.php index e350bc60d..60fbe69e7 100644 --- a/tests/Unit/Views/Columns/ViewComponentColumnTest.php +++ b/tests/Unit/Views/Columns/ViewComponentColumnTest.php @@ -106,5 +106,4 @@ public function test_can_not_return_invalid_attributes_return(): void $this->assertSame('
2420
', $contents); } - } From 167e806305d2cd69f02389db1a445769f92f5d54 Mon Sep 17 00:00:00 2001 From: LRLJoe Date: Sun, 9 Feb 2025 08:05:56 +0000 Subject: [PATCH 07/12] Centralise Action Traits --- src/Views/Action.php | 3 +- .../Traits}/HasActionAttributes.php | 2 +- .../Actions => Actions/Traits}/HasRoute.php | 2 +- src/Views/Actions/Traits/HasVisibility.php | 28 +++++++++++++++++++ 4 files changed, 31 insertions(+), 4 deletions(-) rename src/Views/{Traits/Actions => Actions/Traits}/HasActionAttributes.php (93%) rename src/Views/{Traits/Actions => Actions/Traits}/HasRoute.php (87%) create mode 100644 src/Views/Actions/Traits/HasVisibility.php diff --git a/src/Views/Action.php b/src/Views/Action.php index 6775a75c3..bbba77c81 100644 --- a/src/Views/Action.php +++ b/src/Views/Action.php @@ -4,8 +4,7 @@ use Illuminate\View\Component; use Rappasoft\LaravelLivewireTables\Traits\Core\HasLocalisations; -use Rappasoft\LaravelLivewireTables\Views\Traits\Actions\{HasActionAttributes, HasRoute}; -use Rappasoft\LaravelLivewireTables\Views\Traits\Columns\HasVisibility; +use Rappasoft\LaravelLivewireTables\Views\Actions\Traits\{HasActionAttributes, HasRoute, HasVisibility}; use Rappasoft\LaravelLivewireTables\Views\Traits\Core\{HasIcon, HasLabel, HasLabelAttributes, HasTheme, HasView, HasWireActions}; class Action extends Component diff --git a/src/Views/Traits/Actions/HasActionAttributes.php b/src/Views/Actions/Traits/HasActionAttributes.php similarity index 93% rename from src/Views/Traits/Actions/HasActionAttributes.php rename to src/Views/Actions/Traits/HasActionAttributes.php index 1ff1dc66c..09cf69618 100644 --- a/src/Views/Traits/Actions/HasActionAttributes.php +++ b/src/Views/Actions/Traits/HasActionAttributes.php @@ -1,6 +1,6 @@ hidden !== true; + } + + public function isHidden(): bool + { + return $this->hidden === true; + } + + /** + * @param mixed $condition + */ + public function hideIf($condition): self + { + $this->hidden = $condition; + + return $this; + } +} From bcd63fbabbcd37a051f9b0dce810e626b8dd325c Mon Sep 17 00:00:00 2001 From: LRLJoe Date: Sun, 9 Feb 2025 08:16:21 +0000 Subject: [PATCH 08/12] Add Action Visibility Tests --- tests/Unit/Views/Actions/ActionTest.php | 45 +++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/tests/Unit/Views/Actions/ActionTest.php b/tests/Unit/Views/Actions/ActionTest.php index 0c16c2652..491b36fca 100644 --- a/tests/Unit/Views/Actions/ActionTest.php +++ b/tests/Unit/Views/Actions/ActionTest.php @@ -398,4 +398,49 @@ public function exportBulk($items) $this->assertFalse($petsTable->showActionsInToolbar()); } + + public function test_can_set_action_visible_defaults(): void + { + $action = Action::make('Update Summaries') + ->setActionAttributes(['class' => 'dark:bg-green-500 dark:text-white dark:border-green-600 dark:hover:border-green-900 dark:hover:bg-green-800', 'default-styling' => true, 'default-colors' => true]) + ->setIcon('fas fa-minus') + ->setIconAttributes(['class' => 'font-sm text-sm']) + ->setIconLeft() + ->setWireAction('wire:click') + ->setWireActionParams('testactionparams'); + $this->assertTrue($action->isVisible()); + $this->assertFalse($action->isHidden()); + + } + + public function test_can_set_action_hidden(): void + { + $action = Action::make('Update Summaries') + ->setActionAttributes(['class' => 'dark:bg-green-500 dark:text-white dark:border-green-600 dark:hover:border-green-900 dark:hover:bg-green-800', 'default-styling' => true, 'default-colors' => true]) + ->setIcon('fas fa-minus') + ->setIconAttributes(['class' => 'font-sm text-sm']) + ->setIconLeft() + ->setWireAction('wire:click') + ->setWireActionParams('testactionparams') + ->hideIf(true); + $this->assertTrue($action->isHidden()); + $this->assertFalse($action->isVisible()); + + } + + public function test_can_set_action_visible(): void + { + $action = Action::make('Update Summaries') + ->setActionAttributes(['class' => 'dark:bg-green-500 dark:text-white dark:border-green-600 dark:hover:border-green-900 dark:hover:bg-green-800', 'default-styling' => true, 'default-colors' => true]) + ->setIcon('fas fa-minus') + ->setIconAttributes(['class' => 'font-sm text-sm']) + ->setIconLeft() + ->setWireAction('wire:click') + ->setWireActionParams('testactionparams') + ->hideIf(false); + $this->assertTrue($action->isVisible()); + $this->assertFalse($action->isHidden()); + + } + } From 136210dacbaafd9151329cc25687b36221beb4b7 Mon Sep 17 00:00:00 2001 From: lrljoe <104938042+lrljoe@users.noreply.github.com> Date: Sun, 9 Feb 2025 08:16:50 +0000 Subject: [PATCH 09/12] Fix styling --- tests/Unit/Views/Actions/ActionTest.php | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/tests/Unit/Views/Actions/ActionTest.php b/tests/Unit/Views/Actions/ActionTest.php index 491b36fca..6d82452a8 100644 --- a/tests/Unit/Views/Actions/ActionTest.php +++ b/tests/Unit/Views/Actions/ActionTest.php @@ -438,9 +438,8 @@ public function test_can_set_action_visible(): void ->setWireAction('wire:click') ->setWireActionParams('testactionparams') ->hideIf(false); - $this->assertTrue($action->isVisible()); - $this->assertFalse($action->isHidden()); - - } + $this->assertTrue($action->isVisible()); + $this->assertFalse($action->isHidden()); + } } From 733c2ee4aa26c24661a4133a28b1e92f149955dd Mon Sep 17 00:00:00 2001 From: LRLJoe Date: Sun, 9 Feb 2025 08:22:54 +0000 Subject: [PATCH 10/12] Add ComponentColumn invalid attributes test --- tests/Unit/Views/Columns/ComponentColumnTest.php | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tests/Unit/Views/Columns/ComponentColumnTest.php b/tests/Unit/Views/Columns/ComponentColumnTest.php index bded51dc5..d7ee9ef01 100644 --- a/tests/Unit/Views/Columns/ComponentColumnTest.php +++ b/tests/Unit/Views/Columns/ComponentColumnTest.php @@ -94,4 +94,18 @@ public function test_can_get_attributes(): void $this->assertSame(2, $pet2_contents->getData()['attributes']['age']); } + + public function test_can_not_return_invalid_attributes_return(): void + { + $this->expectException(DataTableConfigurationException::class); + + $column = ComponentColumn::make('Total Users') + ->component('livewire-tables-test::test') + ->attributes(fn ($value, $row, Column $column) => (string) 'test'); + + $contents = $column->getContents(Pet::find(1)); + + $this->assertSame('
2420
', $contents); + + } } From fc6821111ce35aa63ac15b2b7fbf7ed382946933 Mon Sep 17 00:00:00 2001 From: LRLJoe Date: Sat, 15 Feb 2025 02:41:24 +0000 Subject: [PATCH 11/12] Major reworks to Pills, plus restructure to Columns - this may be split into separate PRs --- resources/js/laravel-livewire-tables.js | 35 ++- resources/js/laravel-livewire-tables.min.js | 2 +- .../components/tools/filter-pills.blade.php | 2 +- .../buttons/reset-filter.blade.php | 8 +- .../tools/filter-pills/pills-item.blade.php | 22 +- .../views/includes/filter-pill.blade.php | 22 ++ .../Filters/FilterPillData.php | 126 +++++----- .../Filters/FilterPillDataOld.php | 221 ++++++++++++++++++ src/LaravelLivewireTablesServiceProvider.php | 1 + src/Traits/Filters/HandlesPillsData.php | 34 +-- src/View/Components/FilterPill.php | 29 +++ src/Views/Column.php | 2 +- src/Views/Columns/AggregateColumn.php | 18 +- src/Views/Columns/ArrayColumn.php | 34 ++- src/Views/Columns/AvgColumn.php | 3 - src/Views/Columns/BooleanColumn.php | 9 +- src/Views/Columns/ButtonGroupColumn.php | 5 +- src/Views/Columns/ColorColumn.php | 13 +- src/Views/Columns/Column.php | 8 + src/Views/Columns/ComponentColumn.php | 4 +- src/Views/Columns/CountColumn.php | 2 - src/Views/Columns/DateColumn.php | 23 +- src/Views/Columns/IconColumn.php | 7 +- src/Views/Columns/ImageColumn.php | 5 +- src/Views/Columns/LinkColumn.php | 4 +- src/Views/Columns/LivewireComponentColumn.php | 41 +++- src/Views/Columns/SumColumn.php | 2 - .../AggregateColumnConfiguration.php | 2 +- .../ArrayColumnConfiguration.php | 2 +- .../BooleanColumnConfiguration.php | 2 +- .../ButtonGroupColumnConfiguration.php | 2 +- .../ColorColumnConfiguration.php | 2 +- .../Configuration/ColumnConfiguration.php | 7 +- .../Configuration/DateColumnConfiguration.php | 16 ++ .../Configuration/IconColumnConfiguration.php | 2 +- .../ImageColumnConfiguration.php | 5 + .../Configuration/LinkColumnConfiguration.php | 5 + .../LivewireComponentColumnConfiguration.php | 2 +- .../ViewComponentColumnConfiguration.php | 2 +- .../WireLinkColumnConfiguration.php | 5 + .../Traits}/HasColumnView.php | 2 +- .../Traits}/HasComponentView.php | 2 +- .../Traits}/HasDefaultStringValue.php | 2 +- .../Core => Columns/Traits}/HasFooter.php | 2 +- .../Traits/HasInputOutputFormat.php} | 22 +- .../Traits}/HasSecondaryHeader.php | 4 +- .../Columns => Columns/Traits}/HasSlot.php | 2 +- .../Traits}/HasVisibility.php | 4 +- .../Traits/Helpers/AggregateColumnHelpers.php | 33 +++ .../Traits/Helpers/ArrayColumnHelpers.php | 43 ++++ .../Traits/Helpers/BooleanColumnHelpers.php | 4 +- .../Helpers/ButtonGroupColumnHelpers.php | 4 +- .../Traits/Helpers/ColorColumnHelpers.php | 4 +- .../Traits/Helpers/ColumnHelpers.php | 7 +- .../Traits/Helpers/DateColumnHelpers.php | 17 ++ .../Traits/Helpers/IconColumnHelpers.php | 7 +- .../Traits/Helpers/ImageColumnHelpers.php | 6 + .../Traits/Helpers/LinkColumnHelpers.php | 5 + .../LivewireComponentColumnHelpers.php | 23 ++ .../Traits/Helpers/RelationshipHelpers.php | 2 +- .../Helpers/ViewComponentColumnHelpers.php | 5 +- .../Traits/Helpers/WireLinkColumnHelpers.php | 5 + .../Columns/Traits/IsAggregateColumn.php | 14 ++ .../Traits}/IsCollapsible.php | 2 +- src/Views/Columns/Traits/IsColumn.php | 72 ++++++ .../Traits}/IsSearchable.php | 2 +- .../Traits}/IsSelectable.php | 2 +- .../Columns => Columns/Traits}/IsSortable.php | 2 +- src/Views/Columns/ViewComponentColumn.php | 14 +- src/Views/Columns/WireLinkColumn.php | 6 +- src/Views/Core/Filterpill.php | 21 ++ .../Styling/HandlesFilterLabelAttributes.php | 2 + .../Styling/HandlesFilterPillsAttributes.php | 16 ++ .../ImageColumnConfiguration.php | 5 - .../Configuration/LinkColumnConfiguration.php | 5 - .../WireLinkColumnConfiguration.php | 5 - .../Traits/Helpers/AggregateColumnHelpers.php | 45 ---- .../Traits/Helpers/ArrayColumnHelpers.php | 65 ------ .../Traits/Helpers/DateColumnHelpers.php | 43 ---- .../Traits/Helpers/ImageColumnHelpers.php | 5 - .../Traits/Helpers/LinkColumnHelpers.php | 5 - .../LivewireComponentColumnHelpers.php | 63 ----- .../Traits/Helpers/WireLinkColumnHelpers.php | 5 - src/Views/Traits/IsAggregateColumn.php | 9 +- src/Views/Traits/IsColumn.php | 63 +---- .../FilterPillDataTest.php | 72 +++--- 86 files changed, 918 insertions(+), 566 deletions(-) create mode 100644 resources/views/includes/filter-pill.blade.php create mode 100644 src/DataTransferObjects/Filters/FilterPillDataOld.php create mode 100644 src/View/Components/FilterPill.php create mode 100644 src/Views/Columns/Column.php rename src/Views/{ => Columns}/Traits/Configuration/AggregateColumnConfiguration.php (95%) rename src/Views/{ => Columns}/Traits/Configuration/ArrayColumnConfiguration.php (88%) rename src/Views/{ => Columns}/Traits/Configuration/BooleanColumnConfiguration.php (89%) rename src/Views/{ => Columns}/Traits/Configuration/ButtonGroupColumnConfiguration.php (68%) rename src/Views/{ => Columns}/Traits/Configuration/ColorColumnConfiguration.php (70%) rename src/Views/{ => Columns}/Traits/Configuration/ColumnConfiguration.php (92%) create mode 100644 src/Views/Columns/Traits/Configuration/DateColumnConfiguration.php rename src/Views/{ => Columns}/Traits/Configuration/IconColumnConfiguration.php (70%) create mode 100644 src/Views/Columns/Traits/Configuration/ImageColumnConfiguration.php create mode 100644 src/Views/Columns/Traits/Configuration/LinkColumnConfiguration.php rename src/Views/{ => Columns}/Traits/Configuration/LivewireComponentColumnConfiguration.php (80%) rename src/Views/{ => Columns}/Traits/Configuration/ViewComponentColumnConfiguration.php (73%) create mode 100644 src/Views/Columns/Traits/Configuration/WireLinkColumnConfiguration.php rename src/Views/{Traits/Columns => Columns/Traits}/HasColumnView.php (93%) rename src/Views/{Traits/Columns => Columns/Traits}/HasComponentView.php (90%) rename src/Views/{Traits/Columns => Columns/Traits}/HasDefaultStringValue.php (83%) rename src/Views/{Traits/Core => Columns/Traits}/HasFooter.php (98%) rename src/Views/{Traits/Configuration/DateColumnConfiguration.php => Columns/Traits/HasInputOutputFormat.php} (53%) rename src/Views/{Traits/Core => Columns/Traits}/HasSecondaryHeader.php (97%) rename src/Views/{Traits/Columns => Columns/Traits}/HasSlot.php (92%) rename src/Views/{Traits/Columns => Columns/Traits}/HasVisibility.php (76%) create mode 100644 src/Views/Columns/Traits/Helpers/AggregateColumnHelpers.php create mode 100644 src/Views/Columns/Traits/Helpers/ArrayColumnHelpers.php rename src/Views/{ => Columns}/Traits/Helpers/BooleanColumnHelpers.php (84%) rename src/Views/{ => Columns}/Traits/Helpers/ButtonGroupColumnHelpers.php (79%) rename src/Views/{ => Columns}/Traits/Helpers/ColorColumnHelpers.php (77%) rename src/Views/{ => Columns}/Traits/Helpers/ColumnHelpers.php (97%) create mode 100644 src/Views/Columns/Traits/Helpers/DateColumnHelpers.php rename src/Views/{ => Columns}/Traits/Helpers/IconColumnHelpers.php (71%) create mode 100644 src/Views/Columns/Traits/Helpers/ImageColumnHelpers.php create mode 100644 src/Views/Columns/Traits/Helpers/LinkColumnHelpers.php create mode 100644 src/Views/Columns/Traits/Helpers/LivewireComponentColumnHelpers.php rename src/Views/{ => Columns}/Traits/Helpers/RelationshipHelpers.php (88%) rename src/Views/{ => Columns}/Traits/Helpers/ViewComponentColumnHelpers.php (77%) create mode 100644 src/Views/Columns/Traits/Helpers/WireLinkColumnHelpers.php create mode 100644 src/Views/Columns/Traits/IsAggregateColumn.php rename src/Views/{Traits/Columns => Columns/Traits}/IsCollapsible.php (95%) create mode 100644 src/Views/Columns/Traits/IsColumn.php rename src/Views/{Traits/Columns => Columns/Traits}/IsSearchable.php (90%) rename src/Views/{Traits/Columns => Columns/Traits}/IsSelectable.php (94%) rename src/Views/{Traits/Columns => Columns/Traits}/IsSortable.php (98%) create mode 100644 src/Views/Core/Filterpill.php delete mode 100644 src/Views/Traits/Configuration/ImageColumnConfiguration.php delete mode 100644 src/Views/Traits/Configuration/LinkColumnConfiguration.php delete mode 100644 src/Views/Traits/Configuration/WireLinkColumnConfiguration.php delete mode 100644 src/Views/Traits/Helpers/AggregateColumnHelpers.php delete mode 100644 src/Views/Traits/Helpers/ArrayColumnHelpers.php delete mode 100644 src/Views/Traits/Helpers/DateColumnHelpers.php delete mode 100644 src/Views/Traits/Helpers/ImageColumnHelpers.php delete mode 100644 src/Views/Traits/Helpers/LinkColumnHelpers.php delete mode 100644 src/Views/Traits/Helpers/LivewireComponentColumnHelpers.php delete mode 100644 src/Views/Traits/Helpers/WireLinkColumnHelpers.php diff --git a/resources/js/laravel-livewire-tables.js b/resources/js/laravel-livewire-tables.js index 9641f02ee..408910250 100644 --- a/resources/js/laravel-livewire-tables.js +++ b/resources/js/laravel-livewire-tables.js @@ -44,15 +44,34 @@ document.addEventListener('alpine:init', () => { removeHTMLTags(htmlString) { // Create a new DOMParser instance const parser = new DOMParser(); + var textContent = ''; // Parse the HTML string - let doc = parser.parseFromString(htmlString, 'text/html'); + let doc = parser.parseFromString(htmlString, 'text/html'); + + console.log("docs.body.innerText"); + console.log(doc.body); + + // Extract text content - let textContent = doc.body.innerText || ""; + let textContent = doc.body.firstChild.textContent || ""; // Trim whitespace let trimmedContent = textContent.trim(); return trimmedContent; }, + convertHTML(str) { + let replacements = { + "&": "&", + "<": "<", + ">": ">", + '"': """,//THIS PROBLEM ME NO MORE THANKS TO ieahleen + "'": "'", + "<>": "<>", + } + return str.replace(/(&|<|>|"|'|<>)/gi, function(noe) { + return replacements[noe]; + }); + }, resetSpecificFilter(filterKey) { this.externalFilterPillsVals[filterKey] = []; @@ -833,6 +852,10 @@ document.addEventListener('alpine:init', () => { { joinedValues = this.removeHTMLTags(joinedValues); } + else + { + console.log("SHOULD RENDER AS HTML"); + } if (joinedValues !== null) { @@ -875,16 +898,17 @@ document.addEventListener('alpine:init', () => { if(eventPillItem != "") { + var htmlDecoded = this.convertHTML(eventPillItem); + if(this.isExternalFilter) { let filterPillValues = this.externalFilterPillsVals[this.localFilterKey]; - - filterPillValues.push(eventPillItem); + filterPillValues.push(htmlDecoded); this.updatePillValues(filterPillValues); } else { - this.updatePillValues(eventPillItem); + this.updatePillValues(htmlDecoded); } } } @@ -910,6 +934,7 @@ document.addEventListener('alpine:init', () => { this.isExternalFilter = Boolean(this.localData['isAnExternalLivewireFilter'] ?? 0); this.shouldRenderAsHTML = Boolean(this.localData['renderPillsAsHtml'] ?? 0); this.pillValues = this.localData['pillValues'] ?? null; + this.separatedValues = this.localData['separatedValues'] ?? null; this.$nextTick(() => { if(this.isExternalFilter) diff --git a/resources/js/laravel-livewire-tables.min.js b/resources/js/laravel-livewire-tables.min.js index 5e0980c39..a281f2933 100644 --- a/resources/js/laravel-livewire-tables.min.js +++ b/resources/js/laravel-livewire-tables.min.js @@ -1 +1 @@ -document.addEventListener("alpine:init",()=>{Alpine.data("laravellivewiretable",e=>({tableId:"",showBulkActionsAlpine:!1,primaryKeyName:"",shouldBeDisplayed:e.entangle("shouldBeDisplayed"),tableName:e.entangle("tableName"),dataTableFingerprint:e.entangle("dataTableFingerprint"),listeners:[],childElementOpen:!1,filtersOpen:e.entangle("filterSlideDownDefaultVisible"),paginationCurrentCount:e.entangle("paginationCurrentCount"),paginationTotalItemCount:e.entangle("paginationTotalItemCount"),paginationCurrentItems:e.entangle("paginationCurrentItems"),selectedItems:e.entangle("selected"),selectAllStatus:e.entangle("selectAll"),delaySelectAll:e.entangle("delaySelectAll"),hideBulkActionsWhenEmpty:e.entangle("hideBulkActionsWhenEmpty"),dragging:!1,reorderEnabled:!1,sourceID:"",targetID:"",evenRowClasses:"",oddRowClasses:"",currentlyHighlightedElement:"",evenRowClassArray:{},oddRowClassArray:{},evenNotInOdd:{},oddNotInEven:{},orderedRows:[],defaultReorderColumn:e.entangle("defaultReorderColumn"),reorderStatus:e.entangle("reorderStatus"),currentlyReorderingStatus:e.entangle("currentlyReorderingStatus"),hideReorderColumnUnlessReorderingStatus:e.entangle("hideReorderColumnUnlessReorderingStatus"),reorderDisplayColumn:e.entangle("reorderDisplayColumn"),externalFilterPillsVals:e.entangle("externalFilterPillsValues"),internalFilterPillsVals:e.entangle("internalFilterPillsVals"),showFilterPillLabel:[],filterPillsSeparator:", ",showFilterPillsSection:!0,removeHTMLTags(e){let t=new DOMParser;return(t.parseFromString(e,"text/html").body.innerText||"").trim()},resetSpecificFilter(t){this.externalFilterPillsVals[t]=[],e.call("resetFilter",t)},resetAllFilters(){this.externalFilterPillsVals=[],e.call("setFilterDefaults")},setInternalFilterPillVal(e,t){void 0!==t&&(this.internalFilterPillsVals[e]=t)},syncExternalFilterPillsValues(e,t){this.externalFilterPillsVals[e]=t,this.showFilterPillLabel[e]=this.getFilterPillsLength(e)},getFilterPillsLength(e){return Object.keys(this.externalFilterPillsVals[e]).length??0},showFilterPillsValue(e,t){void 0!==t?this.externalFilterPillsVals[e]=t:this.externalFilterPillsVals[e]=null},setFilterPillsLength(e){let t=0;return void 0!==e?Object.keys(e).length??0:0},showFilterPillsLabel(e){return this.getFilterPillsLength(e),this.getFilterPillsLength(e)>0},getFilterPillImplodedValues(e,t){let l=this.externalFilterPillsVals[e];return"undefined"!==l?l.join(t):""},showFilterPillsSeparator(e,t){return t+1{this.setupEvenOddClasses()}),this.sourceID=e.target.id,e.dataTransfer.effectAllowed="move",e.dataTransfer.setData("text/plain",e.target.id),e.target.classList.add("laravel-livewire-tables-dragging")},dragOverEvent(e){"object"==typeof this.currentlyHighlightedElement&&this.currentlyHighlightedElement.classList.remove("laravel-livewire-tables-highlight-bottom","laravel-livewire-tables-highlight-top");let t=e.target.closest("tr");this.currentlyHighlightedElement=t,e.offsetYt.getBoundingClientRect().height/2?l.insertBefore(i,t.nextSibling):l.insertBefore(i,t),a{this.setupEvenOddClasses()})},cancelReorder(){this.hideReorderColumnUnlessReorderingStatus&&(this.reorderDisplayColumn=!1),e.disableReordering()},updateOrderedItems(){let t=document.getElementById(this.tableId),l=[];for(let i=1,s;s=t.rows[i];i++)l.push({[this.primaryKeyName]:s.getAttribute("rowpk"),[this.defaultReorderColumn]:i});e.storeReorder(l)},setupEvenOddClasses(){if(void 0===this.evenNotInOdd.length||0==this.evenNotInOdd.length||void 0===this.oddNotInEven.length||0==this.oddNotInEven.length){let e=document.getElementById(this.tableId).getElementsByTagName("tbody")[0],t=[],l=[];void 0!==e.rows[0]&&void 0!==e.rows[1]&&(t=Array.from(e.rows[0].classList),l=Array.from(e.rows[1].classList),this.evenNotInOdd=t.filter(e=>!l.includes(e)),this.oddNotInEven=l.filter(e=>!t.includes(e)),t=[],l=[])}},toggleSelectAll(){this.showBulkActionsAlpine&&(this.paginationTotalItemCount===this.selectedItems.length?(this.clearSelected(),this.selectAllStatus=!1):this.delaySelectAll?this.setAllItemsSelected():this.setAllSelected())},setAllItemsSelected(){this.showBulkActionsAlpine&&(this.selectAllStatus=!0,this.selectAllOnPage())},setAllSelected(){this.showBulkActionsAlpine&&(this.delaySelectAll?(this.selectAllStatus=!0,this.selectAllOnPage()):e.setAllSelected())},clearSelected(){this.showBulkActionsAlpine&&(this.selectAllStatus=!1,e.clearSelected())},selectAllOnPage(){if(!this.showBulkActionsAlpine)return;let e=this.selectedItems,t=this.paginationCurrentItems.values();for(let l of t)e.push(l.toString());this.selectedItems=[...new Set(e)]},setTableId(e){this.tableId=e},setAlpineBulkActions(e){this.showBulkActionsAlpine=e},setPrimaryKeyName(e){this.primaryKeyName=e},showTable(e){let t=e.detail.tableName??"",l=e.detail.tableFingerpint??"";((t??"")!=""&&t===this.tableName||""!=l&&eventTableFingerpint===this.dataTableFingerprint)&&(this.shouldBeDisplayed=!0)},hideTable(e){let t=e.detail.tableName??"",l=e.detail.tableFingerpint??"";(""!=t&&t===this.tableName||""!=l&&eventTableFingerpint===this.dataTableFingerprint)&&(this.shouldBeDisplayed=!1)},destroy(){this.listeners.forEach(e=>{e()})}})),Alpine.data("booleanFilter",(e,t,l,i)=>({localListeners:[],switchOn:!1,value:e.entangle("filterComponents."+t).live,init(){this.switchOn=!1,void 0!==this.value&&(this.switchOn=Boolean(Number(this.value))),this.localListeners.push(Livewire.on("filter-was-set",e=>{e.tableName==this.tableName&&e.filterKey==t&&(this.switchOn=e.value??i)}))},destroy(){this.localListeners.forEach(e=>{e()})}})),Alpine.data("newBooleanFilter",(e,t,l)=>({booleanFilterKey:e,switchOn:!1,value:!1,toggleStatus(){let e=!Boolean(Number(this.$wire.get("filterComponents."+this.booleanFilterKey)??this.value));return this.switchOn=this.value=e,Number(e)},toggleStatusWithUpdate(){let e=this.toggleStatus();this.$wire.set("filterComponents."+this.booleanFilterKey,e)},toggleStatusWithReset(){this.toggleStatus(),this.$wire.call("resetFilter",this.booleanFilterKey)},setSwitchOn(e){let t=Number(e??0);this.switchOn=Boolean(t)},init(){this.$nextTick(()=>{this.value=this.$wire.get("filterComponents."+this.booleanFilterKey)??l,this.setSwitchOn(this.value??0)}),this.listeners.push(Livewire.on("filter-was-set",e=>{e.tableName==this.tableName&&e.filterKey==this.booleanFilterKey&&(this.switchOn=e.value??l)}))}})),Alpine.data("booleanFilterLatest",e=>({booleanFilterKey:e.filterKey,booleanFilterDefaultValue:e.defaultValue,switchOn:!1,value:!1,toggleStatus(){let e=!Boolean(Number(this.$wire.get("filterComponents."+this.booleanFilterKey)??this.value));return this.switchOn=this.value=e,Number(e)},toggleStatusWithUpdate(){let e=this.toggleStatus();this.$wire.set("filterComponents."+this.booleanFilterKey,e)},toggleStatusWithReset(){this.toggleStatus(),this.$wire.call("resetFilter",this.booleanFilterKey)},setSwitchOn(e){let t=Number(e??0);this.switchOn=Boolean(t)},init(){this.$nextTick(()=>{this.value=this.$wire.get("filterComponents."+this.booleanFilterKey)??this.booleanFilterDefaultValue,this.setSwitchOn(this.value??0)}),this.listeners.push(Livewire.on("filter-was-set",e=>{e.tableName==this.tableName&&e.filterKey==this.booleanFilterKey&&(this.switchOn=e.value??this.booleanFilterDefaultValue)}))}})),Alpine.data("numberRangeFilter",(e,t,l,i,s)=>({allFilters:e.entangle("filterComponents",!1),originalMin:0,originalMax:100,filterMin:0,filterMax:100,currentMin:0,currentMax:100,hasUpdate:!1,wireValues:e.entangle("filterComponents."+t,!1),defaultMin:i.minRange,defaultMax:i.maxRange,restrictUpdates:!1,initialiseStyles(){let e=document.getElementById(l);e.style.setProperty("--value-a",this.wireValues.min??this.filterMin),e.style.setProperty("--text-value-a",JSON.stringify(this.wireValues.min??this.filterMin)),e.style.setProperty("--value-b",this.wireValues.max??this.filterMax),e.style.setProperty("--text-value-b",JSON.stringify(this.wireValues.max??this.filterMax))},updateStyles(e,t){let i=document.getElementById(l);i.style.setProperty("--value-a",e),i.style.setProperty("--text-value-a",JSON.stringify(e)),i.style.setProperty("--value-b",t),i.style.setProperty("--text-value-b",JSON.stringify(t))},setupWire(){void 0!==this.wireValues?(this.filterMin=this.originalMin=void 0!==this.wireValues.min?this.wireValues.min:this.defaultMin,this.filterMax=this.originalMax=void 0!==this.wireValues.max?this.wireValues.max:this.defaultMax):(this.filterMin=this.originalMin=this.defaultMin,this.filterMax=this.originalMax=this.defaultMax),this.updateStyles(this.filterMin,this.filterMax)},allowUpdates(){this.updateWire()},updateWire(){let e=parseInt(this.filterMin),t=parseInt(this.filterMax);(e!=this.originalMin||t!=this.originalMax)&&(tthis.setupWire())}})),Alpine.data("flatpickrFilter",(e,t,l,i,s)=>({wireValues:e.entangle("filterComponents."+t),flatpickrInstance:flatpickr(i,{mode:"range",altFormat:l.altFormat??"F j, Y",altInput:l.altInput??!1,allowInput:l.allowInput??!1,allowInvalidPreload:l.allowInvalidPreload??!0,ariaDateFormat:l.ariaDateFormat??"F j, Y",clickOpens:!0,dateFormat:l.dateFormat??"Y-m-d",defaultDate:l.defaultDate??null,defaultHour:l.defaultHour??12,defaultMinute:l.defaultMinute??0,enableTime:l.enableTime??!1,enableSeconds:l.enableSeconds??!1,hourIncrement:l.hourIncrement??1,locale:l.locale??"en",minDate:l.earliestDate??null,maxDate:l.latestDate??null,minuteIncrement:l.minuteIncrement??5,shorthandCurrentMonth:l.shorthandCurrentMonth??!1,time_24hr:l.time_24hr??!1,weekNumbers:l.weekNumbers??!1,onOpen:function(){window.childElementOpen=!0},onChange:function(l,i,s){if(l.length>1){var a=i.split(" "),r={};window.childElementOpen=!1,window.filterPopoverOpen=!1,r={minDate:a[0],maxDate:void 0===a[2]?a[0]:a[2]},e.set("filterComponents."+t,r)}}}),changedValue:function(l){l.length<5&&(this.flatpickrInstance.setDate([]),e.set("filterComponents."+t,{}))},setupWire(){if(void 0!==this.wireValues){if(void 0!==this.wireValues.minDate&&void 0!==this.wireValues.maxDate){let e=[this.wireValues.minDate,this.wireValues.maxDate];this.flatpickrInstance.setDate(e)}else this.flatpickrInstance.setDate([])}else this.flatpickrInstance.setDate([])},init(){this.setupWire(),this.$watch("wireValues",e=>this.setupWire())}})),Alpine.data("tableWrapper",(e,t)=>({shouldBeDisplayed:e.entangle("shouldBeDisplayed"),listeners:[],childElementOpen:!1,filtersOpen:e.entangle("filterSlideDownDefaultVisible"),paginationCurrentCount:e.entangle("paginationCurrentCount"),paginationTotalItemCount:e.entangle("paginationTotalItemCount"),paginationCurrentItems:e.entangle("paginationCurrentItems"),selectedItems:e.entangle("selected"),selectAllStatus:e.entangle("selectAll"),delaySelectAll:e.entangle("delaySelectAll"),hideBulkActionsWhenEmpty:e.entangle("hideBulkActionsWhenEmpty"),toggleSelectAll(){t&&(this.paginationTotalItemCount===this.selectedItems.length?(this.clearSelected(),this.selectAllStatus=!1):this.delaySelectAll?this.setAllItemsSelected():this.setAllSelected())},setAllItemsSelected(){t&&(this.selectAllStatus=!0,this.selectAllOnPage())},setAllSelected(){t&&(this.delaySelectAll?(this.selectAllStatus=!0,this.selectAllOnPage()):e.setAllSelected())},clearSelected(){t&&(this.selectAllStatus=!1,e.clearSelected())},selectAllOnPage(){if(!t)return;let e=this.selectedItems,l=this.paginationCurrentItems.values();for(let i of l)e.push(i.toString());this.selectedItems=[...new Set(e)]},destroy(){this.listeners.forEach(e=>{e()})}})),Alpine.data("reorderFunction",(e,t,l)=>({dragging:!1,reorderEnabled:!1,sourceID:"",targetID:"",evenRowClasses:"",oddRowClasses:"",currentlyHighlightedElement:"",evenRowClassArray:{},oddRowClassArray:{},evenNotInOdd:{},oddNotInEven:{},orderedRows:[],defaultReorderColumn:e.get("defaultReorderColumn"),reorderStatus:e.get("reorderStatus"),currentlyReorderingStatus:e.entangle("currentlyReorderingStatus"),hideReorderColumnUnlessReorderingStatus:e.entangle("hideReorderColumnUnlessReorderingStatus"),reorderDisplayColumn:e.entangle("reorderDisplayColumn"),dragStart(e){this.$nextTick(()=>{this.setupEvenOddClasses()}),this.sourceID=e.target.id,e.dataTransfer.effectAllowed="move",e.dataTransfer.setData("text/plain",e.target.id),e.target.classList.add("laravel-livewire-tables-dragging")},dragOverEvent(e){"object"==typeof this.currentlyHighlightedElement&&this.currentlyHighlightedElement.classList.remove("laravel-livewire-tables-highlight-bottom","laravel-livewire-tables-highlight-top");let t=e.target.closest("tr");this.currentlyHighlightedElement=t,e.offsetYl.getBoundingClientRect().height/2?i.insertBefore(s,l.nextSibling):i.insertBefore(s,l),r{this.setupEvenOddClasses()}),this.currentlyReorderingStatus?e.disableReordering():(this.setupEvenOddClasses(),this.hideReorderColumnUnlessReorderingStatus&&(this.reorderDisplayColumn=!0),e.enableReordering())},cancelReorder(){this.hideReorderColumnUnlessReorderingStatus&&(this.reorderDisplayColumn=!1),e.disableReordering()},updateOrderedItems(){let i=document.getElementById(t),s=[];for(let a=1,r;r=i.rows[a];a++)s.push({[l]:r.getAttribute("rowpk"),[this.defaultReorderColumn]:a});e.storeReorder(s)},setupEvenOddClasses(){if(void 0===this.evenNotInOdd.length||0==this.evenNotInOdd.length||void 0===this.oddNotInEven.length||0==this.oddNotInEven.length){let e=document.getElementById(t).getElementsByTagName("tbody")[0],l=[],i=[];void 0!==e.rows[0]&&void 0!==e.rows[1]&&(l=Array.from(e.rows[0].classList),i=Array.from(e.rows[1].classList),this.evenNotInOdd=l.filter(e=>!i.includes(e)),this.oddNotInEven=i.filter(e=>!l.includes(e)),l=[],i=[])}},init(){}})),Alpine.data("filterPillsHandler",e=>({localData:e,localFilterKey:"",localFilterTitle:"",isExternalFilter:!1,shouldRenderAsHTML:!1,shouldWatchPillValues:!1,pillsSeparator:",",pillValues:null,pillHasValues:!1,displayString:"",generateLocalFilterPillImplodedValues(e){if(void 0!==e){var t,l="---tablepillsseparator---",i=RegExp(l,"g");if(t=Array.isArray(e)?e.join(l):e,this.shouldRenderAsHTML||(t=this.removeHTMLTags(t)),null!==t)return t.replace(i,this.pillsSeparator)}return""},clearExternalFilterPill(){this.isExternalFilter&&(this.externalFilterPillsVals[this.localFilterKey]=[],this.displayString=this.generateLocalFilterPillImplodedValues(this.externalFilterPillsVals[this.localFilterKey]),this.updatePillHasValues(),this.resetSpecificFilter(this.localFilterKey))},trigger:{"@filterpillupdate.window"(e){this.watchForUpdateEvent(e)}},checkEventIsValid(e,t){return this.tableName===e&&this.localFilterKey===t},watchForUpdateEvent(e){if(this.checkEventIsValid(e.detail.tableName??"",e.detail.filterKey??"")){let t=e.detail.pillItem??"";if(this.shouldRenderAsHTML||(t=this.removeHTMLTags(t)),""!=t){if(this.isExternalFilter){let l=this.externalFilterPillsVals[this.localFilterKey];l.push(t),this.updatePillValues(l)}else this.updatePillValues(t)}}},updatePillValues(e){return this.pillValues=e,this.displayString=this.generateLocalFilterPillImplodedValues(e),this.updatePillHasValues(),this.displayString},updatePillHasValues(){this.pillHasValues=this.displayString.length>0},init(){this.localFilterKey=this.localData.filterKey??"unknown",this.localFilterTitle=this.localData.filterPillTitle??"Unknown",this.pillsSeparator=this.localData.separator??",",this.shouldWatchPillValues=Boolean(this.localData.watchForEvents??0),this.isExternalFilter=Boolean(this.localData.isAnExternalLivewireFilter??0),this.shouldRenderAsHTML=Boolean(this.localData.renderPillsAsHtml??0),this.pillValues=this.localData.pillValues??null,this.$nextTick(()=>{this.isExternalFilter?this.updatePillValues(this.externalFilterPillsVals[this.localFilterKey]):this.updatePillValues(this.pillValues)}),this.isExternalFilter&&this.shouldWatchPillValues&&this.$watch("externalFilterPillsVals."+this.localFilterKey,e=>{this.updatePillValues(e)})}})),Alpine.data("tablesExternalFilter",(e,t)=>({externalFilterKey:t,pillValues:[],optionsAvailable:e.entangle("optionsAvailable"),optionsSelected:e.entangle("optionsSelected").live,selectedItems:e.entangle("selectedItems"),sendValueToPill(e){let t=this.removeHTMLTags(e);this.$dispatch("filterpillupdate",{tableName:this.tableName,filterKey:this.externalFilterKey,pillItem:t})},overridePill(e){let t=this.removeHTMLTags(e);this.$dispatch("filterpillupdate",{tableName:this.tableName,filterKey:this.externalFilterKey,pillItem:t})},syncItems(t){this.pillValues=[],t.forEach(e=>{this.pillValues.push(this.optionsAvailable[e])}),this.pillValues.length>0&&(this.pillValues.sort(),this.syncExternalFilterPillsValues(this.externalFilterKey,this.pillValues)),this.optionsSelected=this.selectedItems,e.set("value",this.selectedItems)},init(){this.selectedItems=this.optionsSelected,this.syncItems(this.selectedItems),this.$watch("selectedItems",e=>this.syncItems(e))}}))}); \ No newline at end of file +document.addEventListener("alpine:init",()=>{Alpine.data("laravellivewiretable",e=>({tableId:"",showBulkActionsAlpine:!1,primaryKeyName:"",shouldBeDisplayed:e.entangle("shouldBeDisplayed"),tableName:e.entangle("tableName"),dataTableFingerprint:e.entangle("dataTableFingerprint"),listeners:[],childElementOpen:!1,filtersOpen:e.entangle("filterSlideDownDefaultVisible"),paginationCurrentCount:e.entangle("paginationCurrentCount"),paginationTotalItemCount:e.entangle("paginationTotalItemCount"),paginationCurrentItems:e.entangle("paginationCurrentItems"),selectedItems:e.entangle("selected"),selectAllStatus:e.entangle("selectAll"),delaySelectAll:e.entangle("delaySelectAll"),hideBulkActionsWhenEmpty:e.entangle("hideBulkActionsWhenEmpty"),dragging:!1,reorderEnabled:!1,sourceID:"",targetID:"",evenRowClasses:"",oddRowClasses:"",currentlyHighlightedElement:"",evenRowClassArray:{},oddRowClassArray:{},evenNotInOdd:{},oddNotInEven:{},orderedRows:[],defaultReorderColumn:e.entangle("defaultReorderColumn"),reorderStatus:e.entangle("reorderStatus"),currentlyReorderingStatus:e.entangle("currentlyReorderingStatus"),hideReorderColumnUnlessReorderingStatus:e.entangle("hideReorderColumnUnlessReorderingStatus"),reorderDisplayColumn:e.entangle("reorderDisplayColumn"),externalFilterPillsVals:e.entangle("externalFilterPillsValues"),internalFilterPillsVals:e.entangle("internalFilterPillsVals"),showFilterPillLabel:[],filterPillsSeparator:", ",showFilterPillsSection:!0,removeHTMLTags(e){let t=new DOMParser;var l="";let i=t.parseFromString(e,"text/html");console.log("docs.body.innerText"),console.log(i.body);let l=i.body.firstChild.textContent||"";return l.trim()},convertHTML(e){let t={"&":"&","<":"<",">":">",'"':""","'":"'","<>":"<>"};return e.replace(/(&|<|>|"|'|<>)/gi,function(e){return t[e]})},resetSpecificFilter(t){this.externalFilterPillsVals[t]=[],e.call("resetFilter",t)},resetAllFilters(){this.externalFilterPillsVals=[],e.call("setFilterDefaults")},setInternalFilterPillVal(e,t){void 0!==t&&(this.internalFilterPillsVals[e]=t)},syncExternalFilterPillsValues(e,t){this.externalFilterPillsVals[e]=t,this.showFilterPillLabel[e]=this.getFilterPillsLength(e)},getFilterPillsLength(e){return Object.keys(this.externalFilterPillsVals[e]).length??0},showFilterPillsValue(e,t){void 0!==t?this.externalFilterPillsVals[e]=t:this.externalFilterPillsVals[e]=null},setFilterPillsLength(e){let t=0;return void 0!==e?Object.keys(e).length??0:0},showFilterPillsLabel(e){return this.getFilterPillsLength(e),this.getFilterPillsLength(e)>0},getFilterPillImplodedValues(e,t){let l=this.externalFilterPillsVals[e];return"undefined"!==l?l.join(t):""},showFilterPillsSeparator(e,t){return t+1{this.setupEvenOddClasses()}),this.sourceID=e.target.id,e.dataTransfer.effectAllowed="move",e.dataTransfer.setData("text/plain",e.target.id),e.target.classList.add("laravel-livewire-tables-dragging")},dragOverEvent(e){"object"==typeof this.currentlyHighlightedElement&&this.currentlyHighlightedElement.classList.remove("laravel-livewire-tables-highlight-bottom","laravel-livewire-tables-highlight-top");let t=e.target.closest("tr");this.currentlyHighlightedElement=t,e.offsetYt.getBoundingClientRect().height/2?l.insertBefore(i,t.nextSibling):l.insertBefore(i,t),a{this.setupEvenOddClasses()})},cancelReorder(){this.hideReorderColumnUnlessReorderingStatus&&(this.reorderDisplayColumn=!1),e.disableReordering()},updateOrderedItems(){let t=document.getElementById(this.tableId),l=[];for(let i=1,s;s=t.rows[i];i++)l.push({[this.primaryKeyName]:s.getAttribute("rowpk"),[this.defaultReorderColumn]:i});e.storeReorder(l)},setupEvenOddClasses(){if(void 0===this.evenNotInOdd.length||0==this.evenNotInOdd.length||void 0===this.oddNotInEven.length||0==this.oddNotInEven.length){let e=document.getElementById(this.tableId).getElementsByTagName("tbody")[0],t=[],l=[];void 0!==e.rows[0]&&void 0!==e.rows[1]&&(t=Array.from(e.rows[0].classList),l=Array.from(e.rows[1].classList),this.evenNotInOdd=t.filter(e=>!l.includes(e)),this.oddNotInEven=l.filter(e=>!t.includes(e)),t=[],l=[])}},toggleSelectAll(){this.showBulkActionsAlpine&&(this.paginationTotalItemCount===this.selectedItems.length?(this.clearSelected(),this.selectAllStatus=!1):this.delaySelectAll?this.setAllItemsSelected():this.setAllSelected())},setAllItemsSelected(){this.showBulkActionsAlpine&&(this.selectAllStatus=!0,this.selectAllOnPage())},setAllSelected(){this.showBulkActionsAlpine&&(this.delaySelectAll?(this.selectAllStatus=!0,this.selectAllOnPage()):e.setAllSelected())},clearSelected(){this.showBulkActionsAlpine&&(this.selectAllStatus=!1,e.clearSelected())},selectAllOnPage(){if(!this.showBulkActionsAlpine)return;let e=this.selectedItems,t=this.paginationCurrentItems.values();for(let l of t)e.push(l.toString());this.selectedItems=[...new Set(e)]},setTableId(e){this.tableId=e},setAlpineBulkActions(e){this.showBulkActionsAlpine=e},setPrimaryKeyName(e){this.primaryKeyName=e},showTable(e){let t=e.detail.tableName??"",l=e.detail.tableFingerpint??"";((t??"")!=""&&t===this.tableName||""!=l&&eventTableFingerpint===this.dataTableFingerprint)&&(this.shouldBeDisplayed=!0)},hideTable(e){let t=e.detail.tableName??"",l=e.detail.tableFingerpint??"";(""!=t&&t===this.tableName||""!=l&&eventTableFingerpint===this.dataTableFingerprint)&&(this.shouldBeDisplayed=!1)},destroy(){this.listeners.forEach(e=>{e()})}})),Alpine.data("booleanFilter",(e,t,l,i)=>({localListeners:[],switchOn:!1,value:e.entangle("filterComponents."+t).live,init(){this.switchOn=!1,void 0!==this.value&&(this.switchOn=Boolean(Number(this.value))),this.localListeners.push(Livewire.on("filter-was-set",e=>{e.tableName==this.tableName&&e.filterKey==t&&(this.switchOn=e.value??i)}))},destroy(){this.localListeners.forEach(e=>{e()})}})),Alpine.data("newBooleanFilter",(e,t,l)=>({booleanFilterKey:e,switchOn:!1,value:!1,toggleStatus(){let e=!Boolean(Number(this.$wire.get("filterComponents."+this.booleanFilterKey)??this.value));return this.switchOn=this.value=e,Number(e)},toggleStatusWithUpdate(){let e=this.toggleStatus();this.$wire.set("filterComponents."+this.booleanFilterKey,e)},toggleStatusWithReset(){this.toggleStatus(),this.$wire.call("resetFilter",this.booleanFilterKey)},setSwitchOn(e){let t=Number(e??0);this.switchOn=Boolean(t)},init(){this.$nextTick(()=>{this.value=this.$wire.get("filterComponents."+this.booleanFilterKey)??l,this.setSwitchOn(this.value??0)}),this.listeners.push(Livewire.on("filter-was-set",e=>{e.tableName==this.tableName&&e.filterKey==this.booleanFilterKey&&(this.switchOn=e.value??l)}))}})),Alpine.data("booleanFilterLatest",e=>({booleanFilterKey:e.filterKey,booleanFilterDefaultValue:e.defaultValue,switchOn:!1,value:!1,toggleStatus(){let e=!Boolean(Number(this.$wire.get("filterComponents."+this.booleanFilterKey)??this.value));return this.switchOn=this.value=e,Number(e)},toggleStatusWithUpdate(){let e=this.toggleStatus();this.$wire.set("filterComponents."+this.booleanFilterKey,e)},toggleStatusWithReset(){this.toggleStatus(),this.$wire.call("resetFilter",this.booleanFilterKey)},setSwitchOn(e){let t=Number(e??0);this.switchOn=Boolean(t)},init(){this.$nextTick(()=>{this.value=this.$wire.get("filterComponents."+this.booleanFilterKey)??this.booleanFilterDefaultValue,this.setSwitchOn(this.value??0)}),this.listeners.push(Livewire.on("filter-was-set",e=>{e.tableName==this.tableName&&e.filterKey==this.booleanFilterKey&&(this.switchOn=e.value??this.booleanFilterDefaultValue)}))}})),Alpine.data("numberRangeFilter",(e,t,l,i,s)=>({allFilters:e.entangle("filterComponents",!1),originalMin:0,originalMax:100,filterMin:0,filterMax:100,currentMin:0,currentMax:100,hasUpdate:!1,wireValues:e.entangle("filterComponents."+t,!1),defaultMin:i.minRange,defaultMax:i.maxRange,restrictUpdates:!1,initialiseStyles(){let e=document.getElementById(l);e.style.setProperty("--value-a",this.wireValues.min??this.filterMin),e.style.setProperty("--text-value-a",JSON.stringify(this.wireValues.min??this.filterMin)),e.style.setProperty("--value-b",this.wireValues.max??this.filterMax),e.style.setProperty("--text-value-b",JSON.stringify(this.wireValues.max??this.filterMax))},updateStyles(e,t){let i=document.getElementById(l);i.style.setProperty("--value-a",e),i.style.setProperty("--text-value-a",JSON.stringify(e)),i.style.setProperty("--value-b",t),i.style.setProperty("--text-value-b",JSON.stringify(t))},setupWire(){void 0!==this.wireValues?(this.filterMin=this.originalMin=void 0!==this.wireValues.min?this.wireValues.min:this.defaultMin,this.filterMax=this.originalMax=void 0!==this.wireValues.max?this.wireValues.max:this.defaultMax):(this.filterMin=this.originalMin=this.defaultMin,this.filterMax=this.originalMax=this.defaultMax),this.updateStyles(this.filterMin,this.filterMax)},allowUpdates(){this.updateWire()},updateWire(){let e=parseInt(this.filterMin),t=parseInt(this.filterMax);(e!=this.originalMin||t!=this.originalMax)&&(tthis.setupWire())}})),Alpine.data("flatpickrFilter",(e,t,l,i,s)=>({wireValues:e.entangle("filterComponents."+t),flatpickrInstance:flatpickr(i,{mode:"range",altFormat:l.altFormat??"F j, Y",altInput:l.altInput??!1,allowInput:l.allowInput??!1,allowInvalidPreload:l.allowInvalidPreload??!0,ariaDateFormat:l.ariaDateFormat??"F j, Y",clickOpens:!0,dateFormat:l.dateFormat??"Y-m-d",defaultDate:l.defaultDate??null,defaultHour:l.defaultHour??12,defaultMinute:l.defaultMinute??0,enableTime:l.enableTime??!1,enableSeconds:l.enableSeconds??!1,hourIncrement:l.hourIncrement??1,locale:l.locale??"en",minDate:l.earliestDate??null,maxDate:l.latestDate??null,minuteIncrement:l.minuteIncrement??5,shorthandCurrentMonth:l.shorthandCurrentMonth??!1,time_24hr:l.time_24hr??!1,weekNumbers:l.weekNumbers??!1,onOpen:function(){window.childElementOpen=!0},onChange:function(l,i,s){if(l.length>1){var a=i.split(" "),r={};window.childElementOpen=!1,window.filterPopoverOpen=!1,r={minDate:a[0],maxDate:void 0===a[2]?a[0]:a[2]},e.set("filterComponents."+t,r)}}}),changedValue:function(l){l.length<5&&(this.flatpickrInstance.setDate([]),e.set("filterComponents."+t,{}))},setupWire(){if(void 0!==this.wireValues){if(void 0!==this.wireValues.minDate&&void 0!==this.wireValues.maxDate){let e=[this.wireValues.minDate,this.wireValues.maxDate];this.flatpickrInstance.setDate(e)}else this.flatpickrInstance.setDate([])}else this.flatpickrInstance.setDate([])},init(){this.setupWire(),this.$watch("wireValues",e=>this.setupWire())}})),Alpine.data("tableWrapper",(e,t)=>({shouldBeDisplayed:e.entangle("shouldBeDisplayed"),listeners:[],childElementOpen:!1,filtersOpen:e.entangle("filterSlideDownDefaultVisible"),paginationCurrentCount:e.entangle("paginationCurrentCount"),paginationTotalItemCount:e.entangle("paginationTotalItemCount"),paginationCurrentItems:e.entangle("paginationCurrentItems"),selectedItems:e.entangle("selected"),selectAllStatus:e.entangle("selectAll"),delaySelectAll:e.entangle("delaySelectAll"),hideBulkActionsWhenEmpty:e.entangle("hideBulkActionsWhenEmpty"),toggleSelectAll(){t&&(this.paginationTotalItemCount===this.selectedItems.length?(this.clearSelected(),this.selectAllStatus=!1):this.delaySelectAll?this.setAllItemsSelected():this.setAllSelected())},setAllItemsSelected(){t&&(this.selectAllStatus=!0,this.selectAllOnPage())},setAllSelected(){t&&(this.delaySelectAll?(this.selectAllStatus=!0,this.selectAllOnPage()):e.setAllSelected())},clearSelected(){t&&(this.selectAllStatus=!1,e.clearSelected())},selectAllOnPage(){if(!t)return;let e=this.selectedItems,l=this.paginationCurrentItems.values();for(let i of l)e.push(i.toString());this.selectedItems=[...new Set(e)]},destroy(){this.listeners.forEach(e=>{e()})}})),Alpine.data("reorderFunction",(e,t,l)=>({dragging:!1,reorderEnabled:!1,sourceID:"",targetID:"",evenRowClasses:"",oddRowClasses:"",currentlyHighlightedElement:"",evenRowClassArray:{},oddRowClassArray:{},evenNotInOdd:{},oddNotInEven:{},orderedRows:[],defaultReorderColumn:e.get("defaultReorderColumn"),reorderStatus:e.get("reorderStatus"),currentlyReorderingStatus:e.entangle("currentlyReorderingStatus"),hideReorderColumnUnlessReorderingStatus:e.entangle("hideReorderColumnUnlessReorderingStatus"),reorderDisplayColumn:e.entangle("reorderDisplayColumn"),dragStart(e){this.$nextTick(()=>{this.setupEvenOddClasses()}),this.sourceID=e.target.id,e.dataTransfer.effectAllowed="move",e.dataTransfer.setData("text/plain",e.target.id),e.target.classList.add("laravel-livewire-tables-dragging")},dragOverEvent(e){"object"==typeof this.currentlyHighlightedElement&&this.currentlyHighlightedElement.classList.remove("laravel-livewire-tables-highlight-bottom","laravel-livewire-tables-highlight-top");let t=e.target.closest("tr");this.currentlyHighlightedElement=t,e.offsetYl.getBoundingClientRect().height/2?i.insertBefore(s,l.nextSibling):i.insertBefore(s,l),r{this.setupEvenOddClasses()}),this.currentlyReorderingStatus?e.disableReordering():(this.setupEvenOddClasses(),this.hideReorderColumnUnlessReorderingStatus&&(this.reorderDisplayColumn=!0),e.enableReordering())},cancelReorder(){this.hideReorderColumnUnlessReorderingStatus&&(this.reorderDisplayColumn=!1),e.disableReordering()},updateOrderedItems(){let i=document.getElementById(t),s=[];for(let a=1,r;r=i.rows[a];a++)s.push({[l]:r.getAttribute("rowpk"),[this.defaultReorderColumn]:a});e.storeReorder(s)},setupEvenOddClasses(){if(void 0===this.evenNotInOdd.length||0==this.evenNotInOdd.length||void 0===this.oddNotInEven.length||0==this.oddNotInEven.length){let e=document.getElementById(t).getElementsByTagName("tbody")[0],l=[],i=[];void 0!==e.rows[0]&&void 0!==e.rows[1]&&(l=Array.from(e.rows[0].classList),i=Array.from(e.rows[1].classList),this.evenNotInOdd=l.filter(e=>!i.includes(e)),this.oddNotInEven=i.filter(e=>!l.includes(e)),l=[],i=[])}},init(){}})),Alpine.data("filterPillsHandler",e=>({localData:e,localFilterKey:"",localFilterTitle:"",isExternalFilter:!1,shouldRenderAsHTML:!1,shouldWatchPillValues:!1,pillsSeparator:",",pillValues:null,pillHasValues:!1,displayString:"",generateLocalFilterPillImplodedValues(e){if(void 0!==e){var t,l="---tablepillsseparator---",i=RegExp(l,"g");if(t=Array.isArray(e)?e.join(l):e,this.shouldRenderAsHTML?console.log("SHOULD RENDER AS HTML"):t=this.removeHTMLTags(t),null!==t)return t.replace(i,this.pillsSeparator)}return""},clearExternalFilterPill(){this.isExternalFilter&&(this.externalFilterPillsVals[this.localFilterKey]=[],this.displayString=this.generateLocalFilterPillImplodedValues(this.externalFilterPillsVals[this.localFilterKey]),this.updatePillHasValues(),this.resetSpecificFilter(this.localFilterKey))},trigger:{"@filterpillupdate.window"(e){this.watchForUpdateEvent(e)}},checkEventIsValid(e,t){return this.tableName===e&&this.localFilterKey===t},watchForUpdateEvent(e){if(this.checkEventIsValid(e.detail.tableName??"",e.detail.filterKey??"")){let t=e.detail.pillItem??"";if(this.shouldRenderAsHTML||(t=this.removeHTMLTags(t)),""!=t){var l=this.convertHTML(t);if(this.isExternalFilter){let i=this.externalFilterPillsVals[this.localFilterKey];i.push(l),this.updatePillValues(i)}else this.updatePillValues(l)}}},updatePillValues(e){return this.pillValues=e,this.displayString=this.generateLocalFilterPillImplodedValues(e),this.updatePillHasValues(),this.displayString},updatePillHasValues(){this.pillHasValues=this.displayString.length>0},init(){this.localFilterKey=this.localData.filterKey??"unknown",this.localFilterTitle=this.localData.filterPillTitle??"Unknown",this.pillsSeparator=this.localData.separator??",",this.shouldWatchPillValues=Boolean(this.localData.watchForEvents??0),this.isExternalFilter=Boolean(this.localData.isAnExternalLivewireFilter??0),this.shouldRenderAsHTML=Boolean(this.localData.renderPillsAsHtml??0),this.pillValues=this.localData.pillValues??null,this.separatedValues=this.localData.separatedValues??null,this.$nextTick(()=>{this.isExternalFilter?this.updatePillValues(this.externalFilterPillsVals[this.localFilterKey]):this.updatePillValues(this.pillValues)}),this.isExternalFilter&&this.shouldWatchPillValues&&this.$watch("externalFilterPillsVals."+this.localFilterKey,e=>{this.updatePillValues(e)})}})),Alpine.data("tablesExternalFilter",(e,t)=>({externalFilterKey:t,pillValues:[],optionsAvailable:e.entangle("optionsAvailable"),optionsSelected:e.entangle("optionsSelected").live,selectedItems:e.entangle("selectedItems"),sendValueToPill(e){let t=this.removeHTMLTags(e);this.$dispatch("filterpillupdate",{tableName:this.tableName,filterKey:this.externalFilterKey,pillItem:t})},overridePill(e){let t=this.removeHTMLTags(e);this.$dispatch("filterpillupdate",{tableName:this.tableName,filterKey:this.externalFilterKey,pillItem:t})},syncItems(t){this.pillValues=[],t.forEach(e=>{this.pillValues.push(this.optionsAvailable[e])}),this.pillValues.length>0&&(this.pillValues.sort(),this.syncExternalFilterPillsValues(this.externalFilterKey,this.pillValues)),this.optionsSelected=this.selectedItems,e.set("value",this.selectedItems)},init(){this.selectedItems=this.optionsSelected,this.syncItems(this.selectedItems),this.$watch("selectedItems",e=>this.syncItems(e))}}))}); \ No newline at end of file diff --git a/resources/views/components/tools/filter-pills.blade.php b/resources/views/components/tools/filter-pills.blade.php index 7e2f1edd6..d046e891c 100644 --- a/resources/views/components/tools/filter-pills.blade.php +++ b/resources/views/components/tools/filter-pills.blade.php @@ -22,7 +22,7 @@ @if ($filterPillData->hasCustomPillBlade) @include($filterPillData->getCustomPillBlade(), ['filter' => $this->getFilterByKey($filterKey), 'filterPillData' => $filterPillData]) @else - + @endif @endtableloop diff --git a/resources/views/components/tools/filter-pills/buttons/reset-filter.blade.php b/resources/views/components/tools/filter-pills/buttons/reset-filter.blade.php index 68b9a3691..f40566cf0 100644 --- a/resources/views/components/tools/filter-pills/buttons/reset-filter.blade.php +++ b/resources/views/components/tools/filter-pills/buttons/reset-filter.blade.php @@ -1,11 +1,5 @@ @aware(['tableName','isTailwind','isBootstrap','isBootstrap4','isBootstrap5', 'localisationPath']) -@props(['filterKey', 'filterPillData']) - -@php - - $filterButtonAttributes = $filterPillData->getCalculatedCustomResetButtonAttributes($filterKey,$this->getFilterPillsResetFilterButtonAttributes); - -@endphp +@props(['filterKey', 'filterPillData', 'filterButtonAttributes' => $filterPillData->getCalculatedCustomResetButtonAttributes($filterKey,$this->getFilterPillsResetFilterButtonAttributes)]) @if ($isTailwind)