diff --git a/retail-managment-system/rms-ui/src/app/core/layout/side-bar/side-bar.component.html b/retail-managment-system/rms-ui/src/app/core/layout/side-bar/side-bar.component.html index 963af996..589833e8 100644 --- a/retail-managment-system/rms-ui/src/app/core/layout/side-bar/side-bar.component.html +++ b/retail-managment-system/rms-ui/src/app/core/layout/side-bar/side-bar.component.html @@ -7,7 +7,7 @@ }}

- {{ + {{ "sidebar.order" | translate }}

@@ -73,6 +73,15 @@ "sidebar.products" | translate }}

+

+ {{ "sidebar.test-products" | translate }} +

{{ "sidebar.profits" | translate diff --git a/retail-managment-system/rms-ui/src/app/pages/installments/edit-installment/receipt/receipt.component.html b/retail-managment-system/rms-ui/src/app/pages/installments/edit-installment/receipt/receipt.component.html index 54f82fc5..a5dd3c42 100644 --- a/retail-managment-system/rms-ui/src/app/pages/installments/edit-installment/receipt/receipt.component.html +++ b/retail-managment-system/rms-ui/src/app/pages/installments/edit-installment/receipt/receipt.component.html @@ -8,7 +8,7 @@

{{ "installments.customer-name" | translate }} : - {{install.order.customer.fullName}} + {{install.order?.customer?.fullName}} {{ "installments.ins-amount" | translate }} : diff --git a/retail-managment-system/rms-ui/src/app/pages/installments/installment.component.html b/retail-managment-system/rms-ui/src/app/pages/installments/installment.component.html index b0c8d66b..a67e2cab 100644 --- a/retail-managment-system/rms-ui/src/app/pages/installments/installment.component.html +++ b/retail-managment-system/rms-ui/src/app/pages/installments/installment.component.html @@ -43,7 +43,8 @@

{{ "installments.customer-name" | translate }} - {{ element.order.customer.fullName }} + {{ element.order?.customer?.fullName }} + diff --git a/retail-managment-system/rms-ui/src/app/pages/installments/installment.component.ts b/retail-managment-system/rms-ui/src/app/pages/installments/installment.component.ts index 86e92429..b6c71fa5 100644 --- a/retail-managment-system/rms-ui/src/app/pages/installments/installment.component.ts +++ b/retail-managment-system/rms-ui/src/app/pages/installments/installment.component.ts @@ -56,9 +56,9 @@ export class InstallmentComponent implements OnInit { const matchFilter:any[] = []; const filters = JSON.parse(filtersJson); filters.forEach(filter => { - data[filter.id] = data.order.customer.fullName; + data[filter.id] = data.order?.customer?.fullName; const val = data[filter.id] === null ? '' : data[filter.id]; - matchFilter.push(val.toLowerCase().includes(filter.value.toLowerCase())); + matchFilter.push(val?.toLowerCase().includes(filter.value?.toLowerCase())); }); return matchFilter.every(Boolean); }; diff --git a/retail-managment-system/rms-ui/src/app/pages/pages.module.ts b/retail-managment-system/rms-ui/src/app/pages/pages.module.ts index 673c9367..0436b5a4 100644 --- a/retail-managment-system/rms-ui/src/app/pages/pages.module.ts +++ b/retail-managment-system/rms-ui/src/app/pages/pages.module.ts @@ -23,12 +23,14 @@ import { UserComponent } from './user/user.component'; import { RoleAssignComponent } from './user/role-assign/role-assign/role-assign.component'; import { RoleComponent } from './role/role.component'; import { StoreComponent } from './store/store.component'; +import { TestProductComponent } from './test-product/test-product.component'; const routes: Routes = [ { path: '', redirectTo: 'home' }, { path: 'home', component: HomePageComponent }, { path: 'product', component: ProductComponent }, + {path:'testProduct',component:TestProductComponent}, {path: 'category',component: CategoryPageComponent}, { path: 'customers', component: CustomersComponent ,canActivate: [AuthGuard] }, { path: 'profits', component: ProfitComponent ,canActivate: [AuthGuard] }, @@ -62,6 +64,7 @@ const routes: Routes = [ RoleAssignComponent, RoleComponent, StoreComponent, + TestProductComponent, ], imports: [RouterModule.forChild(routes), SharedModule, TranslateModule,AuthModule,NgxPrintModule], diff --git a/retail-managment-system/rms-ui/src/app/pages/test-product/test-product.component.html b/retail-managment-system/rms-ui/src/app/pages/test-product/test-product.component.html new file mode 100644 index 00000000..a607483d --- /dev/null +++ b/retail-managment-system/rms-ui/src/app/pages/test-product/test-product.component.html @@ -0,0 +1,188 @@ +

+
+
+ + + {{'product.choose-by-category' | translate}} + + + {{"all" | translate}} + + {{category.name}} + + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
No. {{i+1}} Name {{element.name}} Category {{ element.productCategoryDto.name }} Brand {{element.brand}} Price {{element.price}} Quantity {{element.quantity}} Actions + + +
+ +
+ + + +
+ +
+
+
+

+ {{ + productFormConntrols.controls["id"].value + ? ("update" | translate) + : ("add" | translate) + }} + + {{ "product.product" | translate }} +

+ + add +
+ +
+
+ + {{ + "product.product-name" | translate + }} + + + {{ "product.product-name" | translate + }} {{ "product.required" | translate }} + + + + {{ + "product.brand" | translate + }} + + + + {{ + "product.Price" | translate + }} + + + {{ "product.Price" | translate + }} {{ "product.required" | translate }} + + + + {{ + "product.quantity" | translate + }} + + + + + {{ + "product.category" | translate + }} + + + {{category.name}} + + + + {{ "product.category-field" | translate + }} {{ "product.required" | translate }} + + + + + {{ + "product.model-no" | translate + }} + + + +
+
+
+ + +
+
+
+
+
+ diff --git a/retail-managment-system/rms-ui/src/app/pages/test-product/test-product.component.ts b/retail-managment-system/rms-ui/src/app/pages/test-product/test-product.component.ts new file mode 100644 index 00000000..34be32b8 --- /dev/null +++ b/retail-managment-system/rms-ui/src/app/pages/test-product/test-product.component.ts @@ -0,0 +1,156 @@ +import { Component, OnInit } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { MatDialog } from '@angular/material/dialog'; +import { PageEvent } from '@angular/material/paginator'; +import { MatSnackBar } from '@angular/material/snack-bar'; +import { TranslateService } from '@ngx-translate/core'; +import { CategoryRepository } from 'src/app/domain/category/category.repository'; +import { Category } from 'src/app/domain/category/models/category'; +import { Product } from 'src/app/domain/product/models/product'; +import { ProductRepository } from 'src/app/domain/product/product.repository'; +import { ConfirmDialogComponent } from 'src/app/shared/components/confirm-dialog/confirm-dialog.component'; + +@Component({ + selector: 'app-test-product', + templateUrl: './test-product.component.html', + styles: ['.btn {background-color: #002d40;color: white;width: 80px;height: 40px;}' + ,'.table-button{color: #002d40;background-color: transparent;}'] +}) +export class TestProductComponent implements OnInit { + allProducts:Product[]=[]; + allCategories:Category[]=[]; + pageSize:number=10; + length:number=0; + page:number=0; + currentProduct!:Product; + displayedColumns=["id","name","category","brand","price","quantity","actions"]; + productFormConntrols!:FormGroup; + addButtonVisible:boolean=false; + constructor(private productRepository:ProductRepository, + private categoryRepository:CategoryRepository, + private formBuilder:FormBuilder, private snackBar: MatSnackBar, + private dialog: MatDialog, + private translate: TranslateService) { } + + ngOnInit(): void { + this.getAllProducts(); + this.getAllCategories(); + this.productForm(); + } + get name(){ + return this.productFormConntrols.get('name'); + } + get category(){ + return this.productFormConntrols.get('productCategoryDto'); + } + get cashPrice(){ + return this.productFormConntrols.get('cashPrice'); + } + productForm(){ + this.productFormConntrols=this.formBuilder.group({ + id: [''], + name: ['', [Validators.required]], + brand: [''], + cashPrice: ['', [Validators.required]], + quantity: [''], + productCategoryDto: ['', [Validators.required]], + modelNo: [''], + }) + } + getAllProducts(){ + return this.productRepository.getList({page:this.page,size:this.pageSize}).subscribe((data)=>{ + this.allProducts=data.data; + this.length=data.pagination.itemCount; + }) + } + getAllCategories(){ + return this.categoryRepository.getList().subscribe((data)=>{ + this.allCategories=data.data; + }) + } + handlePageEvent(event:PageEvent){ + this.pageSize=event.pageSize; + this.page=event.pageIndex; + this.getAllProducts(); + } + filterProductByCategory(id:number){ + this.productRepository.filterProductsById(id).subscribe((data)=>{ + this.allProducts=data.data; + }) + } + submitProduct(){ + if(this.productFormConntrols.controls["id"].value){ + this.editProduct() + } + else{ + this.addProduct(); + } + } + fillForm(product:Product){ + this.addButtonVisible=true; + this.productFormConntrols.patchValue(product); + this.currentProduct=product; + } + addProduct(){ + this.addButtonVisible=false; + this.productRepository.add(this.productFormConntrols.value).subscribe(()=>{ + this.getAllProducts(); + this.snackBar.open( + this.translate.instant('product.added-successfuly'), + this.translate.instant('product.close'), + { + duration: 2000, + } + ); + }) + } + editProduct(){ + this.addButtonVisible=true; + this.productRepository.update(this.productFormConntrols.value).subscribe(()=>{ + this.getAllProducts(); + this.snackBar.open( + this.translate.instant('product.updated-successfuly'), + this.translate.instant('product.close'), + { + duration: 2000, + } + ); + }) + } + resetForm(){ + if(this.productFormConntrols.controls["id"].value){ + this.fillForm(this.currentProduct); + } + else{ + this.productFormConntrols.reset(); + } + } + clearForm(){ + this.addButtonVisible=false; + this.productFormConntrols.reset(); + } + confirmDialog(product:Product){ + let dialoResult=this.dialog.open(ConfirmDialogComponent); + dialoResult.afterClosed().subscribe((result) => { + if (result === 'yes') { + this.deleteProduct(product); + } + }); + } + deleteProduct(product:Product){ + this.productRepository.delete(product.id).subscribe(()=>{ + this.getAllProducts(); + this.snackBar.open( + this.translate.instant('product.deleted-successfuly'), + this.translate.instant('product.close'), + { + duration: 2000, + } + ); + }) + } + compareFn(category1: Category, category2: Category) { + if (!category1 || !category2) return false; + return category1.id === category2.id; + } +} diff --git a/retail-managment-system/rms-ui/src/assets/i18n/ar.json b/retail-managment-system/rms-ui/src/assets/i18n/ar.json index aa157445..7e3c8fc5 100644 --- a/retail-managment-system/rms-ui/src/assets/i18n/ar.json +++ b/retail-managment-system/rms-ui/src/assets/i18n/ar.json @@ -30,7 +30,7 @@ "suppliers":"الموردين", "users":"المستخدمين", "roles":"المهام" -, +, "test-products":"المنتجات", "store":"المخزن" }, "home-page": { diff --git a/retail-managment-system/rms-ui/src/assets/i18n/en.json b/retail-managment-system/rms-ui/src/assets/i18n/en.json index bf47cb22..6ff04ba5 100644 --- a/retail-managment-system/rms-ui/src/assets/i18n/en.json +++ b/retail-managment-system/rms-ui/src/assets/i18n/en.json @@ -26,6 +26,7 @@ "customers": "Customers", "categories": "Categories", "products": "Products", + "test-products":"Test-Products", "profits": "Profits", "employees": "Employees", "suppliers":"Suppliers",