diff --git a/app/Member/Data/GroupData.php b/app/Member/Data/GroupData.php index 892b665f..2a88f4de 100644 --- a/app/Member/Data/GroupData.php +++ b/app/Member/Data/GroupData.php @@ -2,6 +2,7 @@ namespace App\Member\Data; +use App\Group; use Spatie\LaravelData\Data; use Spatie\LaravelData\Attributes\MapInputName; use Spatie\LaravelData\Attributes\MapOutputName; @@ -16,4 +17,13 @@ class GroupData extends Data { public string $name, ) {} + public static function fromId(int $id): static { + $group = Group::findOrFail($id); + + return static::from([ + 'name' => $group->name, + 'id' => $group->id, + ]); + } + } diff --git a/app/Member/Data/MembershipData.php b/app/Member/Data/MembershipData.php index 736d482c..a7415f7b 100644 --- a/app/Member/Data/MembershipData.php +++ b/app/Member/Data/MembershipData.php @@ -3,78 +3,44 @@ namespace App\Member\Data; use Spatie\LaravelData\Data; -use Spatie\LaravelData\Attributes\MapInputName; -use Spatie\LaravelData\Attributes\MapOutputName; -use Spatie\LaravelData\Mappers\SnakeCaseMapper; use App\Member\Membership; use App\Member\Member; -use App\Activity; use App\Lib\Data\DateData; -#[MapInputName(SnakeCaseMapper::class)] -#[MapOutputName(SnakeCaseMapper::class)] class MembershipData extends Data { public function __construct( - public int $id, - public ActivityData $activity, - public SubactivityData $subactivity, - public GroupData $group, - public ?DateData $promisedAt, - public DateData $from, - public bool $isActive, + public ?ActivityData $activity = null, + public ?SubactivityData $subactivity = null, + public ?GroupData $group = null, + public ?DateData $promisedAt = null, + public ?DateData $from = null, + public bool $isActive = false, + public array $links = [], ) {} public static function fromModel(Membership $membership): static { return static::factory()->withoutMagicalCreation()->from([ - 'id' => $membership->id, 'activity' => $membership->activity, - 'subactivity' => $membership->subactivity, - 'is_active' => $membership->isActive(), + 'subactivity' => $membership?->subactivity, + 'isActive' => $membership->isActive(), 'from' => $membership->from, 'group' => $membership->group, - 'promised_at' => $membership->promised_at, + 'promisedAt' => $membership->promised_at, + 'links' => [ + 'update' => route('membership.update', $membership), + 'destroy' => route('membership.destroy', $membership), + ] ]); } /** * @return array */ - public function with(): array + public static function memberMeta(Member $member): MembershipMeta { - return [ - // 'human_date' => $this->from->format('d.m.Y'), - // 'promised_at_human' => $this->promisedAt?->format('d.m.Y'), - // 'promised_at' => $this->promisedAt?->format('Y-m-d'), - 'links' => [ - 'update' => route('membership.update', ['membership' => $this->id]), - 'destroy' => route('membership.destroy', ['membership' => $this->id]), - ] - ]; - } - - /** - * @return array - */ - public static function memberMeta(Member $member): array - { - $activities = Activity::with('subactivities')->get(); - - return [ - 'links' => [ - 'store' => route('member.membership.store', ['member' => $member]), - ], - 'groups' => NestedGroup::cacheForSelect(), - 'activities' => $activities->map(fn($activity) => ['id' => $activity->id, 'name' => $activity->name]), - 'subactivities' => $activities->mapWithKeys(fn($activity) => [$activity->id => $activity->subactivities->map(fn($subactivity) => ['id' => $subactivity->id, 'name' => $subactivity->name, 'is_age_group' => $subactivity->is_age_group])]), - 'default' => [ - 'group_id' => $member->group_id, - 'activity_id' => null, - 'subactivity_id' => null, - 'promised_at' => null, - ], - ]; + return MembershipMeta::fromMember($member); } } diff --git a/app/Member/Data/MembershipMeta.php b/app/Member/Data/MembershipMeta.php new file mode 100644 index 00000000..57fdd9aa --- /dev/null +++ b/app/Member/Data/MembershipMeta.php @@ -0,0 +1,41 @@ +get(); + + return static::factory()->withoutMagicalCreation()->from([ + 'links' => [ + 'store' => route('member.membership.store', ['member' => $member]), + ], + 'groups' => NestedGroup::cacheForSelect(), + 'activities' => $activities->map(fn($activity) => ['id' => $activity->id, 'name' => $activity->name]), + 'subactivities' => $activities->mapWithKeys(fn($activity) => [$activity->id => $activity->subactivities->map(fn($subactivity) => ['id' => $subactivity->id, 'name' => $subactivity->name, 'is_age_group' => $subactivity->is_age_group])]), + 'default' => MembershipData::from(['group' => $member->group_id]), + ]); + } + +} diff --git a/docker-compose.yml b/docker-compose.yml index aa27c717..bea7193b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -103,6 +103,8 @@ services: - ./data/redis:/data meilisearch: + ports: + - "7700:7700" image: getmeili/meilisearch:v1.6 volumes: - ./data/meilisearch:/meili_data diff --git a/resources/js/components/form/Select.vue b/resources/js/components/form/Select.vue index 5286e862..0128cffd 100644 --- a/resources/js/components/form/Select.vue +++ b/resources/js/components/form/Select.vue @@ -1,17 +1,17 @@ -