Current File : /home/getxxhzo/app.genicards.com/app/Livewire/SubscriptionTable.php
<?php

namespace App\Livewire;

use App\Models\Plan;
use App\Models\User;
use App\Models\Subscription;
use Illuminate\Database\Eloquent\Builder;
use Rappasoft\LaravelLivewireTables\Views\Column;
use Rappasoft\LaravelLivewireTables\DataTableComponent;

class SubscriptionTable extends LivewireTableComponent
{
    protected $model = Subscription::class;

    public function configure(): void
    {
        $this->setPrimaryKey('subscription_id');
        $this->setPageName('subscription-table');
        $this->setDefaultSort('id', 'desc');
        $this->setColumnSelectStatus(false);
        $this->setQueryStringStatus(false);
        $this->resetPage('subscription-table');

        $this->setTdAttributes(function (Column $column) {
            if ($column->isField('id')) {
                return [
                    'class' => 'justify-content-center d-flex',
                ];
            }
            return [];
        });

        $this->setThAttributes(function (Column $column) {
            if ($column->isField('id')) {
                return [
                    'class' => 'justify-content-center d-flex',
                ];
            }
            return [];
        });
    }

    public function columns(): array
    {
        return [
            Column::make(__('messages.vcard.user_name'), 'tenant.user.first_name')
                ->sortable(function (Builder $query, $direction) {
                    return $query->orderBy(
                        User::select('first_name')->whereColumn('subscriptions.tenant_id', 'users.tenant_id'),
                        $direction
                    );
                })->searchable(
                    function (Builder $query, $direction) {
                        return $query->whereHas('tenant.user', function (Builder $q) use ($direction) {
                            $q->whereRaw("TRIM(CONCAT(first_name,' ',last_name,' ')) like '%{$direction}%'");
                        });
                    }
                )->view('sadmin.subscriptionPlan.columns.user_name'),
            Column::make(__('messages.vcard.user_name'), 'tenant.user.last_name')
                ->sortable(function (Builder $query, $direction) {
                    return $query->orderBy(
                        User::select('first_name')->whereColumn('subscriptions.tenant_id', 'users.tenant_id'),
                        $direction
                    );
                })->searchable()->hideIf(1)->view('sadmin.subscriptionPlan.columns.user_name'),
            Column::make(__('messages.subscription.plan_name'), 'plan.name')
                ->sortable(function (Builder $query, $direction) {
                    return $query->orderBy(
                        Plan::select('name')->whereColumn('id', 'plan_id'),
                        $direction
                    );
                })->searchable()->view('sadmin.subscriptionPlan.columns.plan_name'),
            Column::make(__('messages.subscription.start_date'), 'starts_at')
                ->sortable()->view('sadmin.subscriptionPlan.columns.start_date'),
            Column::make(__('messages.subscription.end_date'), 'ends_at')
                ->sortable()->view('sadmin.subscriptionPlan.columns.end_date'),
            Column::make(__('messages.common.status'), 'status')->view('sadmin.subscriptionPlan.columns.status'),
            Column::make(__('messages.common.action'), 'id')->view('sadmin.subscriptionPlan.columns.action'),
            Column::make('plan_id', 'plan_id')->hideIf(1),
            Column::make('tenant_id', 'tenant_id')->hideIf(1)
        ];
    }

    public function builder(): Builder
    {
        return Subscription::with(['tenant.user', 'plan.currency'])->where(
            'subscriptions.status',
            Subscription::ACTIVE
        );
    }
    public function placeholder()
    {
        return view('lazy_loading.without-listing-skelecton');
    }

}