Alerts and Prompts (React)

The Popup control can be used to implement static methods for showing alert and prompt dialogs. This sample lets you configure the Popup content and modify the style also.

Learn about Input Controls | Popup API Reference

This example uses React.

import 'bootstrap.css'; import '@mescius/wijmo.styles/wijmo.css'; import ReactDOM from 'react-dom/client'; import React, { useState } from 'react'; import useEvent from 'react-use-event-hook'; import * as wjInput from '@mescius/wijmo.react.input'; import './app.css'; function App() { const [thePopup, setThePopup] = useState(); const [itemSource, setItemSource] = useState(['Alert', 'Prompt']); const [small, setSmall] = useState(false); const [clsDialogText, setClsDialogText] = useState('modal-dialog'); const [clsHeaderText, setClsHeaderText] = useState('modal-header'); const [headerText, setHeaderText] = useState('Header'); const [clsBodyText, setClsBodyText] = useState('modal-body'); const [bodyText, setBodyText] = useState('Dialog message.'); const [clsInputText, setClsInputText] = useState('form-control'); const [clsFooterText, setClsFooterText] = useState('modal-footer'); const [clsOKText, setClsOKText] = useState('btn btn-primary'); const [okText, setOkText] = useState('OK'); const [clsCancelText, setClsCancelText] = useState('btn btn-default'); const [cancelText, setCancelText] = useState('Cancel'); const [typeText, setTypeText] = useState('Alert'); const initPopup = useEvent((popup) => { setThePopup(popup); }); const showAlert = useEvent((popup) => { popup.show(true, (sender) => { alert('you entered: ' + sender.dialogResult); }); }); const showPrompt = useEvent((popup) => { popup.show(true, (sender) => { let result = sender.dialogResult && sender.dialogResult.indexOf('ok') > -1 ? popup.hostElement.querySelector('input').value : null; alert('you entered: ' + result); }); }); const textChanged = useEvent((combo) => { switch (combo.hostElement.id) { case "clsHeader": setClsHeaderText(combo.text); break; case "header": setHeaderText(combo.text); break; case "clsBody": setClsBodyText(combo.text); break; case "body": setBodyText(combo.text); break; case "clsInput": setClsInputText(combo.text); break; case "clsFooter": setClsFooterText(combo.text); break; case "clsOK": setClsOKText(combo.text); break; case "ok": setOkText(combo.text); break; case "clsCancel": setClsCancelText(combo.text); break; case "cancel": setCancelText(combo.text); break; case "type": setTypeText(combo.text); break; } }); const updateSmallStatus = (target) => { setSmall(target.checked); }; return (<main className="container-fluid"> <wjInput.Popup style={{ width: small ? '20%' : '40%' }} className={[clsDialogText || 'wj-dialog', 'wj-popup'].join(' ')} role="dialog" initialized={initPopup}> <div className={clsHeaderText || 'wj-dialog-header'}> <h4>{headerText}</h4> </div> <div className={clsBodyText || 'wj-dialog-body'}> <p>{bodyText}</p> {(typeText == 'Prompt') ? (<input className={clsInputText || 'form-control'}></input>) : null} </div> <div className={clsFooterText || 'wj-dialog-footer'}> <button className={[clsOKText || 'wj-btn', ' wj-hide-ok'].join(' ')}>{okText || "OK"}</button> <button className={[clsCancelText || 'wj-btn', 'wj-hide'].join(' ')}>{cancelText || "Cancel"}</button> </div> </wjInput.Popup> <div className="form-group"> <label htmlFor="btnShow">Show</label> <button id="btnShow" className="btn btn-primary" onClick={e => typeText == 'Alert' ? showAlert(thePopup) : showPrompt(thePopup)}> Show {typeText} </button> </div> <div className="row"> <div className="col-xs-6"> <div className="form-group"> <label htmlFor="type">Type</label> <wjInput.ComboBox id="type" itemsSource={itemSource} selectedIndexChanged={textChanged}> </wjInput.ComboBox> </div> <div className="form-group"> <label htmlFor="header">Header</label> <wjInput.ComboBox id="header" text={headerText} textChanged={textChanged}> </wjInput.ComboBox> </div> <div className="form-group"> <label htmlFor="body">Body</label> <wjInput.ComboBox id="body" text={bodyText} textChanged={textChanged}> </wjInput.ComboBox> </div> <div className="form-group"> <label htmlFor="small">Small</label> <input id="small" type="checkbox" defaultChecked={false} onChange={e => updateSmallStatus(e.target)}/> </div> <div className="form-group"> <label htmlFor="ok">OK Text</label> <wjInput.ComboBox id="ok" text={okText} textChanged={textChanged}> </wjInput.ComboBox> </div> <div className="form-group"> <label htmlFor="cancel">Cancel Text</label> <wjInput.ComboBox id="cancel" text={cancelText} textChanged={textChanged}> </wjInput.ComboBox> </div> </div> <div className="col-xs-6"> <div className="form-group"> <label htmlFor="clsDialog">Dialog Class</label> <wjInput.ComboBox id="clsDialog" text={clsDialogText} textChanged={textChanged}> </wjInput.ComboBox> </div> <div className="form-group"> <label htmlFor="clsHeader">Header Class</label> <wjInput.ComboBox id="clsHeader" text={clsHeaderText} textChanged={textChanged}> </wjInput.ComboBox> </div> <div className="form-group"> <label htmlFor="clsBody">Body Class</label> <wjInput.ComboBox id="clsBody" text={clsBodyText} textChanged={textChanged}> </wjInput.ComboBox> </div> <div className="form-group"> <label htmlFor="clsInput">Input Class</label> <wjInput.ComboBox id="clsInput" text={clsInputText} textChanged={textChanged}> </wjInput.ComboBox> </div> <div className="form-group"> <label htmlFor="clsFooter">Footer Class</label> <wjInput.ComboBox id="clsFooter" text={clsFooterText} textChanged={textChanged}> </wjInput.ComboBox> </div> <div className="form-group"> <label htmlFor="clsOK">OK Class</label> <wjInput.ComboBox id="clsOK" text={clsOKText} textChanged={textChanged}> </wjInput.ComboBox> </div> <div className="form-group"> <label htmlFor="clsCancel">Cancel Class</label> <wjInput.ComboBox id="clsCancel" text={clsCancelText} textChanged={textChanged}> </wjInput.ComboBox> </div> </div> </div> </main>); } const container = document.getElementById('app'); if (container) { const root = ReactDOM.createRoot(container); root.render(<App />); }
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>MESCIUS Wijmo Popup Alerts and Prompts</title> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <!-- SystemJS --> <script src="https://cdnjs.cloudflare.com/ajax/libs/systemjs/0.19.40/system.src.js" integrity="sha512-G6mEj6h18+m3MvzdviSDfPle/TfH0//cXcB33AKlNR/Rha0yQsKefDZKRTkIZos97HEGq2JMV1RT5ybMoQ3WsQ==" crossorigin="anonymous"></script> <script src="systemjs.config.js"></script> <script> System.import('./src/app'); </script> </head> <body> <div id="app"></div> </body> </html>
label { width: 90px; text-align: right; margin-right: 6px; } .wj-combobox { width: 140px; }
(function (global) { window.process = { env: { NODE_ENV: "production" } } System.config({ transpiler: 'plugin-babel', babelOptions: { es2015: true, react: true }, meta: { '*.css': { loader: 'css' } }, paths: { // paths serve as alias 'npm:': 'node_modules/' }, // map tells the System loader where to look for things map: { 'jszip': 'npm:jszip/dist/jszip.js', '@mescius/wijmo': 'npm:@mescius/wijmo/index.js', '@mescius/wijmo.input': 'npm:@mescius/wijmo.input/index.js', '@mescius/wijmo.styles': 'npm:@mescius/wijmo.styles', '@mescius/wijmo.cultures': 'npm:@mescius/wijmo.cultures', '@mescius/wijmo.chart': 'npm:@mescius/wijmo.chart/index.js', '@mescius/wijmo.chart.analytics': 'npm:@mescius/wijmo.chart.analytics/index.js', '@mescius/wijmo.chart.animation': 'npm:@mescius/wijmo.chart.animation/index.js', '@mescius/wijmo.chart.annotation': 'npm:@mescius/wijmo.chart.annotation/index.js', '@mescius/wijmo.chart.finance': 'npm:@mescius/wijmo.chart.finance/index.js', '@mescius/wijmo.chart.finance.analytics': 'npm:@mescius/wijmo.chart.finance.analytics/index.js', '@mescius/wijmo.chart.hierarchical': 'npm:@mescius/wijmo.chart.hierarchical/index.js', '@mescius/wijmo.chart.interaction': 'npm:@mescius/wijmo.chart.interaction/index.js', '@mescius/wijmo.chart.radar': 'npm:@mescius/wijmo.chart.radar/index.js', '@mescius/wijmo.chart.render': 'npm:@mescius/wijmo.chart.render/index.js', '@mescius/wijmo.chart.webgl': 'npm:@mescius/wijmo.chart.webgl/index.js', '@mescius/wijmo.chart.map': 'npm:@mescius/wijmo.chart.map/index.js', '@mescius/wijmo.gauge': 'npm:@mescius/wijmo.gauge/index.js', '@mescius/wijmo.grid': 'npm:@mescius/wijmo.grid/index.js', '@mescius/wijmo.grid.detail': 'npm:@mescius/wijmo.grid.detail/index.js', '@mescius/wijmo.grid.filter': 'npm:@mescius/wijmo.grid.filter/index.js', '@mescius/wijmo.grid.search': 'npm:@mescius/wijmo.grid.search/index.js', '@mescius/wijmo.grid.style': 'npm:@mescius/wijmo.grid.style/index.js', '@mescius/wijmo.grid.grouppanel': 'npm:@mescius/wijmo.grid.grouppanel/index.js', '@mescius/wijmo.grid.multirow': 'npm:@mescius/wijmo.grid.multirow/index.js', '@mescius/wijmo.grid.transposed': 'npm:@mescius/wijmo.grid.transposed/index.js', '@mescius/wijmo.grid.transposedmultirow': 'npm:@mescius/wijmo.grid.transposedmultirow/index.js', '@mescius/wijmo.grid.pdf': 'npm:@mescius/wijmo.grid.pdf/index.js', '@mescius/wijmo.grid.sheet': 'npm:@mescius/wijmo.grid.sheet/index.js', '@mescius/wijmo.grid.xlsx': 'npm:@mescius/wijmo.grid.xlsx/index.js', '@mescius/wijmo.grid.selector': 'npm:@mescius/wijmo.grid.selector/index.js', '@mescius/wijmo.grid.cellmaker': 'npm:@mescius/wijmo.grid.cellmaker/index.js', '@mescius/wijmo.grid.immutable': 'npm:@mescius/wijmo.grid.immutable/index.js', '@mescius/wijmo.touch': 'npm:@mescius/wijmo.touch/index.js', '@mescius/wijmo.cloud': 'npm:@mescius/wijmo.cloud/index.js', '@mescius/wijmo.nav': 'npm:@mescius/wijmo.nav/index.js', '@mescius/wijmo.odata': 'npm:@mescius/wijmo.odata/index.js', '@mescius/wijmo.olap': 'npm:@mescius/wijmo.olap/index.js', '@mescius/wijmo.rest': 'npm:@mescius/wijmo.rest/index.js', '@mescius/wijmo.pdf': 'npm:@mescius/wijmo.pdf/index.js', '@mescius/wijmo.pdf.security': 'npm:@mescius/wijmo.pdf.security/index.js', '@mescius/wijmo.viewer': 'npm:@mescius/wijmo.viewer/index.js', '@mescius/wijmo.xlsx': 'npm:@mescius/wijmo.xlsx/index.js', '@mescius/wijmo.undo': 'npm:@mescius/wijmo.undo/index.js', '@mescius/wijmo.interop.grid': 'npm:@mescius/wijmo.interop.grid/index.js', '@mescius/wijmo.barcode': 'npm:@mescius/wijmo.barcode/index.js', '@mescius/wijmo.barcode.common': 'npm:@mescius/wijmo.barcode.common/index.js', '@mescius/wijmo.barcode.composite': 'npm:@mescius/wijmo.barcode.composite/index.js', '@mescius/wijmo.barcode.specialized': 'npm:@mescius/wijmo.barcode.specialized/index.js', "@mescius/wijmo.react.chart.analytics": "npm:@mescius/wijmo.react.chart.analytics/index.js", "@mescius/wijmo.react.chart.animation": "npm:@mescius/wijmo.react.chart.animation/index.js", "@mescius/wijmo.react.chart.annotation": "npm:@mescius/wijmo.react.chart.annotation/index.js", "@mescius/wijmo.react.chart.finance.analytics": "npm:@mescius/wijmo.react.chart.finance.analytics/index.js", "@mescius/wijmo.react.chart.finance": "npm:@mescius/wijmo.react.chart.finance/index.js", "@mescius/wijmo.react.chart.hierarchical": "npm:@mescius/wijmo.react.chart.hierarchical/index.js", "@mescius/wijmo.react.chart.interaction": "npm:@mescius/wijmo.react.chart.interaction/index.js", "@mescius/wijmo.react.chart.radar": "npm:@mescius/wijmo.react.chart.radar/index.js", "@mescius/wijmo.react.chart": "npm:@mescius/wijmo.react.chart/index.js", "@mescius/wijmo.react.core": "npm:@mescius/wijmo.react.core/index.js", '@mescius/wijmo.react.chart.map': 'npm:@mescius/wijmo.react.chart.map/index.js', "@mescius/wijmo.react.gauge": "npm:@mescius/wijmo.react.gauge/index.js", "@mescius/wijmo.react.grid.detail": "npm:@mescius/wijmo.react.grid.detail/index.js", "@mescius/wijmo.react.grid.filter": "npm:@mescius/wijmo.react.grid.filter/index.js", "@mescius/wijmo.react.grid.grouppanel": "npm:@mescius/wijmo.react.grid.grouppanel/index.js", '@mescius/wijmo.react.grid.search': 'npm:@mescius/wijmo.react.grid.search/index.js', "@mescius/wijmo.react.grid.multirow": "npm:@mescius/wijmo.react.grid.multirow/index.js", "@mescius/wijmo.react.grid.sheet": "npm:@mescius/wijmo.react.grid.sheet/index.js", '@mescius/wijmo.react.grid.transposed': 'npm:@mescius/wijmo.react.grid.transposed/index.js', '@mescius/wijmo.react.grid.transposedmultirow': 'npm:@mescius/wijmo.react.grid.transposedmultirow/index.js', '@mescius/wijmo.react.grid.immutable': 'npm:@mescius/wijmo.react.grid.immutable/index.js', "@mescius/wijmo.react.grid": "npm:@mescius/wijmo.react.grid/index.js", "@mescius/wijmo.react.input": "npm:@mescius/wijmo.react.input/index.js", "@mescius/wijmo.react.olap": "npm:@mescius/wijmo.react.olap/index.js", "@mescius/wijmo.react.viewer": "npm:@mescius/wijmo.react.viewer/index.js", "@mescius/wijmo.react.nav": "npm:@mescius/wijmo.react.nav/index.js", "@mescius/wijmo.react.base": "npm:@mescius/wijmo.react.base/index.js", '@mescius/wijmo.react.barcode.common': 'npm:@mescius/wijmo.react.barcode.common/index.js', '@mescius/wijmo.react.barcode.composite': 'npm:@mescius/wijmo.react.barcode.composite/index.js', '@mescius/wijmo.react.barcode.specialized': 'npm:@mescius/wijmo.react.barcode.specialized/index.js', 'jszip': 'npm:jszip/dist/jszip.js', 'react': 'npm:react/index.js', 'react-dom': 'npm:react-dom/index.js', 'react-dom/client': 'npm:react-dom/client.js', "scheduler": "npm:scheduler/index.js", 'redux': 'npm:redux/dist/redux.min.js', 'react-redux': 'npm:react-redux/dist/react-redux.min.js', 'bootstrap.css': 'npm:bootstrap/dist/css/bootstrap.min.css', 'css': 'npm:systemjs-plugin-css/css.js', 'plugin-babel': 'npm:systemjs-plugin-babel/plugin-babel.js', 'systemjs-babel-build':'npm:systemjs-plugin-babel/systemjs-babel-browser.js', "react-use-event-hook": "npm:react-use-event-hook/dist/esm/useEvent.js", }, // packages tells the System loader how to load when no filename and/or no extension packages: { src: { defaultExtension: 'jsx' }, "node_modules": { defaultExtension: 'js' }, } }); })(this);