This is an old revision of the document!


Edit Person's Details Sample

This sample presents simple form which shows details of selected person. Choose any person from suggest box. Edited data in any field will be saved in the database - no save button is needed.

Live example

UML Model

Business Logic Code

//CreatePerson.java
public void execute() 
    // -------------<SOL id="928f2fbc-e47e-4718-84e3-8ceff8e61bc0:___throw__" />
    // -------------<LOS id="928f2fbc-e47e-4718-84e3-8ceff8e61bc0:___throw__" />
    {
        // ---------<SOL id="928f2fbc-e47e-4718-84e3-8ceff8e61bc0:___body___" />
        Text nameVal = name.val();
        Integer ageVal = age.val();
        Date dateOfBirthVal = dateOfBirth.val();
        Gender genderVal = gender.val();
        Real heightVal = height.val();
        Boolean isMarriedVal = isMarried.val();
 
        if (nameVal == null || nameVal.isEmpty())
        {
        	throw new CommandPreconditionsException("Please, type in the name for new person.");
        }
 
        Person p = new Person();
        p.name.set(nameVal);
        p.age.set(ageVal);
        p.dateOfBirth.set(dateOfBirthVal);
        p.gender.set(genderVal);
        p.height.set(heightVal);
        p.isMarried.set(isMarriedVal);
        // ---------<LOS id="928f2fbc-e47e-4718-84e3-8ceff8e61bc0:___body___" />
    }

GUI Code

package rs.sol.sampleapps;
 
import rs.sol.sampleapps.commands.CreatePerson;
import rs.sol.soloist.helpers.init.DefaultContextInit;
import rs.sol.soloist.helpers.init.Initializer;
import rs.sol.soloist.helpers.init.InitializerFailedException;
import rs.sol.soloist.modelreader.Repository;
import rs.sol.soloist.server.builtindomains.builtindatatypes.Boolean;
import rs.sol.soloist.server.builtindomains.builtindatatypes.Date;
import rs.sol.soloist.server.builtindomains.builtindatatypes.Integer;
import rs.sol.soloist.server.builtindomains.builtindatatypes.Real;
import rs.sol.soloist.server.builtindomains.builtindatatypes.Text;
import rs.sol.soloist.server.builtindomains.common.ElementDescriptor;
import rs.sol.soloist.server.guiconfiguration.components.GUIApplicationComponent;
import rs.sol.soloist.server.guiconfiguration.components.GUIButtonComponent;
import rs.sol.soloist.server.guiconfiguration.components.GUILabelComponent;
import rs.sol.soloist.server.guiconfiguration.components.GUIPanelComponent;
import rs.sol.soloist.server.guiconfiguration.construction.GUIComponentBinding;
import rs.sol.soloist.server.guiconfiguration.elementcomponents.GUIElementComponent;
import rs.sol.soloist.server.guiconfiguration.elementcomponents.GUIInputKind;
import rs.sol.soloist.server.guiconfiguration.layout.TableLayoutData;
import rs.sol.soloist.server.server.SoloistServiceServlet;
 
public enum SubmitPerson implements Initializer{
 
	INSTANCE;
 
