ListMenuPermissions.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. <?php
  2. namespace App\Filament\Resources\MenuPermissionResource\Pages;
  3. use App\Filament\Resources\MenuPermissionResource;
  4. use App\Models\Teacher;
  5. use Filament\Actions;
  6. use Filament\Resources\Pages\ListRecords;
  7. use Filament\Support\Enums\FontWeight;
  8. use Filament\Tables;
  9. use Filament\Tables\Table;
  10. use Filament\Tables\Columns\TextColumn;
  11. use Filament\Tables\Columns\ToggleColumn;
  12. use Filament\Tables\Columns\BadgeColumn;
  13. use Filament\Tables\Filters\SelectFilter;
  14. use Filament\Tables\Filters\TernaryFilter;
  15. use Filament\Forms;
  16. use Filament\Forms\Components\Select;
  17. use Filament\Forms\Components\Toggle;
  18. use Filament\Forms\Components\TextInput;
  19. use Filament\Forms\Components\Textarea;
  20. class ListMenuPermissions extends ListRecords
  21. {
  22. public ?string $selectedTeacherId = null;
  23. protected static string $resource = MenuPermissionResource::class;
  24. public function mount(): void
  25. {
  26. parent::mount();
  27. // 默认选择第一个老师
  28. if (!$this->selectedTeacherId) {
  29. $firstTeacher = Teacher::first();
  30. if ($firstTeacher) {
  31. $this->selectedTeacherId = $firstTeacher->teacher_id;
  32. }
  33. }
  34. }
  35. /**
  36. * 更新选中的老师
  37. */
  38. public function updatedSelectedTeacherId(): void
  39. {
  40. // 当老师选择改变时,刷新表格数据
  41. $this->resetPage();
  42. }
  43. public function table(Table $table): Table
  44. {
  45. return $table
  46. ->query(
  47. $this->selectedTeacherId
  48. ? \App\Models\MenuPermission::where('user_id', $this->selectedTeacherId)
  49. : \App\Models\MenuPermission::where('id', 0) // 返回空结果
  50. )
  51. ->columns([
  52. TextColumn::make('user_id')
  53. ->label('老师ID')
  54. ->searchable()
  55. ->sortable(),
  56. TextColumn::make('menu_key')
  57. ->label('菜单标识')
  58. ->searchable()
  59. ->sortable(),
  60. TextColumn::make('menu_label')
  61. ->label('菜单名称')
  62. ->searchable(),
  63. TextColumn::make('menu_group')
  64. ->label('菜单分组')
  65. ->badge()
  66. ->color('gray'),
  67. TextColumn::make('menu_url')
  68. ->label('菜单URL')
  69. ->limit(50)
  70. ->copyable(),
  71. ToggleColumn::make('is_visible')
  72. ->label('是否可见')
  73. ->sortable(),
  74. TextColumn::make('sort_order')
  75. ->label('排序')
  76. ->sortable(),
  77. TextColumn::make('created_at')
  78. ->label('创建时间')
  79. ->dateTime('Y-m-d H:i')
  80. ->sortable()
  81. ->toggleable(isToggledHiddenByDefault: true),
  82. ])
  83. ->filters([
  84. SelectFilter::make('menu_group')
  85. ->label('菜单分组')
  86. ->options([
  87. '管理' => '管理',
  88. '工具' => '工具',
  89. '分析' => '分析',
  90. ])
  91. ->multiple(),
  92. TernaryFilter::make('is_visible')
  93. ->label('可见状态')
  94. ->placeholder('全部')
  95. ->trueLabel('可见')
  96. ->falseLabel('隐藏'),
  97. ])
  98. ->actions([
  99. Actions\EditAction::make(),
  100. Actions\DeleteAction::make(),
  101. ])
  102. ->bulkActions([
  103. Actions\BulkActionGroup::make([
  104. Actions\DeleteBulkAction::make(),
  105. Actions\BulkAction::make('toggle_visibility')
  106. ->label('批量切换可见性')
  107. ->icon('heroicon-m-eye')
  108. ->action(function ($records) {
  109. foreach ($records as $record) {
  110. $record->update(['is_visible' => !$record->is_visible]);
  111. }
  112. }),
  113. ]),
  114. ])
  115. ->defaultSort('sort_order')
  116. ->paginated([10, 25, 50, 100])
  117. ->poll('30s');
  118. }
  119. protected function getHeaderActions(): array
  120. {
  121. $teacher = $this->selectedTeacherId
  122. ? Teacher::where('teacher_id', $this->selectedTeacherId)->first()
  123. : null;
  124. return [
  125. Actions\CreateAction::make()
  126. ->visible(fn () => $this->selectedTeacherId !== null),
  127. Actions\Action::make('初始化选中老师菜单')
  128. ->label('为当前老师初始化菜单')
  129. ->icon('heroicon-o-plus-circle')
  130. ->color('success')
  131. ->visible(fn () => $this->selectedTeacherId !== null)
  132. ->action(function () use ($teacher) {
  133. if (!$teacher) {
  134. \Filament\Notifications\Notification::make()
  135. ->title('错误')
  136. ->body('请先选择老师')
  137. ->danger()
  138. ->send();
  139. return;
  140. }
  141. $menuKeys = [
  142. 'dashboard' => ['label' => '仪表盘', 'group' => '管理', 'sort' => 0],
  143. 'exam-history' => ['label' => '考试历史', 'group' => '管理', 'sort' => 1],
  144. 'exam-analysis' => ['label' => '考试分析', 'group' => '分析', 'sort' => 2],
  145. 'ocr-paper-grading' => ['label' => 'OCR试卷批改', 'group' => '工具', 'sort' => 3],
  146. 'intelligent-exam-generation' => ['label' => '智能出卷', 'group' => '工具', 'sort' => 4],
  147. 'knowledge-graph' => ['label' => '知识图谱', 'group' => '分析', 'sort' => 5],
  148. 'student-management' => ['label' => '学生管理', 'group' => '管理', 'sort' => 6],
  149. 'teacher-management' => ['label' => '老师管理', 'group' => '管理', 'sort' => 7],
  150. ];
  151. foreach ($menuKeys as $key => $data) {
  152. \App\Models\MenuPermission::updateOrCreate(
  153. [
  154. 'user_id' => $teacher->teacher_id,
  155. 'menu_key' => $key,
  156. ],
  157. [
  158. 'menu_label' => $data['label'],
  159. 'menu_group' => $data['group'],
  160. 'is_visible' => true,
  161. 'sort_order' => $data['sort'],
  162. ]
  163. );
  164. }
  165. // 刷新表格数据
  166. $this->resetPage();
  167. \Filament\Notifications\Notification::make()
  168. ->title('菜单初始化完成')
  169. ->body('已为老师 ' . $teacher->teacher_id . ' 初始化菜单权限')
  170. ->success()
  171. ->send();
  172. }),
  173. Actions\Action::make('初始化所有老师菜单')
  174. ->label('为所有老师初始化菜单')
  175. ->icon('heroicon-o-users')
  176. ->color('primary')
  177. ->action(function () {
  178. $teachers = Teacher::all();
  179. $menuKeys = [
  180. 'dashboard' => ['label' => '仪表盘', 'group' => '管理', 'sort' => 0],
  181. 'exam-history' => ['label' => '考试历史', 'group' => '管理', 'sort' => 1],
  182. 'exam-analysis' => ['label' => '考试分析', 'group' => '分析', 'sort' => 2],
  183. 'ocr-paper-grading' => ['label' => 'OCR试卷批改', 'group' => '工具', 'sort' => 3],
  184. 'intelligent-exam-generation' => ['label' => '智能出卷', 'group' => '工具', 'sort' => 4],
  185. 'knowledge-graph' => ['label' => '知识图谱', 'group' => '分析', 'sort' => 5],
  186. 'student-management' => ['label' => '学生管理', 'group' => '管理', 'sort' => 6],
  187. 'teacher-management' => ['label' => '老师管理', 'group' => '管理', 'sort' => 7],
  188. ];
  189. foreach ($teachers as $teacher) {
  190. foreach ($menuKeys as $key => $data) {
  191. \App\Models\MenuPermission::updateOrCreate(
  192. [
  193. 'user_id' => $teacher->teacher_id,
  194. 'menu_key' => $key,
  195. ],
  196. [
  197. 'menu_label' => $data['label'],
  198. 'menu_group' => $data['group'],
  199. 'is_visible' => true,
  200. 'sort_order' => $data['sort'],
  201. ]
  202. );
  203. }
  204. }
  205. \Filament\Notifications\Notification::make()
  206. ->title('菜单初始化完成')
  207. ->body('已为 ' . $teachers->count() . ' 位老师初始化菜单权限')
  208. ->success()
  209. ->send();
  210. }),
  211. ];
  212. }
  213. protected function getTableContentGrid(): ?array
  214. {
  215. return [
  216. 'md' => 2,
  217. 'xl' => 3,
  218. ];
  219. }
  220. protected function getTableHeader(): \Illuminate\Contracts\View\View|\Illuminate\Contracts\Support\Htmlable|null
  221. {
  222. $teacher = $this->selectedTeacherId
  223. ? Teacher::where('teacher_id', $this->selectedTeacherId)->first()
  224. : null;
  225. if ($teacher) {
  226. return view('filament.resources.menu-permission-resource.header', [
  227. 'teacher' => $teacher,
  228. ]);
  229. }
  230. return null;
  231. }
  232. }