diff --git a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/core/controller/UserController.java b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/core/controller/UserController.java index 9ebb7f6be..f9b344ee1 100644 --- a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/core/controller/UserController.java +++ b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/core/controller/UserController.java @@ -36,6 +36,11 @@ public ResponseEntity> getAll( return ResponseEntity.ok(users); } + @GetMapping(GET_ENABLED_USERS_COUNT) + public ResponseEntity getEnabledUsersCount() { + return ResponseEntity.ok(userService.getEnabledUsersCount()); + } + @GetMapping(GET_PENDING_USER_URI) @PreAuthorize("hasRole('ROLE_ADMIN')") public ResponseEntity> getAllPendingUsers( diff --git a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/core/domain/repository/UserRepository.java b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/core/domain/repository/UserRepository.java index 20521dd4a..2136c638f 100644 --- a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/core/domain/repository/UserRepository.java +++ b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/core/domain/repository/UserRepository.java @@ -18,4 +18,5 @@ public interface UserRepository extends JpaRepository { Page findAllByEnabledIsFalse(Pageable pageable); + Long countByEnabledTrue(); } diff --git a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/core/service/UserService.java b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/core/service/UserService.java index f05b40414..d144249eb 100644 --- a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/core/service/UserService.java +++ b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/core/service/UserService.java @@ -99,4 +99,8 @@ public UserDto updateUserRoles(final String username, final Set roles) return userMapper.toDto(userRepository.save(user)); } + + public Long getEnabledUsersCount() { + return userRepository.countByEnabledTrue(); + } } diff --git a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/core/utils/UserUris.java b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/core/utils/UserUris.java index 1b7db132a..d7b77df7a 100644 --- a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/core/utils/UserUris.java +++ b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/core/utils/UserUris.java @@ -10,4 +10,5 @@ public class UserUris { public static final String GET_PENDING_USER_URI = "/pending"; public static final String ENABLE_USER = "/{username}/enable"; public static final String UPDATE_USER_ROLES = "/{username}/roles"; + public static final String GET_ENABLED_USERS_COUNT = "/count"; } diff --git a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/job/jobposting/controller/JobPostingController.java b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/job/jobposting/controller/JobPostingController.java index 14cc07389..1c3833c4c 100644 --- a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/job/jobposting/controller/JobPostingController.java +++ b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/job/jobposting/controller/JobPostingController.java @@ -112,4 +112,9 @@ public ResponseEntity validateJob(@PathVariable final Long jobId) final JobPostingDto jobUpdate = jobPostingService.validateJob(jobId); return ResponseEntity.ok(jobUpdate); } + + @GetMapping(GET_ENABLED_COUNT) + public ResponseEntity getEnabledJobsCount() { + return ResponseEntity.ok(jobPostingService.getEnabledJobsCount()); + } } diff --git a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/job/jobposting/domain/repository/JobPostingRepository.java b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/job/jobposting/domain/repository/JobPostingRepository.java index 6aa516cc8..d2d4a29de 100644 --- a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/job/jobposting/domain/repository/JobPostingRepository.java +++ b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/job/jobposting/domain/repository/JobPostingRepository.java @@ -12,4 +12,6 @@ public interface JobPostingRepository extends JpaRepository findAllByValidIsFalse(Pageable pageable); Page findAllByArchiveFalseAndValidTrueOrderByCreatedAtDesc(Pageable pageable); + + Long countByValidTrue(); } diff --git a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/job/jobposting/service/JobPostingService.java b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/job/jobposting/service/JobPostingService.java index 583fb8668..2e5dab395 100644 --- a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/job/jobposting/service/JobPostingService.java +++ b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/job/jobposting/service/JobPostingService.java @@ -141,4 +141,8 @@ private JobPostingModel findById(final Long jobId) { return jobPostingRepository.findById(jobId) .orElseThrow(() -> new NotFoundException(String.format(JOB_NOT_FOUND_MESSAGE, jobId))); } + + public Long getEnabledJobsCount() { + return jobPostingRepository.countByValidTrue(); + } } diff --git a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/job/jobposting/utils/JobPostingUris.java b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/job/jobposting/utils/JobPostingUris.java index 086d99315..d8b85e073 100644 --- a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/job/jobposting/utils/JobPostingUris.java +++ b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/job/jobposting/utils/JobPostingUris.java @@ -17,4 +17,5 @@ public class JobPostingUris { public static final String VALIDATE_JOB_URI = "{jobId}/validate"; public static final String VALIDATED_JOBS = "/validated"; public static final String GET_LATEST_JOBS_URI = "/latest"; + public static final String GET_ENABLED_COUNT = "/count"; } diff --git a/frontend-implicaction/src/app/admin/admin.module.ts b/frontend-implicaction/src/app/admin/admin.module.ts index 33c3eb2d3..1d611af40 100644 --- a/frontend-implicaction/src/app/admin/admin.module.ts +++ b/frontend-implicaction/src/app/admin/admin.module.ts @@ -18,8 +18,10 @@ import {UserManagementWidgetComponent} from './widgets/user-management-wiget/use import {UserFragmentComponent} from './fragments/user-fragment/user-fragment.component'; import {SkeletonModule} from "primeng/skeleton"; import {DashboardFragmentComponent} from "./fragments/dashboard-fragment/dashboard-fragment.component"; -import {AdminOverviewWidgetComponent} from "./widgets/admin-overview-widget/admin-overview-widget.component"; +import {UserCounterWidgetComponent} from './widgets/user-counter-widget/user-counter-widget.component'; +import {CounterCardComponent} from './components/counter-card/counter-card.component'; import {PendingJobTableComponent} from "./components/users/pending-job-table/pending-job-table.component"; +import { JobCounterWidgetComponent } from './widgets/job-counter-widget/job-counter-widget.component'; @NgModule({ @@ -32,8 +34,10 @@ import {PendingJobTableComponent} from "./components/users/pending-job-table/pen UserManagementWidgetComponent, UserFragmentComponent, DashboardFragmentComponent, - AdminOverviewWidgetComponent, - PendingJobTableComponent + UserCounterWidgetComponent, + CounterCardComponent, + PendingJobTableComponent, + JobCounterWidgetComponent ], imports: [ CommonModule, diff --git a/frontend-implicaction/src/app/admin/components/counter-card/counter-card.component.html b/frontend-implicaction/src/app/admin/components/counter-card/counter-card.component.html new file mode 100644 index 000000000..c5ea0f30b --- /dev/null +++ b/frontend-implicaction/src/app/admin/components/counter-card/counter-card.component.html @@ -0,0 +1,16 @@ +
+ +
+ +
+
+ +
+
+

