From 556d3ac9fe8b57922874237c0106d88979680ee3 Mon Sep 17 00:00:00 2001 From: wangyuting Date: Mon, 7 Aug 2023 13:40:04 +0800 Subject: [PATCH] * Add mergeprogram zin page. --- module/upgrade/js/mergeprogram.ui.js | 1211 ++++++++++++++++++++++ module/upgrade/ui/createprogram.html.php | 120 +++ module/upgrade/ui/mergebyline.html.php | 16 + module/upgrade/ui/mergebysprint.html.php | 16 + module/upgrade/ui/mergeprogram.html.php | 40 + 5 files changed, 1403 insertions(+) create mode 100644 module/upgrade/js/mergeprogram.ui.js create mode 100644 module/upgrade/ui/createprogram.html.php create mode 100644 module/upgrade/ui/mergebyline.html.php create mode 100644 module/upgrade/ui/mergebysprint.html.php create mode 100644 module/upgrade/ui/mergeprogram.html.php diff --git a/module/upgrade/js/mergeprogram.ui.js b/module/upgrade/js/mergeprogram.ui.js new file mode 100644 index 0000000000..b5e7909ad1 --- /dev/null +++ b/module/upgrade/js/mergeprogram.ui.js @@ -0,0 +1,1211 @@ +$(function() +{ + programBegin = $('.programParams #begin').val(); + programEnd = $('.programParams #end').val(); + setProgramBegin(programBegin); + setProgramEnd(programEnd); + setProjectPM(); + + /* Define drag to select relevant parameters. */ + var options = { + selector: 'input', + listenClick: false, + select: function(e) + { + $('[data-id=' + e.id + ']').prop('checked', true); + + var lineID = $('.nav li.currentPage').attr('lineid'); + var checkedLines = true; + var checkedProduct = true; + var checkedProject = true; + var type = $('[data-id=' + e.id + ']').attr('name'); + + /* Select the product line of the current page. */ + if(typeof(type) != 'undefined' && type.indexOf('productLines') != -1) + { + if($('.nav li.currentPage').find('[id^=productLines]').prop('checked')) + { + var lineID = $('.nav li.currentPage').attr('lineid'); + $('#checkAllProducts').prop('checked', true); + $('#checkAllProjects').prop('checked', true); + $("[id^='products\[" + lineID + "\]']").prop('checked', true); + $("[id^='sprints\[" + lineID + "\]'").prop('checked', true); + } + } + + /* All products selected. */ + if(typeof(type) != 'undefined' && type.indexOf('products') != -1) + { + if($('[id^=productLines]').length > 0) + { + var checkedProduct = isSelectAll(lineID, 'product'); + var productID = $('[data-id=' + e.id + ']').val(); + $('[data-product=' + productID +']').prop('checked', true); + if(!$("[id^='productLines\[" + lineID + "\]']").prop('checked')) $("[id^='productLines\[" + lineID + "\]']").prop('checked', true); + var checkedProject = isSelectAll(lineID, 'project'); + } + else + { + var checkedProduct = isSelectAll(0, 'product'); + var productID = $('[data-id=' + e.id + ']').val(); + $('[data-product=' + productID +']').prop('checked', true); + var checkedProject = isSelectAll(0, 'project'); + } + $('#checkAllProducts').prop('checked', checkedProduct); + $('#checkAllProjects').prop('checked', checkedProject); + } + + /* All projects selected. */ + if(typeof(type) != 'undefined' && type.indexOf('sprints') != -1) + { + if($('[id^=productLines]').length > 0) + { + var checkedProject = isSelectAll(lineID, 'project'); + var productID = $('[data-id=' + e.id + ']').attr('data-product'); + if(productID && $('[data-productid=' + productID + ']').length > 0 && !$('[data-productid=' + productID + ']').prop('checked')) + { + $('[data-productid=' + productID + ']').prop('checked', true); + if(!$("[id^='productLines\[" + lineID + "\]']").prop('checked')) $("[id^='productLines\[" + lineID + "\]']").prop('checked', true); + } + } + else if($('[id^=products]').length > 0) + { + var checkedProject = isSelectAll(0, 'project'); + var productID = $('[data-id=' + e.id + ']').attr('data-product'); + if(productID && $('[data-productid=' + productID + ']').length > 0 && !$('[data-productid=' + productID + ']').prop('checked')) $('[data-productid=' + productID + ']').prop('checked', true); + } + else + { + var checkedProject = isSelectAll(0, 'project'); + } + + var checkedProduct = isSelectAll(lineID, 'product'); + $('#checkAllProjects').prop('checked', checkedProject); + $('#checkAllProducts').prop('checked', checkedProduct); + } + + /* All product lines selected. */ + if(typeof(type) != 'undefined' && type.indexOf('productLines') != -1) + { + $('[name^=productLines]').each(function() + { + if(!$(this).prop('checked')) + { + checkedLines = false; + } + else + { + var productLine = $(this).val(); + $('[lineid=' + productLine + ']').addClass('active'); + $("[id^='products\[" + productLine + "\]']").prop('checked', true); + $("[id^='sprints\[" + productLine + "\]']").prop('checked', true); + } + }) + $('#checkAllLines').prop('checked', checkedLines); + } + + var checkAllLines = isSelectAll(0, 'line'); + $("[id='checkAllLines']").prop('checked', checkAllLines); + + setProgramBegin(programBegin); + setProgramEnd(programEnd); + setProjectPM(); + + /* If the project is checked, the relevant form will be displayed according to the selected mode. */ + hiddenProject(); + } + }; + + /* Initialize the drag selected. */ + $('#lineBox').selectable(options); + $('#source').selectable(options); + + $('.side-col .cell').height($('.side-col').height() - 20); + $('#source .cell').height($('#source').height()); + $('#programBox .cell').height($('#programBox').height() - 20); + + /* Select all product line events. */ + $('#checkAllLines').click(function() + { + var checked = true; + if($(this).is(':checked')) + { + $('.main-row .side-col .nav li').addClass('active'); + $('#programName').val($('.main-row .side-col .nav li.currentPage div a').text()); + } + else + { + checked = false; + $('.main-row .side-col .nav li').removeClass('active'); + $('#programName').val(''); + } + + $('#checkAllProducts').prop('checked', checked); + $('#checkAllProjects').prop('checked', checked); + $('[name^=productLines]').prop('checked', checked); + $('[name^=products]').prop('checked', checked); + $('[name^=sprints]').prop('checked', checked); + + setProgramBegin(programBegin); + setProgramEnd(programEnd); + + /* If the project is checked, the relevant form will be displayed according to the selected mode. */ + hiddenProject(); + }) + + /* Select all product events. */ + $('#checkAllProducts').click(function() + { + var lineID = $('li.currentPage').attr('lineid'); + var checked = true; + if($(this).is(':checked')) + { + $('#programName').val($('.main-row .side-col .nav li.currentPage div a').text()); + if($('[id^=productLines]').length > 0) + { + var projectNum = $("[id^='sprints\[" + lineID + "\]']").length; + } + else + { + var projectNum = $("[id^='sprints']").length; + } + if(projectNum !== 0) $('#checkAllProjects').prop('checked', true); + } + else + { + checked = false; + $('#checkAllProjects').prop('checked', false); + $('form #newProgram0').removeAttr('disabled'); + $('#programs').removeAttr('disabled'); + $('#programID').val(''); + $('#programName').val(''); + } + + if($('[id^=productLines]').length > 0) + { + $('[data-line=' + lineID + ']').prop('checked', checked); + $("[id^='productLines\[" + lineID + "\]']").prop('checked', checked); + } + else + { + $('[name^=products]').prop('checked', checked); + $('[name^=sprints]').prop('checked', checked); + + if(checked) + { + $('[name^=products]').each(function() + { + if($(this).prop('checked')) + { + setProgramByProduct($(this)); + return false; + } + }) + } + } + + var checkAllLines = isSelectAll(0, 'line'); + $("[id='checkAllLines']").prop('checked', checkAllLines); + + setProgramBegin(programBegin); + setProgramEnd(programEnd); + + hiddenProject(); + }) + + /* Select all project events. */ + $('#checkAllProjects').click(function() + { + var lineID = $('li.currentPage').attr('lineid'); + var checked = true; + if($(this).is(':checked')) + { + $('#programName').val($('.main-row .side-col .nav li.currentPage div a').text()); + } + else + { + checked = false; + $('#programName').val(''); + } + + $('#checkAllProducts').prop('checked', checked); + if($('[id^=productLines]').length > 0) + { + $('[data-line=' + lineID + ']').prop('checked', checked); + $("[id^='productLines\[" + lineID + "\]']").prop('checked', checked); + } + else + { + $('[name^=products]').prop('checked', checked); + $('[name^=sprints]').prop('checked', checked); + + if(checked) + { + $('[name^=products]').each(function() + { + if($(this).prop('checked')) + { + setProgramByProduct($(this)); + return false; + } + }) + } + } + + var checkAllLines = isSelectAll(0, 'line'); + $("[id='checkAllLines']").prop('checked', checkAllLines); + + setProgramBegin(programBegin); + setProgramEnd(programEnd); + + hiddenProject(); + }) + + /* Select a product line event. */ + $('[name^=productLines]').change(function() + { + var value = $(this).val(); + var hidden = $('#line' + value).is(':hidden'); + if($(this).prop('checked')) + { + if(!hidden) + { + $('#checkAllProducts').prop('checked', true); + $('#checkAllProjects').prop('checked', true); + } + $('[data-line=' + value + ']').prop('checked', true); + $('[lineid=' + value + ']').addClass('active'); + $('#programName').val($("[lineid='" + value + "']").find('a').text()); + } + else + { + $('#checkAllLines').prop('checked', false); + if(!hidden) + { + $('#checkAllProducts').prop('checked', false); + $('#checkAllProjects').prop('checked', false); + } + $('[data-line=' + value + ']').prop('checked', false); + $('[lineid=' + value + ']').removeClass('active'); + $('#programName').val(''); + $('#programStatus').val('wait'); + $('#programStatus').trigger('chosen:updated'); + } + + /* Determine whether all product line buttons are selected. */ + var checked = isSelectAll(0, 'line'); + $('#checkAllLines').prop('checked', checked); + + setProgramBegin(programBegin); + setProgramEnd(programEnd); + + /* If the project is checked, the relevant form will be displayed according to the selected mode. */ + hiddenProject(); + }) + + $('[name^=lines]').change(function() + { + value = $(this).val(); + if($(this).prop('checked')) + { + $('[data-line=' + value + ']').prop('checked', true); + } + else + { + $('[data-line=' + value + ']').prop('checked', false); + } + setProgramBegin(programBegin); + setProgramEnd(programEnd); + setProjectPM(); + }) + + var programOriginEnd = $('#end').val(); + $('#longTime').change(function() + { + if($(this).prop('checked')) + { + programOriginEnd = $('#end').val(); + $('#end').val('').attr('disabled', 'disabled'); + $('#days').val(''); + } + else + { + $('#end').val(programOriginEnd).removeAttr('disabled'); + } + }); + + $('#lineList li a').click(function() + { + if($('#longTime').is(':checked')) + { + $('#longTime').attr('checked', false); + $('#end').removeAttr('disabled'); + } + + var currentLine = $(this).closest('li').attr('lineid'); + + /* Active current li and remove active before li. */ + $(this).closest('li').addClass('active'); + $(this).closest('ul').find('li').removeClass('currentPage'); + $(this).closest('li').addClass('currentPage'); + + $('[id^=productLines]').each(function() + { + var lineID = $(this).val(); + if($("[id^='productLines\[" + lineID +"\]'").prop('checked') || lineID == currentLine) + { + $(this).closest('li').addClass('active'); + } + else + { + $(this).closest('li').removeClass('currentPage'); + $(this).closest('li').removeClass('active'); + } + }) + + /* Show current data and hide before data. */ + var target = $(this).attr('data-target'); + $('.lineBox').addClass('hidden'); + $(target).removeClass('hidden'); + + /* Replace program name. */ + if(!$('#programName').val() && $("[id^='productLines\[" + currentLine +"\]'").prop('checked')) $('#programName').val($(this).text()); + + /* Replace project name. */ + var productID = $(target).find('.lineGroup .productList input[name*="product"]').val(); + var link = createLink('upgrade', 'ajaxGetProductName', 'productID=' + productID); + $.post(link, function(data) + { + $('#projectName').val(data); + }) + + setProgramBegin(programBegin); + setProgramEnd(programEnd); + setProjectPM(); + + /* Determine whether products and projects are selected. */ + if($(this).closest("li").find('[id^=productLines]').prop('checked')) + { + var productLine = $('.nav li.currentPage').attr('lineid'); + var checkedProduct = isSelectAll(productLine, 'product'); + var checkedProject = isSelectAll(productLine, 'project'); + $('#checkAllProducts').prop('checked', checkedProduct); + $('#checkAllProjects').prop('checked', checkedProject); + } + else + { + $('#checkAllProducts').prop('checked', false); + $('#checkAllProjects').prop('checked', false); + } + + /* Determines whether to display an project related form control. */ + hiddenProject(); + }) + + $('[name^=products]').change(function() + { + setProgramByProduct($(this)); + + var checked = true; + var checkedLine = true; + var lineID = $(this).attr('data-line'); + if($('[id^=productLines]').length > 0) + { + var productNum = $("[id^='products\[" + lineID + "\]'").length; + var checkedProductNum = $("[id^='products\[" + lineID + "\]']:checked").length; + + if(productNum > checkedProductNum) checked = false; + if(checkedProductNum > 0) $('[lineid=' + lineID + ']').addClass('active'); + if(checkedProductNum == 0) + { + $('[lineid=' + lineID + ']').removeClass('active'); + checkedLine = false; + } + $("[id^='productLines\[" + lineID + "\]']").prop('checked', checkedLine); + + var checkAllLines = isSelectAll(0, 'line'); + $("[id='checkAllLines']").prop('checked', checkAllLines); + } + else if($('[id^=products]').length > 0) + { + checked = isSelectAll(0, 'product'); + } + + $('#checkAllProducts').prop('checked', checked); + + value = $(this).val(); + if($(this).prop('checked')) + { + $('[data-product=' + value + ']').prop('checked', true) + + if(lineID && $('[data-lineid=' + lineID + ']').length > 0 && !$('[data-lineid=' + lineID + ']').prop('checked')) $('[data-lineid=' + lineID + ']').prop('checked', true); + + $('#programName').val($("[lineid='" + lineID + "']").find('a').text()); + } + else + { + $('[data-product=' + value + ']').prop('checked', false) + $('#programName').val(''); + } + + $('#programStatus').val('wait'); + $('#programStatus').trigger('chosen:updated'); + + var checkedProject = true; + if($('[id^=productLines]').length > 0) + { + checkedProject = isSelectAll(lineID, 'project'); + } + else if($('[id^=products]').length > 0) + { + checkedProject = isSelectAll(0, 'project'); + } + $('#checkAllProjects').prop('checked', checkedProject); + + setProgramBegin(programBegin); + setProgramEnd(programEnd); + setProjectPM(); + + hiddenProject(); + }) + + $('[name^=sprints]').change(function() + { + var lineID = $(this).attr('data-line'); + if($(this).prop('checked')) + { + if(lineID && $('[data-lineid=' + lineID + ']').length > 0 && !$('[data-lineid=' + lineID + ']').prop('checked')) $('[data-lineid=' + lineID + ']').prop('checked', true); + + var productID = $(this).attr('data-product'); + if(productID && $('[data-productid=' + productID + ']').length > 0 && !$('[data-productid=' + productID + ']').prop('checked')) $('[data-productid=' + productID + ']').prop('checked', true); + + $('#programName').val($("[lineid='" + lineID + "']").find('a').text()); + setProgramByProduct($(':checkbox[data-productid=' + productID + ']')); + } + + var checked = true; + var checkedProduct = true; + if($('[id^=productLines]').length > 0) + { + var lineID = $(this).attr('data-line'); + var checkedProductNum = $("[id^='products\[" + lineID + "\]']:checked").length; + var checkedLine = true; + + checked = isSelectAll(lineID, 'project'); + checkedProduct = isSelectAll(lineID, 'product'); + + if(checkedProductNum > 0) $('[lineid=' + lineID + ']').addClass('active'); + if(checkedProductNum == 0) + { + $('[lineid=' + lineID + ']').removeClass('active'); + checkedLine = false; + } + $("[id^='productLines\["+ lineID +"\]").prop('checked', checkedLine); + + var checkAllLines = isSelectAll(0, 'line'); + $("[id='checkAllLines']").prop('checked', checkAllLines); + } + else if($('[id^=products]').length > 0) + { + checked = isSelectAll(0, 'project'); + checkedProduct = isSelectAll(0, 'product'); + } + else if($('[id^=sprints]').length > 0) + { + checked = isSelectAll(0, 'project'); + } + + $('#checkAllProjects').prop('checked', checked); + $('#checkAllProducts').prop('checked', checkedProduct); + + setProgramBegin(programBegin); + setProgramEnd(programEnd); + setProjectPM(); + toggleProgram(); + + hiddenProject(); + }) + + toggleProgram($('form #newProgram0')); + toggleProject($('form #newProject0')); + toggleProject($('form #newLine0')); + + hiddenProject(); + + /* Toggles data migration mode events. */ + $('input[name="projectType"]').change(function() + { + $('.programForm').show(); + $('.createProjectTip').toggleClass('hidden'); + $('.createExecutionTip').toggleClass('hidden'); + $('.projectName').toggleClass('hidden'); + $('.projectAcl').toggleClass('hidden'); + $('.programAcl').toggleClass('hidden'); + $('.projectStatus').toggleClass('hidden'); + + if($(this).val() == 'project') + { + if(mode == 'light') $('.programForm').hide(); + $('[name=projectAcl]').attr('disabled', 'disabled'); + $('[name=programAcl]').removeAttr('disabled'); + } + + if($(this).val() == 'execution') + { + $('[name=programAcl]').attr('disabled', 'disabled'); + $('[name=projectAcl]').removeAttr('disabled'); + } + }) + + /* Hide project information. */ + var projectType = $('input[name="projectType"]:checked').val(); + if(projectType == 'project') + { + $('.projectName').addClass('hidden'); + $('.projectAcl').addClass('hidden'); + $('.programAcl').removeClass('hidden'); + $('.projectStatus').addClass('hidden'); + $('[name=projectAcl]').attr('disabled', 'disabled'); + $('[name=programAcl]').removeAttr('disabled'); + } + + if(projectType == 'execution') + { + $('.projectName').removeClass('hidden'); + $('.programAcl').addClass('hidden'); + $('.projectAcl').removeClass('hidden'); + $('.projectStatus').removeClass('hidden'); + $('[name=programAcl]').attr('disabled', 'disabled'); + $('[name=projectAcl]').removeAttr('disabled'); + } + + $('#submit').click(function() + { + if(type == 'productline') + { + var checkedProductCount = $("input[name^='products']:checked").length; + if(checkedProductCount <= 0) + { + alert(errorNoProduct); + return false; + } + } + else if(type == 'product') + { + var checkedProductCount = $("input[name^='products']:checked").length; + if(checkedProductCount <= 0) + { + alert(errorNoProduct); + return false; + } + + var executionCount = 0; + var checkedExecutionCount = 0; + $("input[name^='products']:checked").each(function() + { + var productID = $(this).val() + + executionCount += $("[data-product='" + productID + "']").length; + checkedExecutionCount += $("[data-product='" + productID + "']:checked").length; + }); + + if(executionCount !== 0 && checkedExecutionCount === 0) + { + alert(errorNoExecution); + return false; + } + } + else + { + var checkedExecutionCount = $("input[name^='sprints']:checked").length; + if(checkedExecutionCount === 0) + { + alert(errorNoExecution); + return false; + } + } + }) +}); + +/** + * Get project by program id. + * + * @param object $obj + * @access public + * @return void + */ +function getProjectByProgram(obj) +{ + var programID = $(obj).val(); + var link = createLink('upgrade', 'ajaxGetProjectPairsByProgram', 'programID=' + programID); + $.post(link, function(data) + { + $('#projects').replaceWith(data); + if($('#newProject0').is(':checked')) + { + $('#projects').attr('disabled', 'disabled'); + $('#projects').addClass('hidden'); + } + }) + + getLineByProgram(); + getProgramStatus('program', programID); +} + +/** + * Get lines by program id. + * + * @access public + * @return void + */ +function getLineByProgram() +{ + var programID = $('#programs').val(); + var link = createLink('upgrade', 'ajaxGetLinesPairsByProgram', 'programID=' + programID); + + $.post(link, function(data) + { + $('#lines').replaceWith(data); + if($('#newLine0').is(':checked')) + { + $('#lines').attr('disabled', 'disabled'); + $('#lines').addClass('hidden'); + } + }) + + if(!programID) $('lineBox').addClass('hidden'); + if(programID) $('lineBox').removeClass('hidden'); +} + +/** + * Toggle program name. + * + * @param object $obj + * @access public + * @return void + */ +function toggleProgram(obj) +{ + var $obj = $(obj); + if($obj.length == 0) return false; + + var $programs = $obj.closest('table').find('#programs'); + if($obj.prop('checked')) + { + $('form .pgm-no-exist').removeClass('hidden'); + $('form .pgm-exist').addClass('hidden'); + $programs.attr('disabled', 'disabled'); + $('.programStatus').show(); + $('#programStatus').val('wait'); + $('#programStatus').trigger("chosen:updated"); + + $('form #newProject0').prop('checked', true); + $('form #newLine0').prop('checked', true); + toggleProject($('form #newProject0')); + toggleLine($('form #newProject0')); + } + else + { + $('form .pgm-exist').removeClass('hidden'); + $('form .pgm-no-exist').addClass('hidden'); + $('.programStatus').hide(); + + if(!$('#newProgram0').prop('disabled')) + { + $programs.removeAttr('disabled'); + } + + var programID = $('#programs').val(); + getProgramStatus('program', programID); + } + + var projectType = $('input[name="projectType"]:checked').val(); + if(projectType == 'project') + { + $('.projectStatus').addClass('hidden'); + } + if(projectType == 'execution') + { + $('.projectStatus').removeClass('hidden'); + } +} + +/** + * Toggle line. + * + * @param object $obj + * @access public + * @return void + */ +function toggleLine(obj) +{ + var $obj = $(obj); + if($obj.length == 0) return false; + + var $lines = $obj.closest('table').find('#lines'); + var $programs = $obj.closest('table').find('#programs'); + + if($obj.prop('checked')) + { + $('form .line-no-exist').removeClass('hidden'); + $('form .line-exist').addClass('hidden'); + $lines.attr('disabled', 'disabled'); + } + else + { + $('form .line-exist').removeClass('hidden'); + $('form .line-no-exist').addClass('hidden'); + $('.programStatus').hide(); + $lines.removeAttr('disabled'); + + $('form #newProgram0').prop('checked', false); + toggleProgram($('form #newProgram0')); + + getLineByProgram(); + } +} + +/** + * Toggle project. + * + * @param object $obj + * @access public + * @return void + */ +function toggleProject(obj) +{ + var $obj = $(obj); + if($obj.length == 0) return false; + + var $projects = $obj.closest('table').find('#projects'); + var $programs = $obj.closest('table').find('#programs'); + var $programParams = $obj.closest('table').find('.programParams'); + if($obj.prop('checked')) + { + $('form .prj-no-exist').removeClass('hidden'); + $('form .prj-exist').addClass('hidden'); + $programParams.removeClass('hidden'); + $projects.attr('disabled', 'disabled'); + } + else + { + $('form .prj-exist').removeClass('hidden'); + $('form .prj-no-exist').addClass('hidden'); + $programParams.addClass('hidden'); + $('#projectStatus').closest('tr').removeClass('hidden'); + $projects.removeAttr('disabled'); + + if($('#newProgram0').prop('checked')) + { + $('form #newProgram0').prop('checked', false); + toggleProgram($('form #newProgram0')); + } + + getProjectByProgram(programs); + } +} + +/** + * When there are no sprints for the selected product, hidden the project. + * + * @access public + * @return void + */ +function hiddenProject() +{ + $('#programBox').show(); + if($('[name^=sprints]:checked').length == 0) + { + if(mode == 'light') $('#programBox').hide(); + $(".programParams input").attr('disabled' ,'disabled'); + $(".programParams select").attr('disabled' ,'disabled').trigger('chosen:updated'); + $('.programParams').hide(); + + $(".projectName input").attr('disabled' ,'disabled'); + $(".projectName select").attr('disabled' ,'disabled').trigger('chosen:updated'); + $('.projectName').hide(); + } + else + { + $(".projectName input").removeAttr('disabled'); + $(".projectName select").removeAttr('disabled').trigger('chosen:updated'); + $('.projectName').show(); + + $(".programParams input").removeAttr('disabled'); + $(".programParams select").removeAttr('disabled').trigger('chosen:updated'); + $('.programParams').show(); + + if($('#newProject0').is(':checked')) $('#projects').attr('disabled', 'disabled'); + + $('.programForm').show(); + var projectType = $('input[name="projectType"]:checked').val(); + if(projectType == 'project') + { + $('.projectName').addClass('hidden'); + $('.projectAcl').addClass('hidden'); + $('.programAcl').removeClass('hidden'); + $('.projectStatus').addClass('hidden'); + $('[name=projectAcl]').attr('disabled', 'disabled'); + $('[name=programAcl]').removeAttr('disabled'); + if(mode == 'light') $('.programForm').hide(); + } + + if(projectType == 'execution') + { + $('.projectName').removeClass('hidden'); + $('.projectAcl').removeClass('hidden'); + $('.programAcl').addClass('hidden'); + $('.projectStatus').removeClass('hidden'); + $('[name=programAcl]').attr('disabled', 'disabled'); + $('[name=projectAcl]').removeAttr('disabled'); + } + + if(mode == 'light') + { + $('form #newProgram0').prop('checked', false); + toggleProgram($('form #newProgram0')); + } + } +} + +/** + * When the selected product already set program, the program name is fixed. + * + * @param object $product + * @access public + * @return void + */ +function setProgramByProduct(product) +{ + if(product.length == 0) return; + + var programID = product.attr('data-programid'); + $(':checkbox[data-productid]').each(function() + { + var currentProgramID = $(this).attr('data-programid'); + if(currentProgramID != programID) + { + var currentProductID = $(this).val(); + if(product.prop('checked')) + { + $(this).prop('checked', false); + $(this).attr('disabled', 'disabled'); + $('#checkAllProducts').attr('disabled', 'disabled'); + $('#checkAllProjects').attr('disabled', 'disabled'); + $('[data-product=' + currentProductID + ']').prop('checked', false); + $('[data-product=' + currentProductID + ']').attr('disabled', 'disabled'); + } + else if($(':checkbox:checked[data-programid=' + programID + ']').length == 0) + { + $(this).removeAttr('disabled'); + $('#checkAllProducts').removeAttr('disabled'); + $('#checkAllProjects').removeAttr('disabled'); + $('[data-product=' + currentProductID + ']').removeAttr('disabled'); + } + } + }); + + if(product.prop('checked') && programID != 0) + { + $('form #newProgram0').prop('checked', false); + toggleProgram($('form #newProgram0')); + $('form #newProgram0').attr('disabled', 'disabled'); + + $('#programs').val(programID).trigger("chosen:updated"); + $('#programs').attr('disabled', 'disabled'); + $('#programID').val(programID); + + getProjectByProgram($('#programs')); + } + else if(programID && $(':checkbox:checked[data-programid=' + programID + ']').length == 0) + { + $('form #newProgram0').removeAttr('disabled'); + $('#programs').removeAttr('disabled'); + $('#programID').val(''); + } +} + +/** + * Set project status. + * + * @access public + * @return void + */ +function setProjectStatus() +{ + var projectStatus = 'closed'; + $(':checkbox:checked[data-status]').each(function() + { + var status = $(this).attr('data-status'); + if(status == 'doing' || status == 'suspended') + { + projectStatus = 'doing'; + return false; + } + + if(status == 'wait') projectStatus = 'wait'; + }); + if($(':checkbox:checked[data-status]').length == 0) projectStatus = 'wait'; + + $('#projectStatus').val(projectStatus); + $('#projectStatus').trigger('chosen:updated'); + + setProgramStatus(projectStatus); +} + +/** + * Set program status. + * + * @param string $projectStatus + * @access public + * @return void + */ +function setProgramStatus(projectStatus) +{ + var programStatus = 'wait'; + if(projectStatus != 'wait') programStatus = 'doing'; + if(projectStatus == 'closed') programStatus = 'closed'; + + $('#programStatus').val(programStatus); + $('#programStatus').trigger('chosen:updated'); +} + +/** + * Set program begin time. + * + * @param string $programBegin + * @access public + * @return void + */ +function setProgramBegin(programBegin) +{ + $(':checkbox:checked[data-begin]').each(function() + { + begin = $(this).attr('data-begin').substr(0, 10); + if(begin == '0000-00-00') return true; + + if(begin < programBegin) + { + programBegin = begin; + $('.programParams #begin').val(programBegin); + } + }); + + setProjectStatus(); +} + +/* + * Set program end time. + * + * @param string $programEnd + * @access public + * @return void + */ +function setProgramEnd(programEnd) +{ + var length = $(':checkbox:checked[data-end]').length; + if(length == 0) + { + $('.programParams #end').val(''); + return false; + } + + $(':checkbox:checked[data-end]').each(function() + { + end = $(this).attr('data-end').substr(0, 10); + if(end == '0000-00-00') return true; + + if(end > programEnd) + { + programEnd = end; + $('.programParams #end').val(programEnd); + } + }); +} + +/** + * Set the project PM when merge the sprint. + * + * @access public + * @return void + */ +function setProjectPM() +{ + var PM = []; + $(':checkbox:checked[data-pm]').each(function() + { + var PMName = $(this).attr('data-pm'); + PM[PMName] = PM[PMName] == undefined ? 0 : PM[PMName]; + PM[PMName] = PM[PMName] + 1; + }); + PM.sort(function(el1, el2){return el2 - el1;}); + PMNameList = Object.keys(PM); + PMNameList = PMNameList.filter(Boolean); + $('#PM').val(PMNameList[0]).trigger("chosen:updated"); +} + +/* + * Convert string to date. + * + * @param string $dateString + * @access public + * @return void + */ +function convertStringToDate(dateString) +{ + dateString = dateString.split('-'); + return new Date(dateString[0], dateString[1] - 1, dateString[2]); +} + +/** + * Compute delta of two days. + * + * @param string $date1 + * @param string $date1 + * @access public + * @return int + */ +function computeDaysDelta(date1, date2) +{ + date1 = convertStringToDate(date1); + date2 = convertStringToDate(date2); + delta = (date2 - date1) / (1000 * 60 * 60 * 24) + 1; + + weekEnds = 0; + for(i = 0; i < delta; i++) + { + if((weekend == 2 && date1.getDay() == 6) || date1.getDay() == 0) weekEnds ++; + date1 = date1.valueOf(); + date1 += 1000 * 60 * 60 * 24; + date1 = new Date(date1); + } + return delta - weekEnds; +} + +/** + * Compute work days. + * + * @access public + * @return void + */ +function computeWorkDays(currentID) +{ + isBactchEdit = false; + if(currentID) + { + index = currentID.replace('begins[', ''); + index = index.replace('ends[', ''); + index = index.replace(']', ''); + if(!isNaN(index)) isBactchEdit = true; + } + + if(isBactchEdit) + { + beginDate = $('#begins\\[' + index + '\\]').val(); + endDate = $('#ends\\[' + index + '\\]').val(); + } + else + { + beginDate = $('#begin').val(); + endDate = $('#end').val(); + } + + if(beginDate && endDate) + { + if(isBactchEdit) $('#dayses\\[' + index + '\\]').val(computeDaysDelta(beginDate, endDate)); + if(!isBactchEdit) $('#days').val(computeDaysDelta(beginDate, endDate)); + } + else if($('input[checked="true"]').val()) + { + computeEndDate(); + } +} + +/** + * Compute the end date for project. + * + * @param int $delta + * @access public + * @return void + */ +function computeEndDate(delta) +{ + beginDate = $('#begin').val(); + if(!beginDate) return; + + delta = parseInt(delta); + beginDate = convertStringToDate(beginDate); + if((delta == 7 || delta == 14) && (beginDate.getDay() == 1)) + { + delta = (weekend == 2) ? (delta - 2) : (delta - 1); + } + + endDate = $.zui.formatDate(beginDate.addDays(delta - 1), 'yyyy-MM-dd'); + $('#end').val(endDate).datetimepicker('update'); + computeWorkDays(); +} + +/** + * Get program status. + * + * @param string $objectType + * @param int $objectID + * @access public + * @return void + */ +function getProgramStatus(objectType, objectID) +{ + var link = createLink('upgrade', 'ajaxGetProgramStatus', 'objectID=' + objectID); + $.post(link, function(data) + { + if(objectType == 'program') $('#programStatus').val(data).trigger("chosen:updated"); + if(objectType == 'project') $('#projectStatus').val(data).trigger("chosen:updated"); + }) +} + +/** + * Checked all objects. + * + * @param int lineID + * @param string type + * @access public + * @return bool + */ +function isSelectAll(lineID = 0, type = 'product') +{ + var checked = true; + if(lineID) + { + if(type == 'project') + { + var objectNum = $("[id^='sprints\[" + lineID + "\]']").length; + var checkedObjectNum = $("[id^='sprints\[" + lineID + "\]']:checked").length; + } + else if(type == 'product') + { + var objectNum = $("[id^='products\[" + lineID + "\]']").length; + var checkedObjectNum = $("[id^='products\[" + lineID + "\]']:checked").length; + } + } + else + { + if(type == 'project') + { + var objectNum = $("[id^='sprints']").length; + var checkedObjectNum = $("[id^='sprints']:checked").length; + } + else if(type == 'product') + { + var objectNum = $("[id^='products']").length; + var checkedObjectNum = $("[id^='products']:checked").length; + } + else if(type = 'line') + { + var objectNum = $("[id^='productLines'").length; + var checkedObjectNum = $("[id^='productLines']:checked").length; + } + } + + if(objectNum > checkedObjectNum || objectNum == 0) checked = false; + return checked; +} diff --git a/module/upgrade/ui/createprogram.html.php b/module/upgrade/ui/createprogram.html.php new file mode 100644 index 0000000000..9466de564f --- /dev/null +++ b/module/upgrade/ui/createprogram.html.php @@ -0,0 +1,120 @@ + + * @package upgrade + * @link https://www.zentao.net + */ +namespace zin; + +$createProgram = function($data) +{ + global $lang; + if($data->systemMode == 'light') unset($lang->project->subAclList['program']); + + return div + ( + formRowGroup(set::title($lang->upgrade->dataMethod)), + div + ( + set::class('programParams py-4'), + radioList(set::class('my-2'), set::name('projectType'), set::inline('true'), set::items($this->lang->upgrade->projectType, set::value($data->projectType))), + div(set::class('createProjectTip text-gray ' . ($data->projectType == 'project' ? '' : 'hidden')), html($lang->upgrade->createProjectTip)), + div(set::class('createExecutionTip text-gray ' . ($data->projectType == 'execution' ? '' : 'hidden')), html($lang->upgrade->createExecutionTip)) + ), + formRowGroup(set::title($data->systemMode == 'light' ? $lang->upgrade->setProject : $lang->upgrade->setProgram,)), + div + ( + set::class('programForm'), + div + ( + formGroup + ( + inputGroup + ( + span(set::class('form-label w-24'), html("{$lang->upgrade->programName}")), + picker(set::className('hidden'), set::name('programs'), set::items($data->programs), set::value($data->programID)), + input(set::name('programName')), + span + ( + set('class', 'input-group-addon'), + checkbox(set::name('newProgram'), set::text($lang->upgrade->newProgram), set::value(0), set::checked(true)) + ), + input(set::class('hidden'), set::name('programID')) + ) + ) + ), + div + ( + set::class($systemMode == 'light' ? 'hidden' : ''), + span(set::class('form-label w-24'), $lang->program->common . $lang->program->status), + div(picker(set::name('programStatus'), set::items($lang->program->statusList))) + ), + div + ( + set::class('projectName'), + div($lang->upgrade->existProject . $lang->upgrade->projectName), + inputGroup + ( + picker(set::name('projects'), set::items($data->projects)), + input(set::name('projectName'), set::value(isset($data->sprintName) ? $data->sprintName : '')), + span + ( + set('class', 'input-group-addon'), + checkbox(set::name('newProject'), set::text($lang->upgrade->newProgram), set::value(0), set::checked(true)) + ) + ) + ), + div + ( + set::class('programParams projectStatus'), + div($lang->project->status), + div(picker(set::name('projectStatus'), set::items($lang->project->statusList))) + ), + div + ( + set::class('lineName'), + div($lang->upgrade->existLine . $lang->upgrade->line), + inputGroup + ( + picker(set::name('lines'), set::items($data->lines)), + input(set::name('lineName'), set::value(isset($data->lineName) ? $data->lineName : '')), + span + ( + set('class', 'input-group-addon'), + checkbox(set::name('newLine'), set::text($lang->upgrade->newProgram), set::value(0), set::checked(true)) + ) + ) + ), + div + ( + set::class('programParams'), + div($lang->project->PM), + div(picker(set::name('PM'), set::items($data->users))) + ), + div + ( + set::class('programParams'), + div($lang->project->dateRange), + inputGroup + ( + datePicker(set::name('begin'), set::value(date('Y-m-d'))), + span(set::class('input-group-addon'), $lang->project->to), + datePicker(set::name('end')), + span(set::class('input-group-addon'), checkbox(set::name('longTime'), set::value('1'), set::text($lang->project->longTime))), + ) + ), + div + ( + set::class('programParams'), + div($lang->project->acl), + div(radioList(set::name('programAcl'), set::items($lang->program->aclList), set::value('open'))), + div(radioList(set::name('projectAcl'), set::items($lang->project->subAclList), set::value('open'))), + ), + ), + center(set::class('form-actions'), btn(set::type('submit'), set::class('primary'), $lang->save)) + ); +}; diff --git a/module/upgrade/ui/mergebyline.html.php b/module/upgrade/ui/mergebyline.html.php new file mode 100644 index 0000000000..114c93a15d --- /dev/null +++ b/module/upgrade/ui/mergebyline.html.php @@ -0,0 +1,16 @@ + + * @package upgrade + * @link https://www.zentao.net + */ +namespace zin; + +$getMergeData = function() +{ + return div('123'); +}; diff --git a/module/upgrade/ui/mergebysprint.html.php b/module/upgrade/ui/mergebysprint.html.php new file mode 100644 index 0000000000..702983fe4a --- /dev/null +++ b/module/upgrade/ui/mergebysprint.html.php @@ -0,0 +1,16 @@ + + * @package upgrade + * @link https://www.zentao.net + */ +namespace zin; + +$getMergeData = function() +{ + return div('123'); +}; diff --git a/module/upgrade/ui/mergeprogram.html.php b/module/upgrade/ui/mergeprogram.html.php new file mode 100644 index 0000000000..d5045a7604 --- /dev/null +++ b/module/upgrade/ui/mergeprogram.html.php @@ -0,0 +1,40 @@ + + * @package upgrade + * @link https://www.zentao.net + */ +namespace zin; + +set::zui(true); +if($type == 'productline') include_once('mergebyline.html.php'); +if($type == 'product') include_once('mergebyproduct.html.php'); +if($type == 'sprint' || $type == 'moreLink') include_once('mergebysprint.html.php'); + +div +( + set::id('main'), + div + ( + set::id('mainContent'), + set::class('bg-white p-4'), + set::style(array('margin' => '50px auto 0', 'width' => '1200px')), + div + ( + set::class('article-h1 mb-4'), + $lang->upgrade->mergeModes['manually'] + ), + form + ( + set::actions(''), + $getMergeData($this->view) + ) + ) +); + +render('pagebase'); +