[Notice] Announcing the End of Demo Server [Read me]
Jihan Kim 2013-05-09
change view filename (HIVE-211)
@19c32686b4c85cc658009624798538d657b6fb8d
app/controllers/ProjectApp.java
--- app/controllers/ProjectApp.java
+++ app/controllers/ProjectApp.java
@@ -43,10 +43,26 @@
     public static final String[] LOGO_TYPE = {"jpg", "jpeg", "png", "gif", "bmp"};
     private static final int MAX_FETCH_PROJECTS = 1000;
 
+    /**
+     * getProject
+     * @param userName
+     * @param projectName
+     * @return
+     */
     public static Project getProject(String userName, String projectName) {
         return Project.findByNameAndOwner(userName, projectName);
     }
 
+    /**
+     * project
+     * @param userName
+     * @param projectName
+     * @return
+     * @throws IOException
+     * @throws ServletException
+     * @throws SVNException
+     * @throws GitAPIException
+     */
     public static Result project(String userName, String projectName) throws IOException, ServletException, SVNException, GitAPIException {
         Project project = ProjectApp.getProject(userName, projectName);
         if (!AccessControl.isAllowed(UserApp.currentUser(), project.asResource(), Operation.READ)) {
@@ -67,6 +83,10 @@
         return ok(overview.render("title.projectHome", getProject(userName, projectName), histories));
     }
 
+    /**
+     * newProjectForm
+     * @return
+     */
     public static Result newProjectForm() {
         if (session().get(UserApp.SESSION_USERID) == null) {
             flash(Constants.WARNING, "user.login.alert");
@@ -75,6 +95,12 @@
             return ok(create.render("title.newProject", form(Project.class)));
     }
 
+    /**
+     * settingForm
+     * @param userName
+     * @param projectName
+     * @return
+     */
     public static Result settingForm(String userName, String projectName) {
         Project project = getProject(userName, projectName);
         if (!AccessControl.isAllowed(UserApp.currentUser(), project.asResource(), Operation.UPDATE)) {
@@ -106,11 +132,18 @@
 
             RepositoryService.createRepository(project);
 
-            return redirect(routes.ProjectApp.project(project.owner,
-                    project.name));
+            return redirect(routes.ProjectApp.project(project.owner, project.name));
         }
     }
 
+    /**
+     * settingProject
+     * @param userName
+     * @param projectName
+     * @return
+     * @throws IOException
+     * @throws NoSuchAlgorithmException
+     */
     public static Result settingProject(String userName, String projectName) throws IOException, NoSuchAlgorithmException {
         Form<Project> filledUpdatedProjectForm = form(Project.class)
                 .bindFromRequest();
@@ -152,6 +185,11 @@
         }
     }
 
+    /**
+     * isImageFile
+     * @param filename
+     * @return
+     */
     public static boolean isImageFile(String filename) {
         boolean isImageFile = false;
         for(String suffix : LOGO_TYPE) {
@@ -161,6 +199,12 @@
         return isImageFile;
     }
 
+    /**
+     * deleteForm
+     * @param userName
+     * @param projectName
+     * @return
+     */
     public static Result deleteForm(String userName, String projectName) {
         Project project = getProject(userName, projectName);
         if (!AccessControl.isAllowed(UserApp.currentUser(), project.asResource(), Operation.UPDATE)) {
@@ -171,6 +215,13 @@
         return ok(delete.render("title.projectSetting", projectForm, project));
     }
     
+    /**
+     * deleteProject
+     * @param userName
+     * @param projectName
+     * @return
+     * @throws Exception
+     */
     public static Result deleteProject(String userName, String projectName) throws Exception {
         Project project = getProject(userName, projectName);
 
@@ -184,13 +235,25 @@
         }
     }
 
+    /**
+     * members
+     * @param userName
+     * @param projectName
+     * @return
+     */
     public static Result members(String userName, String projectName) {
         Project project = getProject(userName, projectName);
-        return ok(memberList.render("title.memberList",
+        return ok(views.html.project.members.render("title.memberList",
                 ProjectUser.findMemberListByProject(project.id), project,
                 Role.getActiveRoles()));
     }
 
+    /**
+     * newMember
+     * @param userName
+     * @param projectName
+     * @return
+     */
     public static Result newMember(String userName, String projectName) {
         // TODO change into view validation
         Form<User> addMemberForm = form(User.class).bindFromRequest();
@@ -217,6 +280,13 @@
         return redirect(routes.ProjectApp.members(userName, projectName));
     }
 
+    /**
+     * deleteMember
+     * @param userName
+     * @param projectName
+     * @param userId
+     * @return
+     */
     public static Result deleteMember(String userName, String projectName,
             Long userId) {
         Project project = getProject(userName, projectName);
@@ -232,6 +302,13 @@
         }
     }
 
+    /**
+     * editMemeber
+     * @param userName
+     * @param projectName
+     * @param userId
+     * @return
+     */
     public static Result editMember(String userName, String projectName, Long userId) {
         Project project = getProject(userName, projectName);
         if (AccessControl.isAllowed(UserApp.currentUser(), project.asResource(), Operation.UPDATE)) {
@@ -246,6 +323,13 @@
         }
     }
 
+    /**
+     * projects
+     * @param filter
+     * @param state
+     * @param pageNum
+     * @return
+     */
     public static Result projects(String filter, String state, int pageNum) {
         final String HTML = "text/html";
         final String JSON = "application/json";
@@ -285,9 +369,15 @@
         Page<Project> projects = FinderTemplate.getPage(
                 orderParams, searchParams, Project.find, Project.PROJECT_COUNT_PER_PAGE, pageNum - 1);
 
-        return ok(projectList.render("title.projectList", projects, filter, state));
+        return ok(views.html.project.list.render("title.projectList", projects, filter, state));
     }
 
+    /**
+     * tags
+     * @param ownerName
+     * @param projectName
+     * @return
+     */
     public static Result tags(String ownerName, String projectName) {
         Project project = Project.findByNameAndOwner(ownerName, projectName);
         if (!AccessControl.isAllowed(UserApp.currentUser(), project.asResource(), Operation.READ)) {
@@ -306,6 +396,12 @@
         return ok(toJson(tags));
     }
 
+    /**
+     * tag
+     * @param ownerName
+     * @param projectName
+     * @return
+     */
     public static Result tag(String ownerName, String projectName) {
         Project project = Project.findByNameAndOwner(ownerName, projectName);
         if (!AccessControl.isAllowed(UserApp.currentUser(), project.asResource(), Operation.UPDATE)) {
@@ -332,6 +428,13 @@
         }
     }
 
+    /**
+     * untag
+     * @param ownerName
+     * @param projectName
+     * @param id
+     * @return
+     */
     public static Result untag(String ownerName, String projectName, Long id) {
         Project project = Project.findByNameAndOwner(ownerName, projectName);
         if (!AccessControl.isAllowed(UserApp.currentUser(), project.asResource(), Operation.UPDATE)) {
 
app/views/googleAnalytics.scala.html (added)
+++ app/views/googleAnalytics.scala.html
@@ -0,0 +1,13 @@
+@(accountId:String)
+
+<script type="text/javascript">
+	var _gaq = _gaq || [];
+	_gaq.push(['_setAccount', '@accountId']);
+	_gaq.push(['_trackPageview']);
+
+	(function() {
+		var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+		ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+		var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+	})();
+</script>(No newline at end of file)
 
app/views/project/create.scala.html (added)
+++ app/views/project/create.scala.html
@@ -0,0 +1,101 @@
+@(title:String, newProjectForm:Form[Project])
+
+@import playRepository.RepositoryService
+
+@home(title, utils.MenuType.NEW_PROJECT){
+    <div class="page">
+        <div class="form-wrap new-project">
+            <form action="@routes.ProjectApp.newProject()" method="post" name="newproject" class="frm-wrap">
+            	<dl>
+            		<dt>
+            			<div class="n-alert" data-errType="name">
+		                    <div class="n-inner orange">
+		                        <span class="msg">@Messages("project.wrongName")</span>
+		                        <a href="#!/close" class="ico btn-delete"></a>
+		                    </div>
+		                </div>
+            			<label for="project-name">@Messages("project.name.placeholder")</label>
+            		</dt>
+            		<dd>
+            			<input id="project-name" type="text" name="name" class="text" placeholder="@Messages("project.name.alert")" maxlength="250">
+            		</dd>
+            		
+            		<dt>
+						<label for="description">@Messages("project.description.placeholder")</label>
+					</dt>
+					<dd>
+						<textarea id="description" name="overview" class="text textarea.span4" style="resize:vertical;"></textarea>
+					</dd>
+            	</dl>
+
+                <ul class="options unstyled">
+                    <li class="option">
+                        <div class="option-label">@Messages("project.shareOption")</div>
+                        <div class="option-desc">
+                            <input name="share_option" type="radio" checked="checked" id="public" value="true" class="radio-btn"><label for="public" class="bg-radiobtn label-public">공개</label>
+                            <input name="share_option" type="radio" id="private" value="false" class="radio-btn"><label for="private" class="bg-radiobtn label-private">비공개</label>
+                            <span class="note">@Messages("project.private.notice")</span>
+                        </div>
+                    </li>
+                    <li class="option">
+                        <div class="option-label">@Messages("project.vcs")</div>
+                        <div class="option-desc">
+							<div class="btn-group" data-name="vcs">
+								<button class="btn dropdown-toggle large" data-toggle="dropdown">
+									<span class="d-label"></span> 
+									<span class="d-caret"><span class="caret"></span></span>
+								</button>
+								<ul class="dropdown-menu">
+                                    @RepositoryService.vcsTypes.map{ v =>
+                                        <li data-value="@v._1" @if(v._1 == "GIT"){ data-selected="true" class="active" }><a href="javascript:void(0)">@Messages(v._2)</a></li>
+                                    }
+								</ul>
+							</div>
+                        </div>
+                    </li>
+                    
+                    @**
+                    <!-- 
+                    <li class="option">
+                        <div class="option-label">이용약관 <a href="#agreement" data-toggle="modal"><i class="ico ico-que-mark"></i></a></div>
+                        <div id="agreement" class="modal hide fade">
+                          <div class="modal-header">
+                            <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+                            <h3>이용약관</h3>
+                          </div>
+                          <div class="modal-body">
+                            <pre>@agreements()</pre>
+                          </div>
+                          <div class="modal-footer">
+                            <a href="#" class="btn" data-dismiss="modal">Close</a>
+                          </div>
+                        </div>
+                        <div class="option-desc">
+	                        <div class="n-alert" data-errType="accept">
+			                    <div class="n-inner orange">
+			                        <span class="msg">@Messages("project.new.agreement.alert")</span>
+			                        <a href="#!/close" class="ico btn-delete"></a>
+			                    </div>
+			                </div>
+                            <input type="checkbox" class="stipulation checkbox checkbox-btn" autocomplete="off" id="stipulation" name="accept"><label for="stipulation" class="bg-checkbox label-agreement">본인은 약관에 대한 안내를 읽었으며 동의 합니다.</label>
+                        </div>
+                    </li>
+                     -->
+                    **@
+                </ul>
+                <div class="actions">
+                    <button class="nbtn orange medium">@Messages("project.create")</button>
+                    <a href="/" class="nbtn medium black">@Messages("button.cancel")</a>
+                </div>
+            </form>
+        </div>
+    </div>
+
+<script type="text/javascript">
+    $(document).ready(function(){
+    	$hive.loadModule("project.New", {
+    		"sFormName": "newproject"
+    	});
+    });
+</script>
+}
 
app/views/project/delete.scala.html (added)
+++ app/views/project/delete.scala.html
@@ -0,0 +1,47 @@
+@(message: String)(projectForm: Form[Project], project:Project)
+
+@import helper._
+@import utils.TemplateHelper._
+
+@main(message, project, utils.MenuType.PROJECT_SETTING) {
+<div class="page">
+	@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="nbtn medium orange"><!-- 
+         --><i class="ico ico-delete-small"></i>@Messages("project.delete.this")</a>
+    </div>
+
+
+	<div id="alertDeletion" class="modal hide">
+	    <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="nbtn medium" data-dismiss="modal">@Messages("button.no")</a>
+	        <a href="@routes.ProjectApp.deleteProject(project.owner, project.name)" class="nbtn medium orange">@Messages("button.yes")</a>
+	    </div>
+	</div>
+</div>
+	
+<script type="text/javascript">
+	$(document).ready(function(){
+        $hive.loadModule("project.Delete");
+	});
+</script>
+}(No newline at end of file)
app/views/project/list.scala.html (Renamed from app/views/project/projectList.scala.html)
--- app/views/project/projectList.scala.html
+++ app/views/project/list.scala.html
No changes
app/views/project/members.scala.html (Renamed from app/views/project/memberList.scala.html)
--- app/views/project/memberList.scala.html
+++ app/views/project/members.scala.html
No changes
 
app/views/project/navbar.scala.html (added)
+++ app/views/project/navbar.scala.html
@@ -0,0 +1,72 @@
+@(project:Project) 
+@import utils._ 
+@import models.enumeration.ResourceType; 
+@import utils.TemplateHelper._ 
+@import utils.AccessControl._
+
+<div class="gnb-inner">
+	<div class="gnb-menu-wrap">
+		<a href="@routes.Application.index()" class="logo"><span>@Messages("hive.name")</span></a>
+
+		<h1 class="page-title">
+			<span class="gray">/ <a href="@routes.UserApp.userInfo(project.owner)">@project.owner</a> /</span><!-- 
+	 	--> <a href="@routes.ProjectApp.project(project.owner, project.name)">@project.name</a>
+		</h1>
+
+		<div class="gnb-menus right">
+			@if(session.contains("loginId")){
+			<div class="usermenu btn-group">
+				<button class="btn dropdown-toggle large" data-toggle="dropdown">
+					<div class="d-label">
+						<span class="avatar-wrap smaller">
+							<img src="@User.findByLoginId(session.get("loginId")).avatarUrl" width="20" height="20">
+						</span> <span class="text">@session.get("loginId")</span>
+					</div>
+					<span class="d-caret"><span class="caret"></span></span>
+				</button>
+				<ul class="dropdown-menu">
+					<li><a href="@routes.UserApp.userInfo(session.get("loginId"))">@Messages("userinfo.profile")</a></li>
+					<li><a href="@routes.UserApp.editUserInfoForm()">@Messages("userinfo.accountSetting")</a></li>
+					<li><a href="@routes.UserApp.logout()">@Messages("title.logout")</a></li>
+					<li class="divider"></li>
+			@defining(User.findByLoginId(session.get("loginId")).myProjects()){ myProjects => 
+				@if(myProjects.length > 0){
+					<li class="disabled"><span>@Messages("project.myproject")</span></li>
+					@for(project <- myProjects){
+					<li><a href="@routes.ProjectApp.project(project.owner, project.name)">@project.name (@project.owner)</a></li>
+					}
+				} 
+			}
+				</ul>
+			</div>
+			} else {
+			<div class="usermenu lnk-group">
+				<a href="@routes.UserApp.loginForm()">
+					<span class="avatar-wrap smaller">
+						<img src="@routes.Assets.at("images/default-avatar-34.png")" width="20" height="20">
+					</span> @Messages("title.login")
+				</a><!-- 
+             --><a href="@routes.UserApp.signupForm()">@Messages("title.signup")</a>
+			</div>
+			}
+
+			<div class="search-bar">
+				<form action="@routes.ProjectApp.projects()" class="form-searchbar">
+					<input type="text" class="text" name="filter" autocomplete="off" accesskey="S"><!-- 
+		 		 --><button type="submit" class="ico ico-search"></button>
+				</form>
+			</div>
+		</div>
+	</div>
+</div>
+
+@if(ProjectUser.isAllowedToSettings(session.get("loginId"), project)) {
+<div class="side-menu-wrap">
+    <ul class="side-menus unstyled bg">
+		<!--
+        <li class="side-menu"><a href="@routes.StatisticsApp.statistics(project.owner, project.name)"><i class="ico ico-statistics"></i></a></li>
+        -->
+        <li class="side-menu"><a href="@routes.ProjectApp.settingForm(project.owner, project.name)"><i class="ico ico-setting"></i></a></li>
+    </ul>
+</div>
+}(No newline at end of file)
 
app/views/project/overview.scala.html (added)
+++ app/views/project/overview.scala.html
@@ -0,0 +1,126 @@
+
+@(message: String, project: Project, histories: List[models.History] )
+
+@import utils.JodaDateUtil._
+@import utils.TemplateHelper._
+@import models.enumeration._
+
+@projectLogoImage = @{
+	defining(Attachment.findByContainer(project.asResource)) { files =>
+		if(files.size > 0){
+			"/files/" + files.head.id
+		} else {
+			routes.Assets.at("images/bg-default-project.jpg")
+		}
+	}
+}
+
+@main(message, project, utils.MenuType.PROJECT_HOME) {
+<div class="page">
+	@prjmenu(project, utils.MenuType.PROJECT_HOME, "")
+
+    <div class="input-prepend project-hometop-wrap">
+    	<div class="vcs-wrap pull-left">
+    		<span class="clone-label"><strong class="@project.vcs">@project.vcs</strong></span><!-- 
+    	 --><input id="repositoryURL" type="text" class="text repo-url" readonly="readonly" value="@CodeApp.getURL(project.owner, project.name)">
+        </div>
+        <div class="issue-wrap btn-group pull-right">
+            <button class="btn" disabled="true">@Messages("menu.issue")</button>
+            <a href="@routes.IssueApp.issues(project.owner, project.name, State.OPEN.state)" class="btn">
+                @Messages("issue.state.open") <strong class="num open">@Issue.countIssues(project.id, State.OPEN)</strong> 
+            </a>
+            <a href="@routes.IssueApp.issues(project.owner, project.name, State.CLOSED.state)" class="btn">
+                @Messages("issue.state.closed") <strong class="num">@Issue.countIssues(project.id, State.CLOSED)</strong> 
+            </a>
+        </div>
+    </div>
+
+    <div class="bubble-wrap dark-gray project-home">
+        <div class="inner logo" style="background-image:url('@projectLogoImage');"></div>
+        <div class="inner project-info">
+            <header>
+                <h3>@Messages("project.info")</h3>
+                <!--<div class="project-status">
+                    <i class="ico ico-like"></i>
+                    <span class="num">100</span>
+                    <span class="sp">|</span>
+                    <i class="ico ico-activity high"></i>
+                </div>-->
+            </header>
+            <ul class="infos">
+                <li class="info">
+                    <strong>@Messages("project.license") :</strong> GPL v2
+                </li>
+                <li class="info">
+                    <strong>@Messages("project.tags") :</strong>
+                    @for(tag <- project.tags) {
+                    <span class="label">@tag.name</span>
+                    }
+                </li>
+                <li class="info">
+                    <strong>@Messages("project.codeLanguage") :</strong> Java, JavaScript
+                </li>
+                <li class="info">
+                    <strong>@Messages("project.vcs") :</strong> @project.vcs
+                </li>
+            </ul>
+        </div>
+        <div class="inner member-info">
+            <header>
+                <h3>@Messages("project.members")</h3>
+            </header>
+            <div class="member-wrap">
+                <ul class="project-members">
+                    @for(member <- User.findUsersByProject(project.id)){
+                    <li class="member">
+                    	<a href="@routes.UserApp.userInfo(member.loginId)" class="avatar-wrap img-rounded pull-left small">
+                        	<img src="@member.avatarUrl" alt="@member.loginId" width="24" height="24">
+                        </a>
+                        <a href="@routes.UserApp.userInfo(member.loginId)" class="name">
+                        	<strong>@member.loginId (@member.name)</strong>
+                        </a>
+                    </li>
+                    }
+                </ul>
+            </div>
+        </div>
+    </div>
+
+    @if(histories.size > 0) {
+        <table class="table table-hover">
+            <tbody>
+                @for(history <- histories.iterator()) {
+                    <tr>
+                        <td>@agoString(ago(history.getWhen()))</td>
+                        <td><a href="@history.getUserPageUrl()">@history.getWho()</a></td>
+                        <td>@history.getWhat()</td>
+                        <td><a href="@history.getUrl()">@history.getHow()</a></td>
+                    </tr>
+                }
+            </tbody>
+        </table>
+    }
+
+    <div class="bubble-wrap dark-gray readme">
+        @if(project.readme == null) {
+            <p class="default">
+                @Messages("project.readme")
+            </p>
+        } else {
+        <div class="readme-wrap">
+           <header><i class="ico ico-readme-book"></i><strong>README.md</strong></header>
+           <div class="readme-body" markdown="true">
+               @project.readme
+           </div>
+        </div>
+        }
+	    @markdown()
+    </div>
+</div>
+
+<script type="text/javascript">
+$(document).ready(function(){
+	$hive.loadModule("project.Home");
+});
+</script>
+}(No newline at end of file)
Add a comment
List