diff options
Diffstat (limited to '')
11 files changed, 240 insertions, 75 deletions
diff --git a/ufund-ui/src/app/components/cupboard/cupboard.component.html b/ufund-ui/src/app/components/cupboard/cupboard.component.html index 6f7799e..2cfbe2d 100644 --- a/ufund-ui/src/app/components/cupboard/cupboard.component.html +++ b/ufund-ui/src/app/components/cupboard/cupboard.component.html @@ -8,6 +8,7 @@          <button [ngClass]="selectedForm === 'create' ? 'selected-tab' : 'tab'" (click)="selectForm('create')">Create new Need</button>          <button [ngClass]="selectedForm === 'update' ? 'selected-tab' : 'tab'" (click)="selectForm('update')">Update existing Need</button>      </div> +    <app-need-edit [selectedNeed]="selectedNeed" (refreshNeedList)="needList.refresh()"></app-need-edit>      <div id="create-form" *ngIf="selectedForm === 'create'">          <h1> Create Need </h1>          <form #cupboardForm="ngForm" (ngSubmit)="submit(cupboardForm.value)"> @@ -32,29 +33,6 @@          </form>      </div> -    <div id="update-form" *ngIf="selectedForm === 'update'"> -        <h1> Update Need </h1> -        <label>Needs:</label><br> -        <form #updateForm="ngForm" (ngSubmit)="update(updateForm.value)"> -            <input type="text" name="name" [(ngModel)]="selectedNeed.name"><br> -            <input type="text" name="image" [(ngModel)]="selectedNeed.image"><br> -            <input type="text" name="location" [(ngModel)]="selectedNeed.location"><br> -            <label>Max Goal:</label><br> -            <input type="number" name="maxGoal" [(ngModel)]="selectedNeed.maxGoal"><br> -            <label>Type</label><br> -            <input type="radio" name="type" value="MONETARY" [(ngModel)]="selectedNeed.type"> -            <label>Monetary</label><br> -            <input type="radio" name="type" value="PHYSICAL" [(ngModel)]="selectedNeed.type"> -            <label>Physical</label><br> -            <input type="checkbox" name="urgent" [(ngModel)]="selectedNeed.urgent"> -            <label>Urgent</label> <br> -            <label>Description</label> <br> -            <textarea name="description" [(ngModel)]="selectedNeed.description"></textarea><br> -            <input type="submit" value="Submit"> - -        </form> - -    </div>      <hr>  </div> diff --git a/ufund-ui/src/app/components/cupboard/cupboard.component.ts b/ufund-ui/src/app/components/cupboard/cupboard.component.ts index 662def4..e70d98f 100644 --- a/ufund-ui/src/app/components/cupboard/cupboard.component.ts +++ b/ufund-ui/src/app/components/cupboard/cupboard.component.ts @@ -82,45 +82,6 @@ export class CupboardComponent implements OnInit {          return type === ("MANAGER" as unknown as userType);      } -    update(form: any) { -        console.log(form); -        const need: Need = { -            name: form.name, -            image: form.image, -            location: form.location, -            id: this.selectedNeed.id, //system will control this -            maxGoal: form.maxGoal, -            type: GoalType[form.type as keyof typeof GoalType], -            urgent: form.urgent, -            filterAttributes: [], -            current: 0, -            description: form.description -        }; - -        this.cupboardService.updateNeed(need.id, need) -            .pipe(catchError((ex, _) => { -                if (ex.status == 500) { -                    this.toastService.sendToast(ToastType.ERROR, 'Fields cannot be blank'); -                } else if (ex.status == 400) { -                    this.toastService.sendToast(ToastType.ERROR, ex.error); -                } else { -                    this.toastService.sendToast(ToastType.ERROR, "Error on creating need"); -                } -                return of() -            })) -            .subscribe( -                (result) => { -                    if (result) { -                        console.log("need updated successfully"); -                        this.needList?.refresh() -                    } else { -                        console.log("need update failed"); -                    } -                } - -            ); -    } -      submit(form: any) {          const need: Need = {              name: form.name, diff --git a/ufund-ui/src/app/components/funding-basket/funding-basket.component.ts b/ufund-ui/src/app/components/funding-basket/funding-basket.component.ts index ecf452a..dcacca1 100644 --- a/ufund-ui/src/app/components/funding-basket/funding-basket.component.ts +++ b/ufund-ui/src/app/components/funding-basket/funding-basket.component.ts @@ -13,7 +13,6 @@ import {ToastsService, ToastType} from '../../services/toasts.service';      styleUrl: './funding-basket.component.css'  })  export class FundingBasketComponent implements OnInit { -    statusText: any;      constructor(          private router: Router, diff --git a/ufund-ui/src/app/components/need-edit/need-edit.component.css b/ufund-ui/src/app/components/need-edit/need-edit.component.css new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/ufund-ui/src/app/components/need-edit/need-edit.component.css diff --git a/ufund-ui/src/app/components/need-edit/need-edit.component.html b/ufund-ui/src/app/components/need-edit/need-edit.component.html new file mode 100644 index 0000000..bcb166b --- /dev/null +++ b/ufund-ui/src/app/components/need-edit/need-edit.component.html @@ -0,0 +1,22 @@ +<div id="update-form"> +    <h1> Update Need </h1> +    <label>Needs:</label><br> +    <form #updateForm="ngForm" (ngSubmit)="update(updateForm.value)"> +        <input type="text" name="name" [(ngModel)]="selectedNeed.name"><br> +        <input type="text" name="image" [(ngModel)]="selectedNeed.image"><br> +        <input type="text" name="location" [(ngModel)]="selectedNeed.location"><br> +        <label>Max Goal:</label><br> +        <input type="number" name="maxGoal" [(ngModel)]="selectedNeed.maxGoal"><br> +        <label>Type</label><br> +        <input type="radio" name="type" value="MONETARY" [(ngModel)]="selectedNeed.type"> +        <label>Monetary</label><br> +        <input type="radio" name="type" value="PHYSICAL" [(ngModel)]="selectedNeed.type"> +        <label>Physical</label><br> +        <input type="checkbox" name="urgent" [(ngModel)]="selectedNeed.urgent"> +        <label>Urgent</label> <br> +        <label>Description</label> <br> +        <textarea name="description" [(ngModel)]="selectedNeed.description"></textarea><br> +        <input type="submit" value="Submit"> + +    </form> +</div>
\ No newline at end of file diff --git a/ufund-ui/src/app/components/need-edit/need-edit.component.ts b/ufund-ui/src/app/components/need-edit/need-edit.component.ts new file mode 100644 index 0000000..2462534 --- /dev/null +++ b/ufund-ui/src/app/components/need-edit/need-edit.component.ts @@ -0,0 +1,61 @@ +import { Component, Input, Output, EventEmitter } from '@angular/core'; +import { Need, GoalType } from '../../models/Need';  +import { CupboardService } from '../../services/cupboard.service'; +import { catchError, of } from 'rxjs'; +import { ToastsService, ToastType } from '../../services/toasts.service'; + +@Component({ +  selector: 'app-need-edit', +  standalone: false, +  templateUrl: './need-edit.component.html', +  styleUrl: './need-edit.component.css' +}) +export class NeedEditComponent { +  constructor( +    private cupboardService: CupboardService, +    private toastService: ToastsService + +  ) {} + +  @Input() selectedNeed!: Need; +  @Output() refreshNeedList = new EventEmitter<void>(); + +  update(form: any) { +    console.log(form); +    const need: Need = { +        name: form.name, +        image: form.image, +        location: form.location, +        id: this.selectedNeed.id, //system will control this +        maxGoal: form.maxGoal, +        type: GoalType[form.type as keyof typeof GoalType], +        urgent: form.urgent, +        filterAttributes: [], +        current: 0, +        description: form.description +    }; + +    this.cupboardService.updateNeed(need.id, need) +        .pipe(catchError((ex, _) => { +            if (ex.status == 500) { +                this.toastService.sendToast(ToastType.ERROR, 'Fields cannot be blank'); +            } else if (ex.status == 400) { +                this.toastService.sendToast(ToastType.ERROR, ex.error); +            } else { +                this.toastService.sendToast(ToastType.ERROR, "Error on creating need"); +            } +            return of() +        })) +        .subscribe( +            (result) => { +                if (result) { +                    console.log("need updated successfully"); +                    this.refreshNeedList.emit(); +                } else { +                    console.log("need update failed"); +                } +            } + +        ); +  } +}
\ No newline at end of file diff --git a/ufund-ui/src/app/components/need-list/need-list.component.html b/ufund-ui/src/app/components/need-list/need-list.component.html index d43e07b..8ea7b88 100644 --- a/ufund-ui/src/app/components/need-list/need-list.component.html +++ b/ufund-ui/src/app/components/need-list/need-list.component.html @@ -61,10 +61,10 @@                  <span class="icon">add</span>Add To Basket              </button>              <button *ngIf="isManager()" (click)="select(need)"> -                <span class="icon">edit</span>Delete Need +                <span class="icon">edit</span>Edit Need              </button>              <button *ngIf="isManager()" (click)="delete(need.id)" > -                <span class="icon">delete</span>Edit Need +                <span class="icon">delete</span>Delete Need              </button>          </div>      </div> diff --git a/ufund-ui/src/app/components/need-list/need-list.component.ts b/ufund-ui/src/app/components/need-list/need-list.component.ts index bc3de42..cd3d9bd 100644 --- a/ufund-ui/src/app/components/need-list/need-list.component.ts +++ b/ufund-ui/src/app/components/need-list/need-list.component.ts @@ -190,6 +190,7 @@ export class NeedListComponent {    delete(id : number) {      this.cupboardService.deleteNeed(id).subscribe(() => { +        this.toastService.sendToast(ToastType.INFO, "Need deleted.")        this.needs = this.needs.filter(n => n.id !== id)      })      this.refresh(); @@ -229,10 +230,7 @@ export class NeedListComponent {        } else {          this.toastService.sendToast(ToastType.ERROR, "This need is already in your basket!")        } - -      } -    }    back() { diff --git a/ufund-ui/src/app/components/need-page/need-page.component.css b/ufund-ui/src/app/components/need-page/need-page.component.css index a3a4014..f950171 100644 --- a/ufund-ui/src/app/components/need-page/need-page.component.css +++ b/ufund-ui/src/app/components/need-page/need-page.component.css @@ -8,3 +8,60 @@      flex-direction: column;      width: 1000px;  } + +.needName { +    font-weight: bold; +} + +.needType { +    text-transform: uppercase; +    font-size: 10pt; +} + +.split { +    display: flex; +    flex-direction: row; +    justify-content: space-between; + + +    .left { +        display: flex; +        flex-direction: column; +    } + +    .right { +        display: flex; +        flex-direction: column; +        align-items: end; +    } +} + +.urgent { +    font-size: 11pt; +    background-color: rgba(255, 165, 0, 0.27); +    color: rgba(255, 165, 0, 1); +    padding: 2px; +    border-radius: 5px; +} + +.prog { +    display: flex; +    flex-direction: column; +} + +.actionArea { +    display: flex; +    padding: 5px; +    gap: 5px; +} + +#editor { +    position: absolute; +    background-color: #4a4a4a; +    display: flex; +    flex-direction: column; +    justify-self: center; +    align-self: center; +    padding: 20px; +    box-shadow: 0 0 100px black; +} diff --git a/ufund-ui/src/app/components/need-page/need-page.component.html b/ufund-ui/src/app/components/need-page/need-page.component.html index a72167c..a8479fd 100644 --- a/ufund-ui/src/app/components/need-page/need-page.component.html +++ b/ufund-ui/src/app/components/need-page/need-page.component.html @@ -13,14 +13,47 @@      </div>      <hr> +    <span>{{need?.description}}</span> +    <img *ngIf="need?.image" alt="Need image" [src]="need?.image"/>      <p>Location: {{need?.location}}</p>      <p>Urgent: {{need?.urgent}}</p>      <span>{{need?.current}} / {{need?.maxGoal}}</span>      <progress [value]="need?.current" [max]="need?.maxGoal"></progress>      <span>This goal is <strong>{{(((need?.current ?? 0)*100) / (need?.maxGoal ?? 0)).toFixed(0)}}%</strong> complete!</span> -    <div> -        <button>Add to basket</button> -        <button>Edit</button> -        <button>Delete</button> +    <div class="actionArea"> +        <button *ngIf="isHelper()" (click)="add(need!)"> +            <span class="icon">add</span>Add To Basket +        </button> +        <button *ngIf="isManager()" (click)="edit(need!)"> +            <span class="icon">edit</span>Edit Need +        </button> +        <button *ngIf="isManager()" (click)="delete(need!.id)" > +            <span class="icon">delete</span>Delete Need +        </button> +    </div> + +    <div [routerLink]="'/need/' + need.id" class="clickable"> +        <div class="split"> +            <div class="left"> +                <span class="needName">{{need.name}}</span> +                <span class="needType">{{need.type}}</span> +            </div> + +            <div class="right"> +                <span *ngIf="need.urgent" class="urgent">URGENT</span> +                <span *ngIf="need.location"><span class="icon">location_on</span>{{need.location}}</span> +            </div> +        </div> + +        <br> + +        <div class="prog"> +            <span id="hover-status-label-{{need.id}}"> </span> +            <span>{{need.current}}/{{need.maxGoal}} ({{((need.current / need.maxGoal) * 100).toFixed(0)}}%)</span> +            <progress [value]="need.current" [max]="need.maxGoal"></progress> +        </div> +      </div> + +<!--    <app-need-edit id="editor" [selectedNeed]="need!"></app-need-edit>-->  </div> diff --git a/ufund-ui/src/app/components/need-page/need-page.component.ts b/ufund-ui/src/app/components/need-page/need-page.component.ts index e38554c..ad4cacf 100644 --- a/ufund-ui/src/app/components/need-page/need-page.component.ts +++ b/ufund-ui/src/app/components/need-page/need-page.component.ts @@ -1,8 +1,12 @@  import {Component, Input} from '@angular/core';  import {GoalType, Need} from '../../models/Need'; -import {ActivatedRoute} from "@angular/router"; +import {ActivatedRoute, Router} from "@angular/router";  import {CupboardService} from "../../services/cupboard.service"; -import {NgFor} from '@angular/common'; +import {userType} from '../../models/User'; +import {AuthService} from '../../services/auth.service'; +import {catchError, of} from 'rxjs'; +import {ToastsService, ToastType} from '../../services/toasts.service'; +import {UsersService} from '../../services/users.service';  @Component({      selector: 'app-need-page', @@ -14,11 +18,15 @@ export class NeedPageComponent {      constructor(          private route: ActivatedRoute,          private cupboardService: CupboardService, +        private authService: AuthService, +        private usersService: UsersService, +        private toastService: ToastsService, +        private router: Router      ) {}      public GoalType = GoalType; -    @Input() need?: Need; +    @Input() need!: Need;      ngOnInit(): void {          const id = Number(this.route.snapshot.paramMap.get('id')); @@ -28,4 +36,52 @@ export class NeedPageComponent {      back() {          window.history.back();      } + +    isManager() { +        const type = this.authService.getCurrentUser()?.type; +        return type === ("MANAGER" as unknown as userType); +    } + +    isHelper() { +        const type = this.authService.getCurrentUser()?.type; +        return type === ("HELPER" as unknown as userType); +    } + +    add(need: Need) { +        const currentUser = this.authService.getCurrentUser(); +        //console.log("get current user in angular:", currentUser) +        if (currentUser) { +            if (!currentUser.basket.includes(need.id)) { +                currentUser.basket.push(need.id); +                this.usersService.updateUser(currentUser) +                    .pipe(catchError((err, _) =>  { +                        console.error(err); +                        return of(); +                    })) +                    .subscribe(() => { +                        this.usersService.refreshBasket(); +                    }); +            } else { +                this.toastService.sendToast(ToastType.ERROR, "This need is already in your basket!") +            } +        } +    } + +    delete(id : number) { +        this.cupboardService.deleteNeed(id) +            .pipe(catchError((ex, r) => { +                this.toastService.sendToast(ToastType.ERROR, ex.error) +                return of() +            })) +            .subscribe(() => { +                // this.needs = this.needs.filter(n => n.id !== id) +                this.toastService.sendToast(ToastType.INFO, "Need deleted") +                this.router.navigate(['/']) +            }) +        // this.refresh(); +    } + +    edit(need: Need) { + +    }  }  | 
