aboutsummaryrefslogtreecommitdiff
path: root/ufund-ui/src/app/components
diff options
context:
space:
mode:
Diffstat (limited to 'ufund-ui/src/app/components')
-rw-r--r--ufund-ui/src/app/components/cupboard/cupboard.component.css21
-rw-r--r--ufund-ui/src/app/components/cupboard/cupboard.component.html63
-rw-r--r--ufund-ui/src/app/components/cupboard/cupboard.component.ts147
-rw-r--r--ufund-ui/src/app/components/need-list/need-list.component.css24
-rw-r--r--ufund-ui/src/app/components/need-list/need-list.component.html20
-rw-r--r--ufund-ui/src/app/components/need-list/need-list.component.ts83
6 files changed, 320 insertions, 38 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 = [];
}
}