promptselectdatasource.html.php 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. <?php
  2. namespace zin;
  3. include './promptnav.html.php';
  4. $defaultCategory = $activeDataSource ?? 'product';
  5. jsVar('dataSource', $config->ai->dataSource);
  6. jsVar('dataSourceLang', $lang->ai->dataSource);
  7. jsVar('activeDataSource', $defaultCategory);
  8. jsVar('selectedSources', $prompt->source ? explode(',', trim($prompt->source, ',')) : array());
  9. /* 构建数据源分类列表 */
  10. function buildCategoryList($lang, $selectedCategory) {
  11. $categories = array(
  12. 'product' => $lang->ai->dataSource['product']['common'],
  13. 'project' => $lang->ai->dataSource['project']['common'],
  14. 'story' => $lang->ai->dataSource['story']['common'],
  15. 'productplan' => $lang->ai->dataSource['productplan']['common'],
  16. 'release' => $lang->ai->dataSource['release']['common'],
  17. 'execution' => $lang->ai->dataSource['execution']['common'],
  18. 'task' => $lang->ai->dataSource['task']['common'],
  19. 'case' => $lang->ai->dataSource['case']['common'],
  20. 'bug' => $lang->ai->dataSource['bug']['common'],
  21. 'doc' => $lang->ai->dataSource['doc']['common']
  22. );
  23. $categoryKeys = array_keys($categories);
  24. $categoryValues = array_values($categories);
  25. return ul(
  26. setClass('category-list'),
  27. array_map(function($key, $label, $index) use ($selectedCategory) {
  28. $isActive = $key === $selectedCategory ? ' active' : '';
  29. return li(setClass('category-item' . $isActive), setData('category', $key), $label);
  30. }, $categoryKeys, $categoryValues, array_keys($categoryKeys))
  31. );
  32. }
  33. /* 构建字段列表 */
  34. function buildFieldList($lang, $config, $selectedCategory, $selectedFields = array()) {
  35. $categoryDataSources = $config->ai->dataSource[$selectedCategory] ?? array();
  36. $objViews = array();
  37. foreach ($categoryDataSources as $sourceKey => $fields) {
  38. $groupSelected = true;
  39. $hasSelectedField = false;
  40. foreach ($fields as $field) {
  41. $fieldKey = $sourceKey . '.' . $field;
  42. if (in_array($fieldKey, $selectedFields)) {
  43. $hasSelectedField = true;
  44. } else {
  45. $groupSelected = false;
  46. }
  47. }
  48. if (!$hasSelectedField) {
  49. $groupSelected = false;
  50. }
  51. $objView = div(
  52. setClass('category-group'),
  53. div(
  54. setClass('category-group-header'),
  55. checkbox(
  56. set::primary(true),
  57. set::rootClass('group-item'),
  58. set::typeClass('checkbox'),
  59. setData('prop', $sourceKey),
  60. set::checked($groupSelected),
  61. set::text($lang->ai->dataSource[$selectedCategory][$sourceKey]['common'])
  62. )
  63. ),
  64. div(
  65. setClass('category-group-body check-list-inline'),
  66. array_map(function($field) use ($sourceKey, $selectedCategory, $lang, $selectedFields) {
  67. $fieldKey = $sourceKey . '.' . $field;
  68. $isSelected = in_array($fieldKey, $selectedFields);
  69. return checkbox(
  70. set::primary(true),
  71. set::rootClass('group-item'),
  72. set::typeClass('checkbox'),
  73. setData('prop', $fieldKey),
  74. set::checked($isSelected),
  75. set::text($lang->ai->dataSource[$selectedCategory][$sourceKey][$field])
  76. );
  77. }, $fields)
  78. )
  79. );
  80. $objViews[] = $objView;
  81. }
  82. return div(
  83. setClass('category-groups'),
  84. setData('object-group', $selectedCategory),
  85. $objViews
  86. );
  87. }
  88. /* 构建已选数据标题 */
  89. function buildSelectedTitle($lang, $selectedCategory, $count = 0) {
  90. $categoryName = $lang->ai->dataSource[$selectedCategory]['common'];
  91. $format = $lang->ai->prompts->selectedFormat;
  92. $initialText = str_replace(array('{0}', '{1}'), array($categoryName, $count), $format);
  93. return h4(
  94. setID('selected-title-text'),
  95. setClass('text-md selected-title-text'),
  96. setData('group', $selectedCategory),
  97. setData('format', $format),
  98. $initialText
  99. );
  100. }
  101. /* 构建已选择列表 */
  102. function buildSelectedList($lang, $config, $selectedCategory, $selectedFields = array()) {
  103. if (empty($selectedFields)) {
  104. return div(
  105. setID('selected-data-sorter'),
  106. setClass('selected-data-sorter'),
  107. setData('group', $selectedCategory),
  108. ol(setClass('list-group'))
  109. );
  110. }
  111. $listItems = array();
  112. foreach ($selectedFields as $index => $field) {
  113. if(empty($field)) continue;
  114. list($source, $fieldName) = explode('.', $field);
  115. $sourceLang = $lang->ai->dataSource[$selectedCategory][$source];
  116. $fieldLang = $sourceLang[$fieldName];
  117. $listItems[] = li(
  118. setClass('list-group-item'),
  119. setData('prop', $field),
  120. setData('order', $index),
  121. icon(
  122. set::name('move'),
  123. setClass('text-gray drag-icon')
  124. ),
  125. span(
  126. $sourceLang['common'] . ' / ' . $fieldLang
  127. ),
  128. icon(
  129. set::name('close'),
  130. setClass('text-gray remove-icon')
  131. )
  132. );
  133. }
  134. return div(
  135. setID('selected-data-sorter'),
  136. setClass('selected-data-sorter'),
  137. setData('group', $selectedCategory),
  138. ol(
  139. setClass('list-group'),
  140. $listItems
  141. )
  142. );
  143. }
  144. div(
  145. setClass('prompt-select-source'),
  146. formPanel
  147. (
  148. set::id('mainForm'),
  149. set::actions(
  150. array(
  151. array('text' => $lang->ai->nextStep, 'class' => 'btn primary', 'id' => 'submit', 'btnType' => 'submit', 'name' => 'jumpToNext', 'value' => '1')
  152. )
  153. ),
  154. div(
  155. setClass('data-selector-container'),
  156. div(
  157. setClass('data-sources-panel'),
  158. div(
  159. setClass('data-categories-section'),
  160. div(setClass('section-header'), h4(setClass('text-md text-center'), $lang->ai->prompts->selectDataSource)),
  161. div(
  162. setClass('section-content'),
  163. buildCategoryList($lang, $defaultCategory)
  164. )
  165. ),
  166. div(
  167. setClass('data-properties-section'),
  168. div(setClass('section-header'), h4(setClass('text-md'), $lang->ai->prompts->selectData), small(setClass('text-gray'), $lang->ai->prompts->selectDataTip)),
  169. div(
  170. setClass('section-content'),
  171. buildFieldList($lang, $config, $defaultCategory, $prompt->source ? explode(',', trim($prompt->source, ',')) : array())
  172. )
  173. )
  174. ),
  175. div(
  176. setClass('data-selected-panel'),
  177. div(setClass('section-header'), buildSelectedTitle($lang, $defaultCategory, $prompt->source ? count(explode(',', trim($prompt->source, ','))) : 0)),
  178. div(setClass('section-content'), buildSelectedList($lang, $config, $defaultCategory, $prompt->source ? explode(',', trim($prompt->source, ',')) : array()))
  179. )
  180. ),
  181. input(
  182. set::name('datasource'),
  183. set::type('hidden'),
  184. set::value($prompt->source ?? '')
  185. ),
  186. input(
  187. set::name('datagroup'),
  188. set::type('hidden'),
  189. set::value($activeDataSource ?? '')
  190. ),
  191. on::init()->call('initPromptSelectDataSourceForm')
  192. )
  193. );