Commit 03f90098 by Tuukka Kivilahti, TKffTK

Merge branch 'master' of codecrew.fi:bortal

2 parents 28e56178 86e51802
Showing with 1387 additions and 142 deletions
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ejb-jar xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:ejb="http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd" version="3.1"> <ejb-jar xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:ejb="http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd" version="3.1">
<display-name>LanBortalBeans</display-name> <display-name>LanBortalBeans</display-name>
<ejb-client-jar>LanBortalBeansClient.jar</ejb-client-jar> <ejb-client-jar>LanBortalBeansClient.jar</ejb-client-jar>
</ejb-jar> </ejb-jar>
\ No newline at end of file
package fi.insomnia.bortal.beans;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.imageio.ImageIO;
import com.pdfjet.CoreFont;
import com.pdfjet.Image;
import com.pdfjet.ImageType;
import com.pdfjet.PDF;
import com.pdfjet.Page;
import com.pdfjet.TextLine;
import fi.insomnia.bortal.facade.EventUserFacade;
import fi.insomnia.bortal.model.CardTemplate;
import fi.insomnia.bortal.model.EventUser;
import fi.insomnia.bortal.model.PrintedCard;
import fi.insomnia.bortal.utilities.BarcodeUtils;
/**
* Session Bean implementation class CardPrintBean
*/
@Stateless
@LocalBean
public class CardPrintBean implements CardPrintBeanLocal {
@EJB private UserBean userBean;
@EJB private EventUserFacade eventUserFacade;
@EJB private CardTemplateBean cardTemplateBean;
/**
* Default constructor.
*/
public CardPrintBean() {
// TODO Auto-generated constructor stub
}
//TODO: Roles?
public byte[] getUserCardsAsPrintablePdf(List<Integer> userIdList) throws Exception {
ArrayList<EventUser> listOfEventUsers = new ArrayList<EventUser>();
for(Integer userId : userIdList) {
listOfEventUsers.add(eventUserFacade.find(userId));
}
byte[] pdfData = constructPdf(listOfEventUsers);
return pdfData;
}
public byte[] getUserCardAsPrintablePdf(Integer userId) throws Exception {
ArrayList<EventUser> listOfEventUsers = new ArrayList<EventUser>();
listOfEventUsers.add(eventUserFacade.find(userId));
byte[] pdfData = constructPdf(listOfEventUsers);
return pdfData;
}
private byte[] constructPdf(List<EventUser> users) throws Exception {
// double[] pageSize = new double[] { cardBackground.getWidth(),
// cardBackground.getHeight() };
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
PDF pdf = new PDF(outputStream);
pdf.setTitle("CARD");
double pagex = 155.52; // 54,0 mm
double pagey = 243.84; // 85,5 mm
int numCards = 0;
for(EventUser user : users) {
PrintedCard printedCard = cardTemplateBean.checkPrintedCard(user);
if(printedCard == null) continue;
else numCards++;
CardTemplate cardTemplate = printedCard.getTemplate();
BufferedImage cardBackground = ImageIO.read(new ByteArrayInputStream(
cardTemplate.getImage()));
BufferedImage faceBufferedImage = ImageIO
.read(new ByteArrayInputStream(user.getCurrentImage()
.getImageData()));
Page page = new Page(pdf, new double[] { pagex, pagey });
// Render background image
Image templateImage = new Image(pdf,
convertBufferedImageToPng(cardBackground), ImageType.PNG);
templateImage.setPosition(0, 0);
templateImage.scaleBy(0.245);
templateImage.drawOn(page);
// Render face image
Image faceImage = new Image(pdf,
convertBufferedImageToPng(faceBufferedImage), ImageType.PNG);
faceImage.setPosition(15.5, 70.0);
faceImage.scaleBy(0.32);
faceImage.drawOn(page);
// Render texts
// Big font for nick
com.pdfjet.Font nickFont = new com.pdfjet.Font(pdf, CoreFont.HELVETICA);
nickFont.setSize(16.0);
// User nick text
TextLine nickTextLine = new TextLine(nickFont);
nickTextLine.setText(user.getUser().getNick());
nickTextLine.setPosition(19.0, 193.0);
nickTextLine.setColor(new double[] {1.0, 1.0, 1.0});
nickTextLine.drawOn(page);
// Smaller font
com.pdfjet.Font font = new com.pdfjet.Font(pdf, CoreFont.HELVETICA);
font.setSize(10.0);
// Full name text
String wholeName = user.getUser().getFirstnames() + " "
+ user.getUser().getLastname();
TextLine wholeNameText = new TextLine(font);
wholeNameText.setText(wholeName);
wholeNameText.setPosition(17.0, 212.0);
wholeNameText.setColor(new double[] {1.0, 1.0, 1.0});
wholeNameText.drawOn(page);
// Role text
TextLine roleTextLine = new TextLine(font);
roleTextLine.setText(cardTemplate.getName());
roleTextLine.setPosition(17.0, 223.0);
roleTextLine.setColor(new double[] {1.0, 1.0, 1.0});
roleTextLine.drawOn(page);
// Barcode
String barcodeString = String.valueOf(user.getUser().getCreated()
.getTime().getTime());
barcodeString = barcodeString.substring(barcodeString.length() - 12);
BufferedImage barCodeBufferedImage = ImageIO.read(BarcodeUtils
.getBarcodeEAN(barcodeString));
Image barCodeImage = new Image(pdf,
convertBufferedImageToPng(barCodeBufferedImage), ImageType.PNG);
barCodeImage.setPosition(0.0, 243.5);
barCodeImage.scaleBy(0.7);
barCodeImage.drawOn(page);
}
pdf.flush();
outputStream.close();
if(numCards == 0) throw new Exception("No cards generated");
return outputStream.toByteArray();
}
private ByteArrayInputStream convertBufferedImageToPng(BufferedImage img)
throws IOException {
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
ImageIO.write(img, "png", outStream);
outStream.close();
return new ByteArrayInputStream(outStream.toByteArray());
}
}
...@@ -157,6 +157,7 @@ public class MenuBean implements MenuBeanLocal { ...@@ -157,6 +157,7 @@ public class MenuBean implements MenuBeanLocal {
usershop.setKey("topnavi.adminshop"); usershop.setKey("topnavi.adminshop");
usershop.addPage(menuitemfacade.findOrCreate("/shop/showReaderEvents"), ShopPermission.SHOP_TO_OTHERS); usershop.addPage(menuitemfacade.findOrCreate("/shop/showReaderEvents"), ShopPermission.SHOP_TO_OTHERS);
usershop.addPage(menuitemfacade.findOrCreate("/shop/listReaders"), ShopPermission.SHOP_TO_OTHERS); usershop.addPage(menuitemfacade.findOrCreate("/shop/listReaders"), ShopPermission.SHOP_TO_OTHERS);
usershop.addPage(menuitemfacade.findOrCreate("/shop/editReader"), ShopPermission.SHOP_TO_OTHERS);
MenuNavigation billnavi = adminnavi.addPage(null, null); MenuNavigation billnavi = adminnavi.addPage(null, null);
billnavi.setKey("topnavi.billing"); billnavi.setKey("topnavi.billing");
......
...@@ -6,9 +6,13 @@ import java.util.Calendar; ...@@ -6,9 +6,13 @@ import java.util.Calendar;
import java.util.List; import java.util.List;
import javax.ejb.EJB; import javax.ejb.EJB;
import javax.ejb.EJBException;
import javax.ejb.LocalBean; import javax.ejb.LocalBean;
import javax.ejb.Stateless; import javax.ejb.Stateless;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.facade.AccountEventFacade; import fi.insomnia.bortal.facade.AccountEventFacade;
import fi.insomnia.bortal.model.AccountEvent; import fi.insomnia.bortal.model.AccountEvent;
import fi.insomnia.bortal.model.Discount; import fi.insomnia.bortal.model.Discount;
...@@ -27,6 +31,7 @@ public class ProductPBean { ...@@ -27,6 +31,7 @@ public class ProductPBean {
private PermissionBean permbean; private PermissionBean permbean;
@EJB @EJB
private AccountEventFacade accounteventfacade; private AccountEventFacade accounteventfacade;
private static final Logger logger = LoggerFactory.getLogger(ProductPBean.class);
/** /**
* Default constructor. * Default constructor.
...@@ -53,6 +58,10 @@ public class ProductPBean { ...@@ -53,6 +58,10 @@ public class ProductPBean {
*/ */
public AccountEvent createAccountEvent(Product product, BigDecimal quantity, EventUser user, Calendar date) { public AccountEvent createAccountEvent(Product product, BigDecimal quantity, EventUser user, Calendar date) {
if (!product.getEvent().equals(user.getEvent()))
{
throw new EJBException("Trying to create accountevent for different event in user and product");
}
BigDecimal unitPrice = product.getPrice().negate(); BigDecimal unitPrice = product.getPrice().negate();
List<Discount> discounts = product.getActiveDiscounts(quantity, date); List<Discount> discounts = product.getActiveDiscounts(quantity, date);
...@@ -76,6 +85,7 @@ public class ProductPBean { ...@@ -76,6 +85,7 @@ public class ProductPBean {
} }
user.getAccountEvents().add(ret); user.getAccountEvents().add(ret);
accounteventfacade.create(ret); accounteventfacade.create(ret);
logger.debug("create ac {} for user {}", ret, user.getUser());
// flush changes to db. // flush changes to db.
// userFacade.flush(); // userFacade.flush();
return ret; return ret;
......
...@@ -5,6 +5,7 @@ import java.util.List; ...@@ -5,6 +5,7 @@ import java.util.List;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import javax.ejb.EJB; import javax.ejb.EJB;
import javax.ejb.EJBAccessException;
import javax.ejb.Stateless; import javax.ejb.Stateless;
import org.slf4j.Logger; import org.slf4j.Logger;
...@@ -13,6 +14,7 @@ import org.slf4j.LoggerFactory; ...@@ -13,6 +14,7 @@ import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.facade.PrintedCardFacade; import fi.insomnia.bortal.facade.PrintedCardFacade;
import fi.insomnia.bortal.facade.ReaderEventFacade; import fi.insomnia.bortal.facade.ReaderEventFacade;
import fi.insomnia.bortal.facade.ReaderFacade; import fi.insomnia.bortal.facade.ReaderFacade;
import fi.insomnia.bortal.model.AccountEvent;
import fi.insomnia.bortal.model.CardTemplate; import fi.insomnia.bortal.model.CardTemplate;
import fi.insomnia.bortal.model.EventUser; import fi.insomnia.bortal.model.EventUser;
import fi.insomnia.bortal.model.PrintedCard; import fi.insomnia.bortal.model.PrintedCard;
...@@ -87,10 +89,14 @@ public class ReaderBean implements ReaderBeanLocal { ...@@ -87,10 +89,14 @@ public class ReaderBean implements ReaderBeanLocal {
if (ret == null) if (ret == null)
{ {
ret = createReaderEvent(reader, card); ret = createReaderEvent(reader, card);
if (ret != null && card != null && reader.isAutoproduct()) logger.debug("Got reader autoproduct {} with count {}", reader.getAutomaticProduct(), reader.getAutomaticProductCount());
{ logger.debug("ret {}, card, {} autoproduct {}", new Object[] { ret, card, reader.isAutoproduct() });
productPBean.createAccountEvent(reader.getAutomaticProduct(), reader.getAutomaticProductCount(), card.getUser(), Calendar.getInstance()); if (ret != null && card != null && reader.isAutoproduct()) {
ret.setNotes("Created automatic account event from reader."); EventUser eu = userbean.getEventUser(card.getUser().getUser());
AccountEvent createAc = productPBean.createAccountEvent(reader.getAutomaticProduct(), reader.getAutomaticProductCount(), eu, Calendar.getInstance());
readerfacade.flush();
logger.info("Creating new accountevent from autoproduct {}", createAc);
ret.setNotes("Created automatic account event from reader. " + createAc);
} }
} else { } else {
...@@ -101,17 +107,7 @@ public class ReaderBean implements ReaderBeanLocal { ...@@ -101,17 +107,7 @@ public class ReaderBean implements ReaderBeanLocal {
ret.setValue(tag); ret.setValue(tag);
} }
return ret; return ret;
//
// if (revent.getEvent() != null) {
// ret = readerEventFacade.find(revent.getEvent().getId());
// revent.setEvent(ret);
// }
// else if (card != null) {
//
// revent.setEvent(ret);
// }
//
// return ret;
} }
// //
...@@ -214,8 +210,7 @@ public class ReaderBean implements ReaderBeanLocal { ...@@ -214,8 +210,7 @@ public class ReaderBean implements ReaderBeanLocal {
public User findTagFromAnyEvent(String value) { public User findTagFromAnyEvent(String value) {
PrintedCard card = cardfacade.findLatestByRfidFromAny(value); PrintedCard card = cardfacade.findLatestByRfidFromAny(value);
User ret = null; User ret = null;
if (card != null && card.getUser() != null) if (card != null && card.getUser() != null) {
{
ret = card.getUser().getUser(); ret = card.getUser().getUser();
} }
...@@ -246,4 +241,17 @@ public class ReaderBean implements ReaderBeanLocal { ...@@ -246,4 +241,17 @@ public class ReaderBean implements ReaderBeanLocal {
} }
return ret; return ret;
} }
@Override
public Reader getReader(Integer readerid) {
return readerfacade.findReader(readerid);
}
@Override
public Reader saveReader(Reader reader) {
if (!eventbean.getCurrentEvent().equals(reader.getEvent())) {
throw new EJBAccessException("Trying to save reader from wrong event");
}
return readerfacade.merge(reader);
}
} }
...@@ -44,11 +44,11 @@ import fi.insomnia.bortal.model.Role; ...@@ -44,11 +44,11 @@ import fi.insomnia.bortal.model.Role;
import fi.insomnia.bortal.model.User; import fi.insomnia.bortal.model.User;
import fi.insomnia.bortal.model.UserImage; import fi.insomnia.bortal.model.UserImage;
import fi.insomnia.bortal.util.MailMessage; import fi.insomnia.bortal.util.MailMessage;
import fi.insomnia.bortal.util.UserSearchQuery;
import fi.insomnia.bortal.utilities.I18n; import fi.insomnia.bortal.utilities.I18n;
import fi.insomnia.bortal.utilities.PasswordFunctions; import fi.insomnia.bortal.utilities.PasswordFunctions;
import fi.insomnia.bortal.utilities.SearchQuery; import fi.insomnia.bortal.utilities.SearchQuery;
import fi.insomnia.bortal.utilities.SearchResult; import fi.insomnia.bortal.utilities.SearchResult;
import fi.insomnia.bortal.utilities.UserSearchQuery;
/** /**
* Session Bean implementation class UserBean * Session Bean implementation class UserBean
......
...@@ -9,21 +9,26 @@ import javax.ejb.Stateless; ...@@ -9,21 +9,26 @@ import javax.ejb.Stateless;
import javax.persistence.TypedQuery; import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.From;
import javax.persistence.criteria.Root; import javax.persistence.criteria.Root;
import fi.insomnia.bortal.beans.EventBeanLocal; import fi.insomnia.bortal.beans.EventBeanLocal;
import fi.insomnia.bortal.enums.DatabaseValueCompare;
import fi.insomnia.bortal.facade.callbacks.EventLimiter;
import fi.insomnia.bortal.facade.callbacks.EventUserAccountSaldoPredicate;
import fi.insomnia.bortal.facade.callbacks.EventUserPlacegroupPredicate;
import fi.insomnia.bortal.facade.callbacks.EventUserRolefilter;
import fi.insomnia.bortal.facade.callbacks.EventUserSearchPredicate;
import fi.insomnia.bortal.facade.callbacks.FacadeCallback; import fi.insomnia.bortal.facade.callbacks.FacadeCallback;
import fi.insomnia.bortal.facade.callbacks.OrderCallback; import fi.insomnia.bortal.facade.callbacks.OrderCallback;
import fi.insomnia.bortal.facade.tools.EventLimiter;
import fi.insomnia.bortal.facade.tools.EventUserSearchPredicate;
import fi.insomnia.bortal.model.EventUser; import fi.insomnia.bortal.model.EventUser;
import fi.insomnia.bortal.model.EventUser_; import fi.insomnia.bortal.model.EventUser_;
import fi.insomnia.bortal.model.PrintedCard; import fi.insomnia.bortal.model.PrintedCard;
import fi.insomnia.bortal.model.PrintedCard_; import fi.insomnia.bortal.model.PrintedCard_;
import fi.insomnia.bortal.model.User; import fi.insomnia.bortal.model.User;
import fi.insomnia.bortal.model.User_; import fi.insomnia.bortal.model.User_;
import fi.insomnia.bortal.util.UserSearchQuery;
import fi.insomnia.bortal.utilities.SearchResult; import fi.insomnia.bortal.utilities.SearchResult;
import fi.insomnia.bortal.utilities.UserSearchQuery;
/** /**
* Session Bean implementation class EventUserFacade * Session Bean implementation class EventUserFacade
...@@ -94,14 +99,30 @@ public class EventUserFacade extends IntegerPkGenericFacade<EventUser> { ...@@ -94,14 +99,30 @@ public class EventUserFacade extends IntegerPkGenericFacade<EventUser> {
{ {
callbacks.add(new EventUserSearchPredicate(query.getSearch(), UserFacade.getAttrlist())); callbacks.add(new EventUserSearchPredicate(query.getSearch(), UserFacade.getAttrlist()));
} }
if (query.isPlaceAssoc())
{
callbacks.add(new EventUserPlacegroupPredicate());
}
if (query.getFilterRoles() != null && !query.getFilterRoles().isEmpty()) {
callbacks.add(new EventUserRolefilter(query.getFilterRoles()));
}
if (query.getAccountSaldo() != null &&
query.getAccountSaldoCompare() != null &&
!DatabaseValueCompare.NONE.equals(query.getAccountSaldoCompare()))
{
callbacks.add(new EventUserAccountSaldoPredicate(query.getAccountSaldo(), query.getAccountSaldoCompare()));
}
CriteriaBuilder cb = getEm().getCriteriaBuilder(); CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<EventUser> listCQuery = cb.createQuery(EventUser.class); CriteriaQuery<EventUser> listCQuery = cb.createQuery(EventUser.class);
CriteriaQuery<Long> countCQuery = cb.createQuery(Long.class); CriteriaQuery<Long> countCQuery = cb.createQuery(Long.class);
Root<EventUser> listRoot = searchCallbacks(listCQuery, callbacks, EventUser.class); From<?, EventUser> listRoot = null;
Root<EventUser> countRoot = searchCallbacks(countCQuery, callbacks, EventUser.class); From<?, EventUser> countRoot = null;
listRoot = searchCallbacks(listCQuery, callbacks, EventUser.class);
countRoot = searchCallbacks(countCQuery, callbacks, EventUser.class);
listCQuery.select(listRoot); listCQuery.select(listRoot);
countCQuery.select(cb.count(countRoot)); countCQuery.select(cb.count(countRoot));
...@@ -116,6 +137,37 @@ public class EventUserFacade extends IntegerPkGenericFacade<EventUser> { ...@@ -116,6 +137,37 @@ public class EventUserFacade extends IntegerPkGenericFacade<EventUser> {
return new SearchResult<EventUser>(listQ.getResultList(), countQ.getSingleResult()); return new SearchResult<EventUser>(listQ.getResultList(), countQ.getSingleResult());
} }
// private Predicate addAcPredicate(CriteriaBuilder cb, UserSearchQuery
// query, Root<AccountEvent> root) {
// Expression<BigDecimal> sum =
// cb.sum(cb.prod(root.get(AccountEvent_.unitPrice),
// root.get(AccountEvent_.quantity)));
// Predicate ret = null;
// switch (query.getAccountSaldoCompare())
// {
// case EQ:
// ret = cb.equal(sum, query.getAccountSaldo());
// break;
// case GE:
// ret = cb.ge(sum, query.getAccountSaldo());
// break;
// case GT:
// ret = cb.gt(sum, query.getAccountSaldo());
// break;
// case LE:
// ret = cb.le(sum, query.getAccountSaldo());
// break;
// case LT:
// ret = cb.lt(sum, query.getAccountSaldo());
// break;
// default:
// throw new EJBException("Unknown account saldo comparer: " +
// query.getAccountSaldoCompare());
//
// }
// return ret;
// }
// public SearchResult<EventUser> searchUser(int page, int pagesize, String // public SearchResult<EventUser> searchUser(int page, int pagesize, String
// sort, String search) { // sort, String search) {
// //
......
...@@ -9,6 +9,8 @@ import javax.persistence.NoResultException; ...@@ -9,6 +9,8 @@ import javax.persistence.NoResultException;
import javax.persistence.TypedQuery; import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.From;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root; import javax.persistence.criteria.Root;
...@@ -165,7 +167,7 @@ public abstract class GenericFacade<C extends ModelInterface> { ...@@ -165,7 +167,7 @@ public abstract class GenericFacade<C extends ModelInterface> {
searchCallbacks(listCQuery, list); searchCallbacks(listCQuery, list);
Root<C> countRoot = searchCallbacks(countCQuery, list); Path<C> countRoot = searchCallbacks(countCQuery, list);
countCQuery.select(cb.count(countRoot)); countCQuery.select(cb.count(countRoot));
TypedQuery<Long> countQ = getEm().createQuery(countCQuery); TypedQuery<Long> countQ = getEm().createQuery(countCQuery);
...@@ -179,13 +181,25 @@ public abstract class GenericFacade<C extends ModelInterface> { ...@@ -179,13 +181,25 @@ public abstract class GenericFacade<C extends ModelInterface> {
return new SearchResult<C>(listQ.getResultList(), countQ.getSingleResult()); return new SearchResult<C>(listQ.getResultList(), countQ.getSingleResult());
} }
protected Root<C> searchCallbacks(CriteriaQuery<?> cq, List<FacadeCallback<C>> list) { protected From<?, C> searchCallbacks(CriteriaQuery<?> cq, List<FacadeCallback<C>> list) {
return searchCallbacks(cq, list, getEntityClass()); return searchCallbacks(cq, list, getEntityClass());
} }
protected <T extends ModelInterface> Root<T> searchCallbacks(CriteriaQuery<?> cq, List<FacadeCallback<T>> list, Class<T> clazz) { protected <T extends ModelInterface> From<?, T> searchCallbacks(CriteriaQuery<?> cq, List<FacadeCallback<T>> list, Class<T> clazz) {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
Root<T> root = cq.from(clazz); Root<T> root = cq.from(clazz);
ArrayList<Predicate> predicates = handlePredicates(cq, list, root);
if (!predicates.isEmpty()) {
Predicate[] preds = predicates.toArray(new Predicate[predicates.size()]);
cq.where(preds);
}
return root;
}
protected <T extends ModelInterface> ArrayList<Predicate> handlePredicates(CriteriaQuery<?> cq, List<FacadeCallback<T>> list, From<?, T> root) {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
ArrayList<Predicate> predicates = new ArrayList<Predicate>(); ArrayList<Predicate> predicates = new ArrayList<Predicate>();
for (FacadeCallback<T> fc : list) { for (FacadeCallback<T> fc : list) {
...@@ -193,12 +207,7 @@ public abstract class GenericFacade<C extends ModelInterface> { ...@@ -193,12 +207,7 @@ public abstract class GenericFacade<C extends ModelInterface> {
fc.exec(cb, cq, root, predicates); fc.exec(cb, cq, root, predicates);
} }
} }
if (!predicates.isEmpty()) { return predicates;
Predicate[] preds = predicates.toArray(new Predicate[predicates.size()]);
cq.where(preds);
}
return root;
} }
......
...@@ -75,4 +75,14 @@ public class ReaderFacade extends IntegerPkGenericFacade<Reader> { ...@@ -75,4 +75,14 @@ public class ReaderFacade extends IntegerPkGenericFacade<Reader> {
cq.where(cb.equal(root.get(Reader_.event), eventbean.getCurrentEvent())); cq.where(cb.equal(root.get(Reader_.event), eventbean.getCurrentEvent()));
return getEm().createQuery(cq).getResultList(); return getEm().createQuery(cq).getResultList();
} }
public Reader findReader(Integer readerid) {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<Reader> cq = cb.createQuery(Reader.class);
Root<Reader> root = cq.from(Reader.class);
cq.where(cb.equal(root.get(Reader_.id), readerid),
cb.equal(root.get(Reader_.event), eventbean.getCurrentEvent()));
return getSingleNullableResult(getEm().createQuery(cq));
}
} }
...@@ -5,7 +5,7 @@ import java.util.List; ...@@ -5,7 +5,7 @@ import java.util.List;
import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Path; import javax.persistence.criteria.From;
import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Predicate;
import javax.persistence.metamodel.SingularAttribute; import javax.persistence.metamodel.SingularAttribute;
...@@ -26,7 +26,7 @@ public class AndPredicateCreator<A, T extends ModelInterface> implements FacadeC ...@@ -26,7 +26,7 @@ public class AndPredicateCreator<A, T extends ModelInterface> implements FacadeC
} }
@Override @Override
public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Path<T> root, List<Predicate> predicates) { public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, From<?, T> root, List<Predicate> predicates) {
if (searchval == null || attributes == null || attributes.isEmpty()) { if (searchval == null || attributes == null || attributes.isEmpty()) {
return; return;
} }
......
package fi.insomnia.bortal.facade.tools; package fi.insomnia.bortal.facade.callbacks;
import java.util.List; import java.util.List;
import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Path; import javax.persistence.criteria.From;
import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Predicate;
import fi.insomnia.bortal.facade.callbacks.FacadeCallback;
import fi.insomnia.bortal.model.EventUser; import fi.insomnia.bortal.model.EventUser;
import fi.insomnia.bortal.model.EventUser_; import fi.insomnia.bortal.model.EventUser_;
import fi.insomnia.bortal.model.LanEvent; import fi.insomnia.bortal.model.LanEvent;
...@@ -21,7 +20,7 @@ public class EventLimiter implements FacadeCallback<EventUser> { ...@@ -21,7 +20,7 @@ public class EventLimiter implements FacadeCallback<EventUser> {
} }
@Override @Override
public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Path<EventUser> root, List<Predicate> predicates) { public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, From<?, EventUser> root, List<Predicate> predicates) {
predicates.add(cb.equal(root.get(EventUser_.event), ev)); predicates.add(cb.equal(root.get(EventUser_.event), ev));
} }
......
package fi.insomnia.bortal.facade.callbacks;
import java.math.BigDecimal;
import java.util.List;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.From;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import javax.persistence.criteria.Subquery;
import fi.insomnia.bortal.enums.DatabaseValueCompare;
import fi.insomnia.bortal.model.AccountEvent;
import fi.insomnia.bortal.model.AccountEvent_;
import fi.insomnia.bortal.model.EventUser;
public class EventUserAccountSaldoPredicate implements FacadeCallback<EventUser> {
private final DatabaseValueCompare compare;
private final BigDecimal saldo;
public EventUserAccountSaldoPredicate(BigDecimal accountSaldo, DatabaseValueCompare accountSaldoCompare) {
saldo = accountSaldo;
compare = accountSaldoCompare;
}
@Override
public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, From<?, EventUser> root, List<Predicate> predicates) {
Subquery<BigDecimal> subq = cq.subquery(BigDecimal.class);
Root<AccountEvent> acRoot = subq.from(AccountEvent.class);
subq.where(cb.equal(acRoot.get(AccountEvent_.user), root));
subq.select(cb.sum(cb.prod(acRoot.get(AccountEvent_.unitPrice), acRoot.get(AccountEvent_.quantity))));
Predicate pred = null;
switch (compare) {
case EQ:
pred = cb.equal(subq, saldo);
break;
case GE:
pred = cb.ge(subq, saldo);
break;
case GT:
pred = cb.gt(subq, saldo);
break;
case LE:
pred = cb.le(subq, saldo);
break;
case LT:
pred = cb.lt(subq, saldo);
break;
case NE:
pred = cb.notEqual(subq, saldo);
break;
case NONE:
default:
break;
}
if (pred != null)
{
predicates.add(pred);
}
}
}
package fi.insomnia.bortal.facade.callbacks;
import java.util.List;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.From;
import javax.persistence.criteria.Predicate;
import fi.insomnia.bortal.model.EventUser;
import fi.insomnia.bortal.model.EventUser_;
public class EventUserPlacegroupPredicate implements FacadeCallback<EventUser> {
@Override
public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, From<?, EventUser> root, List<Predicate> predicates) {
predicates.add(cb.isNotEmpty(root.get(EventUser_.groupMemberships)));
}
}
package fi.insomnia.bortal.facade.callbacks;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.From;
import javax.persistence.criteria.Predicate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.model.EventUser;
import fi.insomnia.bortal.model.EventUser_;
import fi.insomnia.bortal.model.Role;
import fi.insomnia.bortal.model.Role_;
public class EventUserRolefilter implements FacadeCallback<EventUser> {
private final List<Role> roles;
private static final Logger logger = LoggerFactory.getLogger(EventUserRolefilter.class);
public EventUserRolefilter(List<Role> filters) {
roles = filters;
}
@Override
public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, From<?, EventUser> root, List<Predicate> predicates) {
if (roles != null && !roles.isEmpty())
{
List<Integer> roleids = new ArrayList<Integer>();
for (Role r : roles) {
roleids.add(r.getId());
}
logger.debug("Requiring roles {}", roleids);
Predicate pred = root.join(EventUser_.roles).get(Role_.id).in(roleids);
predicates.add(pred);
}
}
}
package fi.insomnia.bortal.facade.tools; package fi.insomnia.bortal.facade.callbacks;
import java.util.List; import java.util.List;
import javax.persistence.criteria.Path; import javax.persistence.criteria.Path;
import javax.persistence.metamodel.SingularAttribute; import javax.persistence.metamodel.SingularAttribute;
import fi.insomnia.bortal.facade.callbacks.PathStringSearchPredicateCreator;
import fi.insomnia.bortal.model.EventUser; import fi.insomnia.bortal.model.EventUser;
import fi.insomnia.bortal.model.EventUser_; import fi.insomnia.bortal.model.EventUser_;
import fi.insomnia.bortal.model.User; import fi.insomnia.bortal.model.User;
......
...@@ -4,7 +4,7 @@ import java.util.List; ...@@ -4,7 +4,7 @@ import java.util.List;
import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Path; import javax.persistence.criteria.From;
import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Predicate;
import fi.insomnia.bortal.utilities.jpa.ModelInterface; import fi.insomnia.bortal.utilities.jpa.ModelInterface;
...@@ -14,5 +14,5 @@ public interface FacadeCallback<C extends ModelInterface> { ...@@ -14,5 +14,5 @@ public interface FacadeCallback<C extends ModelInterface> {
// void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Root<C> root, // void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Root<C> root,
// List<Predicate> predicates); // List<Predicate> predicates);
void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Path<C> root, List<Predicate> predicates); void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, From<?, C> root, List<Predicate> predicates);
} }
...@@ -4,7 +4,7 @@ import java.util.List; ...@@ -4,7 +4,7 @@ import java.util.List;
import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Path; import javax.persistence.criteria.From;
import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Predicate;
import javax.persistence.metamodel.SingularAttribute; import javax.persistence.metamodel.SingularAttribute;
...@@ -24,7 +24,7 @@ public class OrPredicateCreator<A, T extends ModelInterface> implements FacadeCa ...@@ -24,7 +24,7 @@ public class OrPredicateCreator<A, T extends ModelInterface> implements FacadeCa
} }
@Override @Override
public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Path<T> root, List<Predicate> predicates) { public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, From<?, T> root, List<Predicate> predicates) {
if (searchstr == null || attributes == null || attributes.isEmpty()) { if (searchstr == null || attributes == null || attributes.isEmpty()) {
return; return;
} }
......
...@@ -4,6 +4,7 @@ import java.util.List; ...@@ -4,6 +4,7 @@ import java.util.List;
import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.From;
import javax.persistence.criteria.Path; import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Predicate;
import javax.persistence.metamodel.SingularAttribute; import javax.persistence.metamodel.SingularAttribute;
...@@ -29,7 +30,7 @@ public class OrderCallback<T extends ModelInterface> implements FacadeCallback<T ...@@ -29,7 +30,7 @@ public class OrderCallback<T extends ModelInterface> implements FacadeCallback<T
} }
@Override @Override
public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Path<T> root, List<Predicate> predicates) { public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, From<?, T> root, List<Predicate> predicates) {
Class<?> rettype = cq.getResultType(); Class<?> rettype = cq.getResultType();
// Check if returntype is entity or are we for example counting results // Check if returntype is entity or are we for example counting results
......
...@@ -5,6 +5,7 @@ import java.util.List; ...@@ -5,6 +5,7 @@ import java.util.List;
import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.From;
import javax.persistence.criteria.Path; import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Predicate;
import javax.persistence.metamodel.SingularAttribute; import javax.persistence.metamodel.SingularAttribute;
...@@ -42,7 +43,7 @@ public abstract class PathStringSearchPredicateCreator<T extends ModelInterface, ...@@ -42,7 +43,7 @@ public abstract class PathStringSearchPredicateCreator<T extends ModelInterface,
} }
@Override @Override
public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Path<T> path, List<Predicate> predicates) { public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, From<?, T> path, List<Predicate> predicates) {
if (searchstr == null || attributes == null || attributes.isEmpty()) { if (searchstr == null || attributes == null || attributes.isEmpty()) {
return; return;
} }
......
package fi.insomnia.bortal.beans;
import java.util.List;
import javax.ejb.Local;
@Local
public interface CardPrintBeanLocal {
public byte[] getUserCardsAsPrintablePdf(List<Integer> userIdList) throws Exception;
public byte[] getUserCardAsPrintablePdf(Integer userId) throws Exception;
}
...@@ -31,4 +31,8 @@ public interface ReaderBeanLocal { ...@@ -31,4 +31,8 @@ public interface ReaderBeanLocal {
ReaderEvent createCard(ReaderEvent event, EventUser user); ReaderEvent createCard(ReaderEvent event, EventUser user);
Reader getReader(Integer readerid);
Reader saveReader(Reader reader);
} }
...@@ -10,9 +10,9 @@ import fi.insomnia.bortal.model.GroupMembership; ...@@ -10,9 +10,9 @@ import fi.insomnia.bortal.model.GroupMembership;
import fi.insomnia.bortal.model.Role; import fi.insomnia.bortal.model.Role;
import fi.insomnia.bortal.model.User; import fi.insomnia.bortal.model.User;
import fi.insomnia.bortal.model.UserImage; import fi.insomnia.bortal.model.UserImage;
import fi.insomnia.bortal.util.UserSearchQuery;
import fi.insomnia.bortal.utilities.SearchQuery; import fi.insomnia.bortal.utilities.SearchQuery;
import fi.insomnia.bortal.utilities.SearchResult; import fi.insomnia.bortal.utilities.SearchResult;
import fi.insomnia.bortal.utilities.UserSearchQuery;
@Local @Local
public interface UserBeanLocal { public interface UserBeanLocal {
...@@ -37,6 +37,13 @@ public interface UserBeanLocal { ...@@ -37,6 +37,13 @@ public interface UserBeanLocal {
boolean initPasswordReset(String user, String mailpath); boolean initPasswordReset(String user, String mailpath);
/**
* Search EventUser entity by User entity ID
*
* @param userid
* ID of the User entity to be searcher
* @return
*/
EventUser findByUserId(Integer userid); EventUser findByUserId(Integer userid);
EventUser findByEventUserId(Integer integer); EventUser findByEventUserId(Integer integer);
......
package fi.insomnia.bortal.util;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import fi.insomnia.bortal.enums.DatabaseValueCompare;
import fi.insomnia.bortal.model.Role;
import fi.insomnia.bortal.utilities.SearchQuery;
public class UserSearchQuery extends SearchQuery {
private static final long serialVersionUID = 1383445517981308383L;
private List<Role> filterRoles = new ArrayList<Role>();
private boolean onlyThisEvent = true;
private boolean placeAssoc = false;
private BigDecimal accountSaldo;
private DatabaseValueCompare accountSaldoCompare = DatabaseValueCompare.NONE;
public DatabaseValueCompare[] getAccountCompareValues()
{
return DatabaseValueCompare.values();
}
public boolean isOnlyThisEvent() {
return onlyThisEvent;
}
public void setOnlyThisEvent(boolean onlyThisEvent) {
this.onlyThisEvent = onlyThisEvent;
}
public List<Role> getFilterRoles() {
return filterRoles;
}
public void setFilterRoles(List<Role> filterRoles) {
this.filterRoles = filterRoles;
}
public BigDecimal getAccountSaldo() {
return accountSaldo;
}
public void setAccountSaldo(BigDecimal accountSaldo) {
this.accountSaldo = accountSaldo;
}
public DatabaseValueCompare getAccountSaldoCompare() {
return accountSaldoCompare;
}
public void setAccountSaldoCompare(DatabaseValueCompare accountSaldoCompare) {
this.accountSaldoCompare = accountSaldoCompare;
}
public boolean isPlaceAssoc() {
return placeAssoc;
}
public void setPlaceAssoc(boolean placeAssoc) {
this.placeAssoc = placeAssoc;
}
}
...@@ -55,7 +55,7 @@ public class EventUser extends GenericEntity { ...@@ -55,7 +55,7 @@ public class EventUser extends GenericEntity {
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL) @OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
private List<UserNote> notes; private List<UserNote> notes;
@ManyToMany() @ManyToMany(mappedBy = "users")
private List<Role> roles = new ArrayList<Role>(); private List<Role> roles = new ArrayList<Role>();
@OneToMany(mappedBy = "user") @OneToMany(mappedBy = "user")
......
...@@ -42,6 +42,9 @@ public class Product extends GenericEntity { ...@@ -42,6 +42,9 @@ public class Product extends GenericEntity {
private static final String PRODUCTFLAG_TABLE_COLUMN = "productflags"; private static final String PRODUCTFLAG_TABLE_COLUMN = "productflags";
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
public static final String EVENT_ID_COLUMN = "event_id"; public static final String EVENT_ID_COLUMN = "event_id";
public static final Product EMPTY_PRODUCT = new Product("----");
@ManyToOne() @ManyToOne()
@JoinColumn(name = EVENT_ID_COLUMN, nullable = false) @JoinColumn(name = EVENT_ID_COLUMN, nullable = false)
private LanEvent event; private LanEvent event;
...@@ -118,6 +121,11 @@ public class Product extends GenericEntity { ...@@ -118,6 +121,11 @@ public class Product extends GenericEntity {
} }
private Product(String string) {
super();
name = "----";
}
public BigDecimal getSoldCash() { public BigDecimal getSoldCash() {
BigDecimal tot = BigDecimal.ZERO; BigDecimal tot = BigDecimal.ZERO;
for (AccountEvent ac : this.getAccountEvents()) { for (AccountEvent ac : this.getAccountEvents()) {
......
package fi.insomnia.bortal.model; package fi.insomnia.bortal.model;
public enum ReaderType { public enum ReaderType {
RFID, BARCODE, IRIS, FINGERPRINT, BLOODTYPE RFID, BARCODE, IRIS, FINGERPRINT, BLOODTYPE, DNA
} }
package fi.insomnia.bortal.enums;
public enum DatabaseValueCompare {
NONE, LT, LE, EQ, NE, GT, GE
;
private final String key;
private DatabaseValueCompare() {
key = "databasevalue." + name();
}
public String getKey() {
return key;
}
}
package fi.insomnia.bortal.utilities;
public class ImageMover {
private Integer response;
private byte[] data;
private String imagetype;
public byte[] getData() {
return data;
}
public void setData(byte[] data) {
this.data = data;
}
public String getImagetype() {
return imagetype;
}
public void setImagetype(String imagetype) {
this.imagetype = imagetype;
}
public Integer getResponse() {
return response;
}
public void setResponse(Integer response) {
this.response = response;
}
}
package fi.insomnia.bortal.utilities;
import java.util.List;
import javax.management.relation.Role;
public class UserSearchQuery extends SearchQuery {
private static final long serialVersionUID = 1383445517981308383L;
private List<Role> filterRoles;
private boolean onlyThisEvent = true;
public boolean isOnlyThisEvent() {
return onlyThisEvent;
}
public void setOnlyThisEvent(boolean onlyThisEvent) {
this.onlyThisEvent = onlyThisEvent;
}
public List<Role> getFilterRoles() {
return filterRoles;
}
public void setFilterRoles(List<Role> filterRoles) {
this.filterRoles = filterRoles;
}
}
...@@ -9,8 +9,8 @@ ...@@ -9,8 +9,8 @@
</session-config> </session-config>
<context-param> <context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name> <param-name>javax.faces.PROJECT_STAGE</param-name>
<!-- <param-value>Production</param-value> --> <!--<param-value>Production</param-value>-->
<param-value>Development</param-value> <param-value>Development</param-value>
</context-param> </context-param>
<context-param> <context-param>
......
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"
xmlns:composite="http://java.sun.com/jsf/composite" xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:tools="http://java.sun.com/jsf/composite/tools" xmlns:p="http://primefaces.org/ui">
<composite:interface>
<composite:attribute name="creating" required="false" default="false" />
<composite:attribute name="commitvalue" required="true" />
<composite:attribute name="commitaction" required="true" method-signature="java.lang.String action()" />
</composite:interface>
<composite:implementation>
<h:form id="userform">
<h:panelGrid columns="3">
<h:outputLabel rendered="#{!cc.attrs.creating}" value="#{i18n['user.login']}:" for="viewlogin" />
<h:outputText rendered="#{!cc.attrs.creating}" disabled="#{!cc.attrs.creating and !userView.canSave()}"
id="viewlogin" value="#{userView.selectedUser.login}"
/>
<h:message rendered="#{!cc.attrs.creating}" for="viewlogin" />
<h:outputLabel rendered="#{cc.attrs.creating}" value="#{i18n['user.login']}:" for="login" />
<h:inputText size="45" rendered="#{cc.attrs.creating}" validator="#{userValidator.login}"
disabled="#{!cc.attrs.creating and !userView.canSave()}" id="login" value="#{userView.selectedUser.login}"
/>
<h:message rendered="#{cc.attrs.creating}" for="login" />
<h:outputLabel value="#{i18n['user.nick']}:" for="nick" />
<h:inputText size="45" id="nick" disabled="#{!cc.attrs.creating and !userView.canSave()}" value="#{userView.selectedUser.nick}" />
<h:message for="nick" />
<h:outputLabel value="#{i18n['user.email']}:" for="email" />
<h:inputText validator="#{userValidator.validateEmail}" size="45" id="email" disabled="#{!cc.attrs.creating and !userView.canSave()}"
value="#{userView.selectedUser.email}"
/>
<h:message for="email" />
<h:outputLabel value="#{i18n['user.firstNames']}:" for="firstnames" />
<h:inputText size="45" id="firstnames" disabled="#{!cc.attrs.creating and !userView.canSave()}"
value="#{userView.selectedUser.firstnames}"
/>
<h:message for="firstnames" />
<h:outputLabel value="#{i18n['user.lastName']}:" for="lastname" />
<h:inputText size="45" id="lastname" disabled="#{!cc.attrs.creating and !userView.canSave()}"
value="#{userView.selectedUser.lastname}"
/>
<h:message for="lastname" />
<h:outputLabel value="#{i18n['user.address']}:" for="address" />
<h:inputText size="45" id="address" disabled="#{!cc.attrs.creating and !userView.canSave()}"
value="#{userView.selectedUser.address}"
/>
<h:message for="address" />
<h:outputLabel value="#{i18n['user.zipCode']}:" for="zip" />
<h:inputText size="45" id="zip" disabled="#{!cc.attrs.creating and !userView.canSave()}" value="#{userView.selectedUser.zip}" />
<h:message for="zip" />
<h:outputLabel value="#{i18n['user.town']}:" for="town" />
<h:inputText size="45" id="town" disabled="#{!cc.attrs.creating and !userView.canSave()}" value="#{userView.selectedUser.town}" />
<h:message for="town" />
<!--
<h:outputLabel value="#{i18n['user.defaultImage']}:" for="currentImage" />
<h:selectOneMenu rendered="#{sessionHandler.hasPermission('USER', 'READ')}" id="currentImage" value="#{userView.selectedUser.currentImage}" converter="#{userimageConverter}" >
<f:selectItems var="image" itemLabel="#{image.description}" value="#{userView.selectedUser.userImageList}" />
</h:selectOneMenu>
-->
<h:outputLabel value="#{i18n['user.sex']}:" for="sex" />
<h:selectOneRadio disabled="#{!cc.attrs.creating and !userView.canSave()}" id="sex"
value="#{userView.selectedUser.gender}"
>
<f:selectItem id="undefined" itemLabel="#{i18n['user.sex.UNDEFINED']}" itemValue="UNDEFINED" />
<f:selectItem id="male" itemLabel="#{i18n['user.sex.MALE']}" itemValue="MALE" />
<f:selectItem id="female" itemLabel="#{i18n['user.sex.FEMALE']}" itemValue="FEMALE" />
</h:selectOneRadio>
<h:message for="sex" />
<h:outputLabel for="birthday" value="#{i18n['user.birthday']}:"/>
<p:calendar id="birthday" navigator="true" yearRange="c-80:c-0" locale="fi" value="#{userView.selectedUser.birthday}" pattern="#{sessionHandler.dateFormat}" timeZone="#{sessionHandler.timezone}" />
<h:message for="birthday" />
<h:outputLabel rendered="#{cc.attrs.creating}" value="#{i18n['user.password']}:" for="password" />
<h:inputSecret validator="#{userValidator.password}" rendered="#{cc.attrs.creating}" id="password"
value="#{userView.password}"
/>
<h:message rendered="#{cc.attrs.creating}" for="password" />
<h:outputLabel rendered="#{cc.attrs.creating}" value="#{i18n['user.passwordcheck']}:" for="passwordcheck" />
<h:inputSecret validator="#{userValidator.password}" rendered="#{cc.attrs.creating}" id="passwordcheck"
value="#{userView.passwordcheck}"
/>
<h:message rendered="#{cc.attrs.creating}" for="passwordcheck" />
<h:outputLabel rendered="#{sessionHandler.superadmin}" value="#{i18n['user.superadmin']}:" for="superadmin" />
<h:selectBooleanCheckbox disabled="#{!cc.attrs.creating and !userView.canSave()}"
rendered="#{sessionHandler.superadmin}" id="superadmin" value="#{userView.selectedUser.superadmin}"
/>
<h:message rendered="#{sessionHandler.superadmin}" for="superadmin" />
<h:commandButton rendered="#{cc.attrs.creating or userView.canSave()}" id="commitbtn"
action="#{cc.attrs.commitaction}" value="#{cc.attrs.commitvalue}"
/>
</h:panelGrid>
</h:form>
</composite:implementation>
</html>
\ No newline at end of file
...@@ -49,10 +49,10 @@ ...@@ -49,10 +49,10 @@
</ui:fragment> </ui:fragment>
<ui:fragment rendered="#{cc.attrs.creating}"> <ui:fragment rendered="#{cc.attrs.creating}">
<h:outputLabel value="#{i18n['user.login']}" for="login" /> <h:outputLabel value="#{i18n['user.login']}" for="mklogin" />
<br /> <br />
<p:inplace emptyLabel="#{i18n['user.insert']}"> <p:inplace emptyLabel="#{i18n['user.insert']}">
<p:inputText size="25" id="login" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.login}" /> <p:inputText size="25" id="mklogin" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.login}" />
</p:inplace> </p:inplace>
<p:message for="login" /> <p:message for="login" />
<br /> <br />
...@@ -63,14 +63,14 @@ ...@@ -63,14 +63,14 @@
<h:outputLabel rendered="#{cc.attrs.creating}" value="#{i18n['user.password']}" for="password" /> <h:outputLabel rendered="#{cc.attrs.creating}" value="#{i18n['user.password']}" for="password" />
<br /> <br />
<p:inplace rendered="#{cc.attrs.creating}" emptyLabel="#{i18n['user.insert']}"> <p:inplace rendered="#{cc.attrs.creating}" emptyLabel="#{i18n['user.insert']}">
<p:password validator="#{userValidator.password}" id="password" value="#{userView.password}" /> <p:password validator="#{userValidator.password}" id="password" value="#{userView.password}" />
</p:inplace> </p:inplace>
<p:message rendered="#{cc.attrs.creating}" for="password" /> <p:message rendered="#{cc.attrs.creating}" for="password" />
<br /> <br />
<p:outputLabel rendered="#{cc.attrs.creating}" value="#{i18n['user.passwordcheck']}" for="passwordcheck" /> <p:outputLabel rendered="#{cc.attrs.creating}" value="#{i18n['user.passwordcheck']}" for="passwordcheck" />
<br /> <br />
<p:inplace rendered="#{cc.attrs.creating}" emptyLabel="#{i18n['user.insert']}"> <p:inplace rendered="#{cc.attrs.creating}" emptyLabel="#{i18n['user.insert']}">
<p:password validator="#{userValidator.password}" id="passwordcheck" value="#{userView.passwordcheck}" /> <p:password validator="#{userValidator.password}" id="passwordcheck" value="#{userView.passwordcheck}" />
</p:inplace> </p:inplace>
<p:message rendered="#{cc.attrs.creating}" for="passwordcheck" /> <p:message rendered="#{cc.attrs.creating}" for="passwordcheck" />
<br /> <br />
...@@ -80,27 +80,29 @@ ...@@ -80,27 +80,29 @@
<h:panelGroup> <h:panelGroup>
<table> <table>
<ui:fragment rendered="#{!cc.attrs.creating}">
<tr>
<td colspan="2"><h:outputLabel for="login" value="#{i18n['user.login']}" /><br />
<h:outputText value="#{userView.selectedUser.login}" id="login" /></td>
</tr>
</ui:fragment>
<tr> <tr>
<td colspan="2"><h:outputLabel value="#{i18n['user.nick']}" for="nick" /> <br /> <td colspan="2"><h:outputLabel value="#{i18n['user.nick']}" for="nick" /> <br /> <p:inplace emptyLabel="#{i18n['user.insert']}">
<p:inplace emptyLabel="#{i18n['user.insert']}">
<p:inputText size="45" id="nick" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.nick}" /> <p:inputText size="45" id="nick" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.nick}" />
</p:inplace></td> </p:inplace></td>
</tr> </tr>
<tr> <tr>
<td><h:outputLabel value="#{i18n['user.firstNames']}" for="firstnames" /><br /> <td><h:outputLabel value="#{i18n['user.firstNames']}" for="firstnames" /><br /> <p:inplace emptyLabel="#{i18n['user.insert']}">
<p:inplace emptyLabel="#{i18n['user.insert']}">
<p:inputText size="22" id="firstnames" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.firstnames}" /> <p:inputText size="22" id="firstnames" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.firstnames}" />
</p:inplace></td> </p:inplace></td>
<td><h:outputLabel value="#{i18n['user.lastName']}" for="lastname" /><br /> <td><h:outputLabel value="#{i18n['user.lastName']}" for="lastname" /><br /> <p:inplace emptyLabel="#{i18n['user.insert']}">
<p:inplace emptyLabel="#{i18n['user.insert']}">
<p:inputText size="30" id="lastname" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.lastname}" /> <p:inputText size="30" id="lastname" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.lastname}" />
</p:inplace></td> </p:inplace></td>
</tr> </tr>
<tr> <tr>
<td><h:outputLabel for="birthday" value="#{i18n['user.birthday']}" /><br /> <p:calendar id="birthday" navigator="true" yearRange="c-80:c-0" locale="fi" <td><h:outputLabel for="birthday" value="#{i18n['user.birthday']}" /><br /> <p:calendar id="birthday" navigator="true" yearRange="c-80:c-0" locale="fi"
value="#{userView.selectedUser.birthday}" pattern="#{sessionHandler.dateFormat}" timeZone="#{sessionHandler.timezone}" /> <h:message for="birthday" /></td> value="#{userView.selectedUser.birthday}" pattern="#{sessionHandler.dateFormat}" timeZone="#{sessionHandler.timezone}" /> <h:message for="birthday" /></td>
<td><h:outputLabel value="#{i18n['user.sex']}" for="sex" /> <br /> <p:selectOneMenu disabled="#{!cc.attrs.creating and !userView.canSave}" id="sex" <td><h:outputLabel value="#{i18n['user.sex']}" for="sex" /> <br /> <p:selectOneMenu disabled="#{!cc.attrs.creating and !userView.canSave}" id="sex" value="#{userView.selectedUser.gender}">
value="#{userView.selectedUser.gender}">
<f:selectItem id="undefined" itemLabel="#{i18n['user.sex.UNDEFINED']}" itemValue="UNDEFINED" /> <f:selectItem id="undefined" itemLabel="#{i18n['user.sex.UNDEFINED']}" itemValue="UNDEFINED" />
<f:selectItem id="male" itemLabel="#{i18n['user.sex.MALE']}" itemValue="MALE" /> <f:selectItem id="male" itemLabel="#{i18n['user.sex.MALE']}" itemValue="MALE" />
<f:selectItem id="female" itemLabel="#{i18n['user.sex.FEMALE']}" itemValue="FEMALE" /> <f:selectItem id="female" itemLabel="#{i18n['user.sex.FEMALE']}" itemValue="FEMALE" />
...@@ -110,24 +112,20 @@ ...@@ -110,24 +112,20 @@
<table> <table>
<tr> <tr>
<td colspan="2"><p:outputLabel value="#{i18n['user.address']}" for="address" /><br /> <td colspan="2"><p:outputLabel value="#{i18n['user.address']}" for="address" /><br /> <p:inplace emptyLabel="#{i18n['user.insert']}">
<p:inplace emptyLabel="#{i18n['user.insert']}">
<p:inputText size="45" id="address" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.address}" /> <p:inputText size="45" id="address" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.address}" />
</p:inplace></td> </p:inplace></td>
</tr> </tr>
<tr> <tr>
<td><p:outputLabel value="#{i18n['user.zipCode']}" for="zip" /><br /> <td><p:outputLabel value="#{i18n['user.zipCode']}" for="zip" /><br /> <p:inplace emptyLabel="#{i18n['user.insert']}">
<p:inplace emptyLabel="#{i18n['user.insert']}">
<p:inputText styleClass="ui-input" size="7" id="zip" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.zip}" /> <p:inputText styleClass="ui-input" size="7" id="zip" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.zip}" />
</p:inplace> <p:message for="zip" /></td> </p:inplace> <p:message for="zip" /></td>
<td><p:outputLabel value="#{i18n['user.town']}" for="town" /><br /> <td><p:outputLabel value="#{i18n['user.town']}" for="town" /><br /> <p:inplace emptyLabel="#{i18n['user.insert']}">
<p:inplace emptyLabel="#{i18n['user.insert']}">
<p:inputText styleClass="ui-input" size="25" id="town" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.town}" /> <p:inputText styleClass="ui-input" size="25" id="town" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.town}" />
</p:inplace> <p:message for="town" /></td> </p:inplace> <p:message for="town" /></td>
</tr> </tr>
<tr> <tr>
<td colspan="2"><h:outputLabel value="#{i18n['user.email']}" for="email" /> <br /> <td colspan="2"><h:outputLabel value="#{i18n['user.email']}" for="email" /> <br /> <p:inplace emptyLabel="#{i18n['user.insert']}">
<p:inplace emptyLabel="#{i18n['user.insert']}">
<p:inputText validator="#{userValidator.validateEmail}" size="45" id="email" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.email}" /> <p:inputText validator="#{userValidator.validateEmail}" size="45" id="email" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.email}" />
</p:inplace></td> </p:inplace></td>
</tr> </tr>
......
...@@ -18,11 +18,13 @@ ...@@ -18,11 +18,13 @@
</f:facet> </f:facet>
<h:outputText styleClass="hoverable" value="#{(empty user.nick)?'----':user.nick}" /> <h:outputText styleClass="hoverable" value="#{(empty user.nick)?'----':user.nick}" />
<div class="userdata_popup"> <div class="userdata_popup">
<h:panelGrid columns="2"> <h:panelGrid columns="3" >
<img style="width: 100px;" src="#{request.contextPath}/dydata/userimage/#{user.currentImage.id}.img" alt="image" /> <img style="width: 100px;" src="#{request.contextPath}/dydata/userimage/#{user.currentImage.id}.img" alt="image" />
<h:panelGroup> <h:panelGroup>
<h:outputText value="#{user.nick}" /> <h:outputText id="login" value="#{user.login}" />
<br />
<h:outputText id="nick" value="#{user.nick}" />
<br /> <br />
<h:outputText value="#{user.firstnames} #{user.lastname}" /> <h:outputText value="#{user.firstnames} #{user.lastname}" />
<br /> <br />
...@@ -36,6 +38,11 @@ ...@@ -36,6 +38,11 @@
<br /> <br />
<h:outputText value="#{user.email}" /> <h:outputText value="#{user.email}" />
<br /> <br />
<h:outputText value="#{i18n['user.accountBalance']}: " />
<h:outputText value="#{user.accountBalance}">
<f:convertNumber maxFractionDigits="2" minFractionDigits="0" />
</h:outputText>
</h:panelGroup> </h:panelGroup>
</h:panelGrid> </h:panelGrid>
</div> </div>
...@@ -61,7 +68,7 @@ ...@@ -61,7 +68,7 @@
</h:column> </h:column>
<h:column> <h:column>
<button onClick="location.replace('#{request.contextPath}/useradmin/edit.jsf?userid=#{user.id}')">#{i18n['user.edit']}</button> <button onClick="location.replace('#{request.contextPath}/useradmin/edit.jsf?userid=#{user.user.id}')">#{i18n['user.edit']}</button>
</h:column> </h:column>
<!-- <h:column> <!-- <h:column>
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
<composite:implementation> <composite:implementation>
<h:outputScript library="primefaces" name="jquery/jquery.js" target="head" /> <h:outputScript library="primefaces" name="jquery/jquery.js" target="head" />
<h:dataTable styleClass="bordertable" id="user" value="#{userSearchView.results}" var="user"> <h:dataTable styleClass="bordertable" id="user" value="#{userSearchView.results}" var="user">
<h:column> <h:column>
<f:facet name="header"> <f:facet name="header">
<h:link value="#{i18n['user.nick']}" includeViewParams="true"> <h:link value="#{i18n['user.nick']}" includeViewParams="true">
...@@ -16,7 +17,7 @@ ...@@ -16,7 +17,7 @@
<f:param name="page" value="0" /> <f:param name="page" value="0" />
</h:link> </h:link>
</f:facet> </f:facet>
<h:outputText styleClass="hoverable" value="#{(empty user.nick)?'----':user.nick}" /> <h:outputText styleClass="hoverable" value="#{(empty user.nick)?'----':user.nick}" />
<div class="userdata_popup"> <div class="userdata_popup">
<h:panelGrid columns="2"> <h:panelGrid columns="2">
<img style="width:100px;" src="#{request.contextPath}/dydata/userimage/#{user.currentImage.id}.img" alt="image" /> <img style="width:100px;" src="#{request.contextPath}/dydata/userimage/#{user.currentImage.id}.img" alt="image" />
...@@ -53,7 +54,14 @@ ...@@ -53,7 +54,14 @@
</f:facet> </f:facet>
<h:outputText value="#{user.lastname}" /> <h:outputText value="#{user.lastname}" />
</h:column> </h:column>
<h:column>
<f:facet name="header">
<h:link value="#{i18n['user.email']}" includeViewParams="true">
<f:param name="sort" value="email" />
</h:link>
</f:facet>
<h:outputText value="#{user.email}" />
</h:column>
<h:column> <h:column>
<button onClick="location.replace('#{request.contextPath}/useradmin/edit.jsf?userid=#{user.id}')">#{i18n['user.edit']}</button> <button onClick="location.replace('#{request.contextPath}/useradmin/edit.jsf?userid=#{user.id}')">#{i18n['user.edit']}</button>
</h:column> </h:column>
......
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:composite="http://java.sun.com/jsf/composite"
xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:tools="http://java.sun.com/jsf/composite/tools" xmlns:p="http://primefaces.org/ui">
<composite:interface>
<composite:attribute name="creating" required="false" default="false" />
<composite:attribute name="commitvalue" required="true" />
<composite:attribute name="commitaction" required="true" method-signature="java.lang.String action()" />
</composite:interface>
<composite:implementation>
<h:outputScript library="primefaces" name="jquery/jquery.js" target="head" />
<!-- <h2>
<h:outputText rendered="#{!cc.attrs.creating}" disabled="#{!cc.attrs.creating and !userView.canSave}" id="viewlogin" value="#{userView.selectedUser.login}" />
</h2>
-->
<h:form id="userform" enctype="multipart/form-data">
<h:panelGrid columns="2">
<h:panelGroup>
<ui:fragment rendered="#{not empty userView.user.id}">
<p:overlayPanel id="chartPanel" for="webcamButton" hideEffect="fade">
<p:photoCam widgetVar="pc" listener="#{userView.oncapture}" update="@all" />
<p:commandButton type="button" value="Capture" onclick="pc.capture()" />
</p:overlayPanel>
<h:outputText rendered="#{empty userView.user.currentImage}" value="#{i18n['user.noCurrentImage']}" />
<ui:fragment rendered="#{!empty userView.user.currentImage}">
<img style="width: 150px;" src="#{request.contextPath}/dydata/userimage/#{userView.user.currentImage.id}.img" alt="image" />
</ui:fragment>
<br />
<p:commandButton id="webcamButton" value="#{i18n['userimage.webcam']}" type="button" />
<br />
<br />
<p:fileUpload id="uploadfile" required="TRUE" requiredMessage="Required!" invalidSizeMessage="#{i18n['user.imageTooBig']}" sizeLimit="1024" value="#{userView.image}" mode="simple" />
<p:message for="uploadfile" />
<p:commandButton action="#{userView.sendImage}" value="#{i18n['user.imagesubmit']}" />
</ui:fragment>
<ui:fragment rendered="#{cc.attrs.creating}">
<h:outputLabel value="#{i18n['user.login']}" for="login" />
<br />
<p:inplace emptyLabel="#{i18n['user.insert']}">
<p:inputText size="25" id="login" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.login}" />
</p:inplace>
<p:message for="login" />
<br />
</ui:fragment>
<br />
<h:outputLabel rendered="#{cc.attrs.creating}" value="#{i18n['user.password']}" for="password" />
<br />
<p:inplace rendered="#{cc.attrs.creating}" emptyLabel="#{i18n['user.insert']}">
<p:password validator="#{userValidator.password}" id="password" value="#{userView.password}" />
</p:inplace>
<p:message rendered="#{cc.attrs.creating}" for="password" />
<br />
<p:outputLabel rendered="#{cc.attrs.creating}" value="#{i18n['user.passwordcheck']}" for="passwordcheck" />
<br />
<p:inplace rendered="#{cc.attrs.creating}" emptyLabel="#{i18n['user.insert']}">
<p:password validator="#{userValidator.password}" id="passwordcheck" value="#{userView.passwordcheck}" />
</p:inplace>
<p:message rendered="#{cc.attrs.creating}" for="passwordcheck" />
<br />
</h:panelGroup>
<h:panelGroup>
<table>
<tr>
<td colspan="2"><h:outputLabel value="#{i18n['user.nick']}" for="nick" /> <br />
<p:inplace emptyLabel="#{i18n['user.insert']}">
<p:inputText size="45" id="nick" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.nick}" />
</p:inplace></td>
</tr>
<tr>
<td><h:outputLabel value="#{i18n['user.firstNames']}" for="firstnames" /><br />
<p:inplace emptyLabel="#{i18n['user.insert']}">
<p:inputText size="22" id="firstnames" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.firstnames}" />
</p:inplace></td>
<td><h:outputLabel value="#{i18n['user.lastName']}" for="lastname" /><br />
<p:inplace emptyLabel="#{i18n['user.insert']}">
<p:inputText size="30" id="lastname" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.lastname}" />
</p:inplace></td>
</tr>
<tr>
<td><h:outputLabel for="birthday" value="#{i18n['user.birthday']}" /><br /> <p:calendar id="birthday" navigator="true" yearRange="c-80:c-0" locale="fi"
value="#{userView.selectedUser.birthday}" pattern="#{sessionHandler.dateFormat}" timeZone="#{sessionHandler.timezone}" /> <h:message for="birthday" /></td>
<td><h:outputLabel value="#{i18n['user.sex']}" for="sex" /> <br /> <p:selectOneMenu disabled="#{!cc.attrs.creating and !userView.canSave}" id="sex"
value="#{userView.selectedUser.gender}">
<f:selectItem id="undefined" itemLabel="#{i18n['user.sex.UNDEFINED']}" itemValue="UNDEFINED" />
<f:selectItem id="male" itemLabel="#{i18n['user.sex.MALE']}" itemValue="MALE" />
<f:selectItem id="female" itemLabel="#{i18n['user.sex.FEMALE']}" itemValue="FEMALE" />
</p:selectOneMenu></td>
</tr>
</table>
<table>
<tr>
<td colspan="2"><p:outputLabel value="#{i18n['user.address']}" for="address" /><br />
<p:inplace emptyLabel="#{i18n['user.insert']}">
<p:inputText size="45" id="address" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.address}" />
</p:inplace></td>
</tr>
<tr>
<td><p:outputLabel value="#{i18n['user.zipCode']}" for="zip" /><br />
<p:inplace emptyLabel="#{i18n['user.insert']}">
<p:inputText styleClass="ui-input" size="7" id="zip" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.zip}" />
</p:inplace> <p:message for="zip" /></td>
<td><p:outputLabel value="#{i18n['user.town']}" for="town" /><br />
<p:inplace emptyLabel="#{i18n['user.insert']}">
<p:inputText styleClass="ui-input" size="25" id="town" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.town}" />
</p:inplace> <p:message for="town" /></td>
</tr>
<tr>
<td colspan="2"><h:outputLabel value="#{i18n['user.email']}" for="email" /> <br />
<p:inplace emptyLabel="#{i18n['user.insert']}">
<p:inputText validator="#{userValidator.validateEmail}" size="45" id="email" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.email}" />
</p:inplace></td>
</tr>
</table>
<p:commandButton rendered="#{cc.attrs.creating or userView.canSave}" id="commitbtn" action="#{cc.attrs.commitaction}" value="#{cc.attrs.commitvalue}" />
</h:panelGroup>
</h:panelGrid>
</h:form>
</composite:implementation>
</html>
...@@ -6,7 +6,6 @@ ...@@ -6,7 +6,6 @@
xmlns:users="http://java.sun.com/jsf/composite/tools/user" xmlns:c="http://java.sun.com/jsp/jstl/core"> xmlns:users="http://java.sun.com/jsf/composite/tools/user" xmlns:c="http://java.sun.com/jsp/jstl/core">
<h:body> <h:body>
<ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml"> <ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml">
<ui:param name="thispage" value="page.eventorg.list" />
<ui:define name="content"> <ui:define name="content">
<h:form id="editform"> <h:form id="editform">
<h:panelGrid columns="2"> <h:panelGrid columns="2">
......
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"
xmlns:c="http://java.sun.com/jsp/jstl/core">
<h:body>
<ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml">
<f:metadata>
<f:viewParam name="readerId" value="#{readerView.readerid}" />
<f:event type="preRenderView" listener="#{readerView.initEditReader}" />
</f:metadata>
<ui:define name="content">
<h:form id="editform">
<h:panelGrid columns="3">
<h:outputLabel for="type" value="#{i18n['reader.type']}:" />
<h:selectOneMenu id="type" value="#{readerView.reader.type}">
<f:selectItems value="#{readerView.readertypes}"/>
</h:selectOneMenu>
<h:message for="type"/>
<h:outputLabel for="identification" value="#{i18n['reader.identification']}:" />
<h:outputText id="identification" value="#{readerView.reader.identification}" />
<h:message for="identification" />
<h:outputLabel for="automaticProduct" value="#{i18n['reader.automaticProduct']}:" />
<h:selectOneMenu converter="#{productConverter}" id="automaticProduct" value="#{readerView.reader.automaticProduct}" >
<f:selectItems value="#{readerView.autoProducts}" var="prod" itemLabel="#{prod.name}"/>
</h:selectOneMenu>
<h:message for="automaticProduct" />
<h:outputLabel for="automaticProductCount" value="#{i18n['reader.automaticProductCount']}:" />
<h:inputText id="automaticProductCount" value="#{readerView.reader.automaticProductCount}" >
<f:convertNumber minFractionDigits="0" maxFractionDigits="2" />
</h:inputText>
<h:message for="automaticProductCount" />
</h:panelGrid>
<h:commandButton value="#{i18n['reader.save']}" action="#{readerView.saveReader}" />
</h:form>
</ui:define>
</ui:composition>
</h:body>
</html>
\ No newline at end of file
...@@ -18,10 +18,15 @@ ...@@ -18,10 +18,15 @@
<ui:define name="content"> <ui:define name="content">
<h:form id="userform"> <h:form id="userform">
<h:panelGrid columns="2"> <h:panelGrid columns="2">
<h:outputLabel for="oldPwd" value="#{i18n['user.oldPassword']}:" />
<h:inputSecret id="oldPwd" value="#{passwordView.oldPassword}" />
<h:outputLabel value="#{i18n['user.password']}:" /> <h:outputLabel value="#{i18n['user.password']}:" />
<h:inputSecret id="password" value="#{passwordView.password}" /> <h:inputSecret id="password" value="#{passwordView.password}" />
<h:outputLabel value="#{i18n['user.passwordcheck']}:" /> <h:outputLabel value="#{i18n['user.passwordcheck']}:" />
<h:inputSecret id="passwordcheck" value="#{passwordView.passwordcheck}" /> <h:inputSecret id="passwordcheck" value="#{passwordView.passwordcheck}" />
<h:commandButton id="createuserbtn" action="#{passwordView.changePassword()}" <h:commandButton id="createuserbtn" action="#{passwordView.changePassword()}"
value="#{i18n['user.changePassword']}" value="#{i18n['user.changePassword']}"
/> />
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
<f:event type="preRenderView" listener="#{userView.initCreateView}" /> <f:event type="preRenderView" listener="#{userView.initCreateView}" />
</f:metadata> </f:metadata>
<ui:define name="content"> <ui:define name="content">
<users:edit creating="true" commitaction="#{userView.createUser()}" commitvalue="#{i18n['user.create']}" /> <users:create creating="true" commitaction="#{userView.createUser()}" commitvalue="#{i18n['user.create']}" />
</ui:define> </ui:define>
</ui:composition> </ui:composition>
......
...@@ -12,10 +12,8 @@ ...@@ -12,10 +12,8 @@
</f:metadata> </f:metadata>
<ui:param name="thispage" value="page.user.create" /> <ui:param name="thispage" value="page.user.create" />
<ui:define name="content"> <ui:define name="content">
<users:edit creating="true" commitaction="#{userView.createUser()}" commitvalue="#{i18n['user.create']}" /> <users:create creating="true" commitaction="#{userView.createUser()}" commitvalue="#{i18n['user.create']}" />
</ui:define> </ui:define>
</ui:composition> </ui:composition>
</h:body> </h:body>
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
<f:param name="userid" value="#{userView.user.user.id}" /> <f:param name="userid" value="#{userView.user.user.id}" />
</h:link> </h:link>
</p> </p>
<users:edit commitaction="#{userView.saveUser()}" commitvalue="#{i18n['user.save']}" /> <users:edit commitaction="#{userCartView.saveUser()}" commitvalue="#{i18n['user.save']}" />
<h:form id="roleform" rendered="#{roleView.canReadRoles}"> <h:form id="roleform" rendered="#{roleView.canReadRoles}">
......
...@@ -15,14 +15,51 @@ ...@@ -15,14 +15,51 @@
</f:metadata> </f:metadata>
<ui:define name="content"> <ui:define name="content">
<h:outputScript library="primefaces" name="jquery/jquery.js" target="head" />
<h1>#{i18n['userlist.header']}</h1> <h1>#{i18n['userlist.header']}</h1>
<h:form> <h:form>
<h:outputLabel for="onlythisevent" value="#{i18n['userlist.onlythisevent']}" /> <h:panelGrid columns="2">
<h:selectBooleanCheckbox id="onlythisevent" value="#{userSearchView.searchQuery.onlyThisEvent}" /> <h:panelGroup>
<br /> <a onclick="$('#advancedSearch').show(); $(this).hide();" ><h:outputText value="#{i18n['userlist.showAdvancedSearch']}" /></a>
<h:inputText value="#{userSearchView.search}" /> <span id="advancedSearch" style="display:none;">
<h:commandButton value="#{i18n['userlist.search']}" action="#{userSearchView.newSearch()}" />
<h:selectBooleanCheckbox id="placeassoc" value="#{userSearchView.searchQuery.placeAssoc}" />
<h:outputLabel for="placeassoc" value="#{i18n['userlist.placeassoc']}" />
<br />
<h:outputLabel for="saldofilter" value="#{i18n['userlist.saldofilter']}" />
<h:selectOneMenu value="#{userSearchView.searchQuery.accountSaldoCompare}">
<f:selectItems value="#{userSearchView.searchQuery.accountCompareValues}" />
</h:selectOneMenu>
<h:inputText value="#{userSearchView.searchQuery.accountSaldo}">
<f:convertNumber minFractionDigits="0" maxFractionDigits="2" />
</h:inputText>
<br />
<h:outputLabel for="rolefilter" value="#{i18n['userlist.rolefilter']}" />
<h:selectManyCheckbox layout="pageDirection" styleClass="nowrap" id="rolefilter" value="#{userSearchView.searchQuery.filterRoles}" converter="#{roleConverter}">
<f:selectItems value="#{roleDataView.roles}" var="r" itemLabel="#{r.name}" />
</h:selectManyCheckbox>
</span>
<br />
<h:selectBooleanCheckbox id="onlythisevent" value="#{userSearchView.searchQuery.onlyThisEvent}" />
<h:outputLabel for="onlythisevent" value="#{i18n['userlist.onlythisevent']}" />
<br />
<h:inputText value="#{userSearchView.search}" />
<h:commandButton value="#{i18n['userlist.search']}" action="#{userSearchView.newSearch()}" />
</h:panelGroup>
<h:panelGroup>
<h:outputText value="i18n['usercart.cartsize']" /> <h:outputText value="#{userCartView.userCartSize}" />
<br/>
<h:commandButton actionListener="#{userSearchView.addToCart}" value="#{i18n['usercart.addSearcherUsers']}" />
<h:commandButton action="#{userCartView.traverse}" value="#{i18n['usercart.traverse']}"/>
</h:panelGroup>
</h:panelGrid>
</h:form> </h:form>
<p> <p>
<users:list rendered="#{!userSearchView.searchQuery.onlyThisEvent}" /> <users:list rendered="#{!userSearchView.searchQuery.onlyThisEvent}" />
......
...@@ -17,14 +17,10 @@ ...@@ -17,14 +17,10 @@
</ui:define> </ui:define>
<ui:define name="headerdata"> <ui:define name="headerdata">
<script type="text/javascript"> <script type="text/javascript">
webcam webcam.set_api_url('#{request.contextPath}/UploadServlet?type=userimage&amp;id=#{userView.selectedUser.id}');
.set_api_url('#{request.contextPath}/UploadServlet?type=userimage&amp;id=#{userView.selectedUser.id}');
webcam.set_hook('onComplete', 'my_completion_handler'); webcam.set_hook('onComplete', 'my_completion_handler');
webcam.set_swf_url('#{request.contextPath}/resources/jpegcam/webcam.swf');
webcam webcam.set_shutter_sound(true,'#{request.contextPath}/resources/jpegcam/shutter.mp3');
.set_swf_url('#{request.contextPath}/resources/jpegcam/webcam.swf');
webcam.set_shutter_sound(true,
'#{request.contextPath}/resources/jpegcam/shutter.mp3');
function my_completion_handler(msg) { function my_completion_handler(msg) {
// alert("Completition handler executed" + msg); // alert("Completition handler executed" + msg);
window.location.href = "#{request.contextPath}/user/sendPicture.jsf?userid=#{userView.user.id}"; window.location.href = "#{request.contextPath}/user/sendPicture.jsf?userid=#{userView.user.id}";
......
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"
xmlns:users="http://java.sun.com/jsf/composite/cditools/user" xmlns:tools="http://java.sun.com/jsf/composite/cditools" xmlns:account="http://java.sun.com/jsf/composite/cditools/account"
xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:p="http://primefaces.org/ui">
<h:body>
<ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml">
<f:metadata>
<f:event type="preRenderView" listener="#{userCartView.initView}" />
</f:metadata>
<ui:define name="title">
<h1>#{i18n['user.edit.title']}</h1>
</ui:define>
<ui:define name="content">
<h:form>
<h:outputText value="#{userCartView.current+1}" /> / <h:outputText value="#{userCartView.userCartSize}" />
<h:commandButton action="#{userCartView.prev()}" value="#{i18n['usercart.prev']}" rendered="#{userCartView.current > 0}" />
<h:commandButton action="#{userCartView.removeCurrent()}" value="#{i18n['usercart.removeCurrent']}" />
<h:commandButton action="#{userCartView.next()}" value="#{i18n['usercart.next']}" rendered="#{userCartView.userCartSize > (userCartView.current+1)}" /></h:form>
<h:link includeViewParams="true" outcome="/card/massprint" value="#{i18n['usercard.massprint']}" />
<p>
<h:link outcome="/useradmin/changePassword" value="#{i18n['submenu.user.changePassword']}">
<f:param name="userid" value="#{userView.user.user.id}" />
</h:link>
</p>
<users:edit id="useredit" commitaction="#{userCartView.saveUser()}" commitvalue="#{i18n['user.save']}" />
<h:form id="roleform" rendered="#{roleView.canReadRoles}">
<h2>
<h:outputText value="#{i18n['user.roles']}:" />
</h2>
<h:selectManyCheckbox converter="#{roleConverter}" disabled="#{!roleView.canWriteRoles}" layout="pageDirection" id="roles" value="#{userView.usersRoles}">
<f:selectItems var="roleitem" itemLabel="#{roleitem.name}" value="#{roleDataView.roles}" />
</h:selectManyCheckbox>
<div>
<h:message rendered="#{roleView.canReadRoles}" for="roles" />
</div>
<h:commandButton action="#{userView.saveRoles}" value="#{i18n['user.saveRoles']}" />
</h:form>
<h:form>
<p:imageCropper value="#{userView.croppedImage}" aspectRatio="0.8" image="/dydata/userimage/#{userView.user.currentImage.id}.jpg" />
<h:commandButton action="#{userView.crop}" value="#{i18n['user.cropImage']}" />
</h:form>
</ui:define>
</ui:composition>
</h:body>
</html>
\ No newline at end of file
...@@ -84,4 +84,4 @@ productshop.minusTen = -10 ...@@ -84,4 +84,4 @@ productshop.minusTen = -10
productshop.plusOne = +1 productshop.plusOne = +1
productshop.plusTen = +10 productshop.plusTen = +10
user.unauthenticated = Kirjautumaton user.unauthenticated = Kirjautumaton
...@@ -604,6 +604,7 @@ user.nick = Nick ...@@ -604,6 +604,7 @@ user.nick = Nick
user.noAccountevents = No account events user.noAccountevents = No account events
user.noCurrentImage = No image user.noCurrentImage = No image
user.noImage = No image user.noImage = No image
user.oldPassword = Current password
user.page.invite = Invite friends user.page.invite = Invite friends
user.password = Password user.password = Password
user.passwordcheck = Password ( again ) user.passwordcheck = Password ( again )
...@@ -636,14 +637,19 @@ user.zipCode = Postal nr. ...@@ -636,14 +637,19 @@ user.zipCode = Postal nr.
userimage.webcam = Take picture with webcam userimage.webcam = Take picture with webcam
userlist.header = Users userlist.header = Users
userlist.search = Search userlist.onlythisevent = Limit to users of this event
userlist.placeassoc = Assigned to place
userlist.rolefilter = Assigned roles
userlist.saldofilter = Saldo
userlist.search = Search
usertitle.managingUser = Shop usertitle.managingUser = Shop
userview.header = Users userview.header = Users
userview.invalidEmail = Invalid email address userview.invalidEmail = Invalid email address
userview.loginstringFaulty = Username has to be atleast 2 characters long! userview.loginstringFaulty = Username has to be atleast 2 characters long!
userview.oldPasswordError = Invalid password!
userview.passwordTooShort = Password has to be atleast 5 characters long! userview.passwordTooShort = Password has to be atleast 5 characters long!
userview.passwordsChanged = Password changed userview.passwordsChanged = Password changed
userview.passwordsDontMatch = Passwords do not match! Please try again! userview.passwordsDontMatch = Passwords do not match! Please try again!
......
...@@ -579,6 +579,7 @@ user.hasImage = Kuva ...@@ -579,6 +579,7 @@ user.hasImage = Kuva
user.imageUploaded = Kuva l\u00E4hetetty. user.imageUploaded = Kuva l\u00E4hetetty.
user.imagelist = Tallennetut kuvat user.imagelist = Tallennetut kuvat
user.imagesubmit = L\u00E4het\u00E4 kuva user.imagesubmit = L\u00E4het\u00E4 kuva
user.insert = Sy\u00F6t\u00E4 arvo
user.invalidLoginCredentials = K\u00E4ytt\u00E4j\u00E4tunnus tai salasana v\u00E4\u00E4rin. user.invalidLoginCredentials = K\u00E4ytt\u00E4j\u00E4tunnus tai salasana v\u00E4\u00E4rin.
user.invite = Kutsu user.invite = Kutsu
user.invite.header = Luo k\u00E4ytt\u00E4j\u00E4 kutsusta user.invite.header = Luo k\u00E4ytt\u00E4j\u00E4 kutsusta
...@@ -589,6 +590,7 @@ user.nick = Nick ...@@ -589,6 +590,7 @@ user.nick = Nick
user.noAccountevents = Ei tilitapahtumia user.noAccountevents = Ei tilitapahtumia
user.noCurrentImage = Ei kuvaa user.noCurrentImage = Ei kuvaa
user.noImage = EI kuvaa user.noImage = EI kuvaa
user.oldPassword = Nykyinen salasana
user.page.invite = Kutsu yst\u00E4vi\u00E4 user.page.invite = Kutsu yst\u00E4vi\u00E4
user.password = Salasana user.password = Salasana
user.passwordcheck = Salasana ( uudelleen ) user.passwordcheck = Salasana ( uudelleen )
...@@ -620,13 +622,18 @@ user.zipCode = Postinumero ...@@ -620,13 +622,18 @@ user.zipCode = Postinumero
userimage.webcam = Ota kuva webkameralla userimage.webcam = Ota kuva webkameralla
userlist.header = Etsi k\u00E4ytt\u00E4ji\u00E4 userlist.header = Etsi k\u00E4ytt\u00E4ji\u00E4
userlist.search = Etsi userlist.onlythisevent = Vain t\u00E4m\u00E4n tapahtuman k\u00E4ytt\u00E4j\u00E4t
userlist.placeassoc = Liitetty paikkaan
userlist.rolefilter = Annetut roolit
userlist.saldofilter = Tilin saldo
userlist.search = Etsi
usertitle.managingUser = Kauppa usertitle.managingUser = Kauppa
userview.invalidEmail = Virheeliinen s\u00E4hk\u00F6postiosoite userview.invalidEmail = Virheeliinen s\u00E4hk\u00F6postiosoite
userview.loginstringFaulty = K\u00E4ytt\u00E4j\u00E4tunnus virheellinen. Pit\u00E4\u00E4 olla v\u00E4hint\u00E4\u00E4n kaksi merkki\u00E4 pitk\u00E4. userview.loginstringFaulty = K\u00E4ytt\u00E4j\u00E4tunnus virheellinen. Pit\u00E4\u00E4 olla v\u00E4hint\u00E4\u00E4n kaksi merkki\u00E4 pitk\u00E4.
userview.oldPasswordError = V\u00E4\u00E4r\u00E4 salasana!
userview.passwordTooShort = Salasana liian lyhyt. Pit\u00E4\u00E4 olla v\u00E4hint\u00E4\u00E4n {0} merkki\u00E4 pitk\u00E4. userview.passwordTooShort = Salasana liian lyhyt. Pit\u00E4\u00E4 olla v\u00E4hint\u00E4\u00E4n {0} merkki\u00E4 pitk\u00E4.
userview.passwordsChanged = Salasana vaihdettu userview.passwordsChanged = Salasana vaihdettu
userview.passwordsDontMatch = Salasanat eiv\u00E4t ole samat! Ole hyv\u00E4 ja sy\u00F6t\u00E4 salasanat uudelleen. userview.passwordsDontMatch = Salasanat eiv\u00E4t ole samat! Ole hyv\u00E4 ja sy\u00F6t\u00E4 salasanat uudelleen.
......
package fi.insomnia.bortal.web.cdiview.card;
import javax.ejb.EJB;
import javax.enterprise.context.ConversationScoped;
import javax.enterprise.context.RequestScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;
import fi.insomnia.bortal.beans.CardPrintBeanLocal;
import fi.insomnia.bortal.model.EventUser;
import fi.insomnia.bortal.web.cdiview.user.UserCartView;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
@Named
@ConversationScoped
public class CardMassPrintView implements Serializable {
private static final long serialVersionUID = -1017243588290663967L;
@Inject private UserCartView userCartView;
@EJB private CardPrintBeanLocal cardPrintBean;
private File file;
public CardMassPrintView() {
// TODO Auto-generated constructor stub
}
public void initView() {
List<EventUser> eventUsers = userCartView.getUsercart();
ArrayList<Integer> userIdList = new ArrayList<Integer>();
for(EventUser eu : eventUsers) {
userIdList.add(eu.getId());
}
file = null;
try {
byte[] printout = cardPrintBean.getUserCardsAsPrintablePdf(userIdList);
file = File.createTempFile("cardprintout",null);
FileOutputStream fostream = new FileOutputStream(file);
fostream.write(printout);
fostream.close();
} catch(Exception e) {
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(e.getMessage()));
}
}
public UserCartView getUserCartView() {
return userCartView;
}
public void setUserCartView(UserCartView userCartView) {
this.userCartView = userCartView;
}
public File getFile() {
return file;
}
public void setFile(File file) {
this.file = file;
}
}
package fi.insomnia.bortal.web.cdiview.shop; package fi.insomnia.bortal.web.cdiview.shop;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import javax.ejb.EJB; import javax.ejb.EJB;
...@@ -11,11 +12,15 @@ import javax.inject.Named; ...@@ -11,11 +12,15 @@ import javax.inject.Named;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.beans.ProductBeanLocal;
import fi.insomnia.bortal.beans.ReaderBeanLocal; import fi.insomnia.bortal.beans.ReaderBeanLocal;
import fi.insomnia.bortal.beans.UserBeanLocal; import fi.insomnia.bortal.beans.UserBeanLocal;
import fi.insomnia.bortal.enums.apps.ShopPermission; import fi.insomnia.bortal.enums.apps.ShopPermission;
import fi.insomnia.bortal.enums.apps.UserPermission; import fi.insomnia.bortal.enums.apps.UserPermission;
import fi.insomnia.bortal.model.Product;
import fi.insomnia.bortal.model.Reader;
import fi.insomnia.bortal.model.ReaderEvent; import fi.insomnia.bortal.model.ReaderEvent;
import fi.insomnia.bortal.model.ReaderType;
import fi.insomnia.bortal.model.User; import fi.insomnia.bortal.model.User;
import fi.insomnia.bortal.utilities.SearchQuery; import fi.insomnia.bortal.utilities.SearchQuery;
import fi.insomnia.bortal.web.cdiview.GenericCDIView; import fi.insomnia.bortal.web.cdiview.GenericCDIView;
...@@ -30,6 +35,7 @@ public class ReaderView extends GenericCDIView { ...@@ -30,6 +35,7 @@ public class ReaderView extends GenericCDIView {
private String placecode; private String placecode;
private String usersearch; private String usersearch;
private Reader reader;
private transient ListDataModel<UserCardWrapper> userlist; private transient ListDataModel<UserCardWrapper> userlist;
...@@ -48,6 +54,17 @@ public class ReaderView extends GenericCDIView { ...@@ -48,6 +54,17 @@ public class ReaderView extends GenericCDIView {
private static final Logger logger = LoggerFactory.getLogger(ReaderView.class); private static final Logger logger = LoggerFactory.getLogger(ReaderView.class);
private Integer readerid;
@EJB
private ProductBeanLocal shopBean;
public void initEditReader() {
if (super.requirePermissions(ShopPermission.SHOP_TO_OTHERS) && reader == null) {
reader = readerbean.getReader(readerid);
super.beginConversation();
}
}
public String createCardForUser() { public String createCardForUser() {
UserCardWrapper usr = userlist.getRowData(); UserCardWrapper usr = userlist.getRowData();
logger.info("Creating card for user {} from event {}", usr, event); logger.info("Creating card for user {} from event {}", usr, event);
...@@ -85,11 +102,31 @@ public class ReaderView extends GenericCDIView { ...@@ -85,11 +102,31 @@ public class ReaderView extends GenericCDIView {
} }
} }
public List<Product> getAutoProducts() {
List<Product> ret = new ArrayList<Product>();
ret.add(Product.EMPTY_PRODUCT);
ret.addAll(shopBean.getProducts());
return ret;
}
public ReaderType[] getReadertypes()
{
return ReaderType.values();
}
public List<ReaderEvent> getReaderEvents() public List<ReaderEvent> getReaderEvents()
{ {
return readerbean.getReaderEvents(namecontainer.getReaderId()); return readerbean.getReaderEvents(namecontainer.getReaderId());
} }
public String saveReader()
{
reader = readerbean.saveReader(reader);
return null;
}
public ReaderNameContainer getNamecontainer() { public ReaderNameContainer getNamecontainer() {
return namecontainer; return namecontainer;
} }
...@@ -146,4 +183,20 @@ public class ReaderView extends GenericCDIView { ...@@ -146,4 +183,20 @@ public class ReaderView extends GenericCDIView {
this.neighborUser = neighborUser; this.neighborUser = neighborUser;
} }
public Integer getReaderid() {
return readerid;
}
public void setReaderid(Integer readerid) {
this.readerid = readerid;
}
public Reader getReader() {
return reader;
}
public void setReader(Reader reader) {
this.reader = reader;
}
} }
...@@ -5,6 +5,9 @@ import javax.enterprise.context.ConversationScoped; ...@@ -5,6 +5,9 @@ import javax.enterprise.context.ConversationScoped;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Named; import javax.inject.Named;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.beans.UserBeanLocal; import fi.insomnia.bortal.beans.UserBeanLocal;
import fi.insomnia.bortal.enums.apps.UserPermission; import fi.insomnia.bortal.enums.apps.UserPermission;
import fi.insomnia.bortal.model.EventUser; import fi.insomnia.bortal.model.EventUser;
...@@ -27,19 +30,26 @@ public class PasswordView extends GenericCDIView { ...@@ -27,19 +30,26 @@ public class PasswordView extends GenericCDIView {
@EJB @EJB
private transient UserBeanLocal userbean; private transient UserBeanLocal userbean;
private String oldPassword;
private String password; private String password;
private String passwordcheck; private String passwordcheck;
private static final Logger logger = LoggerFactory.getLogger(PasswordView.class);
public String changePassword() { public String changePassword() {
if (permbean.isCurrentUser(user) || permbean.hasPermission(UserPermission.MODIFY)) { boolean mod = permbean.hasPermission(UserPermission.MODIFY);
if (password != null && password.equals(passwordcheck)) { if (permbean.isCurrentUser(user) || mod) {
logger.debug("foo {}, {}", mod, user.checkPassword(oldPassword));
if (!mod && !user.checkPassword(oldPassword)) {
super.addFaceMessage("userview.oldPasswordError");
} else if (password == null || !password.equals(passwordcheck)) {
super.addFaceMessage("userview.passwordsDontMatch");
} else {
user.getUser().resetPassword(password); user.getUser().resetPassword(password);
user = userbean.mergeChanges(user); user = userbean.mergeChanges(user);
} else { return "/user/edit";
super.addFaceMessage("userview.passwordsDontMatch");
return null;
} }
return "/user/edit"; return null;
} }
return "permissionDenied"; return "permissionDenied";
} }
...@@ -68,4 +78,12 @@ public class PasswordView extends GenericCDIView { ...@@ -68,4 +78,12 @@ public class PasswordView extends GenericCDIView {
this.passwordcheck = passwordcheck; this.passwordcheck = passwordcheck;
} }
public String getOldPassword() {
return oldPassword;
}
public void setOldPassword(String oldPassword) {
this.oldPassword = oldPassword;
}
} }
package fi.insomnia.bortal.web.cdiview.user;
import java.util.ArrayList;
import java.util.List;
import javax.enterprise.context.ConversationScoped;
import javax.inject.Inject;
import javax.inject.Named;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.model.EventUser;
import fi.insomnia.bortal.web.cdiview.GenericCDIView;
@Named
@ConversationScoped
public class UserCartView extends GenericCDIView {
private static final long serialVersionUID = 5294631925744474031L;
private Integer current = 0;
@Inject
private UserView userview;
private List<EventUser> usercart;
public void initView()
{
}
private static final Logger logger = LoggerFactory.getLogger(UserCartView.class);
public String next() {
++current;
updateCurrent();
return null;
}
public String prev() {
--current;
updateCurrent();
return null;
}
public String getUserCartSize()
{
String ret = "0";
if (usercart != null)
{
ret = Integer.toString(usercart.size());
}
return ret;
}
public String removeCurrent()
{
EventUser removed = usercart.remove(current.intValue());
logger.debug("Removed idx {} from usercart {}", current, removed);
if (!usercart.isEmpty())
{
updateCurrent();
}
return null;
}
public String traverse()
{
current = 0;
updateCurrent();
return "/useradmin/userCartShow";
}
public String saveUser()
{
userview.saveUser();
return null;
}
private void updateCurrent() {
logger.debug("Updating current user to {}", current);
if (current >= usercart.size()) {
current = usercart.size() - 1;
} else if (current < 0)
{
current = 0;
}
EventUser u = usercart.get(current);
logger.debug("usercart current {}, got {}", current, u);
if (u != null)
{
userview.setUserid(u.getUser().getId());
userview.setUser(null);
userview.initView();
}
}
public void addUsers(List<EventUser> results) {
if (usercart == null)
{
usercart = new ArrayList<EventUser>();
}
usercart.removeAll(results);
usercart.addAll(results);
}
public boolean isEmpty()
{
return usercart == null || usercart.isEmpty();
}
public UserView getUserview() {
return userview;
}
public void setUserview(UserView userview) {
this.userview = userview;
}
public List<EventUser> getUsercart() {
return usercart;
}
public void setUsercart(List<EventUser> usercart) {
this.usercart = usercart;
}
public Integer getCurrent() {
return current;
}
public void setCurrent(Integer current) {
this.current = current;
}
}
...@@ -4,14 +4,15 @@ import java.util.List; ...@@ -4,14 +4,15 @@ import java.util.List;
import javax.ejb.EJB; import javax.ejb.EJB;
import javax.enterprise.context.RequestScoped; import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.inject.Named; import javax.inject.Named;
import fi.insomnia.bortal.beans.UserBeanLocal; import fi.insomnia.bortal.beans.UserBeanLocal;
import fi.insomnia.bortal.enums.apps.UserPermission; import fi.insomnia.bortal.enums.apps.UserPermission;
import fi.insomnia.bortal.model.EventUser; import fi.insomnia.bortal.model.EventUser;
import fi.insomnia.bortal.model.User; import fi.insomnia.bortal.model.User;
import fi.insomnia.bortal.util.UserSearchQuery;
import fi.insomnia.bortal.utilities.SearchResult; import fi.insomnia.bortal.utilities.SearchResult;
import fi.insomnia.bortal.utilities.UserSearchQuery;
import fi.insomnia.bortal.web.cdiview.PaginationView; import fi.insomnia.bortal.web.cdiview.PaginationView;
@Named @Named
...@@ -26,9 +27,25 @@ public class UserSearchView extends PaginationView<User> { ...@@ -26,9 +27,25 @@ public class UserSearchView extends PaginationView<User> {
@EJB @EJB
private transient UserBeanLocal userbean; private transient UserBeanLocal userbean;
private List<EventUser> eventUserResults; private List<EventUser> eventUserResults;
@Inject
private UserCartView usercart;
private UserSearchQuery usersearch = new UserSearchQuery(); private UserSearchQuery usersearch = new UserSearchQuery();
public void addToCart()
{
int pagesize = usersearch.getPagesize();
int page = usersearch.getPage();
usersearch.setPagesize(999999999);
usersearch.setPage(0);
SearchResult<EventUser> eventusers = userbean.getThisEventsUsers(usersearch);
usercart.addUsers(eventusers.getResults());
usersearch.setPagesize(pagesize);
usersearch.setPage(page);
super.beginConversation();
}
public void initView() { public void initView() {
if (requirePermissions(permbean.hasPermission(UserPermission.VIEW_ALL))) { if (requirePermissions(permbean.hasPermission(UserPermission.VIEW_ALL))) {
if (usersearch.isOnlyThisEvent() || usersearch.getSearch() == null || usersearch.getSearch().isEmpty()) if (usersearch.isOnlyThisEvent() || usersearch.getSearch() == null || usersearch.getSearch().isEmpty())
......
...@@ -16,6 +16,7 @@ import org.primefaces.model.UploadedFile; ...@@ -16,6 +16,7 @@ import org.primefaces.model.UploadedFile;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.beans.CardPrintBeanLocal;
import fi.insomnia.bortal.beans.CardTemplateBeanLocal; import fi.insomnia.bortal.beans.CardTemplateBeanLocal;
import fi.insomnia.bortal.beans.EventBeanLocal; import fi.insomnia.bortal.beans.EventBeanLocal;
import fi.insomnia.bortal.beans.RoleBeanLocal; import fi.insomnia.bortal.beans.RoleBeanLocal;
...@@ -74,6 +75,8 @@ public class UserView extends GenericCDIView { ...@@ -74,6 +75,8 @@ public class UserView extends GenericCDIView {
private transient RoleBeanLocal rolebean; private transient RoleBeanLocal rolebean;
@EJB @EJB
private transient EventBeanLocal eventbean; private transient EventBeanLocal eventbean;
@EJB
private transient CardPrintBeanLocal cardPrintBean;
@Produces @Produces
@LoggedIn @LoggedIn
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!