Prechádzať zdrojové kódy

Added issue list and issue display

Nathaniel van Diepen 10 rokov pred
rodič
commit
e3e23168ab

+ 34 - 7
api.php

@@ -40,19 +40,27 @@
 							'url'=>isset($_GET['back'])?$_GET['back']:'page-index'
 						);
 					}
-					retj($ret,'Project - '.$context['title']);
+					retj($ret);
 				break;
 				case 'issue':
 					back(true);
-					// TODO - handle issue requests
-					if(false){
-						// TODO
+					$ret['template'] = array(
+						'type'=>'pages',
+						'name'=>'issue'
+					);
+					if($context = issueObj($id)){
+						$context['user'] = userObj($context['user']);
+						if($LOGGEDIN){
+							$context['key'] = true;
+							$context['user'] = userObj($_SESSION['username']);
+						};
+						$ret['context'] = $context;
 					}else{
 						$ret['state'] = array(
 							'url'=>isset($_GET['back'])?$_GET['back']:'page-index'
 						);
 					}
-					retj($ret,'Project - '.$context['title']);
+					retj($ret,'Issue #'.$id. ' - '.$context['title']);
 				break;
 				case 'scrum':
 					back(true);
@@ -64,7 +72,7 @@
 							'url'=>isset($_GET['back'])?$_GET['back']:'page-index'
 						);
 					}
-					retj($ret,'Project - '.$context['title']);
+					retj($ret);
 				break;
 				case 'project':
 					back(true);
@@ -88,6 +96,7 @@
 				break;
 				case 'message':
 					// TODO - handle message requests
+					$context = array();
 					if(false){
 						// TODO
 					}else{
@@ -107,7 +116,7 @@
 							'url'=>isset($_GET['back'])?$_GET['back']:'page-index'
 						);
 					}
-					retj($ret,'Project - '.$context['title']);
+					retj($ret);
 				break;
 				case 'page':
 					$title = $id;
@@ -152,6 +161,14 @@
 												$context['messages'] = array();
 											}
 										break;
+										case 'issues':
+											if($res = query("SELECT i.id,i.title,i.description,u.name as user FROM `issues` i JOIN `users` u ON u.id = i.u_id")){
+												$context['issues'] = fetch_all($res,MYSQLI_ASSOC);
+												foreach($context['issues'] as $key => $issue){
+													$context['issues'][$key]['user'] = userObj($issue['user']);
+												}
+											}
+										break;
 									}
 								}
 							}
@@ -327,6 +344,16 @@
 												);
 											}
 										break;
+										case 'issue':
+											if(!function_exists('issue_comment')){
+												$ret['error'] = "fn doesn't exist!";
+											}
+											if(!issue_comment($cid,$_GET['message'])){
+												$ret = array(
+													'error'=>'Could not comment on project'
+												);
+											}
+										break;
 										default:
 											$ret['error'] = 'Comment type not implemented';
 									}

+ 32 - 0
data/pages/issue.template

