Author: echatellier Date: 2014-05-30 17:20:22 +0200 (Fri, 30 May 2014) New Revision: 114 Url: http://forge.codelutin.com/projects/faxtomail/repository/revisions/114 Log: refs #4662: Amelioration de l'interface (ajout/suppression/fioritures) Modified: trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/FaxToMailActionSupport.java trunk/faxtomail-ui-web/src/main/webapp/WEB-INF/content/admin/configuration-input.jsp trunk/faxtomail-ui-web/src/main/webapp/css/faxtomail.css trunk/faxtomail-ui-web/src/main/webapp/js/configuration.js trunk/faxtomail-ui-web/src/main/webapp/js/faxtomail.js Modified: trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/FaxToMailActionSupport.java =================================================================== --- trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/FaxToMailActionSupport.java 2014-05-30 13:52:41 UTC (rev 113) +++ trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/FaxToMailActionSupport.java 2014-05-30 15:20:22 UTC (rev 114) @@ -130,7 +130,6 @@ // exclusion final Multimap<Class<?>, String> gsonExclusions = HashMultimap.create(); gsonExclusions.put(MailFolderAbstract.class, MailFolder.PROPERTY_PARENT); - gsonExclusions.put(MailFilterAbstract.class, MailFilter.PROPERTY_MAIL_FOLDER); builder.addSerializationExclusionStrategy(new ExclusionStrategy() { @Override public boolean shouldSkipField(FieldAttributes f) { 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-05-30 13:52:41 UTC (rev 113) +++ trunk/faxtomail-ui-web/src/main/webapp/WEB-INF/content/admin/configuration-input.jsp 2014-05-30 15:20:22 UTC (rev 114) @@ -82,20 +82,17 @@ <div id="tabs-general" class="tab-pane active"> <!-- Général --> - <s:checkbox name="configuration.sendAknowledgement" - label="Envoyer directement l'accusé de réception si demandé par l'expéditeur"/> - - <s:checkbox name="configuration.rejectUnknownSender" - label="Refuser les mails dont l'email est inconnu de la base client" - cssClass="margin-bottom25"/> - <s:textfield name="configuration.convertToPdfCommand" - label="Ligne de commande de conversion de fichier X en pdf" - cssClass="span12"/> + label="Ligne de commande de conversion de fichier X en pdf"/> <s:textfield name="configuration.openAttachmentCommand" - label="Ligne de commande d'ouverture de fichier non TXT, TIFF, JPEG, PDF" - cssClass="span12"/> + label="Ligne de commande d'ouverture de fichier non TXT, TIFF, JPEG, PDF"/> + + <s:textfield name="configuration.emailMaxSize" + label="Taille maximale des email (en bits)"/> + + <s:checkbox name="configuration.rejectUnknownSender" + label="Refuser les mails dont l'email est inconnu de la base client"/> <!-- Il faut pouvoir configurer le dossier par défaut de déplacement en fonction des champs saisis sur la fiche (configuration sur statut, type de fiche, ...). Ce dossier n'est qu'une proposition que l'utilisateur peut modifier)--> @@ -107,12 +104,8 @@ <div class="row"> <div class="col-md-4"> + <h3>États d'attente <input type="button" class="btn btn-success btn-xs pull-right" value="Nouveau" ng-click="newEtatAttente()" /></h3> <table class="table table-hover"> - <thead> - <tr> - <th>État d'attente</th> - </tr> - </thead> <tbody> <tr ng-repeat="etatAttente in etatAttentes" ng-class="{'info' : etatAttente == selectedEtatAttente}" @@ -124,12 +117,13 @@ </div> <div class="col-md-7" ng-if="selectedEtatAttente"> - Champs obligatoires pour l'état d'attente <strong>{{selectedEtatAttente.label}}</strong>: + <h3>Édition de l'état d'attente {{selectedEtatAttente.label}}</h3> + Champs obligatoires pour l'état d'attente : <label class="checkbox" ng-repeat="(etatAttenteField,label) in etatAttenteFields"> <input type="checkbox" ng-checked="selectedEtatAttente.fields.indexOf(etatAttenteField) != -1" ng-click="changeEtatAttenteField(etatAttenteField)"> {{label}} </label> - Actions autorisées pour l'état d'attente <strong>{{selectedEtatAttente.label}}</strong>: + Actions autorisées pour l'état d'attente : <label class="checkbox" ng-repeat="(etatAttenteAction,label) in etatAttenteActions"> <input type="checkbox" ng-checked="selectedEtatAttente.actions.indexOf(etatAttenteAction) != -1" ng-click="changeEtatAttenteAction(etatAttenteAction)"> {{label}} @@ -147,8 +141,9 @@ <div class="row"> <div class="col-md-4"> + <h3>Dossiers <a class="btn btn-xs btn-success pull-right" ng-click="newRoot()">Nouveau</a></h3> <script type="text/ng-template" id="nodes_renderer.html"> - <div ui-tree-handle ng-click="editMailFolder(mailFolder)" ng-class="{'bg-warning' : mailFolder == selectedMailFolder}"> + <div ui-tree-handle ng-click="editMailFolder(mailFolder)" ng-class="{'bg-success' : mailFolder == selectedMailFolder}"> <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> @@ -169,6 +164,7 @@ </div> <div class="col-md-8" ng-show="selectedMailFolder"> + <h3>Édition du dossier {{selectedMailFolder.name}}</h3> <div class="panel-group" id="accordion"> <!-- Liste des chargés de clientèle --> @@ -216,7 +212,7 @@ <div class="panel-heading"> <h4 class="panel-title"> <a data-toggle="collapse" data-parent="#accordion" href="#collapse2"> - liste des emails expéditeur + Liste des emails expéditeur </a> </h4> </div> @@ -256,7 +252,7 @@ <div class="panel-heading"> <h4 class="panel-title"> <a data-toggle="collapse" data-parent="#accordion" href="#collapse3"> - sélection des états d'attentes possibles pour ce dossier + Sélection des états d'attentes possibles pour ce dossier </a> </h4> </div> @@ -275,7 +271,7 @@ <div class="panel-heading"> <h4 class="panel-title"> <a data-toggle="collapse" data-parent="#accordion" href="#collapse4"> - groupes/personnes ayant droit d'écriture sur le dossier + Groupes/personnes ayant droit d'écriture sur le dossier </a> </h4> </div> @@ -319,7 +315,7 @@ <div class="panel-heading"> <h4 class="panel-title"> <a data-toggle="collapse" data-parent="#accordion" href="#collapse5"> - actions possibles du menu contextuel pour ce dossier + Actions possibles du menu contextuel pour ce dossier </a> </h4> </div> @@ -338,7 +334,7 @@ <div class="panel-heading"> <h4 class="panel-title"> <a data-toggle="collapse" data-parent="#accordion" href="#collapse6"> - configuration des colonnes a afficher + Configuration des colonnes a afficher </a> </h4> </div> @@ -366,19 +362,41 @@ </div> </div> </div> - - <div class="checkbox"> - <label for="printActionEqualTakeActionField">action imprimer est-elle équivalente à "prendre"</label> - <input type="checkbox" id="printActionEqualTakeActionField" ng-model="selectedMailFolder.printActionEqualTakeAction"> + + <div class="form-group"> + <label class="control-label">L'action imprimer est-elle équivalente à "prendre"</label><br /> + <label class="radio-inline"> + <input type="radio" name="printActionEqualTakeActionField" + ng-model="selectedMailFolder.printActionEqualTakeAction" ng-value="true"> oui + </label> + <label class="radio-inline"> + <input type="radio" name="printActionEqualTakeActionField" + ng-model="selectedMailFolder.printActionEqualTakeAction" ng-value="false"> non + </label> + <label class="radio-inline"> + <input type="radio" name="printActionEqualTakeActionField" + ng-model="selectedMailFolder.printActionEqualTakeAction" ng-value="undefined"> valeur du noeud parent + </label> </div> - <div class="checkbox"> - <label for="openAttachmentReportNoTakenField">ouvrir une pièce jointe sans prendre, met-il la ligne en orange ou non</label> - <input type="checkbox" id="openAttachmentReportNoTakenField" ng-model="selectedMailFolder.openAttachmentReportNoTaken"> + <div class="form-group"> + <label class="control-label">Ouvrir une pièce jointe sans prendre, met-il la ligne en orange ?</label><br /> + <label class="radio-inline"> + <input type="radio" name="openAttachmentReportNoTakenField" + ng-model="selectedMailFolder.openAttachmentReportNoTaken" ng-value="true"> oui + </label> + <label class="radio-inline"> + <input type="radio" name="openAttachmentReportNoTakenField" + ng-model="selectedMailFolder.openAttachmentReportNoTaken" ng-value="false"> non + </label> + <label class="radio-inline"> + <input type="radio" name="openAttachmentReportNoTakenField" + ng-model="selectedMailFolder.openAttachmentReportNoTaken" ng-value="undefined"> valeur du noeud parent + </label> </div> <div class="form-group"> - <label for="ediFolderField">dossier (FS) de dépôt des demandes EDI</label> + <label for="ediFolderField">Dossier (FS) de dépôt des demandes EDI</label> <input type="text" class="form-control" id="ediFolderField" ng-model="selectedMailFolder.ediFolder"> </div> </div> @@ -393,12 +411,16 @@ <tr> <th>Filtre</th> <th>Dossier</th> + <th/> </tr> </thead> <tbody ui-sortable ng-model="mailFilters"> <tr ng-repeat="mailFilter in mailFilters"> <td>{{mailFilter.expression}}</td> <td>{{mailFilter.mailFolder.name}}</td> + <td><a class="btn btn-danger btn-xs" ng-click="removeFilter($index)"> + <span class="glyphicon glyphicon-remove"></span> + </a></td> </tr> </tbody> </table> @@ -406,15 +428,15 @@ <div role="form"> <div class="form-group"> <label for="filterField">Filtre</label> - <input type="text" class="form-control" id="folderField" ng-model="selectedFilter"> + <input type="text" class="form-control" id="folderField" ng-model="newFilter.expression"> </div> <div class="form-group"> <label for="folderField">Dossier</label> - <select class="form-control" ng-model="selectedFolder" ng-options="mailFolder.name for mailFolder in flatMailFolders()"></select> + <select class="form-control" ng-model="newFilter.mailFolder" ng-options="mailFolder.name for mailFolder in flatMailFolders()"></select> </div> </div> - <button type="button" class="btn btn-success" ng-disabled="!selectedFilter || !selectedFolder" ng-click="addNewFilter()"> - <i class="glyphicon glyphicon-plus"></i>Ajouter + <button type="button" class="btn btn-success" ng-disabled="!newFilter.expression || !newFilter.mailFolder" ng-click="addNewFilter()"> + <i class="glyphicon glyphicon-plus"></i> Ajouter </button> </div> @@ -449,15 +471,46 @@ <th>Serveur</th> <th>Utilisateur</th> <th>Mot de passe</th> + <th/> </tr> </thead> - <tbody ng-repeat="emailAccount in emailAccounts"> - <td>{{emailAccount.protocol}}</td> - <td>{{emailAccount.host}}</td> - <td>{{emailAccount.login}}</td> - <td>{{emailAccount.password}}</td> + <tbody> + <tr ng-repeat="emailAccount in emailAccounts"> + <td>{{emailAccount.protocol}}</td> + <td>{{emailAccount.host}}</td> + <td>{{emailAccount.login}}</td> + <td>{{emailAccount.password}}</td> + <td> + <a class="btn btn-danger btn-xs" ng-click="removeEmailAccount($index)"> + <span class="glyphicon glyphicon-remove"></span> + </a></td> + </tr> </tbody> </table> + + <div class="form" role="form"> + <div class="form-group"> + <label>Protocole: + <input type="text" class="form-control" ng-model="newAccount.protocol"></label> + </div> + <div class="form-group"> + <label>Serveur: + <input type="text" class="form-control" ng-model="newAccount.host"></label> + </div> + <div class="form-group"> + <label>Utilisateur: + <input type="text" class="form-control" ng-model="newAccount.login"></label> + </div> + <div class="form-group"> + <label>Mot de passe: + <input type="text" class="form-control" ng-model="newAccount.password"></label> + </div> + <div class="form-group"> + <button type="button" class="btn btn-success" ng-disabled="!newAccount.protocol || !newAccount.host" ng-click="addEmailAccount()"> + <i class="glyphicon glyphicon-plus"></i> Ajouter + </button> + </div> + </div> </div> </div> <nav class="navbar navbar-default navbar-fixed-bottom"> Modified: trunk/faxtomail-ui-web/src/main/webapp/css/faxtomail.css =================================================================== --- trunk/faxtomail-ui-web/src/main/webapp/css/faxtomail.css 2014-05-30 13:52:41 UTC (rev 113) +++ trunk/faxtomail-ui-web/src/main/webapp/css/faxtomail.css 2014-05-30 15:20:22 UTC (rev 114) @@ -46,18 +46,17 @@ width: 100%; } -.angular-ui-tree-handle.bg-warning { - background: #fcf8e3; -} - .angular-ui-tree-handle:hover { color: #438eb9; background: #f4f6f7; border-color: #dce2e8; } -.angular-ui-tree-handle.bg-warning:hover { - background: #fcf8e3; +.angular-ui-tree-handle.bg-success { + background-color: #dff0d8; } +.angular-ui-tree-handle.bg-success:hover { + background-color: #dff0d8; +} .ui-sortable { cursor:move; Modified: trunk/faxtomail-ui-web/src/main/webapp/js/configuration.js =================================================================== --- trunk/faxtomail-ui-web/src/main/webapp/js/configuration.js 2014-05-30 13:52:41 UTC (rev 113) +++ trunk/faxtomail-ui-web/src/main/webapp/js/configuration.js 2014-05-30 15:20:22 UTC (rev 114) @@ -67,8 +67,8 @@ /** * Etat attente tab controller. */ -FaxToMailModule.controller('ConfigurationWaitController', ['$scope', '$http', 'ConfigurationData', - function($scope, $http, ConfigurationData) { +FaxToMailModule.controller('ConfigurationWaitController', ['$scope', '$http', '$window', 'ConfigurationData', + function($scope, $http, $window, ConfigurationData) { //{Object} etat d'attente selectionné $scope.selectedEtatAttente; @@ -86,6 +86,22 @@ } }; + // ajout d'un nouvel etat d'attente + $scope.newEtatAttente = function() { + var label = $window.prompt("Nom du nouvel état d'attente ?"); + if (label) { + // auto select new etat + var newEtatAttente = { + topiaId : "new_" + guid(), + label: label + }; + $scope.etatAttentes.push(newEtatAttente); + + // auto select + $scope.editEtatAttente(newEtatAttente); + } + }; + // selection/deselection d'une action $scope.changeEtatAttenteAction = function(etatAttenteAction) { @@ -123,16 +139,21 @@ // {Array} Colonnes selectionnées pour le dossier courant $scope.folderTableColumns; - // collapse all subnodes (called by init) - $scope.collapseAll = function(scope) { - scope.collapseAll(); + // creation d'un nouveau noeud racine + $scope.newRoot = function() { + var name = $window.prompt("Nom du nouveau dossier racine ?"); + if (name) { + var newRoot = { + topiaId: "new_" + guid(), + name: name + }; + $scope.mailFolders.push(newRoot); + + // edition automatique + $scope.editMailFolder(newRoot); + }; }; - // toggle node (expand or collapse) - $scope.toggle = function(scope) { - scope.toggle(); - }; - // edit mail folder $scope.editMailFolder = function(mailFolder) { $scope.selectedMailFolder = mailFolder; @@ -245,23 +266,21 @@ function($scope, $http, ConfigurationData) { //{Array} Current mail filter list $scope.mailFilters = ConfigurationData.mailFilters; - //{String} input filter in add form - $scope.selectedFilter; - //{Object} selected folder in add form - $scope.selectedFolder; + //{Object} New accout empty filter + $scope.newFilter = {}; // add new filter action $scope.addNewFilter = function() { - var filter = { - expression: $scope.selectedFilter, - mailFolder: $scope.selectedFolder - }; - $scope.mailFilters.push(filter); + $scope.mailFilters.push($scope.newFilter); // clear form - delete $scope.selectedFilter; - delete $scope.selectedFolder; + $scope.newFilter = {}; }; + + // remove filter + $scope.removeFilter = function(index) { + $scope.mailFilters.splice(index, 1); + }; }]); @@ -300,4 +319,17 @@ function($scope, $http, ConfigurationData) { //{Array} Email accounts $scope.emailAccounts = ConfigurationData.emailAccounts; + //{Object} New accout empty object + $scope.newAccount = {}; + + // ajout d'un nouveau compte + $scope.addEmailAccount = function() { + $scope.emailAccounts.push($scope.newAccount); + $scope.newAccount = {}; + }; + + // suppression d'un compte + $scope.removeEmailAccount = function(index) { + $scope.emailAccounts.splice(index, 1); + }; }]); Modified: trunk/faxtomail-ui-web/src/main/webapp/js/faxtomail.js =================================================================== --- trunk/faxtomail-ui-web/src/main/webapp/js/faxtomail.js 2014-05-30 13:52:41 UTC (rev 113) +++ trunk/faxtomail-ui-web/src/main/webapp/js/faxtomail.js 2014-05-30 15:20:22 UTC (rev 114) @@ -22,4 +22,20 @@ * #L% */ +/** + * Generates a GUID string, according to RFC4122 standards. + * @returns {String} The generated GUID. + * @example af8a8416-6e18-a307-bd9c-f2c947bbb3aa + * @author Slavik Meltser (slavik@meltser.info). + * @link http://slavik.meltser.info/?p=142 + */ +function guid() { + function _p8(s) { + var p = (Math.random().toString(16)+"000000000").substr(2,8); + return s ? "-" + p.substr(0,4) + "-" + p.substr(4,4) : p ; + } + return _p8() + _p8(true) + _p8(true) + _p8(); +} + +/** Mail faxtomail application module. */ var FaxToMailModule = angular.module('FaxToMail', []);