WIP: Fix recomputeEnabled() for EllipsisMenu
Change-Id: I5ea6b49e8e98e93b1eff5e4921db1153681c1537
diff --git a/org.eclipse.scout.rt.ui.html.test/src/test/js/scout/form/FormSpec.js b/org.eclipse.scout.rt.ui.html.test/src/test/js/scout/form/FormSpec.js
index 82ed7dd..c42a2d2 100644
--- a/org.eclipse.scout.rt.ui.html.test/src/test/js/scout/form/FormSpec.js
+++ b/org.eclipse.scout.rt.ui.html.test/src/test/js/scout/form/FormSpec.js
@@ -524,4 +524,70 @@
});
});
+ describe('disabled form', function() {
+ it('can be closed although it is disabled', function(done) {
+ var form = scout.create('Form', {
+ parent: session.desktop,
+ rootGroupBox: {
+ id: 'mainbox',
+ objectType: 'GroupBox',
+ gridDataHints: {
+ widthInPixel: 1000
+ },
+ menus: [{
+ id: 'okmenu',
+ objectType: 'OkMenu'
+ }, {
+ id: 'cancelmenu',
+ objectType: 'CancelMenu'
+ }, {
+ id: 'closemenu',
+ objectType: 'CloseMenu'
+ }, {
+ id: 'resetmenu',
+ objectType: 'ResetMenu'
+ }, {
+ id: 'savemenu',
+ objectType: 'SaveMenu'
+ }],
+ fields: [{
+ id: 'stringfield1',
+ objectType: 'StringField'
+ }, {
+ id: 'stringfield2',
+ objectType: 'StringField',
+ inheritAccessibility: false
+ }]
+ }
+ });
+ form.setEnabled(false);
+ form.open()
+ .then(function() {
+ // enabled
+ expect(form.enabled).toBe(false);
+ expect(form.widget('mainbox').enabled).toBe(true);
+ expect(form.widget('stringfield1').enabled).toBe(true);
+ expect(form.widget('stringfield2').enabled).toBe(true);
+ expect(form.widget('okmenu').enabled).toBe(true);
+ expect(form.widget('cancelmenu').enabled).toBe(true);
+ expect(form.widget('closemenu').enabled).toBe(true);
+ expect(form.widget('resetmenu').enabled).toBe(true);
+ expect(form.widget('savemenu').enabled).toBe(true);
+ // enabledComputed
+ expect(form.enabledComputed).toBe(false);
+ expect(form.widget('mainbox').enabledComputed).toBe(false);
+ expect(form.widget('stringfield1').enabledComputed).toBe(false);
+ expect(form.widget('stringfield2').enabledComputed).toBe(true);
+ expect(form.widget('okmenu').enabledComputed).toBe(false);
+ expect(form.widget('cancelmenu').enabledComputed).toBe(true);
+ expect(form.widget('closemenu').enabledComputed).toBe(true);
+ expect(form.widget('resetmenu').enabledComputed).toBe(false);
+ expect(form.widget('savemenu').enabledComputed).toBe(false);
+ form.close();
+ })
+ .catch(fail)
+ .always(done);
+ });
+ });
+
});
diff --git a/org.eclipse.scout.rt.ui.html/src/main/js/scout/menu/ButtonAdapterMenu.js b/org.eclipse.scout.rt.ui.html/src/main/js/scout/menu/ButtonAdapterMenu.js
index 7da716b..476a1b1 100644
--- a/org.eclipse.scout.rt.ui.html/src/main/js/scout/menu/ButtonAdapterMenu.js
+++ b/org.eclipse.scout.rt.ui.html/src/main/js/scout/menu/ButtonAdapterMenu.js
@@ -74,7 +74,12 @@
* @override Widget.js
*/
scout.ButtonAdapterMenu.prototype._computeEnabled = function(inheritAccessibility, parentEnabled) {
- return this.button._computeEnabled(inheritAccessibility, parentEnabled);
+ // Use buttons "parentEnabled" value (because the adapter menu might be in an enabled popup, while the button's real parent is disabled)
+ var buttonParentEnabled = true;
+ if (this.button.parent && this.button.parent.initialized && this.button.parent.enabledComputed !== undefined) {
+ buttonParentEnabled = this.button.parent.enabledComputed;
+ }
+ return this.button._computeEnabled(inheritAccessibility, buttonParentEnabled);
};
/**
diff --git a/org.eclipse.scout.rt.ui.html/src/main/js/scout/menu/EllipsisMenu.js b/org.eclipse.scout.rt.ui.html/src/main/js/scout/menu/EllipsisMenu.js
index ecdb035..7c115cd 100644
--- a/org.eclipse.scout.rt.ui.html/src/main/js/scout/menu/EllipsisMenu.js
+++ b/org.eclipse.scout.rt.ui.html/src/main/js/scout/menu/EllipsisMenu.js
@@ -54,3 +54,9 @@
scout.EllipsisMenu.prototype.isTabTarget = function() {
return scout.Menu.prototype.isTabTarget.call(this) && !this.hidden;
};
+
+scout.EllipsisMenu.prototype._computeEnabledForChildren = function(enabledComputed, parentEnabled) {
+ // Ellipsis menu should always pass the "parentEnabled" value to its children
+ // (because it should be enabled even when everything else is disabled).
+ return parentEnabled;
+};
diff --git a/org.eclipse.scout.rt.ui.html/src/main/js/scout/widget/Widget.js b/org.eclipse.scout.rt.ui.html/src/main/js/scout/widget/Widget.js
index 418ba09..ba67f44 100644
--- a/org.eclipse.scout.rt.ui.html/src/main/js/scout/widget/Widget.js
+++ b/org.eclipse.scout.rt.ui.html/src/main/js/scout/widget/Widget.js
@@ -525,7 +525,7 @@
this.parent = parent;
this.parent._addChild(this);
if (this.initialized) {
- this.recomputeEnabled(this.parent.enabledComputed);
+ this.parent.recomputeEnabled();
}
this.parent.one('destroy', this._parentDestroyHandler);
};
@@ -653,15 +653,23 @@
this._renderEnabled(); // refresh
}
- this.children.forEach(function(child) {
- child.recomputeEnabled(enabledComputed);
- });
+ // Propagate to children
+ if (this.children.length) {
+ var enabledComputedForChildren = this._computeEnabledForChildren(enabledComputed, parentEnabled);
+ this.children.forEach(function(child) {
+ child.recomputeEnabled(enabledComputedForChildren);
+ });
+ }
};
scout.Widget.prototype._computeEnabled = function(inheritAccessibility, parentEnabled) {
return this.enabled && (inheritAccessibility ? parentEnabled : true);
};
+scout.Widget.prototype._computeEnabledForChildren = function(enabledComputed, parentEnabled) {
+ return enabledComputed;
+};
+
scout.Widget.prototype._renderEnabled = function() {
if (!this.$container) {
return;