#20 - wip
This commit is contained in:
		@@ -19,4 +19,38 @@ enum VacationRequestState: string
 | 
				
			|||||||
    {
 | 
					    {
 | 
				
			||||||
        return __($this->value);
 | 
					        return __($this->value);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static function pendingStates(): array
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return [
 | 
				
			||||||
 | 
					            self::CREATED,
 | 
				
			||||||
 | 
					            self::WAITING_FOR_TECHNICAL,
 | 
				
			||||||
 | 
					            self::WAITING_FOR_ADMINISTRATIVE,
 | 
				
			||||||
 | 
					            self::ACCEPTED_BY_TECHNICAL,
 | 
				
			||||||
 | 
					            self::ACCEPTED_BY_ADMINSTRATIVE,
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static function successStates(): array
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return [self::APPROVED];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static function failedStates(): array
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return [
 | 
				
			||||||
 | 
					            self::REJECTED,
 | 
				
			||||||
 | 
					            self::CANCELED,
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static function filterByStatus(string $filter): array
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return match ($filter) {
 | 
				
			||||||
 | 
					            "pending" => VacationRequestState::pendingStates(),
 | 
				
			||||||
 | 
					            "success" => VacationRequestState::successStates(),
 | 
				
			||||||
 | 
					            "failed" => VacationRequestState::failedStates(),
 | 
				
			||||||
 | 
					            default => VacationRequestState::cases(),
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,6 +5,7 @@ declare(strict_types=1);
 | 
				
			|||||||
namespace Toby\Eloquent\Models;
 | 
					namespace Toby\Eloquent\Models;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use Database\Factories\VacationRequestFactory;
 | 
					use Database\Factories\VacationRequestFactory;
 | 
				
			||||||
 | 
					use Illuminate\Database\Eloquent\Builder;
 | 
				
			||||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
 | 
					use Illuminate\Database\Eloquent\Factories\HasFactory;
 | 
				
			||||||
use Illuminate\Database\Eloquent\Model;
 | 
					use Illuminate\Database\Eloquent\Model;
 | 
				
			||||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
 | 
					use Illuminate\Database\Eloquent\Relations\BelongsTo;
 | 
				
			||||||
@@ -54,6 +55,11 @@ class VacationRequest extends Model
 | 
				
			|||||||
        $this->save();
 | 
					        $this->save();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function scopeStates(Builder $query, array $states): Builder
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return $query->whereIn("state", $states);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    protected static function newFactory(): VacationRequestFactory
 | 
					    protected static function newFactory(): VacationRequestFactory
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        return VacationRequestFactory::new();
 | 
					        return VacationRequestFactory::new();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,6 +7,7 @@ namespace Toby\Infrastructure\Http\Controllers;
 | 
				
			|||||||
use Illuminate\Http\RedirectResponse;
 | 
					use Illuminate\Http\RedirectResponse;
 | 
				
			||||||
use Illuminate\Http\Request;
 | 
					use Illuminate\Http\Request;
 | 
				
			||||||
use Inertia\Response;
 | 
					use Inertia\Response;
 | 
				
			||||||
 | 
					use Toby\Domain\Enums\VacationRequestState;
 | 
				
			||||||
use Toby\Domain\Enums\VacationType;
 | 
					use Toby\Domain\Enums\VacationType;
 | 
				
			||||||
use Toby\Domain\VacationRequestStateManager;
 | 
					use Toby\Domain\VacationRequestStateManager;
 | 
				
			||||||
use Toby\Domain\Validation\VacationRequestValidator;
 | 
					use Toby\Domain\Validation\VacationRequestValidator;
 | 
				
			||||||
@@ -19,16 +20,19 @@ class VacationRequestController extends Controller
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    public function index(Request $request): Response
 | 
					    public function index(Request $request): Response
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        $requests = $request->user()
 | 
					        $vacationRequests = $request->user()
 | 
				
			||||||
            ->vacationRequests()
 | 
					            ->vacationRequests()
 | 
				
			||||||
 | 
					            ->latest()
 | 
				
			||||||
 | 
					            ->states(VacationRequestState::filterByStatus($request->query("status", "all")))
 | 
				
			||||||
            ->paginate();
 | 
					            ->paginate();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return inertia("VacationRequest/Index", [
 | 
					        return inertia("VacationRequest/Index", [
 | 
				
			||||||
            "requests" => VacationRequestResource::collection($requests),
 | 
					            "requests" => VacationRequestResource::collection($vacationRequests),
 | 
				
			||||||
 | 
					            "filters" => $request->only("status"),
 | 
				
			||||||
        ]);
 | 
					        ]);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public function show(Request $request, VacationRequest $vacationRequest): Response
 | 
					    public function show(VacationRequest $vacationRequest): Response
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        return inertia("VacationRequest/Show", [
 | 
					        return inertia("VacationRequest/Show", [
 | 
				
			||||||
            "request" => new VacationRequestResource($vacationRequest),
 | 
					            "request" => new VacationRequestResource($vacationRequest),
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -284,6 +284,7 @@ export default {
 | 
				
			|||||||
        .transform(data => ({
 | 
					        .transform(data => ({
 | 
				
			||||||
          ...data,
 | 
					          ...data,
 | 
				
			||||||
          employmentForm: data.employmentForm.value,
 | 
					          employmentForm: data.employmentForm.value,
 | 
				
			||||||
 | 
					          role: data.role.value,
 | 
				
			||||||
        }))
 | 
					        }))
 | 
				
			||||||
        .put(`/users/${this.user.id}`)
 | 
					        .put(`/users/${this.user.id}`)
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,6 +17,17 @@
 | 
				
			|||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
    <div class="overflow-x-auto xl:overflow-x-visible overflow-y-auto xl:overflow-y-visible">
 | 
					    <div class="overflow-x-auto xl:overflow-x-visible overflow-y-auto xl:overflow-y-visible">
 | 
				
			||||||
 | 
					      <nav class="relative shadow flex divide-x divide-gray-200 border-t border-gray-200">
 | 
				
			||||||
 | 
					        <InertiaLink
 | 
				
			||||||
 | 
					          v-for="(status, index) in statuses"
 | 
				
			||||||
 | 
					          :key="index"
 | 
				
			||||||
 | 
					          :data="{ status: status.value }"
 | 
				
			||||||
 | 
					          :class="[status.value === filters.status ? 'text-gray-900' : '', 'text-gray-500 hover:text-gray-700 group relative min-w-0 flex-1 overflow-hidden bg-white py-4 px-4 text-sm font-medium text-center hover:bg-gray-50 focus:z-10']"
 | 
				
			||||||
 | 
					        >
 | 
				
			||||||
 | 
					          <span>{{ status.name }}</span>
 | 
				
			||||||
 | 
					          <span :class="[status.value === filters.status ? 'bg-blumilk-500' : 'bg-transparent', 'absolute inset-x-0 bottom-0 h-0.5']" />
 | 
				
			||||||
 | 
					        </InertiaLink>
 | 
				
			||||||
 | 
					      </nav>
 | 
				
			||||||
      <table class="min-w-full divide-y divide-gray-200">
 | 
					      <table class="min-w-full divide-y divide-gray-200">
 | 
				
			||||||
        <thead class="bg-gray-50">
 | 
					        <thead class="bg-gray-50">
 | 
				
			||||||
          <tr>
 | 
					          <tr>
 | 
				
			||||||
@@ -56,6 +67,7 @@
 | 
				
			|||||||
            >
 | 
					            >
 | 
				
			||||||
              Dni urlopu
 | 
					              Dni urlopu
 | 
				
			||||||
            </th>
 | 
					            </th>
 | 
				
			||||||
 | 
					            <th scope="col" />
 | 
				
			||||||
          </tr>
 | 
					          </tr>
 | 
				
			||||||
        </thead>
 | 
					        </thead>
 | 
				
			||||||
        <tbody class="bg-white divide-y divide-gray-100">
 | 
					        <tbody class="bg-white divide-y divide-gray-100">
 | 
				
			||||||
@@ -65,12 +77,12 @@
 | 
				
			|||||||
            class="hover:bg-blumilk-25"
 | 
					            class="hover:bg-blumilk-25"
 | 
				
			||||||
          >
 | 
					          >
 | 
				
			||||||
            <td class="px-4 py-4 whitespace-nowrap text-sm text-gray-500">
 | 
					            <td class="px-4 py-4 whitespace-nowrap text-sm text-gray-500">
 | 
				
			||||||
              <a
 | 
					              <InertiaLink
 | 
				
			||||||
                :href="`/vacation-requests/${request.id}`"
 | 
					                :href="`/vacation-requests/${request.id}`"
 | 
				
			||||||
                class="font-semibold text-blumilk-600 hover:text-blumilk-500 hover:underline"
 | 
					                class="font-semibold text-blumilk-600 hover:text-blumilk-500 hover:underline"
 | 
				
			||||||
              >
 | 
					              >
 | 
				
			||||||
                {{ request.name }}
 | 
					                {{ request.name }}
 | 
				
			||||||
              </a>
 | 
					              </InertiaLink>
 | 
				
			||||||
            </td>
 | 
					            </td>
 | 
				
			||||||
            <td class="px-4 py-4 whitespace-nowrap text-sm text-gray-500">
 | 
					            <td class="px-4 py-4 whitespace-nowrap text-sm text-gray-500">
 | 
				
			||||||
              {{ request.type }}
 | 
					              {{ request.type }}
 | 
				
			||||||
@@ -87,6 +99,11 @@
 | 
				
			|||||||
            <td class="px-4 py-4 whitespace-nowrap text-sm text-gray-500">
 | 
					            <td class="px-4 py-4 whitespace-nowrap text-sm text-gray-500">
 | 
				
			||||||
              X
 | 
					              X
 | 
				
			||||||
            </td>
 | 
					            </td>
 | 
				
			||||||
 | 
					            <td class="px-4 py-4 whitespace-nowrap text-sm text-gray-500">
 | 
				
			||||||
 | 
					              <InertiaLink :href="`/vacation-requests/${request.id}`">
 | 
				
			||||||
 | 
					                <ChevronRightIcon class="block w-6 h-6 fill-gray-400" />
 | 
				
			||||||
 | 
					              </InertiaLink>
 | 
				
			||||||
 | 
					            </td>
 | 
				
			||||||
          </tr>
 | 
					          </tr>
 | 
				
			||||||
          <tr
 | 
					          <tr
 | 
				
			||||||
            v-if="! requests.data.length"
 | 
					            v-if="! requests.data.length"
 | 
				
			||||||
@@ -152,7 +169,7 @@
 | 
				
			|||||||
</template>
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script>
 | 
					<script>
 | 
				
			||||||
import {DotsVerticalIcon, PencilIcon, TrashIcon} from '@heroicons/vue/solid'
 | 
					import {ChevronRightIcon, DotsVerticalIcon, PencilIcon, TrashIcon} from '@heroicons/vue/solid'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default {
 | 
					export default {
 | 
				
			||||||
  name: 'VacationRequestIndex',
 | 
					  name: 'VacationRequestIndex',
 | 
				
			||||||
@@ -160,12 +177,41 @@ export default {
 | 
				
			|||||||
    DotsVerticalIcon,
 | 
					    DotsVerticalIcon,
 | 
				
			||||||
    PencilIcon,
 | 
					    PencilIcon,
 | 
				
			||||||
    TrashIcon,
 | 
					    TrashIcon,
 | 
				
			||||||
 | 
					    ChevronRightIcon,
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  props: {
 | 
					  props: {
 | 
				
			||||||
    requests: {
 | 
					    requests: {
 | 
				
			||||||
      type: Object,
 | 
					      type: Object,
 | 
				
			||||||
      default: () => null,
 | 
					      default: () => null,
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    filters: {
 | 
				
			||||||
 | 
					      type: Object,
 | 
				
			||||||
 | 
					      default: () => null,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  setup() {
 | 
				
			||||||
 | 
					    const statuses = [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        name: 'Wszystkie',
 | 
				
			||||||
 | 
					        value: 'all',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        name: 'W trakcie',
 | 
				
			||||||
 | 
					        value: 'pending',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        name: 'Zatwierdzone',
 | 
				
			||||||
 | 
					        value: 'success',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        name: 'Odrzucone/anulowane',
 | 
				
			||||||
 | 
					        value: 'failed',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return {
 | 
				
			||||||
 | 
					      statuses,
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user