package com.evolveum.midpoint.web.page.admin.roles.component; import com.evolveum.midpoint.gui.api.model.LoadableModel; import com.evolveum.midpoint.gui.api.page.PageBase; import com.evolveum.midpoint.gui.api.util.WebComponentUtil; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.web.component.AjaxSubmitButton; import com.evolveum.midpoint.web.component.dialog.Popupable; import com.evolveum.midpoint.web.component.form.DropDownFormGroup; import com.evolveum.midpoint.web.component.form.TextAreaFormGroup; import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; import com.evolveum.midpoint.xml.ns._public.common.common_3.MultiplicityPolicyConstraintType; import com.evolveum.midpoint.xml.ns._public.common.common_3.PolicyConstraintEnforcementType; import org.apache.commons.lang.StringUtils; import org.apache.wicket.Component; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.form.OnChangeAjaxBehavior; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.form.CheckBox; import org.apache.wicket.markup.html.form.EnumChoiceRenderer; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.model.IModel; import org.apache.wicket.model.PropertyModel; import org.apache.wicket.model.StringResourceModel; import org.apache.wicket.validation.IValidatable; import org.apache.wicket.validation.IValidator; /** * Created by honchar the panel is to be used as a content component for main * popup window from the PageBase class */ public class MultiplicityPolicyPanel extends Panel implements Popupable { private static final Trace LOGGER = TraceManager.getTrace(MultiplicityPolicyPanel.class); private static final String ID_MAIN_FORM = "mainForm"; private static final String ID_DESCRIPTION = "description"; private static final String ID_ENFORCEMENT = "enforcement"; private static final String ID_MULTIPLICITY_CONTAINER = "multiplicityContainer"; private static final String ID_MULTIPLICITY = "multiplicity"; private static final String ID_MULTIPLICITY_UNBOUND = "multiplicityUnbounded"; private static final String ID_BUTTON_SAVE = "saveButton"; private static final String ID_BUTTON_CANCEL = "cancelButton"; private static final String ID_LABEL_SIZE = "col-md-4"; private static final String ID_INPUT_SIZE = "col-md-8"; private static final String MULTIPLICITY_UNBOUNDED = "unbounded"; private boolean unbounded = false; private IModel<MultiplicityPolicyConstraintType> model; public MultiplicityPolicyPanel(String id, final MultiplicityPolicyConstraintType policy) { super(id); model = new LoadableModel<MultiplicityPolicyConstraintType>(false) { @Override protected MultiplicityPolicyConstraintType load() { return loadModel(policy); } }; setOutputMarkupId(true); initLayout(); } public IModel<MultiplicityPolicyConstraintType> getModel() { return model; } private MultiplicityPolicyConstraintType loadModel(MultiplicityPolicyConstraintType policy) { return policy == null ? new MultiplicityPolicyConstraintType() : policy; } public StringResourceModel createStringResource(String resourceKey, Object... objects) { return PageBase.createStringResourceStatic(this, resourceKey, objects); } public void updateModel(AjaxRequestTarget target, MultiplicityPolicyConstraintType policy) { if (policy == null) { warn("MultiplicityPolicyDialog.message.badUpdate"); target.add(getPageBase().getFeedbackPanel()); } model.setObject(policy); target.add(getMainForm()); } private PageBase getPageBase() { return (PageBase) getPage(); } private void initLayout() { Form form = new Form(ID_MAIN_FORM); form.setOutputMarkupId(true); add(form); TextAreaFormGroup description = new TextAreaFormGroup(ID_DESCRIPTION, new PropertyModel<String>(model, MultiplicityPolicyConstraintType.F_DESCRIPTION.getLocalPart()), createStringResource("multiplicityContainer.label.description"), ID_LABEL_SIZE, ID_INPUT_SIZE); form.add(description); DropDownFormGroup enforcement = new DropDownFormGroup<>(ID_ENFORCEMENT, new PropertyModel<PolicyConstraintEnforcementType>(model, MultiplicityPolicyConstraintType.F_ENFORCEMENT.getLocalPart()), WebComponentUtil.createReadonlyModelFromEnum(PolicyConstraintEnforcementType.class), new EnumChoiceRenderer<PolicyConstraintEnforcementType>(), createStringResource("multiplicityContainer.label.enforcement"), ID_LABEL_SIZE, ID_INPUT_SIZE, false); form.add(enforcement); WebMarkupContainer multiplicityContainer = new WebMarkupContainer(ID_MULTIPLICITY_CONTAINER); multiplicityContainer.setOutputMarkupId(true); form.add(multiplicityContainer); TextField multiplicity = new TextField<>(ID_MULTIPLICITY, new PropertyModel<String>(model, MultiplicityPolicyConstraintType.F_MULTIPLICITY.getLocalPart())); multiplicity.add(prepareMultiplicityValidator()); multiplicity.add(new VisibleEnableBehaviour() { @Override public boolean isEnabled() { return !unbounded; } }); multiplicityContainer.add(multiplicity); CheckBox multiplicityUnbounded = new CheckBox(ID_MULTIPLICITY_UNBOUND, new PropertyModel<Boolean>(this, MULTIPLICITY_UNBOUNDED)); multiplicityUnbounded.add(new OnChangeAjaxBehavior() { @Override protected void onUpdate(AjaxRequestTarget target) { model.getObject().setMultiplicity(MULTIPLICITY_UNBOUNDED); target.add(getMultiplicityContainer()); } }); multiplicityContainer.add(multiplicityUnbounded); initButtons(form); } private void initButtons(Form mainForm) { AjaxSubmitButton cancel = new AjaxSubmitButton(ID_BUTTON_CANCEL, createStringResource("PageBase.button.cancel")) { @Override protected void onSubmit(AjaxRequestTarget target, Form<?> form) { cancelPerformed(target); } }; mainForm.add(cancel); AjaxSubmitButton save = new AjaxSubmitButton(ID_BUTTON_SAVE, createStringResource("PageBase.button.save")) { @Override protected void onSubmit(AjaxRequestTarget target, Form<?> form) { savePerformed(target); } }; mainForm.add(save); } private IValidator<String> prepareMultiplicityValidator() { return new IValidator<String>() { @Override public void validate(IValidatable<String> toValidate) { String multiplicity = toValidate.getValue(); if (!StringUtils.isNumeric(multiplicity) && !multiplicity.equals(MULTIPLICITY_UNBOUNDED)) { error(getString("MultiplicityPolicyDialog.message.invalidMultiplicity")); } } }; } private WebMarkupContainer getMultiplicityContainer() { return (WebMarkupContainer) get( StringUtils.join(new String[] { ID_MAIN_FORM, ID_MULTIPLICITY_CONTAINER }, ":")); } private Component getMainForm() { return get(ID_MAIN_FORM); } /** * Override to provide call-back to situation when cancel button is clicked */ protected void cancelPerformed(AjaxRequestTarget target) { getPageBase().hideMainPopup(target); } /** * Override to provide call-back to situation when save button is clicked */ protected void savePerformed(AjaxRequestTarget target) { } @Override public int getWidth() { return 625; } @Override public int getHeight() { return 400; } @Override public StringResourceModel getTitle() { return new StringResourceModel("MultiplicityPolicyDialog.label"); } @Override public Component getComponent() { return this; } }