/* * 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.widgets.organizationalunit; import javax.enterprise.event.Event; import javax.inject.Inject; import com.google.gwt.user.client.Window; import org.guvnor.common.services.project.context.ProjectContextChangeEvent; import org.guvnor.structure.client.security.OrganizationalUnitController; import org.guvnor.structure.events.AfterDeleteOrganizationalUnitEvent; import org.guvnor.structure.organizationalunit.OrganizationalUnit; import org.guvnor.structure.organizationalunit.OrganizationalUnitService; import org.jboss.errai.common.client.api.Caller; import org.jboss.errai.common.client.api.RemoteCallback; import org.kie.workbench.common.screens.library.api.LibraryService; import org.kie.workbench.common.screens.library.api.OrganizationalUnitRepositoryInfo; import org.kie.workbench.common.screens.library.api.preferences.LibraryInternalPreferences; import org.kie.workbench.common.screens.library.client.screens.organizationalunit.popup.OrganizationalUnitPopUpPresenter; import org.kie.workbench.common.screens.library.client.util.LibraryPlaces; 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 OrganizationalUnitTileWidget { public interface View extends UberElement<OrganizationalUnitTileWidget>, HasBusyIndicator { void setup(String iconClass, String iconOnHoverClass, OrganizationalUnit organizationalUnit, Command selectCommand, Command editCommand, Command removeCommand); String getRemovingBusyIndicatorMessage(); String getRemoveWarningMessage(String ouName); String getRemoveSuccessMessage(); void hideEditAction(); void hideRemoveAction(); } private View view; private LibraryPlaces libraryPlaces; private Caller<LibraryService> libraryService; private Event<ProjectContextChangeEvent> projectContextChangeEvent; private OrganizationalUnitPopUpPresenter organizationalUnitPopUpPresenter; private Caller<OrganizationalUnitService> organizationalUnitService; private Event<AfterDeleteOrganizationalUnitEvent> afterDeleteOrganizationalUnitEvent; private Event<NotificationEvent> notificationEvent; private OrganizationalUnitController organizationalUnitController; private LibraryInternalPreferences libraryInternalPreferences; @Inject public OrganizationalUnitTileWidget(final View view, final LibraryPlaces libraryPlaces, final Caller<LibraryService> libraryService, final Event<ProjectContextChangeEvent> projectContextChangeEvent, final OrganizationalUnitPopUpPresenter organizationalUnitPopUpPresenter, final Caller<OrganizationalUnitService> organizationalUnitService, final Event<AfterDeleteOrganizationalUnitEvent> afterDeleteOrganizationalUnitEvent, final Event<NotificationEvent> notificationEvent, final OrganizationalUnitController organizationalUnitController, final LibraryInternalPreferences libraryInternalPreferences) { this.view = view; this.libraryPlaces = libraryPlaces; this.libraryService = libraryService; this.projectContextChangeEvent = projectContextChangeEvent; this.organizationalUnitPopUpPresenter = organizationalUnitPopUpPresenter; this.organizationalUnitService = organizationalUnitService; this.afterDeleteOrganizationalUnitEvent = afterDeleteOrganizationalUnitEvent; this.notificationEvent = notificationEvent; this.organizationalUnitController = organizationalUnitController; this.libraryInternalPreferences = libraryInternalPreferences; } public void init(final OrganizationalUnit organizationalUnit) { view.init(this); view.setup("fa-folder", "fa-folder-open", organizationalUnit, () -> open(organizationalUnit), () -> edit(organizationalUnit), () -> remove(organizationalUnit)); if (!canUpdateOrganizationalUnit(organizationalUnit)) { view.hideEditAction(); } if (!canRemoveOrganizationalUnit(organizationalUnit)) { view.hideRemoveAction(); } } public OrganizationalUnitRepositoryInfo open(OrganizationalUnit organizationalUnit) { return libraryService.call(new RemoteCallback<OrganizationalUnitRepositoryInfo>() { @Override public void callback(final OrganizationalUnitRepositoryInfo info) { libraryInternalPreferences.load(loadedLibraryInternalPreferences -> { loadedLibraryInternalPreferences.setLastOpenedOrganizationalUnit(info.getSelectedOrganizationalUnit().getIdentifier()); loadedLibraryInternalPreferences.setLastOpenedRepository(info.getSelectedRepository().getAlias()); loadedLibraryInternalPreferences.save(); }, error -> { }); final ProjectContextChangeEvent event = new ProjectContextChangeEvent(info.getSelectedOrganizationalUnit(), info.getSelectedRepository(), info.getSelectedRepository().getDefaultBranch()); projectContextChangeEvent.fire(event); libraryPlaces.goToLibrary(() -> { }); } }).getOrganizationalUnitRepositoryInfo(organizationalUnit); } public void edit(final OrganizationalUnit organizationalUnit) { if (canUpdateOrganizationalUnit(organizationalUnit)) { organizationalUnitPopUpPresenter.showEditPopUp(organizationalUnit); } } public void remove(final OrganizationalUnit organizationalUnit) { if (canRemoveOrganizationalUnit(organizationalUnit)) { if (confirmRemove(organizationalUnit)) { view.showBusyIndicator(view.getRemovingBusyIndicatorMessage()); organizationalUnitService.call(v -> { afterDeleteOrganizationalUnitEvent.fire(new AfterDeleteOrganizationalUnitEvent(organizationalUnit)); view.hideBusyIndicator(); notificationEvent.fire(new NotificationEvent(view.getRemoveSuccessMessage(), NotificationEvent.NotificationType.SUCCESS)); }, new HasBusyIndicatorDefaultErrorCallback(view)).removeOrganizationalUnit(organizationalUnit.getName()); } } } boolean confirmRemove(OrganizationalUnit organizationalUnit) { return Window.confirm(view.getRemoveWarningMessage(organizationalUnit.getName())); } boolean canUpdateOrganizationalUnit(final OrganizationalUnit organizationalUnit) { return organizationalUnitController.canUpdateOrgUnit(organizationalUnit); } boolean canRemoveOrganizationalUnit(final OrganizationalUnit organizationalUnit) { return organizationalUnitController.canDeleteOrgUnit(organizationalUnit); } public View getView() { return view; } }