[Notice] Announcing the End of Demo Server [Read me]
Jihan Kim 2013-05-06
make filter css and displaying condition to identically. board list CSS has enhanced.
@15a6f8b1f9c124ecbd11e42bda36dd3cbf22ac63
app/assets/stylesheets/less/_page.less
--- app/assets/stylesheets/less/_page.less
+++ app/assets/stylesheets/less/_page.less
@@ -1694,12 +1694,12 @@
     
     .milestone {
         border-bottom: 1px solid @gray-d4;
-        padding: 15px 30px;
+        padding: 15px 0px; /* 15px 30px;*/
         overflow: hidden;
         &:last-of-type { border-bottom:none; }
         
         .infos {
-            width: 660px;
+            width: 700px; /*660px;*/
             float: left;
             .contributors {
                 margin: 0;
@@ -1717,33 +1717,36 @@
             }
             .meta-info {
                 margin:5px 0 10px;
-                .sp {
-                    margin: 0 5px;
-                    color:#E4E4E4;
-                }
-                .due-date {
-                    color: #666; /*999;*/
-                }
+                .title    { font-size:15px; font-weight:bold; }
+                .sp       { margin: 0 5px; color:#E4E4E4; }
+                .due-date { color: #666; /*999;*/ }
             }
+            
             .progress-wrap {
                 overflow: hidden;
                 color: #999;
                 font-size: 11px;
             }
+            
             .desc {
                 font-size: 11px;
                 margin-top: 15px;
                 padding: 15px;
-                .border-radius(2px);
                 background-color: #EBEBEB;
                 border-top:1px solid #D3D3D3;
+                .border-radius(2px);
+            }
+            
+            .actrow {
+                text-align:right;
+                padding-top:10px;
             }
         }
+        
         .completion-rate {
-            margin-left: 700px;/*660px;*/
+            margin-left: 730px;/*700px;*/
             text-align: center;
             font-size: 56px;
-            /*.helvetic-light;*/
             line-height: 2.8; /*1.3;*/
             letter-spacing: -5px;
             &.done {
@@ -1962,27 +1965,22 @@
 }
 
 .board-list {
-    margin: 0;
-    padding: 0;
-    list-style: none;
     .board {
         border-bottom: 1px solid @gray-d4;
         padding: 15px 20px;
+        
         > div {
             display: table-cell;
             vertical-align: top;
         }
-        .num {
-            width: 35px;
-            color: #B2B2B2;
-        }
+        .num { width: 35px; color: #B2B2B2; }
+        
         .attach-wrap {
             width: 35px;
             text-align: center;
-            .ico {
-                margin-top: 5px;
-            }
+            .ico { margin-top: 5px; }
         }
+        
         .contents {
             width: 590px;
             padding-right: 90px;
@@ -1994,26 +1992,27 @@
                 line-height: 14px;
                 font-size: 11px;
                 color: #999;
-                .author {
-                    color: #696969;
-                }
+                .author { color: #696969; }
             }
         }
+        
         .right-panel {
             width: 90px;
             .comment-wrap {
                 float: left;
                 margin-top: 7px;
-                .ico {
-                    vertical-align: bottom;
-                    margin-right: 5px;
-                }
-                .num {
-                    color: #4489A4;
-                }
+                .ico { vertical-align: bottom; margin-right: 5px; }
+                .num { color: @blue; }
             }
         }
     }
+}
+
+.notice-wrap {
+    margin-top:20px;
+    border:1px solid #eee;
+    
+    .board-list .board:last-of-type { border-bottom:none; }
 }
 
 .write-btn-wrap {
@@ -2031,6 +2030,7 @@
         margin-right: 5px;
     }
 }
+/*
 .board-header{
     padding: 15px 20px;
     border-top: 1px solid @gray-d4;
@@ -2066,7 +2066,7 @@
         }
     }
 }
-
+*/
 .board-body {
     padding: 20px;
     .author-info {
app/views/board/postList.scala.html
--- app/views/board/postList.scala.html
+++ app/views/board/postList.scala.html
@@ -6,134 +6,125 @@
 
 @urlToList = {@routes.BoardApp.posts(project.owner, project.name, page.getPageIndex + 1)}
 
-@** header(label:String, key:String) = {
-  <th>
-    <a key="@key" href="@routes.BoardApp.posts(project.owner, project.name)">@label</a>
-    @if(key == param.orderBy){
-      @if(param.orderDir == "desc"){
-        <i class="icon-chevron-down"></i>
-      } else {
-        <i class="icon-chevron-up"></i>
-      }
-    }
-  </th>
+@makeFilterLink(fieldName:String, orderBy:String, orderDir:String, fieldText:String) = {
+	@if(orderBy.equals(fieldName)) {
+		<a href="@urlToList&orderBy=@fieldName&orderDir=@if(orderDir.equals("desc")){asc}else{desc}" class="filter active"><i class="ico btn-gray-arrow @if(orderDir.equals("desc")){ down }"></i>@fieldText</a>
+	} else {
+	    <a href="@urlToList&orderBy=@fieldName&orderDir=asc" class="filter"><i class="ico btn-gray-arrow"></i>@fieldText</a>
+	}
 }
-**@
 
 @main(title, project, utils.MenuType.BOARD) {
 <div class="page">
-  @views.html.prjmenu(project, utils.MenuType.BOARD, "main-menu-only")
+	@prjmenu(project, utils.MenuType.BOARD, "main-menu-only")
 
-  <div class="header-wrap">
-    <div class="search-wrap board">
-      <div class="inner">
-        <form method="get" id="option_form">
-          <input type="hidden" name="orderBy"  value="@param.orderBy">
-          <input type="hidden" name="orderDir" value="@param.orderDir">
-          <input name="filter" class="text" type="text" placeholder="@Messages("project.searchPlaceholder")" value="@param.filter"><!--
-           --><button type="submit" class="btn search-btn underConstruction">@Messages("post.menu.search")</button>
-        </form>
-      </div>
-    </div>
-  </div>
+	<div class="header-wrap">
+	    <div class="search-wrap board">
+	      <div class="inner">
+	        <form method="get" id="option_form">
+	          <input type="hidden" name="orderBy"  value="@param.orderBy">
+	          <input type="hidden" name="orderDir" value="@param.orderDir">
+	          <input name="filter" class="text" type="text" placeholder="@Messages("project.searchPlaceholder")" value="@param.filter"><!--
+	         --><button type="submit" class="btn search-btn underConstruction">@Messages("post.menu.search")</button>
+	      </form>
+	    </div>
+	  </div>
+	</div>
 
-  @if(notices != null && notices.size > 0) {
-      <hr>
-      <div class="well">
-          <h4>@Messages("post.notice")</h4>
-          <ul class="board-list">
-              @for(post <- notices) {
-                  <li class="board">
-                  <div class="num"> <a href="@routes.BoardApp.post(project.owner, project.name, post.id)"> @post.getNumber </a> </div>
-                  <div class="attach-wrap">
-                      @if(Attachment.findByContainer(post.asResource).size > 0) {
-                          <i class="ico ico-clip"></i>
-                      }
-                  </div>
-                  <div class="contents">
-                  <p class="title"> <a href="@routes.BoardApp.post(project.owner, project.name, post.id)"> @post.title </a> </p>
-                  <p class="infos nm"> by <a href="@routes.UserApp.userInfo(post.authorLoginId)" class="author"> @post.authorLoginId </a> <span class="date"> @utils.TemplateHelper.agoString(post.ago()) </span> </p>
-                  </div>
-                  <div class="right-panel">
-                  <div class="comment-wrap">
-                  <i class="ico ico-comment-bubble"></i> <span class="num"> @post.numOfComments </span>
-                  </div>
-                  <a href="@routes.UserApp.userInfo(post.authorLoginId)" class="author-avatar img-rounded pull-right">
-                  <img class="user-picture" src="@User.findByLoginId(post.authorLoginId).avatarUrl" alt="@post.authorName" width="34" height="34"> </a>
-                  </div>
-                  </li>
-              }
-          </ul>
-      </div>
-  }
+  	@if(notices != null && notices.size > 0) {
+    <div class="notice-wrap bubble-wrap gray">
+		<ul class="board-list unstyled">
+		@for(post <- notices) {
+			<li class="board">
+				<div class="num">
+					<a href="@routes.BoardApp.post(project.owner, project.name, post.id)">@post.getNumber</a>
+				</div>
+                <div class="attach-wrap">
+                    @if(Attachment.findByContainer(post.asResource).size > 0) {
+                        <i class="ico ico-clip"></i>
+                    }
+                </div>
+                <div class="contents">
+                	<p class="title">
+                		<a href="@routes.BoardApp.post(project.owner, project.name, post.id)">@post.title</a>
+                	</p>
+                	<p class="infos nm">
+                		by <a href="@routes.UserApp.userInfo(post.authorLoginId)" class="author">@post.authorLoginId</a><!-- 
+					-->&nbsp;<span class="date">@utils.TemplateHelper.agoString(post.ago())</span>
+					</p>
+                </div>
+                <div class="right-panel">
+                	<div class="comment-wrap">
+                		<i class="ico ico-comment-bubble"></i> <span class="num">@post.numOfComments</span>
+                	</div>
+                	<a href="@routes.UserApp.userInfo(post.authorLoginId)" class="avatar-wrap pull-right"><!-- 
+                 	--><img src="@User.findByLoginId(post.authorLoginId).avatarUrl" alt="@post.authorName" width="32" height="32">
+                	</a>
+				</div>
+			</li>
+		}
+        </ul>
+	</div>
+	}
 
-  @if(page.getTotalRowCount == 0){
+	@if(page.getTotalRowCount == 0){
 
 	<div class="error-wrap">
-			<i class="ico ico-err1"></i>
-			<p>@Messages("post.is.empty")</p>
-		</div>
-    <div>
+		<i class="ico ico-err1"></i>
+		<p>@Messages("post.is.empty")</p>
+	</div>
 
-  } else {
+	} else {
 
-  <div class="filter-wrap board">
-      <div class="filters" id="order">
-          @if(param.orderBy.equals("createdDate")) {
-            @if(param.orderDir.equals("asc")) {
-                <a href="#" data-orderBy="createdDate" data-orderDir="desc" class="filter active"><i class="ico btn-gray-arrow"></i>날짜순</a>
-            } else {
-                <a href="#" data-orderBy="createdDate" data-orderDir="asc" class="filter active"><i class="ico btn-gray-arrow down"></i>날짜순</a>
-            }
-          } else {
-              <a href="#" data-orderBy="createdDate" data-orderDir="asc" class="filter"><i class="ico btn-gray-arrow"></i>날짜순</a>
-          }
+	@if(page.getTotalRowCount > 1){
+	<div class="filter-wrap board">
+	    <div id="order" class="filters">
+			@makeFilterLink("createdDate", param.orderBy, param.orderDir, Messages("order.date"))
+			@makeFilterLink("numOfComments", param.orderBy, param.orderDir, Messages("order.comments"))
+	    </div>
+	</div>
+	}
 
-          @if(param.orderBy.equals("numOfComments")) {
-              @if(param.orderDir.equals("asc")) {
-                  <a href="#" data-orderBy="numOfComments" data-orderDir="desc" class="filter active"><i class="ico btn-gray-arrow"></i>댓글순</a>
-              } else {
-                  <a href="#" data-orderBy="numOfComments" data-orderDir="asc" class="filter active"><i class="ico btn-gray-arrow down"></i>댓글순</a>
-              }
-          } else {
-              <a href="#" data-orderBy="numOfComments" data-orderDir="asc" class="filter"><i class="ico btn-gray-arrow"></i>댓글순</a>
-          }
-      </div>
-  </div>
-
-  <ul class="board-list">
-    @for(post <- page.getList()){
-        <li class="board">
-          <div class="num"><a href="@routes.BoardApp.post(project.owner, project.name, post.id)">@post.getNumber</a></div>
-          <div class="attach-wrap">
-            @if(Attachment.findByContainer(post.asResource).size > 0){
-            	<i class="ico ico-clip"></i>
-            }
-          </div>
-          <div class="contents">
-			<p class="title"><a href="@routes.BoardApp.post(project.owner, project.name, post.id)">@post.title</a></p>
-            <p class="infos nm">by <a href="@routes.UserApp.userInfo(post.authorLoginId)" class="author">@post.authorLoginId</a> <span class="date">@utils.TemplateHelper.agoString(post.ago())</span></p>
-          </div>
-          <div class="right-panel">
-            <div class="comment-wrap">
-                <i class="ico ico-comment-bubble"></i><span class="num">@post.numOfComments</span>
-            </div>
-            <a href="@routes.UserApp.userInfo(post.authorLoginId)" class="avatar-wrap img-rounded pull-right">
-				<img src="@User.findByLoginId(post.authorLoginId).avatarUrl" alt="@post.authorName" width="32" height="32">
-			</a>
-          </div>
-        </li>
-    }
-  </ul>
+	<ul class="board-list unstyled">
+	@for(post <- page.getList()){
+		<li class="board">
+			<div class="num">
+				<a href="@routes.BoardApp.post(project.owner, project.name, post.id)">@post.getNumber</a>
+			</div>
+			<div class="attach-wrap">
+				@if(Attachment.findByContainer(post.asResource).size > 0){ 
+					<i class="ico ico-clip"></i> 
+				}
+			</div>
+			<div class="contents">
+				<p class="title">
+					<a href="@routes.BoardApp.post(project.owner, project.name, post.id)">@post.title</a>
+				</p>
+				<p class="infos nm">
+					by <a href="@routes.UserApp.userInfo(post.authorLoginId)" class="author">@post.authorLoginId</a><!-- 
+				 -->&nbsp;<span class="date">@utils.TemplateHelper.agoString(post.ago())</span>
+				</p>
+			</div>
+			<div class="right-panel">
+				<div class="comment-wrap">
+					<i class="ico ico-comment-bubble"></i><span class="num">@post.numOfComments</span>
+				</div>
+				<a href="@routes.UserApp.userInfo(post.authorLoginId)" class="avatar-wrap pull-right"><!-- 
+				 --><img src="@User.findByLoginId(post.authorLoginId).avatarUrl" alt="@post.authorName" width="32" height="32">
+				</a>
+			</div>
+		</li> 
+		}
+	</ul>
   }
 
-  <div class="write-btn-wrap">
-    <a href="@routes.BoardApp.newPostForm(project.owner, project.name)" class="n-btn orange med">@Messages("post.write")</a>
-  </div>
+	<div class="write-btn-wrap">
+		<a href="@routes.BoardApp.newPostForm(project.owner, project.name)" class="n-btn orange med">@Messages("post.write")</a>
+	</div>
 
-  <div id="pagination">
-    <!-- pagination.js will fill here. -->
-  </div>
+	<div id="pagination">
+		<!-- pagination.js will fill here. -->
+	</div>
 </div>
 
 <script type="text/javascript">
app/views/issue/issueList.scala.html
--- app/views/issue/issueList.scala.html
+++ app/views/issue/issueList.scala.html
@@ -6,39 +6,15 @@
 @import scala.collection.immutable.Map
 @import models.enumeration._
 
-
 @urlToList = {@routes.IssueApp.issues(project.owner, project.name, param.state, "html", currentPage.getPageIndex + 1)}
 
-@**
-@ordering(label:String, sortBy:String) = {
-  @if(sortBy == param.sortBy) {
-    @if(param.orderBy == "desc") {
-      <a selected href="@urlToList&sortBy=@sortBy&orderBy=asc">▼@label</a>
-    } else {
-      <a selected href="@urlToList&sortBy=@sortBy&orderBy=desc">▲@label</a>
-    }
-  } else {
-    <a href="@urlToList&sortBy=@sortBy">@label</a>
-  }
+@makeFilterLink(fieldName:String, orderBy:String, orderDir:String, fieldText:String) = {
+	@if(orderBy.equals(fieldName)) {
+		<a href="@urlToList&orderBy=@fieldName&orderDir=@if(orderDir.equals("desc")){asc}else{desc}" class="filter active"><i class="ico btn-gray-arrow @if(orderDir.equals("desc")){ down }"></i>@fieldText</a>
+	} else {
+	    <a href="@urlToList&orderBy=@fieldName&orderDir=asc" class="filter"><i class="ico btn-gray-arrow"></i>@fieldText</a>
+	}
 }
-
-@header(label:String, sortBy:String) = {
-    <th>
-        @if(sortBy == param.sortBy){
-            @(param.state = "")
-            @if(param.orderBy == "desc"){
-                <a class="th-sort" href="@routes.IssueApp.issues(project.owner, project.name, param.state)&sortBy=@sortBy&orderBy=asc" data-sort-by="@sortBy">@label</a>
-                <i class="icon-chevron-down"></i>
-            } else {
-                <a class="th-sort" href="@routes.IssueApp.issues(project.owner, project.name, param.state)&sortBy=@sortBy&orderBY=desc" data-sort-by="@sortBy">@label</a>
-                <i class="icon-chevron-up"></i>
-            }
-        } else {
-            <a class="th-sort" href="@routes.IssueApp.issues(project.owner, project.name, param.state)&sortBy=@sortBy" data-sort-by="@sortBy">@label</a>
-        }
-    </th>
-}
-**@
 
 @main(Messages(title), project, utils.MenuType.ISSUE){
 <div class="page">
@@ -118,41 +94,17 @@
 		</div>
 	</div>
 
+@if(currentPage.getList().size() > 0){
+	@if(currentPage.getList().size() > 1){
 	<div class="filter-wrap board">
 		<div class="filters">
-            @if(param.orderBy.equals("state")) {
-                @if(param.orderDir.equals("asc")) {
-                    <a href="@urlToList&orderBy=state&orderDir=desc" class="filter active"><i class="ico btn-gray-arrow"></i>@Messages("order.state")</a>
-                } else {
-                    <a href="@urlToList&orderBy=state&orderDir=asc" class="filter active"><i class="ico btn-gray-arrow down"></i>@Messages("order.state")</a>
-                }
-            } else {
-                <a href="@urlToList&orderBy=state&orderDir=asc" class="filter"><i class="ico btn-gray-arrow"></i>@Messages("order.state")</a>
-            }
-
-            @if(param.orderBy.equals("createdDate")) {
-                @if(param.orderDir.equals("asc")) {
-                    <a href="@urlToList&orderBy=createdDate&orderDir=desc" class="filter active"><i class="ico btn-gray-arrow"></i>@Messages("order.date")</a>
-                } else {
-                    <a href="@urlToList&orderBy=createdDate&orderDir=asc" class="filter active"><i class="ico btn-gray-arrow down"></i>@Messages("order.date")</a>
-                }
-            } else {
-                <a href="@urlToList&orderBy=createdDate&orderDir=asc" class="filter"><i class="ico btn-gray-arrow"></i>@Messages("order.date")</a>
-            }
-
-            @if(param.orderBy.equals("numOfComments")) {
-                @if(param.orderDir.equals("asc")) {
-                    <a href="@urlToList&orderBy=numOfComments&orderDir=desc" class="filter active"><i class="ico btn-gray-arrow"></i>@Messages("order.comments")</a>
-                } else {
-                    <a href="@urlToList&orderBy=numOfComments&orderDir=asc" class="filter active"><i class="ico btn-gray-arrow down"></i>@Messages("order.comments")</a>
-                }
-            } else {
-                <a href="@urlToList&orderBy=numOfComments&orderDir=asc" class="filter"><i class="ico btn-gray-arrow"></i>@Messages("order.comments")</a>
-            }
+			@makeFilterLink("state", param.orderBy, param.orderDir, Messages("order.state"))
+			@makeFilterLink("createdDate", param.orderBy, param.orderDir, Messages("order.date"))
+			@makeFilterLink("numOfComments", param.orderBy, param.orderDir, Messages("order.comments"))
 		</div>
 	</div>
+	}
 
-@if(currentPage.getList().size() > 0){
 	<ol class="issue-list">
 		@for(issue <- currentPage.getList){
 	    <li class="issue">
app/views/milestone/list.scala.html
--- app/views/milestone/list.scala.html
+++ app/views/milestone/list.scala.html
@@ -42,7 +42,9 @@
     
     <div class="tab-wrap">
         <div class="pull-right btns">
+        	@**<!-- 
             <a href="@routes.MilestoneApp.manageMilestones(projectInst.owner, projectInst.name)" class="nbtn medium">@Messages("milestone.menu.manage")</a>
+             -->**@
             <a href="@routes.MilestoneApp.newMilestoneForm(projectInst.owner, projectInst.name)" class="nbtn medium orange">@Messages("milestone.menu.new")</a>
         </div>
         
@@ -59,7 +61,17 @@
         </ul>
     </div>
     
-	<div class="filter-wrap milestone">
+	@if(milestones == null || milestones.isEmpty()){
+
+		<div class="error-wrap">
+			<i class="ico ico-err1"></i>
+			<p>@Messages("milestone.is.empty")</p>
+		</div>  
+
+	} else {
+	
+	@if(milestones.length > 1){
+		<div class="filter-wrap milestone">
 		<div class="filters">
                <a href="@makeSortLink("dueDate")" class="filter"><i class="ico ico-sort @sortMark("dueDate")"></i>@Messages("order.dueDate")</a>
                <a href="@makeSortLink("completionRate")" class="filter active"><i class="ico ico-sort @sortMark("completionRate")"></i>@Messages("order.completionRate")</a>
@@ -70,37 +82,23 @@
             <i class="orange"></i>@Messages("issue.state.closed")
        	</div>
     </div>
+    }
 
-	@if(milestones == null || milestones.isEmpty()){
-
-		<div class="error-wrap">
-			<i class="ico ico-err1"></i>
-			<p>@Messages("milestone.is.empty")</p>
-		</div>  
-
-	} else {
-	
     <ul class="milestones">
         @for(milestone <- milestones){
         <li class="milestone">
             <div class="infos">
-            	<!-- 
+            	@**<!-- 
                 <ul class="contributors">
                     <li class="contributor">
                         <a href="/uname" class="img-rounded"><img src="/assets/images/default-avatar-34.png"></a>
                     </li>
-                    <li class="contributor">
-                        <a href="/uname" class="img-rounded"><img src="/assets/images/default-avatar-34.png"></a>
-                    </li>
-                    <li class="contributor">
-                        <a href="/uname" class="img-rounded"><img src="/assets/images/default-avatar-34.png"></a>
-                    </li>
                 </ul>
-                 -->
+                 -->**@
                 
                 <div class="meta-info">
                     <strong class="version"></strong>
-                    <span class="title">@milestone.title</span>
+                    <a href="@routes.MilestoneApp.editMilestoneForm(projectInst.owner, projectInst.name, milestone.id)" class="title">@milestone.title</a>
                     <span class="sp">|</span>
                     <span class="due-date">@Messages("label.dueDate") <strong>@milestone.getDueDateString</strong></span>
                 </div>
@@ -108,9 +106,11 @@
                 <div class="progress-wrap">
 					<div class="progress">
 						<div class="bar orange" style="width: @milestone.getCompletionRate%;"></div>
+						@**
 						<!-- 
 						<div class="bar blue" style="width: 30%"></div>  
 						-->
+						**@
 					</div>
 					<div class="progress-label">
 						@** 0% 일 수도 있어서 최소한의 텍스트 영역 확보 **@
@@ -126,10 +126,15 @@
                 <div class="desc">
                     @milestone.contents
                 </div>
+                
+                <div class="actrow">
+                	<a href="@routes.MilestoneApp.editMilestoneForm(projectInst.owner, projectInst.name, milestone.id)" class="nbtn medium white">@Messages("button.edit")</a>
+                	<a href="@routes.MilestoneApp.editMilestoneForm(projectInst.owner, projectInst.name, milestone.id)" class="nbtn medium black">@Messages("button.delete")</a>
+                </div>
             </div>
-            <div class="completion-rate @if(milestone.getCompletionRate == 100){done}">
-            	@milestone.getCompletionRate
-            	<i>%</i>
+            <div class="completion-rate @if(milestone.getCompletionRate == 100){done}"><!-- 
+             -->@milestone.getCompletionRate<!-- 
+             --><i>%</i>
 			</div>
         </li>
         }
Add a comment
List