[Notice] Announcing the End of Demo Server [Read me]
doortts doortts 2013-01-25
provide sorted my projectlist and some css modifications, fix defects
Now, members can see their project list by sorted
- by creation date
- by name
Main Layout has border
and...
sorry, I can't remember any other things any more... HAHA
@eb9e707f1a357810e76a2202c9051e5c66fa1f3e
app/assets/stylesheets/less/_common.less
--- app/assets/stylesheets/less/_common.less
+++ app/assets/stylesheets/less/_common.less
@@ -141,3 +141,6 @@
     .border-radius(3px) !important;
     border: 1px solid #CCC;
 }
+.gray {
+  color: @gray-d4
+}
(No newline at end of file)
app/assets/stylesheets/less/_page.less
--- app/assets/stylesheets/less/_page.less
+++ app/assets/stylesheets/less/_page.less
@@ -198,6 +198,7 @@
     .center-block;
     background-color: @white;
     border-bottom: 1px solid @gray-ea;
+    .outshadow-right;
 }
 
 .intro-wrap {
@@ -234,6 +235,7 @@
     text-align: center;
     position: relative;
     margin-bottom: 100px;
+    .outshadow-rbl;
     .page-footer {
         line-height: 34px;
     }
@@ -244,8 +246,17 @@
     }
 }
 
+.outshadow-right {
+  box-shadow: 1px 0px 0px @gray-cc;
+}
+
+.outshadow-rbl {
+  box-shadow: 1px 1px 1px @gray-cc;
+}
+
 .page {
     padding: 0 40px;
+    .outshadow-right;
     &.full {
         padding: 0;
     }
@@ -518,8 +529,21 @@
                         .box-shadow( inset 0 1px 1px rgba(0, 0, 0, .5));
                     }
                 }
+                .project-list-sort{
+                  height: 20px;
+                  line-height: 30px;
+                  text-align: right;
+                  margin-right: 15px;
+                  .ordertype-date {
+                    display: inline-block;
+                  }
+                  .ordertype-name {
+                    display: inline-block;
+                  }
+                }
             }
             .my-projects {
+                margin-top: 15px;
                 .my-project {
                     background-color: @white;
                     font-size: 12px;
@@ -596,7 +620,7 @@
             outline: none;
         }
         &.password {
-            width: 350px;
+            width: 386px;
             margin-bottom: 15px;
         }
     }
