From bebbf3e6fc7665a8817f5ad435e8cc065626c526 Mon Sep 17 00:00:00 2001 From: Gui Seek Date: Fri, 6 Dec 2024 00:26:37 -0300 Subject: [PATCH 1/2] =?UTF-8?q?feat(account):=20gerar=20perfil=20do=20usu?= =?UTF-8?q?=C3=A1rio=20para=20customiza=C3=A7=C3=A3o=20e=20impress=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit closed #100 --- apps/devmx/src/app/app.sections.ts | 12 +- .../devmx/src/scss/components/_fab.theme.scss | 9 +- .../data-access/src/lib/academy.providers.ts | 4 +- .../data-access/src/lib/providers/course.ts | 23 +++ .../data-access/src/lib/providers/index.ts | 9 +- .../src/lib/providers/nistitution.ts | 23 +++ .../data-access/src/lib/providers/subject.ts | 23 +++ packages/academy/domain/package.json | 3 +- .../src/client/use-cases/create-course.ts | 7 +- .../client/use-cases/create-institution.ts | 5 + .../src/client/use-cases/create-subject.ts | 5 + .../src/client/use-cases/delete-course.ts | 5 + .../client/use-cases/delete-institution.ts | 5 + .../src/client/use-cases/delete-subject.ts | 5 + .../src/client/use-cases/find-course-by-id.ts | 5 + .../src/client/use-cases/find-courses.ts | 5 + .../use-cases/find-institution-by-id.ts | 7 + .../src/client/use-cases/find-institutions.ts | 5 + .../client/use-cases/find-subject-by-id.ts | 5 + .../src/client/use-cases/find-subjects.ts | 5 + .../src/client/use-cases/update-course.ts | 5 + .../client/use-cases/update-institution.ts | 5 + .../src/client/use-cases/update-subject.ts | 5 + .../src/lib/account-feature-about.routes.ts | 6 - .../feature-about/src/lib/components/index.ts | 3 + .../user-events/user-events.component.scss | 32 ++++ .../user-events/user-events.component.ts | 18 ++ .../user-presentations.component.scss | 32 ++++ .../user-presentations.component.ts | 18 ++ .../user-skills/user-skills.component.html | 7 + .../user-skills/user-skills.component.scss | 32 ++++ .../user-skills/user-skills.component.ts | 12 ++ .../about-user/about-user.container.html | 135 +++++++------- .../about-user/about-user.container.scss | 172 ++++++++++++++++-- .../about-user/about-user.container.ts | 52 ++++-- .../account/profile/profile.component.html | 4 +- .../account/skills/skills.component.html | 2 + .../src/lib/forms/user-profile.ts | 2 +- .../feature-shell/src/lib/forms/user.spec.ts | 8 +- .../ui-shared/src/lib/components/index.ts | 1 + .../user-card-skills.component.html | 15 ++ .../user-card-skills.component.scss | 4 + .../user-card-skills.component.ts | 18 ++ .../markdown-view.component.scss | 2 - .../lib/app-shell/app-shell.component.scss | 2 + packages/shared/util-data/project.json | 5 +- packages/shared/util-data/src/client.ts | 1 + packages/shared/util-data/src/client/index.ts | 1 + .../providers/create-client-provider.ts | 18 ++ .../providers/create-facade-provider.ts | 20 ++ .../providers/create-service-provder.ts | 20 ++ .../providers/create-use-case-provider.ts | 17 ++ .../util-data/src/client/providers/index.ts | 4 + .../lib/providers/__fileName__.ts.template | 23 +++ .../use-cases/create-__fileName__.ts.template | 5 + .../use-cases/delete-__fileName__.ts.template | 5 + .../find-__fileNamePlural__.ts.template | 5 + .../find-__fileName__-by-id.ts.template | 5 + .../use-cases/update-__fileName__.ts.template | 5 + .../entity/lib/add-file-to-barrel.ts | 2 +- .../entity/lib/build-barrel-paths.ts | 4 + tsconfig.base.json | 1 + 62 files changed, 780 insertions(+), 123 deletions(-) create mode 100644 packages/academy/data-access/src/lib/providers/course.ts create mode 100644 packages/academy/data-access/src/lib/providers/nistitution.ts create mode 100644 packages/academy/data-access/src/lib/providers/subject.ts create mode 100644 packages/account/feature-about/src/lib/components/index.ts create mode 100644 packages/account/feature-about/src/lib/components/user-events/user-events.component.scss create mode 100644 packages/account/feature-about/src/lib/components/user-events/user-events.component.ts create mode 100644 packages/account/feature-about/src/lib/components/user-presentations/user-presentations.component.scss create mode 100644 packages/account/feature-about/src/lib/components/user-presentations/user-presentations.component.ts create mode 100644 packages/account/feature-about/src/lib/components/user-skills/user-skills.component.html create mode 100644 packages/account/feature-about/src/lib/components/user-skills/user-skills.component.scss create mode 100644 packages/account/feature-about/src/lib/components/user-skills/user-skills.component.ts create mode 100644 packages/account/ui-shared/src/lib/components/user-card-skills/user-card-skills.component.html create mode 100644 packages/account/ui-shared/src/lib/components/user-card-skills/user-card-skills.component.scss create mode 100644 packages/account/ui-shared/src/lib/components/user-card-skills/user-card-skills.component.ts create mode 100644 packages/shared/util-data/src/client.ts create mode 100644 packages/shared/util-data/src/client/index.ts create mode 100644 packages/shared/util-data/src/client/providers/create-client-provider.ts create mode 100644 packages/shared/util-data/src/client/providers/create-facade-provider.ts create mode 100644 packages/shared/util-data/src/client/providers/create-service-provder.ts create mode 100644 packages/shared/util-data/src/client/providers/create-use-case-provider.ts create mode 100644 packages/shared/util-data/src/client/providers/index.ts create mode 100644 tools/plugin/dx-dev/src/generators/entity/files/__scope__/data-access/src/lib/providers/__fileName__.ts.template diff --git a/apps/devmx/src/app/app.sections.ts b/apps/devmx/src/app/app.sections.ts index ea692f86..72699176 100644 --- a/apps/devmx/src/app/app.sections.ts +++ b/apps/devmx/src/app/app.sections.ts @@ -76,12 +76,12 @@ export const appSections: SectionHeaderOptions[] = [ icon: 'music/speaker', roles: ['recruiter'], }, - // { - // label: 'Aprenda', - // route: ['/aprenda', 'administracao'], - // icon: 'book-opened', - // roles: ['member'], - // }, + { + label: 'Aprenda', + route: ['/aprenda', 'administracao'], + icon: 'book-opened', + roles: ['member'], + }, { label: 'Sobre você', route: ['/conta', 'configuracoes'], diff --git a/apps/devmx/src/scss/components/_fab.theme.scss b/apps/devmx/src/scss/components/_fab.theme.scss index 8f881805..de7301aa 100644 --- a/apps/devmx/src/scss/components/_fab.theme.scss +++ b/apps/devmx/src/scss/components/_fab.theme.scss @@ -44,17 +44,20 @@ } } - .mat-mdc-fab.primary-fab { + .mat-mdc-fab.primary-fab, + .mat-mdc-mini-fab.primary-fab { background-color: mat.get-theme-color($theme, primary-container); color: mat.get-theme-color($theme, on-primary-container); } - .mat-mdc-fab.secondary-fab { + .mat-mdc-fab.secondary-fab, + .mat-mdc-mini-fab.secondary-fab { background-color: mat.get-theme-color($theme, secondary-container); color: mat.get-theme-color($theme, on-secondary-container); } - .mat-mdc-fab.tertiary-fab { + .mat-mdc-fab.tertiary-fab, + .mat-mdc-mini-fab.tertiary-fab { background-color: mat.get-theme-color($theme, tertiary, 50); color: mat.get-theme-color($theme, on-tertiary); } diff --git a/packages/academy/data-access/src/lib/academy.providers.ts b/packages/academy/data-access/src/lib/academy.providers.ts index c19fe37d..1af45087 100644 --- a/packages/academy/data-access/src/lib/academy.providers.ts +++ b/packages/academy/data-access/src/lib/academy.providers.ts @@ -1,5 +1,5 @@ -import { provideFacades, provideServices, provideUseCases } from './providers'; +import { provideCourse, provideInstitution, provideSubject } from './providers'; export function provideAcademy() { - return [...provideServices(), ...provideUseCases(), ...provideFacades()]; + return [...provideSubject(), ...provideInstitution(), ...provideCourse()]; } diff --git a/packages/academy/data-access/src/lib/providers/course.ts b/packages/academy/data-access/src/lib/providers/course.ts new file mode 100644 index 00000000..0bdc5f8c --- /dev/null +++ b/packages/academy/data-access/src/lib/providers/course.ts @@ -0,0 +1,23 @@ +import { provideCourseHttpService } from '../infrastructure'; +import { provideCourseFacade } from '../application'; +import { + provideFindCoursesUseCase, + provideCreateCourseUseCase, + provideDeleteCourseUseCase, + provideUpdateCourseUseCase, + provideFindCourseByIDUseCase, +} from '@devmx/academy-domain/client'; + +export function provideCourse() { + return [ + provideCourseHttpService(), + + provideCreateCourseUseCase(), + provideFindCoursesUseCase(), + provideFindCourseByIDUseCase(), + provideUpdateCourseUseCase(), + provideDeleteCourseUseCase(), + + provideCourseFacade(), + ]; +} diff --git a/packages/academy/data-access/src/lib/providers/index.ts b/packages/academy/data-access/src/lib/providers/index.ts index 7134c954..cb0d74fa 100644 --- a/packages/academy/data-access/src/lib/providers/index.ts +++ b/packages/academy/data-access/src/lib/providers/index.ts @@ -1,3 +1,6 @@ -export * from './facades'; -export * from './services'; -export * from './use-cases'; +export * from './course'; +export * from './facades'; +export * from './nistitution'; +export * from './services'; +export * from './subject'; +export * from './use-cases'; diff --git a/packages/academy/data-access/src/lib/providers/nistitution.ts b/packages/academy/data-access/src/lib/providers/nistitution.ts new file mode 100644 index 00000000..3005973e --- /dev/null +++ b/packages/academy/data-access/src/lib/providers/nistitution.ts @@ -0,0 +1,23 @@ +import { provideInstitutionHttpService } from '../infrastructure'; +import { provideInstitutionFacade } from '../application'; +import { + provideFindInstitutionsUseCase, + provideCreateInstitutionUseCase, + provideDeleteInstitutionUseCase, + provideUpdateInstitutionUseCase, + provideFindInstitutionByIDUseCase, +} from '@devmx/academy-domain/client'; + +export function provideInstitution() { + return [ + provideInstitutionHttpService(), + + provideCreateInstitutionUseCase(), + provideFindInstitutionsUseCase(), + provideFindInstitutionByIDUseCase(), + provideUpdateInstitutionUseCase(), + provideDeleteInstitutionUseCase(), + + provideInstitutionFacade(), + ]; +} diff --git a/packages/academy/data-access/src/lib/providers/subject.ts b/packages/academy/data-access/src/lib/providers/subject.ts new file mode 100644 index 00000000..94099501 --- /dev/null +++ b/packages/academy/data-access/src/lib/providers/subject.ts @@ -0,0 +1,23 @@ +import { provideSubjectHttpService } from '../infrastructure'; +import { provideSubjectFacade } from '../application'; +import { + provideFindSubjectsUseCase, + provideCreateSubjectUseCase, + provideDeleteSubjectUseCase, + provideUpdateSubjectUseCase, + provideFindSubjectByIDUseCase, +} from '@devmx/academy-domain/client'; + +export function provideSubject() { + return [ + provideSubjectHttpService(), + + provideCreateSubjectUseCase(), + provideFindSubjectsUseCase(), + provideFindSubjectByIDUseCase(), + provideUpdateSubjectUseCase(), + provideDeleteSubjectUseCase(), + + provideSubjectFacade(), + ]; +} diff --git a/packages/academy/domain/package.json b/packages/academy/domain/package.json index d4bd0cd4..335a6d74 100644 --- a/packages/academy/domain/package.json +++ b/packages/academy/domain/package.json @@ -3,7 +3,8 @@ "version": "0.0.1", "dependencies": { "tslib": "^2.3.0", - "@devmx/shared-api-interfaces": "0.0.1" + "@devmx/shared-api-interfaces": "0.0.1", + "@devmx/shared-util-data": "0.0.1" }, "type": "commonjs", "main": "./src/index.js", diff --git a/packages/academy/domain/src/client/use-cases/create-course.ts b/packages/academy/domain/src/client/use-cases/create-course.ts index db3cb5cd..e0e71d86 100644 --- a/packages/academy/domain/src/client/use-cases/create-course.ts +++ b/packages/academy/domain/src/client/use-cases/create-course.ts @@ -1,5 +1,6 @@ -import { CourseService } from '../services'; import { UseCase, Course, EditableCourse } from '@devmx/shared-api-interfaces'; +import { createUseCaseProvider } from '@devmx/shared-util-data/client'; +import { CourseService } from '../services'; export class CreateCourseUseCase implements UseCase { constructor(private courseService: CourseService) {} @@ -8,3 +9,7 @@ export class CreateCourseUseCase implements UseCase { return this.courseService.create(data); } } + +export function provideCreateCourseUseCase() { + return createUseCaseProvider(CreateCourseUseCase, [CourseService]); +} diff --git a/packages/academy/domain/src/client/use-cases/create-institution.ts b/packages/academy/domain/src/client/use-cases/create-institution.ts index 19a15299..85499ba1 100644 --- a/packages/academy/domain/src/client/use-cases/create-institution.ts +++ b/packages/academy/domain/src/client/use-cases/create-institution.ts @@ -1,3 +1,4 @@ +import { createUseCaseProvider } from '@devmx/shared-util-data/client'; import { InstitutionService } from '../services'; import { UseCase, @@ -14,3 +15,7 @@ export class CreateInstitutionUseCase return this.institutionService.create(data); } } + +export function provideCreateInstitutionUseCase() { + return createUseCaseProvider(CreateInstitutionUseCase, [InstitutionService]); +} diff --git a/packages/academy/domain/src/client/use-cases/create-subject.ts b/packages/academy/domain/src/client/use-cases/create-subject.ts index 60890f94..3178336a 100644 --- a/packages/academy/domain/src/client/use-cases/create-subject.ts +++ b/packages/academy/domain/src/client/use-cases/create-subject.ts @@ -1,3 +1,4 @@ +import { createUseCaseProvider } from '@devmx/shared-util-data/client'; import { SubjectService } from '../services'; import { UseCase, @@ -12,3 +13,7 @@ export class CreateSubjectUseCase implements UseCase { return this.subjectService.create(data); } } + +export function provideCreateSubjectUseCase() { + return createUseCaseProvider(CreateSubjectUseCase, [SubjectService]); +} diff --git a/packages/academy/domain/src/client/use-cases/delete-course.ts b/packages/academy/domain/src/client/use-cases/delete-course.ts index cf8817d8..ce7870fe 100644 --- a/packages/academy/domain/src/client/use-cases/delete-course.ts +++ b/packages/academy/domain/src/client/use-cases/delete-course.ts @@ -1,3 +1,4 @@ +import { createUseCaseProvider } from '@devmx/shared-util-data/client'; import { Course, UseCase } from '@devmx/shared-api-interfaces'; import { CourseService } from '../services'; @@ -8,3 +9,7 @@ export class DeleteCourseUseCase implements UseCase { return this.courseService.delete(id); } } + +export function provideDeleteCourseUseCase() { + return createUseCaseProvider(DeleteCourseUseCase, [CourseService]); +} diff --git a/packages/academy/domain/src/client/use-cases/delete-institution.ts b/packages/academy/domain/src/client/use-cases/delete-institution.ts index 8c6bad9e..0782450e 100644 --- a/packages/academy/domain/src/client/use-cases/delete-institution.ts +++ b/packages/academy/domain/src/client/use-cases/delete-institution.ts @@ -1,3 +1,4 @@ +import { createUseCaseProvider } from '@devmx/shared-util-data/client'; import { Institution, UseCase } from '@devmx/shared-api-interfaces'; import { InstitutionService } from '../services'; @@ -10,3 +11,7 @@ export class DeleteInstitutionUseCase return this.institutionService.delete(id); } } + +export function provideDeleteInstitutionUseCase() { + return createUseCaseProvider(DeleteInstitutionUseCase, [InstitutionService]); +} diff --git a/packages/academy/domain/src/client/use-cases/delete-subject.ts b/packages/academy/domain/src/client/use-cases/delete-subject.ts index 596eda2c..8af0a6da 100644 --- a/packages/academy/domain/src/client/use-cases/delete-subject.ts +++ b/packages/academy/domain/src/client/use-cases/delete-subject.ts @@ -1,3 +1,4 @@ +import { createUseCaseProvider } from '@devmx/shared-util-data/client'; import { Subject, UseCase } from '@devmx/shared-api-interfaces'; import { SubjectService } from '../services'; @@ -8,3 +9,7 @@ export class DeleteSubjectUseCase implements UseCase { return this.subjectService.delete(id); } } + +export function provideDeleteSubjectUseCase() { + return createUseCaseProvider(DeleteSubjectUseCase, [SubjectService]); +} diff --git a/packages/academy/domain/src/client/use-cases/find-course-by-id.ts b/packages/academy/domain/src/client/use-cases/find-course-by-id.ts index 5ca18920..2264b0bd 100644 --- a/packages/academy/domain/src/client/use-cases/find-course-by-id.ts +++ b/packages/academy/domain/src/client/use-cases/find-course-by-id.ts @@ -1,3 +1,4 @@ +import { createUseCaseProvider } from '@devmx/shared-util-data/client'; import { Course, UseCase } from '@devmx/shared-api-interfaces'; import { CourseService } from '../services'; @@ -8,3 +9,7 @@ export class FindCourseByIDUseCase implements UseCase { return this.courseService.findOne(id); } } + +export function provideFindCourseByIDUseCase() { + return createUseCaseProvider(FindCourseByIDUseCase, [CourseService]); +} diff --git a/packages/academy/domain/src/client/use-cases/find-courses.ts b/packages/academy/domain/src/client/use-cases/find-courses.ts index 5d5a7667..e023cb78 100644 --- a/packages/academy/domain/src/client/use-cases/find-courses.ts +++ b/packages/academy/domain/src/client/use-cases/find-courses.ts @@ -1,3 +1,4 @@ +import { createUseCaseProvider } from '@devmx/shared-util-data/client'; import { CourseService } from '../services'; import { Page, @@ -15,3 +16,7 @@ export class FindCoursesUseCase return this.courseService.find(params); } } + +export function provideFindCoursesUseCase() { + return createUseCaseProvider(FindCoursesUseCase, [CourseService]); +} diff --git a/packages/academy/domain/src/client/use-cases/find-institution-by-id.ts b/packages/academy/domain/src/client/use-cases/find-institution-by-id.ts index 265f1d50..8be533f5 100644 --- a/packages/academy/domain/src/client/use-cases/find-institution-by-id.ts +++ b/packages/academy/domain/src/client/use-cases/find-institution-by-id.ts @@ -1,3 +1,4 @@ +import { createUseCaseProvider } from '@devmx/shared-util-data/client'; import { Institution, UseCase } from '@devmx/shared-api-interfaces'; import { InstitutionService } from '../services'; @@ -10,3 +11,9 @@ export class FindInstitutionByIDUseCase return this.institutionService.findOne(id); } } + +export function provideFindInstitutionByIDUseCase() { + return createUseCaseProvider(FindInstitutionByIDUseCase, [ + InstitutionService, + ]); +} diff --git a/packages/academy/domain/src/client/use-cases/find-institutions.ts b/packages/academy/domain/src/client/use-cases/find-institutions.ts index 458e6285..ba62699c 100644 --- a/packages/academy/domain/src/client/use-cases/find-institutions.ts +++ b/packages/academy/domain/src/client/use-cases/find-institutions.ts @@ -1,3 +1,4 @@ +import { createUseCaseProvider } from '@devmx/shared-util-data/client'; import { InstitutionService } from '../services'; import { Page, @@ -15,3 +16,7 @@ export class FindInstitutionsUseCase return this.institutionService.find(params); } } + +export function provideFindInstitutionsUseCase() { + return createUseCaseProvider(FindInstitutionsUseCase, [InstitutionService]); +} diff --git a/packages/academy/domain/src/client/use-cases/find-subject-by-id.ts b/packages/academy/domain/src/client/use-cases/find-subject-by-id.ts index acc6758d..5da8e13f 100644 --- a/packages/academy/domain/src/client/use-cases/find-subject-by-id.ts +++ b/packages/academy/domain/src/client/use-cases/find-subject-by-id.ts @@ -1,3 +1,4 @@ +import { createUseCaseProvider } from '@devmx/shared-util-data/client'; import { Subject, UseCase } from '@devmx/shared-api-interfaces'; import { SubjectService } from '../services'; @@ -8,3 +9,7 @@ export class FindSubjectByIDUseCase implements UseCase { return this.subjectService.findOne(id); } } + +export function provideFindSubjectByIDUseCase() { + return createUseCaseProvider(FindSubjectByIDUseCase, [SubjectService]); +} diff --git a/packages/academy/domain/src/client/use-cases/find-subjects.ts b/packages/academy/domain/src/client/use-cases/find-subjects.ts index ab7495af..148bf075 100644 --- a/packages/academy/domain/src/client/use-cases/find-subjects.ts +++ b/packages/academy/domain/src/client/use-cases/find-subjects.ts @@ -1,3 +1,4 @@ +import { createUseCaseProvider } from '@devmx/shared-util-data/client'; import { SubjectService } from '../services'; import { Page, @@ -15,3 +16,7 @@ export class FindSubjectsUseCase return this.subjectService.find(params); } } + +export function provideFindSubjectsUseCase() { + return createUseCaseProvider(FindSubjectsUseCase, [SubjectService]); +} diff --git a/packages/academy/domain/src/client/use-cases/update-course.ts b/packages/academy/domain/src/client/use-cases/update-course.ts index f4ab8f79..87dec239 100644 --- a/packages/academy/domain/src/client/use-cases/update-course.ts +++ b/packages/academy/domain/src/client/use-cases/update-course.ts @@ -1,4 +1,5 @@ import { UseCase, Course, EditableCourse } from '@devmx/shared-api-interfaces'; +import { createUseCaseProvider } from '@devmx/shared-util-data/client'; import { CourseService } from '../services'; export class UpdateCourseUseCase implements UseCase { @@ -8,3 +9,7 @@ export class UpdateCourseUseCase implements UseCase { return this.courseService.update(data.id, data); } } + +export function provideUpdateCourseUseCase() { + return createUseCaseProvider(UpdateCourseUseCase, [CourseService]); +} diff --git a/packages/academy/domain/src/client/use-cases/update-institution.ts b/packages/academy/domain/src/client/use-cases/update-institution.ts index 5d071e71..4bbaf9ca 100644 --- a/packages/academy/domain/src/client/use-cases/update-institution.ts +++ b/packages/academy/domain/src/client/use-cases/update-institution.ts @@ -1,3 +1,4 @@ +import { createUseCaseProvider } from '@devmx/shared-util-data/client'; import { InstitutionService } from '../services'; import { UseCase, @@ -14,3 +15,7 @@ export class UpdateInstitutionUseCase return this.institutionService.update(data.id, data); } } + +export function provideUpdateInstitutionUseCase() { + return createUseCaseProvider(UpdateInstitutionUseCase, [InstitutionService]); +} diff --git a/packages/academy/domain/src/client/use-cases/update-subject.ts b/packages/academy/domain/src/client/use-cases/update-subject.ts index 76d46bb8..b0b1a574 100644 --- a/packages/academy/domain/src/client/use-cases/update-subject.ts +++ b/packages/academy/domain/src/client/use-cases/update-subject.ts @@ -1,3 +1,4 @@ +import { createUseCaseProvider } from '@devmx/shared-util-data/client'; import { SubjectService } from '../services'; import { UseCase, @@ -12,3 +13,7 @@ export class UpdateSubjectUseCase implements UseCase { return this.subjectService.update(data.id, data); } } + +export function provideUpdateSubjectUseCase() { + return createUseCaseProvider(UpdateSubjectUseCase, [SubjectService]); +} diff --git a/packages/account/feature-about/src/lib/account-feature-about.routes.ts b/packages/account/feature-about/src/lib/account-feature-about.routes.ts index b1391547..2d342871 100644 --- a/packages/account/feature-about/src/lib/account-feature-about.routes.ts +++ b/packages/account/feature-about/src/lib/account-feature-about.routes.ts @@ -1,7 +1,6 @@ import { AccountFeatureAboutComponent } from './account-feature-about.component'; import { accountFeatureAboutProviders } from './account-feature-about.providers'; import { aboutUserResolver, aboutUserSchemaResolver } from './resolvers'; -import { User } from '@devmx/shared-api-interfaces'; import { AboutUserContainer } from './containers'; import { Route } from '@angular/router'; @@ -17,11 +16,6 @@ export const accountFeatureAboutRoutes: Route[] = [ children: [ { path: '', - data: { - breadcrumb: (data: { user: User }) => { - return data.user.displayName; - }, - }, title: 'Sobre um usuário', resolve: { about: aboutUserResolver }, component: AboutUserContainer, diff --git a/packages/account/feature-about/src/lib/components/index.ts b/packages/account/feature-about/src/lib/components/index.ts new file mode 100644 index 00000000..bb695b28 --- /dev/null +++ b/packages/account/feature-about/src/lib/components/index.ts @@ -0,0 +1,3 @@ +export * from './user-presentations/user-presentations.component'; +export * from './user-events/user-events.component'; +export * from './user-skills/user-skills.component'; diff --git a/packages/account/feature-about/src/lib/components/user-events/user-events.component.scss b/packages/account/feature-about/src/lib/components/user-events/user-events.component.scss new file mode 100644 index 00000000..852676e7 --- /dev/null +++ b/packages/account/feature-about/src/lib/components/user-events/user-events.component.scss @@ -0,0 +1,32 @@ +:host { + display: flex; + flex-direction: column; + + ul { + gap: 8px; + margin: 0; + padding: 0; + display: flex; + flex-direction: column; + list-style-type: none; + + li { + gap: 8px; + display: flex; + list-style-type: none; + align-items: center; + + &::before { + content: ''; + display: flex; + width: 18px; + min-height: 18px; + background-image: url('data:image/svg+xml,%3Csvg%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M16.7365%207L7.25643%2016.7233C6.89674%2017.0922%206.31358%2017.0922%205.95389%2016.7233L2%2012.668M12.5199%2016.7233L22%207%22%20stroke=%22currentColor%22%20stroke-width=%222%22%20stroke-linecap=%22round%22/%3E%3C/svg%3E'); + background-size: 18px; + background-position: center; + background-repeat: no-repeat; + align-items: center; + } + } + } +} diff --git a/packages/account/feature-about/src/lib/components/user-events/user-events.component.ts b/packages/account/feature-about/src/lib/components/user-events/user-events.component.ts new file mode 100644 index 00000000..81f4f1ec --- /dev/null +++ b/packages/account/feature-about/src/lib/components/user-events/user-events.component.ts @@ -0,0 +1,18 @@ +import { ChangeDetectionStrategy, Component, input } from '@angular/core'; +import { Event } from '@devmx/shared-api-interfaces'; + +@Component({ + selector: 'devmx-user-events', + template: ` +
    + @for (item of data(); track item.id) { +
  • {{ item.title }}
  • + } +
