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"?>
<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>
<ejb-client-jar>LanBortalBeansClient.jar</ejb-client-jar>
<?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">
<display-name>LanBortalBeans</display-name>
<ejb-client-jar>LanBortalBeansClient.jar</ejb-client-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 {
usershop.setKey("topnavi.adminshop");
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/editReader"), ShopPermission.SHOP_TO_OTHERS);
MenuNavigation billnavi = adminnavi.addPage(null, null);
billnavi.setKey("topnavi.billing");
......
......@@ -6,9 +6,13 @@ import java.util.Calendar;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.EJBException;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.facade.AccountEventFacade;
import fi.insomnia.bortal.model.AccountEvent;
import fi.insomnia.bortal.model.Discount;
......@@ -27,6 +31,7 @@ public class ProductPBean {
private PermissionBean permbean;
@EJB
private AccountEventFacade accounteventfacade;
private static final Logger logger = LoggerFactory.getLogger(ProductPBean.class);
/**
* Default constructor.
......@@ -53,6 +58,10 @@ public class ProductPBean {
*/
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();
List<Discount> discounts = product.getActiveDiscounts(quantity, date);
......@@ -76,6 +85,7 @@ public class ProductPBean {
}
user.getAccountEvents().add(ret);
accounteventfacade.create(ret);
logger.debug("create ac {} for user {}", ret, user.getUser());
// flush changes to db.
// userFacade.flush();
return ret;
......
......@@ -5,6 +5,7 @@ import java.util.List;
import java.util.regex.Pattern;
import javax.ejb.EJB;
import javax.ejb.EJBAccessException;
import javax.ejb.Stateless;
import org.slf4j.Logger;
......@@ -13,6 +14,7 @@ import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.facade.PrintedCardFacade;
import fi.insomnia.bortal.facade.ReaderEventFacade;
import fi.insomnia.bortal.facade.ReaderFacade;
import fi.insomnia.bortal.model.AccountEvent;
import fi.insomnia.bortal.model.CardTemplate;
import fi.insomnia.bortal.model.EventUser;
import fi.insomnia.bortal.model.PrintedCard;
......@@ -87,10 +89,14 @@ public class ReaderBean implements ReaderBeanLocal {
if (ret == null)
{
ret = createReaderEvent(reader, card);
if (ret != null && card != null && reader.isAutoproduct())
{
productPBean.createAccountEvent(reader.getAutomaticProduct(), reader.getAutomaticProductCount(), card.getUser(), Calendar.getInstance());
ret.setNotes("Created automatic account event from reader.");
logger.debug("Got reader autoproduct {} with count {}", reader.getAutomaticProduct(), reader.getAutomaticProductCount());
logger.debug("ret {}, card, {} autoproduct {}", new Object[] { ret, card, reader.isAutoproduct() });
if (ret != null && card != null && reader.isAutoproduct()) {
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 {
......@@ -101,17 +107,7 @@ public class ReaderBean implements ReaderBeanLocal {
ret.setValue(tag);
}
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 {
public User findTagFromAnyEvent(String value) {
PrintedCard card = cardfacade.findLatestByRfidFromAny(value);
User ret = null;
if (card != null && card.getUser() != null)
{
if (card != null && card.getUser() != null) {
ret = card.getUser().getUser();
}
......@@ -246,4 +241,17 @@ public class ReaderBean implements ReaderBeanLocal {
}
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;
import fi.insomnia.bortal.model.User;
import fi.insomnia.bortal.model.UserImage;
import fi.insomnia.bortal.util.MailMessage;
import fi.insomnia.bortal.util.UserSearchQuery;
import fi.insomnia.bortal.utilities.I18n;
import fi.insomnia.bortal.utilities.PasswordFunctions;
import fi.insomnia.bortal.utilities.SearchQuery;
import fi.insomnia.bortal.utilities.SearchResult;
import fi.insomnia.bortal.utilities.UserSearchQuery;
/**
* Session Bean implementation class UserBean
......
......@@ -9,21 +9,26 @@ import javax.ejb.Stateless;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.From;
import javax.persistence.criteria.Root;
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.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.PrintedCard;
import fi.insomnia.bortal.model.PrintedCard_;
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.UserSearchQuery;
/**
* Session Bean implementation class EventUserFacade
......@@ -94,14 +99,30 @@ public class EventUserFacade extends IntegerPkGenericFacade<EventUser> {
{
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();
CriteriaQuery<EventUser> listCQuery = cb.createQuery(EventUser.class);
CriteriaQuery<Long> countCQuery = cb.createQuery(Long.class);
Root<EventUser> listRoot = searchCallbacks(listCQuery, callbacks, EventUser.class);
Root<EventUser> countRoot = searchCallbacks(countCQuery, callbacks, EventUser.class);
From<?, EventUser> listRoot = null;
From<?, EventUser> countRoot = null;
listRoot = searchCallbacks(listCQuery, callbacks, EventUser.class);
countRoot = searchCallbacks(countCQuery, callbacks, EventUser.class);
listCQuery.select(listRoot);
countCQuery.select(cb.count(countRoot));
......@@ -116,6 +137,37 @@ public class EventUserFacade extends IntegerPkGenericFacade<EventUser> {
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
// sort, String search) {
//
......
......@@ -9,6 +9,8 @@ import javax.persistence.NoResultException;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.From;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
......@@ -165,7 +167,7 @@ public abstract class GenericFacade<C extends ModelInterface> {
searchCallbacks(listCQuery, list);
Root<C> countRoot = searchCallbacks(countCQuery, list);
Path<C> countRoot = searchCallbacks(countCQuery, list);
countCQuery.select(cb.count(countRoot));
TypedQuery<Long> countQ = getEm().createQuery(countCQuery);
......@@ -179,13 +181,25 @@ public abstract class GenericFacade<C extends ModelInterface> {
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());
}
protected <T extends ModelInterface> Root<T> searchCallbacks(CriteriaQuery<?> cq, List<FacadeCallback<T>> list, Class<T> clazz) {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
protected <T extends ModelInterface> From<?, T> searchCallbacks(CriteriaQuery<?> cq, List<FacadeCallback<T>> list, Class<T> 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>();
for (FacadeCallback<T> fc : list) {
......@@ -193,12 +207,7 @@ public abstract class GenericFacade<C extends ModelInterface> {
fc.exec(cb, cq, root, predicates);
}
}
if (!predicates.isEmpty()) {
Predicate[] preds = predicates.toArray(new Predicate[predicates.size()]);
cq.where(preds);
}
return root;
return predicates;
}
......
......@@ -75,4 +75,14 @@ public class ReaderFacade extends IntegerPkGenericFacade<Reader> {
cq.where(cb.equal(root.get(Reader_.event), eventbean.getCurrentEvent()));
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;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.From;
import javax.persistence.criteria.Predicate;
import javax.persistence.metamodel.SingularAttribute;
......@@ -26,7 +26,7 @@ public class AndPredicateCreator<A, T extends ModelInterface> implements FacadeC
}
@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()) {
return;
}
......
package fi.insomnia.bortal.facade.tools;
package fi.insomnia.bortal.facade.callbacks;
import java.util.List;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.From;
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.LanEvent;
......@@ -21,7 +20,7 @@ public class EventLimiter implements FacadeCallback<EventUser> {
}
@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));
}
......
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 javax.persistence.criteria.Path;
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.User;
......
......@@ -4,7 +4,7 @@ import java.util.List;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.From;
import javax.persistence.criteria.Predicate;
import fi.insomnia.bortal.utilities.jpa.ModelInterface;
......@@ -14,5 +14,5 @@ public interface FacadeCallback<C extends ModelInterface> {
// void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Root<C> root,
// 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;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.From;
import javax.persistence.criteria.Predicate;
import javax.persistence.metamodel.SingularAttribute;
......@@ -24,7 +24,7 @@ public class OrPredicateCreator<A, T extends ModelInterface> implements FacadeCa
}
@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()) {
return;
}
......
......@@ -4,6 +4,7 @@ import java.util.List;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.From;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
import javax.persistence.metamodel.SingularAttribute;
......@@ -29,7 +30,7 @@ public class OrderCallback<T extends ModelInterface> implements FacadeCallback<T
}
@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();
// Check if returntype is entity or are we for example counting results
......
......@@ -5,6 +5,7 @@ import java.util.List;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.From;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
import javax.persistence.metamodel.SingularAttribute;
......@@ -42,7 +43,7 @@ public abstract class PathStringSearchPredicateCreator<T extends ModelInterface,
}
@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()) {
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 {
ReaderEvent createCard(ReaderEvent event, EventUser user);
Reader getReader(Integer readerid);
Reader saveReader(Reader reader);
}
......@@ -10,9 +10,9 @@ import fi.insomnia.bortal.model.GroupMembership;
import fi.insomnia.bortal.model.Role;
import fi.insomnia.bortal.model.User;
import fi.insomnia.bortal.model.UserImage;
import fi.insomnia.bortal.util.UserSearchQuery;
import fi.insomnia.bortal.utilities.SearchQuery;
import fi.insomnia.bortal.utilities.SearchResult;
import fi.insomnia.bortal.utilities.UserSearchQuery;
@Local
public interface UserBeanLocal {
......@@ -37,6 +37,13 @@ public interface UserBeanLocal {
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 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 {
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
private List<UserNote> notes;
@ManyToMany()
@ManyToMany(mappedBy = "users")
private List<Role> roles = new ArrayList<Role>();
@OneToMany(mappedBy = "user")
......
......@@ -42,6 +42,9 @@ public class Product extends GenericEntity {
private static final String PRODUCTFLAG_TABLE_COLUMN = "productflags";
private static final long serialVersionUID = 1L;
public static final String EVENT_ID_COLUMN = "event_id";
public static final Product EMPTY_PRODUCT = new Product("----");
@ManyToOne()
@JoinColumn(name = EVENT_ID_COLUMN, nullable = false)
private LanEvent event;
......@@ -118,6 +121,11 @@ public class Product extends GenericEntity {
}
private Product(String string) {
super();
name = "----";
}
public BigDecimal getSoldCash() {
BigDecimal tot = BigDecimal.ZERO;
for (AccountEvent ac : this.getAccountEvents()) {
......
package fi.insomnia.bortal.model;
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 @@
</session-config>
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<!-- <param-value>Production</param-value> -->
<param-value>Development</param-value>
<!--<param-value>Production</param-value>-->
<param-value>Development</param-value>
</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 @@
</ui:fragment>
<ui:fragment rendered="#{cc.attrs.creating}">
<h:outputLabel value="#{i18n['user.login']}" for="login" />
<h:outputLabel value="#{i18n['user.login']}" for="mklogin" />
<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:inputText size="25" id="mklogin" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.login}" />
</p:inplace>
<p:message for="login" />
<br />
......@@ -63,14 +63,14 @@
<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: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:password validator="#{userValidator.password}" id="passwordcheck" value="#{userView.passwordcheck}" />
</p:inplace>
<p:message rendered="#{cc.attrs.creating}" for="passwordcheck" />
<br />
......@@ -80,27 +80,29 @@
<h:panelGroup>
<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>
<td colspan="2"><h:outputLabel value="#{i18n['user.nick']}" for="nick" /> <br />
<p:inplace emptyLabel="#{i18n['user.insert']}">
<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']}">
<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']}">
<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}">
<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" />
......@@ -110,24 +112,20 @@
<table>
<tr>
<td colspan="2"><p:outputLabel value="#{i18n['user.address']}" for="address" /><br />
<p:inplace emptyLabel="#{i18n['user.insert']}">
<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']}">
<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']}">
<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']}">
<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>
......
......@@ -18,11 +18,13 @@
</f:facet>
<h:outputText styleClass="hoverable" value="#{(empty user.nick)?'----':user.nick}" />
<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" />
<h:panelGroup>
<h:outputText value="#{user.nick}" />
<h:outputText id="login" value="#{user.login}" />
<br />
<h:outputText id="nick" value="#{user.nick}" />
<br />
<h:outputText value="#{user.firstnames} #{user.lastname}" />
<br />
......@@ -36,6 +38,11 @@
<br />
<h:outputText value="#{user.email}" />
<br />
<h:outputText value="#{i18n['user.accountBalance']}: " />
<h:outputText value="#{user.accountBalance}">
<f:convertNumber maxFractionDigits="2" minFractionDigits="0" />
</h:outputText>
</h:panelGroup>
</h:panelGrid>
</div>
......@@ -61,7 +68,7 @@
</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>
......
......@@ -9,6 +9,7 @@
<composite:implementation>
<h:outputScript library="primefaces" name="jquery/jquery.js" target="head" />
<h:dataTable styleClass="bordertable" id="user" value="#{userSearchView.results}" var="user">
<h:column>
<f:facet name="header">
<h:link value="#{i18n['user.nick']}" includeViewParams="true">
......@@ -16,7 +17,7 @@
<f:param name="page" value="0" />
</h:link>
</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">
<h:panelGrid columns="2">
<img style="width:100px;" src="#{request.contextPath}/dydata/userimage/#{user.currentImage.id}.img" alt="image" />
......@@ -53,7 +54,14 @@
</f:facet>
<h:outputText value="#{user.lastname}" />
</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>
<button onClick="location.replace('#{request.contextPath}/useradmin/edit.jsf?userid=#{user.id}')">#{i18n['user.edit']}</button>
</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 @@
xmlns:users="http://java.sun.com/jsf/composite/tools/user" xmlns:c="http://java.sun.com/jsp/jstl/core">
<h:body>
<ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml">
<ui:param name="thispage" value="page.eventorg.list" />
<ui:define name="content">
<h:form id="editform">
<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 @@
<ui:define name="content">
<h:form id="userform">
<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:inputSecret id="password" value="#{passwordView.password}" />
<h:outputLabel value="#{i18n['user.passwordcheck']}:" />
<h:inputSecret id="passwordcheck" value="#{passwordView.passwordcheck}" />
<h:commandButton id="createuserbtn" action="#{passwordView.changePassword()}"
value="#{i18n['user.changePassword']}"
/>
......
......@@ -11,7 +11,7 @@
<f:event type="preRenderView" listener="#{userView.initCreateView}" />
</f:metadata>
<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:composition>
......
......@@ -12,10 +12,8 @@
</f:metadata>
<ui:param name="thispage" value="page.user.create" />
<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:composition>
</h:body>
......
......@@ -20,7 +20,7 @@
<f:param name="userid" value="#{userView.user.user.id}" />
</h:link>
</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}">
......
......@@ -15,14 +15,51 @@
</f:metadata>
<ui:define name="content">
<h:outputScript library="primefaces" name="jquery/jquery.js" target="head" />
<h1>#{i18n['userlist.header']}</h1>
<h:form>
<h:outputLabel for="onlythisevent" value="#{i18n['userlist.onlythisevent']}" />
<h:selectBooleanCheckbox id="onlythisevent" value="#{userSearchView.searchQuery.onlyThisEvent}" />
<br />
<h:inputText value="#{userSearchView.search}" />
<h:commandButton value="#{i18n['userlist.search']}" action="#{userSearchView.newSearch()}" />
<h:panelGrid columns="2">
<h:panelGroup>
<a onclick="$('#advancedSearch').show(); $(this).hide();" ><h:outputText value="#{i18n['userlist.showAdvancedSearch']}" /></a>
<span id="advancedSearch" style="display:none;">
<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>
<p>
<users:list rendered="#{!userSearchView.searchQuery.onlyThisEvent}" />
......
......@@ -17,14 +17,10 @@
</ui:define>
<ui:define name="headerdata">
<script type="text/javascript">
webcam
.set_api_url('#{request.contextPath}/UploadServlet?type=userimage&amp;id=#{userView.selectedUser.id}');
webcam.set_api_url('#{request.contextPath}/UploadServlet?type=userimage&amp;id=#{userView.selectedUser.id}');
webcam.set_hook('onComplete', 'my_completion_handler');
webcam
.set_swf_url('#{request.contextPath}/resources/jpegcam/webcam.swf');
webcam.set_shutter_sound(true,
'#{request.contextPath}/resources/jpegcam/shutter.mp3');
webcam.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) {
// alert("Completition handler executed" + msg);
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
productshop.plusOne = +1
productshop.plusTen = +10
user.unauthenticated = Kirjautumaton
user.unauthenticated = Kirjautumaton
......@@ -604,6 +604,7 @@ user.nick = Nick
user.noAccountevents = No account events
user.noCurrentImage = No image
user.noImage = No image
user.oldPassword = Current password
user.page.invite = Invite friends
user.password = Password
user.passwordcheck = Password ( again )
......@@ -636,14 +637,19 @@ user.zipCode = Postal nr.
userimage.webcam = Take picture with webcam
userlist.header = Users
userlist.search = Search
userlist.header = Users
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
userview.header = Users
userview.invalidEmail = Invalid email address
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.passwordsChanged = Password changed
userview.passwordsDontMatch = Passwords do not match! Please try again!
......
......@@ -579,6 +579,7 @@ user.hasImage = Kuva
user.imageUploaded = Kuva l\u00E4hetetty.
user.imagelist = Tallennetut kuvat
user.imagesubmit = L\u00E4het\u00E4 kuva
user.insert = Sy\u00F6t\u00E4 arvo
user.invalidLoginCredentials = K\u00E4ytt\u00E4j\u00E4tunnus tai salasana v\u00E4\u00E4rin.
user.invite = Kutsu
user.invite.header = Luo k\u00E4ytt\u00E4j\u00E4 kutsusta
......@@ -589,6 +590,7 @@ user.nick = Nick
user.noAccountevents = Ei tilitapahtumia
user.noCurrentImage = Ei kuvaa
user.noImage = EI kuvaa
user.oldPassword = Nykyinen salasana
user.page.invite = Kutsu yst\u00E4vi\u00E4
user.password = Salasana
user.passwordcheck = Salasana ( uudelleen )
......@@ -620,13 +622,18 @@ user.zipCode = Postinumero
userimage.webcam = Ota kuva webkameralla
userlist.header = Etsi k\u00E4ytt\u00E4ji\u00E4
userlist.search = Etsi
userlist.header = Etsi k\u00E4ytt\u00E4ji\u00E4
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
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.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.passwordsChanged = Salasana vaihdettu
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;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.EJB;
......@@ -11,11 +12,15 @@ import javax.inject.Named;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.beans.ProductBeanLocal;
import fi.insomnia.bortal.beans.ReaderBeanLocal;
import fi.insomnia.bortal.beans.UserBeanLocal;
import fi.insomnia.bortal.enums.apps.ShopPermission;
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.ReaderType;
import fi.insomnia.bortal.model.User;
import fi.insomnia.bortal.utilities.SearchQuery;
import fi.insomnia.bortal.web.cdiview.GenericCDIView;
......@@ -30,6 +35,7 @@ public class ReaderView extends GenericCDIView {
private String placecode;
private String usersearch;
private Reader reader;
private transient ListDataModel<UserCardWrapper> userlist;
......@@ -48,6 +54,17 @@ public class ReaderView extends GenericCDIView {
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() {
UserCardWrapper usr = userlist.getRowData();
logger.info("Creating card for user {} from event {}", usr, event);
......@@ -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()
{
return readerbean.getReaderEvents(namecontainer.getReaderId());
}
public String saveReader()
{
reader = readerbean.saveReader(reader);
return null;
}
public ReaderNameContainer getNamecontainer() {
return namecontainer;
}
......@@ -146,4 +183,20 @@ public class ReaderView extends GenericCDIView {
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;
import javax.inject.Inject;
import javax.inject.Named;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.beans.UserBeanLocal;
import fi.insomnia.bortal.enums.apps.UserPermission;
import fi.insomnia.bortal.model.EventUser;
......@@ -27,19 +30,26 @@ public class PasswordView extends GenericCDIView {
@EJB
private transient UserBeanLocal userbean;
private String oldPassword;
private String password;
private String passwordcheck;
private static final Logger logger = LoggerFactory.getLogger(PasswordView.class);
public String changePassword() {
if (permbean.isCurrentUser(user) || permbean.hasPermission(UserPermission.MODIFY)) {
if (password != null && password.equals(passwordcheck)) {
boolean mod = permbean.hasPermission(UserPermission.MODIFY);
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 = userbean.mergeChanges(user);
} else {
super.addFaceMessage("userview.passwordsDontMatch");
return null;
return "/user/edit";
}
return "/user/edit";
return null;
}
return "permissionDenied";
}
......@@ -68,4 +78,12 @@ public class PasswordView extends GenericCDIView {
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;
import javax.ejb.EJB;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.inject.Named;
import fi.insomnia.bortal.beans.UserBeanLocal;
import fi.insomnia.bortal.enums.apps.UserPermission;
import fi.insomnia.bortal.model.EventUser;
import fi.insomnia.bortal.model.User;
import fi.insomnia.bortal.util.UserSearchQuery;
import fi.insomnia.bortal.utilities.SearchResult;
import fi.insomnia.bortal.utilities.UserSearchQuery;
import fi.insomnia.bortal.web.cdiview.PaginationView;
@Named
......@@ -26,9 +27,25 @@ public class UserSearchView extends PaginationView<User> {
@EJB
private transient UserBeanLocal userbean;
private List<EventUser> eventUserResults;
@Inject
private UserCartView usercart;
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() {
if (requirePermissions(permbean.hasPermission(UserPermission.VIEW_ALL))) {
if (usersearch.isOnlyThisEvent() || usersearch.getSearch() == null || usersearch.getSearch().isEmpty())
......
......@@ -16,6 +16,7 @@ import org.primefaces.model.UploadedFile;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.beans.CardPrintBeanLocal;
import fi.insomnia.bortal.beans.CardTemplateBeanLocal;
import fi.insomnia.bortal.beans.EventBeanLocal;
import fi.insomnia.bortal.beans.RoleBeanLocal;
......@@ -74,6 +75,8 @@ public class UserView extends GenericCDIView {
private transient RoleBeanLocal rolebean;
@EJB
private transient EventBeanLocal eventbean;
@EJB
private transient CardPrintBeanLocal cardPrintBean;
@Produces
@LoggedIn
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!