source-paper-enrichment.blade.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. <x-filament::page>
  2. <div class="space-y-4">
  3. <div class="flex flex-wrap items-center gap-3">
  4. <x-filament::input.wrapper class="w-64">
  5. <x-filament::input
  6. wire:model.debounce.500ms="search"
  7. placeholder="搜索卷子标题/编码"
  8. />
  9. </x-filament::input.wrapper>
  10. <x-filament::input.wrapper class="w-32">
  11. <x-filament::input.select wire:model="gradeFilter">
  12. <option value="">年级</option>
  13. @foreach($this->gradeOptions() as $value => $label)
  14. <option value="{{ $value }}">{{ $label }}</option>
  15. @endforeach
  16. </x-filament::input.select>
  17. </x-filament::input.wrapper>
  18. <x-filament::input.wrapper class="w-32">
  19. <x-filament::input.select wire:model="termFilter">
  20. <option value="">学期</option>
  21. @foreach($this->termOptions() as $value => $label)
  22. <option value="{{ $value }}">{{ $label }}</option>
  23. @endforeach
  24. </x-filament::input.select>
  25. </x-filament::input.wrapper>
  26. <x-filament::button color="gray" wire:click="autoInfer">
  27. 自动推断
  28. </x-filament::button>
  29. <x-filament::button color="gray" wire:click="autoInferSelected">
  30. 批量推断
  31. </x-filament::button>
  32. <x-filament::button color="primary" wire:click="savePaper">
  33. 保存当前卷子
  34. </x-filament::button>
  35. <x-filament::button color="gray" wire:click="$set('dense', ! $wire.dense)">
  36. 密度切换
  37. </x-filament::button>
  38. </div>
  39. <div class="grid grid-cols-12 gap-6">
  40. <div class="col-span-8 space-y-4">
  41. <x-filament::section>
  42. <div class="text-sm text-slate-500 mb-2">卷子列表(勾选后可批量覆盖)</div>
  43. <div class="mb-2 flex flex-wrap gap-2">
  44. <x-filament::button color="gray" wire:click="selectAllVisible">全选当前列表</x-filament::button>
  45. <x-filament::button color="gray" wire:click="clearSelection">清空选择</x-filament::button>
  46. </div>
  47. <div class="max-h-64 overflow-y-auto divide-y divide-gray-100">
  48. @foreach($this->papers() as $paper)
  49. <label class="flex items-start gap-3 {{ $dense ? 'py-1' : 'py-2' }}">
  50. <input type="checkbox" wire:model="selectedIds" value="{{ $paper->id }}" class="mt-1 rounded border-gray-300">
  51. <button type="button" wire:click="selectPaper({{ $paper->id }})" class="text-left flex-1">
  52. <div class="text-sm font-medium text-gray-900">{{ $paper->title ?? $paper->full_title ?? '未命名' }}</div>
  53. <div class="text-xs text-gray-500">{{ $paper->paper_code }} · 年级 {{ $paper->grade ?? '-' }} · 学期 {{ $paper->term ?? '-' }}</div>
  54. </button>
  55. </label>
  56. @endforeach
  57. @if($this->papers()->isEmpty())
  58. <div class="py-6 text-center text-sm text-gray-500">暂无卷子数据</div>
  59. @endif
  60. </div>
  61. </x-filament::section>
  62. <x-filament::section>
  63. <div class="text-sm text-slate-500 mb-2">原始 Markdown 预览</div>
  64. <div class="prose prose-sm max-w-none bg-gray-50 p-4 rounded-lg min-h-[240px]">
  65. @if($this->selectedPaper())
  66. {!! \App\Services\MathFormulaProcessor::processFormulas($this->selectedPaper()?->raw_markdown ?? '') !!}
  67. @else
  68. <div class="text-sm text-gray-400">暂无选中卷子</div>
  69. @endif
  70. </div>
  71. </x-filament::section>
  72. </div>
  73. <div class="col-span-4 space-y-4">
  74. <x-filament::section heading="卷子信息">
  75. <div class="space-y-3">
  76. <x-filament::input.wrapper>
  77. <x-filament::input wire:model="form.edition" placeholder="教材体系 edition" />
  78. </x-filament::input.wrapper>
  79. <x-filament::input.wrapper>
  80. <x-filament::input.select wire:model="form.grade">
  81. <option value="">年段 grade</option>
  82. @foreach($this->gradeOptions() as $value => $label)
  83. <option value="{{ $value }}">{{ $label }}</option>
  84. @endforeach
  85. </x-filament::input.select>
  86. </x-filament::input.wrapper>
  87. <x-filament::input.wrapper>
  88. <x-filament::input.select wire:model="form.term">
  89. <option value="">学期 term</option>
  90. @foreach($this->termOptions() as $value => $label)
  91. <option value="{{ $value }}">{{ $label }}</option>
  92. @endforeach
  93. </x-filament::input.select>
  94. </x-filament::input.wrapper>
  95. <x-filament::input.wrapper>
  96. <x-filament::input wire:model="form.chapter" placeholder="章节 chapter" />
  97. </x-filament::input.wrapper>
  98. <x-filament::input.wrapper>
  99. <x-filament::input.select wire:model="form.source_type">
  100. <option value="">卷子类型</option>
  101. @foreach($this->sourceTypeOptions() as $value => $label)
  102. <option value="{{ $value }}">{{ $label }}</option>
  103. @endforeach
  104. </x-filament::input.select>
  105. </x-filament::input.wrapper>
  106. <x-filament::input.wrapper>
  107. <x-filament::input wire:model="form.source_year" placeholder="来源年份" />
  108. </x-filament::input.wrapper>
  109. <x-filament::input.wrapper>
  110. <x-filament::input.select wire:model="form.textbook_id">
  111. <option value="">选择教材</option>
  112. @foreach($this->textbookOptions() as $id => $title)
  113. <option value="{{ $id }}">{{ $title }}</option>
  114. @endforeach
  115. </x-filament::input.select>
  116. </x-filament::input.wrapper>
  117. <x-filament::input.wrapper>
  118. <x-filament::input wire:model="form.textbook_series" placeholder="教材系列" />
  119. </x-filament::input.wrapper>
  120. <x-filament::input.wrapper>
  121. <x-filament::input wire:model="form.source_name" placeholder="来源名称" />
  122. </x-filament::input.wrapper>
  123. <x-filament::input.wrapper>
  124. <x-filament::input wire:model="form.source_page" placeholder="页码范围" />
  125. </x-filament::input.wrapper>
  126. <x-filament::input.wrapper>
  127. <x-filament::input wire:model="form.tags" placeholder="标签(逗号分隔)" />
  128. </x-filament::input.wrapper>
  129. </div>
  130. </x-filament::section>
  131. <x-filament::section heading="批量覆盖">
  132. <div class="text-xs text-gray-500 mb-2">对勾选卷子批量应用非空字段</div>
  133. <div class="space-y-2">
  134. <x-filament::input.wrapper>
  135. <x-filament::input wire:model="batch.edition" placeholder="教材体系 edition" />
  136. </x-filament::input.wrapper>
  137. <x-filament::input.wrapper>
  138. <x-filament::input.select wire:model="batch.grade">
  139. <option value="">年段 grade</option>
  140. @foreach($this->gradeOptions() as $value => $label)
  141. <option value="{{ $value }}">{{ $label }}</option>
  142. @endforeach
  143. </x-filament::input.select>
  144. </x-filament::input.wrapper>
  145. <x-filament::input.wrapper>
  146. <x-filament::input.select wire:model="batch.term">
  147. <option value="">学期 term</option>
  148. @foreach($this->termOptions() as $value => $label)
  149. <option value="{{ $value }}">{{ $label }}</option>
  150. @endforeach
  151. </x-filament::input.select>
  152. </x-filament::input.wrapper>
  153. <x-filament::input.wrapper>
  154. <x-filament::input wire:model="batch.chapter" placeholder="章节 chapter" />
  155. </x-filament::input.wrapper>
  156. <x-filament::input.wrapper>
  157. <x-filament::input.select wire:model="batch.source_type">
  158. <option value="">卷子类型</option>
  159. @foreach($this->sourceTypeOptions() as $value => $label)
  160. <option value="{{ $value }}">{{ $label }}</option>
  161. @endforeach
  162. </x-filament::input.select>
  163. </x-filament::input.wrapper>
  164. <x-filament::input.wrapper>
  165. <x-filament::input wire:model="batch.source_name" placeholder="来源名称" />
  166. </x-filament::input.wrapper>
  167. <x-filament::input.wrapper>
  168. <x-filament::input wire:model="batch.source_page" placeholder="页码范围" />
  169. </x-filament::input.wrapper>
  170. <x-filament::input.wrapper>
  171. <x-filament::input wire:model="batch.tags" placeholder="标签(逗号分隔)" />
  172. </x-filament::input.wrapper>
  173. <x-filament::button color="warning" x-on:click.prevent="if(confirm('确认对勾选卷子批量覆盖?')) { $wire.applyBatch() }">
  174. 批量覆盖
  175. </x-filament::button>
  176. </div>
  177. </x-filament::section>
  178. </div>
  179. </div>
  180. </div>
  181. </x-filament::page>