[Notice] Announcing the End of Demo Server [Read me]
Jihan Kim 2013-04-24
project delete form departed from project setting (HIVE-36)
@3a6ae092be8114a59476fe663591f80f048dbc83
app/assets/stylesheets/less/_page.less
--- app/assets/stylesheets/less/_page.less
+++ app/assets/stylesheets/less/_page.less
@@ -1435,6 +1435,8 @@
 .box-wrap {
     border-bottom: 1px solid #E9E9E9;
     padding: 0 20px;
+    &:last-of-type { border-bottom:none; }
+    
     &.top {
         padding-bottom: 20px;
     }
@@ -1479,7 +1481,7 @@
                 width: 380px;
             }
             .textarea {
-                height: 111px;
+                height: 70px; /*111px;*/
                 margin-bottom: 0;
                 resize:vertical;
             }
@@ -1495,7 +1497,7 @@
         position: absolute;
         left: -5px;
         top: -2px;
-        .opacity(0);
+        .opacity(0.5);
     }
 }
 
@@ -2243,7 +2245,7 @@
         width: 45px;
     }*/
     .attach-info-wrap {
-        width: 707px; /*715px;*/
+        width: 657px; /*715px;*/
         font-size: 11px;
         /*opacity:0;
         -webkit-transition-duration:0.3s;
@@ -2267,7 +2269,7 @@
         }
     }
     .btn-wrap {
-        width: 88px; /*80px*/
+        width: 138px; /*80px*/
         text-align: right;
     }
 }
@@ -2356,10 +2358,12 @@
         .option {
             width:250px;
             .inline-block;
-            .option-label { color:#959595; font-weight:bold; margin-bottom:5px; }
+            /*.option-label { color:#959595; font-weight:bold; margin-bottom:5px; }*/
             .d-label { width:200px; }
         }
     }
+    
+    .option-label { color:#959595; font-weight:bold; margin-bottom:5px; }
 }
 .content-footer {
     padding: 20px;
app/controllers/ProjectApp.java
--- app/controllers/ProjectApp.java
+++ app/controllers/ProjectApp.java
@@ -164,6 +164,16 @@
         return isImageFile;
     }
 
+    public static Result deleteForm(String userName, String projectName) {
+        Project project = getProject(userName, projectName);
+        if (!AccessControl.isAllowed(UserApp.currentUser(), project.asResource(), Operation.UPDATE)) {
+            return unauthorized(views.html.project.unauthorized.render(project));
+        }
+
+        Form<Project> projectForm = form(Project.class).fill(project);
+        return ok(projectDelete.render("title.projectSetting", projectForm, project));
+    }
+    
     public static Result deleteProject(String userName, String projectName) throws Exception {
         Project project = getProject(userName, projectName);
 
app/views/issue/editIssue.scala.html
--- app/views/issue/editIssue.scala.html
+++ app/views/issue/editIssue.scala.html
@@ -59,8 +59,11 @@
 			</div>
 		
 			<div class="btn-wrap">
-				<div class="ns-btn fake-file-wrap">
-					<i class="ico ico-plus-blue"></i>@Messages("button.upload") <input type="file" class="file" name="filePath">
+				<div class="fake-file-wrap">
+					<input type="file" class="file" name="filePath">
+					<div class="ns-btn">
+						<i class="ico ico-plus-blue"></i>@Messages("button.upload")
+					</div>
 				</div>
 			</div>
 		</div>
@@ -164,6 +167,7 @@
     **@	
 
 	<!-- issue.label js module appends a label selector here. -->
+	<p class="option-label">@Messages("label.select")</p>
 	<fieldset class="labels"></fieldset>
 
 	<div class="actions">
app/views/prjmenu.scala.html
--- app/views/prjmenu.scala.html
+++ app/views/prjmenu.scala.html
@@ -52,9 +52,7 @@
 		<ul class="unstyled on-admin">
 			@makeSubMenu(routes.ProjectApp.settingForm(project.owner, project.name),  Messages("project.setting"))
 			@makeSubMenu(routes.ProjectApp.members(project.owner, project.name), 	  Messages("project.member"))
-			@** makeSubMenu(routes.MilestoneApp.milestones(project.owner, project.name), Messages("project.milestone")) **@
-			@** makeSubMenu(routes.MilestoneApp.milestones(project.owner, project.name), Messages("project.sidebar.plugin")) **@
-			@** makeSubMenu(routes.MilestoneApp.milestones(project.owner, project.name), Messages("project.sidebar.help")) **@
+			@makeSubMenu(routes.ProjectApp.deleteForm(project.owner, project.name),   Messages("project.delete"))
 		</ul>
 	</div>
 }
 
