diff --git a/extension/lite/product/ext/view/browse.html.php b/extension/lite/product/ext/view/browse.html.php index 4b5b79ac3e..d7cff9a3e1 100644 --- a/extension/lite/product/ext/view/browse.html.php +++ b/extension/lite/product/ext/view/browse.html.php @@ -591,7 +591,7 @@ function setBadgeStyle(obj, isShow) function handleLinkButtonClick() { - var xxcUrl = "xxc:openInApp/zentao-integrated/" + encodeURIComponent(window.location.href.replace(/.display=card/, '').replace(/\.xhtml/, '.html')); + var xxcUrl = "xxc:openInApp/zentao-integrated/" + encodeURIComponent(window.location.href.replace(/.display=card/, '').replace('xhtml', 'html')); window.open(xxcUrl); } diff --git a/extension/lite/story/ext/view/view.html.php b/extension/lite/story/ext/view/view.html.php index bd48a2e3e3..8c64cb67f3 100644 --- a/extension/lite/story/ext/view/view.html.php +++ b/extension/lite/story/ext/view/view.html.php @@ -346,7 +346,7 @@ js::set('rawModule', $this->app->rawModule); diff --git a/module/block/view/todoblock.html.php b/module/block/view/todoblock.html.php index 781ccf19d9..81b1c76209 100644 --- a/module/block/view/todoblock.html.php +++ b/module/block/view/todoblock.html.php @@ -28,7 +28,7 @@ if(!$selfCall) die(include('./todolist.html.php')); .block-todoes .todo-check {position: absolute; top: 5px; left: 10px; display: block; width: 20px; height: 20px; font-size: 20px; color: transparent; cursor: pointer; background: #fff; border: 2px solid #eee; border-radius: 50%;} .block-todoes .todo-check:hover {border-color: #8e939a;} .block-todoes .active > .todo-check {color: #00da88; background: transparent;border: none;} -.block-todoes .todoes-form {position: absolute; top: -45px; right: 0; left: 0; z-index: 1011; max-width: 500px; padding: 12px 20px 20px; visibility: hidden; background: #fff; -webkit-box-shadow: 0 0 20px 0 #bdc9d8; box-shadow: 0 0 20px 0 #bdc9d8; opacity: 0;-webkit-transition: .4s cubic-bezier(.175, .885, .32, 1); -o-transition: .4s cubic-bezier(.175, .885, .32, 1); transition: .4s cubic-bezier(.175, .885, .32, 1); -webkit-transition-property: opacity, visibility; -o-transition-property: opacity, visibility; transition-property: opacity, visibility;} +.block-todoes .todoes-form {position: absolute; top: -45px; right: 0; left: 0; z-index: 1011; max-width: 100%; padding: 12px 20px 20px; visibility: hidden; background: #fff; -webkit-box-shadow: 0 0 20px 0 #bdc9d8; box-shadow: 0 0 20px 0 #bdc9d8; opacity: 0;-webkit-transition: .4s cubic-bezier(.175, .885, .32, 1); -o-transition: .4s cubic-bezier(.175, .885, .32, 1); transition: .4s cubic-bezier(.175, .885, .32, 1); -webkit-transition-property: opacity, visibility; -o-transition-property: opacity, visibility; transition-property: opacity, visibility;} .block-todoes .todoes-form .form-group > label {padding-left: 0;} .block-todoes .todoes-form .form-group > label.text-center {text-align: center!important;} .block-todoes .todoes-form > .form-group:last-child {margin-bottom: 0;} diff --git a/module/bug/css/x.browse.css b/module/bug/css/x.browse.css index 385680384c..c0bf272b2d 100644 --- a/module/bug/css/x.browse.css +++ b/module/bug/css/x.browse.css @@ -1,6 +1,6 @@ body {margin-bottom: 0px !important;} #mainMenu, #sidebar, .dropdown, .pager > li > .pager-size-menu, .table-footer > .table-actions, .table-footer>.table-statistic {display: none;} -#main {min-width: unset; overflow-y: overlay;} +#main {min-width: unset; overflow-y: overlay; position: unset !important;} #main > .container {width: 100% !important;} #mainContent > .main-col {margin-top: 0px;} #xx-title {background-color: #F2F2F2; padding-left: 15px; line-height: 40px;} diff --git a/module/bug/css/x.view.css b/module/bug/css/x.view.css index b18ef5ed1b..89810f61b0 100644 --- a/module/bug/css/x.view.css +++ b/module/bug/css/x.view.css @@ -1,5 +1,5 @@ body * {font-size: 13px !important; line-height: 1.42857143; color: rgb(51, 51, 51);} -#main {margin-bottom: 40px; min-width: unset;} +#main {margin-bottom: 40px; min-width: unset; position: unset !important;} #mainMenu .pull-left>a, #mainMenu .pull-left .divider, #mainMenu .pull-right, #mainContent .col-4, .main-actions {display: none;} #mainMenu {position: fixed; width: 100%; z-index: 999;} #scrollContent {margin-top: 35px; height: calc(100% - 70px); display: block; overflow: hidden;} diff --git a/module/bug/js/view.js b/module/bug/js/view.js index 7eb23349a5..503b067367 100644 --- a/module/bug/js/view.js +++ b/module/bug/js/view.js @@ -45,12 +45,12 @@ $('#toTaskButton').on('click', function() var link = createLink('task', 'create', 'executionID=' + executionID + '&storyID=0&moduleID=0&taskID=0&todoID=0&extra=projectID=0&bugID=' + bugID); window.parent.$.apps.open(link, 'execution'); } - else if(executionID == 0) - { - alert(errorNoExecution); - } - else + else if(projectID == 0) { alert(errorNoProject); } + else + { + alert(errorNoExecution); + } }); diff --git a/module/bug/view/browse.html.php b/module/bug/view/browse.html.php index 005a5fd1fa..c809ced659 100644 --- a/module/bug/view/browse.html.php +++ b/module/bug/view/browse.html.php @@ -462,7 +462,7 @@ $('#bugForm .table-footer .table-actions #assignedTo').closest('.btn-group.dropu function handleLinkButtonClick() { - var xxcUrl = "xxc:openInApp/zentao-integrated/" + encodeURIComponent(window.location.href.replace(/.display=card/, '').replace(/\.xhtml/, '.html')); + var xxcUrl = "xxc:openInApp/zentao-integrated/" + encodeURIComponent(window.location.href.replace(/.display=card/, '').replace('xhtml', 'html')); window.open(xxcUrl); } diff --git a/module/bug/view/view.html.php b/module/bug/view/view.html.php index 6ef9003823..10b13c2d9e 100644 --- a/module/bug/view/view.html.php +++ b/module/bug/view/view.html.php @@ -468,7 +468,7 @@ diff --git a/module/common/lang/menu.php b/module/common/lang/menu.php index 12a8020011..b7703e2dc1 100644 --- a/module/common/lang/menu.php +++ b/module/common/lang/menu.php @@ -201,7 +201,7 @@ if($config->systemMode == 'new') $lang->project->homeMenu->kanban = array('link' /* Scrum menu. */ $lang->scrum->menu = new stdclass(); $lang->scrum->menu->index = array('link' => "{$lang->dashboard}|project|index|project=%s"); -$lang->scrum->menu->execution = array('link' => "$lang->executionCommon|project|execution|status=all&projectID=%s", 'exclude' => 'execution-testreport'); +$lang->scrum->menu->execution = array('link' => "$lang->executionCommon|project|execution|status=all&projectID=%s", 'exclude' => 'execution-testreport', 'subModule' => 'task'); $lang->scrum->menu->story = array('link' => "$lang->SRCommon|projectstory|story|projectID=%s", 'subModule' => 'projectstory,tree', 'alias' => 'story,track'); $lang->scrum->menu->doc = array('link' => "{$lang->doc->common}|doc|tableContents|type=project&objectID=%s", 'subModule' => 'doc'); $lang->scrum->menu->qa = array('link' => "{$lang->qa->common}|project|bug|projectID=%s", 'subModule' => 'testcase,testtask,bug,testreport,execution', 'alias' => 'bug,testtask,testcase,testreport', 'exclude' => 'execution-create,execution-batchedit'); diff --git a/module/common/model.php b/module/common/model.php index 29d6c7b324..bb85ca6c40 100644 --- a/module/common/model.php +++ b/module/common/model.php @@ -525,6 +525,7 @@ class commonModel extends model if(isset($app->user)) { + if(!isset($app->user->visions)) $app->user->visions = trim($config->visions, ','); $currentVision = $app->config->vision; $userVisions = array_filter(explode(',', $app->user->visions)); $configVisions = array_filter(explode(',', trim($config->visions, ','))); diff --git a/module/common/view/header.html.php b/module/common/view/header.html.php index e294df8a85..5e3a344972 100755 --- a/module/common/view/header.html.php +++ b/module/common/view/header.html.php @@ -51,6 +51,12 @@ adjustMenuWidth(); if(window.navigator.userAgent.indexOf('xuanxuan') > 0) { $('li.user-tutorial').addClass('hide'); + + /* Fix double header covering #main. */ + $('document').ready(function() + { + $('#subHeader').parent().parent().children('#main').css('top', '100px'); + }); }
sso->redirect)) echo "class='ranzhiFixedTfootAction'";?> > diff --git a/module/doc/css/index.css b/module/doc/css/index.css index 7a426166af..f45675040c 100644 --- a/module/doc/css/index.css +++ b/module/doc/css/index.css @@ -1,3 +1,4 @@ #pageActions ul.dropdown-menu {left: 67px;} #mainRow .main-col .row .col-sm-7 {width: 55% !important;} #mainRow .main-col .row .col-sm-5 {width: 45% !important;} +#mainRow .c-num {text-overflow: ellipsis; white-space: nowrap;} diff --git a/module/doc/css/x.view.css b/module/doc/css/x.view.css index 2e87c4aa0f..7014d2b1e0 100644 --- a/module/doc/css/x.view.css +++ b/module/doc/css/x.view.css @@ -1,4 +1,4 @@ -.side-col.col-4 {display: none;} +.side-col.col-4 {display: none; position: unset !important;} #main {margin-bottom: 40px;} #mainMenu {margin-top: 0px;} #mainMenu .btn {display: none;} diff --git a/module/doc/view/index.html.php b/module/doc/view/index.html.php index 293176cd59..e52cdc849d 100644 --- a/module/doc/view/index.html.php +++ b/module/doc/view/index.html.php @@ -33,8 +33,8 @@ doc->title;?> - doc->size;?> - doc->addedBy;?> + doc->size;?> + doc->addedBy;?> doc->editedDate;?> diff --git a/module/execution/control.php b/module/execution/control.php index cf6b9eea59..433c01591d 100644 --- a/module/execution/control.php +++ b/module/execution/control.php @@ -727,6 +727,9 @@ class execution extends control } if($type == 'bymodule') { + $module = $this->loadModel('tree')->getByID($param); + $productID = $module->root; + $_COOKIE['storyModuleParam'] = $param; $_COOKIE['storyProductParam'] = 0; $_COOKIE['storyBranchParam'] = 0; @@ -820,7 +823,7 @@ class execution extends control $actionURL = $this->createLink('execution', 'story', "executionID=$executionID&orderBy=$orderBy&type=bySearch&queryID=myQueryID"); $branchGroups = $this->loadModel('branch')->getByProducts(array_keys($products)); $branchOption = array(); - foreach($branchGroups as $productID => $branches) + foreach($branchGroups as $branches) { foreach($branches as $branchID => $name) { diff --git a/module/execution/css/x.bug.css b/module/execution/css/x.bug.css index ae214a0d8a..ab6c8a986f 100644 --- a/module/execution/css/x.bug.css +++ b/module/execution/css/x.bug.css @@ -1,5 +1,5 @@ body {margin-bottom: 0px !important;} -#main {min-width: unset; overflow-y: overlay;} +#main {min-width: unset; overflow-y: overlay; position: unset !important;} #main > .container {width: 100% !important;} #mainContent > .main-col {margin-top: 0px;} #mainMenu, #sidebar, .dropdown, .table-footer > .table-actions, .table-footer>.table-statistic, .pager > li > .pager-size-menu {display: none;} diff --git a/module/execution/css/x.story.css b/module/execution/css/x.story.css index 715f595609..5e9ce09e29 100644 --- a/module/execution/css/x.story.css +++ b/module/execution/css/x.story.css @@ -1,6 +1,6 @@ body {margin-bottom: 0px !important;} #main {min-width: unset; overflow-y: overlay;} -#main > .container {width: 100% !important;} +#main > .container {width: 100% !important; position: unset !important;} #mainContent > .main-col {margin-top: 0px;} #mainMenu, #sidebar, .dropdown, .c-sort, .c-category, .c-user, .c-estimate, .c-stage, .c-count, .c-actions-7, .c-actions, .table-footer > .table-statistic, .table-footer > .table-actions, .pager > li > .pager-size-menu {display: none;} #storyList > thead > tr > .c-status, #storyList > thead > tr > .c-pri, #storyList > tbody > tr > .c-status, #storyList > tbody > tr > .c-pri {display: table-cell !important;} diff --git a/module/execution/css/x.task.css b/module/execution/css/x.task.css index 1edfd18ad9..300514ffb8 100644 --- a/module/execution/css/x.task.css +++ b/module/execution/css/x.task.css @@ -1,7 +1,7 @@ body {margin-bottom: 0px !important;} td .task-toggle {pointer-events: auto !important;} #mainMenu, #sidebar, .dropdown, .table-footer > .table-actions, .table-footer > .table-statistic, .pager > li > .pager-size-menu {display: none;} -#main {min-width: unset; overflow-y: overlay;} +#main {min-width: unset; overflow-y: overlay; position: unset !important;} #main > .container {width: 100% !important;} #mainContent > .main-col {margin-top: 0px;} #xx-title {background-color: #F2F2F2; padding-left: 15px; line-height: 36px;} diff --git a/module/execution/js/kanban.js b/module/execution/js/kanban.js index 1be0d9bd5f..50ac5ec859 100644 --- a/module/execution/js/kanban.js +++ b/module/execution/js/kanban.js @@ -293,7 +293,7 @@ function createColumnCreateMenu(options) else if(col.type == 'wait') { if(priv.canCreateTask) items.push({label: taskLang.create, url: $.createLink('task', 'create', 'executionID=' + executionID + "&storyID=0&moduleID=0&taskID=0&todoID=0&extra=regionID=" + regionID + ",laneID=" + laneID + ",columnID=" + col.id, '', true), className: 'iframe', attrs: {'data-toggle': 'modal', 'data-width': '80%'}}); - if(priv.canBatchCreateTask) items.push({label: taskLang.batchCreate, url: $.createLink('task', 'batchcreate', 'executionID=' + executionID + "&storyID=0&moduleID=0&taskID=0&iframe=0&extra=regionID=" + regionID + ",laneID=" + laneID + ",columnID=" + col.id, '', true), className: 'iframe', attrs: {'data-toggle': 'modal', 'data-width': '80%'}}); + if(priv.canBatchCreateTask) items.push({label: taskLang.batchCreate, url: $.createLink('task', 'batchcreate', 'executionID=' + executionID + "&storyID=0&moduleID=0&taskID=0&iframe=0&extra=regionID=" + regionID + ",laneID=" + laneID + ",columnID=" + col.id, '', true), className: 'iframe', attrs: {'data-toggle': 'modal', 'data-width': '90%'}}); if(priv.canImportBug && vision == 'rnd') items.push({label: executionLang.importBug, url: $.createLink('execution', 'importBug', 'executionID=' + executionID + "&storyID=0&moduleID=0&taskID=0&todoID=0&extra=laneID=" + laneID + ",columnID=" + col.id, '', true), className: 'iframe', attrs: {'data-toggle': 'modal', 'data-width': '90%'}}); } return items; @@ -1358,7 +1358,7 @@ function createBugMenu(options) if(priv.canResolveBug && (bug.$col.type == 'unconfirmed' || bug.$col.type == 'confirmed' || bug.$col.type == 'fixing')) items.push({label: bugLang.resolve, icon: 'checked', url: createLink('bug', 'resolve', 'bugID=' + bug.id, '', 'true'), className: 'iframe', attrs: {'data-toggle': 'modal', 'data-width': '80%'}}); if(priv.canConfirmBug && (bug.$col.type == 'fixed' || bug.$col.type == 'testing' || bug.$col.type == 'tested')) items.push({label: bugLang.close, icon: 'off', url: createLink('bug', 'close', 'bugID=' + bug.id, '', 'true'), className: 'iframe', attrs: {'data-toggle': 'modal', 'data-width': '80%'}}); if(priv.canConfirmBug && bug.$col.type == 'unconfirmed') items.push({label: bugLang.confirmBug, icon: 'ok', url: createLink('bug', 'confirmbug', 'bugID=' + bug.id, '', 'true'), className: 'iframe', attrs: {'data-toggle': 'modal', 'data-width': '80%'}}); - if(priv.canCopyBug) items.push({label: bugLang.copy, icon: 'copy', url: createLink('bug', 'create', 'productID=' + productID + '&branch=' + '' + '&extras=bugID=' + bug.id, '', 'true'), className: 'iframe', attrs: {'data-toggle': 'modal', 'data-width': '80%'}}); + if(priv.canCopyBug) items.push({label: bugLang.copy, icon: 'copy', url: createLink('bug', 'create', 'productID=' + productID + '&branch=&extras=bugID=' + bug.id + ',regionID=' + bug.$lane.region + ',laneID=' + bug.lane + ',columnID=' + bug.column + ',executionID=' + executionID, '', 'true'), className: 'iframe', attrs: {'data-toggle': 'modal', 'data-width': '80%'}}); if(priv.canToStoryBug && (bug.$col.type != 'closed')) items.push({label: bugLang.toStory, icon: 'lightbulb', url: createLink('story', 'create', 'product=' + productID + '&branch=' + '0' + '&module=' + '0' + '&story=' + '0' + '&execution=' + '0' + '&bugID=' + bug.id, '', 'true'), className: 'iframe', attrs: {'data-toggle': 'modal', 'data-width': '80%'}}); if(priv.canActivateBug && (bug.$col.type == 'fixed') || bug.$col.type == 'testing' || bug.$col.type == 'tested' || bug.$col.type == 'closed') items.push({label: bugLang.activate, icon: 'magic', url: createLink('bug', 'activate', 'bugID=' + bug.id, '', 'true'), className: 'iframe', attrs: {'data-toggle': 'modal', 'data-width': '80%'}}); if(priv.canDeleteBug) items.push({label: bugLang.delete, icon: 'trash', onClick: function(){deleteCard('bug', bug.id, bug.$lane.region)}}); diff --git a/module/execution/js/story.js b/module/execution/js/story.js index 6eeeee6785..a6dcb47577 100644 --- a/module/execution/js/story.js +++ b/module/execution/js/story.js @@ -62,6 +62,8 @@ $(function() } else { + if(!unlinkTaskIdList) return false; + $('#storyIdList').val(unlinkTaskIdList); } } diff --git a/module/execution/js/taskkanban.js b/module/execution/js/taskkanban.js index 28588a9b89..9fc36d555f 100644 --- a/module/execution/js/taskkanban.js +++ b/module/execution/js/taskkanban.js @@ -969,7 +969,7 @@ function createColumnCreateMenu(options) else { if(priv.canCreateTask) items.push({label: taskLang.create, url: $.createLink('task', 'create', 'executionID=' + executionID, '', true), className: 'iframe', attrs: {'data-width': '80%'}}); - if(priv.canBatchCreateTask) items.push({label: taskLang.batchCreate, url: $.createLink('task', 'batchcreate', 'executionID=' + executionID, '', true), className: 'iframe', attrs: {'data-width': '80%'}}); + if(priv.canBatchCreateTask) items.push({label: taskLang.batchCreate, url: $.createLink('task', 'batchcreate', 'executionID=' + executionID, '', true), className: 'iframe', attrs: {'data-width': '90%'}}); if(priv.canImportBug) items.push({label: executionLang.importBug, url: $.createLink('execution', 'importBug', 'executionID=' + executionID, '', true), className: 'iframe', attrs: {'data-width': '90%'}}); } return items; diff --git a/module/execution/model.php b/module/execution/model.php index aea6c8cfff..bc4b048e4c 100644 --- a/module/execution/model.php +++ b/module/execution/model.php @@ -4309,12 +4309,12 @@ class executionModel extends model * Print execution nested list. * * @param object $execution - * @param int $isChild + * @param bool $isChild * @param array $users * @access public * @return void */ - public function printNestedList($execution, $isChild = false, $users, $productID) + public function printNestedList($execution, $isChild, $users, $productID) { $this->loadModel('task'); $this->loadModel('execution'); @@ -4374,7 +4374,14 @@ class executionModel extends model } } - common::printIcon('programplan', 'edit', "stageID=$execution->id&projectID=$execution->project", $execution, 'list', '', '', 'iframe', true); + if($execution->type == 'stage') + { + common::printIcon('programplan', 'edit', "stageID=$execution->id&projectID=$execution->project", $execution, 'list', '', '', 'iframe', true); + } + else + { + common::printIcon('execution', 'edit', "executionID=$execution->id", $execution, 'list', '', '', 'iframe', true); + } $disabled = !empty($execution->children) ? ' disabled' : ''; if($execution->status != 'closed' and common::hasPriv('execution', 'close', $execution)) diff --git a/module/execution/view/bug.html.php b/module/execution/view/bug.html.php index 0c457dbf6c..e0e77ed7c5 100644 --- a/module/execution/view/bug.html.php +++ b/module/execution/view/bug.html.php @@ -210,7 +210,7 @@ $(function(){$('#executionBugForm').table();}) function handleLinkButtonClick() { - var xxcUrl = "xxc:openInApp/zentao-integrated/" + encodeURIComponent(window.location.href.replace(/.display=card/, '').replace(/\.xhtml/, '.html')); + var xxcUrl = "xxc:openInApp/zentao-integrated/" + encodeURIComponent(window.location.href.replace(/.display=card/, '').replace('xhtml', 'html')); window.open(xxcUrl); } diff --git a/module/execution/view/importtask.html.php b/module/execution/view/importtask.html.php index b47802bb63..03b40897ad 100644 --- a/module/execution/view/importtask.html.php +++ b/module/execution/view/importtask.html.php @@ -60,7 +60,7 @@ execution];?> pri == '0' ? '' : zget($lang->task->priList, $task->pri, $task->pri);?> - id", $task->name, '', "class='preview'", true, isonlybody())) echo $task->name;?> + id", $task->name, '', "class='preview'", true, true)) echo $task->name;?> >assignedToRealName;?> left . ' ' . $lang->execution->workHourUnit;?> delay)) echo 'delayed';?>>deadline, 0, 4) > 0) echo $task->deadline;?> diff --git a/module/execution/view/kanban.html.php b/module/execution/view/kanban.html.php index 85767b6478..95568a7e96 100644 --- a/module/execution/view/kanban.html.php +++ b/module/execution/view/kanban.html.php @@ -214,7 +214,7 @@ js::set('priv', ' . html::a(helper::createLink('task', 'create', "execution=$execution->id", '', true), $lang->task->create, '', "class='iframe'") . '';?> ' . html::a(helper::createLink('execution', 'importBug', "executionID=$execution->id", '', true), $lang->execution->importBug, '', "class='iframe' data-width=90%") . '';?> ' . html::a(helper::createLink('execution', 'importTask', "toExecution=$execution->id", '', true), $lang->execution->importTask, '', "class='iframe' data-width=90%") . '';?> - ' . html::a(helper::createLink('task', 'batchCreate', "execution=$execution->id", '', true), $lang->execution->batchCreateTask, '', "class='iframe'") . '';?> + ' . html::a(helper::createLink('task', 'batchCreate', "execution=$execution->id", '', true), $lang->execution->batchCreateTask, '', "class='iframe' data-width=90%") . '';?> diff --git a/module/execution/view/story.html.php b/module/execution/view/story.html.php index 933e131229..0fd94dc27d 100644 --- a/module/execution/view/story.html.php +++ b/module/execution/view/story.html.php @@ -400,7 +400,7 @@ $(function() }); function handleLinkButtonClick() { - var xxcUrl = "xxc:openInApp/zentao-integrated/" + encodeURIComponent(window.location.href.replace(/.display=card/, '').replace(/\.xhtml/, '.html')); + var xxcUrl = "xxc:openInApp/zentao-integrated/" + encodeURIComponent(window.location.href.replace(/.display=card/, '').replace('xhtml', 'html')); window.open(xxcUrl); } diff --git a/module/execution/view/task.html.php b/module/execution/view/task.html.php index 9be2c7db19..c22f33ac04 100644 --- a/module/execution/view/task.html.php +++ b/module/execution/view/task.html.php @@ -477,7 +477,7 @@ $(function() app->getViewType() == 'xhtml'):?> function handleLinkButtonClick() { - var xxcUrl = "xxc:openInApp/zentao-integrated/" + encodeURIComponent(window.location.href.replace(/.display=card/, '').replace(/\.xhtml/, '.html')); + var xxcUrl = "xxc:openInApp/zentao-integrated/" + encodeURIComponent(window.location.href.replace(/.display=card/, '').replace('xhtml', 'html')); window.open(xxcUrl); } diff --git a/module/execution/view/taskkanban.html.php b/module/execution/view/taskkanban.html.php index c2e2f5d370..fffb0e79c6 100644 --- a/module/execution/view/taskkanban.html.php +++ b/module/execution/view/taskkanban.html.php @@ -116,7 +116,7 @@ ' . html::a(helper::createLink('execution', 'importBug', "execution=$execution->id", '', true), $lang->execution->importBug, '', "class='iframe'") . '';?> ' . html::a(helper::createLink('task', 'create', "execution=$execution->id", '', true), $lang->task->create, '', "class='iframe'") . '';?> - ' . html::a(helper::createLink('task', 'batchCreate', "execution=$execution->id", '', true), $lang->execution->batchCreateTask, '', "class='iframe'") . '';?> + ' . html::a(helper::createLink('task', 'batchCreate', "execution=$execution->id", '', true), $lang->execution->batchCreateTask, '', "class='iframe' data-width=90%") . '';?> diff --git a/module/job/control.php b/module/job/control.php index ac4677c3c0..d25c6a0fe9 100644 --- a/module/job/control.php +++ b/module/job/control.php @@ -38,6 +38,9 @@ class job extends control */ public function browse($repoID = 0, $orderBy = 'id_desc', $recTotal = 0, $recPerPage = 20, $pageID = 1) { + $repos = $this->loadModel('repo')->getRepoPairs('devops'); + if(empty($repos)) $this->locate($this->repo->createLink('create')); + /* Set session. */ $this->loadModel('ci')->setMenu($repoID); diff --git a/module/product/css/x.browse.css b/module/product/css/x.browse.css index 1f1abfbddb..7486d97710 100644 --- a/module/product/css/x.browse.css +++ b/module/product/css/x.browse.css @@ -1,7 +1,7 @@ body {margin-bottom: 0px !important;} td .story-toggle {pointer-events: auto !important;} #mainMenu, #sidebar, .table-footer > .table-actions, .dropdown, .table-footer>.table-statistic, .pager > li > .pager-size-menu {display: none;} -#main {min-width: unset; overflow-y: overlay;} +#main {min-width: unset; overflow-y: overlay; position: unset !important;} #main > .container {width: 100% !important;} #mainContent > .main-col {margin-top: 0px;} #xx-title {background-color: #F2F2F2; padding-left: 15px; line-height: 40px;} diff --git a/module/product/view/browse.html.php b/module/product/view/browse.html.php index 770dd3c972..9b340e2ed5 100644 --- a/module/product/view/browse.html.php +++ b/module/product/view/browse.html.php @@ -749,7 +749,7 @@ function setBadgeStyle(obj, isShow) function handleLinkButtonClick() { - var xxcUrl = "xxc:openInApp/zentao-integrated/" + encodeURIComponent(window.location.href.replace(/.display=card/, '').replace(/\.xhtml/, '.html')); + var xxcUrl = "xxc:openInApp/zentao-integrated/" + encodeURIComponent(window.location.href.replace(/.display=card/, '').replace('xhtml', 'html')); window.open(xxcUrl); } diff --git a/module/productplan/control.php b/module/productplan/control.php index 9f2dc98d98..fb31e69a96 100644 --- a/module/productplan/control.php +++ b/module/productplan/control.php @@ -244,11 +244,11 @@ class productplan extends control public function delete($planID, $confirm = 'no') { $plan = $this->productplan->getById($planID); - if($plan->parent < 0) die(js::alert($this->lang->productplan->cannotDeleteParent)); + if($plan->parent < 0) return print(js::alert($this->lang->productplan->cannotDeleteParent)); if($confirm == 'no') { - die(js::confirm($this->lang->productplan->confirmDelete, $this->createLink('productPlan', 'delete', "planID=$planID&confirm=yes"))); + return print(js::confirm($this->lang->productplan->confirmDelete, $this->createLink('productPlan', 'delete', "planID=$planID&confirm=yes"))); } else { @@ -274,7 +274,7 @@ class productplan extends control } if($this->viewType == 'json') return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess)); - die(js::reload('parent')); + return print(js::reload('parent')); } } @@ -390,7 +390,7 @@ class productplan extends control if(!$plan) { if(defined('RUN_MODE') && RUN_MODE == 'api') return $this->send(array('status' => 'fail', 'code' => 404, 'message' => '404 Not found')); - die(js::error($this->lang->notFound) . js::locate($this->createLink('product', 'index'))); + return print(js::error($this->lang->notFound) . js::locate($this->createLink('product', 'index'))); } $this->session->set('storyList', $this->createLink('productplan', 'view', "planID=$planID&type=story"), 'product'); @@ -543,14 +543,14 @@ class productplan extends control { if($confirm == 'no') { - die(js::confirm($this->lang->productplan->confirmActivate, $this->createLink('productplan', 'activate', "planID=$planID&confirm=yes"), 'parent')); + return print(js::confirm($this->lang->productplan->confirmActivate, $this->createLink('productplan', 'activate', "planID=$planID&confirm=yes"), 'parent')); } else { $this->productplan->updateStatus($planID, 'doing', 'activated'); - if(dao::isError()) die(js::error(dao::getError())); - die(js::reload('parent')); + if(dao::isError()) return print(js::error(dao::getError())); + return print(js::reload('parent')); } } @@ -625,7 +625,7 @@ class productplan extends control { $this->productplan->linkStory($planID); if($this->viewType == 'json') return $this->send(array('result' => 'success')); - die(js::locate(inlink('view', "planID=$planID&type=story&orderBy=$orderBy"), 'parent')); + return print(js::locate(inlink('view', "planID=$planID&type=story&orderBy=$orderBy"), 'parent')); } $this->session->set('storyList', inlink('view', "planID=$planID&type=story&orderBy=$orderBy&link=true¶m=" . helper::safe64Encode("&browseType=$browseType&queryID=$param")), 'product'); @@ -710,7 +710,7 @@ class productplan extends control { if($confirm == 'no') { - die(js::confirm($this->lang->productplan->confirmUnlinkStory, $this->createLink('productplan', 'unlinkstory', "storyID=$storyID&planID=$planID&confirm=yes"))); + return print(js::confirm($this->lang->productplan->confirmUnlinkStory, $this->createLink('productplan', 'unlinkstory', "storyID=$storyID&planID=$planID&confirm=yes"))); } else { @@ -732,7 +732,7 @@ class productplan extends control } return $this->send($response); } - die(js::reload('parent')); + return print(js::reload('parent')); } } @@ -771,7 +771,7 @@ class productplan extends control { $this->productplan->linkBug($planID); if($this->viewType == 'json') return $this->send(array('result' => 'success')); - die(js::locate(inlink('view', "planID=$planID&type=bug&orderBy=$orderBy"), 'parent')); + return print(js::locate(inlink('view', "planID=$planID&type=bug&orderBy=$orderBy"), 'parent')); } /* Load module and set session. */ @@ -852,7 +852,7 @@ class productplan extends control { if($confirm == 'no') { - die(js::confirm($this->lang->productplan->confirmUnlinkBug, $this->createLink('productplan', 'unlinkbug', "bugID=$bugID&confirm=yes"))); + return print(js::confirm($this->lang->productplan->confirmUnlinkBug, $this->createLink('productplan', 'unlinkbug', "bugID=$bugID&confirm=yes"))); } else { @@ -874,7 +874,7 @@ class productplan extends control } return $this->send($response); } - die(js::reload('parent')); + return print(js::reload('parent')); } } diff --git a/module/productplan/css/x.view.css b/module/productplan/css/x.view.css index ed93fc1ed9..0099dbac1e 100644 --- a/module/productplan/css/x.view.css +++ b/module/productplan/css/x.view.css @@ -1,6 +1,6 @@ #mainMenu, .actions, .pager-size-menu, .tab-btn-container ul li span {display: none;} -#main {min-width: unset; overflow-y: overlay;} -.main-content {padding: 0; } +#main {min-width: unset; overflow-y: overlay; position: unset !important;} +.main-content {padding: 0;} .main-table {margin-bottom: 40px;} .main-content, .main-table > .table, .main-table > .table-footer, .main-table > .table-header, .main-table > .table-responsive {box-shadow: none!important;} .table-footer {position: fixed; width: 100%; bottom: 0;} diff --git a/module/productplan/view/view.html.php b/module/productplan/view/view.html.php index 4aaab515ba..584c631b62 100644 --- a/module/productplan/view/view.html.php +++ b/module/productplan/view/view.html.php @@ -609,7 +609,7 @@ diff --git a/module/task/control.php b/module/task/control.php index 0aaa687020..e7d5578ab6 100755 --- a/module/task/control.php +++ b/module/task/control.php @@ -438,7 +438,7 @@ class task extends control $customFields[$field] = $this->lang->task->$field; } - if($execution->lifetime == 'ops') unset($customFields['story']); + if($execution->lifetime == 'ops' or $execution->attribute == 'request' or $execution->attribute == 'review') unset($customFields['story']); $this->view->customFields = $customFields; $this->view->showFields = $this->config->task->custom->batchCreateFields; @@ -801,7 +801,7 @@ class task extends control if(($this->app->tab == 'execution' or ($this->config->vision == 'lite' and $this->app->tab == 'project')) and $execution->type == 'kanban') { $rdSearchValue = $this->session->rdSearchValue ? $this->session->rdSearchValue : ''; - $kanbanData = $this->loadModel('kanban')->getRDKanban($task->execution, $execLaneType, 'id_desc', 0, $execGroup, $rdSearchValue); + $kanbanData = $this->loadModel('kanban')->getRDKanban($task->execution, $execLaneType, 'id_desc', 0, $execGroupBy, $rdSearchValue); $kanbanData = json_encode($kanbanData); return print(js::closeModal('parent.parent', '', "parent.parent.updateKanban($kanbanData)")); diff --git a/module/task/css/x.view.css b/module/task/css/x.view.css index 5a96385b1f..94c67e8533 100644 --- a/module/task/css/x.view.css +++ b/module/task/css/x.view.css @@ -1,5 +1,5 @@ body * {font-size: 13px !important; line-height: 1.42857143; color: rgb(51, 51, 51);} -#main {margin-bottom: 40px; min-width: unset;} +#main {margin-bottom: 40px; min-width: unset; position: unset !important;} #mainMenu .pull-left > a, #mainMenu .pull-left .divider, #mainMenu .pull-right, #mainContent .col-4, .main-actions {display: none;} #mainMenu {position: fixed; width: 100%; z-index: 999;} #scrollContent {margin-top: 35px; height: calc(100% - 70px); display: block; overflow: hidden;} diff --git a/module/task/js/create.js b/module/task/js/create.js index ab94beed36..4e87cc3cf1 100644 --- a/module/task/js/create.js +++ b/module/task/js/create.js @@ -6,7 +6,7 @@ $(function() var fieldList = showFields + ','; var requiredList = ',' + requiredFields + ','; - if(lifetime == 'ops') + if(lifetime == 'ops' || (typeof execAttribute != 'undefined' && (execAttribute == 'request' || execAttribute == 'review'))) { $('#fieldsstory').parent('div').addClass('hidden'); } @@ -22,6 +22,10 @@ $(function() saveCustomFields('createFields'); return false; }); + + var executionID = $('#execution').val(); + loadStories(executionID); + }) /** @@ -299,7 +303,7 @@ function setLane(regionID) /* Get select of stories.*/ function setStories(moduleID, executionID) { - link = createLink('story', 'ajaxGetExecutionStories', 'executionID=' + executionID + '&productID=0&branch=all&moduleID=' + moduleID + '&storyID=0&number=&type=full&status=unclosed'); + link = createLink('story', 'ajaxGetExecutionStories', 'executionID=' + executionID + '&productID=0&branch=all&moduleID=' + moduleID + '&storyID=0&number=&type=full&status=active'); $.get(link, function(stories) { var storyID = $('#story').val(); diff --git a/module/task/model.php b/module/task/model.php index 05c7217e63..857e6eef83 100644 --- a/module/task/model.php +++ b/module/task/model.php @@ -116,8 +116,8 @@ class taskModel extends model $task = $this->loadModel('file')->processImgURL($task, $this->config->task->editor->create['id'], $this->post->uid); /* Fix Bug #1525 */ - $executionLifetime = $this->dao->select('*')->from(TABLE_PROJECT)->where('id')->eq($executionID)->fetch('lifetime'); - if($executionLifetime == 'ops') + $execution = $this->dao->select('*')->from(TABLE_PROJECT)->where('id')->eq($task->execution)->fetch(); + if($execution->lifetime == 'ops' or $execution->attribute == 'request' or $execution->attribute == 'review') { $requiredFields = str_replace(",story,", ',', "$requiredFields"); $task->story = 0; @@ -381,9 +381,9 @@ class taskModel extends model } /* Fix bug #1525*/ - $executionLifetime = $this->dao->select('*')->from(TABLE_PROJECT)->where('id')->eq($executionID)->fetch('lifetime'); + $execution = $this->dao->select('*')->from(TABLE_PROJECT)->where('id')->eq($executionID)->fetch(); $requiredFields = ',' . $this->config->task->create->requiredFields . ','; - if($executionLifetime == 'ops') $requiredFields = str_replace(',story,', ',', $requiredFields); + if($execution->lifetime == 'ops' or $execution->attribute == 'request' or $execution->attribute == 'review') $requiredFields = str_replace(',story,', ',', $requiredFields); $requiredFields = trim($requiredFields, ','); /* check data. */ @@ -809,7 +809,7 @@ class taskModel extends model } else { - if($team[$oldTask->assignedTo]->left == 0 && $team[$oldTask->assignedTo]->consumed != 0) + if($team[$oldTask->assignedTo]->left == 0 and $team[$oldTask->assignedTo]->consumed != 0 and $this->app->rawMethod != 'deleteestimate') { if($oldTask->assignedTo != $teams[count($teams) - 1]) { @@ -1036,9 +1036,9 @@ class taskModel extends model $task->mode = ''; } - $executionLifetime = $this->dao->select('*')->from(TABLE_PROJECT)->where('id')->eq($task->execution)->fetch('lifetime'); + $execution = $this->dao->select('*')->from(TABLE_PROJECT)->where('id')->eq($task->execution)->fetch(); $requiredFields = "," . $this->config->task->edit->requiredFields . ","; - if($executionLifetime == 'ops') + if($execution->lifetime == 'ops' or $execution->attribute == 'request' or $execution->attribute == 'review') { $requiredFields = str_replace(",story,", ',', "$requiredFields"); $task->story = 0; @@ -1804,6 +1804,8 @@ class taskModel extends model $data->assignedDate = $now; $data->finishedBy = $this->app->user->account; $data->finishedDate = $now; + + $this->action->create('task', $taskID, 'Finished'); } elseif($task->status == 'wait') { @@ -2512,7 +2514,7 @@ class taskModel extends model ->orWhere('t1.finishedList')->like("%,{$account},%") ->markRight(1) ->fi() - ->beginIF($this->app->rawModule == 'my' or $this->app->rawModule == 'block')->andWhere('(t2.status')->ne('suspended')->orWhere('t4.status')->ne('suspended')->markRight(1)->fi() + ->beginIF($type == 'assignedTo' and ($this->app->rawModule == 'my' or $this->app->rawModule == 'block'))->andWhere('t2.status', true)->ne('suspended')->orWhere('t4.status')->ne('suspended')->markRight(1)->fi() ->beginIF($type != 'all' and $type != 'finishedBy' and $type != 'assignedTo')->andWhere("t1.`$type`")->eq($account)->fi() ->beginIF($type == 'assignedTo')->andWhere("(t1.assignedTo = '{$account}' or (t1.mode = 'multi' and t5.`account` = '{$account}') )")->fi() ->orderBy($orderBy) @@ -3738,6 +3740,7 @@ class taskModel extends model public function getFinishedUsers($taskID = 0, $team = array()) { $task = $this->getById($taskID); + if($task->activatedDate == '') $task->activatedDate = "0000-00-00"; return $this->dao->select('actor')->from(TABLE_ACTION) ->where('objectType')->eq('task') ->andWhere('objectID')->eq($taskID) @@ -3757,7 +3760,7 @@ class taskModel extends model * @access public * @return string */ - public function buildNestedList($execution, $task, $isChild = false, $showmore = false, $users) + public function buildNestedList($execution, $task, $isChild = false, $showmore = false, $users = array()) { $showmore = $showmore ? 'showmore' : ''; $trAttrs = "data-id='t$task->id'"; diff --git a/module/task/view/batchcreate.html.php b/module/task/view/batchcreate.html.php index 7c0c74879b..45e08a1aa3 100755 --- a/module/task/view/batchcreate.html.php +++ b/module/task/view/batchcreate.html.php @@ -45,7 +45,7 @@ $colspan = count($visibleFields) + 3; task->batchCreate;?> - lifetime != 'ops'):?> + lifetime != 'ops' and $execution->attribute != 'request' and $execution->attribute != 'review'):?> @@ -67,7 +67,7 @@ $colspan = count($visibleFields) + 3; idAB;?> moduleBox'>task->module?> - lifetime != 'ops'):?> + lifetime != 'ops' and $execution->attribute != 'request' and $execution->attribute != 'review'):?> storyBox'>task->story;?> task->name;?> @@ -99,7 +99,7 @@ $colspan = count($visibleFields) + 3; $lang->task->typeList['ditto'] = $lang->task->ditto; $members['ditto'] = $lang->task->ditto; $modules['ditto'] = $lang->task->ditto; - if($execution->lifetime == 'ops') $colspan = $colspan - 1; + if($execution->lifetime != 'ops' and $execution->attribute != 'request' and $execution->attribute != 'review') $colspan = $colspan - 1; ?> task->batchCreate; $i++):?> id)'")?> - lifetime != 'ops'):?> + lifetime != 'ops' and $execution->attribute != 'request' and $execution->attribute != 'review'):?>
@@ -266,7 +266,7 @@ $colspan = count($visibleFields) + 3; - lifetime != 'ops'):?> + lifetime != 'ops' and $execution->attribute != 'request' and $execution->attribute != 'review'):?>
diff --git a/module/task/view/create.html.php b/module/task/view/create.html.php index 139676690b..3dd6fba585 100644 --- a/module/task/view/create.html.php +++ b/module/task/view/create.html.php @@ -21,7 +21,7 @@ error->notempty, $lang->task->estimate))?> lifetime);?> - + team) or $task->assignedTo == $this->app->user->account or ($task->mode == 'multi' and isset($task->team[$app->user->account]))):?> app->user->admin or $this->app->user->account == $estimate->account) + if($this->app->user->account == $estimate->account) { common::printIcon('task', 'editEstimate', "estimateID=$estimate->id", '', 'list', 'pencil', '', 'showinonlybody', true); common::printIcon('task', 'deleteEstimate', "estimateID=$estimate->id", '', 'list', 'close', 'hiddenwin', 'showinonlybody'); diff --git a/module/task/view/view.html.php b/module/task/view/view.html.php index e2f4091aa7..f0732f48dd 100644 --- a/module/task/view/view.html.php +++ b/module/task/view/view.html.php @@ -166,8 +166,10 @@
+ ' . $lang->goback, '', "class='btn btn-secondary'");?> -
";?> +
";?> + executionList = $execution;?> task->buildOperateMenu($task, 'view');?>
@@ -442,7 +444,7 @@ diff --git a/module/testcase/css/x.view.css b/module/testcase/css/x.view.css index 8d3fc89b31..7e268496c8 100644 --- a/module/testcase/css/x.view.css +++ b/module/testcase/css/x.view.css @@ -1,5 +1,5 @@ .side-col.col-4 {display: none;} -#main {margin-bottom: 40px;} +#main {margin-bottom: 40px; position: unset !important;} #mainMenu {margin-top: 0px;} #mainMenu .btn {display: none;} #mainMenu .divider {display: none;} diff --git a/module/upgrade/model.php b/module/upgrade/model.php index d92a655196..450dd6afd5 100644 --- a/module/upgrade/model.php +++ b/module/upgrade/model.php @@ -4742,6 +4742,7 @@ class upgradeModel extends model $data->begin = $projects[$projectID]->begin; $data->end = $projects[$projectID]->end; $data->projectStatus = $projects[$projectID]->status; + $data->team = $projects[$projectID]->team; $data->PM = $projects[$projectID]->PM; $data->projectAcl = $projects[$projectID]->acl == 'custom' ? 'private' : $projects[$projectID]->acl; diff --git a/module/user/js/batchcreate.js b/module/user/js/batchcreate.js index 8e7bd97935..baad36b81d 100644 --- a/module/user/js/batchcreate.js +++ b/module/user/js/batchcreate.js @@ -91,18 +91,45 @@ $(document).on('change', '[id^=visions]', function() } }) -$('select[id^="visions"]').each(function() +var rndGroupSelect = liteGroupSelect = allGroupSelect = emptyGroupSelect = ''; +$.post(createLink('user', 'ajaxGetGroup', "visions=rnd&i=2"), function(data) { - var i = $(this).attr('id').replace(/[^0-9]/ig, ''); + rndGroupSelect = data; var vision = $('#visions1 option:selected').val(); + if(vision == 'rnd') initGroup(data); +}); +$.post(createLink('user', 'ajaxGetGroup', "visions=lite&i=2"), function(data) +{ + liteGroupSelect = data; + var vision = $('#visions1 option:selected').val(); + if(vision == 'lite') initGroup(data); +}); +$.post(createLink('user', 'ajaxGetGroup', "visions=rnd,lite&i=2"), function(data) +{ + allGroupSelect = data; +}); +$.post(createLink('user', 'ajaxGetGroup', "visions=null&i=2"), function(data) +{ + emptyGroupSelect = data; +}); - $.post(createLink('user', 'ajaxGetGroup', "visions=" + vision + '&i=' + i + '&selected=' + $('#group' + i).val()), function(data) +function initGroup(data) +{ + $('select[id^="visions"]').each(function() { - $('#group' + i).replaceWith(data); - $('#group' + i + '_chosen').remove(); - $('#group' + i).chosen(); + var i = $(this).attr('id').replace(/[^0-9]/ig, ''); + var groupVal = $('#group' + i).val(); + + var dataObj = $(data); + var dataHtml = $(dataObj).attr('id', 'group' + i).attr('name', 'group[' + i + '][]').prop('outerHTML'); + + $('#group' + i).replaceWith(dataHtml); + $('#group' + i + '_chosen').remove(); + if(i == 1) $('#group' + i).find('option[value="ditto"]').remove(); + $('#group' + i).val(groupVal); + $('#group' + i).chosen(); }) -}) +} $(document).on('change', "select[id^='visions']", function() { @@ -119,6 +146,22 @@ $(document).on('change', "select[id^='visions']", function() $('#group' + i).chosen(); }) + visions = visions ? visions.join() : ''; + switch(visions) + { + case 'rnd': + var data = rndGroupSelect; + break; + case 'lite': + var data = liteGroupSelect; + break; + case 'rnd,lite': + var data = allGroupSelect; + break; + default: + var data = emptyGroupSelect; + break; + } for(n = i + 1; n <= batchCreateCount; n++) { if(n == i) continue; @@ -126,12 +169,12 @@ $(document).on('change', "select[id^='visions']", function() ((function(n) { - $.post(createLink('user', 'ajaxGetGroup', "visions=" + visions + '&i=' + n + '&selected=' + $('#group' + n).val()), function(data) - { - $('#group' + n).replaceWith(data); - $('#group' + n + '_chosen').remove(); - $('#group' + n).chosen(); - }) + var groupVal = $('#group' + n).val(); + var dataHtml = $(data).attr('id', 'group' + n).attr('name', 'group[' + n + '][]').prop('outerHTML'); + $('#group' + n).replaceWith(dataHtml); + $('#group' + n + '_chosen').remove(); + $('#group' + n).val(groupVal); + $('#group' + n).chosen(); }(n))); } }); diff --git a/www/theme/default/style.css b/www/theme/default/style.css index 9af189801e..a8fda8a560 100644 --- a/www/theme/default/style.css +++ b/www/theme/default/style.css @@ -98,3 +98,4 @@ body.xxc-embed {overflow-x: auto; overflow-y: hidden;} .xxc-embed #toolbar {position: fixed;right: 120px!important;} .xxc-embed #main {position: absolute;top: 50px;bottom: 0;left: 0;right: 0;overflow: auto;} .xxc-embed .fix-table-copy-wrapper {top: 50px!important;} +.xxc-embed #headerActions {right: 310px!important;} diff --git a/xuanxuan/extension/xuan/misc/ext/control/downloadclient.php b/xuanxuan/extension/xuan/misc/ext/control/downloadclient.php index d7549292d9..370e01f042 100644 --- a/xuanxuan/extension/xuan/misc/ext/control/downloadclient.php +++ b/xuanxuan/extension/xuan/misc/ext/control/downloadclient.php @@ -102,6 +102,7 @@ class myMisc extends misc if($action == 'downloadPackage') { + ini_set('memory_limit', '512M'); $account = $this->app->user->account; $clientDir = $this->app->wwwRoot . 'data/client/' . "$account/";