{{value ?? 0}}

+ {{title}} +
+
+
+ +
diff --git a/frontend-implicaction/src/app/admin/components/counter-card/counter-card.component.scss b/frontend-implicaction/src/app/admin/components/counter-card/counter-card.component.scss new file mode 100644 index 000000000..709a7fd64 --- /dev/null +++ b/frontend-implicaction/src/app/admin/components/counter-card/counter-card.component.scss @@ -0,0 +1,31 @@ +@import "src/assets/variables"; + +.card-icon { + font-size: 32px; + line-height: 0; + width: 64px; + height: 64px; + flex-shrink: 0; + flex-grow: 0; + background-color: $secondary; +} + +.card { + margin: 0 0 30px !important; + padding: 10px 0 !important; + + .card-body { + padding: 20px; + + .card-title { + margin: 0 0 8px; + padding: 20px 0 15px; + } + + h4 { + color: $primary; + font-size: 28px; + font-weight: 700; + } + } +} diff --git a/frontend-implicaction/src/app/admin/components/counter-card/counter-card.component.ts b/frontend-implicaction/src/app/admin/components/counter-card/counter-card.component.ts new file mode 100644 index 000000000..fd681759a --- /dev/null +++ b/frontend-implicaction/src/app/admin/components/counter-card/counter-card.component.ts @@ -0,0 +1,15 @@ +import {ChangeDetectionStrategy, Component, Input} from '@angular/core'; + +@Component({ + selector: 'app-counter-card', + templateUrl: './counter-card.component.html', + styleUrls: ['./counter-card.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class CounterCardComponent { + + @Input() title: string + @Input() icon: string; + @Input() value: number; + +} diff --git a/frontend-implicaction/src/app/admin/fragments/dashboard-fragment/dashboard-fragment.component.html b/frontend-implicaction/src/app/admin/fragments/dashboard-fragment/dashboard-fragment.component.html index 196a160e7..df7af988e 100644 --- a/frontend-implicaction/src/app/admin/fragments/dashboard-fragment/dashboard-fragment.component.html +++ b/frontend-implicaction/src/app/admin/fragments/dashboard-fragment/dashboard-fragment.component.html @@ -1,13 +1,19 @@ -
- -
+
+
+ +
+
+ +
- + + +
@@ -21,4 +27,3 @@
Nouveaux groupes
- diff --git a/frontend-implicaction/src/app/admin/widgets/admin-overview-widget/admin-overview-widget.component.html b/frontend-implicaction/src/app/admin/widgets/admin-overview-widget/admin-overview-widget.component.html deleted file mode 100644 index e00c5030b..000000000 --- a/frontend-implicaction/src/app/admin/widgets/admin-overview-widget/admin-overview-widget.component.html +++ /dev/null @@ -1,51 +0,0 @@ -
-
-
Website Overview
-
-
- -
-
-

- - 203 -

-

Users

-
-
- - -
-
-

- - 12 -

-

Pages

-
-
- - -
-
-

- - 33 -

-

Posts

-
-
-
-
diff --git a/frontend-implicaction/src/app/admin/widgets/admin-overview-widget/admin-overview-widget.component.scss b/frontend-implicaction/src/app/admin/widgets/admin-overview-widget/admin-overview-widget.component.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/frontend-implicaction/src/app/admin/widgets/admin-overview-widget/admin-overview-widget.component.ts b/frontend-implicaction/src/app/admin/widgets/admin-overview-widget/admin-overview-widget.component.ts deleted file mode 100644 index 992689af1..000000000 --- a/frontend-implicaction/src/app/admin/widgets/admin-overview-widget/admin-overview-widget.component.ts +++ /dev/null @@ -1,9 +0,0 @@ -import {Component} from '@angular/core'; - -@Component({ - selector: 'app-admin-overview', - templateUrl: './admin-overview-widget.component.html', - styleUrls: ['./admin-overview-widget.component.scss'] -}) -export class AdminOverviewWidgetComponent { -} diff --git a/frontend-implicaction/src/app/admin/widgets/job-counter-widget/job-counter-widget.component.html b/frontend-implicaction/src/app/admin/widgets/job-counter-widget/job-counter-widget.component.html new file mode 100644 index 000000000..13560814d --- /dev/null +++ b/frontend-implicaction/src/app/admin/widgets/job-counter-widget/job-counter-widget.component.html @@ -0,0 +1,5 @@ + diff --git a/frontend-implicaction/src/app/admin/widgets/job-counter-widget/job-counter-widget.component.ts b/frontend-implicaction/src/app/admin/widgets/job-counter-widget/job-counter-widget.component.ts new file mode 100644 index 000000000..3ec06c665 --- /dev/null +++ b/frontend-implicaction/src/app/admin/widgets/job-counter-widget/job-counter-widget.component.ts @@ -0,0 +1,19 @@ +import { Component, OnInit } from '@angular/core'; +import {JobService} from "../../../job/services/job.service"; +import {Observable} from "rxjs"; + +@Component({ + selector: 'app-job-counter-widget', + templateUrl: './job-counter-widget.component.html', +}) +export class JobCounterWidgetComponent implements OnInit { + + jobCounter$: Observable + + constructor(private jobService: JobService) { } + + ngOnInit(): void { + this.jobCounter$ = this.jobService.getEnabledJobsCount(); + } + +} diff --git a/frontend-implicaction/src/app/admin/widgets/user-counter-widget/user-counter-widget.component.html b/frontend-implicaction/src/app/admin/widgets/user-counter-widget/user-counter-widget.component.html new file mode 100644 index 000000000..3c8a993ee --- /dev/null +++ b/frontend-implicaction/src/app/admin/widgets/user-counter-widget/user-counter-widget.component.html @@ -0,0 +1,5 @@ + diff --git a/frontend-implicaction/src/app/admin/widgets/user-counter-widget/user-counter-widget.component.ts b/frontend-implicaction/src/app/admin/widgets/user-counter-widget/user-counter-widget.component.ts new file mode 100644 index 000000000..974762f83 --- /dev/null +++ b/frontend-implicaction/src/app/admin/widgets/user-counter-widget/user-counter-widget.component.ts @@ -0,0 +1,20 @@ +import {Component, OnInit} from '@angular/core'; +import {UserService} from "../../../community/services/profile/user.service"; +import {Observable} from "rxjs"; + +@Component({ + selector: 'app-user-counter-widget', + templateUrl: './user-counter-widget.component.html', +}) +export class UserCounterWidgetComponent implements OnInit { + + userCount$: Observable; + + constructor(private userService: UserService) { + } + + ngOnInit(): void { + this.userCount$ = this.userService.getEnabledUsersCount(); + } + +} diff --git a/frontend-implicaction/src/app/community/components/relation-button/relation-button.component.ts b/frontend-implicaction/src/app/community/components/relation-button/relation-button.component.ts index 116371536..c7783b1c8 100644 --- a/frontend-implicaction/src/app/community/components/relation-button/relation-button.component.ts +++ b/frontend-implicaction/src/app/community/components/relation-button/relation-button.component.ts @@ -48,7 +48,6 @@ export class RelationButtonComponent implements OnInit, OnChanges { } private buildButtons(): RelationButton[] { - console.log(this.profile.username, [this.getCancelButton(), this.getOkButton()]); return [this.getCancelButton(), this.getOkButton()].filter(b => b !== null); } diff --git a/frontend-implicaction/src/app/community/models/enums/profile-menu-enum.ts b/frontend-implicaction/src/app/community/models/enums/profile-menu-enum.ts index dadb4a46f..8e67261f4 100644 --- a/frontend-implicaction/src/app/community/models/enums/profile-menu-enum.ts +++ b/frontend-implicaction/src/app/community/models/enums/profile-menu-enum.ts @@ -9,11 +9,11 @@ export enum ProfileMenuCode { export class ProfileMenuEnum extends EnumCodeLabelAbstract { - static readonly ALL = new ProfileMenuEnum(ProfileMenuCode.ALL, 'Tous les utilisateurs', null, `/${Univers.COMMUNITY.url}/profiles`); - static readonly ALL_FRIENDS = new ProfileMenuEnum(ProfileMenuCode.ALL_FRIENDS, 'Mes amis', null, `/${Univers.COMMUNITY.url}/profiles`); - static readonly ONLY_FRIEND_REQUESTS = new ProfileMenuEnum(ProfileMenuCode.ONLY_FRIEND_REQUESTS, 'Invitations', null, `/${Univers.COMMUNITY.url}/profiles`); + static readonly ALL = new ProfileMenuEnum(ProfileMenuCode.ALL, 'Tous les utilisateurs', null, `/${Univers.COMMUNITY.url}/profiles`, null); + static readonly ALL_FRIENDS = new ProfileMenuEnum(ProfileMenuCode.ALL_FRIENDS, 'Mes amis', null, `/${Univers.COMMUNITY.url}/profiles`, ProfileMenuCode.ALL_FRIENDS); + static readonly ONLY_FRIEND_REQUESTS = new ProfileMenuEnum(ProfileMenuCode.ONLY_FRIEND_REQUESTS, 'Invitations', null, `/${Univers.COMMUNITY.url}/profiles`, ProfileMenuCode.ONLY_FRIEND_REQUESTS); - constructor(readonly code: ProfileMenuCode, readonly label: string, readonly icon: string, readonly url: string) { + constructor(readonly code: ProfileMenuCode, readonly label: string, readonly icon: string, readonly url: string, readonly filter: ProfileMenuCode) { super(code, label); } } diff --git a/frontend-implicaction/src/app/community/pages/profile-list-page/profile-list-page.component.ts b/frontend-implicaction/src/app/community/pages/profile-list-page/profile-list-page.component.ts index ea177bcf2..26fb81f06 100644 --- a/frontend-implicaction/src/app/community/pages/profile-list-page/profile-list-page.component.ts +++ b/frontend-implicaction/src/app/community/pages/profile-list-page/profile-list-page.component.ts @@ -32,13 +32,15 @@ export class ProfileListPageComponent implements OnInit, OnDestroy { loading = true; selectedItemMenuCode: ProfileMenuCode; menuItems: MenuItem[] = ProfileMenuEnum.values() - .map((item: ProfileMenuEnum) => ({ - id: item.code, - label: item.label, - routerLink: item.url, - queryParams: {filter: item.code}, - routerLinkActiveOptions: {queryParams: 'subset'} - } as MenuItem)); + .map((item: ProfileMenuEnum) => { + const menuItem = { + id: item.code, + label: item.label, + routerLink: item.url, + routerLinkActiveOptions: {queryParams: 'subset'} + } as MenuItem; + return item.filter ? {...menuItem, queryParams: {filter: item.filter}} : menuItem; + }); private onDestroySubject = new Subject(); private onlyFriendRequestMenuItem: MenuItem; diff --git a/frontend-implicaction/src/app/community/services/profile/user.service.ts b/frontend-implicaction/src/app/community/services/profile/user.service.ts index 27083c85b..cd1b8233f 100644 --- a/frontend-implicaction/src/app/community/services/profile/user.service.ts +++ b/frontend-implicaction/src/app/community/services/profile/user.service.ts @@ -20,14 +20,10 @@ export class UserService { } - getAll(pageable: Pageable): Observable> { + getAll(pageable: Pageable): Observable> { return this.http.get(this.apiEndpointsService.getAllUserEndpoint(pageable)); } - getAllPendingActivationUsers(pageable: Pageable): Observable { - return this.http.get(this.apiEndpointsService.getAllPendingActivationUsersEndpoint(pageable)); - } - enableUser(username: string): Observable { return this.http.post(this.apiEndpointsService.getActivateUserEndpoint(username), null); } @@ -35,4 +31,8 @@ export class UserService { updateUserRoles(username: string, roles: RoleEnumCode[]): Observable { return this.http.post(this.apiEndpointsService.updateUserRolesEndpoint(username), roles); } + + getEnabledUsersCount(): Observable { + return this.http.get(this.apiEndpointsService.getEnabledUsersCount()); + } } diff --git a/frontend-implicaction/src/app/core/services/api-endpoints.service.ts b/frontend-implicaction/src/app/core/services/api-endpoints.service.ts index 9de72cc78..30a549bbe 100644 --- a/frontend-implicaction/src/app/core/services/api-endpoints.service.ts +++ b/frontend-implicaction/src/app/core/services/api-endpoints.service.ts @@ -194,8 +194,8 @@ export class ApiEndpointsService { return ApiEndpointsService.createUrlWithPageable(Uris.USERS.BASE_URI, pageable); } - getAllPendingActivationUsersEndpoint(pageable: Pageable): string { - return ApiEndpointsService.createUrlWithPageable(Uris.USERS.GET_ALL_PENDING_USERS, pageable); + getEnabledUsersCount() { + return ApiEndpointsService.createUrl(Uris.USERS.ENABLED_USERS_COUNT); } @@ -330,6 +330,10 @@ export class ApiEndpointsService { true); } + getEnabledJobsCountEndpoint(): string { + return ApiEndpointsService.createUrl(Uris.JOBS.COUNT); + } + createJobPostingEndpoint(): string { return ApiEndpointsService.createUrl(Uris.JOBS.BASE_URI); } diff --git a/frontend-implicaction/src/app/job/services/job.service.ts b/frontend-implicaction/src/app/job/services/job.service.ts index c65739f1f..3fae46481 100644 --- a/frontend-implicaction/src/app/job/services/job.service.ts +++ b/frontend-implicaction/src/app/job/services/job.service.ts @@ -60,4 +60,8 @@ export class JobService { validateJob(jobId: string): Observable { return this.http.patch(this.apiEndpointsService.getValidateJobEndpoint(jobId), null); } + + getEnabledJobsCount(): Observable { + return this.http.get(this.apiEndpointsService.getEnabledJobsCountEndpoint()); + } } diff --git a/frontend-implicaction/src/app/shared/models/uris.ts b/frontend-implicaction/src/app/shared/models/uris.ts index 734f65ffc..91668af19 100644 --- a/frontend-implicaction/src/app/shared/models/uris.ts +++ b/frontend-implicaction/src/app/shared/models/uris.ts @@ -24,10 +24,10 @@ export class Uris { static readonly BASE_URI = 'users'; static readonly COMMUNITY_LIST = 'users/community'; static readonly BY_ID = 'users'; - static readonly GET_ALL_PENDING_USERS = 'users/pending'; static readonly GROUP_LIST = 'users'; static readonly ACTIVATE_USER = 'users/{username}/enable'; static readonly UPDATE_USER_ROLES = 'users/{username}/roles'; + static readonly ENABLED_USERS_COUNT = 'users/count'; }; static readonly PROFILES = class { @@ -73,6 +73,7 @@ export class Uris { static readonly VALIDATE_JOB = 'job-postings/validate'; static readonly GET_VALIDATED_JOBS = 'job-postings/validated'; static readonly TOGGLE_ARCHIVE = 'job-postings/archive'; + static readonly COUNT = 'job-postings/count'; }; /**