[Notice] Announcing the End of Demo Server [Read me]

Shows or hides menus on projects according to menu settings.
* Requirements: There is VOC to want to shows and hides menus on projects. * Solutions: When creating projects and change project settings, users can configure menu settings to show or hides. Menus which can be configured are `Code`, `Issue`, `Pull Request`, `Review`, `Milestone` and `Board`. After creating projects, only `Project Manager` can configure menu settings. Private-issue: 601
@67a21e777be236e14b89401df3e5ab983b0bfb17
--- app/controllers/ImportApp.java
+++ app/controllers/ImportApp.java
... | ... | @@ -20,11 +20,7 @@ |
20 | 20 |
*/ |
21 | 21 |
package controllers; |
22 | 22 |
|
23 |
-import models.Organization; |
|
24 |
-import models.OrganizationUser; |
|
25 |
-import models.Project; |
|
26 |
-import models.ProjectUser; |
|
27 |
-import models.User; |
|
23 |
+import models.*; |
|
28 | 24 |
import models.enumeration.RoleType; |
29 | 25 |
import play.data.Form; |
30 | 26 |
import play.db.ebean.Transactional; |
... | ... | @@ -97,6 +93,8 @@ |
97 | 93 |
|
98 | 94 |
Long projectId = Project.create(project); |
99 | 95 |
|
96 |
+ saveProjectMenuSetting(project); |
|
97 |
+ |
|
100 | 98 |
if (User.isLoginIdExist(owner)) { |
101 | 99 |
ProjectUser.assignRole(UserApp.currentUser().id, projectId, RoleType.MANAGER); |
102 | 100 |
} |
... | ... | @@ -119,6 +117,21 @@ |
119 | 117 |
} |
120 | 118 |
} |
121 | 119 |
|
120 |
+ private static void saveProjectMenuSetting(Project project) { |
|
121 |
+ Form<ProjectMenuSetting> filledUpdatedProjectMenuSettingForm = form(ProjectMenuSetting.class).bindFromRequest(); |
|
122 |
+ ProjectMenuSetting updatedProjectMenuSetting = filledUpdatedProjectMenuSettingForm.get(); |
|
123 |
+ |
|
124 |
+ project.refresh(); |
|
125 |
+ updatedProjectMenuSetting.project = project; |
|
126 |
+ |
|
127 |
+ if (project.menuSetting == null) { |
|
128 |
+ updatedProjectMenuSetting.save(); |
|
129 |
+ } else { |
|
130 |
+ updatedProjectMenuSetting.id = project.menuSetting.id; |
|
131 |
+ updatedProjectMenuSetting.update(); |
|
132 |
+ } |
|
133 |
+ } |
|
134 |
+ |
|
122 | 135 |
/** |
123 | 136 |
* Add assorted error messages from TransportException like Unauthorized(401), Forbidden(403) |
124 | 137 |
* or other transport error with HTTP response code to the given form. |
--- app/controllers/ProjectApp.java
+++ app/controllers/ProjectApp.java
... | ... | @@ -204,6 +204,9 @@ |
204 | 204 |
} |
205 | 205 |
ProjectUser.assignRole(user.id, Project.create(project), RoleType.MANAGER); |
206 | 206 |
RepositoryService.createRepository(project); |
207 |
+ |
|
208 |
+ saveProjectMenuSetting(project); |
|
209 |
+ |
|
207 | 210 |
return redirect(routes.ProjectApp.project(project.owner, project.name)); |
208 | 211 |
} |
209 | 212 |
|
... | ... | @@ -276,9 +279,27 @@ |
276 | 279 |
} |
277 | 280 |
|
278 | 281 |
updatedProject.update(); |
282 |
+ |
|
283 |
+ saveProjectMenuSetting(updatedProject); |
|
284 |
+ |
|
279 | 285 |
return redirect(routes.ProjectApp.settingForm(ownerId, updatedProject.name)); |
280 | 286 |
} |
281 | 287 |
|
288 |
+ private static void saveProjectMenuSetting(Project project) { |
|
289 |
+ Form<ProjectMenuSetting> filledUpdatedProjectMenuSettingForm = form(ProjectMenuSetting.class).bindFromRequest(); |
|
290 |
+ ProjectMenuSetting updatedProjectMenuSetting = filledUpdatedProjectMenuSettingForm.get(); |
|
291 |
+ |
|
292 |
+ project.refresh(); |
|
293 |
+ updatedProjectMenuSetting.project = project; |
|
294 |
+ |
|
295 |
+ if (project.menuSetting == null) { |
|
296 |
+ updatedProjectMenuSetting.save(); |
|
297 |
+ } else { |
|
298 |
+ updatedProjectMenuSetting.id = project.menuSetting.id; |
|
299 |
+ updatedProjectMenuSetting.update(); |
|
300 |
+ } |
|
301 |
+ } |
|
302 |
+ |
|
282 | 303 |
private static boolean validateWhenUpdate(String loginId, Form<Project> updateProjectForm) { |
283 | 304 |
Long id = Long.parseLong(updateProjectForm.field("id").value()); |
284 | 305 |
String name = updateProjectForm.field("name").value(); |
--- app/controllers/PullRequestApp.java
+++ app/controllers/PullRequestApp.java
... | ... | @@ -187,8 +187,9 @@ |
187 | 187 |
|
188 | 188 |
private static Project getSelectedProject(Project project, String projectId, boolean isToProject) { |
189 | 189 |
Project selectedProject = project; |
190 |
- if(isToProject && project.isForkedFromOrigin()) { |
|
191 |
- selectedProject = project.originalProject; |
|
190 |
+ if(isToProject && project.isForkedFromOrigin() && project.originalProject.menuSetting.code |
|
191 |
+ && project.originalProject.menuSetting.pullRequest) { |
|
192 |
+ selectedProject = project.originalProject; |
|
192 | 193 |
} |
193 | 194 |
|
194 | 195 |
if(StringUtils.isNumeric(projectId)) { |
--- app/models/Project.java
+++ app/models/Project.java
... | ... | @@ -126,6 +126,9 @@ |
126 | 126 |
@Enumerated(EnumType.STRING) |
127 | 127 |
public ProjectScope projectScope; |
128 | 128 |
|
129 |
+ @OneToOne(mappedBy = "project", cascade = CascadeType.ALL) |
|
130 |
+ public ProjectMenuSetting menuSetting; |
|
131 |
+ |
|
129 | 132 |
/** |
130 | 133 |
* @see {@link User#SITE_MANAGER_ID} |
131 | 134 |
* @see {@link RoleType#SITEMANAGER} |
... | ... | @@ -668,6 +671,10 @@ |
668 | 671 |
copyProject.vcs = project.vcs; |
669 | 672 |
copyProject.owner = owner; |
670 | 673 |
copyProject.projectScope = project.projectScope; |
674 |
+ copyProject.menuSetting = new ProjectMenuSetting(project.menuSetting); |
|
675 |
+ copyProject.menuSetting.project = copyProject; |
|
676 |
+ copyProject.menuSetting.save(); |
|
677 |
+ |
|
671 | 678 |
return copyProject; |
672 | 679 |
} |
673 | 680 |
|
... | ... | @@ -707,8 +714,9 @@ |
707 | 714 |
List<Project> projects = new ArrayList<>(); |
708 | 715 |
projects.add(this); |
709 | 716 |
projects.addAll(forkingProjects); |
710 |
- if(isForkedFromOrigin()) { |
|
711 |
- projects.add(originalProject); |
|
717 |
+ if(isForkedFromOrigin() && originalProject.menuSetting.code |
|
718 |
+ && originalProject.menuSetting.pullRequest) { |
|
719 |
+ projects.add(originalProject); |
|
712 | 720 |
} |
713 | 721 |
return projects; |
714 | 722 |
} |
+++ app/models/ProjectMenuSetting.java
... | ... | @@ -0,0 +1,51 @@ |
1 | +/** | |
2 | + * Yobi, Project Hosting SW | |
3 | + * | |
4 | + * Copyright 2014 NAVER Corp. | |
5 | + * http://yobi.io | |
6 | + * | |
7 | + * @Author Lee HeeGu | |
8 | + * | |
9 | + * Licensed under the Apache License, Version 2.0 (the "License"); | |
10 | + * you may not use this file except in compliance with the License. | |
11 | + * You may obtain a copy of the License at | |
12 | + * | |
13 | + * http://www.apache.org/licenses/LICENSE-2.0 | |
14 | + * | |
15 | + * Unless required by applicable law or agreed to in writing, software | |
16 | + * distributed under the License is distributed on an "AS IS" BASIS, | |
17 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
18 | + * See the License for the specific language governing permissions and | |
19 | + * limitations under the License. | |
20 | + */ | |
21 | +package models; | |
22 | + | |
23 | +import play.db.ebean.Model; | |
24 | + | |
25 | +import javax.persistence.*; | |
26 | + | |
27 | +@Entity | |
28 | +public class ProjectMenuSetting extends Model { | |
29 | + private static final long serialVersionUID = 1L; | |
30 | + public static Finder<Long, ProjectMenuSetting> finder = new Finder<>(Long.class, ProjectMenuSetting.class); | |
31 | + | |
32 | + @Id | |
33 | + public Long id; | |
34 | + @OneToOne | |
35 | + public Project project; | |
36 | + public boolean code; | |
37 | + public boolean issue; | |
38 | + public boolean pullRequest; | |
39 | + public boolean review; | |
40 | + public boolean milestone; | |
41 | + public boolean board; | |
42 | + | |
43 | + public ProjectMenuSetting(ProjectMenuSetting projectMenuSetting) { | |
44 | + this.code = projectMenuSetting.code; | |
45 | + this.issue = projectMenuSetting.issue; | |
46 | + this.pullRequest = projectMenuSetting.pullRequest; | |
47 | + this.review = projectMenuSetting.review; | |
48 | + this.milestone = projectMenuSetting.milestone; | |
49 | + this.board = projectMenuSetting.board; | |
50 | + } | |
51 | +} |
--- app/views/board/list.scala.html
+++ app/views/board/list.scala.html
... | ... | @@ -102,9 +102,11 @@ |
102 | 102 |
"nTotalPages" : @page.getTotalPageCount |
103 | 103 |
}); |
104 | 104 |
|
105 |
- yobi.ShortcutKey.setKeymapLink({ |
|
106 |
- "N": "@routes.BoardApp.newPostForm(project.owner, project.name)" |
|
107 |
- }); |
|
105 |
+ @if(project.menuSetting.board) { |
|
106 |
+ yobi.ShortcutKey.setKeymapLink({ |
|
107 |
+ "N": "@routes.BoardApp.newPostForm(project.owner, project.name)" |
|
108 |
+ }); |
|
109 |
+ } |
|
108 | 110 |
}); |
109 | 111 |
</script> |
110 | 112 |
} |
--- app/views/board/view.scala.html
+++ app/views/board/view.scala.html
... | ... | @@ -128,8 +128,10 @@ |
128 | 128 |
|
129 | 129 |
// yobi.ShortcutKey |
130 | 130 |
yobi.ShortcutKey.setKeymapLink({ |
131 |
- "N": "@routes.BoardApp.newPostForm(project.owner, project.name)", |
|
132 | 131 |
"L": "@urlToPostings" |
132 |
+ @if(project.menuSetting.board) { |
|
133 |
+ ,"N": "@routes.BoardApp.newPostForm(project.owner, project.name)" |
|
134 |
+ } |
|
133 | 135 |
@if(isAllowed(UserApp.currentUser(), post.asResource(), Operation.UPDATE)){ |
134 | 136 |
,"E": "@routes.BoardApp.editPostForm(project.owner, project.name, post.getNumber)" |
135 | 137 |
} |
--- app/views/issue/create.scala.html
+++ app/views/issue/create.scala.html
... | ... | @@ -83,7 +83,7 @@ |
83 | 83 |
</dl> |
84 | 84 |
} |
85 | 85 |
|
86 |
- @if(isProjectResourceCreatable(UserApp.currentUser(), project, ResourceType.ISSUE_MILESTONE)) { |
|
86 |
+ @if(project.menuSetting.milestone && isProjectResourceCreatable(UserApp.currentUser(), project, ResourceType.ISSUE_MILESTONE)) { |
|
87 | 87 |
<dl id="milestoneOption" class="issue-option"> |
88 | 88 |
<dt>@Messages("milestone")</dt> |
89 | 89 |
<dd> |
--- app/views/issue/edit.scala.html
+++ app/views/issue/edit.scala.html
... | ... | @@ -104,7 +104,7 @@ |
104 | 104 |
</dl> |
105 | 105 |
} |
106 | 106 |
|
107 |
- @if(isAllowed(UserApp.currentUser(), issue.milestoneAsResource(), Operation.UPDATE)){ |
|
107 |
+ @if(project.menuSetting.milestone && isAllowed(UserApp.currentUser(), issue.milestoneAsResource(), Operation.UPDATE)){ |
|
108 | 108 |
<dl id="milestoneOption" class="issue-option"> |
109 | 109 |
<dt>@Messages("milestone")</dt> |
110 | 110 |
<dd> |
--- app/views/issue/my_partial_list.scala.html
+++ app/views/issue/my_partial_list.scala.html
... | ... | @@ -18,7 +18,7 @@ |
18 | 18 |
* See the License for the specific language governing permissions and |
19 | 19 |
* limitations under the License. |
20 | 20 |
**@ |
21 |
-@(issueList:Collection[Issue], searchCondition:models.support.SearchCondition, pageIndex:Int, totalPageCount:Int) |
|
21 |
+@(issueList:Collection[Issue], searchCondition:models.support.SearchCondition, pageIndex:Int, totalPageCount:Int, project:Project) |
|
22 | 22 |
@import java.util |
23 | 23 |
@import utils.JodaDateUtil |
24 | 24 |
@import utils.TemplateHelper._ |
... | ... | @@ -89,7 +89,7 @@ |
89 | 89 |
} |
90 | 90 |
</div> |
91 | 91 |
<div class="pull-right"> |
92 |
- @if(issue.milestone != null) { |
|
92 |
+ @if(project.menuSetting.milestone && issue.milestone != null) { |
|
93 | 93 |
<div class="mileston-tag"> |
94 | 94 |
<a href="@routes.MilestoneApp.milestone(issue.project.owner, issue.project.name, issue.milestone.id)" data-toggle="tooltip" data-placement="top" title="@Messages("milestone")"> |
95 | 95 |
@issue.milestone.title |
--- app/views/issue/my_partial_search.scala.html
+++ app/views/issue/my_partial_search.scala.html
... | ... | @@ -116,7 +116,7 @@ |
116 | 116 |
} |
117 | 117 |
</div> |
118 | 118 |
|
119 |
- @my_partial_list(currentPage.getList, param, currentPage.getPageIndex, currentPage.getTotalPageCount) |
|
119 |
+ @my_partial_list(currentPage.getList, param, currentPage.getPageIndex, currentPage.getTotalPageCount, project) |
|
120 | 120 |
|
121 | 121 |
<div class="pull-left" style="padding:10px;"> |
122 | 122 |
</div> |
--- app/views/issue/partial_list.scala.html
+++ app/views/issue/partial_list.scala.html
... | ... | @@ -93,7 +93,7 @@ |
93 | 93 |
} |
94 | 94 |
</div> |
95 | 95 |
<div class="pull-right"> |
96 |
- @if(issue.milestone != null) { |
|
96 |
+ @if(project.menuSetting.milestone && issue.milestone != null) { |
|
97 | 97 |
<div class="mileston-tag"> |
98 | 98 |
<a href="@routes.MilestoneApp.milestone(project.owner, project.name, issue.milestone.id)" data-toggle="tooltip" data-placement="top" title="@Messages("milestone")"> |
99 | 99 |
@issue.milestone.title |
--- app/views/issue/partial_massupdate.scala.html
+++ app/views/issue/partial_massupdate.scala.html
... | ... | @@ -95,6 +95,7 @@ |
95 | 95 |
</ul> |
96 | 96 |
</div> |
97 | 97 |
|
98 |
+ @if(project.menuSetting.milestone) { |
|
98 | 99 |
<div id="milestone" class="btn-group" data-name="milestone.id"> |
99 | 100 |
<button class="btn dropdown-toggle medium" data-toggle="dropdown" disabled="disabled"> |
100 | 101 |
<span class="d-label">@Messages("issue.update.milestone")</span> |
... | ... | @@ -108,6 +109,7 @@ |
108 | 109 |
} |
109 | 110 |
</ul> |
110 | 111 |
</div> |
112 |
+ } |
|
111 | 113 |
|
112 | 114 |
<div id="attaching-label" class="btn-group" data-name="attachingLabel[0].id"> |
113 | 115 |
<button class="btn dropdown-toggle medium" data-toggle="dropdown" disabled="disabled"> |
--- app/views/issue/partial_search.scala.html
+++ app/views/issue/partial_search.scala.html
... | ... | @@ -141,6 +141,7 @@ |
141 | 141 |
</dd> |
142 | 142 |
</dl> |
143 | 143 |
|
144 |
+ @if(project.menuSetting.milestone) { |
|
144 | 145 |
<dl class="issue-option"> |
145 | 146 |
<dt>@Messages("milestone")</dt> |
146 | 147 |
<dd> |
... | ... | @@ -175,6 +176,7 @@ |
175 | 176 |
</select> |
176 | 177 |
</dd> |
177 | 178 |
</dl> |
179 |
+ } |
|
178 | 180 |
</div> |
179 | 181 |
|
180 | 182 |
<hr> |
... | ... | @@ -259,9 +261,11 @@ |
259 | 261 |
}); |
260 | 262 |
|
261 | 263 |
// ShortcutKey |
262 |
- yobi.ShortcutKey.setKeymapLink({ |
|
263 |
- "N": "@routes.IssueApp.newIssueForm(project.owner, project.name)" |
|
264 |
- }); |
|
264 |
+ @if(project.menuSetting.issue) { |
|
265 |
+ yobi.ShortcutKey.setKeymapLink({ |
|
266 |
+ "N": "@routes.IssueApp.newIssueForm(project.owner, project.name)" |
|
267 |
+ }); |
|
268 |
+ } |
|
265 | 269 |
}); |
266 | 270 |
</script> |
267 | 271 |
</div> |
--- app/views/issue/view.scala.html
+++ app/views/issue/view.scala.html
... | ... | @@ -156,6 +156,7 @@ |
156 | 156 |
@**<!-- // -->**@ |
157 | 157 |
|
158 | 158 |
@**<!-- milestones -->**@ |
159 |
+ @if(project.menuSetting.milestone) { |
|
159 | 160 |
<dl> |
160 | 161 |
<dt>@Messages("milestone")</dt> |
161 | 162 |
<dd style="padding:5px 10px;"> |
... | ... | @@ -202,6 +203,7 @@ |
202 | 203 |
} |
203 | 204 |
</dd> |
204 | 205 |
</dl> |
206 |
+ } |
|
205 | 207 |
@**<!-- // -->**@ |
206 | 208 |
|
207 | 209 |
@**<!-- labels -->**@ |
... | ... | @@ -363,8 +365,10 @@ |
363 | 365 |
|
364 | 366 |
// yobi.ShortcutKey |
365 | 367 |
yobi.ShortcutKey.setKeymapLink({ |
366 |
- "N": "@routes.IssueApp.newIssueForm(project.owner, project.name)", |
|
367 | 368 |
"L": "@urlToIssues" |
369 |
+ @if(project.menuSetting.issue) { |
|
370 |
+ ,"N": "@routes.IssueApp.newIssueForm(project.owner, project.name)" |
|
371 |
+ } |
|
368 | 372 |
@if(isAllowed(UserApp.currentUser(), issue.asResource(), Operation.UPDATE)) { |
369 | 373 |
,"E": "@routes.IssueApp.editIssueForm(project.owner, project.name, issue.getNumber)" |
370 | 374 |
} |
--- app/views/milestone/list.scala.html
+++ app/views/milestone/list.scala.html
... | ... | @@ -145,11 +145,13 @@ |
145 | 145 |
} |
146 | 146 |
</div> |
147 | 147 |
</div> |
148 |
+@if(project.menuSetting.milestone) { |
|
148 | 149 |
<script type="text/javascript"> |
149 |
- $(document).ready(function() { |
|
150 |
+ $(document).ready(function () { |
|
150 | 151 |
yobi.ShortcutKey.setKeymapLink({ |
151 |
- "N": "@routes.MilestoneApp.newMilestoneForm(project.owner, project.name)" |
|
152 |
+ "N": "@routes.MilestoneApp.newMilestoneForm(project.owner, project.name)" |
|
152 | 153 |
}); |
153 | 154 |
}); |
154 | 155 |
</script> |
155 | 156 |
} |
157 |
+} |
--- app/views/project/create.scala.html
+++ app/views/project/create.scala.html
... | ... | @@ -163,6 +163,32 @@ |
163 | 163 |
} |
164 | 164 |
</div> |
165 | 165 |
</div> |
166 |
+ <hr> |
|
167 |
+ <!-- Menu Setting --> |
|
168 |
+ <div class="row-fluid"> |
|
169 |
+ <div class="span2 right-txt"> |
|
170 |
+ @Messages("project.menu.setting") |
|
171 |
+ </div> |
|
172 |
+ <div class="span10"> |
|
173 |
+ <input type="checkbox" class="radio-btn" id="menuSettingCode" name="code" value="true" checked="checked"> |
|
174 |
+ <label for="menuSettingCode" class="bg-radiobtn label-public">@Messages("menu.code")</label> |
|
175 |
+ |
|
176 |
+ <input type="checkbox" class="radio-btn" id="menuSettingIssue" name="issue" value="true" checked="checked"> |
|
177 |
+ <label for="menuSettingIssue" class="bg-radiobtn label-public">@Messages("menu.issue")</label> |
|
178 |
+ |
|
179 |
+ <input type="checkbox" class="radio-btn" id="menuSettingPullRequest" name="pullRequest" value="true" checked="checked"> |
|
180 |
+ <label for="menuSettingPullRequest" class="bg-radiobtn label-public">@Messages("menu.pullRequest")</label> |
|
181 |
+ |
|
182 |
+ <input type="checkbox" class="radio-btn" id="menuSettingReview" name="review" value="true" checked="checked"> |
|
183 |
+ <label for="menuSettingReview" class="bg-radiobtn label-public">@Messages("menu.review")</label> |
|
184 |
+ |
|
185 |
+ <input type="checkbox" class="radio-btn" id="menuSettingMilestone" name="milestone" value="true" checked="checked"> |
|
186 |
+ <label for="menuSettingMilestone" class="bg-radiobtn label-public">@Messages("milestone")</label> |
|
187 |
+ |
|
188 |
+ <input type="checkbox" class="radio-btn" id="menuSettingBoard" name="board" value="true" checked="checked"> |
|
189 |
+ <label for="menuSettingBoard" class="bg-radiobtn label-public">@Messages("menu.board")</label> |
|
190 |
+ </div> |
|
191 |
+ </div> |
|
166 | 192 |
<!-- // --> |
167 | 193 |
</div> |
168 | 194 |
|
--- app/views/project/home.scala.html
+++ app/views/project/home.scala.html
... | ... | @@ -51,10 +51,12 @@ |
51 | 51 |
</form> |
52 | 52 |
</div> |
53 | 53 |
</div> |
54 |
- <div class="project-clone-wrap span3"> |
|
55 |
- <input type="text" class="project-clone-url" id="cloneURL" readonly="readonly" value="@if(project.isGit){@CodeApp.getURLWithLoginId(project)} else {@CodeApp.getURL(project)}"> |
|
56 |
- <button class="ybtn project-clone-button" id="cloneURLBtn">@Messages("code.copyUrl")</button> |
|
57 |
- </div> |
|
54 |
+ @if(project.menuSetting.code) { |
|
55 |
+ <div class="project-clone-wrap span3"> |
|
56 |
+ <input type="text" class="project-clone-url" id="cloneURL" readonly="readonly" value="@if(project.isGit){@CodeApp.getURLWithLoginId(project)} else {@CodeApp.getURL(project)}"> |
|
57 |
+ <button class="ybtn project-clone-button" id="cloneURLBtn">@Messages("code.copyUrl")</button> |
|
58 |
+ </div> |
|
59 |
+ } |
|
58 | 60 |
</div> |
59 | 61 |
<div class="row-fluid"> |
60 | 62 |
<div class="span9"> |
... | ... | @@ -102,20 +104,26 @@ |
102 | 104 |
<div class="span3"> |
103 | 105 |
<div class="bubble-wrap gray project-home"> |
104 | 106 |
<div class="project-btn-wrap"> |
105 |
- <span class="project-btn-item"> |
|
106 |
- <a href="@routes.IssueApp.newIssueForm(project.owner, project.name)" class="ybtn ybtn-success">@Messages("button.newIssue")</a> |
|
107 |
- </span> |
|
108 |
- @if(project.vcs.equals("GIT")){ |
|
109 |
- <span class="project-btn-item"> |
|
110 |
- <a href="@routes.PullRequestApp.newFork(project.owner, project.name)" class="ybtn ybtn-inverse"> |
|
111 |
- @Messages("fork") |
|
112 |
- </a> |
|
113 |
- </span> |
|
107 |
+ @if(project.menuSetting.issue) { |
|
108 |
+ <span class="project-btn-item"> |
|
109 |
+ <a href="@routes.IssueApp.newIssueForm(project.owner, project.name)" class="ybtn ybtn-success">@Messages("button.newIssue")</a> |
|
110 |
+ </span> |
|
111 |
+ } |
|
112 |
+ @if(project.menuSetting.code) { |
|
113 |
+ @if(project.vcs.equals("GIT")){ |
|
114 |
+ <span class="project-btn-item"> |
|
115 |
+ <a href="@routes.PullRequestApp.newFork(project.owner, project.name)" class="ybtn ybtn-inverse"> |
|
116 |
+ @Messages("fork") |
|
117 |
+ </a> |
|
118 |
+ </span> |
|
119 |
+ } |
|
114 | 120 |
} |
115 | 121 |
</div> |
116 |
- @defining(Milestone.findOpenMilestones(project.id)){ milestones => |
|
117 |
- @if(milestones.length > 0){ |
|
118 |
- @views.html.milestone.partial_status(milestones(0), project) |
|
122 |
+ @if(project.menuSetting.milestone) { |
|
123 |
+ @defining(Milestone.findOpenMilestones(project.id)){ milestones => |
|
124 |
+ @if(milestones.length > 0){ |
|
125 |
+ @views.html.milestone.partial_status(milestones(0), project) |
|
126 |
+ } |
|
119 | 127 |
} |
120 | 128 |
} |
121 | 129 |
|
--- app/views/project/importing.scala.html
+++ app/views/project/importing.scala.html
... | ... | @@ -184,6 +184,33 @@ |
184 | 184 |
</div> |
185 | 185 |
</div> |
186 | 186 |
<!-- // --> |
187 |
+ <hr> |
|
188 |
+ <!-- VCS --> |
|
189 |
+ <div class="row-fluid"> |
|
190 |
+ <div class="span2 right-txt"> |
|
191 |
+ @Messages("project.menu.setting") |
|
192 |
+ </div> |
|
193 |
+ <div class="span10 cu-desc"> |
|
194 |
+ <input type="checkbox" class="radio-btn" id="menuSettingCode" name="code" value="true" checked="checked"> |
|
195 |
+ <label for="menuSettingCode" class="bg-radiobtn label-public">@Messages("menu.code")</label> |
|
196 |
+ |
|
197 |
+ <input type="checkbox" class="radio-btn" id="menuSettingIssue" name="issue" value="true" checked="checked"> |
|
198 |
+ <label for="menuSettingIssue" class="bg-radiobtn label-public">@Messages("menu.issue")</label> |
|
199 |
+ |
|
200 |
+ <input type="checkbox" class="radio-btn" id="menuSettingPullRequest" name="pullRequest" value="true" checked="checked"> |
|
201 |
+ <label for="menuSettingPullRequest" class="bg-radiobtn label-public">@Messages("menu.pullRequest")</label> |
|
202 |
+ |
|
203 |
+ <input type="checkbox" class="radio-btn" id="menuSettingReview" name="review" value="true" checked="checked"> |
|
204 |
+ <label for="menuSettingReview" class="bg-radiobtn label-public">@Messages("menu.review")</label> |
|
205 |
+ |
|
206 |
+ <input type="checkbox" class="radio-btn" id="menuSettingMilestone" name="milestone" value="true" checked="checked"> |
|
207 |
+ <label for="menuSettingMilestone" class="bg-radiobtn label-public">@Messages("milestone")</label> |
|
208 |
+ |
|
209 |
+ <input type="checkbox" class="radio-btn" id="menuSettingBoard" name="board" value="true" checked="checked"> |
|
210 |
+ <label for="menuSettingBoard" class="bg-radiobtn label-public">@Messages("menu.board")</label> |
|
211 |
+ </div> |
|
212 |
+ </div> |
|
213 |
+ <!-- // --> |
|
187 | 214 |
</div> |
188 | 215 |
|
189 | 216 |
<div class="actions mt20"> |
--- app/views/project/partial_dashboard.scala.html
+++ app/views/project/partial_dashboard.scala.html
... | ... | @@ -26,32 +26,40 @@ |
26 | 26 |
<div class="content-container nm"> |
27 | 27 |
<div class="project-overview-home row-fluid"> |
28 | 28 |
<div class="span6"> |
29 |
- <h5>@Messages("project.dashboard.openIssuesByAssignee")</h5> |
|
30 |
- <div class="overview-assignee"> |
|
31 |
- @partial_dashboard_issuesbyassignee(project, openIssues) |
|
32 |
- </div> |
|
29 |
+ @if(project.menuSetting.issue) { |
|
30 |
+ <h5>@Messages("project.dashboard.openIssuesByAssignee")</h5> |
|
31 |
+ <div class="overview-assignee"> |
|
32 |
+ @partial_dashboard_issuesbyassignee(project, openIssues) |
|
33 |
+ </div> |
|
33 | 34 |
|
34 |
- <hr> |
|
35 |
+ <hr> |
|
35 | 36 |
|
36 |
- <h5>@Messages("project.dashboard.openIssuesByMilestone")</h5> |
|
37 |
- <div class="overview-milestone"> |
|
38 |
- @partial_dashboard_issuesbymilestone(project, openIssues) |
|
39 |
- </div> |
|
37 |
+ <h5>@Messages("project.dashboard.openIssuesByMilestone")</h5> |
|
38 |
+ <div class="overview-milestone"> |
|
39 |
+ @partial_dashboard_issuesbymilestone(project, openIssues) |
|
40 |
+ </div> |
|
41 |
+ } |
|
40 | 42 |
|
41 |
- @if(project.isGit){ |
|
42 |
- <hr> |
|
43 |
+ @if(project.menuSetting.pullRequest) { |
|
44 |
+ @if(project.isGit){ |
|
45 |
+ @if(project.menuSetting.issue) { |
|
46 |
+ <hr> |
|
47 |
+ } |
|
43 | 48 |
|
44 |
- <h5>@Messages("project.dashboard.pullRequests")</h5> |
|
45 |
- <div class="overview-pullrequest"> |
|
46 |
- @partial_dashboard_pullrequests(project) |
|
47 |
- </div> |
|
49 |
+ <h5>@Messages("project.dashboard.pullRequests")</h5> |
|
50 |
+ <div class="overview-pullrequest"> |
|
51 |
+ @partial_dashboard_pullrequests(project) |
|
52 |
+ </div> |
|
53 |
+ } |
|
48 | 54 |
} |
49 | 55 |
</div> |
50 | 56 |
|
51 |
- <div class="span6"> |
|
52 |
- <h5>@Messages("project.dashboard.openIssuesByLabel")</h5> |
|
53 |
- @partial_dashboard_issuesbylabel(project) |
|
54 |
- </div> |
|
57 |
+ @if(project.menuSetting.issue) { |
|
58 |
+ <div class="span6"> |
|
59 |
+ <h5>@Messages("project.dashboard.openIssuesByLabel")</h5> |
|
60 |
+ @partial_dashboard_issuesbylabel(project) |
|
61 |
+ </div> |
|
62 |
+ } |
|
55 | 63 |
</div> |
56 | 64 |
</div> |
57 | 65 |
} |
--- app/views/project/setting.scala.html
+++ app/views/project/setting.scala.html
... | ... | @@ -123,6 +123,29 @@ |
123 | 123 |
<span class="note ml10">@Messages("project.defaultBranch.placeholder")</span> |
124 | 124 |
</div> |
125 | 125 |
</div> |
126 |
+ |
|
127 |
+ <div class="box-wrap middle"> |
|
128 |
+ <div class="cu-label vmiddle">@Messages("project.menu.setting")</div> |
|
129 |
+ <div class="cu-desc"> |
|
130 |
+ <input type="checkbox" class="radio-btn" id="menuSettingCode" name="code" value="true" @if(project.menuSetting.code){checked="checked"}> |
|
131 |
+ <label for="menuSettingCode" class="bg-radiobtn label-public">@Messages("menu.code")</label> |
|
132 |
+ |
|
133 |
+ <input type="checkbox" class="radio-btn" id="menuSettingIssue" name="issue" value="true" @if(project.menuSetting.issue){checked="checked"}> |
|
134 |
+ <label for="menuSettingIssue" class="bg-radiobtn label-public">@Messages("menu.issue")</label> |
|
135 |
+ |
|
136 |
+ <input type="checkbox" class="radio-btn" id="menuSettingPullRequest" name="pullRequest" value="true" @if(project.menuSetting.pullRequest){checked="checked"}> |
|
137 |
+ <label for="menuSettingPullRequest" class="bg-radiobtn label-public">@Messages("menu.pullRequest")</label> |
|
138 |
+ |
|
139 |
+ <input type="checkbox" class="radio-btn" id="menuSettingReview" name="review" value="true" @if(project.menuSetting.review){checked="checked"}> |
|
140 |
+ <label for="menuSettingReview" class="bg-radiobtn label-public">@Messages("menu.review")</label> |
|
141 |
+ |
|
142 |
+ <input type="checkbox" class="radio-btn" id="menuSettingMilestone" name="milestone" value="true" @if(project.menuSetting.milestone){checked="checked"}> |
|
143 |
+ <label for="menuSettingMilestone" class="bg-radiobtn label-public">@Messages("milestone")</label> |
|
144 |
+ |
|
145 |
+ <input type="checkbox" class="radio-btn" id="menuSettingBoard" name="board" value="true" @if(project.menuSetting.board){checked="checked"}> |
|
146 |
+ <label for="menuSettingBoard" class="bg-radiobtn label-public">@Messages("menu.board")</label> |
|
147 |
+ </div> |
|
148 |
+ </div> |
|
126 | 149 |
</div> |
127 | 150 |
|
128 | 151 |
<div class="box-wrap bottom"> |
--- app/views/projectMenu.scala.html
+++ app/views/projectMenu.scala.html
... | ... | @@ -44,44 +44,56 @@ |
44 | 44 |
@Messages("title.projectHome") |
45 | 45 |
</a> |
46 | 46 |
</li> |
47 |
- <li class="@isActiveMenu(MenuType.CODE)"> |
|
48 |
- <a href="@routes.CodeApp.codeBrowser(project.owner, project.name)"> |
|
49 |
- @Messages("menu.code") |
|
50 |
- </a> |
|
51 |
- </li> |
|
52 |
- <li class="@isActiveMenu(MenuType.ISSUE)"> |
|
53 |
- <a href="@routes.IssueApp.issues(project.owner, project.name, "open")"> |
|
54 |
- @Messages("menu.issue") |
|
55 |
- @if(Issue.countIssues(project.id, State.OPEN) > 0){ |
|
56 |
- <span class="project-menu-count">@Issue.countIssues(project.id, State.OPEN)</span> |
|
57 |
- } |
|
58 |
- </a> |
|
59 |
- </li> |
|
60 |
- @if(project.vcs.equals("GIT")){ |
|
61 |
- <li class="@isActiveMenu(MenuType.PULL_REQUEST)"> |
|
62 |
- <a href="@getPullRequestURL(project)"> |
|
63 |
- @Messages("menu.pullRequest") |
|
64 |
- @if(PullRequest.countOpenedPullRequests(project) > 0){ |
|
65 |
- <span class="project-menu-count">@PullRequest.countOpenedPullRequests(project)</span> |
|
66 |
- } |
|
67 |
- </a> |
|
68 |
- </li> |
|
47 |
+ @if(project.menuSetting.code) { |
|
48 |
+ <li class="@isActiveMenu(MenuType.CODE)"> |
|
49 |
+ <a href="@routes.CodeApp.codeBrowser(project.owner, project.name)"> |
|
50 |
+ @Messages("menu.code") |
|
51 |
+ </a> |
|
52 |
+ </li> |
|
69 | 53 |
} |
70 |
- <li class="@isActiveMenu(MenuType.PROJECT_REVIEW)"> |
|
71 |
- <a href="@routes.ReviewThreadApp.reviewThreads(project.owner, project.name)"> |
|
72 |
- @Messages("menu.review") |
|
73 |
- </a> |
|
74 |
- </li> |
|
75 |
- <li class="@isActiveMenu(MenuType.MILESTONE)"> |
|
76 |
- <a href="@routes.MilestoneApp.milestones(project.owner, project.name)"> |
|
77 |
- @Messages("milestone") |
|
78 |
- </a> |
|
79 |
- </li> |
|
80 |
- <li class="@isActiveMenu(MenuType.BOARD)"> |
|
81 |
- <a href="@routes.BoardApp.posts(project.owner, project.name)"> |
|
82 |
- @Messages("menu.board") |
|
83 |
- </a> |
|
84 |
- </li> |
|
54 |
+ @if(project.menuSetting.issue) { |
|
55 |
+ <li class="@isActiveMenu(MenuType.ISSUE)"> |
|
56 |
+ <a href="@routes.IssueApp.issues(project.owner, project.name, "open")"> |
|
57 |
+ @Messages("menu.issue") |
|
58 |
+ @if(Issue.countIssues(project.id, State.OPEN) > 0){ |
|
59 |
+ <span class="project-menu-count">@Issue.countIssues(project.id, State.OPEN)</span> |
|
60 |
+ } |
|
61 |
+ </a> |
|
62 |
+ </li> |
|
63 |
+ } |
|
64 |
+ @if(project.menuSetting.pullRequest) { |
|
65 |
+ @if(project.vcs.equals("GIT")){ |
|
66 |
+ <li class="@isActiveMenu(MenuType.PULL_REQUEST)"> |
|
67 |
+ <a href="@getPullRequestURL(project)"> |
|
68 |
+ @Messages("menu.pullRequest") |
|
69 |
+ @if(PullRequest.countOpenedPullRequests(project) > 0){ |
|
70 |
+ <span class="project-menu-count">@PullRequest.countOpenedPullRequests(project)</span> |
|
71 |
+ } |
|
72 |
+ </a> |
|
73 |
+ </li> |
|
74 |
+ } |
|
75 |
+ } |
|
76 |
+ @if(project.menuSetting.review) { |
|
77 |
+ <li class="@isActiveMenu(MenuType.PROJECT_REVIEW)"> |
|
78 |
+ <a href="@routes.ReviewThreadApp.reviewThreads(project.owner, project.name)"> |
|
79 |
+ @Messages("menu.review") |
|
80 |
+ </a> |
|
81 |
+ </li> |
|
82 |
+ } |
|
83 |
+ @if(project.menuSetting.milestone) { |
|
84 |
+ <li class="@isActiveMenu(MenuType.MILESTONE)"> |
|
85 |
+ <a href="@routes.MilestoneApp.milestones(project.owner, project.name)"> |
|
86 |
+ @Messages("milestone") |
|
87 |
+ </a> |
|
88 |
+ </li> |
|
89 |
+ } |
|
90 |
+ @if(project.menuSetting.board) { |
|
91 |
+ <li class="@isActiveMenu(MenuType.BOARD)"> |
|
92 |
+ <a href="@routes.BoardApp.posts(project.owner, project.name)"> |
|
93 |
+ @Messages("menu.board") |
|
94 |
+ </a> |
|
95 |
+ </li> |
|
96 |
+ } |
|
85 | 97 |
</ul> |
86 | 98 |
@if(AccessControl.isAllowed(UserApp.currentUser(), project.asResource(), Operation.UPDATE)){ |
87 | 99 |
<div class="project-setting"> |
... | ... | @@ -103,12 +115,20 @@ |
103 | 115 |
<script type="text/javascript"> |
104 | 116 |
$(document).ready(function(){ |
105 | 117 |
var htKeyMap = { |
106 |
- "H": "@routes.ProjectApp.project(project.owner, project.name)", |
|
107 |
- "B": "@routes.BoardApp.posts(project.owner, project.name)", |
|
108 |
- "C": "@routes.CodeApp.codeBrowser(project.owner, project.name)", |
|
109 |
- "I": "@routes.IssueApp.issues(project.owner, project.name,"open")", |
|
110 |
- "M": "@routes.MilestoneApp.milestones(project.owner, project.name)" |
|
111 |
- @if(project.vcs.equals("GIT")){ |
|
118 |
+ "H": "@routes.ProjectApp.project(project.owner, project.name)" |
|
119 |
+ @if(project.menuSetting.board) { |
|
120 |
+ ,"B": "@routes.BoardApp.posts(project.owner, project.name)" |
|
121 |
+ } |
|
122 |
+ @if(project.menuSetting.code) { |
|
123 |
+ ,"C": "@routes.CodeApp.codeBrowser(project.owner, project.name)" |
|
124 |
+ } |
|
125 |
+ @if(project.menuSetting.issue) { |
|
126 |
+ ,"I": "@routes.IssueApp.issues(project.owner, project.name,"open")" |
|
127 |
+ } |
|
128 |
+ @if(project.menuSetting.milestone) { |
|
129 |
+ ,"M": "@routes.MilestoneApp.milestones(project.owner, project.name)" |
|
130 |
+ } |
|
131 |
+ @if(project.menuSetting.pullRequest && project.vcs.equals("GIT")){ |
|
112 | 132 |
,"F": "@getPullRequestURL(project)" |
113 | 133 |
} |
114 | 134 |
@if(ProjectUser.roleOf(session.get("loginId"), project).equals("manager")){ |
--- app/views/user/partial_issues.scala.html
+++ app/views/user/partial_issues.scala.html
... | ... | @@ -83,7 +83,7 @@ |
83 | 83 |
} |
84 | 84 |
</div> |
85 | 85 |
<div class="pull-right"> |
86 |
- @if(issue.milestone != null) { |
|
86 |
+ @if(project.menuSetting.milestone && issue.milestone != null) { |
|
87 | 87 |
<div class="mileston-tag"> |
88 | 88 |
<a href="@routes.MilestoneApp.milestone(issue.project.owner, issue.project.name, issue.milestone.id)" data-toggle="tooltip" data-placement="top" title="@Messages("milestone")"> |
89 | 89 |
@issue.milestone.title |
+++ conf/evolutions/default/83.sql
... | ... | @@ -0,0 +1,28 @@ |
1 | +# --- !Ups | |
2 | + | |
3 | +CREATE TABLE project_menu_setting ( | |
4 | + id BIGINT NOT NULL, | |
5 | + project_id BIGINT, | |
6 | + code BOOLEAN, | |
7 | + issue BOOLEAN, | |
8 | + pull_request BOOLEAN, | |
9 | + review BOOLEAN, | |
10 | + milestone BOOLEAN, | |
11 | + board BOOLEAN, | |
12 | + CONSTRAINT pk_project_menu_setting PRIMARY KEY (id)) | |
13 | +; | |
14 | + | |
15 | +CREATE SEQUENCE project_menu_setting_seq; | |
16 | +ALTER TABLE project_menu_setting ADD CONSTRAINT fk_project_menu_setting FOREIGN KEY (project_id) REFERENCES project (id) ON DELETE RESTRICT ON UPDATE RESTRICT; | |
17 | +CREATE INDEX ix_project_menu_setting ON project_menu_setting (project_id); | |
18 | + | |
19 | +INSERT INTO project_menu_setting(id, project_id, code, issue, pull_request, review, milestone, board) | |
20 | +SELECT nextval('project_menu_setting_seq'), id, 'TRUE', 'TRUE', 'TRUE', 'TRUE', 'TRUE', 'TRUE' | |
21 | +FROM (SELECT id | |
22 | + FROM project); | |
23 | + | |
24 | + | |
25 | +# --- !Downs | |
26 | + | |
27 | +DROP TABLE IF EXISTS project_menu_setting; | |
28 | +DROP SEQUENCE IF EXISTS project_menu_setting_seq; |
--- conf/messages
+++ conf/messages
... | ... | @@ -541,6 +541,7 @@ |
541 | 541 |
project.you.are.watching = You are watching {0} project. |
542 | 542 |
project.you.may.want.to.be.a.member = You can send a sign-up request for {0} project. |
543 | 543 |
project.you.want.to.be.a.member = You have sent a sign-up request for {0} project. |
544 |
+project.menu.setting = Menu Setting |
|
544 | 545 |
pullRequest = Pull request |
545 | 546 |
pullRequest.accept = Accept |
546 | 547 |
pullRequest.additional.changes = Additional changes |
--- conf/messages.ko
+++ conf/messages.ko
... | ... | @@ -541,6 +541,7 @@ |
541 | 541 |
project.you.are.watching = {0} 프로젝트를 지켜보는 중입니다. |
542 | 542 |
project.you.may.want.to.be.a.member = {0} 프로젝트 멤버로 등록 요청을 할 수 있습니다. |
543 | 543 |
project.you.want.to.be.a.member = {0} 프로젝트 멤버로 등록 요청했습니다. |
544 |
+project.menu.setting = 메뉴 설정 |
|
544 | 545 |
pullRequest = 코드 보내기 |
545 | 546 |
pullRequest.accept = 코드 받기 |
546 | 547 |
pullRequest.additional.changes = 추가 변경 내역 |
Add a comment
Delete comment
Once you delete this comment, you won't be able to recover it. Are you sure you want to delete this comment?