From 27f805700e1cedbcd9c10521715822e94598533d Mon Sep 17 00:00:00 2001 From: philipp lang Date: Thu, 29 May 2025 22:17:50 +0200 Subject: [PATCH] Move member filter to separate component --- app/Member/FilterScope.php | 17 ++-- app/Member/MemberResource.php | 4 +- resources/js/composables/useIndex.js | 7 ++ resources/js/views/member/MemberFilter.vue | 112 +++++++++++++++++++++ resources/js/views/member/VIndex.vue | 84 ++-------------- 5 files changed, 137 insertions(+), 87 deletions(-) create mode 100644 resources/js/views/member/MemberFilter.vue diff --git a/app/Member/FilterScope.php b/app/Member/FilterScope.php index 24fdb73b..627ec9de 100644 --- a/app/Member/FilterScope.php +++ b/app/Member/FilterScope.php @@ -48,8 +48,7 @@ class FilterScope extends ScoutFilter public ?bool $hasBirthday = null, public ?bool $hasSvk = null, public ?bool $hasVk = null, - ) { - } + ) {} /** * @param array $options @@ -110,20 +109,20 @@ class FilterScope extends ScoutFilter } if ($this->subactivityIds && $this->activityIds) { $combinations = $this->combinations($this->activityIds, $this->subactivityIds) - ->map(fn ($combination) => implode('|', $combination)) - ->map(fn ($combination) => str($combination)->wrap('"')); + ->map(fn($combination) => implode('|', $combination)) + ->map(fn($combination) => str($combination)->wrap('"')); $filter->push($this->inExpression('memberships.both', $combinations)); } foreach ($this->memberships as $membership) { - $filter->push($this->inExpression('memberships.with_group', $this->possibleValuesForMembership($membership)->map(fn ($value) => str($value)->wrap('"')))); + $filter->push($this->inExpression('memberships.with_group', $this->possibleValuesForMembership($membership)->map(fn($value) => str($value)->wrap('"')))); } if (count($this->exclude)) { $filter->push($this->notInExpression('id', $this->exclude)); } - $andFilter = $filter->map(fn ($expression) => "($expression)")->implode(' AND '); + $andFilter = $filter->map(fn($expression) => "($expression)")->implode(' AND '); $options['filter'] = $this->implode(collect([$andFilter])->push($this->inExpression('id', $this->include)), 'OR'); $options['sort'] = ['lastname:asc', 'firstname:asc']; @@ -137,7 +136,7 @@ class FilterScope extends ScoutFilter */ protected function implode(Collection $values, string $between): string { - return $values->filter(fn ($expression) => $expression)->implode(" {$between} "); + return $values->filter(fn($expression) => $expression)->implode(" {$between} "); } /** @@ -177,7 +176,7 @@ class FilterScope extends ScoutFilter $membership['activity_ids'] = count($membership['activity_ids']) === 0 ? Activity::pluck('id')->toArray() : $membership['activity_ids']; $membership['subactivity_ids'] = count($membership['subactivity_ids']) === 0 ? Subactivity::pluck('id')->toArray() : $membership['subactivity_ids']; return $this->combinations($membership['group_ids'], $membership['activity_ids'], $membership['subactivity_ids']) - ->map(fn ($combination) => collect($combination)->implode('|')); + ->map(fn($combination) => collect($combination)->implode('|')); } /** @@ -191,7 +190,7 @@ class FilterScope extends ScoutFilter if (!count($otherParts)) { /** @var Collection> */ - return collect($firstPart)->map(fn ($p) => [$p]); + return collect($firstPart)->map(fn($p) => [$p]); } /** @var Collection */ diff --git a/app/Member/MemberResource.php b/app/Member/MemberResource.php index 6d153b6b..259d1093 100644 --- a/app/Member/MemberResource.php +++ b/app/Member/MemberResource.php @@ -136,8 +136,8 @@ class MemberResource extends JsonResource $createActivities = Activity::remote()->with(['subactivities' => fn($q) => $q->remote()])->get(); return [ - 'filterActivities' => Activity::where('is_filterable', true)->pluck('name', 'id'), - 'filterSubactivities' => Subactivity::where('is_filterable', true)->pluck('name', 'id'), + 'filterActivities' => Activity::where('is_filterable', true)->get()->map(fn($a) => ['id' => $a->id, 'name' => $a->name]), + 'filterSubactivities' => Subactivity::where('is_filterable', true)->get()->map(fn($a) => ['id' => $a->id, 'name' => $a->name]), 'formActivities' => $activities->pluck('name', 'id'), 'formSubactivities' => $activities->map(function (Activity $activity) { return ['subactivities' => $activity->subactivities->pluck('name', 'id'), 'id' => $activity->id]; diff --git a/resources/js/composables/useIndex.js b/resources/js/composables/useIndex.js index 487ed4d7..ba63f74b 100644 --- a/resources/js/composables/useIndex.js +++ b/resources/js/composables/useIndex.js @@ -56,6 +56,11 @@ export function useIndex(props, siteName) { reload(true); } + function setFilterObject(o) { + inner.filter.value = o; + reload(true); + } + startListener(); onBeforeUnmount(() => stopListener()); @@ -70,6 +75,8 @@ export function useIndex(props, siteName) { toFilterString, reloadPage, axios, + filter: inner.filter, + setFilterObject, }; } diff --git a/resources/js/views/member/MemberFilter.vue b/resources/js/views/member/MemberFilter.vue new file mode 100644 index 00000000..ff5f688e --- /dev/null +++ b/resources/js/views/member/MemberFilter.vue @@ -0,0 +1,112 @@ + + + diff --git a/resources/js/views/member/VIndex.vue b/resources/js/views/member/VIndex.vue index 8c4c2948..4fda9f27 100644 --- a/resources/js/views/member/VIndex.vue +++ b/resources/js/views/member/VIndex.vue @@ -17,80 +17,12 @@ - - -
- - - -
- -
-