diff --git a/module/execution/js/kanban.js b/module/execution/js/kanban.js index 4d3d5c24e2..e99ac05c25 100644 --- a/module/execution/js/kanban.js +++ b/module/execution/js/kanban.js @@ -58,12 +58,23 @@ function renderStoryItem(item, $item, col) ].join('')); if(item.assignedTo) $infos.append(renderUserAvatar(item.assignedTo)); + var $actions = $item.find('.actions'); + if(!$actions.length) + { + $actions = $([ + '
', + '', + '', + '', + '
' + ].join('')).appendTo($item); + } + $item.attr('data-type', 'story').addClass('kanban-item-story'); return $item; } - /** * Render bug item 提供方法渲染看板中的 Bug 卡片 * @param {Object} item Bug item object @@ -96,6 +107,18 @@ function renderBugItem(item, $item, col) if(item.deadline) $infos.append(renderDeadline(item.deadline)); if(item.assignedTo) $infos.append(renderUserAvatar(item.assignedTo)); + var $actions = $item.find('.actions'); + if(!$actions.length) + { + $actions = $([ + '
', + '', + '', + '', + '
' + ].join('')).appendTo($item); + } + $item.attr('data-type', 'bug').addClass('kanban-item-bug'); return $item; @@ -133,13 +156,24 @@ function renderTaskItem(item, $item, col) if(item.deadline) $infos.append(renderDeadline(item.deadline)); if(item.assignedTo) $infos.append(renderUserAvatar(item.assignedTo)); + var $actions = $item.find('.actions'); + if(!$actions.length) + { + $actions = $([ + '
', + '', + '', + '', + '
' + ].join('')).appendTo($item); + } + $item.attr('data-type', 'task').addClass('kanban-item-task'); return $item; } /* Add column renderer/ 添加特定列类型或列条目类型渲染方法 */ -/* Add column renderer/ 添加特定列类型或列卡片类型渲染方法 */ addColumnRenderer('story', renderStoryItem); addColumnRenderer('bug', renderBugItem); addColumnRenderer('task', renderTaskItem); @@ -157,6 +191,63 @@ function renderColumnCount($count, count, col) $count.html(text + ''); } +/** + * Render header column 渲染看板列头部 + * @param {JQuery} $col Header column element + * @param {Object} col Header column object + * @param {JQuery} $header Header element + * @param {Object} kanban Kanban object + */ +function renderHeaderCol($col, col, $header, kanban) +{ + if(col.asParent) $col = $col.children('.kanban-header-col'); + if(!$col.children('.actions').length) + { + var $actions = $('
'); + if(col.type === 'blacklog' || col.type === 'wait') + { + $actions.append([ + '', + '', + '' + ].join('')); + } + $actions.append([ + '', + '', + '' + ].join('')); + $actions.appendTo($col); + } +} + +/** + * Render lane name 渲染看板泳道名称 + * @param {JQuery} $name Name element + * @param {Object} lane Lane object + * @param {JQuery} $kanban $kanban element + * @param {Object} columns Kanban columns + * @param {Object} kanban Kanban object + */ +function renderLaneName($name, lane, $kanban, columns, kanban) +{ + if(!$name.children('.actions').length) + { + $([ + '
', + '', + '', + '', + '
' + ].join('')).appendTo($name); + } +} + +function renderCardsCount($count, count, col) +{ + console.log('renderCardsCount', {$count, count, col}); +} + /** * Updata kanban data * 更新看板上的数据 @@ -318,6 +409,106 @@ function handleFinishDrop(event) $('#kanbans').find('.can-drop-here').removeClass('can-drop-here'); } +/** + * Handle sort cards in column 处理对列卡片进行排序 + */ +function handleSortColCards() +{ + /* TODO: handle sort cards from column contextmenu */ +} + +/** + * Create column menu 创建列操作菜单 + * @returns {Object[]} + */ +function createColumnMenu(options) +{ + var $col = options.$trigger.closest('.kanban-col'); + var col = $col.data('col'); + var kanbanID = options.kanban; + var items = + [ + {label: '编辑名称', url: $.createLink('kanban', 'editcolname', 'col=' + col.id + '&kanban=' + kanbanID), className: 'iframe'}, + {label: '在制品数目', url: $.createLink('kanban', 'editcolwip'), className: 'iframe'}, + {label: '看板卡片排序', items: ['按ID倒序', '按ID顺序'], className: 'iframe', onClick: handleSortColCards}, + ]; + return items; +} + +/** + * Create column create button menu 创建列添加按钮操作菜单 + * @returns {Object[]} + */ +function createColumnCreateMenu(options) +{ + var $col = options.$trigger.closest('.kanban-col'); + var col = $col.data('col'); + var items = + [ + {label: '创建', url: $.createLink(col.kanban, 'create'), className: 'iframe'}, + {label: '批量创建', url: $.createLink(col.kanban, 'batchcreate'), className: 'iframe'}, + ]; + return items; +} + +/** + * Create lane menu 创建泳道操作菜单 + * @returns {Object[]} + */ +function createLaneMenu(options) +{ + var $lane = options.$trigger.closest('.kanban-lane'); + var $kanban = $lane.closest('.kanban'); + var lane = $lane.data('lane'); + var kanbanID = options.kanban; + var items = + [ + {label: '泳道设置', icon: 'edit', url: $.createLink('kanban', 'laneedit', 'lane=' + lane.id + '&kanban=' + kanbanID), className: 'iframe'}, + {label: '泳道上移', icon: 'arrow-up', url: $.createLink('kanban', 'lanemove', 'direction=up&lane=' + lane.id + '&kanban=' + kanbanID), className: 'iframe', disabled: !$kanban.prev('.kanban').length}, + {label: '泳道下移', icon: 'arrow-down', url: $.createLink('kanban', 'lanemove', 'direction=down&lane=' + lane.id + '&kanban=' + kanbanID), className: 'iframe', disabled: !$kanban.next('.kanban').length}, + ]; + var bounds = options.$trigger[0].getBoundingClientRect(); + items.$options = {x: bounds.right, y: bounds.top}; + return items; +} + +/** + * Create story menu 创建需求卡片操作菜单 + * @returns {Object[]} + */ +function createStoryMenu(options) +{ + var $card = options.$trigger.closest('.kanban-item'); + var story = $card.data('item'); + var items = + [ + {label: '编辑需求', icon: 'edit', url: $.createLink('story', 'edit', 'storyID=' + story.id), className: 'iframe'}, + {label: '变更需求', icon: 'change', url: $.createLink('story', 'change', 'storyID=' + story.id), className: 'iframe'}, + {label: '移除需求', icon: 'unlink', url: $.createLink('story', 'unlink', 'storyID=' + story.id), className: 'iframe'}, + {label: '分解任务', icon: 'plus', url: $.createLink('task', 'create', 'storyID=' + story.id), className: 'iframe'}, + {label: '批量分解', icon: 'pluses', url: $.createLink('task', 'batchCreate', 'storyID=' + story.id), className: 'iframe'}, + ]; + return items; +} + +/** + * Create bug menu 创建 Bug 卡片操作菜单 + * @returns {Object[]} + */ +function createBugMenu(options) +{ + var $card = options.$trigger.closest('.kanban-item'); + var bug = $card.data('item'); + var items = + [ + {label: '编辑Bug', icon: 'edit', url: $.createLink('bug', 'edit', 'bugID=' + bug.id), className: 'iframe'}, + {label: '确认Bug', icon: 'ok', url: $.createLink('bug', 'confirm', 'bugID=' + bug.id), className: 'iframe'}, + {label: '复制Bug', icon: 'copy', url: $.createLink('bug', 'copy', 'bugID=' + bug.id), className: 'iframe'}, + {label: '转软件需求', icon: 'lightbulb', url: $.createLink('story', 'create', 'bugID=' + bug.id), className: 'iframe'}, + ]; + return items; +} + /** * Create task menu 创建任务卡片操作菜单 * @returns {Object[]} @@ -373,7 +564,6 @@ $(function() showCount: true, showZeroCount: true, fluidBoardWidth: true, - countRender: renderColumnCount, droppable: { target: findDropColumns, @@ -381,7 +571,8 @@ $(function() mouseButton: 'left' }, onRenderHeaderCol: renderHeaderCol, - onRenderLaneName: renderLaneName + onRenderLaneName: renderLaneName, + onRenderCount: renderColumnCount }; /* Create story kanban 创建需求看板 */