/** * Copyright 2015 ArcBees Inc. * * 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.arcbees.gaestudio.client.application.visualizer.sidebar; import java.util.List; import javax.inject.Inject; import javax.inject.Provider; import com.arcbees.analytics.shared.Analytics; import com.arcbees.gaestudio.client.application.analytics.EventCategories; import com.arcbees.gaestudio.client.application.channel.ChannelHandler; import com.arcbees.gaestudio.client.application.event.ImportCompletedEvent; import com.arcbees.gaestudio.client.application.visualizer.event.DeleteEntitiesEvent; import com.arcbees.gaestudio.client.application.visualizer.event.EntitiesDeletedEvent; import com.arcbees.gaestudio.client.application.visualizer.event.KindPanelToggleEvent; import com.arcbees.gaestudio.client.application.visualizer.event.KindSelectedEvent; import com.arcbees.gaestudio.client.application.visualizer.event.NamespaceSelectedEvent; import com.arcbees.gaestudio.client.application.visualizer.widget.ImportPresenter; import com.arcbees.gaestudio.client.application.visualizer.widget.namespace.DeleteFromNamespaceHandler; import com.arcbees.gaestudio.client.application.visualizer.widget.namespace.NamespacesListPresenter; import com.arcbees.gaestudio.client.application.visualizer.widget.namespace.NamespacesListPresenterFactory; import com.arcbees.gaestudio.client.place.NameTokens; import com.arcbees.gaestudio.client.rest.ExportService; import com.arcbees.gaestudio.client.rest.KindsService; import com.arcbees.gaestudio.client.util.AsyncCallbackImpl; import com.arcbees.gaestudio.shared.DeleteEntities; import com.arcbees.gaestudio.shared.dto.entity.AppIdNamespaceDto; import com.arcbees.gaestudio.shared.rest.UrlParameters; import com.google.gwt.event.logical.shared.ValueChangeEvent; import com.google.gwt.event.logical.shared.ValueChangeHandler; import com.google.web.bindery.event.shared.EventBus; import com.gwtplatform.dispatch.rest.client.RestDispatch; import com.gwtplatform.dispatch.rest.shared.RestAction; import com.gwtplatform.mvp.client.HasUiHandlers; import com.gwtplatform.mvp.client.PresenterWidget; import com.gwtplatform.mvp.client.View; import com.gwtplatform.mvp.client.proxy.PlaceManager; import com.gwtplatform.mvp.shared.proxy.PlaceRequest; import static com.arcbees.gaestudio.client.application.analytics.EventCategories.UI_ELEMENTS; import static com.arcbees.gaestudio.client.application.visualizer.event.EntitiesDeletedEvent.EntitiesDeletedHandler; import static com.arcbees.gaestudio.client.application.visualizer.event.KindPanelToggleEvent.Action.CLOSE; import static com.arcbees.gaestudio.client.application.visualizer.event.KindPanelToggleEvent.Action.OPEN; public class SidebarPresenter extends PresenterWidget<SidebarPresenter.MyView> implements SidebarUiHandlers, DeleteFromNamespaceHandler, EntitiesDeletedHandler, ImportCompletedEvent.ImportCompletedHandler, ValueChangeHandler<AppIdNamespaceDto> { interface MyView extends View, HasUiHandlers<SidebarUiHandlers> { void updateKinds(List<String> kinds); void addEmptyEntityListStyle(); void setDownloadUrl(String downloadUrl); void setSelectedFormat(); } public static final Object SLOT_NAMESPACES = new Object(); private final PlaceManager placeManager; private final RestDispatch restDispatch; private final KindsService kindsService; private final ExportService exportService; private final Provider<ImportPresenter> importPresenterProvider; private final NamespacesListPresenter namespacesListPresenter; private final Analytics analytics; private final ChannelHandler channelHandler; private KindPanelToggleEvent.Action action = CLOSE; private String currentKind; private String currentNamespace; @Inject SidebarPresenter( EventBus eventBus, MyView view, PlaceManager placeManager, RestDispatch restDispatch, KindsService kindsService, ExportService exportService, Provider<ImportPresenter> importPresenterProvider, NamespacesListPresenterFactory namespacesListPresenterFactory, Analytics analytics, ChannelHandler channelHandler) { super(eventBus, view); this.placeManager = placeManager; this.restDispatch = restDispatch; this.kindsService = kindsService; this.exportService = exportService; this.importPresenterProvider = importPresenterProvider; this.analytics = analytics; this.channelHandler = channelHandler; namespacesListPresenter = namespacesListPresenterFactory.create(this); namespacesListPresenter.addValueChangeHandler(this); getView().setUiHandlers(this); } @Override public void onDeleteAllFromNamespace(AppIdNamespaceDto namespaceDto) { if (namespaceDto == null) { DeleteEntitiesEvent.fire(this, DeleteEntities.ALL); } else { DeleteEntitiesEvent.fire(this, DeleteEntities.NAMESPACE, "", namespaceDto.getNamespace()); } analytics.sendEvent(UI_ELEMENTS, "click") .eventLabel("Visualizer -> Kinds sidebar -> Delete All Entities Button") .go(); } @Override public void onEntitiesDeleted(EntitiesDeletedEvent event) { updateKinds(); } @Override public void importKind() { addToPopupSlot(importPresenterProvider.get()); } @Override public void importCsv() { // TODO : Import CSV } @Override public void deleteAllOfKind() { DeleteEntitiesEvent.fire(this, DeleteEntities.KIND, currentKind); } @Override public void displayEntitiesOfSelectedKind(String kind) { currentKind = kind; PlaceRequest placeRequest = new PlaceRequest.Builder() .nameToken(NameTokens.visualizer) .with(UrlParameters.KIND, currentKind) .build(); placeManager.revealPlace(placeRequest); KindSelectedEvent.fire(this, kind); } @Override public void onCloseHandleActivated() { getEventBus().fireEvent(new KindPanelToggleEvent(action)); if (action.equals(CLOSE)) { action = OPEN; } else { action = CLOSE; } } @Override public void exportJson() { channelHandler.openChannel(new ChannelHandler.ChannelOpenCallback() { @Override public void onChannelOpen() { String exportKindUrl = exportService .getExportJson(currentKind, currentNamespace, extractKeysFromPlace()); getView().setDownloadUrl(exportKindUrl); } }); } @Override public void exportCsv() { channelHandler.openChannel(new ChannelHandler.ChannelOpenCallback() { @Override public void onChannelOpen() { String exportCsvUrl = exportService.getExportCsv(currentKind, currentNamespace, extractKeysFromPlace()); getView().setDownloadUrl(exportCsvUrl); } }); } @Override public void onImportComplete(ImportCompletedEvent event) { updateKinds(); } @Override public void onValueChange(ValueChangeEvent<AppIdNamespaceDto> event) { AppIdNamespaceDto appIdNamespace = event.getValue(); RestAction<List<String>> getKindsAction; if (appIdNamespace == null) { currentNamespace = null; getKindsAction = kindsService.getKinds(); } else { currentNamespace = appIdNamespace.getNamespace(); getKindsAction = kindsService.getKinds(currentNamespace); } NamespaceSelectedEvent.fire(this, currentNamespace); restDispatch.execute(getKindsAction, new AsyncCallbackImpl<List<String>>() { @Override public void onSuccess(List<String> result) { onKindsUpdated(result); } }); analytics.sendEvent(EventCategories.UI_ELEMENTS, "value changed") .eventLabel("Visualizer -> Kinds Sidebar -> Kinds") .go(); } @Override protected void onBind() { super.onBind(); addRegisteredHandler(EntitiesDeletedEvent.getType(), this); addRegisteredHandler(ImportCompletedEvent.getType(), this); setInSlot(SLOT_NAMESPACES, namespacesListPresenter); } @Override protected void onReveal() { super.onReveal(); updateKinds(); getView().setSelectedFormat(); } @Override protected void onHide() { super.onHide(); getView().setDownloadUrl(""); } private String extractKeysFromPlace() { PlaceRequest currentPlaceRequest = placeManager.getCurrentPlaceRequest(); return currentPlaceRequest.getParameter(UrlParameters.KEY, null); } private void updateKinds() { restDispatch.execute(kindsService.getKinds(), new AsyncCallbackImpl<List<String>>("Failed getting Entity Kinds: ") { @Override public void onSuccess(List<String> result) { onKindsUpdated(result); } }); } private void onKindsUpdated(List<String> kinds) { getView().updateKinds(kinds); if (!kinds.contains(currentKind)) { placeManager.revealPlace(new PlaceRequest.Builder().nameToken(NameTokens.visualizer).build()); currentKind = null; KindSelectedEvent.fire(this, null); } } }