Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions eclipse-scout-core/src/form/fields/FieldStatus.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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) {
Expand Down
166 changes: 165 additions & 1 deletion eclipse-scout-core/test/form/fields/FieldStatusSpec.ts
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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;

Expand Down
Loading