macoslinuxwindowsinboxwhatsappicloudtweetdeckhipchattelegramhangoutsslackgmailskypefacebook-workplaceoutlookemailmicrosoft-teamsdiscordmessengercustom-services
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1002 lines
34 KiB
1002 lines
34 KiB
9 years ago
|
// @define Ext.MessageBox, Ext.Msg
|
||
|
|
||
|
/**
|
||
|
* Utility class for generating different styles of message boxes. The singleton instance, Ext.MessageBox
|
||
|
* alias `Ext.Msg` can also be used.
|
||
|
*
|
||
|
* Note that a MessageBox is asynchronous. Unlike a regular JavaScript `alert` (which will halt
|
||
|
* browser execution), showing a MessageBox will not cause the code to stop. For this reason, if you have code
|
||
|
* that should only run *after* some user feedback from the MessageBox, you must use a callback function
|
||
|
* (see the `function` parameter for {@link #method-show} for more details).
|
||
|
*
|
||
|
* Basic alert
|
||
|
*
|
||
|
* @example
|
||
|
* Ext.Msg.alert('Status', 'Changes saved successfully.');
|
||
|
*
|
||
|
* Prompt for user data and process the result using a callback
|
||
|
*
|
||
|
* @example
|
||
|
* Ext.Msg.prompt('Name', 'Please enter your name:', function(btn, text){
|
||
|
* if (btn == 'ok'){
|
||
|
* // process text value and close...
|
||
|
* }
|
||
|
* });
|
||
|
*
|
||
|
* Show a dialog using config options
|
||
|
*
|
||
|
* @example
|
||
|
* Ext.Msg.show({
|
||
|
* title:'Save Changes?',
|
||
|
* message: 'You are closing a tab that has unsaved changes. Would you like to save your changes?',
|
||
|
* buttons: Ext.Msg.YESNOCANCEL,
|
||
|
* icon: Ext.Msg.QUESTION,
|
||
|
* fn: function(btn) {
|
||
|
* if (btn === 'yes') {
|
||
|
* console.log('Yes pressed');
|
||
|
* } else if (btn === 'no') {
|
||
|
* console.log('No pressed');
|
||
|
* } else {
|
||
|
* console.log('Cancel pressed');
|
||
|
* }
|
||
|
* }
|
||
|
* });
|
||
|
*
|
||
|
* Showing Ext.Msg while it's already shown will cause the visible instance to be
|
||
|
* overwritten with the newly passed config. While this may be the desired outcome, you
|
||
|
* can also create a new MessageBox that can exist alongside the Ext.Msg
|
||
|
* singleton instance.
|
||
|
*
|
||
|
* @example
|
||
|
* var myMsg = Ext.create('Ext.window.MessageBox', {
|
||
|
* // set closeAction to 'destroy' if this instance is not
|
||
|
* // intended to be reused by the application
|
||
|
* closeAction: 'destroy'
|
||
|
* }).show({
|
||
|
* title: 'Custom MessageBox Instance',
|
||
|
* message: 'I can exist along with Ext.Msg'
|
||
|
* });
|
||
|
*
|
||
|
* Ext.Msg.alert('Overlapping', 'Ext.Msg instance');
|
||
|
*/
|
||
|
Ext.define('Ext.window.MessageBox', {
|
||
|
extend: 'Ext.window.Window',
|
||
|
|
||
|
requires: [
|
||
|
'Ext.toolbar.Toolbar',
|
||
|
'Ext.form.field.Text',
|
||
|
'Ext.form.field.TextArea',
|
||
|
'Ext.button.Button',
|
||
|
'Ext.layout.container.Anchor',
|
||
|
'Ext.layout.container.HBox',
|
||
|
'Ext.ProgressBar'
|
||
|
],
|
||
|
|
||
|
alias: 'widget.messagebox',
|
||
|
|
||
|
/**
|
||
|
* @property
|
||
|
* Button config that displays a single OK button
|
||
|
*/
|
||
|
OK : 1,
|
||
|
/**
|
||
|
* @property
|
||
|
* Button config that displays a single Yes button
|
||
|
*/
|
||
|
YES : 2,
|
||
|
/**
|
||
|
* @property
|
||
|
* Button config that displays a single No button
|
||
|
*/
|
||
|
NO : 4,
|
||
|
/**
|
||
|
* @property
|
||
|
* Button config that displays a single Cancel button
|
||
|
*/
|
||
|
CANCEL : 8,
|
||
|
/**
|
||
|
* @property
|
||
|
* Button config that displays OK and Cancel buttons
|
||
|
*/
|
||
|
OKCANCEL : 9,
|
||
|
/**
|
||
|
* @property
|
||
|
* Button config that displays Yes and No buttons
|
||
|
*/
|
||
|
YESNO : 6,
|
||
|
/**
|
||
|
* @property
|
||
|
* Button config that displays Yes, No and Cancel buttons
|
||
|
*/
|
||
|
YESNOCANCEL : 14,
|
||
|
/**
|
||
|
* @property
|
||
|
* The CSS class that provides the INFO icon image
|
||
|
*/
|
||
|
INFO : Ext.baseCSSPrefix + 'message-box-info',
|
||
|
/**
|
||
|
* @property
|
||
|
* The CSS class that provides the WARNING icon image
|
||
|
*/
|
||
|
WARNING : Ext.baseCSSPrefix + 'message-box-warning',
|
||
|
/**
|
||
|
* @property
|
||
|
* The CSS class that provides the QUESTION icon image
|
||
|
*/
|
||
|
QUESTION : Ext.baseCSSPrefix + 'message-box-question',
|
||
|
/**
|
||
|
* @property
|
||
|
* The CSS class that provides the ERROR icon image
|
||
|
*/
|
||
|
ERROR : Ext.baseCSSPrefix + 'message-box-error',
|
||
|
|
||
|
// hide it by offsets. Windows are hidden on render by default.
|
||
|
hideMode: 'offsets',
|
||
|
closeAction: 'hide',
|
||
|
resizable: false,
|
||
|
scrollable: true,
|
||
|
title: ' ',
|
||
|
|
||
|
defaultMinWidth: 250,
|
||
|
defaultMaxWidth: 600,
|
||
|
defaultMinHeight: 110,
|
||
|
defaultMaxHeight: 500,
|
||
|
|
||
|
// Forcibly set these to null on the prototype to override anything set higher in
|
||
|
// the hierarchy
|
||
|
minWidth: null,
|
||
|
maxWidth: null,
|
||
|
minHeight: null,
|
||
|
maxHeight: null,
|
||
|
constrain: true,
|
||
|
|
||
|
cls: [Ext.baseCSSPrefix + 'message-box', Ext.baseCSSPrefix + 'hidden-offsets'],
|
||
|
|
||
|
layout: {
|
||
|
type: 'vbox',
|
||
|
align: 'stretch'
|
||
|
},
|
||
|
|
||
|
// We want to shrinkWrap around all docked items
|
||
|
shrinkWrapDock: true,
|
||
|
|
||
|
/**
|
||
|
* @property
|
||
|
* The default height in pixels of the message box's multiline textarea if displayed.
|
||
|
*/
|
||
|
defaultTextHeight : 75,
|
||
|
/**
|
||
|
* @property
|
||
|
* The minimum width in pixels of the message box if it is a progress-style dialog. This is useful
|
||
|
* for setting a different minimum width than text-only dialogs may need.
|
||
|
*/
|
||
|
minProgressWidth : 250,
|
||
|
/**
|
||
|
* @property
|
||
|
* The minimum width in pixels of the message box if it is a prompt dialog. This is useful
|
||
|
* for setting a different minimum width than text-only dialogs may need.
|
||
|
*/
|
||
|
minPromptWidth: 250,
|
||
|
//<locale type="object">
|
||
|
/**
|
||
|
* @property
|
||
|
* An object containing the default button text strings that can be overriden for localized language support.
|
||
|
* Supported properties are: ok, cancel, yes and no. Generally you should include a locale-specific
|
||
|
* resource file for handling language support across the framework.
|
||
|
* Customize the default text like so:
|
||
|
*
|
||
|
* Ext.window.MessageBox.buttonText.yes = "oui"; //french
|
||
|
*/
|
||
|
buttonText: {
|
||
|
ok: 'OK',
|
||
|
yes: 'Yes',
|
||
|
no: 'No',
|
||
|
cancel: 'Cancel'
|
||
|
},
|
||
|
//</locale>
|
||
|
|
||
|
buttonIds: [
|
||
|
'ok', 'yes', 'no', 'cancel'
|
||
|
],
|
||
|
|
||
|
//<locale type="object">
|
||
|
titleText: {
|
||
|
confirm: 'Confirm',
|
||
|
prompt: 'Prompt',
|
||
|
wait: 'Loading...',
|
||
|
alert: 'Attention'
|
||
|
},
|
||
|
//</locale>
|
||
|
|
||
|
baseIconCls: Ext.baseCSSPrefix + 'message-box-icon',
|
||
|
|
||
|
ariaRole: 'alertdialog',
|
||
|
|
||
|
makeButton: function(btnIdx) {
|
||
|
var btnId = this.buttonIds[btnIdx];
|
||
|
return new Ext.button.Button({
|
||
|
handler: this.btnCallback,
|
||
|
itemId: btnId,
|
||
|
scope: this,
|
||
|
text: this.buttonText[btnId],
|
||
|
minWidth: 75
|
||
|
});
|
||
|
},
|
||
|
|
||
|
btnCallback: function(btn, event) {
|
||
|
var me = this,
|
||
|
value,
|
||
|
field;
|
||
|
|
||
|
// If this is caused by a keydown event (eg: SPACE on a Button), then the
|
||
|
// hide will throw focus back to the previously focused element which will
|
||
|
// then recieve an unexpected keyup event.
|
||
|
// So defer callback handling until the upcoming keyup event.
|
||
|
if (event && event.type === 'keydown' && !event.isSpecialKey()) {
|
||
|
event.getTarget(null, null, true).on({
|
||
|
keyup: function(e) {
|
||
|
me.btnCallback(btn, e);
|
||
|
},
|
||
|
single: true
|
||
|
});
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (me.cfg.prompt || me.cfg.multiline) {
|
||
|
if (me.cfg.multiline) {
|
||
|
field = me.textArea;
|
||
|
} else {
|
||
|
field = me.textField;
|
||
|
}
|
||
|
value = field.getValue();
|
||
|
field.reset();
|
||
|
}
|
||
|
|
||
|
// Component.onHide blurs the active element if the Component contains the active element
|
||
|
me.hide();
|
||
|
me.userCallback(btn.itemId, value, me.cfg);
|
||
|
},
|
||
|
|
||
|
hide: function() {
|
||
|
var me = this,
|
||
|
cls = me.cfg ? me.cfg.cls : '';
|
||
|
|
||
|
me.progressBar.reset();
|
||
|
if (cls) {
|
||
|
me.removeCls(cls);
|
||
|
}
|
||
|
me.callParent(arguments);
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* @private
|
||
|
*/
|
||
|
constructor: function(cfg) {
|
||
|
var me = this;
|
||
|
|
||
|
me.callParent(arguments);
|
||
|
|
||
|
// set the default min/max/Width/Height to the initially configured min/max/Width/Height
|
||
|
// so that it will be used as the default when reconfiguring.
|
||
|
me.minWidth = me.defaultMinWidth = (me.minWidth || me.defaultMinWidth);
|
||
|
me.maxWidth = me.defaultMaxWidth = (me.maxWidth || me.defaultMaxWidth);
|
||
|
me.minHeight = me.defaultMinHeight = (me.minHeight || me.defaultMinHeight);
|
||
|
me.maxHeight = me.defaultMaxHeight = (me.maxHeight || me.defaultMaxHeight);
|
||
|
},
|
||
|
|
||
|
initComponent: function(cfg) {
|
||
|
var me = this,
|
||
|
baseId = me.id,
|
||
|
i, button;
|
||
|
|
||
|
// A title or iconCls could have been passed in the config to the constructor.
|
||
|
me.title = me.title || ' ';
|
||
|
me.iconCls = me.iconCls || '';
|
||
|
|
||
|
me.topContainer = new Ext.container.Container({
|
||
|
layout: 'hbox',
|
||
|
padding: 10,
|
||
|
style: {
|
||
|
overflow: 'hidden'
|
||
|
},
|
||
|
items: [
|
||
|
me.iconComponent = new Ext.Component({
|
||
|
cls: me.baseIconCls
|
||
|
}),
|
||
|
me.promptContainer = new Ext.container.Container({
|
||
|
flex: 1,
|
||
|
layout: {
|
||
|
type: 'vbox',
|
||
|
align: 'stretch'
|
||
|
},
|
||
|
items: [
|
||
|
me.msg = new Ext.Component({
|
||
|
id: baseId + '-msg',
|
||
|
cls: me.baseCls + '-text'
|
||
|
}),
|
||
|
me.textField = new Ext.form.field.Text({
|
||
|
id: baseId + '-textfield',
|
||
|
enableKeyEvents: true,
|
||
|
listeners: {
|
||
|
keydown: me.onPromptKey,
|
||
|
scope: me
|
||
|
}
|
||
|
}),
|
||
|
me.textArea = new Ext.form.field.TextArea({
|
||
|
id: baseId + '-textarea',
|
||
|
height: 75
|
||
|
})
|
||
|
]
|
||
|
})
|
||
|
]
|
||
|
});
|
||
|
|
||
|
me.progressBar = new Ext.ProgressBar({
|
||
|
id: baseId + '-progressbar',
|
||
|
margin: '0 10 10 10'
|
||
|
});
|
||
|
|
||
|
me.items = [me.topContainer, me.progressBar];
|
||
|
|
||
|
// Create the buttons based upon passed bitwise config
|
||
|
me.msgButtons = [];
|
||
|
for (i = 0; i < 4; i++) {
|
||
|
button = me.makeButton(i);
|
||
|
me.msgButtons[button.itemId] = button;
|
||
|
me.msgButtons.push(button);
|
||
|
}
|
||
|
me.bottomTb = new Ext.toolbar.Toolbar({
|
||
|
id: baseId + '-toolbar',
|
||
|
ui: 'footer',
|
||
|
dock: 'bottom',
|
||
|
layout: {
|
||
|
pack: 'center'
|
||
|
},
|
||
|
items: [
|
||
|
me.msgButtons[0],
|
||
|
me.msgButtons[1],
|
||
|
me.msgButtons[2],
|
||
|
me.msgButtons[3]
|
||
|
]
|
||
|
});
|
||
|
me.dockedItems = [me.bottomTb];
|
||
|
me.on('close', me.onClose, me);
|
||
|
me.callParent();
|
||
|
},
|
||
|
|
||
|
onClose: function(){
|
||
|
var btn = this.header.child('[type=close]');
|
||
|
// Give a temporary itemId so it can act like the cancel button
|
||
|
btn.itemId = 'cancel';
|
||
|
this.btnCallback(btn);
|
||
|
delete btn.itemId;
|
||
|
},
|
||
|
|
||
|
onPromptKey: function(textField, e) {
|
||
|
var me = this;
|
||
|
|
||
|
if (e.keyCode === e.RETURN || e.keyCode === 10) {
|
||
|
if (me.msgButtons.ok.isVisible()) {
|
||
|
me.msgButtons.ok.handler.call(me, me.msgButtons.ok);
|
||
|
} else if (me.msgButtons.yes.isVisible()) {
|
||
|
me.msgButtons.yes.handler.call(me, me.msgButtons.yes);
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
|
||
|
reconfigure: function(cfg) {
|
||
|
var me = this,
|
||
|
buttons = 0,
|
||
|
hideToolbar = true,
|
||
|
oldButtonText = me.buttonText,
|
||
|
resizer = me.resizer,
|
||
|
header = me.header,
|
||
|
headerCfg = header && !header.isHeader,
|
||
|
message = cfg && (cfg.message || cfg.msg),
|
||
|
resizeTracker, width, height, i, textArea,
|
||
|
textField, msg, progressBar, msgButtons, wait;
|
||
|
|
||
|
// Restore default buttonText before reconfiguring.
|
||
|
me.updateButtonText();
|
||
|
|
||
|
me.cfg = cfg = cfg || {};
|
||
|
|
||
|
wait = cfg.wait;
|
||
|
if (cfg.width) {
|
||
|
width = cfg.width;
|
||
|
}
|
||
|
|
||
|
if (cfg.height) {
|
||
|
height = cfg.height;
|
||
|
}
|
||
|
|
||
|
me.minWidth = cfg.minWidth || me.defaultMinWidth;
|
||
|
me.maxWidth = cfg.maxWidth || me.defaultMaxWidth;
|
||
|
me.minHeight = cfg.minHeight || me.defaultMinHeight;
|
||
|
me.maxHeight = cfg.maxHeight || me.defaultMaxHeight;
|
||
|
|
||
|
if (resizer) {
|
||
|
resizeTracker = resizer.resizeTracker;
|
||
|
resizer.minWidth = resizeTracker.minWidth = me.minWidth;
|
||
|
resizer.maxWidth = resizeTracker.maxWidth = me.maxWidth;
|
||
|
resizer.minHeight = resizeTracker.minHeight = me.minHeight;
|
||
|
resizer.maxHeight = resizeTracker.maxHeight = me.maxHeight;
|
||
|
}
|
||
|
|
||
|
// Default to allowing the Window to take focus.
|
||
|
delete me.defaultFocus;
|
||
|
if (cfg.defaultFocus) {
|
||
|
me.defaultFocus = cfg.defaultFocus;
|
||
|
}
|
||
|
|
||
|
// clear any old animateTarget
|
||
|
me.animateTarget = cfg.animateTarget || undefined;
|
||
|
|
||
|
// Defaults to modal
|
||
|
me.modal = cfg.modal !== false;
|
||
|
|
||
|
// Show the title/icon if a title/iconCls config was passed in the config to either the constructor
|
||
|
// or the show() method. Note that anything passed in the config should win.
|
||
|
//
|
||
|
// Note that if there is no title/iconCls in the config, check the headerCfg and default to the instance
|
||
|
// properties. This works because there are default values defined in initComponent.
|
||
|
me.setTitle(cfg.title || (headerCfg && header.title) || me.title);
|
||
|
me.setIconCls(cfg.iconCls || (headerCfg && header.iconCls) || me.iconCls);
|
||
|
|
||
|
// Extract button configs
|
||
|
if (Ext.isObject(cfg.buttons)) {
|
||
|
me.buttonText = cfg.buttons;
|
||
|
buttons = 0;
|
||
|
} else {
|
||
|
me.buttonText = cfg.buttonText || me.buttonText;
|
||
|
buttons = Ext.isNumber(cfg.buttons) ? cfg.buttons : 0;
|
||
|
}
|
||
|
|
||
|
// Apply custom-configured buttonText
|
||
|
// Infer additional buttons from the specified property names in the buttonText object
|
||
|
buttons = buttons | me.updateButtonText();
|
||
|
|
||
|
// Restore buttonText. Next run of reconfigure will restore to prototype's buttonText
|
||
|
me.buttonText = oldButtonText;
|
||
|
|
||
|
// During the on render, or size resetting layouts, and in subsequent hiding and showing, we need to
|
||
|
// suspend layouts, and flush at the end when the Window's children are at their final visibility.
|
||
|
Ext.suspendLayouts();
|
||
|
me.width = me.height = null;
|
||
|
if (width || height) {
|
||
|
if (width) {
|
||
|
me.setWidth(width);
|
||
|
}
|
||
|
|
||
|
if (height) {
|
||
|
me.setHeight(height);
|
||
|
}
|
||
|
}
|
||
|
me.hidden = false;
|
||
|
if (!me.rendered) {
|
||
|
me.render(Ext.getBody());
|
||
|
}
|
||
|
|
||
|
// Hide or show the close tool
|
||
|
me.closable = cfg.closable !== false && !wait;
|
||
|
|
||
|
// We need to redefine `header` because me.setIconCls() could create a Header instance.
|
||
|
header = me.header;
|
||
|
|
||
|
if (header) {
|
||
|
header.child('[type=close]').setVisible(me.closable);
|
||
|
|
||
|
// Hide or show the header
|
||
|
if (!cfg.title && !me.closable && !cfg.iconCls) {
|
||
|
header.hide();
|
||
|
} else {
|
||
|
header.show();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Default to dynamic drag: drag the window, not a ghost
|
||
|
me.liveDrag = !cfg.proxyDrag;
|
||
|
|
||
|
// wrap the user callback
|
||
|
me.userCallback = Ext.Function.bindCallback(cfg.callback ||cfg.fn || Ext.emptyFn,
|
||
|
cfg.scope || Ext.global);
|
||
|
|
||
|
// Hide or show the icon Component
|
||
|
me.setIcon(cfg.icon);
|
||
|
|
||
|
// Hide or show the message area
|
||
|
msg = me.msg;
|
||
|
if (message) {
|
||
|
msg.setHtml(message);
|
||
|
msg.show();
|
||
|
} else {
|
||
|
msg.hide();
|
||
|
}
|
||
|
|
||
|
// Hide or show the input field
|
||
|
textArea = me.textArea;
|
||
|
textField = me.textField;
|
||
|
if (cfg.prompt || cfg.multiline) {
|
||
|
me.multiline = cfg.multiline;
|
||
|
if (cfg.multiline) {
|
||
|
textArea.setValue(cfg.value);
|
||
|
textArea.setHeight(cfg.defaultTextHeight || me.defaultTextHeight);
|
||
|
textArea.show();
|
||
|
textField.hide();
|
||
|
me.defaultFocus = textArea;
|
||
|
} else {
|
||
|
textField.setValue(cfg.value);
|
||
|
textArea.hide();
|
||
|
textField.show();
|
||
|
me.defaultFocus = textField;
|
||
|
}
|
||
|
} else {
|
||
|
textArea.hide();
|
||
|
textField.hide();
|
||
|
}
|
||
|
|
||
|
// Hide or show the progress bar
|
||
|
progressBar = me.progressBar;
|
||
|
if (cfg.progress || wait) {
|
||
|
progressBar.show();
|
||
|
me.updateProgress(0, cfg.progressText);
|
||
|
if (wait) {
|
||
|
progressBar.wait(wait === true ? cfg.waitConfig : wait);
|
||
|
}
|
||
|
} else {
|
||
|
progressBar.hide();
|
||
|
}
|
||
|
|
||
|
// Hide or show buttons depending on flag value sent.
|
||
|
msgButtons = me.msgButtons;
|
||
|
for (i = 0; i < 4; i++) {
|
||
|
if (buttons & Math.pow(2, i)) {
|
||
|
|
||
|
// Default to focus on the first visible button if focus not already set
|
||
|
if (!me.defaultFocus) {
|
||
|
me.defaultFocus = msgButtons[i];
|
||
|
}
|
||
|
msgButtons[i].show();
|
||
|
hideToolbar = false;
|
||
|
} else {
|
||
|
msgButtons[i].hide();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Hide toolbar if no buttons to show
|
||
|
if (hideToolbar) {
|
||
|
me.bottomTb.hide();
|
||
|
} else {
|
||
|
me.bottomTb.show();
|
||
|
}
|
||
|
Ext.resumeLayouts(true);
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* @private
|
||
|
* Set button text according to current buttonText property object
|
||
|
* @return {Number} The buttons bitwise flag based upon the button IDs specified in the buttonText property.
|
||
|
*/
|
||
|
updateButtonText: function() {
|
||
|
var me = this,
|
||
|
buttonText = me.buttonText,
|
||
|
buttons = 0,
|
||
|
btnId,
|
||
|
btn;
|
||
|
|
||
|
for (btnId in buttonText) {
|
||
|
if (buttonText.hasOwnProperty(btnId)) {
|
||
|
btn = me.msgButtons[btnId];
|
||
|
if (btn) {
|
||
|
if (me.cfg && me.cfg.buttonText) {
|
||
|
buttons = buttons | Math.pow(2, Ext.Array.indexOf(me.buttonIds, btnId));
|
||
|
}
|
||
|
if (btn.text !== buttonText[btnId]) {
|
||
|
btn.setText(buttonText[btnId]);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return buttons;
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Displays a new message box, or reinitializes an existing message box, based on the config options passed in. All
|
||
|
* display functions (e.g. prompt, alert, etc.) on MessageBox call this function internally, although those calls
|
||
|
* are basic shortcuts and do not support all of the config options allowed here.
|
||
|
*
|
||
|
* Example usage:
|
||
|
*
|
||
|
* Ext.Msg.show({
|
||
|
* title: 'Address',
|
||
|
* message: 'Please enter your address:',
|
||
|
* width: 300,
|
||
|
* buttons: Ext.Msg.OKCANCEL,
|
||
|
* multiline: true,
|
||
|
* fn: saveAddress,
|
||
|
* animateTarget: 'addAddressBtn',
|
||
|
* icon: Ext.window.MessageBox.INFO
|
||
|
* });
|
||
|
*
|
||
|
* @param {Object} config The following config options are supported:
|
||
|
*
|
||
|
* @param {String/Ext.dom.Element} config.animateTarget
|
||
|
* An id or Element from which the message box should animate as it opens and closes.
|
||
|
*
|
||
|
* @param {Number} [config.buttons=false]
|
||
|
* A bitwise button specifier consisting of the sum of any of the following constants:
|
||
|
*
|
||
|
* - Ext.MessageBox.OK
|
||
|
* - Ext.MessageBox.YES
|
||
|
* - Ext.MessageBox.NO
|
||
|
* - Ext.MessageBox.CANCEL
|
||
|
*
|
||
|
* Some common combinations have already been predefined:
|
||
|
*
|
||
|
* - Ext.MessageBox.OKCANCEL
|
||
|
* - Ext.MessageBox.YESNO
|
||
|
* - Ext.MessageBox.YESNOCANCEL
|
||
|
*
|
||
|
* Or false to not show any buttons.
|
||
|
*
|
||
|
* This may also be specified as an object hash containing custom button text in the same format as the
|
||
|
* {@link #buttonText} config. Button IDs present as property names will be made visible.
|
||
|
*
|
||
|
* @param {Boolean} config.closable
|
||
|
* False to hide the top-right close button (defaults to true). Note that progress and wait dialogs will ignore this
|
||
|
* property and always hide the close button as they can only be closed programmatically.
|
||
|
*
|
||
|
* @param {String} config.cls
|
||
|
* A custom CSS class to apply to the message box's container element
|
||
|
*
|
||
|
* @param {Number} [config.defaultTextHeight=75]
|
||
|
* The default height in pixels of the message box's multiline textarea if displayed.
|
||
|
*
|
||
|
* @param {Function} config.fn
|
||
|
* A callback function which is called when the dialog is dismissed either by clicking on the configured buttons, or
|
||
|
* on the dialog close button, or by pressing the return button to enter input.
|
||
|
*
|
||
|
* Progress and wait dialogs will ignore this option since they do not respond to user actions and can only be
|
||
|
* closed programmatically, so any required function should be called by the same code after it closes the dialog.
|
||
|
* Parameters passed:
|
||
|
*
|
||
|
* @param {String} config.fn.buttonId The ID of the button pressed, one of:
|
||
|
*
|
||
|
* - ok
|
||
|
* - yes
|
||
|
* - no
|
||
|
* - cancel
|
||
|
*
|
||
|
* @param {String} config.fn.text Value of the input field if either `prompt` or `multiline` is true
|
||
|
* @param {Object} config.fn.opt The config object passed to show.
|
||
|
*
|
||
|
* @param {Object} config.buttonText
|
||
|
* An object containing string properties which override the system-supplied button text values just for this
|
||
|
* invocation. The property names are:
|
||
|
*
|
||
|
* - ok
|
||
|
* - yes
|
||
|
* - no
|
||
|
* - cancel
|
||
|
*
|
||
|
* @param {Object} config.scope
|
||
|
* The scope (`this` reference) in which the function will be executed.
|
||
|
*
|
||
|
* @param {String} config.icon
|
||
|
* A CSS class that provides a background image to be used as the body icon for the dialog.
|
||
|
* One can use a predefined icon class:
|
||
|
*
|
||
|
* - Ext.MessageBox.INFO
|
||
|
* - Ext.MessageBox.WARNING
|
||
|
* - Ext.MessageBox.QUESTION
|
||
|
* - Ext.MessageBox.ERROR
|
||
|
*
|
||
|
* or use just any `'custom-class'`. Defaults to empty string.
|
||
|
*
|
||
|
* @param {String} config.iconCls
|
||
|
* The standard {@link Ext.window.Window#iconCls} to add an optional header icon (defaults to '')
|
||
|
*
|
||
|
* @param {String} config.defaultFocus
|
||
|
* The button to focus when showing the dialog. If not specified, defaults to
|
||
|
* the first visible button.
|
||
|
*
|
||
|
* @param {Number} config.maxWidth
|
||
|
* The maximum width in pixels of the message box (defaults to 600)
|
||
|
*
|
||
|
* @param {Number} config.minWidth
|
||
|
* The minimum width in pixels of the message box (defaults to 100)
|
||
|
*
|
||
|
* @param {Boolean} config.modal
|
||
|
* False to allow user interaction with the page while the message box is displayed (defaults to true)
|
||
|
*
|
||
|
* @param {String} config.message
|
||
|
* A string that will replace the existing message box body text (defaults to the XHTML-compliant non-breaking space
|
||
|
* character ' ')
|
||
|
*
|
||
|
* @param {Boolean} config.multiline
|
||
|
* True to prompt the user to enter multi-line text (defaults to false)
|
||
|
*
|
||
|
* @param {Boolean} config.progress
|
||
|
* True to display a progress bar (defaults to false)
|
||
|
*
|
||
|
* @param {String} config.progressText
|
||
|
* The text to display inside the progress bar if progress = true (defaults to '')
|
||
|
*
|
||
|
* @param {Boolean} config.prompt
|
||
|
* True to prompt the user to enter single-line text (defaults to false)
|
||
|
*
|
||
|
* @param {Boolean} config.proxyDrag
|
||
|
* True to display a lightweight proxy while dragging (defaults to false)
|
||
|
*
|
||
|
* @param {String} config.title
|
||
|
* The title text
|
||
|
*
|
||
|
* @param {String} config.value
|
||
|
* The string value to set into the active textbox element if displayed
|
||
|
*
|
||
|
* @param {Object/Boolean} [config.wait=false]
|
||
|
* `true` to display a progress bar, or a configuration for {@link Ext.ProgressBar#wait}.
|
||
|
*
|
||
|
* @param {Object} config.waitConfig
|
||
|
* A {@link Ext.ProgressBar#wait} config object (applies only if wait = true)
|
||
|
*
|
||
|
* @param {Number} config.width
|
||
|
* The width of the dialog in pixels
|
||
|
*
|
||
|
* @return {Ext.window.MessageBox} this
|
||
|
*/
|
||
|
show: function(cfg) {
|
||
|
var me = this,
|
||
|
visibleFocusables;
|
||
|
|
||
|
cfg = cfg || {};
|
||
|
|
||
|
// If called during global layout suspension, make the call after layout resumption
|
||
|
if (Ext.Component.layoutSuspendCount) {
|
||
|
Ext.on({
|
||
|
resumelayouts: function() {
|
||
|
me.show(cfg);
|
||
|
},
|
||
|
single: true
|
||
|
});
|
||
|
return me;
|
||
|
}
|
||
|
|
||
|
me.reconfigure(cfg);
|
||
|
if (cfg.cls) {
|
||
|
me.addCls(cfg.cls);
|
||
|
}
|
||
|
|
||
|
// Do not steal focus from anything that may be focused if the MessageBox has no visible focusable
|
||
|
// items. For example, a "wait" message box should not get focus.
|
||
|
visibleFocusables = me.query('textfield:not([hidden]),textarea:not([hidden]),button:not([hidden])');
|
||
|
me.preventFocusOnActivate = !visibleFocusables.length;
|
||
|
|
||
|
// Set the flag, so that the parent show method performs the show procedure that we need.
|
||
|
// ie: animation from animTarget, onShow processing and focusing.
|
||
|
me.hidden = true;
|
||
|
me.callParent();
|
||
|
return me;
|
||
|
},
|
||
|
|
||
|
onShow: function() {
|
||
|
this.callParent(arguments);
|
||
|
this.center();
|
||
|
},
|
||
|
|
||
|
updateText: function(text) {
|
||
|
this.msg.setHtml(text);
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Adds the specified icon to the dialog. By default, the class 'x-messagebox-icon' is applied for default
|
||
|
* styling, and the class passed in is expected to supply the background image url. Pass in empty string ('')
|
||
|
* to clear any existing icon. This method must be called before the MessageBox is shown.
|
||
|
* The following built-in icon classes are supported, but you can also pass in a custom class name:
|
||
|
*
|
||
|
* Ext.window.MessageBox.INFO
|
||
|
* Ext.window.MessageBox.WARNING
|
||
|
* Ext.window.MessageBox.QUESTION
|
||
|
* Ext.window.MessageBox.ERROR
|
||
|
*
|
||
|
* @param {String} icon A CSS classname specifying the icon's background image url, or empty string to clear the icon
|
||
|
* @param {Number} [width] The width of the icon. If not specified, the default is used
|
||
|
* @param {Number} [height] The height of the icon. If not specified, the default is used
|
||
|
* @return {Ext.window.MessageBox} this
|
||
|
*/
|
||
|
setIcon : function(icon, width, height) {
|
||
|
var me = this,
|
||
|
iconCmp = me.iconComponent,
|
||
|
cls = me.messageIconCls;
|
||
|
|
||
|
if (cls) {
|
||
|
iconCmp.removeCls(cls);
|
||
|
}
|
||
|
|
||
|
if (icon) {
|
||
|
iconCmp.show();
|
||
|
if (width || height) {
|
||
|
iconCmp.setSize(width || iconCmp.getWidth(), height || iconCmp.getHeight());
|
||
|
}
|
||
|
iconCmp.addCls(Ext.baseCSSPrefix + 'dlg-icon');
|
||
|
iconCmp.addCls(me.messageIconCls = icon);
|
||
|
} else {
|
||
|
iconCmp.removeCls(Ext.baseCSSPrefix + 'dlg-icon');
|
||
|
iconCmp.hide();
|
||
|
}
|
||
|
return me;
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Updates a progress-style message box's text and progress bar. Only relevant on message boxes
|
||
|
* initiated via {@link Ext.window.MessageBox#progress} or {@link Ext.window.MessageBox#wait},
|
||
|
* or by calling {@link Ext.window.MessageBox#method-show} with progress: true.
|
||
|
*
|
||
|
* @param {Number} [value=0] Any number between 0 and 1 (e.g., .5)
|
||
|
* @param {String} [progressText=''] The progress text to display inside the progress bar.
|
||
|
* @param {String} [message] The message box's body text is replaced with the specified string (defaults to undefined
|
||
|
* so that any existing body text will not get overwritten by default unless a new value is passed in)
|
||
|
* @return {Ext.window.MessageBox} this
|
||
|
*/
|
||
|
updateProgress : function(value, progressText, message){
|
||
|
this.progressBar.updateProgress(value, progressText);
|
||
|
if (message){
|
||
|
this.updateText(message);
|
||
|
}
|
||
|
return this;
|
||
|
},
|
||
|
|
||
|
onEsc: function() {
|
||
|
if (this.closable !== false) {
|
||
|
this.callParent(arguments);
|
||
|
}
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Displays a confirmation message box with Yes and No buttons (comparable to JavaScript's confirm).
|
||
|
* If a callback function is passed it will be called after the user clicks either button,
|
||
|
* and the id of the button that was clicked will be passed as the only parameter to the callback
|
||
|
* (could also be the top-right close button, which will always report as "cancel").
|
||
|
*
|
||
|
* @param {String} title The title bar text
|
||
|
* @param {String} message The message box body text
|
||
|
* @param {Function} [fn] The callback function invoked after the message box is closed.
|
||
|
* See {@link #method-show} method for details.
|
||
|
* @param {Object} [scope=window] The scope (`this` reference) in which the callback is executed.
|
||
|
* @return {Ext.window.MessageBox} this
|
||
|
*/
|
||
|
confirm: function(cfg, message, fn, scope) {
|
||
|
if (Ext.isString(cfg)) {
|
||
|
cfg = {
|
||
|
title: cfg,
|
||
|
icon: this.QUESTION,
|
||
|
message: message,
|
||
|
buttons: this.YESNO,
|
||
|
callback: fn,
|
||
|
scope: scope
|
||
|
};
|
||
|
}
|
||
|
return this.show(cfg);
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Displays a message box with OK and Cancel buttons prompting the user to enter some text (comparable to JavaScript's prompt).
|
||
|
* The prompt can be a single-line or multi-line textbox. If a callback function is passed it will be called after the user
|
||
|
* clicks either button, and the id of the button that was clicked (could also be the top-right
|
||
|
* close button, which will always report as "cancel") and the text that was entered will be passed as the two parameters to the callback.
|
||
|
*
|
||
|
* @param {String} title The title bar text
|
||
|
* @param {String} message The message box body text
|
||
|
* @param {Function} [fn] The callback function invoked after the message box is closed.
|
||
|
* See {@link #method-show} method for details.
|
||
|
* @param {Object} [scope=window] The scope (`this` reference) in which the callback is executed.
|
||
|
* @param {Boolean/Number} [multiline=false] True to create a multiline textbox using the defaultTextHeight
|
||
|
* property, or the height in pixels to create the textbox/
|
||
|
* @param {String} [value=''] Default value of the text input element
|
||
|
* @return {Ext.window.MessageBox} this
|
||
|
*/
|
||
|
prompt : function(title, message, fn, scope, multiline, value){
|
||
|
if (Ext.isString(title)) {
|
||
|
title = {
|
||
|
prompt: true,
|
||
|
title: title,
|
||
|
minWidth: this.minPromptWidth,
|
||
|
message: message,
|
||
|
buttons: this.OKCANCEL,
|
||
|
callback: fn,
|
||
|
scope: scope,
|
||
|
multiline: multiline,
|
||
|
value: value
|
||
|
};
|
||
|
}
|
||
|
return this.show(title);
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Displays a message box with an infinitely auto-updating progress bar. This can be used to block user
|
||
|
* interaction while waiting for a long-running process to complete that does not have defined intervals.
|
||
|
* You are responsible for closing the message box when the process is complete.
|
||
|
*
|
||
|
* @param {String} message The message box body text
|
||
|
* @param {String} [title] The title bar text
|
||
|
* @param {Object} [config] A {@link Ext.ProgressBar#wait} config object
|
||
|
* @return {Ext.window.MessageBox} this
|
||
|
*/
|
||
|
wait : function(message, title, config){
|
||
|
if (Ext.isString(message)) {
|
||
|
message = {
|
||
|
title : title,
|
||
|
message : message,
|
||
|
closable: false,
|
||
|
wait: true,
|
||
|
modal: true,
|
||
|
minWidth: this.minProgressWidth,
|
||
|
waitConfig: config
|
||
|
};
|
||
|
}
|
||
|
return this.show(message);
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Displays a standard read-only message box with an OK button (comparable to the basic JavaScript alert prompt).
|
||
|
* If a callback function is passed it will be called after the user clicks the button, and the
|
||
|
* id of the button that was clicked will be passed as the only parameter to the callback
|
||
|
* (could also be the top-right close button, which will always report as "cancel").
|
||
|
*
|
||
|
* @param {String} title The title bar text
|
||
|
* @param {String} message The message box body text
|
||
|
* @param {Function} [fn] The callback function invoked after the message box is closed.
|
||
|
* See {@link #method-show} method for details.
|
||
|
* @param {Object} [scope=window] The scope (<code>this</code> reference) in which the callback is executed.
|
||
|
* @return {Ext.window.MessageBox} this
|
||
|
*/
|
||
|
alert: function(title, message, fn, scope) {
|
||
|
if (Ext.isString(title)) {
|
||
|
title = {
|
||
|
title: title,
|
||
|
message: message,
|
||
|
buttons: this.OK,
|
||
|
fn: fn,
|
||
|
scope : scope,
|
||
|
minWidth: this.minWidth
|
||
|
};
|
||
|
}
|
||
|
return this.show(title);
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Displays a message box with a progress bar.
|
||
|
*
|
||
|
* You are responsible for updating the progress bar as needed via {@link Ext.window.MessageBox#updateProgress}
|
||
|
* and closing the message box when the process is complete.
|
||
|
*
|
||
|
* @param {String} title The title bar text
|
||
|
* @param {String} message The message box body text
|
||
|
* @param {String} [progressText=''] The text to display inside the progress bar
|
||
|
* @return {Ext.window.MessageBox} this
|
||
|
*/
|
||
|
progress : function(title, message, progressText){
|
||
|
if (Ext.isString(title)) {
|
||
|
title = {
|
||
|
title: title,
|
||
|
message: message,
|
||
|
progress: true,
|
||
|
progressText: progressText
|
||
|
};
|
||
|
}
|
||
|
return this.show(title);
|
||
|
}
|
||
|
}, function(MessageBox) {
|
||
|
/**
|
||
|
* @class Ext.MessageBox
|
||
|
* @alternateClassName Ext.Msg
|
||
|
* @extends Ext.window.MessageBox
|
||
|
* @singleton
|
||
|
* @inheritdoc Ext.window.MessageBox
|
||
|
*/
|
||
|
// We want to defer creating Ext.MessageBox and Ext.Msg instances
|
||
|
// until overrides have been applied.
|
||
|
Ext.onInternalReady(function() {
|
||
|
Ext.MessageBox = Ext.Msg = new MessageBox();
|
||
|
});
|
||
|
});
|