+ `, + styleUrl: './user-events.component.scss', + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class UserEventsComponent { + data = input.required(); +} diff --git a/packages/account/feature-about/src/lib/components/user-presentations/user-presentations.component.scss b/packages/account/feature-about/src/lib/components/user-presentations/user-presentations.component.scss new file mode 100644 index 00000000..759d3f99 --- /dev/null +++ b/packages/account/feature-about/src/lib/components/user-presentations/user-presentations.component.scss @@ -0,0 +1,32 @@ +:host { + display: flex; + flex-direction: column; + + ul { + gap: 8px; + margin: 0; + padding: 0; + display: flex; + flex-direction: column; + list-style-type: none; + + li { + gap: 8px; + display: flex; + list-style-type: none; + align-items: center; + + &::before { + content: ''; + display: flex; + width: 18px; + min-height: 18px; + background-image: url('data:image/svg+xml,%3Csvg%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M18%204L14%2020M10%204L6%2020M5%208H21M3%2016H19%22%20stroke=%22currentColor%22%20stroke-width=%222%22%20stroke-linecap=%22round%22/%3E%3C/svg%3E'); + background-size: 18px; + background-position: center; + background-repeat: no-repeat; + align-items: center; + } + } + } +} diff --git a/packages/account/feature-about/src/lib/components/user-presentations/user-presentations.component.ts b/packages/account/feature-about/src/lib/components/user-presentations/user-presentations.component.ts new file mode 100644 index 00000000..e434f63b --- /dev/null +++ b/packages/account/feature-about/src/lib/components/user-presentations/user-presentations.component.ts @@ -0,0 +1,18 @@ +import { ChangeDetectionStrategy, Component, input } from '@angular/core'; +import { Presentation } from '@devmx/shared-api-interfaces'; + +@Component({ + selector: 'devmx-user-presentations', + template: ` +
    + @for (item of data(); track item.id) { +
  • {{ item.title }}
  • + } +
