Merge pull request #232 from matrix-org/matthew/fix-modals

Fix cancelling dialog boxes by clicking on the background
pull/21833/head
Matthew Hodgson 2016-03-18 12:12:16 +00:00
commit e6cf7acbc9
7 changed files with 34 additions and 45 deletions

View File

@ -35,36 +35,13 @@ module.exports = {
return container; return container;
}, },
createDialogWithElement: function(element, props, className) {
var self = this;
var closeDialog = function() {
ReactDOM.unmountComponentAtNode(self.getOrCreateContainer());
if (props && props.onFinished) props.onFinished.apply(null, arguments);
};
var dialog = (
<div className={"mx_Dialog_wrapper " + className}>
<div className="mx_Dialog">
{element}
</div>
<div className="mx_Dialog_background" onClick={closeDialog}></div>
</div>
);
ReactDOM.render(dialog, this.getOrCreateContainer());
return {close: closeDialog};
},
createDialog: function (Element, props, className) { createDialog: function (Element, props, className) {
var self = this; var self = this;
// never call this via modal.close() from onFinished() otherwise it will loop
var closeDialog = function() { var closeDialog = function() {
ReactDOM.unmountComponentAtNode(self.getOrCreateContainer());
if (props && props.onFinished) props.onFinished.apply(null, arguments); if (props && props.onFinished) props.onFinished.apply(null, arguments);
ReactDOM.unmountComponentAtNode(self.getOrCreateContainer());
}; };
// FIXME: If a dialog uses getDefaultProps it clobbers the onFinished // FIXME: If a dialog uses getDefaultProps it clobbers the onFinished
@ -74,7 +51,7 @@ module.exports = {
<div className="mx_Dialog"> <div className="mx_Dialog">
<Element {...props} onFinished={closeDialog}/> <Element {...props} onFinished={closeDialog}/>
</div> </div>
<div className="mx_Dialog_background" onClick={closeDialog}></div> <div className="mx_Dialog_background" onClick={ closeDialog.bind(this, false) }></div>
</div> </div>
); );

View File

@ -522,16 +522,22 @@ module.exports = React.createClass({
var SetDisplayNameDialog = sdk.getComponent('views.dialogs.SetDisplayNameDialog'); var SetDisplayNameDialog = sdk.getComponent('views.dialogs.SetDisplayNameDialog');
var dialog_defer = q.defer(); var dialog_defer = q.defer();
var dialog_ref; var dialog_ref;
var modal; Modal.createDialog(SetDisplayNameDialog, {
var dialog_instance = <SetDisplayNameDialog currentDisplayName={result.displayname} ref={(r) => { currentDisplayName: result.displayname,
ref: (r) => {
dialog_ref = r; dialog_ref = r;
}} onFinished={() => { },
onFinished: (submitted) => {
if (submitted) {
cli.setDisplayName(dialog_ref.getValue()).done(() => { cli.setDisplayName(dialog_ref.getValue()).done(() => {
dialog_defer.resolve(); dialog_defer.resolve();
}); });
modal.close(); }
}} /> else {
modal = Modal.createDialogWithElement(dialog_instance); dialog_defer.reject();
}
}
});
return dialog_defer.promise; return dialog_defer.promise;
} }
}); });
@ -561,6 +567,8 @@ module.exports = React.createClass({
joining: false, joining: false,
joinError: error joinError: error
}); });
if (!error) return;
var msg = error.message ? error.message : JSON.stringify(error); var msg = error.message ? error.message : JSON.stringify(error);
var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
Modal.createDialog(ErrorDialog, { Modal.createDialog(ErrorDialog, {

View File

@ -126,9 +126,7 @@ module.exports = React.createClass({
onLogoutClicked: function(ev) { onLogoutClicked: function(ev) {
var LogoutPrompt = sdk.getComponent('dialogs.LogoutPrompt'); var LogoutPrompt = sdk.getComponent('dialogs.LogoutPrompt');
this.logoutModal = Modal.createDialog( this.logoutModal = Modal.createDialog(LogoutPrompt);
LogoutPrompt, {onCancel: this.onLogoutPromptCancel}
);
}, },
onPasswordChangeError: function(err) { onPasswordChangeError: function(err) {
@ -162,10 +160,6 @@ module.exports = React.createClass({
}); });
}, },
onLogoutPromptCancel: function() {
this.logoutModal.closeDialog();
},
onEnableNotificationsChange: function(event) { onEnableNotificationsChange: function(event) {
UserSettingsStore.setEnableNotifications(event.target.checked); UserSettingsStore.setEnableNotifications(event.target.checked);
}, },

View File

@ -31,6 +31,10 @@ module.exports = React.createClass({
displayName: 'ErrorDialog', displayName: 'ErrorDialog',
propTypes: { propTypes: {
title: React.PropTypes.string, title: React.PropTypes.string,
description: React.PropTypes.oneOfType([
React.PropTypes.element,
React.PropTypes.string,
]),
button: React.PropTypes.string, button: React.PropTypes.string,
focus: React.PropTypes.bool, focus: React.PropTypes.bool,
onFinished: React.PropTypes.func.isRequired, onFinished: React.PropTypes.func.isRequired,

View File

@ -20,7 +20,10 @@ module.exports = React.createClass({
displayName: 'QuestionDialog', displayName: 'QuestionDialog',
propTypes: { propTypes: {
title: React.PropTypes.string, title: React.PropTypes.string,
description: React.PropTypes.object, description: React.PropTypes.oneOfType([
React.PropTypes.element,
React.PropTypes.string,
]),
button: React.PropTypes.string, button: React.PropTypes.string,
focus: React.PropTypes.bool, focus: React.PropTypes.bool,
onFinished: React.PropTypes.func.isRequired, onFinished: React.PropTypes.func.isRequired,

View File

@ -54,7 +54,7 @@ module.exports = React.createClass({
onFormSubmit: function(ev) { onFormSubmit: function(ev) {
ev.preventDefault(); ev.preventDefault();
this.props.onFinished(); this.props.onFinished(true);
return false; return false;
}, },

View File

@ -20,7 +20,10 @@ module.exports = React.createClass({
displayName: 'TextInputDialog', displayName: 'TextInputDialog',
propTypes: { propTypes: {
title: React.PropTypes.string, title: React.PropTypes.string,
description: React.PropTypes.string, description: React.PropTypes.oneOfType([
React.PropTypes.element,
React.PropTypes.string,
]),
value: React.PropTypes.string, value: React.PropTypes.string,
button: React.PropTypes.string, button: React.PropTypes.string,
focus: React.PropTypes.bool, focus: React.PropTypes.bool,