diff --git a/src/app/modules/user/user-project/user-project.component.scss b/src/app/modules/user/user-project/user-project.component.scss
index d66d3274..9d3381cd 100644
--- a/src/app/modules/user/user-project/user-project.component.scss
+++ b/src/app/modules/user/user-project/user-project.component.scss
@@ -39,6 +39,11 @@
height: calc(100% - 30px);
margin: 30px;
}
+
+ .user-amounts{
+ display: grid;
+ grid-template-columns: auto auto;
+ }
}
.project-chooser{
From 765e32d354f570dcdb018f41ae45cec92719ada3 Mon Sep 17 00:00:00 2001
From: macfleury-2000
Date: Thu, 17 Jun 2021 14:10:50 +0200
Subject: [PATCH 17/30] fixed routing
---
src/app/modules/user/user-project/user-project.component.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/app/modules/user/user-project/user-project.component.ts b/src/app/modules/user/user-project/user-project.component.ts
index 9942c618..4c17f8f1 100644
--- a/src/app/modules/user/user-project/user-project.component.ts
+++ b/src/app/modules/user/user-project/user-project.component.ts
@@ -419,7 +419,7 @@ export class UserProjectComponent implements OnInit {
category => category.selected ? category.id : null)
.filter(category => category)
)}`;
- this.location.replaceState(`/project/overview/`, queryString);
+ this.location.replaceState(`/user/projects`, queryString);
this.updateSEOTags();
this.onInternalQueryChange();
}
From 90c104f099d6bb6d565f2bcb41e40ea8baf6a856 Mon Sep 17 00:00:00 2001
From: Walter Sajtos
Date: Tue, 22 Jun 2021 13:51:40 +0200
Subject: [PATCH 18/30] Code cleanup
---
.../app-layout/app-layout.component.ts | 4 +-
.../project/overview/overview.component.ts | 3 +-
.../user-project/user-project.component.ts | 512 ------------------
.../user-projects.component.html} | 27 +-
.../user-projects.component.scss} | 0
.../user-projects/user-projects.component.ts | 200 +++++++
src/app/modules/user/user-routing.module.ts | 4 +-
src/app/modules/user/user.module.ts | 19 +-
src/app/services/user.service.ts | 23 +-
9 files changed, 235 insertions(+), 557 deletions(-)
delete mode 100644 src/app/modules/user/user-project/user-project.component.ts
rename src/app/modules/user/{user-project/user-project.component.html => user-projects/user-projects.component.html} (77%)
rename src/app/modules/user/{user-project/user-project.component.scss => user-projects/user-projects.component.scss} (100%)
create mode 100644 src/app/modules/user/user-projects/user-projects.component.ts
diff --git a/src/app/components/app-layout/app-layout.component.ts b/src/app/components/app-layout/app-layout.component.ts
index fd7d2b41..45afa7ac 100644
--- a/src/app/components/app-layout/app-layout.component.ts
+++ b/src/app/components/app-layout/app-layout.component.ts
@@ -23,7 +23,7 @@ import { AlertService } from 'src/app/services/alert.service';
import { NavigationEnd, NavigationStart, Router } from '@angular/router';
/**
- * Component used to display the basic layout of the application.
+ * Component used to display the basic layout of the application.
*/
@Component({
selector: 'app-layout',
@@ -120,7 +120,7 @@ export class AppLayoutComponent implements OnInit {
this.displayBetaBanner = true;
}
-
+
public viewUserProjects() {
this.router.navigate(['user/projects']);
}
diff --git a/src/app/modules/project/overview/overview.component.ts b/src/app/modules/project/overview/overview.component.ts
index 0b5fd7b6..f1128140 100644
--- a/src/app/modules/project/overview/overview.component.ts
+++ b/src/app/modules/project/overview/overview.component.ts
@@ -52,7 +52,6 @@ export class OverviewComponent implements OnInit, AfterViewInit {
public projectsToDisplay: Project[] = [];
public projectsTotal: Project[] = [];
-
/**
* Determine whether we need to render a list or cart view
*/
@@ -146,7 +145,7 @@ export class OverviewComponent implements OnInit, AfterViewInit {
private paginationService: PaginationService,
private internalSearchService: InternalSearchService,
private formBuilder: FormBuilder,
- private activatedRoute: ActivatedRoute,
+ private activatedRoute: ActivatedRoute,
private seoService: SEOService,
private modalService: BsModalService,
private location: Location,
diff --git a/src/app/modules/user/user-project/user-project.component.ts b/src/app/modules/user/user-project/user-project.component.ts
deleted file mode 100644
index 4c17f8f1..00000000
--- a/src/app/modules/user/user-project/user-project.component.ts
+++ /dev/null
@@ -1,512 +0,0 @@
-/*
- * Digital Excellence Copyright (C) 2020 Brend Smits
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published
- * by the Free Software Foundation version 3 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- * See the GNU Lesser General Public License for more details.
- *
- * You can find a copy of the GNU Lesser General Public License
- * along with this program, in the LICENSE.md file in the root project directory.
- * If not, see https://www.gnu.org/licenses/lgpl-3.0.txt
- */
-
-import { AfterViewInit, Component, OnInit } from '@angular/core';
-import { SafeUrl } from '@angular/platform-browser';
-import { ActivatedRoute, Router } from '@angular/router';
-import { debounceTime, finalize } from 'rxjs/operators';
-import { SelectFormOption } from 'src/app/interfaces/select-form-option';
-import { Project } from 'src/app/models/domain/project';
-import { ProjectCategory } from 'src/app/models/domain/projectCategory';
-import { SearchResultsResource } from 'src/app/models/resources/search-results';
-import { AuthService } from 'src/app/services/auth.service';
-import { FileRetrieverService } from 'src/app/services/file-retriever.service';
-import { UserService } from 'src/app/services/user.service';
-import { ProjectDetailModalUtility } from 'src/app/utils/project-detail-modal.util';
-import { InternalSearchQuery } from 'src/app/models/resources/internal-search-query';
-import { PageChangedEvent } from 'ngx-bootstrap/pagination';
-import { SEOService } from 'src/app/services/seo.service';
-import { Location } from '@angular/common';
-import { BsModalRef, BsModalService } from 'ngx-bootstrap/modal';
-import { DetailsComponent } from '../../project/details/details.component';
-import { Subscription } from 'rxjs';
-import { FormBuilder, FormControl } from '@angular/forms';
-import { BehaviorSubject } from 'rxjs/internal/BehaviorSubject';
-import { environment } from 'src/environments/environment';
-import { CategoryService } from 'src/app/services/category.service';
-
-@Component({
- selector: 'user-project',
- templateUrl: './user-project.component.html',
- styleUrls: ['./user-project.component.scss'],
-})
-export class UserProjectComponent implements OnInit {
-
- public sortSelectOptions: SelectFormOption[] = [
- {value: 'updated,desc', viewValue: 'Updated (new-old)'},
- {value: 'updated,asc', viewValue: 'Updated (old-new)'},
- {value: 'name,asc', viewValue: 'Name (a-z)'},
- {value: 'name,desc', viewValue: 'Name (z-a)'},
- {value: 'created,desc', viewValue: 'Created (new-old)'},
- {value: 'created,asc', viewValue: 'Created (old-new)'},
- ];
-
- public isAuthenticated: boolean;
- public projectsToDisplay: Project[] = [];
-;
-
-
-
- /**
- * FormControl for getting the input.
- */
- public sortOptionControl: FormControl = null;
- public paginationOptionControl: FormControl = null;
- public searchControl: FormControl = null
-
- public categories: ProjectCategory[];
-
-
- public name: string;
- public photo : File;
- public subscription: Subscription;
- /**
- * The number of projects that are on the platform
- */
- public totalNrOfProjects = 0;
-
- /**
- * Boolean to determine whether the component is loading the information from the api.
- */
- public projectsLoading = true;
-
- /**
- * Stores the response with the paginated projects etc. from the api.
- */
- public paginationResponse: SearchResultsResource;
-
- public showListView: boolean = false;
-
- public showPaginationFooter = true;
- public currentPage;
-
- /**
- * The possible pagination options for the dropdown
- */
- public paginationDropDownOptions = [
- {id: 0, amountOnPage: 12},
- {id: 1, amountOnPage: 24},
- {id: 2, amountOnPage: 36},
- ];
-
- /**
- * Default pagination option for the dropdown
- */
- public defaultPaginationOption = {
- id: 0,
- amountOnPage: 12
- };
-
-
- /**
- * Parameters for keeping track of the current internalSearch query values.
- */
- private currentSortOptions: string = this.sortSelectOptions[0].value;
-
- /**
- * The amount of projects that will be displayed on a single page.
- */
- public amountOfProjectsOnSinglePage = 12;
- /**
- * Array to receive and store the projects from the api.
- */
- public userprojects: Project[] = [];
-
- /**
- * Boolean to determine whether the component is loading the information from the api.
- */
- public userprojectsLoading = true;
-
- private searchSubject = new BehaviorSubject(null);
-
- /**
- * Array to receive and store the projects from the api.
- */
- // public projects: Project[] = [];
- // public projectsTotal: Project[] = [];
-
- public displaySearchElements = false;
-
-
- /**
- * Project parameter gets updated per project detail modal
- */
- public currentProject: Project = null;
-
- /**
- * Parameters for keeping track of the current internalSearch query values.
- */
- private currentSearchInput: string;
- private currentSortType: string = this.currentSortOptions.split(',')[0];
- private currentSortDirection: string = this.currentSortOptions.split(',')[1];
-
- /**
- * Property to indicate whether the project is loading.
- */
- private projectLoading = true;
-
-
- private modalRef: BsModalRef;
- private modalSubscriptions: Subscription[] = [];
-
-
- constructor(private userService: UserService,
- private router: Router,
- private fileRetrieverService: FileRetrieverService,
- private modalUtility: ProjectDetailModalUtility,
- private authService: AuthService,
- private seoService: SEOService,
- private location: Location,
- private modalService: BsModalService,
- private formBuilder: FormBuilder,
- private activatedRoute: ActivatedRoute,
- private categoryService: CategoryService,
- private route: ActivatedRoute) {
- this.searchControl = new FormControl('');
- this.sortOptionControl = new FormControl(this.sortSelectOptions);
- this.paginationOptionControl = new FormControl(this.paginationDropDownOptions[0]);
-
- }
-
- ngOnInit(): void {
- this.subscription = this.authService.authNavStatus$.subscribe((status) => {
- this.isAuthenticated = status;
- this.name = this.authService.name;
- });
-
- this.authService.authNavStatus$.subscribe((status) => {
- this.isAuthenticated = status;
- if (status) {
- this.userService.getProjectsFromUser()
- .pipe(finalize(() => (this.userprojectsLoading = false)))
- .subscribe((result) => {
- this.userprojects = result;
- console.log(this.userprojects)
- this.userprojects.forEach(element => {
- element.likeCount = element.likes.length;
- });
- // this.projectsToDisplay = this.userprojects;
- });
- }
- });
-
- // Subscribe to search subject to debounce the input and afterwards searchAndFilter.
- this.searchSubject
- .pipe(
- debounceTime(500)
- )
- .subscribe((result) => {
- if (!result) {
- return;
- }
- this.onInternalQueryChange();
- });
-
- this.searchControl.valueChanges.subscribe((value) => this.onSearchInputValueChange(value));
-
- this.updateSEOTags();
- }
-
- ngAfterViewInit() {
- this.categoryService.getAll().subscribe(categories => {
- this.categories = categories;
- this.processQueryParams();
- });
-
- this.activatedRoute.params.subscribe(params => {
- const projectId = params.id?.split('-')[0];
- this.createProjectModal(projectId);
- });
- }
- public onClickUserProject(id: number, name: string): void {
- name = name.split(' ').join('-');
- this.modalUtility.openProjectModal(id, name, '/home');
- }
-
- public onCategoryClick(category): void {
- this.categories = this.categories.map(cat => (
- cat.name === category.name
- ? {...cat, selected: !category.selected}
- : {...cat}
- ));
- }
-
- /**
- * Method which triggers when the serach input receives a key up.
- * Updates the search subject with the query.
- * @param $event the event containing the info of the keyboard press.
- */
- public onSearchInputValueChange(value: string): void {
- // Do nothing if input did not change.
- if (this.currentSearchInput === value) {
- return;
- }
-
- // Do nothing if the input contains only spaces or line breaks AND the value is not already empty.
- // Indicating that the search was cleared and a new request should be made.
- if (value !== '' && !value.replace(/\s/g, '').length) {
- return;
- }
-
- this.currentSearchInput = value;
- this.searchSubject.next(value);
- }
-
- /**
- * Checks whether there are any projects
- */
- public projectsEmpty(): boolean {
- return this.userprojects.length < 1;
- }
-
- /**
- * Triggers on project click in the list.
- * @param event click event
- * @param id project id.
- * @param name project name
- */
- public onClickProject(event: Event, id: number, name: string): void {
- name = name.split(' ').join('-');
-
- const clickedSection = event.target as Element;
-
- if (clickedSection.classList.contains('project-collaborators')) {
- this.createProjectModal(id, 'collaborators');
- } else {
- this.createProjectModal(id);
- }
- this.location.replaceState(`/project/details/${id}-${name}`);
- }
- /**
- * Method to get the url of the icon of the project. This is retrieved
- * from the file retriever service
- */
- public getIconUrl(project: Project): SafeUrl {
- return this.fileRetrieverService.getIconUrl(project.projectIcon);
- }
-
- /**
- * Method that retrieves the page of the pagination footer when the user selects a new one.
- * @param event holds the current page of the pagination footer, as well as the amount
- * of projects that are being displayed on a single page.
- */
- public pageChanged(event: PageChangedEvent): void {
- this.currentPage = event.page;
- this.onInternalQueryChange();
- }
-
- /**
- * Method that retrieves the value that has changed from the pagination dropdown in the accordion,
- * and based on that value retrieves the paginated projects with the right parameters.
- * @param $event the identifier of the selected value.
- */
- public onPaginationChange() {
- this.amountOfProjectsOnSinglePage = this.paginationOptionControl.value.amountOnPage;
- if (this.amountOfProjectsOnSinglePage === this.paginationResponse.totalCount) {
- this.currentPage = 1;
- }
- this.onInternalQueryChange();
- }
-
- /**
- * Method to handle value changes of the sort form.
- * @param value the value of the form.
- */
- public onSortFormValueChange(): void {
- if (!this.sortOptionControl.value) {
- return;
- }
- this.currentSortType = this.sortOptionControl.value.value.split(',')[0];
- this.currentSortDirection = this.sortOptionControl.value.value.split(',')[1];
- this.onInternalQueryChange();
- }
-
- public onCategoryChange(categoryId: number): void {
- this.categories = this.categories.map(category =>
- category.id === categoryId
- ? {...category, selected: !category.selected}
- : category);
- this.onInternalQueryChange();
- }
-
- /**
- * Method to build the new internal search query when any of it params have changed.
- * Calls the projectService or searchService based on the value of the query.
- */
- private onInternalQueryChange(): void {
- const internalSearchQuery: InternalSearchQuery = {
- query: this.currentSearchInput === '' ? null : this.currentSearchInput,
- // If there is a search query, search on all pages
- page: !this.currentSearchInput ? this.currentPage : null,
- amountOnPage: this.amountOfProjectsOnSinglePage,
- sortBy: this.currentSortType,
- sortDirection: this.currentSortDirection,
- categories: this.categories
- .map(value => value.selected ? value.id : null)
- .filter(value => value)
- };
-
- this.updateQueryParams();
-
-
- }
-
- /**
- * Method to handle the response of the call to the project or search service.
- */
- private handleSearchAndProjectResponse(response: SearchResultsResource): void {
- this.paginationResponse = response;
-
- this.userprojects = response.results;
- this.projectsToDisplay = response.results;
- this.totalNrOfProjects = response.totalCount;
-
- if (this.userprojects.length < this.amountOfProjectsOnSinglePage && this.currentPage <= 1) {
- this.showPaginationFooter = false;
- } else {
- this.showPaginationFooter = true;
- }
- }
-
- /**
- * Method to open the modal for a projects detail
- * @param projectId the id of the project that should be shown.
- * @param activeTab Define the active tab
- */
- private createProjectModal(projectId: number, activeTab: string = 'description') {
- const initialState = {
- projectId: projectId,
- activeTab: activeTab
- };
- if (projectId) {
- this.modalRef = this.modalService.show(DetailsComponent, {animated: true, initialState});
- this.modalRef.setClass('project-modal');
-
- this.modalRef.content.onLike.subscribe(isLiked => {
- const projectIndexToUpdate = this.userprojects.findIndex(project => project.id === projectId);
- if (isLiked) {
- this.userprojects[projectIndexToUpdate].likeCount++;
- this.userprojects[projectIndexToUpdate].userHasLikedProject = true;
- } else {
- this.userprojects[projectIndexToUpdate].likeCount--;
- this.userprojects[projectIndexToUpdate].userHasLikedProject = false;
- }
- });
-
- // Go back to home page after the modal is closed
- this.modalSubscriptions.push(
- this.modalService.onHide.subscribe(() => {
- if (this.location.path().startsWith('/project/details')) {
- const queryString = `query=${this.searchControl.value}`
- + `&sortOption=${this.currentSortOptions}`
- + `&pagination=${this.amountOfProjectsOnSinglePage}`
- + `&page=${this.currentPage}`
- + `&categories=${JSON.stringify(this.categories?.map(
- category => category.selected ? category.id : null)
- .filter(category => category)
- )}`;
- this.location.replaceState(`/user/projects`, queryString);
- this.updateSEOTags();
- this.onInternalQueryChange();
- }
- }
- ));
- }
- }
-
- private updateQueryParams() {
- this.router.navigate(
- [],
- {
- queryParams: {
- query: this.searchControl.value,
- sortOption: this.currentSortOptions,
- pagination: this.amountOfProjectsOnSinglePage,
- categories: JSON.stringify(
- this.categories?.map(category =>
- category.selected ? category.id : null
- ).filter(category => category)
- )
- },
- queryParamsHandling: 'merge'
- });
- }
-
- private processQueryParams() {
- this.route.queryParams.subscribe(({query, categories: selectedCategories, sortOption, pagination}) => {
- if (query !== 'null' && query !== 'undefined') {
- this.searchControl.setValue(query);
- }
-
- if (selectedCategories) {
- selectedCategories = JSON.parse(selectedCategories);
- if (selectedCategories.count > 0) {
- this.categories = this.categories?.map(category => {
- return {
- ...category,
- selected: selectedCategories.contains(category.id)
- };
- });
- }
- }
-
- if (sortOption) {
- this.currentSortOptions = sortOption;
- this.sortOptionControl.setValue(this.sortSelectOptions.find(option => option.value === sortOption));
- }
-
- if (pagination) {
- const parsed = this.paginationDropDownOptions.find(option =>
- option.amountOnPage === parseInt(pagination, 10));
-
- this.paginationOptionControl.setValue(parsed ? parsed : 12);
- this.amountOfProjectsOnSinglePage = parsed ? parsed.amountOnPage : 12;
- }
-
- this.onInternalQueryChange();
- });
- }
-
- /**
- * Methods to update the title and description through the SEO service
- */
- private updateSEOTags() {
- // Updates meta and title tags
- this.seoService.updateTitle('Project overview');
- this.seoService.updateDescription('Browse or search for specific projects or ideas within DeX');
- }
-
- /**
- * Method to make tags change appearance on clicking.
- * further implementation is still pending.
- */
- public tagClicked(event) {
- if (event.target.className === 'tag clicked') {
- event.target.className = 'tag';
- } else {
- event.target.className = 'tag clicked';
- }
- }
-
- /**
- * Method to display the tags based on the environment variable.
- * Tags should be hidden in production for now until further implementation is finished.
- */
- public displayTags(): boolean {
- return !environment.production;
- }
- }
\ No newline at end of file
diff --git a/src/app/modules/user/user-project/user-project.component.html b/src/app/modules/user/user-projects/user-projects.component.html
similarity index 77%
rename from src/app/modules/user/user-project/user-project.component.html
rename to src/app/modules/user/user-projects/user-projects.component.html
index cdaae876..3a200e7a 100644
--- a/src/app/modules/user/user-project/user-project.component.html
+++ b/src/app/modules/user/user-projects/user-projects.component.html
@@ -16,26 +16,7 @@
If not, see https://www.gnu.org/licenses/lgpl-3.0.txt
-->
-
-
-
+
@@ -65,7 +46,7 @@
My projects
-
{{ name }}
+
{{ userName }}
Projects:
{{ userprojects.length }}
@@ -74,8 +55,6 @@
{{ name }}
-
-
{{ name }}
There are no projects available.
-
-
diff --git a/src/app/modules/user/user-project/user-project.component.scss b/src/app/modules/user/user-projects/user-projects.component.scss
similarity index 100%
rename from src/app/modules/user/user-project/user-project.component.scss
rename to src/app/modules/user/user-projects/user-projects.component.scss
diff --git a/src/app/modules/user/user-projects/user-projects.component.ts b/src/app/modules/user/user-projects/user-projects.component.ts
new file mode 100644
index 00000000..c6b2a1ca
--- /dev/null
+++ b/src/app/modules/user/user-projects/user-projects.component.ts
@@ -0,0 +1,200 @@
+/*
+ * Digital Excellence Copyright (C) 2020 Brend Smits
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation version 3 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU Lesser General Public License for more details.
+ *
+ * You can find a copy of the GNU Lesser General Public License
+ * along with this program, in the LICENSE.md file in the root project directory.
+ * If not, see https://www.gnu.org/licenses/lgpl-3.0.txt
+ */
+
+import { Component, OnInit } from '@angular/core';
+import { SafeUrl } from '@angular/platform-browser';
+import { ActivatedRoute, Router } from '@angular/router';
+import { finalize } from 'rxjs/operators';
+import { Project } from 'src/app/models/domain/project';
+import { AuthService } from 'src/app/services/auth.service';
+import { FileRetrieverService } from 'src/app/services/file-retriever.service';
+import { UserService } from 'src/app/services/user.service';
+import { ProjectDetailModalUtility } from 'src/app/utils/project-detail-modal.util';
+import { SEOService } from 'src/app/services/seo.service';
+import { Location } from '@angular/common';
+import { BsModalRef, BsModalService } from 'ngx-bootstrap/modal';
+import { DetailsComponent } from 'src/app/modules/project/details/details.component';
+import { environment } from 'src/environments/environment';
+
+@Component({
+ selector: 'user-project',
+ templateUrl: './user-projects.component.html',
+ styleUrls: ['./user-projects.component.scss'],
+})
+export class UserProjectsComponent implements OnInit {
+ public projectsToDisplay: Project[] = [];
+
+ /**
+ * User info
+ */
+ public userName: string;
+
+ /**
+ * The number of projects that belong to the user
+ */
+ public totalNrOfProjects = 0;
+
+ /**
+ * Boolean to determine whether the component is loading the information from the api.
+ */
+ public projectsLoading = true;
+
+ public showListView = false;
+
+ public showPaginationFooter = true;
+ public currentPage;
+
+ /**
+ * Array to receive and store the projects from the api.
+ */
+ public userprojects: Project[] = [];
+
+ /**
+ * Boolean to determine whether the component is loading the information from the api.
+ */
+ public userProjectsLoading = true;
+
+ /**
+ * Project parameter gets updated per project detail modal
+ */
+ public currentProject: Project = null;
+
+ private modalRef: BsModalRef;
+
+ constructor(private userService: UserService,
+ private router: Router,
+ private fileRetrieverService: FileRetrieverService,
+ private modalUtility: ProjectDetailModalUtility,
+ private authService: AuthService,
+ private seoService: SEOService,
+ private location: Location,
+ private modalService: BsModalService,
+ private activatedRoute: ActivatedRoute) {}
+
+ ngOnInit(): void {
+ this.authService.authNavStatus$.subscribe(status => {
+ this.userName = this.authService.name;
+ if (status) {
+ this.userService.getProjectsFromUser()
+ .pipe(
+ finalize(() => (
+ this.userProjectsLoading = false
+ ))
+ ).subscribe(result => {
+ this.userprojects = result;
+ });
+ }
+ });
+ this.updateSEOTags();
+ }
+
+ ngAfterViewInit() {
+ this.activatedRoute.params.subscribe(params => {
+ const projectId = params.id?.split('-')[0];
+ this.createProjectModal(projectId);
+ });
+ }
+
+ public onClickUserProject(id: number, name: string): void {
+ name = name.split(' ').join('-');
+ this.modalUtility.openProjectModal(id, name, '/home');
+ }
+
+ /**
+ * Checks whether there are any projects
+ */
+ public projectsEmpty(): boolean {
+ return this.userprojects.length < 1;
+ }
+
+ /**
+ * Triggers on project click in the list.
+ * @param event click event
+ * @param id project id.
+ * @param name project name
+ */
+ public onClickProject(event: Event, id: number, name: string): void {
+ name = name.split(' ').join('-');
+
+ const clickedSection = event.target as Element;
+
+ if (clickedSection.classList.contains('project-collaborators')) {
+ this.createProjectModal(id, 'collaborators');
+ } else {
+ this.createProjectModal(id);
+ }
+ this.location.replaceState(`/project/details/${id}-${name}`);
+ }
+
+ /**
+ * Method to get the url of the icon of the project. This is retrieved
+ * from the file retriever service
+ */
+ public getIconUrl(project: Project): SafeUrl {
+ return this.fileRetrieverService.getIconUrl(project.projectIcon);
+ }
+
+ /**
+ * Method to open the modal for a projects detail
+ * @param projectId the id of the project that should be shown.
+ * @param activeTab Define the active tab
+ */
+ private createProjectModal(projectId: number, activeTab: string = 'description') {
+ const initialState = {
+ projectId: projectId,
+ activeTab: activeTab
+ };
+ if (projectId) {
+ this.modalRef = this.modalService.show(DetailsComponent, {animated: true, initialState});
+ this.modalRef.setClass('project-modal');
+
+ this.modalRef.content.onLike.subscribe(isLiked => {
+ const projectIndexToUpdate = this.userprojects.findIndex(project => project.id === projectId);
+ if (isLiked) {
+ this.userprojects[projectIndexToUpdate].likeCount++;
+ this.userprojects[projectIndexToUpdate].userHasLikedProject = true;
+ } else {
+ this.userprojects[projectIndexToUpdate].likeCount--;
+ this.userprojects[projectIndexToUpdate].userHasLikedProject = false;
+ }
+ });
+
+ // Go back to home page after the modal is closed
+ this.modalService.onHide.subscribe(() => {
+ this.location.replaceState(`/user/projects`);
+ this.updateSEOTags();
+ });
+ }
+ }
+
+ /**
+ * Methods to update the title and description through the SEO service
+ */
+ private updateSEOTags() {
+ // Updates meta and title tags
+ this.seoService.updateTitle('User projects');
+ this.seoService.updateDescription('View your own projects within DeX');
+ }
+
+ /**
+ * Method to display the tags based on the environment variable.
+ * Tags should be hidden in production for now until further implementation is finished.
+ */
+ public displayTags(): boolean {
+ return !environment.production;
+ }
+}
diff --git a/src/app/modules/user/user-routing.module.ts b/src/app/modules/user/user-routing.module.ts
index f120eb50..d3bb0672 100644
--- a/src/app/modules/user/user-routing.module.ts
+++ b/src/app/modules/user/user-routing.module.ts
@@ -1,10 +1,10 @@
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
-import { UserProjectComponent } from './user-project/user-project.component';
+import { UserProjectsComponent } from './user-projects/user-projects.component';
const routes: Routes = [
- { path: 'projects', component: UserProjectComponent },
+ { path: 'projects', component: UserProjectsComponent },
];
@NgModule({
diff --git a/src/app/modules/user/user.module.ts b/src/app/modules/user/user.module.ts
index dddc9809..367edea1 100644
--- a/src/app/modules/user/user.module.ts
+++ b/src/app/modules/user/user.module.ts
@@ -1,26 +1,21 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
-
import { UserRoutingModule } from './user-routing.module';
-import { UserProjectComponent } from './user-project/user-project.component';
-import { PaginationModule } from 'ngx-bootstrap/pagination';
-import { ProjectModule } from '../project/project.module';
-import { FormsModule, ReactiveFormsModule } from '@angular/forms';
+import { UserProjectsComponent } from './user-projects/user-projects.component';
+import { ProjectModule } from 'src/app/modules/project/project.module';
+import { FormsModule } from '@angular/forms';
@NgModule({
declarations: [
- UserProjectComponent
+ UserProjectsComponent
],
imports: [
CommonModule,
UserRoutingModule,
- PaginationModule.forRoot(),
ProjectModule,
- FormsModule,
- CommonModule,
- FormsModule,
- ReactiveFormsModule,
+ FormsModule
]
})
-export class UserModule { }
+export class UserModule {
+}
diff --git a/src/app/services/user.service.ts b/src/app/services/user.service.ts
index ca7fc992..4992a3a7 100644
--- a/src/app/services/user.service.ts
+++ b/src/app/services/user.service.ts
@@ -21,8 +21,9 @@ import { API_CONFIG } from 'src/app/config/api-config';
import { User } from 'src/app/models/domain/user';
import { UserAdd } from 'src/app/models/resources/user-add';
import { HttpBaseService } from './http-base.service';
-import { Observable } from 'rxjs';
+import { from, Observable } from 'rxjs';
import { Project } from 'src/app/models/domain/project';
+import { mergeMap } from 'rxjs/operators';
@Injectable({
providedIn: 'root',
@@ -38,6 +39,24 @@ export class UserService extends HttpBaseService {
}
public getProjectsFromUser(): Observable {
- return this.http.get(`${this.url}/projects`);
+ return this.http.get(`${this.url}/projects`)
+ .pipe(
+ mergeMap(result => from(
+ this.addLikes(result)
+ ))
+ );
+ }
+
+ private addLikes(projects): Promise {
+ return new Promise(resolve => {
+ this.getCurrentUser().subscribe(currentUser => {
+ projects.map(project => {
+ project.likeCount = project.likes.length ? project.likes.length : 0;
+ project.userHasLikedProject = project.likes.filter(like => like.userId === currentUser?.id).length > 0;
+ return project;
+ });
+ resolve(projects);
+ });
+ });
}
}
From a85639d895f93954c79fe40a9d8393a926ae5739 Mon Sep 17 00:00:00 2001
From: macfleury-2000
Date: Fri, 25 Jun 2021 13:12:23 +0200
Subject: [PATCH 19/30] responsive fix
---
.../modules/user/user-projects/user-projects.component.scss | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/src/app/modules/user/user-projects/user-projects.component.scss b/src/app/modules/user/user-projects/user-projects.component.scss
index 9d3381cd..d1be7178 100644
--- a/src/app/modules/user/user-projects/user-projects.component.scss
+++ b/src/app/modules/user/user-projects/user-projects.component.scss
@@ -28,6 +28,10 @@
position: relative;
margin-bottom: 50px;
+ @media only screen and (max-width: 720px) {
+ width: 100%;
+ }
+
.profile-picture{
width: 120px;
height: 120px;
From 4580d83499916f4167df9e4522e8159de60e37ad Mon Sep 17 00:00:00 2001
From: macfleury-2000
Date: Fri, 25 Jun 2021 13:23:53 +0200
Subject: [PATCH 20/30] Added comments and removed useless CSS files
---
.../auth-callback/auth-callback.component.css | 19 -------------------
.../auth-callback.component.css.map | 9 ---------
src/app/modules/home/main/main.component.css | 1 -
.../modules/home/main/main.component.css.map | 9 ---------
.../user-projects/user-projects.component.ts | 15 ++++++++++++++-
5 files changed, 14 insertions(+), 39 deletions(-)
delete mode 100644 src/app/components/auth-callback/auth-callback.component.css
delete mode 100644 src/app/components/auth-callback/auth-callback.component.css.map
delete mode 100644 src/app/modules/home/main/main.component.css
delete mode 100644 src/app/modules/home/main/main.component.css.map
diff --git a/src/app/components/auth-callback/auth-callback.component.css b/src/app/components/auth-callback/auth-callback.component.css
deleted file mode 100644
index 7b95518c..00000000
--- a/src/app/components/auth-callback/auth-callback.component.css
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- *
- * Digital Excellence Copyright (C) 2020 Brend Smits
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published
- * by the Free Software Foundation version 3 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- * See the GNU Lesser General Public License for more details.
- *
- * You can find a copy of the GNU Lesser General Public License
- * along with this program, in the LICENSE.md file in the root project directory.
- * If not, see https://www.gnu.org/licenses/lgpl-3.0.txt
- *
- */
-/*# sourceMappingURL=auth-callback.component.css.map */
\ No newline at end of file
diff --git a/src/app/components/auth-callback/auth-callback.component.css.map b/src/app/components/auth-callback/auth-callback.component.css.map
deleted file mode 100644
index d10a1ce6..00000000
--- a/src/app/components/auth-callback/auth-callback.component.css.map
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "version": 3,
- "mappings": "AAAA;;;;;;;;;;;;;;;;;GAiBG",
- "sources": [
- "auth-callback.component.scss"
- ],
- "names": [],
- "file": "auth-callback.component.css"
-}
\ No newline at end of file
diff --git a/src/app/modules/home/main/main.component.css b/src/app/modules/home/main/main.component.css
deleted file mode 100644
index 0a132066..00000000
--- a/src/app/modules/home/main/main.component.css
+++ /dev/null
@@ -1 +0,0 @@
-/* No CSS *//*# sourceMappingURL=main.component.css.map */
\ No newline at end of file
diff --git a/src/app/modules/home/main/main.component.css.map b/src/app/modules/home/main/main.component.css.map
deleted file mode 100644
index b48e7fdf..00000000
--- a/src/app/modules/home/main/main.component.css.map
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "version": 3,
- "mappings": "",
- "sources": [
- "main.component.scss"
- ],
- "names": [],
- "file": "main.component.css"
-}
\ No newline at end of file
diff --git a/src/app/modules/user/user-projects/user-projects.component.ts b/src/app/modules/user/user-projects/user-projects.component.ts
index c6b2a1ca..6b4069b1 100644
--- a/src/app/modules/user/user-projects/user-projects.component.ts
+++ b/src/app/modules/user/user-projects/user-projects.component.ts
@@ -53,9 +53,19 @@ export class UserProjectsComponent implements OnInit {
*/
public projectsLoading = true;
+ /**
+ * Boolean to determine whether to show the projects in listview or gridview
+ */
public showListView = false;
- public showPaginationFooter = true;
+ /**
+ * Boolean to determine whether the pagination footer has to be showed
+ */
+ public showPaginationFooter = true;
+
+ /**
+ * The pagination page the user is currently on
+ */
public currentPage;
/**
@@ -73,6 +83,9 @@ export class UserProjectsComponent implements OnInit {
*/
public currentProject: Project = null;
+ /**
+ * Property to indicate whether the project is loading.
+ */
private modalRef: BsModalRef;
constructor(private userService: UserService,
From 21341627928e13f2d53c177b72e63e767d2ad7d0 Mon Sep 17 00:00:00 2001
From: macfleury-2000
Date: Fri, 25 Jun 2021 13:33:39 +0200
Subject: [PATCH 21/30] Revert "Added comments and removed useless CSS files"
This reverts commit 4580d83499916f4167df9e4522e8159de60e37ad.
---
.../auth-callback/auth-callback.component.css | 19 +++++++++++++++++++
.../auth-callback.component.css.map | 9 +++++++++
src/app/modules/home/main/main.component.css | 1 +
.../modules/home/main/main.component.css.map | 9 +++++++++
.../user-projects/user-projects.component.ts | 15 +--------------
5 files changed, 39 insertions(+), 14 deletions(-)
create mode 100644 src/app/components/auth-callback/auth-callback.component.css
create mode 100644 src/app/components/auth-callback/auth-callback.component.css.map
create mode 100644 src/app/modules/home/main/main.component.css
create mode 100644 src/app/modules/home/main/main.component.css.map
diff --git a/src/app/components/auth-callback/auth-callback.component.css b/src/app/components/auth-callback/auth-callback.component.css
new file mode 100644
index 00000000..7b95518c
--- /dev/null
+++ b/src/app/components/auth-callback/auth-callback.component.css
@@ -0,0 +1,19 @@
+/*
+ *
+ * Digital Excellence Copyright (C) 2020 Brend Smits
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation version 3 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU Lesser General Public License for more details.
+ *
+ * You can find a copy of the GNU Lesser General Public License
+ * along with this program, in the LICENSE.md file in the root project directory.
+ * If not, see https://www.gnu.org/licenses/lgpl-3.0.txt
+ *
+ */
+/*# sourceMappingURL=auth-callback.component.css.map */
\ No newline at end of file
diff --git a/src/app/components/auth-callback/auth-callback.component.css.map b/src/app/components/auth-callback/auth-callback.component.css.map
new file mode 100644
index 00000000..d10a1ce6
--- /dev/null
+++ b/src/app/components/auth-callback/auth-callback.component.css.map
@@ -0,0 +1,9 @@
+{
+ "version": 3,
+ "mappings": "AAAA;;;;;;;;;;;;;;;;;GAiBG",
+ "sources": [
+ "auth-callback.component.scss"
+ ],
+ "names": [],
+ "file": "auth-callback.component.css"
+}
\ No newline at end of file
diff --git a/src/app/modules/home/main/main.component.css b/src/app/modules/home/main/main.component.css
new file mode 100644
index 00000000..0a132066
--- /dev/null
+++ b/src/app/modules/home/main/main.component.css
@@ -0,0 +1 @@
+/* No CSS *//*# sourceMappingURL=main.component.css.map */
\ No newline at end of file
diff --git a/src/app/modules/home/main/main.component.css.map b/src/app/modules/home/main/main.component.css.map
new file mode 100644
index 00000000..b48e7fdf
--- /dev/null
+++ b/src/app/modules/home/main/main.component.css.map
@@ -0,0 +1,9 @@
+{
+ "version": 3,
+ "mappings": "",
+ "sources": [
+ "main.component.scss"
+ ],
+ "names": [],
+ "file": "main.component.css"
+}
\ No newline at end of file
diff --git a/src/app/modules/user/user-projects/user-projects.component.ts b/src/app/modules/user/user-projects/user-projects.component.ts
index 6b4069b1..c6b2a1ca 100644
--- a/src/app/modules/user/user-projects/user-projects.component.ts
+++ b/src/app/modules/user/user-projects/user-projects.component.ts
@@ -53,19 +53,9 @@ export class UserProjectsComponent implements OnInit {
*/
public projectsLoading = true;
- /**
- * Boolean to determine whether to show the projects in listview or gridview
- */
public showListView = false;
- /**
- * Boolean to determine whether the pagination footer has to be showed
- */
- public showPaginationFooter = true;
-
- /**
- * The pagination page the user is currently on
- */
+ public showPaginationFooter = true;
public currentPage;
/**
@@ -83,9 +73,6 @@ export class UserProjectsComponent implements OnInit {
*/
public currentProject: Project = null;
- /**
- * Property to indicate whether the project is loading.
- */
private modalRef: BsModalRef;
constructor(private userService: UserService,
From 6f212ca4be611c5c248aeec2c6bb7d6b07e21604 Mon Sep 17 00:00:00 2001
From: macfleury-2000
Date: Fri, 25 Jun 2021 13:40:41 +0200
Subject: [PATCH 22/30] Revert "Revert "Added comments and removed useless CSS
files""
This reverts commit 21341627928e13f2d53c177b72e63e767d2ad7d0.
---
.../auth-callback/auth-callback.component.css | 19 -------------------
.../auth-callback.component.css.map | 9 ---------
src/app/modules/home/main/main.component.css | 1 -
.../modules/home/main/main.component.css.map | 9 ---------
.../user-projects/user-projects.component.ts | 15 ++++++++++++++-
5 files changed, 14 insertions(+), 39 deletions(-)
delete mode 100644 src/app/components/auth-callback/auth-callback.component.css
delete mode 100644 src/app/components/auth-callback/auth-callback.component.css.map
delete mode 100644 src/app/modules/home/main/main.component.css
delete mode 100644 src/app/modules/home/main/main.component.css.map
diff --git a/src/app/components/auth-callback/auth-callback.component.css b/src/app/components/auth-callback/auth-callback.component.css
deleted file mode 100644
index 7b95518c..00000000
--- a/src/app/components/auth-callback/auth-callback.component.css
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- *
- * Digital Excellence Copyright (C) 2020 Brend Smits
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published
- * by the Free Software Foundation version 3 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- * See the GNU Lesser General Public License for more details.
- *
- * You can find a copy of the GNU Lesser General Public License
- * along with this program, in the LICENSE.md file in the root project directory.
- * If not, see https://www.gnu.org/licenses/lgpl-3.0.txt
- *
- */
-/*# sourceMappingURL=auth-callback.component.css.map */
\ No newline at end of file
diff --git a/src/app/components/auth-callback/auth-callback.component.css.map b/src/app/components/auth-callback/auth-callback.component.css.map
deleted file mode 100644
index d10a1ce6..00000000
--- a/src/app/components/auth-callback/auth-callback.component.css.map
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "version": 3,
- "mappings": "AAAA;;;;;;;;;;;;;;;;;GAiBG",
- "sources": [
- "auth-callback.component.scss"
- ],
- "names": [],
- "file": "auth-callback.component.css"
-}
\ No newline at end of file
diff --git a/src/app/modules/home/main/main.component.css b/src/app/modules/home/main/main.component.css
deleted file mode 100644
index 0a132066..00000000
--- a/src/app/modules/home/main/main.component.css
+++ /dev/null
@@ -1 +0,0 @@
-/* No CSS *//*# sourceMappingURL=main.component.css.map */
\ No newline at end of file
diff --git a/src/app/modules/home/main/main.component.css.map b/src/app/modules/home/main/main.component.css.map
deleted file mode 100644
index b48e7fdf..00000000
--- a/src/app/modules/home/main/main.component.css.map
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "version": 3,
- "mappings": "",
- "sources": [
- "main.component.scss"
- ],
- "names": [],
- "file": "main.component.css"
-}
\ No newline at end of file
diff --git a/src/app/modules/user/user-projects/user-projects.component.ts b/src/app/modules/user/user-projects/user-projects.component.ts
index c6b2a1ca..6b4069b1 100644
--- a/src/app/modules/user/user-projects/user-projects.component.ts
+++ b/src/app/modules/user/user-projects/user-projects.component.ts
@@ -53,9 +53,19 @@ export class UserProjectsComponent implements OnInit {
*/
public projectsLoading = true;
+ /**
+ * Boolean to determine whether to show the projects in listview or gridview
+ */
public showListView = false;
- public showPaginationFooter = true;
+ /**
+ * Boolean to determine whether the pagination footer has to be showed
+ */
+ public showPaginationFooter = true;
+
+ /**
+ * The pagination page the user is currently on
+ */
public currentPage;
/**
@@ -73,6 +83,9 @@ export class UserProjectsComponent implements OnInit {
*/
public currentProject: Project = null;
+ /**
+ * Property to indicate whether the project is loading.
+ */
private modalRef: BsModalRef;
constructor(private userService: UserService,
From dcf36dc0450730725db274b67ee09e35242d6216 Mon Sep 17 00:00:00 2001
From: macfleury-2000
Date: Fri, 25 Jun 2021 13:42:40 +0200
Subject: [PATCH 23/30] removed another useless CSS file
---
src/app/app.component.css | 19 -------------------
src/app/app.component.css.map | 9 ---------
2 files changed, 28 deletions(-)
delete mode 100644 src/app/app.component.css
delete mode 100644 src/app/app.component.css.map
diff --git a/src/app/app.component.css b/src/app/app.component.css
deleted file mode 100644
index 7c75283a..00000000
--- a/src/app/app.component.css
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- *
- * Digital Excellence Copyright (C) 2020 Brend Smits
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published
- * by the Free Software Foundation version 3 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- * See the GNU Lesser General Public License for more details.
- *
- * You can find a copy of the GNU Lesser General Public License
- * along with this program, in the LICENSE.md file in the root project directory.
- * If not, see https://www.gnu.org/licenses/lgpl-3.0.txt
- *
- */
-/*# sourceMappingURL=app.component.css.map */
\ No newline at end of file
diff --git a/src/app/app.component.css.map b/src/app/app.component.css.map
deleted file mode 100644
index 4bb73eb0..00000000
--- a/src/app/app.component.css.map
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "version": 3,
- "mappings": "AAAA;;;;;;;;;;;;;;;;;GAiBG",
- "sources": [
- "app.component.scss"
- ],
- "names": [],
- "file": "app.component.css"
-}
\ No newline at end of file
From a1664084d7ebba06ce1920a9c02b591b92145438 Mon Sep 17 00:00:00 2001
From: macfleury-2000
Date: Fri, 25 Jun 2021 13:58:01 +0200
Subject: [PATCH 24/30] Fixed trailling whitespace lint error
---
src/app/modules/user/user-projects/user-projects.component.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/app/modules/user/user-projects/user-projects.component.ts b/src/app/modules/user/user-projects/user-projects.component.ts
index 6b4069b1..c2d3e913 100644
--- a/src/app/modules/user/user-projects/user-projects.component.ts
+++ b/src/app/modules/user/user-projects/user-projects.component.ts
@@ -61,7 +61,7 @@ export class UserProjectsComponent implements OnInit {
/**
* Boolean to determine whether the pagination footer has to be showed
*/
- public showPaginationFooter = true;
+ public showPaginationFooter = true;
/**
* The pagination page the user is currently on
From c52cc0389bc5108e0ef94acfcb37818f996346fa Mon Sep 17 00:00:00 2001
From: Ruben
Date: Fri, 25 Jun 2021 15:12:37 +0200
Subject: [PATCH 25/30] Removed commented import line
---
src/app/app-routing.module.ts | 1 -
1 file changed, 1 deletion(-)
diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts
index b4d350e0..cbd31974 100644
--- a/src/app/app-routing.module.ts
+++ b/src/app/app-routing.module.ts
@@ -21,7 +21,6 @@ import { AuthCallbackComponent } from './components/auth-callback/auth-callback.
import { NotFoundComponent } from './components/not-found/not-found.component';
import { PrivacyPolicyComponent } from './components/privacy-policy/privacy-policy.component';
import { MainComponent } from './modules/home/main/main.component';
-// import { UserModule } from './modules/user/user.module';
const routes: Routes = [
{path: '', redirectTo: '/home', pathMatch: 'full'},
From 00f5ac5b7e6ac8331778f4fd2464bd5dacf093c7 Mon Sep 17 00:00:00 2001
From: Niray Mak <44868678+niraymak@users.noreply.github.com>
Date: Mon, 28 Jun 2021 12:33:29 +0200
Subject: [PATCH 26/30] linked loading ngIf to the right boolean
---
.../modules/user/user-projects/user-projects.component.html | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/app/modules/user/user-projects/user-projects.component.html b/src/app/modules/user/user-projects/user-projects.component.html
index 3a200e7a..da551d92 100644
--- a/src/app/modules/user/user-projects/user-projects.component.html
+++ b/src/app/modules/user/user-projects/user-projects.component.html
@@ -68,8 +68,8 @@