Skip to content

Commit

Permalink
Merge branch 'feature/gui-wrapper' of https://github.com/Evolveum/mid…
Browse files Browse the repository at this point in the history
…point into feature/gui-wrapper
  • Loading branch information
KaterynaHonchar committed May 16, 2019
2 parents 4462a51 + ebbaec3 commit 52aaf04
Show file tree
Hide file tree
Showing 54 changed files with 694 additions and 580 deletions.
Expand Up @@ -97,29 +97,28 @@ public boolean isVisible() {
inputContainer.setOutputMarkupId(true);
add(inputContainer);

final PasswordTextField password1 = new PasswordTextField(ID_PASSWORD_ONE, new PasswordModel(model));
final PasswordTextField password1 = new SecureModelPasswordTextField(ID_PASSWORD_ONE, new PasswordModel(model));
password1.setRequired(false);
password1.setOutputMarkupId(true);
password1.add(new EmptyOnBlurAjaxFormUpdatingBehaviour());
inputContainer.add(password1);

final PasswordTextField password2 = new PasswordTextField(ID_PASSWORD_TWO, new PasswordModel(Model.of(new ProtectedStringType())));
final PasswordTextField password2 = new SecureModelPasswordTextField(ID_PASSWORD_TWO, new PasswordModel(Model.of(new ProtectedStringType())));
password2.setRequired(false);
password2.setOutputMarkupId(true);
password2.add(new EmptyOnBlurAjaxFormUpdatingBehaviour());
inputContainer.add(password2);

password1.add(new AjaxFormComponentUpdatingBehavior("change") {
@Override
protected void onUpdate(AjaxRequestTarget target) {
boolean required = !StringUtils.isEmpty(password1.getModel().getObject());
boolean required = !StringUtils.isEmpty(password1.getModelObject());
password2.setRequired(required);
//fix of MID-2463
// target.add(password2);
// target.appendJavaScript("$(\"#"+ password2.getMarkupId() +"\").focus()");
}
});
password2.add(new PasswordValidator(password1, password2));
password2.add(new PasswordValidator(password1));

final WebMarkupContainer linkContainer = new WebMarkupContainer(ID_LINK_CONTAINER) {
@Override
Expand Down Expand Up @@ -221,17 +220,15 @@ public FormComponent getBaseFormComponent() {
private static class PasswordValidator implements IValidator<String> {

private PasswordTextField p1;
private PasswordTextField p2;

private PasswordValidator(@NotNull PasswordTextField p1, @NotNull PasswordTextField p2) {
private PasswordValidator(@NotNull PasswordTextField p1) {
this.p1 = p1;
this.p2 = p2;
}

@Override
public void validate(IValidatable<String> validatable) {
String s1 = p1.getModelObject();
String s2 = p2.getModelObject();
String s2 = validatable.getValue();

if (StringUtils.isEmpty(s1) && StringUtils.isEmpty(s2)) {
return;
Expand Down
@@ -0,0 +1,40 @@
/*
* Copyright (c) 2010-2019 Evolveum
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.evolveum.midpoint.gui.api.component.password;

import org.apache.wicket.markup.html.form.PasswordTextField;
import org.apache.wicket.model.IModel;

/**
* PasswordTextField that assumes its underlying model is secure enough to be serialized.
*
* Therefore we can disable "reset password" security feature and - when detaching - clear only our input.
* The model is preserved, because it's considered secure enough.
*/
public class SecureModelPasswordTextField extends PasswordTextField {

public SecureModelPasswordTextField(String id, IModel<String> model) {
super(id, model);
setResetPassword(false);
}

@Override
protected void onDetach() {
clearInput();
super.onDetach();
}
}
Expand Up @@ -15,49 +15,22 @@
*/
package com.evolveum.midpoint.gui.impl.factory;

import java.util.Collection;
import java.util.List;
import javax.xml.namespace.QName;

import javax.annotation.PostConstruct;

import org.apache.wicket.model.IModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.evolveum.midpoint.common.refinery.LayerRefinedAttributeDefinition;
import com.evolveum.midpoint.common.refinery.RefinedAttributeDefinition;
import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.gui.api.prism.ItemStatus;
import com.evolveum.midpoint.gui.api.prism.ItemWrapper;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils;
import com.evolveum.midpoint.gui.impl.page.admin.configuration.component.ComponentLoggerType;
import com.evolveum.midpoint.gui.impl.page.admin.configuration.component.StandardLoggerType;
import com.evolveum.midpoint.gui.impl.prism.PrismContainerPanel;
import com.evolveum.midpoint.gui.api.registry.GuiComponentRegistry;
import com.evolveum.midpoint.gui.impl.prism.PrismContainerValueWrapper;
import com.evolveum.midpoint.gui.impl.prism.PrismPropertyPanel;
import com.evolveum.midpoint.gui.impl.prism.PrismPropertyValueWrapper;
import com.evolveum.midpoint.gui.impl.prism.PrismPropertyWrapper;
import com.evolveum.midpoint.gui.impl.prism.PrismPropertyWrapperImpl;
import com.evolveum.midpoint.gui.impl.prism.PrismValueWrapper;
import com.evolveum.midpoint.gui.impl.prism.ResourceAttributeDefinitionPanel;
import com.evolveum.midpoint.gui.impl.prism.ResourceAttributeDefinitionWrapper;
import com.evolveum.midpoint.gui.impl.prism.ResourceAttributeDefinitionWrapperImpl;
import com.evolveum.midpoint.prism.ItemDefinition;
import com.evolveum.midpoint.prism.PrismProperty;
import com.evolveum.midpoint.prism.PrismPropertyDefinition;
import com.evolveum.midpoint.prism.PrismPropertyValue;
import com.evolveum.midpoint.prism.path.ItemName;
import com.evolveum.midpoint.util.QNameUtil;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.web.component.prism.PropertyWrapper;
import com.evolveum.midpoint.web.component.prism.ValueStatus;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AppenderConfigurationType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ClassLoggerConfigurationType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.LoggingComponentType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.LoggingConfigurationType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.LookupTableRowType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.LookupTableType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceAttributeDefinitionType;
import com.evolveum.prism.xml.ns._public.types_3.PolyStringType;

/**
* @author skublik
Expand All @@ -66,11 +39,10 @@
@Component
public class ResourceAttributeDefinitionWrapperFactoryImpl<T extends ResourceAttributeDefinitionType> extends PrismPropertyWrapperFactoryImpl<T>{

@Autowired private GuiComponentRegistry registry;

@Override
public boolean match(ItemDefinition<?> def) {
// System.out.println("XXXXXXXXXXXXXXXXXX getName " + def.getName());
// System.out.println("XXXXXXXXXXXXXXXXXX class " + def.getClass().getName());
// System.out.println("XXXXXXXXXXXXXXXXXX ---------------------------------- ");
return def instanceof RefinedAttributeDefinition;
}

Expand All @@ -82,28 +54,8 @@ public int getOrder() {
@Override
protected PrismPropertyWrapper<T> createWrapper(PrismContainerValueWrapper<?> parent, PrismProperty<T> item,
ItemStatus status) {
getRegistry().registerWrapperPanel(item.getDefinition().getTypeName(), PrismPropertyPanel.class);
registry.registerWrapperPanel(new QName("ResourceAttributeDefinition"), ResourceAttributeDefinitionPanel.class);
ResourceAttributeDefinitionWrapper<T> propertyWrapper = new ResourceAttributeDefinitionWrapperImpl<>(parent, item, status);
return propertyWrapper;
}

@Override
public PrismPropertyWrapper<T> createWrapper(PrismContainerValueWrapper<?> parent, ItemDefinition<?> def, WrapperContext context) throws SchemaException {
ItemName name = def.getName();

PrismProperty<T> childItem = (PrismProperty) parent.getNewValue().findItem(name);
ItemStatus status = ItemStatus.NOT_CHANGED;
if (childItem == null) {
childItem = (PrismProperty) parent.getNewValue().findOrCreateItem(name);
status = ItemStatus.ADDED;
}

PrismPropertyWrapper<T> itemWrapper = createWrapper(parent, childItem, status);


List<PrismPropertyValueWrapper<T>> valueWrappers = createValuesWrapper(itemWrapper, childItem, context);
itemWrapper.getValues().addAll((Collection) valueWrappers);
itemWrapper.setShowEmpty(context.isCreateIfEmpty(), false);
return itemWrapper;
}
}
Expand Up @@ -53,12 +53,16 @@
import com.evolveum.midpoint.gui.impl.component.data.column.EditableColumn;
import com.evolveum.midpoint.gui.impl.component.form.TriStateFormGroup;
import com.evolveum.midpoint.gui.impl.factory.ItemRealValueModel;
import com.evolveum.midpoint.gui.impl.factory.WrapperContext;
import com.evolveum.midpoint.gui.impl.prism.ItemVisibilityHandler;
import com.evolveum.midpoint.gui.impl.prism.PrismPropertyHeaderPanel;
import com.evolveum.midpoint.gui.impl.prism.PrismPropertyValueWrapper;
import com.evolveum.midpoint.gui.impl.prism.PrismPropertyWrapper;
import com.evolveum.midpoint.gui.impl.prism.PrismValueWrapper;
import com.evolveum.midpoint.prism.PrismPropertyValue;
import com.evolveum.midpoint.prism.query.ObjectPaging;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.web.component.AjaxIconButton;
Expand All @@ -76,8 +80,10 @@
import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItemAction;
import com.evolveum.midpoint.web.component.objectdetails.FocusMainPanel;
import com.evolveum.midpoint.web.component.prism.InputPanel;
import com.evolveum.midpoint.web.component.prism.ValueStatus;
import com.evolveum.midpoint.web.component.util.Editable;
import com.evolveum.midpoint.web.component.util.ListDataProvider;
import com.evolveum.midpoint.web.component.util.ObjectWrapperUtil;
import com.evolveum.midpoint.web.component.util.Selectable;
import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour;
import com.evolveum.midpoint.web.model.PrismPropertyWrapperModel;
Expand Down Expand Up @@ -158,7 +164,11 @@ protected void initLayout() {
// ((PrismPropertyValue<MailConfigurationType>)((List<PrismPropertyValueWrapper<MailConfigurationType>>)mailConfig.getObject().getValues()).get(0)).setValue(mailConfigType);
// }

PropertyModel<MailConfigurationType> mailConfigType = new ItemRealValueModel<>(new PropertyModel<>(mailConfig, "value"));
PropertyModel<MailConfigurationType> mailConfigType = new ItemRealValueModel<>(new PropertyModel<>(mailConfig, "values[0]"));

if(mailConfigType.getObject() == null) {
mailConfigType.setObject(new MailConfigurationType());
}

add(new TextFormGroup(ID_DEFAULT_FROM, new PropertyModel<String>(mailConfigType, "defaultFrom"), createStringResource(mailConfig.getObject().getTypeName().getLocalPart() + ".defaultFrom"), "", getInputCssClass(), false, true));

Expand Down Expand Up @@ -245,11 +255,21 @@ public boolean isVisible() {

@Override
public void onClick(AjaxRequestTarget target) {
//TODO add new value
// ValueWrapperOld<FileConfigurationType> newValue = fileConfig.getObject().createAddedValue();
// ((PrismPropertyValue<FileConfigurationType>)newValue.getValue()).setValue(new FileConfigurationType());
// fileConfig.getObject().getValues().add(newValue);
// target.add(files);
PrismPropertyWrapper<FileConfigurationType> propertyWrapper = fileConfig.getObject();
try {
PrismPropertyValue<FileConfigurationType> newValue = getPrismContext().itemFactory().createPropertyValue();
propertyWrapper.getItem().add(newValue);
WrapperContext context = new WrapperContext(null, null);
PrismPropertyValueWrapper<FileConfigurationType> newValueWrapper =
getPageBase().createValueWrapper(propertyWrapper, newValue, ValueStatus.ADDED, context);
newValueWrapper.setRealValue(new FileConfigurationType());
propertyWrapper.getValues().add(newValueWrapper);
} catch (SchemaException e) {
LOGGER.error("Cannot create new value for {}", propertyWrapper, e);
getSession().error("Cannot create new value for " + propertyWrapper + ". Reason: " + e.getMessage());
target.add(getPageBase().getFeedbackPanel());
}
target.add(files);
}
};
add(addButton);
Expand Down
Expand Up @@ -99,6 +99,10 @@ protected void initHeaderLabel(){
//TODO: pending operations
}

protected WebMarkupContainer getLabelContainer() {
return (WebMarkupContainer)get(ID_LABEL_CONTAINER);
}

private void createTitle(WebMarkupContainer labelContainer) {
Component displayName = createTitle(new PropertyModel<>(getModel(), "displayName"));//.of(getModel(), IW::getDisplayName));
displayName.add(new AttributeModifier("style", getDeprecatedCss()));
Expand Down
Expand Up @@ -80,14 +80,18 @@ protected void onInitialize() {
private void initLayout() {

Panel headerPanel = createHeaderPanel();
headerPanel.add(new VisibleBehaviour(() -> getParent().findParent(AbstractItemWrapperColumnPanel.class) == null));
headerPanel.add(new VisibleBehaviour(() -> getHeaderVisibility()));
add(headerPanel);

ListView<VW> valuesPanel = createValuesPanel();
add(valuesPanel);

}

protected boolean getHeaderVisibility() {
return getParent().findParent(AbstractItemWrapperColumnPanel.class) == null;
}

protected abstract Panel createHeaderPanel();

protected ListView<VW> createValuesPanel() {
Expand Down
Expand Up @@ -18,14 +18,32 @@
<html xmlns:wicket="http://wicket.apache.org">
<wicket:panel>

<div wicket:id="containers">
<!-- <div wicket:id="containers">
<div class="row">
<div wicket:id="selected"/>
<div wicket:id="definition"/>
</div>
</div>

<a class="btn btn-primary" wicket:id="select"/>

</div> -->
<div class="row" style="padding-left: 10px; padding-right: 5px;">
<table class="col-md-12">
<thead>
<tr class="col-md-12">
<th class="col-md-2">
<wicket:message key="ListContainersPopup.selected"/>
</th>
<th class="col-md-10">
<wicket:message key="ListContainersPopup.name"/>
</th>
</tr>
</thead>
<tbody>
<tr class="col-md-12" wicket:id="containers">
<td class="col-md-2" wicket:id="selected"/>
<td class="col-md-10" wicket:id="definition"/>
</tr>
</tbody>
</table>
<a class="btn btn-primary pull-right" wicket:id="select"/>
</div>
</wicket:panel>
</html>
Expand Up @@ -20,6 +20,7 @@

import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
Expand Down Expand Up @@ -85,12 +86,20 @@ protected List<ContainersPopupDto> load() {
protected void populateItem(ListItem<ContainersPopupDto> item) {

CheckFormGroup checkFormGroup = new CheckFormGroup(ID_SELECTED, new PropertyModel<Boolean>(item.getModel(), "selected"),
new StringResourceModel("ListContainersPopup.selected"), "col-md-2", "col-md-10");
new StringResourceModel("ListContainersPopup.selected"), "col-md-2", "col-md-10") {

protected boolean getLabelVisible() {
return false;
};

};
checkFormGroup.getCheck().add(new EmptyOnBlurAjaxFormUpdatingBehaviour());
checkFormGroup.add(AttributeAppender.append("class", " checkbox-without-margin-bottom "));
checkFormGroup.setOutputMarkupId(true);
item.add(checkFormGroup);

Label definition = new Label(ID_DEFINITION, StringResourceModel.of(item.getModelObject()::getDisplayName));
String displayNameKey = item.getModelObject() != null ? item.getModelObject().getDisplayName() : "";
Label definition = new Label(ID_DEFINITION, new StringResourceModel(displayNameKey));
definition.setOutputMarkupId(true);
item.add(definition);
}
Expand Down Expand Up @@ -125,12 +134,12 @@ public void onClick(AjaxRequestTarget target) {

@Override
public int getWidth() {
return 400;
return 20;
}

@Override
public int getHeight() {
return 600;
return 0;
}

@Override
Expand All @@ -153,5 +162,6 @@ public Component getComponent() {
return this;
}


}

Expand Up @@ -22,9 +22,7 @@
<div class="container-wrapper">
<div class="prism-properties">
<div wicket:id="values">
<div class="row prism-property" style="padding-left: 0px; padding-right: 0px; width:100%">
<div class="container-fluid" wicket:id="value"/>
</div>
<div class="row prism-property container-fluid" style="width:100%" wicket:id="value"/>
</div>
</div>
</div>
Expand Down

0 comments on commit 52aaf04

Please sign in to comment.