| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211 |
- <?php
- /**
- * The create view file of project module 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 Mengyi Liu <liumengyi@easycorp.ltd>
- * @package project
- * @link https://www.zentao.net
- */
- namespace zin;
- $fields = useFields('project.create');
- $fields->autoLoad('parent', 'acl,productsBox,hasProduct');
- $loadUrl = $this->createLink('project', 'create', "model={$model}&program={parent}");
- jsVar('model', $model);
- jsVar('ignore', $lang->project->ignore);
- jsVar('budgetOverrun', $lang->project->budgetOverrun);
- jsVar('currencySymbol', $lang->project->currencySymbol);
- jsVar('parentBudget', $lang->project->parentBudget);
- jsVar('budgetUnitLabel', $lang->project->tenThousandYuan);
- jsVar('+projectID', 0);
- jsVar('LONG_TIME', LONG_TIME);
- jsVar('weekend', $config->execution->weekend);
- jsVar('beginLessThanParent', $lang->project->beginLessThanParent);
- jsVar('endGreatThanParent', $lang->project->endGreatThanParent);
- unset($lang->project->endList['999']);
- jsVar('endList', $lang->project->endList);
- $modelMenuItems = array();
- foreach($lang->project->modelList as $key => $text)
- {
- if(empty($key)) continue;
- $modelMenuItems[] = array('text' => $text, 'selected' => $key == $model, 'url' => createLink('project', 'create', "model=$key"));
- }
- $modeDropdown = common::isTutorialMode() ? null : dropdown
- (
- btn
- (
- zget($lang->project->modelList, $model),
- setClass('gray-300-outline size-sm rounded-full ml-2')
- ),
- set::arrow(true),
- set::placement('bottom'),
- set::items($modelMenuItems)
- );
- $handleLongTimeChange = jsCallback()->do(<<<'JS'
- const endPicker = $element.find('[name=end]').closest('[data-zui-datepicker]').zui('datePicker');
- const isLongTime = $element.find('[name=longTime]').prop('checked');
- endPicker.render({disabled: isLongTime});
- if(isLongTime) endPicker.$.setValue('');
- $element.find('[name=days]').attr('disabled', isLongTime ? 'disabled' : null);
- checkProjectInfo();
- JS
- );
- $toggleLongTime = jsCallback()->do(<<<'JS'
- const isMultiple = $('#form-project-create [name=multiple]').prop('checked');
- if(!isMultiple) $('#form-project-create [name=longTime]').prop('checked', false);
- $('#form-project-create [name=longTime]').closest('.checkbox-primary').toggleClass('hidden', !isMultiple);
- const $endPicker = $('#form-project-create [name=end]').closest('[data-zui-datepicker]').zui('datePicker');
- $endPicker.render({disabled: false});
- $('#form-project-create [name=days]').removeAttr('disabled');
- JS
- );
- formGridPanel
- (
- to::titleSuffix($modeDropdown),
- set::ajax(array('submitDisabledValue' => false)),
- common::isTutorialMode() ? null : to::headingActions
- (
- btn
- (
- set::icon('copy'),
- setClass('primary-ghost size-md copy-project-btn'),
- toggle::modal(array('target' => '#copyProjectModal', 'destroyOnHide' => true)),
- $lang->project->copy
- ),
- divider(setClass('h-4 mr-4 ml-2 self-center'))
- ),
- formHidden('storyType[]', 'story'),
- on::click('[name=name], [name=code], [data-name=begin] .pick *, [name=days], [data-name="parent"] .pick *, [name=longTime]', 'removeTips'),
- on::click('[type=submit]', 'removeAllTips'),
- on::click('[name=multiple]', $toggleLongTime),
- on::change('[name=hasProduct]', 'changeType'),
- on::change('[name=longTime]', $handleLongTimeChange),
- on::change('[name=future]', 'toggleBudget'),
- on::change('[name=begin], [name=end]', 'computeWorkDays'),
- on::change('[name^=products]', 'toggleStageBy'),
- on::change('[name=parent], [name=budget]', 'checkBudget'),
- on::change('[name^=storyType]', 'toggleStoryType'),
- on::init()->do('setTimeout(() => $element.find("[name=longTime]").trigger("change"), 500)'),
- set::title($lang->project->create),
- set::fullModeOrders(array('begin,days,PM,budget', !empty($config->setCode) ? 'parent,hasProduct,name,code,begin' : 'parent,name,hasProduct,begin')),
- set::fields($fields),
- set::loadUrl($loadUrl)
- );
- $toggleActiveProject = jsCallback()->do(<<<'JS'
- if($this.hasClass('primary-outline'))
- {
- $this.removeClass('primary-outline');
- }
- else
- {
- $('#copyProjects button.project-block.primary-outline').removeClass('primary-outline');
- $this.addClass('primary-outline');
- }
- JS
- );
- $copySelectedProject = jsCallback()->const('model', $model)->do(<<<'JS'
- const copyProjectID = $('#copyProjects button.project-block.primary-outline').length == 1 ? $('#copyProjects button.project-block.primary-outline').data('id') : 0;
- const programID = $('[name=parent]').val();
- loadPage($.createLink('project', 'create', 'model=' + model + '&programID=' + programID + '©ProjectID=' + copyProjectID));
- zui.Modal.hide();
- JS
- );
- $copyProjectsBox = array();
- if(!empty($copyProjects))
- {
- foreach($copyProjects as $id => $project)
- {
- $projectName = is_object($project) ? $project->name : $project;
- $copyProjectsBox[] = btn
- (
- setClass('project-block justify-start'),
- setClass($copyProjectID == $id ? 'primary-outline' : ''),
- set('data-id', $id),
- set('data-pinyin', zget($copyPinyinList, $projectName)),
- icon(setClass('text-gray'), !empty($project->model) ? ($project->model == 'scrum' ? 'sprint' : $project->model) : $lang->icons['project']),
- on::click($toggleActiveProject),
- span($projectName, set::title($projectName), setClass('text-left'))
- );
- }
- }
- else
- {
- $copyProjectsBox[] = div
- (
- setClass('inline-flex items-center w-full bg-gray-100 h-12 mt-2 mb-8'),
- icon('exclamation-sign icon-2x pl-2 text-warning'),
- span
- (
- set::className('font-bold ml-2'),
- $lang->project->copyNoProject
- )
- );
- }
- modal
- (
- set::id('copyProjectModal'),
- to::header
- (
- div
- (
- setClass('w-full'),
- span
- (
- h4
- (
- set::className('copy-title'),
- $lang->project->copyTitle
- )
- ),
- div
- (
- setClass('py-4 border-b border-b-1'),
- inputControl
- (
- to::suffix(icon('search')),
- set::suffixWidth('sm'),
- input
- (
- set::name('projectName'),
- set::placeholder($lang->project->searchByName)
- )
- )
- )
- )
- ),
- to::footer
- (
- div
- (
- setClass('flex mt-4 w-full justify-center'),
- btn
- (
- setClass('px-6'),
- set::type('primary'),
- on::click($copySelectedProject),
- $lang->confirm
- )
- )
- ),
- div
- (
- set::id('copyProjects'),
- setClass('flex items-center flex-wrap gap-4'),
- $copyProjectsBox
- )
- );
- render();
|