diff --git a/module/program/js/create.ui.js b/module/program/js/create.ui.js new file mode 100644 index 0000000000..ea1b8cd4d2 --- /dev/null +++ b/module/program/js/create.ui.js @@ -0,0 +1,143 @@ +window.onParentChange = (event) => +{ + const parentID = $(event.target).val(); + const url = $.createLink('program', 'create', parentID ? ('parentProgramID=' + parentID) : ''); + loadPage(url, '#budgetRow>*, #acl'); + console.log('>', parentID, url); +}; + +window.onBudgetChange = (event) => +{ + const $budget = $(event.target); + const currentBudget = $budget.val(); + const budgetLeft = $budget.data('budget-left'); + console.log('onBudgetChange', currentBudget); + if(currentBudget > budgetLeft) + { + $('
').text(lang.budgetOverrun + $budget.data('currency-symbol') + budgetLeft).append($('').text(lang.ignore).on('click', () => $('#budgetTip').remove())).appendTo($budget.closest('.form-group')); + } +}; + +window.onFutureChange = (event) => +{ + $('#budget,#budgetUnit').attr('disabled', $(event.target).prop('checked') ? 'disabled' : null); + $('#budgetTip').remove(); +}; + +window.outOfDateTip = function() +{ + console.warn('The method outOfDateTip is not implemented.'); +} + +/** + * Compute delta of two days. + * + * @param string date1 + * @param string date2 + * @access public + * @return int + */ +function computeDaysDelta(date1, date2) +{ + date1 = zui.createDate(date1); + date2 = zui.createDate(date2); + const delta = (date2 - date1) / (1000 * 60 * 60 * 24) + 1; + + let 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. + * + * @param string currentID + * @access public + * @return void + */ +window.computeWorkDays = function(currentID) +{ + if(typeof currentID === 'object') currentID = $(currentID.target).val(); + let isBactchEdit = false; + let index; + if(currentID) + { + index = currentID.replace('begins[', ''); + index = index.replace('ends[', ''); + index = index.replace(']', ''); + if(!isNaN(index)) isBactchEdit = true; + } + + let beginDate; + let endDate; + if(isBactchEdit) + { + beginDate = $('#begins\\[' + index + '\\]').val(); + endDate = $('#ends\\[' + index + '\\]').val(); + } + else + { + beginDate = $('#begin').val(); + endDate = $('#end').val(); + + var begin = new Date(beginDate.replace(/-/g,"/")); + var end = new Date(endDate.replace(/-/g,"/")); + var time = end.getTime() - begin.getTime(); + var days = parseInt(time / (1000 * 60 * 60 * 24)) + 1; + if(days != $('input[name="delta"]:checked').val()) $('input[name="delta"]:checked').attr('checked', false); + if(endDate == LONG_TIME) $('#delta999').prop('checked', true); + } + + if(beginDate && endDate) + { + if(isBactchEdit) $('#dayses\\[' + index + '\\]').val(computeDaysDelta(beginDate, endDate)); + else $('#days').val(computeDaysDelta(beginDate, endDate)); + } + else if($('input[checked="true"]').val()) + { + computeEndDate(); + } + outOfDateTip(); +} + +/** + * Compute the end date for project. + * + * @param int $delta + * @access public + * @return void + */ +window.computeEndDate = function(delta) +{ + delta = +$('input[name="delta"]:checked').val(); + let beginDate = $('#begin').val(); + if(!beginDate) return; + + if(delta === 999) + { + $('#end').val(LONG_TIME); + outOfDateTip(); + return false; + } + + beginDate = zui.createDate(beginDate); + if((delta === 7 || delta === 14) && (beginDate.getDay() === 1)) + { + delta = (weekend === 2) ? (delta - 2) : (delta - 1); + } + + const endDate = zui.formatDate(beginDate.getTime() + ((delta - 1) * zui.TIME_DAY), 'yyyy-MM-dd'); + $('#end').val(endDate); + computeWorkDays(); +} + +window.onAclChange = () => +{ + $('#whitelistRow').toggleClass('hidden', $('#acl_open').prop('checked')); +}; diff --git a/module/program/ui/create.html.php b/module/program/ui/create.html.php index 17c5701774..1b56f40275 100644 --- a/module/program/ui/create.html.php +++ b/module/program/ui/create.html.php @@ -1,13 +1,24 @@ id) ? $parentProgram->id : 0; -$currency = $parentID ? $parentProgram->budgetUnit : $config->project->defaultCurrency; -$aclList = $parentProgram ? $lang->program->subAclList : $lang->program->aclList; +$parentID = isset($parentProgram->id) ? $parentProgram->id : 0; +$currency = $parentID ? $parentProgram->budgetUnit : $config->project->defaultCurrency; +$aclList = $parentProgram ? $lang->program->subAclList : $lang->program->aclList; +$budgetPlaceholder = $parentProgram ? $lang->program->parentBudget . zget($lang->project->currencySymbol, $parentProgram->budgetUnit) . $budgetLeft : ''; +$budgetAvaliable = !$parentID || $budgetLeft; + +jsVar('lang', ['budgetOverrun' => $lang->project->budgetOverrun, 'currencySymbol' => $lang->project->currencySymbol, 'ignore' => $lang->program->ignore]); +jsVar('LONG_TIME', LONG_TIME); +jsVar('weekend', $config->execution->weekend); + useData('title', $parentID ? $lang->program->children : $lang->program->create); form ( + on::change('#parent', 'onParentChange'), + on::change('#budget', 'onBudgetChange'), + on::change('#future', 'onFutureChange'), + on::change('#acl', 'onAclChange'), formGroup ( set::width('1/2'), @@ -16,7 +27,6 @@ form set::disabled($parentID), set::value($parentID), set::items($parents), - on::change('setBudgetTipsAndAclList') ), formGroup ( @@ -34,20 +44,39 @@ form ), formRow ( + set::id('budgetRow'), formGroup ( - set::width('1/4'), - set::name('budget'), + set::width('1/2'), set::label($lang->program->budget), - set::control(['type' => 'inputControl', 'prefix' => $lang->project->currencySymbol[$currency], 'prefixWidth' => 'icon']), - on::change('budgetOverrunTips'), - formHidden('budgetUnit', $currency), + inputGroup + ( + set::seg(true), + input + ( + set::name('budget'), + set::placeholder($budgetPlaceholder), + set::disabled(!$budgetAvaliable), + set('data-budget-left', $budgetLeft), + set('data-currency-symbol', $parentProgram ? zget($lang->project->currencySymbol, $parentProgram->budgetUnit) : NULL), + ), + select + ( + zui::width('1/3'), + set::name('budgetUnit'), + set::disabled($parentID || !$budgetAvaliable), + set::items($budgetUnitList), + set::value($currency) + ) + ) ), + formHidden('budgetUnit', $currency), formGroup ( set::name('future'), set::value('1'), - set::control(['type' => 'checkbox', 'rootClass' => 'ml-4', 'text' => $lang->project->future]) + set::disabled(!$budgetAvaliable), + set::control(['type' => 'checkbox', 'rootClass' => 'ml-4', 'text' => $lang->project->future, 'checked' => !$budgetAvaliable]) ), ), formRow @@ -59,8 +88,10 @@ form set::required(true), inputGroup ( + set::seg(true), input ( + set::type('date'), set::name('begin'), set::value(date('Y-m-d')), set::placeholder($lang->project->begin), @@ -70,6 +101,7 @@ form $lang->project->to, input ( + set::type('date'), set::name('end'), set::placeholder($lang->project->end), set::required(true), @@ -96,11 +128,21 @@ form formGroup ( set::name('acl'), - set::label($lang->project->acl), + set::label($lang->program->acl), set::value('private'), set::items($aclList), set::control('radioList'), - on::change('setWhite') + ), + formRow + ( + set::id('whitelistRow'), + formGroup + ( + set::width('3/4'), + set::name('whitelist'), + set::label($lang->whitelist), + set::control('select') + ) ) );