store-manage/app/Admin/Controllers/Train/ExaminationController.php

99 lines
4.8 KiB
PHP

<?php
namespace App\Admin\Controllers\Train;
use App\Admin\Controllers\AdminController;
use App\Admin\Services\Train\ExaminationService;
use Slowlyo\OwlAdmin\Admin;
use Slowlyo\OwlAdmin\Renderers\Form;
use Slowlyo\OwlAdmin\Renderers\Page;
use App\Enums\{ExamStatus, QuestionCate};
use App\Models\Train\Question;
/**
* 考试管理
*/
class ExaminationController extends AdminController
{
protected string $serviceName = ExaminationService::class;
public function list(): Page
{
$crud = $this->baseCRUD()
->tableLayout('fixed')
->headerToolbar([
$this->createButton()->visible(Admin::user()->can('admin.train.examinations.create')),
...$this->baseHeaderToolBar(),
])
->bulkActions([])
->filter($this->baseFilter()->body([
amis()->GroupControl()->mode('horizontal')->body([
amisMake()->TextControl()->name('search')->label(__('train_examination.name'))->columnRatio(3)->clearable(),
amisMake()->SelectControl()->options(ExamStatus::options())->name('exam_status')->label(__('train_examination.exam_status'))->columnRatio(3)->clearable(),
]),
]))
->columns([
amisMake()->TableColumn()->name('id')->label(__('train_examination.id')),
amisMake()->TableColumn()->name('name')->label(__('train_examination.name')),
amisMake()->TableColumn()->name('exam_status')->label(__('train_examination.exam_status'))->set('type', 'mapping')->set('map', ExamStatus::options()),
amisMake()->TableColumn()->name('published_at')->label(__('train_examination.published_at')),
amisMake()->TableColumn()->name('total_questions')->label(__('train_examination.total_questions')),
amisMake()->TableColumn()->name('total_score')->label(__('train_examination.total_score')),
$this->rowActions([
$this->rowShowButton()->visible(Admin::user()->can('admin.train.examinations.view')),
$this->rowEditButton()->visible(Admin::user()->can('admin.train.examinations.update')),
$this->rowDeleteButton()->visible(Admin::user()->can('admin.train.examinations.delete')),
]),
]);
return $this->baseList($crud);
}
public function form($edit): Form
{
return $this->baseForm()->title('')->body([
amisMake()->TextControl()->name('name')->label(__('train_examination.name'))->required(),
amisMake()->TableControl()
->addable()
->editable()
->removable()
->needConfirm(false)
->columns([
amisMake()->SelectControl()
->options(Question::get())
->labelField('title')
->valueField('id')
->searchable()
->name('question_id')
->label(__('train_examination.question_id'))
->required(),
amisMake()->NumberControl()->min(0)->step(1)->precision(0)->name('score')->label(__('train_examination.score'))->required(),
])
->name('questions')
->label(__('train_examination.questions')),
]);
}
public function detail(): Form
{
$detail = amisMake()->Property()->items([
['label' => __('train_examination.name'), 'content' => '${name}'],
['label' => __('train_examination.exam_status'), 'content' => amisMake()->Mapping()->map(ExamStatus::options())->name('exam_status')],
['label' => __('train_examination.published_at'), 'content' => '${published_at}'],
['label' => __('train_examination.total_questions'), 'content' => '${total_questions}'],
['label' => __('train_examination.total_score'), 'content' => '${total_score}'],
['label' => __('train_examination.created_at'), 'content' => '${created_at}'],
]);
$question = amisMake()->Table()->source('${questions}')->columns([
amisMake()->TableColumn()->name('title')->label(__('train_question.title')),
amisMake()->TableColumn()->name('cate')->label(__('train_question.cate'))->set('type', 'mapping')->map(QuestionCate::options()),
amisMake()->TableColumn()->name('options')->label(__('train_question.options'))->set('type', 'list')->source('${options}')->listItem([
'titleClassName' => 'text-${IF(is_true, "success", "danger")}',
'title' => '${text}',
]),
amisMake()->TableColumn()->name('score')->label(__('train_examination.score')),
]);
return $this->baseDetail()->title('')->body([$detail, amisMake()->Divider(), $question]);
}
}