diff --git a/CHANGELOG.md b/CHANGELOG.md index b30c7d9f6..d05f04683 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ All notable changes to `laravel-livewire-tables` will be documented in this file +## PREVIEW +### Tweaks +- Tidying PHPDocs by @lrljoe in https://github.com/rappasoft/laravel-livewire-tables/pull/2246 + ## [v3.7.1] - 2025-02-28 ### Bug Fixes - Ensure that LinkColumn is included in query if "from" is defined diff --git a/phpstan.neon b/phpstan.neon index 30182f587..096099854 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -27,10 +27,6 @@ parameters: - src/Traits/Helpers/QueryHelpers.php - src/Views/Columns/Traits/HasSlot.php - src/Views/Columns/Traits/Helpers/ArrayColumnHelpers.php - - identifier: instanceof.alwaysTrue - paths: - - src/Views/Columns/Traits/HasFooter.php - - src/Views/Columns/Traits/HasSecondaryHeader.php - identifier: function.alreadyNarrowedType paths: - src/Views/Columns/Traits/Helpers/ArrayColumnHelpers.php @@ -41,3 +37,6 @@ parameters: - src/Views/Filters/Traits/HasOptions.php - src/Views/Traits/Core/HasTheme.php - src/Views/Traits/Core/HasView.php + - identifier: unset.possiblyHookedProperty + paths: + - src/Traits/Configuration/CollapsingColumnConfiguration.php diff --git a/src/DataTransferObjects/DebuggableData.php b/src/DataTransferObjects/DebuggableData.php index 8315d48d4..919bd2274 100644 --- a/src/DataTransferObjects/DebuggableData.php +++ b/src/DataTransferObjects/DebuggableData.php @@ -6,13 +6,13 @@ class DebuggableData { - public DataTableComponent $component; - - public function __construct(DataTableComponent $component) - { - $this->component = $component; - } + public function __construct(public DataTableComponent $component) {} + /** + * Returns data to an array + * + * @return array + */ public function toArray(): array { return [ diff --git a/src/DataTransferObjects/FilterGenericData.php b/src/DataTransferObjects/FilterGenericData.php index 0ea4f3f86..299b616bb 100644 --- a/src/DataTransferObjects/FilterGenericData.php +++ b/src/DataTransferObjects/FilterGenericData.php @@ -4,25 +4,13 @@ class FilterGenericData { - public string $tableName; - - public string $filterLayout; - - public bool $isTailwind = false; - - public bool $isBootstrap4 = false; - - public bool $isBootstrap5 = false; - - public function __construct(string $tableName, string $filterLayout, bool $isTailwind = false, bool $isBootstrap4 = false, bool $isBootstrap5 = false) - { - $this->tableName = $tableName; - $this->filterLayout = $filterLayout; - $this->isTailwind = $isTailwind; - $this->isBootstrap4 = $isBootstrap4; - $this->isBootstrap5 = $isBootstrap5; - } + public function __construct(public string $tableName, public string $filterLayout, public bool $isTailwind = false, public bool $isBootstrap4 = false, public bool $isBootstrap5 = false) {} + /** + * Convert To Array + * + * @return array + */ public function toArray(): array { return [ diff --git a/src/DataTransferObjects/Filters/FilterPillData.php b/src/DataTransferObjects/Filters/FilterPillData.php index 8ecc241a7..fd4f761c1 100644 --- a/src/DataTransferObjects/Filters/FilterPillData.php +++ b/src/DataTransferObjects/Filters/FilterPillData.php @@ -31,61 +31,109 @@ public static function make(string $filterKey, string $filterPillTitle, string|a return new self($filterKey, $filterPillTitle, $filterPillValue, $separator, $isAnExternalLivewireFilter, $hasCustomPillBlade, $customPillBlade, $filterPillsItemAttributes, $renderPillsAsHtml, $watchForEvents, $customResetButtonAttributes, $renderPillsTitleAsHtml); } + /** + * Get the Filter Key + */ + public function getFilterKey(): string + { + return $this->filterKey; + } + + /** + * Get the title for the Filter Pill + */ public function getTitle(): string { return $this->filterPillTitle; } + /** + * Get The Filter Pill Value + * + * @return array|string|null + */ public function getPillValue(): array|string|null { return $this->filterPillValue; } + /** + * Determing if there is a Custom Pill blade set + */ public function getHasCustomPillBlade(): bool { - return $this->hasCustomPillBlade ?? false; + return $this->hasCustomPillBlade; } + /** + * Get The Custom Pill Blade (if set) + */ public function getCustomPillBlade(): ?string { return $this->customPillBlade; } + /** + * Get Custom Reset Button Attributes + * + * @return array + */ public function getCustomResetButtonAttributes(): array { - return $this->customResetButtonAttributes ?? []; + return $this->customResetButtonAttributes; } + /** + * Determine of this is an External Livewire Filter + */ public function getIsAnExternalLivewireFilter(): int { - return intval($this->isAnExternalLivewireFilter ?? 0); + return intval($this->isAnExternalLivewireFilter); } + /** + * Get the Separator for Pill Values + */ public function getSeparator(): string { - return $this->separator ?? ', '; + return $this->separator; } + /** + * Determine if Pills should render as HTML + */ public function shouldUsePillsAsHtml(): int { - return intval($this->renderPillsAsHtml ?? 0); + return intval($this->renderPillsAsHtml); } + /** + * Determine if Pill Title should render as HTML + */ public function shouldUsePillsTitleAsHtml(): int { - return intval($this->renderPillsTitleAsHtml ?? 0); + return intval($this->renderPillsTitleAsHtml); } + /** + * Determine if Should watch for Events (i.e. is an External Filter) + */ public function shouldWatchForEvents(): int { - return intval($this->watchForEvents ?? 0); + return intval($this->watchForEvents); } + /** + * Determine if Pill Value is an Array + */ public function isPillValueAnArray(): bool { return ! is_null($this->filterPillValue) && is_array($this->filterPillValue); } + /** + * Return the separator separated value for the pill + */ public function getSeparatedPillValue(): ?string { if ($this->isPillValueAnArray()) { @@ -95,6 +143,9 @@ public function getSeparatedPillValue(): ?string } } + /** + * Return the safe, separator separated value for the pill + */ public function getSafeSeparatedPillValue(): ?string { $string = $this->getSeparatedPillValue(); @@ -103,11 +154,21 @@ public function getSafeSeparatedPillValue(): ?string } + /** + * Get the attributes for the Filter Pills Item + * + * @return array + */ public function getFilterPillsItemAttributes(): array { return array_merge(['default' => true, 'default-colors' => true, 'default-styling' => true, 'default-text' => true], $this->filterPillsItemAttributes); } + /** + * Get the Display Data for the Filter Pills + * + * @return array + */ public function getFilterPillDisplayDataArray(): array { $array = []; @@ -118,6 +179,12 @@ public function getFilterPillDisplayDataArray(): array return $this->getInternalFilterPillDisplayDataArray($array); } + /** + * Get the Display Data for the Filter Pills + * + * @param array $array + * @return array + */ public function getExternalFilterPillDisplayDataArray(array $array = []): array { $array[$this->shouldUsePillsAsHtml() ? 'x-html' : 'x-text'] = 'displayString'; @@ -125,6 +192,12 @@ public function getExternalFilterPillDisplayDataArray(array $array = []): array return $array; } + /** + * Get the Display Data for the Filter Pills + * + * @param array $array + * @return array + */ public function getInternalFilterPillDisplayDataArray(array $array = []): array { @@ -135,6 +208,12 @@ public function getInternalFilterPillDisplayDataArray(array $array = []): array return $array; } + /** + * Get the Display Data for the Filter Pills Title + * + * @param array $array + * @return array + */ public function getFilterTitleDisplayDataArray(array $array = []): array { $array[$this->shouldUsePillsTitleAsHtml() ? 'x-html' : 'x-text'] = 'localFilterTitle'; @@ -142,6 +221,11 @@ public function getFilterTitleDisplayDataArray(array $array = []): array return $array; } + /** + * Get the initial setup data + * + * @return array + */ public function getPillSetupData(string $filterKey = '', bool $shouldWatch = false): array { $array = array_merge(['filterKey' => $filterKey, 'watchForEvents' => $shouldWatch], $this->toArray()); @@ -149,6 +233,12 @@ public function getPillSetupData(string $filterKey = '', bool $shouldWatch = fal return $array; } + /** + * Calculate Any Reset Button Attributes + * + * @param array $filterPillsResetFilterButtonAttributes + * @return array + */ public function getCalculatedCustomResetButtonAttributes(string $filterKey, array $filterPillsResetFilterButtonAttributes): array { return array_merge( @@ -165,10 +255,15 @@ public function getCalculatedCustomResetButtonAttributes(string $filterKey, arra ); } + /** + * Returns the data to an array + * + * @return array + */ public function toArray(): array { return [ - 'filterKey' => $this->filterKey, + 'filterKey' => $this->getFilterKey(), 'filterPillTitle' => $this->getTitle(), 'filterPillValue' => $this->getPillValue(), 'isAnExternalLivewireFilter' => $this->getIsAnExternalLivewireFilter(), diff --git a/src/DataTransferObjects/Filters/StandardFilterPillData.php b/src/DataTransferObjects/Filters/StandardFilterPillData.php index 60a8ff5f9..87ac67d08 100644 --- a/src/DataTransferObjects/Filters/StandardFilterPillData.php +++ b/src/DataTransferObjects/Filters/StandardFilterPillData.php @@ -11,26 +11,43 @@ public static function make(string $filterPillTitle, string $filterSelectName, s return new self($filterPillTitle, $filterSelectName, $filterPillValue, $renderPillsAsHtml); } + /** + * Get the Pill Title + */ public function getTitle(): string { return $this->filterPillTitle; } + /** + * Get the Filter Select Name + */ public function getSelectName(): string { return $this->filterSelectName; } + /** + * Get The Pill Value + */ public function getPillValue(): string { return $this->filterPillValue; } + /** + * Should Use Pills as HTML + */ public function shouldUsePillsAsHtml(): bool { - return $this->renderPillsAsHtml ?? false; + return $this->renderPillsAsHtml; } + /** + * Returns the data to an array + * + * @return array + */ public function toArray(): array { return [ diff --git a/src/Views/Columns/Traits/HasFooter.php b/src/Views/Columns/Traits/HasFooter.php index f9505e68a..d85f4c176 100644 --- a/src/Views/Columns/Traits/HasFooter.php +++ b/src/Views/Columns/Traits/HasFooter.php @@ -53,11 +53,19 @@ public function getFooterCallback() public function footerCallbackIsString(): bool { + if (! $this->hasFooterCallback()) { + return false; + } + return is_string($this->getFooterCallback()); } public function footerCallbackIsFilter(): bool { + if (! $this->hasFooterCallback()) { + return false; + } + $callback = $this->getFooterCallback(); return $callback instanceof Filter; @@ -66,9 +74,10 @@ public function footerCallbackIsFilter(): bool public function getFooterContents(mixed $rows, array $filterGenericData): \Illuminate\Contracts\Foundation\Application|\Illuminate\View\Factory|\Illuminate\View\View|string|HtmlString { $value = null; - $callback = $this->getFooterCallback(); - if ($this->hasFooterCallback()) { + + $callback = $this->getFooterCallback(); + if (is_callable($callback)) { $value = call_user_func($callback, $rows); @@ -111,7 +120,7 @@ public function getNewFooterContents(mixed $rows): string|HtmlString public function getFooterFilter(?Filter $filter, array $filterGenericData): \Illuminate\Contracts\Foundation\Application|\Illuminate\View\Factory|\Illuminate\View\View|string { - if ($filter !== null && $filter instanceof Filter) { + if ($filter !== null) { return $filter->setFilterPosition('footer')->setGenericDisplayData($filterGenericData)->render(); } else { throw new DataTableConfigurationException('The footer callback must be a closure, filter object, or filter key if using footerFilter().'); diff --git a/src/Views/Columns/Traits/HasSecondaryHeader.php b/src/Views/Columns/Traits/HasSecondaryHeader.php index 54738302a..722bb186a 100644 --- a/src/Views/Columns/Traits/HasSecondaryHeader.php +++ b/src/Views/Columns/Traits/HasSecondaryHeader.php @@ -50,11 +50,19 @@ public function getSecondaryHeaderCallback(): mixed public function secondaryHeaderCallbackIsString(): bool { + if (! $this->hasSecondaryHeaderCallback()) { + return false; + } + return is_string($this->getSecondaryHeaderCallback()); } public function secondaryHeaderCallbackIsFilter(): bool { + if (! $this->hasSecondaryHeaderCallback()) { + return false; + } + $callback = $this->getSecondaryHeaderCallback(); return $callback instanceof Filter; @@ -63,9 +71,11 @@ public function secondaryHeaderCallbackIsFilter(): bool public function getSecondaryHeaderContents(mixed $rows, array $filterGenericData): \Illuminate\Contracts\Foundation\Application|\Illuminate\View\Factory|\Illuminate\View\View|string|HtmlString { $value = null; - $callback = $this->getSecondaryHeaderCallback(); if ($this->hasSecondaryHeaderCallback()) { + + $callback = $this->getSecondaryHeaderCallback(); + if (is_callable($callback)) { $value = call_user_func($callback, $rows); if ($this->isHtml()) { @@ -108,7 +118,7 @@ public function getNewSecondaryHeaderContents(mixed $rows): string|HtmlString public function getSecondaryHeaderFilter(?Filter $filter, array $filterGenericData): \Illuminate\Contracts\Foundation\Application|\Illuminate\View\Factory|\Illuminate\View\View|string { - if ($filter !== null && $filter instanceof Filter) { + if ($filter !== null) { return $filter->setFilterPosition('header')->setGenericDisplayData($filterGenericData)->render(); } else { throw new DataTableConfigurationException('The secondary header callback must be a closure, filter object, or filter key if using secondaryHeaderFilter().'); diff --git a/src/Views/Columns/Traits/Helpers/LivewireComponentColumnHelpers.php b/src/Views/Columns/Traits/Helpers/LivewireComponentColumnHelpers.php index 55bedf325..2d4aade8c 100644 --- a/src/Views/Columns/Traits/Helpers/LivewireComponentColumnHelpers.php +++ b/src/Views/Columns/Traits/Helpers/LivewireComponentColumnHelpers.php @@ -78,7 +78,7 @@ protected function implodeAttributes(array $attributes): string /** * getBlade Render */ - protected function getBlade(array $attributes, string $key) + protected function getBlade(array $attributes, string $key): string { return Blade::render( 'implodeAttributes($attributes).' />',