Commit 3c3ffaf1 by Ooh-Ao

sss

parent 3f337714
...@@ -71,3 +71,12 @@ async def delete_project_member(db: AsyncSession, pmId: UUID): ...@@ -71,3 +71,12 @@ async def delete_project_member(db: AsyncSession, pmId: UUID):
await db.commit() await db.commit()
return {"message": "ProjectMember deleted successfully"} return {"message": "ProjectMember deleted successfully"}
async def get_projects_by_member_id(db: AsyncSession, memberId: UUID):
"""
ดึงรายการ ProjectMember ทั้งหมดที่ memberId นี้สังกัดอยู่
"""
result = await db.execute(
select(ProjectMember).where(ProjectMember.memberId == memberId)
)
return result.scalars().all()
\ No newline at end of file
...@@ -11,7 +11,8 @@ from ..controllers.project_member_controller import ( ...@@ -11,7 +11,8 @@ from ..controllers.project_member_controller import (
get_all_project_members, get_all_project_members,
get_project_member_by_id, get_project_member_by_id,
update_project_member, update_project_member,
delete_project_member delete_project_member,
get_projects_by_member_id
) )
from ..schemas.project_member_schema import ( from ..schemas.project_member_schema import (
ProjectMemberCreate, ProjectMemberCreate,
...@@ -64,3 +65,14 @@ async def delete_pm_endpoint( ...@@ -64,3 +65,14 @@ async def delete_pm_endpoint(
db: AsyncSession = Depends(get_db) db: AsyncSession = Depends(get_db)
): ):
return await delete_project_member(db, pmId) return await delete_project_member(db, pmId)
@router.get("/member/{memberId}", response_model=List[ProjectMemberResponse])
async def get_projects_for_member(
memberId: UUID,
db: AsyncSession = Depends(get_db)
):
"""
ดึงรายการ ProjectMember ทั้งหมดที่ memberId คนนี้สังกัดอยู่
"""
pms = await get_projects_by_member_id(db, memberId)
return pms
\ No newline at end of file
<app-page-header [title]="'จัดการบริษัท'" [activeTitle]="'ผู้ดูแลระบบ'" [title1]="'จัดการบริษัท'"></app-page-header> <app-page-header [title]="'จัดการโครงการ'" [activeTitle]="'ผู้ดูแลระบบ'" [title1]="'จัดการโครงการ'"></app-page-header>
<div class="grid grid-cols-12 gap-6"> <div class="grid grid-cols-12 gap-6">
...@@ -15,15 +15,15 @@ ...@@ -15,15 +15,15 @@
translate}} translate}}
</a> </a>
<a href="javascript:void(0);" class="hs-dropdown-toggle ti-btn ti-btn-success-full me-2" *ngIf="someSelected" <!-- <a href="javascript:void(0);" class="hs-dropdown-toggle ti-btn ti-btn-success-full me-2" *ngIf="someSelected"
(click)="adjustSelect(1)"><i class="ri-user-follow-line font-semibold align-middle"></i>{{ 'Active' | (click)="adjustSelect(1)"><i class="ri-user-follow-line font-semibold align-middle"></i>{{ 'Active' |
translate}} translate}}
</a> </a> -->
<a href="javascript:void(0);" class="hs-dropdown-toggle ti-btn ti-btn-secondary-full me-2" <!-- <a href="javascript:void(0);" class="hs-dropdown-toggle ti-btn ti-btn-secondary-full me-2"
*ngIf="someSelected" (click)="adjustSelect(0)"><i *ngIf="someSelected" (click)="adjustSelect(0)"><i
class="ri-user-unfollow-line font-semibold align-middle"></i>{{ 'Unactive' | class="ri-user-unfollow-line font-semibold align-middle"></i>{{ 'Unactive' |
translate}} translate}}
</a> </a> -->
<a href="javascript:void(0);" class="hs-dropdown-toggle ti-btn ti-btn-danger-full me-2" *ngIf="someSelected" <a href="javascript:void(0);" class="hs-dropdown-toggle ti-btn ti-btn-danger-full me-2" *ngIf="someSelected"
...@@ -31,11 +31,11 @@ ...@@ -31,11 +31,11 @@
translate}} translate}}
</a> </a>
<div> <div>
<input class="form-control form-control" type="text" placeholder="ค้นหาบริษัท" <input class="form-control form-control" type="text" placeholder="ค้นหาโครงการ"
aria-label=".form-control-sm example" [(ngModel)]='searchTerm'> aria-label=".form-control-sm example" [(ngModel)]='searchTerm'>
</div> </div>
<!-- <div> <!-- <div>
<input class="form-control form-control" type="text" placeholder="กรองตามบริษัท" <input class="form-control form-control" type="text" placeholder="กรองตามโครงการ"
aria-label=".form-control-sm example" [(ngModel)]='searchTerm'> aria-label=".form-control-sm example" [(ngModel)]='searchTerm'>
</div> --> </div> -->
<!-- <a href="javascript:void(0);" class="ti-btn ti-btn-primary-full !py-1 !px-2" aria-expanded="false"> <!-- <a href="javascript:void(0);" class="ti-btn ti-btn-primary-full !py-1 !px-2" aria-expanded="false">
...@@ -56,11 +56,11 @@ ...@@ -56,11 +56,11 @@
<input class="form-check-input check-all" type="checkbox" id="all-products" <input class="form-check-input check-all" type="checkbox" id="all-products"
(change)="toggleAll($event)" [checked]="allSelected" aria-label="..."> (change)="toggleAll($event)" [checked]="allSelected" aria-label="...">
</th> </th>
<th scope="col" class="text-start">บริษัท</th> <th scope="col" class="text-start">โครงการ</th>
<th scope="col" class="text-start">รหัสย่อบริษัท</th> <!-- <th scope="col" class="text-start">รหัสย่อโครงการ</th> -->
<th scope="col" class="text-start">ข้อมูลบริษัท</th> <th scope="col" class="text-start">ข้อมูลโครงการ</th>
<th scope="col" class="text-start">{{"Status" | translate}}</th> <!-- <th scope="col" class="text-start">{{"Status" | translate}}</th>
<th scope="col" class="text-start">{{"Update Date" | translate}}</th> <th scope="col" class="text-start">{{"Update Date" | translate}}</th> -->
<th scope="col" class="text-start"></th> <th scope="col" class="text-start"></th>
</tr> </tr>
</thead> </thead>
...@@ -69,7 +69,7 @@ ...@@ -69,7 +69,7 @@
<tr class="border border-defaultborder dark:border-defaultborder/10"> <tr class="border border-defaultborder dark:border-defaultborder/10">
<td class="product-checkbox"><input class="form-check-input" type="checkbox" <td class="product-checkbox"><input class="form-check-input" type="checkbox"
[checked]="selectedItems.get(item.companyId)" (change)="onCheckboxChange(item.companyId)" [checked]="selectedItems.get(item.projectId!)" (change)="onCheckboxChange(item.projectId!)"
aria-label="..." value=""> aria-label="..." value="">
</td> </td>
<td> <td>
...@@ -79,34 +79,34 @@ ...@@ -79,34 +79,34 @@
</span> </span>
<div class="ms-2"> <div class="ms-2">
<p class="font-semibold mb-0 flex items-center text-primary"><a <p class="font-semibold mb-0 flex items-center text-primary"><a
routerLink="/company/home/{{item.companyId}}" routerLinkActive="active"> routerLink="/company/home/{{item.projectId}}" routerLinkActive="active">
{{item.companyName}}</a></p> {{item.project_name}}</a></p>
<p class="text-[0.75rem] text-muted mb-0">{{item.companyId}}</p> <p class="text-[0.75rem] text-muted mb-0">{{item.projectId}}</p>
</div> </div>
</div> </div>
</td> </td>
<!-- <td> <!-- <td>
<div class="flex"> <div class="flex">
<div class="ms-2"> <div class="ms-2">
<p class="font-semibold mb-0 flex items-center text-primary"><a routerLink="/company/home/{{item.companyId}}" routerLinkActive="active"> <p class="font-semibold mb-0 flex items-center text-primary"><a routerLink="/company/home/{{item.projectId}}" routerLinkActive="active">
{{item.companyName}}</a></p> {{item.project_name}}</a></p>
<p class="text-[0.75rem] text-muted mb-0">{{item.companyId}}</p> <p class="text-[0.75rem] text-muted mb-0">{{item.projectId}}</p>
</div> </div>
</div> </div>
</td> --> </td> -->
<td> {{item.companyCode}}</td> <!-- <td> {{item.companyCode}}</td> -->
<td> <td>
<div> <div>
<span class="block mb-1"><i <span class="block mb-1"><i
class="ri-home-line me-2 align-middle text-[.875rem] text-[#8c9097] dark:text-white/50 inline-flex"></i>{{item.companyInfo}}</span> class="ri-home-line me-2 align-middle text-[.875rem] text-[#8c9097] dark:text-white/50 inline-flex"></i>{{item.project_desc}}</span>
</div> </div>
</td> </td>
<td> <span <!-- <td> <span
class="badge bg-{{ item.status == 1 ? 'primary' : 'danger'}} text-white">{{item.getStatus()}}</span> class="badge bg-{{ item.status == 1 ? 'primary' : 'danger'}} text-white">{{item.getStatus()}}</span>
</td> </td> -->
<td><span class="badge bg-info/10 text-primary"><i class="bi bi-clock me-1"></i>{{item.updatedAt | date <!-- <td><span class="badge bg-info/10 text-primary"><i class="bi bi-clock me-1"></i>{{item.updatedAt | date
: 'medium'}}</span></td> : 'medium'}}</span></td>
<td> <td> -->
<td> <td>
<div class="flex flex-row items-center !gap-2 "> <div class="flex flex-row items-center !gap-2 ">
...@@ -202,58 +202,53 @@ ...@@ -202,58 +202,53 @@
</div> </div>
<div class="xl:col-span-12 col-span-12"> <div class="xl:col-span-12 col-span-12">
<label for="deal-title" class="form-label">{{'ชื่อบริษัท' | translate}}</label> <label for="deal-title" class="form-label">{{'ชื่อโครงการ' | translate}}</label>
<input type="text" class="form-control" id="deal-title" placeholder="" <input type="text" class="form-control" id="deal-title" placeholder=""
[(ngModel)]="selectModel.companyName"> [(ngModel)]="selectModel.project_name">
<div class="text-danger" *ngIf="!selectModel.companyName"> <div class="text-danger" *ngIf="!selectModel.project_name">
{{'Please fill in information' | translate}} {{'Please fill in information' | translate}}
</div> </div>
</div> </div>
<div class="xl:col-span-12 col-span-12"> <!-- <div class="xl:col-span-12 col-span-12">
<label for="deal-title" class="form-label">{{'รหัสบริษัท' | translate}}</label> <label for="deal-title" class="form-label">{{'รหัสโครงการ' | translate}}</label>
<input type="text" class="form-control" id="deal-title" placeholder="" <input type="text" class="form-control" id="deal-title" placeholder=""
[(ngModel)]="selectModel.companyCode"> [(ngModel)]="selectModel.companyCode">
<div class="text-danger" *ngIf="!selectModel.companyCode"> <div class="text-danger" *ngIf="!selectModel.companyCode">
{{'Please fill in information' | translate}} {{'Please fill in information' | translate}}
</div> </div>
</div> </div> -->
<div class="xl:col-span-12 col-span-12"> <div class="xl:col-span-12 col-span-12">
<label for="deal-title" class="form-label">{{'ข้อมูลบริษัท' | translate}}</label> <label for="deal-title" class="form-label">{{'ข้อมูลโครงการ' | translate}}</label>
<input type="text" class="form-control" id="deal-title" placeholder="" <input type="text" class="form-control" id="deal-title" placeholder=""
[(ngModel)]="selectModel.companyInfo"> [(ngModel)]="selectModel.project_desc">
<div class="text-danger" *ngIf="!selectModel.companyInfo"> <div class="text-danger" *ngIf="!selectModel.project_desc">
{{'Please fill in information' | translate}} {{'Please fill in information' | translate}}
</div> </div>
</div> </div>
<div class="xl:col-span-12 col-span-12"> <!-- <div class="xl:col-span-12 col-span-12">
<label for="deal-title" class="form-label">{{'ที่อยู่' | translate}}</label> <label for="deal-title" class="form-label">{{'ที่อยู่' | translate}}</label>
<textarea type="text" class="form-control" id="deal-title" placeholder="" <textarea type="text" class="form-control" id="deal-title" placeholder=""
[(ngModel)]="selectModel.address"></textarea> [(ngModel)]="selectModel.address"></textarea>
</div> </div> -->
<div class="xl:col-span-12 col-span-12">
<label for="deal-title" class="form-label">{{'เจ้าของ' | translate}}</label>
<input type="text" class="form-control" id="deal-title" placeholder="" [(ngModel)]="selectModel.ownerName">
</div>
<div class="xl:col-span-12 col-span-12"> <!-- <div class="xl:col-span-12 col-span-12">
<label for="deal-title" class="form-label">{{'เบอร๋ติดต่อ' | translate}}</label> <label for="deal-title" class="form-label">{{'เบอร๋ติดต่อ' | translate}}</label>
<input type="text" class="form-control" id="deal-title" placeholder="" [(ngModel)]="selectModel.contact"> <input type="text" class="form-control" id="deal-title" placeholder="" [(ngModel)]="selectModel.contact">
</div> </div> -->
<div class="xl:col-span-12 col-span-12"> <!-- <div class="xl:col-span-12 col-span-12">
<label class="form-label">{{'Status' | translate}}</label> <label class="form-label">{{'Status' | translate}}</label>
<ng-select name="choices-multiple-remove-button2" id="choices-multiple-remove-button2" placeholder="" <ng-select name="choices-multiple-remove-button2" id="choices-multiple-remove-button2" placeholder=""
[(ngModel)]="selectModel.status"> [(ngModel)]="selectModel.status">
<ng-option [value]="0">{{'Pending' | translate}}</ng-option> <ng-option [value]="0">{{'Pending' | translate}}</ng-option>
<ng-option [value]="1" selected>{{'Public' | translate}}</ng-option> <ng-option [value]="1" selected>{{'Public' | translate}}</ng-option>
</ng-select> </ng-select>
</div> </div> -->
</div> </div>
</div> </div>
......
...@@ -3,7 +3,6 @@ import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; ...@@ -3,7 +3,6 @@ import { DomSanitizer, SafeHtml } from '@angular/platform-browser';
import { RouterModule } from '@angular/router'; import { RouterModule } from '@angular/router';
import { SharedModule } from '../../../shared/shared.module'; import { SharedModule } from '../../../shared/shared.module';
import { TranslateModule, TranslateService } from '@ngx-translate/core'; import { TranslateModule, TranslateService } from '@ngx-translate/core';
import { CompanyModel } from '../../models/company.model';
import swal from 'sweetalert'; import swal from 'sweetalert';
import { CompanyService } from '../../services/company.service'; import { CompanyService } from '../../services/company.service';
import { MatPaginator } from '@angular/material/paginator'; import { MatPaginator } from '@angular/material/paginator';
...@@ -14,6 +13,8 @@ import { FileUploadModule } from 'ng2-file-upload'; ...@@ -14,6 +13,8 @@ import { FileUploadModule } from 'ng2-file-upload';
import { FileItem, FileUploader, ParsedResponseHeaders } from "ng2-file-upload"; import { FileItem, FileUploader, ParsedResponseHeaders } from "ng2-file-upload";
import { environment } from '../../../../environments/environment'; import { environment } from '../../../../environments/environment';
import { TokenService } from '../../../shared/services/token.service'; import { TokenService } from '../../../shared/services/token.service';
import { ProjectService } from '../../services/project.service';
import { ProjectModel } from '../../models/project.model';
@Component({ @Component({
selector: 'app-company-manage', selector: 'app-company-manage',
...@@ -37,11 +38,11 @@ export class CompanyManageComponent { ...@@ -37,11 +38,11 @@ export class CompanyManageComponent {
action = "new"; action = "new";
allSelected = false; allSelected = false;
someSelected = false; someSelected = false;
itemsList: CompanyModel[] = [] itemsList: ProjectModel[] = []
filterList: CompanyModel[] = [] filterList: ProjectModel[] = []
selectModel: CompanyModel = new CompanyModel() selectModel: ProjectModel = new ProjectModel()
selectedItems = new Map<string, boolean>(); selectedItems = new Map<string, boolean>();
empList: CompanyModel[] = [] empList: ProjectModel[] = []
descName = 'engName' descName = 'engName'
pageIndex = 0; pageIndex = 0;
uploaderProfile: FileUploader | undefined; uploaderProfile: FileUploader | undefined;
...@@ -61,7 +62,7 @@ export class CompanyManageComponent { ...@@ -61,7 +62,7 @@ export class CompanyManageComponent {
} }
_searchTerm = ""; _searchTerm = "";
constructor(private comService: CompanyService, public translate: TranslateService, private tokenService: TokenService) { constructor(private projectService: ProjectService, public translate: TranslateService, private tokenService: TokenService) {
this.uploadConfig() this.uploadConfig()
} }
...@@ -117,7 +118,7 @@ export class CompanyManageComponent { ...@@ -117,7 +118,7 @@ export class CompanyManageComponent {
} }
ngOnInit(): void { ngOnInit(): void {
this.comService.getLists().subscribe(result => { this.projectService.getLists().subscribe(result => {
this.itemsList = result this.itemsList = result
this.updatePagedItems() this.updatePagedItems()
}) })
...@@ -126,17 +127,13 @@ export class CompanyManageComponent { ...@@ -126,17 +127,13 @@ export class CompanyManageComponent {
filter(v: string) { filter(v: string) {
return this.itemsList?.filter( return this.itemsList?.filter(
(x) => (x) =>
x.companyId?.toLowerCase().indexOf(v.toLowerCase()) !== -1 || x.projectId?.toLowerCase().indexOf(v.toLowerCase()) !== -1 ||
x.companyName?.toLowerCase().indexOf(v.toLowerCase()) !== -1 || x.project_name?.toLowerCase().indexOf(v.toLowerCase()) !== -1 ||
x.companyCode?.toLowerCase().indexOf(v.toLowerCase()) !== -1 || x.project_desc?.toLowerCase().indexOf(v.toLowerCase()) !== -1
x.companyInfo?.toLowerCase().indexOf(v.toLowerCase()) !== -1 ||
x.address.toLowerCase().indexOf(v.toLowerCase()) !== -1 ||
x.ownerName.toLowerCase().indexOf(v.toLowerCase()) !== -1 ||
x.getStatus().toLowerCase().indexOf(v.toLowerCase()) !== -1
); );
} }
delete(item: CompanyModel) { delete(item: ProjectModel) {
swal({ swal({
title: "Are you sure?", title: "Are you sure?",
text: "You won't be able to revert this!", text: "You won't be able to revert this!",
...@@ -147,7 +144,7 @@ export class CompanyManageComponent { ...@@ -147,7 +144,7 @@ export class CompanyManageComponent {
}) })
.then((willDelete: any) => { .then((willDelete: any) => {
if (willDelete) { if (willDelete) {
this.comService.delete(item).subscribe(result => { this.projectService.delete(item).subscribe(result => {
swal("Save Success!!", "บันทึกข้อมูลสำเร็จ", "success"); swal("Save Success!!", "บันทึกข้อมูลสำเร็จ", "success");
this.ngOnInit() this.ngOnInit()
}) })
...@@ -158,17 +155,13 @@ export class CompanyManageComponent { ...@@ -158,17 +155,13 @@ export class CompanyManageComponent {
new() { new() {
this.action = 'add' this.action = 'add'
this.selectModel = new CompanyModel() this.selectModel = new ProjectModel()
this.selectModel.status = 1;
this.selectModel.address = "";
this.selectModel.latitude = 0.00
this.selectModel.longitude = 0.00
this.selectModel.picture = "" this.selectModel.picture = ""
} }
view(item: CompanyModel) { view(item: ProjectModel) {
this.action = 'edit' this.action = 'edit'
this.selectModel = new CompanyModel(item) this.selectModel = new ProjectModel(item)
console.log(this.selectModel) console.log(this.selectModel)
} }
...@@ -183,14 +176,14 @@ export class CompanyManageComponent { ...@@ -183,14 +176,14 @@ export class CompanyManageComponent {
.then((willDelete: any) => { .then((willDelete: any) => {
if (willDelete) { if (willDelete) {
if (this.action == 'add') { if (this.action == 'add') {
this.comService.save(this.selectModel).subscribe(result => { this.projectService.save(this.selectModel).subscribe(result => {
console.log(result) console.log(result)
swal("Save Success!!", "บันทึกข้อมูลสมาชิก", "success"); swal("Save Success!!", "บันทึกข้อมูลสมาชิก", "success");
this.ngOnInit() this.ngOnInit()
this.childModal?.nativeElement.click() this.childModal?.nativeElement.click()
}) })
} else if (this.action == 'edit') { } else if (this.action == 'edit') {
this.comService.update(this.selectModel).subscribe(result => { this.projectService.update(this.selectModel).subscribe(result => {
console.log(result) console.log(result)
swal("Update Success!!", "บันทึกข้อมูลสมาชิก", "success"); swal("Update Success!!", "บันทึกข้อมูลสมาชิก", "success");
this.ngOnInit() this.ngOnInit()
...@@ -215,25 +208,25 @@ export class CompanyManageComponent { ...@@ -215,25 +208,25 @@ export class CompanyManageComponent {
this.allSelected = event.target.checked; this.allSelected = event.target.checked;
this.selectedItems.clear(); this.selectedItems.clear();
this.itemsList.forEach(item => { this.itemsList.forEach(item => {
this.selectedItems.set(item.companyId, this.allSelected); this.selectedItems.set(item.projectId!, this.allSelected);
}); });
this.someSelected = this.itemsList.some(item => this.selectedItems.get(item.companyId)); this.someSelected = this.itemsList.some(item => this.selectedItems.get(item.projectId!));
} }
onCheckboxChange(companyId: string) { onCheckboxChange(projectId: string) {
const isSelected = this.selectedItems.get(companyId) || false; const isSelected = this.selectedItems.get(projectId) || false;
this.selectedItems.set(companyId, !isSelected); this.selectedItems.set(projectId, !isSelected);
this.allSelected = this.itemsList.every(item => this.selectedItems.get(item.companyId)); this.allSelected = this.itemsList.every(item => this.selectedItems.get(item.projectId!));
this.someSelected = this.itemsList.some(item => this.selectedItems.get(item.companyId)); this.someSelected = this.itemsList.some(item => this.selectedItems.get(item.projectId!));
} }
deleteSelect() { deleteSelect() {
let employeeInfo = ''; let employeeInfo = '';
this.selectedItems.forEach((isSelected, companyId) => { this.selectedItems.forEach((isSelected, projectId) => {
if (isSelected) { if (isSelected) {
const item = this.itemsList.find(item => item.companyId === companyId); const item = this.itemsList.find(item => item.projectId === projectId);
if (item) { if (item) {
employeeInfo += `${this.translate.instant('บริษัท')}: ${item.companyName}\n`; employeeInfo += `${this.translate.instant('บริษัท')}: ${item.project_name}\n`;
} }
} }
}); });
...@@ -247,11 +240,11 @@ export class CompanyManageComponent { ...@@ -247,11 +240,11 @@ export class CompanyManageComponent {
}) })
.then((willDelete: any) => { .then((willDelete: any) => {
if (willDelete) { if (willDelete) {
this.selectedItems.forEach((isSelected, companyId) => { this.selectedItems.forEach((isSelected, projectId) => {
if (isSelected) { if (isSelected) {
const item = this.itemsList.find(item => item.companyId === companyId); const item = this.itemsList.find(item => item.projectId === projectId);
if (item) { if (item) {
this.comService.delete(item).subscribe(result => { this.projectService.delete(item).subscribe(result => {
swal("Save Success!!", "บันทึกข้อมูลสำเร็จ", "success"); swal("Save Success!!", "บันทึกข้อมูลสำเร็จ", "success");
this.ngOnInit(); this.ngOnInit();
}); });
...@@ -262,41 +255,41 @@ export class CompanyManageComponent { ...@@ -262,41 +255,41 @@ export class CompanyManageComponent {
}); });
} }
adjustSelect(status: number) { // adjustSelect(status: number) {
let title = "Are you sure?" // let title = "Are you sure?"
let employeeInfo = ''; // ตัวแปรสำหรับเก็บข้อมูลพนักงาน // let employeeInfo = ''; // ตัวแปรสำหรับเก็บข้อมูลพนักงาน
this.selectedItems.forEach((isSelected, memberId) => { // this.selectedItems.forEach((isSelected, memberId) => {
if (isSelected) { // if (isSelected) {
const company = this.itemsList.find(company => company.companyId === memberId); // const company = this.itemsList.find(project => project.projectId === memberId);
if (company) { // if (project) {
employeeInfo += `${this.translate.instant('Fullname')}: ${company.companyName}\n`; // employeeInfo += `${this.translate.instant('Fullname')}: ${project.projectName}\n`;
} // }
} // }
}); // });
swal({ // swal({
title: title, // title: title,
text: employeeInfo, // text: employeeInfo,
icon: "warning", // icon: "warning",
dangerMode: false, // dangerMode: false,
buttons: ["Cancel", "Confirm"], // buttons: ["Cancel", "Confirm"],
}) // })
.then((willDelete: any) => { // .then((willDelete: any) => {
if (willDelete) { // if (willDelete) {
this.selectedItems.forEach((isSelected, companyId) => { // this.selectedItems.forEach((isSelected, projectId) => {
if (isSelected) { // if (isSelected) {
const company = this.itemsList.find(company => company.companyId === companyId); // const project = this.itemsList.find(project => project.projectId === projectId);
if (company) { // if (project) {
company.status = status // project.status = status
this.comService.update(company).subscribe(result => { // this.projectService.update(project).subscribe(result => {
swal("Save Success!!", "บันทึกข้อมูลสำเร็จ", "success"); // swal("Save Success!!", "บันทึกข้อมูลสำเร็จ", "success");
this.ngOnInit(); // this.ngOnInit();
}); // });
} // }
} // }
}); // });
} // }
}); // });
} // }
} }
import { TranslateService } from "@ngx-translate/core";
import { BaseModel } from "./base.model";
export class ProjectMemberModel extends BaseModel {
pm_id: string;
user_id: string;
projectId: string;
role_in_project: string;
created_at: string;
updated_at: string;
constructor(data?: Partial<ProjectMemberModel>, translateService?: TranslateService) {
super(data, translateService);
this.pm_id = data?.pm_id ?? '';
this.user_id = data?.user_id ?? '';
this.projectId = data?.projectId ?? '';
this.role_in_project = data?.role_in_project ?? '';
this.created_at = data?.created_at ?? new Date().toISOString();
this.updated_at = data?.updated_at ?? new Date().toISOString();
}
}
import { environment } from "../../../environments/environment";
export class ProjectModel {
projectId?: string;
picture: string;
project_name: string;
project_desc?: string;
start_date: string;
end_date: string;
// created_at: string;
// updated_at: string;
constructor(data?: Partial<ProjectModel>) {
this.picture = data?.picture ?? '';
this.projectId = data?.projectId
this.project_name = data?.project_name ?? '';
this.project_desc = data?.project_desc ?? '';
this.start_date = data?.start_date!
this.end_date = data?.end_date!
// this.created_at = data?.created_at!
// this.updated_at = data?.updated_at!
}
getPicture(): string {
return this.picture ? environment.baseUrl + '/images/' + this.picture : './assets/images/faces/9.jpg'
}
}
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { map, tap, switchMap, filter, reduce } from "rxjs/operators";
import { ProjectMemberModel } from '../models/project-members';
@Injectable({
providedIn: 'root'
})
export class ProjectMemberService {
apiBaseUrl = "/project-members";
constructor(
private http: HttpClient
) { }
getById(id: string) {
return this.http
.get<ProjectMemberModel>(this.apiBaseUrl + "/" + id)
.pipe(map((e) => new ProjectMemberModel(e)));
}
getLists() {
return this.http
.get<ProjectMemberModel[]>(this.apiBaseUrl)
.pipe(
map((e) => e.map((e) => new ProjectMemberModel(e)))
);
}
save(body: ProjectMemberModel) {
return this.http.post<{
"message": string,
"user": ProjectMemberModel
}>(this.apiBaseUrl, new ProjectMemberModel(body));
}
update(body: ProjectMemberModel) {
return this.http.put<{
"message": string,
"user": ProjectMemberModel
}>(this.apiBaseUrl + "/" + body.user_id, new ProjectMemberModel(body));
}
delete(body: ProjectMemberModel) {
return this.http.delete<{
"message": string,
"user": ProjectMemberModel
}>(this.apiBaseUrl + "/" + body.user_id);
}
getCompanyAdmin(memberId: string) {
return this.http
.get<ProjectMemberModel[]>(this.apiBaseUrl + "/member/" + memberId)
.pipe(
map((e) => e.map((e) => new ProjectMemberModel(e)))
);
}
}
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { map, tap, switchMap, filter, reduce } from "rxjs/operators";
import { ProjectModel } from '../models/project.model';
@Injectable({
providedIn: 'root'
})
export class ProjectService {
apiBaseUrl = "/projects";
constructor(
private http: HttpClient
) { }
getById(id: string) {
return this.http
.get<ProjectModel>(this.apiBaseUrl + "/" + id)
.pipe(map((e) => new ProjectModel(e)));
}
getLists() {
return this.http
.get<ProjectModel[]>(this.apiBaseUrl)
.pipe(
map((e) => e.map((e) => new ProjectModel(e)))
);
}
save(body: ProjectModel) {
return this.http.post<{
"message": string,
"user": ProjectModel
}>(this.apiBaseUrl, new ProjectModel(body));
}
update(body: ProjectModel) {
return this.http.put<{
"message": string,
"user": ProjectModel
}>(this.apiBaseUrl + "/" + body.projectId, new ProjectModel(body));
}
delete(body: ProjectModel) {
return this.http.delete<{
"message": string,
"user": ProjectModel
}>(this.apiBaseUrl + "/" + body.projectId);
}
}
...@@ -18,6 +18,7 @@ import { LoginModel } from '../../shared/user-auth.model'; ...@@ -18,6 +18,7 @@ import { LoginModel } from '../../shared/user-auth.model';
import { HttpClientModule } from '@angular/common/http'; import { HttpClientModule } from '@angular/common/http';
import { Validators } from 'ngx-editor'; import { Validators } from 'ngx-editor';
import { EmployeeService } from '../../DPU/services/employee.service'; import { EmployeeService } from '../../DPU/services/employee.service';
import { ProjectMemberService } from '../../DPU/services/project-members.service';
@Component({ @Component({
selector: 'app-login', selector: 'app-login',
...@@ -44,7 +45,7 @@ export class LoginComponent { ...@@ -44,7 +45,7 @@ export class LoginComponent {
private routes: Router, private routes: Router,
private formBuilder: FormBuilder, private formBuilder: FormBuilder,
public authService: AuthService, public authService: AuthService,
private empServie: EmployeeService private projectMember: ProjectMemberService
) { ) {
localStorage.clear() localStorage.clear()
} }
...@@ -123,15 +124,13 @@ export class LoginComponent { ...@@ -123,15 +124,13 @@ export class LoginComponent {
this.tokenService.saveToken(result.access_token); this.tokenService.saveToken(result.access_token);
// this.tokenService.saveRefreshToken(result.refreshToken); // this.tokenService.saveRefreshToken(result.refreshToken);
this.tokenService.saveUser(result); this.tokenService.saveUser(result);
if (result.member.status == 1) {
if (result.member.role == 99) { if (result.member.role == 99 || result.member.role == 1) {
this.routes.navigate(['/admin/member-manage']) this.routes.navigate(['/admin/member-manage'])
} else {
this.adminCompanyList(result.member.memberId)
}
} else { } else {
this.error = 'ไม่สามารถใช้งานได้กรุณาติดต่อผู้ให้บริการ' this.adminCompanyList(result.member.memberId)
} }
// this.routes.navigate(['/admin/member-manage']) // this.routes.navigate(['/admin/member-manage'])
}, (error) => { }, (error) => {
this.showLoader = false; this.showLoader = false;
...@@ -141,9 +140,9 @@ export class LoginComponent { ...@@ -141,9 +140,9 @@ export class LoginComponent {
} }
adminCompanyList(memberId: string) { adminCompanyList(memberId: string) {
this.empServie.getCompanyAdmin(memberId).subscribe(result => { this.projectMember.getCompanyAdmin(memberId).subscribe(result => {
if (result.length > 0) { if (result.length > 0) {
this.routes.navigate(['/company/home/'+result[0].companyId]) this.routes.navigate(['/company/home/' + result[0].projectId])
} }
else { else {
this.error = 'คุณไม่มีสิทธิ์ใช้งานในส่วนนี้' this.error = 'คุณไม่มีสิทธิ์ใช้งานในส่วนนี้'
......
...@@ -54,7 +54,7 @@ export class NavService implements OnDestroy { ...@@ -54,7 +54,7 @@ export class NavService implements OnDestroy {
public fullScreen = false; public fullScreen = false;
active: any; active: any;
constructor(private router: Router , private tokenService : TokenService) { constructor(private router: Router, private tokenService: TokenService) {
this.setScreenWidth(window.innerWidth); this.setScreenWidth(window.innerWidth);
fromEvent(window, 'resize') fromEvent(window, 'resize')
.pipe(debounceTime(1000), takeUntil(this.unsubscriber)) .pipe(debounceTime(1000), takeUntil(this.unsubscriber))
...@@ -91,32 +91,66 @@ export class NavService implements OnDestroy { ...@@ -91,32 +91,66 @@ export class NavService implements OnDestroy {
MENUITEMS: Menu[] = [] MENUITEMS: Menu[] = []
getCommonMenu() { getCommonMenu() {
return [ // return [
// Dashboard // // Dashboard
{ headTitle: 'ผู้ดูแลระบบ' }, // { headTitle: 'ผู้ดูแลระบบ' },
{ // {
icon: 'user', // icon: 'user',
path: '/admin/member-manage', // path: '/admin/member-manage',
title: 'จัดการสมาชิก', // title: 'จัดการสมาชิก',
type: 'link', // type: 'link',
}, // },
{ // {
icon: 'buildings', // icon: 'buildings',
path: '/admin/manage-companys', // path: '/admin/manage-companys',
title: 'จัดการบริษัท', // title: 'จัดการบริษัท',
type: 'link', // type: 'link',
}, // },
{ // {
icon: 'user-check', // icon: 'user-check',
path: '/admin/admin-manage', // path: '/admin/admin-manage',
title: 'จัดการสิทธิ์ผู้ดูแลระบบ', // title: 'จัดการสิทธิ์ผู้ดูแลระบบ',
type: 'link', // type: 'link',
}, // },
// { headTitle: 'User Management' }, // // { headTitle: 'User Management' },
]; // ];
return [{ headTitle: 'Admin' },
{ path: '/admin/home', title: 'หน้าแรก', type: 'link' },
{
title: 'การจัดการ',
type: 'sub',
selected: false,
Menusub: true,
active: false,
children: [
{ path: '/admin/member-manage', title: 'การจัดการสมาชิก', type: 'link' },
{ path: '/admin/product-management', title: 'การจัดการอุปกรณ์', type: 'link' },
{
path: '/admin/manage-companys',
title: 'การจัดการโครงการ',
type: 'link',
},
],
}, {
title: 'การเบิกคืนอุปกรณ์',
type: 'sub',
selected: false,
Menusub: true,
active: false,
children: [
{ path: '/admin/borrow-management', title: 'การจัดการการเบิก', type: 'link' },
{ path: '/admin/approve-borrow', title: 'อนุมัติการเบิก', type: 'link' },
{ path: '/admin/return-borrow', title: 'อนุมัติการคืน', type: 'link' },
{
path: '/admin/history-product',
title: 'ประวัติการทำรายการ',
type: 'link',
},
],
}]
} }
getCompanyMenu() { getCompanyMenu() {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment