/* * 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.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.taskInbox.TaskInboxFilters; import org.overlord.dtgov.ui.client.local.pages.taskInbox.TasksTable; 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.NotificationService; import org.overlord.dtgov.ui.client.local.services.TaskInboxRpcService; import org.overlord.dtgov.ui.client.local.services.rpc.IRpcServiceInvocationHandler; import org.overlord.dtgov.ui.client.shared.beans.TaskInboxFilterBean; import org.overlord.dtgov.ui.client.shared.beans.TaskInboxResultSetBean; import org.overlord.dtgov.ui.client.shared.beans.TaskSummaryBean; 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.Anchor; /** * The Task Inbox page. * * @author eric.wittmann@redhat.com */ @Templated("/org/overlord/dtgov/ui/client/local/site/taskInbox.html#page") @Page(path="taskInbox") @Dependent public class TaskInboxPage extends AbstractPage { @Inject protected ClientMessages i18n; @Inject protected TaskInboxRpcService inboxService; @Inject protected NotificationService notificationService; @Inject protected ApplicationStateService stateService; // Breadcrumbs @Inject @DataField("back-to-dashboard") TransitionAnchor<DashboardPage> backToDashboard; @Inject @DataField("tasks-filter-sidebar") protected TaskInboxFilters filtersPanel; @Inject @DataField("btn-refresh") protected Anchor refreshButton; @Inject @DataField("tasks-none") protected HtmlSnippet noDataMessage; @Inject @DataField("tasks-searching") protected HtmlSnippet searchInProgressMessage; @Inject @DataField("tasks-table") protected TasksTable tasksTable; @Inject @DataField("tasks-pager") protected Pager pager; @DataField("tasks-range") protected SpanElement rangeSpan = Document.get().createSpanElement(); @DataField("tasks-total") protected SpanElement totalSpan = Document.get().createSpanElement(); private int currentPage = 1; /** * Constructor. */ public TaskInboxPage() { } /** * Called after construction. */ @PostConstruct protected void postConstruct() { filtersPanel.addValueChangeHandler(new ValueChangeHandler<TaskInboxFilterBean>() { @Override public void onValueChange(ValueChangeEvent<TaskInboxFilterBean> event) { doSearch(); } }); pager.addValueChangeHandler(new ValueChangeHandler<Integer>() { @Override public void onValueChange(ValueChangeEvent<Integer> event) { doSearch(event.getValue()); } }); this.tasksTable.addTableSortHandler(new TableSortEvent.Handler() { @Override public void onTableSort(TableSortEvent event) { doSearch(currentPage); } }); // Hide columns 2-3 when in mobile mode. tasksTable.setColumnClasses(2, "desktop-only"); //$NON-NLS-1$ tasksTable.setColumnClasses(3, "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); } /** * 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(); TaskInboxFilterBean filterBean = (TaskInboxFilterBean) stateService.get(ApplicationStateKeys.TASK_INBOX_FILTER, new TaskInboxFilterBean()); Integer page = (Integer) stateService.get(ApplicationStateKeys.TASK_INBOX_PAGE, 1); SortColumn sortColumn = (SortColumn) stateService.get(ApplicationStateKeys.TASK_INBOX_SORT_COLUMN, tasksTable.getDefaultSortColumn()); this.filtersPanel.setValue(filterBean); this.tasksTable.sortBy(sortColumn.columnId, sortColumn.ascending); // Kick off a search doSearch(page); } /** * Search for tasks based on the current filter settings and search text. */ protected void doSearch() { doSearch(1); } /** * Search for tasks based on the current filter settings. * @param page */ protected void doSearch(int page) { onSearchStarting(); currentPage = page; final TaskInboxFilterBean filterBean = filtersPanel.getValue(); final SortColumn currentSortColumn = tasksTable.getCurrentSortColumn(); stateService.put(ApplicationStateKeys.TASK_INBOX_FILTER, filterBean); stateService.put(ApplicationStateKeys.TASK_INBOX_PAGE, currentPage); stateService.put(ApplicationStateKeys.TASK_INBOX_SORT_COLUMN, currentSortColumn); inboxService.search(filterBean, page, currentSortColumn.columnId, currentSortColumn.ascending, new IRpcServiceInvocationHandler<TaskInboxResultSetBean>() { @Override public void onReturn(TaskInboxResultSetBean data) { updateTasksTable(data); updatePager(data); } @Override public void onError(Throwable error) { notificationService.sendErrorNotification(i18n.format("task-inbox.error-loading"), error); //$NON-NLS-1$ noDataMessage.setVisible(true); searchInProgressMessage.setVisible(false); } }); } /** * Called when a new task search is kicked off. */ protected void onSearchStarting() { this.pager.setVisible(false); this.searchInProgressMessage.setVisible(true); this.tasksTable.setVisible(false); this.noDataMessage.setVisible(false); this.rangeSpan.setInnerText("?"); //$NON-NLS-1$ this.totalSpan.setInnerText("?"); //$NON-NLS-1$ } /** * Updates the table of tasks with the given data. * @param data */ protected void updateTasksTable(TaskInboxResultSetBean data) { this.tasksTable.clear(); this.searchInProgressMessage.setVisible(false); if (data.getTasks().size() > 0) { for (TaskSummaryBean taskSummaryBean : data.getTasks()) { this.tasksTable.addRow(taskSummaryBean); } this.tasksTable.setVisible(true); } else { this.noDataMessage.setVisible(true); } } /** * Updates the pager with the given data. * @param data */ protected void updatePager(TaskInboxResultSetBean 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.getTasks().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); } }