| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660 |
- <?php
- /**
- * The edit view of task of ZenTaoPMS.
- *
- * @copyright Copyright 2009-2023 禅道软件(青岛)有限公司(ZenTao Software (Qingdao) Co., Ltd. www.zentao.net)
- * @license ZPL(https://zpl.pub/page/zplv12.html) or AGPL(https://www.gnu.org/licenses/agpl-3.0.en.html)
- * @author zenggang<zenggang@easycorp.ltd>
- * @package task
- * @link https://www.zentao.net
- */
- namespace zin;
- include($this->app->getModuleRoot() . 'ai/ui/inputinject.html.php');
- $taskStatus = isset($task->rawStatus) ? $task->rawStatus : $task->status;
- /* ====== Preparing and processing page data ====== */
- jsVar('oldStoryID', $task->story);
- jsVar('oldAssignedTo', $task->assignedTo);
- jsVar('oldExecutionID', $task->execution);
- jsVar('oldConsumed', $task->consumed);
- jsVar('objectID', $execution->multiple ? $execution->id : $execution->project);
- jsVar('taskStatus', $taskStatus);
- jsVar('currentUser', $app->user->account);
- jsVar('team', array_values($task->members));
- jsVar('members', $members);
- jsVar('page', 'edit');
- jsVar('confirmChangeExecution', $lang->task->confirmChangeExecution);
- jsVar('teamMemberError', $lang->task->error->teamMember);
- jsVar('totalLeftError', sprintf($this->lang->task->error->leftEmptyAB, zget($this->lang->task->statusList, $taskStatus)));
- jsVar('confirmRecord', $lang->task->confirmRecord);
- jsVar('estimateNotEmpty', sprintf($lang->error->gt, $lang->task->estimate, '0'));
- jsVar('leftNotEmpty', sprintf($lang->error->gt, $lang->task->left, '0'));
- jsVar('requiredFields', $config->task->edit->requiredFields);
- jsVar('+parentEstStarted', !empty($parentTask) ? $parentTask->estStarted : '');
- jsVar('+parentDeadline', !empty($parentTask) ? $parentTask->deadline : '');
- jsVar('childDateLimit', $childDateLimit);
- jsVar('ignoreLang', $lang->project->ignore);
- jsVar('+overParentEstStartedLang', !empty($parentTask) ? sprintf($lang->task->overParentEsStarted, $parentTask->estStarted) : '');
- jsVar('+overParentDeadlineLang', !empty($parentTask) ? sprintf($lang->task->overParentDeadline, $parentTask->deadline) : '');
- jsVar('+overChildEstStartedLang', sprintf($lang->task->overChildEstStarted, $childDateLimit['estStarted']));
- jsVar('+overChildDeadlineLang', sprintf($lang->task->overChildDeadline, $childDateLimit['deadline']));
- jsVar('taskDateLimit', empty($project) ? '' : $project->taskDateLimit);
- $confirmSyncTip = '';
- if(!empty($syncChildren) && !empty($task->children)) $confirmSyncTip = sprintf($lang->task->syncStoryToChildrenTip, 'ID' . implode(', ID', $syncChildren));
- jsVar('confirmSyncTip', $confirmSyncTip);
- jsVar('taskID', $task->id);
- jsVar('taskStory', $task->story);
- /* zin: Set variables to define picker options for form */
- $formTitle = $task->name;
- $executionOptions = $executions;
- $moduleOptions = $modules;
- $storyOptions = $stories;
- if($taskStatus == 'wait' and $task->isParent == '0')
- {
- $modeOptions = $lang->task->editModeList;
- }
- else
- {
- $modeText = $task->mode == '' ? $lang->task->editModeList['single'] : zget($lang->task->editModeList, $task->mode);
- }
- $assignedToOptions = $taskMembers;
- $typeOptions = $lang->task->typeList;
- $statusOptions = (array)$lang->task->statusList;
- $priOptions = $lang->task->priList;
- $mailtoOptions = $users;
- $finishedByOptions = $members;
- $canceledByOptions = $users;
- $closedByOptions = $users;
- $closedReasonOptions = $lang->task->reasonList;
- $teamOptions = $members;
- $hiddenTeam = $task->mode != '' ? '' : 'hidden';
- $disabledEstStarted = $project && $project->taskDateLimit == 'limit' && !empty($parentTask) && helper::isZeroDate($parentTask->estStarted);
- $disabledDeadline = $project && $project->taskDateLimit == 'limit' && !empty($parentTask) && helper::isZeroDate($parentTask->deadline);
- /* 检查是否可以开始执行。*/
- if($this->config->edition == 'ipd')
- {
- $execution->canStartExecution = $this->loadModel('execution')->checkStageStatus($execution->id, 'start');
- $task->executionInfo = $execution;
- }
- if($taskStatus == 'wait') unset($statusOptions['pause']);
- if(!empty($task->team))
- {
- foreach($task->team as $member)
- {
- $member->team = $member->account;
- $member->teamSource = $member->account;
- $member->teamEstimate = (float)$member->estimate;
- $member->teamConsumed = (float)$member->consumed;
- $member->teamLeft = (float)$member->left;
- $member->memberDisabled = false;
- $member->memberStatus = $member->status;
- if($member->memberStatus == 'done') $member->memberDisabled = true;
- if(strpos('|closed|cancel|pause|', $taskStatus) !== false && $app->rawMethod != 'activate')
- {
- $member->memberStatus = $taskStatus;
- $member->memberDisabled = true;
- }
- $member->hourDisabled = $member->memberDisabled;
- }
- }
- /* ====== Define the page structure with zin widgets ====== */
- detailHeader
- (
- to::prefix(null),
- to::title
- (
- entityLabel
- (
- set::entityID($task->id),
- set::level(1),
- set::text($task->name),
- set::reverse(true)
- )
- )
- );
- $recordWorkhourDisabled = !empty($task->children) ? 'disabled' : '';
- if(!empty($task->team))
- {
- $assignedToComponent = picker(setID('assignedTo'), setClass('w-full'), set::name('assignedTo'), set::value($task->assignedTo), set::items($assignedToOptions), set::required(true), $task->mode == 'linear' && !in_array($taskStatus, array('done', 'closed')) ? set::disabled(true) : null, $taskStatus == 'closed' ? set::disabled(true) : null);
- }
- else
- {
- $assignedToComponent = taskAssignedTo
- (
- setID('assignedTo'),
- setClass('w-full'),
- set::name('assignedTo'),
- set::value($task->assignedTo),
- set::items($assignedToOptions),
- $taskStatus == 'closed' ? set::disabled(true) : null,
- $manageLink ? set::manageLink($manageLink) : null
- );
- }
- detailBody
- (
- set::isForm(true),
- set::formID("taskEditForm{$task->id}"),
- set::ajax(array('beforeSubmit' => jsRaw('clickSubmit'))),
- sectionList
- (
- section
- (
- set::title($lang->task->name),
- set::required(true),
- formGroup
- (
- inputControl
- (
- input(set::name('name'), set::value($task->name), set::placeholder($lang->task->name)),
- to::suffix
- (
- colorPicker
- (
- set::heading($lang->task->colorTag),
- set::name('color'),
- set::value($task->color),
- set::syncColor('#name')
- )
- ),
- set::suffixWidth('35')
- )
- )
- ),
- section
- (
- set::title($lang->task->desc),
- editor
- (
- set::name('desc'),
- $task->desc && isHTML($task->desc) ? html($task->desc) : $task->desc
- )
- ),
- $execution->lifetime != 'ops' ? section
- (
- set::title($lang->task->story),
- formGroup
- (
- set::width('1/2'),
- control
- (
- set::type('picker'),
- set::name('story'),
- set::value($task->story),
- set::items($storyOptions),
- on::change('setStoryModule')
- )
- )
- ) : null,
- section
- (
- setID('files'),
- set::title($lang->files),
- fileSelector($task->files ? set::defaultFiles(array_values($task->files)) : null)
- ),
- formHidden('lastEditedDate', helper::isZeroDate($task->lastEditedDate) ? '' : $task->lastEditedDate)
- ),
- history(),
- detailSide
- (
- set::isForm(true),
- tableData
- (
- setClass('mt-5'),
- set::title($lang->task->legendBasic),
- item
- (
- set::name($lang->task->execution),
- formGroup
- (
- picker
- (
- set::name('execution'),
- set::value($task->execution),
- set::items($executionOptions),
- on::change('loadAll')
- )
- )
- ),
- item
- (
- set::trClass('moduleTR'),
- set::name($lang->task->module),
- set::required(strpos(",{$this->config->task->edit->requiredFields},", ",module,") !== false),
- formGroup
- (
- inputGroup
- (
- div
- (
- setClass('flex grow'),
- picker
- (
- setClass('w-full'),
- set::name('module'),
- set::value($task->module),
- set::items($moduleOptions),
- set::width(2/3),
- set::required(true),
- on::change('loadStories')
- )
- ),
- div
- (
- setClass('flex'),
- checkbox(
- setID('showAllModule'),
- set::rootClass('items-center ml-3'),
- set::name('showAllModule'),
- set::text($lang->all),
- set::value(1),
- set::checked($showAllModule),
- on::change('loadAllModule')
- )
- )
- )
- )
- ),
- $task->parent >= 0 && $config->vision != 'lite' ? item
- (
- set::name($lang->task->parent),
- picker
- (
- set::name('parent'),
- set::value($task->parent),
- set::items($tasks),
- set::disabled(!empty($task->mode)),
- on::change('getParentEstStartedAndDeadline')
- )
- ) : formHidden('parent', $task->parent),
- empty($modeText) ? item
- (
- set::name($lang->task->mode),
- picker
- (
- set::name('mode'),
- set::value($task->mode),
- set::items($modeOptions),
- set::required(true),
- on::change('changeMode')
- )
- ) : item
- (
- set::name($lang->task->mode),
- $modeText,
- formHidden('mode', $task->mode)
- ),
- item
- (
- set::name($lang->task->assignedTo),
- set::required(strpos(",{$this->config->task->edit->requiredFields},", ",assignedTo,") !== false),
- inputGroup
- (
- div
- (
- setClass('flex grow'),
- $assignedToComponent
- ),
- div
- (
- btn
- (
- $lang->task->team,
- setClass('input-group-btn team-group', empty($task->team) && (!$task->mode) ? 'hidden' : ''),
- set::url('#modalTeam'),
- setData('toggle', 'modal'),
- $task->mode == 'multi' ? on::click('disableMembers') : null
- )
- )
- )
- ),
- item
- (
- set::name($lang->task->type),
- picker
- (
- set::name('type'),
- set::value($task->type),
- set::items($typeOptions),
- set::required(true)
- )
- ),
- empty($task->children) ? item
- (
- set::name($lang->task->status),
- picker
- (
- on::change()->do('statusChange(target)'),
- set::name('status'),
- set::value($taskStatus),
- set::items($statusOptions),
- set::required(true)
- )
- ) : formHidden('status', $taskStatus),
- item
- (
- set::name($lang->task->pri),
- set::required(strpos(",{$this->config->task->edit->requiredFields},", ",pri,") !== false),
- formGroup
- (
- priPicker(set::name('pri'), set::value($task->pri), set::items($priOptions))
- )
- ),
- item
- (
- set::name($lang->task->progress),
- progresscircle
- (
- set::percent($task->progress),
- set::circleColor('var(--color-success-500)'),
- set::circleBg('var(--color-border)'),
- set::circleWidth(1)
- )
- ),
- item
- (
- set::name($lang->task->keywords),
- input(set::name('keywords'), set::value($task->keywords))
- ),
- item
- (
- set::name($lang->task->mailto),
- mailto(set::items($mailtoOptions), set::value($task->mailto))
- )
- ),
- modalTrigger
- (
- modal
- (
- setID('modalTeam'),
- set::title($lang->task->teamMember),
- formBatch
- (
- set::tagName('div'),
- setID('teamTable'),
- set::mode('add'),
- !empty($task->team) ? set::data(array_values($task->team)) : null,
- set::sortable(true),
- set::size('sm'),
- set::minRows(3),
- set::onRenderRow(jsRaw('renderRowData')),
- formBatchItem
- (
- set::name('id'),
- set::width('32px'),
- set::control('index')
- ),
- formBatchItem
- (
- set::name('team'),
- set::label($lang->task->teamMember),
- set::width('160px'),
- set::control(array('control' => 'taskAssignedTo', 'manageLink' => ($manageLink ? $manageLink : ''))),
- set::items($members)
- ),
- formBatchItem
- (
- set::name('estimateBox'),
- set::label($lang->task->estimate),
- set::width('135px'),
- set::control('inputGroup'),
- set::required(true),
- inputControl
- (
- input(set::name("teamEstimate")),
- to::suffix($lang->task->suffixHour),
- set::suffixWidth(20)
- )
- ),
- !empty($task->team) ? formBatchItem
- (
- set::name('consumedBox'),
- set::label($lang->task->consumedAB),
- set::width('135px'),
- set::control('inputGroup'),
- inputControl
- (
- input(set::name("teamConsumed")),
- to::suffix($lang->task->suffixHour),
- set::suffixWidth(20)
- )
- ) : null,
- !empty($task->team) ? formBatchItem
- (
- set::name('leftBox'),
- set::label($lang->task->left),
- set::width('135px'),
- set::control('inputGroup'),
- set::required(true),
- inputControl
- (
- input(set::name("teamLeft")),
- to::suffix($lang->task->suffixHour),
- set::suffixWidth(20)
- )
- ) : null,
- formBatchItem
- (
- set::name('teamSource'),
- set::control('input'),
- set::hidden(true)
- ),
- set::actions(array(array('text' => $lang->save, 'class' => 'primary team-saveBtn'))),
- on::click('.team-saveBtn')->call('saveTeam')
- )
- )
- ),
- tableData
- (
- setClass('mt-4'),
- set::title($lang->task->legendEffort),
- item
- (
- set::name($lang->task->estStarted),
- set::required(strpos(",{$this->config->task->edit->requiredFields},", ",estStarted,") !== false),
- formGroup
- (
- datePicker
- (
- set::name('estStarted'),
- set::disabled($disabledEstStarted),
- on::change('checkEstStartedAndDeadline'),
- set::value((helper::isZeroDate($task->estStarted) || $disabledEstStarted) ? null : $task->estStarted)
- )
- )
- ),
- item
- (
- set::name($lang->task->deadline),
- set::required(strpos(",{$this->config->task->edit->requiredFields},", ",deadline,") !== false),
- formGroup
- (
- datePicker
- (
- set::name('deadline'),
- set::disabled($disabledDeadline),
- on::change('checkEstStartedAndDeadline'),
- set::value((helper::isZeroDate($task->deadline) || $disabledDeadline) ? null : $task->deadline)
- )
- )
- ),
- item
- (
- set::name($lang->task->estimate),
- set::required(strpos(",{$this->config->task->edit->requiredFields},", ",estimate,") !== false),
- formGroup
- (
- inputControl
- (
- input
- (
- set::name('estimate'),
- set::value(helper::formatHours($task->estimate)),
- !empty($task->team) || !empty($task->children) ? set::readonly(true) : null
- ),
- to::suffix($lang->task->suffixHour),
- set::suffixWidth(20)
- )
- )
- ),
- item
- (
- set::name($lang->task->consumed),
- inputGroup
- (
- setClass('items-center'),
- span
- (
- setClass('span-text'),
- setID('consumedSpan'),
- $task->consumed . $lang->task->suffixHour
- ),
- $this->task->isClickable($task, 'recordWorkhour') ? btn
- (
- setClass('ghost text-primary', $recordWorkhourDisabled),
- icon('time'),
- set::href(inlink('recordWorkhour', "id={$task->id}&from=edittask")),
- setData('toggle', 'modal')
- ) : null,
- formHidden('consumed', helper::formatHours($task->consumed))
- )
- ),
- item
- (
- set::name($lang->task->left),
- formGroup
- (
- inputControl
- (
- input
- (
- set::name('left'),
- set::value(helper::formatHours($task->left)),
- !empty($task->team) || !empty($task->children) ? set::readonly(true) : null
- ),
- to::suffix($lang->task->suffixHour),
- set::suffixWidth(20)
- )
- )
- )
- ),
- tableData
- (
- setClass('mt-4'),
- set::title($lang->task->legendLife),
- item
- (
- set::name($lang->task->realStarted),
- formGroup
- (
- datetimePicker
- (
- set::name('realStarted'),
- set::value(helper::isZeroDate($task->realStarted) ? '' : $task->realStarted)
- )
- )
- ),
- item
- (
- set::name($lang->task->finishedBy),
- formGroup
- (
- picker
- (
- set::name('finishedBy'),
- set::value($task->finishedBy),
- set::items($finishedByOptions)
- )
- )
- ),
- item
- (
- set::name($lang->task->finishedDate),
- formGroup
- (
- datetimePicker
- (
- set::name('finishedDate'),
- set::value(helper::isZeroDate($task->finishedDate) ? '' : $task->finishedDate)
- )
- )
- ),
- item
- (
- set::name($lang->task->canceledBy),
- formGroup
- (
- picker
- (
- set::name('canceledBy'),
- set::value($task->canceledBy),
- set::items($canceledByOptions)
- )
- )
- ),
- item
- (
- set::name($lang->task->canceledDate),
- formGroup
- (
- datetimePicker
- (
- set::name('canceledDate'),
- set::value(helper::isZeroDate($task->canceledDate) ? '' : $task->canceledDate)
- )
- )
- ),
- item
- (
- set::name($lang->task->closedBy),
- formGroup
- (
- picker
- (
- set::name('closedBy'),
- set::value($task->closedBy),
- set::items($closedByOptions)
- )
- )
- ),
- item
- (
- set::name($lang->task->closedReason),
- formGroup
- (
- picker
- (
- set::name('closedReason'),
- set::value($task->closedReason),
- set::items($closedReasonOptions)
- )
- )
- ),
- item
- (
- set::name($lang->task->closedDate),
- formGroup
- (
- datetimePicker
- (
- set::name('closedDate'),
- set::value(helper::isZeroDate($task->closedDate) ? '' : $task->closedDate)
- )
- )
- )
- )
- )
- );
|