Skip to content

Commit

Permalink
org tree members panel - archetype implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
KaterynaHonchar committed Apr 17, 2019
1 parent a4cab40 commit 20286a7
Show file tree
Hide file tree
Showing 6 changed files with 176 additions and 44 deletions.
Expand Up @@ -19,6 +19,8 @@
import java.util.*;

import com.evolveum.midpoint.gui.api.GuiStyleConstants;
import com.evolveum.midpoint.gui.impl.component.icon.CompositedIconBuilder;
import com.evolveum.midpoint.gui.impl.component.icon.IconCssStyle;
import com.evolveum.midpoint.web.component.MultifunctionalButton;
import com.evolveum.midpoint.xml.ns._public.common.common_3.DisplayType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.IconType;
Expand Down Expand Up @@ -144,6 +146,16 @@ protected DisplayType getMainButtonDisplayType(){
return getNewObjectButtonStandardDisplayType();
}

@Override
protected CompositedIconBuilder getAdditionalIconBuilder(S influencingObject, DisplayType additionalButtonDisplayType){
CompositedIconBuilder builder = MainObjectListPanel.this.getNewObjectButtonAdditionalIconBuilder(influencingObject, additionalButtonDisplayType);
if (builder == null){
return super.getAdditionalIconBuilder(influencingObject, additionalButtonDisplayType);
} else {
return builder;
}
}

@Override
protected DisplayType getDefaultObjectButtonDisplayType(){
return getNewObjectButtonSpecialDisplayType();
Expand Down Expand Up @@ -277,6 +289,10 @@ protected DisplayType getNewObjectButtonAdditionalDisplayType(S buttonObject){
return null;
}

protected CompositedIconBuilder getNewObjectButtonAdditionalIconBuilder(S influencingObject, DisplayType additionalButtonDisplayType){
return null;
}

private static class ButtonBar extends Fragment {

private static final long serialVersionUID = 1L;
Expand Down
Expand Up @@ -2744,6 +2744,21 @@ public static <AR extends AbstractRoleType> IModel<String> createAbstractRoleCon
actionName, ((ObjectType)((SelectableBean)action.getRowModel().getObject()).getValue()).getName());
}
}

public static DisplayType getNewObjectDisplayTypeFromCollectionView(CompiledObjectCollectionView view, PageBase pageBase){
DisplayType displayType = view != null ? view.getDisplay() : null;
if (displayType == null){
displayType = WebComponentUtil.createDisplayType(GuiStyleConstants.CLASS_ADD_NEW_OBJECT, "green", "");
}
if (PolyStringUtils.isEmpty(displayType.getTooltip()) && !PolyStringUtils.isEmpty(displayType.getLabel())){
StringBuilder sb = new StringBuilder();
sb.append(pageBase.createStringResource("MainObjectListPanel.newObject").getString());
sb.append(" ");
sb.append(displayType.getLabel().getOrig().toLowerCase());
displayType.setTooltip(WebComponentUtil.createPolyFromOrigString(sb.toString()));
}
return view != null ? view.getDisplay() : null;
}

