$(document).on('#left', 'input', setTeamUser); window.waitDom('.picker-box [name=assignedTo]', function() { if(taskMode == 'linear' || taskMode == 'multi') { $('#multiple').trigger('click'); updateAssignedTo(); computeTotalLeft(); } }); window.manageTeam = function() { const showTeam = $('#multiple').is(":checked"); let $assignedToPicker = $('[name=assignedTo]').zui('picker'); $assignedToPicker.$.setValue(''); $assignedToPicker.render({items: teamItems, disabled: showTeam}); $('.multi-append').empty(); $('.member-done').find('input[name^=teamLeft]').val(0); $('#left').val(''); if(showTeam) { $('#left').attr('readonly', true); $('.team-group').removeClass('hidden'); } else { $('#left').removeAttr('readonly'); $('.team-group').addClass('hidden'); } if(taskMode == 'multi') disableMembers(); } /** * 设置团队成员。 * Set team members. * * @access public * @return void */ function setTeamUser() { $('.multi-append').empty(); const assignedTo = $('[name=assignedTo]').val(); const estimate = parseInt($('#left').val()); if(!assignedTo || !estimate) return; if(taskMode == 'multi') { $('.member-done').each(function() { if($(this).find('[name^team]').val() == assignedTo) $(this).find('input[name^=teamLeft]').val(estimate); }); } else { let teamLine = ''; teamLine += ''; teamLine += ''; teamLine += ''; teamLine += ''; $('.multi-append').html(teamLine); } } /** * 检查团队成员数量。 * Check the number of team members. * * @access public * @return void */ $(document).off('click', '#confirmButton').on('click', '#confirmButton', function() { let memberCount = ''; let totalEstimate = 0; let totalConsumed = oldConsumed; let totalLeft = 0; let error = false; $('.picker-box [name^=team]').each(function() { if($(this).val() == '') return; memberCount++; let $tr = $(this).closest('tr'); let account = $tr.find('.picker-single-selection').text(); let estimate = parseFloat($tr.find('[name^=teamEstimate]').val()); if(!isNaN(estimate)) totalEstimate += estimate; if($tr.hasClass('member-wait') && (isNaN(estimate) || estimate <= 0)) { zui.Modal.alert(account + ' ' + estimateNotEmpty); error = true; return false; } let consumed = parseFloat($tr.find('[name^=teamConsumed]').val()); if(!isNaN(consumed)) totalConsumed += consumed; let $left = $tr.find('[name^=teamLeft]'); let left = parseFloat($left.val()); if(!isNaN(left)) totalLeft += left; if(!$left.prop('readonly') && $tr.hasClass('member-wait') && (isNaN(left) || left <= 0)) { zui.Modal.alert(account + ' ' + leftNotEmpty); error = true; return false; } }); if(error) return false; if(memberCount < 2) { zui.Modal.alert(teamMemberError); return false; } $('#left').val(totalLeft); updateAssignedTo(); zui.Modal.hide(); }); /** * 更新指派人。 * Update assignedTo. * * @access public * @return void */ function updateAssignedTo() { const multiple = $('#multiple').is(":checked"); let assignedTo = $('[name=assignedTo]').val(); let $assignedToPicker = $('[name=assignedTo]').zui('picker'); if(multiple) { let isTeamMember = false; let mode = $('#mode').val(); let assignedToItems = new Array(); let index = 0; $('.picker-box [name^=team]').each(function() { let $tr = $(this).closest('tr'); let realName = $tr.find('.picker-single-selection').text(); if(realName == '') return; let account = $(this).val(); assignedToItems[index] = {'value': account, 'text': realName}; index ++; }); if(multiple && mode == 'linear' && $('#modalTeam tr.member-doing').length == 0 && $('#modalTeam tr.member-wait').length >= 1) { index --; assignedTo = assignedToItems.includes(index) ? assignedToItems[index].value : ''; } $assignedToPicker.render({items: assignedToItems, disabled: true}); } else { $assignedToPicker.render({items: memberItems}); } $assignedToPicker.$.setValue(assignedTo); } function computeTotalLeft() { let totalLeft = 0; $('tr.member').each(function() { let $leftBox = $(this).find('[name^=teamLeft]'); let left = parseFloat($leftBox.val()); if(!isNaN(left)) totalLeft += left; }); $('#left').val(totalLeft); } $('#teamTable').on('change', '.picker-box [name^=team]', function() { disableMembers(); let $teamSource = $(this).siblings('[name^=teamSource]'); if($teamSource.val() == '') return; let $tr = $(this).closest('tr'); let consumed = 0; let estimate = $tr.attr('data-left');; if($(this).val() == $teamSource.val()) { consumed = $tr.attr('data-consumed'); estimate = $tr.attr('data-estimate'); } $tr.find('[name^=teamConsumed]').val(consumed); $tr.find('[name^=teamEstimate]').val(estimate); }); window.clickSubmit = function() { if(isMultiple) { var multiple = $('#multiple').is(":checked"); if(!multiple) { var assignedTo = $('[name=assignedTo]').val(); if(!assignedTo) { zui.Modal.alert(teamNotEmpty); return false; } } var estimate = parseFloat($('#left').val()); if(isNaN(estimate) || estimate <= 0) { zui.Modal.alert(multiple ? teamLeftEmpty : leftNotEmpty); return false; } $('#assignedTo').val(''); } } window.renderRowData = function($row, index, row) { $row.addClass('member member-' + (row ? row.status : 'wait')); $row.attr('data-estimate', row ? row.teamEstimate : 0); $row.attr('data-consumed', row ? row.teamConsumed : 0); $row.attr('data-left', row ? row.teamLeft : 0); if(row && row.memberDisabled) { $row.find('[data-name=team]').find('.picker-box').on('inited', function(e, info) { const $team = info[0]; $team.render({disabled: true}); }) $row.find('[data-name=ACTIONS]').find('[data-type=delete]').remove(); } if(row && row.hourDisabled) { $row.find('[name^=teamEstimate]').attr('readonly', 'readonly'); $row.find('[name^=teamLeft]').attr('readonly', 'readonly'); } $row.find('[name^=teamConsumed]').attr('readonly', 'readonly'); $row.find('[data-name=id]').addClass('center').html("" + $row.find('[data-name=id]').text() + ""); }