From 87fa4bfd29c53bf95b0193b2bfa63b18333a3f94 Mon Sep 17 00:00:00 2001 From: Ymnuk Date: Fri, 11 Aug 2023 12:28:30 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D1=8F=20=D0=B3=D0=B5=D0=BD=D0=B5=D1=80=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D0=B8=20=D1=88=D0=B0=D0=B1=D0=BB=D0=BE=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=20=D1=81=D1=82=D1=80=D0=B0=D0=BD=D0=B8=D1=86=20=D0=BA=D0=BB?= =?UTF-8?q?=D0=B8=D0=B5=D0=BD=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/backend-generate-rest.go | 6 +- lib/frontend-angular.go | 74 ++++++++++++++++++- lib/templ/template.go | 46 ++++++++++++ .../src/app/app-routing.module.ts.tmpl | 15 ++++ .../page/page/form/form.component.html.tmpl | 13 ++++ .../page/page/form/form.component.scss.tmpl | 1 + .../app/page/page/form/form.component.ts.tmpl | 54 ++++++++++++++ .../app/page/page/page.component.html.tmpl | 12 +++ .../app/page/page/page.component.scss.tmpl | 3 + .../src/app/page/page/page.component.ts.tmpl | 41 ++++++++++ structs/rest-struct.go | 7 ++ 11 files changed, 265 insertions(+), 7 deletions(-) create mode 100644 lib/templ/tmpl/frontend/angular/src/app/page/page/form/form.component.html.tmpl create mode 100644 lib/templ/tmpl/frontend/angular/src/app/page/page/form/form.component.scss.tmpl create mode 100644 lib/templ/tmpl/frontend/angular/src/app/page/page/form/form.component.ts.tmpl create mode 100644 lib/templ/tmpl/frontend/angular/src/app/page/page/page.component.html.tmpl create mode 100644 lib/templ/tmpl/frontend/angular/src/app/page/page/page.component.scss.tmpl create mode 100644 lib/templ/tmpl/frontend/angular/src/app/page/page/page.component.ts.tmpl create mode 100644 structs/rest-struct.go diff --git a/lib/backend-generate-rest.go b/lib/backend-generate-rest.go index 2027094..a46e47f 100644 --- a/lib/backend-generate-rest.go +++ b/lib/backend-generate-rest.go @@ -11,15 +11,15 @@ import ( func generateBackendRest() { - type RestStruct struct { + /*type RestStruct struct { Path string Project *structs.Project Rest *structs.Rest - } + }*/ if len(Project.Backend.Rest) > 0 { for i := range Project.Backend.Rest { - restStruct := &RestStruct{ + restStruct := &structs.RestStruct{ Project: Project, Path: i, Rest: Project.Backend.Rest[i], diff --git a/lib/frontend-angular.go b/lib/frontend-angular.go index cbd0f08..921e162 100644 --- a/lib/frontend-angular.go +++ b/lib/frontend-angular.go @@ -1,6 +1,7 @@ package lib import ( + "fmt" "log" "os" "path/filepath" @@ -113,10 +114,6 @@ func generateFrontendAngularTmpl() { FileIn: "tmpl/frontend/angular/src/app/page/user/user.component.ts.tmpl", FileOut: filepath.Join(AppConfig.OutdirFrontend, "src", "app", "page", "user", "user.component.ts"), }, - { - FileIn: "tmpl/frontend/angular/src/app/app-routing.module.ts.tmpl", - FileOut: filepath.Join(AppConfig.OutdirFrontend, "src", "app", "app-routing.module.ts"), - }, { FileIn: "tmpl/frontend/angular/src/app/app.component.html.tmpl", FileOut: filepath.Join(AppConfig.OutdirFrontend, "src", "app", "app.component.html"), @@ -213,4 +210,73 @@ func generateFrontendAngularTmpl() { } } + templs := []structs.TmplInOut{ + { + FileIn: "tmpl/frontend/angular/src/app/app-routing.module.ts.tmpl", + FileOut: filepath.Join(AppConfig.OutdirFrontend, "src", "app", "app-routing.module.ts"), + }, + } + + for _, staticTmpls := range templs { + err := templ.PrepareTmplFile(staticTmpls.FileIn, Project, staticTmpls.FileOut) + if err != nil { + log.Fatal(err) + } + } + + /*templs = []structs.TmplInOut{ + { + FileIn: "tmpl/frontend/angular/src/app/page/page.component.ts.tmpl", + FileOut: filepath.Join(AppConfig.OutdirFrontend, "src", "app", "app-routing.module.ts"), + }, + }*/ + + for i, rest := range Project.Backend.Rest { + restStruct := structs.RestStruct{ + Path: i, + Project: Project, + Rest: rest, + } + templs := []structs.TmplInOut{ + { + FileIn: "tmpl/frontend/angular/src/app/page/page/page.component.ts.tmpl", + FileOut: filepath.Join(AppConfig.OutdirFrontend, "src", "app", "page", templ.RemoveFirstChar(i), fmt.Sprintf("%s.component.ts", templ.AngularFilename(i))), + }, + { + FileIn: "tmpl/frontend/angular/src/app/page/page/page.component.scss.tmpl", + FileOut: filepath.Join(AppConfig.OutdirFrontend, "src", "app", "page", templ.RemoveFirstChar(i), fmt.Sprintf("%s.component.scss", templ.AngularFilename(i))), + }, + { + FileIn: "tmpl/frontend/angular/src/app/page/page/page.component.html.tmpl", + FileOut: filepath.Join(AppConfig.OutdirFrontend, "src", "app", "page", templ.RemoveFirstChar(i), fmt.Sprintf("%s.component.html", templ.AngularFilename(i))), + }, + } + for _, item := range templs { + if err := templ.PrepareTmplIsNotExists(item.FileIn, restStruct, item.FileOut); err != nil { + log.Fatal(err) + } + } + if rest.Editable { + templs := []structs.TmplInOut{ + { + FileIn: "tmpl/frontend/angular/src/app/page/page/form/form.component.ts.tmpl", + FileOut: filepath.Join(AppConfig.OutdirFrontend, "src", "app", "page", templ.RemoveFirstChar(i), "form", fmt.Sprintf("%s-form.component.ts", templ.AngularFilename(i))), + }, + { + FileIn: "tmpl/frontend/angular/src/app/page/page/form/form.component.scss.tmpl", + FileOut: filepath.Join(AppConfig.OutdirFrontend, "src", "app", "page", templ.RemoveFirstChar(i), "form", fmt.Sprintf("%s-form.component.scss", templ.AngularFilename(i))), + }, + { + FileIn: "tmpl/frontend/angular/src/app/page/page/form/form.component.html.tmpl", + FileOut: filepath.Join(AppConfig.OutdirFrontend, "src", "app", "page", templ.RemoveFirstChar(i), "form", fmt.Sprintf("%s-form.component.html", templ.AngularFilename(i))), + }, + } + for _, item := range templs { + if err := templ.PrepareTmplIsNotExists(item.FileIn, restStruct, item.FileOut); err != nil { + log.Fatal(err) + } + } + } + } + } diff --git a/lib/templ/template.go b/lib/templ/template.go index e11563d..585f2af 100644 --- a/lib/templ/template.go +++ b/lib/templ/template.go @@ -43,6 +43,11 @@ var funcMap = template.FuncMap{ "isMethod": IsMethod, "roles": Roles, + + "removeFirstChar": RemoveFirstChar, + + "angularRestName": AngularRestName, + "angularFilename": AngularFilename, } func IsMethod(arr map[string][]string, method string) bool { @@ -340,3 +345,44 @@ func MkdirIsNotExists(pathdir string) (err error) { err = nil return } + +func AngularRestName(tmp string) string { + value := tmp + value = strings.Trim(value, " ") + if value == "" { + return "Unknow" + } + + value = strings.ReplaceAll(value, "/", "_") + + value = FieldNamePrepare(value) + + /*var regexpForReplace = regexp.MustCompile(`_([a-z])`) + value = strings.ToUpper(regexpForReplace.ReplaceAllString(value, `$1`)) + asRunes := []rune(value) + + asRunes[0] = []rune(strings.ToUpper(string([]rune(value)[0])))[0] + value = string(asRunes)*/ + return value +} + +func AngularFilename(value string) string { + value = strings.Trim(value, " ") + if value == "" { + return "unknow" + } + value = strings.ReplaceAll(value, "/", "-") + if []rune(value)[0] == '-' { + value = string([]rune(value)[1:]) + } + return value +} + +func RemoveFirstChar(value string) string { + value = strings.Trim(value, " ") + if value == "" { + return "" + } + value = string([]rune(value)[1:]) + return value +} diff --git a/lib/templ/tmpl/frontend/angular/src/app/app-routing.module.ts.tmpl b/lib/templ/tmpl/frontend/angular/src/app/app-routing.module.ts.tmpl index 19bab01..725fb07 100644 --- a/lib/templ/tmpl/frontend/angular/src/app/app-routing.module.ts.tmpl +++ b/lib/templ/tmpl/frontend/angular/src/app/app-routing.module.ts.tmpl @@ -6,6 +6,13 @@ import { LoginComponent } from './page/login/login.component'; import { UsersComponent } from './page/user/user.component'; import { UserFormComponent } from './page/user/user-form/user-form.component'; +{{ range $index, $rest := .Backend.Rest }} +import { {{ angularRestName $index }}Component } from './page/{{ removeFirstChar $index }}/{{ angularFilename $index }}.component'; +{{ if $rest.Editable }} +import { {{ angularRestName $index }}FormComponent } from './page/{{ removeFirstChar $index }}/form/{{ angularFilename $index }}-form.component'; +{{ end }} +{{ end }} + const routes: Routes = [ { @@ -20,6 +27,14 @@ const routes: Routes = [ { path: 'users/new', component: UserFormComponent }, { path: 'users/:id', component: UserFormComponent }, + {{ range $index, $rest := .Backend.Rest }} + { path: '{{ removeFirstChar $index }}', component: {{ angularRestName $index }}Component }, + {{ if $rest.Editable }} + { path: '{{ removeFirstChar $index }}/new', component: {{ angularRestName $index }}FormComponent }, + { path: '{{ removeFirstChar $index }}/:id', component: {{ angularRestName $index }}FormComponent }, + {{ end }} + {{ end }} + ] } ]; diff --git a/lib/templ/tmpl/frontend/angular/src/app/page/page/form/form.component.html.tmpl b/lib/templ/tmpl/frontend/angular/src/app/page/page/form/form.component.html.tmpl new file mode 100644 index 0000000..6bd132f --- /dev/null +++ b/lib/templ/tmpl/frontend/angular/src/app/page/page/form/form.component.html.tmpl @@ -0,0 +1,13 @@ +
+ +
+
+ + + +
+
+
+
\ No newline at end of file diff --git a/lib/templ/tmpl/frontend/angular/src/app/page/page/form/form.component.scss.tmpl b/lib/templ/tmpl/frontend/angular/src/app/page/page/form/form.component.scss.tmpl new file mode 100644 index 0000000..7e23d1a --- /dev/null +++ b/lib/templ/tmpl/frontend/angular/src/app/page/page/form/form.component.scss.tmpl @@ -0,0 +1 @@ +// Empty styles \ No newline at end of file diff --git a/lib/templ/tmpl/frontend/angular/src/app/page/page/form/form.component.ts.tmpl b/lib/templ/tmpl/frontend/angular/src/app/page/page/form/form.component.ts.tmpl new file mode 100644 index 0000000..b7213ee --- /dev/null +++ b/lib/templ/tmpl/frontend/angular/src/app/page/page/form/form.component.ts.tmpl @@ -0,0 +1,54 @@ +import { Component, OnInit, OnDestroy, AfterViewInit } from '@angular/core'; +import { UntypedFormGroup, UntypedFormControl, Validators } from '@angular/forms'; +import { Subscription, Observable, firstValueFrom } from 'rxjs'; +import { Router, ActivatedRoute, Params } from '@angular/router'; +import { MessageService } from 'primeng/api'; + +@Component({ + selector: 'app-{{ angularFilename .Path }}-form', + templateUrl: './{{ angularFilename .Path }}-form.component.html', + styleUrls: ['./{{ angularFilename .Path }}-form.component.scss'] +}) +export class {{ angularRestName .Path }}FormComponent implements OnInit, AfterViewInit, OnDestroy { + + private id?: string; // Идентификатор + + public form: UntypedFormGroup = new UntypedFormGroup({ + // TODO + }); + + constructor( + private router: Router, + private route: ActivatedRoute, + private toast: MessageService + ) { + + } + ngAfterViewInit(): void { + // Получим переданные параметры (id) + this.route.params.subscribe((params: Params) => { + if (params['id'] != null) { + this.id = params['id']; + // Получаем данные с сервера о выбранном пользователе + } else { + this.id = undefined; + } + }); + } + ngOnDestroy(): void { + // TODO + } + + ngOnInit(): void { + // TODO + } + + onSave(): void { + // TODO + } + + onCancel(): void { + this.router.navigate(['/{{ removeFirstChar .Path }}']); + } + +} diff --git a/lib/templ/tmpl/frontend/angular/src/app/page/page/page.component.html.tmpl b/lib/templ/tmpl/frontend/angular/src/app/page/page/page.component.html.tmpl new file mode 100644 index 0000000..d8207d5 --- /dev/null +++ b/lib/templ/tmpl/frontend/angular/src/app/page/page/page.component.html.tmpl @@ -0,0 +1,12 @@ +Добавить + + + + + + + + + diff --git a/lib/templ/tmpl/frontend/angular/src/app/page/page/page.component.scss.tmpl b/lib/templ/tmpl/frontend/angular/src/app/page/page/page.component.scss.tmpl new file mode 100644 index 0000000..bdadd8b --- /dev/null +++ b/lib/templ/tmpl/frontend/angular/src/app/page/page/page.component.scss.tmpl @@ -0,0 +1,3 @@ +table { + width: 100%; +} diff --git a/lib/templ/tmpl/frontend/angular/src/app/page/page/page.component.ts.tmpl b/lib/templ/tmpl/frontend/angular/src/app/page/page/page.component.ts.tmpl new file mode 100644 index 0000000..e5a7f6c --- /dev/null +++ b/lib/templ/tmpl/frontend/angular/src/app/page/page/page.component.ts.tmpl @@ -0,0 +1,41 @@ +import { Component, OnDestroy, OnInit, ViewChild } from '@angular/core'; +import { firstValueFrom, Observable, Subscription } from 'rxjs'; +import { Router } from '@angular/router'; +import { UntypedFormControl } from '@angular/forms'; +import { MessageService } from 'primeng/api'; + +@Component({ + selector: 'app-{{ angularFilename .Path }}', + templateUrl: './{{ angularFilename .Path }}.component.html', + styleUrls: ['./{{ angularFilename .Path }}.component.scss'] +}) +export class {{ angularRestName .Path }}Component implements OnInit, OnDestroy { + + constructor( + private toast: MessageService, + private router: Router + ) { } + + ngOnDestroy(): void { } + + private refreshData(): void { + // TODO + } + + ngOnInit(): void { + this.refreshData(); + } + + onEdit(id:any): void { + this.router.navigate(['/{{ removeFirstChar .Path }}', id]); + } + + onDelete(id:any): void { + // TODO + } + + OnNewItem(): void { + this.router.navigate(['/{{ removeFirstChar .Path }}/new']); + } + +} diff --git a/structs/rest-struct.go b/structs/rest-struct.go new file mode 100644 index 0000000..5cb0f14 --- /dev/null +++ b/structs/rest-struct.go @@ -0,0 +1,7 @@ +package structs + +type RestStruct struct { + Path string + Project *Project + Rest *Rest +}