From b23222b09be43865d48a91056ab41a626ea2a236 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Thu, 30 May 2024 13:25:03 +0800 Subject: [PATCH] * Fix bug #50362. --- lib/filter/filter.class.php | 6 +-- module/tree/js/browse.ui.js | 74 +++++++++++++++++++++++++++++----- module/tree/ui/browse.html.php | 65 +++++++++++------------------ 3 files changed, 90 insertions(+), 55 deletions(-) diff --git a/lib/filter/filter.class.php b/lib/filter/filter.class.php index a49778a57f..9407887f6b 100644 --- a/lib/filter/filter.class.php +++ b/lib/filter/filter.class.php @@ -83,10 +83,10 @@ class fixer extends baseFixer { global $config, $app; - if($config->edition != 'open' && empty($app->installing)) + if($config->edition != 'open' && empty($app->installing)) { - $moduleName = $moduleName ? $moduleName : $app->getModuleName(); - $methodName = $methodName ? $moduleName : $app->getMethodName(); + $moduleName = $app->getModuleName(); + $methodName = $app->getMethodName(); $flow = $app->control->loadModel('workflow')->getByModule($moduleName); if(!$flow) return parent::get($fields); diff --git a/module/tree/js/browse.ui.js b/module/tree/js/browse.ui.js index 31b9927791..39f2501175 100644 --- a/module/tree/js/browse.ui.js +++ b/module/tree/js/browse.ui.js @@ -1,18 +1,70 @@ -window.toggleCopy = function(toggle) +function syncModule() { - $('.form-group.copy').toggleClass('hidden', toggle); + productID = $('[name=allProduct]').val(); + moduleID = $('[name=productModule]').val(); + + $.getJSON($.createLink('tree', 'ajaxGetSonModules', 'moduleID=' + moduleID + '&rootID=' + productID + '&type=story'), function(modules) + { + if(modules.length == 0) + { + zui.Modal.alert(noSubmodule); + return false; + } + + let $lastFormRow = $('.form-row .row-module').last().closest('.form-row'); + let $lastBranch = $lastFormRow.find('.picker-box [name^=branch]'); + let $cloneFormRow = $lastFormRow.clone().addClass('copy'); + let $branchPicker = null; + if($lastBranch.length > 0) + { + $branchPicker = $lastBranch.zui('picker'); + $cloneFormRow.find('.picker-box').removeAttr('id').removeAttr('data-zui-picker').empty(); + } + + $.each(modules, function(key, module) + { + $('.form-row:not(.copyBox) .row-module').each(function() + { + moduleName = $(this).find('input[id^=modules]').val(); + if(moduleName == module.name) modules[key] = null; + }) + }); + + $.each(modules, function(key, module) + { + if(module) + { + $('.form-row:not(.copyBox):not(.sonModule):not(.copy)').first().before($cloneFormRow.prop('outerHTML')); + + let $copy = $('.form-row.copy').last(); + let $branch = $copy.find('.picker-box'); + + $copy.find('input[id^=modules]').val(module.name); + $copy.find('input[id^=shorts]').val(module.short); + if($branch.length > 0) new zui.Picker($branch, $branchPicker.options); + } + }) + }) } -$(document).ready(function() +function syncProduct(obj) { - toggleCopy(true); -}); + link = $.createLink('tree', 'ajaxGetOptionMenu', 'rootID=' + obj.value + "&viewType=" + viewType + "&branch=all&rootModuleID=0&returnType=json"); + $.getJSON(link, function(modules) + { + let $picker = $('[name=productModule]').zui('picker'); + let items = []; + if(obj.value) + { + $.each(modules, function(key, value){ items.push({'value': key, 'text': value}); }); + } -window.syncProductOrProject = function(obj, type) + $picker.render({items: items}) + $picker.$.setValue(''); + }) +} + +window.toggleCopy = function() { - if(type == 'product') viewType = 'story'; - if(type == 'project') viewType = 'task'; - - const rootID = $(obj).find('input.pick-value').val(); - const link = $.createLink('tree', 'ajaxGetOptionMenu', 'rootID=' + rootID + "&viewType=" + viewType + "&branch=all&rootModuleID=0&returnType=json"); + $('.form-row.copyBox').toggleClass('hidden'); } diff --git a/module/tree/ui/browse.html.php b/module/tree/ui/browse.html.php index be5488aa0a..ff00bf0bc9 100644 --- a/module/tree/ui/browse.html.php +++ b/module/tree/ui/browse.html.php @@ -11,7 +11,8 @@ declare(strict_types=1); namespace zin; jsVar('rootID', $root->id); -jsVar('+viewType', $viewType); +jsVar('viewType', $viewType); +jsVar('noSubmodule', $lang->tree->noSubmodule); $manageTitle = $lang->tree->manageChild; if(strpos($viewType, 'doc') !== false) @@ -34,27 +35,20 @@ $maxOrder = 0; $moduleRows = array(); if($viewType == 'story' && $allProduct) { - $moduleRows[] = formGroup + $moduleRows[] = formRow + ( + setClass('copyBox hidden'), + formGroup ( - setClass('copy hidden'), inputGroup ( setClass('row-module'), - picker - ( - set::name('allProduct'), - set::items($allProduct), - set::required(true), - set::onchange("syncProductOrProject(this, 'product')") - ), - picker - ( - setClass('col-short'), - set::name('productModule'), - set::items($productModules) - ) + picker(set::name("allProduct"), set::items($allProduct), on::change("syncProduct(e.target)")), + picker(set::name("productModule"), set::items(array())), + btn(setID('copyModule'), on::click("syncModule"), icon('copy')) ) - ); + ) + ); } foreach($sons as $son) @@ -63,6 +57,7 @@ foreach($sons as $son) $moduleRows[] = formRow ( + setClass('sonModule'), formGroup ( inputGroup @@ -76,9 +71,8 @@ foreach($sons as $son) set::value($son->name), set::placeholder($placeholder) ), - picker + empty($branches) ? null : picker ( - setClass(empty($branches) ? 'hidden' : ''), set::name("branch[id$son->id]"), set::items($branches), set::value($son->branch), @@ -101,10 +95,7 @@ foreach($sons as $son) set::control('hidden') ) ), - batchActions - ( - set::actionClass('action-group child-hidden') - ) + batchActions(set::actionClass('action-group child-hidden')) ) ); } @@ -127,15 +118,14 @@ for($i = 0; $i < \tree::NEW_CHILD_COUNT; $i ++) input ( setClass('col-module'), - set::name("modules[$i]"), + set::name("modules[]"), set::type('input'), set::value(''), set::placeholder($placeholder) ), - picker + empty($branches) ? null : picker ( - setClass(empty($branches) ? 'hidden' : ''), - set::name("branch[$i]"), + set::name("branch[]"), set::items($branches), set::value($initBranch), set::required(true) @@ -143,15 +133,12 @@ for($i = 0; $i < \tree::NEW_CHILD_COUNT; $i ++) input ( setClass('col-short'), - set::name("shorts[$i]"), + set::name("shorts[]"), set::type('input'), set::placeholder($lang->tree->short) ) ), - batchActions - ( - set::actionClass('action-group') - ) + batchActions(set::actionClass('action-group')) ) ); } @@ -260,16 +247,12 @@ div ( setClass('pb-4'), set::title($manageTitle), - $viewType == 'story' && $allProduct && $canBeChanged ? to::headingActions + to::headingActions ( - btn - ( - set::size('sm'), - set::type('primary'), - set::url('javascript:toggleCopy()'), - $lang->tree->syncFromProduct - ) - ) : null, + ($viewType == 'story' && $allProduct && $canBeChanged) ? btn(setClass('primary'), set::size('sm'), $lang->tree->syncFromProduct, on::click('toggleCopy')) : null, + ($viewType == 'feedback' && common::hasPriv('feedback', 'syncProduct') && !isset($syncConfig[$rootID])) ? btn(setClass('primary'), set::size('sm'), set::url(createLink('feedback', 'syncProduct', "productID=$rootID&module=feedback&parent=$parent")), setData('toggle', 'modal'), $lang->tree->syncProductModule) : null, + ($viewType == 'ticket' && common::hasPriv('ticket', 'syncProduct') && !isset($syncConfig[$rootID])) ? btn(setClass('primary'), set::size('sm'), set::url(createLink('ticket', 'syncProduct', "productID=$rootID&parent=$parent")), setData('toggle', 'modal'), $lang->tree->syncProductModule) : null + ), div ( setClass('flex'),