/** * WordPress dependencies */ import { useMemo, useState } from '@wordpress/element'; import { privateApis } from '@wordpress/components'; /** * Internal dependencies */ import DataForm from '../index'; import type { Field, Form } from '../../types'; import { unlock } from '../../lock-unlock'; const { Badge } = unlock( privateApis ); const LayoutCardComponent = ( { withHeader, withSummary, isCollapsible, isOpened, }: { withHeader: boolean; withSummary: boolean; isCollapsible: boolean; isOpened?: boolean; } ) => { type Customer = { name: string; email: string; phone: string; plan: string; shippingAddress: string; billingAddress: string; displayPayments: boolean; totalOrders: number; totalRevenue: number; averageOrderValue: number; hasVat: boolean; vat: number; commission: number; dueDate: string; }; const customerFields: Field< Customer >[] = [ { id: 'name', label: 'Customer Name', type: 'text', }, { id: 'phone', label: 'Phone', type: 'text', }, { id: 'email', label: 'Email', type: 'email', }, { id: 'plan', label: 'Plan', type: 'text', Edit: 'toggleGroup', elements: [ { value: 'basic', label: 'Basic' }, { value: 'business', label: 'Business' }, { value: 'vip', label: 'VIP' }, ], }, { id: 'shippingAddress', label: 'Shipping Address', type: 'text', }, { id: 'billingAddress', label: 'Billing Address', type: 'text', }, { id: 'displayPayments', label: 'Display Payments?', type: 'boolean', }, { id: 'payments', label: 'Payments', type: 'text', readOnly: true, // Triggers using the render method instead of Edit. isVisible: ( item ) => item.displayPayments, render: ( { item } ) => { return (

The customer has made a total of { item.totalOrders }{ ' ' } orders, amounting to { item.totalRevenue } dollars. The average order value is { item.averageOrderValue }{ ' ' } dollars.

); }, }, { id: 'vat', label: 'VAT', type: 'integer', }, { id: 'commission', label: 'Commission', type: 'integer', }, { id: 'dueDate', label: 'Due Date', type: 'text', render: ( { item } ) => { return Due on: { item.dueDate }; }, }, { id: 'plan-summary', type: 'text', readOnly: true, render: ( { item } ) => { return { item.plan }; }, }, ]; const [ customer, setCustomer ] = useState< Customer >( { name: 'Danyka Romaguera', email: 'aromaguera@example.org', phone: '1-828-352-1250', plan: 'Business', shippingAddress: 'N/A', billingAddress: 'Danyka Romaguera, West Myrtiehaven, 80240-4282, BI', displayPayments: true, totalOrders: 2, totalRevenue: 1430, averageOrderValue: 715, hasVat: true, vat: 10, commission: 5, dueDate: 'March 1st, 2028', } ); const getCardLayoutFromStoryArgs = ( { summary, withSummary: displaySummary, withHeader: header, isCollapsible: collapsible, isOpened: opened, }: { summary?: string | string[] | { id: string; visibility: 'always' }[]; withSummary?: boolean; withHeader?: boolean; isCollapsible?: boolean; isOpened?: boolean; } ) => { return { type: 'card' as const, summary: displaySummary ? summary : undefined, ...( header === false ? { withHeader: false as const } : { withHeader: true as const, isCollapsible: collapsible, isOpened: opened, } ), }; }; const form: Form = useMemo( () => ( { layout: { type: 'card' }, fields: [ { id: 'customerCard', layout: getCardLayoutFromStoryArgs( { summary: [ 'name', 'plan-summary' ], withHeader: withHeader ?? true, withSummary, isCollapsible, isOpened, } ), label: 'Customer', description: 'Enter your contact details, plan type, and addresses to complete your customer information.', children: [ { id: 'customerContact', label: 'Contact', layout: { type: 'panel', labelPosition: 'top', }, children: [ { id: 'name', layout: { type: 'regular', labelPosition: 'top', }, }, { id: 'phone', layout: { type: 'regular', labelPosition: 'top', }, }, { id: 'email', layout: { type: 'regular', labelPosition: 'top', }, }, ], }, { id: 'plan', layout: { type: 'panel', labelPosition: 'top' }, }, { id: 'shippingAddress', layout: { type: 'panel', labelPosition: 'top' }, }, { id: 'billingAddress', layout: { type: 'panel', labelPosition: 'top' }, }, 'displayPayments', ], }, { id: 'payments', layout: getCardLayoutFromStoryArgs( { withHeader: false, } ), }, { id: 'taxConfiguration', label: 'Taxes', layout: getCardLayoutFromStoryArgs( { summary: [ { id: 'dueDate', visibility: 'always' } ], withHeader, withSummary, isCollapsible, isOpened: isOpened ?? false, } ), children: [ 'vat', 'commission' ], }, ], } ), [ withHeader, withSummary, isCollapsible, isOpened ] ); return ( setCustomer( ( prev ) => ( { ...prev, ...edits, } ) ) } /> ); }; export default LayoutCardComponent;