From ae84a5dc249753a350eefdb0fe91ba1f1d986ea7 Mon Sep 17 00:00:00 2001 From: z Date: Wed, 5 Aug 2020 16:33:57 +0800 Subject: [PATCH 01/24] * code for task #7600. --- module/bug/control.php | 2 +- module/bug/js/batchcreate.js | 3 ++ module/bug/view/batchedit.html.php | 2 ++ module/product/control.php | 49 +++++++++++++++++++++----- module/product/view/batchedit.html.php | 10 ++++++ module/project/control.php | 46 ++++++++++++++++++------ module/project/js/managemembers.js | 15 ++++++-- module/project/view/batchedit.html.php | 12 +++++++ module/story/js/batchcreate.js | 2 ++ module/task/js/batchcreate.js | 1 + module/task/js/create.js | 7 ++++ module/testcase/js/batchcreate.js | 1 + module/testcase/js/common.js | 1 + www/js/zui/picker/zui.picker.min.css | 4 ++- 14 files changed, 131 insertions(+), 24 deletions(-) diff --git a/module/bug/control.php b/module/bug/control.php index 66e2107a8d..99fda229b3 100644 --- a/module/bug/control.php +++ b/module/bug/control.php @@ -843,7 +843,7 @@ class bug extends control $appendUsers[$bug->assignedTo] = $bug->assignedTo; $appendUsers[$bug->resolvedBy] = $bug->resolvedBy; } - $users = $this->user->getPairs('devfirst|nodeleted', $appendUsers); + $users = $this->user->getPairs('devfirst|nodeleted', $appendUsers, $this->config->maxCount); $users = array('' => '', 'ditto' => $this->lang->bug->ditto) + $users; /* Assign. */ diff --git a/module/bug/js/batchcreate.js b/module/bug/js/batchcreate.js index 0195d8d71e..400b9763b7 100644 --- a/module/bug/js/batchcreate.js +++ b/module/bug/js/batchcreate.js @@ -23,6 +23,7 @@ function setBranchRelated(branchID, productID, num) if(!modules) modules = ''; $('#modules' + num).replaceWith(modules); $("#modules" + num + "_chosen").remove(); + $("#modules" + num).next('.picker').remove(); $("#modules" + num).chosen(); }); @@ -32,6 +33,7 @@ function setBranchRelated(branchID, productID, num) if(!projects) projects = ''; $('#projects' + num).replaceWith(projects); $("#projects" + num + "_chosen").remove(); + $("#projects" + num).next('.picker').remove(); $("#projects" + num).chosen(); }); @@ -59,6 +61,7 @@ function setOpenedBuilds(link, index) $('#buildBox' + index).html(builds); $('#buildBox' + index).find('select').val(selected); $('#openedBuilds' + index + '_chosen').remove(); + $('#openedBuilds' + index).next('.picker').remove(); $('#buildBox' + index + ' select').removeClass('select-3'); $('#buildBox' + index + ' select').addClass('select-1'); $('#buildBox' + index + ' select').attr('name','openedBuilds[' + index + '][]'); diff --git a/module/bug/view/batchedit.html.php b/module/bug/view/batchedit.html.php index 8395417e8f..f8e3f132c0 100644 --- a/module/bug/view/batchedit.html.php +++ b/module/bug/view/batchedit.html.php @@ -73,6 +73,7 @@ $bug):?> config->user->moreLink)) $this->config->moreLinks["assignedTos[$bugID]"] = $this->config->user->moreLink; if(!$productID) { $product = $this->product->getByID($bug->product); @@ -134,6 +135,7 @@ control == 'select' or $extendField->control == 'multi-select') ? " style='overflow:visible'" : '') . ">" . $this->loadModel('flow')->getFieldControl($extendField, $bug, $extendField->field . "[{$bugID}]") . "";?> + config->moreLinks["assignedTos[$bugID]"])) unset($this->config->moreLinks["assignedTos[$bugID]"]);?> diff --git a/module/product/control.php b/module/product/control.php index 69132d34cd..7be3fa71c4 100644 --- a/module/product/control.php +++ b/module/product/control.php @@ -261,12 +261,22 @@ class product extends control if($this->session->product) $rootID = $this->session->product; $this->product->setMenu($this->products, $rootID); + $this->loadModel('user'); + $poUsers = $this->user->getPairs('nodeleted|pofirst|noclosed', '', $this->config->maxCount); + if(!empty($this->config->user->moreLink)) $this->config->moreLinks["PO"] = $this->config->user->moreLink; + + $qdUsers = $this->user->getPairs('nodeleted|qdfirst|noclosed', '', $this->config->maxCount); + if(!empty($this->config->user->moreLink)) $this->config->moreLinks["QD"] = $this->config->user->moreLink; + + $rdUsers = $this->user->getPairs('nodeleted|devfirst|noclosed', '', $this->config->maxCount); + if(!empty($this->config->user->moreLink)) $this->config->moreLinks["RD"] = $this->config->user->moreLink; + $this->view->title = $this->lang->product->create; $this->view->position[] = $this->view->title; $this->view->groups = $this->loadModel('group')->getPairs(); - $this->view->poUsers = $this->loadModel('user')->getPairs('nodeleted|pofirst|noclosed', '', $this->config->maxCount); - $this->view->qdUsers = $this->loadModel('user')->getPairs('nodeleted|qdfirst|noclosed', '', $this->config->maxCount); - $this->view->rdUsers = $this->loadModel('user')->getPairs('nodeleted|devfirst|noclosed', '', $this->config->maxCount); + $this->view->poUsers = $poUsers; + $this->view->qdUsers = $qdUsers; + $this->view->rdUsers = $rdUsers; $this->view->lines = array('') + $this->loadModel('tree')->getLinePairs(); $this->view->rootID = $rootID; @@ -307,14 +317,25 @@ class product extends control $this->product->setMenu($this->products, $productID); $product = $this->product->getById($productID); + + $this->loadModel('user'); + $poUsers = $this->user->getPairs('nodeleted|pofirst', $product->PO, $this->config->maxCount); + if(!empty($this->config->user->moreLink)) $this->config->moreLinks["PO"] = $this->config->user->moreLink; + + $qdUsers = $this->user->getPairs('nodeleted|qdfirst', $product->QD, $this->config->maxCount); + if(!empty($this->config->user->moreLink)) $this->config->moreLinks["QD"] = $this->config->user->moreLink; + + $rdUsers = $this->user->getPairs('nodeleted|devfirst', $product->RD, $this->config->maxCount); + if(!empty($this->config->user->moreLink)) $this->config->moreLinks["RD"] = $this->config->user->moreLink; + $this->view->title = $this->lang->product->edit . $this->lang->colon . $product->name; $this->view->position[] = html::a($this->createLink($this->moduleName, 'browse'), $product->name); $this->view->position[] = $this->lang->product->edit; $this->view->product = $product; $this->view->groups = $this->loadModel('group')->getPairs(); - $this->view->poUsers = $this->loadModel('user')->getPairs('nodeleted|pofirst', $product->PO); - $this->view->qdUsers = $this->loadModel('user')->getPairs('nodeleted|qdfirst', $product->QD); - $this->view->rdUsers = $this->loadModel('user')->getPairs('nodeleted|devfirst', $product->RD); + $this->view->poUsers = $poUsers; + $this->view->qdUsers = $qdUsers; + $this->view->rdUsers = $rdUsers; $this->view->lines = array('') + $this->loadModel('tree')->getLinePairs(); unset($this->lang->product->typeList['']); @@ -364,14 +385,24 @@ class product extends control $appendRdUsers[$product->RD] = $product->RD; } + $this->loadModel('user'); + $poUsers = $this->user->getPairs('nodeleted|pofirst', $appendPoUsers); + if(!empty($this->config->user->moreLink)) $this->config->moreLinks["PO"] = $this->config->user->moreLink; + + $qdUsers = $this->user->getPairs('nodeleted|qdfirst', $appendQdUsers); + if(!empty($this->config->user->moreLink)) $this->config->moreLinks["QD"] = $this->config->user->moreLink; + + $rdUsers = $this->user->getPairs('nodeleted|devfirst', $appendRdUsers); + if(!empty($this->config->user->moreLink)) $this->config->moreLinks["RD"] = $this->config->user->moreLink; + $this->view->title = $this->lang->product->batchEdit; $this->view->position[] = $this->lang->product->batchEdit; $this->view->lines = array('') + $this->tree->getLinePairs(); $this->view->productIDList = $productIDList; $this->view->products = $products; - $this->view->poUsers = $this->loadModel('user')->getPairs('nodeleted|pofirst', $appendPoUsers); - $this->view->qdUsers = $this->loadModel('user')->getPairs('nodeleted|qdfirst', $appendQdUsers); - $this->view->rdUsers = $this->loadModel('user')->getPairs('nodeleted|devfirst', $appendRdUsers); + $this->view->poUsers = $poUsers; + $this->view->qdUsers = $qdUsers; + $this->view->rdUsers = $rdUsers; unset($this->lang->product->typeList['']); $this->display(); diff --git a/module/product/view/batchedit.html.php b/module/product/view/batchedit.html.php index 81c37c66a0..480b6b61fc 100755 --- a/module/product/view/batchedit.html.php +++ b/module/product/view/batchedit.html.php @@ -54,6 +54,11 @@ + config->moreLinks["PO"])) $this->config->moreLinks["POs[$productID]"] = $this->config->moreLinks["PO"]; + if(!empty($this->config->moreLinks["QD"])) $this->config->moreLinks["QDs[$productID]"] = $this->config->moreLinks["QD"]; + if(!empty($this->config->moreLinks["RD"])) $this->config->moreLinks["RDs[$productID]"] = $this->config->moreLinks["RD"]; + ?> name, "class='form-control'");?> @@ -67,6 +72,11 @@ '>desc), "rows='1' class='form-control autosize'");?> order, "class='form-control'");?> + config->moreLinks["POs[$productID]"])) unset($this->config->moreLinks["POs[$productID]"]); + if(isset($this->config->moreLinks["QDs[$productID]"])) unset($this->config->moreLinks["QDs[$productID]"]); + if(isset($this->config->moreLinks["RDs[$productID]"])) unset($this->config->moreLinks["RDs[$productID]"]); + ?> diff --git a/module/project/control.php b/module/project/control.php index 6631a89c6e..b9766167f9 100644 --- a/module/project/control.php +++ b/module/project/control.php @@ -1249,20 +1249,32 @@ class project extends control unset($this->lang->project->endList[365]); } + $this->loadModel('user'); + $poUsers = $this->user->getPairs('noclosed|nodeleted|pofirst', $project->PO, $this->config->maxCount); + if(!empty($this->config->user->moreLink)) $this->config->moreLinks["PM"] = $this->config->user->moreLink; + + $pmUsers = $this->user->getPairs('noclosed|nodeleted|pmfirst', $project->PM, $this->config->maxCount); + if(!empty($this->config->user->moreLink)) $this->config->moreLinks["PO"] = $this->config->user->moreLink; + + $qdUsers = $this->user->getPairs('noclosed|nodeleted|qdfirst', $project->QD, $this->config->maxCount); + if(!empty($this->config->user->moreLink)) $this->config->moreLinks["QD"] = $this->config->user->moreLink; + + $rdUsers = $this->user->getPairs('noclosed|nodeleted|devfirst', $project->RD, $this->config->maxCount); + if(!empty($this->config->user->moreLink)) $this->config->moreLinks["RD"] = $this->config->user->moreLink; + $this->view->title = $title; $this->view->position = $position; $this->view->projects = $projects; $this->view->project = $project; - $this->view->poUsers = $this->loadModel('user')->getPairs('noclosed|nodeleted|pofirst', $project->PO); - $this->view->pmUsers = $this->user->getPairs('noclosed|nodeleted|pmfirst', $project->PM); - $this->view->qdUsers = $this->user->getPairs('noclosed|nodeleted|qdfirst', $project->QD); - $this->view->rdUsers = $this->user->getPairs('noclosed|nodeleted|devfirst', $project->RD); + $this->view->poUsers = $poUsers; + $this->view->pmUsers = $pmUsers; + $this->view->qdUsers = $qdUsers; + $this->view->rdUsers = $rdUsers; $this->view->groups = $this->loadModel('group')->getPairs(); $this->view->allProducts = $allProducts; $this->view->linkedProducts = $linkedProducts; $this->view->productPlans = $productPlans; $this->view->branchGroups = $this->loadModel('branch')->getByProducts(array_keys($linkedProducts), '', $linkedBranches); - $this->display(); } @@ -1310,14 +1322,27 @@ class project extends control $this->view->customFields = $customFields; $this->view->showFields = $this->config->project->custom->batchEditFields; + $this->loadModel('user'); + $pmUsers = $this->user->getPairs('noclosed|nodeleted|pmfirst', $appendPmUsers, $this->config->maxCount); + if(!empty($this->config->user->moreLink)) $this->config->moreLinks["PM"] = $this->config->user->moreLink; + + $poUsers = $this->user->getPairs('noclosed|nodeleted|pofirst', $appendPoUsers, $this->config->maxCount); + if(!empty($this->config->user->moreLink)) $this->config->moreLinks["PO"] = $this->config->user->moreLink; + + $qdUsers = $this->user->getPairs('noclosed|nodeleted|qdfirst', $appendQdUsers, $this->config->maxCount); + if(!empty($this->config->user->moreLink)) $this->config->moreLinks["QD"] = $this->config->user->moreLink; + + $rdUsers = $this->user->getPairs('noclosed|nodeleted|devfirst', $appendRdUsers, $this->config->maxCount); + if(!empty($this->config->user->moreLink)) $this->config->moreLinks["RD"] = $this->config->user->moreLink; + $this->view->title = $this->lang->project->batchEdit; $this->view->position[] = $this->lang->project->batchEdit; $this->view->projectIDList = $projectIDList; $this->view->projects = $projects; - $this->view->pmUsers = $this->loadModel('user')->getPairs('noclosed|nodeleted|pmfirst', $appendPmUsers); - $this->view->poUsers = $this->user->getPairs('noclosed|nodeleted|pofirst', $appendPoUsers); - $this->view->qdUsers = $this->user->getPairs('noclosed|nodeleted|qdfirst', $appendQdUsers); - $this->view->rdUsers = $this->user->getPairs('noclosed|nodeleted|devfirst', $appendRdUsers); + $this->view->pmUsers = $pmUsers; + $this->view->poUsers = $poUsers; + $this->view->qdUsers = $qdUsers; + $this->view->rdUsers = $rdUsers; $this->display(); } @@ -1893,7 +1918,7 @@ class project extends control $this->loadModel('dept'); $project = $this->project->getById($projectID); - $users = $this->user->getPairs('noclosed|nodeleted|devfirst|nofeedback'); + $users = $this->user->getPairs('noclosed|nodeleted|devfirst|nofeedback', '', $this->config->maxCount); $roles = $this->user->getUserRoles(array_keys($users)); $deptUsers = $dept === '' ? array() : $this->dept->getDeptUserPairs($dept); $currentMembers = $this->project->getTeamMembers($projectID); @@ -1903,6 +1928,7 @@ class project extends control /* Set menu. */ $this->project->setMenu($this->projects, $project->id); + if(!empty($this->config->user->moreLink)) $this->config->moreLinks["accounts[]"] = $this->config->user->moreLink; $title = $this->lang->project->manageMembers . $this->lang->colon . $project->name; $position[] = html::a($this->createLink('project', 'browse', "projectID=$projectID"), $project->name); diff --git a/module/project/js/managemembers.js b/module/project/js/managemembers.js index ad634b0871..db7fa3260f 100644 --- a/module/project/js/managemembers.js +++ b/module/project/js/managemembers.js @@ -17,9 +17,18 @@ function addItem(obj) { var item = $('#addItem').html().replace(/%i%/g, i); $(obj).closest('tr').after('' + item + ''); - var accounts = $('#hours' + i).closest('tr').find('select:first') - accounts.trigger('liszt:updated'); - accounts.chosen(); + var $accounts = $('#hours' + i).closest('tr').find('select:first') + + if($accounts.attr('data-pickertype') != 'remote') + { + $accounts.chosen(); + } + else + { + $accounts.parent().find('.picker.picker-ready').remove(); + var pickerremote = $accounts.attr('data-pickerremote'); + $accounts.picker({chosenMode: true, remote: pickerremote}); + } i ++; } diff --git a/module/project/view/batchedit.html.php b/module/project/view/batchedit.html.php index 437e5d8b1a..e6da13707a 100755 --- a/module/project/view/batchedit.html.php +++ b/module/project/view/batchedit.html.php @@ -60,6 +60,12 @@ + config->moreLinks["PM"])) $this->config->moreLinks["PMs[$projectID]"] = $this->config->moreLinks["PM"]; + if(!empty($this->config->moreLinks["PO"])) $this->config->moreLinks["POs[$projectID]"] = $this->config->moreLinks["PO"]; + if(!empty($this->config->moreLinks["QD"])) $this->config->moreLinks["QDs[$projectID]"] = $this->config->moreLinks["QD"]; + if(!empty($this->config->moreLinks["RD"])) $this->config->moreLinks["RDs[$projectID]"] = $this->config->moreLinks["RD"]; + ?> name, "class='form-control'");?> @@ -82,6 +88,12 @@ order, "class='form-control'")?> + config->moreLinks["PMs[$projectID]"])) unset($this->config->moreLinks["PMs[$projectID]"]); + if(isset($this->config->moreLinks["POs[$projectID]"])) unset($this->config->moreLinks["POs[$projectID]"]); + if(isset($this->config->moreLinks["QDs[$projectID]"])) unset($this->config->moreLinks["QDs[$projectID]"]); + if(isset($this->config->moreLinks["RDs[$projectID]"])) unset($this->config->moreLinks["RDs[$projectID]"]); + ?> diff --git a/module/story/js/batchcreate.js b/module/story/js/batchcreate.js index 3122a78161..1bee68b060 100644 --- a/module/story/js/batchcreate.js +++ b/module/story/js/batchcreate.js @@ -54,6 +54,7 @@ function setModuleAndPlan(branchID, productID, num) if(!modules) modules = ''; $('#module' + num).replaceWith(modules); $("#module" + num + "_chosen").remove(); + $("#module" + num).next('.picker').remove(); $("#module" + num).chosen(); }); @@ -63,6 +64,7 @@ function setModuleAndPlan(branchID, productID, num) if(!plans) plans = ''; $('#plan' + num).replaceWith(plans); $("#plan" + num + "_chosen").remove(); + $("#plan" + num).next('.picker').remove(); $("#plan" + num).chosen(); }); } diff --git a/module/task/js/batchcreate.js b/module/task/js/batchcreate.js index 185a1b727e..795e7fab84 100755 --- a/module/task/js/batchcreate.js +++ b/module/task/js/batchcreate.js @@ -30,6 +30,7 @@ function setStories(moduleID, projectID, num) } var chosenWidth = $("#story" + num + "_chosen").css('max-width'); $("#story" + num + "_chosen").remove(); + $("#story" + num).next('.picker').remove(); $("#story" + num).chosen(); $("#story" + num + "_chosen").width(chosenWidth).css('max-width', chosenWidth); }); diff --git a/module/task/js/create.js b/module/task/js/create.js index a1fdf96fb4..f9639775b3 100644 --- a/module/task/js/create.js +++ b/module/task/js/create.js @@ -24,12 +24,14 @@ function loadProjectMembers(projectID) $.get(createLink('project', 'ajaxGetMembers', 'projectID=' + projectID + '&assignedTo=' + $('#assignedTo').val()), function(data) { $('#assignedTo_chosen').remove(); + $('#assignedTo').next('.picker').remove(); $('#assignedTo').replaceWith(data); $('#assignedTo').attr('name', 'assignedTo[]').chosen(); $('.modal-dialog #taskTeamEditor tr').each(function() { $(this).find('#team_chosen').remove(); + $(this).find('#team').next('.picker').remove(); $(this).find('#team').replaceWith(data); $(this).find('#assignedTo').attr('id', 'team').attr('name', 'team[]').chosen(); }); @@ -48,6 +50,7 @@ function loadProjectStories(projectID) $.get(createLink('story', 'ajaxGetProjectStories', 'projectID=' + projectID + '&productID=0&branch=0&moduleID=0&storyID=' + $('#story').val()), function(data) { $('#story_chosen').remove(); + $('#story').next('.picker').remove(); $('#story').replaceWith(data); $('#story').addClass('filled').chosen(); }); @@ -93,6 +96,7 @@ function setOwners(result) $("#multipleBox").removeAttr("checked"); $('.team-group').addClass('hidden'); $('#assignedTo, #assignedTo_chosen').removeClass('hidden'); + $('#assignedTo').next('.picker').removeClass('hidden'); if(result == 'affair') { $('#assignedTo').attr('multiple', 'multiple'); @@ -228,6 +232,7 @@ function setStories(moduleID, projectID) $('#story').val(storyID); setPreview(); $('#story_chosen').remove(); + $('#story').next('.picker').remove(); $("#story").addClass('filled').chosen(); }); } @@ -365,12 +370,14 @@ $(document).ready(function() if($(this).prop('checked')) { $('#assignedTo, #assignedTo_chosen').addClass('hidden'); + $('#assignedTo').next('.picker').addClass('hidden'); $('.team-group').removeClass('hidden'); $('#estimate').attr('readonly', true); } else { $('#assignedTo, #assignedTo_chosen').removeClass('hidden'); + $('#assignedTo').next('.picker').removeClass('hidden'); $('.team-group').addClass('hidden'); $('#estimate').attr('readonly', false); } diff --git a/module/testcase/js/batchcreate.js b/module/testcase/js/batchcreate.js index d6153d2d5f..adfc541b4f 100644 --- a/module/testcase/js/batchcreate.js +++ b/module/testcase/js/batchcreate.js @@ -105,6 +105,7 @@ function setModules(branchID, productID, num) if(!modules) modules = ''; $('#module' + num).replaceWith(modules); $("#module" + num + "_chosen").remove(); + $("#module" + num).next('.picker').remove(); $("#module" + num).chosen(); }); } diff --git a/module/testcase/js/common.js b/module/testcase/js/common.js index a238e29b90..cc09050347 100644 --- a/module/testcase/js/common.js +++ b/module/testcase/js/common.js @@ -132,6 +132,7 @@ function setStories() $('#story').replaceWith(stories); $('#story').val(value); $('#story_chosen').remove(); + $('#story').next('.picker').remove(); $("#story").chosen(); }); } diff --git a/www/js/zui/picker/zui.picker.min.css b/www/js/zui/picker/zui.picker.min.css index b358312759..5587c1fa44 100644 --- a/www/js/zui/picker/zui.picker.min.css +++ b/www/js/zui/picker/zui.picker.min.css @@ -3,4 +3,6 @@ * http://openzui.com * GitHub: https://github.com/easysoft/zui.git * Copyright (c) 2020 cnezsoft.com; Licensed MIT - */.picker{min-height:32px;background-color:#eee}.picker:not(.picker-ready)>*{display:none}.picker-selections{position:relative;min-height:32px;color:#222;background-color:#fff;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.picker-focus .picker-selections{border-color:#145ccd;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(20,92,205,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(20,92,205,.6)}.picker-multi .picker-selections{padding:3px}.picker-multi.picker-focus .picker-selections:before{position:absolute;right:0;bottom:8px;display:block;width:24px;height:14px;font-family:ZenIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-align:center;text-transform:none;content:'\e603';opacity:.4;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.picker-multi.picker-focus.picker-loading .picker-selections::before{display:inline-block;content:'\e97c';-webkit-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}.picker-multi .picker-selection{position:relative;display:inline-block;padding:0 20px 0 5px;margin:2px;line-height:18px;background-color:#f1f1f1;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ddd;border-radius:3px;-webkit-box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05);box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05)}.picker-selection-single{max-width:100%;padding:5px 20px 5px 8px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.picker-focus .picker-selection-single .picker-selection-text{display:none}.picker-selection-single:after{position:absolute;top:7px;right:0;display:block;width:24px;height:14px;font-family:ZenIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-align:center;text-transform:none;content:'\e6b8';opacity:.4;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.picker-focus .picker-selection-single::after{content:'\e603'}.picker-focus.picker-loading .picker-selection-single::after{display:inline-block;content:'\e97c';-webkit-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}.picker-selection-remove{position:absolute;top:0;right:0;width:20px;height:20px;text-align:center;cursor:pointer;opacity:.2}.picker-selection-remove:before{font-family:ZenIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-shadow:0 1px 0 #fff;text-transform:none;content:'\d7';speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.picker-selection-remove:hover{opacity:.5}.picker-single .picker-selection-remove{top:5px;right:20px}.picker-no-value .picker-selection-remove,.picker-single.picker-focus .picker-selection-remove{display:none}.picker-search{color:transparent;background:0 0;border:none}.picker-search:focus{color:inherit;outline:0}.picker-single .picker-search{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;width:100%;padding:5px 8px}.picker-multi .picker-search{display:inline-block;width:10px;min-width:10px;max-width:100%;padding:0 2px;margin:2px 0}.picker-placeholder{position:absolute;top:5px;right:20px;left:8px;z-index:0;display:none;overflow:hidden;color:grey;text-overflow:ellipsis;white-space:nowrap}.picker-no-value .picker-placeholder{display:block}.picker-drop-menu{position:fixed;z-index:1200;display:none;min-width:100px;background-color:#fff;border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175);opacity:0}.picker-drop-menu.picker-drop-show{display:block}.picker-drop-menu.picker-has-message{min-height:22px;padding-bottom:22px}.picker-option-list{padding:5px 0;margin:0;overflow-y:auto}.picker-no-options .picker-option-list{display:none}.picker-option{display:block;min-height:30px;padding:5px 10px;overflow:hidden;clear:both;font-weight:400;line-height:1.53846154;color:#353535;text-overflow:ellipsis;white-space:nowrap;-webkit-transition:none;-o-transition:none;transition:none}.picker-single .picker-option.picker-option-selected{color:#3280fc;background:#ebf2f9}.picker-option:focus,.picker-option:hover{text-decoration:none}.picker-option.picker-option-active,.picker-single .picker-option.picker-option-selected.picker-option-active{color:#fff;background-color:#3280fc}.picker-multi .picker-option.picker-option-selected,.picker-multi .picker-option.picker-option-selected.picker-option-active{color:#ccc;cursor:not-allowed;background-color:#fff}.picker-option-text-matched{position:relative;color:#3280fc}.picker-option-text-matched:before{position:absolute;right:0;bottom:-4px;left:0;display:block;height:3px;content:' ';background-color:#3280fc;border-radius:2px;opacity:.5}.picker-option:hover .picker-option-text-matched{color:#fff}.picker-option:hover .picker-option-text-matched:before{background-color:#fff}.picker-message{position:absolute;right:0;bottom:0;left:0;display:none;height:22px;padding:2px 5px;overflow:hidden;font-size:12px;color:grey;text-overflow:ellipsis;white-space:nowrap;background-color:#f1f1f1}.picker-has-message .picker-message{display:block}.picker-message[data-type=danger]{color:#ea644a} \ No newline at end of file + */ +.picker{min-height:32px;background-color:#eee}.picker:not(.picker-ready)>*{display:none}.picker-selections{position:relative;min-height:32px;color:#222;background-color:#fff;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.picker-focus .picker-selections{border-color:#145ccd;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(20,92,205,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(20,92,205,.6)}.picker-multi .picker-selections{padding:3px}.picker-multi.picker-focus .picker-selections:before{position:absolute;right:0;bottom:8px;display:block;width:24px;height:14px;font-family:ZenIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-align:center;text-transform:none;content:'\e603';opacity:.4;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.picker-multi.picker-focus.picker-loading .picker-selections::before{display:inline-block;content:'\e97c';-webkit-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}.picker-multi .picker-selection{position:relative;display:inline-block;padding:0 20px 0 5px;margin:2px;line-height:18px;background-color:#f1f1f1;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ddd;border-radius:3px;-webkit-box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05);box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05)}.picker-selection-single{max-width:100%;padding:5px 20px 5px 8px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.picker-focus .picker-selection-single .picker-selection-text{display:none}.picker-selection-single:after{position:absolute;top:7px;right:0;display:block;width:24px;height:14px;font-family:ZenIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-align:center;text-transform:none;content:'\e6b8';opacity:.4;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.picker-focus .picker-selection-single::after{content:'\e603'}.picker-focus.picker-loading .picker-selection-single::after{display:inline-block;content:'\e97c';-webkit-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}.picker-selection-remove{position:absolute;top:0;right:0;width:20px;height:20px;text-align:center;cursor:pointer;opacity:.2}.picker-selection-remove:before{font-family:ZenIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-shadow:0 1px 0 #fff;text-transform:none;content:'\d7';speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.picker-selection-remove:hover{opacity:.5}.picker-single .picker-selection-remove{top:5px;right:20px}.picker-no-value .picker-selection-remove,.picker-single.picker-focus .picker-selection-remove{display:none}.picker-search{color:transparent;background:0 0;border:none}.picker-search:focus{color:inherit;outline:0}.picker-single .picker-search{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;width:100%;padding:5px 8px}.picker-multi .picker-search{display:inline-block;width:10px;min-width:10px;max-width:100%;padding:0 2px;margin:2px 0}.picker-placeholder{position:absolute;top:5px;right:20px;left:8px;z-index:0;display:none;overflow:hidden;color:grey;text-overflow:ellipsis;white-space:nowrap}.picker-no-value .picker-placeholder{display:block}.picker-drop-menu{position:fixed;z-index:1200;display:none;min-width:100px;background-color:#fff;border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175);opacity:0}.picker-drop-menu.picker-drop-show{display:block}.picker-drop-menu.picker-has-message{min-height:22px;padding-bottom:22px}.picker-option-list{padding:5px 0;margin:0;overflow-y:auto}.picker-no-options .picker-option-list{display:none}.picker-option{display:block;min-height:30px;padding:5px 10px;overflow:hidden;clear:both;font-weight:400;line-height:1.53846154;color:#353535;text-overflow:ellipsis;white-space:nowrap;-webkit-transition:none;-o-transition:none;transition:none}.picker-single .picker-option.picker-option-selected{color:#3280fc;background:#ebf2f9}.picker-option:focus,.picker-option:hover{text-decoration:none}.picker-option.picker-option-active,.picker-single .picker-option.picker-option-selected.picker-option-active{color:#fff;background-color:#3280fc}.picker-multi .picker-option.picker-option-selected,.picker-multi .picker-option.picker-option-selected.picker-option-active{color:#ccc;cursor:not-allowed;background-color:#fff}.picker-option-text-matched{position:relative;color:#3280fc}.picker-option-text-matched:before{position:absolute;right:0;bottom:-4px;left:0;display:block;height:3px;content:' ';background-color:#3280fc;border-radius:2px;opacity:.5}.picker-option:hover .picker-option-text-matched{color:#fff}.picker-option:hover .picker-option-text-matched:before{background-color:#fff}.picker-message{position:absolute;right:0;bottom:0;left:0;display:none;height:22px;padding:2px 5px;overflow:hidden;font-size:12px;color:grey;text-overflow:ellipsis;white-space:nowrap;background-color:#f1f1f1}.picker-has-message .picker-message{display:block}.picker-message[data-type=danger]{color:#ea644a} +.picker-single .picker-selection-remove{z-index:1000;} From a99aab00ea40138187c32f507a45f9d8ad3d2012 Mon Sep 17 00:00:00 2001 From: tianshujie98 Date: Wed, 5 Aug 2020 17:04:47 +0800 Subject: [PATCH 02/24] *Finish task #7587. --- module/action/model.php | 6 +++--- module/company/control.php | 2 +- module/company/css/dynamic.css | 1 + module/company/view/dynamic.html.php | 4 ++-- module/my/control.php | 2 +- module/my/css/dynamic.css | 1 + module/my/view/dynamic.html.php | 4 ++-- module/product/control.php | 2 +- module/product/css/dynamic.css | 1 + module/product/view/dynamic.html.php | 4 ++-- module/project/control.php | 2 +- module/project/css/dynamic.css | 1 + module/project/view/dynamic.html.php | 4 ++-- module/user/control.php | 2 +- module/user/css/dynamic.css | 1 + module/user/view/dynamic.html.php | 4 ++-- 16 files changed, 23 insertions(+), 18 deletions(-) diff --git a/module/action/model.php b/module/action/model.php index 64d2ac9def..0aa57c4eec 100755 --- a/module/action/model.php +++ b/module/action/model.php @@ -1082,13 +1082,13 @@ class actionModel extends model * @access public * @return array */ - public function buildDateGroup($actions, $direction = 'next') + public function buildDateGroup($actions, $direction = 'next', $type = 'today') { $dateGroup = array(); foreach($actions as $action) { $timeStamp = strtotime(isset($action->originalDate) ? $action->originalDate : $action->date); - $date = date(DT_DATE4, $timeStamp); + $date = $type == 'all' ? date(DT_DATE3, $timeStamp) : date(DT_DATE4, $timeStamp); $action->time = date(DT_TIME2, $timeStamp); $dateGroup[$date][] = $action; } @@ -1103,7 +1103,7 @@ class actionModel extends model foreach($lastDateActions as $action) { $timeStamp = strtotime(isset($action->originalDate) ? $action->originalDate : $action->date); - $date = date(DT_DATE4, $timeStamp); + $date = $type == 'all' ? date(DT_DATE3, $timeStamp) : date(DT_DATE4, $timeStamp); $action->time = date(DT_TIME2, $timeStamp); $dateGroup[$date][] = $action; } diff --git a/module/company/control.php b/module/company/control.php index e3633a5e63..4c1c107308 100644 --- a/module/company/control.php +++ b/module/company/control.php @@ -243,7 +243,7 @@ class company extends control $this->view->orderBy = $orderBy; $this->view->pager = $pager; $this->view->param = $param; - $this->view->dateGroups = $this->action->buildDateGroup($actions, $direction); + $this->view->dateGroups = $this->action->buildDateGroup($actions, $direction, $browseType); $this->view->direction = $direction; $this->display(); } diff --git a/module/company/css/dynamic.css b/module/company/css/dynamic.css index 7857018ad7..0beed2ab9c 100644 --- a/module/company/css/dynamic.css +++ b/module/company/css/dynamic.css @@ -17,3 +17,4 @@ .dynamic.collapsed .timeline {max-height: 58px;} .dynamic.collapsed .timeline > li + li {display: none;} .dynamic.collapsed .dynamic-btn > .icon:before {content: '\f0d8'; } +.margin-l-50px {margin-left: 50px;} diff --git a/module/company/view/dynamic.html.php b/module/company/view/dynamic.html.php index 3ee42be80f..a2465c1753 100644 --- a/module/company/view/dynamic.html.php +++ b/module/company/view/dynamic.html.php @@ -41,14 +41,14 @@ $actions):?>
-
+
action->dynamic->today;?>
-
    +
      $action):?> diff --git a/module/my/control.php b/module/my/control.php index ea181e4a96..6ed5c4fc00 100644 --- a/module/my/control.php +++ b/module/my/control.php @@ -585,7 +585,7 @@ class my extends control $this->view->type = $type; $this->view->orderBy = $orderBy; $this->view->pager = $pager; - $this->view->dateGroups = $this->action->buildDateGroup($actions, $direction); + $this->view->dateGroups = $this->action->buildDateGroup($actions, $direction, $type); $this->view->direction = $direction; $this->display(); } diff --git a/module/my/css/dynamic.css b/module/my/css/dynamic.css index c7ec7d754a..1abdede424 100644 --- a/module/my/css/dynamic.css +++ b/module/my/css/dynamic.css @@ -18,3 +18,4 @@ .dynamic.collapsed .timeline {max-height: 58px;} .dynamic.collapsed .timeline > li + li {display: none;} .dynamic.collapsed .dynamic-btn > .icon:before {content: '\f0d8'; } +.margin-l-50px {margin-left: 50px;} diff --git a/module/my/view/dynamic.html.php b/module/my/view/dynamic.html.php index 4663a2ccd1..21f4d8eeb5 100644 --- a/module/my/view/dynamic.html.php +++ b/module/my/view/dynamic.html.php @@ -38,14 +38,14 @@ $actions):?>
      -
      +
      action->dynamic->today;?>
      -
        +
          $action):?> diff --git a/module/product/control.php b/module/product/control.php index 69132d34cd..c35d101b6b 100644 --- a/module/product/control.php +++ b/module/product/control.php @@ -557,7 +557,7 @@ class product extends control $this->view->orderBy = $orderBy; $this->view->param = $param; $this->view->pager = $pager; - $this->view->dateGroups = $this->action->buildDateGroup($actions, $direction); + $this->view->dateGroups = $this->action->buildDateGroup($actions, $direction, $type); $this->view->direction = $direction; $this->display(); } diff --git a/module/product/css/dynamic.css b/module/product/css/dynamic.css index ca418df21d..d26c43a9b8 100644 --- a/module/product/css/dynamic.css +++ b/module/product/css/dynamic.css @@ -19,3 +19,4 @@ .dynamic.collapsed .timeline {max-height: 58px;} .dynamic.collapsed .timeline > li + li {display: none;} .dynamic.collapsed .dynamic-btn > .icon:before {content: '\f0d8'; } +.margin-l-50px {margin-left: 50px;} diff --git a/module/product/view/dynamic.html.php b/module/product/view/dynamic.html.php index 12cffb2909..0d995517e9 100755 --- a/module/product/view/dynamic.html.php +++ b/module/product/view/dynamic.html.php @@ -67,14 +67,14 @@ $actions):?>
          -
          +
          action->dynamic->today;?>
          -
            +
              $action):?> diff --git a/module/project/control.php b/module/project/control.php index 6631a89c6e..559dfe053a 100644 --- a/module/project/control.php +++ b/module/project/control.php @@ -2195,7 +2195,7 @@ class project extends control $this->view->orderBy = $orderBy; $this->view->pager = $pager; $this->view->param = $param; - $this->view->dateGroups = $this->action->buildDateGroup($actions, $direction); + $this->view->dateGroups = $this->action->buildDateGroup($actions, $direction, $type); $this->view->direction = $direction; $this->display(); } diff --git a/module/project/css/dynamic.css b/module/project/css/dynamic.css index ca418df21d..d26c43a9b8 100644 --- a/module/project/css/dynamic.css +++ b/module/project/css/dynamic.css @@ -19,3 +19,4 @@ .dynamic.collapsed .timeline {max-height: 58px;} .dynamic.collapsed .timeline > li + li {display: none;} .dynamic.collapsed .dynamic-btn > .icon:before {content: '\f0d8'; } +.margin-l-50px {margin-left: 50px;} diff --git a/module/project/view/dynamic.html.php b/module/project/view/dynamic.html.php index 2cee4f31d7..2b7770dbdd 100755 --- a/module/project/view/dynamic.html.php +++ b/module/project/view/dynamic.html.php @@ -68,14 +68,14 @@ $actions):?>
              -
              +
              action->dynamic->today;?>
              -
                +
                  $action):?> diff --git a/module/user/control.php b/module/user/control.php index 45ce88c29d..52b143739e 100644 --- a/module/user/control.php +++ b/module/user/control.php @@ -992,7 +992,7 @@ class user extends control $this->view->account = $account; $this->view->pager = $pager; $this->view->user = $this->user->getById($account); - $this->view->dateGroups = $this->action->buildDateGroup($actions, $direction); + $this->view->dateGroups = $this->action->buildDateGroup($actions, $direction, $period); $this->view->direction = $direction; $this->display(); } diff --git a/module/user/css/dynamic.css b/module/user/css/dynamic.css index 8fa4cd0448..c4b8cc81f0 100644 --- a/module/user/css/dynamic.css +++ b/module/user/css/dynamic.css @@ -18,3 +18,4 @@ .dynamic.collapsed .timeline {max-height: 58px;} .dynamic.collapsed .timeline > li + li {display: none;} .dynamic.collapsed .dynamic-btn > .icon:before {content: '\f0d8'; } +.margin-l-50px {margin-left: 50px;} diff --git a/module/user/view/dynamic.html.php b/module/user/view/dynamic.html.php index 40eee11d2a..83bf799b0f 100644 --- a/module/user/view/dynamic.html.php +++ b/module/user/view/dynamic.html.php @@ -36,14 +36,14 @@ $actions):?>
                  -
                  +
                  action->dynamic->today;?>
                  -
                    +
                      $action):?> From 548b5655b0b5cf18c4163d51f9961dccb3eb57be Mon Sep 17 00:00:00 2001 From: tianshujie98 Date: Wed, 5 Aug 2020 17:22:22 +0800 Subject: [PATCH 03/24] Merge branch 'master' of github.com:easysoft/zentaopms --- module/action/lang/de.php | 1 + module/action/lang/en.php | 1 + module/action/lang/fr.php | 1 + module/action/lang/vi.php | 1 + module/action/lang/zh-cn.php | 1 + module/bug/control.php | 2 +- module/bug/js/batchcreate.js | 3 ++ module/bug/view/batchedit.html.php | 2 ++ module/product/control.php | 49 +++++++++++++++++++++----- module/product/view/batchedit.html.php | 10 ++++++ module/project/control.php | 46 ++++++++++++++++++------ module/project/js/managemembers.js | 15 ++++++-- module/project/view/batchedit.html.php | 12 +++++++ module/story/js/batchcreate.js | 2 ++ module/task/js/batchcreate.js | 1 + module/task/js/create.js | 7 ++++ module/testcase/js/batchcreate.js | 1 + module/testcase/js/common.js | 1 + www/js/zui/picker/zui.picker.min.css | 4 ++- 19 files changed, 136 insertions(+), 24 deletions(-) diff --git a/module/action/lang/de.php b/module/action/lang/de.php index 91e18b6b33..e859adf789 100644 --- a/module/action/lang/de.php +++ b/module/action/lang/de.php @@ -319,6 +319,7 @@ $lang->action->dynamicAction->bug['bugconfirmed'] = 'Confirm Bug'; $lang->action->dynamicAction->bug['resolved'] = 'Resolve Bug'; $lang->action->dynamicAction->bug['undeleted'] = 'Restore Bug'; $lang->action->dynamicAction->bug['hidden'] = 'Hide Bug'; +$lang->action->dynamicAction->bug['deleted'] = 'Delete Bug'; $lang->action->dynamicAction->bug['confirmed'] = 'Confirm Story Change'; $lang->action->dynamicAction->bug['tostory'] = 'Convert to Story'; $lang->action->dynamicAction->bug['totask'] = 'Convert to Task'; diff --git a/module/action/lang/en.php b/module/action/lang/en.php index 44b48584c6..8346ec5247 100755 --- a/module/action/lang/en.php +++ b/module/action/lang/en.php @@ -319,6 +319,7 @@ $lang->action->dynamicAction->bug['bugconfirmed'] = 'Confirm Bug'; $lang->action->dynamicAction->bug['resolved'] = 'Resolve Bug'; $lang->action->dynamicAction->bug['undeleted'] = 'Restore Bug'; $lang->action->dynamicAction->bug['hidden'] = 'Hide Bug'; +$lang->action->dynamicAction->bug['deleted'] = 'Delete Bug'; $lang->action->dynamicAction->bug['confirmed'] = 'Confirm Story Change'; $lang->action->dynamicAction->bug['tostory'] = 'Convert to Story'; $lang->action->dynamicAction->bug['totask'] = 'Convert to Task'; diff --git a/module/action/lang/fr.php b/module/action/lang/fr.php index e1e092c558..4fab57dd08 100644 --- a/module/action/lang/fr.php +++ b/module/action/lang/fr.php @@ -319,6 +319,7 @@ $lang->action->dynamicAction->bug['bugconfirmed'] = 'Confirmer Bug'; $lang->action->dynamicAction->bug['resolved'] = 'Resolu Bug'; $lang->action->dynamicAction->bug['undeleted'] = 'Restaurer Bug'; $lang->action->dynamicAction->bug['hidden'] = 'Masquer Bug'; +$lang->action->dynamicAction->bug['deleted'] = 'Supprimé Bug'; $lang->action->dynamicAction->bug['confirmed'] = 'Confirme Chang.Story'; $lang->action->dynamicAction->bug['tostory'] = 'Converti en Story'; $lang->action->dynamicAction->bug['totask'] = 'Converti en Tâche'; diff --git a/module/action/lang/vi.php b/module/action/lang/vi.php index 45670035ed..6cb4005ca6 100644 --- a/module/action/lang/vi.php +++ b/module/action/lang/vi.php @@ -319,6 +319,7 @@ $lang->action->dynamicAction->bug['bugconfirmed'] = 'Xác nhận Bug'; $lang->action->dynamicAction->bug['resolved'] = 'Giải quyết Bug'; $lang->action->dynamicAction->bug['undeleted'] = 'Khôi phục Bug'; $lang->action->dynamicAction->bug['hidden'] = 'Ẩn Bug'; +$lang->action->dynamicAction->bug['deleted'] = 'Xóa tìBug'; $lang->action->dynamicAction->bug['confirmed'] = 'Xác nhận thay đổi câu chuyện'; $lang->action->dynamicAction->bug['tostory'] = 'Chuyển thành câu chuyện'; $lang->action->dynamicAction->bug['totask'] = 'Chuyển thành nhiệm vụ'; diff --git a/module/action/lang/zh-cn.php b/module/action/lang/zh-cn.php index a21d0a5ca4..f6f02f7d4c 100755 --- a/module/action/lang/zh-cn.php +++ b/module/action/lang/zh-cn.php @@ -319,6 +319,7 @@ $lang->action->dynamicAction->bug['bugconfirmed'] = '确认Bug'; $lang->action->dynamicAction->bug['resolved'] = '解决Bug'; $lang->action->dynamicAction->bug['undeleted'] = '还原Bug'; $lang->action->dynamicAction->bug['hidden'] = '隐藏Bug'; +$lang->action->dynamicAction->bug['deleted'] = '删除Bug'; $lang->action->dynamicAction->bug['confirmed'] = "确认{$lang->storyCommon}变更"; $lang->action->dynamicAction->bug['tostory'] = "转{$lang->storyCommon}"; $lang->action->dynamicAction->bug['totask'] = '转任务'; diff --git a/module/bug/control.php b/module/bug/control.php index 66e2107a8d..99fda229b3 100644 --- a/module/bug/control.php +++ b/module/bug/control.php @@ -843,7 +843,7 @@ class bug extends control $appendUsers[$bug->assignedTo] = $bug->assignedTo; $appendUsers[$bug->resolvedBy] = $bug->resolvedBy; } - $users = $this->user->getPairs('devfirst|nodeleted', $appendUsers); + $users = $this->user->getPairs('devfirst|nodeleted', $appendUsers, $this->config->maxCount); $users = array('' => '', 'ditto' => $this->lang->bug->ditto) + $users; /* Assign. */ diff --git a/module/bug/js/batchcreate.js b/module/bug/js/batchcreate.js index 0195d8d71e..400b9763b7 100644 --- a/module/bug/js/batchcreate.js +++ b/module/bug/js/batchcreate.js @@ -23,6 +23,7 @@ function setBranchRelated(branchID, productID, num) if(!modules) modules = ''; $('#modules' + num).replaceWith(modules); $("#modules" + num + "_chosen").remove(); + $("#modules" + num).next('.picker').remove(); $("#modules" + num).chosen(); }); @@ -32,6 +33,7 @@ function setBranchRelated(branchID, productID, num) if(!projects) projects = ''; $('#projects' + num).replaceWith(projects); $("#projects" + num + "_chosen").remove(); + $("#projects" + num).next('.picker').remove(); $("#projects" + num).chosen(); }); @@ -59,6 +61,7 @@ function setOpenedBuilds(link, index) $('#buildBox' + index).html(builds); $('#buildBox' + index).find('select').val(selected); $('#openedBuilds' + index + '_chosen').remove(); + $('#openedBuilds' + index).next('.picker').remove(); $('#buildBox' + index + ' select').removeClass('select-3'); $('#buildBox' + index + ' select').addClass('select-1'); $('#buildBox' + index + ' select').attr('name','openedBuilds[' + index + '][]'); diff --git a/module/bug/view/batchedit.html.php b/module/bug/view/batchedit.html.php index 8395417e8f..f8e3f132c0 100644 --- a/module/bug/view/batchedit.html.php +++ b/module/bug/view/batchedit.html.php @@ -73,6 +73,7 @@ $bug):?> config->user->moreLink)) $this->config->moreLinks["assignedTos[$bugID]"] = $this->config->user->moreLink; if(!$productID) { $product = $this->product->getByID($bug->product); @@ -134,6 +135,7 @@ control == 'select' or $extendField->control == 'multi-select') ? " style='overflow:visible'" : '') . ">" . $this->loadModel('flow')->getFieldControl($extendField, $bug, $extendField->field . "[{$bugID}]") . "";?> + config->moreLinks["assignedTos[$bugID]"])) unset($this->config->moreLinks["assignedTos[$bugID]"]);?> diff --git a/module/product/control.php b/module/product/control.php index c35d101b6b..16c09aad2d 100644 --- a/module/product/control.php +++ b/module/product/control.php @@ -261,12 +261,22 @@ class product extends control if($this->session->product) $rootID = $this->session->product; $this->product->setMenu($this->products, $rootID); + $this->loadModel('user'); + $poUsers = $this->user->getPairs('nodeleted|pofirst|noclosed', '', $this->config->maxCount); + if(!empty($this->config->user->moreLink)) $this->config->moreLinks["PO"] = $this->config->user->moreLink; + + $qdUsers = $this->user->getPairs('nodeleted|qdfirst|noclosed', '', $this->config->maxCount); + if(!empty($this->config->user->moreLink)) $this->config->moreLinks["QD"] = $this->config->user->moreLink; + + $rdUsers = $this->user->getPairs('nodeleted|devfirst|noclosed', '', $this->config->maxCount); + if(!empty($this->config->user->moreLink)) $this->config->moreLinks["RD"] = $this->config->user->moreLink; + $this->view->title = $this->lang->product->create; $this->view->position[] = $this->view->title; $this->view->groups = $this->loadModel('group')->getPairs(); - $this->view->poUsers = $this->loadModel('user')->getPairs('nodeleted|pofirst|noclosed', '', $this->config->maxCount); - $this->view->qdUsers = $this->loadModel('user')->getPairs('nodeleted|qdfirst|noclosed', '', $this->config->maxCount); - $this->view->rdUsers = $this->loadModel('user')->getPairs('nodeleted|devfirst|noclosed', '', $this->config->maxCount); + $this->view->poUsers = $poUsers; + $this->view->qdUsers = $qdUsers; + $this->view->rdUsers = $rdUsers; $this->view->lines = array('') + $this->loadModel('tree')->getLinePairs(); $this->view->rootID = $rootID; @@ -307,14 +317,25 @@ class product extends control $this->product->setMenu($this->products, $productID); $product = $this->product->getById($productID); + + $this->loadModel('user'); + $poUsers = $this->user->getPairs('nodeleted|pofirst', $product->PO, $this->config->maxCount); + if(!empty($this->config->user->moreLink)) $this->config->moreLinks["PO"] = $this->config->user->moreLink; + + $qdUsers = $this->user->getPairs('nodeleted|qdfirst', $product->QD, $this->config->maxCount); + if(!empty($this->config->user->moreLink)) $this->config->moreLinks["QD"] = $this->config->user->moreLink; + + $rdUsers = $this->user->getPairs('nodeleted|devfirst', $product->RD, $this->config->maxCount); + if(!empty($this->config->user->moreLink)) $this->config->moreLinks["RD"] = $this->config->user->moreLink; + $this->view->title = $this->lang->product->edit . $this->lang->colon . $product->name; $this->view->position[] = html::a($this->createLink($this->moduleName, 'browse'), $product->name); $this->view->position[] = $this->lang->product->edit; $this->view->product = $product; $this->view->groups = $this->loadModel('group')->getPairs(); - $this->view->poUsers = $this->loadModel('user')->getPairs('nodeleted|pofirst', $product->PO); - $this->view->qdUsers = $this->loadModel('user')->getPairs('nodeleted|qdfirst', $product->QD); - $this->view->rdUsers = $this->loadModel('user')->getPairs('nodeleted|devfirst', $product->RD); + $this->view->poUsers = $poUsers; + $this->view->qdUsers = $qdUsers; + $this->view->rdUsers = $rdUsers; $this->view->lines = array('') + $this->loadModel('tree')->getLinePairs(); unset($this->lang->product->typeList['']); @@ -364,14 +385,24 @@ class product extends control $appendRdUsers[$product->RD] = $product->RD; } + $this->loadModel('user'); + $poUsers = $this->user->getPairs('nodeleted|pofirst', $appendPoUsers); + if(!empty($this->config->user->moreLink)) $this->config->moreLinks["PO"] = $this->config->user->moreLink; + + $qdUsers = $this->user->getPairs('nodeleted|qdfirst', $appendQdUsers); + if(!empty($this->config->user->moreLink)) $this->config->moreLinks["QD"] = $this->config->user->moreLink; + + $rdUsers = $this->user->getPairs('nodeleted|devfirst', $appendRdUsers); + if(!empty($this->config->user->moreLink)) $this->config->moreLinks["RD"] = $this->config->user->moreLink; + $this->view->title = $this->lang->product->batchEdit; $this->view->position[] = $this->lang->product->batchEdit; $this->view->lines = array('') + $this->tree->getLinePairs(); $this->view->productIDList = $productIDList; $this->view->products = $products; - $this->view->poUsers = $this->loadModel('user')->getPairs('nodeleted|pofirst', $appendPoUsers); - $this->view->qdUsers = $this->loadModel('user')->getPairs('nodeleted|qdfirst', $appendQdUsers); - $this->view->rdUsers = $this->loadModel('user')->getPairs('nodeleted|devfirst', $appendRdUsers); + $this->view->poUsers = $poUsers; + $this->view->qdUsers = $qdUsers; + $this->view->rdUsers = $rdUsers; unset($this->lang->product->typeList['']); $this->display(); diff --git a/module/product/view/batchedit.html.php b/module/product/view/batchedit.html.php index 81c37c66a0..480b6b61fc 100755 --- a/module/product/view/batchedit.html.php +++ b/module/product/view/batchedit.html.php @@ -54,6 +54,11 @@ + config->moreLinks["PO"])) $this->config->moreLinks["POs[$productID]"] = $this->config->moreLinks["PO"]; + if(!empty($this->config->moreLinks["QD"])) $this->config->moreLinks["QDs[$productID]"] = $this->config->moreLinks["QD"]; + if(!empty($this->config->moreLinks["RD"])) $this->config->moreLinks["RDs[$productID]"] = $this->config->moreLinks["RD"]; + ?> name, "class='form-control'");?> @@ -67,6 +72,11 @@ '>desc), "rows='1' class='form-control autosize'");?> order, "class='form-control'");?> + config->moreLinks["POs[$productID]"])) unset($this->config->moreLinks["POs[$productID]"]); + if(isset($this->config->moreLinks["QDs[$productID]"])) unset($this->config->moreLinks["QDs[$productID]"]); + if(isset($this->config->moreLinks["RDs[$productID]"])) unset($this->config->moreLinks["RDs[$productID]"]); + ?> diff --git a/module/project/control.php b/module/project/control.php index 559dfe053a..e2ebfa4caf 100644 --- a/module/project/control.php +++ b/module/project/control.php @@ -1249,20 +1249,32 @@ class project extends control unset($this->lang->project->endList[365]); } + $this->loadModel('user'); + $poUsers = $this->user->getPairs('noclosed|nodeleted|pofirst', $project->PO, $this->config->maxCount); + if(!empty($this->config->user->moreLink)) $this->config->moreLinks["PM"] = $this->config->user->moreLink; + + $pmUsers = $this->user->getPairs('noclosed|nodeleted|pmfirst', $project->PM, $this->config->maxCount); + if(!empty($this->config->user->moreLink)) $this->config->moreLinks["PO"] = $this->config->user->moreLink; + + $qdUsers = $this->user->getPairs('noclosed|nodeleted|qdfirst', $project->QD, $this->config->maxCount); + if(!empty($this->config->user->moreLink)) $this->config->moreLinks["QD"] = $this->config->user->moreLink; + + $rdUsers = $this->user->getPairs('noclosed|nodeleted|devfirst', $project->RD, $this->config->maxCount); + if(!empty($this->config->user->moreLink)) $this->config->moreLinks["RD"] = $this->config->user->moreLink; + $this->view->title = $title; $this->view->position = $position; $this->view->projects = $projects; $this->view->project = $project; - $this->view->poUsers = $this->loadModel('user')->getPairs('noclosed|nodeleted|pofirst', $project->PO); - $this->view->pmUsers = $this->user->getPairs('noclosed|nodeleted|pmfirst', $project->PM); - $this->view->qdUsers = $this->user->getPairs('noclosed|nodeleted|qdfirst', $project->QD); - $this->view->rdUsers = $this->user->getPairs('noclosed|nodeleted|devfirst', $project->RD); + $this->view->poUsers = $poUsers; + $this->view->pmUsers = $pmUsers; + $this->view->qdUsers = $qdUsers; + $this->view->rdUsers = $rdUsers; $this->view->groups = $this->loadModel('group')->getPairs(); $this->view->allProducts = $allProducts; $this->view->linkedProducts = $linkedProducts; $this->view->productPlans = $productPlans; $this->view->branchGroups = $this->loadModel('branch')->getByProducts(array_keys($linkedProducts), '', $linkedBranches); - $this->display(); } @@ -1310,14 +1322,27 @@ class project extends control $this->view->customFields = $customFields; $this->view->showFields = $this->config->project->custom->batchEditFields; + $this->loadModel('user'); + $pmUsers = $this->user->getPairs('noclosed|nodeleted|pmfirst', $appendPmUsers, $this->config->maxCount); + if(!empty($this->config->user->moreLink)) $this->config->moreLinks["PM"] = $this->config->user->moreLink; + + $poUsers = $this->user->getPairs('noclosed|nodeleted|pofirst', $appendPoUsers, $this->config->maxCount); + if(!empty($this->config->user->moreLink)) $this->config->moreLinks["PO"] = $this->config->user->moreLink; + + $qdUsers = $this->user->getPairs('noclosed|nodeleted|qdfirst', $appendQdUsers, $this->config->maxCount); + if(!empty($this->config->user->moreLink)) $this->config->moreLinks["QD"] = $this->config->user->moreLink; + + $rdUsers = $this->user->getPairs('noclosed|nodeleted|devfirst', $appendRdUsers, $this->config->maxCount); + if(!empty($this->config->user->moreLink)) $this->config->moreLinks["RD"] = $this->config->user->moreLink; + $this->view->title = $this->lang->project->batchEdit; $this->view->position[] = $this->lang->project->batchEdit; $this->view->projectIDList = $projectIDList; $this->view->projects = $projects; - $this->view->pmUsers = $this->loadModel('user')->getPairs('noclosed|nodeleted|pmfirst', $appendPmUsers); - $this->view->poUsers = $this->user->getPairs('noclosed|nodeleted|pofirst', $appendPoUsers); - $this->view->qdUsers = $this->user->getPairs('noclosed|nodeleted|qdfirst', $appendQdUsers); - $this->view->rdUsers = $this->user->getPairs('noclosed|nodeleted|devfirst', $appendRdUsers); + $this->view->pmUsers = $pmUsers; + $this->view->poUsers = $poUsers; + $this->view->qdUsers = $qdUsers; + $this->view->rdUsers = $rdUsers; $this->display(); } @@ -1893,7 +1918,7 @@ class project extends control $this->loadModel('dept'); $project = $this->project->getById($projectID); - $users = $this->user->getPairs('noclosed|nodeleted|devfirst|nofeedback'); + $users = $this->user->getPairs('noclosed|nodeleted|devfirst|nofeedback', '', $this->config->maxCount); $roles = $this->user->getUserRoles(array_keys($users)); $deptUsers = $dept === '' ? array() : $this->dept->getDeptUserPairs($dept); $currentMembers = $this->project->getTeamMembers($projectID); @@ -1903,6 +1928,7 @@ class project extends control /* Set menu. */ $this->project->setMenu($this->projects, $project->id); + if(!empty($this->config->user->moreLink)) $this->config->moreLinks["accounts[]"] = $this->config->user->moreLink; $title = $this->lang->project->manageMembers . $this->lang->colon . $project->name; $position[] = html::a($this->createLink('project', 'browse', "projectID=$projectID"), $project->name); diff --git a/module/project/js/managemembers.js b/module/project/js/managemembers.js index ad634b0871..db7fa3260f 100644 --- a/module/project/js/managemembers.js +++ b/module/project/js/managemembers.js @@ -17,9 +17,18 @@ function addItem(obj) { var item = $('#addItem').html().replace(/%i%/g, i); $(obj).closest('tr').after('' + item + ''); - var accounts = $('#hours' + i).closest('tr').find('select:first') - accounts.trigger('liszt:updated'); - accounts.chosen(); + var $accounts = $('#hours' + i).closest('tr').find('select:first') + + if($accounts.attr('data-pickertype') != 'remote') + { + $accounts.chosen(); + } + else + { + $accounts.parent().find('.picker.picker-ready').remove(); + var pickerremote = $accounts.attr('data-pickerremote'); + $accounts.picker({chosenMode: true, remote: pickerremote}); + } i ++; } diff --git a/module/project/view/batchedit.html.php b/module/project/view/batchedit.html.php index 437e5d8b1a..e6da13707a 100755 --- a/module/project/view/batchedit.html.php +++ b/module/project/view/batchedit.html.php @@ -60,6 +60,12 @@ + config->moreLinks["PM"])) $this->config->moreLinks["PMs[$projectID]"] = $this->config->moreLinks["PM"]; + if(!empty($this->config->moreLinks["PO"])) $this->config->moreLinks["POs[$projectID]"] = $this->config->moreLinks["PO"]; + if(!empty($this->config->moreLinks["QD"])) $this->config->moreLinks["QDs[$projectID]"] = $this->config->moreLinks["QD"]; + if(!empty($this->config->moreLinks["RD"])) $this->config->moreLinks["RDs[$projectID]"] = $this->config->moreLinks["RD"]; + ?> name, "class='form-control'");?> @@ -82,6 +88,12 @@ order, "class='form-control'")?> + config->moreLinks["PMs[$projectID]"])) unset($this->config->moreLinks["PMs[$projectID]"]); + if(isset($this->config->moreLinks["POs[$projectID]"])) unset($this->config->moreLinks["POs[$projectID]"]); + if(isset($this->config->moreLinks["QDs[$projectID]"])) unset($this->config->moreLinks["QDs[$projectID]"]); + if(isset($this->config->moreLinks["RDs[$projectID]"])) unset($this->config->moreLinks["RDs[$projectID]"]); + ?> diff --git a/module/story/js/batchcreate.js b/module/story/js/batchcreate.js index 3122a78161..1bee68b060 100644 --- a/module/story/js/batchcreate.js +++ b/module/story/js/batchcreate.js @@ -54,6 +54,7 @@ function setModuleAndPlan(branchID, productID, num) if(!modules) modules = ''; $('#module' + num).replaceWith(modules); $("#module" + num + "_chosen").remove(); + $("#module" + num).next('.picker').remove(); $("#module" + num).chosen(); }); @@ -63,6 +64,7 @@ function setModuleAndPlan(branchID, productID, num) if(!plans) plans = ''; $('#plan' + num).replaceWith(plans); $("#plan" + num + "_chosen").remove(); + $("#plan" + num).next('.picker').remove(); $("#plan" + num).chosen(); }); } diff --git a/module/task/js/batchcreate.js b/module/task/js/batchcreate.js index 185a1b727e..795e7fab84 100755 --- a/module/task/js/batchcreate.js +++ b/module/task/js/batchcreate.js @@ -30,6 +30,7 @@ function setStories(moduleID, projectID, num) } var chosenWidth = $("#story" + num + "_chosen").css('max-width'); $("#story" + num + "_chosen").remove(); + $("#story" + num).next('.picker').remove(); $("#story" + num).chosen(); $("#story" + num + "_chosen").width(chosenWidth).css('max-width', chosenWidth); }); diff --git a/module/task/js/create.js b/module/task/js/create.js index a1fdf96fb4..f9639775b3 100644 --- a/module/task/js/create.js +++ b/module/task/js/create.js @@ -24,12 +24,14 @@ function loadProjectMembers(projectID) $.get(createLink('project', 'ajaxGetMembers', 'projectID=' + projectID + '&assignedTo=' + $('#assignedTo').val()), function(data) { $('#assignedTo_chosen').remove(); + $('#assignedTo').next('.picker').remove(); $('#assignedTo').replaceWith(data); $('#assignedTo').attr('name', 'assignedTo[]').chosen(); $('.modal-dialog #taskTeamEditor tr').each(function() { $(this).find('#team_chosen').remove(); + $(this).find('#team').next('.picker').remove(); $(this).find('#team').replaceWith(data); $(this).find('#assignedTo').attr('id', 'team').attr('name', 'team[]').chosen(); }); @@ -48,6 +50,7 @@ function loadProjectStories(projectID) $.get(createLink('story', 'ajaxGetProjectStories', 'projectID=' + projectID + '&productID=0&branch=0&moduleID=0&storyID=' + $('#story').val()), function(data) { $('#story_chosen').remove(); + $('#story').next('.picker').remove(); $('#story').replaceWith(data); $('#story').addClass('filled').chosen(); }); @@ -93,6 +96,7 @@ function setOwners(result) $("#multipleBox").removeAttr("checked"); $('.team-group').addClass('hidden'); $('#assignedTo, #assignedTo_chosen').removeClass('hidden'); + $('#assignedTo').next('.picker').removeClass('hidden'); if(result == 'affair') { $('#assignedTo').attr('multiple', 'multiple'); @@ -228,6 +232,7 @@ function setStories(moduleID, projectID) $('#story').val(storyID); setPreview(); $('#story_chosen').remove(); + $('#story').next('.picker').remove(); $("#story").addClass('filled').chosen(); }); } @@ -365,12 +370,14 @@ $(document).ready(function() if($(this).prop('checked')) { $('#assignedTo, #assignedTo_chosen').addClass('hidden'); + $('#assignedTo').next('.picker').addClass('hidden'); $('.team-group').removeClass('hidden'); $('#estimate').attr('readonly', true); } else { $('#assignedTo, #assignedTo_chosen').removeClass('hidden'); + $('#assignedTo').next('.picker').removeClass('hidden'); $('.team-group').addClass('hidden'); $('#estimate').attr('readonly', false); } diff --git a/module/testcase/js/batchcreate.js b/module/testcase/js/batchcreate.js index d6153d2d5f..adfc541b4f 100644 --- a/module/testcase/js/batchcreate.js +++ b/module/testcase/js/batchcreate.js @@ -105,6 +105,7 @@ function setModules(branchID, productID, num) if(!modules) modules = ''; $('#module' + num).replaceWith(modules); $("#module" + num + "_chosen").remove(); + $("#module" + num).next('.picker').remove(); $("#module" + num).chosen(); }); } diff --git a/module/testcase/js/common.js b/module/testcase/js/common.js index a238e29b90..cc09050347 100644 --- a/module/testcase/js/common.js +++ b/module/testcase/js/common.js @@ -132,6 +132,7 @@ function setStories() $('#story').replaceWith(stories); $('#story').val(value); $('#story_chosen').remove(); + $('#story').next('.picker').remove(); $("#story").chosen(); }); } diff --git a/www/js/zui/picker/zui.picker.min.css b/www/js/zui/picker/zui.picker.min.css index b358312759..5587c1fa44 100644 --- a/www/js/zui/picker/zui.picker.min.css +++ b/www/js/zui/picker/zui.picker.min.css @@ -3,4 +3,6 @@ * http://openzui.com * GitHub: https://github.com/easysoft/zui.git * Copyright (c) 2020 cnezsoft.com; Licensed MIT - */.picker{min-height:32px;background-color:#eee}.picker:not(.picker-ready)>*{display:none}.picker-selections{position:relative;min-height:32px;color:#222;background-color:#fff;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.picker-focus .picker-selections{border-color:#145ccd;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(20,92,205,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(20,92,205,.6)}.picker-multi .picker-selections{padding:3px}.picker-multi.picker-focus .picker-selections:before{position:absolute;right:0;bottom:8px;display:block;width:24px;height:14px;font-family:ZenIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-align:center;text-transform:none;content:'\e603';opacity:.4;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.picker-multi.picker-focus.picker-loading .picker-selections::before{display:inline-block;content:'\e97c';-webkit-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}.picker-multi .picker-selection{position:relative;display:inline-block;padding:0 20px 0 5px;margin:2px;line-height:18px;background-color:#f1f1f1;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ddd;border-radius:3px;-webkit-box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05);box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05)}.picker-selection-single{max-width:100%;padding:5px 20px 5px 8px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.picker-focus .picker-selection-single .picker-selection-text{display:none}.picker-selection-single:after{position:absolute;top:7px;right:0;display:block;width:24px;height:14px;font-family:ZenIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-align:center;text-transform:none;content:'\e6b8';opacity:.4;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.picker-focus .picker-selection-single::after{content:'\e603'}.picker-focus.picker-loading .picker-selection-single::after{display:inline-block;content:'\e97c';-webkit-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}.picker-selection-remove{position:absolute;top:0;right:0;width:20px;height:20px;text-align:center;cursor:pointer;opacity:.2}.picker-selection-remove:before{font-family:ZenIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-shadow:0 1px 0 #fff;text-transform:none;content:'\d7';speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.picker-selection-remove:hover{opacity:.5}.picker-single .picker-selection-remove{top:5px;right:20px}.picker-no-value .picker-selection-remove,.picker-single.picker-focus .picker-selection-remove{display:none}.picker-search{color:transparent;background:0 0;border:none}.picker-search:focus{color:inherit;outline:0}.picker-single .picker-search{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;width:100%;padding:5px 8px}.picker-multi .picker-search{display:inline-block;width:10px;min-width:10px;max-width:100%;padding:0 2px;margin:2px 0}.picker-placeholder{position:absolute;top:5px;right:20px;left:8px;z-index:0;display:none;overflow:hidden;color:grey;text-overflow:ellipsis;white-space:nowrap}.picker-no-value .picker-placeholder{display:block}.picker-drop-menu{position:fixed;z-index:1200;display:none;min-width:100px;background-color:#fff;border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175);opacity:0}.picker-drop-menu.picker-drop-show{display:block}.picker-drop-menu.picker-has-message{min-height:22px;padding-bottom:22px}.picker-option-list{padding:5px 0;margin:0;overflow-y:auto}.picker-no-options .picker-option-list{display:none}.picker-option{display:block;min-height:30px;padding:5px 10px;overflow:hidden;clear:both;font-weight:400;line-height:1.53846154;color:#353535;text-overflow:ellipsis;white-space:nowrap;-webkit-transition:none;-o-transition:none;transition:none}.picker-single .picker-option.picker-option-selected{color:#3280fc;background:#ebf2f9}.picker-option:focus,.picker-option:hover{text-decoration:none}.picker-option.picker-option-active,.picker-single .picker-option.picker-option-selected.picker-option-active{color:#fff;background-color:#3280fc}.picker-multi .picker-option.picker-option-selected,.picker-multi .picker-option.picker-option-selected.picker-option-active{color:#ccc;cursor:not-allowed;background-color:#fff}.picker-option-text-matched{position:relative;color:#3280fc}.picker-option-text-matched:before{position:absolute;right:0;bottom:-4px;left:0;display:block;height:3px;content:' ';background-color:#3280fc;border-radius:2px;opacity:.5}.picker-option:hover .picker-option-text-matched{color:#fff}.picker-option:hover .picker-option-text-matched:before{background-color:#fff}.picker-message{position:absolute;right:0;bottom:0;left:0;display:none;height:22px;padding:2px 5px;overflow:hidden;font-size:12px;color:grey;text-overflow:ellipsis;white-space:nowrap;background-color:#f1f1f1}.picker-has-message .picker-message{display:block}.picker-message[data-type=danger]{color:#ea644a} \ No newline at end of file + */ +.picker{min-height:32px;background-color:#eee}.picker:not(.picker-ready)>*{display:none}.picker-selections{position:relative;min-height:32px;color:#222;background-color:#fff;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.picker-focus .picker-selections{border-color:#145ccd;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(20,92,205,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(20,92,205,.6)}.picker-multi .picker-selections{padding:3px}.picker-multi.picker-focus .picker-selections:before{position:absolute;right:0;bottom:8px;display:block;width:24px;height:14px;font-family:ZenIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-align:center;text-transform:none;content:'\e603';opacity:.4;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.picker-multi.picker-focus.picker-loading .picker-selections::before{display:inline-block;content:'\e97c';-webkit-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}.picker-multi .picker-selection{position:relative;display:inline-block;padding:0 20px 0 5px;margin:2px;line-height:18px;background-color:#f1f1f1;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ddd;border-radius:3px;-webkit-box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05);box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05)}.picker-selection-single{max-width:100%;padding:5px 20px 5px 8px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.picker-focus .picker-selection-single .picker-selection-text{display:none}.picker-selection-single:after{position:absolute;top:7px;right:0;display:block;width:24px;height:14px;font-family:ZenIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-align:center;text-transform:none;content:'\e6b8';opacity:.4;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.picker-focus .picker-selection-single::after{content:'\e603'}.picker-focus.picker-loading .picker-selection-single::after{display:inline-block;content:'\e97c';-webkit-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}.picker-selection-remove{position:absolute;top:0;right:0;width:20px;height:20px;text-align:center;cursor:pointer;opacity:.2}.picker-selection-remove:before{font-family:ZenIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-shadow:0 1px 0 #fff;text-transform:none;content:'\d7';speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.picker-selection-remove:hover{opacity:.5}.picker-single .picker-selection-remove{top:5px;right:20px}.picker-no-value .picker-selection-remove,.picker-single.picker-focus .picker-selection-remove{display:none}.picker-search{color:transparent;background:0 0;border:none}.picker-search:focus{color:inherit;outline:0}.picker-single .picker-search{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;width:100%;padding:5px 8px}.picker-multi .picker-search{display:inline-block;width:10px;min-width:10px;max-width:100%;padding:0 2px;margin:2px 0}.picker-placeholder{position:absolute;top:5px;right:20px;left:8px;z-index:0;display:none;overflow:hidden;color:grey;text-overflow:ellipsis;white-space:nowrap}.picker-no-value .picker-placeholder{display:block}.picker-drop-menu{position:fixed;z-index:1200;display:none;min-width:100px;background-color:#fff;border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175);opacity:0}.picker-drop-menu.picker-drop-show{display:block}.picker-drop-menu.picker-has-message{min-height:22px;padding-bottom:22px}.picker-option-list{padding:5px 0;margin:0;overflow-y:auto}.picker-no-options .picker-option-list{display:none}.picker-option{display:block;min-height:30px;padding:5px 10px;overflow:hidden;clear:both;font-weight:400;line-height:1.53846154;color:#353535;text-overflow:ellipsis;white-space:nowrap;-webkit-transition:none;-o-transition:none;transition:none}.picker-single .picker-option.picker-option-selected{color:#3280fc;background:#ebf2f9}.picker-option:focus,.picker-option:hover{text-decoration:none}.picker-option.picker-option-active,.picker-single .picker-option.picker-option-selected.picker-option-active{color:#fff;background-color:#3280fc}.picker-multi .picker-option.picker-option-selected,.picker-multi .picker-option.picker-option-selected.picker-option-active{color:#ccc;cursor:not-allowed;background-color:#fff}.picker-option-text-matched{position:relative;color:#3280fc}.picker-option-text-matched:before{position:absolute;right:0;bottom:-4px;left:0;display:block;height:3px;content:' ';background-color:#3280fc;border-radius:2px;opacity:.5}.picker-option:hover .picker-option-text-matched{color:#fff}.picker-option:hover .picker-option-text-matched:before{background-color:#fff}.picker-message{position:absolute;right:0;bottom:0;left:0;display:none;height:22px;padding:2px 5px;overflow:hidden;font-size:12px;color:grey;text-overflow:ellipsis;white-space:nowrap;background-color:#f1f1f1}.picker-has-message .picker-message{display:block}.picker-message[data-type=danger]{color:#ea644a} +.picker-single .picker-selection-remove{z-index:1000;} From bb3658ecf891398e0b008211b8e70b5459fbe168 Mon Sep 17 00:00:00 2001 From: tianshujie98 Date: Wed, 5 Aug 2020 17:58:17 +0800 Subject: [PATCH 04/24] * Fix bug #2504. --- module/task/model.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/module/task/model.php b/module/task/model.php index f6910a4402..da8538011e 100644 --- a/module/task/model.php +++ b/module/task/model.php @@ -2688,11 +2688,11 @@ class taskModel extends model { $action = strtolower($action); - if($action == 'start' and !empty($task->children)) return false; - if($action == 'finish' and !empty($task->children)) return false; - if($action == 'pause' and !empty($task->children)) return false; - if($action == 'assignto' and !empty($task->children)) return false; - if($action == 'close' and !empty($task->children)) return false; + if($action == 'start' and $task->parent < 0) return false; + if($action == 'finish' and $task->parent < 0) return false; + if($action == 'pause' and $task->parent < 0) return false; + if($action == 'assignto' and $task->parent < 0) return false; + if($action == 'close' and $task->parent < 0) return false; if($action == 'batchcreate' and !empty($task->team)) return false; if($action == 'batchcreate' and $task->parent > 0) return false; if($action == 'recordestimate' and $task->parent == -1) return false; From a2d561f1ce55f00fd21fc7dc7560ed8d72c30ad8 Mon Sep 17 00:00:00 2001 From: Catouse Date: Thu, 6 Aug 2020 09:46:16 +0800 Subject: [PATCH 05/24] * update zui and picker. --- www/js/zui/min.js | 4 ++-- www/js/zui/picker/zui.picker.min.css | 6 ++---- www/js/zui/picker/zui.picker.min.js | 4 ++-- www/theme/zui/css/min.css | 4 ++-- 4 files changed, 8 insertions(+), 10 deletions(-) diff --git a/www/js/zui/min.js b/www/js/zui/min.js index 1a2e2bb428..5655a7a988 100644 --- a/www/js/zui/min.js +++ b/www/js/zui/min.js @@ -1,5 +1,5 @@ /*! - * ZUI: ZUI for Zentao - v1.9.2 - 2020-07-29 + * ZUI: ZUI for Zentao - v1.9.2 - 2020-08-06 * http://openzui.com * GitHub: https://github.com/easysoft/zui.git * Copyright (c) 2020 cnezsoft.com; Licensed MIT @@ -16,7 +16,7 @@ function(t,e,i){"$:nomunge";function n(){o=e[r](function(){a.each(function(){var * Copyright 2006, 2014 Klaus Hartl * Released under the MIT license */ -function(t){"function"==typeof define&&define.amd?define(["jquery"],t):t("object"==typeof exports?require("jquery"):jQuery)}(function(t){function e(t){return r.raw?t:encodeURIComponent(t)}function i(t){return r.raw?t:decodeURIComponent(t)}function n(t){return e(r.json?JSON.stringify(t):String(t))}function o(t){0===t.indexOf('"')&&(t=t.slice(1,-1).replace(/\\"/g,'"').replace(/\\\\/g,"\\"));try{return t=decodeURIComponent(t.replace(s," ")),r.json?JSON.parse(t):t}catch(e){}}function a(e,i){var n=r.raw?e:o(e);return t.isFunction(i)?i(n):n}var s=/\+/g,r=t.cookie=function(o,s,l){if(void 0!==s&&!t.isFunction(s)){if(l=t.extend({},r.defaults,l),"number"==typeof l.expires){var h=l.expires,c=l.expires=new Date;c.setTime(+c+864e5*h)}return document.cookie=[e(o),"=",n(s),l.expires?"; expires="+l.expires.toUTCString():"",l.path?"; path="+l.path:"",l.domain?"; domain="+l.domain:"",l.secure?"; secure":""].join("")}for(var d=o?void 0:{},u=document.cookie?document.cookie.split("; "):[],p=0,f=u.length;p=0;t--)delete this.page[i[t]];this.set(a,this.page)}},s.prototype.pageRemove=function(t){"undefined"!=typeof this.page[t]&&(this.page[t]=null,this.pageSave())},s.prototype.pageClear=function(){this.page={},this.pageSave()},s.prototype.pageGet=function(t,e){var i=this.page[t];return void 0===e||null!==i&&void 0!==i?i:e},s.prototype.pageSet=function(t,i){e.isPlainObject(t)?e.extend(!0,this.page,t):this.page[this.serialize(t)]=i,this.pageSave()},s.prototype.check=function(){if(!this.enable&&!this.silence)throw new Error("Browser not support localStorage or enable status been set true.");return this.enable},s.prototype.length=function(){return this.check()?i.getLength?i.getLength():i.length:0},s.prototype.removeItem=function(t){return i.removeItem(t),this},s.prototype.remove=function(t){return this.removeItem(t)},s.prototype.getItem=function(t){return i.getItem(t)},s.prototype.get=function(t,e){var i=this.deserialize(this.getItem(t));return"undefined"!=typeof i&&null!==i||"undefined"==typeof e?i:e},s.prototype.key=function(t){return i.key(t)},s.prototype.setItem=function(t,e){return i.setItem(t,e),this},s.prototype.set=function(t,e){return void 0===e?this.remove(t):(this.setItem(t,this.serialize(e)),this)},s.prototype.clear=function(){return i.clear(),this},s.prototype.forEach=function(t){for(var e=this.length(),n=e-1;n>=0;n--){var o=i.key(n);t(o,this.get(o))}return this},s.prototype.getAll=function(){var t={};return this.forEach(function(e,i){t[e]=i}),t},s.prototype.serialize=function(t){return"string"==typeof t?t:JSON.stringify(t)},s.prototype.deserialize=function(t){if("string"==typeof t)try{return JSON.parse(t)}catch(e){return t||void 0}},e.zui({store:new s})}(window,jQuery),function(t){"use strict";var e="zui.searchBox",i=function(e,n){var o=this;o.name=name,o.$=t(e),o.options=n=t.extend({},i.DEFAULTS,o.$.data(),n);var a=o.$.is(n.inputSelector)?o.$:o.$.find(n.inputSelector);if(a.length){var s=function(){o.changeTimer&&(clearTimeout(o.changeTimer),o.changeTimer=null)},r=function(){s();var t=o.getSearch();if(t!==o.lastValue){var e=""===t;a.toggleClass("empty",e),o.$.callComEvent(o,"onSearchChange",[t,e]),o.lastValue=t}};o.$input=a=a.first(),a.on(n.listenEvent,function(t){o.changeTimer=setTimeout(function(){r()},n.changeDelay)}).on("focus",function(t){a.addClass("focus"),o.$.callComEvent(o,"onFocus",[t])}).on("blur",function(t){a.removeClass("focus"),o.$.callComEvent(o,"onBlur",[t])}).on("keydown",function(t){var e=0,i=t.which;27===i&&n.escToClear?(this.setSearch("",!0),r(),e=1):13===i&&n.onPressEnter&&(r(),o.$.callComEvent(o,"onPressEnter",[t]));var a=o.$.callComEvent(o,"onKeyDown",[t]);a===!1&&(e=1),e&&t.preventDefault()}),o.$.on("click",".search-clear-btn",function(t){o.setSearch("",!0),r(),o.focus(),t.preventDefault()}),r()}else console.error("ZUI: search box init error, cannot find search box input element.")};i.DEFAULTS={inputSelector:'input[type="search"],input[type="text"]',listenEvent:"change input paste",changeDelay:500},i.prototype.getSearch=function(){return this.$input&&t.trim(this.$input.val())},i.prototype.setSearch=function(t,e){var i=this.$input;i&&(i.val(t),e||i.trigger("change"))},i.prototype.focus=function(){this.$input&&this.$input.focus()},t.fn.searchBox=function(n){return this.each(function(){var o=t(this),a=o.data(e),s="object"==typeof n&&n;a||o.data(e,a=new i(this,s)),"string"==typeof n&&a[n]()})},i.NAME=e,t.fn.searchBox.Constructor=i}(jQuery),function(t,e){"use strict";var i="zui.draggable",n={container:"body",move:!0},o=0,a=function(e,i){var a=this;a.$=t(e),a.id=o++,a.options=t.extend({},n,a.$.data(),i),a.init()};a.DEFAULTS=n,a.NAME=i,a.prototype.init=function(){var n,o,a,s,r,l=this,h=l.$,c="before",d="drag",u="finish",p="."+i+"."+l.id,f="mousedown"+p,g="mouseup"+p,m="mousemove"+p,v=l.options,y=v.selector,b=v.handle,w=h,x=t.isFunction(v.move),C=function(t){var e=t.pageX,i=t.pageY;r=!0;var o={left:e-a.x,top:i-a.y};w.removeClass("drag-ready").addClass("dragging"),v.move&&(x?v.move(o,w):w.css(o)),v[d]&&v[d]({event:t,element:w,startOffset:a,pos:o,offset:{x:e-n.x,y:i-n.y},smallOffset:{x:e-s.x,y:i-s.y}}),s.x=e,s.y=i,v.stopPropagation&&t.stopPropagation()},_=function(i){if(t(e).off(p),!r)return void w.removeClass("drag-ready");var o={left:i.pageX-a.x,top:i.pageY-a.y};w.removeClass("drag-ready dragging"),v.move&&(x?v.move(o,w):w.css(o)),v[u]&&v[u]({event:i,element:w,startOffset:a,pos:o,offset:{x:i.pageX-n.x,y:i.pageY-n.y},smallOffset:{x:i.pageX-s.x,y:i.pageY-s.y}}),i.preventDefault(),v.stopPropagation&&i.stopPropagation()},k=function(i){var l=t.zui.getMouseButtonCode(v.mouseButton);if(!(l>-1&&i.button!==l)){var h=t(this);if(y&&(w=b?h.closest(y):h),v[c]){var d=v[c]({event:i,element:w});if(d===!1)return}var u=t(v.container),p=w.offset();o=u.offset(),n={x:i.pageX,y:i.pageY},a={x:i.pageX-p.left+o.left,y:i.pageY-p.top+o.top},s=t.extend({},n),r=!1,w.addClass("drag-ready"),i.preventDefault(),v.stopPropagation&&i.stopPropagation(),t(e).on(m,C).on(g,_)}};b?h.on(f,b,k):y?h.on(f,y,k):h.on(f,k)},a.prototype.destroy=function(){var n="."+i+"."+this.id;this.$.off(n),t(e).off(n),this.$.data(i,null)},t.fn.draggable=function(e){return this.each(function(){var n=t(this),o=n.data(i),s="object"==typeof e&&e;o||n.data(i,o=new a(this,s)),"string"==typeof e&&o[e]()})},t.fn.draggable.Constructor=a}(jQuery,document),function(t,e,i){"use strict";var n="zui.droppable",o={target:".droppable-target",deviation:5,sensorOffsetX:0,sensorOffsetY:0,dropToClass:"drop-to"},a=0,s=function(e,i){var n=this;n.id=a++,n.$=t(e),n.options=t.extend({},o,n.$.data(),i),n.init()};s.DEFAULTS=o,s.NAME=n,s.prototype.trigger=function(e,i){return t.zui.callEvent(this.options[e],i,this)},s.prototype.init=function(){var o,a,s,r,l,h,c,d,u,p,f,g,m,v=this,y=v.$,b=v.options,w=b.deviation,x="."+n+"."+v.id,C="mousedown"+x,_="mouseup"+x,k="mousemove"+x,T=b.selector,S=b.handle,D=b.flex,M=b.container,P=b.canMoveHere,z=b.dropToClass,F=y,L=!1,I=M?t(b.container).first():T?y:t("body"),E=function(e){if(L&&(f={left:e.pageX,top:e.pageY},!(i.abs(f.left-d.left)a&&f.top>s&&f.left-1&&i.button!==n)){var f=t(this);T&&(F=S?f.closest(T):f),F.hasClass("drag-shadow")||b.before&&b.before({event:i,element:F})===!1||(L=!0,o=t.isFunction(b.target)?b.target(F,y):I.find(b.target),a=null,s=null,r=!1,l=!0,h=null,c=F.offset(),u=I.offset(),u.top=u.top-I.scrollTop(),u.left=u.left-I.scrollLeft(),d={left:i.pageX,top:i.pageY},g=t.extend({},d),p={left:d.left-c.left,top:d.top-c.top},F.addClass("drag-from"),t(e).on(k,E).on(_,$),m=setTimeout(function(){t(e).on(C,$)},10),i.preventDefault(),b.stopPropagation&&i.stopPropagation())}};S?y.on(C,S,A):T?y.on(C,T,A):y.on(C,A)},s.prototype.destroy=function(){var i="."+n+"."+this.id;this.$.off(i),t(e).off(i),this.$.data(n,null)},s.prototype.reset=function(){this.destroy(),this.init()},t.fn.droppable=function(e){return this.each(function(){var i=t(this),o=i.data(n),a="object"==typeof e&&e;o||i.data(n,o=new s(this,a)),"string"==typeof e&&o[e]()})},t.fn.droppable.Constructor=s}(jQuery,document,Math),+function(t,e){"use strict";function i(e,i,a){return this.each(function(){var s=t(this),r=s.data(n),l=t.extend({},o.DEFAULTS,s.data(),"object"==typeof e&&e);r||s.data(n,r=new o(this,l)),"string"==typeof e?r[e](i,a):l.show&&r.show(i,a)})}var n="zui.modal",o=function(i,o){var a=this;a.options=o,a.$body=t(document.body),a.$element=t(i),a.$backdrop=a.isShown=null,a.scrollbarWidth=0,o.moveable===e&&(a.options.moveable=a.$element.hasClass("modal-moveable")),o.remote&&a.$element.find(".modal-content").load(o.remote,function(){a.$element.trigger("loaded."+n)}),o.scrollInside&&t(window).on("resize."+n,function(){a.isShown&&a.adjustPosition()})};o.VERSION="3.2.0",o.TRANSITION_DURATION=300,o.BACKDROP_TRANSITION_DURATION=150,o.DEFAULTS={backdrop:!0,keyboard:!0,show:!0,position:"fit"};var a=function(e,i){var n=t(window);i.left=Math.max(0,Math.min(i.left,n.width()-e.outerWidth())),i.top=Math.max(0,Math.min(i.top,n.height()-e.outerHeight())),e.css(i)};o.prototype.toggle=function(t,e){return this.isShown?this.hide():this.show(t,e)},o.prototype.adjustPosition=function(i){var o=this,s=o.options;if(i===e&&(i=s.position),i!==e&&null!==i){t.isFunction(i)&&(i=i(o));var r=o.$element.find(".modal-dialog"),l=t(window).height(),h={maxHeight:"initial",overflow:"visible"},c=r.find(".modal-body").css(h);if(s.scrollInside&&c.length){var d=s.headerHeight,u=s.footerHeight,p=r.find(".modal-header"),f=r.find(".modal-footer");"number"!=typeof d&&(d=p.length?p.outerHeight():t.isFunction(d)?d(p):0),u="number"!=typeof u&&f.length?f.outerHeight():t.isFunction(u)?u(f):0,h.maxHeight=l-d-u,h.overflow=c[0].scrollHeight>h.maxHeight?"auto":"visible",c.css(h)}var g=Math.max(0,(l-r.outerHeight())/2);if("fit"===i?i={top:g>50?Math.floor(2*g/3):g}:"center"===i?i={top:g}:t.isPlainObject(i)||(i={top:i}),r.hasClass("modal-moveable")){var m=null,v=s.rememberPos;v&&(v===!0?m=o.$element.data("modal-pos"):t.zui.store&&(m=t.zui.store.pageGet(n+".rememberPos."+v))),i=t.extend(i,{left:Math.max(0,(t(window).width()-r.outerWidth())/2)},m),"inside"===s.moveable?a(r,i):r.css(i)}else r.css(i)}},o.prototype.setMoveable=function(){t.fn.draggable||console.error("Moveable modal requires draggable.js.");var e=this,i=e.options,o=e.$element.find(".modal-dialog").removeClass("modal-dragged");o.toggleClass("modal-moveable",!!i.moveable),e.$element.data("modal-moveable-setup")||o.draggable({container:e.$element,handle:".modal-header",before:function(){var t=o.css("margin-top");t&&"0px"!==t&&o.css("top",t).css("margin-top","").addClass("modal-dragged")},finish:function(o){var a=i.rememberPos;a&&(e.$element.data("modal-pos",o.pos),t.zui.store&&a!==!0&&t.zui.store.pageSet(n+".rememberPos."+a,o.pos))},move:"inside"!==i.moveable||function(t){a(o,t)}})},o.prototype.show=function(e,i){var a=this,s=t.Event("show."+n,{relatedTarget:e});a.$element.trigger(s),a.$element.toggleClass("modal-scroll-inside",!!a.options.scrollInside),a.isShown||s.isDefaultPrevented()||(a.isShown=!0,a.options.moveable&&a.setMoveable(),a.options.backdrop!==!1&&(a.setScrollbar(),a.$body.addClass("modal-open")),a.escape(),a.$element.on("click.dismiss."+n,'[data-dismiss="modal"]',function(t){a.hide(),t.stopPropagation()}),a.backdrop(function(){var s=t.support.transition&&a.$element.hasClass("fade");a.$element.parent().length||a.$element.appendTo(a.$body),a.$element.show().scrollTop(0),s&&a.$element[0].offsetWidth,a.$element.addClass("in").attr("aria-hidden",!1),a.adjustPosition(i),a.enforceFocus();var r=t.Event("shown."+n,{relatedTarget:e});s?a.$element.find(".modal-dialog").one("bsTransitionEnd",function(){a.$element.trigger("focus").trigger(r)}).emulateTransitionEnd(o.TRANSITION_DURATION):a.$element.trigger("focus").trigger(r)}))},o.prototype.hide=function(e){e&&e.preventDefault&&e.preventDefault();var i=this;e=t.Event("hide."+n),i.$element.trigger(e),i.isShown&&!e.isDefaultPrevented()&&(i.isShown=!1,i.options.backdrop!==!1&&(i.$body.removeClass("modal-open"),i.resetScrollbar()),i.escape(),t(document).off("focusin."+n),i.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss."+n),t.support.transition&&i.$element.hasClass("fade")?i.$element.one("bsTransitionEnd",t.proxy(i.hideModal,i)).emulateTransitionEnd(o.TRANSITION_DURATION):i.hideModal())},o.prototype.enforceFocus=function(){t(document).off("focusin."+n).on("focusin."+n,t.proxy(function(t){this.$element[0]===t.target||this.$element.has(t.target).length||this.$element.trigger("focus")},this))},o.prototype.escape=function(){this.isShown&&this.options.keyboard?t(document).on("keydown.dismiss."+n,t.proxy(function(i){if(27==i.which){var o=t.Event("escaping."+n),a=this.$element.triggerHandler(o,"esc");if(a!=e&&!a)return;this.hide()}},this)):this.isShown||t(document).off("keydown.dismiss."+n)},o.prototype.hideModal=function(){var t=this;this.$element.hide(),this.backdrop(function(){t.$element.trigger("hidden."+n)})},o.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},o.prototype.backdrop=function(e){var i=this,a=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var s=t.support.transition&&a;if(this.$backdrop=t('