2023-01-12 10:42:37 +08:00

265 lines
6.2 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
// +----------------------------------------------------------------------
// | CatchAdmin [Just Like ]
// +----------------------------------------------------------------------
// | Copyright (c) 2017~2021 https://catchadmin.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( https://github.com/JaguarJack/catchadmin-laravel/blob/master/LICENSE.md )
// +----------------------------------------------------------------------
// | Author: JaguarJack [ njphper@gmail.com ]
// +----------------------------------------------------------------------
declare(strict_types=1);
namespace Modules\Develop\Support\Generate\Create;
use Catch\CatchAdmin;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Str;
class FrontTable extends Creator
{
/**
* @var string
*/
protected string $label = '{label}';
/**
* @var string
*/
protected string $prop = '{prop}';
/**
* @var string
*/
protected string $modelValue = '{model-value}';
/**
* @var string
*/
protected string $table = '{table}';
/**
* @var string
*/
protected string $search = '{search}';
/**
* @var string
*/
protected string $api = '{api}';
/**
* @var string
*/
protected string $formItems = '{formItems}';
/**
* @var string
*/
protected string $paginate = '{paginate}';
/**
* @var string
*/
protected string $useList = '{useList}';
/**
* @var string
*/
protected string $tree = '{tree}';
/**
* @var array
*/
protected array $structures;
/**
* @param string $controller
* @param bool $hasPaginate
* @param string $apiString
*/
public function __construct(
protected readonly string $controller,
protected readonly bool $hasPaginate,
protected readonly string $apiString
) {
}
/**
* get content
*
* @return string
*/
public function getContent(): string
{
// TODO: Implement getContent() method.
return Str::of(File::get($this->getTableStub()))->replace([
$this->table, $this->search, $this->api, $this->paginate, $this->useList, $this->tree
], [
$this->getTableContent(),
$this->getSearchContent(),
$this->apiString,
$this->getPaginateStubContent(),
$this->getUseList(),
$this->getTreeProps()
])->toString();
}
/**
* get file
*
* @return string
*/
public function getFile(): string
{
// TODO: Implement getFile() method.
return CatchAdmin::makeDir(CatchAdmin::getModuleViewsPath($this->module).Str::of($this->controller)->replace('Controller', '')->lcfirst()).DIRECTORY_SEPARATOR.'index.vue';
}
/**
* get search content
*
* @return string
*/
protected function getSearchContent(): string
{
$search = Str::of('');
$formComponents = $this->formComponents();
foreach ($this->structures as $structure) {
if ($structure['label'] && $structure['form_component'] && $structure['search']) {
if (isset($formComponents[$structure['form_component']])) {
$search = $search->append(
Str::of($formComponents[$structure['form_component']])
->replace(
[$this->label, $this->prop, $this->modelValue],
[$structure['label'], $structure['field'], sprintf('query.%s', $structure['field'])]
)
);
}
}
}
return $search->trim(PHP_EOL)->toString();
}
/**
* get list content;
*
* @return string
*/
protected function getTableContent(): string
{
$tableColumn = <<<HTML
<el-table-column prop="{prop}" label="{label}" />
HTML;
$table = Str::of('');
foreach ($this->structures as $structure) {
if ($structure['field'] && $structure['label'] && $structure['list']) {
$table = $table->append(
Str::of($tableColumn)->replace([$this->label, $this->prop], [$structure['label'], $structure['field']])
)->newLine();
}
}
return $table->trim(PHP_EOL)->toString();
}
/**
* form components
*
* @return array
*/
protected function formComponents(): array
{
$components = [];
foreach (File::glob(
$this->getFormItemStub()
) as $stub) {
$components[File::name($stub)] = File::get($stub);
}
return $components;
}
/**
* get formItem stub
*
* @return string
*/
protected function getFormItemStub(): string
{
return dirname(__DIR__).DIRECTORY_SEPARATOR.'stubs'
.DIRECTORY_SEPARATOR.'vue'.DIRECTORY_SEPARATOR
.'formItems'.DIRECTORY_SEPARATOR.'*.stub';
}
/**
* get table stub
*
* @return string
*/
protected function getTableStub(): string
{
return dirname(__DIR__).DIRECTORY_SEPARATOR.'stubs'
.DIRECTORY_SEPARATOR.'vue'.DIRECTORY_SEPARATOR.'table.stub';
}
/**
* get paginate stub content
*
* @return string
*/
protected function getPaginateStubContent(): string
{
return $this->hasPaginate ? '<Paginate />' : '';
}
/**
* get use List
* @return string
*/
protected function getUseList(): string
{
return 'const { data, query, search, reset, loading } = useGetList(api)';
}
/**
* get tree props
*
* @return string
*/
public function getTreeProps(): string
{
if (in_array('parent_id', array_column($this->structures, 'field'))) {
return ' row-key="id" default-expand-all :tree-props="{ children: \'children\' }"';
}
return ' ';
}
/**
* set structures
*
* @param array $structures
* @return $this
*/
public function setStructures(array $structures): static
{
$this->structures = $structures;
return $this;
}
}