AP-45 #57
| @@ -2,8 +2,15 @@ | ||||
| An improved Allowance Planner app. | ||||
|  | ||||
| ## Running backend | ||||
| In order to run the backend, go to the `backend directory and run: | ||||
| In order to run the backend, go to the `backend` directory and run: | ||||
|  | ||||
| ```bash | ||||
| $ go run . | ||||
| ``` | ||||
|  | ||||
| ## Running frontend | ||||
| In order to run the frontend, go to the `allowance-planner-v2` directory in the `frontend` directory and run: | ||||
|  | ||||
| ```bash | ||||
| $ ionic serve | ||||
| ``` | ||||
|   | ||||
| @@ -11,6 +11,7 @@ const routes: Routes = [ | ||||
|     path: '', | ||||
|     loadChildren: () => import('./pages/tabs/tabs.module').then(m => m.TabsPageModule) | ||||
|   }, | ||||
|  | ||||
| ]; | ||||
| @NgModule({ | ||||
|   imports: [ | ||||
|   | ||||
| @@ -3,11 +3,12 @@ import { BrowserModule } from '@angular/platform-browser'; | ||||
| import { RouteReuseStrategy } from '@angular/router'; | ||||
|  | ||||
| import { IonicModule, IonicRouteStrategy } from '@ionic/angular'; | ||||
| import { Drivers, Storage } from '@ionic/storage'; | ||||
| import { Drivers } from '@ionic/storage'; | ||||
| import { IonicStorageModule } from '@ionic/storage-angular'; | ||||
|  | ||||
| import { AppRoutingModule } from './app-routing.module'; | ||||
| import { AppComponent } from './app.component'; | ||||
| import { ReactiveFormsModule } from '@angular/forms'; | ||||
|  | ||||
| @NgModule({ | ||||
|   declarations: [AppComponent], | ||||
| @@ -15,6 +16,7 @@ import { AppComponent } from './app.component'; | ||||
|     BrowserModule, | ||||
|     IonicModule.forRoot(), | ||||
|     AppRoutingModule, | ||||
|     ReactiveFormsModule, | ||||
|     IonicStorageModule.forRoot({ | ||||
|       name: '__mydb', | ||||
|       driverOrder: [Drivers.IndexedDB, Drivers.LocalStorage] | ||||
|   | ||||
| @@ -0,0 +1,17 @@ | ||||
| import { NgModule } from '@angular/core'; | ||||
| import { Routes, RouterModule } from '@angular/router'; | ||||
|  | ||||
| import { EditTaskPage } from './edit-task.page'; | ||||
|  | ||||
| const routes: Routes = [ | ||||
|   { | ||||
|     path: '', | ||||
|     component: EditTaskPage, | ||||
|   } | ||||
| ]; | ||||
|  | ||||
| @NgModule({ | ||||
|   imports: [RouterModule.forChild(routes)], | ||||
|   exports: [RouterModule], | ||||
| }) | ||||
| export class EditTaskPageRoutingModule {} | ||||
| @@ -0,0 +1,21 @@ | ||||
| import { NgModule } from '@angular/core'; | ||||
| import { CommonModule } from '@angular/common'; | ||||
| import { FormsModule, ReactiveFormsModule } from '@angular/forms'; | ||||
|  | ||||
| import { IonicModule } from '@ionic/angular'; | ||||
|  | ||||
| import { EditTaskPageRoutingModule } from './edit-task-routing.module'; | ||||
|  | ||||
| import { EditTaskPage } from './edit-task.page'; | ||||
|  | ||||
| @NgModule({ | ||||
|   imports: [ | ||||
|     CommonModule, | ||||
|     FormsModule, | ||||
|     IonicModule, | ||||
|     EditTaskPageRoutingModule, | ||||
|     ReactiveFormsModule | ||||
|   ], | ||||
|   declarations: [EditTaskPage] | ||||
| }) | ||||
| export class EditTaskPageModule {} | ||||
| @@ -0,0 +1,21 @@ | ||||
| <ion-header [translucent]="true"> | ||||
|   <ion-toolbar> | ||||
|     <ion-title *ngIf="isAddMode">Create Task</ion-title> | ||||
|     <ion-title **ngIf="!isAddMode">Edit Task</ion-title> | ||||
|   </ion-toolbar> | ||||
| </ion-header> | ||||
|  | ||||
| <ion-content [fullscreen]="true"> | ||||
|   <form [formGroup]="form"> | ||||
|     <label>Task Name</label> | ||||
|     <input id="name" type="text" formControlName="name"/> | ||||
|  | ||||
|     <label>Reward</label> | ||||
|     <input id="name" type="number" formControlName="reward"/> | ||||
|  | ||||
|     <button type="button" [disabled]="!form.valid"> | ||||
|       <span *ngIf="isAddMode">Add Task</span> | ||||
|       <span *ngIf="!isAddMode">Update Task</span> | ||||
|     </button> | ||||
|   </form> | ||||
| </ion-content> | ||||
| @@ -0,0 +1,17 @@ | ||||
| import { ComponentFixture, TestBed } from '@angular/core/testing'; | ||||
| import { EditTaskPage } from './edit-task.page'; | ||||
|  | ||||
| describe('EditTaskPage', () => { | ||||
|   let component: EditTaskPage; | ||||
|   let fixture: ComponentFixture<EditTaskPage>; | ||||
|  | ||||
|   beforeEach(() => { | ||||
|     fixture = TestBed.createComponent(EditTaskPage); | ||||
|     component = fixture.componentInstance; | ||||
|     fixture.detectChanges(); | ||||
|   }); | ||||
|  | ||||
|   it('should create', () => { | ||||
|     expect(component).toBeTruthy(); | ||||
|   }); | ||||
| }); | ||||
| @@ -0,0 +1,46 @@ | ||||
| import { Component, OnInit } from '@angular/core'; | ||||
| import { FormBuilder, FormGroup, Validators } from '@angular/forms'; | ||||
| import { ActivatedRoute } from '@angular/router'; | ||||
| import { TaskService } from 'src/app/services/task.service'; | ||||
|  | ||||
| @Component({ | ||||
|   selector: 'app-edit-task', | ||||
|   templateUrl: './edit-task.page.html', | ||||
|   styleUrls: ['./edit-task.page.scss'], | ||||
|   standalone: false, | ||||
| }) | ||||
| export class EditTaskPage implements OnInit { | ||||
|   form: FormGroup; | ||||
|   id: number; | ||||
|   isAddMode: boolean; | ||||
|  | ||||
|   constructor( | ||||
|     private route: ActivatedRoute, | ||||
|     private formBuilder: FormBuilder, | ||||
|     private taskService: TaskService, | ||||
|   ) { | ||||
|     console.log('Test?') | ||||
|     this.id = this.route.snapshot.params['id']; | ||||
|     this.isAddMode = !this.id; | ||||
|  | ||||
|     this.form = this.formBuilder.group({ | ||||
|       name: ['', Validators.required], | ||||
|       reward: ['', Validators.required], | ||||
|       assigned: ['', Validators.required] | ||||
|     }); | ||||
|   } | ||||
|  | ||||
|   ngOnInit() { | ||||
|     console.log('Test?') | ||||
|     if (!this.isAddMode) { | ||||
|       this.taskService.getTaskById(this.id).subscribe(task => { | ||||
|         this.form.setValue({ | ||||
|           name: task.name, | ||||
|           reward: task.reward, | ||||
|           assigned: task.assigned | ||||
|         }) | ||||
|       }); | ||||
|     } | ||||
|   } | ||||
|  | ||||
| } | ||||
| @@ -17,7 +17,7 @@ const routes: Routes = [ | ||||
|       }, | ||||
|       { | ||||
|         path: 'tasks', | ||||
|         loadChildren: () => import('../tasks/tasks.module').then(m => m.TasksPageModule) | ||||
|         loadChildren: () => import('../tasks/tasks.module').then(m => m.TasksPageModule), | ||||
|       }, | ||||
|       { | ||||
|         path: '', | ||||
|   | ||||
| @@ -6,6 +6,10 @@ const routes: Routes = [ | ||||
|   { | ||||
|     path: '', | ||||
|     component: TasksPage, | ||||
|     children: [ | ||||
|       { path: 'add', loadChildren: () => import('../edit-task/edit-task.module').then(m => m.EditTaskPageModule) }, | ||||
|       { path: 'edit/:id', loadChildren: () => import('../edit-task/edit-task.module').then(m => m.EditTaskPageModule) } | ||||
|     ] | ||||
|   } | ||||
| ]; | ||||
|  | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| import { Component, OnInit } from '@angular/core'; | ||||
| import { TaskService } from 'src/app/services/task.service'; | ||||
| import { Task } from 'src/app/models/task'; | ||||
| import { ActivatedRoute, Router } from '@angular/router'; | ||||
|  | ||||
| @Component({ | ||||
|   selector: 'app-tasks', | ||||
| @@ -12,16 +13,22 @@ export class TasksPage implements OnInit { | ||||
|   public tasks: Array<Task> = []; | ||||
|  | ||||
|   constructor( | ||||
|     private taskService: TaskService | ||||
|     private taskService: TaskService, | ||||
|     private router: Router, | ||||
|     private route: ActivatedRoute | ||||
|   ) {} | ||||
|  | ||||
|   ngOnInit(): void { | ||||
|     this.getTasks(); | ||||
|   } | ||||
|  | ||||
|   getTasks() { | ||||
|     this.taskService.getTaskList().subscribe(tasks => { | ||||
|       this.tasks = tasks; | ||||
|     }); | ||||
|   } | ||||
|  | ||||
|   createTask() { | ||||
|     this.taskService.createTask({ name: 'Created task', reward: 10, assigned: 1 }); | ||||
|     this.router.navigate(['edit', 1], { relativeTo: this.route }); | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -8,11 +8,6 @@ import { Task } from '../models/task'; | ||||
| }) | ||||
| export class TaskService { | ||||
|     private url = 'http://localhost:8080/api'; | ||||
|     private headers = { | ||||
|         "access-control-allow-origin": "*", | ||||
|         'Access-Control-Allow-Headers': 'Content-Type, Authorization', | ||||
|         'Access-Control-Allow-Methods': '*', | ||||
|     }; | ||||
|  | ||||
|     constructor(private http: HttpClient) {} | ||||
|  | ||||
| @@ -20,7 +15,11 @@ export class TaskService { | ||||
|         return this.http.get<Task[]>(`${this.url}/tasks`); | ||||
|     } | ||||
|  | ||||
|     getTaskById(taskId: number): Observable<Task> { | ||||
|         return this.http.get<Task>(`${this.url}/task/${taskId}`); | ||||
|     } | ||||
|  | ||||
|     createTask(task: Partial<Task>) { | ||||
|         this.http.post(`${this.url}/tasks`, task, { headers: this.headers }).subscribe(t => console.log('TEST: ', t)); | ||||
|         this.http.post(`${this.url}/tasks`, task).subscribe(); | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user