diff options
author | Hayden Hartman <haydenhartman10@gmail.com> | 2025-03-17 21:49:35 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-03-17 21:49:35 -0400 |
commit | d1b7b81cbedc673cf6f52ac5745438f95083b78e (patch) | |
tree | 948255f18f05f2a26e22126de44fa433635876df /ufund-ui | |
parent | 1bf10f9f26f47ea5cff7ff48d5664febb0ed2585 (diff) | |
parent | 54876363de44791ba65b6c43b795f8d0c3548ecc (diff) | |
download | JellySolutions-d1b7b81cbedc673cf6f52ac5745438f95083b78e.tar.gz JellySolutions-d1b7b81cbedc673cf6f52ac5745438f95083b78e.tar.bz2 JellySolutions-d1b7b81cbedc673cf6f52ac5745438f95083b78e.zip |
Merge pull request #10 from RIT-SWEN-261-02/cupboard-component
Cupboard component
Diffstat (limited to 'ufund-ui')
8 files changed, 325 insertions, 43 deletions
diff --git a/ufund-ui/src/app/components/cupboard/cupboard.component.css b/ufund-ui/src/app/components/cupboard/cupboard.component.css index e69de29..fe4971a 100644 --- a/ufund-ui/src/app/components/cupboard/cupboard.component.css +++ b/ufund-ui/src/app/components/cupboard/cupboard.component.css @@ -0,0 +1,21 @@ +:host { + display: block; + border: 2px solid #000; + border-radius: 5px; + padding: 10px 20px; +} + +#menu, #create-form, #delete-form, #update-form { + background-color: #d9d9d9; + padding: 10px 20px 20px 20px; + border: 2px solid #000; + border-radius: 5px; + width: 20%; + visibility: visible; + +} + +#create-button { + padding: 10px 20px; + +}
\ No newline at end of file diff --git a/ufund-ui/src/app/components/cupboard/cupboard.component.html b/ufund-ui/src/app/components/cupboard/cupboard.component.html index ad8e60c..65545e8 100644 --- a/ufund-ui/src/app/components/cupboard/cupboard.component.html +++ b/ufund-ui/src/app/components/cupboard/cupboard.component.html @@ -1,17 +1,48 @@ <h1> Cupboard </h1> -<form> - <label for="name">Name:</label><br> - <input #name type="text" name="name"><br> - <label for="id">Id:</label><br> - <input #id type="number" name="id"><br> - <label for="max-goal">Max Goal:</label><br> - <input #maxgoal type="number" name="max-goal"><br> - <label>Type</label><br> - <input id="monetary" type="radio" name="type" value="MONETARY"> - <label for="monetary">Monetary</label><br> - <input #physical type="radio" name="type" value="PHYSICAL"> - <label for="physical">Physical</label><br> -</form> -<button (click)="submit(name.value, id.valueAsNumber, maxgoal.valueAsNumber, physical.value)">Submit</button> - -<app-need-list></app-need-list> +<h2 *ngIf="isManager()" > Admin View </h2> +<div id="menu" *ngIf="isManager()"> + <button (click)="opencreate()">Create new Need</button> + <button (click)="openupdate()">Update existing Need</button> +</div> +<div id="create-form"> + <h1> Create a new need </h1> + <form #cupboardForm="ngForm" (ngSubmit)="submit(cupboardForm.value)"> + <label>Name:</label><br> + <input type="text" name="name" ngModel><br> + <label>Max Goal:</label><br> + <input type="number" name="maxGoal" ngModel><br> + <label>Type</label><br> + <input type="radio" name="type" value="MONETARY" ngModel> + <label>Monetary</label><br> + <input type="radio" name="type" value="PHYSICAL" ngModel> + <label>Physical</label><br> + <input type="submit" value="Submit"> + </form> + <button (click)="back()">Close</button> + +</div> +<div id="update-form"> + <h1> Update a need </h1> + <label>Needs:</label><br> + <form #updateForm="ngForm" (ngSubmit)="update(updateForm.value)"> + <div *ngFor="let need of needs"> + + <input type="radio" name="id" [value]=need.id [(ngModel)]="selectedNeedId" (change)="populateForm(need)"> + <label name="template">{{need.name}}</label><br> + </div> + <label>Name:</label><br> + <input type="text" name="name" [(ngModel)]="selectedNeed.name"><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="submit" value="Submit"> + </form> + <button (click)="back()">Close</button> + +</div> +<hr> +<app-need-list></app-need-list>
\ No newline at end of file diff --git a/ufund-ui/src/app/components/cupboard/cupboard.component.ts b/ufund-ui/src/app/components/cupboard/cupboard.component.ts index 53dad8a..a930f06 100644 --- a/ufund-ui/src/app/components/cupboard/cupboard.component.ts +++ b/ufund-ui/src/app/components/cupboard/cupboard.component.ts @@ -1,8 +1,8 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, ViewChild } from '@angular/core'; import { CupboardService } from '../../services/cupboard.service'; -import { NeedListComponent } from '../need-list/need-list.component'; - +import { UsersService } from '../../services/users.service'; import { Need, GoalType } from '../../models/Need'; +import { userType } from '../../models/User'; @Component({ selector: 'app-cupboard', @@ -10,22 +10,131 @@ import { Need, GoalType } from '../../models/Need'; templateUrl: './cupboard.component.html', styleUrl: './cupboard.component.css' }) -export class CupboardComponent implements - OnInit { - - constructor(private cupboardService: CupboardService){} - ngOnInit() { - - - } - need!: Need; - submit(name: string, id: number, maxGoal: number, type: string) { - if (this.need) { - this.need.name = name; - this.need.id = id; - this.need.maxGoal = maxGoal; - console.log(type); - this.cupboardService.createNeed(this.need); + +export class CupboardComponent implements OnInit { +needs: any; + constructor(private cupboardService: CupboardService, private usersService: UsersService) { } + + ngOnInit(): void { + this.cupboardService.getNeeds().subscribe(n => this.needs = n); + this.close(); + this.openmenu(); + + if (this.isManager()) { + console.log("Admin view of Cupboard"); + } else { + console.log("Limited helper view of Cupboard"); } } + + selectedNeed: any = { + name: '', + id: null, + maxGoal: null, + type: '' + }; + selectedNeedId: number | null = null; + + private hideElement(element: any) { + if (element){ + element.style.visibility = 'hidden'; + element.style.position = 'absolute'; + } + } + + private showElement(element: any) { + if (element){ + element.style.visibility = 'visible'; + element.style.position = 'relative'; + } + } + + openmenu() { + const menuElement = document.getElementById('menu'); + this.showElement(menuElement); + } + + opencreate() { + this.close(); + this.showElement(document.getElementById('create-form')); + } + + openupdate() { + this.close(); + this.showElement(document.getElementById('update-form')); + } + + back() { + this.close(); + this.openmenu(); + } + + close() { + this.hideElement(document.getElementById('create-form')); + this.hideElement(document.getElementById('destroy-form')); + this.hideElement(document.getElementById('menu')); + this.hideElement(document.getElementById('update-form')); + } + + populateForm(need: any): void { + this.selectedNeed = { ...need }; + } + + isManager() { + const type = this.usersService.getCurrentUser()?.type; + return type === ("MANAGER" as unknown as userType); + } + + update(form: any) { + console.log(form); + const need: Need = { + name: form.name, + id: form.id, //system will control this + maxGoal: form.maxGoal, + type: GoalType[form.type as keyof typeof GoalType], + filterAttributes: [], + current: 0 + }; + console.log("need:", need); + console.log(need.id, need, "need updated"); + this.cupboardService.updateNeed(need.id, need).subscribe( + (result) => { + if (result) { + console.log("need updated successfully"); + location.reload(); + } else { + console.log("need update failed"); + } + } + + ); + } + + submit(form: any) { + const need: Need = { + name: form.name, + id: 0, + maxGoal: form.maxGoal, + type: form.type, + filterAttributes: [], + current: 0 + }; + console.log("need:", need); + console.log("form submitted. creating need: ", need); + this.cupboardService.createNeed(need).subscribe( + (result) => { + if (result) { + console.log("need created successfully"); + location.reload(); + } else { + console.log("need creation failed"); + } + } + + ); + } + + destroy() { + + } } diff --git a/ufund-ui/src/app/components/need-list/need-list.component.css b/ufund-ui/src/app/components/need-list/need-list.component.css index e69de29..bbc3f2c 100644 --- a/ufund-ui/src/app/components/need-list/need-list.component.css +++ b/ufund-ui/src/app/components/need-list/need-list.component.css @@ -0,0 +1,24 @@ +:host { + list-style-type:circle; + border: 2px solid #000; + display: block; + width: 30%; + border-radius: 5px; + +} + +li, div { + border: 2px solid #000; + border-radius: 5px; + padding: 5px; + margin: 5px; + +} + +#search-form { + background-color: #d9d9d9; + padding: 10px 20px 20px 20px; + border: 2px solid #000; + border-radius: 5px; + visibility: visible; + }
\ 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 6e48d96..07f6735 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 @@ -1,6 +1,26 @@ <h1>Needs List</h1> +<input id="search-button" type="button" value="Search" (click)="open()"> +<div id="search-form"> + <form #searchForm="ngForm"> + <label>Search:</label><br> + <input type="text" name="search" (input)="search(searchForm.value)" ngModel> + <input type="button" value="Clear" (click)="searchForm.reset()"> <br> + </form> + <button (click)="close()">Close</button> + <div> + <h2 id="search-status">Search Results:</h2> + <div *ngFor="let need of searchResults"> + <a routerLink="/need/{{need.id}}"> + {{need.name}} + </a> + <button (click)="delete(need.id)" *ngIf="isManager()">Delete</button> + </div> + </div> +</div> + <li *ngFor="let need of needs"> <a routerLink="/need/{{need.id}}"> {{need.name}} </a> + <button (click)="delete(need.id)" *ngIf="isManager()">Delete</button> </li> 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 a3eb072..4409b63 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 @@ -1,7 +1,8 @@ import { Component } from '@angular/core'; import {Need} from '../../models/Need'; import {CupboardService} from '../../services/cupboard.service'; - +import { UsersService } from '../../services/users.service'; +import { userType } from '../../models/User'; @Component({ selector: 'app-need-list', standalone: false, @@ -10,12 +11,88 @@ import {CupboardService} from '../../services/cupboard.service'; }) export class NeedListComponent { needs: Need[] = []; - + searchResults: Need[] = []; + constructor( - private cupboardService: CupboardService + private cupboardService: CupboardService, + private usersService: UsersService ) {} ngOnInit(): void { this.cupboardService.getNeeds().subscribe(n => this.needs = n) + this.close(); + } + + private showElement(element: any) { + if (element){ + element.style.visibility = 'visible'; + element.style.position = 'relative'; + } + } + + private hideElement(element: any) { + if (element){ + element.style.visibility = 'hidden'; + element.style.position = 'absolute'; + } + } + + private updateSearchStatus(text: string) { + let element = document.getElementById('search-status'); + if (element) { + element.innerHTML = text; + } + } + + open() { + this.hideElement(document.getElementById('search-button')); + this.showElement(document.getElementById('search-form')); + } + + close() { + this.hideElement(document.getElementById('search-form')); + this.showElement(document.getElementById('search-button')); + } + + private searchDelay: any; + + async search(form: any) { + //wait .25 seconds before searching but cancel if another search is made during the wait to prevent too many api calls + + //remove previous search if it exists + if (this.searchDelay) { + clearTimeout(this.searchDelay); + } + + this.searchDelay = setTimeout(() => { + const currentSearchValue = form.search; //latest value of the search + this.cupboardService.searchNeeds(currentSearchValue).subscribe((n) => { + this.searchResults = n; + console.log(currentSearchValue, this.searchResults); + if (this.searchResults.length === this.needs.length) { + this.updateSearchStatus("Please refine your search"); + this.searchResults = []; + } else if (this.searchResults.length === 0) { + this.updateSearchStatus("No results found"); + } else { + this.updateSearchStatus("Search results:"); + } + }); + }, 250); + } + + delete(id : number) { + this.cupboardService.deleteNeed(id).subscribe(() => { + this.needs = this.needs.filter(n => n.id !== id) + }) + } + + isManager() { + const type = this.usersService.getCurrentUser()?.type; + return type === ("MANAGER" as unknown as userType); + } + + back() { + this.searchResults = []; } } diff --git a/ufund-ui/src/app/models/User.ts b/ufund-ui/src/app/models/User.ts index 141f8aa..b640e04 100644 --- a/ufund-ui/src/app/models/User.ts +++ b/ufund-ui/src/app/models/User.ts @@ -1,12 +1,12 @@ import {Need} from './Need'; -enum userType { +export enum userType { HELPER, MANAGER } export interface User { - username: string; - basket: Need[]; - type: userType + username: string; + basket: Need[]; + type: userType } diff --git a/ufund-ui/src/app/services/cupboard.service.ts b/ufund-ui/src/app/services/cupboard.service.ts index 4a2b4b0..9e14106 100644 --- a/ufund-ui/src/app/services/cupboard.service.ts +++ b/ufund-ui/src/app/services/cupboard.service.ts @@ -38,6 +38,6 @@ export class CupboardService { } deleteNeed(id: number): Observable<boolean> { - return this.http.put<boolean>(`${this.url}/${id}`, this.httpOptions) + return this.http.delete<boolean>(`${this.url}/${id}`, this.httpOptions) } } |