| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406 |
- <?php
- /**
- * The UI file of file 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 chen.tao <chentao@easycorp.ltd>
- * @package file
- * @link https://www.zentao.net
- */
- namespace zin;
- $this->loadModel('file');
- /* Unset useless export type. */
- if(isset($_SERVER['HTTP_REFERER']) && strpos($_SERVER['HTTP_REFERER'], 'calendar') !== false) unset($lang->exportTypeList['selected']);
- /* Generate custom export fields. */
- if(!isset($hideExportRange)) $hideExportRange = isset($_SERVER['HTTP_REFERER']) && strpos($_SERVER['HTTP_REFERER'], 'kanban') !== false;
- $customExportRowList = array();
- $isCustomExport = (!empty($customExport) and !empty($allExportFields));
- $showBizGuide = $config->edition == 'open' && empty($config->{$this->moduleName}->closeBizGuide) ? true : false;
- $bizGuideLink = common::checkNotCN() ? 'https://www.zentao.pm/page/zentao-pricing.html' : 'https://www.zentao.net/page/enterprise.html';
- $bizName = $showBizGuide ? "<a href='{$bizGuideLink}' target='_blank' class='text-primary'>{$lang->bizName}</a>" : '';
- $defaultExportFields = '';
- if($isCustomExport)
- {
- if(is_string($allExportFields)) $allExportFields = explode(',', $allExportFields);
- $hasDefaultField = isset($selectedFields);
- $selectedFields = $hasDefaultField ? explode(',', $selectedFields) : array();
- $moduleName = $this->moduleName;
- $moduleLang = $moduleName == 'caselib' ? $lang->testcase : $lang->$moduleName;
- $exportFieldPairs = array();
- foreach($allExportFields as $key => $field)
- {
- $field = trim($field);
- $fieldName = isset($lang->$field) && is_string($lang->$field) ? $lang->$field : $field;
- $exportFieldPairs[$field] = isset($moduleLang->$field) && is_string($moduleLang->$field) ? $moduleLang->$field : $fieldName;
- if(!$hasDefaultField) $selectedFields[] = $field;
- }
- $defaultExportFields = implode(',', $selectedFields);
- $templates = $this->file->getExportTemplate($app->moduleName);
- $templateList = array();
- $templatePairs[] = $this->lang->file->defaultTPL;
- foreach($templates as $template)
- {
- $templatePairs[$template->id] = ($template->public ? "[{$this->lang->public}] " : '') . $template->title;
- $templateList[] = span(setID("template{$template->id}"), setClass('hidden'), set('data-public', $template->public), set('data-title', $template->title), $template->content);
- }
- /* Choose template. */
- $customExportRowList[] = formRow
- (
- setID('tplBox'),
- formGroup
- (
- set::label($lang->file->tplTitleAB),
- inputGroup
- (
- picker(set::name('template'), set::items($templatePairs), on::change('setTemplate(e.target)'), set::required(true)),
- span
- (
- setClass('input-group-addon'),
- checkbox(setID('showCustomFieldsBox'), set::checked(false), on::change('setExportTPL'), $lang->file->setExportTPL)
- )
- ),
- $templateList ? $templateList : null
- )
- );
- /* Panel for customize template. */
- $customExportRowList[] = div
- (
- setClass('customFieldsBox border p-4'),
- formRow
- (
- formGroup
- (
- set::label($lang->file->exportFields),
- control
- (
- set::type('picker'),
- set::name('exportFields[]'),
- set::items($exportFieldPairs),
- set::value($selectedFields),
- set::multiple(true),
- set::required(true)
- )
- )
- ),
- formRow
- (
- formGroup
- (
- set::label($lang->file->tplTitle),
- set::className('mt-4'),
- inputGroup
- (
- input(set::name('title'), set::value($lang->file->defaultTPL)),
- hasPriv('file', 'setPublic') ? div
- (
- setClass('input-group-addon'),
- checkbox(set::name('public'), set::value(1), $lang->public)
- ) : null,
- btn(setClass('btn-link'), on::click('window.saveTemplate'), icon('save')),
- btn(setClass('btn-link'), on::click('window.deleteTemplate'), icon('trash'))
- )
- )
- )
- );
- }
- if($app->rawModule == 'epic') $lang->exportTypeList['all'] = $lang->ERCommon . ' - ' . $lang->exportTypeList['all'];
- if($app->rawModule == 'requirement') $lang->exportTypeList['all'] = $lang->URCommon . ' - ' . $lang->exportTypeList['all'];
- $isNotZh = strpos($app->getClientLang(), 'zh-') === false;
- formPanel
- (
- setID('exportPanel'),
- pageCSS('.form-horz .form-label.required:after{content:""}'), // Remove required tag.
- pageCSS('.modal-content{padding-top: 0.5rem; padding-left: 0.75rem; padding-right: 0.75rem; padding-bottom: 1.25rem;}'),
- $isNotZh ? pageCSS('#exportPanel .form-label{width: 86px}') : null,
- $isNotZh ? pageCSS('#exportPanel .form-group{padding-left: 86px}') : null,
- $isNotZh ? pageCSS('#exportPanel .customFieldsBox .form-label{width: 100px}') : null,
- $isNotZh ? pageCSS('#exportPanel .customFieldsBox .form-group{padding-left: 100px}') : null,
- setCssVar('--form-horz-label-width', '4rem'),
- set::target('_self'),
- set::actions(array()),
- on::submit('setDownloading'),
- formGroup
- (
- set::width('full'),
- set::label($lang->file->fileName),
- set::name('fileName'),
- set::value(isset($fileName) ? $fileName : $lang->file->untitled),
- on::change('onChangeFileName'),
- set::required(true)
- ),
- formGroup
- (
- set::label($lang->file->extension),
- set::name('fileType'),
- set::items($lang->exportFileTypeList),
- on::change('onChangeFileType'),
- set::required(true)
- ),
- formGroup
- (
- set::label($lang->file->encoding),
- set::control('picker'),
- set::name('encode'),
- set::items($config->charsets[$this->cookie->lang]),
- set::value($this->config->zin->lang == 'zh-cn' ? 'gbk' : 'utf-8'),
- set::required(true)
- ),
- /* Fields for KanBan. */
- formRow
- (
- $hideExportRange ? setClass('hidden') : null,
- setClass('exportRange'),
- formGroup
- (
- set::label($lang->file->exportRange),
- set::control('picker'),
- set::name('exportType'),
- set::items($lang->exportTypeList),
- set::required(true)
- )
- ),
- formRow
- (
- setClass('hidden'),
- formGroup
- (
- set::control('checkList'),
- set::name('part'),
- set::items(array(1 => $lang->file->batchExport)),
- set::value('')
- ),
- input
- (
- set::type('hidden'),
- set::name('limit'),
- set::value('')
- )
- ),
- /* Custom export. */
- $customExportRowList,
- formRow
- (
- setClass('justify-center'),
- div
- (
- setClass('form-actions col text-center'),
- div
- (
- btn
- (
- on::click()->do("$(target).parent().addClass('disabled');$(target).parent().attr('disabled');$(target).closest('.form-actions').append('<span class=\"text-gray\">{$lang->file->waitDownloadTip}</span>');"),
- set::btnType('submit'),
- set::type('primary'),
- $lang->export
- )
- )
- )
- ),
- $showBizGuide ? formRow
- (
- setClass('justify-center bizGuideBox'),
- div
- (
- span
- (
- setClass('text-gray'),
- html(sprintf($lang->file->bizGuide, $bizName))
- ),
- a
- (
- setID('closeBizGuideButton'),
- setClass('btn btn-default ghost text-gray'),
- set::href('#'),
- icon(
- 'close',
- setStyle('font-size', '12px')
- ),
- on::click('closeBizGuide')
- )
- )
- ) : null
- );
- set::title($lang->file->exportData);
- h::js
- (
- <<<JAVASCRIPT
- window.setDownloading = function(event)
- {
- $('[name=encode]').removeAttr('disabled');
- /* Doesn't support Opera, omit it. */
- if(navigator.userAgent.toLowerCase().indexOf("opera") > -1) return true;
- $.cookie.set('downloading', 0, {expires:config.cookieLife, path:config.webRoot});
- var time = setInterval(function()
- {
- if($.cookie.get('downloading') == 1)
- {
- const modal = zui.Modal.query(event.target);
- if(modal) modal.hide();
- if(!modal) parent.$.closeModal();
- $.cookie.set('downloading', null, {expires:config.cookieLife, path:config.webRoot});
- clearInterval(time);
- }
- }, 300);
- return true;
- }
- /* If file type is CSV, then user can select encode type. */
- window.onChangeFileType = function(event)
- {
- if($(event.target).attr('name') != 'fileType') return;
- var fileType = $(event.target).val();
- var encodePicker = $('[name="encode"]').zui('picker');
- if(fileType === 'csv')
- {
- encodePicker.render({disabled: false});
- return;
- }
- encodePicker.$.setValue('utf-8');
- encodePicker.render({disabled: true});
- $('#tplBox').toggleClass('hidden', fileType == 'word');
- $('.customFieldsBox').toggleClass('hidden', fileType == 'word' || !$('#showCustomFieldsBox').prop('checked'));
- }
- window.onChangeFileName = function(event)
- {
- var objFileName = $(event.target);
- if(objFileName.val() == '')
- {
- objFileName.val('{$lang->file->untitled}');
- return;
- }
- }
- window.waitDom('[name=fileType]', function(){ $('[name=fileType]').trigger('change');})
- window.saveTemplate = function()
- {
- var customFieldsBox = $('.customFieldsBox');
- var publicBox = customFieldsBox.find('input[name="public"]');
- var title = customFieldsBox.find('[name="title"]').val();
- var content = customFieldsBox.find('[name^="exportFields"]').val();
- var isPublic = (publicBox.length > 0 && publicBox.prop('checked')) ? 1 : 0;
- if(!title || !content) return;
- const saveTemplateLink = $.createLink('file', 'ajaxSaveTemplate', 'module={$this->moduleName}');
- $.post(saveTemplateLink, {title:title, content:content.join(','), public:isPublic}, function(data)
- {
- if(data.indexOf('alert') == -1)
- {
- $('#tplBox').html(data);
- customFieldsBox.find('[name=title]').val(title);
- }
- else
- {
- data = JSON.parse(data);
- zui.Modal.alert(data.alert);
- }
- });
- };
- window.deleteTemplate = function()
- {
- var template = $('#tplBox [name="template"]');
- var templateID = template.val();
- if(templateID == 0) return;
- const deleteLink = $.createLink('file', 'ajaxDeleteTemplate', 'templateID=' + templateID);
- $.get(deleteLink, function()
- {
- var templatePicker = template.zui('picker');
- var newItems = templatePicker.options.items.filter(item => item.value != templateID);
- templatePicker.render({items: newItems});
- templatePicker.$.setValue(newItems.length > 0 ? newItems[0].value : '');
- });
- };
- window.setTemplate = function(obj)
- {
- var templateID = $(obj).val();
- var template = $('#template' + templateID);
- var exportFields = template.length > 0 ? template.html() : '{$defaultExportFields}';
- exportFields = exportFields.split(',');
- const customFieldsBox = $('.customFieldsBox');
- customFieldsBox.find('[name^="exportFields"]').zui('picker').$.setValue(exportFields);
- customFieldsBox.find('input[name="public"]').prop('checked', template.data('public'));
- customFieldsBox.find('[name="title"]').val(templateID != '0' ? template.data('title') : '{$lang->file->defaultTPL}');
- };
- window.setExportTPL = function()
- {
- $('.customFieldsBox').toggleClass('hidden', !$('#showCustomFieldsBox').prop('checked'));
- };
- setExportTPL();
- /* Auto select selected item for exportRange. */
- if($('.dtable .dtable-header .has-checkbox').length > 0)
- {
- const dtable = zui.DTable.query($('.dtable .dtable-header .has-checkbox').closest('.dtable')[0]);
- let checkedList = dtable ? dtable.$.getChecks() : [];
- if(checkedList.length)
- {
- if(window.config.currentModule == 'testcase') checkedList.forEach(function(item, index){ checkedList[index] = item.replace('case_', '');});
- if(window.config.currentModule == 'product') checkedList.forEach(function(item, index){if(item.indexOf('-')) checkedList[index] = item.substr(item.indexOf('-') + 1);});
- if(window.config.currentModule == 'testtask' && window.config.currentMethod == 'cases')
- {
- let caseIDList = [];
- checkedList.forEach(function(item, index) {
- let testrun = dtable.options.data.find(obj => obj.id == item);
- let caseID = testrun ? testrun.case : null;
- if(caseID) caseIDList.push(caseID);
- });
- checkedList = caseIDList;
- }
- waitDom('#exportPanel [name=exportType]', function(){ $('#exportPanel [name=exportType]').zui('picker').$.setValue('selected');});
- $.cookie.set('checkedItem', checkedList.join(','), {expires:config.cookieLife, path:config.webRoot});
- }
- else
- {
- $.cookie.set('checkedItem', '', {expires:config.cookieLife, path:config.webRoot});
- }
- }
- /**
- * 关闭升级到企业版提示。
- * Close the biz guide.
- *
- * @access public
- * @return void
- */
- window.closeBizGuide = function()
- {
- let closeBizGuideLink = $.createLink('file', 'ajaxcloseBizGuide', 'module={$this->moduleName}');
- $.get(closeBizGuideLink);
- $('.bizGuideBox').remove();
- }
- JAVASCRIPT
- );
- render();
|