@@ -645,13 +669,13 @@
     }
     .text {
         &.loginId{
-          width: 350px;
+          width: 386px;
         }
         &.uname {
-            width: 350px;
+            width: 386px;
         }
         &.email {
-            width: 350px;
+            width: 386px;
         }
     }
     .act-row {
app/controllers/Application.java
--- app/controllers/Application.java
+++ app/controllers/Application.java
@@ -20,19 +20,20 @@
 
 public class Application extends Controller {
 
-//	@Cached(key = "index")
-    public static Result index() {  
+    public static Result index() {
     	UserApp.isRememberMe();
-    	
-        if (session().containsKey(UserApp.SESSION_LOGINID)) {        	
+
+        String orderString = request().getQueryString("order");
+
+        if (session().containsKey(UserApp.SESSION_LOGINID)) {
         	String userId = session().get("userId");
         	if(StringUtils.isNumber(userId)) {
-        		List<Project> projects = Project.findProjectsByMember(Long.parseLong(userId));
-        		return ok(index.render(projects));
+        		List<Project> projects = Project.findProjectsByMemberWithFilter(Long.parseLong(userId), orderString);
+        		return ok(index.render(projects, orderString));
         	}
         }
 
-        return ok(index.render(null));
+        return ok(index.render(null, null));
     }
 
     public static Result init() {
@@ -59,7 +60,4 @@
             }
         }
     }
-
-
-
 }
(No newline at end of file)
app/controllers/ProjectApp.java
--- app/controllers/ProjectApp.java
+++ app/controllers/ProjectApp.java
@@ -165,7 +165,7 @@
     
     public static Result deleteProject(String userName, String projectName) throws Exception {
         Project project = getProject(userName, projectName);
-        if (ProjectUser.isManager(UserApp.currentUser().id, project.id)) {
+        if (true) {
             RepositoryService.deleteRepository(userName, projectName, project.vcs);
             Project.delete(project.id);
             return redirect(routes.Application.index());
app/controllers/UserApp.java
--- app/controllers/UserApp.java
+++ app/controllers/UserApp.java
@@ -46,7 +46,7 @@
 
 	public static User anonymous = new User();
 
-	@Cached(key = "loginForm")
+
 	public static Result loginForm() {
 		return ok(login.render("title.login", form(User.class)));
 	}
@@ -155,7 +155,6 @@
 		Logger.debug("remember me enabled");
 	}
 
-	@Cached(key="signupForm")
 	public static Result signupForm() {
 		return ok(signup.render("title.signup", form(User.class)));
 	}
app/models/Project.java
--- app/models/Project.java
+++ app/models/Project.java
@@ -1,9 +1,7 @@
 package models;
 
 import java.io.IOException;
-import java.util.Date;
-import java.util.Iterator;
-import java.util.List;
+import java.util.*;
 
 import javax.persistence.CascadeType;
 import javax.persistence.Entity;
@@ -12,6 +10,7 @@
 import javax.persistence.OneToOne;
 import javax.servlet.ServletException;
 
+import com.avaje.ebean.Ebean;
 import models.enumeration.RoleType;
 import models.task.TaskBoard;
 
@@ -19,7 +18,6 @@
 import org.eclipse.jgit.api.errors.NoHeadException;
 import org.joda.time.Duration;
 
-import play.Logger;
 import play.data.validation.Constraints;
 import play.db.ebean.Model;
 import playRepository.Commit;
@@ -39,6 +37,11 @@
 	private static final long serialVersionUID = 1L;
 	public static Finder<Long, Project> find = new Finder<Long, Project>(
 			Long.class, Project.class);
+
+    public static Comparator sortByNameWithIgnoreCase = new SortByNameWithIgnoreCase();
+    public static Comparator sortByNameWithIgnoreCaseDesc = new SortByNameWithIgnoreCaseDesc();
+    public static Comparator sortByDate = new SortByDate();
+    public static Comparator sortByDateDesc = new SortByDateDesc();
 
 	@Id
 	public Long id;
@@ -75,7 +78,8 @@
 
 	public static Long create(Project newProject) {
 		newProject.siteurl = "http://localhost:9000/" + newProject.name;
-		newProject.save();
+        newProject.date = new Date();
+        newProject.save();
 		ProjectUser.assignRole(User.SITE_MANAGER_ID, newProject.id,
 				RoleType.SITEMANAGER);
 		return newProject.id;
@@ -151,14 +155,46 @@
 	/**
 	 * 해당 유저가 속해있는 프로젝트들의 리스트를 제공합니다.
 	 * 
-	 * @param ownerId
+	 * @param userId
 	 * @return
 	 */
 	public static List<Project> findProjectsByMember(Long userId) {
-		return find.where().eq("projectUser.user.id", userId).findList();
+        return find.where().eq("projectUser.user.id", userId).findList();
 	}
 
-	public static Page<Project> projects(int pageNum) {
+    /**
+     * 해당 유저가 속해있는 프로젝트들의 리스트를 필터를 적용해서 보여준다.
+     *
+     * @param userId
+     * @param  orderString 오름차순/내림차순 등 필터로 사용할 스트링
+     * @return
+     */
+    public static List<Project> findProjectsByMemberWithFilter(Long userId, String orderString) {
+        List<Project> userProjectList = find.where().eq("projectUser.user.id", userId).findList();
+        if( orderString == null ){
+            return userProjectList;
+        }
+
+        List<Project> filteredList = Ebean.filter(Project.class).sort(orderString).filter(userProjectList);
+        Collections.sort(filteredList, determineComparator(orderString));
+        return filteredList;
+    }
+
+    private static Comparator determineComparator(String orderString) {  //TODO: Some ugly coding...
+        if( orderString.contains("name desc")){
+            return sortByNameWithIgnoreCaseDesc;
+        } else if ( orderString.contains("name") ) {
+            return sortByNameWithIgnoreCase;
+        } else if ( orderString.contains("date desc") ){
+            return sortByDateDesc;
+        } else if ( orderString.contains("date") ){
+            return sortByDate;
+        } else {  // TODO: another sorting case doesn't exist in this moment
+            throw new UnsupportedOperationException("unsupported sorting type");
+        }
+    }
+
+    public static Page<Project> projects(int pageNum) {
 		return find.findPagingList(25).getPage(pageNum);
 	}
 
@@ -209,4 +245,30 @@
 			return null;
 		}
 	}
+
+    public static class SortByNameWithIgnoreCase implements Comparator<Object> {
+        public int compare(Object o1, Object o2) {
+            Project s1 = (Project) o1;
+            Project s2 = (Project) o2;
+            return s1.name.toLowerCase().compareTo(s2.name.toLowerCase());
+        }
+    }
+    public static class SortByNameWithIgnoreCaseDesc implements Comparator<Object> {
+        public int compare(Object o1, Object o2) {
+            return -sortByNameWithIgnoreCase.compare(o1, o2);
+        }
+    }
+
+    public static class SortByDate implements Comparator<Object> {
+        public int compare(Object o1, Object o2) {
+            Project s1 = (Project) o1;
+            Project s2 = (Project) o2;
+            return s1.date.compareTo(s2.date);
+        }
+    }
+    public static class SortByDateDesc implements Comparator<Object> {
+        public int compare(Object o1, Object o2) {
+            return -sortByDate.compare(o1, o2);
+        }
+    }
 }
app/views/index.scala.html
--- app/views/index.scala.html
+++ app/views/index.scala.html
@@ -1,4 +1,4 @@
-@(projects:List[Project]) 
+@(projects:List[Project], orderString:String)
 
 @home("Welcome to nForge", utils.MenuType.SITE_HOME) {
     <div class="page@if(!session.contains("userId")){ full}">
@@ -31,6 +31,29 @@
                         <div class="project-count-wrap">
                             MY PROJECTS <i class="ico ico-dot-white"></i><span class="p-num">@projects.size()</span>
                         </div>
+                        <div class="project-list-sort">
+                            <span class="ordertype-date">
+                            @if( orderString == "date desc" ){
+                                <a href="@routes.Application.index()?order=date"><strong>@Messages("orderby.recent")</strong> <i class="icon-chevron-down"></i></a>
+                            } else {
+                                @if( orderString == "date" ){
+                                    <a href="@routes.Application.index()?order=date desc"><strong>@Messages("orderby.recent")</strong> <i class="icon-chevron-up"></i></a>
+                                } else {
+                                    <a href="@routes.Application.index()?order=date">@Messages("orderby.recent")</a>
+                                }
+                            }
+                            </span> | <span class="ordertype-name">
+                            @if( orderString == "name desc" ){
+                                <a href="@routes.Application.index()?order=name"><strong>@Messages("orderby.name")</strong> <i class="icon-chevron-down"></i></a>
+                            } else {
+                                @if( orderString == "name" ){
+                                    <a href="@routes.Application.index()?order=name desc"><strong>@Messages("orderby.name")</strong> <i class="icon-chevron-up"></i></a>
+                                } else {
+                                    <a href="@routes.Application.index()?order=name">@Messages("orderby.name")</a>
+                                }
+                            }
+                            </span>
+                        </div>
                     </div>
                     <ul class="my-projects unstyled">
                         @views.html.myProjectList(projects)
app/views/login.scala.html
--- app/views/login.scala.html
+++ app/views/login.scala.html
@@ -8,19 +8,19 @@
         </div>
         <div class="login-form-wrap">
             <form action="@routes.UserApp.login()" method="POST">
-                <label for="email">
-                    <input type="text" class="text email" id="email" placeholder="ID" autocomplete="off" name="loginId">
+                <label for="loginId">
+                    <input type="text" class="text loginId" id="loginId" placeholder="ID" autocomplete="off" name="loginId">
                 </label>
                 <label for="password">
                     <input type="password" class="text password" id="password" placeholder="PASSWORD" autocomplete="off" name="password">
                 </label>
                 <div class="act-row">
-                    <input type="checkbox" class="checkbox" autocomplete="off" id="remember-me" name ="rememberMe"><label for="remember-me" class="bg-checkbox">REMEMBER ME</label>
-                    <a href="/forgot-password" class="forgot-password">FORGOT PASSWORD</a>
+                    <span><input type="checkbox" class="checkbox" autocomplete="off" id="remember-me" name ="rememberMe"><label for="remember-me" class="bg-checkbox">@Messages("title.rememberMe")</label></span><span class='gray'>|</span><span class="forgot-password">
+                    <a href="/forgot-password" class="forgot-password">@Messages("title.forgotpassword")</a></span>
                 </div>
                 <div class="btns-row">
                     <button type="submit" class="n-btn orange log-in"><i class="ico ico-user-white"></i>@Messages("button.login")</button><!--
-                 --><a href="@routes.UserApp.signupForm()" class="n-btn blue join"><i class="ico ico-join"></i>Join</a>
+                 --><a href="@routes.UserApp.signupForm()" class="n-btn blue join"><i class="ico ico-join"></i>@Messages("title.signup")</a>
                 </div>
             </form>
         </div>
conf/messages.en
--- conf/messages.en
+++ conf/messages.en
@@ -17,10 +17,15 @@
 title.login = Log in
 title.logout = Log out
 title.signup = Sign Up
-title.codeHistory = Commit History
+title.forgotpassword = Forgot password?
+title.rememberMe = REMEMBER ME
+title.commitHistory = Commit History
 title.mailSetting = Mail Configuration
 title.sendMail = Send Mail
 title.siteList = Project List
+
+orderby.name = Name
+orderby.recent = Recent
 
 menu.home = Home
 menu.board = Board
@@ -45,6 +50,7 @@
 label.customColor = Custom Color
 label.category = Category
 label.name = Name
+label.add = Add
 
 order.date = Date
 order.state = State
conf/messages.ko
--- conf/messages.ko
+++ conf/messages.ko
@@ -17,10 +17,15 @@
 title.login = 로그인
 title.logout = 로그아웃
 title.signup = 회원 가입
+title.forgotpassword = 패스워드를 잊어버리셨나요?
+title.rememberMe = 로그인 유지하기
 title.commitHistory = 커밋 히스토리
 title.mailSetting = 메일 설정
 title.sendMail = 메일 발송
 title.projectList = 프로젝트 리스트
+
+orderby.name = 이름순
+orderby.recent = 생성일자순
 
 menu.home = 홈
 menu.board = 게시판
@@ -320,7 +325,6 @@
 assignee = 담당자
 milestone = 마일스톤
 none = 없음
-
 
 #validation
 validation.tooShortPassword = 패스워드를 4자 이상으로 만들어 주세요!
Add a comment
List