Skip to content

Quotation Approval Page

Full-page ManpowerHub block for internal approval of quotations — PDF viewer area, approve/decline actions, optional note, and quotation summary sidebar.

Open in

KAT/QTN/2026/05/041Sent

Manpower supply for Al Quoz industrial expansion

Quotation PDF

Render the quotation PDF here. Use an iframe pointing to your PDF endpoint, or embed a document viewer.

Approval note

Customer

NameAl Naboodah Contracting
Ref IDANB-OPS-118
Phone+971 4 555 0188

Details

Issue date2026-05-20
Valid until2026-06-19
SignatoryMohammed Nasser, Commercial Manager
Rate card
Site supervisor2 × AED 950
AED 1,900.00
Heavy equipment operator4 × AED 1,050
AED 4,200.00
General helper16 × AED 290
AED 4,640.00
Standard totalAED 10,740.00
OT referenceAED 1,122.00

Scope of work

Supply site supervisors, heavy equipment operators, and general helpers for day-shift civil works at Al Quoz Industrial Site.

pnpm dlx shadcn@latest add @woxcn/manpowerhub-quotation-approval

Install the ManpowerHub theme first, then add the block:

npx shadcn@latest add https://woxcn-registry.woxware.io/r/manpowerhub-quotation-approval.json

This installs the approval page block at components/blocks/manpowerhub-quotation-approval.tsx.

QuotationApprovalPage renders a single quotation for review. Use it for /quotations/:id/approve.

import { QuotationApprovalPage } from "@/components/blocks/manpowerhub-quotation-approval";
export default function QuotationApprovalRoute({ params }) {
const { data: quotation } = useQuotation(params.id);
return (
<QuotationApprovalPage
quotation={quotation}
onBack={() => router.push("/quotations")}
onApprove={async (id, note) => {
await api.quotations.approve(id, { note });
router.push("/quotations");
}}
onDecline={async (id, note) => {
await api.quotations.decline(id, { note });
router.push("/quotations");
}}
/>
);
}

The PDF viewer area is a placeholder. Replace the placeholder with an iframe or document viewer:

// Inside your app, extend with a pdfUrl prop and render:
<iframe src={`/api/quotations/${quotation.id}/pdf`} className="h-full w-full rounded" />
  • quotation: required quotation record to render.
  • onBack: optional handler for the Back button.
  • onApprove(id, note): called with quotation ID and optional approver note on approve.
  • onDecline(id, note): called with quotation ID and optional note on decline.
type QuotationStatus = "draft" | "sent" | "accepted" | "expired" | "revised";
interface QuotationItem {
id: string;
category: string;
quantity: number;
rateAed: number;
otRateAed: number;
sortOrder?: number;
}
interface Quotation {
id: string;
quotationNumber: string;
customerRefId: string;
status: QuotationStatus;
customerName: string;
customerEmail: string;
customerPhone: string;
proposalSubject: string;
scopeOfWork: string;
signatoryName: string;
signatoryTitle: string;
issueDate: string;
validUntil: string;
items: QuotationItem[];
}