public static List<ItemPath> getShadowItemsToShow() {
return Arrays.asList(
Expand Down
Expand Up @@ -95,11 +95,7 @@ public void onClick(AjaxRequestTarget target) {
additionalButtonDisplayType.getIcon().setCssClass(defaultObjectButtonDisplayType.getIcon().getCssClass());
}

CompositedIconBuilder additionalButtonBuilder = new CompositedIconBuilder();
additionalButtonBuilder.setBasicIcon(WebComponentUtil.getIconCssClass(additionalButtonDisplayType), IconCssStyle.IN_ROW_STYLE)
.appendColorHtmlValue(WebComponentUtil.getIconColor(additionalButtonDisplayType))
.appendLayerIcon(GuiStyleConstants.CLASS_PLUS_CIRCLE, IconCssStyle.BOTTOM_RIGHT_STYLE, GuiStyleConstants.GREEN_COLOR);

CompositedIconBuilder additionalButtonBuilder = getAdditionalIconBuilder(additionalButtonObject, additionalButtonDisplayType);
AjaxCompositedIconButton additionalButton = new AjaxCompositedIconButton(buttonsPanel.newChildId(), additionalButtonBuilder.build(),
Model.of(WebComponentUtil.getDisplayTypeTitle(additionalButtonDisplayType))) {

Expand Down Expand Up @@ -150,6 +146,14 @@ public void onClick(AjaxRequestTarget target) {
*/
protected abstract DisplayType getDefaultObjectButtonDisplayType();

protected CompositedIconBuilder getAdditionalIconBuilder(S additionalButtonObject, DisplayType additionalButtonDisplayType){
CompositedIconBuilder builder = new CompositedIconBuilder();
builder.setBasicIcon(WebComponentUtil.getIconCssClass(additionalButtonDisplayType), IconCssStyle.IN_ROW_STYLE)
.appendColorHtmlValue(WebComponentUtil.getIconColor(additionalButtonDisplayType))
.appendLayerIcon(GuiStyleConstants.CLASS_PLUS_CIRCLE, IconCssStyle.BOTTOM_RIGHT_STYLE, GuiStyleConstants.GREEN_COLOR);
return builder;
}

private DisplayType validateDisplayType(DisplayType displayType){
if (displayType == null){
displayType = new DisplayType();
Expand Down
Expand Up @@ -117,15 +117,15 @@ protected List<CompiledObjectCollectionView> getNewObjectInfluencesList(){
@Override
protected DisplayType getNewObjectButtonStandardDisplayType(){
if (isCollectionViewPage()){
return getCollectionViewDisplayType(getCollectionViewObject());
return WebComponentUtil.getNewObjectDisplayTypeFromCollectionView(getCollectionViewObject(), PageAdminObjectList.this);
} else {
return super.getNewObjectButtonStandardDisplayType();
}
}

@Override
protected DisplayType getNewObjectButtonAdditionalDisplayType(CompiledObjectCollectionView collectionView){
return getCollectionViewDisplayType(collectionView);
return WebComponentUtil.getNewObjectDisplayTypeFromCollectionView(collectionView, PageAdminObjectList.this);
}

@Override
Expand Down Expand Up @@ -248,19 +248,4 @@ private boolean isCollectionViewPage(){
StringValue collectionNameParam = getCollectionNameParameterValue();
return collectionNameParam != null && !collectionNameParam.isEmpty() && !collectionNameParam.toString().equals("null");
}

private DisplayType getCollectionViewDisplayType(CompiledObjectCollectionView view){
DisplayType displayType = view != null ? view.getDisplay() : null;
if (displayType == null){
displayType = WebComponentUtil.createDisplayType(GuiStyleConstants.CLASS_ADD_NEW_OBJECT, "green", "");
}
if (PolyStringUtils.isEmpty(displayType.getTooltip()) && !PolyStringUtils.isEmpty(displayType.getLabel())){
StringBuilder sb = new StringBuilder();
sb.append(createStringResource("MainObjectListPanel.newObject").getString());
sb.append(" ");
sb.append(displayType.getLabel().getOrig().toLowerCase());
displayType.setTooltip(WebComponentUtil.createPolyFromOrigString(sb.toString()));
}
return view != null ? view.getDisplay() : null;
}
}
Expand Up @@ -24,8 +24,11 @@

import javax.xml.namespace.QName;

import com.evolveum.midpoint.gui.impl.component.icon.CompositedIconBuilder;
import com.evolveum.midpoint.gui.impl.component.icon.IconCssStyle;
import com.evolveum.midpoint.model.api.AssignmentCandidatesSpecification;
import com.evolveum.midpoint.model.api.AssignmentObjectRelation;
import com.evolveum.midpoint.model.api.authentication.CompiledObjectCollectionView;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.query.QueryFactory;
import com.evolveum.midpoint.prism.query.builder.S_FilterEntryOrEmpty;
Expand Down Expand Up @@ -106,6 +109,7 @@ protected enum MemberOperation {
private static final Trace LOGGER = TraceManager.getTrace(AbstractRoleMemberPanel.class);
private static final String DOT_CLASS = AbstractRoleMemberPanel.class.getName() + ".";
protected static final String OPERATION_LOAD_MEMBER_RELATIONS = DOT_CLASS + "loadMemberRelationsList";
protected static final String OPERATION_LOAD_CANDIDATE_SPECIFICATION = DOT_CLASS + "loadCandidateSpecification";

protected static final String ID_FORM = "form";

Expand Down Expand Up @@ -196,7 +200,7 @@ private void initMemberTable(Form<?> form) {
Class type = getMemberPanelStorage() != null && getMemberPanelStorage().getType() != null ?
getMemberPanelStorage().getType().getClassDefinition() : ObjectType.class;
//TODO QName defines a relation value which will be used for new member creation
MainObjectListPanel<ObjectType, QName> childrenListPanel = new MainObjectListPanel<ObjectType, QName>(
MainObjectListPanel<ObjectType, AssignmentObjectRelation> childrenListPanel = new MainObjectListPanel<ObjectType, AssignmentObjectRelation>(
ID_MEMBER_TABLE, type, getTableId(getComplexTypeQName()), getSearchOptions(), pageBase) {

private static final long serialVersionUID = 1L;
Expand All @@ -216,9 +220,41 @@ protected boolean isClickable(IModel<SelectableBean<ObjectType>> rowModel) {
return WebComponentUtil.hasDetailsPage(objectClass);
}

@Override
protected List<AssignmentObjectRelation> getNewObjectInfluencesList() {
return prepareAssignmentListForMemberCreation();
}

@Override
protected DisplayType getNewObjectButtonAdditionalDisplayType(AssignmentObjectRelation relationSpec){
return WebComponentUtil.getAssignmentObjectRelationDisplayType(relationSpec,
createStringResource("abstractRoleMemberPanel.menu.createMember").getString());
}

@Override
protected DisplayType getNewObjectButtonSpecialDisplayType(){
return getCreateMemberButtonDisplayType();
}

@Override
protected CompositedIconBuilder getNewObjectButtonAdditionalIconBuilder(AssignmentObjectRelation relationSpec, DisplayType additionalButtonDisplayType){
CompositedIconBuilder builder = new CompositedIconBuilder();
QName objectType = relationSpec != null && relationSpec.getObjectTypes() != null && relationSpec.getObjectTypes().size() > 0 ?
relationSpec.getObjectTypes().get(0) : null;
if (objectType != null) {
builder.setBasicIcon(WebComponentUtil.getIconCssClass(additionalButtonDisplayType), IconCssStyle.IN_ROW_STYLE)
.appendColorHtmlValue(WebComponentUtil.getIconColor(additionalButtonDisplayType))
.appendLayerIcon(GuiStyleConstants.CLASS_PLUS_CIRCLE, IconCssStyle.BOTTOM_RIGHT_STYLE, GuiStyleConstants.GREEN_COLOR)
.appendLayerIcon(WebComponentUtil.createDefaultBlackIcon(objectType), IconCssStyle.BOTTOM_LEFT_STYLE);
return builder;
} else {
return null;
}
}

@Override
protected void newObjectPerformed(AjaxRequestTarget target, QName influencingObject) {
AbstractRoleMemberPanel.this.createFocusMemberPerformed(target);
protected void newObjectPerformed(AjaxRequestTarget target, AssignmentObjectRelation relationSpec) {
AbstractRoleMemberPanel.this.createFocusMemberPerformed(target, relationSpec);
}

@Override
Expand Down Expand Up @@ -257,17 +293,6 @@ protected DisplayType getDefaultObjectButtonDisplayType(){
assignButton.add(AttributeAppender.append("class", "btn-margin-right"));


// AjaxIconButton assignButton = new AjaxIconButton(buttonId, new Model<>(GuiStyleConstants.CLASS_ASSIGN), //TODO change icon class
// createStringResource("TreeTablePanel.menu.addMembers")) {
//
// private static final long serialVersionUID = 1L;
//
// @Override
// public void onClick(AjaxRequestTarget target) {
// AbstractRoleMemberPanel.this.assignMembers(target, getSupportedRelations());
// }
// };
// assignButton.add(AttributeAppender.append("class", "btn btn-default btn-sm"));
buttonsList.add(1, assignButton);
return buttonsList;
}
Expand Down Expand Up @@ -338,12 +363,68 @@ protected QName getComplexTypeQName() {
return getModelObject().asPrismObject().getComplexTypeDefinition().getTypeName();
}

private DisplayType getCreateMemberButtonDisplayType(){
return WebComponentUtil.createDisplayType(GuiStyleConstants.CLASS_ADD_NEW_OBJECT, "green",
AbstractRoleMemberPanel.this.createStringResource("abstractRoleMemberPanel.menu.createMember").getString());
}

private DisplayType getAssignMemberButtonDisplayType(){
return WebComponentUtil.createDisplayType(GuiStyleConstants.EVO_ASSIGNMENT_ICON, "green",
AbstractRoleMemberPanel.this.createStringResource("abstractRoleMemberPanel.menu.assignMember").getString());
}

private List<InlineMenuItem> createRowActions() {
private List<AssignmentObjectRelation> prepareAssignmentListForMemberCreation(){
List<AssignmentObjectRelation> relationsList = loadMemberRelationsList();
if (relationsList == null){
return null;
}
List<AssignmentObjectRelation> dividedByRelationList = WebComponentUtil.getRelationsDividedList(relationsList);
List<AssignmentObjectRelation> resultList = new ArrayList<>();
dividedByRelationList.forEach(assignmentObjectRelation -> {
if (CollectionUtils.isNotEmpty(assignmentObjectRelation.getObjectTypes())){
assignmentObjectRelation.getObjectTypes().forEach(objectType -> {
if (CollectionUtils.isNotEmpty(assignmentObjectRelation.getArchetypeRefs())){
assignmentObjectRelation.getArchetypeRefs().forEach(archetypeRef -> {
AssignmentObjectRelation newRelation = new AssignmentObjectRelation();
newRelation.setObjectTypes(Arrays.asList(objectType));
newRelation.setRelations(assignmentObjectRelation.getRelations());
newRelation.setArchetypeRefs(Arrays.asList(archetypeRef));
newRelation.setDescription(assignmentObjectRelation.getDescription());
resultList.add(newRelation);
});
} else {
AssignmentObjectRelation newRelation = new AssignmentObjectRelation();
newRelation.setObjectTypes(Arrays.asList(objectType));
newRelation.setRelations(assignmentObjectRelation.getRelations());
newRelation.setArchetypeRefs(assignmentObjectRelation.getArchetypeRefs());
newRelation.setDescription(assignmentObjectRelation.getDescription());
resultList.add(newRelation);
}
});
} else {
if (CollectionUtils.isNotEmpty(assignmentObjectRelation.getArchetypeRefs())){
assignmentObjectRelation.getArchetypeRefs().forEach(archetypeRef -> {
AssignmentObjectRelation newRelation = new AssignmentObjectRelation();
newRelation.setObjectTypes(assignmentObjectRelation.getObjectTypes());
newRelation.setRelations(assignmentObjectRelation.getRelations());
newRelation.setArchetypeRefs(Arrays.asList(archetypeRef));
newRelation.setDescription(assignmentObjectRelation.getDescription());
resultList.add(newRelation);
});
} else {
AssignmentObjectRelation newRelation = new AssignmentObjectRelation();
newRelation.setObjectTypes(assignmentObjectRelation.getObjectTypes());
newRelation.setRelations(assignmentObjectRelation.getRelations());
newRelation.setArchetypeRefs(assignmentObjectRelation.getArchetypeRefs());
newRelation.setDescription(assignmentObjectRelation.getDescription());
resultList.add(newRelation);
}
}
});
return resultList;
}

private List<InlineMenuItem> createRowActions() {
List<InlineMenuItem> menu = new ArrayList<>();
if (isAuthorized(GuiAuthorizationConstants.MEMBER_OPERATION_ASSIGN)) {
menu.add(new InlineMenuItem(createStringResource("abstractRoleMemberPanel.menu.assign")) {
Expand Down Expand Up @@ -467,18 +548,24 @@ private boolean isAuthorized(String action) {
}

private List<AssignmentObjectRelation> loadMemberRelationsList(){
OperationResult result = new OperationResult(OPERATION_LOAD_MEMBER_RELATIONS);
List<AssignmentObjectRelation> assignmentTargetRelations = new ArrayList<>();
AssignmentCandidatesSpecification spec = loadCandidateSpecification();
assignmentTargetRelations = spec != null ? spec.getAssignmentObjectRelations() : new ArrayList<>();
return assignmentTargetRelations;
}

private AssignmentCandidatesSpecification loadCandidateSpecification(){
OperationResult result = new OperationResult(OPERATION_LOAD_MEMBER_RELATIONS);
PrismObject obj = getModelObject().asPrismObject();
AssignmentCandidatesSpecification spec = null;
try {
AssignmentCandidatesSpecification spec = getPageBase().getModelInteractionService()
.determineAssignmentTargetSpecification(obj, result);
assignmentTargetRelations = spec != null ? spec.getAssignmentObjectRelations() : new ArrayList<>();
spec = getPageBase().getModelInteractionService()
.determineAssignmentHolderSpecification(obj, result);
} catch (SchemaException | ConfigurationException ex){
result.recordPartialError(ex.getLocalizedMessage());
LOGGER.error("Couldn't load member relations list for the object {} , {}", obj.getName(), ex.getLocalizedMessage());
}
return assignmentTargetRelations;
return spec;
}

protected void assignMembers(AjaxRequestTarget target, List<QName> availableRelationList) {
Expand Down Expand Up @@ -561,7 +648,10 @@ protected QName getDefaultObjectType() {
}

protected void createFocusMemberPerformed(AjaxRequestTarget target) {
createFocusMemberPerformed(target, null);
}

protected void createFocusMemberPerformed(AjaxRequestTarget target, AssignmentObjectRelation relationSpec) {
ChooseFocusTypeAndRelationDialogPanel chooseTypePopupContent = new ChooseFocusTypeAndRelationDialogPanel(
getPageBase().getMainPopupBodyId()) {
private static final long serialVersionUID = 1L;
Expand Down Expand Up @@ -591,12 +681,33 @@ protected void okPerformed(QName type, Collection<QName> relations, AjaxRequestT
}
AbstractRoleMemberPanel.this.getPageBase().hideMainPopup(target);
try {
WebComponentUtil.initNewObjectWithReference(AbstractRoleMemberPanel.this.getPageBase(), AbstractRoleMemberPanel.this.getModelObject(), type, relations);
List<ObjectReferenceType> newReferences = new ArrayList<>();
for (QName relation : relations) {
newReferences.add(ObjectTypeUtil.createObjectRef(AbstractRoleMemberPanel.this.getModelObject(), relation));
}
// if (collectionView != null && collectionView.getCollection() != null){
// newReferences.add(collectionView.getCollection().getCollectionRef());
// }

WebComponentUtil.initNewObjectWithReference(AbstractRoleMemberPanel.this.getPageBase(), type, newReferences);
} catch (SchemaException e) {
throw new SystemException(e.getMessage(), e);
}

};
}

@Override
protected QName getDefaultObjectType() {
if (relationSpec != null && CollectionUtils.isNotEmpty(relationSpec.getObjectTypes())){
return relationSpec.getObjectTypes().get(0);
}
return super.getDefaultObjectType();
}

@Override
protected boolean isFocusTypeSelectorVisible() {
return relationSpec == null;
}
};

getPageBase().showMainPopup(chooseTypePopupContent, target);
Expand Down
Expand Up @@ -4291,6 +4291,7 @@ chooseFocusTypeAndRelationDialogPanel.type=Type
chooseFocusTypeAndRelationDialogPanel.tooltip.type=Assignment holder/target object type
abstractRoleMemberPanel.menu.assign=Assign
abstractRoleMemberPanel.menu.assignMember=Assign member
abstractRoleMemberPanel.menu.createMember=Create member
abstractRoleMemberPanel.menu.unassign=Unassign
abstractRoleMemberPanel.menu.recompute=Recompute
abstractRoleMemberPanel.menu.create=Create
Expand Down

0 comments on commit 20286a7

Please sign in to comment.