Name

global.PlannedTaskStateManagement

Description

No description available

Script

var PlannedTaskStateManagement = Class.create();
PlannedTaskStateManagement.Rank = {};
PlannedTaskStateManagement.Rank['undefined'] = 0;
PlannedTaskStateManagement.Rank[PlannedTaskStateUtil.PENDING_STATES] = 1;
PlannedTaskStateManagement.Rank[PlannedTaskStateUtil.OPEN_STATES] = 2;
PlannedTaskStateManagement.Rank[PlannedTaskStateUtil.WORK_IN_PROGRESS] = 3;
PlannedTaskStateManagement.Rank[PlannedTaskStateUtil.CLOSE_STATES] = 4;


PlannedTaskStateManagement.prototype = {
  initialize: function(task, topTask, siblings) {
  	this.task = task;
  	this.topTask = topTask;
  	if ( JSUtil.nil(siblings) ) {
  		this.siblings = function() {
  			var nexter = {};
  			nexter.next = function() { return false; };
  			return nexter;
  		};					
  	}
  	else
  		this.siblings = siblings;
  	this.topTaskStateUtil = new PlannedTaskStateUtil(this.topTask);
  	this.topTaskBucket = this.topTaskStateUtil.getBucketForState(this.topTask.state);
  	this.taskStates = {};
  },
  
  manageStateChange: function(isDeleted) {
  	if ( isDeleted )
  		return this._manageStateChangeDeletedTask();
  	else {
  		return this._manageStateChangeTask();
  	}
  },
  
  _manageStateChangeTask: function() {
  	var eventualBucket;
  	var stateUtil = new PlannedTaskStateUtil(this.task);
  	this.taskBucket = stateUtil.getBucketForState(this.task.state);
  	if ( this.task.state == this.topTask.state && this.taskBucket == this.topTaskBucket ) {
  		return this.topTask.state;
  	}
  	if ( this.taskBucket == this.topTaskBucket ) {
  		if ( this.topTaskStateUtil.isDefaultState(this.topTask.state) )
  			return this.topTask.state;
  	}
  	
  	eventualBucket = this.taskBucket;
  	return this._findState(eventualBucket, false);
  },
  
  _manageStateChangeDeletedTask: function() {
  	var eventualBucket = "undefined";//this.topTaskBucket;
  	return this._findState(eventualBucket, true);
  },
  
  _findState: function(eventualBucket, isDeleted) {		
  	var siblingRecords = this.siblings.call();
  	var taskStateUtil, bucket, openTasksExists = false, hasSiblings = false;
  	while ( siblingRecords.next() ) {
  		hasSiblings = true;
  		taskStateUtil = new PlannedTaskStateUtil(siblingRecords);
  		bucket = taskStateUtil.getBucketForState(siblingRecords.state);
  		if ( bucket != PlannedTaskStateUtil.CLOSE_STATES )
  			openTasksExists = true;
  		if ( this.rank(bucket) > this.rank(eventualBucket) )
  			eventualBucket = bucket;
  		this.pushTaskStates(bucket, siblingRecords.getValue('state'));
  	}
  	if ( !isDeleted && !openTasksExists ) { //there are no open tasks, make sure the input task is open
  		if ( this.taskBucket != PlannedTaskStateUtil.CLOSE_STATES )
  			openTasksExists = true;
  	} 
  				
  	if ( !isDeleted && !hasSiblings ) //new node is inserted
  		eventualBucket = this.taskBucket;
  	
  	if ( isDeleted && !hasSiblings ) //the only task is deleted
  		eventualBucket = this.topTaskBucket;

  	if ( eventualBucket == PlannedTaskStateUtil.CLOSE_STATES && openTasksExists ) //reset to WIP if there are openTasks
  		eventualBucket = PlannedTaskStateUtil.WORK_IN_PROGRESS;
  	
  	if ( !isDeleted ) 
  		this.pushTaskStates(this.taskBucket, this.task.getValue('state'));		
  	return this.getEventualState(eventualBucket);		
  },
  	
  rank: function(bucket) {
  	return PlannedTaskStateManagement.Rank[bucket];
  },
  
  pushTaskStates: function(bucket, state) {
  	if ( this.taskStates[bucket] == undefined )
  		this.taskStates[bucket] = [];
  	if ( this.taskStates[bucket].indexOf(state) < 0 )
  		this.taskStates[bucket].push(state);
  },
  
  getEventualState: function(bucket) {
  	if ( this.taskStates[bucket] == undefined ) {
  		return this.topTaskStateUtil.getDefaultStateForBucket(bucket);
  	}
  	var states = this.taskStates[bucket];
  	if ( states.length == 1 )
  		return this.topTaskStateUtil.getValidStateForBucket(bucket, states[0]);
  	else
  		return this.topTaskStateUtil.getDefaultStateForBucket(bucket);
  },
  
  

  type: 'PlannedTaskStateManagement'
};

Sys ID

bb7bda4e37311200455726877e41f145

Offical Documentation

Official Docs: