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

change view filename(HIVE-211), adjust project logo size(HIVE-213), remove unused files, fix filter markup on milestone list
@8b6acc821e97007a512a656f6d3da0d1f103847b
--- app/assets/stylesheets/less/_common.less
+++ app/assets/stylesheets/less/_common.less
... | ... | @@ -14,7 +14,7 @@ |
14 | 14 |
text-decoration: none; |
15 | 15 |
outline: none; |
16 | 16 |
&:hover { outline: none !important; color: @link-hover-color; text-decoration: underline; } |
17 |
- &:focus { outline: none !important; } |
|
17 |
+ &:focus { outline: none !important; color: @link-hover-color; text-decoration: underline; } |
|
18 | 18 |
} |
19 | 19 |
|
20 | 20 |
.btn-transparent { border: 0; padding: 0; background: transparent; } |
... | ... | @@ -24,19 +24,6 @@ |
24 | 24 |
display: none !important; |
25 | 25 |
visibility: hidden !important; |
26 | 26 |
} |
27 |
-/* |
|
28 |
-.btns { |
|
29 |
- font-size: 0; |
|
30 |
- .n-btn:first-child { margin-right: 5px; } |
|
31 |
-} |
|
32 |
-*/ |
|
33 |
- |
|
34 |
-/* |
|
35 |
-.btn { |
|
36 |
- margin-right:5px; |
|
37 |
- &:last-of-type { margin-right:0; } |
|
38 |
-} |
|
39 |
-*/ |
|
40 | 27 |
|
41 | 28 |
/** pagination **/ |
42 | 29 |
.page-navigation-wrap { |
--- app/assets/stylesheets/less/_mixins.less
+++ app/assets/stylesheets/less/_mixins.less
... | ... | @@ -91,6 +91,14 @@ |
91 | 91 |
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='@{startColor}', endColorstr='@{endColor}',GradientType=0 ); /* IE6-9 */ |
92 | 92 |
} |
93 | 93 |
|
94 |
+// BackgroundSize |
|
95 |
+.background-size(@param:cover){ |
|
96 |
+ -webkit-background-size: @param; |
|
97 |
+ -moz-background-size: @param; |
|
98 |
+ -o-background-size: @param; |
|
99 |
+ background-size: @param; |
|
100 |
+} |
|
101 |
+ |
|
94 | 102 |
// Text overflow |
95 | 103 |
// ------------------------- |
96 | 104 |
// Requires inline-block or block for proper styling |
--- app/assets/stylesheets/less/_page.less
+++ app/assets/stylesheets/less/_page.less
... | ... | @@ -39,22 +39,33 @@ |
39 | 39 |
.gnb-menus { |
40 | 40 |
float: left; |
41 | 41 |
/*overflow: hidden;*/ |
42 |
- margin: 23px 10px 22px 34px; |
|
43 |
- |
|
42 |
+ margin: 0px 10px 22px 34px; |
|
43 |
+ /*margin: 23px 10px 22px 34px;*/ |
|
44 |
+ |
|
44 | 45 |
.menu { |
45 | 46 |
float: left; |
46 |
- height: 24px; |
|
47 |
- line-height: 24px; |
|
48 | 47 |
margin-left: 35px; |
49 | 48 |
color: @gnb-link-color; |
49 |
+ |
|
50 | 50 |
a { |
51 |
+ display: block; |
|
52 |
+ min-width:100px; |
|
53 |
+ height: 24px; |
|
54 |
+ line-height: 24px; |
|
55 |
+ padding-top:23px; |
|
56 |
+ text-align:center; |
|
51 | 57 |
font-size: 13px; |
52 |
- &:hover, &.selected { |
|
53 |
- color: @gnb-link-hover-color; |
|
54 |
- } |
|
58 |
+ &:hover { color: @gnb-link-hover-color; } |
|
55 | 59 |
} |
56 |
- &.highlight { |
|
57 |
- a { color: @gnb-link-highlight-color; } |
|
60 |
+ |
|
61 |
+ &.active { |
|
62 |
+ border-top:3px solid @gnb-link-active-color; |
|
63 |
+ |
|
64 |
+ a { |
|
65 |
+ padding-top:20px; |
|
66 |
+ color: @gnb-link-active-color; |
|
67 |
+ font-weight:bold; text-shadow:0px 0px 2px #fff; |
|
68 |
+ } |
|
58 | 69 |
} |
59 | 70 |
} |
60 | 71 |
|
... | ... | @@ -1426,31 +1437,43 @@ |
1426 | 1437 |
border-bottom: 0 none; |
1427 | 1438 |
text-align: center; |
1428 | 1439 |
} |
1440 |
+ |
|
1441 |
+ /* 프로젝트 설정 */ |
|
1429 | 1442 |
.setting-box { |
1430 | 1443 |
float: left; |
1431 | 1444 |
width: 399px; |
1445 |
+ |
|
1432 | 1446 |
&.left { |
1433 | 1447 |
padding-right: 20px; |
1434 | 1448 |
border-right: 1px solid @white; |
1435 | 1449 |
.logo-wrap { |
1436 |
- vertical-align: top; |
|
1450 |
+ width:260px; height:188px; |
|
1451 |
+ background-repeat:no-repeat; |
|
1452 |
+ background-size:cover; |
|
1453 |
+ .border-radius(10px); |
|
1437 | 1454 |
.inline-block; |
1438 |
- width: 234px; |
|
1439 |
- margin-right: 20px; |
|
1440 |
- img { .border-radius(2px); } |
|
1441 | 1455 |
} |
1442 | 1456 |
.logo-desc { |
1443 |
- width: 140px; |
|
1457 |
+ width: 120px; |
|
1458 |
+ font-size: 12px; |
|
1459 |
+ margin-left:10px; |
|
1460 |
+ vertical-align:top; |
|
1461 |
+ |
|
1444 | 1462 |
.inline-block; |
1445 |
- font-size: 11px; |
|
1446 | 1463 |
.point { |
1447 |
- color: #51AACC; |
|
1464 |
+ color: @secondary; |
|
1465 |
+ font-weight:bold; |
|
1466 |
+ text-transform:uppercase; |
|
1467 |
+ display:block; clear:both; |
|
1448 | 1468 |
} |
1449 |
- &:first-child { |
|
1450 |
- margin-bottom: 17px; |
|
1469 |
+ |
|
1470 |
+ .descs li { |
|
1471 |
+ margin-top:10px; |
|
1472 |
+ &:last-of-type { margin-top:25px; } |
|
1451 | 1473 |
} |
1452 | 1474 |
} |
1453 | 1475 |
} |
1476 |
+ |
|
1454 | 1477 |
&.right { |
1455 | 1478 |
padding-left: 20px; |
1456 | 1479 |
border-left: 1px solid @gray-d4; |
... | ... | @@ -1458,7 +1481,7 @@ |
1458 | 1481 |
width: 380px; |
1459 | 1482 |
} |
1460 | 1483 |
.textarea { |
1461 |
- height: 70px; /*111px;*/ |
|
1484 |
+ height: 80px; /*111px;*/ |
|
1462 | 1485 |
margin-bottom: 0; |
1463 | 1486 |
resize:vertical; |
1464 | 1487 |
} |
... | ... | @@ -1510,7 +1533,7 @@ |
1510 | 1533 |
&:hover { color:@primary; text-decoration:underline; } |
1511 | 1534 |
} |
1512 | 1535 |
|
1513 |
- .highlight a { |
|
1536 |
+ .active a { |
|
1514 | 1537 |
color:@primary !important; |
1515 | 1538 |
&:after { |
1516 | 1539 |
content:''; |
... | ... | @@ -1536,7 +1559,7 @@ |
1536 | 1559 |
} |
1537 | 1560 |
|
1538 | 1561 |
a { font-weight:bold; color:#959595; padding:0 25px; font-size:11px; } |
1539 |
- .highlight a { color:#000 !important; } |
|
1562 |
+ .active a { color:#000 !important; } |
|
1540 | 1563 |
} |
1541 | 1564 |
|
1542 | 1565 |
.sp-line { |
... | ... | @@ -1635,7 +1658,7 @@ |
1635 | 1658 |
float: right; |
1636 | 1659 |
.filter { |
1637 | 1660 |
margin-right:10px; |
1638 |
- &.active { font-weight:bold; } |
|
1661 |
+ &.active { font-weight:bold; color:@primary; } |
|
1639 | 1662 |
&:last-of-type { margin:0; } |
1640 | 1663 |
} |
1641 | 1664 |
i { margin-right: 5px; } |
... | ... | @@ -1819,17 +1842,10 @@ |
1819 | 1842 |
} |
1820 | 1843 |
|
1821 | 1844 |
&.logo { |
1822 |
- width: 234px; |
|
1823 |
- height: 168px; |
|
1824 |
- padding: 10px 13px; |
|
1825 |
- line-height:168px; |
|
1826 |
- text-align:center; |
|
1827 |
- |
|
1828 |
- .logo-wrap { |
|
1829 |
- .inline-block; |
|
1830 |
- /*width:230px; |
|
1831 |
- height:160px;*/ |
|
1832 |
- } |
|
1845 |
+ width:260px; height:188px; |
|
1846 |
+ background-repeat:no-repeat; |
|
1847 |
+ background-position:center; |
|
1848 |
+ .background-size(cover); |
|
1833 | 1849 |
} |
1834 | 1850 |
|
1835 | 1851 |
&.project-info { |
--- app/assets/stylesheets/less/_variables.less
+++ app/assets/stylesheets/less/_variables.less
... | ... | @@ -65,12 +65,11 @@ |
65 | 65 |
|
66 | 66 |
@gnb-logo-bg-color:@orange; |
67 | 67 |
@gnb-bg-color :#f3f4f6; |
68 |
-@gnb-active-color :#2C4E55; |
|
69 | 68 |
@gnb-border-bottom:1px solid #c7c9ca; |
70 | 69 |
|
71 |
-@gnb-link-color : @gray-11; |
|
70 |
+@gnb-link-color : #111; |
|
72 | 71 |
@gnb-link-hover-color : @orange; |
73 |
-@gnb-link-highlight-color: @orange; |
|
72 |
+@gnb-link-active-color : @orange; |
|
74 | 73 |
|
75 | 74 |
@gnb-action-color: @white; |
76 | 75 |
@gnb-action-signout-color: #868D96; |
--- app/controllers/MilestoneApp.java
+++ app/controllers/MilestoneApp.java
... | ... | @@ -15,14 +15,14 @@ |
15 | 15 |
|
16 | 16 |
public static class MilestoneCondition { |
17 | 17 |
|
18 |
- public String state = "open"; |
|
19 |
- public String sort = "dueDate"; |
|
20 |
- public String direction = "asc"; |
|
18 |
+ public String state = "open"; |
|
19 |
+ public String orderBy = "dueDate"; |
|
20 |
+ public String orderDir = "asc"; |
|
21 | 21 |
|
22 | 22 |
public MilestoneCondition() { |
23 |
- this.state = "open"; |
|
24 |
- this.sort = "dueDate"; |
|
25 |
- this.direction = "asc"; |
|
23 |
+ this.state = "open"; |
|
24 |
+ this.orderBy = "dueDate"; |
|
25 |
+ this.orderDir = "asc"; |
|
26 | 26 |
} |
27 | 27 |
} |
28 | 28 |
|
... | ... | @@ -36,8 +36,8 @@ |
36 | 36 |
|
37 | 37 |
List<Milestone> milestones = Milestone.findMilestones(project.id, |
38 | 38 |
State.getValue(mCondition.state), |
39 |
- mCondition.sort, |
|
40 |
- Direction.getValue(mCondition.direction)); |
|
39 |
+ mCondition.orderBy, |
|
40 |
+ Direction.getValue(mCondition.orderDir)); |
|
41 | 41 |
|
42 | 42 |
return ok(list.render("title.milestoneList", milestones, project, mCondition)); |
43 | 43 |
} |
--- app/controllers/ProjectApp.java
+++ app/controllers/ProjectApp.java
... | ... | @@ -64,8 +64,7 @@ |
64 | 64 |
|
65 | 65 |
List<History> histories = History.makeHistory(userName, project, commits, issues, postings); |
66 | 66 |
|
67 |
- return ok(projectHome.render("title.projectHome", |
|
68 |
- getProject(userName, projectName), histories)); |
|
67 |
+ return ok(overview.render("title.projectHome", getProject(userName, projectName), histories)); |
|
69 | 68 |
} |
70 | 69 |
|
71 | 70 |
public static Result newProjectForm() { |
... | ... | @@ -73,8 +72,7 @@ |
73 | 72 |
flash(Constants.WARNING, "user.login.alert"); |
74 | 73 |
return redirect(routes.UserApp.loginForm()); |
75 | 74 |
} else |
76 |
- return ok(newProject |
|
77 |
- .render("title.newProject", form(Project.class))); |
|
75 |
+ return ok(create.render("title.newProject", form(Project.class))); |
|
78 | 76 |
} |
79 | 77 |
|
80 | 78 |
public static Result settingForm(String userName, String projectName) { |
... | ... | @@ -94,14 +92,12 @@ |
94 | 92 |
filledNewProjectForm.field("name").value())) { |
95 | 93 |
flash(Constants.WARNING, "project.name.duplicate"); |
96 | 94 |
filledNewProjectForm.reject("name"); |
97 |
- return badRequest(newProject.render("title.newProject", |
|
98 |
- filledNewProjectForm)); |
|
95 |
+ return badRequest(create.render("title.newProject", filledNewProjectForm)); |
|
99 | 96 |
} else if (filledNewProjectForm.hasErrors()) { |
100 | 97 |
System.out.println("=====" + filledNewProjectForm.errorsAsJson()); |
101 | 98 |
filledNewProjectForm.reject("name"); |
102 | 99 |
flash(Constants.WARNING, "project.name.alert"); |
103 |
- return badRequest(newProject.render("title.newProject", |
|
104 |
- filledNewProjectForm)); |
|
100 |
+ return badRequest(create.render("title.newProject", filledNewProjectForm)); |
|
105 | 101 |
} else { |
106 | 102 |
Project project = filledNewProjectForm.get(); |
107 | 103 |
project.owner = UserApp.currentUser().loginId; |
... | ... | @@ -172,7 +168,7 @@ |
172 | 168 |
} |
173 | 169 |
|
174 | 170 |
Form<Project> projectForm = form(Project.class).fill(project); |
175 |
- return ok(projectDelete.render("title.projectSetting", projectForm, project)); |
|
171 |
+ return ok(delete.render("title.projectSetting", projectForm, project)); |
|
176 | 172 |
} |
177 | 173 |
|
178 | 174 |
public static Result deleteProject(String userName, String projectName) throws Exception { |
--- app/views/layout.scala.html
+++ app/views/layout.scala.html
... | ... | @@ -71,22 +71,12 @@ |
71 | 71 |
}); |
72 | 72 |
}); |
73 | 73 |
</script> |
74 |
-@alertUI() |
|
75 | 74 |
|
76 | 75 |
<!-- HIVE --> |
76 |
+ |
|
77 |
+@alertUI() |
|
77 | 78 |
@uservoice("196721") |
79 |
+@googleAnalytics("UA-40528193-1") |
|
78 | 80 |
|
79 |
- <script type="text/javascript"> |
|
80 |
- var _gaq = _gaq || []; |
|
81 |
- _gaq.push(['_setAccount', 'UA-40528193-1']); |
|
82 |
- _gaq.push(['_trackPageview']); |
|
83 |
- |
|
84 |
- (function() { |
|
85 |
- var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; |
|
86 |
- ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; |
|
87 |
- var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); |
|
88 |
- })(); |
|
89 |
- |
|
90 |
- </script> |
|
91 | 81 |
</body> |
92 | 82 |
</html>(No newline at end of file) |
--- app/views/main.scala.html
+++ app/views/main.scala.html
... | ... | @@ -3,19 +3,18 @@ |
3 | 3 |
@import utils._ |
4 | 4 |
|
5 | 5 |
@layout(Messages(title) + " (" + project.name + ")")("prj") { |
6 |
- <header class="gnb-outer"> |
|
7 |
- @topmenu(project) |
|
8 |
- @sidemenu(project) |
|
9 |
- </header> |
|
6 |
+<header class="gnb-outer"> |
|
7 |
+@views.html.project.navbar(project) |
|
8 |
+</header> |
|
10 | 9 |
|
11 |
- <div class="container page-wrap"> |
|
12 |
- @alert() |
|
13 |
- @content |
|
14 |
- </div> |
|
10 |
+<div class="container page-wrap"> |
|
11 |
+@alert() |
|
12 |
+@content |
|
13 |
+</div> |
|
15 | 14 |
|
16 |
- <footer class="page-footer-outer"> |
|
17 |
- <div class="page-footer"> |
|
18 |
- <span class="provider">Powered by <strong>HIVE</strong></span> |
|
19 |
- </div> |
|
20 |
- </footer> |
|
15 |
+<footer class="page-footer-outer"> |
|
16 |
+ <div class="page-footer"> |
|
17 |
+ <span class="provider">Powered by <strong>HIVE</strong></span> |
|
18 |
+ </div> |
|
19 |
+</footer> |
|
21 | 20 |
}(No newline at end of file) |
--- app/views/milestone/create.scala.html
+++ app/views/milestone/create.scala.html
... | ... | @@ -1,12 +1,14 @@ |
1 |
-@(title:String, form: Form[Milestone], projectInst: Project) |
|
1 |
+@(title:String, form: Form[Milestone], project: Project) |
|
2 | 2 |
|
3 | 3 |
@import utils.TemplateHelper._ |
4 | 4 |
@import models.enumeration._ |
5 |
-@project.projectMngMain(title, projectInst) { |
|
6 |
- @prjmenu(projectInst, utils.MenuType.MILESTONE, "") |
|
5 |
+ |
|
6 |
+@main(title, project, utils.MenuType.MILESTONE) { |
|
7 |
+<div class="page"> |
|
8 |
+ @prjmenu(project, utils.MenuType.MILESTONE, "") |
|
7 | 9 |
|
8 | 10 |
<div class="form-wrap milestone frm-wrap"> |
9 |
- <form class="nm" action="@routes.MilestoneApp.newMilestone(projectInst.owner, projectInst.name)" method="post"> |
|
11 |
+ <form class="nm" action="@routes.MilestoneApp.newMilestone(project.owner, project.name)" method="post"> |
|
10 | 12 |
<div class="inner left"> |
11 | 13 |
<dl> |
12 | 14 |
<dt> |
... | ... | @@ -26,7 +28,7 @@ |
26 | 28 |
|
27 | 29 |
<div class="actions"> |
28 | 30 |
<button type="submit" class="nbtn orange medium">@Messages("button.save")</button> |
29 |
- <a href="@routes.MilestoneApp.milestones(projectInst.owner, projectInst.name)" class="nbtn medium">@Messages("button.cancel")</a> |
|
31 |
+ <a href="@routes.MilestoneApp.milestones(project.owner, project.name)" class="nbtn medium">@Messages("button.cancel")</a> |
|
30 | 32 |
</div> |
31 | 33 |
</div> |
32 | 34 |
|
... | ... | @@ -47,6 +49,7 @@ |
47 | 49 |
</div> |
48 | 50 |
</form> |
49 | 51 |
</div> |
52 |
+</div> |
|
50 | 53 |
|
51 | 54 |
<link rel="stylesheet" type="text/css" href="@getCSSLink("pikaday")" /> |
52 | 55 |
<script type="text/javascript" src="@getJSLink("lib/moment.min")"></script> |
--- app/views/milestone/edit.scala.html
+++ app/views/milestone/edit.scala.html
... | ... | @@ -1,57 +1,59 @@ |
1 |
-@(title: String, form: Form[Milestone], milestoneId: Long, projectInst: Project) |
|
1 |
+@(title: String, form: Form[Milestone], milestoneId: Long, project: Project) |
|
2 | 2 |
|
3 | 3 |
@import utils.TemplateHelper._ |
4 | 4 |
@import models.enumeration._ |
5 | 5 |
@implicitField = @{ helper.FieldConstructor(simpleForm) } |
6 | 6 |
|
7 |
-@project.projectMngMain(title, projectInst) { |
|
8 |
-@prjmenu(projectInst, utils.MenuType.MILESTONE, "") |
|
7 |
+@main(title, project, utils.MenuType.MILESTONE) { |
|
8 |
+<div class="page"> |
|
9 |
+ @prjmenu(project, utils.MenuType.MILESTONE, "") |
|
9 | 10 |
|
10 |
-<div class="form-wrap milestone frm-wrap"> |
|
11 |
- <form class="nm" action="@routes.MilestoneApp.editMilestone(projectInst.owner, projectInst.name, milestoneId)" method="post"> |
|
12 |
- <div class="inner left"> |
|
13 |
- <dl> |
|
14 |
- <dt> |
|
15 |
- <label for="title">@Messages("milestone.form.title")</label> |
|
16 |
- </dt> |
|
17 |
- <dd> |
|
18 |
- @helper.input(form("title")){(id, name, value, args) => |
|
19 |
- <input type="text" name="@name" id="@id" class="text" value="@value"> |
|
20 |
- } |
|
21 |
- </dd> |
|
11 |
+ <div class="form-wrap milestone frm-wrap"> |
|
12 |
+ <form class="nm" action="@routes.MilestoneApp.editMilestone(project.owner, project.name, milestoneId)" method="post"> |
|
13 |
+ <div class="inner left"> |
|
14 |
+ <dl> |
|
15 |
+ <dt> |
|
16 |
+ <label for="title">@Messages("milestone.form.title")</label> |
|
17 |
+ </dt> |
|
18 |
+ <dd> |
|
19 |
+ @helper.input(form("title")){(id, name, value, args) => |
|
20 |
+ <input type="text" name="@name" id="@id" class="text" value="@value"> |
|
21 |
+ } |
|
22 |
+ </dd> |
|
23 |
+ |
|
24 |
+ <dt> |
|
25 |
+ <label for="contents">@Messages("milestone.form.content")</label> |
|
26 |
+ </dt> |
|
27 |
+ <dd> |
|
28 |
+ @helper.input(form("contents")){(id, name, value, args) => |
|
29 |
+ <textarea class="textarea" id="@id" name="@name">@value</textarea> |
|
30 |
+ } |
|
31 |
+ </dd> |
|
32 |
+ </dl> |
|
22 | 33 |
|
23 |
- <dt> |
|
24 |
- <label for="contents">@Messages("milestone.form.content")</label> |
|
25 |
- </dt> |
|
26 |
- <dd> |
|
27 |
- @helper.input(form("contents")){(id, name, value, args) => |
|
28 |
- <textarea class="textarea" id="@id" name="@name">@value</textarea> |
|
34 |
+ <div class="actions"> |
|
35 |
+ <button type="submit" class="nbtn orange medium">@Messages("button.save")</button> |
|
36 |
+ <a href="@routes.MilestoneApp.milestones(project.owner, project.name)" class="nbtn medium">@Messages("button.cancel")</a> |
|
37 |
+ </div> |
|
38 |
+ </div> |
|
39 |
+ |
|
40 |
+ <div class="inner right bubble-wrap dark-gray"> |
|
41 |
+ <p>@Messages("milestone.form.state")</p> |
|
42 |
+ <div> |
|
43 |
+ <input type="radio" name="state" value="@State.OPEN" id="milestone-open" class="radio-btn" @if(form("state").value.equals(State.OPEN.name)) { checked="checked" }><label for="milestone-open" class="bold">Open</label> |
|
44 |
+ <input type="radio" name="state" value="@State.CLOSED" id="milestone-close" class="radio-btn" @if(form("state").value.equals(State.CLOSED.name)) { checked="checked" }><label for="milestone-close" class="bold">Closed</label> |
|
45 |
+ </div> |
|
46 |
+ <hr/> |
|
47 |
+ <p>@Messages("milestone.form.dueDate")</p> |
|
48 |
+ <label for="dueDate"> |
|
49 |
+ @helper.input(form("dueDate")){(id, name, value, args) => |
|
50 |
+ <input type="text" name="@name" id="@id" class="validate due-date" value="@value"> |
|
29 | 51 |
} |
30 |
- </dd> |
|
31 |
- </dl> |
|
32 |
- |
|
33 |
- <div class="actions"> |
|
34 |
- <button type="submit" class="nbtn orange medium">@Messages("button.save")</button> |
|
35 |
- <a href="@routes.MilestoneApp.milestones(projectInst.owner, projectInst.name)" class="nbtn medium">@Messages("button.cancel")</a> |
|
52 |
+ </label> |
|
53 |
+ <div id="datepicker" class="date-picker"></div> |
|
36 | 54 |
</div> |
55 |
+ </form> |
|
37 | 56 |
</div> |
38 |
- |
|
39 |
- <div class="inner right bubble-wrap dark-gray"> |
|
40 |
- <p>@Messages("milestone.form.state")</p> |
|
41 |
- <div> |
|
42 |
- <input type="radio" name="state" value="@State.OPEN" id="milestone-open" class="radio-btn" @if(form("state").value.equals(State.OPEN.name)) { checked="checked" }><label for="milestone-open" class="bold">Open</label> |
|
43 |
- <input type="radio" name="state" value="@State.CLOSED" id="milestone-close" class="radio-btn" @if(form("state").value.equals(State.CLOSED.name)) { checked="checked" }><label for="milestone-close" class="bold">Closed</label> |
|
44 |
- </div> |
|
45 |
- <hr/> |
|
46 |
- <p>@Messages("milestone.form.dueDate")</p> |
|
47 |
- <label for="dueDate"> |
|
48 |
- @helper.input(form("dueDate")){(id, name, value, args) => |
|
49 |
- <input type="text" name="@name" id="@id" class="validate due-date" value="@value"> |
|
50 |
- } |
|
51 |
- </label> |
|
52 |
- <div id="datepicker" class="date-picker"></div> |
|
53 |
- </div> |
|
54 |
- </form> |
|
55 | 57 |
</div> |
56 | 58 |
|
57 | 59 |
<link rel="stylesheet" type="text/css" href="@getCSSLink("pikaday")" /> |
--- app/views/milestone/list.scala.html
+++ app/views/milestone/list.scala.html
... | ... | @@ -1,58 +1,46 @@ |
1 |
-@(title: String, milestones: List[models.Milestone], projectInst: Project, mCondition: MilestoneApp.MilestoneCondition) |
|
1 |
+@(title: String, milestones: List[models.Milestone], project: Project, param: MilestoneApp.MilestoneCondition) |
|
2 | 2 |
@import scala.collection.immutable._ |
3 | 3 |
@import utils.TemplateHelper._ |
4 | 4 |
|
5 |
-@makeSortLink(_sort:String) = @{ |
|
6 |
- var _direction = "asc"; |
|
7 |
- if(mCondition.sort.equals(_sort)) { |
|
8 |
- if(_direction.equals(mCondition.direction)) { |
|
9 |
- _direction = "desc" |
|
10 |
- } |
|
11 |
- } |
|
12 |
- buildQueryString(routes.MilestoneApp.milestones(projectInst.owner, projectInst.name), |
|
13 |
- Map("state"->mCondition.state, "sort"->_sort, "direction"->_direction) |
|
14 |
- ) |
|
15 |
-} |
|
16 |
-@makeIssuesLink(mId: Long, _state: String) = @{ |
|
17 |
- buildQueryString(routes.IssueApp.issues(projectInst.owner, projectInst.name, _state), |
|
18 |
- Map("milestone"->mId.toString) |
|
19 |
- ) |
|
20 |
-} |
|
21 |
-@sortMark(_sort: String) = @{ |
|
22 |
- /* TODO It will be chnaged. */ |
|
23 |
- if(mCondition.sort.equals(_sort)) { |
|
24 |
- if(mCondition.direction.equals("desc")){ |
|
25 |
- "down" |
|
26 |
- } else { |
|
27 |
- "up" |
|
28 |
- } |
|
29 |
- } else { |
|
30 |
- /*"up hidden"*/ |
|
31 |
- "up" |
|
32 |
- } |
|
33 |
-} |
|
34 |
-@makeMilestoneListLink(_state: String) = @{ |
|
35 |
- buildQueryString(routes.MilestoneApp.milestones(projectInst.owner, projectInst.name), |
|
36 |
- Map("state"->_state) |
|
37 |
- ) |
|
5 |
+@urlToList = {@routes.MilestoneApp.milestones(project.owner, project.name)} |
|
6 |
+ |
|
7 |
+@makeFilterLink(fieldName:String, orderBy:String, orderDir:String, fieldText:String) = { |
|
8 |
+ @if(orderBy.equals(fieldName)) { |
|
9 |
+ <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> |
|
10 |
+ } else { |
|
11 |
+ <a href="@urlToList?orderBy=@fieldName&orderDir=asc" class="filter"><i class="ico btn-gray-arrow"></i>@fieldText</a> |
|
12 |
+ } |
|
38 | 13 |
} |
39 | 14 |
|
40 |
-@project.projectMngMain(title, projectInst) { |
|
41 |
- @prjmenu(projectInst, utils.MenuType.MILESTONE, "") |
|
15 |
+@makeMilestoneListLink(_state: String) = @{ |
|
16 |
+ buildQueryString(routes.MilestoneApp.milestones(project.owner, project.name), |
|
17 |
+ Map("state"->_state) |
|
18 |
+ ) |
|
19 |
+} |
|
20 |
+ |
|
21 |
+@makeIssuesLink(mId: Long, _state: String) = @{ |
|
22 |
+ buildQueryString(routes.IssueApp.issues(project.owner, project.name, _state), |
|
23 |
+ Map("milestone"->mId.toString) |
|
24 |
+ ) |
|
25 |
+} |
|
26 |
+ |
|
27 |
+@main(title, project, utils.MenuType.MILESTONE) { |
|
28 |
+<div class="page"> |
|
29 |
+ @prjmenu(project, utils.MenuType.MILESTONE, "") |
|
42 | 30 |
|
43 | 31 |
<div class="tab-wrap"> |
44 | 32 |
<div class="pull-right btns"> |
45 |
- <a href="@routes.MilestoneApp.newMilestoneForm(projectInst.owner, projectInst.name)" class="nbtn medium orange">@Messages("milestone.menu.new")</a> |
|
33 |
+ <a href="@routes.MilestoneApp.newMilestoneForm(project.owner, project.name)" class="nbtn medium orange">@Messages("milestone.menu.new")</a> |
|
46 | 34 |
</div> |
47 | 35 |
|
48 | 36 |
<ul class="nav nav-tabs"> |
49 |
- <li class="@if(mCondition.state.equals("all")){active}"> |
|
37 |
+ <li class="@if(param.state.equals("all")){active}"> |
|
50 | 38 |
<a href="@makeMilestoneListLink("all")">@Messages("milestone.state.all")</a> |
51 | 39 |
</li> |
52 |
- <li class="@if(mCondition.state.equals("open")){active}"> |
|
40 |
+ <li class="@if(param.state.equals("open")){active}"> |
|
53 | 41 |
<a href="@makeMilestoneListLink("open")">@Messages("milestone.state.open")</a> |
54 | 42 |
</li> |
55 |
- <li class="@if(mCondition.state.equals("closed")){active}"> |
|
43 |
+ <li class="@if(param.state.equals("closed")){active}"> |
|
56 | 44 |
<a href="@makeMilestoneListLink("closed")">@Messages("milestone.state.closed")</a> |
57 | 45 |
</li> |
58 | 46 |
</ul> |
... | ... | @@ -70,9 +58,9 @@ |
70 | 58 |
@if(milestones.length > 1){ |
71 | 59 |
<div class="filter-wrap milestone"> |
72 | 60 |
<div class="filters"> |
73 |
- <a href="@makeSortLink("dueDate")" class="filter"><i class="ico ico-sort @sortMark("dueDate")"></i>@Messages("order.dueDate")</a> |
|
74 |
- <a href="@makeSortLink("completionRate")" class="filter active"><i class="ico ico-sort @sortMark("completionRate")"></i>@Messages("order.completionRate")</a> |
|
75 |
- </div> |
|
61 |
+ @makeFilterLink("dueDate", param.orderBy, param.orderDir, Messages("order.dueDate")) |
|
62 |
+ @makeFilterLink("completionRate", param.orderBy, param.orderDir, Messages("order.completionRate")) |
|
63 |
+ </div> |
|
76 | 64 |
<div class="legend"> |
77 | 65 |
<i class="gray"></i>@Messages("issue.state.open") |
78 | 66 |
<i class="blue"></i>@Messages("issue.state.assigned") |
... | ... | @@ -95,7 +83,7 @@ |
95 | 83 |
|
96 | 84 |
<div class="meta-info"> |
97 | 85 |
<strong class="version"></strong> |
98 |
- <a href="@routes.MilestoneApp.editMilestoneForm(projectInst.owner, projectInst.name, milestone.id)" class="title">@milestone.title</a> |
|
86 |
+ <a href="@routes.MilestoneApp.editMilestoneForm(project.owner, project.name, milestone.id)" class="title">@milestone.title</a> |
|
99 | 87 |
<span class="sp">|</span> |
100 | 88 |
<span class="due-date">@Messages("label.dueDate") <strong>@milestone.getDueDateString</strong></span> |
101 | 89 |
</div> |
... | ... | @@ -125,8 +113,8 @@ |
125 | 113 |
</div> |
126 | 114 |
|
127 | 115 |
<div class="actrow"> |
128 |
- <a href="@routes.MilestoneApp.editMilestoneForm(projectInst.owner, projectInst.name, milestone.id)" class="nbtn medium black"><i class="ico ico-delete-small"></i>@Messages("button.delete")</a><!-- |
|
129 |
- --><a href="@routes.MilestoneApp.editMilestoneForm(projectInst.owner, projectInst.name, milestone.id)" class="nbtn medium white"><i class="ico ico-edit-small"></i>@Messages("button.edit")</a> |
|
116 |
+ <a href="@routes.MilestoneApp.editMilestoneForm(project.owner, project.name, milestone.id)" class="nbtn medium black"><i class="ico ico-delete-small"></i>@Messages("button.delete")</a><!-- |
|
117 |
+ --><a href="@routes.MilestoneApp.editMilestoneForm(project.owner, project.name, milestone.id)" class="nbtn medium white"><i class="ico ico-edit-small"></i>@Messages("button.edit")</a> |
|
130 | 118 |
</div> |
131 | 119 |
</div> |
132 | 120 |
<div class="completion-rate @if(milestone.getCompletionRate == 100){done}"><!-- |
--- app/views/project/memberList.scala.html
+++ app/views/project/memberList.scala.html
... | ... | @@ -9,78 +9,80 @@ |
9 | 9 |
} |
10 | 10 |
} |
11 | 11 |
|
12 |
-@projectMngMain(message, project) { |
|
13 |
-@views.html.prjmenu(project, utils.MenuType.PROJECT_SETTING, "") |
|
12 |
+@main(message, project, utils.MenuType.PROJECT_SETTING) { |
|
13 |
+<div class="page"> |
|
14 |
+ @prjmenu(project, utils.MenuType.PROJECT_SETTING, "") |
|
14 | 15 |
|
15 |
-<div class="bubble-wrap dark-gray wp"> |
|
16 |
- <div class="inner-bubble"> |
|
17 |
- <form class="nm" action="@routes.ProjectApp.newMember(project.owner, project.name)" method="post" id="addNewMember"> |
|
18 |
- <input type="text" class="text uname" id="loginId" name="loginId" |
|
19 |
- data-provider="typeahead" autocomplete="off" |
|
20 |
- placeholder="@Messages("project.members.addMember")" |
|
21 |
- pattern="^[a-zA-Z0-9-]+([_.][a-zA-Z0-9-]+)*$" title="@Messages("user.wrongloginId.alert")" /><!-- |
|
22 |
- --><button type="submit" class="nbtn medium white"><i class="ico ico-plus-blue"></i>@Messages("button.add")</button> |
|
23 |
- </form> |
|
24 |
- </div> |
|
25 |
- |
|
26 |
- <ul class="members project"> |
|
27 |
- @for(member <- members){ |
|
28 |
- @if( member.user != null){ |
|
29 |
- |
|
30 |
- <li class="member"> |
|
31 |
- <a href="@routes.UserApp.userInfo(member.user.loginId)" class="avatar-wrap mid img-rounded pull-left"><!-- |
|
32 |
- --><img class="media-object" src="@User.findByLoginId(member.user.loginId).avatarUrl" width="64" height="64"></a> |
|
33 |
- <div class="m-body"> |
|
34 |
- <div class="td"> |
|
35 |
- <p> |
|
36 |
- <a href="@routes.UserApp.userInfo(member.user.loginId)"> |
|
37 |
- <strong class="uname">@member.user.loginId</strong> |
|
38 |
- </a> |
|
39 |
- </p> |
|
40 |
- <p class="name">(@member.user.name)</p> |
|
41 |
- </div> |
|
42 |
- <div class="td"> |
|
43 |
- @if(!project.isOwner(member.user)) { |
|
44 |
- |
|
45 |
- <div class="btn-group" data-name="roleof-@member.user.loginId"> |
|
46 |
- <button class="btn dropdown-toggle large" data-toggle="dropdown"> |
|
47 |
- <span class="d-label">@member.role.name</span> |
|
48 |
- <span class="d-caret"><span class="caret"></span></span> |
|
49 |
- </button> |
|
50 |
- <ul class="dropdown-menu">@memberRole(member.role.name)</ul> |
|
16 |
+ <div class="bubble-wrap dark-gray wp"> |
|
17 |
+ <div class="inner-bubble"> |
|
18 |
+ <form class="nm" action="@routes.ProjectApp.newMember(project.owner, project.name)" method="post" id="addNewMember"> |
|
19 |
+ <input type="text" class="text uname" id="loginId" name="loginId" |
|
20 |
+ data-provider="typeahead" autocomplete="off" |
|
21 |
+ placeholder="@Messages("project.members.addMember")" |
|
22 |
+ pattern="^[a-zA-Z0-9-]+([_.][a-zA-Z0-9-]+)*$" title="@Messages("user.wrongloginId.alert")" /><!-- |
|
23 |
+ --><button type="submit" class="nbtn medium white"><i class="ico ico-plus-blue"></i>@Messages("button.add")</button> |
|
24 |
+ </form> |
|
25 |
+ </div> |
|
26 |
+ |
|
27 |
+ <ul class="members project"> |
|
28 |
+ @for(member <- members){ |
|
29 |
+ @if( member.user != null){ |
|
30 |
+ |
|
31 |
+ <li class="member"> |
|
32 |
+ <a href="@routes.UserApp.userInfo(member.user.loginId)" class="avatar-wrap mid img-rounded pull-left"><!-- |
|
33 |
+ --><img class="media-object" src="@User.findByLoginId(member.user.loginId).avatarUrl" width="64" height="64"></a> |
|
34 |
+ <div class="m-body"> |
|
35 |
+ <div class="td"> |
|
36 |
+ <p> |
|
37 |
+ <a href="@routes.UserApp.userInfo(member.user.loginId)"> |
|
38 |
+ <strong class="uname">@member.user.loginId</strong> |
|
39 |
+ </a> |
|
40 |
+ </p> |
|
41 |
+ <p class="name">(@member.user.name)</p> |
|
51 | 42 |
</div> |
52 |
- |
|
53 |
- <p class="btns"> |
|
54 |
- <a href="javascript:void(0)" data-action="delete" data-href="@routes.ProjectApp.deleteMember(project.owner, project.name, member.user.id)" class="nbtn medium"><!-- |
|
55 |
- --><i class="ico ico-delete-small"></i>@Messages("button.delete")</a> |
|
56 |
- <a href="javascript:void(0)" data-action="apply" data-href="@routes.ProjectApp.editMember(project.owner, project.name, member.user.id)" data-loginId="@member.user.loginId" class="nbtn medium orange"><!-- |
|
57 |
- --><i class="ico ico-apply-small"></i>@Messages("button.apply")</a> |
|
58 |
- </p> |
|
59 |
- } else { |
|
60 |
- <p style="height:65px;">@member.role.name</p> |
|
61 |
- } |
|
43 |
+ <div class="td"> |
|
44 |
+ @if(!project.isOwner(member.user)) { |
|
45 |
+ |
|
46 |
+ <div class="btn-group" data-name="roleof-@member.user.loginId"> |
|
47 |
+ <button class="btn dropdown-toggle large" data-toggle="dropdown"> |
|
48 |
+ <span class="d-label">@member.role.name</span> |
|
49 |
+ <span class="d-caret"><span class="caret"></span></span> |
|
50 |
+ </button> |
|
51 |
+ <ul class="dropdown-menu">@memberRole(member.role.name)</ul> |
|
52 |
+ </div> |
|
53 |
+ |
|
54 |
+ <p class="btns"> |
|
55 |
+ <a href="javascript:void(0)" data-action="delete" data-href="@routes.ProjectApp.deleteMember(project.owner, project.name, member.user.id)" class="nbtn medium"><!-- |
|
56 |
+ --><i class="ico ico-delete-small"></i>@Messages("button.delete")</a> |
|
57 |
+ <a href="javascript:void(0)" data-action="apply" data-href="@routes.ProjectApp.editMember(project.owner, project.name, member.user.id)" data-loginId="@member.user.loginId" class="nbtn medium orange"><!-- |
|
58 |
+ --><i class="ico ico-apply-small"></i>@Messages("button.apply")</a> |
|
59 |
+ </p> |
|
60 |
+ } else { |
|
61 |
+ <p style="height:65px;">@member.role.name</p> |
|
62 |
+ } |
|
63 |
+ </div> |
|
62 | 64 |
</div> |
65 |
+ </li> |
|
66 |
+ |
|
67 |
+ } |
|
68 |
+ } |
|
69 |
+ </ul> |
|
70 |
+ |
|
71 |
+ <div id="alertDeletion" class="modal hide"> |
|
72 |
+ <div class="modal-header"> |
|
73 |
+ <button type="button" class="close" data-dismiss="modal">×</button> |
|
74 |
+ <h3>@Messages("project.member.delete")</h3> |
|
63 | 75 |
</div> |
64 |
- </li> |
|
65 |
- |
|
66 |
- } |
|
67 |
- } |
|
68 |
- </ul> |
|
69 |
- |
|
70 |
- <div id="alertDeletion" class="modal hide"> |
|
71 |
- <div class="modal-header"> |
|
72 |
- <button type="button" class="close" data-dismiss="modal">×</button> |
|
73 |
- <h3>@Messages("project.member.delete")</h3> |
|
76 |
+ <div class="modal-body"> |
|
77 |
+ <p>@Messages("project.member.deleteConfirm")</p> |
|
78 |
+ </div> |
|
79 |
+ <div class="modal-footer"> |
|
80 |
+ <a href="#" class="nbtn medium" data-dismiss="modal">@Messages("button.no")</a> |
|
81 |
+ <a href="#" class="nbtn medium orange">@Messages("button.yes")</a> |
|
82 |
+ </div> |
|
74 | 83 |
</div> |
75 |
- <div class="modal-body"> |
|
76 |
- <p>@Messages("project.member.deleteConfirm")</p> |
|
77 |
- </div> |
|
78 |
- <div class="modal-footer"> |
|
79 |
- <a href="#" class="btn" data-dismiss="modal">@Messages("button.no")</a> |
|
80 |
- <a href="#" class="btn btn-danger btnDelete">@Messages("button.yes")</a> |
|
81 |
- </div> |
|
84 |
+ |
|
82 | 85 |
</div> |
83 |
- |
|
84 | 86 |
</div> |
85 | 87 |
|
86 | 88 |
<script type="text/javascript"> |
... | ... | @@ -88,5 +90,5 @@ |
88 | 90 |
$hive.loadModule("project.Member"); |
89 | 91 |
}); |
90 | 92 |
</script> |
91 |
- |
|
93 |
+ |
|
92 | 94 |
} |
--- app/views/project/newProject.scala.html
... | ... | @@ -1,101 +0,0 @@ |
1 | -@(title:String, newProjectForm:Form[Project]) | |
2 | - | |
3 | -@import playRepository.RepositoryService | |
4 | - | |
5 | -@home(title, utils.MenuType.NEW_PROJECT){ | |
6 | - <div class="page"> | |
7 | - <div class="form-wrap new-project"> | |
8 | - <form action="@routes.ProjectApp.newProject()" method="post" name="newproject" class="frm-wrap"> | |
9 | - <dl> | |
10 | - <dt> | |
11 | - <div class="n-alert" data-errType="name"> | |
12 | - <div class="n-inner orange"> | |
13 | - <span class="msg">@Messages("project.wrongName")</span> | |
14 | - <a href="#!/close" class="ico btn-delete"></a> | |
15 | - </div> | |
16 | - </div> | |
17 | - <label for="project-name">@Messages("project.name.placeholder")</label> | |
18 | - </dt> | |
19 | - <dd> | |
20 | - <input id="project-name" type="text" name="name" class="text" placeholder="@Messages("project.name.alert")" maxlength="250"> | |
21 | - </dd> | |
22 | - | |
23 | - <dt> | |
24 | - <label for="description">@Messages("project.description.placeholder")</label> | |
25 | - </dt> | |
26 | - <dd> | |
27 | - <textarea id="description" name="overview" class="text textarea.span4" style="resize:vertical;"></textarea> | |
28 | - </dd> | |
29 | - </dl> | |
30 | - | |
31 | - <ul class="options unstyled"> | |
32 | - <li class="option"> | |
33 | - <div class="option-label">@Messages("project.shareOption")</div> | |
34 | - <div class="option-desc"> | |
35 | - <input name="share_option" type="radio" checked="checked" id="public" value="true" class="radio-btn"><label for="public" class="bg-radiobtn label-public">공개</label> | |
36 | - <input name="share_option" type="radio" id="private" value="false" class="radio-btn"><label for="private" class="bg-radiobtn label-private">비공개</label> | |
37 | - <span class="note">@Messages("project.private.notice")</span> | |
38 | - </div> | |
39 | - </li> | |
40 | - <li class="option"> | |
41 | - <div class="option-label">@Messages("project.vcs")</div> | |
42 | - <div class="option-desc"> | |
43 | - <div class="btn-group" data-name="vcs"> | |
44 | - <button class="btn dropdown-toggle large" data-toggle="dropdown"> | |
45 | - <span class="d-label"></span> | |
46 | - <span class="d-caret"><span class="caret"></span></span> | |
47 | - </button> | |
48 | - <ul class="dropdown-menu"> | |
49 | - @RepositoryService.vcsTypes.map{ v => | |
50 | - <li data-value="@v._1" @if(v._1 == "GIT"){ data-selected="true" class="active" }><a href="javascript:void(0)">@Messages(v._2)</a></li> | |
51 | - } | |
52 | - </ul> | |
53 | - </div> | |
54 | - </div> | |
55 | - </li> | |
56 | - | |
57 | - @** | |
58 | - <!-- | |
59 | - <li class="option"> | |
60 | - <div class="option-label">이용약관 <a href="#agreement" data-toggle="modal"><i class="ico ico-que-mark"></i></a></div> | |
61 | - <div id="agreement" class="modal hide fade"> | |
62 | - <div class="modal-header"> | |
63 | - <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> | |
64 | - <h3>이용약관</h3> | |
65 | - </div> | |
66 | - <div class="modal-body"> | |
67 | - <pre>@agreements()</pre> | |
68 | - </div> | |
69 | - <div class="modal-footer"> | |
70 | - <a href="#" class="btn" data-dismiss="modal">Close</a> | |
71 | - </div> | |
72 | - </div> | |
73 | - <div class="option-desc"> | |
74 | - <div class="n-alert" data-errType="accept"> | |
75 | - <div class="n-inner orange"> | |
76 | - <span class="msg">@Messages("project.new.agreement.alert")</span> | |
77 | - <a href="#!/close" class="ico btn-delete"></a> | |
78 | - </div> | |
79 | - </div> | |
80 | - <input type="checkbox" class="stipulation checkbox checkbox-btn" autocomplete="off" id="stipulation" name="accept"><label for="stipulation" class="bg-checkbox label-agreement">본인은 약관에 대한 안내를 읽었으며 동의 합니다.</label> | |
81 | - </div> | |
82 | - </li> | |
83 | - --> | |
84 | - **@ | |
85 | - </ul> | |
86 | - <div class="actions"> | |
87 | - <button class="nbtn orange medium">@Messages("project.create")</button> | |
88 | - <a href="/" class="nbtn medium black">@Messages("button.cancel")</a> | |
89 | - </div> | |
90 | - </form> | |
91 | - </div> | |
92 | - </div> | |
93 | - | |
94 | -<script type="text/javascript"> | |
95 | - $(document).ready(function(){ | |
96 | - $hive.loadModule("project.New", { | |
97 | - "sFormName": "newproject" | |
98 | - }); | |
99 | - }); | |
100 | -</script> | |
101 | -} |
--- app/views/project/projectDelete.scala.html
... | ... | @@ -1,46 +0,0 @@ |
1 | -@(message: String)(projectForm: Form[Project], project:Project) | |
2 | - | |
3 | -@import helper._ | |
4 | -@import utils.TemplateHelper._ | |
5 | - | |
6 | -@projectMngMain(message, project) { | |
7 | - @prjmenu(project, utils.MenuType.PROJECT_SETTING, "") | |
8 | - | |
9 | - <div class="bubble-wrap gray wp"> | |
10 | - <div class="cu-label">@Messages("project.delete")</div> | |
11 | - <div class="cu-desc"> | |
12 | - <p><strong class="notice">@Messages("project.delete.description")</strong></p> | |
13 | - <p> | |
14 | - <input type="checkbox" class="checkbox" autocomplete="off" id="accept"><!-- | |
15 | - --><label for="accept" class="bg-checkbox label-agreement">@Messages("project.delete.accept")</label> | |
16 | - </p> | |
17 | - </div> | |
18 | - </div> | |
19 | - <div class="box-wrap bottom"> | |
20 | - <a id="deletion" data-toggle="modal" href="#alertDeletion" class="nbtn medium orange"><!-- | |
21 | - --><i class="ico ico-delete-small"></i>@Messages("project.delete.this")</a> | |
22 | - </div> | |
23 | - | |
24 | - | |
25 | - <div id="alertDeletion" class="modal hide"> | |
26 | - <div class="modal-header"> | |
27 | - <button type="button" class="close" data-dismiss="modal">×</button> | |
28 | - <h3>@Messages("project.delete.requestion")</h3> | |
29 | - </div> | |
30 | - <div class="modal-body"> | |
31 | - <p> @Messages("project.delete.description")</p> | |
32 | - <p> @Messages("project.delete.reaccept") </p> | |
33 | - </div> | |
34 | - <div class="modal-footer"> | |
35 | - <a href="#" class="btn" data-dismiss="modal">@Messages("button.no")</a> | |
36 | - <a href="@routes.ProjectApp.deleteProject(project.owner, project.name)" class="btn btn-danger">@Messages("button.yes")</a> | |
37 | - </div> | |
38 | - </div> | |
39 | - | |
40 | - <script type="text/javascript"> | |
41 | - $(document).ready(function(){ | |
42 | - $hive.loadModule("project.Delete"); | |
43 | - }); | |
44 | - </script> | |
45 | - | |
46 | -} |
--- app/views/project/projectHome.scala.html
... | ... | @@ -1,122 +0,0 @@ |
1 | - | |
2 | -@(message: String, project: Project, histories: List[models.History] ) | |
3 | - | |
4 | -@import utils.JodaDateUtil._ | |
5 | -@import utils.TemplateHelper._ | |
6 | -@import models.enumeration._ | |
7 | - | |
8 | -@main(message, project, utils.MenuType.PROJECT_HOME) { | |
9 | -<div class="page"> | |
10 | - @prjmenu(project, utils.MenuType.PROJECT_HOME, "") | |
11 | - | |
12 | - <div class="input-prepend project-hometop-wrap"> | |
13 | - <div class="vcs-wrap pull-left"> | |
14 | - <span class="clone-label"><strong class="@project.vcs">@project.vcs</strong></span><!-- | |
15 | - --><input id="repositoryURL" type="text" class="text repo-url" readonly="readonly" value="@CodeApp.getURL(project.owner, project.name)"> | |
16 | - </div> | |
17 | - <div class="issue-wrap btn-group pull-right"> | |
18 | - <button class="btn" disabled="true">@Messages("menu.issue")</button> | |
19 | - <a href="@routes.IssueApp.issues(project.owner, project.name, State.OPEN.state)" class="btn"> | |
20 | - @Messages("issue.state.open") <strong class="num open">@Issue.countIssues(project.id, State.OPEN)</strong> | |
21 | - </a> | |
22 | - <a href="@routes.IssueApp.issues(project.owner, project.name, State.CLOSED.state)" class="btn"> | |
23 | - @Messages("issue.state.closed") <strong class="num">@Issue.countIssues(project.id, State.CLOSED)</strong> | |
24 | - </a> | |
25 | - </div> | |
26 | - </div> | |
27 | - | |
28 | - <div class="bubble-wrap dark-gray project-home"> | |
29 | - <div class="inner logo"> | |
30 | - <div class="logo-wrap"> | |
31 | - <img src="@defining(Attachment.findByContainer(project.asResource)) @{ files => | |
32 | - if (files.size > 0) "/files/" + files.head.id | |
33 | - else routes.Assets.at("images/bg-default-project.jpg")}"/> | |
34 | - </div> | |
35 | - </div> | |
36 | - <div class="inner project-info"> | |
37 | - <header> | |
38 | - <h3>@Messages("project.info")</h3> | |
39 | - <!--<div class="project-status"> | |
40 | - <i class="ico ico-like"></i> | |
41 | - <span class="num">100</span> | |
42 | - <span class="sp">|</span> | |
43 | - <i class="ico ico-activity high"></i> | |
44 | - </div>--> | |
45 | - </header> | |
46 | - <ul class="infos"> | |
47 | - <li class="info"> | |
48 | - <strong>@Messages("project.license") :</strong> GPL v2 | |
49 | - </li> | |
50 | - <li class="info"> | |
51 | - <strong>@Messages("project.tags") :</strong> | |
52 | - @for(tag <- project.tags) { | |
53 | - <span class="label">@tag.name</span> | |
54 | - } | |
55 | - </li> | |
56 | - <li class="info"> | |
57 | - <strong>@Messages("project.codeLanguage") :</strong> Java, JavaScript | |
58 | - </li> | |
59 | - <li class="info"> | |
60 | - <strong>@Messages("project.vcs") :</strong> @project.vcs | |
61 | - </li> | |
62 | - </ul> | |
63 | - </div> | |
64 | - <div class="inner member-info"> | |
65 | - <header> | |
66 | - <h3>@Messages("project.members")</h3> | |
67 | - </header> | |
68 | - <div class="member-wrap"> | |
69 | - <ul class="project-members"> | |
70 | - @for(member <- User.findUsersByProject(project.id)){ | |
71 | - <li class="member"> | |
72 | - <a href="@routes.UserApp.userInfo(member.loginId)" class="avatar-wrap img-rounded pull-left small"> | |
73 | - <img src="@member.avatarUrl" alt="@member.loginId" width="24" height="24"> | |
74 | - </a> | |
75 | - <a href="@routes.UserApp.userInfo(member.loginId)" class="name"> | |
76 | - <strong>@member.loginId (@member.name)</strong> | |
77 | - </a> | |
78 | - </li> | |
79 | - } | |
80 | - </ul> | |
81 | - </div> | |
82 | - </div> | |
83 | - </div> | |
84 | - | |
85 | - @if(histories.size > 0) { | |
86 | - <table class="table table-hover"> | |
87 | - <tbody> | |
88 | - @for(history <- histories.iterator()) { | |
89 | - <tr> | |
90 | - <td>@agoString(ago(history.getWhen()))</td> | |
91 | - <td><a href="@history.getUserPageUrl()">@history.getWho()</a></td> | |
92 | - <td>@history.getWhat()</td> | |
93 | - <td><a href="@history.getUrl()">@history.getHow()</a></td> | |
94 | - </tr> | |
95 | - } | |
96 | - </tbody> | |
97 | - </table> | |
98 | - } | |
99 | - | |
100 | - <div class="bubble-wrap dark-gray readme"> | |
101 | - @if(project.readme == null) { | |
102 | - <p class="default"> | |
103 | - @Messages("project.readme") | |
104 | - </p> | |
105 | - } else { | |
106 | - <div class="readme-wrap"> | |
107 | - <header><i class="ico ico-readme-book"></i><strong>README.md</strong></header> | |
108 | - <div class="readme-body" markdown="true"> | |
109 | - @project.readme | |
110 | - </div> | |
111 | - </div> | |
112 | - } | |
113 | - @markdown() | |
114 | - </div> | |
115 | -</div> | |
116 | - | |
117 | -<script type="text/javascript"> | |
118 | -$(document).ready(function(){ | |
119 | - $hive.loadModule("project.Home"); | |
120 | -}); | |
121 | -</script> | |
122 | -}(No newline at end of file) |
--- app/views/project/projectMngMain.scala.html
... | ... | @@ -1,21 +0,0 @@ |
1 | -@(title: String, project:Project)(content: Html) | |
2 | - | |
3 | -@layout(Messages(title) + " (" + project.name + ")")("prj") { | |
4 | - <header class="gnb-outer"> | |
5 | - @topmenu(project) | |
6 | - @sidemenu(project) | |
7 | - </header> | |
8 | - | |
9 | - <div class="container page-wrap"> | |
10 | - <div class="page"> | |
11 | - @alert() | |
12 | - @content | |
13 | - </div> | |
14 | - </div> | |
15 | - | |
16 | - <footer class="page-footer-outer"> | |
17 | - <div class="page-footer"> | |
18 | - <span class="provider">Powered by <strong>HIVE</strong></span> | |
19 | - </div> | |
20 | - </footer> | |
21 | -} |
--- app/views/project/setting.scala.html
+++ app/views/project/setting.scala.html
... | ... | @@ -2,27 +2,33 @@ |
2 | 2 |
|
3 | 3 |
@import helper._ |
4 | 4 |
@import utils.TemplateHelper._ |
5 |
-@implicitField = @{ helper.FieldConstructor(simpleForm) } |
|
6 | 5 |
|
7 |
-@projectMngMain(message, project) { |
|
8 |
- @prjmenu(project, utils.MenuType.PROJECT_SETTING, "") |
|
6 |
+@projectLogoImage = @{ |
|
7 |
+ defining(Attachment.findByContainer(project.asResource)) { files => |
|
8 |
+ if(files.size > 0){ |
|
9 |
+ "/files/" + files.head.id |
|
10 |
+ } else { |
|
11 |
+ routes.Assets.at("images/bg-default-project.jpg") |
|
12 |
+ } |
|
13 |
+ } |
|
14 |
+} |
|
9 | 15 |
|
10 |
- @form(action=routes.ProjectApp.settingProject(project.owner, project.name), 'id->"saveSetting" , 'enctype->"multipart/form-data", 'class->"nm"){ |
|
16 |
+@main(message, project, utils.MenuType.PROJECT_SETTING) { |
|
17 |
+<div class="page"> |
|
18 |
+ @prjmenu(project, utils.MenuType.PROJECT_SETTING, "") |
|
19 |
+ |
|
20 |
+ <form id="saveSetting" method="post" action="@routes.ProjectApp.settingProject(project.owner, project.name)" enctype="multipart/form-data" class="nm"> |
|
11 | 21 |
<div class="bubble-wrap gray"> |
12 | 22 |
<input type="hidden" name="id" value="@projectForm("id").value.toLong"> |
13 | 23 |
<div class="box-wrap top clearfix frm-wrap"> |
14 | 24 |
<div class="setting-box left"> |
15 |
- <div class="logo-wrap"> |
|
16 |
- <img src="@defining(Attachment.findByContainer(project.asResource)) @{ files => |
|
17 |
- if (files.size > 0) "/files/" + files.head.id |
|
18 |
- else routes.Assets.at("images/bg-default-project.jpg") }"> |
|
19 |
- </div> |
|
25 |
+ <div class="logo-wrap" style="background-image:url('@projectLogoImage')"></div> |
|
20 | 26 |
<div class="logo-desc"> |
21 | 27 |
<ul class="unstyled descs"> |
22 | 28 |
<li><strong>@Messages("project.logo")</strong></li> |
23 | 29 |
<li>@Messages("project.logo.type") <span class="point">bmp, jpg, gif, png</span></li> |
24 | 30 |
<li>@Messages("project.logo.maxFileSize") <span class="point">1MB</span></li> |
25 |
- <li>@Messages("project.logo.size") <span class="point">234px × 168px</span></li> |
|
31 |
+ @**<!-- <li>@Messages("project.logo.size") <span class="point">234px × 168px</span></li> -->**@ |
|
26 | 32 |
<li> |
27 | 33 |
<div class="btn-wrap"> |
28 | 34 |
<div class="nbtn medium white fake-file-wrap"> |
... | ... | @@ -39,14 +45,16 @@ |
39 | 45 |
<label for="project-name">@Messages("project.name.placeholder")</label> |
40 | 46 |
</dt> |
41 | 47 |
<dd> |
42 |
- @inputText(projectForm("name"), 'class->"text", 'maxlength -> "250") |
|
48 |
+ <input type="text" name="name" maxlength="250" value="@project.name"> |
|
49 |
+ <!-- @inputText(projectForm("name"), 'class->"text", 'maxlength -> "250") --> |
|
43 | 50 |
</dd> |
44 | 51 |
|
45 | 52 |
<dt> |
46 | 53 |
<label for="project-desc">@Messages("project.description.placeholder")</label> |
47 | 54 |
</dt> |
48 | 55 |
<dd> |
49 |
- @textarea(projectForm("overview"), 'class->"textarea") |
|
56 |
+ <textarea name="overview" class="textarea">@project.overview</textarea> |
|
57 |
+ <!-- @textarea(projectForm("overview"), 'class->"textarea") --> |
|
50 | 58 |
</dd> |
51 | 59 |
</dl> |
52 | 60 |
</div> |
... | ... | @@ -79,7 +87,8 @@ |
79 | 87 |
<div class="box-wrap bottom"> |
80 | 88 |
<button id="save" type="submit" class="nbtn orange medium">@Messages("button.save")</button> |
81 | 89 |
</div> |
82 |
- } |
|
90 |
+ </form> |
|
91 |
+</div> |
|
83 | 92 |
|
84 | 93 |
<script type="text/javascript"> |
85 | 94 |
$(document).ready(function(){ |
--- conf/messages.ko
+++ conf/messages.ko
... | ... | @@ -265,11 +265,11 @@ |
265 | 265 |
project.milestone = 마일스톤 |
266 | 266 |
project.sidebar.plugin = 플러그인 |
267 | 267 |
project.sidebar.help = 도움말 |
268 |
-project.logo.type = 파일형식: |
|
268 |
+project.logo.type = 파일형식 |
|
269 | 269 |
project.logo.maxFileSize = 최대파일크기 |
270 | 270 |
project.logo.fileSizeAlert = 이미지 용량은 1MB 이하여야 합니다. |
271 | 271 |
project.logo.size = 사이즈 |
272 |
-project.logo = 로고 |
|
272 |
+project.logo = 프로젝트 로고 |
|
273 | 273 |
project.logo.alert = 이미지 파일이 아닙니다. |
274 | 274 |
project.siteurl = 사이트 주소 |
275 | 275 |
project.siteurl.alert = 사이트 URL은 http://로 시작해야 합니다. |
--- docs/technical/javascript-module-guide.md
+++ docs/technical/javascript-module-guide.md
... | ... | @@ -62,11 +62,18 @@ |
62 | 62 |
## 기타 |
63 | 63 |
|
64 | 64 |
* HTML 템플릿은 가능한 한 자바스크립트 파일 내에 포함하지 않는다 |
65 |
-* HTML 템플릿 데이터는 정적 페이지내에 <script type="text/template"> 형태로 위치시키고 자바스크립트는 그 내용을 활용하는 형태로 작성한다 |
|
65 |
+* HTML 템플릿은 정적 페이지내에 <script type="text/template"> 형태로 위치시키고 자바스크립트는 그 내용을 활용하는 형태로 작성한다 |
|
66 | 66 |
|
67 | 67 |
> <script type="text/template" id="tplItem"> |
68 |
-> ${name} ${email} |
|
68 |
+> <div>${name} ${email}</div> |
|
69 | 69 |
> </script> |
70 | 70 |
> |
71 |
-> var sTpl = document.getElementById("tplItem").text; |
|
72 |
- |
|
71 |
+> <script type="text/javascript"> |
|
72 |
+> var sTpl = document.getElementById("tplItem").text; |
|
73 |
+> var htData = { |
|
74 |
+> "name" : "John Doe", |
|
75 |
+> "email": "john@doe.com" |
|
76 |
+> }; |
|
77 |
+> |
|
78 |
+> $.tmpl(sTpl, htData).appendTo("#target"); |
|
79 |
+> </script>(No newline at end of file) |
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?