Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implementa funcionalidades para generalizar CRUD #166

Open
wants to merge 44 commits into
base: feature/frontend-v2
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
e00f10f
fix: nome da aplicação no package.json
tassiocaique Dec 6, 2023
b439766
feat: adiciona arquivo para suporte ao typescript
tassiocaique Dec 6, 2023
f28f4d7
feat: configura validação de formulários
tassiocaique Dec 6, 2023
d18748a
feat: adiciona configurações do sweetalert
tassiocaique Dec 6, 2023
091ed61
fea:t adiciona suporte ao typescript
tassiocaique Dec 6, 2023
b8de54f
feat: atualiza dependências do projeto
tassiocaique Dec 6, 2023
072f7c1
feat: suporte à trasnpilação de typescript
tassiocaique Dec 6, 2023
b6c8553
feat: interface para definir contrato de classes nos quais suas insta…
tassiocaique Dec 6, 2023
359293b
feat: adiciona suporte no CUIDSService à string ou objeto no método d…
tassiocaique Dec 6, 2023
6cea968
feat: implementa modal para gerenciar requisições
tassiocaique Dec 6, 2023
5182e88
feat: implementa componente de página para gerenciar crud
tassiocaique Dec 6, 2023
90fbe14
feat: implementa interface com atributos para configuração de páginas…
tassiocaique Dec 6, 2023
1aa845c
feat: implementa classes do domínio para gerenciar membros
tassiocaique Dec 6, 2023
a742b8e
feat: ajusta resource para retornar os times completos e o os nomes d…
tassiocaique Dec 13, 2023
174dc93
fix: filtro para não retornar times "nulos"
tassiocaique Dec 13, 2023
5b617cd
feat: renomeia componente
tassiocaique Dec 13, 2023
8c218d7
fix: corrige nome das propriedades
tassiocaique Dec 13, 2023
9294f8c
feat: implementa padrões para o pagewrapper
tassiocaique Dec 13, 2023
e295754
feat: implementa página de members page
tassiocaique Dec 13, 2023
cccf05c
rm: remove componente indexsettings
tassiocaique Dec 13, 2023
c0aaeab
feat: implementa modal para criação de membros
tassiocaique Dec 13, 2023
59835b3
feat: implementa form para criação/edição de membros
tassiocaique Dec 13, 2023
55a7547
feat: inplementa listagem de mebros com a tabela
tassiocaique Dec 13, 2023
c0ee165
feat: implementa modal para atualização
tassiocaique Dec 13, 2023
69bb3a6
feat: configurações de rota
tassiocaique Dec 13, 2023
d482408
feat: boilerplate do comando e arquivos para criação semiautomatica d…
tassiocaique May 17, 2024
a70352f
fix: adiciona código para fechar o modal quando a requisição é bem su…
tassiocaique May 17, 2024
f83e1d9
feat: atualiza package
tassiocaique May 17, 2024
d10f7d2
feat: Ajusta resource de workspace
tassiocaique Aug 12, 2024
de1e3ed
feat: atualiza versões das bibliotecas
tassiocaique Aug 12, 2024
92ee1c3
feat: remove swal como confimação da exclusão e adiciona dialog do cuida
tassiocaique Aug 12, 2024
1776ff9
fix: cor do botão da tabela padrão
tassiocaique Aug 12, 2024
80564bc
fix: erro de abertura do modal após requisiçao bem sucedida
tassiocaique Aug 12, 2024
c55ac20
feat: add times e novas variáveis da sidebar
tassiocaique Aug 12, 2024
f00f20e
feat: multiselect para entidade que precisam de requisição
tassiocaique Aug 12, 2024
92f23d4
feat: adiciona recurso para gerenciamento de membros na aplicação
tassiocaique Aug 12, 2024
3097639
feat: gerenciamento de times na aplicação
tassiocaique Aug 12, 2024
fc5dd48
feat: gerencialmento de workspaces na aplicação
tassiocaique Aug 12, 2024
ce6c1a1
feat: registro de rotas
tassiocaique Aug 12, 2024
c9c4333
feat: adiciona boardList no "resource" de time
tassiocaique Aug 13, 2024
782d2f6
feat: atualiza configurações da página de times
tassiocaique Aug 13, 2024
8f1334b
feat: adiciona to do, doing e done como listas padrão na criação de t…
tassiocaique Aug 13, 2024
0f441a3
feat: implementa gerenciamento de listas no formulário de times
tassiocaique Aug 13, 2024
c6ea8cd
feat: modifica biblioteca de drag utilizada
tassiocaique Aug 13, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
207 changes: 207 additions & 0 deletions app/Console/Commands/CuidsGenerateCommand.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,207 @@
<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Filesystem\Filesystem;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\Artisan;

