import type { Meta, StoryObj } from "@storybook/nextjs-vite"; import type React from "react"; import { ApprovalRequestMessage } from "../components/chat/approval-request-message"; import type { ApprovalRequestData } from "../components/chat/types"; /** * Single-command approval card (the legacy, non-batch variant of the Figma * "Command Block"). Renders a command bar, an optional structured field list * or explanation, and an Approve/Reject footer that flips to an * Approved/Rejected status tag once resolved. * * Newer surfaces use `ApprovalBatchMessage` (see the ApprovalBatchMessage * story) which additionally tracks per-tool execution + results. */ const LONG_COMMAND = `Get-CimInstance Win32_Process | Select-Object ProcessId, Name, Path, CommandLine | Where-Object { $_.Path -like 'C:\\Users\\Public\\*' }`; const baseData: ApprovalRequestData = { command: LONG_COMMAND, requestId: "req-1", approvalType: "ADMIN", fields: [ { label: "Tool", value: "OpenFrame RMM" }, { label: "RunAsUser", value: "False" }, { label: "timeoutSeconds", value: "60" }, ], }; const constrainedDecorator = (width?: number) => (Story: React.ComponentType) => (
); const meta = { title: "Chat/Admin/ApprovalRequestMessage", component: ApprovalRequestMessage, tags: ["autodocs"], parameters: { docs: { description: { component: "Single-command approval card — the legacy variant of the Figma Command Block. Prefer ApprovalBatchMessage for new work.", }, }, }, decorators: [constrainedDecorator()], } satisfies Meta; export default meta; type Story = StoryObj; /** Pending — Approve / Reject buttons shown. */ export const Pending: Story = { args: { data: baseData, status: "pending", onApprove: () => {}, onReject: () => {}, }, }; /** Approved — green status tag. */ export const Approved: Story = { args: { data: baseData, status: "approved" }, }; /** Rejected — red status tag. */ export const Rejected: Story = { args: { data: baseData, status: "rejected" }, }; /** Cancelled — grey status tag. */ export const Cancelled: Story = { args: { data: baseData, status: "cancelled" }, }; /** Explanation prose instead of a structured field list. */ export const WithExplanation: Story = { args: { data: { command: LONG_COMMAND, requestId: "req-2", explanation: "This runs a read-only diagnostic to inspect processes launched from the public folder. It does not modify the endpoint.", }, status: "pending", onApprove: () => {}, onReject: () => {}, }, };