/* * Copyright 2012 JBoss 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 org.overlord.dtgov.ui.client.local.pages; import javax.annotation.PostConstruct; import javax.enterprise.context.Dependent; import javax.enterprise.inject.Instance; import javax.inject.Inject; import org.jboss.errai.ui.nav.client.local.Page; import org.jboss.errai.ui.nav.client.local.TransitionAnchor; import org.jboss.errai.ui.shared.api.annotations.DataField; import org.jboss.errai.ui.shared.api.annotations.EventHandler; import org.jboss.errai.ui.shared.api.annotations.Templated; import org.overlord.commons.gwt.client.local.events.TableSortEvent; import org.overlord.commons.gwt.client.local.widgets.HtmlSnippet; import org.overlord.commons.gwt.client.local.widgets.Pager; import org.overlord.commons.gwt.client.local.widgets.SortableTemplatedWidgetTable.SortColumn; import org.overlord.dtgov.ui.client.local.ClientMessages; import org.overlord.dtgov.ui.client.local.pages.deployments.AddDeploymentDialog; import org.overlord.dtgov.ui.client.local.pages.deployments.DeploymentFilters; import org.overlord.dtgov.ui.client.local.pages.deployments.DeploymentTable; import org.overlord.dtgov.ui.client.local.services.ApplicationStateKeys; import org.overlord.dtgov.ui.client.local.services.ApplicationStateService; import org.overlord.dtgov.ui.client.local.services.DeploymentsRpcService; import org.overlord.dtgov.ui.client.local.services.NotificationService; import org.overlord.dtgov.ui.client.local.services.rpc.IRpcServiceInvocationHandler; import org.overlord.dtgov.ui.client.shared.beans.DeploymentResultSetBean; import org.overlord.dtgov.ui.client.shared.beans.DeploymentSummaryBean; import org.overlord.dtgov.ui.client.shared.beans.DeploymentsFilterBean; import com.google.gwt.dom.client.Document; import com.google.gwt.dom.client.SpanElement; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.logical.shared.ValueChangeEvent; import com.google.gwt.event.logical.shared.ValueChangeHandler; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.TextBox; /** * The deployment lifecycle page. * * @author eric.wittmann@redhat.com */ @Templated("/org/overlord/dtgov/ui/client/local/site/deployments.html#page") @Page(path="deployments") @Dependent public class DeploymentsPage extends AbstractPage { @Inject protected ClientMessages i18n; @Inject protected DeploymentsRpcService deploymentsService; @Inject protected NotificationService notificationService; @Inject protected ApplicationStateService stateService; // Breadcrumbs @Inject @DataField("back-to-dashboard") TransitionAnchor<DashboardPage> backToDashboard; @Inject @DataField("deployments-filter-sidebar") protected DeploymentFilters filtersPanel; @Inject @DataField("deployment-search-box") protected TextBox searchBox; @Inject @DataField("btn-refresh") protected Button refreshButton; @Inject @DataField("btn-add") protected Button addButton; @Inject protected Instance<AddDeploymentDialog> addDeploymentDialog; @Inject @DataField("deployments-none") protected HtmlSnippet noDataMessage; @Inject @DataField("deployments-searching") protected HtmlSnippet searchInProgressMessage; @Inject @DataField("deployments-table") protected DeploymentTable deploymentsTable; @Inject @DataField("deployments-pager") protected Pager pager; @DataField("deployments-range") protected SpanElement rangeSpan = Document.get().createSpanElement(); @DataField("deployments-total") protected SpanElement totalSpan = Document.get().createSpanElement(); private int currentPage = 1; /** * Constructor. */ public DeploymentsPage() { } /** * Called after construction. */ @PostConstruct protected void postConstruct() { filtersPanel.addValueChangeHandler(new ValueChangeHandler<DeploymentsFilterBean>() { @Override public void onValueChange(ValueChangeEvent<DeploymentsFilterBean> event) { doSearch(); } }); searchBox.addValueChangeHandler(new ValueChangeHandler<String>() { @Override public void onValueChange(ValueChangeEvent<String> event) { doSearch(); } }); pager.addValueChangeHandler(new ValueChangeHandler<Integer>() { @Override public void onValueChange(ValueChangeEvent<Integer> event) { doSearch(event.getValue()); } }); deploymentsTable.addTableSortHandler(new TableSortEvent.Handler() { @Override public void onTableSort(TableSortEvent event) { doSearch(currentPage); } }); // Hide column 1 when in mobile mode. deploymentsTable.setColumnClasses(1, "desktop-only"); //$NON-NLS-1$ this.rangeSpan.setInnerText("?"); //$NON-NLS-1$ this.totalSpan.setInnerText("?"); //$NON-NLS-1$ } /** * Event handler that fires when the user clicks the refresh button. * @param event */ @EventHandler("btn-refresh") public void onRefreshClick(ClickEvent event) { doSearch(currentPage); } /** * Event handler that fires when the user clicks the Add Deployment button. * @param event */ @EventHandler("btn-add") public void onAddClick(ClickEvent event) { addDeploymentDialog.get().show(); } /** * Kick off a search at this point so that we show some data in the UI. * @see org.overlord.dtgov.ui.client.local.pages.AbstractPage#onPageShowing() */ @Override protected void onPageShowing() { // Refresh the filters filtersPanel.refresh(); DeploymentsFilterBean filterBean = (DeploymentsFilterBean) stateService.get(ApplicationStateKeys.DEPLOYMENTS_FILTER, new DeploymentsFilterBean()); String searchText = (String) stateService.get(ApplicationStateKeys.DEPLOYMENTS_SEARCH_TEXT, ""); //$NON-NLS-1$ Integer page = (Integer) stateService.get(ApplicationStateKeys.DEPLOYMENTS_PAGE, 1); SortColumn sortColumn = (SortColumn) stateService.get(ApplicationStateKeys.DEPLOYMENTS_SORT_COLUMN, this.deploymentsTable.getDefaultSortColumn()); this.filtersPanel.setValue(filterBean); this.searchBox.setValue(searchText); this.deploymentsTable.sortBy(sortColumn.columnId, sortColumn.ascending); // Kick off a search doSearch(page); } /** * Search for artifacts based on the current filter settings and search text. */ protected void doSearch() { doSearch(1); } /** * Search for deployments based on the current filter settings. * @param page */ protected void doSearch(int page) { onSearchStarting(); currentPage = page; final DeploymentsFilterBean filterBean = filtersPanel.getValue(); final String searchText = this.searchBox.getValue(); final SortColumn currentSortColumn = this.deploymentsTable.getCurrentSortColumn(); stateService.put(ApplicationStateKeys.DEPLOYMENTS_FILTER, filterBean); stateService.put(ApplicationStateKeys.DEPLOYMENTS_SEARCH_TEXT, searchText); stateService.put(ApplicationStateKeys.DEPLOYMENTS_PAGE, currentPage); stateService.put(ApplicationStateKeys.DEPLOYMENTS_SORT_COLUMN, currentSortColumn); deploymentsService.search(filterBean, searchText, page, currentSortColumn.columnId, currentSortColumn.ascending, new IRpcServiceInvocationHandler<DeploymentResultSetBean>() { @Override public void onReturn(DeploymentResultSetBean data) { updateTable(data); updatePager(data); } @Override public void onError(Throwable error) { notificationService.sendErrorNotification(i18n.format("deployments.error-loading"), error); //$NON-NLS-1$ noDataMessage.setVisible(true); searchInProgressMessage.setVisible(false); } }); } /** * Called when a new search is kicked off. */ protected void onSearchStarting() { this.pager.setVisible(false); this.searchInProgressMessage.setVisible(true); this.deploymentsTable.setVisible(false); this.noDataMessage.setVisible(false); this.rangeSpan.setInnerText("?"); //$NON-NLS-1$ this.totalSpan.setInnerText("?"); //$NON-NLS-1$ } /** * Updates the table of deployments with the given data. * @param data */ protected void updateTable(DeploymentResultSetBean data) { this.deploymentsTable.clear(); this.searchInProgressMessage.setVisible(false); if (data.getDeployments().size() > 0) { for (DeploymentSummaryBean deploymentSummaryBean : data.getDeployments()) { this.deploymentsTable.addRow(deploymentSummaryBean); } this.deploymentsTable.setVisible(true); } else { this.noDataMessage.setVisible(true); } } /** * Updates the pager with the given data. * @param data */ protected void updatePager(DeploymentResultSetBean data) { int numPages = ((int) (data.getTotalResults() / data.getItemsPerPage())) + (data.getTotalResults() % data.getItemsPerPage() == 0 ? 0 : 1); int thisPage = (data.getStartIndex() / data.getItemsPerPage()) + 1; this.pager.setNumPages(numPages); this.pager.setPage(thisPage); if (numPages > 1) this.pager.setVisible(true); int startIndex = data.getStartIndex() + 1; int endIndex = startIndex + data.getDeployments().size() - 1; String rangeText = "" + startIndex + "-" + endIndex; //$NON-NLS-1$ //$NON-NLS-2$ String totalText = String.valueOf(data.getTotalResults()); this.rangeSpan.setInnerText(rangeText); this.totalSpan.setInnerText(totalText); } }