class CuidsGenerateCommand extends Command
{
protected $signature = 'cuids:generate {entity} {--with-backend}';
protected $description = 'Gera um novo módulo de CUIDS';

protected $files;

protected $entity;
protected $entities;

public function __construct(Filesystem $files)
{
parent::__construct();
$this->files = $files;
}

public function handle()
{
$this->entity = Str::lower($this->argument('entity'));
$this->entities = Str::plural($this->entity);
$this->generateIndexPage();
$this->generateComponents();
$this->generateDomain();
$this->generateRoutes();
if($this->option('with-backend')) {
$this->generateBackend();
}
}

private function generateIndexPage() {
// Caminho para a pasta de stubs
$stub_path = base_path("stubs/pages/EntitiesPage.vue");

// Verificar se o arquivo de stub existe
if (!$this->verifyIfFileExists($stub_path)) return;

// Fazer as substituições dinâmicas
$file_content = $this->replaceStubs($stub_path);

// Caminho onde o arquivo gerado será salvo
$output_path = base_path("resources/js-vue-3/features/{$this->entities}/pages/{$this->pascalEntities()}Page.vue");

// Criar a pasta se não existir
$this->createIfNotExists($output_path);

// Salvar o conteúdo gerado no novo arquivo
$this->files->put($output_path, $file_content);

$this->info("File created at {$output_path}");
}

private function generateComponents() {
// Caminho para a pasta de stubs
$components = [
'CreateEntityModal' => 'singular',
'EntitiesTable' => 'plural',
'EntityForm' => 'singular',
'UpdateEntityModal' => 'singular',
];

foreach($components as $key => $value) {
$stub_path = base_path("stubs/components/{$key}.vue");

// Verificar se o arquivo de stub existe
if (!$this->verifyIfFileExists($stub_path)) return;

// Fazer as substituições dinâmicas
$file_content = $this->replaceStubs($stub_path);

if($value == 'plural') {
$component_name = str_replace('Entities', $this->pascalEntities(), $key);
} else {
$component_name = str_replace('Entity', $this->pascalEntity(), $key);
}


$output_path = base_path("resources/js-vue-3/features/{$this->entities}/components/{$component_name}.vue");

// Criar a pasta se não existir
$this->createIfNotExists($output_path);

// Salvar o conteúdo gerado no novo arquivo
$this->files->put($output_path, $file_content);

$this->info("File created at {$output_path}");
}
}

private function generateDomain() {

// Caminho para a pasta de stubs
$files = [
'model.ts',
'index.ts',
'pageSettings.ts',
'service.ts',
];

foreach($files as $file) {
$stub_path = base_path("stubs/domain/{$file}");

// Verificar se o arquivo de stub existe
if (!$this->verifyIfFileExists($stub_path)) return;

// Fazer as substituições dinâmicas
$file_content = $this->replaceStubs($stub_path);

$output_path = base_path("resources/js-vue-3/shared/domain/{$this->entity}/{$file}");

// Criar a pasta se não existir
$this->createIfNotExists($output_path);

// Salvar o conteúdo gerado no novo arquivo
$this->files->put($output_path, $file_content);

$this->info("File created at {$output_path}");
}
}

private function generateRoutes() {
$files = [
'index.js',
];

foreach($files as $file) {
$stub_path = base_path("stubs/routes/{$file}");

// Verificar se o arquivo de stub existe
if (!$this->verifyIfFileExists($stub_path)) return;

// Fazer as substituições dinâmicas
$file_content = $this->replaceStubs($stub_path);

$output_path = base_path("resources/js-vue-3/features/{$this->entities}/routes/{$file}");

// Criar a pasta se não existir
$this->createIfNotExists($output_path);

// Salvar o conteúdo gerado no novo arquivo
$this->files->put($output_path, $file_content);

$this->info("File created at {$output_path}");
}
}

public function generateBackend() {
Artisan::call("make:model {$this->pascalEntity()} --api --factory --requests --test");
}

private function pascalEntity() {
return $this->pascalCase($this->entity);
}

private function pascalEntities() {
return $this->pascalCase($this->entities);
}

private function snakeEntities() {
return ucwords(strtolower($this->entities));
}

private function snakeEntity() {
return ucwords(strtolower($this->entities));
}

private function pascalCase($string) {
return ucwords(strtolower($string));
}

private function replaceStubs($stub_path) {
// Ler o conteúdo do arquivo de stub
$stub_content = $this->files->get($stub_path);

// Fazer as substituições dinâmicas
$file_content = str_replace('entity', $this->entity, $stub_content);
$file_content = str_replace('Entity', $this->pascalEntity(), $file_content);
$file_content = str_replace('entities', $this->entities, $file_content);
$file_content = str_replace('Entities', $this->pascalEntities(), $file_content);
$file_content = str_replace('ENTITY', Str::upper($this->entity), $file_content);
$file_content = str_replace('ENTITIES', Str::upper($this->entities), $file_content);

return $file_content;
}

private function verifyIfFileExists($stub_path) {
if (!$this->files->exists($stub_path)) {
$this->error("Stub file does not exist at path {$stub_path}");
return false;
}
return true;
}

private function createIfNotExists($output_path) {
if (!$this->files->exists(dirname($output_path))) {
$this->files->makeDirectory(dirname($output_path), 0755, true);
}
}
}
3 changes: 2 additions & 1 deletion app/Http/Resources/MemberResource.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ public function toArray($request)
'has_login' => $this->has_login,
'user_id' => optional($this->user)->id,
'avatar_url' => $this->avatar_url,
'teams' => implode(', ', $this->getTeams()->pluck('name')->toArray()),
'teams' => $this->getTeams()->toArray(),
'teamsNames' => implode(', ', $this->getTeams()->pluck('name')->toArray()),
'team_ids' => $this->team_ids,
'workspace_ids' => $this->workspace_ids,
];
Expand Down
5 changes: 2 additions & 3 deletions app/Http/Resources/WorkspaceResource.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,11 @@ public function toArray($request)
'id' => $this->id,
'name' => $this->name,
'team_ids' => $this->team_ids,
'teams' => $this->teams,
'label_ids' => $this->label_ids,
'team_names' => $this->team_names,
'lottie_file' => $this->lottie_file,
'settings' => (object) $this->settings,
'inactive' => $this->inactive ?? false,
'status' => $this->inactive ? 'Desativado' : '',
'status' => $this->inactive ? 'Inativo' : 'Ativo',
];
}
}
2 changes: 2 additions & 0 deletions app/Models/Member.php
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,8 @@ public function getTeams()
{
return $this->teamMembers->map(function ($pivot) {
return $pivot->team;
})->filter(function ($item) {
return !empty($item);
});
}

Expand Down
Loading