@@ -1451,3 +1451,246 @@ describe('RecordPickerDialog — Loading Overlay', () => {
14511451 } ) ;
14521452 } ) ;
14531453} ) ;
1454+
1455+ // ------------- RecordPickerDialog — onSelectRecords callback -------------
1456+
1457+ describe ( 'RecordPickerDialog — onSelectRecords callback' , ( ) => {
1458+ const basePickerProps = {
1459+ open : true ,
1460+ onOpenChange : vi . fn ( ) ,
1461+ dataSource : mockDataSource as any ,
1462+ objectName : 'customers' ,
1463+ onSelect : vi . fn ( ) ,
1464+ } ;
1465+
1466+ it ( 'calls onSelectRecords with the full record on single-select' , async ( ) => {
1467+ const onSelect = vi . fn ( ) ;
1468+ const onSelectRecords = vi . fn ( ) ;
1469+ const onOpenChange = vi . fn ( ) ;
1470+
1471+ mockDataSource . find . mockResolvedValue ( {
1472+ data : [
1473+ { id : '1' , name : 'Acme Corp' , email : 'acme@test.com' } ,
1474+ { id : '2' , name : 'Beta Inc' , email : 'beta@test.com' } ,
1475+ ] ,
1476+ total : 2 ,
1477+ } ) ;
1478+
1479+ render (
1480+ < RecordPickerDialog
1481+ { ...basePickerProps }
1482+ onSelect = { onSelect }
1483+ onSelectRecords = { onSelectRecords }
1484+ onOpenChange = { onOpenChange }
1485+ /> ,
1486+ ) ;
1487+
1488+ await waitFor ( ( ) => {
1489+ expect ( screen . getByText ( 'Acme Corp' ) ) . toBeInTheDocument ( ) ;
1490+ } ) ;
1491+
1492+ await act ( async ( ) => {
1493+ fireEvent . click ( screen . getByTestId ( 'record-row-1' ) ) ;
1494+ } ) ;
1495+
1496+ expect ( onSelect ) . toHaveBeenCalledWith ( '1' ) ;
1497+ expect ( onSelectRecords ) . toHaveBeenCalledWith ( [
1498+ expect . objectContaining ( { id : '1' , name : 'Acme Corp' } ) ,
1499+ ] ) ;
1500+ expect ( onOpenChange ) . toHaveBeenCalledWith ( false ) ;
1501+ } ) ;
1502+
1503+ it ( 'calls onSelectRecords with full records on multi-select confirm' , async ( ) => {
1504+ const onSelect = vi . fn ( ) ;
1505+ const onSelectRecords = vi . fn ( ) ;
1506+ const onOpenChange = vi . fn ( ) ;
1507+
1508+ mockDataSource . find . mockResolvedValue ( {
1509+ data : [
1510+ { id : '1' , name : 'Alpha' } ,
1511+ { id : '2' , name : 'Beta' } ,
1512+ { id : '3' , name : 'Gamma' } ,
1513+ ] ,
1514+ total : 3 ,
1515+ } ) ;
1516+
1517+ render (
1518+ < RecordPickerDialog
1519+ { ...basePickerProps }
1520+ multiple
1521+ onSelect = { onSelect }
1522+ onSelectRecords = { onSelectRecords }
1523+ onOpenChange = { onOpenChange }
1524+ /> ,
1525+ ) ;
1526+
1527+ await waitFor ( ( ) => {
1528+ expect ( screen . getByText ( 'Alpha' ) ) . toBeInTheDocument ( ) ;
1529+ } ) ;
1530+
1531+ // Select two records
1532+ await act ( async ( ) => {
1533+ fireEvent . click ( screen . getByTestId ( 'record-row-1' ) ) ;
1534+ } ) ;
1535+ await act ( async ( ) => {
1536+ fireEvent . click ( screen . getByTestId ( 'record-row-3' ) ) ;
1537+ } ) ;
1538+
1539+ // Click confirm
1540+ await act ( async ( ) => {
1541+ fireEvent . click ( screen . getByText ( 'Confirm' ) ) ;
1542+ } ) ;
1543+
1544+ expect ( onSelect ) . toHaveBeenCalledWith ( expect . arrayContaining ( [ '1' , '3' ] ) ) ;
1545+ expect ( onSelectRecords ) . toHaveBeenCalledWith (
1546+ expect . arrayContaining ( [
1547+ expect . objectContaining ( { id : '1' , name : 'Alpha' } ) ,
1548+ expect . objectContaining ( { id : '3' , name : 'Gamma' } ) ,
1549+ ] ) ,
1550+ ) ;
1551+ expect ( onOpenChange ) . toHaveBeenCalledWith ( false ) ;
1552+ } ) ;
1553+ } ) ;
1554+
1555+ // ------------- LookupField — Selection Display After RecordPickerDialog -------------
1556+
1557+ describe ( 'LookupField — Selection Display After RecordPickerDialog' , ( ) => {
1558+ const mockField = {
1559+ name : 'customer' ,
1560+ label : 'Customer' ,
1561+ reference_to : 'customers' ,
1562+ reference_field : 'name' ,
1563+ } as any ;
1564+
1565+ it ( 'displays selected record label after single-select in RecordPickerDialog' , async ( ) => {
1566+ const onChange = vi . fn ( ) ;
1567+ let currentValue : any = undefined ;
1568+
1569+ mockDataSource . find . mockResolvedValue ( {
1570+ data : Array . from ( { length : 50 } , ( _ , i ) => ( {
1571+ id : String ( i + 1 ) ,
1572+ name : `Customer ${ i + 1 } ` ,
1573+ } ) ) ,
1574+ total : 200 ,
1575+ } ) ;
1576+
1577+ const { rerender } = render (
1578+ < LookupField
1579+ field = { mockField }
1580+ value = { currentValue }
1581+ onChange = { onChange }
1582+ readonly = { false }
1583+ dataSource = { mockDataSource as any }
1584+ /> ,
1585+ ) ;
1586+
1587+ // Open RecordPickerDialog via "Browse All" button
1588+ await act ( async ( ) => {
1589+ fireEvent . click ( screen . getByTestId ( 'browse-all-records' ) ) ;
1590+ } ) ;
1591+
1592+ await waitFor ( ( ) => {
1593+ expect ( screen . getByTestId ( 'record-picker-dialog' ) ) . toBeInTheDocument ( ) ;
1594+ } ) ;
1595+
1596+ // Wait for records to load
1597+ await waitFor ( ( ) => {
1598+ expect ( screen . getByText ( 'Customer 1' ) ) . toBeInTheDocument ( ) ;
1599+ } ) ;
1600+
1601+ // Select a record (single-select — should immediately close)
1602+ await act ( async ( ) => {
1603+ fireEvent . click ( screen . getByTestId ( 'record-row-1' ) ) ;
1604+ } ) ;
1605+
1606+ expect ( onChange ) . toHaveBeenCalledWith ( '1' ) ;
1607+
1608+ // Simulate parent re-rendering with the new value
1609+ currentValue = '1' ;
1610+ rerender (
1611+ < LookupField
1612+ field = { mockField }
1613+ value = { currentValue }
1614+ onChange = { onChange }
1615+ readonly = { false }
1616+ dataSource = { mockDataSource as any }
1617+ /> ,
1618+ ) ;
1619+
1620+ // The selected record's name should be visible as a badge
1621+ await waitFor ( ( ) => {
1622+ expect ( screen . getByText ( 'Customer 1' ) ) . toBeInTheDocument ( ) ;
1623+ } ) ;
1624+ } ) ;
1625+
1626+ it ( 'displays selected record badges after multi-select in RecordPickerDialog' , async ( ) => {
1627+ const multiField = { ...mockField , multiple : true } as any ;
1628+ const onChange = vi . fn ( ) ;
1629+ let currentValue : any = [ ] ;
1630+
1631+ mockDataSource . find . mockResolvedValue ( {
1632+ data : Array . from ( { length : 50 } , ( _ , i ) => ( {
1633+ id : String ( i + 1 ) ,
1634+ name : `Customer ${ i + 1 } ` ,
1635+ } ) ) ,
1636+ total : 200 ,
1637+ } ) ;
1638+
1639+ const { rerender } = render (
1640+ < LookupField
1641+ field = { multiField }
1642+ value = { currentValue }
1643+ onChange = { onChange }
1644+ readonly = { false }
1645+ dataSource = { mockDataSource as any }
1646+ /> ,
1647+ ) ;
1648+
1649+ // Open RecordPickerDialog via "Browse All" button
1650+ await act ( async ( ) => {
1651+ fireEvent . click ( screen . getByTestId ( 'browse-all-records' ) ) ;
1652+ } ) ;
1653+
1654+ await waitFor ( ( ) => {
1655+ expect ( screen . getByTestId ( 'record-picker-dialog' ) ) . toBeInTheDocument ( ) ;
1656+ } ) ;
1657+
1658+ // Wait for records to load
1659+ await waitFor ( ( ) => {
1660+ expect ( screen . getByText ( 'Customer 1' ) ) . toBeInTheDocument ( ) ;
1661+ } ) ;
1662+
1663+ // Select two records (multi-select — needs confirm)
1664+ await act ( async ( ) => {
1665+ fireEvent . click ( screen . getByTestId ( 'record-row-1' ) ) ;
1666+ } ) ;
1667+ await act ( async ( ) => {
1668+ fireEvent . click ( screen . getByTestId ( 'record-row-3' ) ) ;
1669+ } ) ;
1670+
1671+ // Click confirm
1672+ await act ( async ( ) => {
1673+ fireEvent . click ( screen . getByText ( 'Confirm' ) ) ;
1674+ } ) ;
1675+
1676+ expect ( onChange ) . toHaveBeenCalledWith ( expect . arrayContaining ( [ '1' , '3' ] ) ) ;
1677+
1678+ // Simulate parent re-rendering with the new value
1679+ currentValue = [ '1' , '3' ] ;
1680+ rerender (
1681+ < LookupField
1682+ field = { multiField }
1683+ value = { currentValue }
1684+ onChange = { onChange }
1685+ readonly = { false }
1686+ dataSource = { mockDataSource as any }
1687+ /> ,
1688+ ) ;
1689+
1690+ // Both selected records should be visible as badges
1691+ await waitFor ( ( ) => {
1692+ expect ( screen . getByText ( 'Customer 1' ) ) . toBeInTheDocument ( ) ;
1693+ expect ( screen . getByText ( 'Customer 3' ) ) . toBeInTheDocument ( ) ;
1694+ } ) ;
1695+ } ) ;
1696+ } ) ;
0 commit comments