	@Override
	public void init() throws InitializerFailedException {
		GUIApplicationComponent page = new GUIApplicationComponent();
		page.name.set(Text.fromString("SubmitPerson")); 
		SoloistServiceServlet.registerApplication(page);
		page.context.set(DefaultContextInit.getRoot());
 
		GUIPanelComponent root = GUIPanelComponent.createFlow(page);
 
		GUILabelComponent title = GUILabelComponent.create(root, "Submit Person");
		title.styleName.set(Text.fromString("titleStyle"));
 
		GUIPanelComponent topPanel = GUIPanelComponent.createFlow(root);
		topPanel.styleName.set(Text.fromString("topPanel"));
 
		GUIPanelComponent table = GUIPanelComponent.createTable(topPanel);
 
		int row = 0;
		GUILabelComponent.create(table, "Name: ", row, 0); // instead of "row, 0" at the end, you could use "new TableLayoutDate(row, 0)"
		GUIElementComponent nameInput = GUIElementComponent.createInput(table, "", Text.CLASSIFIER, row++, 1); // second parameter "" (name)
			// is not important unless you use this component in the search form as a parameter
		GUIInputKind.get(nameInput).initialValues.set(ElementDescriptor.create(Text.fromString("New Person"))); // initial value for the name field
 
		GUILabelComponent.create(table, "Gender: ", row, 0);
		GUIElementComponent genderInput = GUIElementComponent.createInput(table, "", Repository.getRepository().getEnumeration(Gender.FQ_TYPE_NAME), row++, 1);
		// for enumeration one must fetch its type using Repository class, which is UML model reflection povider
 
		GUILabelComponent.create(table, "Age: ", row, 0);
		GUIElementComponent ageInput = GUIElementComponent.createInput(table, "", Integer.CLASSIFIER, row++, 1);
 
		GUILabelComponent.create(table, "Date of birth: ", row, 0);
		GUIElementComponent dateOfBirthInput = GUIElementComponent.createInput(table, "", Date.CLASSIFIER, row++, 1);
 
		GUILabelComponent.create(table, "Height [m]: ", row, 0);
		GUIElementComponent heightInput = GUIElementComponent.createInput(table, "", Real.CLASSIFIER, row++, 1);
 
		GUILabelComponent.create(table, "Is married: ", row, 0);
		GUIElementComponent isMarriedInput = GUIElementComponent.createInputCheckbox(table, "", "", true, new TableLayoutData(row++, 1)); // true is initial value
		// if you wish to allow marriage status to be undefined, meaning three value combo (empty, yes and no) instead of two value checkbox use this:
		// GUIElementComponent isMarriedInput2 = GUIElementComponent.createInput(table, "", Boolean.CLASSIFIER, row++, 1);
 
		// take a look at the date picker in CSS  
		// also, take a look at .gwt-TextBox-validation_failed and .dateBoxFormatError 
		// these define how these input widgets react when invalid values are typed in,
		// for example, if value "Java" is typed in the ageInput which is built to accept Integers
 
		// now. let's create buttons
		GUIPanelComponent hp = GUIPanelComponent.createHorizontal(topPanel);
 
		GUIButtonComponent createButton = GUIButtonComponent.create(hp, "Create Person", new CreatePerson());
		createButton.confirmationRequired.set(Boolean.TRUE);
		createButton.confirmationMessage.set(Text.fromString("Are you sure you want to create a person?"));
 
		// let's now bind the button with input parameters' provider components
		GUIComponentBinding.create(nameInput.value, createButton, CreatePerson.PROPERTIES.name);
		GUIComponentBinding.create(ageInput.value, createButton, CreatePerson.PROPERTIES.age);
		GUIComponentBinding.create(genderInput.value, createButton, CreatePerson.PROPERTIES.gender);
		GUIComponentBinding.create(dateOfBirthInput.value, createButton, CreatePerson.PROPERTIES.dateOfBirth);
		GUIComponentBinding.create(heightInput.value, createButton, CreatePerson.PROPERTIES.height);
		GUIComponentBinding.create(isMarriedInput.value, createButton, CreatePerson.PROPERTIES.isMarried);
 
		// let's reset input fields after command execution
		GUIComponentBinding.create(createButton.commandExecuted, GUIInputKind.get(nameInput).reset);
		GUIComponentBinding.create(createButton.commandExecuted, GUIInputKind.get(ageInput).reset);
		GUIComponentBinding.create(createButton.commandExecuted, GUIInputKind.get(genderInput).reset);
		GUIComponentBinding.create(createButton.commandExecuted, GUIInputKind.get(dateOfBirthInput).reset);
		GUIComponentBinding.create(createButton.commandExecuted, GUIInputKind.get(heightInput).reset);
		GUIComponentBinding.create(createButton.commandExecuted, GUIInputKind.get(isMarriedInput).reset);
 
		// let's now create clear and reset form buttons
		// note the difference between reset and clear, reset re-sets the initial values into the input fields, while clear actually makes them empty
		GUIButtonComponent clearButton = GUIButtonComponent.create(hp, "Clear Form");
		GUIComponentBinding.create(clearButton.click, nameInput.clearValue);
		GUIComponentBinding.create(clearButton.click, ageInput.clearValue);
		GUIComponentBinding.create(clearButton.click, genderInput.clearValue);
		GUIComponentBinding.create(clearButton.click, dateOfBirthInput.clearValue);
		GUIComponentBinding.create(clearButton.click, heightInput.clearValue);
		GUIComponentBinding.create(clearButton.click, isMarriedInput.clearValue);
 
		GUIButtonComponent resetButton = GUIButtonComponent.create(hp, "Reset Form");
		GUIComponentBinding.create(resetButton.click, GUIInputKind.get(nameInput).reset);
		GUIComponentBinding.create(resetButton.click, GUIInputKind.get(ageInput).reset);
		GUIComponentBinding.create(resetButton.click, GUIInputKind.get(genderInput).reset);
		GUIComponentBinding.create(resetButton.click, GUIInputKind.get(dateOfBirthInput).reset);
		GUIComponentBinding.create(resetButton.click, GUIInputKind.get(heightInput).reset);
		GUIComponentBinding.create(resetButton.click, GUIInputKind.get(isMarriedInput).reset);
	}
}
Print/export