r135 - in trunk: . faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service faxtomail-ui-web faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/action/admin faxtomail-ui-web/src/main/webapp/WEB-INF/content/admin faxtomail-ui-web/src/main/webapp/js
Author: echatellier Date: 2014-06-05 14:42:57 +0200 (Thu, 05 Jun 2014) New Revision: 135 Url: http://forge.codelutin.com/projects/faxtomail/repository/revisions/135 Log: refs #4662: Suppression des dossiers vides Modified: trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities/EmailTopiaDao.java trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/MailFolderService.java trunk/faxtomail-ui-web/pom.xml trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/action/admin/ConfigurationAction.java trunk/faxtomail-ui-web/src/main/webapp/WEB-INF/content/admin/configuration-input.jsp trunk/faxtomail-ui-web/src/main/webapp/WEB-INF/content/admin/user-folder-input.jsp trunk/faxtomail-ui-web/src/main/webapp/js/configuration.js trunk/faxtomail-ui-web/src/main/webapp/js/faxtomail.js trunk/pom.xml Modified: trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities/EmailTopiaDao.java =================================================================== --- trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities/EmailTopiaDao.java 2014-06-05 10:03:08 UTC (rev 134) +++ trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities/EmailTopiaDao.java 2014-06-05 12:42:57 UTC (rev 135) @@ -343,4 +343,23 @@ return findAll(query.toString(), args); } + + /** + * Retounre le nombre d'email par dossier. + * + * @return le nombre d'email par dossier + */ + public Map<String, Long> getMailCountByFolder() { + String query = "SELECT mailFolder.topiaId, count(*) FROM " + Email.class.getName() + " group by mailFolder.topiaId"; + + Map<String, Long> result = new HashMap<>(); + + List<Object[]> queryResuts = findAll(query); + for (Object[] queryResut : queryResuts) { + String mailFolder = (String)queryResut[0]; + Long count = (Long)queryResut[1]; + result.put(mailFolder, count); + } + return result; + } } Modified: trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/MailFolderService.java =================================================================== --- trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/MailFolderService.java 2014-06-05 10:03:08 UTC (rev 134) +++ trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/MailFolderService.java 2014-06-05 12:42:57 UTC (rev 135) @@ -35,11 +35,11 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.nuiton.topia.persistence.TopiaIdFactory; import org.nuiton.util.beans.Binder; import org.nuiton.util.beans.BinderFactory; import org.nuiton.util.pagination.PaginationParameter; +import com.franciaflex.faxtomail.persistence.entities.EmailTopiaDao; import com.franciaflex.faxtomail.persistence.entities.EtatAttente; import com.franciaflex.faxtomail.persistence.entities.MailFilter; import com.franciaflex.faxtomail.persistence.entities.MailFilterTopiaDao; @@ -157,7 +157,6 @@ Collection<EtatAttente> etatAttentes = folder.getEtatAttente(); if (CollectionUtils.isEmpty(etatAttentes)) { etatAttentes = parentEtatAttente; - } else { parentEtatAttente = etatAttentes; } @@ -178,4 +177,17 @@ } + /** + * Retourne une map avec les identifiants des {@code mailFolder}s et le nombre de mails qu'ils + * contiennent pour pouvoir empecher la suppression. + * Seulement pour les dossiers qui ont au moins un email. + * + * @return le nombre de mail par dossier + */ + public Map<String, Long> getMailFoldersUsage() { + EmailTopiaDao dao = getPersistenceContext().getEmailDao(); + Map<String, Long> result = dao.getMailCountByFolder(); + return result; + } + } Modified: trunk/faxtomail-ui-web/pom.xml =================================================================== --- trunk/faxtomail-ui-web/pom.xml 2014-06-05 10:03:08 UTC (rev 134) +++ trunk/faxtomail-ui-web/pom.xml 2014-06-05 12:42:57 UTC (rev 135) @@ -237,6 +237,11 @@ <groupId>org.nuiton.js</groupId> <artifactId>nuiton-js-angular-ui-tree</artifactId> </dependency> + + <dependency> + <groupId>org.webjars</groupId> + <artifactId>angular-ui-bootstrap</artifactId> + </dependency> <dependency> <groupId>org.webjars</groupId> Modified: trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/action/admin/ConfigurationAction.java =================================================================== --- trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/action/admin/ConfigurationAction.java 2014-06-05 10:03:08 UTC (rev 134) +++ trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/action/admin/ConfigurationAction.java 2014-06-05 12:42:57 UTC (rev 135) @@ -71,6 +71,8 @@ protected List<MailFolder> mailFolders; + protected Map<String, Long> mailFoldersUsage; + protected List<MailFilter> mailFilters; protected List<FaxToMailUser> users; @@ -88,6 +90,7 @@ etatAttentes = referentielService.getAllEtatAttente(); demandTypes = referentielService.getAllDemandType(); mailFolders = mailFolderService.getRootMailFolders(); + mailFoldersUsage = mailFolderService.getMailFoldersUsage(); users = configurationService.getAllUsers(); emailAccounts = configurationService.getEmailAccounts(); mailFilters = configurationService.getMailFilters(); @@ -170,7 +173,11 @@ Type type = new TypeToken<List<MailFilter>>() {}.getType(); this.mailFilters = getGson().fromJson(json, type); } - + + public Map<String, Long> getMailFoldersUsage() { + return mailFoldersUsage; + } + public List<EmailAccount> getEmailAccounts() { return emailAccounts; } Modified: trunk/faxtomail-ui-web/src/main/webapp/WEB-INF/content/admin/configuration-input.jsp =================================================================== --- trunk/faxtomail-ui-web/src/main/webapp/WEB-INF/content/admin/configuration-input.jsp 2014-06-05 10:03:08 UTC (rev 134) +++ trunk/faxtomail-ui-web/src/main/webapp/WEB-INF/content/admin/configuration-input.jsp 2014-06-05 12:42:57 UTC (rev 135) @@ -37,6 +37,8 @@ <script type="text/javascript" src="<s:url value='/js/select2sortable.js' />"></script> <script type="text/javascript" src="<s:url value='/nuiton-js-angular-ui-tree/angular-ui-tree.js' />"></script> <script type="text/javascript" src="<s:url value='/webjars/angular-ui-sortable/0.12.2/sortable.min.js' />"></script> + <script type="text/javascript" src="<s:url value='/webjars/angular-ui-bootstrap/0.11.0/ui-bootstrap.min.js' />"></script> + <script type="text/javascript" src="<s:url value='/webjars/angular-ui-bootstrap/0.11.0/ui-bootstrap-tpls.min.js' />"></script> <link rel="stylesheet" type="text/css" href="<s:url value='/css/faxtomail.css' />" /> <script type="text/javascript" src="<s:url value='/js/faxtomail.js' />"></script> @@ -53,6 +55,7 @@ 'etatAttentes': <s:property value="toJson(etatAttentes)" escapeHtml="false"/>, 'demandTypes': <s:property value="toJson(demandTypes)" escapeHtml="false"/>, 'mailFolders': <s:property value="toJson(mailFolders)" escapeHtml="false"/>, + 'mailFoldersUsage': <s:property value="toJson(mailFoldersUsage)" escapeHtml="false"/>, 'searchDisplayColumns': <s:property value="toJson(configuration.searchDisplayColumns)" escapeHtml="false"/>, 'users': <s:property value="toJson(users)" escapeHtml="false"/>, 'mailFilters': <s:property value="toJson(mailFilters)" escapeHtml="false"/>, @@ -218,9 +221,11 @@ <a class="btn btn-success btn-xs" data-nodrag ng-click="toggle(this)" ng-disabled="!mailFolder.children || mailFolder.children.length == 0"> <span class="glyphicon" ng-class="{'glyphicon-chevron-right': !collapsed, 'glyphicon-chevron-down': collapsed}"></span> </a> - {{mailFolder.name}} + {{mailFolder.name}} <span class="badge">{{mailFolder.$cumulativeCount}}</span> <a class="pull-right btn btn-primary btn-xs" data-nodrag ng-click="newSubFolder(this)" style="margin-left: 8px;"><span class="glyphicon glyphicon-plus"></span></a> - <a class="pull-right btn btn-danger btn-xs" data-nodrag ng-click="remove(this)" ng-if="!mailFolder.topiaId"><span class="glyphicon glyphicon-remove"></span></a> + <a class="pull-right btn btn-danger btn-xs" data-nodrag ng-click="deleteFolder(this)" ng-disabled="mailFolder.$cumulativeCount > 0" + tooltip="{{mailFolder.$cumulativeCount > 0 && 'Ce dossier contient ' + mailFolder.$cumulativeCount + ' demandes !'|| 'Supprimer ce dossier'}}"> + <span class="glyphicon glyphicon-remove"></span></a> </div> <ol ui-tree-nodes="options" ng-model="mailFolder.children" ng-class="{hidden: !collapsed}"> <li ng-repeat="mailFolder in mailFolder.children" ui-tree-node ng-include="'nodes_renderer.html'"> Modified: trunk/faxtomail-ui-web/src/main/webapp/WEB-INF/content/admin/user-folder-input.jsp =================================================================== --- trunk/faxtomail-ui-web/src/main/webapp/WEB-INF/content/admin/user-folder-input.jsp 2014-06-05 10:03:08 UTC (rev 134) +++ trunk/faxtomail-ui-web/src/main/webapp/WEB-INF/content/admin/user-folder-input.jsp 2014-06-05 12:42:57 UTC (rev 135) @@ -34,6 +34,7 @@ <script type="text/javascript" src="<s:url value='/webjars/select2/3.4.8/select2_locale_fr.js' />"></script> <script type="text/javascript" src="<s:url value='/webjars/angularjs/1.2.16/angular.min.js' />"></script> <script type="text/javascript" src="<s:url value='/js/select2sortable.js' />"></script> + <script type="text/javascript" src="<s:url value='/webjars/angular-ui-bootstrap/0.11.0/ui-bootstrap.min.js' />"></script> <link rel="stylesheet" type="text/css" href="<s:url value='/css/faxtomail.css' />" /> <script type="text/javascript" src="<s:url value='/js/faxtomail.js' />"></script> Modified: trunk/faxtomail-ui-web/src/main/webapp/js/configuration.js =================================================================== --- trunk/faxtomail-ui-web/src/main/webapp/js/configuration.js 2014-06-05 10:03:08 UTC (rev 134) +++ trunk/faxtomail-ui-web/src/main/webapp/js/configuration.js 2014-06-05 12:42:57 UTC (rev 135) @@ -41,12 +41,15 @@ $scope.demandTypes = ConfigurationData.demandTypes; //{Array} mail folders $scope.mailFolders = ConfigurationData.mailFolders; + // {Map} Mail folder usage + $scope.mailFoldersUsage = ConfigurationData.mailFoldersUsage; //{Map<MailFolder id, Array<MailFolder>>} liste des $scope.flatMailFolders; // method privée recursive pour retourner l'ensemble des dossiers en les modifiant pour ajouter // des metadata (full path from root, and root node instance) var recursiveAddMailFolder = function(result, mailFolders, rootFolder, prefix) { + var cumulativeCount = 0; if (mailFolders) { angular.forEach(mailFolders, function(mailFolder) { @@ -56,11 +59,22 @@ // ha la la, modify input object again :( // use $ from this, even not recommended because angular exlude those fields when jsonify mailFolder.$rootFolder = rootFolder; + + // + var folderCount = 0; + if ($scope.mailFoldersUsage.hasOwnProperty(mailFolder.topiaId)) { + folderCount += $scope.mailFoldersUsage[mailFolder.topiaId]; + } result.push(mailFolder); - recursiveAddMailFolder(result, mailFolder.children, rootFolder, mailFolder.$fullPath); + folderCount += recursiveAddMailFolder(result, mailFolder.children, rootFolder, mailFolder.$fullPath); + + // et on modifie encore (tant qu'on a commencé !!!) + mailFolder.$cumulativeCount = folderCount; + cumulativeCount += folderCount; }); } + return cumulativeCount; }; // update $scope.flatMailFolders when $scope.mailFolders changes @@ -69,7 +83,8 @@ $scope.flatMailFolders = {}; angular.forEach($scope.mailFolders, function(mailFolder) { $scope.flatMailFolders[mailFolder.topiaId] = []; - recursiveAddMailFolder($scope.flatMailFolders[mailFolder.topiaId], mailFolder.children, mailFolder, mailFolder.name); + var cumulativeCount = recursiveAddMailFolder($scope.flatMailFolders[mailFolder.topiaId], mailFolder.children, mailFolder, mailFolder.name); + mailFolder.$cumulativeCount = cumulativeCount; }); }; $scope._updateFlatMailFolders(); @@ -209,8 +224,10 @@ /** * Mail folder tab controller. */ -ConfigurationModule.controller('ConfigurationTreeController', ['$scope', '$http', '$window', 'ConfigurationData', - function($scope, $http, $window, ConfigurationData) { +ConfigurationModule.controller('ConfigurationTreeController', ['$scope', '$window', 'ConfigurationData', + function($scope, $window, ConfigurationData) { + // {Array} Users + $scope.users = ConfigurationData.users; // {Object} selected mail folder $scope.selectedMailFolder; // {String} add new customer responsible form value @@ -219,8 +236,6 @@ $scope.newReplyAddress; // {Array} Colonnes selectionnées pour le dossier courant $scope.folderTableColumns; - // {Array} Users - $scope.users = ConfigurationData.users; // creation d'un nouveau noeud racine $scope.newRoot = function() { @@ -253,6 +268,13 @@ } }; + // suppression d'un dossier + $scope.deleteFolder = function(scope) { + if ($window.confirm("Êtes-vous sûr de vouloir supprimer ce dossier ?")) { + scope.remove(scope); + } + }; + // edit mail folder $scope.editMailFolder = function(mailFolder) { $scope.selectedMailFolder = mailFolder; Modified: trunk/faxtomail-ui-web/src/main/webapp/js/faxtomail.js =================================================================== --- trunk/faxtomail-ui-web/src/main/webapp/js/faxtomail.js 2014-06-05 10:03:08 UTC (rev 134) +++ trunk/faxtomail-ui-web/src/main/webapp/js/faxtomail.js 2014-06-05 12:42:57 UTC (rev 135) @@ -38,4 +38,4 @@ } /** Mail faxtomail application module. */ -var FaxToMailModule = angular.module('FaxToMail', []); +var FaxToMailModule = angular.module('FaxToMail', ['ui.bootstrap']); Modified: trunk/pom.xml =================================================================== --- trunk/pom.xml 2014-06-05 10:03:08 UTC (rev 134) +++ trunk/pom.xml 2014-06-05 12:42:57 UTC (rev 135) @@ -535,9 +535,16 @@ <version>0.12.2</version> <scope>runtime</scope> </dependency> - + <dependency> <groupId>org.webjars</groupId> + <artifactId>angular-ui-bootstrap</artifactId> + <version>0.11.0-2</version> + <scope>runtime</scope> + </dependency> + + <dependency> + <groupId>org.webjars</groupId> <artifactId>bootstrap</artifactId> <version>3.1.1-1</version> <scope>runtime</scope>
participants (1)
-
echatellier@users.forge.codelutin.com