If you have technical questions, please create a support ticket in the DevExpress Support Center.
import React, { useCallback, useMemo, useState } from 'react';
import { Popup, Position, ToolbarItem } from 'devextreme-react/popup';
import notify from 'devextreme/ui/notify';
import { EmployeeItem, EmployeeItemProps } from './EmployeeItem.tsx';
import { employees } from './data.ts';
const defaultCurrentEmployee: Partial<EmployeeItemProps['employee']> = {};
export default function App() {
const [currentEmployee, setCurrentEmployee] = useState(defaultCurrentEmployee);
const [popupVisible, setPopupVisible] = useState(false);
const [positionOf, setPositionOf] = useState('');
const showInfo = useCallback((employee: EmployeeItemProps['employee']) => {
setCurrentEmployee(employee);
setPositionOf(`#image${employee.ID}`);
setPopupVisible(true);
}, [setCurrentEmployee, setPositionOf, setPopupVisible]);
const hideInfo = useCallback(() => {
setCurrentEmployee({});
setPopupVisible(false);
}, [setCurrentEmployee, setPopupVisible]);
const sendEmail = useCallback(() => {
const message = `Email is sent to ${currentEmployee.FirstName} ${currentEmployee.LastName}`;
notify(
{
message,
position: {
my: 'center top',
at: 'center top',
},
},
'success',
3000,
);
}, [currentEmployee]);
const showMoreInfo = useCallback(() => {
const message = `More info about ${currentEmployee.FirstName} ${currentEmployee.LastName}`;
notify(
{
message,
position: {
my: 'center top',
at: 'center top',
},
},
'success',
3000,
);
}, [currentEmployee]);
const getInfoButtonOptions = useMemo(() => ({
text: 'More info',
onClick: showMoreInfo,
}), [showMoreInfo]);
const getEmailButtonOptions = useMemo(() => ({
icon: 'email',
stylingMode: 'contained',
text: 'Send',
onClick: sendEmail,
}), [sendEmail]);
const getCloseButtonOptions = useMemo(() => ({
text: 'Close',
stylingMode: 'outlined',
type: 'normal',
onClick: hideInfo,
}), [hideInfo]);
const getItems = useCallback(() => employees.map((employee) => (
<li key={employee.ID}>
<EmployeeItem employee={employee} showInfo={showInfo} />
</li>
)), [showInfo]);
return (
<div id="container">
<div className="header">Employees</div>
<ul>{getItems()}</ul>
<Popup
visible={popupVisible}
onHiding={hideInfo}
dragEnabled={false}
hideOnOutsideClick={true}
showCloseButton={false}
showTitle={true}
title="Information"
container=".dx-viewport"
width={300}
height={280}
>
<Position at="bottom" my="center" of={positionOf} collision="fit" />
<ToolbarItem
widget="dxButton"
toolbar="top"
locateInMenu="always"
options={getInfoButtonOptions}
/>
<ToolbarItem
widget="dxButton"
toolbar="bottom"
location="before"
options={getEmailButtonOptions}
/>
<ToolbarItem
widget="dxButton"
toolbar="bottom"
location="after"
options={getCloseButtonOptions}
/>
<p>
Full Name:
<span>{currentEmployee.FirstName}</span>
<span>{currentEmployee.LastName}</span>
</p>
<p>
Birth Date: <span>{currentEmployee.BirthDate}</span>
</p>
<p>
Address: <span>{currentEmployee.Address}</span>
</p>
<p>
Hire Date: <span>{currentEmployee.HireDate}</span>
</p>
<p>
Position: <span>{currentEmployee.Position}</span>
</p>
</Popup>
</div>
);
}
xxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxx
Show and Hide the Popup
Bind the visible property to a Boolean variable (popupVisible
in this demo). Next, implement the showInfo(employee)
method to set this Boolean variable to true
. This causes the Popup to appear. To close a Popup, choose one of the following options:
-
Built-in close button
Enable the showCloseButton property to display the Close button in a Popup's top toolbar. -
Custom close button
This demo shows how to add custom buttons to a Popup. One of these buttons uses an onClick handler to set thepopupVisible
variable tofalse
, causing the Popup to disappear. Refer to the next section (Configure the Popup) to learn how you can populate a popup with custom controls. -
On outside click
Enable the hideOnOutsideClick property to allow users to hide the Popup by clicking outside the component.
Configure the Popup
The Popup inner area is divided into three parts:
-
Top toolbar
-
Predefined
Set showTitle totrue
and use the title property to specify the caption. The Close button will appear if you do not disable the showCloseButton property. -
Custom
Add toolbarItems markup and set each item's toolbar property totop
. If you want to display an item in the overflow menu, as shown in this demo, set the item's locateInMenu property toalways
. You can also assignnever
to this property to keep the item outside the overflow menu, or you can assignauto
to hide the item in the menu if the Popup's width decreases.
-
-
Content
To populate the Popup with content, add markup inside the component. -
Bottom toolbar
To enable the bottom toolbar, declare toolbarItems in the markup as shown in this demo. Set each item's toolbar property tobottom
. To learn more about toolbar configuration, refer to the following tutorial: Getting Started with Toolbar
Resize and Position
To specify Popup size, use the height and width properties.
In this demo, each Popup's location is relative to the image. The code specifies the my, at, and of properties of the position object. The configuration in the demo reads as follows: "place my center
side at the bottom
side of the #image${employee.ID}
element."
Use the container property to select the container in which you want to render the Popup. If you set the container property to an element on the page, the shading applies to this element.
Turn on the dragEnabled option to allow users to move a Popup around the page.