app/views/project/projectDelete.scala.html (added)
+++ app/views/project/projectDelete.scala.html
@@ -0,0 +1,46 @@
+@(message: String)(projectForm: Form[Project], project:Project)
+
+@import helper._
+@import utils.TemplateHelper._
+
+@projectMngMain(message, project) {
+    @prjmenu(project, utils.MenuType.PROJECT_SETTING, "")
+
+    <div class="bubble-wrap gray wp">
+        <div class="cu-label">@Messages("project.delete")</div>
+        <div class="cu-desc">
+            <p><strong class="notice">@Messages("project.delete.description")</strong></p>
+            <p>
+            	<input type="checkbox" class="checkbox" autocomplete="off" id="accept"><!-- 
+             --><label for="accept" class="bg-checkbox label-agreement">@Messages("project.delete.accept")</label>
+            </p>
+        </div>
+    </div>
+    <div class="box-wrap bottom">
+        <a id="deletion" data-toggle="modal" href="#alertDeletion" class="n-btn orange med"><!-- 
+         --><i class="ico ico-delete-small"></i>@Messages("project.delete.this")</a>
+    </div>
+
+
+	<div class="modal hide" id="alertDeletion">
+	    <div class="modal-header">
+	        <button type="button" class="close" data-dismiss="modal">×</button>
+	        <h3>@Messages("project.delete.requestion")</h3>
+	    </div>
+	    <div class="modal-body">
+	        <p> @Messages("project.delete.description")</p>
+	        <p> @Messages("project.delete.reaccept") </p>
+	    </div>
+	    <div class="modal-footer">
+	        <a href="#" class="btn" data-dismiss="modal">@Messages("button.no")</a>
+	        <a href="@routes.ProjectApp.deleteProject(project.owner, project.name)" class="btn btn-danger">@Messages("button.yes")</a>
+	    </div>
+	</div>
+	
+	<script type="text/javascript">
+		$(document).ready(function(){
+	        $hive.loadModule("project.Delete");
+		});
+	</script>
+
+}
app/views/project/setting.scala.html
--- app/views/project/setting.scala.html
+++ app/views/project/setting.scala.html
@@ -7,110 +7,85 @@
 @projectMngMain(message, project) {
     @prjmenu(project, utils.MenuType.PROJECT_SETTING, "")
 
+	@form(action=routes.ProjectApp.settingProject(project.owner, project.name), 'id->"saveSetting" , 'enctype->"multipart/form-data", 'class->"nm"){
     <div class="bubble-wrap gray">
-        @form(action=routes.ProjectApp.settingProject(project.owner, project.name), 'id->"saveSetting" , 'enctype->"multipart/form-data", 'class->"nm"){
-            <input type="hidden" name="id" value="@projectForm("id").value.toLong">
-            <div class="box-wrap top clearfix frm-wrap">
-                <div class="setting-box left">
-                    <div class="logo-wrap">
-                      <img src="@defining(Attachment.findByContainer(project.asResource)) @{ files =>
-                        if (files.size > 0) "/files/" + files.head.id
-                        else routes.Assets.at("images/bg-default-project.jpg") }" alt="project-logo">
-                    </div>
-                    <div class="logo-desc">
-                        <ul class="unstyled descs">
-                            <li><strong>@Messages("project.logo")</strong></li>
-                            <li>@Messages("project.logo.type") <span class="point">bmp, jpg, gif, png</span></li>
-                            <li>@Messages("project.logo.maxFileSize") <span class="point">1MB</span></li>
-                            <li>@Messages("project.logo.size") <span class="point">234px × 168px</span></li>
-                            <li>
-                                <div class="ns-btn fake-file-wrap"><i class="ico ico-plus-blue"></i>@Messages("button.upload")
-                                    <input type="file" class="file" name="logoPath">
-                                </div>
-                            </li>
-                        </ul>
-                    </div>
+        <input type="hidden" name="id" value="@projectForm("id").value.toLong">
+        <div class="box-wrap top clearfix frm-wrap">
+            <div class="setting-box left">
+                <div class="logo-wrap">
+                  <img src="@defining(Attachment.findByContainer(project.asResource)) @{ files =>
+                    if (files.size > 0) "/files/" + files.head.id
+                    else routes.Assets.at("images/bg-default-project.jpg") }">
                 </div>
-                <dl class="setting-box right">
-                	<dt>
-	                    <div class="n-alert hide" id="alert_msg">
-	                        <div class="n-inner">
-	                            <span class="msg">@Messages("project.wrongName")</span>
-	                            <a href="#" class="ico btn-delete" data-dismiss="alert"></a>
-	                        </div>
-	                    </div>
-	                    <label for="project-name">@Messages("project.name.placeholder")</label>
-                    </dt>
-                    <dd>
-                        @inputText(projectForm("name"), 'class->"text", 'maxlength -> "250")
-                    </dd>
-                    
-                    <dt>
-                    	<label for="project-desc">@Messages("project.description.placeholder")</label>
-                    </dt>
-                    <dd>
-                        @textarea(projectForm("overview"), 'class->"textarea")
-                    </dd>
-                </dl>
-            </div>
-            <div class="box-wrap middle">
-                <div class="cu-label">@Messages("project.tags")</div>
-                <div class="cu-desc">
-                    <div id="tags">
-                        <!-- tags will be added here by hive.project.Settings.js -->
-                    </div>
-                    <input name="newTag" type="text" class="text" style="margin-bottom: 0px"
-                        data-provider="typeahead" autocomplete="off"/>
-                    <a href="javascript:void(0)" class="n-btn small orange" id="addTag">@Messages("button.add")</a>
+                <div class="logo-desc">
+                    <ul class="unstyled descs">
+                        <li><strong>@Messages("project.logo")</strong></li>
+                        <li>@Messages("project.logo.type") <span class="point">bmp, jpg, gif, png</span></li>
+                        <li>@Messages("project.logo.maxFileSize") <span class="point">1MB</span></li>
+                        <li>@Messages("project.logo.size") <span class="point">234px × 168px</span></li>
+                        <li>
+                            <div class="ns-btn fake-file-wrap">
+                            	<i class="ico ico-plus-blue"></i>@Messages("button.upload")
+                                <input type="file" class="file" name="logoPath" accept="image/*">
+                            </div>
+                        </li>
+                    </ul>
                 </div>
             </div>
-            <div class="box-wrap middle">
-                <div class="cu-label">@Messages("project.shareOption")</div>
-                <div class="cu-desc">
-                    <input name="share_option" type="radio" @if(project.share_option == true){checked="checked"} id="public" value="true" class="radio-btn"><label for="public" class="bg-radiobtn label-public">@Messages("project.public")</label>
-                    <input name="share_option" type="radio" @if(project.share_option == false){checked="checked"} id="private" value="false" class="radio-btn"><label for="private" class="bg-radiobtn label-private">@Messages("project.private")</label>
-                    <span class="note">@Messages("project.private.notice")</span>
+            <dl class="setting-box right">
+            	<dt>
+            	 <!-- 
+                 <div class="n-alert hide" id="alert_msg">
+                     <div class="n-inner">
+                         <span class="msg">@Messages("project.wrongName")</span>
+                         <a href="#" class="ico btn-delete" data-dismiss="alert"></a>
+                     </div>
+                 </div>
+                 -->
+                 <label for="project-name">@Messages("project.name.placeholder")</label>
+                </dt>
+                <dd>
+                    @inputText(projectForm("name"), 'class->"text", 'maxlength -> "250")
+                </dd>
+                
+                <dt>
+                	<label for="project-desc">@Messages("project.description.placeholder")</label>
+                </dt>
+                <dd>
+                    @textarea(projectForm("overview"), 'class->"textarea")
+                </dd>
+            </dl>
+        </div>
+        <div class="box-wrap middle">
+            <div class="cu-label" style="line-height:30px;">@Messages("project.tags")</div>
+            <div class="cu-desc">
+                <div id="tags">
+                    <!-- tags will be added here by hive.project.Settings.js -->
                 </div>
-            </div>
-            <div class="box-wrap bottom">
-                <button class="btn-transparent n-btn orange med" type="submit" id="save">@Messages("button.save")</button>
-            </div>
-            <!-- 현재 레이아웃에 존재하지 않는 기능 -->
-            <input type="hidden" name="isAuthorEditable" value="true"/>
-            <input type="hidden" name="siteurl" value="@routes.ProjectApp.project(project.owner, project.name)"/>
-        }
-    </div>
-    <div class="bubble-wrap gray wp">
-        <div class="n-alert project-del">
-            <div class="n-inner hide" id="acceptAlert">
-                <span class="msg">@Messages("project.delete.alert")</span>
-                <a class="ico btn-delete" data-dismiss="alert"></a>
+                <input name="newTag" type="text" class="text" style="margin-bottom:0px" data-provider="typeahead" autocomplete="off"/>
+                <button id="addTag" type="button" class="btn-transparent n-btn med gray">@Messages("button.add")</button>
             </div>
         </div>
-        <div class="cu-label">@Messages("project.delete")</div>
-        <div class="cu-desc">
-            <p><strong class="notice">@Messages("project.delete.description")</strong></p>
-            <p><input type="checkbox" class="checkbox" autocomplete="off" id="accept"><label for="accept" class="bg-checkbox label-agreement">@Messages("project.delete.accept")</label>
-                <a id="deletion" data-toggle="modal" href="#alertDeletion" class="n-btn small black"><i class="ico ico-delete-small"></i>@Messages("project.delete.this")</a>
-            </p>
+        
+        <div class="box-wrap middle">
+            <div class="cu-label">@Messages("project.shareOption")</div>
+            <div class="cu-desc">
+                <input name="share_option" type="radio" @if(project.share_option == true){checked="checked"} id="public" value="true" class="radio-btn"><label for="public" class="bg-radiobtn label-public">@Messages("project.public")</label>
+                <input name="share_option" type="radio" @if(project.share_option == false){checked="checked"} id="private" value="false" class="radio-btn"><label for="private" class="bg-radiobtn label-private">@Messages("project.private")</label>
+                <span class="note">@Messages("project.private.notice")</span>
+            </div>
         </div>
+        
+        @**
+        <!-- 현재 레이아웃에 존재하지 않는 기능 -->
+        <input type="hidden" name="isAuthorEditable" value="true"/>
+        <input type="hidden" name="siteurl" value="@routes.ProjectApp.project(project.owner, project.name)"/>
+        **@
     </div>
-
-
-<div class="modal hide" id="alertDeletion">
-    <div class="modal-header">
-        <button type="button" class="close" data-dismiss="modal">×</button>
-        <h3>@Messages("project.delete.requestion")</h3>
+    <div class="box-wrap bottom">
+        <button id="save" type="submit" class="btn-transparent n-btn orange med">@Messages("button.save")</button>
     </div>
-    <div class="modal-body">
-        <p> @Messages("project.delete.description")</p>
-        <p> @Messages("project.delete.reaccept") </p>
-    </div>
-    <div class="modal-footer">
-        <a href="#" class="btn" data-dismiss="modal">@Messages("button.no")</a>
-        <a href="@routes.ProjectApp.deleteProject(project.owner, project.name)" class="btn btn-danger">@Messages("button.yes")</a>
-    </div>
-</div>
+	}
 
 <script type="text/javascript">
 	$(document).ready(function(){
@@ -119,7 +94,6 @@
             "sURLTags"       : "@routes.TagApp.tags()"
         });
 	});
