< Summary

Information
Class: locations.rooms.index.tsx
Assembly: app.routes
File(s): /home/runner/work/ClutterStock/ClutterStock/frontend/app/routes/locations.rooms.index.tsx
Tag: 58_25416222083
Line coverage
0%
Covered lines: 0
Uncovered lines: 23
Coverable lines: 23
Total lines: 61
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 12
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

File(s)

/home/runner/work/ClutterStock/ClutterStock/frontend/app/routes/locations.rooms.index.tsx

#LineLine coverage
 1import { Link, redirect } from "react-router";
 2import type { Route } from "./+types/locations.rooms.index";
 3import { deleteRoom, getLocation, getRooms } from "~/api/client";
 4import { Breadcrumb } from "~/components/breadcrumb";
 5import { RoomsList } from "~/components/rooms";
 6
 07export async function loader({ params, request }: Route.LoaderArgs) {
 08  const locationId = Number(params.id);
 09  if (Number.isNaN(locationId)) throw new Response("Not found", { status: 404 });
 010  const [location, allRooms] = await Promise.all([
 11    getLocation(locationId, request),
 12    getRooms(request),
 13  ]);
 014  if (!location) throw new Response("Not found", { status: 404 });
 015  const rooms = allRooms.filter((r) => r.locationId === locationId);
 016  return { location, rooms };
 17}
 18
 019export async function action({ request, params }: Route.ActionArgs) {
 020  const locationId = Number(params.id);
 021  if (Number.isNaN(locationId)) throw new Response("Not found", { status: 404 });
 022  const formData = await request.formData();
 023  if (formData.get("_action") !== "delete") return null;
 024  const roomId = Number(formData.get("id"));
 025  if (Number.isNaN(roomId)) return null;
 026  await deleteRoom(roomId, request);
 027  return redirect(`/locations/${locationId}/rooms`);
 28}
 29
 030export function meta({ loaderData }: Route.MetaArgs) {
 031  const name = loaderData?.location?.name ?? "Location";
 032  return [{ title: `Rooms · ${name} | ClutterStock` }];
 33}
 34
 035export default function LocationsRoomsIndex({ loaderData }: Route.ComponentProps) {
 036  const { location, rooms } = loaderData;
 037  const locationId = location.id!;
 38
 039  return (
 40    <>
 41      <Breadcrumb
 42        crumbs={[
 43          { label: "Locations", to: "/locations" },
 44          { label: location.name ?? "Location", to: `/locations/${locationId}/edit` },
 45          { label: "Rooms" },
 46        ]}
 47      />
 48      <div className="page-header">
 49        <h2 className="page-title">Rooms</h2>
 50        <Link to={`/locations/${locationId}/rooms/new`} className="btn-primary">
 51          + Add room
 52        </Link>
 53      </div>
 54      <RoomsList
 55        locationId={locationId}
 56        locationName={location.name ?? "this location"}
 57        rooms={rooms}
 58      />
 59    </>
 60  );
 61}