184 lines
5.8 KiB
JavaScript
184 lines
5.8 KiB
JavaScript
/**
|
|
* Process kanban data
|
|
* @param {string} key Kanban key, used as kanban id
|
|
* @param {Object} programsData Programs data
|
|
* @returns {Object} kanban data
|
|
*/
|
|
function processKanbanData(key, programsData)
|
|
{
|
|
var kanbanId = key;
|
|
|
|
/* Generate columns */
|
|
var columns = [];
|
|
var hasDoingProject = false;
|
|
var executionsCol;
|
|
$.each(kanbanColumns, function(_, column)
|
|
{
|
|
var colType = column.type;
|
|
if(colType === 'doingProject') hasDoingProject = true;
|
|
column = $.extend({}, column,
|
|
{
|
|
kanban: kanbanId,
|
|
id: kanbanId + '-' + colType,
|
|
parentType: (hasDoingProject && (colType === 'doingProject' || colType === 'doingExecution')) ? 'doing' : false,
|
|
});
|
|
|
|
if(colType === 'doingProject')
|
|
{
|
|
columns.push(
|
|
{
|
|
kanban: kanbanId,
|
|
id: kanbanId + '-doing',
|
|
type: 'doing',
|
|
asParent: true,
|
|
name: doingText,
|
|
count: ''
|
|
});
|
|
}
|
|
else if(colType === 'doingExecution')
|
|
{
|
|
executionsCol = column;
|
|
executionsCol.count = 0;
|
|
}
|
|
columns.push(column);
|
|
});
|
|
|
|
/* Format lanes data */
|
|
var lanes = [];
|
|
$.each(programsData, function(programId, programProducts)
|
|
{
|
|
var subLanes = [];
|
|
programProducts.forEach(function(productID)
|
|
{
|
|
var product = productList[productID];
|
|
var items = {};
|
|
|
|
/* unclosed products */
|
|
var productItem = {id: 'product-' + productID, _id: productID, name: product.name};
|
|
items.unclosedProduct = [productItem];
|
|
|
|
/* plans */
|
|
items.unexpiredPlan = [];
|
|
var plans = planList[productID];
|
|
if(plans)
|
|
{
|
|
$.each(plans, function(planID, plan)
|
|
{
|
|
items.unexpiredPlan.push($.extend({}, plan, {id: 'plan-' + planID, _id: planID}));
|
|
});
|
|
}
|
|
|
|
/* doing projects */
|
|
if(hasDoingProject)
|
|
{
|
|
items.doingProject = [];
|
|
var productProjects = projectProduct[productID];
|
|
if(productProjects)
|
|
{
|
|
$.each(productProjects, function(projectID)
|
|
{
|
|
var project = projectList[projectID];
|
|
if(!project || !project.id) return;
|
|
var projectItem = $.extend({}, project, {id: 'project-' + projectID, _id: projectID});
|
|
items.doingProject.push(projectItem);
|
|
|
|
var execution = latestExecutions[projectID];
|
|
if(!execution || !execution.id) return;
|
|
|
|
executionsCol.count++;
|
|
projectItem.execution = $.extend({}, execution, {id: 'execution-' + execution.id, _id: execution.id});
|
|
});
|
|
}
|
|
}
|
|
else
|
|
{
|
|
/* doing execution */
|
|
items.doingExecution = [];
|
|
var productExecutions = classicExecution[productID];
|
|
if(productExecutions)
|
|
{
|
|
$.each(productExecutions, function(_, execution)
|
|
{
|
|
if(!execution || !execution.id) return;
|
|
var executionID = execution.id;
|
|
var executionItem = $.extend({}, execution, {id: 'execution-' + executionID, _id: executionID});
|
|
items.doingExecution.push(executionItem);
|
|
});
|
|
}
|
|
}
|
|
|
|
|
|
/* normal release */
|
|
items.normalRelease = [];
|
|
var releases = releaseList[productID];
|
|
if(releases)
|
|
{
|
|
$.each(releases, function(releaseID, release)
|
|
{
|
|
if(!release || !release.id) return;
|
|
var releaseItem = $.extend({}, release, {id: 'release-' + releaseID, _id: releaseID});
|
|
items.normalRelease.push(releaseItem);
|
|
});
|
|
}
|
|
|
|
subLanes.push({id: kanbanId + '-' + programId + '-' + productID, items: items});
|
|
});
|
|
|
|
var programName = programList[programId];
|
|
if(programName === undefined) programName = '(' + programId + ')';
|
|
lanes.push({id: programId, kanban: kanbanId, name: programName, subLanes: subLanes});
|
|
});
|
|
|
|
return {id: kanbanId, columns: columns, lanes: lanes};
|
|
}
|
|
|
|
/** Calculate column height */
|
|
function calcColHeight(col, lane, colCards, colHeight)
|
|
{
|
|
if (col.type !== 'doingProject') return colHeight;
|
|
return colCards.length * 62;
|
|
}
|
|
|
|
/**
|
|
* Init kanban.
|
|
*
|
|
* @access public
|
|
* @return void
|
|
*/
|
|
function initKanban()
|
|
{
|
|
$.each(kanbanList, function(key, programsData)
|
|
{
|
|
var $kanban = $('#kanban-' + key);
|
|
if(!$kanban.length) return;
|
|
var data = processKanbanData(key, programsData);
|
|
$kanban.kanban(
|
|
{
|
|
data: data,
|
|
noLaneName: isLightMode,
|
|
virtualize: true,
|
|
virtualCardList: true,
|
|
calcColHeight: calcColHeight
|
|
});
|
|
});
|
|
}
|
|
|
|
$(function()
|
|
{
|
|
/* Init all kanbans */
|
|
initKanban();
|
|
|
|
$('#showAllProjects').click(function()
|
|
{
|
|
var showAllProjects = $(this).prop('checked') ? 1 : 0;
|
|
$.post(createLink('product', 'ajaxSetShowSetting'), {"showAllProjects": showAllProjects}, function()
|
|
{
|
|
$.get(createLink('product', 'kanban'), function(data)
|
|
{
|
|
$('#kanbanList').html($(data).find('#kanbanList').html());
|
|
initKanban();
|
|
});
|
|
})
|
|
})
|
|
});
|