2023-05-16 10:47:08 +08:00

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();
});
})
})
});