/* * 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; import java.util.List; import java.util.stream.Collectors; import javax.enterprise.event.Observes; import javax.inject.Inject; import org.guvnor.structure.client.security.OrganizationalUnitController; import org.guvnor.structure.events.AfterCreateOrganizationalUnitEvent; import org.guvnor.structure.events.AfterDeleteOrganizationalUnitEvent; import org.guvnor.structure.events.AfterEditOrganizationalUnitEvent; import org.guvnor.structure.organizationalunit.OrganizationalUnit; import org.jboss.errai.common.client.api.Caller; import org.jboss.errai.ioc.client.api.AfterInitialization; import org.jboss.errai.ioc.client.api.ManagedInstance; import org.kie.workbench.common.screens.library.api.LibraryService; import org.kie.workbench.common.screens.library.api.search.FilterUpdateEvent; import org.kie.workbench.common.screens.library.client.perspective.LibraryPerspective; import org.kie.workbench.common.screens.library.client.screens.organizationalunit.popup.OrganizationalUnitPopUpPresenter; import org.kie.workbench.common.screens.library.client.util.LibraryPlaces; import org.kie.workbench.common.screens.library.client.widgets.organizationalunit.OrganizationalUnitTileWidget; import org.uberfire.client.annotations.WorkbenchPartTitle; import org.uberfire.client.annotations.WorkbenchPartView; import org.uberfire.client.annotations.WorkbenchScreen; import org.uberfire.client.mvp.UberElement; @WorkbenchScreen(identifier = LibraryPlaces.ORGANIZATIONAL_UNITS_SCREEN, owningPerspective = LibraryPerspective.class) public class OrganizationalUnitsScreen { public interface View extends UberElement<OrganizationalUnitsScreen> { void clearOrganizationalUnits(); String getFilterName(); void setFilterName(String name); void hideCreateOrganizationalUnitAction(); void addOrganizationalUnit(OrganizationalUnitTileWidget organizationalUnitTileWidget); } private View view; private Caller<LibraryService> libraryService; private OrganizationalUnitPopUpPresenter organizationalUnitPopUpPresenter; private OrganizationalUnitController organizationalUnitController; private ManagedInstance<OrganizationalUnitTileWidget> organizationalUnitTileWidgets; List<OrganizationalUnit> organizationalUnits; @Inject public OrganizationalUnitsScreen(final View view, final Caller<LibraryService> libraryService, final OrganizationalUnitPopUpPresenter organizationalUnitPopUpPresenter, final OrganizationalUnitController organizationalUnitController, final ManagedInstance<OrganizationalUnitTileWidget> organizationalUnitTileWidgets) { this.view = view; this.libraryService = libraryService; this.organizationalUnitPopUpPresenter = organizationalUnitPopUpPresenter; this.organizationalUnitController = organizationalUnitController; this.organizationalUnitTileWidgets = organizationalUnitTileWidgets; } @AfterInitialization public void init() { setupView(); setupOrganizationalUnits(); } private void setupView() { if (!canCreateOrganizationalUnit()) { view.hideCreateOrganizationalUnitAction(); } } private void setupOrganizationalUnits() { if (organizationalUnitController.canReadOrgUnits()) { libraryService.call((List<OrganizationalUnit> allOrganizationalUnits) -> { organizationalUnits = allOrganizationalUnits; refreshOrganizationalUnits(organizationalUnits); }).getOrganizationalUnits(); } } private void refreshOrganizationalUnits(final List<OrganizationalUnit> organizationalUnits) { view.clearOrganizationalUnits(); organizationalUnits.forEach(organizationalUnit -> { final OrganizationalUnitTileWidget organizationalUnitTileWidget = organizationalUnitTileWidgets.get(); organizationalUnitTileWidget.init(organizationalUnit); view.addOrganizationalUnit(organizationalUnitTileWidget); }); } public void createOrganizationalUnit() { organizationalUnitPopUpPresenter.showAddPopUp(); } public void organizationalUnitCreated(@Observes final AfterCreateOrganizationalUnitEvent afterCreateOrganizationalUnitEvent) { organizationalUnits.add(afterCreateOrganizationalUnitEvent.getOrganizationalUnit()); refresh(); } public void organizationalUnitEdited(@Observes final AfterEditOrganizationalUnitEvent afterEditOrganizationalUnitEvent) { organizationalUnits.remove(afterEditOrganizationalUnitEvent.getPreviousOrganizationalUnit()); organizationalUnits.add(afterEditOrganizationalUnitEvent.getEditedOrganizationalUnit()); refresh(); } public void organizationalUnitDeleted(@Observes final AfterDeleteOrganizationalUnitEvent afterDeleteOrganizationalUnitEvent) { organizationalUnits.remove(afterDeleteOrganizationalUnitEvent.getOrganizationalUnit()); refresh(); } public void refresh() { final String filterName = view.getFilterName().toUpperCase(); final List<OrganizationalUnit> filteredOrganizationalUnits = organizationalUnits.stream() .filter(ou -> ou.getName().toUpperCase().startsWith(filterName)) .collect(Collectors.toList()); filteredOrganizationalUnits.sort((o1, o2) -> o1.getName().compareTo(o2.getName())); refreshOrganizationalUnits(filteredOrganizationalUnits); } public void filterUpdate(@Observes final FilterUpdateEvent event) { view.setFilterName(event.getName()); refresh(); } public boolean canCreateOrganizationalUnit() { return organizationalUnitController.canCreateOrgUnits(); } @WorkbenchPartTitle public String getTitle() { return "Organizational Units Screen"; } @WorkbenchPartView public UberElement<OrganizationalUnitsScreen> getView() { return view; } }