-
 </script>
 
 }
conf/messages.en
--- conf/messages.en
+++ conf/messages.en
@@ -60,6 +60,7 @@
 label.add = Add
 label.manage = Manage Label
 label.confirm.delete = Are you Sure?
+label.select = Select Label
 
 order.all = All
 order.date = Date
conf/messages.ko
--- conf/messages.ko
+++ conf/messages.ko
@@ -61,6 +61,7 @@
 label.add = 추가
 label.manage = 라벨관리
 label.confirm.delete = 라벨을 삭제하면 이슈에 지정한 라벨도 함께 제거됩니다. 정말 삭제하시겠습니까?
+label.select = 라벨 선택
 
 order.all = 전체
 order.date = 날짜순
conf/routes
--- conf/routes
+++ conf/routes
@@ -76,6 +76,7 @@
 GET     /:user/:project                                 controllers.ProjectApp.project(user, project)
 GET     /:user/:project/settingform                     controllers.ProjectApp.settingForm(user, project)
 POST    /:user/:project/setting                         controllers.ProjectApp.settingProject(user, project)
+GET     /:user/:project/deleteform                      controllers.ProjectApp.deleteForm(user, project)
 GET     /:user/:project/delete                          controllers.ProjectApp.deleteProject(user, project)
 GET     /:user/:project/members                         controllers.ProjectApp.members(user, project)
 POST    /:user/:project/members                         controllers.ProjectApp.newMember(user, project)
 
