diff --git a/eclipse-scout-core/src/form/fields/FieldStatus.ts b/eclipse-scout-core/src/form/fields/FieldStatus.ts index d0085a25cf2..db868c82d62 100644 --- a/eclipse-scout-core/src/form/fields/FieldStatus.ts +++ b/eclipse-scout-core/src/form/fields/FieldStatus.ts @@ -93,6 +93,12 @@ export class FieldStatus extends Widget implements FieldStatusModel { this.$container.setTabbable(hasMenus && this.enabledComputed && !Device.get().supportsOnlyTouch()); } + protected override _updateEnabledComputed(enabledComputed: boolean, enabledComputedForChildren?: boolean) { + // The enabled state of the field status is irrelevant for its child menus -> always pass the state of the field + // This is because the field status should be enabled even if the parent field is disabled (inheritAccessibility is false), but the actual menus should be disabled + super._updateEnabledComputed(enabledComputed, this.parent.enabledComputed); + } + update(status: StatusOrModel, menus: Menu | Menu[], autoRemove: boolean, showStatus?: boolean) { this.updating = true; this.setStatus(status); @@ -290,6 +296,7 @@ export class FieldStatus extends Widget implements FieldStatusModel { this.$container.addClass('selected'); aria.expanded(this.$container, true); aria.linkElementWithControls(this.$container, this.tooltip.$container); + this.recomputeEnabled(); // triggers _updateEnabledComputed this.tooltip.one('destroy', () => { this.tooltip = null; if (this.$container) { @@ -336,6 +343,7 @@ export class FieldStatus extends Widget implements FieldStatusModel { this.$container.addClass('selected'); aria.expanded(this.$container, true); aria.linkElementWithControls(this.$container, this.contextMenu.$container); + this.recomputeEnabled(); // triggers _updateEnabledComputed this.contextMenu.one('destroy', () => { this.contextMenu = null; if (this.$container) { diff --git a/eclipse-scout-core/test/form/fields/FieldStatusSpec.ts b/eclipse-scout-core/test/form/fields/FieldStatusSpec.ts index c655f159d67..e0bd0075bc2 100644 --- a/eclipse-scout-core/test/form/fields/FieldStatusSpec.ts +++ b/eclipse-scout-core/test/form/fields/FieldStatusSpec.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2025 BSI Business Systems Integration AG + * Copyright (c) 2010, 2026 BSI Business Systems Integration AG * * This program and the accompanying materials are made * available under the terms of the Eclipse Public License 2.0 @@ -110,6 +110,170 @@ describe('FieldStatus', () => { }); }); + describe('enabled', () => { + it('is enabled but children disabled even if parent is disabled', () => { + let formField = scout.create(StringField, { + parent: session.desktop, + enabled: false, + menus: [{ + objectType: Menu, + childActions: [{objectType: Menu}] + }] + }); + formField.render(); + expect(formField.enabledComputed).toBe(false); + expect(formField.fieldStatus.enabledComputed).toBe(true); + expect(formField.menus[0].enabledComputed).toBe(false); + expect(formField.menus[0].childActions[0].enabledComputed).toBe(false); + + // open menu + formField.fieldStatus.doAction(); + expect(formField.fieldStatus.contextMenu.menuItems[0].enabledComputed).toBe(false); + expect(formField.fieldStatus.contextMenu.menuItems[0].childActions[0].enabledComputed).toBe(false); + + // close menu + formField.fieldStatus.contextMenu.animateRemoval = false; + formField.fieldStatus.doAction(); + expect(formField.fieldStatus.contextMenu).toBe(null); + + formField.setEnabled(true); + expect(formField.enabledComputed).toBe(true); + expect(formField.fieldStatus.enabledComputed).toBe(true); + expect(formField.menus[0].enabledComputed).toBe(true); + expect(formField.menus[0].childActions[0].enabledComputed).toBe(true); + + // open menu + formField.fieldStatus.doAction(); + expect(formField.fieldStatus.contextMenu.menuItems[0].enabledComputed).toBe(true); + expect(formField.fieldStatus.contextMenu.menuItems[0].childActions[0].enabledComputed).toBe(true); + + // close menu + formField.fieldStatus.contextMenu.animateRemoval = false; + formField.fieldStatus.doAction(); + expect(formField.fieldStatus.contextMenu).toBe(null); + + formField.setEnabled(false); + expect(formField.enabledComputed).toBe(false); + expect(formField.fieldStatus.enabledComputed).toBe(true); + expect(formField.menus[0].enabledComputed).toBe(false); + expect(formField.menus[0].childActions[0].enabledComputed).toBe(false); + + // open menu + formField.fieldStatus.doAction(); + expect(formField.fieldStatus.contextMenu.menuItems[0].enabledComputed).toBe(false); + expect(formField.fieldStatus.contextMenu.menuItems[0].childActions[0].enabledComputed).toBe(false); + + formField.insertMenu({objectType: Menu}); + expect(formField.menus[1].enabledComputed).toBe(false); + expect(formField.enabledComputed).toBe(false); + expect(formField.fieldStatus.enabledComputed).toBe(true); + + // close menu + formField.fieldStatus.contextMenu.animateRemoval = false; + formField.fieldStatus.doAction(); + expect(formField.fieldStatus.contextMenu).toBe(null); + + // open menu + formField.fieldStatus.doAction(); + expect(formField.fieldStatus.contextMenu.menuItems[1].enabledComputed).toBe(false); + + // close menu + formField.fieldStatus.contextMenu.animateRemoval = false; + formField.fieldStatus.doAction(); + expect(formField.fieldStatus.contextMenu).toBe(null); + + formField.insertMenu({objectType: Menu, inheritAccessibility: false}); + expect(formField.menus[2].enabledComputed).toBe(true); + expect(formField.enabledComputed).toBe(false); + expect(formField.fieldStatus.enabledComputed).toBe(true); + + // open menu + formField.fieldStatus.doAction(); + expect(formField.fieldStatus.contextMenu.menuItems[1].enabledComputed).toBe(false); + expect(formField.fieldStatus.contextMenu.menuItems[2].enabledComputed).toBe(true); + }); + + it('is enabled but children disabled even if parent is disabled and menus are shown in tooltip', () => { + let formField = scout.create(StringField, { + parent: session.desktop, + enabled: false, + tooltipText: 'hi', + menus: [{ + objectType: Menu, + childActions: [{objectType: Menu}] + }] + }); + formField.render(); + expect(formField.enabledComputed).toBe(false); + expect(formField.fieldStatus.enabledComputed).toBe(true); + expect(formField.menus[0].enabledComputed).toBe(false); + expect(formField.menus[0].childActions[0].enabledComputed).toBe(false); + + // open tooltip + formField.fieldStatus.doAction(); + expect(formField.fieldStatus.tooltip.menus[0].enabledComputed).toBe(false); + expect(formField.fieldStatus.tooltip.menus[0].childActions[0].enabledComputed).toBe(false); + + // close tooltip + formField.fieldStatus.doAction(); + expect(formField.fieldStatus.tooltip).toBe(null); + + formField.setEnabled(true); + expect(formField.enabledComputed).toBe(true); + expect(formField.fieldStatus.enabledComputed).toBe(true); + expect(formField.menus[0].enabledComputed).toBe(true); + expect(formField.menus[0].childActions[0].enabledComputed).toBe(true); + + // open tooltip + formField.fieldStatus.doAction(); + expect(formField.fieldStatus.tooltip.menus[0].enabledComputed).toBe(true); + expect(formField.fieldStatus.tooltip.menus[0].childActions[0].enabledComputed).toBe(true); + + // close tooltip + formField.fieldStatus.doAction(); + expect(formField.fieldStatus.tooltip).toBe(null); + + formField.setEnabled(false); + expect(formField.enabledComputed).toBe(false); + expect(formField.fieldStatus.enabledComputed).toBe(true); + expect(formField.menus[0].enabledComputed).toBe(false); + expect(formField.menus[0].childActions[0].enabledComputed).toBe(false); + + // open tooltip + formField.fieldStatus.doAction(); + expect(formField.fieldStatus.tooltip.menus[0].enabledComputed).toBe(false); + expect(formField.fieldStatus.tooltip.menus[0].childActions[0].enabledComputed).toBe(false); + + // close tooltip + formField.fieldStatus.doAction(); + expect(formField.fieldStatus.tooltip).toBe(null); + + formField.insertMenu({objectType: Menu}); + expect(formField.menus[1].enabledComputed).toBe(false); + expect(formField.enabledComputed).toBe(false); + expect(formField.fieldStatus.enabledComputed).toBe(true); + + // open tooltip + formField.fieldStatus.doAction(); + expect(formField.fieldStatus.tooltip.menus[1].enabledComputed).toBe(false); + + // close tooltip + formField.fieldStatus.tooltip.animateRemoval = false; + formField.fieldStatus.doAction(); + expect(formField.fieldStatus.tooltip).toBe(null); + + formField.insertMenu({objectType: Menu, inheritAccessibility: false}); + expect(formField.menus[2].enabledComputed).toBe(true); + expect(formField.enabledComputed).toBe(false); + expect(formField.fieldStatus.enabledComputed).toBe(true); + + // open tooltip + formField.fieldStatus.doAction(); + expect(formField.fieldStatus.tooltip.menus[1].enabledComputed).toBe(false); + expect(formField.fieldStatus.tooltip.menus[2].enabledComputed).toBe(true); + }); + }); + describe('parent changes visibility', () => { let formField: StringField;