+ `, + styleUrl: './user-presentations.component.scss', + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class UserPresentationsComponent { + data = input.required(); +} diff --git a/packages/account/feature-about/src/lib/components/user-skills/user-skills.component.html b/packages/account/feature-about/src/lib/components/user-skills/user-skills.component.html new file mode 100644 index 00000000..29a13c1a --- /dev/null +++ b/packages/account/feature-about/src/lib/components/user-skills/user-skills.component.html @@ -0,0 +1,7 @@ +
    + @for (item of data(); track item.skill.id) { +
  • + {{ item.skill.name }} +
  • + } +
diff --git a/packages/account/feature-about/src/lib/components/user-skills/user-skills.component.scss b/packages/account/feature-about/src/lib/components/user-skills/user-skills.component.scss new file mode 100644 index 00000000..719eb838 --- /dev/null +++ b/packages/account/feature-about/src/lib/components/user-skills/user-skills.component.scss @@ -0,0 +1,32 @@ +:host { + display: flex; + flex-direction: column; + + ul { + gap: 8px; + margin: 0; + padding: 0; + display: flex; + flex-direction: column; + list-style-type: none; + + li { + gap: 8px; + display: flex; + list-style-type: none; + align-items: center; + + &::before { + content: ''; + display: flex; + width: 18px; + min-height: 18px; + background-image: url('data:image/svg+xml,%3Csvg%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M20%207L9.35355%2017.6464C9.15829%2017.8417%208.84171%2017.8417%208.64645%2017.6464L4%2013%22%20stroke=%22currentColor%22%20stroke-width=%222%22%20stroke-linecap=%22round%22/%3E%3C/svg%3E'); + background-size: 18px; + background-position: center; + background-repeat: no-repeat; + align-items: center; + } + } + } +} diff --git a/packages/account/feature-about/src/lib/components/user-skills/user-skills.component.ts b/packages/account/feature-about/src/lib/components/user-skills/user-skills.component.ts new file mode 100644 index 00000000..65b6f4b1 --- /dev/null +++ b/packages/account/feature-about/src/lib/components/user-skills/user-skills.component.ts @@ -0,0 +1,12 @@ +import { ChangeDetectionStrategy, Component, input } from '@angular/core'; +import { UserSkill } from '@devmx/shared-api-interfaces'; + +@Component({ + selector: 'devmx-user-skills', + templateUrl: './user-skills.component.html', + styleUrl: './user-skills.component.scss', + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class UserSkillsComponent { + data = input.required(); +} diff --git a/packages/account/feature-about/src/lib/containers/about-user/about-user.container.html b/packages/account/feature-about/src/lib/containers/about-user/about-user.container.html index 40fd6e79..2b13dd70 100644 --- a/packages/account/feature-about/src/lib/containers/about-user/about-user.container.html +++ b/packages/account/feature-about/src/lib/containers/about-user/about-user.container.html @@ -1,85 +1,98 @@ @if (user$ | async; as user) { + + + +@if (authFacade.auth$ | async; as auth) { + + @if (auth.id === user.id) { +
+ +
+ + } +
+} +

{{user.displayName}}

-

{{'@' + user.name}}

-
- @if (user.contact.email && user.visibility?.email) { -

+ @if (user.visibility?.email || user.visibility?.phone) { + +

+ + + }
-@if (user.visibility?.roles) { -
- - @for (role of user.roles | keyvalue; track role) { - - @if (role.value) { - {{role.key | role}} - } - +
+ @if (user.profile) { + +
+ @if (user.profile.minibio) { + } - -
-} + -
- @if (user.profile && user.profile.minibio) { - - - - - } + - @if (user.skills?.length && user.visibility?.skills) { - - -
    - @for (item of user.skills; track item.skill.id) { -
  1. -

    {{item.skill.name}}

    - -
  2. - } -
-
-
- } -
- + @if (user.visibility) { -
- @if (user.visibility?.events) { - - @if (eventFacade.response$ | async; as response) { - - } - - } +
+ + + @if (user.visibility.events) { + +
+ @if (eventFacade.response$ | async; as response) { +

Eventos organizados

+ + } +
+ + } + + + @if (user.visibility.presentations) { +
+ @if (presentationFacade.response$ | async; as response) { +

Apresentações

+ + } +
+ } + + + } + } diff --git a/packages/account/feature-about/src/lib/containers/about-user/about-user.container.scss b/packages/account/feature-about/src/lib/containers/about-user/about-user.container.scss index 112528d0..36c17b87 100644 --- a/packages/account/feature-about/src/lib/containers/about-user/about-user.container.scss +++ b/packages/account/feature-about/src/lib/containers/about-user/about-user.container.scss @@ -1,32 +1,105 @@ :host { flex: 1; - gap: 1em; + gap: 2em; padding: 1em; + position: relative; display: flex; flex-direction: column; background-color: white; - & > section { - gap: 1em; - display: grid; - grid-auto-flow: dense; + // width: calc(1280px - 2em); - grid-template-columns: repeat(2, 1fr); + @media print { + max-width: 822px; + width: 100vw; + padding: 0; + } + + menu { + margin: 0; + padding: 0; + top: 16px; + right: 16px; + position: absolute; + display: flex; + gap: 8px; + + @media print { + display: none; + } + } + + > header { + h2 { + font-size: 200%; + } + + > nav { + gap: 2em; + display: flex; + flex-flow: row wrap; + + & > a { + gap: 0.4em; + display: flex; + align-items: center; - @media (max-width: 1278px) { - grid-template-columns: repeat(1, 1fr); + &:link:not(.mdc-button):not(.mdc-icon-button):not(.mdc-fab) { + color: #1e1e1e; + } + + &:hover { + text-decoration: underline; + } + } } } - .user-contact { - gap: 2em; + > main { + flex: 1; + gap: 4em; display: flex; - flex-flow: row wrap; + flex-direction: row; + justify-content: space-between; - p { - gap: 0.4em; + @media print { + width: 100%; + } + + .user-card { + width: 100%; + } + + article { + flex: 1; display: flex; - align-items: center; + flex-direction: column; + + @media print { + flex: 2; + min-width: 480px; + } + } + + aside { + gap: 1em; + display: flex; + flex-direction: column; + width: 24em; + + h3 { + margin: 0; + opacity: 0.6; + font-size: 120%; + } + + ul { + padding: 0; + } + + section { + + } } } @@ -42,6 +115,73 @@ } } -::ng-deep ol li .mdc-linear-progress .mdc-linear-progress__bar-inner { - border-color: #3bce53; +::ng-deep :root .mat-typography article { + h1, + h2, + h3, + h4, + h5, + h6 { + font-weight: 600; + margin: 1em 0 0; + } + + h1 { + font-size: 1.7em; + } + h2 { + font-size: 1.6em; + } + h3 { + font-size: 1.5em; + } + h4 { + font-size: 1.4em; + } + h5 { + font-size: 1.3em; + } + h6 { + font-size: 1.2em; + } + + p { + padding: 1em 0 0; + } + + ul + p { + margin-top: 1em; + } + + .markdown-view { + h1, + h2, + h3, + h4, + h5, + h6 { + &:first-child { + margin-top: 0; + } + } + } +} + +::ng-deep { + @media print { + :root body .app-shell-container { + > .sidenav-content { + max-height: unset !important; + } + + .app-shell-scroll-wrapper { + height: unset; + overflow: visible; + + .app-shell-content { + max-height: 100% !important; + } + } + } + } } diff --git a/packages/account/feature-about/src/lib/containers/about-user/about-user.container.ts b/packages/account/feature-about/src/lib/containers/about-user/about-user.container.ts index b0f4eaf1..26116906 100644 --- a/packages/account/feature-about/src/lib/containers/about-user/about-user.container.ts +++ b/packages/account/feature-about/src/lib/containers/about-user/about-user.container.ts @@ -1,21 +1,28 @@ -import { PresentationCardListComponent } from '@devmx/presentation-ui-shared'; -import { ChangeDetectionStrategy, Component, inject } from '@angular/core'; +import { MarkdownViewComponent } from '@devmx/shared-ui-global/markdown'; import { MatProgressBarModule } from '@angular/material/progress-bar'; +import { MatSlideToggleModule } from '@angular/material/slide-toggle'; import { PresentationFacade } from '@devmx/presentation-data-access'; -import { MarkdownViewComponent } from '@devmx/shared-ui-global/markdown'; import { AuthenticationFacade } from '@devmx/account-data-access'; -import { EventCardListComponent } from '@devmx/event-ui-shared'; import { IconComponent } from '@devmx/shared-ui-global/icon'; -import { AsyncPipe, KeyValuePipe } from '@angular/common'; +import { MatButtonModule } from '@angular/material/button'; import { markdownToText } from '@devmx/shared-util-data'; import { EventFacade } from '@devmx/event-data-access'; -import { MatCardModule } from '@angular/material/card'; import { Graph } from '@devmx/shared-ui-global/graph'; import { User } from '@devmx/shared-api-interfaces'; import { ActivatedRoute } from '@angular/router'; +import { AsyncPipe } from '@angular/common'; import { filter, map, take } from 'rxjs'; -import { MatChipsModule } from '@angular/material/chips'; -import { RolePipe } from '@devmx/account-ui-shared'; +import { + UserEventsComponent, + UserPresentationsComponent, + UserSkillsComponent, +} from '../../components'; +import { + inject, + computed, + Component, + ChangeDetectionStrategy, +} from '@angular/core'; @Component({ selector: 'devmx-about-user', @@ -23,16 +30,15 @@ import { RolePipe } from '@devmx/account-ui-shared'; styleUrl: './about-user.container.scss', changeDetection: ChangeDetectionStrategy.OnPush, imports: [ - MatCardModule, MarkdownViewComponent, - PresentationCardListComponent, - EventCardListComponent, + UserPresentationsComponent, + MatSlideToggleModule, + UserSkillsComponent, + UserEventsComponent, MatProgressBarModule, - MatChipsModule, + MatButtonModule, IconComponent, - KeyValuePipe, AsyncPipe, - RolePipe, ], standalone: true, }) @@ -52,6 +58,10 @@ export class AboutUserContainer { map(({ about }) => about as User) ); + designMode = computed(() => { + return document.designMode === 'on'; + }); + constructor() { this.user$ .pipe( @@ -60,6 +70,8 @@ export class AboutUserContainer { take(1) ) .subscribe((owner) => { + console.log('owner: ', owner); + const filter = { title: '', owner }; this.eventFacade.setFilter(filter); this.presentationFacade.setFilter(filter); @@ -69,6 +81,8 @@ export class AboutUserContainer { }); this.user$.pipe(take(1)).subscribe((user) => { + console.log('user: ', user); + this.graph.setImage({ title: `Perfil de ${user.displayName}`, description: markdownToText(user.profile?.minibio ?? ''), @@ -80,4 +94,14 @@ export class AboutUserContainer { }); }); } + + toggleDesignMode() { + const { designMode } = document; + const state = designMode === 'on' ? 'off' : 'on'; + document.designMode = state; + } + + print() { + window.print(); + } } diff --git a/packages/account/feature-shell/src/lib/containers/account/profile/profile.component.html b/packages/account/feature-shell/src/lib/containers/account/profile/profile.component.html index e0b49e47..544e777a 100644 --- a/packages/account/feature-shell/src/lib/containers/account/profile/profile.component.html +++ b/packages/account/feature-shell/src/lib/containers/account/profile/profile.component.html @@ -17,8 +17,8 @@ matInput [matDatepicker]="picker" formControlName="birthday" + (focus)="picker.open()" readonly - tabindex="-1" /> @for (item of form.skills.controls; track item.value; let index = $index) { + +
{{ item.value.skill?.name }} {{ item.value.weight }}% diff --git a/packages/account/feature-shell/src/lib/forms/user-profile.ts b/packages/account/feature-shell/src/lib/forms/user-profile.ts index c89e4ee1..ef715361 100644 --- a/packages/account/feature-shell/src/lib/forms/user-profile.ts +++ b/packages/account/feature-shell/src/lib/forms/user-profile.ts @@ -21,7 +21,7 @@ export class UserProfileForm extends FormGroup> { super({ minibio: new FormControl('', { nonNullable: true, - validators: [Validators.maxLength(1024)], + validators: [Validators.maxLength(102400)], }), birthday: new FormControl(), gender: new FormControl(), diff --git a/packages/account/feature-shell/src/lib/forms/user.spec.ts b/packages/account/feature-shell/src/lib/forms/user.spec.ts index 667bf003..706b7bbd 100644 --- a/packages/account/feature-shell/src/lib/forms/user.spec.ts +++ b/packages/account/feature-shell/src/lib/forms/user.spec.ts @@ -55,18 +55,18 @@ describe('UserRolesForm', () => { }); it('profile: should be invalid minibio', () => { - form.profile.patchValue({ minibio: '.'.repeat(1025) }); + form.profile.patchValue({ minibio: '.'.repeat(102401) }); expect(form.profile.valid).toBeFalsy(); }); it('profile: should be invalid minibio error', () => { - form.profile.patchValue({ minibio: '.'.repeat(1025) }); + form.profile.patchValue({ minibio: '.'.repeat(102401) }); expect(form.profile.controls.minibio?.errors).toStrictEqual({ maxlength: { - actualLength: 1025, - requiredLength: 1024, + actualLength: 102401, + requiredLength: 102400, }, }); }); diff --git a/packages/account/ui-shared/src/lib/components/index.ts b/packages/account/ui-shared/src/lib/components/index.ts index 49c2501b..7a426e6f 100644 --- a/packages/account/ui-shared/src/lib/components/index.ts +++ b/packages/account/ui-shared/src/lib/components/index.ts @@ -1,4 +1,5 @@ export * from './user-complete/user-complete.component'; +export * from './user-card-skills/user-card-skills.component'; export * from './code-field/code-field.component'; export * from './user-roles/user-roles.component'; export * from './user-card/user-card.component'; diff --git a/packages/account/ui-shared/src/lib/components/user-card-skills/user-card-skills.component.html b/packages/account/ui-shared/src/lib/components/user-card-skills/user-card-skills.component.html new file mode 100644 index 00000000..47929239 --- /dev/null +++ b/packages/account/ui-shared/src/lib/components/user-card-skills/user-card-skills.component.html @@ -0,0 +1,15 @@ + + + Habilidades + + + + @for (item of data(); track item.skill.id) { + + +
{{ item.skill.name }}
+ +
+ } +
+
diff --git a/packages/account/ui-shared/src/lib/components/user-card-skills/user-card-skills.component.scss b/packages/account/ui-shared/src/lib/components/user-card-skills/user-card-skills.component.scss new file mode 100644 index 00000000..4cef8a0c --- /dev/null +++ b/packages/account/ui-shared/src/lib/components/user-card-skills/user-card-skills.component.scss @@ -0,0 +1,4 @@ +:host { + display: flex; + flex-direction: column; +} diff --git a/packages/account/ui-shared/src/lib/components/user-card-skills/user-card-skills.component.ts b/packages/account/ui-shared/src/lib/components/user-card-skills/user-card-skills.component.ts new file mode 100644 index 00000000..58be1540 --- /dev/null +++ b/packages/account/ui-shared/src/lib/components/user-card-skills/user-card-skills.component.ts @@ -0,0 +1,18 @@ +import { ChangeDetectionStrategy, Component, input } from '@angular/core'; +import { MatProgressBarModule } from '@angular/material/progress-bar'; +import { IconComponent } from '@devmx/shared-ui-global/icon'; +import { UserSkill } from '@devmx/shared-api-interfaces'; +import { MatCardModule } from '@angular/material/card'; +import { MatListModule } from '@angular/material/list'; + +@Component({ + selector: 'devmx-user-card-skills', + templateUrl: './user-card-skills.component.html', + styleUrl: './user-card-skills.component.scss', + changeDetection: ChangeDetectionStrategy.OnPush, + imports: [MatCardModule, MatListModule, MatProgressBarModule, IconComponent], + standalone: true, +}) +export class UserCardSkillsComponent { + data = input([]); +} diff --git a/packages/shared/ui-global/markdown/src/lib/components/markdown-view/markdown-view.component.scss b/packages/shared/ui-global/markdown/src/lib/components/markdown-view/markdown-view.component.scss index 81823800..5c6b2830 100644 --- a/packages/shared/ui-global/markdown/src/lib/components/markdown-view/markdown-view.component.scss +++ b/packages/shared/ui-global/markdown/src/lib/components/markdown-view/markdown-view.component.scss @@ -5,11 +5,9 @@ } .markdown-view { - padding: 1em; gap: 0; ul { margin: 0; - padding: 0; li { margin: 0; padding: 0; diff --git a/packages/shared/ui-global/shell/src/lib/app-shell/app-shell.component.scss b/packages/shared/ui-global/shell/src/lib/app-shell/app-shell.component.scss index fb33226e..06cd119e 100644 --- a/packages/shared/ui-global/shell/src/lib/app-shell/app-shell.component.scss +++ b/packages/shared/ui-global/shell/src/lib/app-shell/app-shell.component.scss @@ -13,6 +13,7 @@ display: flex; flex-direction: column; max-height: 100vh; + align-items: center; } } @@ -27,6 +28,7 @@ margin: 1em; display: flex; flex-direction: column; + max-width: 1280px; // height: calc(100dvh - 64px); height: 100%; overflow: auto; diff --git a/packages/shared/util-data/project.json b/packages/shared/util-data/project.json index 061f95bf..404d7f93 100644 --- a/packages/shared/util-data/project.json +++ b/packages/shared/util-data/project.json @@ -12,7 +12,10 @@ "outputPath": "dist/packages/shared/util-data", "main": "packages/shared/util-data/src/index.ts", "tsConfig": "packages/shared/util-data/tsconfig.lib.json", - "assets": [] + "assets": [], + "additionalEntryPoints": [ + "packages/shared/util-data/src/client.ts" + ] } } } diff --git a/packages/shared/util-data/src/client.ts b/packages/shared/util-data/src/client.ts new file mode 100644 index 00000000..bdd02c04 --- /dev/null +++ b/packages/shared/util-data/src/client.ts @@ -0,0 +1 @@ +export * from './client/index' diff --git a/packages/shared/util-data/src/client/index.ts b/packages/shared/util-data/src/client/index.ts new file mode 100644 index 00000000..5f91c8d3 --- /dev/null +++ b/packages/shared/util-data/src/client/index.ts @@ -0,0 +1 @@ +export * from './providers'; diff --git a/packages/shared/util-data/src/client/providers/create-client-provider.ts b/packages/shared/util-data/src/client/providers/create-client-provider.ts new file mode 100644 index 00000000..c1c51f8e --- /dev/null +++ b/packages/shared/util-data/src/client/providers/create-client-provider.ts @@ -0,0 +1,18 @@ +import { + Type, + TypeConstructorParams, + AbstractConstructorParams, +} from '@devmx/shared-api-interfaces'; + +export function createClientProvider( + constructor: T, + dependencies: TypeConstructorParams | AbstractConstructorParams +) { + return { + provide: constructor, + useFactory(...params: ConstructorParameters) { + return new constructor(...params); + }, + deps: dependencies, + }; +} diff --git a/packages/shared/util-data/src/client/providers/create-facade-provider.ts b/packages/shared/util-data/src/client/providers/create-facade-provider.ts new file mode 100644 index 00000000..170bde0b --- /dev/null +++ b/packages/shared/util-data/src/client/providers/create-facade-provider.ts @@ -0,0 +1,20 @@ +import { + Type, + Abstract, + TypeConstructorParams, + AbstractConstructorParams, +} from '@devmx/shared-api-interfaces'; + +export function createFacadeProvider( + constructor: A, + implementation: T, + dependencies: TypeConstructorParams | AbstractConstructorParams +) { + return { + provide: constructor, + useFactory(...params: ConstructorParameters) { + return new implementation(...params); + }, + deps: dependencies, + }; +} diff --git a/packages/shared/util-data/src/client/providers/create-service-provder.ts b/packages/shared/util-data/src/client/providers/create-service-provder.ts new file mode 100644 index 00000000..642658b5 --- /dev/null +++ b/packages/shared/util-data/src/client/providers/create-service-provder.ts @@ -0,0 +1,20 @@ +import { + Type, + Abstract, + TypeConstructorParams, + AbstractConstructorParams, +} from '@devmx/shared-api-interfaces'; + +export function createServiceProvider( + constructor: A, + implementation: T, + dependencies: TypeConstructorParams | AbstractConstructorParams +) { + return { + provide: constructor, + useFactory(...params: ConstructorParameters) { + return new implementation(...params); + }, + deps: dependencies, + }; +} diff --git a/packages/shared/util-data/src/client/providers/create-use-case-provider.ts b/packages/shared/util-data/src/client/providers/create-use-case-provider.ts new file mode 100644 index 00000000..5a2feb45 --- /dev/null +++ b/packages/shared/util-data/src/client/providers/create-use-case-provider.ts @@ -0,0 +1,17 @@ +import { + Type, + UseCase, + AbstractConstructorParams, +} from '@devmx/shared-api-interfaces'; + +export function createUseCaseProvider< + T extends Type> +>(useCase: T, dependencies: AbstractConstructorParams) { + return { + provide: useCase, + useFactory(...params: ConstructorParameters) { + return new useCase(...params); + }, + deps: dependencies, + }; +} diff --git a/packages/shared/util-data/src/client/providers/index.ts b/packages/shared/util-data/src/client/providers/index.ts new file mode 100644 index 00000000..11fe6fdb --- /dev/null +++ b/packages/shared/util-data/src/client/providers/index.ts @@ -0,0 +1,4 @@ +export * from './create-client-provider'; +export * from './create-facade-provider'; +export * from './create-service-provder'; +export * from './create-use-case-provider'; diff --git a/tools/plugin/dx-dev/src/generators/entity/files/__scope__/data-access/src/lib/providers/__fileName__.ts.template b/tools/plugin/dx-dev/src/generators/entity/files/__scope__/data-access/src/lib/providers/__fileName__.ts.template new file mode 100644 index 00000000..c185db91 --- /dev/null +++ b/tools/plugin/dx-dev/src/generators/entity/files/__scope__/data-access/src/lib/providers/__fileName__.ts.template @@ -0,0 +1,23 @@ +import { provide<%= className %>HttpService } from '../infrastructure'; +import { provide<%= className %>Facade } from '../application'; +import { + provideFind<%= className %>sUseCase, + provideCreate<%= className %>UseCase, + provideDelete<%= className %>UseCase, + provideUpdate<%= className %>UseCase, + provideFind<%= className %>ByIDUseCase, +} from '@devmx/<%= scope %>-domain/client'; + +export function provide<%= className %>() { + return [ + provide<%= className %>HttpService(), + + provideCreate<%= className %>UseCase(), + provideFind<%= className %>sUseCase(), + provideFind<%= className %>ByIDUseCase(), + provideUpdate<%= className %>UseCase(), + provideDelete<%= className %>UseCase(), + + provide<%= className %>Facade(), + ]; +} diff --git a/tools/plugin/dx-dev/src/generators/entity/files/__scope__/domain/src/client/use-cases/create-__fileName__.ts.template b/tools/plugin/dx-dev/src/generators/entity/files/__scope__/domain/src/client/use-cases/create-__fileName__.ts.template index f046209b..45ae57f3 100644 --- a/tools/plugin/dx-dev/src/generators/entity/files/__scope__/domain/src/client/use-cases/create-__fileName__.ts.template +++ b/tools/plugin/dx-dev/src/generators/entity/files/__scope__/domain/src/client/use-cases/create-__fileName__.ts.template @@ -1,3 +1,4 @@ +import { createUseCaseProvider } from '@devmx/shared-util-data/client'; import { <%= className %>Service } from '../services'; import { UseCase, @@ -14,3 +15,7 @@ export class Create<%= className %>UseCase return this.<%= propertyName %>Service.create(data); } } + +export function provideCreate<%= className %>UseCase() { + return createUseCaseProvider(Create<%= className %>UseCase, [<%= className %>Service]); +} diff --git a/tools/plugin/dx-dev/src/generators/entity/files/__scope__/domain/src/client/use-cases/delete-__fileName__.ts.template b/tools/plugin/dx-dev/src/generators/entity/files/__scope__/domain/src/client/use-cases/delete-__fileName__.ts.template index 0a2dc57b..fdbc3bca 100644 --- a/tools/plugin/dx-dev/src/generators/entity/files/__scope__/domain/src/client/use-cases/delete-__fileName__.ts.template +++ b/tools/plugin/dx-dev/src/generators/entity/files/__scope__/domain/src/client/use-cases/delete-__fileName__.ts.template @@ -1,3 +1,4 @@ +import { createUseCaseProvider } from '@devmx/shared-util-data/client'; import { <%= className %>, UseCase } from '@devmx/shared-api-interfaces'; import { <%= className %>Service } from '../services'; @@ -8,3 +9,7 @@ export class Delete<%= className %>UseCase implements UseCaseService.delete(id); } } + +export function provideDelete<%= className %>UseCase() { + return createUseCaseProvider(Delete<%= className %>UseCase, [<%= className %>Service]); +} diff --git a/tools/plugin/dx-dev/src/generators/entity/files/__scope__/domain/src/client/use-cases/find-__fileNamePlural__.ts.template b/tools/plugin/dx-dev/src/generators/entity/files/__scope__/domain/src/client/use-cases/find-__fileNamePlural__.ts.template index 04ff65c2..d6517e7a 100644 --- a/tools/plugin/dx-dev/src/generators/entity/files/__scope__/domain/src/client/use-cases/find-__fileNamePlural__.ts.template +++ b/tools/plugin/dx-dev/src/generators/entity/files/__scope__/domain/src/client/use-cases/find-__fileNamePlural__.ts.template @@ -1,3 +1,4 @@ +import { createUseCaseProvider } from '@devmx/shared-util-data/client'; import { <%= className %>Service } from '../services'; import { Page, @@ -15,3 +16,7 @@ export class Find<%= classNamePlural %>UseCase return this.<%= propertyName %>Service.find(params); } } + +export function provideFind<%= classNamePlural %>UseCase() { + return createUseCaseProvider(Find<%= classNamePlural %>UseCase, [<%= className %>Service]); +} diff --git a/tools/plugin/dx-dev/src/generators/entity/files/__scope__/domain/src/client/use-cases/find-__fileName__-by-id.ts.template b/tools/plugin/dx-dev/src/generators/entity/files/__scope__/domain/src/client/use-cases/find-__fileName__-by-id.ts.template index d2f6c6f1..1562c800 100644 --- a/tools/plugin/dx-dev/src/generators/entity/files/__scope__/domain/src/client/use-cases/find-__fileName__-by-id.ts.template +++ b/tools/plugin/dx-dev/src/generators/entity/files/__scope__/domain/src/client/use-cases/find-__fileName__-by-id.ts.template @@ -1,3 +1,4 @@ +import { createUseCaseProvider } from '@devmx/shared-util-data/client'; import { <%= className %>, UseCase } from '@devmx/shared-api-interfaces'; import { <%= className %>Service } from '../services'; @@ -10,3 +11,7 @@ export class Find<%= className %>ByIDUseCase return this.<%= propertyName %>Service.findOne(id); } } + +export function provideFind<%= className %>ByIDUseCase() { + return createUseCaseProvider(Find<%= className %>ByIDUseCase, [<%= className %>Service]); +} diff --git a/tools/plugin/dx-dev/src/generators/entity/files/__scope__/domain/src/client/use-cases/update-__fileName__.ts.template b/tools/plugin/dx-dev/src/generators/entity/files/__scope__/domain/src/client/use-cases/update-__fileName__.ts.template index 0435385f..434c4be8 100644 --- a/tools/plugin/dx-dev/src/generators/entity/files/__scope__/domain/src/client/use-cases/update-__fileName__.ts.template +++ b/tools/plugin/dx-dev/src/generators/entity/files/__scope__/domain/src/client/use-cases/update-__fileName__.ts.template @@ -1,4 +1,5 @@ import { UseCase, <%= className %>, Editable<%= className %> } from '@devmx/shared-api-interfaces'; +import { createUseCaseProvider } from '@devmx/shared-util-data/client'; import { <%= className %>Service } from '../services'; export class Update<%= className %>UseCase implements UseCase, <%= className %>> { @@ -8,3 +9,7 @@ export class Update<%= className %>UseCase implements UseCaseService.update(data.id, data); } } + +export function provideUpdate<%= className %>UseCase() { + return createUseCaseProvider(Update<%= className %>UseCase, [<%= className %>Service]); +} diff --git a/tools/plugin/dx-dev/src/generators/entity/lib/add-file-to-barrel.ts b/tools/plugin/dx-dev/src/generators/entity/lib/add-file-to-barrel.ts index 6a77fdb7..663a67b7 100644 --- a/tools/plugin/dx-dev/src/generators/entity/lib/add-file-to-barrel.ts +++ b/tools/plugin/dx-dev/src/generators/entity/lib/add-file-to-barrel.ts @@ -5,7 +5,7 @@ export function addFileToBarrel(tree: Tree, path: string, file: string) { const currentContent = tree.read(path, 'utf-8'); - const updatedContent = `${currentContent}\nexport * from '${file}';\n`; + const updatedContent = `${currentContent}\nexport * from '${file}';`; tree.write(path, updatedContent); } diff --git a/tools/plugin/dx-dev/src/generators/entity/lib/build-barrel-paths.ts b/tools/plugin/dx-dev/src/generators/entity/lib/build-barrel-paths.ts index ce8af111..6d1ac646 100644 --- a/tools/plugin/dx-dev/src/generators/entity/lib/build-barrel-paths.ts +++ b/tools/plugin/dx-dev/src/generators/entity/lib/build-barrel-paths.ts @@ -18,6 +18,10 @@ export function buildBarrelPaths(scope: string, fileName: string): Barrel[] { path: `packages/${scope}/data-source/src/lib/application/index.ts`, file: `./${fileName}s.facade`, }, + { + path: `packages/${scope}/data-access/src/lib/providers/index.ts`, + file: `./${fileName}`, + }, { path: `packages/${scope}/data-source/src/lib/dtos/index.ts`, file: `./${fileName}`, diff --git a/tsconfig.base.json b/tsconfig.base.json index 93cfe39d..ff1d1032 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -259,6 +259,7 @@ "packages/shared/util-authn/src/types.ts" ], "@devmx/shared-util-data": ["packages/shared/util-data/src/index.ts"], + "@devmx/shared-util-data/client": ["packages/shared/util-data/src/client.ts"], "@devmx/shared-util-errors": ["packages/shared/util-errors/src/index.ts"] } }, From 7ed81ace34b62ba87c524d05c7cdc97196479b14 Mon Sep 17 00:00:00 2001 From: Gui Seek Date: Fri, 6 Dec 2024 00:34:15 -0300 Subject: [PATCH 2/2] chore: volta nx cloud --- nx.json | 1 + 1 file changed, 1 insertion(+) diff --git a/nx.json b/nx.json index cb497a1c..84f1473c 100644 --- a/nx.json +++ b/nx.json @@ -14,6 +14,7 @@ ], "sharedGlobals": ["{workspaceRoot}/.github/workflows/ci.yml"] }, + "nxCloudId": "66ed082b0f768c3e7a77e1a5", "plugins": [ { "plugin": "@nx/webpack/plugin",