public/javascripts/service/hive.project.Delete.js (added)
+++ public/javascripts/service/hive.project.Delete.js
@@ -0,0 +1,59 @@
+/**
+ * @(#)hive.project.Delete.js 2013.04.24
+ *
+ * Copyright NHN Corporation.
+ * Released under the MIT license
+ * 
+ * http://hive.dev.naver.com/license
+ */
+
+(function(ns){
+	
+	var oNS = $hive.createNamespace(ns);
+	oNS.container[oNS.name] = function(htOptions){
+		
+		var htVar = {};
+		var htElement = {};
+		
+		/**
+		 * initialize
+		 */
+		function _init(htOptions){
+			_initElement(htOptions);
+			_attachEvent();
+		}
+		
+		/**
+		 * initialize element variables
+		 */
+		function _initElement(htOptions){
+			htElement.welChkAccept    = $("#accept");			
+			htElement.welBtnDeletePrj = $("#deletion");			
+		}
+
+        /**
+		 * attach event handlers
+		 */
+		function _attachEvent(){
+			htElement.welBtnDeletePrj.click(_onClickBtnDeletePrj);
+		}
+		
+		/**
+		 * 프로젝트 삭제 버튼 클릭시 이벤트 핸들러
+		 * 데이터 영구 삭제 동의에 체크했는지 확인하고
+		 * 체크되지 않았으면 경고
+		 */
+		function _onClickBtnDeletePrj(){
+			var bChecked = htElement.welChkAccept.is(":checked");
+			
+			if(bChecked === false){
+				$hive.showAlert("project.delete.alert");
+				return false;
+			}
+			return true;
+		}
+
+		_init(htOptions || {});
+	};
+	
+})("hive.project.Delete");
Add a comment
List