106 lines
2.6 KiB
TypeScript
106 lines
2.6 KiB
TypeScript
import { PERMS } from "@/lib/permission-slugs";
|
|
import type { HousekeepingPageInput } from "../../../route-handlers";
|
|
import { hotelQuery } from "../queries/rooms";
|
|
import { HotelCommandForm } from "./hotel-command-form";
|
|
import {
|
|
HotelPageFrame,
|
|
type HotelPageProps,
|
|
parseHotelListInput,
|
|
} from "./hotel-page-frame";
|
|
|
|
export function HotelRoomFurniPage(props: HotelPageProps) {
|
|
return (
|
|
<HotelPageFrame
|
|
title="Room furniture"
|
|
description="Inspect and safely edit furniture scoped to this room."
|
|
result={props.result}
|
|
forms={
|
|
props.context.has(PERMS.ROOMS_EDIT) ? (
|
|
<div className="grid gap-3 lg:grid-cols-2">
|
|
<HotelCommandForm
|
|
commandId="hotel.rooms.furni.update"
|
|
buttonLabel="Save furniture"
|
|
input={{}}
|
|
fields={[
|
|
{
|
|
name: "roomId",
|
|
label: "Room ID",
|
|
type: "number",
|
|
required: true,
|
|
},
|
|
{
|
|
name: "itemId",
|
|
label: "Item ID",
|
|
type: "number",
|
|
required: true,
|
|
},
|
|
{ name: "x", label: "X", type: "number" },
|
|
{ name: "y", label: "Y", type: "number" },
|
|
{ name: "z", label: "Z", type: "number" },
|
|
{ name: "rot", label: "Rotation", type: "number" },
|
|
{ name: "wallPos", label: "Wall position", type: "text" },
|
|
{ name: "extraData", label: "Extra data", type: "textarea" },
|
|
]}
|
|
/>
|
|
<HotelCommandForm
|
|
commandId="hotel.rooms.furni.delete"
|
|
buttonLabel="Delete furniture"
|
|
input={{}}
|
|
requiresReason
|
|
fields={[
|
|
{
|
|
name: "roomId",
|
|
label: "Room ID",
|
|
type: "number",
|
|
required: true,
|
|
},
|
|
{
|
|
name: "itemId",
|
|
label: "Item ID",
|
|
type: "number",
|
|
required: true,
|
|
},
|
|
]}
|
|
/>
|
|
<HotelCommandForm
|
|
commandId="hotel.rooms.furni.bulk-delete"
|
|
buttonLabel="Delete selected furniture"
|
|
input={{}}
|
|
requiresReason
|
|
fields={[
|
|
{
|
|
name: "roomId",
|
|
label: "Room ID",
|
|
type: "number",
|
|
required: true,
|
|
},
|
|
{
|
|
name: "itemIds",
|
|
label: "Item IDs (comma separated)",
|
|
type: "id-list",
|
|
required: true,
|
|
},
|
|
]}
|
|
/>
|
|
</div>
|
|
) : null
|
|
}
|
|
/>
|
|
);
|
|
}
|
|
|
|
export async function renderHotelRoomFurniPage(input: HousekeepingPageInput) {
|
|
const result = await hotelQuery.run(input.context, {
|
|
routeId: "hotel.room-furni",
|
|
params: input.match.params,
|
|
list: parseHotelListInput(input.searchParams ?? {}),
|
|
});
|
|
return (
|
|
<HotelRoomFurniPage
|
|
context={input.context}
|
|
result={result}
|
|
routeId="hotel.room-furni"
|
|
/>
|
|
);
|
|
}
|