r89 - 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/src/main/java/com/franciaflex/faxtomail faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/action/admin faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/json faxtomail-ui-web/src/main/resources faxtomail-ui-web/src/mai
Author: echatellier Date: 2014-05-22 15:25:20 +0200 (Thu, 22 May 2014) New Revision: 89 Url: http://forge.codelutin.com/projects/faxtomail/repository/revisions/89 Log: refs #4662: Sauvegarde de la configuration et des etats d'attente Added: trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/json/ trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/json/HibernateProxyTypeAdapter.java trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/json/TopiaEntityAdapter.java trunk/faxtomail-ui-web/src/main/webapp/WEB-INF/content/admin/configuration-input.jsp Removed: trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/HibernateProxyTypeAdapter.java trunk/faxtomail-ui-web/src/main/webapp/WEB-INF/content/admin/configuration.jsp Modified: trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities/Field.java trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/ConfigurationService.java trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/ReferentielService.java trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/FaxToMailActionSupport.java trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/action/admin/ConfigurationAction.java trunk/faxtomail-ui-web/src/main/resources/i18n/faxtomail-ui-web_fr_FR.properties trunk/faxtomail-ui-web/src/main/resources/struts.properties Modified: trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities/Field.java =================================================================== --- trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities/Field.java 2014-05-22 13:24:24 UTC (rev 88) +++ trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities/Field.java 2014-05-22 13:25:20 UTC (rev 89) @@ -31,23 +31,25 @@ */ public enum Field { + SENDER, RECEPTION_DATE, EDI_CODE_NUMBER, + OBJECT, PROJECT_REFERENCE, - SENDER, - FAX, - RECIPIENT, - OBJECT, - ARCHIVE_DATE, - COMPANY_REFERENCE, - ORIGINAL_EMAIL, - COMMENT, - DEMAND_TYPE, PRIORITY, - ETAT_ATTENTE, - TAKEN_BY, RANGE_ROW, + MAIL_FOLDER, CLIENT, - DEMANDE_STATUS - + DEMANDE_STATUS, + DEMAND_TYPE, + TAKEN_BY, + ETAT_ATTENTE, + ATTACHMENT + + //FAX, + //RECIPIENT, + //ARCHIVE_DATE, + //COMPANY_REFERENCE, + //ORIGINAL_EMAIL, + //COMMENT } Modified: trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/ConfigurationService.java =================================================================== --- trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/ConfigurationService.java 2014-05-22 13:24:24 UTC (rev 88) +++ trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/ConfigurationService.java 2014-05-22 13:25:20 UTC (rev 89) @@ -41,7 +41,7 @@ */ public class ConfigurationService extends FaxToMailServiceSupport { - private static final Log log = LogFactory.getLog(CompanyService.class); + private static final Log log = LogFactory.getLog(ConfigurationService.class); public List<Configuration> getAllConfigurations() { ConfigurationTopiaDao dao = getPersistenceContext().getConfigurationDao(); @@ -70,6 +70,7 @@ } else { config = dao.create(config); } + getPersistenceContext().commit(); return config; } Modified: trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/ReferentielService.java =================================================================== --- trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/ReferentielService.java 2014-05-22 13:24:24 UTC (rev 88) +++ trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/ReferentielService.java 2014-05-22 13:25:20 UTC (rev 89) @@ -24,6 +24,24 @@ * #L% */ +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.csv.Import; +import org.nuiton.csv.ImportRuntimeException; +import org.nuiton.jaxx.application.ApplicationTechnicalException; +import org.nuiton.topia.persistence.TopiaEntities; +import org.nuiton.util.beans.Binder; +import org.nuiton.util.beans.BinderFactory; + import com.franciaflex.faxtomail.persistence.entities.Client; import com.franciaflex.faxtomail.persistence.entities.ClientTopiaDao; import com.franciaflex.faxtomail.persistence.entities.DemandType; @@ -31,6 +49,7 @@ import com.franciaflex.faxtomail.persistence.entities.EmailAccount; import com.franciaflex.faxtomail.persistence.entities.EmailAccountTopiaDao; import com.franciaflex.faxtomail.persistence.entities.EtatAttente; +import com.franciaflex.faxtomail.persistence.entities.EtatAttenteImpl; import com.franciaflex.faxtomail.persistence.entities.EtatAttenteTopiaDao; import com.franciaflex.faxtomail.persistence.entities.MailFilter; import com.franciaflex.faxtomail.persistence.entities.MailFilterTopiaDao; @@ -43,25 +62,8 @@ import com.franciaflex.faxtomail.services.service.imports.ClientImportModel; import com.franciaflex.faxtomail.services.service.imports.EmailAccountImportModel; import com.franciaflex.faxtomail.services.service.imports.EmailFilterImportModel; -import com.google.common.base.Charsets; -import com.google.common.io.Files; -import org.apache.commons.io.IOUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.nuiton.csv.Import; -import org.nuiton.csv.ImportRuntimeException; -import org.nuiton.jaxx.application.ApplicationTechnicalException; +import com.google.common.collect.Maps; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.Reader; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import static org.nuiton.i18n.I18n.t; - /** * @author kmorin <kmorin@codelutin.com> * @since x.x @@ -90,6 +92,36 @@ return new ArrayList<>(dao.findAll()); } + public void saveEtatAttente(Collection<EtatAttente> etatAttentes) { + + Binder<EtatAttente, EtatAttente> binderEtatAttente = BinderFactory.newBinder(EtatAttente.class); + EtatAttenteTopiaDao etatAttenteDAO = getPersistenceContext().getEtatAttenteDao(); + + List<EtatAttente> allEtatAttente = getAllEtatAttente(); + Map<String, EtatAttente> allEtatAttenteIndex = new HashMap<>(Maps.uniqueIndex(allEtatAttente, TopiaEntities.getTopiaIdFunction())); + for (EtatAttente etatAttente : etatAttentes) { + // get current etat attente + EtatAttente currentEtatAttente; + if (StringUtils.isNoneBlank(etatAttente.getTopiaId())) { + currentEtatAttente = allEtatAttenteIndex.remove(etatAttente.getTopiaId()); + } else { + currentEtatAttente = new EtatAttenteImpl(); + } + + // copy + binderEtatAttente.copy(etatAttente, currentEtatAttente); + + // persist + if (currentEtatAttente.isPersisted()) { + etatAttenteDAO.create(currentEtatAttente); + } else { + etatAttenteDAO.update(currentEtatAttente); + } + } + + getPersistenceContext().commit(); + } + public List<Client> getAllClients() { ClientTopiaDao dao = getPersistenceContext().getClientDao(); return new ArrayList<>(dao.findAll()); Deleted: trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/HibernateProxyTypeAdapter.java =================================================================== --- trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/HibernateProxyTypeAdapter.java 2014-05-22 13:24:24 UTC (rev 88) +++ trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/HibernateProxyTypeAdapter.java 2014-05-22 13:25:20 UTC (rev 89) @@ -1,58 +0,0 @@ -package com.franciaflex.faxtomail; - -import java.io.IOException; - -import org.hibernate.Hibernate; -import org.hibernate.proxy.HibernateProxy; - -import com.google.gson.Gson; -import com.google.gson.TypeAdapter; -import com.google.gson.TypeAdapterFactory; -import com.google.gson.reflect.TypeToken; -import com.google.gson.stream.JsonReader; -import com.google.gson.stream.JsonWriter; - -/** - * This TypeAdapter unproxies Hibernate proxied objects, and serializes them - * through the registered (or default) TypeAdapter of the base class. - * - * Voir : http://stackoverflow.com/a/13525550/2038100 - */ -public class HibernateProxyTypeAdapter extends TypeAdapter<HibernateProxy> { - - public static final TypeAdapterFactory FACTORY = new TypeAdapterFactory() { - @Override - @SuppressWarnings("unchecked") - public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) { - return (HibernateProxy.class.isAssignableFrom(type.getRawType()) ? (TypeAdapter<T>) new HibernateProxyTypeAdapter(gson) : null); - } - }; - private final Gson context; - - private HibernateProxyTypeAdapter(Gson context) { - this.context = context; - } - - @Override - public HibernateProxy read(JsonReader in) throws IOException { - throw new UnsupportedOperationException("Not supported"); - } - - @SuppressWarnings({"rawtypes", "unchecked"}) - @Override - public void write(JsonWriter out, HibernateProxy value) throws IOException { - if (value == null) { - out.nullValue(); - return; - } - // Retrieve the original (not proxy) class - Class<?> baseType = Hibernate.getClass(value); - // Get the TypeAdapter of the original class, to delegate the serialization - TypeAdapter delegate = context.getAdapter(TypeToken.get(baseType)); - // Get a filled instance of the original class - Object unproxiedValue = value.getHibernateLazyInitializer().getImplementation(); - // Serialize the value - delegate.write(out, unproxiedValue); - } - -} 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-22 13:24:24 UTC (rev 88) +++ trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/FaxToMailActionSupport.java 2014-05-22 13:25:20 UTC (rev 89) @@ -33,11 +33,13 @@ import org.nuiton.topia.persistence.TopiaEntity; import com.franciaflex.faxtomail.FaxToMailConfiguration; -import com.franciaflex.faxtomail.HibernateProxyTypeAdapter; +import com.franciaflex.faxtomail.persistence.entities.FaxToMailEntityEnum; import com.franciaflex.faxtomail.persistence.entities.MailFilter; import com.franciaflex.faxtomail.persistence.entities.MailFilterAbstract; import com.franciaflex.faxtomail.persistence.entities.MailFolder; import com.franciaflex.faxtomail.persistence.entities.MailFolderAbstract; +import com.franciaflex.faxtomail.web.json.HibernateProxyTypeAdapter; +import com.franciaflex.faxtomail.web.json.TopiaEntityAdapter; import com.google.common.collect.HashMultimap; import com.google.common.collect.Maps; import com.google.common.collect.Multimap; @@ -145,6 +147,15 @@ } }); + // Renseigne a gson comment instancier les Impl à partir des interfaces Topia + FaxToMailEntityEnum[] classes = FaxToMailEntityEnum.getContracts(); + for (FaxToMailEntityEnum clazz : classes) { + Class<? extends TopiaEntity> type = clazz.getContract(); + Class<? extends TopiaEntity> implementationClass = clazz.getImplementation(); + TopiaEntityAdapter adapter = new TopiaEntityAdapter(implementationClass); + builder.registerTypeAdapter(type, adapter); + } + // Type adapters : Hibernate proxies builder.registerTypeAdapterFactory(HibernateProxyTypeAdapter.FACTORY); 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-05-22 13:24:24 UTC (rev 88) +++ trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/action/admin/ConfigurationAction.java 2014-05-22 13:25:20 UTC (rev 89) @@ -24,11 +24,13 @@ * #L% */ +import java.lang.reflect.Type; import java.util.List; import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.struts2.convention.annotation.Result; import com.franciaflex.faxtomail.persistence.entities.Action; import com.franciaflex.faxtomail.persistence.entities.Configuration; @@ -39,6 +41,7 @@ import com.franciaflex.faxtomail.services.service.MailFolderService; import com.franciaflex.faxtomail.services.service.ReferentielService; import com.franciaflex.faxtomail.web.FaxToMailActionSupport; +import com.google.gson.reflect.TypeToken; import com.opensymphony.xwork2.Preparable; /** @@ -81,6 +84,7 @@ } @Override + @org.apache.struts2.convention.annotation.Action("configuration-input") public String input() throws Exception { etatAttentes = referentielService.getAllEtatAttente(); mailFolders = mailFolderService.getRootMailFolders(); @@ -88,19 +92,13 @@ } @Override + @org.apache.struts2.convention.annotation.Action(results = { + @Result(type = "redirectAction", params = {"actionName", "configuration-input"})}) public String execute() throws Exception { String result = super.execute(); - /*Map<MailFilter, String> folderIdByFilter = new HashMap<>(); - if (mailFilters != null) { - for (MailFilterUIBean filter : mailFilters) { - String folderId = filter.getMailFolderId(); - folderIdByFilter.put(filter, folderId); - } - } - configurationService.saveCompany(company, mailFolders, folderIdByFilter);*/ - configurationService.saveConfiguration(configuration); + referentielService.saveEtatAttente(etatAttentes); return result; } @@ -125,8 +123,9 @@ return etatAttentes; } - public void setEtatAttentes(List<EtatAttente> etatAttentes) { - this.etatAttentes = etatAttentes; + public void setEtatAttentesJson(String json) { + Type type = new TypeToken<List<EtatAttente>>() {}.getType(); + this.etatAttentes = getGson().fromJson(json, type); } public Map<Action, String> getEtatAttenteActions() { Copied: trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/json/HibernateProxyTypeAdapter.java (from rev 84, trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/HibernateProxyTypeAdapter.java) =================================================================== --- trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/json/HibernateProxyTypeAdapter.java (rev 0) +++ trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/json/HibernateProxyTypeAdapter.java 2014-05-22 13:25:20 UTC (rev 89) @@ -0,0 +1,58 @@ +package com.franciaflex.faxtomail.web.json; + +import java.io.IOException; + +import org.hibernate.Hibernate; +import org.hibernate.proxy.HibernateProxy; + +import com.google.gson.Gson; +import com.google.gson.TypeAdapter; +import com.google.gson.TypeAdapterFactory; +import com.google.gson.reflect.TypeToken; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; + +/** + * This TypeAdapter unproxies Hibernate proxied objects, and serializes them + * through the registered (or default) TypeAdapter of the base class. + * + * Voir : http://stackoverflow.com/a/13525550/2038100 + */ +public class HibernateProxyTypeAdapter extends TypeAdapter<HibernateProxy> { + + public static final TypeAdapterFactory FACTORY = new TypeAdapterFactory() { + @Override + @SuppressWarnings("unchecked") + public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) { + return (HibernateProxy.class.isAssignableFrom(type.getRawType()) ? (TypeAdapter<T>) new HibernateProxyTypeAdapter(gson) : null); + } + }; + private final Gson context; + + private HibernateProxyTypeAdapter(Gson context) { + this.context = context; + } + + @Override + public HibernateProxy read(JsonReader in) throws IOException { + throw new UnsupportedOperationException("Not supported"); + } + + @SuppressWarnings({"rawtypes", "unchecked"}) + @Override + public void write(JsonWriter out, HibernateProxy value) throws IOException { + if (value == null) { + out.nullValue(); + return; + } + // Retrieve the original (not proxy) class + Class<?> baseType = Hibernate.getClass(value); + // Get the TypeAdapter of the original class, to delegate the serialization + TypeAdapter delegate = context.getAdapter(TypeToken.get(baseType)); + // Get a filled instance of the original class + Object unproxiedValue = value.getHibernateLazyInitializer().getImplementation(); + // Serialize the value + delegate.write(out, unproxiedValue); + } + +} Added: trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/json/TopiaEntityAdapter.java =================================================================== --- trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/json/TopiaEntityAdapter.java (rev 0) +++ trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/json/TopiaEntityAdapter.java 2014-05-22 13:25:20 UTC (rev 89) @@ -0,0 +1,38 @@ +package com.franciaflex.faxtomail.web.json; + +import java.lang.reflect.Type; + +import org.nuiton.topia.persistence.TopiaEntity; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonParseException; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; + +/** + * Gson topia entity adaptor that use a specific implementationClass to deserialize a topia entity interface. + * + * @author Eric Chatellier + */ +public class TopiaEntityAdapter implements JsonSerializer<TopiaEntity>, JsonDeserializer<TopiaEntity> { + + protected Class<? extends TopiaEntity> implementationClass; + + public TopiaEntityAdapter(Class<? extends TopiaEntity> implementationClass) { + this.implementationClass = implementationClass; + } + + @Override + public TopiaEntity deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { + TopiaEntity result = jsonDeserializationContext.deserialize(jsonElement, implementationClass); + return result; + } + + @Override + public JsonElement serialize(TopiaEntity object, Type type, JsonSerializationContext jsonSerializationContext) { + JsonElement result = jsonSerializationContext.serialize(object, object.getClass()); + return result; + } +} Property changes on: trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/json/TopiaEntityAdapter.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Modified: trunk/faxtomail-ui-web/src/main/resources/i18n/faxtomail-ui-web_fr_FR.properties =================================================================== --- trunk/faxtomail-ui-web/src/main/resources/i18n/faxtomail-ui-web_fr_FR.properties 2014-05-22 13:24:24 UTC (rev 88) +++ trunk/faxtomail-ui-web/src/main/resources/i18n/faxtomail-ui-web_fr_FR.properties 2014-05-22 13:25:20 UTC (rev 89) @@ -5,6 +5,7 @@ com.franciaflex.faxtomail.persistence.entities.Action.SAVE=Sauver com.franciaflex.faxtomail.persistence.entities.Action.TRANSMIT=Transfer com.franciaflex.faxtomail.persistence.entities.Field.ARCHIVE_DATE=Date d'archive +com.franciaflex.faxtomail.persistence.entities.Field.ATTACHMENT=Pièces jointes com.franciaflex.faxtomail.persistence.entities.Field.CLIENT=Client com.franciaflex.faxtomail.persistence.entities.Field.COMMENT=Commentaire com.franciaflex.faxtomail.persistence.entities.Field.COMPANY_REFERENCE=Référence @@ -13,6 +14,7 @@ com.franciaflex.faxtomail.persistence.entities.Field.EDI_CODE_NUMBER=Code EDI com.franciaflex.faxtomail.persistence.entities.Field.ETAT_ATTENTE=État d'attente com.franciaflex.faxtomail.persistence.entities.Field.FAX=Fax +com.franciaflex.faxtomail.persistence.entities.Field.MAIL_FOLDER=Dossier com.franciaflex.faxtomail.persistence.entities.Field.OBJECT=Objet com.franciaflex.faxtomail.persistence.entities.Field.ORIGINAL_EMAIL=Email original com.franciaflex.faxtomail.persistence.entities.Field.PRIORITY=Priorité Modified: trunk/faxtomail-ui-web/src/main/resources/struts.properties =================================================================== --- trunk/faxtomail-ui-web/src/main/resources/struts.properties 2014-05-22 13:24:24 UTC (rev 88) +++ trunk/faxtomail-ui-web/src/main/resources/struts.properties 2014-05-22 13:25:20 UTC (rev 89) @@ -38,15 +38,3 @@ struts.freemarker.templatesCache=true struts.convention.package.locators.basePackage=com.franciaflex.faxtomail.web.action - -# FIXME bleny 06/12/2013 définir à true ouvre une faille de sécurité, -# voir http://struts.apache.org/release/2.3.x/docs/s2-019.html -# si on laisse la valeur par défaut, l'appli mouline dès qu'on appel une action autre que execute, -# on attend que convention-plugin soit adapté pour pouvoir poser une anot sur les méthodes inputs -struts.enable.DynamicMethodInvocation=true - -# FIXME bleny 09/12/2013 définir à true ouvre une faille de sécurité, -# voir http://struts.apache.org/release/2.3.x/docs/s2-018.html -# ne pas surcharger cette valeur empêche de définir l'action!methode à appeller au submit et on passe toujours le execute, -# ça casse le formulaire de déclaration (quand on veut passer à l'étape suivante (!next) on se retrouve dans le résumé (!execute)) -struts.mapper.action.prefix.enabled=true Copied: trunk/faxtomail-ui-web/src/main/webapp/WEB-INF/content/admin/configuration-input.jsp (from rev 84, trunk/faxtomail-ui-web/src/main/webapp/WEB-INF/content/admin/configuration.jsp) =================================================================== --- trunk/faxtomail-ui-web/src/main/webapp/WEB-INF/content/admin/configuration-input.jsp (rev 0) +++ trunk/faxtomail-ui-web/src/main/webapp/WEB-INF/content/admin/configuration-input.jsp 2014-05-22 13:25:20 UTC (rev 89) @@ -0,0 +1,341 @@ +<%-- + #%L + FaxToMail :: Web + $Id$ + $HeadURL$ + %% + Copyright (C) 2014 Franciaflex, Code Lutin + %% + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public + License along with this program. If not, see + <http://www.gnu.org/licenses/gpl-3.0.html>. + #L% + --%> +<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> +<!DOCTYPE html> +<%@taglib uri="/struts-tags" prefix="s" %> + +<html> + <head> + <title>Configuration</title> + <link rel="stylesheet" type="text/css" href="<s:url value='/webjars/select2/3.4.8/select2.css' />" /> + <link rel="stylesheet" type="text/css" href="<s:url value='/nuiton-js-angular-ui-tree/angular-ui-tree.css' />" /> + <link rel="stylesheet" type="text/css" href="<s:url value='/css/configuration.css' />" /> + + <script type="text/javascript" src="<s:url value='/webjars/select2/3.4.8/select2.min.js' />"></script> + <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='/nuiton-js-angular-ui-tree/angular-ui-tree.js' />"></script> + <script type="text/javascript" src="<s:url value='/js/faxtomail.js' />"></script> + <script type="text/javascript" src="<s:url value='/js/configuration.js' />"></script> + + <script type="text/javascript"> + angular.module('ConfigurationModule', ['FaxToMail', 'ui.tree']) + .value('ConfigurationData', { + 'etatAttentes' : <s:property value="toJson(etatAttentes)" escapeHtml="false"/>, + 'etatAttenteActions': <s:property value="toJson(etatAttenteActions)" escapeHtml="false"/>, + 'etatAttenteFields': <s:property value="toJson(etatAttenteFields)" escapeHtml="false"/>, + 'mailFolders': <s:property value="toJson(mailFolders)" escapeHtml="false"/> + }); + </script> + </head> + + <body> + <div ng-app="ConfigurationModule"> + <!-- navbar --> + <header class="navbar navbar-inverse navbar-static-top bs-docs-nav" id="top" role="banner"> + <div class="container"> + <div class="navbar-header"> + <a href="<s:url value='/' />" class="navbar-brand">FaxToMail</a> + </div> + + </div> + </header> + + <div id="main-container" class="container"> + + <h1 class="page-header">Configuration</h1> + + <s:form id="main_form" action="configuration" ng-controller="ConfigurationController"> + + <s:hidden name="companyId"/> + <s:hidden name="activeTab"/> + + <ul id="tabs" class="nav nav-tabs"> + <li class="active"><a href="#tabs-general" data-toggle="tab">Général</a></li> + <li><a href="#tabs-wait" data-toggle="tab">États d'attente</a></li> + <li><a href="#tabs-tree" data-toggle="tab">Arborescence</a></li> + <li><a href="#tabs-filters" data-toggle="tab">Filtres de mail</a></li> + <!-- <li><a href="#tabs-rights" data-toggle="tab">Droits</a></li> + <li><a href="#tabs-email-accounts" data-toggle="tab">Comptes mails</a></li> --> + </ul> + + <div class="tab-content active" ng-controller="ConfigurationMiscController"> + + <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.ediFolder" + label="Dossier de dépôt du fichier pour l'EDI" + cssClass="span12"/> + + <s:textfield name="configuration.convertToPdfCommand" + label="Ligne de commande de conversion de fichier X en pdf" + cssClass="span12"/> + + <s:textfield name="configuration.openAttachmentCommand" + label="Ligne de commande d'ouverture de fichier non TXT, TIFF, JPEG, PDF" + cssClass="span12"/> + + <!-- 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)--> + + </div> + + <div id="tabs-wait" class="tab-pane" ng-controller="ConfigurationWaitController"> + <input type="hidden" name="etatAttentesJson" value="{{etatAttentes}}" /> + + <div class="row"> + <div class="col-md-4"> + <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}" + ng-click="editEtatAttente(etatAttente)"> + <td>{{etatAttente.label}}</td> + </tr> + </tbody> + </table> + </div> + + <div class="col-md-7" ng-if="selectedEtatAttente"> + Champs obligatoires pour l'état d'attente <strong>{{selectedEtatAttente.label}}</strong>: + <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>: + <label class="checkbox" ng-repeat="(etatAttenteAction,label) in etatAttenteActions"> + <input type="checkbox" ng-checked="selectedEtatAttente.actions.indexOf(etatAttenteAction) != -1" + ng-click="changeEtatAttenteAction(etatAttenteAction)"> {{label}} + </label> + </div> + <div class="col-md-7" ng-if="!selectedEtatAttente"> + <em>Sélectionnez un état d'attente.</em> + </div> + </div> + + </div> + + <div id="tabs-tree" class="tab-pane" ng-controller="ConfigurationTreeController"> + + <div class="row"> + <div class="col-md-4"> + <script type="text/ng-template" id="nodes_renderer.html"> + <div ui-tree-handle ng-click="editMailFolder(mailFolder)" ng-class="{'bg-warning' : mailFolder == selectedMailFolder}"> + <a class="btn btn-success btn-xs" data-nodrag ng-click="toggle(this)"> + <span class="glyphicon" ng-class="{'glyphicon-chevron-right': collapsed, 'glyphicon-chevron-down': !collapsed}"></span> + </a> + {{mailFolder.name}} + <a class="pull-right btn btn-danger btn-xs" data-nodrag ng-click="remove(this)"><span class="glyphicon glyphicon-remove"></span></a> + <a class="pull-right btn btn-primary btn-xs" data-nodrag ng-click="newSubItem(this)" style="margin-right: 8px;"><span class="glyphicon glyphicon-plus"></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'"> + </li> + </ol> + </script> + <div ui-tree="options" data-drag-enabled="false"> + <ol ui-tree-nodes="" ng-model="mailFolders" id="tree-root"> + <li ng-repeat="mailFolder in mailFolders" ui-tree-node ng-include="'nodes_renderer.html'"></li> + </ol> + </div> + </div> + + <div class="col-md-8" ng-if="selectedMailFolder"> + <div class="panel-group" id="accordion"> + + <!-- Liste des chargés de clientèle --> + <div class="panel panel-default"> + <div class="panel-heading"> + <h4 class="panel-title"> + <a data-toggle="collapse" data-parent="#accordion" href="#collapse1"> + Liste des chargés de clientèle {{selectedMailFolder.name}} + </a> + </h4> + </div> + <div id="collapse1" class="panel-collapse collapse"> + <div class="panel-body"> + Toto + </div> + </div> + </div> + + <!-- Liste des emails expéditeur --> + <div class="panel panel-default"> + <div class="panel-heading"> + <h4 class="panel-title"> + <a data-toggle="collapse" data-parent="#accordion" href="#collapse2"> + liste des emails expéditeur + </a> + </h4> + </div> + <div id="collapse2" class="panel-collapse collapse"> + <div class="panel-body"> + Toto + </div> + </div> + </div> + + <!-- Liste des emails expéditeur --> + <div class="panel panel-default"> + <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 + </a> + </h4> + </div> + <div id="collapse3" class="panel-collapse collapse"> + <div class="panel-body"> + Toto + </div> + </div> + </div> + + <!-- Liste des emails expéditeur --> + <div class="panel panel-default"> + <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 + </a> + </h4> + </div> + <div id="collapse4" class="panel-collapse collapse"> + <div class="panel-body"> + Toto + </div> + </div> + </div> + + <!-- Liste des emails expéditeur --> + <div class="panel panel-default"> + <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 + </a> + </h4> + </div> + <div id="collapse5" class="panel-collapse collapse"> + <div class="panel-body"> + Toto + </div> + </div> + </div> + + <!-- configuration des colonnes a afficher --> + <div class="panel panel-default"> + <div class="panel-heading"> + <h4 class="panel-title"> + <a data-toggle="collapse" data-parent="#accordion" href="#collapse6"> + configuration des colonnes a afficher + </a> + </h4> + </div> + <div id="collapse6" class="panel-collapse collapse"> + <div class="panel-body"> + Toto + </div> + </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> + + <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> + + <div class="form-group"> + <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> + </div> + </div> + + <div id="tabs-filters" class="tab-pane" ng-controller="ConfigurationFilterController"> + <table class="table table-hover table-bordered"> + <thead> + <tr> + <th>Filtre</th> + <th>Dossier</th> + </tr> + </thead> + <tbody> + <tr ng-repeat="mailFilter in allMailFilters()"> + <td>{{mailFilter.expression}}</td> + <td>{{mailFilter.fmMailFolder.name}}</td> + </tr> + </tbody> + </table> + + <div role="form"> + <div class="form-group"> + <label for="filterField">Filtre</label> + <input type="text" class="form-control" id="folderField" ng-model="selectedFilter"> + </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> + </div> + </div> + <button type="button" class="btn btn-success" ng-disabled="!selectedFilter || !selectedFolder" ng-click="addNewFilter()"> + <i class="glyphicon glyphicon-plus"></i>Ajouter + </button> + </div> + + <!-- <div class="container form-actions"> + <button type="submit" class="btn btn-primary pull-right">Valider</button> + </div> --> + + <nav class="navbar navbar-default navbar-fixed-bottom"> + <div class="container"> + <button type="submit" class="btn btn-primary navbar-btn pull-right">Valider</button> + </div> + </nav> + </div> + </s:form> + </div> + </div> + </body> +</html> Deleted: trunk/faxtomail-ui-web/src/main/webapp/WEB-INF/content/admin/configuration.jsp =================================================================== --- trunk/faxtomail-ui-web/src/main/webapp/WEB-INF/content/admin/configuration.jsp 2014-05-22 13:24:24 UTC (rev 88) +++ trunk/faxtomail-ui-web/src/main/webapp/WEB-INF/content/admin/configuration.jsp 2014-05-22 13:25:20 UTC (rev 89) @@ -1,340 +0,0 @@ -<%-- - #%L - FaxToMail :: Web - $Id$ - $HeadURL$ - %% - Copyright (C) 2014 Franciaflex, Code Lutin - %% - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as - published by the Free Software Foundation, either version 3 of the - License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public - License along with this program. If not, see - <http://www.gnu.org/licenses/gpl-3.0.html>. - #L% - --%> -<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> -<!DOCTYPE html> -<%@taglib uri="/struts-tags" prefix="s" %> - -<html> - <head> - <title>Configuration</title> - <link rel="stylesheet" type="text/css" href="<s:url value='/webjars/select2/3.4.8/select2.css' />" /> - <link rel="stylesheet" type="text/css" href="<s:url value='/nuiton-js-angular-ui-tree/angular-ui-tree.css' />" /> - <link rel="stylesheet" type="text/css" href="<s:url value='/css/configuration.css' />" /> - - <script type="text/javascript" src="<s:url value='/webjars/select2/3.4.8/select2.min.js' />"></script> - <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='/nuiton-js-angular-ui-tree/angular-ui-tree.js' />"></script> - <script type="text/javascript" src="<s:url value='/js/faxtomail.js' />"></script> - <script type="text/javascript" src="<s:url value='/js/configuration.js' />"></script> - - <script type="text/javascript"> - angular.module('ConfigurationModule', ['FaxToMail', 'ui.tree']) - .value('ConfigurationData', { - 'etatAttentes' : <s:property value="toJson(etatAttentes)" escapeHtml="false"/>, - 'etatAttenteActions': <s:property value="toJson(etatAttenteActions)" escapeHtml="false"/>, - 'etatAttenteFields': <s:property value="toJson(etatAttenteFields)" escapeHtml="false"/>, - 'mailFolders': <s:property value="toJson(mailFolders)" escapeHtml="false"/> - }); - </script> - </head> - - <body> - <div ng-app="ConfigurationModule"> - <!-- navbar --> - <header class="navbar navbar-inverse navbar-static-top bs-docs-nav" id="top" role="banner"> - <div class="container"> - <div class="navbar-header"> - <a href="<s:url value='/' />" class="navbar-brand">FaxToMail</a> - </div> - - </div> - </header> - - <div id="main-container" class="container"> - - <h1 class="page-header">Configuration</h1> - - <s:form id="main_form" ng-controller="ConfigurationController"> - - <s:hidden name="companyId"/> - <s:hidden name="activeTab"/> - - <ul id="tabs" class="nav nav-tabs"> - <li class="active"><a href="#tabs-general" data-toggle="tab">Général</a></li> - <li><a href="#tabs-wait" data-toggle="tab">États d'attente</a></li> - <li><a href="#tabs-tree" data-toggle="tab">Arborescence</a></li> - <li><a href="#tabs-filters" data-toggle="tab">Filtres de mail</a></li> - <!-- <li><a href="#tabs-rights" data-toggle="tab">Droits</a></li> - <li><a href="#tabs-email-accounts" data-toggle="tab">Comptes mails</a></li> --> - </ul> - - <div class="tab-content active" ng-controller="ConfigurationMiscController"> - - <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.ediFolder" - label="Dossier de dépôt du fichier pour l'EDI" - cssClass="span12"/> - - <s:textfield name="configuration.convertToPdfCommand" - label="Ligne de commande de conversion de fichier X en pdf" - cssClass="span12"/> - - <s:textfield name="configuration.openAttachmentCommand" - label="Ligne de commande d'ouverture de fichier non TXT, TIFF, JPEG, PDF" - cssClass="span12"/> - - <!-- 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)--> - - </div> - - <div id="tabs-wait" class="tab-pane" ng-controller="ConfigurationWaitController"> - - <div class="row"> - <div class="col-md-4"> - <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}" - ng-click="editEtatAttente(etatAttente)"> - <td>{{etatAttente.label}}</td> - </tr> - </tbody> - </table> - </div> - - <div class="col-md-7" ng-if="selectedEtatAttente"> - Champs obligatoires pour l'état d'attente <strong>{{selectedEtatAttente.label}}</strong>: - <label class="checkbox" ng-repeat="(etatAttenteField,label) in etatAttenteFields"> - <input type="checkbox" ng-checked="selectedEtatAttente.fields.indexOf(etatAttenteField) != -1" - ng-click="changeEtatAttenteField(etatAttenteAction)"> {{label}} - </label> - Actions autorisées pour l'état d'attente <strong>{{selectedEtatAttente.label}}</strong>: - <label class="checkbox" ng-repeat="(etatAttenteAction,label) in etatAttenteActions"> - <input type="checkbox" ng-checked="selectedEtatAttente.actions.indexOf(etatAttenteAction) != -1" - ng-click="changeEtatAttenteAction(etatAttenteAction)"> {{label}} - </label> - </div> - <div class="col-md-7" ng-if="!selectedEtatAttente"> - <em>Sélectionnez un état d'attente.</em> - </div> - </div> - - </div> - - <div id="tabs-tree" class="tab-pane" ng-controller="ConfigurationTreeController"> - - <div class="row"> - <div class="col-md-4"> - <script type="text/ng-template" id="nodes_renderer.html"> - <div ui-tree-handle ng-click="editMailFolder(mailFolder)" ng-class="{'bg-warning' : mailFolder == selectedMailFolder}"> - <a class="btn btn-success btn-xs" data-nodrag ng-click="toggle(this)"> - <span class="glyphicon" ng-class="{'glyphicon-chevron-right': collapsed, 'glyphicon-chevron-down': !collapsed}"></span> - </a> - {{mailFolder.name}} - <a class="pull-right btn btn-danger btn-xs" data-nodrag ng-click="remove(this)"><span class="glyphicon glyphicon-remove"></span></a> - <a class="pull-right btn btn-primary btn-xs" data-nodrag ng-click="newSubItem(this)" style="margin-right: 8px;"><span class="glyphicon glyphicon-plus"></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'"> - </li> - </ol> - </script> - <div ui-tree="options" data-drag-enabled="false"> - <ol ui-tree-nodes="" ng-model="mailFolders" id="tree-root"> - <li ng-repeat="mailFolder in mailFolders" ui-tree-node ng-include="'nodes_renderer.html'"></li> - </ol> - </div> - </div> - - <div class="col-md-8" ng-if="selectedMailFolder"> - <div class="panel-group" id="accordion"> - - <!-- Liste des chargés de clientèle --> - <div class="panel panel-default"> - <div class="panel-heading"> - <h4 class="panel-title"> - <a data-toggle="collapse" data-parent="#accordion" href="#collapse1"> - Liste des chargés de clientèle {{selectedMailFolder.name}} - </a> - </h4> - </div> - <div id="collapse1" class="panel-collapse collapse"> - <div class="panel-body"> - Toto - </div> - </div> - </div> - - <!-- Liste des emails expéditeur --> - <div class="panel panel-default"> - <div class="panel-heading"> - <h4 class="panel-title"> - <a data-toggle="collapse" data-parent="#accordion" href="#collapse2"> - liste des emails expéditeur - </a> - </h4> - </div> - <div id="collapse2" class="panel-collapse collapse"> - <div class="panel-body"> - Toto - </div> - </div> - </div> - - <!-- Liste des emails expéditeur --> - <div class="panel panel-default"> - <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 - </a> - </h4> - </div> - <div id="collapse3" class="panel-collapse collapse"> - <div class="panel-body"> - Toto - </div> - </div> - </div> - - <!-- Liste des emails expéditeur --> - <div class="panel panel-default"> - <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 - </a> - </h4> - </div> - <div id="collapse4" class="panel-collapse collapse"> - <div class="panel-body"> - Toto - </div> - </div> - </div> - - <!-- Liste des emails expéditeur --> - <div class="panel panel-default"> - <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 - </a> - </h4> - </div> - <div id="collapse5" class="panel-collapse collapse"> - <div class="panel-body"> - Toto - </div> - </div> - </div> - - <!-- configuration des colonnes a afficher --> - <div class="panel panel-default"> - <div class="panel-heading"> - <h4 class="panel-title"> - <a data-toggle="collapse" data-parent="#accordion" href="#collapse6"> - configuration des colonnes a afficher - </a> - </h4> - </div> - <div id="collapse6" class="panel-collapse collapse"> - <div class="panel-body"> - Toto - </div> - </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> - - <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> - - <div class="form-group"> - <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> - </div> - </div> - - <div id="tabs-filters" class="tab-pane" ng-controller="ConfigurationFilterController"> - <table class="table table-hover table-bordered"> - <thead> - <tr> - <th>Filtre</th> - <th>Dossier</th> - </tr> - </thead> - <tbody> - <tr ng-repeat="mailFilter in allMailFilters()"> - <td>{{mailFilter.expression}}</td> - <td>{{mailFilter.fmMailFolder.name}}</td> - </tr> - </tbody> - </table> - - <div role="form"> - <div class="form-group"> - <label for="filterField">Filtre</label> - <input type="text" class="form-control" id="folderField" ng-model="selectedFilter"> - </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> - </div> - </div> - <button type="button" class="btn btn-success" ng-disabled="!selectedFilter || !selectedFolder" ng-click="addNewFilter()"> - <i class="glyphicon glyphicon-plus"></i>Ajouter - </button> - </div> - - <!-- <div class="container form-actions"> - <button type="submit" class="btn btn-primary pull-right">Valider</button> - </div> --> - - <nav class="navbar navbar-default navbar-fixed-bottom"> - <div class="container"> - <button type="submit" class="btn btn-primary navbar-btn pull-right">Valider</button> - </div> - </nav> - </div> - </s:form> - </div> - </div> - </body> -</html>
participants (1)
-
echatellier@users.forge.codelutin.com