/* * Copyright 2017 Red Hat, Inc. and/or its affiliates. * * 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 org.kie.workbench.common.screens.library.client.screens.organizationalunit.popup; import java.util.ArrayList; import java.util.Collection; import javax.enterprise.event.Event; import javax.inject.Inject; import org.guvnor.structure.client.security.OrganizationalUnitController; import org.guvnor.structure.events.AfterCreateOrganizationalUnitEvent; import org.guvnor.structure.events.AfterEditOrganizationalUnitEvent; import org.guvnor.structure.organizationalunit.OrganizationalUnit; import org.guvnor.structure.organizationalunit.OrganizationalUnitService; import org.guvnor.structure.repositories.Repository; import org.jboss.errai.common.client.api.Caller; import org.jboss.errai.ioc.client.api.AfterInitialization; import org.uberfire.client.mvp.UberElement; import org.uberfire.ext.widgets.common.client.callbacks.HasBusyIndicatorDefaultErrorCallback; import org.uberfire.ext.widgets.common.client.common.HasBusyIndicator; import org.uberfire.mvp.Command; import org.uberfire.workbench.events.NotificationEvent; public class OrganizationalUnitPopUpPresenter { public interface View extends UberElement<OrganizationalUnitPopUpPresenter>, HasBusyIndicator { void showAddPopUp(); void showEditPopUp(OrganizationalUnit organizationalUnit); void hide(); void clear(); void showError(final String errorMessage); String getName(); String getDefaultGroupId(); String getOwner(); String getEmptyNameValidationMessage(); String getEmptyDefaultGroupIdValidationMessage(); String getInvalidDefaultGroupIdValidationMessage(); String getDuplicatedOrganizationalUnitValidationMessage(); String getSavingMessage(); String getSaveSuccessMessage(); } private View view; private Caller<OrganizationalUnitService> organizationalUnitService; private Event<AfterCreateOrganizationalUnitEvent> afterCreateOrganizationalUnitEvent; private Event<AfterEditOrganizationalUnitEvent> afterEditOrganizationalUnitEvent; private Event<NotificationEvent> notificationEvent; private OrganizationalUnitController organizationalUnitController; private OrganizationalUnit organizationalUnit; @Inject public OrganizationalUnitPopUpPresenter(final View view, final Caller<OrganizationalUnitService> organizationalUnitService, final Event<AfterCreateOrganizationalUnitEvent> afterCreateOrganizationalUnitEvent, final Event<AfterEditOrganizationalUnitEvent> afterEditOrganizationalUnitEvent, final Event<NotificationEvent> notificationEvent, final OrganizationalUnitController organizationalUnitController) { this.view = view; this.organizationalUnitService = organizationalUnitService; this.afterCreateOrganizationalUnitEvent = afterCreateOrganizationalUnitEvent; this.afterEditOrganizationalUnitEvent = afterEditOrganizationalUnitEvent; this.notificationEvent = notificationEvent; this.organizationalUnitController = organizationalUnitController; } @AfterInitialization public void setup() { view.init(this); } public void showAddPopUp() { if (organizationalUnitController.canCreateOrgUnits()) { view.clear(); view.showAddPopUp(); } } public void showEditPopUp(final OrganizationalUnit organizationalUnit) { if (organizationalUnitController.canUpdateOrgUnit(organizationalUnit)) { view.showEditPopUp(organizationalUnit); this.organizationalUnit = organizationalUnit; } } public void save() { final String name = view.getName(); final String defaultGroupId = view.getDefaultGroupId(); final String owner = view.getOwner(); view.showBusyIndicator(view.getSavingMessage()); validateFields(() -> { if (organizationalUnit == null) { saveCreation(name, defaultGroupId, owner); } else { saveEdition(name, defaultGroupId, owner); } }); } void saveEdition(String name, String defaultGroupId, String owner) { organizationalUnitService.call((OrganizationalUnit newOrganizationalUnit) -> { afterEditOrganizationalUnitEvent.fire(new AfterEditOrganizationalUnitEvent(OrganizationalUnitPopUpPresenter.this.organizationalUnit, newOrganizationalUnit)); view.hideBusyIndicator(); notificationEvent.fire(new NotificationEvent(view.getSaveSuccessMessage(), NotificationEvent.NotificationType.SUCCESS)); view.hide(); }, new HasBusyIndicatorDefaultErrorCallback(view)).updateOrganizationalUnit(name, owner, defaultGroupId); } void saveCreation(final String name, final String defaultGroupId, final String owner) { final Command saveCommand = () -> { final Collection<Repository> repositories = new ArrayList<>(); organizationalUnitService.call((OrganizationalUnit newOrganizationalUnit) -> { afterCreateOrganizationalUnitEvent.fire(new AfterCreateOrganizationalUnitEvent(newOrganizationalUnit)); view.hideBusyIndicator(); notificationEvent.fire(new NotificationEvent(view.getSaveSuccessMessage(), NotificationEvent.NotificationType.SUCCESS)); view.hide(); }, new HasBusyIndicatorDefaultErrorCallback(view)).createOrganizationalUnit(name, owner, defaultGroupId, repositories); }; validateDuplicatedOrganizationalUnit(name, saveCommand); } private void validateFields(final Command successCallback) { final String name = view.getName(); if (isEmpty(name)) { view.hideBusyIndicator(); view.showError(view.getEmptyNameValidationMessage()); return; } final String defaultGroupId = view.getDefaultGroupId(); if (isEmpty(defaultGroupId)) { view.hideBusyIndicator(); view.showError(view.getEmptyDefaultGroupIdValidationMessage()); return; } organizationalUnitService.call((Boolean valid) -> { if (!valid) { view.hideBusyIndicator(); view.showError(view.getInvalidDefaultGroupIdValidationMessage()); return; } if (successCallback != null) { successCallback.execute(); } }, new HasBusyIndicatorDefaultErrorCallback(view)).isValidGroupId(defaultGroupId); } private void validateDuplicatedOrganizationalUnit(final String name, final Command successCallback) { organizationalUnitService.call((OrganizationalUnit existingOrganizationalUnit) -> { if (existingOrganizationalUnit != null) { view.hideBusyIndicator(); view.showError(view.getDuplicatedOrganizationalUnitValidationMessage()); return; } if (successCallback != null) { successCallback.execute(); } }).getOrganizationalUnit(name); } public void cancel() { view.hide(); } private boolean isEmpty(final String text) { return text == null || text.trim().isEmpty(); } }