This is an automated email from the git hooks/post-receive script. New commit to branch feature/9099_order_on_columns in repository faxtomail. See https://gitlab.nuiton.org/codelutin/faxtomail.git commit 07601c60417c8ce9ea1839d95825709e953b43c3 Author: Kevin Morin <morin@codelutin.com> Date: Fri Mar 24 15:39:24 2017 +0100 refs #9099 prise en compte de la conf canChangeOrderInTable dans la partie cliente --- .../entities/AbstractFaxToMailTopiaDao.java | 32 ++ .../persistence/entities/EmailFilter.java | 3 +- .../persistence/entities/EmailTopiaDao.java | 361 +++++++++++---------- .../faxtomail/persistence/entities/MailField.java | 68 ++-- .../content/demande/DemandeListTableFilter.java | 4 +- .../content/demande/DemandeListUIHandler.java | 62 +++- .../swing/content/demande/DemandeListUIModel.java | 48 ++- .../demande/actions/LoadFolderEmailsAction.java | 10 +- .../faxtomail/ui/swing/util/DemandeTableModel.java | 65 ++-- .../util/FilterSortableTableHeaderRenderer.java | 73 +++++ .../src/main/resources/icons/sort_table_asc.png | Bin 0 -> 219 bytes .../src/main/resources/icons/sort_table_desc.png | Bin 0 -> 208 bytes .../src/main/webapp/js/configuration.js | 2 +- pom.xml | 4 +- 14 files changed, 485 insertions(+), 247 deletions(-) diff --git a/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities/AbstractFaxToMailTopiaDao.java b/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities/AbstractFaxToMailTopiaDao.java index 3e11a47..653c1ba 100644 --- a/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities/AbstractFaxToMailTopiaDao.java +++ b/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities/AbstractFaxToMailTopiaDao.java @@ -30,6 +30,7 @@ import org.apache.commons.logging.LogFactory; import org.nuiton.topia.persistence.TopiaEntity; import org.nuiton.topia.persistence.internal.AbstractTopiaDao; import org.nuiton.util.pagination.PaginationParameter; +import org.nuiton.util.pagination.PaginationResult; import java.util.Collection; import java.util.HashMap; @@ -81,4 +82,35 @@ public abstract class AbstractFaxToMailTopiaDao<E extends TopiaEntity> extends A return super.findAll(hql, hqlParameters); } + protected boolean hqlContainsGroupBy(String hql) { + return hql.toLowerCase().contains("group by"); + } + + // reprise de la méthode findPage(String hql, Map<String, Object> hqlParameters, PaginationParameter page) de AbstractTopiaDao + // qui ne prend pas le nom de la table sur laquelle compter le topiaId en cas de jointure + protected <O> PaginationResult<O> findPage(String topiaIdCountTable, String hql, Map<String, Object> hqlParameters, PaginationParameter page) { + List<O> elements = find(hql, hqlParameters, page); + + String countHql = "select count(" + topiaIdCountTable + ".topiaId) "; + if (hqlStartsWithSelect(hql)) { + // must remove the from clause, otherwise some sql queries won't work. + countHql += hql.substring(hql.toLowerCase().indexOf(" from ")); + } else { + countHql += hql; + } + + if (hqlContainsOrderBy(countHql)) { + // must remove the order by clause, otherwise some sql queries won't work. + countHql = countHql.substring(0, countHql.toLowerCase().indexOf("order by")); + } + + if (hqlContainsGroupBy(countHql)) { + // must remove the group by clause, otherwise some sql queries won't work. + countHql = countHql.substring(0, countHql.toLowerCase().indexOf("group by")); + } + + long count = count(countHql, hqlParameters); + return PaginationResult.of(elements, count, page); + } + } diff --git a/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities/EmailFilter.java b/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities/EmailFilter.java index 2fb2fb7..6d8b576 100644 --- a/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities/EmailFilter.java +++ b/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities/EmailFilter.java @@ -60,7 +60,6 @@ public class EmailFilter extends AbstractSerializableBean { public static final String PROPERTY_LAST_PRINTING_USERS = "lastPrintingUsers"; public static final String PROPERTY_LAST_PRINTING_DATES = "lastPrintingDates"; - protected Set<Priority> priorities; protected Set<DemandType> demandTypes; @@ -337,7 +336,7 @@ public class EmailFilter extends AbstractSerializableBean { firePropertyChange(PROPERTY_LAST_PRINTING_DATES, null, lastPrintingDates); } - public void clear() { + public void clearFilter() { setClientCodes(null); setWaitingStates(null); setDemandStatus(null); diff --git a/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities/EmailTopiaDao.java b/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities/EmailTopiaDao.java index d8015fc..7ee4374 100644 --- a/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities/EmailTopiaDao.java +++ b/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities/EmailTopiaDao.java @@ -59,6 +59,17 @@ public class EmailTopiaDao extends AbstractEmailTopiaDao<Email> { private static final Log log = LogFactory.getLog(EmailTopiaDao.class); + public static final String EMAIL_IDENTIFIER = "E"; + public static final String CLIENT_IDENTIFIER = "C"; + public static final String PRIORITY_IDENTIFIER = "P"; + public static final String WAITING_STATE_IDENTIFIER = "WS"; + public static final String DEMAND_TYPE_IDENTIFIER = "DT"; + public static final String TAKEN_BY_IDENTIFIER = "TB"; + public static final String LAST_ATTACHMENT_OPENER_IDENTIFIER = "LAO"; + public static final String LAST_PRINTING_USER_IDENTIFIER = "LPU"; + public static final String GROUP_IDENTIFIER = "G"; + public static final String RANGE_ROW_IDENTIFIER = "RR"; + /** * Search for email using filter. * @@ -74,32 +85,32 @@ public class EmailTopiaDao extends AbstractEmailTopiaDao<Email> { Map<String, Object> args = new HashMap<>(); // apply security - query.append(" WHERE E." + Email.PROPERTY_MAIL_FOLDER + " in (:readMailFolders)"); + query.append(" WHERE " + EMAIL_IDENTIFIER + "." + Email.PROPERTY_MAIL_FOLDER + " in (:readMailFolders)"); args.put("readMailFolders", readMailFolders); // email minReceptionDate if (searchFilter.getMinReceptionDate() != null) { Date date = DateUtils.truncate(searchFilter.getMinReceptionDate(), Calendar.DAY_OF_MONTH); - query.append(" AND E." + Email.PROPERTY_RECEPTION_DATE + " >= :" + SearchFilter.PROPERTY_MIN_RECEPTION_DATE); + query.append(" AND " + EMAIL_IDENTIFIER + "." + Email.PROPERTY_RECEPTION_DATE + " >= :" + SearchFilter.PROPERTY_MIN_RECEPTION_DATE); args.put(SearchFilter.PROPERTY_MIN_RECEPTION_DATE, date); } // email maxReceptionDate if (searchFilter.getMaxReceptionDate() != null) { Date date = DateUtils.ceiling(searchFilter.getMaxReceptionDate(), Calendar.DAY_OF_MONTH); - query.append(" AND E." + Email.PROPERTY_RECEPTION_DATE + " <= :" + SearchFilter.PROPERTY_MAX_RECEPTION_DATE); + query.append(" AND " + EMAIL_IDENTIFIER + "." + Email.PROPERTY_RECEPTION_DATE + " <= :" + SearchFilter.PROPERTY_MAX_RECEPTION_DATE); args.put(SearchFilter.PROPERTY_MAX_RECEPTION_DATE, date); } // email taken by if (searchFilter.getTakenBy() != null) { - query.append(" AND E." + Email.PROPERTY_TAKEN_BY + " = :" + SearchFilter.PROPERTY_TAKEN_BY); + query.append(" AND " + EMAIL_IDENTIFIER + "." + Email.PROPERTY_TAKEN_BY + " = :" + SearchFilter.PROPERTY_TAKEN_BY); args.put(SearchFilter.PROPERTY_TAKEN_BY, searchFilter.getTakenBy()); } // history minModificationDate && modifiedBy if (searchFilter.getMinModificationDate() != null || searchFilter.getModifiedBy() != null) { - query.append(" AND EXISTS (FROM " + History.class.getName() + " H WHERE H in elements(E." + Email.PROPERTY_HISTORY + ")"); + query.append(" AND EXISTS (FROM " + History.class.getName() + " H WHERE H in elements(" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_HISTORY + ")"); query.append(" AND H." + History.PROPERTY_TYPE + " = :modificationType"); args.put("modificationType", HistoryType.MODIFICATION); if (searchFilter.getMinModificationDate() != null) { @@ -116,7 +127,7 @@ public class EmailTopiaDao extends AbstractEmailTopiaDao<Email> { // history maxModificationDate && modifiedBy if (searchFilter.getMaxModificationDate() != null || searchFilter.getModifiedBy() != null) { - query.append(" AND EXISTS (FROM " + History.class.getName() + " H WHERE H in elements(E." + Email.PROPERTY_HISTORY + ")"); + query.append(" AND EXISTS (FROM " + History.class.getName() + " H WHERE H in elements(" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_HISTORY + ")"); query.append(" AND H." + History.PROPERTY_TYPE + " = :modificationType"); args.put("modificationType", HistoryType.MODIFICATION); if (searchFilter.getMaxModificationDate() != null) { @@ -133,7 +144,7 @@ public class EmailTopiaDao extends AbstractEmailTopiaDao<Email> { // history minTransferDate && transferBy if (searchFilter.getMinTransferDate() != null || searchFilter.getTransferBy() != null) { - query.append(" AND EXISTS (FROM " + History.class.getName() + " H WHERE H in elements(E." + Email.PROPERTY_HISTORY + ")"); + query.append(" AND EXISTS (FROM " + History.class.getName() + " H WHERE H in elements(" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_HISTORY + ")"); query.append(" AND H." + History.PROPERTY_TYPE + " = :transmissionType"); args.put("transmissionType", HistoryType.TRANSMISSION); if (searchFilter.getMinTransferDate() != null) { @@ -150,7 +161,7 @@ public class EmailTopiaDao extends AbstractEmailTopiaDao<Email> { // history maxTransferDate && transferBy if (searchFilter.getMaxTransferDate() != null || searchFilter.getTransferBy() != null) { - query.append(" AND EXISTS (FROM " + History.class.getName() + " H WHERE H in elements(E." + Email.PROPERTY_HISTORY + ")"); + query.append(" AND EXISTS (FROM " + History.class.getName() + " H WHERE H in elements(" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_HISTORY + ")"); query.append(" AND H." + History.PROPERTY_TYPE + " = :transmissionType"); args.put("transmissionType", HistoryType.TRANSMISSION); if (searchFilter.getMaxTransferDate() != null) { @@ -167,7 +178,7 @@ public class EmailTopiaDao extends AbstractEmailTopiaDao<Email> { // history minArchivedDate && transferBy if (searchFilter.getMinArchivedDate() != null || searchFilter.getArchivedBy() != null) { - query.append(" AND EXISTS (FROM " + History.class.getName() + " H WHERE H in elements(E." + Email.PROPERTY_HISTORY + ")"); + query.append(" AND EXISTS (FROM " + History.class.getName() + " H WHERE H in elements(" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_HISTORY + ")"); query.append(" AND H." + History.PROPERTY_TYPE + " = :archivedType"); args.put("archivedType", HistoryType.ARCHIVED); if (searchFilter.getMinArchivedDate() != null) { @@ -184,7 +195,7 @@ public class EmailTopiaDao extends AbstractEmailTopiaDao<Email> { // history maxArchivedDate && transferBy if (searchFilter.getMaxArchivedDate() != null || searchFilter.getArchivedBy() != null) { - query.append(" AND EXISTS (FROM " + History.class.getName() + " H WHERE H in elements(E." + Email.PROPERTY_HISTORY + ")"); + query.append(" AND EXISTS (FROM " + History.class.getName() + " H WHERE H in elements(" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_HISTORY + ")"); query.append(" AND H." + History.PROPERTY_TYPE + " = :archivedType"); args.put("archivedType", HistoryType.ARCHIVED); if (searchFilter.getMaxArchivedDate() != null) { @@ -201,7 +212,7 @@ public class EmailTopiaDao extends AbstractEmailTopiaDao<Email> { // email minPrintingDate if (searchFilter.getMinPrintingDate() != null || searchFilter.getPrintingBy() != null) { - query.append(" AND EXISTS (FROM " + History.class.getName() + " H WHERE H in elements(E." + Email.PROPERTY_HISTORY + ")"); + query.append(" AND EXISTS (FROM " + History.class.getName() + " H WHERE H in elements(" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_HISTORY + ")"); query.append(" AND H." + History.PROPERTY_TYPE + " = :printingType"); args.put("printingType", HistoryType.PRINTING); if (searchFilter.getMinPrintingDate() != null) { @@ -218,7 +229,7 @@ public class EmailTopiaDao extends AbstractEmailTopiaDao<Email> { // email maxPrintingDate if (searchFilter.getMaxPrintingDate() != null || searchFilter.getPrintingBy() != null) { - query.append(" AND EXISTS (FROM " + History.class.getName() + " H WHERE H in elements(E." + Email.PROPERTY_HISTORY + ")"); + query.append(" AND EXISTS (FROM " + History.class.getName() + " H WHERE H in elements(" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_HISTORY + ")"); query.append(" AND H." + History.PROPERTY_TYPE + " = :printingType"); args.put("printingType", HistoryType.PRINTING); if (searchFilter.getMaxPrintingDate() != null) { @@ -235,7 +246,7 @@ public class EmailTopiaDao extends AbstractEmailTopiaDao<Email> { // email minReplyDate if (searchFilter.getMinReplyDate() != null || searchFilter.getReplyBy() != null) { - query.append(" AND EXISTS (FROM " + History.class.getName() + " H WHERE H in elements(E." + Email.PROPERTY_HISTORY + ")"); + query.append(" AND EXISTS (FROM " + History.class.getName() + " H WHERE H in elements(" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_HISTORY + ")"); query.append(" AND H." + History.PROPERTY_TYPE + " = :replyType"); args.put("replyType", HistoryType.REPLY); if (searchFilter.getMinReplyDate() != null) { @@ -252,7 +263,7 @@ public class EmailTopiaDao extends AbstractEmailTopiaDao<Email> { // email maxReplyDate if (searchFilter.getMaxReplyDate() != null || searchFilter.getReplyBy() != null) { - query.append(" AND EXISTS (FROM " + History.class.getName() + " H WHERE H in elements(E." + Email.PROPERTY_HISTORY + ")"); + query.append(" AND EXISTS (FROM " + History.class.getName() + " H WHERE H in elements(" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_HISTORY + ")"); query.append(" AND H." + History.PROPERTY_TYPE + " = :replyType"); args.put("replyType", HistoryType.REPLY); if (searchFilter.getMaxReplyDate() != null) { @@ -269,54 +280,54 @@ public class EmailTopiaDao extends AbstractEmailTopiaDao<Email> { // email sender if (StringUtils.isNotBlank(searchFilter.getSender())) { - query.append(" AND lower(E." + Email.PROPERTY_SENDER + ") LIKE lower(:" + SearchFilter.PROPERTY_SENDER + ")"); + query.append(" AND lower(" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_SENDER + ") LIKE lower(:" + SearchFilter.PROPERTY_SENDER + ")"); args.put(SearchFilter.PROPERTY_SENDER, "%" + searchFilter.getSender() + "%"); } // client if (searchFilter.getClient() != null) { - query.append(" AND E." + Email.PROPERTY_CLIENT + " = :" + SearchFilter.PROPERTY_CLIENT); + query.append(" AND " + EMAIL_IDENTIFIER + "." + Email.PROPERTY_CLIENT + " = :" + SearchFilter.PROPERTY_CLIENT); args.put(SearchFilter.PROPERTY_CLIENT, searchFilter.getClient()); } // email subject if (StringUtils.isNotBlank(searchFilter.getDemandObject())) { - query.append(" AND lower(E." + Email.PROPERTY_OBJECT + ") LIKE lower(:" + SearchFilter.PROPERTY_DEMAND_OBJECT + ")"); + query.append(" AND lower(" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_OBJECT + ") LIKE lower(:" + SearchFilter.PROPERTY_DEMAND_OBJECT + ")"); args.put(SearchFilter.PROPERTY_DEMAND_OBJECT, "%" + searchFilter.getDemandObject() + "%"); } // email demand type List<DemandType> demandType = searchFilter.getDemandType(); if (CollectionUtils.isNotEmpty(demandType)) { - query.append(" AND (E." + Email.PROPERTY_DEMAND_TYPE + " IN (:" + SearchFilter.PROPERTY_DEMAND_TYPE + ")"); + query.append(" AND (" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_DEMAND_TYPE + " IN (:" + SearchFilter.PROPERTY_DEMAND_TYPE + ")"); args.put(SearchFilter.PROPERTY_DEMAND_TYPE, demandType); if (demandType.contains(null)) { - query.append(" OR E." + Email.PROPERTY_DEMAND_TYPE + " IS NULL"); + query.append(" OR " + EMAIL_IDENTIFIER + "." + Email.PROPERTY_DEMAND_TYPE + " IS NULL"); } query.append(")"); } // email ediCodeNumber if (StringUtils.isNotBlank(searchFilter.getEdiCodeNumber())) { - query.append(" AND lower(E." + Email.PROPERTY_EDI_ERROR + ") LIKE lower(:" + SearchFilter.PROPERTY_EDI_CODE_NUMBER + ")"); + query.append(" AND lower(" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_EDI_ERROR + ") LIKE lower(:" + SearchFilter.PROPERTY_EDI_CODE_NUMBER + ")"); args.put(SearchFilter.PROPERTY_EDI_CODE_NUMBER, "%" + searchFilter.getEdiCodeNumber() + "%"); } // email projectReference if (StringUtils.isNotBlank(searchFilter.getProjectReference())) { - query.append(" AND lower(E." + Email.PROPERTY_PROJECT_REFERENCE + ") LIKE lower(:" + SearchFilter.PROPERTY_PROJECT_REFERENCE + ")"); + query.append(" AND lower(" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_PROJECT_REFERENCE + ") LIKE lower(:" + SearchFilter.PROPERTY_PROJECT_REFERENCE + ")"); args.put(SearchFilter.PROPERTY_PROJECT_REFERENCE, "%" + searchFilter.getProjectReference() + "%"); } // email priority List<Priority> priority = searchFilter.getPriority(); if (CollectionUtils.isNotEmpty(priority)) { - query.append(" AND (E." + Email.PROPERTY_PRIORITY + " IN (:" + SearchFilter.PROPERTY_PRIORITY + ")"); + query.append(" AND (" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_PRIORITY + " IN (:" + SearchFilter.PROPERTY_PRIORITY + ")"); args.put(SearchFilter.PROPERTY_PRIORITY, priority); if (priority.contains(null)) { - query.append(" OR E." + Email.PROPERTY_PRIORITY + " IS NULL"); + query.append(" OR " + EMAIL_IDENTIFIER + "." + Email.PROPERTY_PRIORITY + " IS NULL"); } query.append(")"); } @@ -324,11 +335,11 @@ public class EmailTopiaDao extends AbstractEmailTopiaDao<Email> { // email demand status List<DemandStatus> demandStatus = searchFilter.getDemandStatus(); if (CollectionUtils.isNotEmpty(demandStatus)) { - query.append(" AND (E." + Email.PROPERTY_DEMAND_STATUS + " IN (:" + SearchFilter.PROPERTY_DEMAND_STATUS + ")"); + query.append(" AND (" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_DEMAND_STATUS + " IN (:" + SearchFilter.PROPERTY_DEMAND_STATUS + ")"); args.put(SearchFilter.PROPERTY_DEMAND_STATUS, demandStatus); if (demandStatus.contains(null)) { - query.append(" OR E." + Email.PROPERTY_DEMAND_STATUS + " IS NULL"); + query.append(" OR " + EMAIL_IDENTIFIER + "." + Email.PROPERTY_DEMAND_STATUS + " IS NULL"); } query.append(")"); } @@ -336,70 +347,72 @@ public class EmailTopiaDao extends AbstractEmailTopiaDao<Email> { // email etat attente List<WaitingState> waitingStates = searchFilter.getWaitingStates(); if (CollectionUtils.isNotEmpty(waitingStates)) { - query.append(" AND (E." + Email.PROPERTY_WAITING_STATE + " IN (:" + SearchFilter.PROPERTY_WAITING_STATES + ")"); + query.append(" AND (" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_WAITING_STATE + " IN (:" + SearchFilter.PROPERTY_WAITING_STATES + ")"); args.put(SearchFilter.PROPERTY_WAITING_STATES, waitingStates); if (waitingStates.contains(null)) { - query.append(" OR E." + Email.PROPERTY_WAITING_STATE + " IS NULL"); + query.append(" OR " + EMAIL_IDENTIFIER + "." + Email.PROPERTY_WAITING_STATE + " IS NULL"); } query.append(")"); } // email message if (StringUtils.isNotBlank(searchFilter.getMessage())) { - query.append(" AND lower(E." + Email.PROPERTY_COMMENT + ") LIKE lower(:" + SearchFilter.PROPERTY_MESSAGE + ")"); + query.append(" AND lower(" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_COMMENT + ") LIKE lower(:" + SearchFilter.PROPERTY_MESSAGE + ")"); args.put(SearchFilter.PROPERTY_MESSAGE, "%" + searchFilter.getMessage() + "%"); } if (StringUtils.isNotBlank(searchFilter.getBody())) { - query.append(" AND lower(E." + Email.PROPERTY_ORIGINAL_EMAIL + "." + OriginalEmail.PROPERTY_CONTENT + ") LIKE lower(:" + SearchFilter.PROPERTY_BODY + ")"); + query.append(" AND lower(" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_ORIGINAL_EMAIL + "." + OriginalEmail.PROPERTY_CONTENT + ") LIKE lower(:" + SearchFilter.PROPERTY_BODY + ")"); args.put(SearchFilter.PROPERTY_BODY, "%" + searchFilter.getBody() + "%"); } // email gamme List<Range> gamme = searchFilter.getGamme(); if (CollectionUtils.isNotEmpty(gamme)) { - query.append(" AND ((EXISTS (FROM " + RangeRow.class.getName() + " RR WHERE RR in elements(E." + Email.PROPERTY_RANGE_ROW + ")"); + query.append(" AND ((EXISTS (FROM " + RangeRow.class.getName() + " RR WHERE RR in elements(" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_RANGE_ROW + ")"); query.append(" AND RR." + RangeRow.PROPERTY_RANGE + " IN (:" + SearchFilter.PROPERTY_GAMME + "))"); args.put(SearchFilter.PROPERTY_GAMME, gamme); if (gamme.contains(null)) { - query.append(" OR NOT EXISTS (FROM " + RangeRow.class.getName() + " RR WHERE RR in elements(E." + Email.PROPERTY_RANGE_ROW + "))"); + query.append(" OR NOT EXISTS (FROM " + RangeRow.class.getName() + " RR WHERE RR in elements(" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_RANGE_ROW + "))"); } query.append("))"); } // email localReference if (StringUtils.isNotBlank(searchFilter.getLocalReference())) { - query.append(" AND (EXISTS (FROM " + RangeRow.class.getName() + " RR WHERE RR in elements(E." + Email.PROPERTY_RANGE_ROW + ")"); + query.append(" AND (EXISTS (FROM " + RangeRow.class.getName() + " RR WHERE RR in elements(" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_RANGE_ROW + ")"); query.append(" AND lower(RR." + RangeRow.PROPERTY_COMMAND_NUMBER + ") LIKE lower(:" + SearchFilter.PROPERTY_LOCAL_REFERENCE + "))"); - query.append(" OR lower(E." + Email.PROPERTY_COMPANY_REFERENCE + ") LIKE lower(:" + SearchFilter.PROPERTY_LOCAL_REFERENCE + ")"); + query.append(" OR lower(" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_COMPANY_REFERENCE + ") LIKE lower(:" + SearchFilter.PROPERTY_LOCAL_REFERENCE + ")"); args.put(SearchFilter.PROPERTY_LOCAL_REFERENCE, "%" + searchFilter.getLocalReference() + "%"); query.append(")"); } // command Nb if (StringUtils.isNotBlank(searchFilter.getCommandNb())) { - query.append(" AND (EXISTS (FROM " + RangeRow.class.getName() + " RR WHERE RR in elements(E." + Email.PROPERTY_RANGE_ROW + ")"); + query.append(" AND (EXISTS (FROM " + RangeRow.class.getName() + " RR WHERE RR in elements(" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_RANGE_ROW + ")"); query.append(" AND lower(RR." + RangeRow.PROPERTY_COMMAND_NUMBER + ") LIKE lower(:" + SearchFilter.PROPERTY_COMMAND_NB + "))"); - query.append(" OR lower(E." + Email.PROPERTY_COMPANY_REFERENCE + ") LIKE lower(:" + SearchFilter.PROPERTY_COMMAND_NB + ")"); + query.append(" OR lower(" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_COMPANY_REFERENCE + ") LIKE lower(:" + SearchFilter.PROPERTY_COMMAND_NB + ")"); args.put(SearchFilter.PROPERTY_COMMAND_NB, "%" + searchFilter.getCommandNb() + "%"); query.append(")"); } // add same fecth liste as emailService#getEmailForFolder() - String hqlForFetchStep1 = "SELECT E." + TopiaEntity.PROPERTY_TOPIA_ID + " FROM " + Email.class.getName() + " E " - + "WHERE E." + TopiaEntity.PROPERTY_TOPIA_ID + " IN ("; + String hqlForFetchStep1 = "SELECT " + EMAIL_IDENTIFIER + "." + TopiaEntity.PROPERTY_TOPIA_ID + + " FROM " + Email.class.getName() + " " + EMAIL_IDENTIFIER + + " WHERE " + EMAIL_IDENTIFIER + "." + TopiaEntity.PROPERTY_TOPIA_ID + " IN ("; if (searchFilter.isAddGroupDemands()) { hqlForFetchStep1 += "SELECT CASE WHEN G IS NULL " + - "THEN E." + TopiaEntity.PROPERTY_TOPIA_ID + + "THEN " + EMAIL_IDENTIFIER + "." + TopiaEntity.PROPERTY_TOPIA_ID + " ELSE E2." + TopiaEntity.PROPERTY_TOPIA_ID + " END " + "FROM " + Email.class.getName() + " E " + - "LEFT OUTER JOIN E." + Email.PROPERTY_EMAIL_GROUP + " AS G " + + "LEFT OUTER JOIN " + EMAIL_IDENTIFIER + "." + Email.PROPERTY_EMAIL_GROUP + " AS G " + "LEFT OUTER JOIN G." + EmailGroup.PROPERTY_EMAIL + " AS E2 "; } else { - hqlForFetchStep1 += "select E." + TopiaEntity.PROPERTY_TOPIA_ID + " FROM " + Email.class.getName() + " E "; + hqlForFetchStep1 += "select " + EMAIL_IDENTIFIER + "." + TopiaEntity.PROPERTY_TOPIA_ID + + " FROM " + Email.class.getName() + " " + EMAIL_IDENTIFIER + " "; } hqlForFetchStep1 += query.toString() + ")"; @@ -410,11 +423,12 @@ public class EmailTopiaDao extends AbstractEmailTopiaDao<Email> { Email.PROPERTY_WAITING_STATE, Email.PROPERTY_TAKEN_BY, Email.PROPERTY_LAST_ATTACHMENT_OPENER, - Email.PROPERTY_LAST_PRINTING_USER - ) + " WHERE E." + TopiaEntity.PROPERTY_TOPIA_ID + " in ( :topiaIdsForFetch_ )"; + Email.PROPERTY_LAST_PRINTING_USER, + Email.PROPERTY_LAST_ATTACHMENT_OPENER + ) + " WHERE " + EMAIL_IDENTIFIER + "." + TopiaEntity.PROPERTY_TOPIA_ID + " in ( :topiaIdsForFetch_ )"; // code copied from topia to perform search - PaginationResult<String> pageResult = findPage(hqlForFetchStep1, args, pagination); + PaginationResult<String> pageResult = findPage(EMAIL_IDENTIFIER, hqlForFetchStep1, args, pagination); List<String> step1ResultTopiaIds = pageResult.getElements(); List<Email> sortedEntities; @@ -430,41 +444,15 @@ public class EmailTopiaDao extends AbstractEmailTopiaDao<Email> { PaginationResult<Email> result = PaginationResult.of(sortedEntities, pageResult.getCount(), pageResult.getCurrentPage()); - //PaginationResult<Email> result = findPage(query.toString(), args, pagination); - - // manual fetch - // Email.PROPERTY_PRIORITY, - // Email.PROPERTY_DEMAND_TYPE, - // Email.PROPERTY_CLIENT, - // Email.PROPERTY_RANGE_ROW + "." + RangeRow.PROPERTY_RANGE, - // Email.PROPERTY_ETAT_ATTENTE, - // Email.PROPERTY_TAKEN_BY, - // Email.PROPERTY_REPLIES, - // Email.PROPERTY_ATTACHMENT, - // Email.PROPERTY_HISTORY + "." + History.PROPERTY_FAX_TO_MAIL_USER, - // Email.PROPERTY_HISTORY + "." + History.PROPERTY_FIELDS, - // Email.PROPERTY_EMAIL_GROUP + "." + EmailGroup.PROPERTY_EMAIL) for (Email email : result.getElements()) { - //Hibernate.initialize(email.getPriority()); - //Hibernate.initialize(email.getDemandType()); - //Hibernate.initialize(email.getClient()); List<RangeRow> rangeRows = email.getRangeRow(); if (rangeRows != null) { for (RangeRow rangeRow : rangeRows) { Hibernate.initialize(rangeRow.getRange()); } } - //Hibernate.initialize(email.getWaitingState()); - //Hibernate.initialize(email.getTakenBy()); Hibernate.initialize(email.getReplies()); Hibernate.initialize(email.getAttachment()); -// Collection<History> histories = email.getHistory(); -// if (histories != null) { -// for (History history : histories) { -// Hibernate.initialize(history.getFaxToMailUser()); -// Hibernate.initialize(history.getFields()); -// } -// } EmailGroup emailGroup = email.getEmailGroup(); if (emailGroup != null) { Hibernate.initialize(emailGroup.getEmail()); @@ -484,22 +472,22 @@ public class EmailTopiaDao extends AbstractEmailTopiaDao<Email> { Set<Email> result = new HashSet<>(); - query.append(newFromClause("E") + " WHERE E." + Email.PROPERTY_MAIL_FOLDER + "." + MailFolder.PROPERTY_COMPANY + " = (:company)"); + query.append(newFromClause("E") + " WHERE " + EMAIL_IDENTIFIER + "." + Email.PROPERTY_MAIL_FOLDER + "." + MailFolder.PROPERTY_COMPANY + " = (:company)"); args.put("company", company); - query.append(" AND E." + Email.PROPERTY_DEMAND_STATUS + " = :archiveStatus"); + query.append(" AND " + EMAIL_IDENTIFIER + "." + Email.PROPERTY_DEMAND_STATUS + " = :archiveStatus"); args.put("archiveStatus", DemandStatus.ARCHIVED); // kmorin 20150417 impossible de savoir pourquoi, mais sqlserver n'aime pas cette requete... // si on la fait en 2 fois ca passe -// query.append(" AND (EXISTS (FROM " + RangeRow.class.getName() + " RR WHERE RR in elements(E." + Email.PROPERTY_RANGE_ROW + ")"); +// query.append(" AND (EXISTS (FROM " + RangeRow.class.getName() + " RR WHERE RR in elements(" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_RANGE_ROW + ")"); // query.append(" AND lower(RR." + RangeRow.PROPERTY_COMMAND_NUMBER + ") LIKE lower(:" + SearchFilter.PROPERTY_COMMAND_NB + "))"); -// query.append(" OR lower(E." + Email.PROPERTY_COMPANY_REFERENCE + ") LIKE lower(:" + SearchFilter.PROPERTY_COMMAND_NB + ")"); +// query.append(" OR lower(" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_COMPANY_REFERENCE + ") LIKE lower(:" + SearchFilter.PROPERTY_COMMAND_NB + ")"); // args.put(SearchFilter.PROPERTY_COMMAND_NB, "%" + commandQuotationNumber + "%"); StringBuilder query1 = new StringBuilder(query); - query1.append(" AND (EXISTS (FROM " + RangeRow.class.getName() + " RR WHERE RR in elements(E." + Email.PROPERTY_RANGE_ROW + ")"); + query1.append(" AND (EXISTS (FROM " + RangeRow.class.getName() + " RR WHERE RR in elements(" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_RANGE_ROW + ")"); query1.append(" AND RR." + RangeRow.PROPERTY_COMMAND_NUMBER + " LIKE :" + SearchFilter.PROPERTY_COMMAND_NB + ")"); args.put(SearchFilter.PROPERTY_COMMAND_NB, "%" + commandQuotationNumber + "%"); @@ -509,7 +497,7 @@ public class EmailTopiaDao extends AbstractEmailTopiaDao<Email> { result.addAll(this.<Email>findAll(query1.toString(), args)); StringBuilder query2 = new StringBuilder(query); - query2.append(" AND (E." + Email.PROPERTY_COMPANY_REFERENCE + " LIKE :" + SearchFilter.PROPERTY_COMMAND_NB); + query2.append(" AND (" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_COMPANY_REFERENCE + " LIKE :" + SearchFilter.PROPERTY_COMMAND_NB); query2.append(")"); result.addAll(this.<Email>findAll(query2.toString(), args)); @@ -532,8 +520,34 @@ public class EmailTopiaDao extends AbstractEmailTopiaDao<Email> { Map<String, Object> args = new HashMap<>(); String query = filteredDemandsOfFolderCondition(folder, emailFilter, args); + String orderClause = null; + String tableToJoin = null; + if (!pagination.getOrderClauses().isEmpty()) { + orderClause = pagination.getOrderClauses().get(0).getClause(); + String clauseNoSum = orderClause.replaceAll("SUM\\((.*)\\)", "$1"); + int dotIndex = clauseNoSum.indexOf('.'); + if (dotIndex >= 0) { + tableToJoin = clauseNoSum.substring(0, dotIndex); + } + } + + boolean orderByWithSum = orderClause != null && orderClause.startsWith("SUM("); // add same fecth liste as emailService#getEmailForFolder() - String hqlForFetchStep1 = "select E." + TopiaEntity.PROPERTY_TOPIA_ID + " FROM " + Email.class.getName() + " E " + query; + StringBuilder hqlForFetchStep1 = new StringBuilder("SELECT " + EMAIL_IDENTIFIER + "." + TopiaEntity.PROPERTY_TOPIA_ID); + if (orderByWithSum) { + hqlForFetchStep1.append(", " + orderClause); + } + hqlForFetchStep1.append(" FROM " + Email.class.getName() + " " + EMAIL_IDENTIFIER); + + if (RANGE_ROW_IDENTIFIER.equals(tableToJoin)) { + hqlForFetchStep1.append(" LEFT JOIN " + EMAIL_IDENTIFIER + "." + Email.PROPERTY_RANGE_ROW + " " + RANGE_ROW_IDENTIFIER); + } + + if (orderClause != null) { + addJoinsForOrderBy(orderClause, hqlForFetchStep1); + } + + hqlForFetchStep1.append(" ").append(query).append(" GROUP BY E.topiaId"); if (log.isTraceEnabled()) { log.trace("getEmailForFolder 1 - " + hqlForFetchStep1); } @@ -545,7 +559,7 @@ public class EmailTopiaDao extends AbstractEmailTopiaDao<Email> { Email.PROPERTY_TAKEN_BY, Email.PROPERTY_LAST_ATTACHMENT_OPENER, Email.PROPERTY_LAST_PRINTING_USER - ) + " WHERE E." + TopiaEntity.PROPERTY_TOPIA_ID + " in ( :topiaIdsForFetch_ )"; + ) + " WHERE " + EMAIL_IDENTIFIER + "." + TopiaEntity.PROPERTY_TOPIA_ID + " in ( :topiaIdsForFetch_ )"; if (log.isTraceEnabled()) { log.trace("getEmailForFolder 2 - " + hqlForFetchStep2); @@ -557,14 +571,23 @@ public class EmailTopiaDao extends AbstractEmailTopiaDao<Email> { log.trace("getEmailForFolder start query 1 : " + time); } - PaginationResult<String> pageResult = findPage(hqlForFetchStep1, args, pagination); - + PaginationResult pageResult = findPage(EMAIL_IDENTIFIER, hqlForFetchStep1.toString(), args, pagination); long time2 = new Date().getTime(); if (log.isTraceEnabled()) { log.trace("getEmailForFolder end query 1 : " + time2 + " (" + (time2 - time) + ")"); } - List<String> step1ResultTopiaIds = pageResult.getElements(); + List<String> step1ResultTopiaIds; + if (orderByWithSum) { + step1ResultTopiaIds = Lists.transform(pageResult.getElements(), new Function<Object[], String>() { + @Override + public String apply(Object[] input) { + return String.valueOf(input[0]); + } + }); + } else { + step1ResultTopiaIds = pageResult.getElements(); + } List<Email> sortedEntities; if (CollectionUtils.isEmpty(step1ResultTopiaIds)) { @@ -604,41 +627,15 @@ public class EmailTopiaDao extends AbstractEmailTopiaDao<Email> { log.trace("getEmailForFolder after pagination results : " + time2 + " (" + (time2 - time) + ")"); } - //PaginationResult<Email> result = findPage(query.toString(), args, pagination); - - // manual fetch - // Email.PROPERTY_PRIORITY, - // Email.PROPERTY_DEMAND_TYPE, - // Email.PROPERTY_CLIENT, - // Email.PROPERTY_RANGE_ROW + "." + RangeRow.PROPERTY_RANGE, - // Email.PROPERTY_ETAT_ATTENTE, - // Email.PROPERTY_TAKEN_BY, - // Email.PROPERTY_REPLIES, - // Email.PROPERTY_ATTACHMENT, - // Email.PROPERTY_HISTORY + "." + History.PROPERTY_FAX_TO_MAIL_USER, - // Email.PROPERTY_HISTORY + "." + History.PROPERTY_FIELDS, - // Email.PROPERTY_EMAIL_GROUP + "." + EmailGroup.PROPERTY_EMAIL) for (Email email : result.getElements()) { - //Hibernate.initialize(email.getPriority()); - //Hibernate.initialize(email.getDemandType()); - //Hibernate.initialize(email.getClient()); List<RangeRow> rangeRows = email.getRangeRow(); if (rangeRows != null) { for (RangeRow rangeRow : rangeRows) { Hibernate.initialize(rangeRow.getRange()); } } - //Hibernate.initialize(email.getWaitingState()); - //Hibernate.initialize(email.getTakenBy()); Hibernate.initialize(email.getReplies()); Hibernate.initialize(email.getAttachment()); -// Collection<History> histories = email.getHistory(); -// if (histories != null) { -// for (History history : histories) { -// Hibernate.initialize(history.getFaxToMailUser()); -// Hibernate.initialize(history.getFields()); -// } -// } EmailGroup emailGroup = email.getEmailGroup(); if (emailGroup != null) { Hibernate.initialize(emailGroup.getEmail()); @@ -662,10 +659,44 @@ public class EmailTopiaDao extends AbstractEmailTopiaDao<Email> { return result; } + protected void addJoinsForOrderBy(String clause, StringBuilder hqlForFetchStep1) { + String clauseNoSize = clause.replaceAll("SIZE\\((.*)\\)", "$1"); + int dotIndex = clauseNoSize.indexOf('.'); + if (dotIndex >= 0) { + String tableToJoin = clauseNoSize.substring(0, dotIndex); + switch (tableToJoin) { + case CLIENT_IDENTIFIER: + hqlForFetchStep1.append(" LEFT JOIN " + EMAIL_IDENTIFIER + "." + Email.PROPERTY_CLIENT + " " + CLIENT_IDENTIFIER); + break; + case PRIORITY_IDENTIFIER: + hqlForFetchStep1.append(" LEFT JOIN " + EMAIL_IDENTIFIER + "." + Email.PROPERTY_PRIORITY + " " + PRIORITY_IDENTIFIER); + break; + case WAITING_STATE_IDENTIFIER: + hqlForFetchStep1.append(" LEFT JOIN " + EMAIL_IDENTIFIER + "." + Email.PROPERTY_WAITING_STATE + " " + WAITING_STATE_IDENTIFIER); + break; + case DEMAND_TYPE_IDENTIFIER: + hqlForFetchStep1.append(" LEFT JOIN " + EMAIL_IDENTIFIER + "." + Email.PROPERTY_DEMAND_TYPE + " " + DEMAND_TYPE_IDENTIFIER); + break; + case TAKEN_BY_IDENTIFIER: + hqlForFetchStep1.append(" LEFT JOIN " + EMAIL_IDENTIFIER + "." + Email.PROPERTY_TAKEN_BY + " " + TAKEN_BY_IDENTIFIER); + break; + case LAST_ATTACHMENT_OPENER_IDENTIFIER: + hqlForFetchStep1.append(" LEFT JOIN " + EMAIL_IDENTIFIER + "." + Email.PROPERTY_LAST_ATTACHMENT_OPENER + " " + LAST_ATTACHMENT_OPENER_IDENTIFIER); + break; + case LAST_PRINTING_USER_IDENTIFIER: + hqlForFetchStep1.append(" LEFT JOIN " + EMAIL_IDENTIFIER + "." + Email.PROPERTY_LAST_PRINTING_USER + " " + LAST_PRINTING_USER_IDENTIFIER); + break; + case GROUP_IDENTIFIER: + hqlForFetchStep1.append(" LEFT JOIN " + EMAIL_IDENTIFIER + "." + Email.PROPERTY_EMAIL_GROUP + " " + GROUP_IDENTIFIER); + break; + } + } + } + protected String filteredDemandsOfFolderCondition(MailFolder folder, EmailFilter emailFilter, Map<String, Object> args) { StringBuilder query = new StringBuilder(); - query.append(" WHERE E." + Email.PROPERTY_MAIL_FOLDER + " = :folder AND E." + Email.PROPERTY_DEMAND_STATUS + " != :archiveStatus"); + query.append(" WHERE " + EMAIL_IDENTIFIER + "." + Email.PROPERTY_MAIL_FOLDER + " = :folder AND " + EMAIL_IDENTIFIER + "." + Email.PROPERTY_DEMAND_STATUS + " != :archiveStatus"); args.put("folder", folder); args.put("archiveStatus", DemandStatus.ARCHIVED); @@ -674,7 +705,7 @@ public class EmailTopiaDao extends AbstractEmailTopiaDao<Email> { query.append(" AND ("); int i = 0; for (Date date : receptionDates) { - query.append(" E." + Email.PROPERTY_RECEPTION_DATE + " BETWEEN :" + EmailFilter.PROPERTY_RECEPTION_DATES + i + "Min"); + query.append(" " + EMAIL_IDENTIFIER + "." + Email.PROPERTY_RECEPTION_DATE + " BETWEEN :" + EmailFilter.PROPERTY_RECEPTION_DATES + i + "Min"); query.append(" AND :" + EmailFilter.PROPERTY_RECEPTION_DATES + i + "Max"); args.put(EmailFilter.PROPERTY_RECEPTION_DATES + i + "Min", date); @@ -689,182 +720,182 @@ public class EmailTopiaDao extends AbstractEmailTopiaDao<Email> { Set<DemandStatus> demandStatus = emailFilter.getDemandStatus(); if (demandStatus != null) { - query.append(" AND (E." + Email.PROPERTY_DEMAND_STATUS + " in (:" + EmailFilter.PROPERTY_DEMAND_STATUS + ")"); + query.append(" AND (" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_DEMAND_STATUS + " in (:" + EmailFilter.PROPERTY_DEMAND_STATUS + ")"); args.put(EmailFilter.PROPERTY_DEMAND_STATUS, demandStatus); if (demandStatus.contains(null)) { - query.append(" OR E." + Email.PROPERTY_DEMAND_STATUS + " IS NULL"); + query.append(" OR " + EMAIL_IDENTIFIER + "." + Email.PROPERTY_DEMAND_STATUS + " IS NULL"); } query.append(")"); } Set<String> senders = emailFilter.getSenders(); if (senders != null) { - query.append(" AND (E." + Email.PROPERTY_SENDER + " in (:" + EmailFilter.PROPERTY_SENDERS + ")"); + query.append(" AND (" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_SENDER + " in (:" + EmailFilter.PROPERTY_SENDERS + ")"); args.put(EmailFilter.PROPERTY_SENDERS, senders); if (senders.contains(null)) { - query.append(" OR E." + Email.PROPERTY_SENDER + " IS NULL"); + query.append(" OR " + EMAIL_IDENTIFIER + "." + Email.PROPERTY_SENDER + " IS NULL"); } query.append(")"); } Set<String> clientBrands = emailFilter.getClientBrands(); if (clientBrands != null) { - query.append(" AND (E." + Email.PROPERTY_CLIENT + "." + Client.PROPERTY_BRAND + " IN (:" + EmailFilter.PROPERTY_CLIENT_BRANDS + ")"); + query.append(" AND (" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_CLIENT + "." + Client.PROPERTY_BRAND + " IN (:" + EmailFilter.PROPERTY_CLIENT_BRANDS + ")"); args.put(EmailFilter.PROPERTY_CLIENT_BRANDS, clientBrands); if (clientBrands.contains(null)) { - query.append(" OR E." + Email.PROPERTY_CLIENT + " IS NULL"); - query.append(" OR E." + Email.PROPERTY_CLIENT + "." + Client.PROPERTY_BRAND + " IS NULL"); + query.append(" OR " + EMAIL_IDENTIFIER + "." + Email.PROPERTY_CLIENT + " IS NULL"); + query.append(" OR " + EMAIL_IDENTIFIER + "." + Email.PROPERTY_CLIENT + "." + Client.PROPERTY_BRAND + " IS NULL"); } query.append(")"); } Set<String> clientCodes = emailFilter.getClientCodes(); if (clientCodes != null) { - query.append(" AND (E." + Email.PROPERTY_CLIENT + "." + Client.PROPERTY_CODE + " IN (:" + EmailFilter.PROPERTY_CLIENT_CODES + ")"); + query.append(" AND (" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_CLIENT + "." + Client.PROPERTY_CODE + " IN (:" + EmailFilter.PROPERTY_CLIENT_CODES + ")"); args.put(EmailFilter.PROPERTY_CLIENT_CODES, clientCodes); if (clientCodes.contains(null)) { - query.append(" OR E." + Email.PROPERTY_CLIENT + " IS NULL"); - query.append(" OR E." + Email.PROPERTY_CLIENT + "." + Client.PROPERTY_CODE + " IS NULL"); + query.append(" OR " + EMAIL_IDENTIFIER + "." + Email.PROPERTY_CLIENT + " IS NULL"); + query.append(" OR " + EMAIL_IDENTIFIER + "." + Email.PROPERTY_CLIENT + "." + Client.PROPERTY_CODE + " IS NULL"); } query.append(")"); } Set<String> clientNames = emailFilter.getClientNames(); if (clientNames != null) { - query.append(" AND (E." + Email.PROPERTY_CLIENT + "." + Client.PROPERTY_NAME + " IN (:" + EmailFilter.PROPERTY_CLIENT_NAMES + ")"); + query.append(" AND (" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_CLIENT + "." + Client.PROPERTY_NAME + " IN (:" + EmailFilter.PROPERTY_CLIENT_NAMES + ")"); args.put(EmailFilter.PROPERTY_CLIENT_NAMES, clientNames); if (clientNames.contains(null)) { - query.append(" OR E." + Email.PROPERTY_CLIENT + " IS NULL"); - query.append(" OR E." + Email.PROPERTY_CLIENT + "." + Client.PROPERTY_NAME + " IS NULL"); + query.append(" OR " + EMAIL_IDENTIFIER + "." + Email.PROPERTY_CLIENT + " IS NULL"); + query.append(" OR " + EMAIL_IDENTIFIER + "." + Email.PROPERTY_CLIENT + "." + Client.PROPERTY_NAME + " IS NULL"); } query.append(")"); } Set<String> comments = emailFilter.getComments(); if (comments != null) { - query.append(" AND (E." + Email.PROPERTY_COMMENT + " in (:" + EmailFilter.PROPERTY_COMMENTS + ")"); + query.append(" AND (" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_COMMENT + " in (:" + EmailFilter.PROPERTY_COMMENTS + ")"); args.put(EmailFilter.PROPERTY_COMMENTS, comments); if (comments.contains(null)) { - query.append(" OR E." + Email.PROPERTY_COMMENT + " IS NULL"); + query.append(" OR " + EMAIL_IDENTIFIER + "." + Email.PROPERTY_COMMENT + " IS NULL"); } query.append(")"); } Set<String> demandObjects = emailFilter.getDemandObjects(); if (demandObjects != null) { - query.append(" AND (E." + Email.PROPERTY_OBJECT + " in (:" + EmailFilter.PROPERTY_DEMAND_OBJECTS + ")"); + query.append(" AND (" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_OBJECT + " in (:" + EmailFilter.PROPERTY_DEMAND_OBJECTS + ")"); args.put(EmailFilter.PROPERTY_DEMAND_OBJECTS, demandObjects); if (demandObjects.contains(null)) { - query.append(" OR E." + Email.PROPERTY_OBJECT + " IS NULL"); + query.append(" OR " + EMAIL_IDENTIFIER + "." + Email.PROPERTY_OBJECT + " IS NULL"); } query.append(")"); } Set<DemandType> demandTypes = emailFilter.getDemandTypes(); if (demandTypes != null) { - query.append(" AND (E." + Email.PROPERTY_DEMAND_TYPE + " in (:" + EmailFilter.PROPERTY_DEMAND_TYPES + ")"); + query.append(" AND (" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_DEMAND_TYPE + " in (:" + EmailFilter.PROPERTY_DEMAND_TYPES + ")"); args.put(EmailFilter.PROPERTY_DEMAND_TYPES, demandTypes); if (demandTypes.contains(null)) { - query.append(" OR E." + Email.PROPERTY_DEMAND_TYPE + " IS NULL"); + query.append(" OR " + EMAIL_IDENTIFIER + "." + Email.PROPERTY_DEMAND_TYPE + " IS NULL"); } query.append(")"); } Set<String> ediCodeNumbers = emailFilter.getEdiCodeNumbers(); if (ediCodeNumbers != null) { - query.append(" AND (E." + Email.PROPERTY_EDI_ERROR + " in (:" + EmailFilter.PROPERTY_EDI_CODE_NUMBERS + ")"); + query.append(" AND (" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_EDI_ERROR + " in (:" + EmailFilter.PROPERTY_EDI_CODE_NUMBERS + ")"); args.put(EmailFilter.PROPERTY_EDI_CODE_NUMBERS, ediCodeNumbers); if (ediCodeNumbers.contains(null)) { - query.append(" OR E." + Email.PROPERTY_EDI_ERROR + " IS NULL"); + query.append(" OR " + EMAIL_IDENTIFIER + "." + Email.PROPERTY_EDI_ERROR + " IS NULL"); } query.append(")"); } Set<FaxToMailUser> takenBys = emailFilter.getTakenBys(); if (takenBys != null) { - query.append(" AND (E." + Email.PROPERTY_TAKEN_BY + " in (:" + EmailFilter.PROPERTY_TAKEN_BYS + ")"); + query.append(" AND (" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_TAKEN_BY + " in (:" + EmailFilter.PROPERTY_TAKEN_BYS + ")"); args.put(EmailFilter.PROPERTY_TAKEN_BYS, takenBys); if (takenBys.contains(null)) { - query.append(" OR E." + Email.PROPERTY_TAKEN_BY + " IS NULL"); + query.append(" OR " + EMAIL_IDENTIFIER + "." + Email.PROPERTY_TAKEN_BY + " IS NULL"); } query.append(")"); } Set<FaxToMailUser> lastAttachmentOpeners = emailFilter.getLastAttachmentOpeners(); if (lastAttachmentOpeners != null) { - query.append(" AND (E." + Email.PROPERTY_LAST_ATTACHMENT_OPENER + " in (:" + EmailFilter.PROPERTY_LAST_ATTACHMENT_OPENERS + ")"); + query.append(" AND (" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_LAST_ATTACHMENT_OPENER + " in (:" + EmailFilter.PROPERTY_LAST_ATTACHMENT_OPENERS + ")"); args.put(EmailFilter.PROPERTY_LAST_ATTACHMENT_OPENERS, lastAttachmentOpeners); if (lastAttachmentOpeners.contains(null)) { - query.append(" OR E." + Email.PROPERTY_LAST_ATTACHMENT_OPENER + " IS NULL"); + query.append(" OR " + EMAIL_IDENTIFIER + "." + Email.PROPERTY_LAST_ATTACHMENT_OPENER + " IS NULL"); } query.append(")"); } Set<FaxToMailUser> lastPrintingUsers = emailFilter.getLastPrintingUsers(); if (lastPrintingUsers != null) { - query.append(" AND (E." + Email.PROPERTY_LAST_PRINTING_USER + " in (:" + EmailFilter.PROPERTY_LAST_PRINTING_USERS + ")"); + query.append(" AND (" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_LAST_PRINTING_USER + " in (:" + EmailFilter.PROPERTY_LAST_PRINTING_USERS + ")"); args.put(EmailFilter.PROPERTY_LAST_PRINTING_USERS, lastPrintingUsers); if (lastPrintingUsers.contains(null)) { - query.append(" OR E." + Email.PROPERTY_LAST_PRINTING_USER + " IS NULL"); + query.append(" OR " + EMAIL_IDENTIFIER + "." + Email.PROPERTY_LAST_PRINTING_USER + " IS NULL"); } query.append(")"); } Set<Date> lastPrintingDates = emailFilter.getLastPrintingDates(); if (lastPrintingDates != null) { - query.append(" AND (E." + Email.PROPERTY_LAST_PRINTING_DATE + " in (:" + EmailFilter.PROPERTY_LAST_PRINTING_DATES + ")"); + query.append(" AND (" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_LAST_PRINTING_DATE + " in (:" + EmailFilter.PROPERTY_LAST_PRINTING_DATES + ")"); args.put(EmailFilter.PROPERTY_LAST_PRINTING_DATES, lastPrintingDates); if (lastPrintingDates.contains(null)) { - query.append(" OR E." + Email.PROPERTY_LAST_PRINTING_DATE + " IS NULL"); + query.append(" OR " + EMAIL_IDENTIFIER + "." + Email.PROPERTY_LAST_PRINTING_DATE + " IS NULL"); } query.append(")"); } Set<String> recipients = emailFilter.getRecipients(); if (recipients != null) { - query.append(" AND (E." + Email.PROPERTY_RECIPIENT + " in (:" + EmailFilter.PROPERTY_RECIPIENTS + ")"); + query.append(" AND (" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_RECIPIENT + " in (:" + EmailFilter.PROPERTY_RECIPIENTS + ")"); args.put(EmailFilter.PROPERTY_RECIPIENTS, recipients); if (recipients.contains(null)) { - query.append(" OR E." + Email.PROPERTY_RECIPIENT + " IS NULL"); + query.append(" OR " + EMAIL_IDENTIFIER + "." + Email.PROPERTY_RECIPIENT + " IS NULL"); } query.append(")"); } Set<Priority> priorities = emailFilter.getPriorities(); if (priorities != null) { - query.append(" AND (E." + Email.PROPERTY_PRIORITY + " in (:" + EmailFilter.PROPERTY_PRIORITIES + ")"); + query.append(" AND (" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_PRIORITY + " in (:" + EmailFilter.PROPERTY_PRIORITIES + ")"); args.put(EmailFilter.PROPERTY_PRIORITIES, priorities); if (priorities.contains(null)) { - query.append(" OR E." + Email.PROPERTY_PRIORITY + " IS NULL"); + query.append(" OR " + EMAIL_IDENTIFIER + "." + Email.PROPERTY_PRIORITY + " IS NULL"); } query.append(")"); } Set<Range> ranges = emailFilter.getRanges(); if (CollectionUtils.isNotEmpty(ranges)) { - query.append(" AND ((EXISTS (FROM " + RangeRow.class.getName() + " RR WHERE RR in elements(E." + Email.PROPERTY_RANGE_ROW + "))" + query.append(" AND ((EXISTS (FROM " + RangeRow.class.getName() + " RR WHERE RR in elements(" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_RANGE_ROW + "))" + " AND (select count(*) FROM " + RangeRow.class.getName() + " RR" - + " WHERE RR in elements(E." + Email.PROPERTY_RANGE_ROW + ") AND RR." + RangeRow.PROPERTY_RANGE + + " WHERE RR in elements(" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_RANGE_ROW + ") AND RR." + RangeRow.PROPERTY_RANGE + " IN (:" + EmailFilter.PROPERTY_RANGES + ")"); query.append(") > 0"); if (ranges.contains(null)) { - query.append(" OR NOT EXISTS (FROM " + RangeRow.class.getName() + " RR WHERE RR in elements(E." + Email.PROPERTY_RANGE_ROW + "))"); + query.append(" OR NOT EXISTS (FROM " + RangeRow.class.getName() + " RR WHERE RR in elements(" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_RANGE_ROW + "))"); } query.append("))"); @@ -873,13 +904,13 @@ public class EmailTopiaDao extends AbstractEmailTopiaDao<Email> { Set<Long> productQuantities = emailFilter.getProductsQuantities(); if (CollectionUtils.isNotEmpty(productQuantities)) { - query.append(" AND ((EXISTS (FROM " + RangeRow.class.getName() + " RR WHERE RR in elements(E." + Email.PROPERTY_RANGE_ROW + "))" + query.append(" AND ((EXISTS (FROM " + RangeRow.class.getName() + " RR WHERE RR in elements(" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_RANGE_ROW + "))" + " AND (select sum(RR." + RangeRow.PROPERTY_PRODUCT_QUANTITY + ") " + - "FROM " + RangeRow.class.getName() + " RR WHERE RR in elements(E." + Email.PROPERTY_RANGE_ROW + ")"); + "FROM " + RangeRow.class.getName() + " RR WHERE RR in elements(" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_RANGE_ROW + ")"); query.append(") IN (:" + EmailFilter.PROPERTY_PRODUCT_QUANTITIES + ")"); if (productQuantities.contains(null) || productQuantities.contains(0L)) { - query.append(" OR NOT EXISTS (FROM " + RangeRow.class.getName() + " RR WHERE RR in elements(E." + Email.PROPERTY_RANGE_ROW + "))"); + query.append(" OR NOT EXISTS (FROM " + RangeRow.class.getName() + " RR WHERE RR in elements(" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_RANGE_ROW + "))"); } query.append("))"); @@ -888,13 +919,13 @@ public class EmailTopiaDao extends AbstractEmailTopiaDao<Email> { Set<Long> savQuantities = emailFilter.getSavQuantities(); if (CollectionUtils.isNotEmpty(savQuantities)) { - query.append(" AND ((EXISTS (FROM " + RangeRow.class.getName() + " RR WHERE RR in elements(E." + Email.PROPERTY_RANGE_ROW + "))" + query.append(" AND ((EXISTS (FROM " + RangeRow.class.getName() + " RR WHERE RR in elements(" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_RANGE_ROW + "))" + " AND (select sum(RR." + RangeRow.PROPERTY_SAV_QUANTITY + ") " + - "FROM " + RangeRow.class.getName() + " RR WHERE RR in elements(E." + Email.PROPERTY_RANGE_ROW + ")"); + "FROM " + RangeRow.class.getName() + " RR WHERE RR in elements(" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_RANGE_ROW + ")"); query.append(") IN (:" + EmailFilter.PROPERTY_SAV_QUANTITIES + ")"); if (savQuantities.contains(null) || savQuantities.contains(0L)) { - query.append(" OR NOT EXISTS (FROM " + RangeRow.class.getName() + " RR WHERE RR in elements(E." + Email.PROPERTY_RANGE_ROW + "))"); + query.append(" OR NOT EXISTS (FROM " + RangeRow.class.getName() + " RR WHERE RR in elements(" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_RANGE_ROW + "))"); } query.append("))"); @@ -903,13 +934,13 @@ public class EmailTopiaDao extends AbstractEmailTopiaDao<Email> { Set<Long> quotationQuantities = emailFilter.getQuotationQuantities(); if (CollectionUtils.isNotEmpty(quotationQuantities)) { - query.append(" AND ((EXISTS (FROM " + RangeRow.class.getName() + " RR WHERE RR in elements(E." + Email.PROPERTY_RANGE_ROW + "))" + query.append(" AND ((EXISTS (FROM " + RangeRow.class.getName() + " RR WHERE RR in elements(" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_RANGE_ROW + "))" + " AND (select sum(RR." + RangeRow.PROPERTY_QUOTATION_QUANTITY + ") " + - "FROM " + RangeRow.class.getName() + " RR WHERE RR in elements(E." + Email.PROPERTY_RANGE_ROW + ")"); + "FROM " + RangeRow.class.getName() + " RR WHERE RR in elements(" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_RANGE_ROW + ")"); query.append(") IN (:" + EmailFilter.PROPERTY_QUOTATION_QUANTITIES + ")"); if (quotationQuantities.contains(null) || quotationQuantities.contains(0L)) { - query.append(" OR NOT EXISTS (FROM " + RangeRow.class.getName() + " RR WHERE RR in elements(E." + Email.PROPERTY_RANGE_ROW + "))"); + query.append(" OR NOT EXISTS (FROM " + RangeRow.class.getName() + " RR WHERE RR in elements(" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_RANGE_ROW + "))"); } query.append("))"); @@ -918,58 +949,58 @@ public class EmailTopiaDao extends AbstractEmailTopiaDao<Email> { Set<String> projectReferences = emailFilter.getProjectReferences(); if (projectReferences != null) { - query.append(" AND (E." + Email.PROPERTY_PROJECT_REFERENCE + " in (:" + EmailFilter.PROPERTY_PROJECT_REFERENCES + ")"); + query.append(" AND (" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_PROJECT_REFERENCE + " in (:" + EmailFilter.PROPERTY_PROJECT_REFERENCES + ")"); args.put(EmailFilter.PROPERTY_PROJECT_REFERENCES, projectReferences); if (projectReferences.contains(null)) { - query.append(" OR E." + Email.PROPERTY_PROJECT_REFERENCE + " IS NULL"); + query.append(" OR " + EMAIL_IDENTIFIER + "." + Email.PROPERTY_PROJECT_REFERENCE + " IS NULL"); } query.append(")"); } Set<String> localReferences = emailFilter.getLocalReferences(); if (localReferences != null) { - query.append(" AND (E." + Email.PROPERTY_COMPANY_REFERENCE + " in (:" + EmailFilter.PROPERTY_LOCAL_REFERENCES + ")"); + query.append(" AND (" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_COMPANY_REFERENCE + " in (:" + EmailFilter.PROPERTY_LOCAL_REFERENCES + ")"); args.put(EmailFilter.PROPERTY_LOCAL_REFERENCES, localReferences); if (localReferences.contains(null)) { - query.append(" OR E." + Email.PROPERTY_COMPANY_REFERENCE + " IS NULL"); + query.append(" OR " + EMAIL_IDENTIFIER + "." + Email.PROPERTY_COMPANY_REFERENCE + " IS NULL"); } query.append(")"); } Set<String> references = emailFilter.getReferences(); if (references != null) { - query.append(" AND ((EXISTS (FROM " + RangeRow.class.getName() + " RR WHERE RR in elements(E." + Email.PROPERTY_RANGE_ROW + ")"); + query.append(" AND ((EXISTS (FROM " + RangeRow.class.getName() + " RR WHERE RR in elements(" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_RANGE_ROW + ")"); query.append(" AND RR." + RangeRow.PROPERTY_COMMAND_NUMBER + " IN (:" + EmailFilter.PROPERTY_LOCAL_REFERENCES + "))"); - query.append(" OR E." + Email.PROPERTY_COMPANY_REFERENCE + " IN (:" + EmailFilter.PROPERTY_LOCAL_REFERENCES + ")"); + query.append(" OR " + EMAIL_IDENTIFIER + "." + Email.PROPERTY_COMPANY_REFERENCE + " IN (:" + EmailFilter.PROPERTY_LOCAL_REFERENCES + ")"); args.put(EmailFilter.PROPERTY_LOCAL_REFERENCES, references); if (references.contains(null)) { - query.append(" OR (NOT EXISTS (FROM " + RangeRow.class.getName() + " RR WHERE RR in elements(E." + Email.PROPERTY_RANGE_ROW + "))"); - query.append(" AND E." + Email.PROPERTY_COMPANY_REFERENCE + " IS NULL)"); + query.append(" OR (NOT EXISTS (FROM " + RangeRow.class.getName() + " RR WHERE RR in elements(" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_RANGE_ROW + "))"); + query.append(" AND " + EMAIL_IDENTIFIER + "." + Email.PROPERTY_COMPANY_REFERENCE + " IS NULL)"); } query.append("))"); } Set<WaitingState> waitingStates = emailFilter.getWaitingStates(); if (waitingStates != null) { - query.append(" AND (E." + Email.PROPERTY_WAITING_STATE + " in (:" + EmailFilter.PROPERTY_WAITING_STATES + ")"); + query.append(" AND (" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_WAITING_STATE + " in (:" + EmailFilter.PROPERTY_WAITING_STATES + ")"); args.put(EmailFilter.PROPERTY_WAITING_STATES, waitingStates); if (waitingStates.contains(null)) { - query.append(" OR E." + Email.PROPERTY_WAITING_STATE + " IS NULL"); + query.append(" OR " + EMAIL_IDENTIFIER + "." + Email.PROPERTY_WAITING_STATE + " IS NULL"); } query.append(")"); } Set<String> subjects = emailFilter.getSubjects(); if (subjects != null) { - query.append(" AND (E." + Email.PROPERTY_SUBJECT + " in (:" + EmailFilter.PROPERTY_SUBJECTS + ")"); + query.append(" AND (" + EMAIL_IDENTIFIER + "." + Email.PROPERTY_SUBJECT + " in (:" + EmailFilter.PROPERTY_SUBJECTS + ")"); args.put(EmailFilter.PROPERTY_SUBJECTS, subjects); if (subjects.contains(null)) { - query.append(" OR E." + Email.PROPERTY_SUBJECT + " IS NULL"); + query.append(" OR " + EMAIL_IDENTIFIER + "." + Email.PROPERTY_SUBJECT + " IS NULL"); } query.append(")"); } diff --git a/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities/MailField.java b/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities/MailField.java index fcd2c25..0056018 100644 --- a/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities/MailField.java +++ b/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities/MailField.java @@ -31,35 +31,45 @@ package com.franciaflex.faxtomail.persistence.entities; */ public enum MailField { - OBJECT, - PROJECT_REFERENCE, - PRIORITY, - RANGE_ROW, - CLIENT, - WAITING_STATE, - COMPANY_REFERENCE, - COMMENT, - DEMAND_TYPE, - CLIENT_CODE, - CLIENT_NAME, - CLIENT_BRAND, - SENDER, - REFERENCE, - RECEPTION_DATE, - RECIPIENT, - DEMAND_STATUS, - PF_NB, - SAV_NB, - QUOTATION_NB, - TAKEN_BY, - LAST_ATTACHMENT_OPENING_IN_THIS_FOLDER_USER, - REPLIES, - ATTACHMENT, - GROUP, - EDI_RETURN, - SUBJECT, - LAST_PRINTING_USER, - LAST_PRINTING_DATE; + OBJECT(EmailTopiaDao.EMAIL_IDENTIFIER + "." + Email.PROPERTY_OBJECT), + PROJECT_REFERENCE(EmailTopiaDao.EMAIL_IDENTIFIER + "." + Email.PROPERTY_PROJECT_REFERENCE), + PRIORITY(EmailTopiaDao.PRIORITY_IDENTIFIER + "." + Priority.PROPERTY_LABEL), + RANGE_ROW(null), + CLIENT(null), + WAITING_STATE(EmailTopiaDao.WAITING_STATE_IDENTIFIER + "." + WaitingState.PROPERTY_LABEL), + COMPANY_REFERENCE(EmailTopiaDao.EMAIL_IDENTIFIER + "." + Email.PROPERTY_COMPANY_REFERENCE), + COMMENT(EmailTopiaDao.EMAIL_IDENTIFIER + "." + Email.PROPERTY_COMMENT), + DEMAND_TYPE(EmailTopiaDao.DEMAND_TYPE_IDENTIFIER + "." + DemandType.PROPERTY_LABEL), + CLIENT_CODE(EmailTopiaDao.CLIENT_IDENTIFIER + "." + Client.PROPERTY_CODE), + CLIENT_NAME(EmailTopiaDao.CLIENT_IDENTIFIER + "." + Client.PROPERTY_NAME), + CLIENT_BRAND(EmailTopiaDao.CLIENT_IDENTIFIER + "." + Client.PROPERTY_BRAND), + SENDER(EmailTopiaDao.EMAIL_IDENTIFIER + "." + Email.PROPERTY_SENDER), + REFERENCE(null), + RECEPTION_DATE(EmailTopiaDao.EMAIL_IDENTIFIER + "." + Email.PROPERTY_RECEPTION_DATE), + RECIPIENT(EmailTopiaDao.EMAIL_IDENTIFIER + "." + Email.PROPERTY_RECIPIENT), + DEMAND_STATUS(EmailTopiaDao.EMAIL_IDENTIFIER + "." + Email.PROPERTY_DEMAND_STATUS), + PF_NB("SUM(" + EmailTopiaDao.RANGE_ROW_IDENTIFIER + "." + RangeRow.PROPERTY_PRODUCT_QUANTITY + ")"), + SAV_NB("SUM(" + EmailTopiaDao.RANGE_ROW_IDENTIFIER + "." + RangeRow.PROPERTY_SAV_QUANTITY + ")"), + QUOTATION_NB("SUM(" + EmailTopiaDao.RANGE_ROW_IDENTIFIER + "." + RangeRow.PROPERTY_QUOTATION_QUANTITY + ")"), + TAKEN_BY(EmailTopiaDao.TAKEN_BY_IDENTIFIER + "." + FaxToMailUser.PROPERTY_TRIGRAPH), + LAST_ATTACHMENT_OPENING_IN_THIS_FOLDER_USER(EmailTopiaDao.LAST_ATTACHMENT_OPENER_IDENTIFIER + "." + FaxToMailUser.PROPERTY_TRIGRAPH), + REPLIES("SIZE(" + EmailTopiaDao.EMAIL_IDENTIFIER + "." + Email.PROPERTY_REPLIES + ")"), + ATTACHMENT("SIZE(" + EmailTopiaDao.EMAIL_IDENTIFIER + "." + Email.PROPERTY_ATTACHMENT + ")"), + GROUP("SIZE(" + EmailTopiaDao.GROUP_IDENTIFIER + "." + EmailGroup.PROPERTY_EMAIL + ")"), + EDI_RETURN(EmailTopiaDao.EMAIL_IDENTIFIER + "." + Email.PROPERTY_EDI_ERROR), + SUBJECT(EmailTopiaDao.EMAIL_IDENTIFIER + "." + Email.PROPERTY_SUBJECT), + LAST_PRINTING_USER(EmailTopiaDao.LAST_PRINTING_USER_IDENTIFIER + "." + FaxToMailUser.PROPERTY_TRIGRAPH), + LAST_PRINTING_DATE(EmailTopiaDao.EMAIL_IDENTIFIER + "." + Email.PROPERTY_LAST_PRINTING_DATE); + + private String orderProperty; + + MailField(String orderProperty) { + this.orderProperty = orderProperty; + } + + public String getOrderProperty() { + return orderProperty; + } public static MailField[] getCanBeRequiredMailFields() { return new MailField[] { diff --git a/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeListTableFilter.java b/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeListTableFilter.java index 26f2c7b..65397c8 100644 --- a/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeListTableFilter.java +++ b/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeListTableFilter.java @@ -295,7 +295,7 @@ public class DemandeListTableFilter extends AbstractTableFilter<JXTable> { @Override public void clear() { super.clear(); - handler.getModel().getEmailFilter().clear(); + handler.getModel().getEmailFilter().clearFilter(); executeFilter(); } @@ -309,7 +309,7 @@ public class DemandeListTableFilter extends AbstractTableFilter<JXTable> { context.setCurrentPaginationParameter(null); } else { - handler.getModel().resetPaginationParameter(); + handler.getModel().resetPaginationParameterPage(); } LoadFolderEmailsAction loadFolderEmailsAction = diff --git a/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeListUIHandler.java b/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeListUIHandler.java index 6c29f64..4c8d5fe 100644 --- a/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeListUIHandler.java +++ b/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeListUIHandler.java @@ -45,6 +45,7 @@ import com.franciaflex.faxtomail.ui.swing.content.demande.actions.SaveDemandeFro import com.franciaflex.faxtomail.ui.swing.util.AbstractFaxToMailDemandListHandler; import com.franciaflex.faxtomail.ui.swing.util.DemandeTableModel; import com.franciaflex.faxtomail.ui.swing.util.FaxToMailUIUtil; +import com.franciaflex.faxtomail.ui.swing.util.FilterSortableTableHeaderRenderer; import com.franciaflex.faxtomail.ui.swing.util.FolderTreeNode; import com.franciaflex.faxtomail.ui.swing.util.PaginationComboModel; import com.franciaflex.faxtomail.ui.swing.util.RemoveablePropertyChangeListener; @@ -62,6 +63,8 @@ import org.jdesktop.swingx.JXTable; import org.jdesktop.swingx.decorator.ColorHighlighter; import org.jdesktop.swingx.decorator.ComponentAdapter; import org.jdesktop.swingx.decorator.HighlightPredicate; +import org.jdesktop.swingx.table.TableColumnExt; +import org.jdesktop.swingx.table.TableColumnModelExt; import org.nuiton.decorator.Decorator; import org.nuiton.jaxx.application.swing.action.ApplicationUIAction; import org.nuiton.jaxx.application.swing.util.CloseableUI; @@ -90,6 +93,7 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; +import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.beans.IntrospectionException; import java.beans.PropertyChangeEvent; @@ -102,6 +106,7 @@ import java.util.Collection; import java.util.Date; import java.util.List; import java.util.Map; +import java.util.Objects; /** * Handler of UI {@link com.franciaflex.faxtomail.ui.swing.content.demande.DemandeListUIHandler}. @@ -184,7 +189,7 @@ public class DemandeListUIHandler extends AbstractFaxToMailDemandListHandler<Dem initUI(ui); - DemandeListUIModel model = getModel(); + final DemandeListUIModel model = getModel(); // init table final JXTable dataTable = getUI().getDataTable(); @@ -210,15 +215,36 @@ public class DemandeListUIHandler extends AbstractFaxToMailDemandListHandler<Dem } }; + FilterSortableTableHeaderRenderer tableHeaderRenderer = new FilterSortableTableHeaderRenderer(tableFilter, model); TableRowFilterSupport.forFilter(tableFilter) .searchable(true) .searchDecorator(decorator) .useTableRenderers(true) .setPopupDefaultSize(new Dimension(250, 290)) + .setTableHeaderRenderer(tableHeaderRenderer) .apply(); updateEmailFilterWithContextEmailFilter(); + dataTable.getTableHeader().addMouseListener(new MouseAdapter() { + + @Override + public void mouseClicked(MouseEvent e) { + if (model.isCanSortResults()) { + TableColumnModelExt colModel = (TableColumnModelExt) dataTable.getColumnModel(); + int vColumnIndex = colModel.getColumnIndexAtX(e.getX()); + TableColumnExt column = colModel.getColumnExt(vColumnIndex); + MailField mailField = DemandeTableModel.COLUMN_IDENTIFIERS.inverse().get(column.getIdentifier()); + if (mailField.getOrderProperty() != null) { + boolean changeSortOrder = Objects.equals(model.getOrderByMailField(), mailField); + model.setOrderByMailField(mailField); + model.setOrderDesc(changeSortOrder && !model.isOrderDesc()); + tableFilter.executeFilter(); + } + } + } + }); + dataTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() { @Override @@ -341,6 +367,18 @@ public class DemandeListUIHandler extends AbstractFaxToMailDemandListHandler<Dem } }); + model.addPropertyChangeListener(DemandeListUIModel.PROPERTY_CAN_SORT_RESULTS, new PropertyChangeListener() { + + @Override + public void propertyChange(PropertyChangeEvent evt) { + boolean canSortResults = (boolean) evt.getNewValue(); + if (!canSortResults) { + model.setOrderByMailField(MailField.RECEPTION_DATE); + model.setOrderDesc(false); + } + } + }); + // int combo box for result per page ui.getResultPerPageCombo().setModel(new PaginationComboModel()); int resultPerPage = getConfig().getResultPerPage(); @@ -389,7 +427,7 @@ public class DemandeListUIHandler extends AbstractFaxToMailDemandListHandler<Dem EmailFilter contextEmailFilter = getContext().getEmailFilter(); EmailFilter currentEmailFilter = getModel().getEmailFilter(); - currentEmailFilter.clear(); + currentEmailFilter.clearFilter(); List<MailField> fields = getColumns(); if (CollectionUtils.isEmpty(fields)) { @@ -561,21 +599,29 @@ public class DemandeListUIHandler extends AbstractFaxToMailDemandListHandler<Dem folder = model.getSelectedFolder(); if (folder != null) { - while (!folder.isUseCurrentLevelNbElementToDisplay() - && folder.getParent() != null) { - folder = folder.getParent(); + MailFolder folderWithNbElementToDisplay = folder; + while (!folderWithNbElementToDisplay.isUseCurrentLevelNbElementToDisplay() + && folderWithNbElementToDisplay.getParent() != null) { + folderWithNbElementToDisplay = folderWithNbElementToDisplay.getParent(); } - boolean enableChangeResultPerPage = folder.getNbElementToDisplay() == null; + boolean enableChangeResultPerPage = folderWithNbElementToDisplay.getNbElementToDisplay() == null; model.setEnableChangeResultPerPage(enableChangeResultPerPage); int resultPerPage; if (!enableChangeResultPerPage) { - resultPerPage = folder.getNbElementToDisplay(); + resultPerPage = folderWithNbElementToDisplay.getNbElementToDisplay(); } else { resultPerPage = getConfig().getResultPerPage(); } model.setResultPerPage(resultPerPage); ui.getResultPerPageCombo().setSelectedItem(resultPerPage); + + MailFolder folderWithCanChangeOrderInTable = folder; + while (folderWithCanChangeOrderInTable.getCanChangeOrderInTable() == null + && folderWithCanChangeOrderInTable.getParent() != null) { + folderWithCanChangeOrderInTable = folderWithCanChangeOrderInTable.getParent(); + } + model.setCanSortResults(Boolean.TRUE.equals(folderWithCanChangeOrderInTable.getCanChangeOrderInTable())); } tableFilter.executeFilter(); @@ -598,7 +644,7 @@ public class DemandeListUIHandler extends AbstractFaxToMailDemandListHandler<Dem model.setResultPerPage(resultPerPage); getConfig().setResultPerPage(resultPerPage); getConfig().save(); - model.resetPaginationParameter(); + model.resetPaginationParameterPage(); runListAction(); } } diff --git a/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeListUIModel.java b/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeListUIModel.java index d61d6e4..bc50c19 100644 --- a/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeListUIModel.java +++ b/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeListUIModel.java @@ -24,6 +24,7 @@ package com.franciaflex.faxtomail.ui.swing.content.demande; import com.franciaflex.faxtomail.persistence.entities.Email; import com.franciaflex.faxtomail.persistence.entities.EmailFilter; +import com.franciaflex.faxtomail.persistence.entities.MailField; import com.franciaflex.faxtomail.persistence.entities.MailFolder; import org.jdesktop.beans.AbstractSerializableBean; import org.nuiton.util.pagination.PaginationParameter; @@ -58,7 +59,10 @@ public class DemandeListUIModel extends AbstractSerializableBean { public static final String PROPERTY_COMPUTE_QUANTITIES_BY_RANGE_ENABLED = "computeQuantitiesByRangeEnabled"; public static final String PROPERTY_NEW_DEMAND_ENABLED = "newDemandEnabled"; public static final String PROPERTY_RESULT_PER_PAGE = "resultPerPage"; + public static final String PROPERTY_ORDER_BY_MAILFIELD = "orderByMailField"; + public static final String PROPERTY_ORDER_DESC = "orderDesc"; public static final String PROPERTY_ENABLE_CHANGE_RESULT_PER_PAGE = "enableChangeResultPerPage"; + public static final String PROPERTY_CAN_SORT_RESULTS = "canSortResults"; protected List<MailFolder> folders; @@ -68,8 +72,14 @@ public class DemandeListUIModel extends AbstractSerializableBean { protected int resultPerPage = 50; + protected MailField orderByMailField = MailField.RECEPTION_DATE; + + protected boolean orderDesc = false; + protected boolean enableChangeResultPerPage = true; + protected boolean canSortResults = false; + protected PaginationParameter paginationParameter = PaginationParameter.of(0, resultPerPage, Email.PROPERTY_TOPIA_CREATE_DATE, false); protected PaginationResult<Email> paginationResult = PaginationResult.of(null, 0, paginationParameter); @@ -133,17 +143,16 @@ public class DemandeListUIModel extends AbstractSerializableBean { } public void setPaginationParameter(PaginationParameter paginationParameter) { - PaginationParameter oldValue = this.paginationParameter; this.paginationParameter = paginationParameter; - firePropertyChange(PROPERTY_PAGINATION_PARAMETER, oldValue, paginationParameter); + firePropertyChange(PROPERTY_PAGINATION_PARAMETER, null, paginationParameter); } public PaginationParameter getPaginationParameter() { return paginationParameter; } - - public void resetPaginationParameter() { - setPaginationParameter(PaginationParameter.of(0, resultPerPage, Email.PROPERTY_RECEPTION_DATE, false)); + + public void resetPaginationParameterPage() { + setPaginationParameter(PaginationParameter.of(0, resultPerPage, orderByMailField.getOrderProperty(), orderDesc)); } public void setPaginationResult(PaginationResult<Email> paginationResult) { @@ -341,6 +350,26 @@ public class DemandeListUIModel extends AbstractSerializableBean { return resultPerPage; } + public MailField getOrderByMailField() { + return orderByMailField; + } + + public void setOrderByMailField(MailField orderByMailField) { + Object oldValue = getOrderByMailField(); + this.orderByMailField = orderByMailField; + firePropertyChange(PROPERTY_ORDER_BY_MAILFIELD, oldValue, orderByMailField); + } + + public boolean isOrderDesc() { + return orderDesc; + } + + public void setOrderDesc(boolean orderDesc) { + Object oldValue = isOrderDesc(); + this.orderDesc = orderDesc; + firePropertyChange(PROPERTY_ORDER_DESC, oldValue, orderDesc); + } + public boolean isEnableChangeResultPerPage() { return enableChangeResultPerPage; } @@ -354,4 +383,13 @@ public class DemandeListUIModel extends AbstractSerializableBean { public boolean isDisplayOnlyUserTrigraphInTables() { return Boolean.TRUE.equals(displayOnlyUserTrigraphInTables); } + + public boolean isCanSortResults() { + return canSortResults; + } + + public void setCanSortResults(boolean canSortResults) { + this.canSortResults = canSortResults; + firePropertyChange(PROPERTY_CAN_SORT_RESULTS, null, canSortResults); + } } diff --git a/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/actions/LoadFolderEmailsAction.java b/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/actions/LoadFolderEmailsAction.java index 10fde07..c0d97c9 100644 --- a/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/actions/LoadFolderEmailsAction.java +++ b/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/actions/LoadFolderEmailsAction.java @@ -94,7 +94,15 @@ public class LoadFolderEmailsAction extends AbstractFaxToMailAction<DemandeListU // change name to save the state of the column width for every folder // (as every folder can have a different header) getContext().getSwingSession().updateState(); - String columns = handler.populateColumnModel(dataTable, false); + + MailFolder folderWithCanChangeOrderInTable = folder; + while (folderWithCanChangeOrderInTable.getCanChangeOrderInTable() == null + && folderWithCanChangeOrderInTable.getParent() != null) { + folderWithCanChangeOrderInTable = folderWithCanChangeOrderInTable.getParent(); + } + boolean sortable = Boolean.TRUE.equals(folderWithCanChangeOrderInTable.getCanChangeOrderInTable()); + String columns = handler.populateColumnModel(dataTable, sortable); + dataTable.setName("dataTable" + columns); getContext().getSwingSession().add(dataTable, true); diff --git a/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/DemandeTableModel.java b/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/DemandeTableModel.java index 41242a7..ee6149f 100644 --- a/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/DemandeTableModel.java +++ b/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/DemandeTableModel.java @@ -27,6 +27,8 @@ import com.franciaflex.faxtomail.persistence.entities.MailField; import com.franciaflex.faxtomail.ui.swing.content.demande.DemandeUIModel; import com.google.common.base.Preconditions; import com.google.common.base.Predicate; +import com.google.common.collect.BiMap; +import com.google.common.collect.HashBiMap; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.collect.Sets; @@ -41,9 +43,7 @@ import org.nuiton.jaxx.application.swing.table.ColumnIdentifier; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableColumn; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.Set; import static org.nuiton.i18n.I18n.n; @@ -58,176 +58,177 @@ public class DemandeTableModel extends AbstractTableModel { private static final Log log = LogFactory.getLog(DemandeTableModel.class); - public static final Map<MailField, ColumnIdentifier<Email>> COLUMN_IDENTIFIERS = new HashMap<MailField, ColumnIdentifier<Email>>() {{ - put(MailField.SENDER, + public static final BiMap<MailField, ColumnIdentifier<Email>> COLUMN_IDENTIFIERS = HashBiMap.create(MailField.values().length); + static { + COLUMN_IDENTIFIERS.put(MailField.SENDER, ColumnIdentifier.<Email>newReadOnlyId( Email.PROPERTY_SENDER, n("faxtomail.demandeList.table.header.sender"), n("faxtomail.demandeList.table.header.sender.tip"))); - put(MailField.OBJECT, + COLUMN_IDENTIFIERS.put(MailField.OBJECT, ColumnIdentifier.<Email>newReadOnlyId( Email.PROPERTY_OBJECT, n("faxtomail.demandeList.table.header.object"), n("faxtomail.demandeList.table.header.object.tip"))); - put(MailField.RECEPTION_DATE, + COLUMN_IDENTIFIERS.put(MailField.RECEPTION_DATE, ColumnIdentifier.<Email>newReadOnlyId( Email.PROPERTY_RECEPTION_DATE, n("faxtomail.demandeList.table.header.receptionDate"), n("faxtomail.demandeList.table.header.receptionDate.tip"))); - put(MailField.RECIPIENT, + COLUMN_IDENTIFIERS.put(MailField.RECIPIENT, ColumnIdentifier.<Email>newReadOnlyId( Email.PROPERTY_RECIPIENT, n("faxtomail.demandeList.table.header.recipient"), n("faxtomail.demandeList.table.header.recipient.tip"))); - put(MailField.CLIENT_CODE, + COLUMN_IDENTIFIERS.put(MailField.CLIENT_CODE, ColumnIdentifier.<Email>newReadOnlyId( DemandeUIModel.PROPERTY_CLIENT_CODE, n("faxtomail.demandeList.table.header.clientCode"), n("faxtomail.demandeList.table.header.clientCode.tip"))); - put(MailField.CLIENT_NAME, + COLUMN_IDENTIFIERS.put(MailField.CLIENT_NAME, ColumnIdentifier.<Email>newReadOnlyId( DemandeUIModel.PROPERTY_CLIENT_NAME, n("faxtomail.demandeList.table.header.clientName"), n("faxtomail.demandeList.table.header.clientName.tip"))); - put(MailField.CLIENT_BRAND, + COLUMN_IDENTIFIERS.put(MailField.CLIENT_BRAND, ColumnIdentifier.<Email>newReadOnlyId( DemandeUIModel.PROPERTY_CLIENT_BRAND, n("faxtomail.demandeList.table.header.brand"), n("faxtomail.demandeList.table.header.brand.tip"))); - put(MailField.DEMAND_STATUS, + COLUMN_IDENTIFIERS.put(MailField.DEMAND_STATUS, ColumnIdentifier.<Email>newReadOnlyId( Email.PROPERTY_DEMAND_STATUS, n("faxtomail.demandeList.table.header.status"), n("faxtomail.demandeList.table.header.status.tip"))); - put(MailField.DEMAND_TYPE, + COLUMN_IDENTIFIERS.put(MailField.DEMAND_TYPE, ColumnIdentifier.<Email>newReadOnlyId( Email.PROPERTY_DEMAND_TYPE, n("faxtomail.demandeList.table.header.type"), n("faxtomail.demandeList.table.header.type.tip"))); - put(MailField.EDI_RETURN, + COLUMN_IDENTIFIERS.put(MailField.EDI_RETURN, ColumnIdentifier.<Email>newReadOnlyId( Email.PROPERTY_EDI_ERROR, n("faxtomail.demandeList.table.header.ediCodeNumber"), n("faxtomail.demandeList.table.header.ediCodeNumber.tip"))); - put(MailField.WAITING_STATE, + COLUMN_IDENTIFIERS.put(MailField.WAITING_STATE, ColumnIdentifier.<Email>newReadOnlyId( Email.PROPERTY_WAITING_STATE, n("faxtomail.demandeList.table.header.waitingState"), n("faxtomail.demandeList.table.header.waitingState.tip"))); - put(MailField.TAKEN_BY, + COLUMN_IDENTIFIERS.put(MailField.TAKEN_BY, ColumnIdentifier.<Email>newReadOnlyId( Email.PROPERTY_TAKEN_BY, n("faxtomail.demandeList.table.header.user"), n("faxtomail.demandeList.table.header.user.tip"))); - put(MailField.PRIORITY, + COLUMN_IDENTIFIERS.put(MailField.PRIORITY, ColumnIdentifier.<Email>newId( Email.PROPERTY_PRIORITY, n("faxtomail.demandeList.table.header.priority"), n("faxtomail.demandeList.table.header.priority.tip"))); - put(MailField.PROJECT_REFERENCE, + COLUMN_IDENTIFIERS.put(MailField.PROJECT_REFERENCE, ColumnIdentifier.<Email>newReadOnlyId( Email.PROPERTY_PROJECT_REFERENCE, n("faxtomail.demandeList.table.header.projectReference"), n("faxtomail.demandeList.table.header.projectReference.tip"))); - put(MailField.COMPANY_REFERENCE, + COLUMN_IDENTIFIERS.put(MailField.COMPANY_REFERENCE, ColumnIdentifier.<Email>newReadOnlyId( Email.PROPERTY_COMPANY_REFERENCE, n("faxtomail.demandeList.table.header.companyReference"), n("faxtomail.demandeList.table.header.companyReference.tip"))); - put(MailField.REFERENCE, + COLUMN_IDENTIFIERS.put(MailField.REFERENCE, ColumnIdentifier.<Email>newReadOnlyId( DemandeUIModel.PROPERTY_REFERENCE, n("faxtomail.demandeList.table.header.reference"), n("faxtomail.demandeList.table.header.reference.tip"))); - put(MailField.RANGE_ROW, + COLUMN_IDENTIFIERS.put(MailField.RANGE_ROW, ColumnIdentifier.<Email>newReadOnlyId( Email.PROPERTY_RANGE_ROW, n("faxtomail.demandeList.table.header.range"), n("faxtomail.demandeList.table.header.range.tip"))); - put(MailField.PF_NB, + COLUMN_IDENTIFIERS.put(MailField.PF_NB, ColumnIdentifier.<Email>newReadOnlyId( DemandeUIModel.PROPERTY_PF_NB, n("faxtomail.demandeList.table.header.pfNb"), n("faxtomail.demandeList.table.header.pfNb.tip"))); - put(MailField.SAV_NB, + COLUMN_IDENTIFIERS.put(MailField.SAV_NB, ColumnIdentifier.<Email>newReadOnlyId( DemandeUIModel.PROPERTY_SAV_NB, n("faxtomail.demandeList.table.header.savNb"), n("faxtomail.demandeList.table.header.savNb.tip"))); - put(MailField.QUOTATION_NB, + COLUMN_IDENTIFIERS.put(MailField.QUOTATION_NB, ColumnIdentifier.<Email>newReadOnlyId( DemandeUIModel.PROPERTY_QUOTATION_NB, n("faxtomail.demandeList.table.header.quotationNb"), n("faxtomail.demandeList.table.header.quotationNb.tip"))); - put(MailField.REPLIES, + COLUMN_IDENTIFIERS.put(MailField.REPLIES, ColumnIdentifier.<Email>newId( Email.PROPERTY_REPLIES, n("faxtomail.demandeList.table.header.replies"), n("faxtomail.demandeList.table.header.replies.tip"))); - put(MailField.ATTACHMENT, + COLUMN_IDENTIFIERS.put(MailField.ATTACHMENT, ColumnIdentifier.<Email>newId( Email.PROPERTY_ATTACHMENT, n("faxtomail.demandeList.table.header.attachment"), n("faxtomail.demandeList.table.header.attachment.tip"))); - put(MailField.GROUP, + COLUMN_IDENTIFIERS.put(MailField.GROUP, ColumnIdentifier.<Email>newId( DemandeUIModel.PROPERTY_GROUPED_DEMANDES, n("faxtomail.demandeList.table.header.emailGroup"), n("faxtomail.demandeList.table.header.emailGroup.tip"))); - put(MailField.LAST_ATTACHMENT_OPENING_IN_THIS_FOLDER_USER, + COLUMN_IDENTIFIERS.put(MailField.LAST_ATTACHMENT_OPENING_IN_THIS_FOLDER_USER, ColumnIdentifier.<Email>newId( Email.PROPERTY_LAST_ATTACHMENT_OPENER, n("faxtomail.demandeList.table.header.lastAttachmentOpeningUser"), n("faxtomail.demandeList.table.header.lastAttachmentOpeningUser.tip"))); - put(MailField.COMMENT, + COLUMN_IDENTIFIERS.put(MailField.COMMENT, ColumnIdentifier.<Email>newId( Email.PROPERTY_COMMENT, n("faxtomail.demandeList.table.header.comment"), n("faxtomail.demandeList.table.header.comment.tip"))); - put(MailField.SUBJECT, + COLUMN_IDENTIFIERS.put(MailField.SUBJECT, ColumnIdentifier.<Email>newId( Email.PROPERTY_SUBJECT, n("faxtomail.demandeList.table.header.subject"), n("faxtomail.demandeList.table.header.subject.tip"))); - put(MailField.LAST_PRINTING_USER, + COLUMN_IDENTIFIERS.put(MailField.LAST_PRINTING_USER, ColumnIdentifier.<Email>newId( Email.PROPERTY_LAST_PRINTING_USER, n("faxtomail.demandeList.table.header.lastPrintingUser"), n("faxtomail.demandeList.table.header.lastPrintingUser.tip"))); - put(MailField.LAST_PRINTING_DATE, + COLUMN_IDENTIFIERS.put(MailField.LAST_PRINTING_DATE, ColumnIdentifier.<Email>newId( Email.PROPERTY_LAST_PRINTING_DATE, n("faxtomail.demandeList.table.header.lastPrintingDate"), n("faxtomail.demandeList.table.header.lastPrintingDate.tip"))); - }}; + }; public DemandeTableModel(TableColumnModelExt columnModel, MailField... editableProperties) { diff --git a/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/FilterSortableTableHeaderRenderer.java b/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/FilterSortableTableHeaderRenderer.java new file mode 100644 index 0000000..2df6191 --- /dev/null +++ b/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/FilterSortableTableHeaderRenderer.java @@ -0,0 +1,73 @@ +package com.franciaflex.faxtomail.ui.swing.util; + +import com.franciaflex.faxtomail.persistence.entities.MailField; +import com.franciaflex.faxtomail.ui.swing.content.demande.DemandeListUIModel; +import jaxx.runtime.swing.CompoundIcon; +import jaxx.runtime.swing.JAXXWidgetUtil; +import jaxx.runtime.swing.table.filter.FilterTableHeaderRenderer; +import jaxx.runtime.swing.table.filter.TableFilter; +import org.jdesktop.swingx.table.TableColumnExt; +import org.jdesktop.swingx.table.TableColumnModelExt; + +import javax.swing.Icon; +import javax.swing.ImageIcon; +import javax.swing.JLabel; +import javax.swing.JTable; +import java.awt.Component; +import java.awt.Image; + +/** + * @author Kevin Morin (Code Lutin) + * @since 2.4 + */ +public class FilterSortableTableHeaderRenderer extends FilterTableHeaderRenderer { + + protected final DemandeListUIModel demandeListUIModel; + + protected final ImageIcon sortAscIcon; + protected final ImageIcon sortDescIcon; + + public FilterSortableTableHeaderRenderer(TableFilter<?> tableFilter, DemandeListUIModel demandeListUIModel) { + super(tableFilter); + this.demandeListUIModel = demandeListUIModel; + + ImageIcon icon = JAXXWidgetUtil.createImageIcon("sort_table_asc.png"); + sortAscIcon = new ImageIcon(icon.getImage().getScaledInstance(12, 12, Image.SCALE_SMOOTH)); + + icon = JAXXWidgetUtil.createImageIcon("sort_table_desc.png"); + sortDescIcon = new ImageIcon(icon.getImage().getScaledInstance(12, 12, Image.SCALE_SMOOTH)); + } + + @Override + public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, + boolean hasFocus, int row, int column) { + + TableColumnModelExt colModel = (TableColumnModelExt) table.getColumnModel(); + TableColumnExt columnExt = colModel.getColumnExt(column); + MailField mailField = DemandeTableModel.COLUMN_IDENTIFIERS.inverse().get(columnExt.getIdentifier()); + + boolean focusCell = hasFocus && mailField.getOrderProperty() != null; + final JLabel label = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, focusCell, row, column); + + if (demandeListUIModel.getOrderByMailField() != null + && demandeListUIModel.getOrderByMailField().equals(mailField)) { + + Icon originalIcon = label.getIcon(); + Icon sortIcon; + if (demandeListUIModel.isOrderDesc()) { + sortIcon = sortDescIcon; + } else { + sortIcon = sortAscIcon; + } + if (originalIcon == null) { + label.setIcon(sortIcon); + } else { + label.setIcon(new CompoundIcon(sortIcon, originalIcon)); + } + label.setHorizontalTextPosition(JLabel.TRAILING); + } + + return label; + } + +} diff --git a/faxtomail-ui-swing/src/main/resources/icons/sort_table_asc.png b/faxtomail-ui-swing/src/main/resources/icons/sort_table_asc.png new file mode 100644 index 0000000..3f19917 Binary files /dev/null and b/faxtomail-ui-swing/src/main/resources/icons/sort_table_asc.png differ diff --git a/faxtomail-ui-swing/src/main/resources/icons/sort_table_desc.png b/faxtomail-ui-swing/src/main/resources/icons/sort_table_desc.png new file mode 100644 index 0000000..db263fe Binary files /dev/null and b/faxtomail-ui-swing/src/main/resources/icons/sort_table_desc.png differ diff --git a/faxtomail-ui-web/src/main/webapp/js/configuration.js b/faxtomail-ui-web/src/main/webapp/js/configuration.js index 13b7b7a..c603c50 100644 --- a/faxtomail-ui-web/src/main/webapp/js/configuration.js +++ b/faxtomail-ui-web/src/main/webapp/js/configuration.js @@ -921,7 +921,7 @@ ConfigurationModule.controller('ConfigurationTreeController', ['$scope', '$windo if (angular.isUndefined($scope.parentScopeValues.company)) { $scope.parentScopeValues.company = folder.company; } - if ((!$scope.parentScopeValues.folderTableColumns || $scope.parentScopeValues.folderTableColumns.length == 0) && folder.folderTableColumns) { + if ((!$scope.parentScDeopeValues.folderTableColumns || $scope.parentScopeValues.folderTableColumns.length == 0) && folder.folderTableColumns) { $scope.parentScopeValues.folderTableColumns = folder.folderTableColumns; } if (angular.isUndefined($scope.parentScopeValues.displayOnlyUserTrigraphInTables)) { diff --git a/pom.xml b/pom.xml index 238475f..fad7a54 100644 --- a/pom.xml +++ b/pom.xml @@ -109,11 +109,11 @@ <h2Version>1.3.176</h2Version> <guavaVersion>18.0</guavaVersion> - <jaxxVersion>2.38</jaxxVersion> + <jaxxVersion>2.43-SNAPSHOT</jaxxVersion> <!-- do not upgrade to 1.6.5-1 --> <swingXVersion>1.6.4</swingXVersion> <xworkVersion>2.3.16.3</xworkVersion> - <struts2Version>2.3.16.3</struts2Version> + <struts2Version>2.3.32</struts2Version> <jqueryPluginVersion>3.7.1</jqueryPluginVersion> <bootstrapPluginVersion>2.0.0</bootstrapPluginVersion> <slf4jVersion>1.7.7</slf4jVersion> -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.