| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| /** |
| * The Task class |
| * This is the model used to work with tasks |
| */ |
| function Task(id,name,status,assigned){ |
| this.task_id = id; |
| this.name = name; |
| this.status = status; |
| this.assigned_to = assigned; |
| } |
| |
| //// Instance Task methods |
| |
| // Save task |
| Task.prototype.save = function(){ |
| wave.getState().submitValue(this.task_id, JSON.stringify(this)); |
| } |
| // Get the person the task is assigned to |
| Task.prototype.getUser = function(){ |
| var user = {}; |
| // Unassigned |
| if (this.assigned_to == "unassigned"){ |
| user.username="unassigned"; |
| user.thumbnail="noone.png"; |
| return user; |
| } |
| // Known participant |
| var participants = wave.getParticipants(); |
| var participant = null; |
| for (key in participants){ |
| if (participants[key].getId() == this.assigned_to){ |
| participant = participants[key]; |
| } |
| } |
| if (participant != null){ |
| user.id = participant.getId(); |
| user.username = participant.getDisplayName(); |
| user.thumbnail = participant.getThumbnailUrl(); |
| } |
| // Unknown participant |
| if (user.username == null || user.username == ""){ |
| user.username = "anonymouse"; |
| user.id = "anonymous"; |
| } |
| // Default thumbnail image |
| if (user.thumbnail == "" || user.thumbnail == null || user.thumbnail == "http://fixme.org/thumbnail"){ |
| user.thumbnail = "anon.png"; |
| } |
| return user; |
| } |
| |
| //// Static Task methods |
| |
| // The delimiter used for the data |
| Task.delimiter = "||||"; |
| |
| |
| // Private method for creating new task from state info |
| Task.create = function(json){ |
| var obj = JSON.parse(json); |
| var task = new Task(obj.task_id, obj.name,obj.status,obj.assigned_to); |
| return task; |
| } |
| |
| // Find a task |
| Task.find = function(task_id){ |
| var keys = wave.getState().getKeys(); |
| for (var i = 0; i < keys.length; i++) {
|
| var key = keys[i]; |
| if (key == task_id){ |
| return Task.create(wave.getState().get(key)); |
| } |
| } |
| return null; |
| } |
| |
| // Find all tasks |
| Task.findAll = function(){ |
| var tasks = {}; |
| var keys = wave.getState().getKeys(); |
| for (var i = 0; i < keys.length; i++) {
|
| var key = keys[i]; |
| var task = Task.create(wave.getState().get(key)); |
| tasks[key] = task; |
| } |
| return tasks; |
| } |
| |
| // Make a guid for a new task |
| Task.guid = function(){ |
| var uid = function() {return (((1+Math.random())*0x10000)|0).toString(16).substring(1);} |
| return uid()+uid()+"-"+uid()+"-"+uid()+"-"+uid()+"-"+uid()+uid()+uid(); |
| } |
| |
| /** |
| * The Controller object |
| * This is used to wire up the view and model with actions |
| */ |
| var Controller = { |
| |
| // Action handlers |
| |
| // Toggle task state between completed and to-do |
| toggleTask: function(task_id){ |
| var task = Task.find(task_id); |
| if (task.status == "completed"){ |
| task.status = "todo"; |
| } else { |
| task.status = "completed"; |
| } |
| task.save(); |
| }, |
| |
| // Create a new task |
| newTask: function(){ |
| var task_title = document.getElementById('taskinput').value; |
| var task_id = Task.guid(); |
| var task = new Task(task_id,task_title, "todo", "unassigned"); |
| task.save(); |
| }, |
| |
| // Abandon task for someone else to do |
| abandonTask: function(task_id){ |
| var task = Task.find(task_id); |
| task.assigned_to = "unassigned"; |
| task.save(); |
| }, |
| |
| // Claim a task (assign to self) |
| claimTask: function(task_id){ |
| var task = Task.find(task_id); |
| task.assigned_to = Controller.user.id; |
| task.save(); |
| }, |
| |
| // Event handlers |
| |
| // Update the view when state has been updated |
| stateUpdated: function(){ |
| var tasks = Task.findAll(); |
| if (tasks && tasks != null){ |
| var tasklist = ""; |
| for (key in tasks) { |
| var task = tasks[key]; |
| // Which button to show depends on task status and user id |
| if (task.assigned_to == Controller.user.id){ |
| var task_button = "<img class=\"status\" src=\""+task.status+".png\" onclick=\"Controller.toggleTask('"+key+"')\"/>"; |
| } else { |
| var task_button = "<img class=\"status\" src=\""+task.status+".png\"/>"; |
| } |
| // Task title |
| var name = "<div class=\"taskname\">"+task.name+"</div>"; |
| // Which action to show (claim, abandon, none) depends on who owns the task |
| var task_action = ""; |
| if (task.assigned_to == "unassigned") |
| task_action = "<img class=\"action\" src=\"plus.png\" onclick=\"Controller.claimTask('"+key+"')\"/>"; |
| if (task.assigned_to == Controller.user.id && task.status == "todo") |
| task_action = "<img class=\"action\" src=\"minus.png\" onclick=\"Controller.abandonTask('"+key+"')\"/>"; |
| // Task owner |
| var owner = task.getUser(); |
| var task_owner = "<div class=\"taskowner\">"+owner.username+"</div>"; |
| var task_icon = "<img class=\"user\" src=\""+owner.thumbnail+"\"/>"; |
| tasklist = "<div class=\"task\">"+task_button+name+task_action+task_owner+task_icon+ "</div>" + tasklist; |
| } |
| dwr.util.setValue("tasklist", tasklist, { escapeHtml:false }); |
| } |
| }, |
| |
| participantsUpdated: function(){ |
| Controller.updateUser(); |
| }, |
| |
| init: function(){ |
| Controller.participantsUpdated(); |
| Controller.stateUpdated(); |
| /** |
| * Register the event handlers with the Wave feature |
| */ |
| wave.setStateCallback(Controller.stateUpdated); |
| wave.setParticipantCallback(Controller.participantsUpdated); |
| }, |
| /** |
| * Setup user information |
| */ |
| user: {}, |
| updateUser:function(){ |
| if (wave.getViewer() != null){ |
| Controller.user.id = wave.getViewer().getId(); |
| Controller.user.username = wave.getViewer().getDisplayName(); |
| Controller.user.thumbnail = wave.getViewer().getThumbnailUrl(); |
| } |
| if (Controller.user.thumbnail == "" || Controller.user.thumbnail == null) Controller.user.thumbnail = "anon.png"; |
| if (Controller.user.username == null || Controller.user.username == ""){ |
| Controller.user.username = "anonymouse"; |
| Controller.user.id = "anonymous"; |
| } |
| } |
| } |