@@ -0,0 +1,32 @@
+<h2>
+	{{title}} <a style="font-size:small;color:gray;text-decoration:none;" href="#~{{user.name}}">{{user.name}}</a>
+</h2>
+<div style="font-size:large;">
+	{{description}}
+</div>
+<span style="font-size:small;">
+	Comments
+</span>
+<ul>
+	{{#each comments}}
+		<li>
+			<a style="font-size:small;color:gray;text-decoration:none;" href="#~{{name}}">
+				{{name}}
+			</a>
+			<time style="font-size:smaller;" class="timeago">
+				{{timestamp}}
+			</time>
+			<div>
+				{{message}}
+			</div>
+		</li>
+	{{/each}}
+</ul>
+<a class="comment">
+	{
+		"text": "comment",
+		"id": {{id}},
+		"type": "issue",
+		"title": "Comment"
+	}
+</a>

+ 6 - 0
data/pages/issues.options

@@ -0,0 +1,6 @@
+{
+	"secure": true,
+	"context": [
+		"issues"
+	]
+}

+ 22 - 0
data/pages/issues.template

@@ -0,0 +1,22 @@
+<a class="button" href="#page-newissue">
+	New
+</a>
+<div class="accordion">
+	<span class="icons">
+		{
+			"header": "ui-icon-wrench",
+			"activeHeader": "ui-icon-wrench"
+		}
+	</span>
+	{{#each issues}}
+		<h3>
+			{{title}} - <small>{{user.name}}</small>
+			<a href="#!{{id}}" class="button">
+				Open
+			</a>
+		</h3>
+		<div>
+			{{description}}
+		</div>
+	{{/each}}
+</div>

+ 3 - 3
js/index.js

@@ -102,7 +102,7 @@
 						error(d);
 					}else{
 						if(exists(d.state)){
-							d.state.title = d.state.title.capitalize();
+							d.state.title = (d.state.title+'').capitalize();
 							if(location.href.substr(location.href.lastIndexOf('/')+1) != d.state.url && d.state.url !== ''){
 								console.log('Forced redirection to '+d.state.url);
 								History.replaceState(d.state.data,d.state.title,d.state.url);
@@ -235,7 +235,7 @@
 			getNewState();
 			if(!equal(State.data,Old)){
 				switch(State.data.type){
-					case 'page':case 'user':case 'project':
+					case 'page':case 'user':case 'project':case 'issue':
 						apiCall(State.data,function(d){
 							if(!exists(d.error)){
 								if(exists(d.context)){
@@ -267,7 +267,7 @@
 					default:
 						error({
 							url: State.url,
-							error: "Something went wrong!"
+							error: "Unable to make a request of type "+State.data.type
 						});
 				}
 				Old = State.data;

+ 6 - 2
php/functions.php

@@ -112,10 +112,14 @@
 		switch($type){
 			case 'user':$url='~'.$id;break;
 			case 'group':$url='+'.$id;break;
-			case 'issue':$url='!'.$id;break;
+			case 'issue':
+				$url = '!'.$id;
+				$title = issueObj($id);
+				$title = 'Issue #'.$title['title'];
+			break;
 			case 'page':$url='page-'.$id;break;
 			case 'project':
-				$url=$type.'-'.$id;
+				$url = $type.'-'.$id;
 				$title = projectObj($id);
 				$title = 'Project - '.$title['title'];
 			break;

+ 1 - 0
php/include.php

@@ -15,6 +15,7 @@
 	require_once(PATH_PHP.'messages.php');
 	require_once(PATH_PHP.'user.php');
 	require_once(PATH_PHP.'project.php');
+	require_once(PATH_PHP.'issue.php');
 	require_once(PATH_PHP.'emails.php');
 	authenticate();
 ?>

+ 43 - 0
php/issue.php

@@ -0,0 +1,43 @@
+<?php
+	require_once(realpath(dirname(__FILE__)).'/config.php');
+	require_once(PATH_PHP.'database.php');
+	require_once(PATH_PHP.'messages.php');
+	function issueObj($id){
+		if($res = query("SELECT i.id,i.title,i.description,u.name as user FROM `issues` i JOIN `users` u ON u.id = i.u_id  WHERE i.id='%d'",array($id))){
+			if($res->num_rows == 1){
+				$issue = $res->fetch_assoc();
+				$issue['user'] = userObj($issue['user']);
+				$issue['comments'] = messages($issue['id'],'issue');
+				return $issue;
+			}
+		}
+		return false;
+	}
+	function newIssue($title,$description,$user=null){
+		global $LOGGEDIN;
+		global $mysqli;
+		if($LOGGEDIN){
+			if(is_null($user)){
+				$user = $_SESSION['username'];
+			}
+			$user = userId($user);
+			if(false != $user){
+				if($res = query("SELECT id FROM `projects` WHERE title = '%s' AND u_id = %d",array($title,$user))){
+					if($res->num_rows){
+						return false;
+					}
+				}
+				if(query("INSERT INTO `projects` (title,description,u_id) VALUES ('%s','%s',%d)",array($title,$description,$user))){
+					if($res = query("SELECT id FROM `projects` WHERE title = '%s' AND description = '%s' AND u_id = %d",array($title,$description,$user))){
+						if($res->num_rows == 1){
+							$res = $res->fetch_assoc();
+							project_comment($res['id'],'Project created');
+						}
+						return true;
+					}
+				}
+			}
+		}
+		return false;
+	}
+?>

+ 15 - 0
php/messages.php

@@ -31,6 +31,15 @@
 					return $arr;
 				}
 			break;
+			case 'issue':
+				if($res = query("SELECT m.id, u.name, m.message, UNIX_TIMESTAMP(m.timestamp) as timestamp FROM `messages` m JOIN `users` u ON u.id = m.from_id WHERE m.i_id='%d' ORDER BY m.timestamp ASC",array($id))){
+					$arr = array();
+					while($row = $res->fetch_assoc()){
+						array_push($arr,$row);
+					}
+					return $arr;
+				}
+			break;
 		}
 		return array();
 	}
@@ -40,6 +49,12 @@
 		}
 		return false;
 	}
+	function issue_comment($issue,$message){
+		if(query("INSERT INTO `bugs`.`messages` (`id`,`timestamp`,`from_id`,`to_id`,`p_id`,`s_id`,`i_id`,`message`) VALUES(NULL,CURRENT_TIMESTAMP,'%d',NULL,NULL,NULL,'%d','%s');",array(userId($_SESSION['username']),$issue,$message))){
+			return true;
+		}
+		return false;
+	}
 	function personal_message($toId,$message){
 		if(query("INSERT INTO `bugs`.`messages` (`id`,`timestamp`,`from_id`,`to_id`,`p_id`,`s_id`,`i_id`,`message`) VALUES(NULL,CURRENT_TIMESTAMP,'%d','%d',NULL,NULL,NULL,'%s');",array(userId($_SESSION['username']),$toId,$message))){
 			return true;