THIS IS A TEST INSTANCE ONLY! REPOSITORIES CAN BE DELETED AT ANY TIME!

Browse Source

hive design applied

tags/v1.0.0-beta
Jihan Kim 7 years ago
parent
commit
ec11bda9af
44 changed files with 3247 additions and 996 deletions
  1. +2
    -1
      .gitignore
  2. +12
    -11
      app/assets/stylesheets/less/_buttons.less
  3. +53
    -38
      app/assets/stylesheets/less/_common.less
  4. +22
    -11
      app/assets/stylesheets/less/_mixins.less
  5. +929
    -281
      app/assets/stylesheets/less/_page.less
  6. +69
    -14
      app/assets/stylesheets/less/_sprites.less
  7. +232
    -5
      app/assets/stylesheets/less/_task.less
  8. +28
    -18
      app/assets/stylesheets/less/_variables.less
  9. +3
    -2
      app/views/board/postList.scala.html
  10. +3
    -3
      app/views/code/codeView.scala.html
  11. +19
    -16
      app/views/code/nohead.scala.html
  12. +1
    -1
      app/views/home.scala.html
  13. +309
    -83
      app/views/index.scala.html
  14. +2
    -6
      app/views/issue/issueList.scala.html
  15. +6
    -5
      app/views/main.scala.html
  16. +30
    -24
      app/views/navbar.scala.html
  17. +28
    -0
      app/views/prjmenu.scala.html
  18. +73
    -72
      app/views/project/projectHome.scala.html
  19. +5
    -5
      app/views/project/projectMngMain.scala.html
  20. +9
    -6
      app/views/project/setting.scala.html
  21. +4
    -3
      app/views/sidemenu.scala.html
  22. +31
    -36
      app/views/topmenu.scala.html
  23. +356
    -355
      conf/messages.ko
  24. BIN
      public/images/bg-default-project.jpg
  25. BIN
      public/images/bg_head.jpg
  26. BIN
      public/images/default-avatar-128.png
  27. BIN
      public/images/default-avatar-34.png
  28. BIN
      public/images/default-avatar-64.png
  29. BIN
      public/images/img_front.jpg
  30. BIN
      public/images/sprite.png
  31. BIN
      public/images/sprite2.png
  32. +29
    -0
      public/images/webfont/.svn/all-wcprops
  33. +171
    -0
      public/images/webfont/.svn/entries
  34. +5
    -0
      public/images/webfont/.svn/prop-base/DroidSans.eot.svn-base
  35. +5
    -0
      public/images/webfont/.svn/prop-base/DroidSans.ttf.svn-base
  36. +5
    -0
      public/images/webfont/.svn/prop-base/DroidSans.woff.svn-base
  37. BIN
      public/images/webfont/.svn/text-base/DroidSans.eot.svn-base
  38. +403
    -0
      public/images/webfont/.svn/text-base/DroidSans.svg.svn-base
  39. BIN
      public/images/webfont/.svn/text-base/DroidSans.ttf.svn-base
  40. BIN
      public/images/webfont/.svn/text-base/DroidSans.woff.svn-base
  41. BIN
      public/images/webfont/DroidSans.eot
  42. +403
    -0
      public/images/webfont/DroidSans.svg
  43. BIN
      public/images/webfont/DroidSans.ttf
  44. BIN
      public/images/webfont/DroidSans.woff

+ 2
- 1
.gitignore View File

@@ -18,4 +18,5 @@ repo/
RUNNING_PID
db
*.db
.DS_Store
.DS_Store
bin

+ 12
- 11
app/assets/stylesheets/less/_buttons.less View File

@@ -1,5 +1,6 @@
.n-btn {
color: @white;
font-weight:bold;
font-size: 18px;
line-height: 18px;
height: 18px;
@@ -19,7 +20,7 @@
line-height: 1;
}
&.blue {
background-color: #53A1AF;
background-color: #56B5D9; /*#53A1AF;*/
&:hover {
background-color: #72C4D3;
}
@@ -36,16 +37,16 @@
background-color: #FF9F6B;
}
}
&.red {
background-color: @red;
&:hover {
background-color: lighten(@red, 10%)
}
}
&.gray {
background-color: @gray-66;
background-color: @gray-cc;
&:hover {
background-color : #E1E1E1;
}
}
&.light-gray {
background-color: #707070;
&:hover {
background-color : darken(@gray-66, 10%)
background-color: lighten(#707070, 10%);
}
}
&.black {
@@ -55,7 +56,6 @@
}
}


