add select department

This commit is contained in:
Kenta420 2023-12-28 11:07:17 +07:00
parent 17030c72ce
commit c5d54ad5c5
9 changed files with 79 additions and 8 deletions

View file

@ -24,7 +24,10 @@
></path> ></path>
</svg> </svg>
</button> </button>
<a routerLink="/{{ current_department }}/recipes" class="flex ml-14 max-sm:hidden"> <a
routerLink="/{{ current_department }}/recipes"
class="flex ml-14 max-sm:hidden"
>
<img <img
src="assets/logo.svg" src="assets/logo.svg"
class="h-10 md:h-20 px-4" class="h-10 md:h-20 px-4"

View file

@ -1,6 +1,6 @@
import { Component, OnDestroy, OnInit } from '@angular/core'; import { Component, OnDestroy, OnInit } from '@angular/core';
import { ActivatedRoute, RouterModule } from '@angular/router'; import { ActivatedRoute, RouterModule } from '@angular/router';
import { DatePipe, NgFor, NgIf } from '@angular/common'; import { DatePipe, NgFor, NgIf, NgOptimizedImage } from '@angular/common';
import { GoogleButtonComponent } from 'src/app/shared/googleButton/googleButton.component'; import { GoogleButtonComponent } from 'src/app/shared/googleButton/googleButton.component';
import { UserService } from '../services/user.service'; import { UserService } from '../services/user.service';
import { User } from '../models/user.model'; import { User } from '../models/user.model';
@ -16,22 +16,28 @@ interface MenuItem {
selector: 'app-layout', selector: 'app-layout',
templateUrl: './layout.component.html', templateUrl: './layout.component.html',
standalone: true, standalone: true,
imports: [RouterModule, NgFor, NgIf, GoogleButtonComponent, DatePipe], imports: [
RouterModule,
NgFor,
NgIf,
GoogleButtonComponent,
DatePipe,
NgOptimizedImage,
],
}) })
export class LayoutComponent implements OnInit, OnDestroy { export class LayoutComponent implements OnInit, OnDestroy {
current_department = this._router.snapshot.paramMap.get('department')!; current_department = this._router.snapshot.paramMap.get('department')!;
menuItems: MenuItem[] = [ menuItems: MenuItem[] = [
{ {
name: 'Recipe', name: 'Recipe',
icon_url: 'assets/icons/recipes.svg', icon_url: 'assets/icons/recipes.svg',
link: '/'+this.current_department+'/recipes', link: '/' + this.current_department + '/recipes',
}, },
{ {
name: 'Log', name: 'Log',
icon_url: 'assets/icons/logs.svg', icon_url: 'assets/icons/logs.svg',
link: '/'+this.current_department+'/log', link: '/' + this.current_department + '/log',
}, },
]; ];
date = new Date(); date = new Date();
@ -40,8 +46,6 @@ export class LayoutComponent implements OnInit, OnDestroy {
user: User | null = null; user: User | null = null;
exit$ = new Subject<void>(); exit$ = new Subject<void>();
constructor( constructor(
private _userService: UserService, private _userService: UserService,
private _router: ActivatedRoute private _router: ActivatedRoute

View file

@ -0,0 +1,26 @@
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import {
BehaviorSubject, lastValueFrom, Observable,
} from 'rxjs';
import {environment} from "../../../environments/environment";
@Injectable({ providedIn: 'root' })
export class DepartmentService {
private departmentSubject = new BehaviorSubject<string | null>(null);
constructor(private readonly http: HttpClient) {}
private _getDepartment(): Observable<{result: string[]}> {
return this.http.get<{result: string[]}>(environment.api + "/departments", {
withCredentials: true,
})
}
async fetchDepartment() : Promise<string[]> {
return lastValueFrom(this._getDepartment()).then(({result}) => result).catch(err => {throw err})
}
get currentDepartment(): string | null {
return this.departmentSubject.value
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

View file

@ -4,3 +4,7 @@ type ResponseDefault struct {
Status string `json:"status"` Status string `json:"status"`
Message string `json:"message"` Message string `json:"message"`
} }
type Response[T any] struct {
Result T `json:"result"`
}

View file

@ -8,6 +8,7 @@ import (
"path" "path"
"recipe-manager/contracts" "recipe-manager/contracts"
"recipe-manager/data" "recipe-manager/data"
"recipe-manager/enums/permissions"
"recipe-manager/helpers" "recipe-manager/helpers"
"recipe-manager/models" "recipe-manager/models"
"recipe-manager/services/logger" "recipe-manager/services/logger"
@ -61,6 +62,39 @@ func (rr *RecipeRouter) Route(r chi.Router) {
r.Get("/saved/{country}/{filename_version_only}", rr.getSavedRecipes) r.Get("/saved/{country}/{filename_version_only}", rr.getSavedRecipes)
r.Get("/departments", func(w http.ResponseWriter, r *http.Request) {
w.Header().Add("Content-Type", "application/json")
// return departments that user can access
u := r.Context().Value("user").(*models.User)
var result []string
if u.Permissions.IsHavePermission(permissions.ThaiPermission) {
result = append(result, "tha")
}
if u.Permissions.IsHavePermission(permissions.MalayPermission) {
result = append(result, "mys")
}
if u.Permissions.IsHavePermission(permissions.AusPermission) {
result = append(result, "aus")
}
if u.Permissions.IsHavePermission(permissions.Alpha3Permission) {
result = append(result, "alpha")
}
if err := json.NewEncoder(w).Encode(&contracts.Response[[]string]{
Result: result,
}); err != nil {
rr.taoLogger.Log.Error("RecipeRouter.GetDepartments", zap.Error(err))
http.Error(w, "Internal Error", http.StatusInternalServerError)
return
}
})
r.Get("/countries", func(w http.ResponseWriter, r *http.Request) { r.Get("/countries", func(w http.ResponseWriter, r *http.Request) {
w.Header().Add("Content-Type", "application/json") w.Header().Add("Content-Type", "application/json")
// get key from map // get key from map