Manage Configuration / Functional Position
GUI review pendingFunctional position details.
Direct application capture — Captured from the running local Coflyr application. Blank form; no selected saved record. Search grids and shared actions are included.

Full source layout (controllers disabled)
Current FXML + application CSS. Conditional controls remain visible as declared. Generic lookup labels may read Owner until initialized by a controller; see the control inventory for intended labels. Custom lookup adapters use a label/search input rendering.

Control inventory (9)
On phones, controls are displayed as individual cards.
| Label / control ID | Control / binding | Declared behaviour / review point | GUI decision |
|---|---|---|---|
Hierarchical Position (calculated)hierarchicalPositionField | TextFieldhierarchicalPositionProperty | editable=false | |
Functional Position Code *functionalPositionCodeField | TextFieldfunctionalPositionCodeProperty | promptText=Generated on save; editable for Custom | |
Generate codegenerateFunctionalPositionCodeButton | ButtonGeneric/controller binding; inspect source | onAction=#generateFunctionalPositionCode | |
Functional Position NamefunctionalPositionNameField | TextFieldfunctionalPositionNameProperty | promptText=Enter functional position name | |
Functional Position TypefunctionalPositionTypeComboBox | ComboBoxfunctionalPositionTypeProperty | Review requiredness, validation and display. | |
Functional Part QtyfunctionalPartQtyField | TextFieldfunctionalPartQtyProperty | promptText=1 | |
LevellevelField | TextFieldlevelProperty | editable=false; promptText=Auto | |
Equipment Reference Key (Software/Boeing)equipmentReferenceKeyField | TextFieldequipmentReferenceKeyProperty | promptText=Enter the imported software location identifier | |
Functional Position DescriptionfunctionalPositionDescriptionField | TextFieldfunctionalPositionDescriptionProperty | Review requiredness, validation and display. |
Source evidence
Tab key: manageconfiguration--profile
Section: Entire form
FXML SHA-256: 7a39a772f122721c3826af21f64f5511024f42d5c20acc750e9dc7e599069001
coflyr-fe/src/main/resources/com/coflyr/fe/configuration/views/configuration-form.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.ComboBox?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.CheckBox?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.FlowPane?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>
<VBox xmlns="http://javafx.com/javafx/21"
xmlns:fx="http://javafx.com/fxml/1"
fx:controller="com.coflyr.fe.configuration.controllers.ConfigurationFormController"
fillWidth="true"
maxWidth="Infinity"
styleClass="standard-section-flat">
<children>
<Label styleClass="section-title" text="Functional Position"/>
<VBox styleClass="field-group">
<Label styleClass="field-label" text="Hierarchical Position (calculated)"/>
<TextField fx:id="hierarchicalPositionField" editable="false" maxWidth="Infinity" styleClass="text-input"/>
</VBox>
<GridPane maxWidth="Infinity" styleClass="form-fields-grid">
<children>
<VBox fillWidth="true" maxWidth="Infinity" minWidth="0.0" styleClass="field-group" GridPane.columnIndex="0" GridPane.fillWidth="true" GridPane.hgrow="ALWAYS" GridPane.rowIndex="0">
<children>
<Label styleClass="field-label" text="Functional Position Code *"/>
<TextField fx:id="functionalPositionCodeField" maxWidth="Infinity" prefWidth="1.0" promptText="Generated on save; editable for Custom" styleClass="text-input"/>
<Button fx:id="generateFunctionalPositionCodeButton" mnemonicParsing="false" onAction="#generateFunctionalPositionCode" text="Generate code" styleClass="label-action-button"/>
</children>
</VBox>
<VBox fillWidth="true" maxWidth="Infinity" minWidth="0.0" styleClass="field-group" GridPane.columnIndex="1" GridPane.columnSpan="2" GridPane.fillWidth="true" GridPane.hgrow="ALWAYS" GridPane.rowIndex="0">
<children>
<Label styleClass="field-label" text="Functional Position Name"/>
<TextField fx:id="functionalPositionNameField" maxWidth="Infinity" prefWidth="1.0" promptText="Enter functional position name" styleClass="text-input"/>
</children>
</VBox>
<VBox fillWidth="true" maxWidth="Infinity" minWidth="0.0" styleClass="field-group" GridPane.columnIndex="0" GridPane.fillWidth="true" GridPane.hgrow="ALWAYS" GridPane.rowIndex="1">
<children>
<Label styleClass="field-label" text="Functional Position Type"/>
<ComboBox fx:id="functionalPositionTypeComboBox" maxWidth="Infinity" prefWidth="1.0" styleClass="text-input"/>
</children>
</VBox>
<VBox fillWidth="true" maxWidth="Infinity" minWidth="0.0" styleClass="field-group" GridPane.columnIndex="1" GridPane.fillWidth="true" GridPane.hgrow="ALWAYS" GridPane.rowIndex="1">
<children>
<Label styleClass="field-label" text="Functional Part Qty"/>
<TextField fx:id="functionalPartQtyField" maxWidth="Infinity" prefWidth="1.0" promptText="1" styleClass="text-input"/>
</children>
</VBox>
<VBox fillWidth="true" maxWidth="Infinity" minWidth="0.0" styleClass="field-group" GridPane.columnIndex="2" GridPane.fillWidth="true" GridPane.hgrow="ALWAYS" GridPane.rowIndex="1">
<children>
<Label styleClass="field-label" text="Level"/>
<TextField fx:id="levelField" editable="false" focusTraversable="false" maxWidth="Infinity" prefWidth="1.0" promptText="Auto" styleClass="text-input"/>
</children>
</VBox>
<VBox fx:id="equipmentReferenceKeyGroup" fillWidth="true" maxWidth="Infinity" minWidth="0.0" styleClass="field-group" GridPane.columnIndex="0" GridPane.columnSpan="3" GridPane.fillWidth="true" GridPane.hgrow="ALWAYS" GridPane.rowIndex="2">
<children>
<Label styleClass="field-label" text="Equipment Reference Key (Software/Boeing)"/>
<TextField fx:id="equipmentReferenceKeyField" maxWidth="Infinity" prefWidth="1.0" promptText="Enter the imported software location identifier" styleClass="text-input"/>
</children>
</VBox>
<VBox fillWidth="true" maxWidth="Infinity" minWidth="0.0" styleClass="field-group" GridPane.columnIndex="0" GridPane.columnSpan="3" GridPane.fillWidth="true" GridPane.hgrow="ALWAYS" GridPane.rowIndex="3">
<children>
<Label styleClass="field-label" text="Functional Position Description"/>
<TextField fx:id="functionalPositionDescriptionField" maxWidth="Infinity" prefWidth="1.0" styleClass="text-input"/>
</children>
</VBox>
</children>
<columnConstraints>
<ColumnConstraints fillWidth="true" hgrow="ALWAYS" percentWidth="33.333"/>
<ColumnConstraints fillWidth="true" hgrow="ALWAYS" percentWidth="33.333"/>
<ColumnConstraints fillWidth="true" hgrow="ALWAYS" percentWidth="33.334"/>
</columnConstraints>
</GridPane>
</children>
</VBox>
Controller: com.coflyr.fe.configuration.controllers.ConfigurationFormController
package com.coflyr.fe.configuration.controllers;
import com.coflyr.fe.configuration.viewmodels.ConfigurationViewModel;
import com.coflyr.fe.shared.lookup.LookupFieldBinding;
import com.coflyr.fe.views.DbSearchLookupFieldController;
import javafx.fxml.FXML;
import javafx.beans.binding.Bindings;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@Component
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class ConfigurationFormController {
private final ConfigurationViewModel viewModel;
@FXML private TextField functionalPositionCodeField;
@FXML private TextField hierarchicalPositionField;
@FXML private Button generateFunctionalPositionCodeButton;
@FXML private TextField functionalPositionNameField;
@FXML private ComboBox<String> functionalPositionTypeComboBox;
@FXML private TextField functionalPositionDescriptionField;
@FXML private TextField functionalPartQtyField;
@FXML private CheckBox positionLeftHandCheckBox;
@FXML private CheckBox positionRightHandCheckBox;
@FXML private CheckBox positionForwardCheckBox;
@FXML private CheckBox positionAftCheckBox;
@FXML private TextField positionNumberStartField;
@FXML private TextField positionNumberEndField;
@FXML private TextField levelField;
@FXML private TextField sequenceField;
@FXML private DbSearchLookupFieldController parentHardwarePositionLookupController;
@FXML private DbSearchLookupFieldController approvedPartMasterLookupController;
@FXML private DbSearchLookupFieldController allowableAlternatePartLookupController;
@FXML private DbSearchLookupFieldController parentConfigurationLookupController;
@FXML private DbSearchLookupFieldController ataLookupController;
@FXML private DbSearchLookupFieldController ownerBusinessPartnerLookupController;
@FXML private DbSearchLookupFieldController locationReferenceLookupController;
// Booked/as-flying comparison fields are disabled until configuration checker/import is implemented.
// @FXML private DbSearchLookupFieldController bookedConfigurationMasterLookupController;
// @FXML private DbSearchLookupFieldController asFlyingConfigurationMasterLookupController;
@FXML private TextField aircraftSystemCodeField;
@FXML private TextField equipmentReferenceKeyField;
@FXML private VBox equipmentReferenceKeyGroup;
@FXML private TextField effectiveDateField;
@FXML private TextField missionConfigurationCodeField;
@FXML private TextField statusReportInformationField;
@FXML private TextField massStorageDeviceCodeField;
@FXML private TextField rescueKitCodeField;
@FXML private TextField zoneCodeField;
@FXML private TextField panelCodeField;
@FXML private CheckBox massStorageDeviceCheckBox;
@FXML private CheckBox rescueKitCheckBox;
@FXML private TextField ipcReferenceField;
@FXML private CheckBox groupCheckBox;
@FXML private CheckBox optionalCheckBox;
// Inactive state is handled through shared audit/status fields.
// @FXML private CheckBox inactiveCheckBox;
@FXML private CheckBox lruCheckBox;
@FXML private CheckBox qecCheckBox;
@FXML private CheckBox asFlyingFpCheckBox;
@FXML private CheckBox informationOnlyCheckBox;
@FXML private CheckBox excludeAsFlyingFpCheckBox;
// @FXML private CheckBox mandatoryCheckBox;
// Preferred selection belongs to part/effectivity relationship, not the configuration position.
// @FXML private CheckBox preferredCheckBox;
// Inspection requirements are managed through maintenance program/effectivity links.
// @FXML private CheckBox hasRequirementCheckBox;
// @FXML private CheckBox hasSoftRequirementCheckBox;
// Reusable subtree roots are not required because child structures are assigned through Configuration/Effectivity.
// @FXML private CheckBox subTreeRootCheckBox;
// FP code uniqueness is enforced as a configuration rule, not a per-row user choice.
// @FXML private CheckBox uniqueFpCodeRequiredCheckBox;
@FXML private CheckBox allowAlternatePartsCheckBox;
// Sub-configuration inclusion is derived from ParentConfigurationId hierarchy during checks.
// @FXML private CheckBox includeSubConfigurationsCheckBox;
// Selection is UI state and must not be persisted.
// @FXML private CheckBox selectedCheckBox;
// Editability is controlled by audit/status workflow, not a configuration row flag.
// @FXML private CheckBox changeableCheckBox;
// Changeable Reason is disabled with Changeable.
// @FXML private TextField changeableReasonField;
// @FXML private TextField bookedConfigurationCodeField;
// @FXML private TextField asFlyingConfigurationCodeField;
// Reusable subtree assignment is not required because child parts are assigned through Configuration/Effectivity.
// @FXML private TextField subTreeMasterIdField;
public ConfigurationFormController(ConfigurationViewModel viewModel) {
this.viewModel = viewModel;
}
@FXML
private void initialize() {
if (hierarchicalPositionField != null) {
hierarchicalPositionField.textProperty().bind(viewModel.hierarchicalPositionProperty());
}
bind(sequenceField, viewModel.sequenceProperty());
LookupFieldBinding.bind(parentHardwarePositionLookupController, "configurations", "Hardware Host", "Search hardware position", viewModel.parentHardwarePositionIdProperty(), viewModel.parentHardwarePositionLookupQueryProperty());
LookupFieldBinding.bind(approvedPartMasterLookupController, "parts", "Approved Part", "Search approved part", viewModel.approvedPartMasterIdProperty(), viewModel.approvedPartMasterLookupQueryProperty());
LookupFieldBinding.bind(allowableAlternatePartLookupController, "parts", "Alternate Part", "Search alternate part", viewModel.allowableAlternatePartIdProperty(), viewModel.allowableAlternatePartLookupQueryProperty());
if (functionalPositionTypeComboBox != null) {
functionalPositionTypeComboBox.setItems(viewModel.functionalPositionTypes());
functionalPositionTypeComboBox.valueProperty().bindBidirectional(viewModel.functionalPositionTypeProperty());
}
if (equipmentReferenceKeyGroup != null) {
equipmentReferenceKeyGroup.visibleProperty().bind(Bindings.createBooleanBinding(
() -> "Software".equalsIgnoreCase(viewModel.functionalPositionTypeProperty().get()),
viewModel.functionalPositionTypeProperty()));
equipmentReferenceKeyGroup.managedProperty().bind(equipmentReferenceKeyGroup.visibleProperty());
}
bind(functionalPositionCodeField, viewModel.functionalPositionCodeProperty());
if (functionalPositionCodeField != null) {
functionalPositionCodeField.editableProperty().bind(viewModel.fpGeneratorModeProperty().isEqualTo("Custom"));
functionalPositionCodeField.focusTraversableProperty().bind(viewModel.fpGeneratorModeProperty().isEqualTo("Custom"));
}
if (generateFunctionalPositionCodeButton != null) {
generateFunctionalPositionCodeButton.disableProperty().bind(
viewModel.fpGeneratorModeProperty().isEqualTo("Custom").or(
Bindings.createBooleanBinding(
() -> viewModel.functionalPositionNameProperty().get() == null
|| viewModel.functionalPositionNameProperty().get().isBlank(),
viewModel.functionalPositionNameProperty())));
}
bind(functionalPositionNameField, viewModel.functionalPositionNameProperty());
bind(functionalPositionDescriptionField, viewModel.functionalPositionDescriptionProperty());
bind(functionalPartQtyField, viewModel.functionalPartQtyProperty());
bind(positionLeftHandCheckBox, viewModel.positionLeftHandProperty());
bind(positionRightHandCheckBox, viewModel.positionRightHandProperty());
bind(positionForwardCheckBox, viewModel.positionForwardProperty());
bind(positionAftCheckBox, viewModel.positionAftProperty());
bind(positionNumberStartField, viewModel.positionNumberStartProperty());
bind(positionNumberEndField, viewModel.positionNumberEndProperty());
enforceExclusive(positionLeftHandCheckBox, positionRightHandCheckBox);
enforceExclusive(positionForwardCheckBox, positionAftCheckBox);
bind(levelField, viewModel.levelProperty());
bind(aircraftSystemCodeField, viewModel.aircraftSystemCodeProperty());
bind(equipmentReferenceKeyField, viewModel.equipmentReferenceKeyProperty());
bind(effectiveDateField, viewModel.effectiveDateProperty());
bind(missionConfigurationCodeField, viewModel.missionConfigurationCodeProperty());
bind(statusReportInformationField, viewModel.statusReportInformationProperty());
bind(massStorageDeviceCodeField, viewModel.massStorageDeviceCodeProperty());
bind(rescueKitCodeField, viewModel.rescueKitCodeProperty());
bind(zoneCodeField, viewModel.zoneCodeProperty());
bind(panelCodeField, viewModel.panelCodeProperty());
bind(massStorageDeviceCheckBox, viewModel.massStorageDeviceProperty());
bind(rescueKitCheckBox, viewModel.rescueKitProperty());
bind(ipcReferenceField, viewModel.ipcReferenceProperty());
// bind(changeableReasonField, viewModel.changeableReasonProperty());
// bind(bookedConfigurationCodeField, viewModel.bookedConfigurationCodeProperty());
// bind(asFlyingConfigurationCodeField, viewModel.asFlyingConfigurationCodeProperty());
// bind(subTreeMasterIdField, viewModel.subTreeMasterIdProperty());
bind(groupCheckBox, viewModel.groupProperty());
bind(optionalCheckBox, viewModel.optionalProperty());
// bind(inactiveCheckBox, viewModel.inactiveProperty());
bind(lruCheckBox, viewModel.lruProperty());
bind(qecCheckBox, viewModel.qecProperty());
bind(asFlyingFpCheckBox, viewModel.asFlyingFpProperty());
bind(informationOnlyCheckBox, viewModel.informationOnlyProperty());
bind(excludeAsFlyingFpCheckBox, viewModel.excludeAsFlyingFpProperty());
// bind(mandatoryCheckBox, viewModel.mandatoryProperty());
// bind(preferredCheckBox, viewModel.preferredProperty());
// bind(hasRequirementCheckBox, viewModel.hasRequirementProperty());
// bind(hasSoftRequirementCheckBox, viewModel.hasSoftRequirementProperty());
// bind(subTreeRootCheckBox, viewModel.subTreeRootProperty());
// bind(uniqueFpCodeRequiredCheckBox, viewModel.uniqueFpCodeRequiredProperty());
bind(allowAlternatePartsCheckBox, viewModel.allowAlternatePartsProperty());
// bind(includeSubConfigurationsCheckBox, viewModel.includeSubConfigurationsProperty());
// bind(selectedCheckBox, viewModel.selectedProperty());
// bind(changeableCheckBox, viewModel.changeableProperty());
if (parentConfigurationLookupController != null) {
LookupFieldBinding.bind(
parentConfigurationLookupController,
"configurations",
"Parent Configuration",
"Search parent configuration",
viewModel.parentConfigurationIdProperty(),
viewModel.parentConfigurationLookupQueryProperty()
);
}
if (ataLookupController != null) {
LookupFieldBinding.bind(ataLookupController, "ata", "ATA", "Search ATA", viewModel.ataIdProperty(), viewModel.ataLookupQueryProperty());
}
if (ownerBusinessPartnerLookupController != null) {
LookupFieldBinding.bind(ownerBusinessPartnerLookupController, "business-partners", "Owner Business Partner", "Search owner business partner", viewModel.ownerBusinessPartnerIdProperty(), viewModel.ownerBusinessPartnerLookupQueryProperty());
}
if (locationReferenceLookupController != null) {
LookupFieldBinding.bind(
locationReferenceLookupController,
"locationreferences",
"Physical Location",
"Search physical location",
viewModel.locationReferenceIdProperty(),
viewModel.locationReferenceLookupQueryProperty()
);
}
// if (bookedConfigurationMasterLookupController != null) {
// LookupFieldBinding.bind(bookedConfigurationMasterLookupController, "configuration-masters", "Booked Configuration Master", "Search booked configuration master", viewModel.bookedConfigurationMasterIdProperty(), viewModel.bookedConfigurationMasterLookupQueryProperty());
// }
// if (asFlyingConfigurationMasterLookupController != null) {
// LookupFieldBinding.bind(asFlyingConfigurationMasterLookupController, "configuration-masters", "As-Flying Configuration Master", "Search as-flying configuration master", viewModel.asFlyingConfigurationMasterIdProperty(), viewModel.asFlyingConfigurationMasterLookupQueryProperty());
// }
}
private void bind(TextField field, javafx.beans.property.StringProperty property) {
if (field != null) {
field.textProperty().bindBidirectional(property);
}
}
private void bind(CheckBox checkBox, javafx.beans.property.BooleanProperty property) {
if (checkBox != null) {
checkBox.selectedProperty().bindBidirectional(property);
}
}
private void enforceExclusive(CheckBox first, CheckBox second) {
if (first == null || second == null) return;
first.setOnAction(event -> { if (first.isSelected()) second.setSelected(false); });
second.setOnAction(event -> { if (second.isSelected()) first.setSelected(false); });
}
@FXML
private void generateFunctionalPositionCode() {
if (viewModel.functionalPositionNameProperty().get() == null
|| viewModel.functionalPositionNameProperty().get().isBlank()) return;
String mode = viewModel.fpGeneratorModeProperty().get();
if (mode == null || mode.isBlank() || "Custom".equalsIgnoreCase(mode)) return;
String code = switch (mode) {
case "Number" -> "1";
case "Incremental" -> "FP.1";
case "PartNumber" -> suffix(viewModel.approvedPartMasterLookupQueryProperty().get(), "FP");
case "S1000D" -> suffix(viewModel.equipmentReferenceKeyProperty().get(), "FP");
case "Position", "Automatic", "DefinedByParameter" -> suffix(viewModel.functionalPositionNameProperty().get(), "FP");
default -> "FP.1";
};
viewModel.functionalPositionCodeProperty().set(code);
}
private static String suffix(String value, String fallback) {
String source = value == null ? "" : value.trim().replaceAll("[^A-Za-z0-9_-]+", "-");
source = source.replaceAll("^-+|-+$", "");
return (source.isBlank() ? fallback : source) + ".1";
}
}


























































