r13 - in trunk: echobase-services/src/main/java/fr/ifremer/echobase/services echobase-ui/src/main/java/fr/ifremer/echobase/ui echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions echobase-ui/src/main/java/fr/ifremer/echobase/ui/validators echobase-ui/src/main/resources/config echobase-ui/src/main/resources/i18n echobase-ui/src/main/webapp/WEB-INF echobase-ui/src/main/webapp/WEB-INF/decorators echobase-ui/src/main/webapp/WEB-INF/includes echobase-ui/src/main/webapp/WEB-INF/jsp/user
Author: sletellier Date: 2011-11-07 11:30:22 +0100 (Mon, 07 Nov 2011) New Revision: 13 Url: http://forge.codelutin.com/repositories/revision/echobase/13 Log: - Dont return dtos in service - Clean project - Fix traductions - Debug user page - Remove hasActionError and hasActionMessages Modified: trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/AbstractEchoBaseService.java trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/UserService.java trunk/echobase-ui/src/main/java/fr/ifremer/echobase/ui/ApplicationListener.java trunk/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/LoginAction.java trunk/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/UserAction.java trunk/echobase-ui/src/main/java/fr/ifremer/echobase/ui/validators/LoginValidator.java trunk/echobase-ui/src/main/resources/config/struts-user.xml trunk/echobase-ui/src/main/resources/i18n/echobase-ui_fr_FR.properties trunk/echobase-ui/src/main/webapp/WEB-INF/decorators/layout-default.jsp trunk/echobase-ui/src/main/webapp/WEB-INF/includes/header.jsp trunk/echobase-ui/src/main/webapp/WEB-INF/includes/menu.jsp trunk/echobase-ui/src/main/webapp/WEB-INF/jsp/user/users.jsp trunk/echobase-ui/src/main/webapp/WEB-INF/web.xml Modified: trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/AbstractEchoBaseService.java =================================================================== --- trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/AbstractEchoBaseService.java 2011-11-04 14:01:05 UTC (rev 12) +++ trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/AbstractEchoBaseService.java 2011-11-07 10:30:22 UTC (rev 13) @@ -1,3 +1,26 @@ +/* + * #%L + * EchoBase :: Services + * + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2011 Ifremer, Codelutin + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero 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 Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * #L% + */ package fr.ifremer.echobase.services; import org.nuiton.topia.TopiaContext; Modified: trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/UserService.java =================================================================== --- trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/UserService.java 2011-11-04 14:01:05 UTC (rev 12) +++ trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/UserService.java 2011-11-07 10:30:22 UTC (rev 13) @@ -1,3 +1,26 @@ +/* + * #%L + * EchoBase :: Services + * + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2011 Ifremer, Codelutin + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero 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 Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * #L% + */ package fr.ifremer.echobase.services; import com.google.common.base.Preconditions; @@ -10,7 +33,6 @@ import org.nuiton.topia.TopiaException; import org.nuiton.util.StringUtil; -import java.util.ArrayList; import java.util.List; /** @author sletellier */ @@ -20,26 +42,21 @@ return EchoBaseDAOHelper.getEchoBaseUserDAO(getTransaction()); } - public List<EchoBaseUserDTO> getUsers() throws EchoBaseTechnicalException { + public List<EchoBaseUser> getUsers() throws EchoBaseTechnicalException { try { List<EchoBaseUser> users = getDAO().findAll(); - // Fill dtos - List<EchoBaseUserDTO> usersDtos = new ArrayList<EchoBaseUserDTO>(users.size()); - for (EchoBaseUser user : users) { - usersDtos.add(user.toDTO()); - } - return usersDtos; + return users; } catch (TopiaException eee) { throw new EchoBaseTechnicalException(eee); } } - public EchoBaseUserDTO getUserById(String topiaId) { + public EchoBaseUser getUserById(String topiaId) { try { EchoBaseUser user = getDAO().findByTopiaId(topiaId); - return user.toDTO(); + return user; } catch (TopiaException eee) { throw new EchoBaseTechnicalException(eee); } @@ -82,18 +99,18 @@ } } - public EchoBaseUserDTO getUserByEmail(String email) { + public EchoBaseUser getUserByEmail(String email) { Preconditions.checkNotNull(email); try { EchoBaseUserDAO dao = getDAO(); EchoBaseUser user = dao.findByEmail(email); - return user.toDTO(); + return user; } catch (TopiaException eee) { throw new EchoBaseTechnicalException(eee); } } - public boolean checkPassword(EchoBaseUserDTO user, + public boolean checkPassword(EchoBaseUser user, String password) throws Exception { String s = encodePassword(password); return s.equals(user.getPassword()); Modified: trunk/echobase-ui/src/main/java/fr/ifremer/echobase/ui/ApplicationListener.java =================================================================== --- trunk/echobase-ui/src/main/java/fr/ifremer/echobase/ui/ApplicationListener.java 2011-11-04 14:01:05 UTC (rev 12) +++ trunk/echobase-ui/src/main/java/fr/ifremer/echobase/ui/ApplicationListener.java 2011-11-07 10:30:22 UTC (rev 13) @@ -27,6 +27,7 @@ import fr.ifremer.echobase.EchoBaseConfiguration; import fr.ifremer.echobase.EchoBaseTechnicalException; import fr.ifremer.echobase.EchoBaseTopiaRootContextSupplierFactory; +import fr.ifremer.echobase.entities.EchoBaseUser; import fr.ifremer.echobase.entities.EchoBaseUserDTO; import fr.ifremer.echobase.entities.EchoBaseUserDTOImpl; import fr.ifremer.echobase.entities.EchoBaseUserImpl; @@ -181,7 +182,7 @@ * Creates the adminsitrator ({@code admin/admin}) on the internal * database. * - * @param configuration + * @param configuration EchoBase configuration * @throws TopiaException if could not create the user. */ protected void createAdminUser(EchoBaseConfiguration configuration) throws TopiaException { @@ -199,7 +200,7 @@ UserService service = serviceFactory.newService(UserService.class, serviceContext); - List<EchoBaseUserDTO> users = service.getUsers(); + List<EchoBaseUser> users = service.getUsers(); if (CollectionUtils.isEmpty(users)) { Modified: trunk/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/LoginAction.java =================================================================== --- trunk/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/LoginAction.java 2011-11-04 14:01:05 UTC (rev 12) +++ trunk/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/LoginAction.java 2011-11-07 10:30:22 UTC (rev 13) @@ -25,8 +25,7 @@ import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.interceptor.I18nInterceptor; -import fr.ifremer.echobase.entities.EchoBaseUserDTO; -import fr.ifremer.echobase.entities.EchoBaseUserImpl; +import fr.ifremer.echobase.entities.EchoBaseUser; import fr.ifremer.echobase.services.UserService; import fr.ifremer.echobase.ui.EchoBaseSession; import org.apache.commons.logging.Log; @@ -91,14 +90,12 @@ public String doLogin() throws Exception { - EchoBaseUserDTO user = getUserService().getUserByEmail(email); + EchoBaseUser user = getUserService().getUserByEmail(email); EchoBaseSession userSession = getEchoBaseSession(); // user is authorized, keep it in his echoBaseSession - EchoBaseUserImpl echoBaseUser = new EchoBaseUserImpl(); - echoBaseUser.fromDTO(user); - userSession.setEchoBaseUser(echoBaseUser); + userSession.setEchoBaseUser(user); // add locale in echoBaseSession if required Object o = session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE); Modified: trunk/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/UserAction.java =================================================================== --- trunk/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/UserAction.java 2011-11-04 14:01:05 UTC (rev 12) +++ trunk/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/UserAction.java 2011-11-07 10:30:22 UTC (rev 13) @@ -1,8 +1,16 @@ package fr.ifremer.echobase.ui.actions; +import fr.ifremer.echobase.EchoBaseTechnicalException; +import fr.ifremer.echobase.entities.EchoBaseUser; +import fr.ifremer.echobase.entities.EchoBaseUserDAO; import fr.ifremer.echobase.entities.EchoBaseUserDTO; import fr.ifremer.echobase.services.UserService; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.topia.TopiaException; +import java.util.ArrayList; import java.util.List; /** @@ -12,8 +20,113 @@ private static final long serialVersionUID = 1L; + protected static final Log log = LogFactory.getLog(UserAction.class); + protected transient UserService service; + // Grid model + protected List<EchoBaseUserDTO> userList; + protected EchoBaseUserDTO selectedUserDto; + + //get how many rows we want to have into the grid - rowNum attribute in the grid + protected Integer rows = 0; + //Get the requested page. By default grid sets this to 1. + protected Integer page = 0; + // sorting order - asc or desc + protected String sord; + // get index row - i.e. user click to sort. + protected String sidx; + // Search Field + protected String searchField; + // The Search String + protected String searchString; + // he Search Operation ['eq','ne','lt','le','gt','ge','bw','bn','in','ni','ew','en','cn','nc'] + protected String searchOper; + // Your Total Pages + protected Integer total = 0; + // All Record + protected Integer records = 0; + + public EchoBaseUserDTO getSelectedUserDto() { + return selectedUserDto; + } + + public void setSelectedUserDto(EchoBaseUserDTO selectedUserDto) { + this.selectedUserDto = selectedUserDto; + } + + public Integer getRows() { + return rows; + } + + public void setRows(Integer rows) { + this.rows = rows; + } + + public Integer getPage() { + return page; + } + + public void setPage(Integer page) { + this.page = page; + } + + public String getSord() { + return sord; + } + + public void setSord(String sord) { + this.sord = sord; + } + + public String getSidx() { + return sidx; + } + + public void setSidx(String sidx) { + this.sidx = sidx; + } + + public String getSearchField() { + return searchField; + } + + public void setSearchField(String searchField) { + this.searchField = searchField; + } + + public String getSearchString() { + return searchString; + } + + public void setSearchString(String searchString) { + this.searchString = searchString; + } + + public String getSearchOper() { + return searchOper; + } + + public void setSearchOper(String searchOper) { + this.searchOper = searchOper; + } + + public Integer getTotal() { + return total; + } + + public void setTotal(Integer total) { + this.total = total; + } + + public Integer getRecords() { + return records; + } + + public void setRecords(Integer records) { + this.records = records; + } + protected UserService getService() { if (service == null) { service = newService(UserService.class); @@ -22,14 +135,42 @@ } public List<EchoBaseUserDTO> getUserList() { - return getService().getUsers(); + return userList; } - public void createOrUpdate(EchoBaseUserDTO userDTO) { - getService().createOrUpdate(userDTO); + public void setUserList(List<EchoBaseUserDTO> userList) { + this.userList = userList; } - public void delete(EchoBaseUserDTO userDTO) { - getService().delete(userDTO); + @Override + public String execute() throws Exception { + + List<EchoBaseUser> users = getService().getUsers(); + + // Fill dtos + int size = users.size(); + setRecords(size); + + //calculate the total pages for the query + setTotal((int) Math.ceil((double) getRecords() / (double) getRows())); + List<EchoBaseUserDTO> userList = new ArrayList<EchoBaseUserDTO>(size); + for (EchoBaseUser user : users) { + userList.add(user.toDTO()); + } + log.info(size + " users founds"); + + setUserList(userList); + + return super.execute(); } + + public String createOrUpdate() throws Exception { + getService().createOrUpdate(selectedUserDto); + return SUCCESS; + } + + public String delete() throws Exception { + getService().delete(selectedUserDto); + return SUCCESS; + } } Modified: trunk/echobase-ui/src/main/java/fr/ifremer/echobase/ui/validators/LoginValidator.java =================================================================== --- trunk/echobase-ui/src/main/java/fr/ifremer/echobase/ui/validators/LoginValidator.java 2011-11-04 14:01:05 UTC (rev 12) +++ trunk/echobase-ui/src/main/java/fr/ifremer/echobase/ui/validators/LoginValidator.java 2011-11-07 10:30:22 UTC (rev 13) @@ -24,6 +24,7 @@ package fr.ifremer.echobase.ui.validators; import com.opensymphony.xwork2.validator.ValidationException; +import fr.ifremer.echobase.entities.EchoBaseUser; import fr.ifremer.echobase.entities.EchoBaseUserDTO; import fr.ifremer.echobase.services.UserService; @@ -50,7 +51,7 @@ try { // check in db that user is ok - EchoBaseUserDTO user = userService.getUserByEmail(login); + EchoBaseUser user = userService.getUserByEmail(login); if (user == null) { Modified: trunk/echobase-ui/src/main/resources/config/struts-user.xml =================================================================== --- trunk/echobase-ui/src/main/resources/config/struts-user.xml 2011-11-04 14:01:05 UTC (rev 12) +++ trunk/echobase-ui/src/main/resources/config/struts-user.xml 2011-11-07 10:30:22 UTC (rev 13) @@ -53,25 +53,32 @@ <interceptor-ref name="basicStack"/> </action> - <!-- get lists of users --> + <!-- Display lists of users --> <action name="userList" class="fr.ifremer.echobase.ui.actions.UserAction"> <interceptor-ref name="basicStackLoggued"/> <interceptor-ref name="checkUserIsAdmin"/> - <result name="input">/WEB-INF/jsp/user/users.jsp</result> + <result name="success">/WEB-INF/jsp/user/users.jsp</result> </action> + <!-- get lists of users --> + <action name="userListData" class="fr.ifremer.echobase.ui.actions.UserAction"> + <interceptor-ref name="basicStackLoggued"/> + <interceptor-ref name="checkUserIsAdmin"/> + <result name="success" type="json"/> + </action> + <!-- update or create (if not exist) user --> - <action name="createOrUpdate" class="fr.ifremer.echobase.ui.actions.UserAction"> + <action name="createOrUpdate" method="createOrUpdate" class="fr.ifremer.echobase.ui.actions.UserAction"> <interceptor-ref name="basicStackLoggued"/> <interceptor-ref name="checkUserIsAdmin"/> - <result name="input">/WEB-INF/jsp/user/users.jsp</result> + <result name="success">/WEB-INF/jsp/user/users.jsp</result> </action> <!-- delete user --> - <action name="delete" class="fr.ifremer.echobase.ui.actions.UserAction"> + <action name="delete" method="delete" class="fr.ifremer.echobase.ui.actions.UserAction"> <interceptor-ref name="basicStackLoggued"/> <interceptor-ref name="checkUserIsAdmin"/> - <result name="input">/WEB-INF/jsp/user/users.jsp</result> + <result name="success">/WEB-INF/jsp/user/users.jsp</result> </action> </package> Modified: trunk/echobase-ui/src/main/resources/i18n/echobase-ui_fr_FR.properties =================================================================== --- trunk/echobase-ui/src/main/resources/i18n/echobase-ui_fr_FR.properties 2011-11-04 14:01:05 UTC (rev 12) +++ trunk/echobase-ui/src/main/resources/i18n/echobase-ui_fr_FR.properties 2011-11-07 10:30:22 UTC (rev 13) @@ -13,6 +13,7 @@ echobase.label.locale.english=Anglais echobase.label.locale.french=Français echobase.label.login=Connection +echobase.label.user.login=Utilisateur \: %s echobase.label.welcome=Bienvenue echobase.menu.export=Exports echobase.menu.import=Imports Modified: trunk/echobase-ui/src/main/webapp/WEB-INF/decorators/layout-default.jsp =================================================================== --- trunk/echobase-ui/src/main/webapp/WEB-INF/decorators/layout-default.jsp 2011-11-04 14:01:05 UTC (rev 12) +++ trunk/echobase-ui/src/main/webapp/WEB-INF/decorators/layout-default.jsp 2011-11-07 10:30:22 UTC (rev 13) @@ -41,17 +41,18 @@ <div id="body"> - <s:if test="hasActionMessages()"> - <div class="info_success"> - <s:actionmessage/> - </div> - </s:if> + <%-- TODO sletellier 20111104 : add this --%> + <%--<s:if test="hasActionMessages()">--%> + <%--<div class="info_success">--%> + <%--<s:actionmessage/>--%> + <%--</div>--%> + <%--</s:if>--%> - <s:if test="hasActionErrors()"> - <div class="info_error"> - <s:actionerror/> - </div> - </s:if> + <%--<s:if test="hasActionErrors()">--%> + <%--<div class="info_error">--%> + <%--<s:actionerror/>--%> + <%--</div>--%> + <%--</s:if>--%> <d:body/> </div> Modified: trunk/echobase-ui/src/main/webapp/WEB-INF/includes/header.jsp =================================================================== --- trunk/echobase-ui/src/main/webapp/WEB-INF/includes/header.jsp 2011-11-04 14:01:05 UTC (rev 12) +++ trunk/echobase-ui/src/main/webapp/WEB-INF/includes/header.jsp 2011-11-07 10:30:22 UTC (rev 13) @@ -32,9 +32,9 @@ <div id='headerRight'> <div> <s:text name="echobase.label.user.login"> - <%--<s:param>--%> - <%--<s:property value="#session.echoBaseSession.echoBaseUser.login"/>--%> - <%--</s:param>--%> + <s:param> + <s:property value="#session.echoBaseSession.echoBaseUser.email"/> + </s:param> </s:text> <ul> <li> @@ -45,9 +45,9 @@ </ul> </div> <br/> - <%@ include file="menu.jsp" %> - <%@ include file="i18n.jsp" %> + <%@ include file="i18n.jsp" %> <br/> </div> + <%@ include file="menu.jsp" %> </div> <hr/> Modified: trunk/echobase-ui/src/main/webapp/WEB-INF/includes/menu.jsp =================================================================== --- trunk/echobase-ui/src/main/webapp/WEB-INF/includes/menu.jsp 2011-11-04 14:01:05 UTC (rev 12) +++ trunk/echobase-ui/src/main/webapp/WEB-INF/includes/menu.jsp 2011-11-07 10:30:22 UTC (rev 13) @@ -36,7 +36,7 @@ <%--<s:if--%> <%--test="%{userIsAdmin}">--%> <li> - <s:a namespace="admin" action="users"><s:text name="echobase.menu.users"/></s:a> + <s:a action="userList" namespace="/user"><s:text name="echobase.menu.users"/></s:a> </li> <%--</s:if>--%> </ul> Modified: trunk/echobase-ui/src/main/webapp/WEB-INF/jsp/user/users.jsp =================================================================== --- trunk/echobase-ui/src/main/webapp/WEB-INF/jsp/user/users.jsp 2011-11-04 14:01:05 UTC (rev 12) +++ trunk/echobase-ui/src/main/webapp/WEB-INF/jsp/user/users.jsp 2011-11-07 10:30:22 UTC (rev 13) @@ -21,7 +21,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #L% --%> -<%@page contentType="text/html" pageEncoding="UTF-8" %> +<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <%@ taglib prefix="sjg" uri="/struts-jquery-grid-tags" %> @@ -32,14 +32,15 @@ <hr/> -<s:url id="userListUrl" namespace="/users" action="userList"/> -<s:url id="saveUrl" namespace="/users" action="createOrUpdate" /> +<s:url id="userListUrl" namespace="/user" action="userListData"/> +<s:url id="saveUrl" namespace="/user" action="createOrUpdate"/> <sjg:grid id="usersList" caption='%{getText("echobase.user.gridTitle")}' dataType="json" + title="%{getText('echobase.user.gridTitle')}" href="%{userListUrl}" - pager="true" + pager="false" navigator="true" navigatorAddOptions="{ height:280, @@ -64,9 +65,7 @@ return isError(response.responseText); } }" - gridModel="gridModel" - rowList="10,100,1000" - rowNum="10" + gridModel="userList" editurl="%{saveUrl}" editinline="false" rownumbers="true" @@ -75,6 +74,7 @@ viewrecords="true"> <sjg:gridColumn name="id" + title='id' key="true" hidden="true"/> @@ -89,7 +89,7 @@ editable="true" edittype="password" hidden="true"/> - + gridModel <sjg:gridColumn name="admin" title='%{getText("echobase.common.admin")}' sortable="true" Modified: trunk/echobase-ui/src/main/webapp/WEB-INF/web.xml =================================================================== --- trunk/echobase-ui/src/main/webapp/WEB-INF/web.xml 2011-11-04 14:01:05 UTC (rev 12) +++ trunk/echobase-ui/src/main/webapp/WEB-INF/web.xml 2011-11-07 10:30:22 UTC (rev 13) @@ -30,16 +30,14 @@ <display-name>EchoBase</display-name> <filter> - <filter-name>struts-prepare</filter-name> - <filter-class> - org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter - </filter-class> + <filter-name>topiaCloseTransaction</filter-name> + <filter-class>org.nuiton.web.struts2.filter.CloseTopiaTransactionFilter</filter-class> </filter> <filter> - <filter-name>struts-execute</filter-name> + <filter-name>struts-prepare</filter-name> <filter-class> - org.apache.struts2.dispatcher.ng.filter.StrutsExecuteFilter + org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter </filter-class> </filter> @@ -49,27 +47,29 @@ </filter> <filter> - <filter-name>topiaCloseTransaction</filter-name> - <filter-class>org.nuiton.web.struts2.filter.CloseTopiaTransactionFilter</filter-class> + <filter-name>struts-execute</filter-name> + <filter-class> + org.apache.struts2.dispatcher.ng.filter.StrutsExecuteFilter + </filter-class> </filter> <filter-mapping> - <filter-name>struts-prepare</filter-name> + <filter-name>topiaCloseTransaction</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> - <filter-name>sitemesh</filter-name> + <filter-name>struts-prepare</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> - <filter-name>struts-execute</filter-name> + <filter-name>sitemesh</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> - <filter-name>topiaCloseTransaction</filter-name> + <filter-name>struts-execute</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
participants (1)
-
sletellier@users.forge.codelutin.com