ai->dataSource);
jsVar('dataSourceLang', $lang->ai->dataSource);
jsVar('activeDataSource', $defaultCategory);
jsVar('selectedSources', $prompt->source ? explode(',', trim($prompt->source, ',')) : array());
/* 构建数据源分类列表 */
function buildCategoryList($lang, $selectedCategory) {
$categories = array(
'product' => $lang->ai->dataSource['product']['common'],
'project' => $lang->ai->dataSource['project']['common'],
'story' => $lang->ai->dataSource['story']['common'],
'productplan' => $lang->ai->dataSource['productplan']['common'],
'release' => $lang->ai->dataSource['release']['common'],
'execution' => $lang->ai->dataSource['execution']['common'],
'task' => $lang->ai->dataSource['task']['common'],
'case' => $lang->ai->dataSource['case']['common'],
'bug' => $lang->ai->dataSource['bug']['common'],
'doc' => $lang->ai->dataSource['doc']['common']
);
$categoryKeys = array_keys($categories);
$categoryValues = array_values($categories);
return ul(
setClass('category-list'),
array_map(function($key, $label, $index) use ($selectedCategory) {
$isActive = $key === $selectedCategory ? ' active' : '';
return li(setClass('category-item' . $isActive), setData('category', $key), $label);
}, $categoryKeys, $categoryValues, array_keys($categoryKeys))
);
}
/* 构建字段列表 */
function buildFieldList($lang, $config, $selectedCategory, $selectedFields = array()) {
$categoryDataSources = $config->ai->dataSource[$selectedCategory] ?? array();
$objViews = array();
foreach ($categoryDataSources as $sourceKey => $fields) {
$groupSelected = true;
$hasSelectedField = false;
foreach ($fields as $field) {
$fieldKey = $sourceKey . '.' . $field;
if (in_array($fieldKey, $selectedFields)) {
$hasSelectedField = true;
} else {
$groupSelected = false;
}
}
if (!$hasSelectedField) {
$groupSelected = false;
}
$objView = div(
setClass('category-group'),
div(
setClass('category-group-header'),
checkbox(
set::primary(true),
set::rootClass('group-item'),
set::typeClass('checkbox'),
setData('prop', $sourceKey),
set::checked($groupSelected),
set::text($lang->ai->dataSource[$selectedCategory][$sourceKey]['common'])
)
),
div(
setClass('category-group-body check-list-inline'),
array_map(function($field) use ($sourceKey, $selectedCategory, $lang, $selectedFields) {
$fieldKey = $sourceKey . '.' . $field;
$isSelected = in_array($fieldKey, $selectedFields);
return checkbox(
set::primary(true),
set::rootClass('group-item'),
set::typeClass('checkbox'),
setData('prop', $fieldKey),
set::checked($isSelected),
set::text($lang->ai->dataSource[$selectedCategory][$sourceKey][$field])
);
}, $fields)
)
);
$objViews[] = $objView;
}
return div(
setClass('category-groups'),
setData('object-group', $selectedCategory),
$objViews
);
}
/* 构建已选数据标题 */
function buildSelectedTitle($lang, $selectedCategory, $count = 0) {
$categoryName = $lang->ai->dataSource[$selectedCategory]['common'];
$format = $lang->ai->prompts->selectedFormat;
$initialText = str_replace(array('{0}', '{1}'), array($categoryName, $count), $format);
return h4(
setID('selected-title-text'),
setClass('text-md selected-title-text'),
setData('group', $selectedCategory),
setData('format', $format),
$initialText
);
}
/* 构建已选择列表 */
function buildSelectedList($lang, $config, $selectedCategory, $selectedFields = array()) {
if (empty($selectedFields)) {
return div(
setID('selected-data-sorter'),
setClass('selected-data-sorter'),
setData('group', $selectedCategory),
ol(setClass('list-group'))
);
}
$listItems = array();
foreach ($selectedFields as $index => $field) {
if(empty($field)) continue;
list($source, $fieldName) = explode('.', $field);
$sourceLang = $lang->ai->dataSource[$selectedCategory][$source];
$fieldLang = $sourceLang[$fieldName];
$listItems[] = li(
setClass('list-group-item'),
setData('prop', $field),
setData('order', $index),
icon(
set::name('move'),
setClass('text-gray drag-icon')
),
span(
$sourceLang['common'] . ' / ' . $fieldLang
),
icon(
set::name('close'),
setClass('text-gray remove-icon')
)
);
}
return div(
setID('selected-data-sorter'),
setClass('selected-data-sorter'),
setData('group', $selectedCategory),
ol(
setClass('list-group'),
$listItems
)
);
}
div(
setClass('prompt-select-source'),
formPanel
(
set::id('mainForm'),
set::actions(
array(
array('text' => $lang->ai->nextStep, 'class' => 'btn primary', 'id' => 'submit', 'btnType' => 'submit', 'name' => 'jumpToNext', 'value' => '1')
)
),
div(
setClass('data-selector-container'),
div(
setClass('data-sources-panel'),
div(
setClass('data-categories-section'),
div(setClass('section-header'), h4(setClass('text-md text-center'), $lang->ai->prompts->selectDataSource)),
div(
setClass('section-content'),
buildCategoryList($lang, $defaultCategory)
)
),
div(
setClass('data-properties-section'),
div(setClass('section-header'), h4(setClass('text-md'), $lang->ai->prompts->selectData), small(setClass('text-gray'), $lang->ai->prompts->selectDataTip)),
div(
setClass('section-content'),
buildFieldList($lang, $config, $defaultCategory, $prompt->source ? explode(',', trim($prompt->source, ',')) : array())
)
)
),
div(
setClass('data-selected-panel'),
div(setClass('section-header'), buildSelectedTitle($lang, $defaultCategory, $prompt->source ? count(explode(',', trim($prompt->source, ','))) : 0)),
div(setClass('section-content'), buildSelectedList($lang, $config, $defaultCategory, $prompt->source ? explode(',', trim($prompt->source, ',')) : array()))
)
),
input(
set::name('datasource'),
set::type('hidden'),
set::value($prompt->source ?? '')
),
input(
set::name('datagroup'),
set::type('hidden'),
set::value($activeDataSource ?? '')
),
on::init()->call('initPromptSelectDataSourceForm')
)
);