Browse Source

Merge remote-tracking branch 'origin/In-progress'

Nathaniel van Diepen 10 years ago
parent
commit
6e95fea5fb
10 changed files with 224 additions and 45 deletions
  1. 58 36
      api.php
  2. 87 3
      data/pages/issue.template
  3. 5 2
      data/pages/issues.template
  4. 0 1
      data/pages/login.template
  5. 1 1
      data/sidebars/default.template
  6. 0 1
      index.php
  7. 1 0
      install/example.cron
  8. 30 0
      install/install.sql
  9. 2 1
      js/index.js
  10. 40 0
      php/issue.php

+ 58 - 36
api.php

@@ -180,7 +180,7 @@
 											}
 										break;
 										case 'issues':
-											if($res = query("SELECT i.id,i.title,i.description,u.name as user,s.name as status,p.name as priority,p.color FROM `issues` i JOIN `users` u ON u.id = i.u_id LEFT JOIN `statuses` s ON s.id = i.st_id LEFT JOIN `priorities` p ON p.id = i.pr_id")){
+											if($res = query("SELECT i.id,i.title,i.description,u.name as user,s.name as status,p.name as priority,p.color,s.isopen FROM `issues` i JOIN `users` u ON u.id = i.u_id LEFT JOIN `statuses` s ON s.id = i.st_id LEFT JOIN `priorities` p ON p.id = i.pr_id")){
 												$context['issues'] = fetch_all($res,MYSQLI_ASSOC);
 												foreach($context['issues'] as $key => $issue){
 													$context['issues'][$key]['user'] = userObj($issue['user']);
@@ -347,43 +347,62 @@
 							break;
 							case 'issue':
 								back(true);
-								$ret['state'] = array(
-									'data'=>array(
-										'type'=>'page',
-										'id'=>$id,
-									)
-								);
-								if(isset($_GET['pid'])){
-									$ret['error'] = 'Invalid Action';
-								}elseif(is_valid('title')&&is_valid('description')){
-									if($id = newIssue($_GET['title'],$_GET['description'])){
-										sendMailAll('newissue','New Issue - '.$_GET['title'],array(
-											'title'=>$_GET['title'],
-											'url'=>'http://'.$_SERVER['HTTP_HOST'],
-											'id'=>$id
-										));
-									}else{
-										$ret['error'] = 'Unable to create issue. '.get_sql()->error;
-									}
-								}else{
-									$ret['error'] = 'Fill in all the details.';
-								}
-								retj($ret,$id);
-							break;
-							case 'message':
-								back(true);
-								if(isset($_GET['to'])&&isset($_GET['message'])){
-									if($uid = userId($_GET['to'])){
-										if(!personal_message($uid,$_GET['message'])){
-											$ret['error'] = 'Could not send message';
+								switch($_GET['action']){
+									case 'status':
+										if(!setStatus($_GET['issue'],$_GET['status'])){
+											$ret['error'] = 'Could not update status.';
+										}else{
+											alog('i',$_GET['issue'],'Status changed to '.statusName($_GET['status']));
 										}
-									}else{
-										$ret['error'] = "That user doesn't exist";
-									}
-								}else{
-									$ret['error'] = 'Empty details';
+										retj($ret);
+									break;
+									case 'priority':
+										if(!setPriority($_GET['issue'],$_GET['priority'])){
+											$ret['error'] = 'Could not update priority.';
+										}else{
+											alog('i',$_GET['issue'],'Priority changed to '.priorityName($_GET['priority']));
+										}
+										retj($ret);
+									break;
+									default:
+										$ret['state'] = array(
+											'data'=>array(
+												'type'=>'page',
+												'id'=>$id,
+											)
+										);
+										if(isset($_GET['pid'])){
+											$ret['error'] = 'Invalid Action';
+										}elseif(is_valid('title')&&is_valid('description')){
+											if($id = newIssue($_GET['title'],$_GET['description'])){
+												sendMailAll('newissue','New Issue - '.$_GET['title'],array(
+													'title'=>$_GET['title'],
+													'url'=>'http://'.$_SERVER['HTTP_HOST'],
+													'id'=>$id
+												));
+											}else{
+												$ret['error'] = 'Unable to create issue. '.get_sql()->error;
+											}
+										}else{
+											$ret['error'] = 'Fill in all the details.';
+										}
+										retj($ret,$id);
+									break;
+									case 'message':
+										back(true);
+										if(isset($_GET['to'])&&isset($_GET['message'])){
+											if($uid = userId($_GET['to'])){
+												if(!personal_message($uid,$_GET['message'])){
+													$ret['error'] = 'Could not send message';
+												}
+											}else{
+												$ret['error'] = "That user doesn't exist";
+											}
+										}else{
+											$ret['error'] = 'Empty details';
+										}
+										retj($ret,$id);
 								}
-								retj($ret,$id);
 							break;
 							case 'notifications':
 								if($LOGGEDIN){
@@ -461,6 +480,9 @@
 								}
 								retj($ret);
 							break;
+							case 'mailqueue':
+								die();
+							break;
 							default:
 								retj(array(
 									'error'=>'Invalid action.'

+ 87 - 3
data/pages/issue.template

@@ -5,10 +5,30 @@
 	Description: {{description}}
 </div>
 <div>
-	Priority: <span style="{{#if color}}color:{{color}};{{/if}}">{{priority}}</span>
+	Priority:
+	<select name="priority">
+		<option style="background-color:white;">
+			(none)
+		</option>
+		{{#each priorities}}
+			<option style="background-color:{{color}};" value="{{id}}">
+				{{name}}
+			</option>
+		{{/each}}
+	</select>
 </div>
 <div>
-	Status: {{status}}
+	Status:
+	<select name="status">
+		<option style="background-color:white;">
+			(none)
+		</option>
+		{{#each statuses}}
+			<option value="{{id}}">
+				{{name}}
+			</option>
+		{{/each}}
+	</select>
 </div>
 <span style="font-size:small;">
 	Comments
@@ -35,4 +55,68 @@
 		"type": "issue",
 		"title": "Comment"
 	}
-</a>
+</a>
+<script>
+	(function(){
+		var status = false,
+			priority = false;
+		$('select[name=status]').change(function(){
+			var t = $(this);
+			if(status != t.val()){
+				apiCall({
+					type: 'action',
+					id: 'issue',
+					action: 'status',
+					status: t.val(),
+					issue: {{id}}
+				},function(d){
+					if(!d.error){
+						status = t.val();
+					}else{
+						alert(d.error);
+					}
+				});
+			}
+		}).children('option').each(function(){
+			if($(this).text().trim() == '{{status}}'){
+				$(this).prop('selected',true);
+				status = $(this).val();
+				$(this).parent().css(
+					'background-color',
+					this.style.backgroundColor
+				);
+			}
+		});
+		$('select[name=priority]').change(function(){
+			var t = $(this);
+			t.css(
+				'background-color',
+				t.children('option:selected').get(0).style.backgroundColor
+			);
+			if(priority != t.val()){
+				apiCall({
+					type: 'action',
+					id: 'issue',
+					action: 'priority',
+					priority: t.val(),
+					issue: {{id}}
+				},function(d){
+					if(!d.error){
+						priority = t.val();
+					}else{
+						alert(d.error);
+					}
+				});
+			}
+		}).children('option').each(function(){
+			if($(this).text().trim() == '{{priority}}'){
+				$(this).prop('selected',true);
+				priority = $(this).val();
+				$(this).parent().css(
+					'background-color',
+					this.style.backgroundColor
+				);
+			}
+		});
+	})();
+</script>

+ 5 - 2
data/pages/issues.template

@@ -5,7 +5,7 @@
 		</header>
 		<ul>
 			{{#each issues}}
-				<li>
+				<li class="isopen-{{isopen}}">
 					<aside class="pack-end">
 						{{user.name}}
 					</aside>
@@ -21,4 +21,7 @@
 			{{/each}}
 		</ul>
 	</section>
-</div>
+</div>
+<script>
+	$('.isopen-0').hide();
+</script>

+ 0 - 1
data/pages/login.template

@@ -23,7 +23,6 @@
 				apiCall(data,function(d){
 					if(!exists(d.error) && exists(d.key)){
 						setKey(d.key);
-						notify('login','You have logged in successfully');
 						back(true);
 					}else{
 						setKey(null);

+ 1 - 1
data/sidebars/default.template

@@ -46,7 +46,7 @@
 			</li>
 			<li>
 				<a href="#page-messages">
-					Messages
+					Messages <span class="message-count"></span>
 				</a>
 			</li>
 			<li>

+ 0 - 1
index.php

@@ -135,7 +135,6 @@
 					window.screen.lockOrientation('portrait');
 				}
 			})(window,Modernizr);
-			Screen.lockOrientation();
 		</script>
 		<style>
 			@viewport{

+ 1 - 0
install/example.cron

@@ -0,0 +1 @@
+*/5 * * * * wget -q http://your.url.here/api.php?type=action&id=mailqueue > /dev/null 2>&1

+ 30 - 0
install/install.sql

@@ -292,10 +292,40 @@ CREATE TABLE IF NOT EXISTS `activity` (
 --       `users` -> `id`
 --
 
+--
+-- Table structure for table `emails`
+--
+-- Creation: Apr 16, 2014 at 05:35 PM
+--
+
+DROP TABLE IF EXISTS `emails`;
+CREATE TABLE IF NOT EXISTS `emails` (
+  `id` int(100) NOT NULL AUTO_INCREMENT,
+  `to_id` int(100) NOT NULL,
+  `subject` varchar(4000) NOT NULL,
+  `template` varchar(4000) NOT NULL,
+  `context` text NOT NULL,
+  `failed` tinyint(1) NOT NULL DEFAULT '0',
+  PRIMARY KEY (`id`),
+  KEY `to_id` (`to_id`)
+) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;
+
+--
+-- RELATIONS FOR TABLE `emails`:
+--   `to_id`
+--       `users` -> `id`
+--
+
 --
 -- Constraints for dumped tables
 --
 
+--
+-- Constraints for table `emails`
+--
+ALTER TABLE `emails`
+  ADD CONSTRAINT `emails_ibfk_1` FOREIGN KEY (`to_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
+
 --
 -- Constraints for table `activity`
 --

+ 2 - 1
js/index.js

@@ -137,6 +137,7 @@
 							callback(d);
 						}catch(e){
 							error(e);
+							console.log(callback+'');
 						}
 					}
 				},'json');
@@ -777,7 +778,7 @@
 										loadState('page-messages');
 									});
 								}
-								$('.topbar-notifications').css('display',d.count>0?'block':'').text('('+d.count+')');
+								$('.message-count').text(d.count>0?'('+d.count+')':'');
 								$.localStorage('last_pm_check',d.timestamp);
 							}
 							setTimeout(notifications,5*1000); // every 5 seconds

+ 40 - 0
php/issue.php

@@ -9,6 +9,8 @@
 				$issue = $res->fetch_assoc();
 				$issue['user'] = userObj($issue['user']);
 				$issue['comments'] = messages($issue['id'],'issue');
+				$issue['statuses'] = possibleStatuses();
+				$issue['priorities'] = possiblePriorities();
 				return $issue;
 			}
 		}
@@ -42,4 +44,42 @@
 		}
 		return false;
 	}
+	function possibleStatuses(){
+		$ret = array();
+		if($res = query("SELECT id,name FROM `statuses` ORDER BY id")){
+			while($status = $res->fetch_assoc()){
+				array_push($ret,$status);
+			}
+		}
+		return $ret;
+	}
+	function possiblePriorities(){
+		$ret = array();
+		if($res = query("SELECT id,name,color FROM `priorities` ORDER BY id")){
+			while($priority = $res->fetch_assoc()){
+				array_push($ret,$priority);
+			}
+		}
+		return $ret;
+	}
+	function setStatus($id,$sid){
+		return query("UPDATE `issues` SET st_id = %d WHERE id = %d",array($sid,$id)) !== false;
+	}
+	function setPriority($id,$pid){
+		return query("UPDATE `issues` SET pr_id = %d WHERE id = %d",array($pid,$id)) !== false;
+	}
+	function statusName($id){
+		if($res = query("SELECT name FROM `statuses` WHERE id = %d",array($id))){
+			$res = $res->fetch_assoc();
+			return $res['name'];
+		}
+		return '(none)';
+	}
+	function priorityName($id){
+		if($res = query("SELECT name FROM `proiorities` WHERE id = %d",array($id))){
+			$res = $res->fetch_assoc();
+			return $res['name'];
+		}
+		return '(none)';
+	}
 ?>