/* * Copyright (C) 2015 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.jboss.errai.demo.todo.client.local; import java.util.List; import javax.enterprise.event.Observes; import javax.inject.Inject; import javax.persistence.EntityManager; import javax.persistence.TypedQuery; import org.jboss.errai.bus.client.api.BusErrorCallback; import org.jboss.errai.bus.client.api.messaging.Message; import org.jboss.errai.common.client.api.Caller; import org.jboss.errai.common.client.api.RemoteCallback; import org.jboss.errai.demo.todo.shared.SharedList; import org.jboss.errai.demo.todo.shared.TodoItem; import org.jboss.errai.demo.todo.shared.TodoListService; import org.jboss.errai.demo.todo.shared.TodoListUser; import org.jboss.errai.jpa.sync.client.local.Sync; import org.jboss.errai.jpa.sync.client.local.SyncParam; import org.jboss.errai.jpa.sync.client.shared.SyncResponses; import org.jboss.errai.security.shared.api.annotation.RestrictedAccess; import org.jboss.errai.security.shared.api.identity.User; import org.jboss.errai.security.shared.service.AuthenticationService; import org.jboss.errai.ui.client.widget.ListWidget; import org.jboss.errai.ui.nav.client.local.DefaultPage; import org.jboss.errai.ui.nav.client.local.Page; import org.jboss.errai.ui.nav.client.local.PageShowing; import org.jboss.errai.ui.nav.client.local.TransitionTo; 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 com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.KeyCodes; import com.google.gwt.event.dom.client.KeyDownEvent; import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.InlineLabel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.TextBox; @RestrictedAccess @Templated("#main") @Page(path="list", role = DefaultPage.class) public class TodoListPage extends Composite { @Inject private EntityManager em; @Inject private Caller<TodoListService> todoListService; private User user; // filled in by @PageShowing method @SuppressWarnings("unused") private String loginName; // used for jpa-datasync query param @Inject private @DataField TextBox newItemBox; @Inject private @DataField ListWidget<TodoItem, TodoItemWidget> itemContainer; @Inject private @DataField ListWidget<SharedList, SharedListWidget> sharedContainer; @Inject private @DataField Button archiveButton; @Inject private @DataField Button shareButton; @Inject private @DataField Label errorLabel; @Inject private @DataField InlineLabel username; @Inject private TransitionTo<LoginPage> logoutTransition; @Inject private TransitionTo<SharePage> sharePageTransition; @Inject private @DataField Anchor logoutLink; @Inject private Caller<AuthenticationService> authCaller; @PageShowing private void onPageShowing() { authCaller.call(new RemoteCallback<User>() { @Override public void callback(final User result) { user = result; loginName = user.getIdentifier(); String shortName = user.getProperty(TodoListUser.SHORT_NAME); if (shortName == null) { shortName = "Anonymous"; } username.setText(shortName); errorLabel.setVisible(false); refreshItems(); todoListService.call(new RemoteCallback<List<SharedList>>() { @Override public void callback(List<SharedList> response) { sharedContainer.setItems(response); } }).getSharedTodoLists(); } }, new BusErrorCallback() { @Override public boolean error(Message message, Throwable throwable) { logoutTransition.go(); return false; } }).getUser(); } private void refreshItems() { System.out.println("Todo List Demo: refreshItems()"); TypedQuery<TodoItem> query = em.createNamedQuery("currentItemsForUser", TodoItem.class); query.setParameter("userId", user.getIdentifier()); itemContainer.setItems(query.getResultList()); } void onItemChange(@Observes TodoItem item) { em.flush(); refreshItems(); } @EventHandler("newItemBox") void onNewItem(KeyDownEvent event) { if (event.getNativeKeyCode() == KeyCodes.KEY_ENTER && !newItemBox.getText().trim().equals("")) { TodoItem item = new TodoItem(); item.setLoginName(user.getIdentifier()); item.setText(newItemBox.getText()); em.persist(item); em.flush(); newItemBox.setText(""); refreshItems(); } } @EventHandler("archiveButton") void archive(ClickEvent event) { TypedQuery<TodoItem> query = em.createNamedQuery("currentItemsForUser", TodoItem.class); query.setParameter("userId", user.getIdentifier()); for (TodoItem item : query.getResultList()) { if (item.isDone()) { item.setArchived(true); } } em.flush(); refreshItems(); } @Sync(query = "allItemsForUser", params = { @SyncParam(name = "userId", val = "{loginName}") }) void autoSync(final SyncResponses<TodoItem> responses) { if (!responses.getResponses().isEmpty()) { refreshItems(); } } @EventHandler("logoutLink") void logout(ClickEvent event) { authCaller.call(new RemoteCallback<Void>() { @Override public void callback(Void response) { logoutTransition.go(); } }).logout(); } @EventHandler("shareButton") void share(ClickEvent event) { sharePageTransition.go(); } }