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

change view filename (HIVE-211)
@19c32686b4c85cc658009624798538d657b6fb8d
--- app/controllers/ProjectApp.java
+++ app/controllers/ProjectApp.java
... | ... | @@ -43,10 +43,26 @@ |
43 | 43 |
public static final String[] LOGO_TYPE = {"jpg", "jpeg", "png", "gif", "bmp"}; |
44 | 44 |
private static final int MAX_FETCH_PROJECTS = 1000; |
45 | 45 |
|
46 |
+ /** |
|
47 |
+ * getProject |
|
48 |
+ * @param userName |
|
49 |
+ * @param projectName |
|
50 |
+ * @return |
|
51 |
+ */ |
|
46 | 52 |
public static Project getProject(String userName, String projectName) { |
47 | 53 |
return Project.findByNameAndOwner(userName, projectName); |
48 | 54 |
} |
49 | 55 |
|
56 |
+ /** |
|
57 |
+ * project |
|
58 |
+ * @param userName |
|
59 |
+ * @param projectName |
|
60 |
+ * @return |
|
61 |
+ * @throws IOException |
|
62 |
+ * @throws ServletException |
|
63 |
+ * @throws SVNException |
|
64 |
+ * @throws GitAPIException |
|
65 |
+ */ |
|
50 | 66 |
public static Result project(String userName, String projectName) throws IOException, ServletException, SVNException, GitAPIException { |
51 | 67 |
Project project = ProjectApp.getProject(userName, projectName); |
52 | 68 |
if (!AccessControl.isAllowed(UserApp.currentUser(), project.asResource(), Operation.READ)) { |
... | ... | @@ -67,6 +83,10 @@ |
67 | 83 |
return ok(overview.render("title.projectHome", getProject(userName, projectName), histories)); |
68 | 84 |
} |
69 | 85 |
|
86 |
+ /** |
|
87 |
+ * newProjectForm |
|
88 |
+ * @return |
|
89 |
+ */ |
|
70 | 90 |
public static Result newProjectForm() { |
71 | 91 |
if (session().get(UserApp.SESSION_USERID) == null) { |
72 | 92 |
flash(Constants.WARNING, "user.login.alert"); |
... | ... | @@ -75,6 +95,12 @@ |
75 | 95 |
return ok(create.render("title.newProject", form(Project.class))); |
76 | 96 |
} |
77 | 97 |
|
98 |
+ /** |
|
99 |
+ * settingForm |
|
100 |
+ * @param userName |
|
101 |
+ * @param projectName |
|
102 |
+ * @return |
|
103 |
+ */ |
|
78 | 104 |
public static Result settingForm(String userName, String projectName) { |
79 | 105 |
Project project = getProject(userName, projectName); |
80 | 106 |
if (!AccessControl.isAllowed(UserApp.currentUser(), project.asResource(), Operation.UPDATE)) { |
... | ... | @@ -106,11 +132,18 @@ |
106 | 132 |
|
107 | 133 |
RepositoryService.createRepository(project); |
108 | 134 |
|
109 |
- return redirect(routes.ProjectApp.project(project.owner, |
|
110 |
- project.name)); |
|
135 |
+ return redirect(routes.ProjectApp.project(project.owner, project.name)); |
|
111 | 136 |
} |
112 | 137 |
} |
113 | 138 |
|
139 |
+ /** |
|
140 |
+ * settingProject |
|
141 |
+ * @param userName |
|
142 |
+ * @param projectName |
|
143 |
+ * @return |
|
144 |
+ * @throws IOException |
|
145 |
+ * @throws NoSuchAlgorithmException |
|
146 |
+ */ |
|
114 | 147 |
public static Result settingProject(String userName, String projectName) throws IOException, NoSuchAlgorithmException { |
115 | 148 |
Form<Project> filledUpdatedProjectForm = form(Project.class) |
116 | 149 |
.bindFromRequest(); |
... | ... | @@ -152,6 +185,11 @@ |
152 | 185 |
} |
153 | 186 |
} |
154 | 187 |
|
188 |
+ /** |
|
189 |
+ * isImageFile |
|
190 |
+ * @param filename |
|
191 |
+ * @return |
|
192 |
+ */ |
|
155 | 193 |
public static boolean isImageFile(String filename) { |
156 | 194 |
boolean isImageFile = false; |
157 | 195 |
for(String suffix : LOGO_TYPE) { |
... | ... | @@ -161,6 +199,12 @@ |
161 | 199 |
return isImageFile; |
162 | 200 |
} |
163 | 201 |
|
202 |
+ /** |
|
203 |
+ * deleteForm |
|
204 |
+ * @param userName |
|
205 |
+ * @param projectName |
|
206 |
+ * @return |
|
207 |
+ */ |
|
164 | 208 |
public static Result deleteForm(String userName, String projectName) { |
165 | 209 |
Project project = getProject(userName, projectName); |
166 | 210 |
if (!AccessControl.isAllowed(UserApp.currentUser(), project.asResource(), Operation.UPDATE)) { |
... | ... | @@ -171,6 +215,13 @@ |
171 | 215 |
return ok(delete.render("title.projectSetting", projectForm, project)); |
172 | 216 |
} |
173 | 217 |
|
218 |
+ /** |
|
219 |
+ * deleteProject |
|
220 |
+ * @param userName |
|
221 |
+ * @param projectName |
|
222 |
+ * @return |
|
223 |
+ * @throws Exception |
|
224 |
+ */ |
|
174 | 225 |
public static Result deleteProject(String userName, String projectName) throws Exception { |
175 | 226 |
Project project = getProject(userName, projectName); |
176 | 227 |
|
... | ... | @@ -184,13 +235,25 @@ |
184 | 235 |
} |
185 | 236 |
} |
186 | 237 |
|
238 |
+ /** |
|
239 |
+ * members |
|
240 |
+ * @param userName |
|
241 |
+ * @param projectName |
|
242 |
+ * @return |
|
243 |
+ */ |
|
187 | 244 |
public static Result members(String userName, String projectName) { |
188 | 245 |
Project project = getProject(userName, projectName); |
189 |
- return ok(memberList.render("title.memberList", |
|
246 |
+ return ok(views.html.project.members.render("title.memberList", |
|
190 | 247 |
ProjectUser.findMemberListByProject(project.id), project, |
191 | 248 |
Role.getActiveRoles())); |
192 | 249 |
} |
193 | 250 |
|
251 |
+ /** |
|
252 |
+ * newMember |
|
253 |
+ * @param userName |
|
254 |
+ * @param projectName |
|
255 |
+ * @return |
|
256 |
+ */ |
|
194 | 257 |
public static Result newMember(String userName, String projectName) { |
195 | 258 |
// TODO change into view validation |
196 | 259 |
Form<User> addMemberForm = form(User.class).bindFromRequest(); |
... | ... | @@ -217,6 +280,13 @@ |
217 | 280 |
return redirect(routes.ProjectApp.members(userName, projectName)); |
218 | 281 |
} |
219 | 282 |
|
283 |
+ /** |
|
284 |
+ * deleteMember |
|
285 |
+ * @param userName |
|
286 |
+ * @param projectName |
|
287 |
+ * @param userId |
|
288 |
+ * @return |
|
289 |
+ */ |
|
220 | 290 |
public static Result deleteMember(String userName, String projectName, |
221 | 291 |
Long userId) { |
222 | 292 |
Project project = getProject(userName, projectName); |
... | ... | @@ -232,6 +302,13 @@ |
232 | 302 |
} |
233 | 303 |
} |
234 | 304 |
|
305 |
+ /** |
|
306 |
+ * editMemeber |
|
307 |
+ * @param userName |
|
308 |
+ * @param projectName |
|
309 |
+ * @param userId |
|
310 |
+ * @return |
|
311 |
+ */ |
|
235 | 312 |
public static Result editMember(String userName, String projectName, Long userId) { |
236 | 313 |
Project project = getProject(userName, projectName); |
237 | 314 |
if (AccessControl.isAllowed(UserApp.currentUser(), project.asResource(), Operation.UPDATE)) { |
... | ... | @@ -246,6 +323,13 @@ |
246 | 323 |
} |
247 | 324 |
} |
248 | 325 |
|
326 |
+ /** |
|
327 |
+ * projects |
|
328 |
+ * @param filter |
|
329 |
+ * @param state |
|
330 |
+ * @param pageNum |
|
331 |
+ * @return |
|
332 |
+ */ |
|
249 | 333 |
public static Result projects(String filter, String state, int pageNum) { |
250 | 334 |
final String HTML = "text/html"; |
251 | 335 |
final String JSON = "application/json"; |
... | ... | @@ -285,9 +369,15 @@ |
285 | 369 |
Page<Project> projects = FinderTemplate.getPage( |
286 | 370 |
orderParams, searchParams, Project.find, Project.PROJECT_COUNT_PER_PAGE, pageNum - 1); |
287 | 371 |
|
288 |
- return ok(projectList.render("title.projectList", projects, filter, state)); |
|
372 |
+ return ok(views.html.project.list.render("title.projectList", projects, filter, state)); |
|
289 | 373 |
} |
290 | 374 |
|
375 |
+ /** |
|
376 |
+ * tags |
|
377 |
+ * @param ownerName |
|
378 |
+ * @param projectName |
|
379 |
+ * @return |
|
380 |
+ */ |
|
291 | 381 |
public static Result tags(String ownerName, String projectName) { |
292 | 382 |
Project project = Project.findByNameAndOwner(ownerName, projectName); |
293 | 383 |
if (!AccessControl.isAllowed(UserApp.currentUser(), project.asResource(), Operation.READ)) { |
... | ... | @@ -306,6 +396,12 @@ |
306 | 396 |
return ok(toJson(tags)); |
307 | 397 |
} |
308 | 398 |
|
399 |
+ /** |
|
400 |
+ * tag |
|
401 |
+ * @param ownerName |
|
402 |
+ * @param projectName |
|
403 |
+ * @return |
|
404 |
+ */ |
|
309 | 405 |
public static Result tag(String ownerName, String projectName) { |
310 | 406 |
Project project = Project.findByNameAndOwner(ownerName, projectName); |
311 | 407 |
if (!AccessControl.isAllowed(UserApp.currentUser(), project.asResource(), Operation.UPDATE)) { |
... | ... | @@ -332,6 +428,13 @@ |
332 | 428 |
} |
333 | 429 |
} |
334 | 430 |
|
431 |
+ /** |
|
432 |
+ * untag |
|
433 |
+ * @param ownerName |
|
434 |
+ * @param projectName |
|
435 |
+ * @param id |
|
436 |
+ * @return |
|
437 |
+ */ |
|
335 | 438 |
public static Result untag(String ownerName, String projectName, Long id) { |
336 | 439 |
Project project = Project.findByNameAndOwner(ownerName, projectName); |
337 | 440 |
if (!AccessControl.isAllowed(UserApp.currentUser(), project.asResource(), Operation.UPDATE)) { |
+++ app/views/googleAnalytics.scala.html
... | ... | @@ -0,0 +1,13 @@ |
1 | +@(accountId:String) | |
2 | + | |
3 | +<script type="text/javascript"> | |
4 | + var _gaq = _gaq || []; | |
5 | + _gaq.push(['_setAccount', '@accountId']); | |
6 | + _gaq.push(['_trackPageview']); | |
7 | + | |
8 | + (function() { | |
9 | + var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; | |
10 | + ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; | |
11 | + var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); | |
12 | + })(); | |
13 | +</script>(No newline at end of file) |
+++ app/views/project/create.scala.html
... | ... | @@ -0,0 +1,101 @@ |
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/delete.scala.html
... | ... | @@ -0,0 +1,47 @@ |
1 | +@(message: String)(projectForm: Form[Project], project:Project) | |
2 | + | |
3 | +@import helper._ | |
4 | +@import utils.TemplateHelper._ | |
5 | + | |
6 | +@main(message, project, utils.MenuType.PROJECT_SETTING) { | |
7 | +<div class="page"> | |
8 | + @prjmenu(project, utils.MenuType.PROJECT_SETTING, "") | |
9 | + | |
10 | + <div class="bubble-wrap gray wp"> | |
11 | + <div class="cu-label">@Messages("project.delete")</div> | |
12 | + <div class="cu-desc"> | |
13 | + <p><strong class="notice">@Messages("project.delete.description")</strong></p> | |
14 | + <p> | |
15 | + <input type="checkbox" class="checkbox" autocomplete="off" id="accept"><!-- | |
16 | + --><label for="accept" class="bg-checkbox label-agreement">@Messages("project.delete.accept")</label> | |
17 | + </p> | |
18 | + </div> | |
19 | + </div> | |
20 | + <div class="box-wrap bottom"> | |
21 | + <a id="deletion" data-toggle="modal" href="#alertDeletion" class="nbtn medium orange"><!-- | |
22 | + --><i class="ico ico-delete-small"></i>@Messages("project.delete.this")</a> | |
23 | + </div> | |
24 | + | |
25 | + | |
26 | + <div id="alertDeletion" class="modal hide"> | |
27 | + <div class="modal-header"> | |
28 | + <button type="button" class="close" data-dismiss="modal">×</button> | |
29 | + <h3>@Messages("project.delete.requestion")</h3> | |
30 | + </div> | |
31 | + <div class="modal-body"> | |
32 | + <p> @Messages("project.delete.description")</p> | |
33 | + <p> @Messages("project.delete.reaccept") </p> | |
34 | + </div> | |
35 | + <div class="modal-footer"> | |
36 | + <a href="#" class="nbtn medium" data-dismiss="modal">@Messages("button.no")</a> | |
37 | + <a href="@routes.ProjectApp.deleteProject(project.owner, project.name)" class="nbtn medium orange">@Messages("button.yes")</a> | |
38 | + </div> | |
39 | + </div> | |
40 | +</div> | |
41 | + | |
42 | +<script type="text/javascript"> | |
43 | + $(document).ready(function(){ | |
44 | + $hive.loadModule("project.Delete"); | |
45 | + }); | |
46 | +</script> | |
47 | +}(No newline at end of file) |
--- app/views/project/projectList.scala.html
+++ app/views/project/list.scala.html
No changes |
--- app/views/project/memberList.scala.html
+++ app/views/project/members.scala.html
No changes |
+++ app/views/project/overview.scala.html
... | ... | @@ -0,0 +1,126 @@ |
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 | +@projectLogoImage = @{ | |
9 | + defining(Attachment.findByContainer(project.asResource)) { files => | |
10 | + if(files.size > 0){ | |
11 | + "/files/" + files.head.id | |
12 | + } else { | |
13 | + routes.Assets.at("images/bg-default-project.jpg") | |
14 | + } | |
15 | + } | |
16 | +} | |
17 | + | |
18 | +@main(message, project, utils.MenuType.PROJECT_HOME) { | |
19 | +<div class="page"> | |
20 | + @prjmenu(project, utils.MenuType.PROJECT_HOME, "") | |
21 | + | |
22 | + <div class="input-prepend project-hometop-wrap"> | |
23 | + <div class="vcs-wrap pull-left"> | |
24 | + <span class="clone-label"><strong class="@project.vcs">@project.vcs</strong></span><!-- | |
25 | + --><input id="repositoryURL" type="text" class="text repo-url" readonly="readonly" value="@CodeApp.getURL(project.owner, project.name)"> | |
26 | + </div> | |
27 | + <div class="issue-wrap btn-group pull-right"> | |
28 | + <button class="btn" disabled="true">@Messages("menu.issue")</button> | |
29 | + <a href="@routes.IssueApp.issues(project.owner, project.name, State.OPEN.state)" class="btn"> | |
30 | + @Messages("issue.state.open") <strong class="num open">@Issue.countIssues(project.id, State.OPEN)</strong> | |
31 | + </a> | |
32 | + <a href="@routes.IssueApp.issues(project.owner, project.name, State.CLOSED.state)" class="btn"> | |
33 | + @Messages("issue.state.closed") <strong class="num">@Issue.countIssues(project.id, State.CLOSED)</strong> | |
34 | + </a> | |
35 | + </div> | |
36 | + </div> | |
37 | + | |
38 | + <div class="bubble-wrap dark-gray project-home"> | |
39 | + <div class="inner logo" style="background-image:url('@projectLogoImage');"></div> | |
40 | + <div class="inner project-info"> | |
41 | + <header> | |
42 | + <h3>@Messages("project.info")</h3> | |
43 | + <!--<div class="project-status"> | |
44 | + <i class="ico ico-like"></i> | |
45 | + <span class="num">100</span> | |
46 | + <span class="sp">|</span> | |
47 | + <i class="ico ico-activity high"></i> | |
48 | + </div>--> | |
49 | + </header> | |
50 | + <ul class="infos"> | |
51 | + <li class="info"> | |
52 | + <strong>@Messages("project.license") :</strong> GPL v2 | |
53 | + </li> | |
54 | + <li class="info"> | |
55 | + <strong>@Messages("project.tags") :</strong> | |
56 | + @for(tag <- project.tags) { | |
57 | + <span class="label">@tag.name</span> | |
58 | + } | |
59 | + </li> | |
60 | + <li class="info"> | |
61 | + <strong>@Messages("project.codeLanguage") :</strong> Java, JavaScript | |
62 | + </li> | |
63 | + <li class="info"> | |
64 | + <strong>@Messages("project.vcs") :</strong> @project.vcs | |
65 | + </li> | |
66 | + </ul> | |
67 | + </div> | |
68 | + <div class="inner member-info"> | |
69 | + <header> | |
70 | + <h3>@Messages("project.members")</h3> | |
71 | + </header> | |
72 | + <div class="member-wrap"> | |
73 | + <ul class="project-members"> | |
74 | + @for(member <- User.findUsersByProject(project.id)){ | |
75 | + <li class="member"> | |
76 | + <a href="@routes.UserApp.userInfo(member.loginId)" class="avatar-wrap img-rounded pull-left small"> | |
77 | + <img src="@member.avatarUrl" alt="@member.loginId" width="24" height="24"> | |
78 | + </a> | |
79 | + <a href="@routes.UserApp.userInfo(member.loginId)" class="name"> | |
80 | + <strong>@member.loginId (@member.name)</strong> | |
81 | + </a> | |
82 | + </li> | |
83 | + } | |
84 | + </ul> | |
85 | + </div> | |
86 | + </div> | |
87 | + </div> | |
88 | + | |
89 | + @if(histories.size > 0) { | |
90 | + <table class="table table-hover"> | |
91 | + <tbody> | |
92 | + @for(history <- histories.iterator()) { | |
93 | + <tr> | |
94 | + <td>@agoString(ago(history.getWhen()))</td> | |
95 | + <td><a href="@history.getUserPageUrl()">@history.getWho()</a></td> | |
96 | + <td>@history.getWhat()</td> | |
97 | + <td><a href="@history.getUrl()">@history.getHow()</a></td> | |
98 | + </tr> | |
99 | + } | |
100 | + </tbody> | |
101 | + </table> | |
102 | + } | |
103 | + | |
104 | + <div class="bubble-wrap dark-gray readme"> | |
105 | + @if(project.readme == null) { | |
106 | + <p class="default"> | |
107 | + @Messages("project.readme") | |
108 | + </p> | |
109 | + } else { | |
110 | + <div class="readme-wrap"> | |
111 | + <header><i class="ico ico-readme-book"></i><strong>README.md</strong></header> | |
112 | + <div class="readme-body" markdown="true"> | |
113 | + @project.readme | |
114 | + </div> | |
115 | + </div> | |
116 | + } | |
117 | + @markdown() | |
118 | + </div> | |
119 | +</div> | |
120 | + | |
121 | +<script type="text/javascript"> | |
122 | +$(document).ready(function(){ | |
123 | + $hive.loadModule("project.Home"); | |
124 | +}); | |
125 | +</script> | |
126 | +}(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?