
change english font, modify issue list
- set english font to Lato using google webfonts - link to list of issues assigned to me, created by me has added - count issues on issue list tab has changed
@0b3b30f864b4583fb63cd49ed5c3b89ed191a890
--- app/assets/stylesheets/hive.less
+++ app/assets/stylesheets/hive.less
... | ... | @@ -3,4 +3,6 @@ |
3 | 3 |
@import "less/_common.less"; |
4 | 4 |
@import "less/_sprites.less"; |
5 | 5 |
@import "less/_page.less"; |
6 |
+@import "less/_reponsive.less"; |
|
6 | 7 |
@import "less/_hiveUI.less"; |
8 |
+@import "less/_temporary.less";(No newline at end of file) |
--- app/assets/stylesheets/less/_common.less
+++ app/assets/stylesheets/less/_common.less
... | ... | @@ -3,11 +3,13 @@ |
3 | 3 |
} |
4 | 4 |
|
5 | 5 |
body { |
6 |
- background : @base-background; |
|
6 |
+ background: @base-background; |
|
7 | 7 |
background-color: @base-background-color; |
8 | 8 |
font-family: @base-font-family; |
9 |
+ text-rendering: auto !important; |
|
9 | 10 |
} |
10 | 11 |
input, button, select, textarea { font-family: @base-font-family !important; } |
12 |
+h1,h2,h3,h4,h5,h6 { text-rendering:auto !important; } |
|
11 | 13 |
|
12 | 14 |
a { |
13 | 15 |
color: inherit; |
--- app/assets/stylesheets/less/_page.less
+++ app/assets/stylesheets/less/_page.less
... | ... | @@ -900,10 +900,10 @@ |
900 | 900 |
.btn-advanced { |
901 | 901 |
color:#707070; |
902 | 902 |
font-weight:bold; |
903 |
- padding-left:18px; |
|
904 |
- margin:5px 0 0; |
|
903 |
+ /*padding-left:18px;*/ |
|
904 |
+ margin:10px 0 0; text-align:right; |
|
905 | 905 |
vertical-align:middle; |
906 |
- display:block; |
|
906 |
+ display:inline-block; |
|
907 | 907 |
|
908 | 908 |
i { |
909 | 909 |
vertical-align:middle; margin-right:3px; |
... | ... | @@ -918,7 +918,7 @@ |
918 | 918 |
&.advanced { |
919 | 919 |
.srch-advanced { |
920 | 920 |
text-align:left; |
921 |
- margin-top:5px; |
|
921 |
+ margin-top:10px; |
|
922 | 922 |
display:block; |
923 | 923 |
border-top: 1px solid #D6D6D6; |
924 | 924 |
|
... | ... | @@ -930,30 +930,29 @@ |
930 | 930 |
.btn-advanced { |
931 | 931 |
i { .ico-arrow-up-blue; } |
932 | 932 |
} |
933 |
- |
|
934 |
- // override bootstrap |
|
935 |
- /* |
|
936 |
- .form-horizontal { |
|
937 |
- .control-group { |
|
938 |
- margin: 0; padding: 6px 10px; |
|
939 |
- border-bottom: 1px solid #e3e3e3; |
|
940 |
- border-top: 1px solid #fdfdfd; |
|
941 |
- &:last-of-type { border-bottom:none; } |
|
942 |
- } |
|
943 |
- .control-label { |
|
944 |
- text-align:left; width:60px; |
|
945 |
- font-size:12px; font-weight:bold; |
|
946 |
- color:#666; |
|
947 |
- } |
|
948 |
- .controls { margin-left:60px; padding-left:10px; } |
|
949 |
- .controls:before { |
|
950 |
- content:'|'; margin-right:5px; |
|
951 |
- color:#cccccc; |
|
952 |
- text-shadow:-1px 0px #fff; |
|
933 |
+ } |
|
934 |
+ |
|
935 |
+ .labels-wrap { border-top:1px solid #ddd; padding-top:10px; } |
|
936 |
+ |
|
937 |
+ .preset-list { |
|
938 |
+ padding-bottom:20px; |
|
939 |
+ margin-bottom:20px; |
|
940 |
+ border-bottom:1px solid #ddd; |
|
941 |
+ |
|
942 |
+ li { |
|
943 |
+ font-size:13px; |
|
944 |
+ padding:8px; |
|
945 |
+ a { display: block} |
|
946 |
+ &.active { |
|
947 |
+ color: #fff; |
|
948 |
+ background: @secondary; |
|
949 |
+ font-weight:bold; |
|
950 |
+ |
|
951 |
+ .border-radius(2px); |
|
952 |
+ .box-shadow(inset 1px 1px 1px rgba(0,0,0,0.2)); |
|
953 |
+ .num-badge { color:#fff; } |
|
953 | 954 |
} |
954 | 955 |
} |
955 |
- */ |
|
956 |
- // -- end of bootstrap overrides |
|
957 | 956 |
} |
958 | 957 |
} // -- end of .inner // |
959 | 958 |
|
... | ... | @@ -1358,9 +1357,14 @@ |
1358 | 1357 |
padding:15px 25px; display:block; |
1359 | 1358 |
font-weight:bold; |
1360 | 1359 |
-webkit-transition-duration:0.3s; |
1361 |
- &:hover { color:@primary; text-decoration:underline; } |
|
1360 |
+ /*&:hover { color:@primary; text-decoration:underline; }*/ |
|
1362 | 1361 |
} |
1363 | 1362 |
|
1363 |
+ &:hover { |
|
1364 |
+ color:@primary; |
|
1365 |
+ border-bottom:2px solid #eee; |
|
1366 |
+ a { text-decoration:none; } |
|
1367 |
+ } |
|
1364 | 1368 |
&.active { |
1365 | 1369 |
border-bottom:2px solid @primary; |
1366 | 1370 |
color:@primary; |
... | ... | @@ -1476,13 +1480,15 @@ |
1476 | 1480 |
|
1477 | 1481 |
//-- filters |
1478 | 1482 |
.filter-wrap { |
1479 |
- margin-bottom: 15px; |
|
1480 |
- overflow: hidden; |
|
1481 | 1483 |
display: block;/*inline;*/ |
1482 |
- |
|
1484 |
+ margin:15px 0 10px; |
|
1485 |
+ height:30px; |
|
1486 |
+ /*margin-bottom: 15px; |
|
1487 |
+ overflow: hidden;*/ |
|
1488 |
+ |
|
1483 | 1489 |
.filters { |
1484 | 1490 |
color:#666; |
1485 |
- float: right; |
|
1491 |
+ float: right; margin-top:5px; |
|
1486 | 1492 |
.filter { |
1487 | 1493 |
margin-right:10px; |
1488 | 1494 |
&.active { font-weight:bold; color:@primary; } |
... | ... | @@ -1492,15 +1498,15 @@ |
1492 | 1498 |
} |
1493 | 1499 |
|
1494 | 1500 |
//-- milestone |
1495 |
- &.milestone { |
|
1501 |
+ /*&.milestone { |
|
1496 | 1502 |
margin-top: -20px; |
1497 |
- } |
|
1503 |
+ }*/ |
|
1498 | 1504 |
|
1499 | 1505 |
//-- board, user |
1500 |
- &.board, &.user-setting { |
|
1506 |
+ /*&.board, &.user-setting { |
|
1501 | 1507 |
margin: 15px 0 10px; |
1502 | 1508 |
padding-right:3px; |
1503 |
- } |
|
1509 |
+ }*/ |
|
1504 | 1510 |
} |
1505 | 1511 |
|
1506 | 1512 |
//-- milestone |
... | ... | @@ -2509,6 +2515,11 @@ |
2509 | 2515 |
.commit-wrap { |
2510 | 2516 |
background-color: @white; |
2511 | 2517 |
} |
2518 |
+ .commitMsg { |
|
2519 |
+ border:none; |
|
2520 |
+ background:none; |
|
2521 |
+ font-family:@base-font-family; |
|
2522 |
+ } |
|
2512 | 2523 |
|
2513 | 2524 |
#commit { |
2514 | 2525 |
font-family: "monospace", Consolas, Tahoma; |
... | ... | @@ -2554,50 +2565,50 @@ |
2554 | 2565 |
} |
2555 | 2566 |
} |
2556 | 2567 |
|
2557 |
- ul.comments { |
|
2558 |
- border: 1px solid black; |
|
2559 |
- margin: 0px; |
|
2560 |
- } |
|
2561 |
- |
|
2562 | 2568 |
#commit + ul.comments { |
2563 | 2569 |
margin-top: 15px; |
2564 | 2570 |
} |
2565 | 2571 |
|
2566 | 2572 |
.write-comment-box { |
2567 | 2573 |
background-color: #f5f5f5; |
2574 |
+ margin-bottom:15px; |
|
2568 | 2575 |
} |
2569 | 2576 |
|
2570 |
- .comment { |
|
2571 |
- padding: 20px; |
|
2572 |
- border-bottom:1px solid #efefef; |
|
2573 |
- list-style: none; |
|
2574 |
- |
|
2575 |
- .media-body { |
|
2576 |
- padding-left: 17px; |
|
2577 |
- .commenter { |
|
2578 |
- line-height: 1.3; |
|
2579 |
- font-size: 12px; font-weight:bold; |
|
2580 |
- /*color: #646464;*/ |
|
2581 |
- .name { |
|
2582 |
- font-size: 11px; |
|
2577 |
+ ul.comments { |
|
2578 |
+ margin:0; |
|
2579 |
+ |
|
2580 |
+ .comment { |
|
2581 |
+ padding: 20px; |
|
2582 |
+ border-bottom:1px solid #efefef; |
|
2583 |
+ list-style: none; |
|
2584 |
+ |
|
2585 |
+ .media-body { |
|
2586 |
+ padding-left: 17px; |
|
2587 |
+ .commenter { |
|
2588 |
+ line-height: 1.3; |
|
2589 |
+ font-size: 12px; font-weight:bold; |
|
2590 |
+ /*color: #646464;*/ |
|
2591 |
+ .name { |
|
2592 |
+ font-size: 11px; |
|
2593 |
+ } |
|
2594 |
+ .date { |
|
2595 |
+ font-size: 11px; |
|
2596 |
+ color: #aaa; |
|
2597 |
+ } |
|
2583 | 2598 |
} |
2584 |
- .date { |
|
2585 |
- font-size: 11px; |
|
2586 |
- color: #aaa; |
|
2599 |
+ .attach { |
|
2600 |
+ color: #4489A4; |
|
2601 |
+ } |
|
2602 |
+ |
|
2603 |
+ .comment-body { |
|
2604 |
+ /*color: #333;*/ |
|
2605 |
+ a { font-weight:bold; border-bottom:1px dotted; } |
|
2587 | 2606 |
} |
2588 | 2607 |
} |
2589 |
- .attach { |
|
2590 |
- color: #4489A4; |
|
2608 |
+ |
|
2609 |
+ .attach-preview-wrap { |
|
2610 |
+ margin-top: 10px; |
|
2591 | 2611 |
} |
2592 |
- |
|
2593 |
- .comment-body { |
|
2594 |
- /*color: #333;*/ |
|
2595 |
- a { font-weight:bold; border-bottom:1px dotted; } |
|
2596 |
- } |
|
2597 |
- } |
|
2598 |
- |
|
2599 |
- .attach-preview-wrap { |
|
2600 |
- margin-top: 10px; |
|
2601 | 2612 |
} |
2602 | 2613 |
} |
2603 | 2614 |
|
... | ... | @@ -3410,14 +3421,14 @@ |
3410 | 3421 |
text-align:center; |
3411 | 3422 |
} |
3412 | 3423 |
} |
3413 |
- |
|
3424 |
+/* |
|
3414 | 3425 |
.mass-update-form { |
3415 | 3426 |
margin-top:10px; |
3416 | 3427 |
margin-bottom: 10px; |
3417 | 3428 |
padding-left:60px; |
3418 | 3429 |
.btn-group + .btn-group { margin-left:0; } |
3419 | 3430 |
} |
3420 |
- |
|
3431 |
+*/ |
|
3421 | 3432 |
.fork-wrap { |
3422 | 3433 |
.project-from { |
3423 | 3434 |
display:inline-block; |
... | ... | @@ -3477,55 +3488,4 @@ |
3477 | 3488 |
text-align:center; |
3478 | 3489 |
margin-top:30px; |
3479 | 3490 |
} |
3480 |
-} |
|
3481 |
- |
|
3482 |
-// responsive |
|
3483 |
-@media all and (max-width:620px){ |
|
3484 |
- .prj .gnb-inner .gnb-menu-wrap .gnb-menus { |
|
3485 |
- margin:0; |
|
3486 |
- |
|
3487 |
- &.right { |
|
3488 |
- position: relative; float: none; |
|
3489 |
- display: block; clear: both; |
|
3490 |
- padding-bottom:15px; text-align:right; |
|
3491 |
- } |
|
3492 |
- } |
|
3493 |
- |
|
3494 |
- .code-browse-wrap { |
|
3495 |
- .code-viewer-wrap { |
|
3496 |
- .code-tree { |
|
3497 |
- display:none; |
|
3498 |
- width:0px; |
|
3499 |
- } |
|
3500 |
- .code-viewer { |
|
3501 |
- display:block; |
|
3502 |
- width:100%; |
|
3503 |
- } |
|
3504 |
- } |
|
3505 |
- |
|
3506 |
- .cell { |
|
3507 |
- &.directory-wrap { |
|
3508 |
- display:none; |
|
3509 |
- width:0px; |
|
3510 |
- } |
|
3511 |
- &.file-wrap { |
|
3512 |
- width:100%; display:block; |
|
3513 |
- } |
|
3514 |
- } |
|
3515 |
- |
|
3516 |
- .btnResize { display:none; } |
|
3517 |
- } |
|
3518 |
-} |
|
3519 |
- |
|
3520 |
-// temporary |
|
3521 |
-.pop-watch { |
|
3522 |
- .content { padding: 10px 25px; } |
|
3523 |
- .brow { text-align:center; padding:10px 0; } |
|
3524 |
- |
|
3525 |
- ul { |
|
3526 |
- margin: 0px; |
|
3527 |
- padding: 5px; |
|
3528 |
- li { display: list-item; } |
|
3529 |
- } |
|
3530 |
- h5 { text-rendering:auto; } |
|
3531 |
-} |
|
3491 |
+}(No newline at end of file) |
+++ app/assets/stylesheets/less/_reponsive.less
... | ... | @@ -0,0 +1,37 @@ |
1 | +// responsive | |
2 | +@media all and (max-width:620px){ | |
3 | + .prj .gnb-inner .gnb-menu-wrap .gnb-menus { | |
4 | + margin:0; | |
5 | + | |
6 | + &.right { | |
7 | + position: relative; float: none; | |
8 | + display: block; clear: both; | |
9 | + padding-bottom:15px; text-align:right; | |
10 | + } | |
11 | + } | |
12 | + | |
13 | + .code-browse-wrap { | |
14 | + .code-viewer-wrap { | |
15 | + .code-tree { | |
16 | + display:none; | |
17 | + width:0px; | |
18 | + } | |
19 | + .code-viewer { | |
20 | + display:block; | |
21 | + width:100%; | |
22 | + } | |
23 | + } | |
24 | + | |
25 | + .cell { | |
26 | + &.directory-wrap { | |
27 | + display:none; | |
28 | + width:0px; | |
29 | + } | |
30 | + &.file-wrap { | |
31 | + width:100%; display:block; | |
32 | + } | |
33 | + } | |
34 | + | |
35 | + .btnResize { display:none; } | |
36 | + } | |
37 | +}(No newline at end of file) |
+++ app/assets/stylesheets/less/_temporary.less
... | ... | @@ -0,0 +1,11 @@ |
1 | +// temporary | |
2 | +.pop-watch { | |
3 | + .content { padding: 10px 25px; } | |
4 | + .brow { text-align:center; padding:10px 0; } | |
5 | + | |
6 | + ul { | |
7 | + margin: 0px; | |
8 | + padding: 5px; | |
9 | + li { display: list-item; } | |
10 | + } | |
11 | +} |
--- app/assets/stylesheets/less/_variables.less
+++ app/assets/stylesheets/less/_variables.less
... | ... | @@ -9,13 +9,14 @@ |
9 | 9 |
@base-webfont-path: "/assets/images/webfont"; |
10 | 10 |
|
11 | 11 |
// Typography |
12 |
-@base-font-family:"Droid Sans", "Tahoma", "나눔고딕", "NanumGothic", "NanumGothicOTF", "맑은고딕", "Malgun Gothic", dotum, Arial; |
|
12 |
+@base-font-family:"Lato", "Helvetica Neue", "Helvetica", "Tahoma", "나눔고딕", "NanumGothic", "NanumGothicOTF", "맑은고딕", "Malgun Gothic", dotum, Arial; |
|
13 | 13 |
/*'Droid Sans', Tahoma;*/ |
14 | 14 |
/*, '돋움', Dotum, Arial, sans-serif;*/ |
15 | 15 |
@base-font-size : 13px; |
16 | 16 |
@base-line-height: 18px; |
17 | 17 |
@base-text-color : @gray-33; |
18 | 18 |
@base-width : 95%; /*960px;*/ |
19 |
+/* |
|
19 | 20 |
@font-face { |
20 | 21 |
font-family:'Droid Sans'; |
21 | 22 |
src: url('@{base-webfont-path}/DroidSans.eot'); |
... | ... | @@ -26,6 +27,36 @@ |
26 | 27 |
font-weight: 400; |
27 | 28 |
font-style: normal; |
28 | 29 |
} |
30 |
+*/ |
|
31 |
+@font-face { |
|
32 |
+ font-family: 'Lato'; |
|
33 |
+ font-style: normal; |
|
34 |
+ font-weight: 300; |
|
35 |
+ src: url('http://themes.googleusercontent.com/static/fonts/lato/v6/zLhfkPOm_5ykmdm-wXaiuw.eot'); |
|
36 |
+ src: local('Lato Light'), local('Lato-Light'), |
|
37 |
+ url('http://themes.googleusercontent.com/static/fonts/lato/v6/zLhfkPOm_5ykmdm-wXaiuw.eot') format('embedded-opentype'), |
|
38 |
+ url('http://themes.googleusercontent.com/static/fonts/lato/v6/KT3KS9Aol4WfR6Vas8kNcg.woff') format('woff'); |
|
39 |
+} |
|
40 |
+@font-face { |
|
41 |
+ font-family: 'Lato'; |
|
42 |
+ font-style: normal; |
|
43 |
+ font-weight: 400; |
|
44 |
+ src: url('http://themes.googleusercontent.com/static/fonts/lato/v6/nQhiC-wSiJx0pvEuJl8d8A.eot'); |
|
45 |
+ src: local('Lato Regular'), local('Lato-Regular'), |
|
46 |
+ url('http://themes.googleusercontent.com/static/fonts/lato/v6/nQhiC-wSiJx0pvEuJl8d8A.eot') format('embedded-opentype'), |
|
47 |
+ url('http://themes.googleusercontent.com/static/fonts/lato/v6/9k-RPmcnxYEPm8CNFsH2gg.woff') format('woff'), |
|
48 |
+ url('http://themes.googleusercontent.com/static/fonts/lato/v6/v0SdcGFAl2aezM9Vq_aFTQ.ttf') format('truetype'); |
|
49 |
+} |
|
50 |
+@font-face { |
|
51 |
+ font-family: 'Lato'; |
|
52 |
+ font-style: normal; |
|
53 |
+ font-weight: 700; |
|
54 |
+ src: url('http://themes.googleusercontent.com/static/fonts/lato/v6/sBtfDPlEIwvKKU53nAG7AQ.eot'); |
|
55 |
+ src: local('Lato Bold'), local('Lato-Bold'), |
|
56 |
+ url('http://themes.googleusercontent.com/static/fonts/lato/v6/sBtfDPlEIwvKKU53nAG7AQ.eot') format('embedded-opentype'), |
|
57 |
+ url('http://themes.googleusercontent.com/static/fonts/lato/v6/wkfQbvfT_02e2IWO3yYueQ.woff') format('woff'), |
|
58 |
+ url('http://themes.googleusercontent.com/static/fonts/lato/v6/DvlFBScY1r-FMtZSYIYoYw.ttf') format('truetype'); |
|
59 |
+} |
|
29 | 60 |
|
30 | 61 |
// Color |
31 | 62 |
@white : #FFF; |
--- app/models/Issue.java
+++ app/models/Issue.java
... | ... | @@ -150,6 +150,42 @@ |
150 | 150 |
} |
151 | 151 |
|
152 | 152 |
/** |
153 |
+ * {@code projectId} 프로젝트에 |
|
154 |
+ * {@link State} 상태 이면서 |
|
155 |
+ * {@link Assignee}가 담당자인 이슈 개수를 반환한다. |
|
156 |
+ * |
|
157 |
+ * @param projectId |
|
158 |
+ * @param state |
|
159 |
+ * @param assigneeId |
|
160 |
+ * @return |
|
161 |
+ */ |
|
162 |
+ public static int countIssuesByAssigneeId(Long projectId, State state, Long assigneeId) { |
|
163 |
+ if (state == State.ALL){ |
|
164 |
+ return finder.where().eq("project.id", projectId).eq("assignee.user.id", assigneeId).findRowCount(); |
|
165 |
+ } else { |
|
166 |
+ return finder.where().eq("project.id", projectId).eq("state", state).eq("assignee.user.id", assigneeId).findRowCount(); |
|
167 |
+ } |
|
168 |
+ } |
|
169 |
+ |
|
170 |
+ /** |
|
171 |
+ * {@code projectId} 프로젝트에 |
|
172 |
+ * {@link State} 상태 이면서 |
|
173 |
+ * {@link authorId}가 작성자인 이슈 개수를 반환한다. |
|
174 |
+ * |
|
175 |
+ * @param projectId |
|
176 |
+ * @param state |
|
177 |
+ * @param authorId |
|
178 |
+ * @return |
|
179 |
+ */ |
|
180 |
+ public static int countIssuesByAuthorId(Long projectId, State state, Long authorId) { |
|
181 |
+ if (state == state.ALL){ |
|
182 |
+ return finder.where().eq("project.id", projectId).eq("authorId", authorId).findRowCount(); |
|
183 |
+ } else { |
|
184 |
+ return finder.where().eq("project.id", projectId).eq("state", state).eq("authorId", authorId).findRowCount(); |
|
185 |
+ } |
|
186 |
+ } |
|
187 |
+ |
|
188 |
+ /** |
|
153 | 189 |
* Generate a Microsoft Excel file in byte array from the given issue list, |
154 | 190 |
* using JXL. |
155 | 191 |
* |
--- app/views/code/diff.scala.html
+++ app/views/code/diff.scala.html
... | ... | @@ -60,7 +60,7 @@ |
60 | 60 |
</li> |
61 | 61 |
</ul> |
62 | 62 |
|
63 |
- <pre class="pull-right">@commit.getMessage</pre> |
|
63 |
+ <pre class="pull-right commitMsg">@commit.getMessage</pre> |
|
64 | 64 |
<p class="pull-left"> |
65 | 65 |
@(commit.getAuthor, commit.getAuthorEmail, commit.getAuthorName) match { |
66 | 66 |
case (user: User, _, _) if !user.isAnonymous => { |
--- app/views/issue/list.scala.html
+++ app/views/issue/list.scala.html
... | ... | @@ -9,6 +9,10 @@ |
9 | 9 |
|
10 | 10 |
@urlToList = {@routes.IssueApp.issues(project.owner, project.name, param.state, "html", currentPage.getPageIndex + 1)} |
11 | 11 |
|
12 |
+@urlAssignedToMe = {@urlToList&assigneeId=@User.findByLoginId(session.get("loginId")).id} |
|
13 |
+ |
|
14 |
+@urlAuthoredByMe = {@urlToList&authorLoginId=@session.get("loginId")} |
|
15 |
+ |
|
12 | 16 |
@getPageListUrl(pageIndex:Integer) = {@routes.IssueApp.issues(project.owner, project.name, param.state, "html", pageIndex + 1)} |
13 | 17 |
|
14 | 18 |
@makeFilterLink(fieldName:String, orderBy:String, orderDir:String, fieldText:String) = { |
... | ... | @@ -18,6 +22,18 @@ |
18 | 22 |
<a href="@urlToList&orderBy=@fieldName&orderDir=asc" class="filter"><i class="ico btn-gray-arrow"></i>@fieldText</a> |
19 | 23 |
} |
20 | 24 |
} |
25 |
+ |
|
26 |
+@countIssuesByState(state:State) = @{ |
|
27 |
+ if(param.assigneeId != null){ |
|
28 |
+ Issue.countIssuesByAssigneeId(project.id, state, UserApp.currentUser().id) |
|
29 |
+ } else if(param.authorLoginId != null){ |
|
30 |
+ Issue.countIssuesByAuthorId(project.id, state, UserApp.currentUser().id) |
|
31 |
+ } else { |
|
32 |
+ Issue.countIssues(project.id, state) |
|
33 |
+ } |
|
34 |
+} |
|
35 |
+ |
|
36 |
+@getTabLinkByState(state:State) = {@routes.IssueApp.issues(project.owner, project.name, state.state)@if(param.assigneeId != null){&assigneeId=@param.assigneeId}@if(param.authorLoginId != null){&authorLoginId=@param.authorLoginId}} |
|
21 | 37 |
|
22 | 38 |
@main(Messages(title), project, utils.MenuType.ISSUE){ |
23 | 39 |
<div class="page"> |
... | ... | @@ -30,21 +46,24 @@ |
30 | 46 |
<ul class="nav nav-tabs nm"> |
31 | 47 |
@for(state <- Array(State.ALL, State.OPEN, State.CLOSED)) { |
32 | 48 |
<li @if(param.state == state.state) { class="active" }> |
33 |
- <a href="@routes.IssueApp.issues(project.owner, project.name, state.state)"> |
|
49 |
+ <a href="@getTabLinkByState(state)"> |
|
34 | 50 |
@Messages("issue.state." + state.name.toLowerCase()) |
35 |
- <span class="num-badge">@Issue.countIssues(project.id, state)</span> |
|
51 |
+ <span class="num-badge">@countIssuesByState(state)</span> |
|
36 | 52 |
</a> |
37 | 53 |
</li> |
38 | 54 |
} |
39 | 55 |
</ul> |
40 | 56 |
|
41 |
-@if(currentPage.getList().size() > 0){ |
|
42 |
- @if(currentPage.getList().size() > 1){ |
|
43 |
- |
|
44 | 57 |
<div class="row-fluid"> |
45 | 58 |
<div class="span9"> |
46 |
- <div class="filter-wrap board pull-right"> |
|
47 |
- <div class="filters"> |
|
59 |
+ @if(currentPage.getList().size() > 0){ |
|
60 |
+ @if(currentPage.getList().size() > 1){ |
|
61 |
+ <div class="filter-wrap board"> |
|
62 |
+ @if(ProjectUser.isMember(UserApp.currentUser().id, project.id)){ |
|
63 |
+ @partial_massupdate(project, param) |
|
64 |
+ } |
|
65 |
+ |
|
66 |
+ <div class="filters pull-right"> |
|
48 | 67 |
@makeFilterLink("state", param.orderBy, param.orderDir, Messages("order.state")) |
49 | 68 |
@makeFilterLink("createdDate", param.orderBy, param.orderDir, Messages("order.date")) |
50 | 69 |
@makeFilterLink("numOfComments", param.orderBy, param.orderDir, Messages("order.comments")) |
... | ... | @@ -52,18 +71,27 @@ |
52 | 71 |
</div> |
53 | 72 |
} |
54 | 73 |
|
55 |
- @if(ProjectUser.isMember(UserApp.currentUser().id, project.id)){ |
|
56 |
- @partial_massupdate(project, param) |
|
57 |
- } |
|
58 | 74 |
@partial_list(project, currentPage.getList, param, currentPage.getPageIndex, currentPage.getTotalPageCount) |
59 | 75 |
|
60 |
- <div id="pagination"> |
|
61 |
- <!-- pagination.js will fill here. --> |
|
62 |
- </div> |
|
76 |
+ <div id="pagination"><!-- pagination.js will fill here. --></div> |
|
77 |
+ } else { |
|
78 |
+ <div class="error-wrap"> |
|
79 |
+ <i class="ico ico-err1"></i> |
|
80 |
+ <p>@Messages("issue.is.empty")</p> |
|
81 |
+ </div> |
|
82 |
+ } |
|
63 | 83 |
</div> |
84 |
+ |
|
64 | 85 |
<div class="span3 search-wrap"> |
65 |
- |
|
66 | 86 |
<div class="inner bggray"> |
87 |
+ <ul class="unstyled preset-list"> |
|
88 |
+ <li @if(param.assigneeId == null && param.authorLoginId == null){ class="active"}><a href="@urlToList">@Messages("issue.list.all") <strong class="num-badge pull-right">@Issue.countIssues(project.id, State.ALL)</strong></a></li> |
|
89 |
+ @if(UserApp.currentUser().id != -1l){ |
|
90 |
+ <li @if(param.assigneeId == UserApp.currentUser().id){ class="active"}><a href="@urlAssignedToMe">@Messages("issue.list.assignedToMe") <strong class="num-badge pull-right">@Issue.countIssuesByAssigneeId(project.id, State.ALL, User.findByLoginId(session.get("loginId")).id)</strong></a></li> |
|
91 |
+ } |
|
92 |
+ <li @if(param.authorLoginId == UserApp.currentUser().loginId){ class="active"}><a href="@urlAuthoredByMe">@Messages("issue.list.authoredByMe") <strong class="num-badge pull-right">@Issue.countIssuesByAuthorId(project.id, State.ALL, User.findByLoginId(session.get("loginId")).id)</strong></a></li> |
|
93 |
+ </ul> |
|
94 |
+ |
|
67 | 95 |
<form id="search" action="@routes.IssueApp.issues(project.owner, project.name, param.state)" method="get"> |
68 | 96 |
<input type="hidden" name="orderBy" value="@param.orderBy" class="h-value order"> |
69 | 97 |
<input type="hidden" name="state" value="@param.state"> |
... | ... | @@ -77,8 +105,8 @@ |
77 | 105 |
</div> |
78 | 106 |
</div> |
79 | 107 |
|
80 |
- <div class="row"> |
|
81 |
- <a href="#" class="btn-advanced"><i class="ico"></i>@Messages("issue.advancedSearch")</a> |
|
108 |
+ <div class="row-fluid right-txt"> |
|
109 |
+ <button type="button" class="btn-advanced btn-transparent"><i class="icon-plus"></i>@Messages("issue.advancedSearch")</button> |
|
82 | 110 |
</div> |
83 | 111 |
|
84 | 112 |
<div id="advanced-search-form" class="srch-advanced"> |
... | ... | @@ -123,8 +151,8 @@ |
123 | 151 |
</dd> |
124 | 152 |
</dl> |
125 | 153 |
</div> |
126 |
- |
|
127 |
- <dl id="labels" class="issue-option"> |
|
154 |
+ |
|
155 |
+ <dl id="labels" class="issue-option labels-wrap"> |
|
128 | 156 |
<dt> |
129 | 157 |
@Messages("label.select") |
130 | 158 |
@if(isProjectResourceCreatable(UserApp.currentUser, project, ResourceType.ISSUE_LABEL)){ |
... | ... | @@ -141,16 +169,8 @@ |
141 | 169 |
<a href="@routes.IssueApp.issues(project.owner, project.name, param.state, "xls")" class="nbtn white" style="width:100%; padding:6px 0"><i class="ico ico-download"></i>@Messages("issue.downloadAsExcel")</a> |
142 | 170 |
</p> |
143 | 171 |
</div> |
144 |
- |
|
145 | 172 |
</div> |
146 | 173 |
</div> |
147 |
- |
|
148 |
-} else { |
|
149 |
- <div class="error-wrap"> |
|
150 |
- <i class="ico ico-err1"></i> |
|
151 |
- <p>@Messages("issue.is.empty")</p> |
|
152 |
- </div> |
|
153 |
-} |
|
154 | 174 |
|
155 | 175 |
@help.keymap("issueList", project) |
156 | 176 |
</div> |
--- app/views/issue/partial_massupdate.scala.html
+++ app/views/issue/partial_massupdate.scala.html
... | ... | @@ -1,6 +1,6 @@ |
1 | 1 |
@(project:Project, param:IssueApp.SearchCondition) |
2 | 2 |
|
3 |
-<form id="mass-update-form" class="mass-update-form" action="@routes.IssueApp.massUpdate(project.owner, project.name)" method="post"> |
|
3 |
+<form id="mass-update-form" class="mass-update-form pull-left" action="@routes.IssueApp.massUpdate(project.owner, project.name)" method="post"> |
|
4 | 4 |
<div id="state" class="btn-group" data-name="state"> |
5 | 5 |
<button class="btn dropdown-toggle medium" data-toggle="dropdown" disabled="disabled"> |
6 | 6 |
<span class="d-label">@Messages("issue.update.state")</span> |
--- app/views/milestone/list.scala.html
+++ app/views/milestone/list.scala.html
... | ... | @@ -60,20 +60,20 @@ |
60 | 60 |
|
61 | 61 |
} else { |
62 | 62 |
|
63 |
- <div class="milestone-legend"> |
|
64 |
- <i class="gray"></i>@Messages("issue.state.open") |
|
65 |
- <i class="blue"></i>@Messages("issue.state.assigned") |
|
66 |
- <i class="orange"></i>@Messages("issue.state.closed") |
|
67 |
- </div> |
|
68 |
- |
|
69 |
- @if(milestones.length > 1){ |
|
70 | 63 |
<div class="filter-wrap milestone"> |
64 |
+ <div class="milestone-legend pull-left"> |
|
65 |
+ <i class="gray"></i>@Messages("issue.state.open") |
|
66 |
+ <i class="blue"></i>@Messages("issue.state.assigned") |
|
67 |
+ <i class="orange"></i>@Messages("issue.state.closed") |
|
68 |
+ </div> |
|
69 |
+ |
|
70 |
+ @if(milestones.length > 1){ |
|
71 | 71 |
<div class="filters"> |
72 | 72 |
@makeFilterLink("dueDate", param.orderBy, param.orderDir, Messages("order.dueDate")) |
73 | 73 |
@makeFilterLink("completionRate", param.orderBy, param.orderDir, Messages("order.completionRate")) |
74 | 74 |
</div> |
75 |
+ } |
|
75 | 76 |
</div> |
76 |
- } |
|
77 | 77 |
|
78 | 78 |
<ul class="milestones"> |
79 | 79 |
@for(milestone <- milestones){ |
--- app/views/project/overview.scala.html
+++ app/views/project/overview.scala.html
... | ... | @@ -29,7 +29,7 @@ |
29 | 29 |
} |
30 | 30 |
} |
31 | 31 |
@makeHistoryWho(history:History) = {<a href="@userPageUrlOnHistory(history)" class="actor">@history.getWho()</a>} |
32 |
-@makeHistoryHow(history:History) = {<a href="@history.getUrl()"><strong class="whereis"><code>@history.getShortTitle()</code> @history.getHow()</strong></a> } |
|
32 |
+@makeHistoryHow(history:History) = {<a href="@history.getUrl()"><span class="whereis"><code>@history.getShortTitle()</code> @history.getHow()</span></a> } |
|
33 | 33 |
@makeHistoryWhat(history:History) = {@Messages("project.history.type." + history.getWhat())} |
34 | 34 |
|
35 | 35 |
@main(message, project, utils.MenuType.PROJECT_HOME) { |
--- conf/messages.en
+++ conf/messages.en
... | ... | @@ -222,6 +222,9 @@ |
222 | 222 |
issue.update.milestone = Update milestone |
223 | 223 |
issue.update.attachLabel = Attach label |
224 | 224 |
issue.update.detachLabel = Detach label |
225 |
+issue.list.all = All Issues |
|
226 |
+issue.list.assignedToMe = Assigned to me |
|
227 |
+issue.list.authoredByMe = Created by me |
|
225 | 228 |
|
226 | 229 |
#Post |
227 | 230 |
post.new = New |
--- conf/messages.ko
+++ conf/messages.ko
... | ... | @@ -208,7 +208,7 @@ |
208 | 208 |
issue.new.selectDefault.diagnosisResult = --진단결과 선택-- |
209 | 209 |
issue.comment.delete.confirm = 해당 이슈의 댓글을 삭제하시겠습니까? |
210 | 210 |
issue.committer.edit = 이슈수정 |
211 |
-issue.advancedSearch = 고급검색 |
|
211 |
+issue.advancedSearch = 상세검색 |
|
212 | 212 |
issue.downloadAsExcel = 엑셀파일로 다운받기 |
213 | 213 |
issue.search = 검색 |
214 | 214 |
issue.error.emptyTitle = 이슈 제목을 입력해주세요 |
... | ... | @@ -222,6 +222,9 @@ |
222 | 222 |
issue.update.milestone = 마일스톤 변경 |
223 | 223 |
issue.update.attachLabel = 라벨 추가 |
224 | 224 |
issue.update.detachLabel = 라벨 제거 |
225 |
+issue.list.all = 전체 이슈 |
|
226 |
+issue.list.assignedToMe = 나에게 할당된 이슈 |
|
227 |
+issue.list.authoredByMe = 내가 작성한 이슈 |
|
225 | 228 |
|
226 | 229 |
#Post |
227 | 230 |
post.new = 새글 |
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?