&.med {
font-size: 11px;
padding: 3px 20px;
@@ -83,8 +83,9 @@
padding: 2px 10px;
background-color: @white;
&:hover {
color: #666666;
color: #333;
cursor: pointer;
text-decoration: none;
}
> i.ico {
margin-right: 5px;


+ 53
- 38
app/assets/stylesheets/less/_common.less View File

@@ -3,6 +3,7 @@ html, body {
}

body {
/*
background-repeat: no-repeat;
background-color: #8cc8ce;
background-position: center bottom, center top;
@@ -11,18 +12,10 @@ body {
background-color: #22262c;
background-image: url("/images/bg_night.png");
}

}

code {
font-size: 12px;
}

pre {
padding: 0px;
margin: 10px;
border: none;
*/
font-family: @base-font-family;
}
input, button, select, textarea { font-family: @base-font-family !important; }

a {
color: inherit;
@@ -55,19 +48,17 @@ a {
.n-alert {
overflow: hidden;
.n-inner {
cursor:pointer;
float: left;
font-size: 11px;
border: 1px solid #93C0C8;
color: #4092A1;
background-color: #E8f6f9;
border: 1px solid #FAC7AB;
/*border: 1px solid #93C0C8;*/
color: @orange; /*#4092A1;*/
background-color: #FFF0E8; /*#E8f6f9;*/
padding: 0 7px;
line-height: 25px;
.border-radius(2px);
&.orange {
color: @orange;
background-color: #FFF0E8;
border: 1px solid #FAC7AB;
}
}
margin-bottom: 5px;
}
@@ -104,7 +95,7 @@ a {
font-size: 12px;
color: #8E9094;
.current {
color: #4489A4;
color: @orange; /*#4489A4;*/
font-weight: bold;
}
&.ikon {
@@ -117,7 +108,7 @@ a {
padding: 0 5px;
span {
font-size: 11px;
color: #4489A4;
color: @orange; /*#4489A4;*/
&.off {
color: #8E9094;
}
@@ -127,26 +118,50 @@ a {
}
}
.progress {
&.n4 {
height: 7px;
margin-bottom: 5px;
.orange {
background-color: #f28149;
background-image: -moz-linear-gradient(top, #f28149, #f28149);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f28149), to(#f28149));
background-image: -webkit-linear-gradient(top, #f281490, #f28149);
background-image: -o-linear-gradient(top, #f28149, #f28149);
background-image: linear-gradient(to bottom, #f28149, #f28149);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff28149', endColorstr='#ff28149', GradientType=0);
.box-shadow(none);
}
height: 7px;
margin-bottom: 5px;
background:#b1b1b1;
.box-shadow(inset 0px 1px 1px rgba(0,0,0,0.25));
.bar {
&.orange { background:@orange; .box-shadow(none); } // #f28149
&.blue { background:@blue; .box-shadow(none); }
}
}
.img-rounded {
.border-radius(3px) !important;
border: 1px solid #CCC;
}
.gray {
color: @gray-99
}

.orange-txt {
color:@orange !important;
}
.center-txt {
text-align:center;
}

.bgblack {
background:#000;
}
.bgwhite {
background:#fff;
}
.bgblue {
background:@blue; /*#56B5D9;*/
}
.bgorange {
background:@orange;
}
.vmiddle {
vertical-align:middle !important
}

.mandatory-text-wrap {
overflow:hidden; position:relative;
}
.mandatory-text-flag {
position:absolute;
right:-7px; top:-7px;
width:14px; height:14px;
background:#f00;
-webkit-transform:rotate(45deg);
}

+ 22
- 11
app/assets/stylesheets/less/_mixins.less View File

@@ -1,13 +1,3 @@
/*!
* Bootstrap Responsive v2.0.4
*
* Copyright 2012 Twitter, Inc
* Licensed under the Apache License v2.0
* http://www.apache.org/licenses/LICENSE-2.0
*
* Designed and built with all the love in the world @twitter by @mdo and @fat.
*/

// CSS3 PROPERTIES
// --------------------------------------------------

@@ -17,6 +7,15 @@
-moz-border-radius: @radius;
border-radius: @radius;
}
.border-radius-bottom(@radius: 5px){
-webkit-border-bottom-left-radius:@radius;
-moz-border-bottom-left-radius:@radius;
border-bottom-left-radius:@radius;

-webkit-border-bottom-right-radius:@radius;
-moz-border-bottom-right-radius:@radius;
border-bottom-right-radius:@radius;
}

// Drop shadows
.box-shadow(@shadow: 0 1px 3px rgba(0, 0, 0, .25)){
@@ -80,6 +79,18 @@
opacity: @opacity / 100;
}

// Gradient
.linear-gradient(@startColor:'#f9fcf7', @endColor:'#f5f9f0'){
background: @startColor; /* Old browsers */
background: -moz-linear-gradient(top, @startColor 0%, @endColor 100%); /* FF3.6+ */
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,@startColor), color-stop(100%,@endColor)); /* Chrome,Safari4+ */
background: -webkit-linear-gradient(top, @startColor 0%, @endColor 100%); /* Chrome10+,Safari5.1+ */
background: -o-linear-gradient(top, @startColor 0%, @endColor 100%); /* Opera 11.10+ */
background: -ms-linear-gradient(top, @startColor 0%, @endColor 100%); /* IE10+ */
background: linear-gradient(to bottom, @startColor 0%, @endColor 100%); /* W3C */
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='@{startColor}', endColorstr='@{endColor}',GradientType=0 ); /* IE6-9 */
}

// Text overflow
// -------------------------
// Requires inline-block or block for proper styling
@@ -132,7 +143,7 @@
}

.helvetic-light {
font-family: "나눔고딕","굴림","HelveticaNeueLight", "HelveticaNeue-Light", "Helvetica Neue Light", "HelveticaNeue", "Helvetica Neue", "Helvetica";
font-family: "HelveticaNeueLight", "HelveticaNeue-Light", "Helvetica Neue Light", "HelveticaNeue", "Helvetica Neue", "Helvetica";
font-weight:200;
font-stretch:normal;
}

+ 929
- 281
app/assets/stylesheets/less/_page.less
File diff suppressed because it is too large
View File


+ 69
- 14
app/assets/stylesheets/less/_sprites.less View File

@@ -78,7 +78,7 @@
.btn-pg-first {
width: 11px;
height: 9px;
background-position: -185px -2px;
background-position: -120px -139px; /*-185px -2px;*/
&.off {
background-position: -2px -13px;
}
@@ -87,7 +87,7 @@
.btn-pg-latest {
width: 11px;
height: 9px;
background-position: -31px -13px;
background-position: -157px -139px; /*-31px -13px;*/
&.off {
background-position: -172px -2px;
}
@@ -96,7 +96,7 @@
.btn-pg-next {
width: 6px;
height: 9px;
background-position: -15px -13px;
background-position: -146px -139px; /*-15px -13px;*/
margin-left: 10px;
&.off {
background-position: -23px -13px;
@@ -106,7 +106,7 @@
.btn-pg-prev {
width: 6px;
height: 9px;
background-position: -229px -2px;
background-position: -136px -139px; /*-229px -2px;*/
margin-right: 10px;
&.off {
background-position: -164px -2px;
@@ -123,18 +123,18 @@
width: 20px;
height: 87px;
background-position: -46px -139px;
&.orange {
/*&.orange {*/
background-position: -68px -139px;
}
/*}*/
}

.gnb-right {
width: 20px;
height: 87px;
background-position: -24px -139px;
&.orange {
/*&.orange {*/
background-position: -2px -139px;
}
/*}*/
}

.gnb-sp-arrow {
@@ -161,6 +161,11 @@
background-position: -44px -2px;
}

.ico-arrow-up-gray {
width:11px; height:6px;
background-position: -120px -130px;
}

.ico-blue-dot {
width: 2px;
height: 2px;
@@ -282,19 +287,21 @@
width: 14px;
height: 13px;
background-position: -28px -27px;
&:hover {
/*&:hover {
background-position: -44px -27px;
}
}*/
}

.orange {
/*.orange {*/
.ico-search {
background-position: -60px -27px;
/*
&:hover {
background-position: -76px -27px;
}
*/
}
}
/*}*/

.ico-open-tag {
width: 43px;
@@ -368,17 +375,26 @@

.signin {
.ico-user {
width: 11px;
height: 11px;
/*
width: 16px;
height: 16px;
background-position: -157px -386px;
*/
margin-right: 5px;
vertical-align: middle;
/*
width: 11px;
height: 11px;
background-position: -91px -13px;
*/
}
/*
&:hover {
.ico-user {
background-position: -104px -13px;
}
}
*/
}

.ico-que-mark {
@@ -459,6 +475,15 @@
background-position: -131px -117px;
}

.ico-qa-plus {
width:14px; height:14px;
background-position:-3px -144px;
}
.ico-qa-minus {
width:14px; height:14px;
background-position:-20px -144px;
}

.btn-gray-arrow {
width: 7px;
height: 4px;
@@ -503,3 +528,33 @@
}
}

.btn-card-close {
width: 12px;
height: 12px;
background-position: -174px -103px;
}

.btn-small-edit {
width: 11px;
height: 10px;
background-position: -174px -127px;
}

.btn-label-white-close {
width: 7px;
height: 7px;
background-position: -174px -117px;
}

.btn-manage-user {
width: 26px;
height: 16px;
background-position: -157px -386px;
}

.btn-add-black {
width: 8px;
height: 8px;
background-position: -157px -409px;
}


+ 232
- 5
app/assets/stylesheets/less/_task.less View File

@@ -94,6 +94,9 @@ html.task-body {
&:nth-child(6n) {
margin-right: 0;
}
.img-rounded {
display: block;
}
}
}
}
@@ -162,7 +165,23 @@ html.task-body {
background-image: url('@{base-image-path}/assets/btn-done.png');
}
}
.task-main {
&.done {
.tasks-proxy-header {
background-color: #999;
}
.task-header {
background-color: #999;
.card-count-wrap {
color: #DBDBDB;
background-color: #777;
}
}
.tasks {

}
}
}
.tasks-proxy {
position: relative;
padding: 0 2px;
@@ -212,8 +231,7 @@ html.task-body {
padding-right: 10px;
}
&.open {
width: 695px;
padding-right: 0;
min-width: 695px;
}
max-height: 100%;
display: table-cell;
@@ -222,7 +240,6 @@ html.task-body {
border-right: 1px solid rgba(255, 255, 255, 0.3);
.box-shadow(inset -1px 0 0 rgba(0, 0, 0, 0.15));
width: 235px;
min-width: 235px;
.task-card-wrap {
float: left;
width: 220px;
@@ -252,6 +269,9 @@ html.task-body {
margin: 0;
padding: 10px 10px 0 10px;
.card {
&.open {
border: 1px solid #5495A1;
}
cursor: pointer;
background-color: @white;
border: 1px solid @gray-d4;
@@ -271,6 +291,9 @@ html.task-body {
> li {
float: left;
margin: 0 5px 5px 0;
.img-rounded {
display: block;
}
}
}
}
@@ -289,6 +312,15 @@ html.task-body {
.card-labels {
font-size: 0;
line-height: 10px;
overflow: hidden;
margin-bottom: 20px;
.btn-labels {
border: 1px solid #4092A1;
.box-shadow();
.ico-arrow-down-blue {
vertical-align: middle;
}
}
}

.card-label {
@@ -298,11 +330,17 @@ html.task-body {
font-size: 10px;
line-height: 12px;
font-weight: bold;
padding: 4px;
padding: 4px 8px;
margin-right: 3px;
color: @white;
&.empty {
padding: 0 9px;
height: 20px;
line-height: 20px;
}
&.round {
.border-radius(3px);
.box-shadow(0 1px 2px rgba(0, 0, 0, 0.20));
}
&.red {
background-color: #DA5454;
@@ -333,17 +371,206 @@ html.task-body {
.task-card-detail-bg {
width: 440px;
float: right;
overflow-y: auto;
padding: 10px 20px 20px 15px;
background-color: #BEBEBE;
.box-shadow(0 0 5px 1px rgba(0, 0, 0, 0.10) inset);
.hr {
margin: 15px 0;
}
.card-detail-wrap {
width: 440px;
background-color: @white;
.border-radius(10px);
padding: 20px;
padding: 20px 0 0;
.card-detail {
position: relative;
.inner {
padding: 0 20px;
}
}
.card-close {
position: absolute;
top: 0;
right: 20px;
}
.edit-label-wrap {
background-color: #E7E7E7;
border-top: 1px solid #C4C4C4;
border-bottom: 1px solid #C4C4C4;
.dp-label-wrap {
font-size: 0;
border-top: 3px solid #DDD;
padding: 10px 20px;
.close-label{
.inline-block;
margin-left: 5px;
}
}
.choose-label-wrap {
position: relative;
line-height: 1;
border-top: 1px solid #C1C1C1;
font-size: 0;
background-color: #D7D7D7;
padding: 10px 20px;
.top-arrow {
position: absolute;
border-left: 10px solid transparent;
border-right: 10px solid transparent;
border-bottom: 10px solid #C1C1C1;
top: -10px;
left: 50%;
width: 0;
height: 0;
margin-left: -10px;
.bg-arrow {
width: 0;
height: 0;
margin-left: -8px;
margin-top: 2px;
border-left: 8px solid transparent;
border-right: 8px solid transparent;
border-bottom: 8px solid #D7D7D7;
}
}
.label-name {
width: 129px;
height: 14px;
vertical-align: top;
padding: 3px 6px;
margin: 0 0 0 2px;
}
.add-label {
color: #4D4D4D;
font-weight: bold;
font-size: 11px;
text-decoration: none;
line-height: 22px;
margin-left: 40px;
}
}
}
.title {
font-size: 14px;
color: @black;
line-height: 16px;
margin: 0 0 20px;

}
.members {
margin: 0 0 30px;
list-style: none;
overflow: hidden;
.member {
float: left;
margin-right: 3px;
.img-rounded {
display: block;
}
}
}
.header-label {
font-size: 14px;
margin: 28px 0 10px;
.num {
color: #51AACC;
}
}
.desc {
color: #666;
font-size: 12px;
margin-bottom: 20px;
}
.edit-btn {
color: #A2A2A2;
font-size: 10px;
text-decoration: none;
}
}
.card-activities {
margin-top: 30px;
padding: 0 20px;
background-color: #F5F5F5;
.border-radius(0 0 10px 10px);
.header {
overflow: hidden;
padding: 15px 0 0;
}
.title {
font-size: 14px;
margin: 0 0 10px 0;
line-height: 18px;
color: #222;
}
.num {
color: #51AACC;
font-size: 14px;
&.small {
font-size: 11px;
}
}
.card-state {
.ico {
margin-right: 3px;
vertical-align: middle;
&.ico-blue-dot {
margin-left: 3px;
}
}
}
.comment-wrap {
.media-body {
margin-left: 44px;
.comment {
width: 342px;
margin-bottom: 5px;
}
.btns {
font-size: 0;
.blue {
margin-right: 7px;
}
}
}
.comments {
margin-top: 20px;
overflow: hidden;
list-style: none;
margin: 0;
.comment{
padding: 15px 0;
border-top: 1px solid #DCDCDC;
.comment-info {
margin-bottom: 10px;
font-size: 10px;
color: #646464;
.uname {
font-size: 11px;
font-weight: bold;
}
.date {
color: #BDBDBD;
}
}
.comment-body {
color: #666;
&.mentioned {
background-color: #DCDCDC;
.border-radius(10px);
border: 1px solid #D3D3D3;
padding: 10px 15px;
font-size: 11px;
.who {
margin-bottom: 5px;
}
}
}
}
}
}
}
.card-detail-footer {
height: 20px;
}
}

+ 28
- 18
app/assets/stylesheets/less/_variables.less View File

@@ -5,23 +5,24 @@
// --------------------------------------------------

// Typography
@base-font-size: 13px;
@base-font-family: '돋음', Tahoma, Arial, sans-serif;
@base-line-height: 18px;
@base-text-color: #333;
@base-font-size: 13px;
//@base-font-family: '돋음', Tahoma, Arial, sans-serif;
//@base-font-family: 'Droid Sans', 'Myriad Pro', Tahoma, dotum, '돋움', Arial, sans-serif;
@base-font-family: 'Droid Sans', Tahoma;/*, '돋움', Dotum, Arial, sans-serif;*/
@base-line-height: 18px;
@base-text-color: #333;
@base-width: 960px;

@base-image-path: "/assets/images";
//--@base-image-path: "/images";
@base-image-path: "/assets/images";
@base-webfont-path: "/assets/images/webfont";

// Color
@link-color: #40849F;
@link-hover-color: #40849F;
@link-color: #F36C22; /*#40849F;*/
@link-hover-color: #F36C22; /*40849F;*/
@white: #FFF;
@black: #000;
@orange: #F36C22;
@blue: #4DB1C8;
@red: #B22222;
@blue: #5DBBE0; /*#56B5D9;*/ /*4DB1C8;*/

@gray-d4: #D4D4D4;
@gray-ec: #ECECEC;
@@ -30,20 +31,29 @@
@gray-87: #878787;
@gray-99: #999;
@gray-66: #666;
@gray-33: #333;
@gray-cc: #CCC;
@gray-52: #5D5D5D;
@gray-f2: #F2F2F2;
@gray-d9: #D9D9D9;

@orange-gnb-color: #110D08;
@orange-search-bar-bg-color: #525252;
@search-bar-bg-color: #2C4E55;
@gnb-color: #3B5C63;
@search-bar-bg-color: #fff;/*2C4E55;*/ /*#525252;*/
@gnb-color: #3B5C63; /*#110D08;*/
@gnb-active-color: #2C4E55;

@gnb-link-color: #FFF;
@gnb-link-hover-color: #5DD4FF;
@orange-gnb-link-hover-color: #F36C22;
@gnb-link-color: #111;
@gnb-link-hover-color: #F36C22; /*#5DD4FF;*/
@activity-separate-border-color: #E7E7E7;

// FONT-FACE (webfont)
/**/
@font-face {
font-family:'Droid Sans';
src: url('@{base-webfont-path}/DroidSans.eot');
src: url('@{base-webfont-path}/DroidSans.eot?#iefix') format('embedded-opentype'),
url('@{base-webfont-path}/DroidSans.woff') format('woff'),
url('@{base-webfont-path}/DroidSans.ttf') format('truetype'),
url('@{base-webfont-path}/DroidSans.svg#DroidSans') format('svg');
font-weight: 400;
font-style: normal;
}
/**/

+ 3
- 2
app/views/board/postList.scala.html View File

@@ -21,7 +21,8 @@

@main(title, project, utils.MenuType.BOARD) {
<div class="page">
@pageTitle(project,"Board")
@views.html.prjmenu(project, utils.MenuType.BOARD)
<div class="header-wrap">
<div class="search-wrap board">
<div class="inner">
@@ -78,7 +79,7 @@
}
@if(isCreatable(User.findByLoginId(session.get("loginId")), project, models.enumeration.ResourceType.BOARD_POST)){
<div class="write-btn-wrap">
<a href="@routes.BoardApp.newPostForm(project.owner, project.name)" class="n-btn blue small">@Messages("post.write")</a>
<a href="@routes.BoardApp.newPostForm(project.owner, project.name)" class="n-btn orange med">@Messages("post.write")</a>
</div>
}
<div id="pagination">


+ 3
- 3
app/views/code/codeView.scala.html View File

@@ -1,8 +1,9 @@
@(project:Project, branches:List[String])

@main("코드", project, utils.MenuType.CODE){
<div class="page code-browse">
@pageTitle(project, "Code Browser")
<div class="page" style="padding-bottom:20px;"><!-- code-browse -->
@views.html.prjmenu(project, utils.MenuType.CODE)
<ul class="nav nav-tabs code-tab">
<li class="active">
<a href="@routes.CodeApp.codeBrowser(project.owner, project.name)">@Messages("code.files")</a>
@@ -62,7 +63,6 @@
</div>



<script type="text/javascript" src="/assets/javascripts/hljs.js"></script>
<script type="text/javascript" src="/assets/javascripts/hljs.jquery.js"></script>
<script type="text/javascript" src="/assets/javascripts/languages/allinone.js"></script>


+ 19
- 16
app/views/code/nohead.scala.html View File

@@ -1,16 +1,19 @@
@(project: Project)

@main(Messages("Commit History"), project, utils.MenuType.CODE) {
<div class="page">
<div id="codeError" class="row-fluid">
<div class="well span12">
<p>HEAD커밋이 존재하지 않습니다. 다음과 같은 방법을 시도해 보세요</p>
<pre><code>git clone @CodeApp.getURL(project.owner, project.name)
touch readme.md
git add readme.md
git commit -m "init"
git push origin master</code></pre>
</div>
</div>
</div>
}
@(project: Project)
@main(Messages("Commit History"), project, utils.MenuType.CODE) {
<div class="page">
@views.html.prjmenu(project, utils.MenuType.CODE)
<div id="codeError" class="row-fluid">
<div class="well span12">
<p>HEAD커밋이 존재하지 않습니다. 다음과 같은 방법을 시도해 보세요</p>
<pre><code>git clone @CodeApp.getURL(project.owner, project.name)
touch readme.md
git add readme.md
git commit -m "init"
git push origin master</code></pre>
</div>
</div>
</div>
}

+ 1
- 1
app/views/home.scala.html View File

@@ -8,7 +8,7 @@
</div>
<footer class="page-footer-outer">
<div class="page-footer">
<span class="provider">Powered by <strong>nFORGE.</strong></span>
<span class="provider">Powered by <strong>HIVE</strong></span>
</div>
</footer>
}

+ 309
- 83
app/views/index.scala.html View File

@@ -1,83 +1,309 @@
@(projects:List[Project], orderString:String)

@home("Welcome to nForge", utils.MenuType.SITE_HOME) {
<div class="page@if(!session.contains("userId")){ full}">
<div class="center-wrap tag-line-wrap">
<h1 class="title"><span class="high-light">@Messages("hive.title")</span> nFORGE</h1>
<p class="tag-line">@Messages("hive.description")</p>
</div>
<div class="@if(session.contains("userId")){fn-intro-wrap}else{intro-wrap}">
<ul class="intros@if(!session.contains("userId")){ unstyled}">
<li class="intro"><img src="@routes.Assets.at("images/img-project-198.png")" width="198" height="180"/></li>
<li class="intro"><img src="@routes.Assets.at("images/img-repository-198.png")" width="198" height="180"/></li>
<li class="intro"><img src="@routes.Assets.at("images/img-issue-198.png")" width="198" height="180"/></li>
<li class="intro"><img src="@routes.Assets.at("images/img-task-198.png")" width="198" height="180"/></li>
</ul>
@if(session.contains("userId")){
<a href="#!/toggle-intro" class="toggle-intro"><i class="ico btn-open-close"></i></a>
}
</div>
@if(session.contains("userId")){
<div class="content-container">
<div class="main-stream">
<ul>
</ul>
</div>
<div class="right-aside">
<div class="gray-bubble-wrap">
<div class="bg-bubble-top ico">
<div class="project-count-wrap">
@Messages("project.myproject") <i class="ico ico-dot-white"></i><span class="p-num">@projects.size()</span>
</div>
<div class="project-list-sort">
<span class="ordertype-date">
@if( orderString == "date desc" ){
<a href="@routes.Application.index()?order=date"><strong>@Messages("orderby.recent")</strong> <i class="icon-chevron-down"></i></a>
} else {
@if( orderString == "date" ){
<a href="@routes.Application.index()?order=date desc"><strong>@Messages("orderby.recent")</strong> <i class="icon-chevron-up"></i></a>
} else {
<a href="@routes.Application.index()?order=date">@Messages("orderby.recent")</a>
}
}
</span><span class="delimeter"> | </span><span class="ordertype-name">
@if( orderString == "name desc" ){
<a href="@routes.Application.index()?order=name"><strong>@Messages("orderby.name")</strong> <i class="icon-chevron-down"></i></a>
} else {
@if( orderString == "name" ){
<a href="@routes.Application.index()?order=name desc"><strong>@Messages("orderby.name")</strong> <i class="icon-chevron-up"></i></a>
} else {
<a href="@routes.Application.index()?order=name">@Messages("orderby.name")</a>
}
}
</span>
</div>
</div>
<ul class="my-projects unstyled">
@views.html.myProjectList(projects)
</ul>
<div class="sp-line"></div>
<div class="btn-wrap">
<a href="@routes.ProjectApp.newProjectForm()"><i class="ico btn-new-project"></i></a>
</div>
</div>
</div>
</div>
} else {
<div class="center-wrap">
<a href="@routes.ProjectApp.newProjectForm()" class="n-btn blue create-project"><i class="ico ico-pencil"></i>@Messages("button.newProject")</a>
</div>
}
</div>
<script>
jQuery(function ($) {
$('.toggle-intro').on('click', function(e) {
nforge.stopEvent(e);
var target = $(this).prev();
target[(target.hasClass('closed')?'remove':'add')+'Class']('closed');
})
});
</script>
}
@(projects:List[Project], orderString:String)
@home("HIVE", utils.MenuType.SITE_HOME) {
<div class="page">
<div class="tag-line-wrap tag-line-wrap-index">
<h1 class="title"><span class="high-light">Software development platform</span></h1>
<p class="tag-line">
<span>Open Source</span> Project.
<span>Code</span> Repository.
<span>Issue</span> Tracker.
<span>Task</span> Management
</p>
</div>
<div class="fn-intro-wrap">
<ul class="intros @if(!session.contains("userId")){ index }">
<li class="project">
<strong>프로젝트</strong>
원하는 이름으로
프로젝트를 원하는 만큼 만들어보세요.
유일한 한계는 상상력의 한계일 뿐입니다.
</li>
<li class="repository">
<strong>코드 저장소</strong>
작성한 코드는
모두 이력이 관리되는 형태로 안전하게 서버에 보관됩니다
</li>
<li class="tracker">
<strong>이슈 트래커</strong>
팀이 함께 고민하고
처리해야 하는 내용들을 적고
거친 파도를 합심해 헤쳐나가듯 해결해 나갑니다.
</li>
<li class="tasks">
<strong>태스크 관리</strong>
문서와 자료도
팀에서 개발하는 소프트웨어 만큼이나
함께 만들고 함께 성장해 갑니다
</li>
</ul>
@if(session.contains("userId")){
<a href="#" id="toggleIntro"><i class="ico btn-open-close"></i></a>
<script type="text/javascript">
$(document).ready(function(){
$("#toggleIntro").click(function(){
$(".container").toggleClass("on-fold-intro");
});
});
</script>
}
</div>
<div class="content-container">
@if(session.contains("userId")){
<div class="main-stream">
<ul class="activity-streams unstyled">
<li class="activity-stream">
<a href="/uname" class="user-thumb-wrap">
<img src="@routes.Assets.at("images/default-avatar-64.png")" width="62" height="62" alt="avatar">
</a>
<div class="activity-desc">
<h5 class="header-text">
<a href="/username" class="actor">mojomobo</a>님이 <strong class="whereis">issue 707, jquery/jquery-ui</strong>에 새로운 댓글을 달았습니다.
</h5>
<div class="desc">
C++ STL 라이브러리를 사용한 SIP stack 라이브러리 개발 프로젝트입니다. 본 프로젝트의 최종 목표는 C++ SIP stack 라이브러를 사용한 SIP 서버개발입니다.
</div>
<p class="others">
<i class="ico ico-comment-bubble"></i><span class="num">23</span>
<i class="ico ico-sp-dot"></i>
<i class="ico ico-like"></i><span class="num">0</span>
<span class="date">5 days ago</span>
</p>
</div>
</li>
<li class="activity-stream">
<a href="/uname" class="user-thumb-wrap">
<img src="@routes.Assets.at("images/default-avatar-64.png")" width="62" height="62" alt="avatar">
</a>
<div class="activity-desc">
<h5 class="header-text">
<a href="/username" class="actor">k16wire</a>님이 <strong class="whereis">playframework/Play20</strong>를 즐겨찾기 추가 하였습니다.
</h5>
<div class="desc">
<ul class="commit-logs unstyled">
<li class="commit-log">
<div class="user-thumb-wrap">
<a href="/username">
<img src="@routes.Assets.at("images/default-avatar-34.png")" width="20" height="20" alt="avatar">
</a>
</div>
<div class="commit-detail">
<a href="/commit-log/4a2b004" class="commit-id">4a2boo4</a>
<span class="commit-msg">운영체제(을)를 &quot;없음&quot;에서 &quot;모든 윈도우 계열 공통&quot;(으)로 변경했습니다.</span>
</div>
</li>
<li class="commit-log">
<div class="user-thumb-wrap">
<a href="/username">
<img src="@routes.Assets.at("images/default-avatar-34.png")" width="20" height="20" alt="avatar">
</a>
</div>
<div class="commit-detail">
<a href="/commit-log/6aa41bf" class="commit-id">6aa41bf</a>
<span class="commit-msg">마일스톤(을)를 &quot;없음&quot;에서 &quot;6.3 릴리스&quot;(으)로 변경했습니다.</span>
</div>
</li>
<li class="commit-log">
<div class="user-thumb-wrap">
<a href="/username">
<img src="@routes.Assets.at("images/default-avatar-34.png")" width="20" height="20" alt="avatar">
</a>
</div>
<div class="commit-detail">
<a href="/commit-log/6aa41bf" class="commit-id">6aa41bf</a>
<span class="commit-msg">마일스톤(을)를 &quot;없음&quot;에서 &quot;6.3 릴리스&quot;(으)로 변경했습니다.</span>
</div>
</li>
</ul>
</div>
<p class="others">
<i class="ico ico-comment-bubble"></i><span class="num">23</span>
<i class="ico ico-sp-dot"></i>
<i class="ico ico-like"></i><span class="num">0</span>
<span class="date">5 days ago</span>
</p>
</div>
</li>
<li class="activity-stream">
<a href="/uname" class="user-thumb-wrap">
<img src="@routes.Assets.at("images/default-avatar-64.png")" width="62" height="62" alt="avatar">
</a>
<div class="activity-desc">
<h5 class="header-text">
<a href="/username" class="actor">mojomobo</a>님이 <strong class="whereis">issue 707, jquery/jquery-ui</strong>에 새로운 댓글을 달았습니다.
</h5>
<div class="desc">
C++ STL 라이브러리를 사용한 SIP stack 라이브러리 개발 프로젝트입니다. 본 프로젝트의 최종 목표는 C++ SIP stack 라이브러를 사용한 SIP 서버개발입니다.
</div>
<p class="others">
<i class="ico ico-comment-bubble"></i><span class="num">23</span>
<i class="ico ico-sp-dot"></i>
<i class="ico ico-like"></i><span class="num">0</span>
<span class="date">5 days ago</span>
</p>
</div>
</li>
<li class="activity-stream">
<a href="/uname" class="user-thumb-wrap">
<img src="@routes.Assets.at("images/default-avatar-64.png")" width="62" height="62" alt="avatar">
</a>
<div class="activity-desc">
<h5 class="header-text">
<a href="/username" class="actor">k16wire</a>님이 <strong class="whereis">playframework/Play20</strong>를 즐겨찾기 추가 하였습니다.
</h5>
<div class="desc">
<ul class="commit-logs unstyled">
<li class="commit-log">
<div class="user-thumb-wrap">
<a href="/username">
<img src="@routes.Assets.at("images/default-avatar-34.png")" width="20" height="20" alt="avatar">
</a>
</div>
<div class="commit-detail">
<a href="/commit-log/4a2b004" class="commit-id">4a2boo4</a>
<span class="commit-msg">운영체제(을)를 &quot;없음&quot;에서 &quot;모든 윈도우 계열 공통&quot;(으)로 변경했습니다.</span>
</div>
</li>
<li class="commit-log">
<div class="user-thumb-wrap">
<a href="/username">
<img src="@routes.Assets.at("images/default-avatar-34.png")" width="20" height="20" alt="avatar">
</a>
</div>
<div class="commit-detail">
<a href="/commit-log/6aa41bf" class="commit-id">6aa41bf</a>
<span class="commit-msg">마일스톤(을)를 &quot;없음&quot;에서 &quot;6.3 릴리스&quot;(으)로 변경했습니다.</span>
</div>
</li>
<li class="commit-log">
<div class="user-thumb-wrap">
<a href="/username">
<img src="@routes.Assets.at("images/default-avatar-34.png")" width="20" height="20" alt="avatar">
</a>
</div>
<div class="commit-detail">
<a href="/commit-log/6aa41bf" class="commit-id">6aa41bf</a>
<span class="commit-msg">마일스톤(을)를 &quot;없음&quot;에서 &quot;6.3 릴리스&quot;(으)로 변경했습니다.</span>
</div>
</li>
</ul>
</div>
<p class="others">
<i class="ico ico-comment-bubble"></i><span class="num">23</span>
<i class="ico ico-sp-dot"></i>
<i class="ico ico-like"></i><span class="num">0</span>
<span class="date">5 days ago</span>
</p>
</div>
</li>
<li class="activity-stream">
<a href="/uname" class="user-thumb-wrap">
<img src="@routes.Assets.at("images/default-avatar-64.png")" width="62" height="62" alt="avatar">
</a>
<div class="activity-desc">
<h5 class="header-text">
<a href="/username" class="actor">mojomobo</a>님이 <strong class="whereis">issue 707, jquery/jquery-ui</strong>에 새로운 댓글을 달았습니다.
</h5>
<div class="desc">
C++ STL 라이브러리를 사용한 SIP stack 라이브러리 개발 프로젝트입니다. 본 프로젝트의 최종 목표는 C++ SIP stack 라이브러를 사용한 SIP 서버개발입니다.
</div>
<p class="others">
<i class="ico ico-comment-bubble"></i><span class="num">23</span>
<i class="ico ico-sp-dot"></i>
<i class="ico ico-like"></i><span class="num">0</span>
<span class="date">5 days ago</span>
</p>
</div>
</li>
<li class="activity-stream">
<a href="/uname" class="user-thumb-wrap">
<img src="@routes.Assets.at("images/default-avatar-64.png")" width="62" height="62" alt="avatar">
</a>
<div class="activity-desc">
<h5 class="header-text">
<a href="/username" class="actor">k16wire</a>님이 <strong class="whereis">playframework/Play20</strong>를 즐겨찾기 추가 하였습니다.
</h5>
<div class="desc">
<ul class="commit-logs unstyled">
<li class="commit-log">
<div class="user-thumb-wrap">
<a href="/username">
<img src="@routes.Assets.at("images/default-avatar-34.png")" width="20" height="20" alt="avatar">
</a>
</div>
<div class="commit-detail">
<a href="/commit-log/4a2b004" class="commit-id">4a2boo4</a>
<span class="commit-msg">운영체제(을)를 &quot;없음&quot;에서 &quot;모든 윈도우 계열 공통&quot;(으)로 변경했습니다.</span>
</div>
</li>
<li class="commit-log">
<div class="user-thumb-wrap">
<a href="/username">
<img src="@routes.Assets.at("images/default-avatar-34.png")" width="20" height="20" alt="avatar">
</a>
</div>
<div class="commit-detail">
<a href="/commit-log/6aa41bf" class="commit-id">6aa41bf</a>
<span class="commit-msg">마일스톤(을)를 &quot;없음&quot;에서 &quot;6.3 릴리스&quot;(으)로 변경했습니다.</span>
</div>
</li>
<li class="commit-log">
<div class="user-thumb-wrap">
<a href="/username">
<img src="@routes.Assets.at("images/default-avatar-34.png")" width="20" height="20" alt="avatar">
</a>
</div>
<div class="commit-detail">
<a href="/commit-log/6aa41bf" class="commit-id">6aa41bf</a>
<span class="commit-msg">마일스톤(을)를 &quot;없음&quot;에서 &quot;6.3 릴리스&quot;(으)로 변경했습니다.</span>
</div>
</li>
</ul>
</div>
<p class="others">
<i class="ico ico-comment-bubble"></i><span class="num">23</span>
<i class="ico ico-sp-dot"></i>
<i class="ico ico-like"></i><span class="num">0</span>
<span class="date">5 days ago</span>
</p>
</div>
</li>
</ul>
</div>
<div class="right-aside">
<div class="gray-bubble-wrap">
<div class="project-count-wrap">
@Messages("project.myproject") <i>&middot;</i><span class="p-num">@projects.size()</span>
</div>
<div class="my-projects">
<ul class="unstyled">
@views.html.myProjectList(projects)
</ul>
<div class="btn-wrap">
<a href="@routes.ProjectApp.newProjectForm()"><i class="ico ico-pencil"></i> @Messages("button.newProject")</a>
</div>
</div>
</div>
</div>
} else {
<div class="front">
<div class="btn-wrap">
<a href="@routes.ProjectApp.newProjectForm()"><i class="ico ico-pencil"></i> @Messages("button.newProject")</a>
</div>
</div>
}
</div>
</div>
}

+ 2
- 6
app/views/issue/issueList.scala.html View File

@@ -43,11 +43,7 @@
@@IMPORT url("/assets/stylesheets/issue.css");
</style>
<div class="page-padding">
@pageTitle(project,"Issue")
<!--<ul class="breadcrumb project-name">
<li><a href="#">@project.owner</a><span class="divider">/</span></li>
<li class="active"><a href="#">@project.name</a></li>
</ul>-->
@views.html.prjmenu(project, utils.MenuType.ISSUE)

<div class="dashboard">
<dl class="row-fluid">
@@ -143,7 +139,7 @@
<tbody>
</table>
<div class="write-btn-wrap">
<a class="n-btn blue small" href="@routes.IssueApp.newIssueForm(project.owner, project.name)" >@Messages("issue.menu.new")</a>
<a class="n-btn orange med" href="@routes.IssueApp.newIssueForm(project.owner, project.name)" >@Messages("issue.menu.new")</a>
</div>
<div id="pagination">
<!-- pagination.js will fill here. -->


+ 6
- 5
app/views/main.scala.html View File

@@ -2,19 +2,20 @@

@import utils._

@layout(Messages(title))("") {
@layout(Messages(title))("prj") {
<header class="gnb-outer">
@topmenu(project, menuType)
<div class="sub-menu-sp"></div>
@sidemenu(project)
@topmenu(project)
@sidemenu(project)
</header>
<div class="container page-wrap">
@views.html.alert()
@content
</div>
<footer class="page-footer-outer">
<div class="page-footer">
<span class="provider">Powered by <strong>nFORGE.</strong></span>
<span class="provider">Powered by <strong>HIVE</strong></span>
</div>
</footer>
}

+ 30
- 24
app/views/navbar.scala.html View File

@@ -6,12 +6,10 @@
@isActiveMenu(m_type:MenuType) = @{
if(m_type == menuType){ "selected" }
}

<header class="gnb-outer">
<div class="gnb-inner">
<div class="gnb-knob left"><i class="ico gnb-left orange"></i></div>
<div class="gnb-menu-wrap">
<a href="@routes.Application.index()" class="logo"></a>
<a href="@routes.Application.index()" class="logo">HIVE</a>
<ul class="gnb-menus unstyled">
<li class="menu">
<a href="@routes.ProjectApp.newProjectForm()" class="@isActiveMenu(MenuType.NEW_PROJECT)">@Messages("title.newProject")</a>
@@ -22,39 +20,47 @@
<li class="menu">
<a href="@routes.HelpApp.help()" class="@isActiveMenu(MenuType.HELP)">@Messages("title.help")</a>
</li>
<!-- for Testing
<li class="menu">
<a href="@routes.Application.init()" class="@isActiveMenu(MenuType.HELP)">Init(forTest)</a>
</li>
for Testing end here-->
</ul>
<ul class="gnb-menus right unstyled">
@if(session.contains("loginId")){
<li><a href="@routes.UserApp.userInfo(session.get("loginId"))" class="d-link signin">
<img class="user-thumb img-rounded"
src="@User.findByLoginId(session.get("loginId")).avatarUrl" alt="avatar" width="22" height="22">@session.get("loginId")</a></li>
@if(session.contains("loginId")){
<li class="d-link-wrap d-link-l">
<a href="@routes.UserApp.userInfo(session.get("loginId"))" class="d-link signin">
<i><img src="@User.findByLoginId(session.get("loginId")).avatarUrl" width="22" height="22"></i>
@session.get("loginId")
</a>
</li>
<li class="sp-line">|</li>
<li><a href="@routes.UserApp.logout()" class="d-link signup">@Messages("title.logout")</a></li>
} else {
<li><a href="@routes.UserApp.loginForm()" class="d-link signin"><i class="ico ico-user"></i>@Messages("title.login")</a></li>
<li class="d-link-wrap d-link-r">
<a href="@routes.UserApp.logout()" class="d-link signup">@Messages("title.logout")</a>
</li>
} else {
<li class="d-link-wrap d-link-l">
<a href="@routes.UserApp.loginForm()" class="d-link signin">
<i><img src="@routes.Assets.at("images/default-avatar-34.png")" width="22" height="22"></i>
@Messages("title.login")
</a>
</li>
<li class="sp-line">|</li>
<li><a href="@routes.UserApp.signupForm()" class="d-link signup">@Messages("title.signup")</a></li>
}
<li class="d-link-wrap d-link-r">
<a href="@routes.UserApp.signupForm()" class="d-link signup">@Messages("title.signup")</a>
</li>
}
<li class="search-bar">
<form action="@routes.ProjectApp.projects()">
<input type="text" autocomplete="off" class="query" name="filter" placeholder="전체 프로젝트에서 검색"/><button type="submit" class="ico ico-o-search btn-transparent"></button>
<input type="text" autocomplete="off" class="query" name="filter" /><button type="submit" class="ico ico-search btn-transparent"></button>
</form>
</li>
</ul>
</div>
<div class="gnb-knob right"><i class="ico gnb-right orange"></i></div>
</div>
@if(session.contains("userId") && session.get("userId").equals("1")){
<div class="sub-menu-sp"></div>
<div class="side-menu-wrap">
<ul class="side-menus ico bg-side-menu unstyled">
@if(session.contains("userId") && session.get("userId").equals("1")){
<div class="side-menu-wrap">
<ul class="side-menus unstyled bg">
<li class="side-menu"><a href="/statistics"><i class="ico ico-statistics"></i></a></li>
<li class="side-menu"><a href="@routes.SiteApp.userList()"><i class="ico ico-setting"></i></a></li>
</ul>
</div>
}
</header>
</header>

+ 28
- 0
app/views/prjmenu.scala.html View File

@@ -0,0 +1,28 @@
@(project:Project, menuType:utils.MenuType)

@import utils._
@import models.enumeration.ResourceType;
@import utils.TemplateHelper._
@import utils.AccessControl._

@isActiveMenu(m_type:MenuType) = @{
if(m_type == menuType) {"highlight"}
}

<div class="project-menu main-menu-only">
<div class="project-menu-wrap main">
<ul class="unstyled">
<li class="@isActiveMenu(MenuType.PROJECT_HOME)"><a href="@routes.ProjectApp.project(project.owner, project.name)">@Messages("title.projectHome")</a></li>
<li class="sp-line">|</li>
<li class="@isActiveMenu(MenuType.BOARD)"><a href="@routes.BoardApp.posts(project.owner, project.name)">@Messages("menu.board")</a></li>
<li class="sp-line">|</li>
<li class="@isActiveMenu(MenuType.CODE)"><a href="@routes.CodeApp.codeBrowser(project.owner, project.name)">@Messages("menu.code")</a></li>
<li class="sp-line">|</li>
<li class="@isActiveMenu(MenuType.ISSUE)"><a href="@routes.IssueApp.issues(project.owner, project.name,"all")">@Messages("menu.issue")</a></li>
<li class="sp-line">|</li>
<li class="@isActiveMenu(MenuType.TASK)"><a href="@routes.TaskApp.index(project.owner, project.name)">@Messages("menu.task")</a>
<li class="sp-line">|</li>
<li class="@isActiveMenu(MenuType.PROJECT_SETTING)"><a href="@routes.ProjectApp.settingForm(project.owner, project.name)">@Messages("menu.admin")</a></li>
</ul>
</div>
</div>

+ 73
- 72
app/views/project/projectHome.scala.html View File

@@ -1,72 +1,73 @@
@(message: String, project: Project)

@main(message, project, utils.MenuType.PROJECT_HOME) {
<div class="page">
@pageTitle(project,"Project Home")
<div class="bubble-wrap dark-gray project-home">
<div class="inner logo">
<div class="logo-wrap">
@if(project.logoPath != null) {
<img src="/assets/uploadFiles/@project.logoPath" />
} else {
<img src="@routes.Assets.at("images/bg-default-project.png")" />
}
</div>
</div>
<div class="inner project-info">
<header>
<h3>프로젝트 정보</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>라이센스 :</strong> GPL v2
</li>
<li class="info">
<strong>운영체제 :</strong> 리눅스
</li>
<li class="info">
<strong>프로그래밍 언어 :</strong> PHP, Python, Java
</li>
<li class="info">
<strong>코드관리 :</strong> @project.vcs
</li>
</ul>
</div>
<div class="inner member-info">
<header>
<h3>개발자 정보</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)">
<img src="@member.avatarUrl" alt="@member.loginId" class="user-thumb"></a>
<a href="@routes.UserApp.userInfo(member.loginId)"><strong>@member.loginId</strong></a>
</li>
}
</ul>
</div>
</div>
</div>
<div class="bubble-wrap dark-gray readme">
@if(project.readme == null) {
@Messages("project.readme")
} else {
<div class="readme-wrap">
<header><i class="ico ico-readme-book"></i><strong>README.md</strong></header>
<div class="readme-body" markdown>
@project.readme
</div>
</div>
}
@views.html.markdown()
</div>
</div>
}
@(message: String, project: Project)
@main(message, project, utils.MenuType.PROJECT_HOME) {
<div class="page">
@views.html.prjmenu(project, utils.MenuType.PROJECT_HOME)
<div class="bubble-wrap dark-gray project-home">
<div class="inner logo">
<div class="logo-wrap">
@if(project.logoPath != null) {
<img src="/assets/uploadFiles/@project.logoPath" />
} else {
<img src="@routes.Assets.at("images/bg-default-project.jpg")" />
}
</div>
</div>
<div class="inner project-info">
<header>
<h3>프로젝트 정보</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>라이센스 :</strong> GPL v2
</li>
<li class="info">
<strong>운영체제 :</strong> 리눅스
</li>
<li class="info">
<strong>프로그래밍 언어 :</strong> PHP, Python, Java
</li>
<li class="info">
<strong>코드관리 :</strong> @project.vcs
</li>
</ul>
</div>
<div class="inner member-info">
<header>
<h3>개발자 정보</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)">
<img src="@member.avatarUrl" alt="@member.loginId" class="user-thumb"></a>
<a href="@routes.UserApp.userInfo(member.loginId)"><strong>@member.loginId</strong></a>
</li>
}
</ul>
</div>
</div>
</div>
<div class="bubble-wrap dark-gray readme">
@if(project.readme == null) {
@Messages("project.readme")
} else {
<div class="readme-wrap">
<header><i class="ico ico-readme-book"></i><strong>README.md</strong></header>
<div class="readme-body" markdown>
@project.readme
</div>
</div>
}
@views.html.markdown()
</div>
</div>
}

+ 5
- 5
app/views/project/projectMngMain.scala.html View File

@@ -1,21 +1,21 @@
@(title: String, project:Project)(content: Html)

@layout(Messages(title))("") {
@layout(Messages(title))("prj") {
<header class="gnb-outer">
@topmenu(project, utils.MenuType.PROJECT_SETTING)
<div class="sub-menu-sp"></div>
@submenu(title, project)
@topmenu(project)
@sidemenu(project)
</header>
<div class="container page-wrap">
<div class="page">
@views.html.alert()
@content
</div>
</div>
<footer class="page-footer-outer">
<div class="page-footer">
<span class="provider">Powered by <strong>nFORGE.</strong></span>
<span class="provider">Powered by <strong>HIVE</strong></span>
</div>
</footer>
}

+ 9
- 6
app/views/project/setting.scala.html View File

@@ -6,7 +6,8 @@


@projectMngMain(message, project) {
@pageTitle(project,Messages("project.setting"))
@views.html.prjmenu(project, utils.MenuType.PROJECT_SETTING)
<div class="bubble-wrap gray">
@form(action=routes.ProjectApp.settingProject(project.owner, project.name), 'id->"saveSetting" , 'enctype->"multipart/form-data", 'class->"nm"){
<input type="hidden" name="id" value="@projectForm("id").value.toLong">
@@ -16,7 +17,7 @@
@if(projectForm("logoPath").value != null) {
<img src="/assets/uploadFiles/@projectForm("logoPath").value" alt="project-logo">
} else {
<img src="@routes.Assets.at("images/bg-default-project.png")" alt="project-logo">
<img src="@routes.Assets.at("images/bg-default-project.jpg")" alt="project-logo">
}
</div>
<div class="logo-desc">
@@ -25,7 +26,7 @@
<li>@Messages("project.logo.type") <span class="point">bmp, jpg, gif, png</span></li>
<li>@Messages("project.logo.maxFileSize") <span class="point">1MB</span></li>
<li>@Messages("project.logo.size") <span class="point">234px * 168px</span></li>
<li>
<li>
<div class="ns-btn fake-file-wrap"><i class="ico ico-plus-blue"></i>UPLOAD
<input type="file" class="file" name="logoPath">
</div>
@@ -57,7 +58,7 @@
</div>
</div>
<div class="box-wrap bottom">
<button class="btn-transparent n-btn blue med" type="submit" id="save">@Messages("button.save")</button>
<button class="btn-transparent n-btn orange med" type="submit" id="save">@Messages("button.save")</button>
</div>
<!-- 현재 레이아웃에 존재하지 않는 기능 -->
<input type="hidden" name="isAuthorEditable" value="true"/>
@@ -75,7 +76,7 @@
<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="agreement" class="bg-checkbox">@Messages("project.delete.accept")</label>
<a id="deletion" data-toggle="modal" href="#alertDeletion" class="n-btn small red"><i class="ico ico-delete-small"></i>@Messages("project.delete.this")</a>
<a id="deletion" data-toggle="modal" href="#alertDeletion" class="n-btn small black"><i class="ico ico-delete-small"></i>@Messages("project.delete.this")</a>
</p>
</div>
</div>
@@ -95,5 +96,7 @@
<a href="@routes.ProjectApp.deleteProject(project.owner, project.name)" class="btn btn-danger">@Messages("button.yes")</a>
</div>
</div>
<script>nforge.require(["project.logoCheck", "project.popovers", "project.nameCheck", "project.acceptCheck"], "deletion");</script>
<script type="text/javascript">
nforge.require(["project.logoCheck", "project.popovers", "project.nameCheck", "project.acceptCheck"], "deletion");
</script>
}

+ 4
- 3
app/views/sidemenu.scala.html View File

@@ -1,7 +1,8 @@
@(project:Project)

<div class="side-menu-wrap">
<ul class="side-menus ico bg-side-menu unstyled">
<!-- >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 on"></i></a></li>
<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>

+ 31
- 36
app/views/topmenu.scala.html View File

@@ -1,53 +1,48 @@
@(project:Project, menuType:utils.MenuType)
@(project:Project)

@import utils._
@import models.enumeration.ResourceType;
@import utils.TemplateHelper._
@import utils.AccessControl._

@isActiveMenu(m_type:MenuType) = @{
if(m_type == menuType) {"selected"}
}
<div class="gnb-inner">
<div class="gnb-knob left"><i class="ico gnb-left"></i></div>
<div class="gnb-menu-wrap">
<a href="@routes.Application.index()" class="logo"></a>
<ul class="gnb-menus unstyled">
<li class="menu">
<a href="@routes.ProjectApp.project(project.owner, project.name)" class="@isActiveMenu(MenuType.PROJECT_HOME)">@Messages("title.projectHome")</a>
</li>
<li class="menu">
<a href="@routes.BoardApp.posts(project.owner, project.name)" class="@isActiveMenu(MenuType.BOARD)">@Messages("menu.board")</a>
</li>
<li class="menu">
<a href="@routes.CodeApp.codeBrowser(project.owner, project.name)" class="@isActiveMenu(MenuType.CODE)">@Messages("menu.code")</a>
<a href="@routes.Application.index()" class="logo">HIVE</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>

<ul class="gnb-menus right unstyled">
@if(session.contains("loginId")){
<li class="d-link-wrap d-link-l">
<a href="@routes.UserApp.userInfo(session.get("loginId"))" class="d-link signin">
<i><img src="@User.findByLoginId(session.get("loginId")).avatarUrl" width="22" height="22"></i>
@session.get("loginId")
</a>
</li>
<li class="menu">
<a href="@routes.IssueApp.issues(project.owner, project.name,"all")" class="@isActiveMenu(MenuType.ISSUE)">@Messages("menu.issue")</a>
<li class="sp-line">|</li>
<li class="d-link-wrap d-link-r">
<a href="@routes.UserApp.logout()" class="d-link signup">@Messages("title.logout")</a>
</li>
<!-- >li class="menu">
<a href="@routes.TaskApp.index(project.owner, project.name)">TASK</a>
</li-->
</ul>
<ul class="gnb-menus right unstyled">
@if(!UserApp.currentUser().isAnonymous()){
<li><a href="@routes.UserApp.userInfo(session.get("loginId"))">
<img class="user-thumb img-rounded" src="@User.findByLoginId(session.get("loginId")).avatarUrl" alt="avatar" width="22" height="22"></a>
<a href="@routes.UserApp.userInfo(session.get("loginId"))">@session.get("loginId")</a>
} else {
<li class="d-link-wrap d-link-l">
<a href="@routes.UserApp.loginForm()" class="d-link signin">
<i><img src="@routes.Assets.at("images/default-avatar-34.png")" width="22" height="22"></i>
@Messages("title.login")
</a>
</li>
<li class="sp-line">|</li>
<li><a href="@routes.UserApp.logout()" class="d-link signup">@Messages("title.logout")</a></li>
} else {
<li><a href="@routes.UserApp.loginForm()" class="d-link signin"><i class="ico ico-user"></i>@Messages("title.login")</a></li>
<li class="sp-line">|</li>
<li><a href="@routes.UserApp.signupForm()" class="d-link signup">@Messages("title.signup")</a></li>
}
<li class="d-link-wrap d-link-r">
<a href="@routes.UserApp.signupForm()" class="d-link signup">@Messages("title.signup")</a>
</li>
}
<li class="search-bar">
<form action="@routes.SearchApp.contentsSearch(project.owner, project.name)">
<input type="text" autocomplete="off" class="query" name="filter" placeholder='@Messages("project.searchPlaceholder")' /><button type="submit" class="ico ico-search btn-transparent"></button>
<form action="@routes.ProjectApp.projects()">
<input type="text" autocomplete="off" class="query" name="filter" /><button type="submit" class="ico ico-search btn-transparent"></button>
</form>
</li>
</ul>
</div>
<div class="gnb-knob right"><i class="ico gnb-right"></i></div>
</div>
</div>

+ 356
- 355
conf/messages.ko View File

@@ -1,356 +1,357 @@
# Messages
title.newIssue = 새 이슈
title.issueList = 이슈 목록
title.issueDetail = 이슈 상세조회
title.editIssue = 이슈 수정
title.newMilestone = 새 마일스톤
title.milestoneList = 마일스톤 리스트
title.editMilestone = 일스톤 수정
title.milestoneManage = 마일스톤 관리
title.projectHome = 프로젝트 홈
title.newProject = 새 프로젝트 생성
title.projectSetting = 프로젝트 설정
title.memberList = 멤버 리스트
title.post.notExistingPage = 존재하지 않는 게시물
title.siteSetting = 사이트 설정
title.site.userEdit = 유저 설정
title.login = 로그인
title.logout = 로그아웃
title.signup = 회원 가입
title.forgotpassword = 패스워드를 잊어버리셨나요?
title.rememberMe = 로그인 유지하기
title.commitHistory = 커밋 히스토리
title.mailSetting = 메일 설정
title.sendMail = 메일 발송
title.projectList = 프로젝트 목록
title.help = 도움말

hive.name = nFORGE
hive.title = 협업개발 플랫폼
hive.description = Make it better and simpler!

orderby.name = 이름순
orderby.recent = 생성일자순

menu.home = 홈
menu.board = 게시판
menu.code = 코드
menu.issue = 이슈
menu.wiki = 위키
menu.admin = 프로젝트 관리
menu.siteAdmin = 사이트 관리

message.warning = 경고
message.success = 성공
message.info = 정보

label.title = 제목
label.contents = 내용
label.state = 상태
label.assignee = 담당자
label.date = 작성일
label.id = #
label.dueDate = 완료일
label.new = 새 라벨
label.customColor = 색
label.category = 분류
label.name = 이름
label.add = 추가

order.date = 날짜순
order.state = 상태순
order.comments = 댓글순

button.save = 저장
button.confirm = 확인
button.cancel = 취소
button.reset = 다시쓰기
button.edit = 수정
button.delete = 삭제
button.list = 목록
button.selectFile = 파일 선택
button.comment.new = 댓글입력
button.autoNotification = 자동알림
button.excelDownload = Excel
button.yes = 예
button.no = 아니요
button.popup.exit = x
button.add = 추가
button.login = 로그인
button.signup = 가입하기
button.newProject = 여러분의 프로젝트를 만드세요.
button.detail = 상세조회

checkbox.commented = 댓글
checkbox.fileAttached = 첨부파일

input.mandatory = 필수 입력 사항
input.optional = 선택 입력 사항

#Milestone
milestone.state.all = 전체
milestone.state.open = 미완료
milestone.state.closed = 완료
milestone.is.empty = 등록된 마일스톤이 없습니다.
milestone.menu.manage = 마일스톤 관리
milestone.menu.new = 새 마일스톤
milestone.none = 없음
sort.by.dueDate = 완료일 순
sort.by.completionRate = 완료울 순

#Issue
issue.state = 상태
issue.state.all = 전체
issue.state.open = 미해결
issue.state.closed = 해결
issue.is.empty = 등록된 이슈가 없습니다.
issue.menu.searchDefault = 이슈 검색
issue.menu.milestoneSelectDefault = 마일스톤 선택
issue.menu.new = 새 이슈
issue.new.detailInfo = 세부정보
issue.new.detailInfo.issueType = 유형
issue.new.detailInfo.issueType.worst = 치명결함
issue.new.detailInfo.issueType.worse = 중결함
issue.new.detailInfo.issueType.bad = 경결함
issue.new.detailInfo.issueType.enhancement = 단순개선
issue.new.detailInfo.issueType.recommendation = 권고사항
issue.new.detailInfo.assignee = 담당자
issue.new.detailInfo.component = 컴포넌트
issue.new.detailInfo.milestone = 마일스톤
issue.new.environment = 환경
issue.new.environment.osType = 운영체제
issue.new.environment.osType.windows = Windows
issue.new.environment.osType.Mac = Mac OS X
issue.new.environment.osType.Linux = Linux
issue.new.environment.browserType = 브라우져
issue.new.environment.browserType.ie = IE
issue.new.environment.browserType.chrome = Chrome
issue.new.environment.browserType.firefox = Firefox
issue.new.environment.browserType.safari = Safari
issue.new.environment.browserType.opera = Opera
issue.new.environment.dbmsType = DBMS
issue.new.environment.dbmsType.postgreSQL = PostgreSQL
issue.new.environment.dbmsType.CUBRID = CUBRID
issue.new.environment.dbmsType.MySQL = MySQL
issue.new.result = 확인결과
issue.new.result.importance = 중요도
issue.new.result.importance.highest = 매우 중요
issue.new.result.importance.high = 중요
issue.new.result.importance.average = 보통
issue.new.result.importance.low = 낮음
issue.new.result.importance.lowest = 매우 낮음
issue.new.result.diagnosisResult = 진단 결과
issue.new.result.diagnosisResult.bug = 버그확인
issue.new.result.diagnosisResult.fixed = 수정완료
issue.new.result.diagnosisResult.willNotFixed = 수정안함
issue.new.result.diagnosisResult.notaBug = 버그아님